diff --git a/radio/src/Makefile b/radio/src/Makefile index 3212d851c..82eddef95 100644 --- a/radio/src/Makefile +++ b/radio/src/Makefile @@ -361,6 +361,10 @@ SIMU_DISKIO = NO # Values = NO, YES SIMU_AUDIO = NO +# Enable Watchdog test (DANGEROUS) +# Values = NO, YES +WATCHDOG_TEST = NO + #------- END BUILD OPTIONS --------------------------- # Define programs and commands. @@ -1023,6 +1027,9 @@ ifeq ($(PCB), TARANIS) ifeq ($(MIXERS_MONITOR), YES) CPPDEFS += -DMIXERS_MONITOR endif + ifeq ($(WATCHDOG_TEST), YES) + CPPDEFS += -DWATCHDOG_TEST + endif endif CC = $(TRGT)gcc diff --git a/radio/src/gui/Taranis/view_statistics.cpp b/radio/src/gui/Taranis/view_statistics.cpp index 29c01f0ee..8f5777ea7 100755 --- a/radio/src/gui/Taranis/view_statistics.cpp +++ b/radio/src/gui/Taranis/view_statistics.cpp @@ -105,6 +105,15 @@ void menuStatisticsDebug(uint8_t event) { TITLE(STR_MENUDEBUG); +#if defined(WATCHDOG_TEST) + if (s_warning_result) { + s_warning_result = 0; + // do a user requested watchdog test + TRACE("Performing watchdog test"); + pausePulses(); + } +#endif + switch(event) { case EVT_KEY_LONG(KEY_ENTER): @@ -136,6 +145,15 @@ void menuStatisticsDebug(uint8_t event) case EVT_KEY_FIRST(KEY_EXIT): chainMenu(menuMainView); break; +#if defined(WATCHDOG_TEST) + case EVT_KEY_LONG(KEY_MENU): + { + POPUP_CONFIRMATION("Test the watchdog?"); + const char * w = "The radio will reset!"; + SET_WARNING_INFO(w, strlen(w), 0); + } + break; +#endif } lcd_putsLeft(MENU_DEBUG_Y_FREE_RAM, "Free Mem"); diff --git a/radio/src/loadboot.cpp b/radio/src/loadboot.cpp index f4dbd0feb..f71fbd520 100644 --- a/radio/src/loadboot.cpp +++ b/radio/src/loadboot.cpp @@ -89,24 +89,33 @@ const uint8_t BootCode[] = { __attribute__ ((section(".bootrodata"), used)) void _bootStart() { - // turn soft power ON now - RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN; // Enable portD clock - GPIOD->BSRRL = 1; - GPIOD->MODER = (GPIOD->MODER & 0xFFFFFFFC) | 1; - #if defined(REV9E) - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // Enable portC clock - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; // Enable portG clock + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIOGEN | RCC_AHB1ENR_GPIODEN; #else - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN; // Enable portC clock - RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN; // Enable portE clock + RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIODEN; #endif + // these two NOPs are needed (see STM32F errata sheet) before the peripheral + // register can be written after the peripheral clock was enabled + __ASM volatile ("nop"); + __ASM volatile ("nop"); + + // Turn soft power ON now + GPIOD->BSRRL = 1; // set PWR_GPIO_PIN_ON pin to 1 + GPIOD->MODER = (GPIOD->MODER & 0xFFFFFFFC) | 1; // General purpose output mode + + // TRIMS_GPIO_PIN_LHR is on PG0 on 9XE and on PE3 on Taranis + // TRIMS_GPIO_PIN_RHL is on PC1 on all versions + + // turn on pull-ups on trim keys GPIOC->PUPDR = 0x00000004; +#if defined(REV9E) + GPIOG->PUPDR = 0x00000001; +#else GPIOE->PUPDR = 0x00000040; +#endif - uint32_t i; - for (i = 0; i < 50000; i += 1) { + for (uint32_t i = 0; i < 50000; i += 1) { bwdt_reset(); } diff --git a/radio/src/targets/taranis/board_taranis.cpp b/radio/src/targets/taranis/board_taranis.cpp index 25cb19f48..6b3ec98d7 100644 --- a/radio/src/targets/taranis/board_taranis.cpp +++ b/radio/src/targets/taranis/board_taranis.cpp @@ -156,7 +156,7 @@ void boardInit() #endif #if defined(REV9E) - if (!(RCC->CSR & (RCC_CSR_SFTRSTF | RCC_CSR_WDGRSTF))) { + if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { lcd_clear(); lcd_bmp(76, 2, bmp_lock, 0, 60); lcdRefresh(); diff --git a/radio/src/targets/taranis/board_taranis.h b/radio/src/targets/taranis/board_taranis.h index e33217b8c..e1171e99b 100644 --- a/radio/src/targets/taranis/board_taranis.h +++ b/radio/src/targets/taranis/board_taranis.h @@ -236,8 +236,9 @@ void checkRotaryEncoder(void); void watchdogInit(unsigned int duration); #define wdt_enable(x) watchdogInit(1500) #define wdt_reset() IWDG->KR = 0xAAAA -#define WAS_RESET_BY_WATCHDOG() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF)) -#define WAS_RESET_BY_SOFTWARE() (RCC->CSR & RCC_CSR_SFTRSTF) +#define WAS_RESET_BY_SOFTWARE() (RCC->CSR & RCC_CSR_SFTRSTF) +#define WAS_RESET_BY_WATCHDOG() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF)) +#define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF | RCC_CSR_SFTRSTF)) #endif // ADC driver diff --git a/radio/src/targets/taranis/lcd_driver.cpp b/radio/src/targets/taranis/lcd_driver.cpp index 4ad229b7e..0ea21d8c5 100644 --- a/radio/src/targets/taranis/lcd_driver.cpp +++ b/radio/src/targets/taranis/lcd_driver.cpp @@ -363,7 +363,7 @@ void lcdInit() { LCD_Hardware_Init(); - if (WAS_RESET_BY_WATCHDOG()|WAS_RESET_BY_SOFTWARE()) return; //no need to reset LCD module + if (WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) return; //no need to reset LCD module //reset LCD module LCD_RST_LOW(); @@ -400,7 +400,7 @@ void lcdInitFinish() initialization (without reset) is also recommended by the data sheet. */ - if (!WAS_RESET_BY_WATCHDOG() && !WAS_RESET_BY_SOFTWARE()) { + if (!WAS_RESET_BY_WATCHDOG_OR_SOFTWARE()) { #if !defined(BOOT) while(g_tmr10ms < (RESET_WAIT_DELAY_MS/10)) {}; //wait measured from the power-on #else diff --git a/radio/src/targets/taranis/pwr_driver.c b/radio/src/targets/taranis/pwr_driver.c index b02ba3b14..a5a64db48 100644 --- a/radio/src/targets/taranis/pwr_driver.c +++ b/radio/src/targets/taranis/pwr_driver.c @@ -42,6 +42,9 @@ extern volatile uint32_t g_tmr10ms; void pwrInit() { + // if any changes are done to the PWR PIN or pwrOn() function + // then the same changes must be done in _bootStart() + GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = PWR_GPIO_PIN_ON; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;