/****************************************************************************** * @fn bootMain * * @brief ISR for the reset vector. * * @param None. * * @return None. */ void bootMain(void) { extern void _ivecRst2(void); // hal_ivec.s43 defines this reset re-direct operation. HAL_BOOT_INIT(); vddWait(VDD_MIN_RUN); while (1) { uint16 crc[2]; crc[0] = *((uint16*)LO_ROM_BEG); crc[1] = *((uint16*)LO_ROM_BEG+1); if (crc[0] == crc[1]) { break; } else if ((crc[0] != 0) && (crc[0] == crcCalc())) { FCTL3 = FWKEY; // Clear Lock bit. FCTL1 = FWKEY + WRT; // Set WRT bit for write operation *((uint16*)LO_ROM_BEG+1) = crc[0]; // Write CRC shadow FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit } else { dl2rc(); } } _ivecRst2(); }
void main(void) { HAL_BOARD_INIT(); #if HAL_OTA_XNV_IS_SPI XNV_SPI_INIT(); #endif /* This is in place of calling HalDmaInit() which would require init of the * other 4 DMA descriptors in addition to just Channel 0. */ HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); while (1) { HalFlashRead(HAL_OTA_CRC_ADDR / HAL_FLASH_PAGE_SIZE, HAL_OTA_CRC_ADDR % HAL_FLASH_PAGE_SIZE, (uint8 *)&OTA_crcControl, sizeof(OTA_crcControl)); if (OTA_crcControl.crc[0] == OTA_crcControl.crc[1]) { break; } else if ((OTA_crcControl.crc[0] != 0) && (OTA_crcControl.crc[0] == crcCalc())) { OTA_crcControl.crc[1] = OTA_crcControl.crc[0]; HalFlashWrite((HAL_OTA_CRC_ADDR / HAL_FLASH_WORD_SIZE), (uint8 *)OTA_crcControl.crc, 1); } else { dl2rc(); } } // Simulate a reset for the Application code by an absolute jump to location 0x0800. asm("LJMP 0x800\n"); }
void main(void) { uint16 crc[2]; HAL_BOARD_INIT(); #if HAL_OAD_XNV_IS_SPI XNV_SPI_INIT(); #endif /* This is in place of calling HalDmaInit() which would require init of the other 4 DMA * descriptors in addition to just Channel 0. */ HAL_DMA_SET_ADDR_DESC0( &dmaCh0 ); HalFlashInit(); HalFlashRead(HAL_OAD_CRC_ADDR / HAL_FLASH_PAGE_SIZE, HAL_OAD_CRC_ADDR % HAL_FLASH_PAGE_SIZE, (uint8 *)crc, sizeof(crc)); if (crc[0] != crc[1]) { // If the CRC is erased or the RC code fails a sanity check, instantiate the DL code (again). if ((crc[0] == 0) || (crc[0] != crcCalc())) { dl2rc(); /* If dl2rc() fails, a flawed image is allowed to run - * maybe the damage is not fatal to OTA ops? */ } else { crc[1] = crc[0]; HalFlashWrite((HAL_OAD_CRC_ADDR / HAL_FLASH_WORD_SIZE), (uint8 *)crc, 1); } } // Simulate a reset for the Application code by an absolute jump to location 0x0800. asm("LJMP 0x800\n"); }