Entry.c 6.8 KB

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