FWUpdate.c 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390
  1. /*===========================================================================
  2. Combined Charging System (CCS): SECC
  3. FWUpdate.c
  4. initiated by Vern, Joseph
  5. (since 2019/07/19)
  6. =============================================================================*/
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <linux/termios.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <time.h>
  14. #include <stdlib.h>
  15. #include <sys/ipc.h>
  16. #include <sys/shm.h>
  17. #include <sys/mman.h>
  18. #include <linux/sockios.h>
  19. #include <linux/socket.h>
  20. #include <sys/socket.h>
  21. #include <netinet/in.h>
  22. #include <sys/time.h>
  23. #include <sys/timeb.h>
  24. #include <math.h>//for pow
  25. #include "define.h"
  26. #include "FWUpdate.h"
  27. #include <unistd.h>
  28. struct SysConfigAndInfo *ShmSysConfigAndInfo;
  29. struct StatusCodeData *ShmStatusCodeData;
  30. struct CcsData *ShmCcsData;
  31. struct InternalComm *ShmInternalComm;
  32. //struct InternalCommAC *ShmInternalCommAC;
  33. unsigned char buf_log_fwupdate[SIZE_OF_LOG_BUFFER];
  34. /*===========================================================================
  35. FUNCTION: Check_V2G_Flow_Status
  36. DESCRIPTION:
  37. PRE-CONDITION:
  38. INPUT:
  39. OUTPUT:
  40. GLOBAL VARIABLES:
  41. =============================================================================*/
  42. unsigned char Check_V2G_Flow_Status()
  43. {
  44. unsigned char result = 0;
  45. switch (ShmCcsData->CommProtocol)
  46. {
  47. case V2GT_MSG_PROTOCOL_DIN70121: //0
  48. {
  49. result = ShmCcsData->V2GMessage_DIN70121.PresentMsgFlowStatus;
  50. break;
  51. }
  52. case V2GT_MSG_PROTOCOL_ISO15118_2014: //1
  53. {
  54. result = ShmCcsData->V2GMessage_ISO15118_2014.PresentMsgFlowStatus;
  55. break;
  56. }
  57. case V2GT_MSG_PROTOCOL_ISO15118_2018: //2
  58. {
  59. result = ShmCcsData->V2GMessage_ISO15118_2018.PresentMsgFlowStatus;
  60. break;
  61. }
  62. default:
  63. break;
  64. }
  65. return result;
  66. }
  67. /*===========================================================================
  68. FUNCTION: StoreLogMsg
  69. DESCRIPTION:
  70. PRE-CONDITION:
  71. INPUT:
  72. OUTPUT:
  73. GLOBAL VARIABLES:
  74. =============================================================================*/
  75. #if SAVE_SYS_LOG_MSG_FWUPDATE_SWITCH == ENABLE
  76. int StoreLogMsg(unsigned char *DataString)
  77. {
  78. static unsigned char Buf[1024];
  79. static time_t CurrentTime;
  80. static struct tm *tm;
  81. static struct timeval tv;
  82. memset(Buf, 0, sizeof(Buf));
  83. CurrentTime = time(NULL);
  84. tm = localtime(&CurrentTime);
  85. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  86. sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][FWUpdate][%d][%02d]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  87. tm->tm_year + 1900,
  88. tm->tm_mon + 1,
  89. tm->tm_mday,
  90. tm->tm_hour,
  91. tm->tm_min,
  92. tm->tm_sec,
  93. tv.tv_usec,
  94. EVCOMM_SYS_INFO.CpState,
  95. Check_V2G_Flow_Status(),
  96. DataString,
  97. tm->tm_year + 1900,
  98. tm->tm_mon + 1);
  99. system(Buf);
  100. DEBUG_PRINTF_FWUPDATE_SYSTEM_LOG("[%02d:%02d:%02d.%06d][FWUpdate][%d][%02d]%s \n",
  101. tm->tm_hour,
  102. tm->tm_min,
  103. tm->tm_sec,
  104. tv.tv_usec,
  105. EVCOMM_SYS_INFO.CpState,
  106. Check_V2G_Flow_Status(),
  107. DataString);
  108. //Reset the buf_log_fwupdate Buffer, i.e. DataString
  109. memset(buf_log_fwupdate, 0, SIZE_OF_LOG_BUFFER);
  110. }
  111. #endif
  112. /*===========================================================================
  113. FUNCTION: fsize
  114. DESCRIPTION:
  115. PRE-CONDITION:
  116. INPUT:
  117. OUTPUT:
  118. GLOBAL VARIABLES:
  119. =============================================================================*/
  120. unsigned long fsize(char* filename)
  121. {
  122. SAVE_SYS_LOG_MSG_FWUPDATE("[fsize]image size: caculating...");
  123. unsigned long length = 0;
  124. FILE *file;
  125. file = fopen(filename, "rb");
  126. if (file == NULL)
  127. {
  128. SAVE_SYS_LOG_MSG_FWUPDATE("[fsize]fopen: fail");
  129. return 0;
  130. }
  131. else
  132. {
  133. SAVE_SYS_LOG_MSG_FWUPDATE("[fsize]fopen: OK");
  134. fseek(file, 0, SEEK_END);
  135. length = (unsigned long) ftell(file);
  136. }
  137. fclose(file);
  138. sprintf(buf_log_fwupdate, "[fsize]image size: %ld bytes", length);
  139. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  140. return length;
  141. }
  142. /*===========================================================================
  143. FUNCTION: crc32
  144. DESCRIPTION:
  145. PRE-CONDITION:
  146. INPUT:
  147. OUTPUT:
  148. GLOBAL VARIABLES:
  149. =============================================================================*/
  150. uint32_t crc32(uint8_t *data, unsigned int length)
  151. {
  152. SAVE_SYS_LOG_MSG_FWUPDATE("[crc32]ongoing...");
  153. uint8_t i;
  154. uint32_t cnt = 0;
  155. uint32_t crc = 0xffffffff; // Initial value
  156. while(length--)
  157. {
  158. if(cnt > 33 && cnt < 48)
  159. {
  160. data++;
  161. }
  162. else
  163. {
  164. crc ^= *data++; // crc ^= *data; data++;
  165. for (i = 0; i < 8; ++i)
  166. {
  167. if (crc & 1)
  168. crc = (crc >> 1) ^ 0xEDB88320;// 0xEDB88320= reverse 0x04C11DB7
  169. else
  170. crc = (crc >> 1);
  171. }
  172. }
  173. cnt++;
  174. }
  175. return ~crc;
  176. }
  177. /*===========================================================================
  178. FUNCTION: ShareMemory_Init
  179. DESCRIPTION
  180. Initialize all share memories.
  181. PRE-CONDITION:
  182. INPUT:
  183. OUTPUT:
  184. GLOBAL VARIABLES:
  185. =============================================================================*/
  186. int ShareMemory_Init()
  187. {
  188. int MeterSMId;
  189. //[1/5] create ShmSysConfigAndInfo
  190. if((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
  191. {
  192. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmget ShmSysConfigAndInfo NG");
  193. return 0;
  194. }
  195. else if((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  196. {
  197. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmat ShmSysConfigAndInfo NG");
  198. return 0;
  199. }
  200. //[2/5] create ShmStatusCodeData
  201. if((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
  202. {
  203. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmget ShmStatusCodeData NG");
  204. return 0;
  205. }
  206. else if((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  207. {
  208. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmat ShmStatusCodeData NG");
  209. return 0;
  210. }
  211. //[3/5] create ShmCcsData
  212. if((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), 0777)) < 0)
  213. {
  214. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmget ShmCcsData NG");
  215. return 0;
  216. }
  217. else if((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  218. {
  219. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmat ShmCcsData NG");
  220. return 0;
  221. }
  222. //[4/5] create ShmInternalComm
  223. if((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
  224. {
  225. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmget ShmInternalComm NG");
  226. return 0;
  227. }
  228. else if((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  229. {
  230. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmat ShmInternalComm NG");
  231. return 0;
  232. }
  233. #if 0
  234. //[5/5] create ShmInternalCommAC
  235. if((MeterSMId = shmget(ShmInternalCommACKey, sizeof(struct InternalCommAC), IPC_CREAT | 0777)) < 0)
  236. {
  237. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmget ShmInternalCommAC NG");
  238. return 0;
  239. }
  240. else if((ShmInternalCommAC = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  241. {
  242. SAVE_SYS_LOG_MSG_FWUPDATE("ShareMemory_Init:shmat ShmInternalCommAC NG");
  243. return 0;
  244. }
  245. #endif
  246. return 1;
  247. }
  248. /*===========================================================================
  249. FUNCTION: Update_MLO
  250. DESCRIPTION:
  251. PRE-CONDITION:
  252. INPUT:
  253. OUTPUT:
  254. GLOBAL VARIABLES:
  255. =============================================================================*/
  256. unsigned char Update_MLO()
  257. {
  258. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [MLO]start --------");
  259. unsigned char result = PASS;
  260. long int MaxLen = 48*1024*1024;
  261. unsigned long file_length = 0;
  262. unsigned char *ptr = malloc(MaxLen);
  263. if(ptr == NULL)
  264. {
  265. return FAIL;
  266. }
  267. memset(ptr, 0, MaxLen);
  268. file_length = fsize("/root/MLO");
  269. int fd = 0;
  270. int wrd = 0;
  271. FILE *file;
  272. fd = open("/dev/mtdblock0", O_RDWR);
  273. file = fopen("/root/MLO", "rb");
  274. if (fd < 0)
  275. {
  276. SAVE_SYS_LOG_MSG_FWUPDATE("[MLO]Can not open mtdblock0\n");
  277. free(ptr);
  278. return FAIL;
  279. }
  280. else if (file == NULL)
  281. {
  282. SAVE_SYS_LOG_MSG_FWUPDATE("[MLO]Can not open or find the downloaded image file\n");
  283. free(ptr);
  284. return FAIL;
  285. }
  286. else
  287. {
  288. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  289. SAVE_SYS_LOG_MSG_FWUPDATE("[MLO] closing SeccComm...");
  290. system("killall SeccComm");
  291. // Write image to flash
  292. SAVE_SYS_LOG_MSG_FWUPDATE("[MLO]Writing image to mtdblock0...");
  293. fread(ptr, sizeof(unsigned char), file_length, file);
  294. wrd = write(fd, ptr, file_length);
  295. close(fd);
  296. fclose(file);
  297. sprintf(buf_log_fwupdate, "[MLO]mtdblock0 - written length: %d bytes\n", wrd);
  298. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  299. if(wrd != file_length)
  300. {
  301. free(ptr);
  302. return FAIL;
  303. }
  304. }
  305. free(ptr);
  306. return result;
  307. }
  308. /*===========================================================================
  309. FUNCTION: IMAGE_TYPE_BOOTLOADER_UBOOT
  310. DESCRIPTION:
  311. PRE-CONDITION:
  312. INPUT:
  313. OUTPUT:
  314. GLOBAL VARIABLES:
  315. =============================================================================*/
  316. unsigned char Update_uboot()
  317. {
  318. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [uboot]start --------");
  319. unsigned char result = PASS;
  320. long int MaxLen = 48*1024*1024;
  321. unsigned long file_length = 0;
  322. unsigned char *ptr = malloc(MaxLen);
  323. if(ptr == NULL)
  324. {
  325. return FAIL;
  326. }
  327. memset(ptr, 0, MaxLen);
  328. file_length = fsize("/root/u-boot.img");
  329. int fd = 0;
  330. int wrd = 0;
  331. FILE *file;
  332. fd = open("/dev/mtdblock1", O_RDWR);
  333. file = fopen("/root/u-boot.img", "rb");
  334. if (fd < 0)
  335. {
  336. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Can not open mtdblock1\n");
  337. free(ptr);
  338. return FAIL;
  339. }
  340. else if (file == NULL)
  341. {
  342. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Can not open the downloaded image file\n");
  343. free(ptr);
  344. return FAIL;
  345. }
  346. else
  347. {
  348. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  349. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot] closing SeccComm...");
  350. system("killall SeccComm");
  351. // Write image to flash
  352. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Writing image to mtdblock1...");
  353. // fread(ptr, sizeof(unsigned char), file_length, file);
  354. //wrd = write(fd, ptr, file_length);
  355. close(fd);
  356. fclose(file);
  357. system("/bin/flash_erase /dev/mtd1 0 2");
  358. system("/usr/sbin/nandwrite -p /dev/mtd1 /root/u-boot.img");
  359. system("/bin/flash_erase /dev/mtd3 0 2");
  360. system("/usr/sbin/nandwrite -p /dev/mtd3 /root/u-boot.img");
  361. sprintf(buf_log_fwupdate, "[uboot]mtdblock1 - written length: %d bytes\n", wrd);
  362. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  363. #if 0
  364. if(wrd != file_length)
  365. {
  366. free(ptr);
  367. return FAIL;
  368. }
  369. else
  370. {
  371. // Open flash target mtdblock
  372. fd = open("/dev/mtdblock3", O_RDWR);
  373. if (fd < 0)
  374. {
  375. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Can not open mtdblock3\n");
  376. free(ptr);
  377. return FAIL;
  378. }
  379. else if (file == NULL)
  380. {
  381. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Can not open the downloaded image file\n");
  382. free(ptr);
  383. return FAIL;
  384. }
  385. else
  386. {
  387. // Write image to flash
  388. SAVE_SYS_LOG_MSG_FWUPDATE("[uboot]Writing image to mtdblock3...");
  389. wrd = write(fd, ptr, file_length);
  390. close(fd);
  391. sprintf(buf_log_fwupdate, "[uboot]mtdblock3 - written length: %d bytes\n", wrd);
  392. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  393. if(wrd != file_length)
  394. {
  395. free(ptr);
  396. return FAIL;
  397. }
  398. }
  399. }
  400. #endif
  401. }
  402. return result;
  403. }
  404. /*===========================================================================
  405. FUNCTION: Update_DTB
  406. DESCRIPTION:
  407. PRE-CONDITION:
  408. INPUT:
  409. OUTPUT:
  410. GLOBAL VARIABLES:
  411. =============================================================================*/
  412. unsigned char Update_DTB()
  413. {
  414. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [DTB]start --------");
  415. unsigned char result = PASS;
  416. long int MaxLen = 48*1024*1024;
  417. unsigned long file_length = 0;
  418. unsigned char *ptr = malloc(MaxLen);
  419. if(ptr == NULL)
  420. {
  421. return FAIL;
  422. }
  423. memset(ptr, 0, MaxLen);
  424. file_length = fsize("/root/am335x-evm.dtb");
  425. int fd = 0;
  426. int wrd = 0;
  427. FILE *file;
  428. fd = open("/dev/mtdblock4", O_RDWR);
  429. file = fopen("/root/am335x-evm.dtb", "rb");
  430. if (fd < 0)
  431. {
  432. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB]Can not open mtdblock4\n");
  433. free(ptr);
  434. return FAIL;
  435. }
  436. else if (file == NULL)
  437. {
  438. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB]Can not open the downloaded image file\n");
  439. free(ptr);
  440. return FAIL;
  441. }
  442. else
  443. {
  444. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  445. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB] closing SeccComm...");
  446. system("killall SeccComm");
  447. // Write image to flash
  448. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB]Writing image to mtdblock4...");
  449. // fread(ptr, sizeof(unsigned char), file_length, file);
  450. // wrd = write(fd, ptr, file_length);
  451. close(fd);
  452. fclose(file);
  453. system("/bin/flash_erase /dev/mtd4 0 1");
  454. system("/usr/sbin/nandwrite -p /dev/mtd4 /root/am335x-evm.dtb");
  455. system("/bin/flash_erase /dev/mtd5 0 1");
  456. system("/usr/sbin/nandwrite -p /dev/mtd5 /root/am335x-evm.dtb");
  457. sprintf(buf_log_fwupdate, "[DTB]mtdblock4 - written length: %d bytes\n", wrd);
  458. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  459. #if 0
  460. if(wrd != file_length)
  461. {
  462. free(ptr);
  463. return FAIL;
  464. }
  465. else
  466. {
  467. // Open flash target mtdblock
  468. fd = open("/dev/mtdblock5", O_RDWR);
  469. if (fd < 0)
  470. {
  471. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB]Can not open mtdblock5");
  472. free(ptr);
  473. return FAIL;
  474. }
  475. else
  476. {
  477. // Write image to flash
  478. SAVE_SYS_LOG_MSG_FWUPDATE("[DTB]Writing image to mtdblock5...");
  479. wrd=write(fd, ptr, file_length);
  480. close(fd);
  481. sprintf(buf_log_fwupdate, "[DTB]mtdblock5 - written length: %d bytes\n", wrd);
  482. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  483. if(wrd != file_length)
  484. {
  485. free(ptr);
  486. return FAIL;
  487. }
  488. }
  489. }
  490. #endif
  491. }
  492. return result;
  493. }
  494. /*===========================================================================
  495. FUNCTION: Update_zImage
  496. DESCRIPTION:
  497. PRE-CONDITION:
  498. INPUT:
  499. OUTPUT:
  500. GLOBAL VARIABLES:
  501. =============================================================================*/
  502. unsigned char Update_zImage()
  503. {
  504. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [zImage]start --------");
  505. unsigned char result = PASS;
  506. long int MaxLen = 48*1024*1024;
  507. unsigned long file_length = 0;
  508. unsigned char *ptr = malloc(MaxLen);
  509. if(ptr == NULL)
  510. {
  511. return FAIL;
  512. }
  513. memset(ptr, 0, MaxLen);
  514. file_length = fsize("/root/zImage");
  515. int fd = 0;
  516. int wrd = 0;
  517. FILE *file;
  518. fd = open("/dev/mtdblock6", O_RDWR);
  519. file = fopen("/root/zImage", "rb");
  520. if (fd < 0)
  521. {
  522. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage]Can not open mtdblock6\n");
  523. free(ptr);
  524. return FAIL;
  525. }
  526. else if (file == NULL)
  527. {
  528. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage]Can not open the downloaded image file\n");
  529. free(ptr);
  530. return FAIL;
  531. }
  532. else
  533. {
  534. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  535. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage] closing SeccComm...");
  536. system("killall SeccComm");
  537. // Write image to flash
  538. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage]Writing image to mtdblock6...");
  539. // fread(ptr, sizeof(unsigned char), file_length, file);
  540. // wrd = write(fd, ptr, file_length);
  541. close(fd);
  542. fclose(file);
  543. system("/bin/flash_erase /dev/mtd6 0 20");
  544. system("/usr/sbin/nandwrite -p /dev/mtd6 /root/zImage");
  545. system("/bin/flash_erase /dev/mtd7 0 20");
  546. system("/usr/sbin/nandwrite -p /dev/mtd7 /root/zImage");
  547. sprintf(buf_log_fwupdate, "[zImage]mtdblock6 - written length: %d bytes\n", wrd);
  548. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  549. #if 0
  550. if(wrd != file_length)
  551. {
  552. free(ptr);
  553. return FAIL;
  554. }
  555. else
  556. {
  557. // Open flash target mtdblock
  558. fd = open("/dev/mtdblock7", O_RDWR);
  559. if (fd < 0)
  560. {
  561. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage]Can not open mtdblock7");
  562. free(ptr);
  563. return FAIL;
  564. }
  565. else
  566. {
  567. // Write image to flash
  568. SAVE_SYS_LOG_MSG_FWUPDATE("[zImage]Writing image to mtdblock7...");
  569. wrd = write(fd, ptr, file_length);
  570. close(fd);
  571. sprintf(buf_log_fwupdate, "[zImage]mtdblock7 - written length: %d bytes\n", wrd);
  572. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  573. if(wrd != file_length)
  574. {
  575. free(ptr);
  576. return FAIL;
  577. }
  578. }
  579. }
  580. #endif
  581. }
  582. return result;
  583. }
  584. /*===========================================================================
  585. FUNCTION: Update_ramdisk
  586. DESCRIPTION:
  587. PRE-CONDITION:
  588. INPUT:
  589. OUTPUT:
  590. GLOBAL VARIABLES:
  591. =============================================================================*/
  592. unsigned char Update_ramdisk()
  593. {
  594. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [ramdisk]start --------");
  595. unsigned char result = PASS;
  596. long int MaxLen = 48*1024*1024;
  597. unsigned long file_length = 0;
  598. unsigned char *ptr = malloc(MaxLen);
  599. if(ptr == NULL)
  600. {
  601. return FAIL;
  602. }
  603. memset(ptr, 0, MaxLen);
  604. file_length = fsize("/root/ramdisk.gz");
  605. int fd = 0;
  606. int wrd = 0;
  607. FILE *file;
  608. fd = open("/dev/mtdblock8", O_RDWR);
  609. file = fopen("/root/ramdisk.gz", "rb");
  610. if(fd < 0)
  611. {
  612. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]UpdateRootfs NG - can not open rootfs\n");
  613. return FAIL;
  614. }
  615. else if (file == NULL)
  616. {
  617. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]Can not open the downloaded image file\n");
  618. return FAIL;
  619. }
  620. else
  621. {
  622. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  623. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk] closing SeccComm...");
  624. system("killall SeccComm");
  625. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]Writing image to mtdblock8...");
  626. //fread(ptr, sizeof(unsigned char), file_length, file);
  627. //wrd = write(fd, ptr, file_length);
  628. close(fd);
  629. fclose(file);
  630. system("/bin/flash_erase /dev/mtd8 0 96");
  631. system("/usr/sbin/nandwrite -p /dev/mtd8 /root/ramdisk.gz");
  632. system("/bin/flash_erase /dev/mtd9 0 96");
  633. system("/usr/sbin/nandwrite -p /dev/mtd9 /root/ramdisk.gz");
  634. sprintf(buf_log_fwupdate, "[ramdisk]mtdblock8 - written length: %d bytes\n", wrd);
  635. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  636. #if 0
  637. if(wrd != file_length)
  638. {
  639. free(ptr);
  640. return FAIL;
  641. }
  642. else
  643. {
  644. fd = open("/dev/mtdblock9", O_RDWR);
  645. if(fd < 0)
  646. {
  647. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]UpdateRootfs NG - can not open rootfs");
  648. free(ptr);
  649. return FAIL;
  650. }
  651. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]Writing image to mtdblock9...");
  652. wrd = write(fd, ptr, file_length);
  653. close(fd);
  654. sprintf(buf_log_fwupdate, "[ramdisk]mtdblock9 - written length: %d bytes\n", wrd);
  655. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  656. if(wrd != file_length)
  657. {
  658. free(ptr);
  659. return FAIL;
  660. }
  661. else
  662. {
  663. //result = PASS;
  664. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]deleting Storage-root files.\n");
  665. system("cd /Storage;rm -rf root/*");
  666. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  667. {
  668. SAVE_SYS_LOG_MSG_FWUPDATE("[ramdisk]sync...");
  669. system("sync");
  670. }
  671. #endif
  672. }
  673. }
  674. #endif
  675. }
  676. return result;
  677. }
  678. /*===========================================================================
  679. FUNCTION: Update_user_config
  680. DESCRIPTION:
  681. PRE-CONDITION:
  682. INPUT:
  683. OUTPUT:
  684. GLOBAL VARIABLES:
  685. =============================================================================*/
  686. unsigned char Update_user_config()
  687. {
  688. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [user_config]start --------");
  689. unsigned char result = PASS;
  690. long int MaxLen = 48*1024*1024;
  691. unsigned long file_length = 0;
  692. unsigned char *ptr = malloc(MaxLen);
  693. if(ptr == NULL)
  694. {
  695. return FAIL;
  696. }
  697. memset(ptr, 0, MaxLen);
  698. file_length = fsize("/root/FactoryConfig.bin");
  699. // Open flash target mtdblock
  700. int fd = 0;
  701. int wrd = 0;
  702. FILE *file;
  703. fd = open("/dev/mtdblock10", O_RDWR);
  704. file = fopen("/root/FactoryConfig.bin", "rb");
  705. if (fd < 0)
  706. {
  707. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config]Can not open mtdblock10\n");
  708. free(ptr);
  709. return FAIL;
  710. }
  711. else if (file == NULL)
  712. {
  713. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config]Can not open the downloaded image file\n");
  714. free(ptr);
  715. return FAIL;
  716. }
  717. else
  718. {
  719. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  720. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config] closing SeccComm...");
  721. system("killall SeccComm");
  722. // Write image to flash
  723. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config]Writing image to mtdblock10...");
  724. // fread(ptr, sizeof(unsigned char), file_length, file);
  725. //wrd = write(fd, ptr, file_length);
  726. close(fd);
  727. fclose(file);
  728. system("/bin/flash_erase /dev/mtd10 0 12");
  729. system("/usr/sbin/nandwrite -p /dev/mtd10 /root/FactoryConfig.bin");
  730. system("/bin/flash_erase /dev/mtd11 0 12");
  731. system("/usr/sbin/nandwrite -p /dev/mtd11 /root/FactoryConfig.bin");
  732. sprintf(buf_log_fwupdate,
  733. "[user_config]mtdblock10 - written length: %d bytes\n",
  734. wrd);
  735. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  736. #if 0
  737. if(wrd != file_length)
  738. {
  739. free(ptr);
  740. return FAIL;
  741. }
  742. else
  743. {
  744. // Open flash target mtdblock
  745. fd = open("/dev/mtdblock11", O_RDWR);
  746. if (fd < 0)
  747. {
  748. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config]Can not open mtdblock11");
  749. free(ptr);
  750. return FAIL;
  751. }
  752. else
  753. {
  754. // Write image to flash
  755. SAVE_SYS_LOG_MSG_FWUPDATE("[user_config]Writing image to mtdblock11...");
  756. wrd = write(fd, ptr, file_length);
  757. close(fd);
  758. sprintf(buf_log_fwupdate,
  759. "[user_config]mtdblock11 - written length: %d bytes\n",
  760. wrd);
  761. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  762. if(wrd != file_length)
  763. {
  764. free(ptr);
  765. return FAIL;
  766. }
  767. }
  768. }
  769. #endif
  770. }
  771. return result;
  772. }
  773. /*===========================================================================
  774. FUNCTION: Update_root_app
  775. DESCRIPTION:
  776. PRE-CONDITION:
  777. INPUT:
  778. OUTPUT:
  779. GLOBAL VARIABLES:
  780. =============================================================================*/
  781. unsigned char Update_root_app()
  782. {
  783. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [root_app]start --------");
  784. unsigned char result = 0;
  785. //STEP 1: Unzip tmp (.tar.gz) (also checking the file completion)
  786. system("tar -C /Storage/ -zxvf /Storage/tmp"); //.tar.gz
  787. //[zip command] tar -zcvf tmp image/
  788. //STEP 2: Checking File Existance (to-be enhanced)
  789. FILE *file;
  790. file = fopen("/root/ramdisk_app_type_5.tar.gz", "rb");
  791. if (file == NULL)
  792. {
  793. result = 0; //Failed on update
  794. SAVE_SYS_LOG_MSG_FWUPDATE("[root_app]checking downloaded file: FAIL");
  795. system("rm -rf /Storage/image/");
  796. return 0;
  797. }
  798. else
  799. {
  800. fclose(file);
  801. SAVE_SYS_LOG_MSG_FWUPDATE("[root_app]checking downloaded file: OK");
  802. SAVE_SYS_LOG_MSG_FWUPDATE("[root_app]updtating...");
  803. system("cp -rfv /Storage/image/* /Storage/root/");
  804. system("rm -rf /Storage/image/");
  805. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  806. {
  807. SAVE_SYS_LOG_MSG_FWUPDATE("[root_app]sync...");
  808. system("sync");
  809. }
  810. #endif
  811. SAVE_SYS_LOG_MSG_FWUPDATE("[root_app]update: done");
  812. result = 1; //Successful on update
  813. }
  814. return result;
  815. }
  816. /*===========================================================================
  817. FUNCTION: Update_ALL
  818. DESCRIPTION:
  819. PRE-CONDITION:
  820. INPUT:
  821. OUTPUT:
  822. GLOBAL VARIABLES:
  823. =============================================================================*/
  824. int Update_ALL()
  825. {
  826. char result;
  827. result = FAIL;
  828. //[VITAL] Closing unneccesary task to supoort rapid CAN data receving..
  829. SAVE_SYS_LOG_MSG_FWUPDATE("[Update_ALL] closing SeccComm...");
  830. system("killall SeccComm");
  831. if (Update_MLO() == FAIL)
  832. {
  833. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]MLO: fail");
  834. }
  835. else if (Update_uboot() == FAIL)
  836. {
  837. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]MLO: fail");
  838. }
  839. else if (Update_DTB() == FAIL)
  840. {
  841. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]DTB: fail");
  842. }
  843. else if (Update_zImage() == FAIL)
  844. {
  845. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]zImage: fail");
  846. }
  847. else if (Update_ramdisk() == FAIL)
  848. {
  849. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]ramdisk: fail");
  850. }
  851. /*
  852. else if (Update_user_config() == FAIL)
  853. {
  854. SAVE_SYS_LOG_MSG_FWUPDATE("[Update]configuration: fail");
  855. }
  856. */
  857. //else if (Update_root_app() == FAIL)
  858. //{
  859. //}
  860. else
  861. {
  862. result = PASS;
  863. }
  864. SAVE_SYS_LOG_MSG_FWUPDATE("-------------[FW Update Summary]-----------");
  865. if (result == FAIL)
  866. {
  867. SAVE_SYS_LOG_MSG_FWUPDATE("[ALL]Fail");
  868. CSUCOMMDC_TASK_FLAG.FW_Update_result = FAIL;
  869. }
  870. else if (result == PASS)
  871. {
  872. SAVE_SYS_LOG_MSG_FWUPDATE("[ALL]Pass");
  873. CSUCOMMDC_TASK_FLAG.FW_Update_result = PASS;
  874. }
  875. else
  876. {
  877. CSUCOMMDC_TASK_FLAG.FW_Update_result = FAIL;
  878. sprintf(buf_log_fwupdate, "[ALL]unexpected response content (0x%X)", result);
  879. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  880. }
  881. CSUCOMMDC_TASK_FLAG.FW_Update_Done = TRUE; //sending CAN Res msg to CSU and reboot
  882. return result;
  883. }
  884. /*===========================================================================
  885. FUNCTION: FWImage_HeaderParser
  886. DESCRIPTION:
  887. PRE-CONDITION:
  888. INPUT:
  889. OUTPUT:
  890. GLOBAL VARIABLES:
  891. =============================================================================*/
  892. int FWImage_HeaderParser(struct FwImageDataType *image)
  893. {
  894. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]starting...");
  895. //Step 0: Initialize
  896. unsigned char result = 0;
  897. long int MaxLen = 48*1024*1024;
  898. unsigned char *ptr = malloc(MaxLen);
  899. if(ptr == NULL)
  900. {
  901. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]malloc: fail");
  902. free(ptr);
  903. return FAIL;
  904. }
  905. else
  906. {
  907. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]malloc: OK");
  908. }
  909. memset(ptr, 0, MaxLen);
  910. FILE *file;
  911. file = fopen(image->path, "rb");
  912. if (file == NULL)
  913. {
  914. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]fopen: fail");
  915. free(ptr);
  916. return FAIL;
  917. }
  918. else
  919. {
  920. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]fopen: OK");
  921. }
  922. fread(ptr, sizeof(unsigned char), image->size, file);
  923. fclose(file);
  924. //Step 1: Check FW Image Type
  925. image->type = (((unsigned int)ptr[16])<<24 | ((unsigned int)ptr[17])<<16 | ((unsigned int)ptr[18])<<8 | ((unsigned int)ptr[19]));
  926. if (image->type != FW_IMAGE_TYPE_CCS_DTB &&
  927. image->type != FW_IMAGE_TYPE_CCS_UBOOT &&
  928. image->type != FW_IMAGE_TYPE_CCS_ZIMAGE &&
  929. image->type != FW_IMAGE_TYPE_CCS_RAMDISK)
  930. {
  931. sprintf(buf_log_fwupdate,
  932. "[HeaderParser]incorrect type (0x%X)",
  933. image->type);
  934. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  935. free(ptr);
  936. return FAIL;
  937. }
  938. //Step 2: Check FW Image Length
  939. unsigned long size_header = 0;
  940. size_header = (((unsigned int)ptr[20])<<24 | ((unsigned int)ptr[21])<<16 | ((unsigned int)ptr[22])<<8 | ((unsigned int)ptr[23]));
  941. if(image->size != (size_header + 48))
  942. {
  943. sprintf(buf_log_fwupdate,
  944. "[HeaderParser]image length is not matched (header = %d, calculated = %d, bytes)",
  945. size_header,
  946. image->size);
  947. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  948. free(ptr);
  949. return FAIL;
  950. }
  951. //Step 3: Check CRC
  952. unsigned int crc_cal = 0;
  953. image->crc = ((unsigned int)ptr[34])<<24 | ((unsigned int)ptr[35])<<16 | ((unsigned int)ptr[36])<<8 | ((unsigned int)ptr[37]);
  954. crc_cal = crc32(ptr, image->size);
  955. if(image->crc != crc_cal)
  956. {
  957. sprintf(buf_log_fwupdate,
  958. "[HeaderParser]CRC error (header = 0x%X, calculated = 0x%X)",
  959. image->crc,
  960. crc_cal);
  961. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  962. free(ptr);
  963. return FAIL;
  964. }
  965. else
  966. {
  967. SAVE_SYS_LOG_MSG_FWUPDATE("[HeaderParser]CRC: OK");
  968. }
  969. free(ptr);
  970. return PASS;
  971. }
  972. /*===========================================================================
  973. FUNCTION: FWImage_Normalize
  974. DESCRIPTION:
  975. PRE-CONDITION:
  976. INPUT:
  977. OUTPUT:
  978. GLOBAL VARIABLES:
  979. =============================================================================*/
  980. int FWImage_Normalize(struct FwImageDataType *image)
  981. {
  982. //Step 0: Initialize
  983. unsigned char result = 0;
  984. long int MaxLen = 48*1024*1024;
  985. unsigned char *ptr = malloc(MaxLen);
  986. if(ptr == NULL)
  987. {
  988. SAVE_SYS_LOG_MSG_FWUPDATE("[Normalize] malloc fail");
  989. free(ptr);
  990. return FAIL;
  991. }
  992. memset(ptr, 0, MaxLen);
  993. FILE *file;
  994. file = fopen(image->path, "rb");
  995. if (file == NULL)
  996. {
  997. SAVE_SYS_LOG_MSG_FWUPDATE("[Normalize] fopen fail");
  998. free(ptr);
  999. return FAIL;
  1000. }
  1001. fread(ptr, sizeof(unsigned char), image->size, file);
  1002. fclose(file);
  1003. //Step 1: Delete the original image
  1004. char buf[64];
  1005. memset(buf, 0, 64);
  1006. sprintf(buf, "rm -rf %s", image->path);
  1007. system(buf);
  1008. //Step 2: Remove header and create a renamed image accoring to its firmware type
  1009. struct FwImageDataType image_new;
  1010. switch (image->type)
  1011. {
  1012. case FW_IMAGE_TYPE_CCS_UBOOT: //0x10000007
  1013. {
  1014. sprintf(image_new.path, "/root/u-boot.img");
  1015. break;
  1016. }
  1017. case FW_IMAGE_TYPE_CCS_DTB: //0x10000008
  1018. {
  1019. sprintf(image_new.path, "/root/am335x-evm.dtb");
  1020. break;
  1021. }
  1022. case FW_IMAGE_TYPE_CCS_ZIMAGE: //0x10000009
  1023. {
  1024. sprintf(image_new.path, "/root/zImage");
  1025. break;
  1026. }
  1027. case FW_IMAGE_TYPE_CCS_RAMDISK: //0x1000000A
  1028. {
  1029. sprintf(image_new.path, "/root/ramdisk.gz");
  1030. break;
  1031. }
  1032. default:
  1033. {
  1034. break;
  1035. }
  1036. }
  1037. memset(buf, 0, 64);
  1038. sprintf(buf, "rm -rf %s", image_new.path);
  1039. system(buf);
  1040. SAVE_SYS_LOG_MSG_FWUPDATE("[Normalize]creating new image: ongoing...");
  1041. image_new.size = image->size - 48;
  1042. file = fopen(image_new.path, "wb+");
  1043. fwrite(&ptr[48], image_new.size, 1, file); //48: header size
  1044. fclose(file);
  1045. free(ptr);
  1046. SAVE_SYS_LOG_MSG_FWUPDATE("[Normalize]creating new image: done");
  1047. return PASS;
  1048. }
  1049. /*===========================================================================
  1050. FUNCTION: FWImage_Init
  1051. DESCRIPTION:
  1052. PRE-CONDITION:
  1053. INPUT:
  1054. 1. image file name: "ccs.image"
  1055. OUTPUT:
  1056. 1. type: FW image type
  1057. - 0: file is not exist or error occours
  1058. - 0x10000007: FW_IMAGE_TYPE_CCS_UBOOT
  1059. - 0x10000008: FW_IMAGE_TYPE_CCS_DTB
  1060. - 0x10000009: FW_IMAGE_TYPE_CCS_ZIMAGE
  1061. - 0x1000000A: FW_IMAGE_TYPE_CCS_RAMDISK
  1062. GLOBAL VARIABLES:
  1063. =============================================================================*/
  1064. unsigned int FWImage_Init()
  1065. {
  1066. struct FwImageDataType image;
  1067. sprintf(image.path, "/root/ccs.image");
  1068. //STEP 1: Check if image exist?
  1069. image.size = fsize(image.path);
  1070. if (image.size == 0)
  1071. {
  1072. SAVE_SYS_LOG_MSG_FWUPDATE("[Init][Error]image does not exist.");
  1073. return FAIL; //FAIL: 0
  1074. }
  1075. //STEP 2: Check FW image type = ?
  1076. if (FWImage_HeaderParser(&image) != PASS)
  1077. {
  1078. return FAIL; //FAIL: 0
  1079. }
  1080. //STEP 4: Remove header and rename the image file accoring to its firmware type
  1081. if (FWImage_Normalize(&image) != PASS)
  1082. {
  1083. return FAIL; //FAIL: 0
  1084. }
  1085. //Step 5: return result
  1086. return image.type;
  1087. }
  1088. /*===========================================================================
  1089. FUNCTION: Update_viaWebService
  1090. DESCRIPTION:
  1091. PRE-CONDITION:
  1092. INPUT:
  1093. OUTPUT:
  1094. GLOBAL VARIABLES:
  1095. =============================================================================*/
  1096. int Update_viaWebService()
  1097. {
  1098. SAVE_SYS_LOG_MSG_FWUPDATE("-------- [viaWebService]start --------");
  1099. unsigned char result = FAIL;
  1100. unsigned int type = 0;
  1101. type = FWImage_Init();
  1102. switch (type)
  1103. {
  1104. case FW_IMAGE_TYPE_CCS_UBOOT:
  1105. {
  1106. result = Update_uboot();
  1107. break;
  1108. }
  1109. case FW_IMAGE_TYPE_CCS_DTB:
  1110. {
  1111. result = Update_DTB();
  1112. break;
  1113. }
  1114. case FW_IMAGE_TYPE_CCS_ZIMAGE:
  1115. {
  1116. result = Update_zImage();
  1117. break;
  1118. }
  1119. case FW_IMAGE_TYPE_CCS_RAMDISK:
  1120. {
  1121. result = Update_ramdisk();
  1122. break;
  1123. }
  1124. default:
  1125. {
  1126. result = FAIL;
  1127. sprintf(buf_log_fwupdate,
  1128. "[Error]undefined FW image type or file not exist.(0x%X)",
  1129. type
  1130. );
  1131. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1132. break;
  1133. }
  1134. }
  1135. if (result == PASS)
  1136. {
  1137. CSUCOMMDC_TASK_FLAG.FW_Update_result = PASS;
  1138. }
  1139. else
  1140. {
  1141. CSUCOMMDC_TASK_FLAG.FW_Update_result = FAIL;
  1142. }
  1143. CSUCOMMDC_TASK_FLAG.FW_Update_Done = TRUE; //sending CAN Res msg to CSU and reboot
  1144. }
  1145. /*===========================================================================
  1146. FUNCTION: main
  1147. DESCRIPTION:
  1148. PRE-CONDITION:
  1149. INPUT:
  1150. OUTPUT:
  1151. GLOBAL VARIABLES:
  1152. =============================================================================*/
  1153. int main(int argc, char *argv[])
  1154. {
  1155. // ======== [STEP 1/5] Initialize Share Memory ========
  1156. if(ShareMemory_Init() == 0)
  1157. {
  1158. SAVE_SYS_LOG_MSG_FWUPDATE("[main]ShareMemory_Init NG");
  1159. if(ShmStatusCodeData != NULL)
  1160. {
  1161. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  1162. }
  1163. sleep(5);
  1164. return 0;
  1165. }
  1166. //Arguments Parsing for Commands
  1167. if (argv[1][0] == '-' )
  1168. {
  1169. switch (argv[1][1])
  1170. {
  1171. case 'h': //help
  1172. {
  1173. sprintf(buf_log_fwupdate,
  1174. " ================= [HELP] CCS FW Update ==============");
  1175. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1176. sprintf(buf_log_fwupdate,
  1177. " -h \t :help");
  1178. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1179. sprintf(buf_log_fwupdate,
  1180. " -w \t :image update from WebService (with header, named as ccs.image)");
  1181. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1182. sprintf(buf_log_fwupdate,
  1183. " -a \t :full images update \t(no header, named as original names)");
  1184. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1185. sprintf(buf_log_fwupdate,
  1186. " -m \t :MLO update \t\t(no header, named as MLO)");
  1187. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1188. sprintf(buf_log_fwupdate,
  1189. " -u \t :uboot update \t\t(no header, named as u-boot.img)");
  1190. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1191. sprintf(buf_log_fwupdate,
  1192. " -d \t :dtb update \t\t(no header, named as am335x-evm.dtb)");
  1193. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1194. sprintf(buf_log_fwupdate,
  1195. " -z \t :zImage update \t(no header, named as zImage)");
  1196. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1197. sprintf(buf_log_fwupdate,
  1198. " -r \t :ramdisk update \t(no header, named as ramdisk.gz)");
  1199. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1200. break;
  1201. }
  1202. case 'w': //image update from WebService
  1203. {
  1204. Update_viaWebService();
  1205. break;
  1206. }
  1207. case 'a': //all image update
  1208. {
  1209. Update_ALL();
  1210. break;
  1211. }
  1212. case 'm': //MLO update
  1213. {
  1214. Update_MLO();
  1215. break;
  1216. }
  1217. case 'u': //uboot update
  1218. {
  1219. Update_uboot();
  1220. break;
  1221. }
  1222. case 'd': //dtb update
  1223. {
  1224. Update_DTB();
  1225. break;
  1226. }
  1227. case 'z': //zImage update
  1228. {
  1229. Update_zImage();
  1230. break;
  1231. }
  1232. case 'r': //ramdisk update
  1233. {
  1234. Update_ramdisk();
  1235. break;
  1236. }
  1237. default:
  1238. {
  1239. sprintf(buf_log_fwupdate, "Unknown option -%c\n\n", argv[1][1]);
  1240. SAVE_SYS_LOG_MSG_FWUPDATE(buf_log_fwupdate);
  1241. break;
  1242. }
  1243. }
  1244. }
  1245. }