mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-02 10:24:11 +01:00
5f8760a55c
This allows the spektrum and sbus receiver drivers to bind directly to the usart layer using a properly exported API rather than overriding the interrupt handler. Bytes are now pushed directly from the usart layer into the com layer without any buffering. The com layer performs all of the buffering. A further benefit from this approach is that we can put all blocking/non-blocking behaviour into the COM layer and not in the underlying drivers. Misc related changes: - Remove obsolete .handler field from irq configs - Adapt all users of PIOS_COM_* functions to new API - Fixup callers of PIOS_USB_HID_Init()
1156 lines
30 KiB
C
1156 lines
30 KiB
C
/**
|
|
******************************************************************************
|
|
* @addtogroup OpenPilotSystem OpenPilot System
|
|
* @{
|
|
* @addtogroup OpenPilotCore OpenPilot Core
|
|
* @{
|
|
*
|
|
* @file pios_board.c
|
|
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
|
* @brief Defines board specific static initializers for hardware for the OpenPilot board.
|
|
* @see The GNU Public License (GPL) Version 3
|
|
*
|
|
*****************************************************************************/
|
|
/*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <pios.h>
|
|
#include <openpilot.h>
|
|
#include <uavobjectsinit.h>
|
|
#include <hwsettings.h>
|
|
#include <manualcontrolsettings.h>
|
|
|
|
#if defined(PIOS_INCLUDE_SPI)
|
|
|
|
#include <pios_spi_priv.h>
|
|
|
|
/* Flash/Accel Interface
|
|
*
|
|
* NOTE: Leave this declared as const data so that it ends up in the
|
|
* .rodata section (ie. Flash) rather than in the .bss section (RAM).
|
|
*/
|
|
void PIOS_SPI_flash_accel_irq_handler(void);
|
|
void DMA1_Channel4_IRQHandler() __attribute__ ((alias ("PIOS_SPI_flash_accel_irq_handler")));
|
|
void DMA1_Channel5_IRQHandler() __attribute__ ((alias ("PIOS_SPI_flash_accel_irq_handler")));
|
|
static const struct pios_spi_cfg pios_spi_flash_accel_cfg = {
|
|
.regs = SPI2,
|
|
.init = {
|
|
.SPI_Mode = SPI_Mode_Master,
|
|
.SPI_Direction = SPI_Direction_2Lines_FullDuplex,
|
|
.SPI_DataSize = SPI_DataSize_8b,
|
|
.SPI_NSS = SPI_NSS_Soft,
|
|
.SPI_FirstBit = SPI_FirstBit_MSB,
|
|
.SPI_CRCPolynomial = 7,
|
|
.SPI_CPOL = SPI_CPOL_High,
|
|
.SPI_CPHA = SPI_CPHA_2Edge,
|
|
.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2,
|
|
},
|
|
.use_crc = FALSE,
|
|
.dma = {
|
|
.ahb_clk = RCC_AHBPeriph_DMA1,
|
|
|
|
.irq = {
|
|
.flags = (DMA1_FLAG_TC4 | DMA1_FLAG_TE4 | DMA1_FLAG_HT4 | DMA1_FLAG_GL4),
|
|
.init = {
|
|
.NVIC_IRQChannel = DMA1_Channel4_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
|
|
.rx = {
|
|
.channel = DMA1_Channel4,
|
|
.init = {
|
|
.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR),
|
|
.DMA_DIR = DMA_DIR_PeripheralSRC,
|
|
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
|
|
.DMA_MemoryInc = DMA_MemoryInc_Enable,
|
|
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
|
|
.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
|
|
.DMA_Mode = DMA_Mode_Normal,
|
|
.DMA_Priority = DMA_Priority_High,
|
|
.DMA_M2M = DMA_M2M_Disable,
|
|
},
|
|
},
|
|
.tx = {
|
|
.channel = DMA1_Channel5,
|
|
.init = {
|
|
.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR),
|
|
.DMA_DIR = DMA_DIR_PeripheralDST,
|
|
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
|
|
.DMA_MemoryInc = DMA_MemoryInc_Enable,
|
|
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte,
|
|
.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte,
|
|
.DMA_Mode = DMA_Mode_Normal,
|
|
.DMA_Priority = DMA_Priority_High,
|
|
.DMA_M2M = DMA_M2M_Disable,
|
|
},
|
|
},
|
|
},
|
|
.ssel = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_12,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_Out_PP,
|
|
},
|
|
},
|
|
.sclk = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_13,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
.miso = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_14,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_IN_FLOATING,
|
|
},
|
|
},
|
|
.mosi = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_15,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
};
|
|
|
|
static uint32_t pios_spi_flash_accel_id;
|
|
void PIOS_SPI_flash_accel_irq_handler(void)
|
|
{
|
|
/* Call into the generic code to handle the IRQ for this specific device */
|
|
PIOS_SPI_IRQ_Handler(pios_spi_flash_accel_id);
|
|
}
|
|
|
|
#endif /* PIOS_INCLUDE_SPI */
|
|
|
|
/*
|
|
* ADC system
|
|
*/
|
|
#include "pios_adc_priv.h"
|
|
extern void PIOS_ADC_handler(void);
|
|
void DMA1_Channel1_IRQHandler() __attribute__ ((alias("PIOS_ADC_handler")));
|
|
// Remap the ADC DMA handler to this one
|
|
static const struct pios_adc_cfg pios_adc_cfg = {
|
|
.dma = {
|
|
.ahb_clk = RCC_AHBPeriph_DMA1,
|
|
.irq = {
|
|
.flags = (DMA1_FLAG_TC1 | DMA1_FLAG_TE1 | DMA1_FLAG_HT1 | DMA1_FLAG_GL1),
|
|
.init = {
|
|
.NVIC_IRQChannel = DMA1_Channel1_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.channel = DMA1_Channel1,
|
|
.init = {
|
|
.DMA_PeripheralBaseAddr = (uint32_t) & ADC1->DR,
|
|
.DMA_DIR = DMA_DIR_PeripheralSRC,
|
|
.DMA_PeripheralInc = DMA_PeripheralInc_Disable,
|
|
.DMA_MemoryInc = DMA_MemoryInc_Enable,
|
|
.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word,
|
|
.DMA_MemoryDataSize = DMA_MemoryDataSize_Word,
|
|
.DMA_Mode = DMA_Mode_Circular,
|
|
.DMA_Priority = DMA_Priority_High,
|
|
.DMA_M2M = DMA_M2M_Disable,
|
|
},
|
|
}
|
|
},
|
|
.half_flag = DMA1_IT_HT1,
|
|
.full_flag = DMA1_IT_TC1,
|
|
};
|
|
|
|
struct pios_adc_dev pios_adc_devs[] = {
|
|
{
|
|
.cfg = &pios_adc_cfg,
|
|
.callback_function = NULL,
|
|
},
|
|
};
|
|
|
|
uint8_t pios_adc_num_devices = NELEMENTS(pios_adc_devs);
|
|
|
|
void PIOS_ADC_handler() {
|
|
PIOS_ADC_DMA_Handler();
|
|
}
|
|
|
|
#if defined(PIOS_INCLUDE_USART)
|
|
|
|
#include "pios_usart_priv.h"
|
|
|
|
#if defined(PIOS_INCLUDE_TELEMETRY_RF)
|
|
/*
|
|
* Telemetry USART
|
|
*/
|
|
static const struct pios_usart_cfg pios_usart_telem_main_cfg = {
|
|
.regs = USART1,
|
|
.init = {
|
|
.USART_BaudRate = 57600,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART1_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_9,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
};
|
|
|
|
static const struct pios_usart_cfg pios_usart_telem_flexi_cfg = {
|
|
.regs = USART3,
|
|
.init = {
|
|
.USART_BaudRate = 57600,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART3_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_11,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
};
|
|
#endif /* PIOS_INCLUDE_TELEMETRY_RF */
|
|
|
|
#if defined(PIOS_INCLUDE_GPS)
|
|
/*
|
|
* GPS USART
|
|
*/
|
|
static const struct pios_usart_cfg pios_usart_gps_main_cfg = {
|
|
.regs = USART1,
|
|
.init = {
|
|
.USART_BaudRate = 57600,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART1_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_9,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
};
|
|
|
|
static const struct pios_usart_cfg pios_usart_gps_flexi_cfg = {
|
|
.regs = USART3,
|
|
.init = {
|
|
.USART_BaudRate = 57600,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx | USART_Mode_Tx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART3_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_11,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
},
|
|
};
|
|
#endif /* PIOS_INCLUDE_GPS */
|
|
|
|
#if defined(PIOS_INCLUDE_SPEKTRUM)
|
|
/*
|
|
* SPEKTRUM USART
|
|
*/
|
|
#include <pios_spektrum_priv.h>
|
|
|
|
static const struct pios_usart_cfg pios_usart_spektrum_main_cfg = {
|
|
.regs = USART1,
|
|
.init = {
|
|
.USART_BaudRate = 115200,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART1_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_9,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IN_FLOATING,
|
|
},
|
|
},
|
|
};
|
|
|
|
static const struct pios_spektrum_cfg pios_spektrum_main_cfg = {
|
|
.bind = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_Out_PP,
|
|
},
|
|
},
|
|
.remap = 0,
|
|
};
|
|
|
|
static const struct pios_usart_cfg pios_usart_spektrum_flexi_cfg = {
|
|
.regs = USART3,
|
|
.init = {
|
|
.USART_BaudRate = 115200,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_No,
|
|
.USART_StopBits = USART_StopBits_1,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART3_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_11,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IN_FLOATING,
|
|
},
|
|
},
|
|
};
|
|
|
|
static const struct pios_spektrum_cfg pios_spektrum_flexi_cfg = {
|
|
.bind = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_11,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_Out_PP,
|
|
},
|
|
},
|
|
.remap = 0,
|
|
};
|
|
|
|
#endif /* PIOS_INCLUDE_SPEKTRUM */
|
|
|
|
#if defined(PIOS_INCLUDE_SBUS)
|
|
/*
|
|
* SBUS USART
|
|
*/
|
|
#include <pios_sbus_priv.h>
|
|
|
|
static const struct pios_usart_cfg pios_usart_sbus_main_cfg = {
|
|
.regs = USART1,
|
|
.init = {
|
|
.USART_BaudRate = 100000,
|
|
.USART_WordLength = USART_WordLength_8b,
|
|
.USART_Parity = USART_Parity_Even,
|
|
.USART_StopBits = USART_StopBits_2,
|
|
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
|
|
.USART_Mode = USART_Mode_Rx,
|
|
},
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USART1_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.rx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
},
|
|
.tx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_9,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IN_FLOATING,
|
|
},
|
|
},
|
|
};
|
|
|
|
static const struct pios_sbus_cfg pios_sbus_cfg = {
|
|
/* Inverter configuration */
|
|
.inv = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_2,
|
|
.GPIO_Mode = GPIO_Mode_Out_PP,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
},
|
|
},
|
|
.gpio_clk_func = RCC_APB2PeriphClockCmd,
|
|
.gpio_clk_periph = RCC_APB2Periph_GPIOB,
|
|
.gpio_inv_enable = Bit_SET,
|
|
};
|
|
|
|
#endif /* PIOS_INCLUDE_SBUS */
|
|
|
|
#endif /* PIOS_INCLUDE_USART */
|
|
|
|
#if defined(PIOS_INCLUDE_COM)
|
|
|
|
#include "pios_com_priv.h"
|
|
|
|
#endif /* PIOS_INCLUDE_COM */
|
|
|
|
#if defined(PIOS_INCLUDE_RTC)
|
|
/*
|
|
* Realtime Clock (RTC)
|
|
*/
|
|
#include <pios_rtc_priv.h>
|
|
|
|
void PIOS_RTC_IRQ_Handler (void);
|
|
void RTC_IRQHandler() __attribute__ ((alias ("PIOS_RTC_IRQ_Handler")));
|
|
static const struct pios_rtc_cfg pios_rtc_main_cfg = {
|
|
.clksrc = RCC_RTCCLKSource_HSE_Div128,
|
|
.prescaler = 100,
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = RTC_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
};
|
|
|
|
void PIOS_RTC_IRQ_Handler (void)
|
|
{
|
|
PIOS_RTC_irq_handler ();
|
|
}
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Servo outputs
|
|
*/
|
|
#include <pios_servo_priv.h>
|
|
static const struct pios_servo_channel pios_servo_channels[] = {
|
|
{
|
|
.timer = TIM4,
|
|
.port = GPIOB,
|
|
.channel = TIM_Channel_4,
|
|
.pin = GPIO_Pin_9,
|
|
},
|
|
{
|
|
.timer = TIM4,
|
|
.port = GPIOB,
|
|
.channel = TIM_Channel_3,
|
|
.pin = GPIO_Pin_8,
|
|
},
|
|
{
|
|
.timer = TIM4,
|
|
.port = GPIOB,
|
|
.channel = TIM_Channel_2,
|
|
.pin = GPIO_Pin_7,
|
|
},
|
|
{
|
|
.timer = TIM1,
|
|
.port = GPIOA,
|
|
.channel = TIM_Channel_1,
|
|
.pin = GPIO_Pin_8,
|
|
},
|
|
{ /* needs to remap to alternative function */
|
|
.timer = TIM3,
|
|
.port = GPIOB,
|
|
.channel = TIM_Channel_1,
|
|
.pin = GPIO_Pin_4,
|
|
},
|
|
{
|
|
.timer = TIM2,
|
|
.port = GPIOA,
|
|
.channel = TIM_Channel_3,
|
|
.pin = GPIO_Pin_2,
|
|
},
|
|
};
|
|
|
|
const struct pios_servo_cfg pios_servo_cfg = {
|
|
.tim_base_init = {
|
|
.TIM_Prescaler = (PIOS_MASTER_CLOCK / 1000000) - 1,
|
|
.TIM_ClockDivision = TIM_CKD_DIV1,
|
|
.TIM_CounterMode = TIM_CounterMode_Up,
|
|
.TIM_Period = ((1000000 / PIOS_SERVO_UPDATE_HZ) - 1),
|
|
.TIM_RepetitionCounter = 0x0000,
|
|
},
|
|
.tim_oc_init = {
|
|
.TIM_OCMode = TIM_OCMode_PWM1,
|
|
.TIM_OutputState = TIM_OutputState_Enable,
|
|
.TIM_OutputNState = TIM_OutputNState_Disable,
|
|
.TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
|
|
.TIM_OCPolarity = TIM_OCPolarity_High,
|
|
.TIM_OCNPolarity = TIM_OCPolarity_High,
|
|
.TIM_OCIdleState = TIM_OCIdleState_Reset,
|
|
.TIM_OCNIdleState = TIM_OCNIdleState_Reset,
|
|
},
|
|
.gpio_init = {
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
},
|
|
.remap = GPIO_PartialRemap_TIM3,
|
|
.channels = pios_servo_channels,
|
|
.num_channels = NELEMENTS(pios_servo_channels),
|
|
};
|
|
|
|
#if defined(PIOS_INCLUDE_PWM) && defined(PIOS_INCLUDE_PPM)
|
|
#error Cannot define both PIOS_INCLUDE_PWM and PIOS_INCLUDE_PPM at the same time (yet)
|
|
#endif
|
|
|
|
/*
|
|
* PPM Inputs
|
|
*/
|
|
#if defined(PIOS_INCLUDE_PPM)
|
|
#include <pios_ppm_priv.h>
|
|
|
|
void TIM4_IRQHandler();
|
|
void TIM4_IRQHandler() __attribute__ ((alias ("PIOS_TIM4_irq_handler")));
|
|
const struct pios_ppm_cfg pios_ppm_cfg = {
|
|
.tim_base_init = {
|
|
.TIM_Prescaler = (PIOS_MASTER_CLOCK / 1000000) - 1, /* For 1 uS accuracy */
|
|
.TIM_ClockDivision = TIM_CKD_DIV1,
|
|
.TIM_CounterMode = TIM_CounterMode_Up,
|
|
.TIM_Period = 0xFFFF, /* shared timer, make sure init correctly in outputs */
|
|
.TIM_RepetitionCounter = 0x0000,
|
|
},
|
|
.tim_ic_init = {
|
|
.TIM_Channel = TIM_Channel_1,
|
|
.TIM_ICPolarity = TIM_ICPolarity_Rising,
|
|
.TIM_ICSelection = TIM_ICSelection_DirectTI,
|
|
.TIM_ICPrescaler = TIM_ICPSC_DIV1,
|
|
.TIM_ICFilter = 0x0,
|
|
},
|
|
.gpio_init = {
|
|
.GPIO_Pin = GPIO_Pin_6,
|
|
.GPIO_Mode = GPIO_Mode_IPD,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
},
|
|
.remap = 0,
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.timer = TIM4,
|
|
.port = GPIOB,
|
|
.ccr = TIM_IT_CC1,
|
|
};
|
|
|
|
void PIOS_TIM4_irq_handler()
|
|
{
|
|
PIOS_PPM_irq_handler();
|
|
}
|
|
#endif /* PIOS_INCLUDE_PPM */
|
|
|
|
/*
|
|
* PWM Inputs
|
|
*/
|
|
#if defined(PIOS_INCLUDE_PWM)
|
|
#include <pios_pwm_priv.h>
|
|
|
|
static const struct pios_pwm_channel pios_pwm_channels[] = {
|
|
{
|
|
.timer = TIM4,
|
|
.port = GPIOB,
|
|
.ccr = TIM_IT_CC1,
|
|
.channel = TIM_Channel_1,
|
|
.pin = GPIO_Pin_6,
|
|
},
|
|
{
|
|
.timer = TIM3,
|
|
.port = GPIOB,
|
|
.ccr = TIM_IT_CC2,
|
|
.channel = TIM_Channel_2,
|
|
.pin = GPIO_Pin_5,
|
|
},
|
|
{
|
|
.timer = TIM3,
|
|
.port = GPIOB,
|
|
.ccr = TIM_IT_CC3,
|
|
.channel = TIM_Channel_3,
|
|
.pin = GPIO_Pin_0
|
|
},
|
|
{
|
|
.timer = TIM3,
|
|
.port = GPIOB,
|
|
.ccr = TIM_IT_CC4,
|
|
.channel = TIM_Channel_4,
|
|
.pin = GPIO_Pin_1,
|
|
},
|
|
{
|
|
.timer = TIM2,
|
|
.port = GPIOA,
|
|
.ccr = TIM_IT_CC1,
|
|
.channel = TIM_Channel_1,
|
|
.pin = GPIO_Pin_0,
|
|
},
|
|
{
|
|
.timer = TIM2,
|
|
.port = GPIOA,
|
|
.ccr = TIM_IT_CC2,
|
|
.channel = TIM_Channel_2,
|
|
.pin = GPIO_Pin_1,
|
|
},
|
|
};
|
|
|
|
void TIM2_IRQHandler();
|
|
void TIM3_IRQHandler();
|
|
void TIM4_IRQHandler();
|
|
void TIM2_IRQHandler() __attribute__ ((alias ("PIOS_TIM2_irq_handler")));
|
|
void TIM3_IRQHandler() __attribute__ ((alias ("PIOS_TIM3_irq_handler")));
|
|
void TIM4_IRQHandler() __attribute__ ((alias ("PIOS_TIM4_irq_handler")));
|
|
const struct pios_pwm_cfg pios_pwm_cfg = {
|
|
.tim_base_init = {
|
|
.TIM_Prescaler = (PIOS_MASTER_CLOCK / 1000000) - 1,
|
|
.TIM_ClockDivision = TIM_CKD_DIV1,
|
|
.TIM_CounterMode = TIM_CounterMode_Up,
|
|
.TIM_Period = 0xFFFF,
|
|
.TIM_RepetitionCounter = 0x0000,
|
|
},
|
|
.tim_ic_init = {
|
|
.TIM_ICPolarity = TIM_ICPolarity_Rising,
|
|
.TIM_ICSelection = TIM_ICSelection_DirectTI,
|
|
.TIM_ICPrescaler = TIM_ICPSC_DIV1,
|
|
.TIM_ICFilter = 0x0,
|
|
},
|
|
.gpio_init = {
|
|
.GPIO_Mode = GPIO_Mode_IPD,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
},
|
|
.remap = 0,
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.channels = pios_pwm_channels,
|
|
.num_channels = NELEMENTS(pios_pwm_channels),
|
|
};
|
|
void PIOS_TIM2_irq_handler()
|
|
{
|
|
PIOS_PWM_irq_handler(TIM2);
|
|
}
|
|
void PIOS_TIM3_irq_handler()
|
|
{
|
|
PIOS_PWM_irq_handler(TIM3);
|
|
}
|
|
void PIOS_TIM4_irq_handler()
|
|
{
|
|
PIOS_PWM_irq_handler(TIM4);
|
|
}
|
|
#endif
|
|
|
|
#if defined(PIOS_INCLUDE_I2C)
|
|
|
|
#include <pios_i2c_priv.h>
|
|
|
|
/*
|
|
* I2C Adapters
|
|
*/
|
|
|
|
void PIOS_I2C_main_adapter_ev_irq_handler(void);
|
|
void PIOS_I2C_main_adapter_er_irq_handler(void);
|
|
void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_ev_irq_handler")));
|
|
void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_er_irq_handler")));
|
|
|
|
static const struct pios_i2c_adapter_cfg pios_i2c_main_adapter_cfg = {
|
|
.regs = I2C2,
|
|
.init = {
|
|
.I2C_Mode = I2C_Mode_I2C,
|
|
.I2C_OwnAddress1 = 0,
|
|
.I2C_Ack = I2C_Ack_Enable,
|
|
.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
|
|
.I2C_DutyCycle = I2C_DutyCycle_2,
|
|
.I2C_ClockSpeed = 400000, /* bits/s */
|
|
},
|
|
.transfer_timeout_ms = 50,
|
|
.scl = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_10,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_OD,
|
|
},
|
|
},
|
|
.sda = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_11,
|
|
.GPIO_Speed = GPIO_Speed_10MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_OD,
|
|
},
|
|
},
|
|
.event = {
|
|
.flags = 0, /* FIXME: check this */
|
|
.init = {
|
|
.NVIC_IRQChannel = I2C2_EV_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
.error = {
|
|
.flags = 0, /* FIXME: check this */
|
|
.init = {
|
|
.NVIC_IRQChannel = I2C2_ER_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
};
|
|
|
|
uint32_t pios_i2c_main_adapter_id;
|
|
void PIOS_I2C_main_adapter_ev_irq_handler(void)
|
|
{
|
|
/* Call into the generic code to handle the IRQ for this specific device */
|
|
PIOS_I2C_EV_IRQ_Handler(pios_i2c_main_adapter_id);
|
|
}
|
|
|
|
void PIOS_I2C_main_adapter_er_irq_handler(void)
|
|
{
|
|
/* Call into the generic code to handle the IRQ for this specific device */
|
|
PIOS_I2C_ER_IRQ_Handler(pios_i2c_main_adapter_id);
|
|
}
|
|
|
|
#endif /* PIOS_INCLUDE_I2C */
|
|
|
|
#if defined(PIOS_INCLUDE_RCVR)
|
|
#include "pios_rcvr_priv.h"
|
|
|
|
struct pios_rcvr_channel_map pios_rcvr_channel_to_id_map[PIOS_RCVR_MAX_CHANNELS];
|
|
uint32_t pios_rcvr_max_channel;
|
|
#endif /* PIOS_INCLUDE_RCVR */
|
|
|
|
#if defined(PIOS_INCLUDE_USB_HID)
|
|
#include "pios_usb_hid_priv.h"
|
|
|
|
static const struct pios_usb_hid_cfg pios_usb_hid_main_cfg = {
|
|
.irq = {
|
|
.init = {
|
|
.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_LOW,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
},
|
|
};
|
|
#endif /* PIOS_INCLUDE_USB_HID */
|
|
|
|
extern const struct pios_com_driver pios_usb_com_driver;
|
|
|
|
uint32_t pios_com_telem_rf_id;
|
|
uint32_t pios_com_telem_usb_id;
|
|
uint32_t pios_com_gps_id;
|
|
|
|
/**
|
|
* PIOS_Board_Init()
|
|
* initializes all the core subsystems on this specific hardware
|
|
* called from System/openpilot.c
|
|
*/
|
|
void PIOS_Board_Init(void) {
|
|
|
|
/* Delay system */
|
|
PIOS_DELAY_Init();
|
|
|
|
/* Set up the SPI interface to the serial flash */
|
|
if (PIOS_SPI_Init(&pios_spi_flash_accel_id, &pios_spi_flash_accel_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
PIOS_Flash_W25X_Init(pios_spi_flash_accel_id);
|
|
PIOS_ADXL345_Attach(pios_spi_flash_accel_id);
|
|
|
|
PIOS_FLASHFS_Init();
|
|
|
|
/* Initialize UAVObject libraries */
|
|
EventDispatcherInitialize();
|
|
UAVObjInitialize();
|
|
UAVObjectsInitializeAll();
|
|
|
|
#if defined(PIOS_INCLUDE_RTC)
|
|
/* Initialize the real-time clock and its associated tick */
|
|
PIOS_RTC_Init(&pios_rtc_main_cfg);
|
|
#endif
|
|
|
|
/* Initialize the alarms library */
|
|
AlarmsInitialize();
|
|
|
|
/* Initialize the task monitor library */
|
|
TaskMonitorInitialize();
|
|
|
|
/* Configure the main IO port */
|
|
uint8_t hwsettings_cc_mainport;
|
|
HwSettingsCC_MainPortGet(&hwsettings_cc_mainport);
|
|
|
|
switch (hwsettings_cc_mainport) {
|
|
case HWSETTINGS_CC_MAINPORT_DISABLED:
|
|
break;
|
|
case HWSETTINGS_CC_MAINPORT_TELEMETRY:
|
|
#if defined(PIOS_INCLUDE_TELEMETRY_RF)
|
|
{
|
|
uint32_t pios_usart_telem_rf_id;
|
|
if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_main_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_TELEMETRY_RF */
|
|
break;
|
|
case HWSETTINGS_CC_MAINPORT_SBUS:
|
|
#if defined(PIOS_INCLUDE_SBUS)
|
|
{
|
|
uint32_t pios_usart_sbus_id;
|
|
if (PIOS_USART_Init(&pios_usart_sbus_id, &pios_usart_sbus_main_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_sbus_id;
|
|
if (PIOS_SBUS_Init(&pios_sbus_id, &pios_sbus_cfg, &pios_usart_com_driver, pios_usart_sbus_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_rcvr_id, &pios_sbus_rcvr_driver, pios_sbus_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_SBUS */
|
|
break;
|
|
case HWSETTINGS_CC_MAINPORT_GPS:
|
|
#if defined(PIOS_INCLUDE_GPS)
|
|
{
|
|
uint32_t pios_usart_gps_id;
|
|
if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_main_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_GPS */
|
|
break;
|
|
case HWSETTINGS_CC_MAINPORT_SPEKTRUM:
|
|
#if defined(PIOS_INCLUDE_SPEKTRUM)
|
|
{
|
|
uint32_t pios_usart_spektrum_id;
|
|
if (PIOS_USART_Init(&pios_usart_spektrum_id, &pios_usart_spektrum_main_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_spektrum_id;
|
|
if (PIOS_SPEKTRUM_Init(&pios_spektrum_id, &pios_spektrum_main_cfg, &pios_usart_com_driver, pios_usart_spektrum_id, false)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_rcvr_id, &pios_spektrum_rcvr_driver, pios_spektrum_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_SPEKTRUM */
|
|
break;
|
|
case HWSETTINGS_CC_MAINPORT_COMAUX:
|
|
break;
|
|
}
|
|
|
|
/* Configure the flexi port */
|
|
uint8_t hwsettings_cc_flexiport;
|
|
HwSettingsCC_FlexiPortGet(&hwsettings_cc_flexiport);
|
|
|
|
switch (hwsettings_cc_flexiport) {
|
|
case HWSETTINGS_CC_FLEXIPORT_DISABLED:
|
|
break;
|
|
case HWSETTINGS_CC_FLEXIPORT_TELEMETRY:
|
|
#if defined(PIOS_INCLUDE_TELEMETRY_RF)
|
|
{
|
|
uint32_t pios_usart_telem_rf_id;
|
|
if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_flexi_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver, pios_usart_telem_rf_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_TELEMETRY_RF */
|
|
break;
|
|
case HWSETTINGS_CC_FLEXIPORT_GPS:
|
|
#if defined(PIOS_INCLUDE_GPS)
|
|
{
|
|
uint32_t pios_usart_gps_id;
|
|
if (PIOS_USART_Init(&pios_usart_gps_id, &pios_usart_gps_flexi_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
if (PIOS_COM_Init(&pios_com_gps_id, &pios_usart_com_driver, pios_usart_gps_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_GPS */
|
|
break;
|
|
case HWSETTINGS_CC_FLEXIPORT_SPEKTRUM:
|
|
#if defined(PIOS_INCLUDE_SPEKTRUM)
|
|
{
|
|
uint32_t pios_usart_spektrum_id;
|
|
if (PIOS_USART_Init(&pios_usart_spektrum_id, &pios_usart_spektrum_flexi_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_spektrum_id;
|
|
if (PIOS_SPEKTRUM_Init(&pios_spektrum_id, &pios_spektrum_flexi_cfg, &pios_usart_com_driver, pios_usart_spektrum_id, false)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
uint32_t pios_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_rcvr_id, &pios_spektrum_rcvr_driver, pios_spektrum_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_SPEKTRUM */
|
|
break;
|
|
case HWSETTINGS_CC_FLEXIPORT_COMAUX:
|
|
break;
|
|
case HWSETTINGS_CC_FLEXIPORT_I2C:
|
|
#if defined(PIOS_INCLUDE_I2C)
|
|
{
|
|
if (PIOS_I2C_Init(&pios_i2c_main_adapter_id, &pios_i2c_main_adapter_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_I2C */
|
|
break;
|
|
}
|
|
|
|
/* Configure the selected receiver */
|
|
uint8_t manualcontrolsettings_inputmode;
|
|
ManualControlSettingsInputModeGet(&manualcontrolsettings_inputmode);
|
|
|
|
switch (manualcontrolsettings_inputmode) {
|
|
case MANUALCONTROLSETTINGS_INPUTMODE_PWM:
|
|
#if defined(PIOS_INCLUDE_PWM)
|
|
PIOS_PWM_Init();
|
|
uint32_t pios_pwm_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_pwm_rcvr_id, &pios_pwm_rcvr_driver, 0)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
for (uint8_t i = 0;
|
|
i < PIOS_PWM_NUM_INPUTS && pios_rcvr_max_channel < NELEMENTS(pios_rcvr_channel_to_id_map);
|
|
i++) {
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].id = pios_pwm_rcvr_id;
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].channel = i;
|
|
pios_rcvr_max_channel++;
|
|
}
|
|
#endif /* PIOS_INCLUDE_PWM */
|
|
break;
|
|
case MANUALCONTROLSETTINGS_INPUTMODE_PPM:
|
|
#if defined(PIOS_INCLUDE_PPM)
|
|
PIOS_PPM_Init();
|
|
uint32_t pios_ppm_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_ppm_rcvr_id, &pios_ppm_rcvr_driver, 0)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
for (uint8_t i = 0;
|
|
i < PIOS_PPM_NUM_INPUTS && pios_rcvr_max_channel < NELEMENTS(pios_rcvr_channel_to_id_map);
|
|
i++) {
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].id = pios_ppm_rcvr_id;
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].channel = i;
|
|
pios_rcvr_max_channel++;
|
|
}
|
|
#endif /* PIOS_INCLUDE_PPM */
|
|
break;
|
|
case MANUALCONTROLSETTINGS_INPUTMODE_SPEKTRUM:
|
|
#if defined(PIOS_INCLUDE_SPEKTRUM)
|
|
if (hwsettings_cc_mainport == HWSETTINGS_CC_MAINPORT_SPEKTRUM ||
|
|
hwsettings_cc_flexiport == HWSETTINGS_CC_FLEXIPORT_SPEKTRUM) {
|
|
uint32_t pios_spektrum_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_spektrum_rcvr_id, &pios_spektrum_rcvr_driver, 0)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
for (uint8_t i = 0;
|
|
i < PIOS_SPEKTRUM_NUM_INPUTS && pios_rcvr_max_channel < NELEMENTS(pios_rcvr_channel_to_id_map);
|
|
i++) {
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].id = pios_spektrum_rcvr_id;
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].channel = i;
|
|
pios_rcvr_max_channel++;
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_SPEKTRUM */
|
|
break;
|
|
case MANUALCONTROLSETTINGS_INPUTMODE_SBUS:
|
|
#if defined(PIOS_INCLUDE_SBUS)
|
|
if (hwsettings_cc_mainport == HWSETTINGS_CC_MAINPORT_SBUS) {
|
|
uint32_t pios_sbus_rcvr_id;
|
|
if (PIOS_RCVR_Init(&pios_sbus_rcvr_id, &pios_sbus_rcvr_driver, 0)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
for (uint8_t i = 0;
|
|
i < SBUS_NUMBER_OF_CHANNELS && pios_rcvr_max_channel < NELEMENTS(pios_rcvr_channel_to_id_map);
|
|
i++) {
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].id = pios_sbus_rcvr_id;
|
|
pios_rcvr_channel_to_id_map[pios_rcvr_max_channel].channel = i;
|
|
pios_rcvr_max_channel++;
|
|
}
|
|
}
|
|
#endif /* PIOS_INCLUDE_SBUS */
|
|
break;
|
|
}
|
|
|
|
/* Remap AFIO pin */
|
|
GPIO_PinRemapConfig( GPIO_Remap_SWJ_NoJTRST, ENABLE);
|
|
PIOS_Servo_Init();
|
|
|
|
PIOS_ADC_Init();
|
|
PIOS_GPIO_Init();
|
|
|
|
#if defined(PIOS_INCLUDE_USB_HID)
|
|
uint32_t pios_usb_hid_id;
|
|
PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_main_cfg);
|
|
#if defined(PIOS_INCLUDE_COM)
|
|
if (PIOS_COM_Init(&pios_com_telem_usb_id, &pios_usb_com_driver, pios_usb_hid_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
#endif /* PIOS_INCLUDE_COM */
|
|
#endif /* PIOS_INCLUDE_USB_HID */
|
|
|
|
PIOS_IAP_Init();
|
|
PIOS_WDG_Init();
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|