mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-04 12:24:11 +01:00
2d27c54d48
The main purpose of this new COM implementation is that it is much simpler, and requires less code space. This takes a bit of the pressure off of the CC bootloader which was right at the limit of available code space in the bootloader partition. This is not intended to ever be used by the application. This driver also formalizes the assumptions in the bootloader's usage of the COM layer. All messages are assumed to arrive in atomic chunks from the HID layer.
305 lines
8.4 KiB
C
305 lines
8.4 KiB
C
/**
|
|
******************************************************************************
|
|
* @addtogroup OpenPilotBL OpenPilot BootLoader
|
|
* @{
|
|
*
|
|
* @file pios_board.c
|
|
* @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
|
|
* @brief Defines board specific static initialisers 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>
|
|
|
|
#if defined(PIOS_INCLUDE_SPI)
|
|
|
|
#include <pios_spi_priv.h>
|
|
|
|
/* AHRS 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_ahrs_irq_handler(void);
|
|
void DMA1_Channel4_IRQHandler() __attribute__ ((alias ("PIOS_SPI_ahrs_irq_handler")));
|
|
void DMA1_Channel5_IRQHandler() __attribute__ ((alias ("PIOS_SPI_ahrs_irq_handler")));
|
|
const struct pios_spi_cfg
|
|
pios_spi_ahrs_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_8,
|
|
},
|
|
.use_crc = TRUE,
|
|
.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_Medium,
|
|
.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_Medium,
|
|
.DMA_M2M = DMA_M2M_Disable,
|
|
},
|
|
},
|
|
}, .ssel = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_12,
|
|
.GPIO_Speed = GPIO_Speed_50MHz,
|
|
.GPIO_Mode = GPIO_Mode_Out_PP,
|
|
},
|
|
}, .sclk = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_13,
|
|
.GPIO_Speed = GPIO_Speed_50MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
}, .miso = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_14,
|
|
.GPIO_Speed = GPIO_Speed_50MHz,
|
|
.GPIO_Mode = GPIO_Mode_IN_FLOATING,
|
|
},
|
|
}, .mosi = {
|
|
.gpio = GPIOB,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_15,
|
|
.GPIO_Speed = GPIO_Speed_50MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
}, };
|
|
|
|
uint32_t pios_spi_ahrs_id;
|
|
void PIOS_SPI_ahrs_irq_handler(void) {
|
|
/* Call into the generic code to handle the IRQ for this specific device */
|
|
PIOS_SPI_IRQ_Handler(pios_spi_ahrs_id);
|
|
}
|
|
|
|
#endif /* PIOS_INCLUDE_SPI */
|
|
|
|
#if defined(PIOS_INCLUDE_USART)
|
|
|
|
#include "pios_usart_priv.h"
|
|
|
|
/*
|
|
* Telemetry USART
|
|
*/
|
|
const struct pios_usart_cfg pios_usart_telem_cfg = {
|
|
.regs = USART2,
|
|
.init = {
|
|
#if defined (PIOS_COM_TELEM_BAUDRATE)
|
|
.USART_BaudRate = PIOS_COM_TELEM_BAUDRATE,
|
|
#else
|
|
.USART_BaudRate = 57600,
|
|
#endif
|
|
.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 = USART2_IRQn,
|
|
.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
|
|
.NVIC_IRQChannelSubPriority = 0,
|
|
.NVIC_IRQChannelCmd = ENABLE,
|
|
},
|
|
}, .rx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_3,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_IPU,
|
|
},
|
|
}, .tx = {
|
|
.gpio = GPIOA,
|
|
.init = {
|
|
.GPIO_Pin = GPIO_Pin_2,
|
|
.GPIO_Speed = GPIO_Speed_2MHz,
|
|
.GPIO_Mode = GPIO_Mode_AF_PP,
|
|
},
|
|
}, };
|
|
|
|
#endif /* PIOS_INCLUDE_USART */
|
|
|
|
#if defined(PIOS_INCLUDE_COM)
|
|
|
|
#include "pios_com_priv.h"
|
|
|
|
#define PIOS_COM_TELEM_RF_RX_BUF_LEN 192
|
|
#define PIOS_COM_TELEM_RF_TX_BUF_LEN 192
|
|
|
|
static uint8_t pios_com_telem_rf_rx_buffer[PIOS_COM_TELEM_RF_RX_BUF_LEN];
|
|
static uint8_t pios_com_telem_rf_tx_buffer[PIOS_COM_TELEM_RF_TX_BUF_LEN];
|
|
|
|
#endif /* PIOS_INCLUDE_COM */
|
|
|
|
// ***********************************************************************************
|
|
|
|
#if defined(PIOS_INCLUDE_COM_MSG)
|
|
|
|
#include <pios_com_msg_priv.h>
|
|
|
|
#endif /* PIOS_INCLUDE_COM_MSG */
|
|
|
|
// ***********************************************************************************
|
|
|
|
#if defined(PIOS_INCLUDE_USB)
|
|
#include "pios_usb_priv.h"
|
|
|
|
static const struct pios_usb_cfg pios_usb_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 */
|
|
|
|
#if defined(PIOS_INCLUDE_USB_HID)
|
|
#include <pios_usb_hid_priv.h>
|
|
|
|
const struct pios_usb_hid_cfg pios_usb_hid_cfg = {
|
|
.data_if = 0,
|
|
.data_rx_ep = 1,
|
|
.data_tx_ep = 1,
|
|
};
|
|
|
|
#endif /* PIOS_INCLUDE_USB_HID */
|
|
|
|
uint32_t pios_com_telem_rf_id;
|
|
uint32_t pios_com_telem_usb_id;
|
|
|
|
#include "pios_opahrs.h"
|
|
|
|
/**
|
|
* PIOS_Board_Init()
|
|
* initializes all the core subsystems on this specific hardware
|
|
* called from System/openpilot.c
|
|
*/
|
|
static bool board_init_complete = false;
|
|
void PIOS_Board_Init(void) {
|
|
if (board_init_complete) {
|
|
return;
|
|
}
|
|
|
|
/* Enable Prefetch Buffer */
|
|
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
|
|
|
|
/* Flash 2 wait state */
|
|
FLASH_SetLatency(FLASH_Latency_2);
|
|
|
|
/* Delay system */
|
|
PIOS_DELAY_Init();
|
|
|
|
/* Initialize the PiOS library */
|
|
#if defined(PIOS_INCLUDE_COM)
|
|
uint32_t pios_usart_telem_rf_id;
|
|
if (PIOS_USART_Init(&pios_usart_telem_rf_id, &pios_usart_telem_cfg)) {
|
|
PIOS_DEBUG_Assert(0);
|
|
}
|
|
if (PIOS_COM_Init(&pios_com_telem_rf_id, &pios_usart_com_driver,
|
|
pios_usart_telem_rf_id,
|
|
pios_com_telem_rf_rx_buffer, sizeof(pios_com_telem_rf_rx_buffer),
|
|
pios_com_telem_rf_tx_buffer, sizeof(pios_com_telem_rf_tx_buffer))) {
|
|
PIOS_DEBUG_Assert(0);
|
|
}
|
|
#endif /* PIOS_INCLUDE_COM */
|
|
|
|
PIOS_GPIO_Init();
|
|
|
|
#if defined(PIOS_INCLUDE_USB)
|
|
uint32_t pios_usb_id;
|
|
if (PIOS_USB_Init(&pios_usb_id, &pios_usb_main_cfg)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
#if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_COM_MSG)
|
|
uint32_t pios_usb_hid_id;
|
|
if (PIOS_USB_HID_Init(&pios_usb_hid_id, &pios_usb_hid_cfg, pios_usb_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
if (PIOS_COM_MSG_Init(&pios_com_telem_usb_id, &pios_usb_hid_com_driver, pios_usb_hid_id)) {
|
|
PIOS_Assert(0);
|
|
}
|
|
#endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_COM_MSG */
|
|
|
|
#endif /* PIOS_INCLUDE_USB */
|
|
|
|
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);//TODO Tirar
|
|
|
|
/* Set up the SPI interface to the AHRS */
|
|
if (PIOS_SPI_Init(&pios_spi_ahrs_id, &pios_spi_ahrs_cfg)) {
|
|
PIOS_DEBUG_Assert(0);
|
|
}
|
|
|
|
/* Bind the AHRS comms layer to the AHRS SPI link */
|
|
PIOS_OPAHRS_Attach(pios_spi_ahrs_id);
|
|
|
|
board_init_complete = true;
|
|
}
|
|
|
|
/**
|
|
* @}
|
|
*/
|