Beispiel #1
0
/**************************************************************************************************
* @fn          sblExec
*
* @brief       Infinite SBL execute loop that jumps upon receiving a code enable.
*
* input parameters
*
* None.
*
* output parameters
*
* None.
*
* @return      None.
**************************************************************************************************
*/
static void sblExec(void)
{
  halUARTCfg_t uartConfig;
  uartConfig.callBackFunc = sblRxCB;
  HalUARTInitSPI();
  
  if (bootloaderCommunicationRequested() || (!sbImgValid()))
  {
    while (1)
    {
      /* Read , parse, and respond to incoming bytes*/
      sblRxCB(0, 0);
      
      /* exit loop if image is successfully verified and enabled */
      if (sblReset)
      {
        break;
      }  
    }
  }
  
  /* Some delay to send final response to master */
  for(uint32 i = 0; i < ENABLE_RSP_DELAY; i++)
  {
    ASM_NOP;
  }
  
  /* Some delay to send final response to master */
  HalUARTUnInitSPI();
  
  /* Jump to application image */
  EnterNvmApplication((uint32)sbl_header_ptr->vectorTableAddress);
}
Beispiel #2
0
/**************************************************************************************************
 * @fn          main
 *
 * @brief       This function is the C-main function invoked from the IAR reset ISR handler.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 */
void main(void)
{
  uint32 ledgerPageAddr = FLASH_BASE + (HAL_IBM_LEDGER_PAGE * HAL_FLASH_PAGE_SIZE);

  for (int pgCnt = 0; pgCnt < HAL_IBM_LEDGER_PAGE; pgCnt++, ledgerPageAddr -= HAL_FLASH_PAGE_SIZE)
  {
    ibm_ledger_t *pLedger = (ibm_ledger_t *)ledgerPageAddr;
    int ledgerCnt = 0;

    if (memcmp(pLedger, &LedgerPageSignature, sizeof(ibm_ledger_t)))
    {
      continue;
    }

    for (pLedger++; ledgerCnt < (HAL_FLASH_PAGE_SIZE/sizeof(ibm_ledger_t)); ledgerCnt++, pLedger++)
    {
      if ( (pLedger->imageCRC[0] == 0xFFFFFFFF) || // Not expected except first 2-step programming.
           ((pLedger->imageCRC[0] != 0) && (pLedger->imageCRC[0] == pLedger->imageCRC[1])) )
      {
        // Sanity check NVIC entries.
        if ((pLedger->nvicJump[0] > 0x20004000) &&
            (pLedger->nvicJump[0] < 0x27007FFF) &&
            (pLedger->nvicJump[1] > FLASH_BASE) &&
            (pLedger->nvicJump[1] < 0x0027EFFF))
        {
          EnterNvmApplication(pLedger->nvicJump[0], pLedger->nvicJump[1]);
        }
      }
    }
  }


  SysCtrlDeepSleepSetting();
  HAL_DISABLE_INTERRUPTS();
  SysCtrlDeepSleep();
  HAL_SYSTEM_RESET();
}