Browse Source

HAL_ChibiOS: support ChibiOS kernel major 6

preparing for STM32H7 support
master
Andrew Tridgell 6 years ago
parent
commit
bbd25350eb
  1. 6
      libraries/AP_HAL_ChibiOS/AnalogIn.cpp
  2. 2
      libraries/AP_HAL_ChibiOS/AnalogIn.h
  3. 16
      libraries/AP_HAL_ChibiOS/CanIface.cpp
  4. 6
      libraries/AP_HAL_ChibiOS/RCOutput.cpp
  5. 12
      libraries/AP_HAL_ChibiOS/SoftSigReader.cpp
  6. 25
      libraries/AP_HAL_ChibiOS/UARTDriver.cpp

6
libraries/AP_HAL_ChibiOS/AnalogIn.cpp

@ -185,11 +185,9 @@ void AnalogSource::_add_value(float v, float vcc5V)
/* /*
callback from ADC driver when sample buffer is filled callback from ADC driver when sample buffer is filled
*/ */
void AnalogIn::adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n) void AnalogIn::adccallback(ADCDriver *adcp)
{ {
if (buffer != samples) { const adcsample_t *buffer = samples;
return;
}
for (uint8_t i = 0; i < ADC_DMA_BUF_DEPTH; i++) { for (uint8_t i = 0; i < ADC_DMA_BUF_DEPTH; i++) {
for (uint8_t j = 0; j < ADC_GRP1_NUM_CHANNELS; j++) { for (uint8_t j = 0; j < ADC_GRP1_NUM_CHANNELS; j++) {
sample_sum[j] += *buffer++; sample_sum[j] += *buffer++;

2
libraries/AP_HAL_ChibiOS/AnalogIn.h

@ -63,7 +63,7 @@ public:
float board_voltage(void) override { return _board_voltage; } float board_voltage(void) override { return _board_voltage; }
float servorail_voltage(void) override { return _servorail_voltage; } float servorail_voltage(void) override { return _servorail_voltage; }
uint16_t power_status_flags(void) override { return _power_flags; } uint16_t power_status_flags(void) override { return _power_flags; }
static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n); static void adccallback(ADCDriver *adcp);
private: private:
void read_adc(uint32_t *val); void read_adc(uint32_t *val);

16
libraries/AP_HAL_ChibiOS/CanIface.cpp

@ -63,7 +63,7 @@
# endif # endif
#endif #endif
#if (CH_KERNEL_MAJOR == 3 || CH_KERNEL_MAJOR == 4 || CH_KERNEL_MAJOR == 5) #if (CH_KERNEL_MAJOR == 3 || CH_KERNEL_MAJOR == 4 || CH_KERNEL_MAJOR == 5 || CH_KERNEL_MAJOR == 6)
#define CAN1_TX_IRQHandler STM32_CAN1_TX_HANDLER #define CAN1_TX_IRQHandler STM32_CAN1_TX_HANDLER
#define CAN1_RX0_IRQHandler STM32_CAN1_RX0_HANDLER #define CAN1_RX0_IRQHandler STM32_CAN1_RX0_HANDLER
#define CAN1_RX1_IRQHandler STM32_CAN1_RX1_HANDLER #define CAN1_RX1_IRQHandler STM32_CAN1_RX1_HANDLER
@ -1213,10 +1213,16 @@ UAVCAN_STM32_IRQ_HANDLER(CAN1_RX1_IRQHandler)
# if UAVCAN_STM32_NUM_IFACES > 1 # if UAVCAN_STM32_NUM_IFACES > 1
#if !defined(CAN2_TX_IRQHandler) ||\ #if !defined(CAN2_TX_IRQHandler)
!defined(CAN2_RX0_IRQHandler) ||\ # error "Misconfigured build1"
!defined(CAN2_RX1_IRQHandler) #endif
# error "Misconfigured build"
#if !defined(CAN2_RX0_IRQHandler)
# error "Misconfigured build2"
#endif
#if !defined(CAN2_RX1_IRQHandler)
# error "Misconfigured build3"
#endif #endif
UAVCAN_STM32_IRQ_HANDLER(CAN2_TX_IRQHandler); UAVCAN_STM32_IRQ_HANDLER(CAN2_TX_IRQHandler);

6
libraries/AP_HAL_ChibiOS/RCOutput.cpp

@ -820,8 +820,9 @@ void RCOutput::dma_allocate(Shared_DMA *ctx)
for (uint8_t i = 0; i < NUM_GROUPS; i++ ) { for (uint8_t i = 0; i < NUM_GROUPS; i++ ) {
pwm_group &group = pwm_group_list[i]; pwm_group &group = pwm_group_list[i];
if (group.dma_handle == ctx) { if (group.dma_handle == ctx) {
osalDbgAssert(group.dma == nullptr, "double DMA allocation");
chSysLock(); chSysLock();
dmaStreamAllocate(group.dma, 10, dma_irq_callback, &group); group.dma = dmaStreamAllocI(group.dma_up_stream_id, 10, dma_irq_callback, &group);
chSysUnlock(); chSysUnlock();
} }
} }
@ -836,7 +837,8 @@ void RCOutput::dma_deallocate(Shared_DMA *ctx)
pwm_group &group = pwm_group_list[i]; pwm_group &group = pwm_group_list[i];
if (group.dma_handle == ctx) { if (group.dma_handle == ctx) {
chSysLock(); chSysLock();
dmaStreamRelease(group.dma); dmaStreamFreeI(group.dma);
group.dma = nullptr;
chSysUnlock(); chSysUnlock();
} }
} }

12
libraries/AP_HAL_ChibiOS/SoftSigReader.cpp

@ -36,13 +36,13 @@ bool SoftSigReader::attach_capture_timer(ICUDriver* icu_drv, icuchannel_t chan,
} }
_icu_drv = icu_drv; _icu_drv = icu_drv;
//Setup Burst transfer of period and width measurement //Setup Burst transfer of period and width measurement
dma = STM32_DMA_STREAM(dma_stream); osalDbgAssert(dma == nullptr, "double DMA allocation");
chSysLock(); chSysLock();
bool dma_allocated = dmaStreamAllocate(dma, dma = dmaStreamAllocI(dma_stream,
12, //IRQ Priority 12, //IRQ Priority
(stm32_dmaisr_t)_irq_handler, (stm32_dmaisr_t)_irq_handler,
(void *)this); (void *)this);
osalDbgAssert(!dma_allocated, "stream already allocated"); osalDbgAssert(dma, "stream allocation failed");
chSysUnlock(); chSysUnlock();
//setup address for full word transfer from Timer //setup address for full word transfer from Timer
dmaStreamSetPeripheral(dma, &icu_drv->tim->DMAR); dmaStreamSetPeripheral(dma, &icu_drv->tim->DMAR);

25
libraries/AP_HAL_ChibiOS/UARTDriver.cpp

@ -226,13 +226,13 @@ void UARTDriver::begin(uint32_t b, uint16_t rxS, uint16_t txS)
//setup Rx DMA //setup Rx DMA
if(!_device_initialised) { if(!_device_initialised) {
if(sdef.dma_rx) { if(sdef.dma_rx) {
rxdma = STM32_DMA_STREAM(sdef.dma_rx_stream_id); osalDbgAssert(rxdma == nullptr, "double DMA allocation");
chSysLock(); chSysLock();
bool dma_allocated = dmaStreamAllocate(rxdma, rxdma = dmaStreamAllocI(sdef.dma_rx_stream_id,
12, //IRQ Priority 12, //IRQ Priority
(stm32_dmaisr_t)rxbuff_full_irq, (stm32_dmaisr_t)rxbuff_full_irq,
(void *)this); (void *)this);
osalDbgAssert(!dma_allocated, "stream already allocated"); osalDbgAssert(rxdma, "stream alloc failed");
chSysUnlock(); chSysUnlock();
#if defined(STM32F7) #if defined(STM32F7)
dmaStreamSetPeripheral(rxdma, &((SerialDriver*)sdef.serial)->usart->RDR); dmaStreamSetPeripheral(rxdma, &((SerialDriver*)sdef.serial)->usart->RDR);
@ -315,13 +315,12 @@ void UARTDriver::dma_tx_allocate(Shared_DMA *ctx)
{ {
#if HAL_USE_SERIAL == TRUE #if HAL_USE_SERIAL == TRUE
osalDbgAssert(txdma == nullptr, "double DMA allocation"); osalDbgAssert(txdma == nullptr, "double DMA allocation");
txdma = STM32_DMA_STREAM(sdef.dma_tx_stream_id);
chSysLock(); chSysLock();
bool dma_allocated = dmaStreamAllocate(txdma, txdma = dmaStreamAllocI(sdef.dma_tx_stream_id,
12, //IRQ Priority 12, //IRQ Priority
(stm32_dmaisr_t)tx_complete, (stm32_dmaisr_t)tx_complete,
(void *)this); (void *)this);
osalDbgAssert(!dma_allocated, "stream already allocated"); osalDbgAssert(txdma, "stream alloc failed");
chSysUnlock(); chSysUnlock();
#if defined(STM32F7) #if defined(STM32F7)
dmaStreamSetPeripheral(txdma, &((SerialDriver*)sdef.serial)->usart->TDR); dmaStreamSetPeripheral(txdma, &((SerialDriver*)sdef.serial)->usart->TDR);
@ -334,7 +333,7 @@ void UARTDriver::dma_tx_allocate(Shared_DMA *ctx)
void UARTDriver::dma_tx_deallocate(Shared_DMA *ctx) void UARTDriver::dma_tx_deallocate(Shared_DMA *ctx)
{ {
chSysLock(); chSysLock();
dmaStreamRelease(txdma); dmaStreamFreeI(txdma);
txdma = nullptr; txdma = nullptr;
chSysUnlock(); chSysUnlock();
} }

Loading…
Cancel
Save