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);