From 73242f39c6f453fa7b0f6185bf0da5d14c2cea6f Mon Sep 17 00:00:00 2001 From: Antoine Albertelli Date: Thu, 3 Sep 2015 17:41:01 +0200 Subject: [PATCH 1/5] Update stm32 drivers to ChibiOS 3.0 --- libuavcan_drivers/stm32/driver/src/internal.hpp | 2 +- .../stm32/driver/src/uc_stm32_thread.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/src/internal.hpp b/libuavcan_drivers/stm32/driver/src/internal.hpp index 36789c2991..1279ae2a9b 100644 --- a/libuavcan_drivers/stm32/driver/src/internal.hpp +++ b/libuavcan_drivers/stm32/driver/src/internal.hpp @@ -54,7 +54,7 @@ * Priority mask for timer and CAN interrupts. */ # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK -# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY) +# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_PRIO_MASK(CORTEX_MAX_KERNEL_PRIORITY) # endif #endif diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp index eb93cc215f..c4e5710a0a 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp @@ -23,13 +23,13 @@ bool BusEvent::wait(uavcan::MonotonicDuration duration) if (msec <= 0) { - ret = sem_.waitTimeout(TIME_IMMEDIATE); + ret = sem_.wait(TIME_IMMEDIATE); } else { - ret = sem_.waitTimeout((msec > MaxDelayMSec) ? MS2ST(MaxDelayMSec) : MS2ST(msec)); + ret = sem_.wait((msec > MaxDelayMSec) ? MS2ST(MaxDelayMSec) : MS2ST(msec)); } - return ret == RDY_OK; + return ret == MSG_OK; } void BusEvent::signal() @@ -39,9 +39,9 @@ void BusEvent::signal() void BusEvent::signalFromInterrupt() { - chSysLockFromIsr(); + chSysLockFromISR(); sem_.signalI(); - chSysUnlockFromIsr(); + chSysUnlockFromISR(); } /* @@ -54,7 +54,7 @@ void Mutex::lock() void Mutex::unlock() { - chibios_rt::BaseThread::unlockMutex(); + mtx_.unlock(); } #elif UAVCAN_STM32_NUTTX From 3efd9bdfd0c2ce8e659cbffadb885e1fa92d0d29 Mon Sep 17 00:00:00 2001 From: Antoine Albertelli Date: Thu, 3 Sep 2015 18:15:09 +0200 Subject: [PATCH 2/5] Correct CORTEX_MAX_KERNEL_PRIORITY use Now the NVIC minidriver always take the priority as parameter, the use of the CORTEX_PRIORITY_MASK() macro is no more required. Reference: http://www.chibios.org/dokuwiki/doku.php?id=chibios:articles:porting_from_2_to_3 --- libuavcan_drivers/stm32/driver/src/internal.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libuavcan_drivers/stm32/driver/src/internal.hpp b/libuavcan_drivers/stm32/driver/src/internal.hpp index 1279ae2a9b..9bb7ac0be7 100644 --- a/libuavcan_drivers/stm32/driver/src/internal.hpp +++ b/libuavcan_drivers/stm32/driver/src/internal.hpp @@ -54,7 +54,7 @@ * Priority mask for timer and CAN interrupts. */ # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK -# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_PRIO_MASK(CORTEX_MAX_KERNEL_PRIORITY) +# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_MAX_KERNEL_PRIORITY # endif #endif From a767b77de24d31583628fedf15a8bd9f572c5cb1 Mon Sep 17 00:00:00 2001 From: Michael Spieler Date: Tue, 8 Sep 2015 18:32:49 +0200 Subject: [PATCH 3/5] Keep ChibiOS 2 compatibility, fix ISR names for ChibiOS 3. --- .../stm32/driver/src/internal.hpp | 6 ++++- .../stm32/driver/src/uc_stm32_can.cpp | 13 ++++++++++- .../stm32/driver/src/uc_stm32_clock.cpp | 12 ++++++++-- .../stm32/driver/src/uc_stm32_thread.cpp | 22 +++++++++++++++++++ 4 files changed, 49 insertions(+), 4 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/src/internal.hpp b/libuavcan_drivers/stm32/driver/src/internal.hpp index 9bb7ac0be7..2bdee57a66 100644 --- a/libuavcan_drivers/stm32/driver/src/internal.hpp +++ b/libuavcan_drivers/stm32/driver/src/internal.hpp @@ -54,7 +54,11 @@ * Priority mask for timer and CAN interrupts. */ # ifndef UAVCAN_STM32_IRQ_PRIORITY_MASK -# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_MAX_KERNEL_PRIORITY +# if (CH_KERNEL_MAJOR == 2) +# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_PRIORITY_MASK(CORTEX_MAX_KERNEL_PRIORITY) +# else // ChibiOS 3 +# define UAVCAN_STM32_IRQ_PRIORITY_MASK CORTEX_MAX_KERNEL_PRIORITY +# endif # endif #endif diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp index b7d4defbf8..8730ca0ed0 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp @@ -20,7 +20,7 @@ # error "Unknown OS" #endif -#if UAVCAN_STM32_CHIBIOS || UAVCAN_STM32_BAREMETAL +#if (UAVCAN_STM32_CHIBIOS && CH_KERNEL_MAJOR == 2) || UAVCAN_STM32_BAREMETAL # if !(defined(STM32F10X_CL) || defined(STM32F2XX) || defined(STM32F4XX)) // IRQ numbers # define CAN1_RX0_IRQn USB_LP_CAN1_RX0_IRQn @@ -33,6 +33,17 @@ # endif #endif +#if (UAVCAN_STM32_CHIBIOS && CH_KERNEL_MAJOR == 3) +#define CAN1_TX_IRQHandler STM32_CAN1_TX_HANDLER +#define CAN1_RX0_IRQHandler STM32_CAN1_RX0_HANDLER +#define CAN1_RX1_IRQHandler STM32_CAN1_RX1_HANDLER +#define CAN1_SCE_IRQHandler STM32_CAN1_SCE_HANDLER +#define CAN2_TX_IRQHandler STM32_CAN2_TX_HANDLER +#define CAN2_RX0_IRQHandler STM32_CAN2_RX0_HANDLER +#define CAN2_RX1_IRQHandler STM32_CAN2_RX1_HANDLER +#define CAN2_SCE_IRQHandler STM32_CAN2_SCE_HANDLER +#endif + #if UAVCAN_STM32_NUTTX # if !defined(STM32_IRQ_CAN1TX) && !defined(STM32_IRQ_CAN1RX0) # define STM32_IRQ_CAN1TX STM32_IRQ_USBHPCANTX diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp index a94a543beb..d772e54423 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_clock.cpp @@ -14,12 +14,21 @@ /* * Timer instance */ -# if UAVCAN_STM32_CHIBIOS || UAVCAN_STM32_BAREMETAL +# if (UAVCAN_STM32_CHIBIOS && CH_KERNEL_MAJOR == 2) || UAVCAN_STM32_BAREMETAL # define TIMX UAVCAN_STM32_GLUE2(TIM, UAVCAN_STM32_TIMER_NUMBER) # define TIMX_IRQn UAVCAN_STM32_GLUE3(TIM, UAVCAN_STM32_TIMER_NUMBER, _IRQn) # define TIMX_INPUT_CLOCK STM32_TIMCLK1 # endif +# if (UAVCAN_STM32_CHIBIOS && CH_KERNEL_MAJOR == 3) +# define TIMX UAVCAN_STM32_GLUE2(STM32_TIM, UAVCAN_STM32_TIMER_NUMBER) +# define TIMX_IRQn UAVCAN_STM32_GLUE3(STM32_TIM, UAVCAN_STM32_TIMER_NUMBER, _NUMBER) +# define TIMX_IRQHandler UAVCAN_STM32_GLUE3(STM32_TIM, UAVCAN_STM32_TIMER_NUMBER, _HANDLER) +# define TIMX_INPUT_CLOCK STM32_TIMCLK1 +# else +# define TIMX_IRQHandler UAVCAN_STM32_GLUE3(TIM, UAVCAN_STM32_TIMER_NUMBER, _IRQHandler) +# endif + # if UAVCAN_STM32_NUTTX # define TIMX UAVCAN_STM32_GLUE3(STM32_TIM, UAVCAN_STM32_TIMER_NUMBER, _BASE) # define TMR_REG(o) (TIMX + (o)) @@ -27,7 +36,6 @@ # define TIMX_IRQn UAVCAN_STM32_GLUE2(STM32_IRQ_TIM, UAVCAN_STM32_TIMER_NUMBER) # endif -# define TIMX_IRQHandler UAVCAN_STM32_GLUE3(TIM, UAVCAN_STM32_TIMER_NUMBER, _IRQHandler) # if UAVCAN_STM32_TIMER_NUMBER >= 2 && UAVCAN_STM32_TIMER_NUMBER <= 7 # define TIMX_RCC_ENR RCC->APB1ENR diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp index c4e5710a0a..d9a4ceffe6 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp @@ -23,13 +23,25 @@ bool BusEvent::wait(uavcan::MonotonicDuration duration) if (msec <= 0) { +# if (CH_KERNEL_MAJOR == 2) + ret = sem_.waitTimeout(TIME_IMMEDIATE); +# else // ChibiOS 3 ret = sem_.wait(TIME_IMMEDIATE); +# endif } else { +# if (CH_KERNEL_MAJOR == 2) + ret = sem_.waitTimeout((msec > MaxDelayMSec) ? MS2ST(MaxDelayMSec) : MS2ST(msec)); +# else // ChibiOS 3 ret = sem_.wait((msec > MaxDelayMSec) ? MS2ST(MaxDelayMSec) : MS2ST(msec)); +# endif } +# if (CH_KERNEL_MAJOR == 2) + return ret == RDY_OK; +# else // ChibiOS 3 return ret == MSG_OK; +# endif } void BusEvent::signal() @@ -39,9 +51,15 @@ void BusEvent::signal() void BusEvent::signalFromInterrupt() { +# if (CH_KERNEL_MAJOR == 2) + chSysLockFromIsr(); + sem_.signalI(); + chSysUnlockFromIsr(); +# else // ChibiOS 3 chSysLockFromISR(); sem_.signalI(); chSysUnlockFromISR(); +# endif } /* @@ -49,7 +67,11 @@ void BusEvent::signalFromInterrupt() */ void Mutex::lock() { +# if (CH_KERNEL_MAJOR == 2) + chibios_rt::BaseThread::unlockMutex(); +# else // ChibiOS 3 mtx_.lock(); +# endif } void Mutex::unlock() From d2a5476af1ca817f4863a41cc84f0f9074b1150d Mon Sep 17 00:00:00 2001 From: Antoine Albertelli Date: Wed, 23 Sep 2015 14:57:14 +0200 Subject: [PATCH 4/5] Fix mutex lock typo --- libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp index d9a4ceffe6..93b8c0a85c 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_thread.cpp @@ -67,16 +67,16 @@ void BusEvent::signalFromInterrupt() */ void Mutex::lock() { -# if (CH_KERNEL_MAJOR == 2) - chibios_rt::BaseThread::unlockMutex(); -# else // ChibiOS 3 mtx_.lock(); -# endif } void Mutex::unlock() { +# if (CH_KERNEL_MAJOR == 2) + chibios_rt::BaseThread::unlockMutex(); +# else // ChibiOS 3 mtx_.unlock(); +# endif } #elif UAVCAN_STM32_NUTTX From 5716f3eb3e3f16e42448d1eee262cb3622503884 Mon Sep 17 00:00:00 2001 From: Antoine Albertelli Date: Wed, 23 Sep 2015 21:35:29 +0200 Subject: [PATCH 5/5] Add compatibility defines for STM32F3 --- libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp b/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp index 8730ca0ed0..77b8378a02 100644 --- a/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp +++ b/libuavcan_drivers/stm32/driver/src/uc_stm32_can.cpp @@ -58,6 +58,17 @@ static int can2_irq(const int irq, void*); } #endif +/* STM32F3's only CAN inteface does not have a number. */ +#if defined(STM32F3XX) +#define RCC_APB1ENR_CAN1EN RCC_APB1ENR_CANEN +#define RCC_APB1RSTR_CAN1RST RCC_APB1RSTR_CANRST +#define CAN1_TX_IRQn CAN_TX_IRQn +#define CAN1_RX0_IRQn CAN_RX0_IRQn +#define CAN1_RX1_IRQn CAN_RX1_IRQn +#define CAN1_SCE_IRQn CAN_SCE_IRQn +#endif + + namespace uavcan_stm32 { namespace