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