#include #include #include "FreeRTOS.h" #include "board.h" #include "sfud.h" #include "sysinfo.h" #include "crc.h" #if DEVICE_TYPE_SELECT == EMMC_FLASH #include "mmcsd_core.h" #endif #pragma data_alignment=4 static SysInfo sysinfo; int ReadSysInfo(void) { unsigned int checksum; #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_flash *sflash = sfud_get_device(0); sfud_read(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #else emmc_read(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #endif checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC); if (checksum == sysinfo.checksum) return 0; #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_read(sflash, SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #else emmc_read(SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #endif checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC); if (checksum == sysinfo.checksum) { /* copy sysinfo to flash offset SYSINFO_OFFSET */ #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_erase_write(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #else emmc_write(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #endif return 0; } printf("amt630hv160 %s fail, please update before retry again.\n", __func__); while(1); } SysInfo *GetSysInfo(void) { return &sysinfo; } void SaveSysInfo(void) { sysinfo.checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC); #if DEVICE_TYPE_SELECT != EMMC_FLASH sfud_flash *sflash = sfud_get_device(0); if(sflash) { sfud_erase_write(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); sfud_erase_write(sflash, SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo); } #else emmc_write(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo); emmc_write(SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo); #endif }