sysinfo.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "FreeRTOS.h"
  4. #include "board.h"
  5. #include "sfud.h"
  6. #include "sysinfo.h"
  7. #include "crc.h"
  8. #if DEVICE_TYPE_SELECT == EMMC_FLASH
  9. #include "mmcsd_core.h"
  10. #endif
  11. #pragma data_alignment=4
  12. static SysInfo sysinfo;
  13. int ReadSysInfo(void)
  14. {
  15. unsigned int checksum;
  16. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  17. sfud_flash *sflash = sfud_get_device(0);
  18. sfud_read(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  19. #else
  20. emmc_read(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  21. #endif
  22. checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC);
  23. if (checksum == sysinfo.checksum)
  24. return 0;
  25. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  26. sfud_read(sflash, SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  27. #else
  28. emmc_read(SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  29. #endif
  30. checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC);
  31. if (checksum == sysinfo.checksum) {
  32. /* copy sysinfo to flash offset SYSINFO_OFFSET */
  33. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  34. sfud_erase_write(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  35. #else
  36. emmc_write(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  37. #endif
  38. return 0;
  39. }
  40. printf("amt630hv160 %s fail, please update before retry again.\n", __func__);
  41. while(1);
  42. }
  43. SysInfo *GetSysInfo(void)
  44. {
  45. return &sysinfo;
  46. }
  47. void SaveSysInfo(void)
  48. {
  49. sysinfo.checksum = xcrc32((unsigned char*)&sysinfo, sizeof(SysInfo) - 4, 0xffffffff, HARD_CALC_CRC);
  50. #if DEVICE_TYPE_SELECT != EMMC_FLASH
  51. sfud_flash *sflash = sfud_get_device(0);
  52. if(sflash) {
  53. sfud_erase_write(sflash, SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  54. sfud_erase_write(sflash, SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  55. }
  56. #else
  57. emmc_write(SYSINFO_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  58. emmc_write(SYSINFO_B_OFFSET, sizeof(SysInfo), (void*)&sysinfo);
  59. #endif
  60. }