/************************************************************************************************** * @fn sblPoll * * @brief Serial Boot poll & parse according to the RPC protocol. * * input parameters * * None. * * output parameters * * None. * * @return TRUE if the downloaded code has been enabled; FALSE otherwise. */ uint8 sblPoll(void) { uint8 ch; while (HalUARTRead(0, &ch, 1)) { switch (rpcSte) { case rpcSteSOF: if (RPC_UART_SOF == ch) { rpcSte = rpcSteLen; } break; case rpcSteLen: if (ch > SBL_MAX_SIZE) { rpcSte = rpcSteSOF; break; } else { rpcSte = rpcSteData; sbFcs = sbIdx = 0; sbLen = ch + 3; // Combine the parsing of Len, Cmd0 & Cmd1 with the data. // no break; } case rpcSteData: sbFcs ^= ch; sbBuf[sbIdx] = ch; if (++sbIdx == sbLen) { rpcSte = rpcSteFcs; } break; case rpcSteFcs: rpcSte = rpcSteSOF; if ((sbFcs == ch) && ((sbBuf[RPC_POS_CMD0] & RPC_SUBSYSTEM_MASK) == RPC_SYS_BOOT)) { sblProc(); return sblResp(); // Send the SB response setup in the sbBuf passed to sblProc(). } break; default: HAL_SYSTEM_RESET(); break; } } return FALSE; }
/************************************************************************************************** * @fn sblParse * * @brief Serial Boot parser according to the RPC UART transport. * * input parameters * * @param ch - The Rx character to parse. * * output parameters * * None. * * @return TRUE if the downloaded code has been enabled; FALSE otherwise. */ static uint8 sblParse(uint8 ch) { sbBuf[sbSte + sbIdx] = ch; switch (sbSte) { case SBL_SOF_STATE: if (RPC_UART_SOF == ch) { sbSte = SBL_LEN_STATE; } break; case SBL_LEN_STATE: sbFcs = sbIdx = 0; sbSte = SBL_CMD1_STATE; sbSte = ((sbLen = ch) >= SBL_MAX_SIZE) ? SBL_SOF_STATE : SBL_CMD1_STATE; break; case SBL_CMD1_STATE: sbSte = SBL_CMD2_STATE; break; case SBL_CMD2_STATE: sbSte = (sbLen == 0) ? SBL_FCS_STATE : SBL_DATA_STATE; break; case SBL_DATA_STATE: if (++sbIdx == sbLen) { sbSte = SBL_FCS_STATE; } break; case SBL_FCS_STATE: sbSte = SBL_SOF_STATE; if ((sbFcs == ch) && ((sbBuf[SBL_CMD1_STATE] & RPC_SUBSYSTEM_MASK) == RPC_SYS_BOOT)) { sblExec(sbBuf + SBL_LEN_STATE); return sblResp(); // Send the SB response setup in the sbBuf passed to sblExec(). } break; default: break; } sbFcs ^= ch; return FALSE; }