From 0f0cb73fa5671d84b78393e317054f62e5f9fd3f Mon Sep 17 00:00:00 2001 From: Max Regan Date: Sat, 16 May 2020 22:04:56 +0000 Subject: [PATCH] Fix building for BOARD=watch (Fixes #8), enable in CI --- .gitignore | 5 +++- .gitlab-ci.yml | 18 +++++++++++--- firmware/Bsp/Drivers/RtcDriver.cpp | 39 +++++++++++++++++++++++------- firmware/Makefile | 3 ++- firmware/Test/clock.cpp | 4 +++ firmware/Test/fail.cpp | 4 +++ firmware/Test/lptim.cpp | 5 ++++ firmware/Test/pass.cpp | 4 +++ firmware/Test/periodic_alarms.cpp | 4 +++ firmware/Test/set_time.cpp | 4 +++ firmware/Test/stop.cpp | 4 +++ firmware/Test/timeout.cpp | 4 +++ firmware/Test/wakeup_irq.cpp | 4 +++ 13 files changed, 87 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index a253b93..c82c407 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,7 @@ build *.pyc *.su *.map -.gdb_history \ No newline at end of file +.gdb_history +GTAGS +GRTAGS +GPATH \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 467c440..4d6a9fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,7 @@ variables: - BOARD: "devboard" GIT_SUBMODULE_STRATEGY: "recursive" -build: +.build_template: &build_template image: registry.gitlab.maxregan.me/max/arm-build-image:latest stage: build script: @@ -14,9 +13,20 @@ build: - "firmware/Application/*.elf" - "firmware/Application/*.bin" -test: +build-devboard: + <<: *build_template + variables: + BOARD: devboard + +build-watch: + <<: *build_template + variables: + BOARD: watch + +test-devboard: + stage: test dependencies: - - build + - build-devboard tags: - tr-hw - privileged diff --git a/firmware/Bsp/Drivers/RtcDriver.cpp b/firmware/Bsp/Drivers/RtcDriver.cpp index 5857105..e2ef30e 100644 --- a/firmware/Bsp/Drivers/RtcDriver.cpp +++ b/firmware/Bsp/Drivers/RtcDriver.cpp @@ -169,6 +169,12 @@ ReturnCode RtcDriver::init_hw() SET(RTC->CR, RTC_CR_WUTIE); NVIC_EnableIRQ(RTC_IRQn); NVIC_SetPriority(RTC_IRQn, 1); + + enable_periodic_alarm(); + + // Clear the interrupt in the RTC + CLR(RTC->ISR, RTC_ISR_WUTF); + #elif defined(STM32L4XX) CLR(RTC->ICSR, RTC_ICSR_INIT); @@ -179,20 +185,17 @@ ReturnCode RtcDriver::init_hw() SET(RTC->CR, RTC_CR_WUTIE); NVIC_EnableIRQ(RTC_WKUP_IRQn); NVIC_SetPriority(RTC_WKUP_IRQn, 0); -#else -#error "Unsupported device type" -#endif - enable_periodic_alarm(); - // Disable the wakeup timer. This can be leftover from an old firmware/reset + enable_periodic_alarm(); // Clear the interrupt in the RTC SET(RTC->SCR, RTC_SCR_CWUTF); - // Disable the Wakeup timer (its periodic, but we use it as a - // one-shot timer +#else +#error "Unsupported device type" +#endif + // Disable the wakeup timer. This can be leftover from an old firmware/reset CLR(RTC->CR, RTC_CR_WUTE); - disable_rtc_write(); return ReturnCode::OK; @@ -313,7 +316,16 @@ ReturnCode RtcDriver::set_wakeup_in(BSP::time_t wakeup_delay) SET_TO(RTC->WUTR, RTC_WUTR_WUT, delay_cycles - 1); SET_TO(RTC->CR, RTC_CR_WUCKSEL, wucksel << RTC_CR_WUCKSEL_Pos); + // Clear any pending wakeup flags +#if defined(STM32L0XX) + CLR(RTC->ISR, RTC_ISR_WUTF); +#elif defined(STM32L4XX) SET(RTC->SCR, RTC_SCR_CWUTF); +#else +#error "Unsupported family" +#endif + + // Finally, enable the timer SET(RTC->CR, RTC_CR_WUTE); disable_rtc_write(); @@ -327,9 +339,18 @@ BSP::time_t RtcDriver::RtcSystemTimer::get_time() uint64_t new_timer_ticks, new_millis; enable_rtc_write(); - RTC->ICSR = ~(RTC_ICSR_INIT | RTC_ICSR_RSF); +#if defined(STM32L0XX) + CLR(RTC->ISR, RTC_ISR_RSF); + disable_rtc_write(); + while (!(RTC->ISR & RTC_ISR_RSF)) {} +#elif defined(STM32L4XX) + CLR(RTC->ICSR, RTC_ICSR_RSF); disable_rtc_write(); while (!(RTC->ICSR & RTC_ICSR_RSF)) {} +#else +#error "Unsupported family" +#endif + do { __disable_irq(); diff --git a/firmware/Makefile b/firmware/Makefile index 1fd7966..a9b99ea 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -114,6 +114,7 @@ OUTPUT_MAP ?= $(OUTPUT_NAME).map DEVICE_FAMILY_DEFINE = $(subst XX,xx,$(shell echo $(DEVICE_FAMILY) | tr '[:lower:]' '[:upper:]')) DEVICE_TYPE_DEFINE = $(shell echo $(DEVICE_TYPE) | tr '[:lower:]' '[:upper:]') DEVICE_LINE_DEFINE = $(shell echo $(DEVICE_LINE) | tr '[:lower:]' '[:upper:]') +BOARD_DEFINE = BOARD_$(shell echo $(BOARD) | tr '[:lower:]' '[:upper:]') CPU_FLAGS = -mthumb -mcpu=cortex-m0plus -mfloat-abi=soft @@ -128,7 +129,7 @@ CFLAGS += $(CPU_FLAGS) CFLAGS += -ffreestanding CFLAGS += -fstack-usage -Wstack-usage=128 # Defines -CFLAGS += -D$(DEVICE_FAMILY_DEFINE) -D$(DEVICE_TYPE_DEFINE) -D$(DEVICE_LINE_DEFINE) +CFLAGS += -D$(DEVICE_FAMILY_DEFINE) -D$(DEVICE_TYPE_DEFINE) -D$(DEVICE_LINE_DEFINE) -D$(BOARD_DEFINE) # CFLAGS += -DPRINTF_DISABLE_SUPPORT_FLOAT -DPRINTF_DISABLE_SUPPORT_EXPONENTIAL -DPRINTF_DISABLE_SUPPORT_PTRDIFF_T # Consider this one if we are running short on flash, it saved about 1K # CFLAGS += -DPRINTF_DISABLE_SUPPORT_LONG_LONG diff --git a/firmware/Test/clock.cpp b/firmware/Test/clock.cpp index a3d7f5d..00c9df3 100644 --- a/firmware/Test/clock.cpp +++ b/firmware/Test/clock.cpp @@ -36,7 +36,11 @@ using BSP::ReturnCode; using BSP::SystemTimer; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::time_t get_time() { diff --git a/firmware/Test/fail.cpp b/firmware/Test/fail.cpp index 4087741..d1b6e42 100644 --- a/firmware/Test/fail.cpp +++ b/firmware/Test/fail.cpp @@ -33,7 +33,11 @@ using BSP::Time; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); [[noreturn]] void main() { diff --git a/firmware/Test/lptim.cpp b/firmware/Test/lptim.cpp index b9cdab3..af88f5b 100644 --- a/firmware/Test/lptim.cpp +++ b/firmware/Test/lptim.cpp @@ -37,8 +37,13 @@ using BSP::ReturnCode; using BSP::SystemTimer; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +static BSP::LptimPwm g_test_lptim(LPTIM1); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); static BSP::LptimPwm g_test_lptim(LPTIM2); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::GpioDriver g_gpiob(GPIOB); static BSP::GpioPin g_lptim_pin(g_gpiob, 2); diff --git a/firmware/Test/pass.cpp b/firmware/Test/pass.cpp index 71bfbd5..6debd7d 100644 --- a/firmware/Test/pass.cpp +++ b/firmware/Test/pass.cpp @@ -33,7 +33,11 @@ using BSP::Time; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); [[noreturn]] void main() { diff --git a/firmware/Test/periodic_alarms.cpp b/firmware/Test/periodic_alarms.cpp index 760c333..bb8d551 100644 --- a/firmware/Test/periodic_alarms.cpp +++ b/firmware/Test/periodic_alarms.cpp @@ -39,7 +39,11 @@ using BSP::SystemTimer; using BSP::time_t; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::GpioPin g_test_pin(g_gpioa, 6); diff --git a/firmware/Test/set_time.cpp b/firmware/Test/set_time.cpp index 89736d3..65fc0f3 100644 --- a/firmware/Test/set_time.cpp +++ b/firmware/Test/set_time.cpp @@ -39,7 +39,11 @@ using BSP::WallClockTime; using BSP::RtcDriver; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::GpioPin g_test_pin(g_gpioa, 6); static char buffer[128] = {0}; diff --git a/firmware/Test/stop.cpp b/firmware/Test/stop.cpp index 09a0b94..dfefaa6 100644 --- a/firmware/Test/stop.cpp +++ b/firmware/Test/stop.cpp @@ -39,7 +39,11 @@ using BSP::SystemTimer; using BSP::time_t; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::GpioPin g_test_pin(g_gpioa, 6); diff --git a/firmware/Test/timeout.cpp b/firmware/Test/timeout.cpp index 9d3f879..38ed712 100644 --- a/firmware/Test/timeout.cpp +++ b/firmware/Test/timeout.cpp @@ -33,7 +33,11 @@ using BSP::Time; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); [[noreturn]] void main() { diff --git a/firmware/Test/wakeup_irq.cpp b/firmware/Test/wakeup_irq.cpp index 64001e6..56d5491 100644 --- a/firmware/Test/wakeup_irq.cpp +++ b/firmware/Test/wakeup_irq.cpp @@ -38,7 +38,11 @@ using BSP::SystemTimer; using BSP::time_t; static BSP::Schedule::LowPowerTaskScheduler<1> g_sched; +#if defined(BOARD_WATCH) +static BSP::UsartDriver g_test_uart(USART2, g_sched); +#elif defined(BOARD_DEVBOARD) static BSP::UsartDriver g_test_uart(USART1, g_sched); +#endif static BSP::GpioDriver g_gpioa(GPIOA); static BSP::GpioPin g_test_pin(g_gpioa, 6);