Entry.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /*
  2. **********************************************************************
  3. Copyright (c)2021 Arkmicro Technologies Inc. All Rights Reserved
  4. Filename: Entry.c
  5. Version : 1.00
  6. Date : 2021.08.20
  7. Author : Sim
  8. ***********************************************************************
  9. */
  10. #include "typedef.h"
  11. #include "amt630h.h"
  12. #include "uart.h"
  13. #include "timer.h"
  14. #include "aic.h"
  15. #include "mmu.h"
  16. #include "clock.h"
  17. #include "lcd.h"
  18. #include "spi.h"
  19. #include "sysinfo.h"
  20. #include "sysctl.h"
  21. #include "board.h"
  22. #include "fs/ff.h"
  23. #include "fs/diskio.h"
  24. #include "crc32.h"
  25. #include <intrinsics.h>
  26. extern void bootFromSPI(void);
  27. extern void updateFromSD(int chipid);
  28. extern void updateFromUSB(void);
  29. int wdt_init(void);
  30. void wdt_stop(void);
  31. void wdt_start(void);
  32. static SysInfo *pSysInfo = NULL;
  33. void UpdateFromMedia(int drv)
  34. {
  35. FRESULT fret;
  36. FIL fp = {0};
  37. UINT32 size;
  38. unsigned int checksum, calc_checksum;
  39. int timeout = 0;
  40. int update_ok = 0;
  41. SysInfo *sysinfo = GetSysInfo();
  42. char loaderfile[32];
  43. char stepldrfile[32];
  44. char appfile[32];
  45. if (drv == SDMMC) {
  46. strcpy(loaderfile, LOADER_FILE_NAME);
  47. strcpy(stepldrfile, STEPLDR_FILE_NAME);
  48. strcpy(appfile, APP_FILE_NAME);
  49. } else if (drv == USB) {
  50. strcpy(loaderfile, "1:/");
  51. strcat(loaderfile, LOADER_FILE_NAME);
  52. strcpy(stepldrfile, "1:/");
  53. strcat(stepldrfile, STEPLDR_FILE_NAME);
  54. strcpy(appfile, "1:/");
  55. strcat(appfile, APP_FILE_NAME);
  56. } else {
  57. SendUartString("Unknown disk drv\r\n");
  58. return;
  59. }
  60. fret = f_mount(drv, &g_fs);
  61. if(fret == FR_OK)
  62. SendUartString("Mount file ok\r\n");
  63. else
  64. {
  65. SendUartString("Mount file fail\r\n");
  66. return;
  67. }
  68. SendUartString("burn loader start... \r\n");
  69. readloader:
  70. fret = f_open(&fp, loaderfile, FA_OPEN_EXISTING | FA_READ);
  71. if(fret != FR_OK) {
  72. SendUartString("Open file fail, don't update.\r\n");
  73. } else {
  74. fret = f_read(&fp, (void *)IMAGE_ENTRY, LOADER_MAX_SIZE, &size);
  75. f_close(&fp);
  76. if(fret != FR_OK) {
  77. if (timeout++ < 3) {
  78. SendUartString("Read file fail, read again.\r\n");
  79. goto readloader;
  80. }
  81. } else {
  82. checksum = *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET);
  83. *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET) = 0;
  84. calc_checksum = xcrc32((unsigned char*)IMAGE_ENTRY, size, 0xffffffff);
  85. *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET) = checksum;
  86. if (calc_checksum != checksum) {
  87. if (timeout++ < 3) {
  88. SendUartString("read loader checksum fail, read again.\n");
  89. goto readloader;
  90. }
  91. else {
  92. SendUartString("read loader fail, don't update.\n");
  93. }
  94. } else {
  95. if (SpiNorBurn((void*)IMAGE_ENTRY, LOADER_OFFSET, size, 0)) {
  96. SendUartString("burn loader fail.\n");
  97. goto end;
  98. }
  99. }
  100. }
  101. }
  102. SendUartString("burn loader end. \r\n");
  103. timeout = 0;
  104. SendUartString("burn stepldr start... \r\n");
  105. readstepldr:
  106. fret = f_open(&fp, stepldrfile, FA_OPEN_EXISTING | FA_READ);
  107. if(fret != FR_OK) {
  108. SendUartString("Open file fail, don't update.\r\n");
  109. } else {
  110. fret = f_read(&fp, (void *)IMAGE_ENTRY, STEPLDR_MAX_SIZE, &size);
  111. f_close(&fp);
  112. if(fret != FR_OK) {
  113. if (timeout++ < 3) {
  114. SendUartString("Read file fail, read again.\r\n");
  115. goto readstepldr;
  116. } else {
  117. SendUartString("read stepldr fail, don't update.\n");
  118. }
  119. } else {
  120. checksum = *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET);
  121. *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET) = 0;
  122. calc_checksum = xcrc32((unsigned char*)IMAGE_ENTRY, size, 0xffffffff);
  123. *(unsigned int*)(IMAGE_ENTRY + APPLDR_CHECKSUM_OFFSET) = checksum;
  124. if (calc_checksum != checksum) {
  125. if (timeout++ < 3) {
  126. SendUartString("read stepldr checksum fail, read again.\n");
  127. goto readstepldr;
  128. }
  129. else {
  130. SendUartString("read stepldr fail, don't update.\n");
  131. }
  132. } else {
  133. if (sysinfo->stepldr_offset == STEPLDRA_OFFSET)
  134. sysinfo->stepldr_offset = STEPLDRB_OFFSET;
  135. else
  136. sysinfo->stepldr_offset = STEPLDRA_OFFSET;
  137. sysinfo->stepldr_size = size;
  138. if (SpiNorBurn((void*)IMAGE_ENTRY, sysinfo->stepldr_offset, size, 0)) {
  139. SendUartString("burn stepldr fail.\n");
  140. goto end;
  141. }
  142. }
  143. }
  144. }
  145. SendUartString("burn stepldr end. \r\n");
  146. timeout = 0;
  147. SendUartString("burn app start... \r\n");
  148. update_logo_init();
  149. readapp:
  150. fret = f_open(&fp, appfile, FA_OPEN_EXISTING | FA_READ);
  151. if(fret != FR_OK) {
  152. SendUartString("Open file fail, don't update.\r\n");
  153. } else {
  154. fret = f_read(&fp, (void *)IMAGE_ENTRY, IMAGE_MAX_SIZE, &size);
  155. f_close(&fp);
  156. if(fret != FR_OK) {
  157. SendUartString("Read file fail\r\n");
  158. if (timeout++ < 3) {
  159. SendUartString("Read file fail, read again.\r\n");
  160. goto readapp;
  161. } else {
  162. SendUartString("read update file fail, don't update.\n");
  163. }
  164. } else {
  165. UpFileHeader *header = (UpFileHeader *)IMAGE_ENTRY;
  166. checksum = header->checksum;
  167. header->checksum = 0;
  168. calc_checksum = xcrc32((unsigned char*)IMAGE_ENTRY, size, 0xffffffff);
  169. if (calc_checksum != checksum) {
  170. if (timeout++ < 3) {
  171. SendUartString("read update file checksum fail, read again.\n");
  172. goto readapp;
  173. }
  174. else {
  175. SendUartString("read update file fail, don't update.\n");
  176. }
  177. } else {
  178. sysinfo->app_checksum = header->checksum = checksum;
  179. if (!SpiNorBurn((void*)IMAGE_ENTRY, IMAGE_OFFSET, size, 1))
  180. update_ok = 1;
  181. }
  182. }
  183. }
  184. SendUartString("burn app end.\r\n");
  185. if (update_ok) {
  186. SendUartString("update ok, save sysinfo.\r\n");
  187. sysinfo->update_status = UPDATE_STATUS_END;
  188. SaveSysInfo(sysinfo);
  189. }
  190. end:
  191. SendUartString("Update is finished.\r\n");
  192. }
  193. void main(void)
  194. {
  195. wdt_init();
  196. timer_init();
  197. AIC_Initialize();
  198. InitUart(115200);
  199. SendUartString("ARK AMT630H STEPLDR V 1.0\r\n");
  200. vClkInit();
  201. lcd_init();
  202. SpiSelectPad();
  203. SpiInit();
  204. #ifdef MMU_ENABLE
  205. MMU_Init();
  206. #endif
  207. if (ReadSysInfo()) {
  208. SendUartString("read sysinfo fail, use default.\r\n");
  209. SetDefaultSysInfo();
  210. }
  211. pSysInfo = GetSysInfo();
  212. //pSysInfo->update_status = UPDATE_STATUS_START;
  213. //pSysInfo->update_media_type = UPDATE_MEDIA_UART;
  214. if (pSysInfo->update_status == UPDATE_STATUS_START) {
  215. wdt_stop();
  216. switch (pSysInfo->update_media_type) {
  217. case UPDATE_MEDIA_SD:
  218. updateFromSD(0);
  219. break;
  220. case UPDATE_MEDIA_USB:
  221. updateFromUSB();
  222. break;
  223. case UPDATE_MEDIA_UART:
  224. __enable_irq();
  225. /* uart1 pad select */
  226. vSysctlConfigure(SYS_PAD_CTRL02, 16, 0xf, 0x5);
  227. updateFromUart(UART_MCU_PORT);
  228. break;
  229. }
  230. wdt_start();
  231. }
  232. bootFromSPI();
  233. }