/************************************************************************************************** * @fn sblWait * * @brief A timed-out wait loop that exits early upon receiving a force code/sbl byte. * * input parameters * * None. * * output parameters * * None. * * @return TRUE to run the code image, FALSE to run the SBL. ************************************************************************************************** */ static uint8 sblWait(void) { uint32 dlyCnt = 0x260000; uint8 rtrn = FALSE; HAL_ENABLE_INTERRUPTS(); while (1) { uint8 ch; HalUARTPollUSB(); if (HalUARTRx(&ch, 1)) { if (ch == SB_FORCE_BOOT) { break; } else if (ch == SB_FORCE_RUN) { dlyCnt = 0; } } if (SB1_PRESS) { break; } if (SB2_PRESS || (dlyCnt-- == 0)) { rtrn = TRUE; break; } // RR-xing LED display while waiting. if (dlyCnt & 0x2000) { SB_TURN_OFF_LED2(); SB_TURN_ON_LED1(); } else { SB_TURN_OFF_LED1(); SB_TURN_ON_LED2(); } } HAL_DISABLE_INTERRUPTS(); SB_TURN_OFF_LED1(); SB_TURN_OFF_LED2(); return rtrn; }
/************************************************************************************************** * @fn sblWait * * @brief A timed-out wait loop that exits early upon receiving a force code/sbl byte. * * input parameters * * None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ static void sblWait(void) { uint32 dlyCnt = SB_UART_DELAY; while (1) { uint8 ch; HalUARTPollUSB(); if (HalUARTRx(&ch, 1)) { if (ch == SB_FORCE_BOOT) { break; } else if (ch == SB_FORCE_RUN) { dlyCnt = 0; } } if (SB1_PRESS) { break; } if (SB2_PRESS || (dlyCnt-- == 0)) { sblJump(); } // RR-xing LED display while waiting. if (dlyCnt & 0x2000) { SB_TURN_OFF_LED2(); SB_TURN_ON_LED1(); } else { SB_TURN_OFF_LED1(); SB_TURN_ON_LED2(); } } SB_TURN_OFF_LED1(); SB_TURN_OFF_LED2(); }
/************************************************************************************************** * @fn sblJump * * @brief Execute a simple long jump from non-banked SBL code to non-banked RC code space. * * input parameters * * None. * * output parameters * * None. * * @return None. */ static void sblJump(void) { SB_TURN_ON_LED1(); SB_TURN_ON_LED2(); while (SB1_PRESS || SB2_PRESS); SB_TURN_OFF_LED1(); SB_TURN_OFF_LED2(); asm("LJMP 0x2000\n"); // Immediate jump to run-code. HAL_SYSTEM_RESET(); }
static void sblUnInit(void) { SB_TURN_OFF_LED1(); SB_TURN_OFF_LED2(); }