Beispiel #1
0
/**************************************************************************************************
 * @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;
}
Beispiel #2
0
/**************************************************************************************************
 * @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;
}