diff --git a/latest/Firmware/Bootloader/Inc/fw_update.h b/latest/Firmware/Bootloader/Inc/fw_update.h index cc167dc..d3a775b 100644 --- a/latest/Firmware/Bootloader/Inc/fw_update.h +++ b/latest/Firmware/Bootloader/Inc/fw_update.h @@ -41,5 +41,6 @@ typedef struct { static FirmwareUpdate firmwareUpdate; void dfu_init(); +void dfu_tick(); #endif /* FW_UPDATE_H_ */ diff --git a/latest/Firmware/Bootloader/Src/fw_update.c b/latest/Firmware/Bootloader/Src/fw_update.c index 7147f87..0891bc4 100644 --- a/latest/Firmware/Bootloader/Src/fw_update.c +++ b/latest/Firmware/Bootloader/Src/fw_update.c @@ -289,11 +289,6 @@ void USART1_IRQHandler(void) } } -void HAL_SYSTICK_Callback(void) -{ - static uint32_t count = 0; - if ( count++ % 1000 == 0 ) - dfu_tick(); -} + diff --git a/latest/Firmware/Bootloader/Src/main.c b/latest/Firmware/Bootloader/Src/main.c index cf978b6..b2274b1 100644 --- a/latest/Firmware/Bootloader/Src/main.c +++ b/latest/Firmware/Bootloader/Src/main.c @@ -75,9 +75,9 @@ static void MX_CRC_Init(void); /* USER CODE BEGIN 0 */ typedef void (*pFunction)(void); +static bool inDFU = false; - -void jump() +void jump_to_application() { HAL_UART_MspDeInit(&huart1); HAL_CRC_MspDeInit(&hcrc); @@ -99,42 +99,101 @@ uint32_t imageCRC32(Metadata *fw) return crc32((void*)APPLICATION_ADDRESS, fw->size); } +bool rescue_requested() +{ + uint32_t now = HAL_GetTick(); + int toggleCount = 0; + int oldState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12); + while ( HAL_GetTick() - now < 2500 ) + { + int newState = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12); + if ( oldState != newState ) + { + ++toggleCount; + oldState = newState; + } + + if ( toggleCount > 1 ) + return true; + + __WFI(); + } + + return false; +} + +void main_tick() +{ + // TODO: Anything? +} /* USER CODE END 0 */ int main(void) { firmwareUpdate.state = WAITING; + GPIO_InitTypeDef gpio; HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_CRC_Init(); - bool hasValidFirmware = false; + + if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST) != RESET) + { + // This is a power-on (or brown-out) reset + // TX switch can be used for rescue mode immediately after POR + gpio.Pin = GPIO_PIN_12; + gpio.Mode = GPIO_MODE_INPUT; + gpio.Pull = GPIO_PULLUP; + HAL_GPIO_Init(GPIOA, &gpio); + + __HAL_RCC_CLEAR_RESET_FLAGS(); + + if ( rescue_requested() ) + goto enter_dfu; + } + + // Since there is no "rescue" mode request, now we check for explicit DFU request via reserved RAM if ( *(uint32_t*)BOOTMODE_ADDRESS == DFU_FLAG_MAGIC ) { *(uint32_t*)BOOTMODE_ADDRESS = 0; - } - else - { - Metadata *fw = (Metadata*)METADATA_ADDRESS; - if ( fw->magic == 0xabadbabe ) - { - uint32_t crc = imageCRC32(fw); - hasValidFirmware = (crc == fw->crc32); - } + goto enter_dfu; } -#if 1 - // If there's firmware installed, jump to it -- do nothing else + Metadata *fw = (Metadata*)METADATA_ADDRESS; + if ( fw->magic == 0xabadbabe ) + { + uint32_t crc = imageCRC32(fw); + hasValidFirmware = (crc == fw->crc32); + } + + // If there's firmware installed, jump_to_application to it -- do nothing else if ( hasValidFirmware ) - jump(); -#endif + jump_to_application(); + /* * If we get here, we're waiting for a firmware upload */ +enter_dfu: + + // Turn on all LEDs to indicate this + gpio.Mode = GPIO_MODE_OUTPUT_PP; + gpio.Pull = GPIO_NOPULL; + gpio.Speed = GPIO_SPEED_LOW; + gpio.Alternate = 0; + gpio.Pin = GPIO_PIN_1|GPIO_PIN_11; + + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_11, GPIO_PIN_SET); + HAL_GPIO_Init(GPIOA, &gpio); + + gpio.Pin = GPIO_PIN_5; + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); + HAL_GPIO_Init(GPIOB, &gpio); + + inDFU = true; MX_USART1_UART_Init(); dfu_init(); @@ -264,20 +323,6 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); - GPIO_InitTypeDef gpio; - gpio.Mode = GPIO_MODE_OUTPUT_PP; - gpio.Pull = GPIO_NOPULL; - gpio.Speed = GPIO_SPEED_LOW; - gpio.Alternate = 0; - gpio.Pin = GPIO_PIN_1|GPIO_PIN_11; - - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_11, GPIO_PIN_SET); - HAL_GPIO_Init(GPIOA, &gpio); - - gpio.Pin = GPIO_PIN_5; - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET); - HAL_GPIO_Init(GPIOB, &gpio); - } /* USER CODE BEGIN 4 */ @@ -303,6 +348,18 @@ void _Error_Handler(char * file, int line) /* USER CODE END Error_Handler_Debug */ } +void HAL_SYSTICK_Callback(void) +{ + static uint32_t count = 0; + if ( count++ % 1000 == 0 ) + { + if ( inDFU ) + dfu_tick(); + else + main_tick(); + } +} + #ifdef USE_FULL_ASSERT /** diff --git a/latest/Firmware/Transponder/.cproject b/latest/Firmware/Transponder/.cproject index 359a238..bd9fba9 100644 --- a/latest/Firmware/Transponder/.cproject +++ b/latest/Firmware/Transponder/.cproject @@ -1409,6 +1409,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/latest/Firmware/Transponder/.gitignore b/latest/Firmware/Transponder/.gitignore index e8f80a1..7e67334 100644 --- a/latest/Firmware/Transponder/.gitignore +++ b/latest/Firmware/Transponder/.gitignore @@ -24,3 +24,4 @@ Debug /L432-LegacyBreakouts* /L432-NewBreakouts* +/L422-Board11.0-NewBreakouts-Bootloader/ diff --git a/latest/Firmware/Transponder/Inc/OTPData.h b/latest/Firmware/Transponder/Inc/OTPData.h index b40078d..e567cdd 100644 --- a/latest/Firmware/Transponder/Inc/OTPData.h +++ b/latest/Firmware/Transponder/Inc/OTPData.h @@ -20,14 +20,6 @@ #define MCU_STM32L431 0x03 #define MCU_STM32L432 0x04 -static const char *__mcuNames[] = { - "unknown", - "STM32L412", - "STM32L422", - "STM32L431", - "STM32L432" -}; - // This structure must be double-word aligned @@ -37,10 +29,7 @@ typedef struct uint32_t rev; char serialnum[32]; char hwrev[16]; - - uint8_t mcuType; - - uint8_t reserved[7]; + uint8_t reserved[8]; } OTPData; diff --git a/latest/Firmware/Transponder/Src/CommandProcessor.cpp b/latest/Firmware/Transponder/Src/CommandProcessor.cpp index d015611..df3c533 100644 --- a/latest/Firmware/Transponder/Src/CommandProcessor.cpp +++ b/latest/Firmware/Transponder/Src/CommandProcessor.cpp @@ -212,8 +212,6 @@ void CommandProcessor::writeOTPData(const std::string &s) vector tokens; Utils::tokenize(params, ' ', tokens); - if ( tokens.size() < 2 ) - return; OTPData data; memset(&data, 0, sizeof data); @@ -221,7 +219,6 @@ void CommandProcessor::writeOTPData(const std::string &s) data.magic = OTP_MAGIC; data.rev = OTP_REV; strlcpy(data.hwrev, tokens[0].c_str(), sizeof data.hwrev); - data.mcuType = atoi(tokens[1].c_str()); if ( tokens.size() > 2 ) strlcpy(data.serialnum, tokens[1].c_str(), sizeof data.serialnum); diff --git a/latest/Firmware/Transponder/Src/Configuration.cpp b/latest/Firmware/Transponder/Src/Configuration.cpp index 9081a0b..14bdc08 100644 --- a/latest/Firmware/Transponder/Src/Configuration.cpp +++ b/latest/Firmware/Transponder/Src/Configuration.cpp @@ -179,11 +179,11 @@ void Configuration::reportOTPData() if ( data ) { - sprintf(e->nmeaBuffer.sentence, "$PAIOTP,%s,%s,%s*", data->serialnum, data->hwrev, __mcuNames[data->mcuType]); + sprintf(e->nmeaBuffer.sentence, "$PAIOTP,%s,%s*", data->serialnum, data->hwrev); } else { - strcpy(e->nmeaBuffer.sentence, "$PAIOTP,,,*"); + strcpy(e->nmeaBuffer.sentence, "$PAIOTP,,*"); } Utils::completeNMEA(e->nmeaBuffer.sentence); EventQueue::instance().push(e);