main.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. /*===========================================================================
  2. Combined Charging System (CCS): SECC
  3. main.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 <unistd.h>
  26. #include "define.h"
  27. #include "main.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_main[SIZE_OF_LOG_BUFFER];
  34. #if SAVE_SYS_LOG_MSG_MAIN_SWITCH == ENABLE
  35. int StoreLogMsg(unsigned char *DataString);
  36. #endif
  37. void System_Init();
  38. void CreateShareMemory_Init();
  39. void GPIO_Init();
  40. void PWM_Init();
  41. void Confinguration_Init();
  42. double DiffTimeb(struct timeb ST, struct timeb ET);
  43. int CreateShareMemory();
  44. int LoadSysConfigAndInfo(struct SysConfigData *ptr);
  45. int SpawnTask();
  46. int StoreUsrConfigData(struct SysConfigData *UsrData);
  47. /*===========================================================================
  48. FUNCTION: main
  49. DESCRIPTION:
  50. 1. This main routine will be executed by the "rcS" when linux is booting up.
  51. /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/rootfs/etc/init.d/rcS
  52. PRE-CONDITION:
  53. INPUT:
  54. OUTPUT:
  55. GLOBAL VARIABLES:
  56. =============================================================================*/
  57. int main(int argc, char *argv[])
  58. {
  59. SAVE_SYS_LOG_MSG_MAIN("ccs: on");
  60. SAVE_SYS_LOG_MSG_MAIN("---------------------------------------------");
  61. SAVE_SYS_LOG_MSG_MAIN("-- MAIN --");
  62. SAVE_SYS_LOG_MSG_MAIN("---------------------------------------------\n");
  63. //int Rtn = 0;
  64. //unsigned int StartTime;
  65. //struct timeb StartChargingTime, CurrentChargingTime, ChargingLoopTime;
  66. //float ChargingPower, ChargingEnergy;
  67. //CSU Initialization
  68. System_Init();
  69. //task spawn
  70. SpawnTask();
  71. /**************************************************************/
  72. /************** main Loop********************************/
  73. /*****************************************************************/
  74. while(1)
  75. {
  76. //Sleep to reduce CPU power comsumption
  77. sleep(5);
  78. }//main while
  79. }
  80. /*===========================================================================
  81. FUNCTION: Eth0_PortSetting
  82. DESCRIPTION:
  83. PRE-CONDITION:
  84. INPUT:
  85. OUTPUT:
  86. GLOBAL VARIABLES:
  87. =============================================================================*/
  88. int Eth0_PortSetting_Base(unsigned char addr)
  89. {
  90. SAVE_SYS_LOG_MSG_MAIN("[Eth0_PortSetting]start");
  91. unsigned char cmd[128];
  92. if ((addr >= 20) && (addr <= (255-20-1))) //preserved for dynamic IP and QCA7000
  93. {
  94. //Step 0: shutdown eth0
  95. #if 0
  96. SAVE_SYS_LOG_MSG_MAIN("[Eth0_PortSetting][eth0]down");
  97. system("/sbin/ifconfig eth0 down");
  98. sleep(1);
  99. #endif
  100. //Step 1: eth0 setting
  101. sprintf(buf_log_main,
  102. "[Eth0_PortSetting][eth0]IP >> 192.168.0.%d(up)",
  103. addr);
  104. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  105. sprintf(cmd, "/sbin/ifconfig eth0 192.168.0.%d netmask 255.255.255.0 up", addr);
  106. system(cmd);
  107. memset(cmd, 0, sizeof(cmd));
  108. sleep(1);
  109. //Step 2: add route
  110. system("/sbin/route add default gw 192.168.0.1");
  111. //Step 3: done
  112. sprintf(buf_log_main,
  113. "[Eth0_PortSetting]done");
  114. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  115. return PASS;
  116. }
  117. else
  118. {
  119. sprintf(buf_log_main,
  120. "[Eth0_PortSetting][Error]addr(%d) is out of range(20~234)",
  121. addr);
  122. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  123. return FAIL;
  124. }
  125. }
  126. /*===========================================================================
  127. FUNCTION: System_Init
  128. DESCRIPTION:
  129. PRE-CONDITION:
  130. 1. Pin Assignment Configuration
  131. board-support/linux-4.9.59+gitAUTOINC+a75d8e9305-ga75d8e9305/
  132. arch/arm/boot/dts/[CCS]am335x-evm.dts
  133. INPUT:
  134. OUTPUT:
  135. GLOBAL VARIABLES:
  136. =============================================================================*/
  137. void System_Init()
  138. {
  139. //RTC Update
  140. time_t rtc_new;
  141. rtc_new = RTC_DEFAULT_TIME; //Epoch time
  142. stime(&rtc_new);
  143. system("date");
  144. sprintf(buf_log_main, "[RTC]%d (DEC)\n", rtc_new);
  145. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  146. //-----------------------------------
  147. //Print Linux Kernel Version
  148. sprintf(buf_log_main, "\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
  149. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  150. //Print Hardware Version
  151. sprintf(buf_log_main, "HW: %s\n", HARDWARE_VERSION);
  152. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  153. //Print Firmware Version
  154. sprintf(buf_log_main, "FW: %s\n", FIRMWARE_VERSION);
  155. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  156. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == ENABLE)
  157. {
  158. //Print Linux Kernel Version
  159. printf("\nLinux Image SHA1: %s\n", LINUX_IMAGE_VERSION);
  160. //Print Hardware Version
  161. printf("HW: %s\n", HARDWARE_VERSION);
  162. //Print Firmware Version
  163. printf("FW: %s\n", FIRMWARE_VERSION);
  164. }
  165. #endif
  166. //Init Eth0
  167. Eth0_PortSetting_Base(ETH0_PORT_BASE); //192.168.0.20
  168. // ---------- Hardware Init ---------
  169. system("/sbin/insmod /lib/qcaspi.ko");
  170. sleep(2);
  171. system("/sbin/ifconfig eth1 192.168.0.11 netmask 255.255.255.0 up");
  172. sleep(1);
  173. printf("Starting SSH : \n");
  174. system("/sbin/dropbear &");
  175. printf("Starting FTPD : \n");
  176. system("/usr/bin/tcpsvd -vE 0.0.0.0 21 ftpd -w -t 30 / &");
  177. //printf("Starting LIGHTTPD : \n");
  178. //system("/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf -m /lib");
  179. //Init GPIO
  180. GPIO_Init();
  181. //Init ecap0
  182. PWM_Init();
  183. // ---------- Software Init ----------
  184. //Create all share memory
  185. CreateShareMemory_Init();
  186. //Init System Confinguration
  187. Confinguration_Init();
  188. SAVE_SYS_LOG_MSG_MAIN("--------------------------");
  189. SAVE_SYS_LOG_MSG_MAIN("System_Init(): DONE");
  190. }
  191. /*===========================================================================
  192. FUNCTION: CreateShareMemory_Init
  193. DESCRIPTION:
  194. PRE-CONDITION:
  195. INPUT:
  196. OUTPUT:
  197. GLOBAL VARIABLES:
  198. =============================================================================*/
  199. void CreateShareMemory_Init()
  200. {
  201. if(CreateShareMemory() == 0)
  202. {
  203. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory_Init(): NG");
  204. if(ShmStatusCodeData != NULL)
  205. {
  206. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
  207. }
  208. sleep(5);
  209. system("reboot -f");
  210. sleep(5);
  211. system("reboot -f");
  212. }
  213. else
  214. {
  215. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory_Init(): DONE");
  216. }
  217. }
  218. /**************************************************************************************/
  219. /**************************Create all share memory *********************************/
  220. /**************************************************************************************/
  221. /*===========================================================================
  222. FUNCTION: CreateShareMemory
  223. DESCRIPTION:
  224. There are 4 share memory created here, which are listed as below.
  225. 1) ShmSysConfigAndInfo
  226. 2) ShmStatusCodeData
  227. 3) ShmCcsData
  228. 4) ShmInternalComm
  229. PRE-CONDITION:
  230. INPUT:
  231. OUTPUT:
  232. GLOBAL VARIABLES:
  233. =============================================================================*/
  234. int CreateShareMemory()
  235. {
  236. int MeterSMId;
  237. //create ShmSysConfigAndInfo
  238. if((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0)
  239. {
  240. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmget ShmSysConfigAndInfo NG");
  241. return 0;
  242. }
  243. else if((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  244. {
  245. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmat ShmSysConfigAndInfo NG");
  246. return 0;
  247. }
  248. memset(ShmSysConfigAndInfo, 0, sizeof(struct SysConfigAndInfo));
  249. //create ShmStatusCodeData
  250. if((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0)
  251. {
  252. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmget ShmStatusCodeData NG");
  253. return 0;
  254. }
  255. else if((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  256. {
  257. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmat ShmStatusCodeData NG");
  258. return 0;
  259. }
  260. memset(ShmStatusCodeData, 0, sizeof(struct StatusCodeData));
  261. //create ShmCcsData
  262. if((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0)
  263. {
  264. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmget ShmCcsData NG");
  265. return 0;
  266. }
  267. else if((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  268. {
  269. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmat ShmCcsData NG");
  270. return 0;
  271. }
  272. memset(ShmCcsData, 0, sizeof(struct CcsData));
  273. //create ShmInternalComm
  274. if((MeterSMId = shmget(ShmInternalCommKey, sizeof(struct InternalComm), IPC_CREAT | 0777)) < 0)
  275. {
  276. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmget ShmInternalComm NG");
  277. return 0;
  278. }
  279. else if((ShmInternalComm = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  280. {
  281. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmat ShmInternalComm NG");
  282. return 0;
  283. }
  284. memset(ShmInternalComm, 0, sizeof(struct InternalComm));
  285. //create ShmInternalCommAC
  286. if((MeterSMId = shmget(ShmInternalCommACKey, sizeof(struct InternalCommAC), IPC_CREAT | 0777)) < 0)
  287. {
  288. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmget ShmInternalCommAC NG");
  289. return 0;
  290. }
  291. else if((ShmInternalCommAC = shmat(MeterSMId, NULL, 0)) == (void *)-1)
  292. {
  293. SAVE_SYS_LOG_MSG_MAIN("CreateShareMemory:shmat ShmInternalCommAC NG");
  294. return 0;
  295. }
  296. //[To-Do] The reset here should be removed, since AW-CCS CSU will reset it in its main.c.
  297. memset(ShmInternalCommAC, 0, sizeof(struct InternalCommAC));
  298. return 1;
  299. }
  300. /*===========================================================================
  301. FUNCTION: GPIO_Init
  302. DESCRIPTION:
  303. 1. GPIO (input) x 1
  304. * gpio2_0(gpio64): QCA7000 interrupt
  305. * gpio2_23 (gpio87): CCS Board ID detection
  306. 2. GPIO (output) x 4
  307. * gpio2_25 (gpio89): reserved (default = 0)
  308. * gpio2_24 (gpio88): power reset QCA7000 (default = 0)
  309. * gpio2_22 (gpio86): Pilot Status E control (0V) (default = 0)
  310. PRE-CONDITION:
  311. INPUT:
  312. OUTPUT:
  313. GLOBAL VARIABLES:
  314. =============================================================================*/
  315. void GPIO_Init()
  316. {
  317. /*****************0~3, 4 bank, bank x 32+ num*********************/
  318. /*****************************************************************/
  319. /*************** INPUT PIN ***************************************/
  320. /*****************************************************************/
  321. /*GPIO2_0: QCA7000 interrupt */
  322. system("echo 64 > /sys/class/gpio/export");
  323. system("echo \"in\" > /sys/class/gpio/gpio64/direction");
  324. //IO port for CCS Board ID detection
  325. /*GPIO2_23: AM_IO_1, H: ?; L: ?*/
  326. system("echo 87 > /sys/class/gpio/export");
  327. system("echo \"in\" > /sys/class/gpio/gpio87/direction");
  328. /***************************************************************/
  329. /*************** OUTPUT PIN ************************************/
  330. /***************************************************************/
  331. //IO port for Communication Board.(reserved for emergency shutdown PSU, i.e. PSKILL)
  332. /*GPIO2_25: AM_IO_2, H: ?; L: ?*/
  333. system("echo 89 > /sys/class/gpio/export");
  334. system("echo \"out\" > /sys/class/gpio/gpio89/direction");
  335. system("echo 0 > /sys/class/gpio/gpio89/value");
  336. //Power Reset QCA7000
  337. /*GPIO2_24: AM_QCA_PWR_RST, H: reset, L: noraml*/
  338. system("echo 88 > /sys/class/gpio/export");
  339. system("echo \"out\" > /sys/class/gpio/gpio88/direction");
  340. system("echo 0 > /sys/class/gpio/gpio88/value");
  341. //Pilot Status E control (0V)
  342. /*GPIO2_22: Pilot_state E, H: state E, L: normal*/
  343. system("echo 86 > /sys/class/gpio/export");
  344. system("echo \"out\" > /sys/class/gpio/gpio86/direction");
  345. system("echo 0 > /sys/class/gpio/gpio86/value");
  346. SAVE_SYS_LOG_MSG_MAIN("GPIO_Init(): DONE");
  347. }
  348. /*===========================================================================
  349. FUNCTION: PWM_Init
  350. DESCRIPTION:
  351. - Initialize the PWM channel by the following configuration.
  352. * Frequency = 1KHz
  353. * Duty = 100%
  354. - The default voltage should be as below.
  355. * 12V: unplugged
  356. * 9V: plugged
  357. - Check Mechanism (to-do)
  358. * Read CP Voltage and PWM by AIN3:
  359. // cat /sys/bus/iio/devices/iio\\:device0/in_voltage3_raw;
  360. PRE-CONDITION:
  361. INPUT:
  362. OUTPUT:
  363. - PWM = 100% at 1KHz
  364. GLOBAL VARIABLES:
  365. =============================================================================*/
  366. void PWM_Init()
  367. {
  368. //unsigned char str[256];
  369. //init ecap0
  370. //memset(str, 0, sizeof(str));
  371. system("echo 0 > /sys/class/pwm/pwmchip0/export");
  372. system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period");// nano seconds =>1k Hz
  373. system("echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //default 100%
  374. system("echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable");
  375. //system("echo 1 > /sys /class/pwm/pwmchip0/pwm0/polarity");
  376. //PWM_Init_Check(); //Checking if the PWM analog signal is well-initialized
  377. //as 1KHz,100%, and 12V/9V.
  378. SAVE_SYS_LOG_MSG_MAIN("PWM_Init(): DONE");
  379. }
  380. /*===========================================================================
  381. FUNCTION:
  382. DESCRIPTION:
  383. PRE-CONDITION:
  384. INPUT:
  385. OUTPUT:
  386. GLOBAL VARIABLES:
  387. =============================================================================*/
  388. void Confinguration_Init()
  389. {
  390. //Load System Confinguration
  391. LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig);
  392. SAVE_SYS_LOG_MSG_MAIN("Confinguration_Init(): DONE");
  393. }
  394. /*===========================================================================
  395. FUNCTION: StoreLogMsg
  396. DESCRIPTION:
  397. PRE-CONDITION:
  398. INPUT:
  399. OUTPUT:
  400. GLOBAL VARIABLES:
  401. =============================================================================*/
  402. #if SAVE_SYS_LOG_MSG_MAIN_SWITCH == ENABLE
  403. int StoreLogMsg(unsigned char *DataString)
  404. {
  405. static unsigned char Buf[1024];
  406. static time_t CurrentTime;
  407. static struct tm *tm;
  408. static struct timeval tv;
  409. memset(Buf, 0, sizeof(Buf));
  410. CurrentTime = time(NULL);
  411. tm = localtime(&CurrentTime);
  412. gettimeofday(&tv, NULL); // get microseconds, 10^-6
  413. sprintf(Buf, "echo \"[%04d%02d%02d: %02d:%02d:%02d.%06d][main]%s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  414. tm->tm_year + 1900,
  415. tm->tm_mon + 1,
  416. tm->tm_mday,
  417. tm->tm_hour,
  418. tm->tm_min,
  419. tm->tm_sec,
  420. tv.tv_usec,
  421. DataString,
  422. tm->tm_year + 1900,
  423. tm->tm_mon + 1);
  424. system(Buf);
  425. DEBUG_PRINTF_MAIN_SYSTEM_LOG("[%02d:%02d:%02d.%06d][main]%s \n",
  426. tm->tm_hour,
  427. tm->tm_min,
  428. tm->tm_sec,
  429. tv.tv_usec,
  430. DataString);
  431. //Reset the buf_log_main Buffer, i.e. DataString
  432. memset(buf_log_main, 0, SIZE_OF_LOG_BUFFER);
  433. }
  434. #endif
  435. /*===========================================================================
  436. FUNCTION: DiffTimeb
  437. DESCRIPTION:
  438. Caculating the time difference in ms precision (milli-second).
  439. PRE-CONDITION:
  440. INPUT:
  441. OUTPUT:
  442. GLOBAL VARIABLES:
  443. =============================================================================*/
  444. double DiffTimeb(struct timeb ST, struct timeb ET)
  445. {
  446. //return milli-second
  447. double StartTime, EndTime;
  448. double t_diff;
  449. StartTime = ((double)ST.time)*1000 + (double)ST.millitm;
  450. EndTime = ((double)ET.time)*1000 + (double)ET.millitm;
  451. t_diff = EndTime - StartTime;
  452. //printf("%.02lf - %.02lf = %.02lf\n", EndTime, StartTime, t_diff);
  453. if (t_diff < 0)
  454. {
  455. #if 0
  456. if (t_diff < -1000) //1000ms
  457. {
  458. sprintf(buf_log_main,
  459. "[Warning]StartTime(%.02lf) > EndTime(%.02lf), d(%.02lf)",
  460. StartTime,
  461. EndTime,
  462. t_diff);
  463. SAVE_SYS_LOG_MSG_MAIN(buf_log_main);
  464. }
  465. #endif
  466. return -1;
  467. }
  468. return t_diff;
  469. }
  470. /**************************************************************************************/
  471. /****************Following functions are CSU initialization***************************/
  472. /**************************************************************************************/
  473. /*===========================================================================
  474. FUNCTION:
  475. DESCRIPTION:
  476. PRE-CONDITION:
  477. INPUT:
  478. OUTPUT:
  479. GLOBAL VARIABLES:
  480. =============================================================================*/
  481. int SpawnTask()
  482. {
  483. //system("/root/EventLogging &");
  484. system("/root/CsuComm &");
  485. usleep(50000); //50ms
  486. //system("echo 50000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle"); //5%, for test.
  487. system("/root/SeccComm &");
  488. }
  489. /*===========================================================================
  490. FUNCTION:
  491. DESCRIPTION:
  492. PRE-CONDITION:
  493. INPUT:
  494. OUTPUT:
  495. GLOBAL VARIABLES:
  496. =============================================================================*/
  497. int StoreUsrConfigData(struct SysConfigData *UsrData)
  498. {
  499. int fd, wrd;
  500. unsigned int i, Chk;
  501. unsigned char *ptr;
  502. Chk = 0;
  503. ptr = (unsigned char *)UsrData;
  504. for(i = 0; i < sizeof(struct SysConfigData) - 4; i++)
  505. {
  506. Chk += *(ptr + i);
  507. }
  508. UsrData->Checksum = Chk;
  509. fd = open("/dev/mtdblock10", O_RDWR);
  510. if(fd < 0)
  511. {
  512. SAVE_SYS_LOG_MSG_MAIN("StoreUsrConfigData: open /dev/mtdblock10 NG");
  513. return 0;
  514. }
  515. wrd = write(fd, UsrData, sizeof(struct SysConfigData));
  516. close(fd);
  517. if(wrd != (sizeof(struct SysConfigData)))
  518. {
  519. SAVE_SYS_LOG_MSG_MAIN("StoreUsrConfigData: write /dev/mtdblock10 NG");
  520. return 0;
  521. }
  522. fd = open("/dev/mtdblock11", O_RDWR);
  523. if(fd < 0)
  524. {
  525. SAVE_SYS_LOG_MSG_MAIN("StoreUsrConfigData: open /dev/mtdblock11(backup) NG");
  526. return 0;
  527. }
  528. wrd = write(fd, UsrData, sizeof(struct SysConfigData));
  529. close(fd);
  530. if(wrd != (sizeof(struct SysConfigData)))
  531. {
  532. SAVE_SYS_LOG_MSG_MAIN("StoreUsrConfigData: write /dev/mtdblock11(backup) NG");
  533. return 0;
  534. }
  535. return 1;
  536. }
  537. /*===========================================================================
  538. FUNCTION: LoadSysConfigAndInfo
  539. DESCRIPTION:
  540. PRE-CONDITION:
  541. INPUT:
  542. OUTPUT:
  543. GLOBAL VARIABLES:
  544. =============================================================================*/
  545. int LoadSysConfigAndInfo(struct SysConfigData *ptr)
  546. {
  547. int fd, wrd;
  548. struct SysConfigData *buf;
  549. unsigned char *PtrBuf;
  550. unsigned int ChkSum, ChkSumOrg;
  551. if((buf = malloc(sizeof(struct SysConfigData))) == NULL)
  552. {
  553. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): malloc buffer NG,rebooting..");
  554. if(ShmStatusCodeData != NULL)
  555. {
  556. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  557. }
  558. sleep(5);
  559. system("reboot -f");
  560. sleep(5);
  561. system("reboot -f");
  562. }
  563. memset(buf, 0, sizeof(struct SysConfigData));
  564. fd = open("/dev/mtdblock10", O_RDWR);
  565. if(fd < 0)
  566. {
  567. free(buf);
  568. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo():open mtdblock10 NG,rebooting..");
  569. if(ShmStatusCodeData != NULL)
  570. {
  571. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  572. }
  573. sleep(5);
  574. system("reboot -f");
  575. sleep(5);
  576. system("reboot -f");
  577. }
  578. wrd = read(fd, buf, sizeof(struct SysConfigData));
  579. close(fd);
  580. if(wrd != (sizeof(struct SysConfigData)))
  581. {
  582. free(buf);
  583. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): read SysConfigData data NG,rebooting..");
  584. if(ShmStatusCodeData != NULL)
  585. {
  586. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  587. }
  588. sleep(5);
  589. system("reboot -f");
  590. sleep(5);
  591. system("reboot -f");
  592. }
  593. PtrBuf = (unsigned char *)buf;
  594. ChkSum = 0;
  595. for(wrd = 0; wrd < (sizeof(struct SysConfigData) - 4); wrd++)
  596. {
  597. ChkSum += PtrBuf[wrd];
  598. }
  599. ChkSumOrg = buf->Checksum;
  600. if(ChkSum != ChkSumOrg)
  601. {
  602. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): Primary SysConfigData checksum NG, read backup");
  603. fd = open("/dev/mtdblock11", O_RDWR);
  604. if(fd < 0)
  605. {
  606. free(buf);
  607. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): open mtdblock11 (backup) NG,rebooting..");
  608. if(ShmStatusCodeData != NULL)
  609. {
  610. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  611. }
  612. sleep(5);
  613. system("reboot -f");
  614. sleep(5);
  615. system("reboot -f");
  616. }
  617. memset(buf, 0, sizeof(struct SysConfigData));
  618. wrd = read(fd, buf, sizeof(struct SysConfigData));
  619. close(fd);
  620. if(wrd != sizeof(struct SysConfigData))
  621. {
  622. free(buf);
  623. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): read backup SysConfigData data NG,rebooting..");
  624. if(ShmStatusCodeData != NULL)
  625. {
  626. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  627. }
  628. sleep(5);
  629. system("reboot -f");
  630. sleep(5);
  631. system("reboot -f");
  632. }
  633. PtrBuf = (unsigned char *)buf;
  634. ChkSum = 0;
  635. for(wrd = 0; wrd < (sizeof(struct SysConfigData) - 4); wrd++)
  636. {
  637. ChkSum += PtrBuf[wrd];
  638. }
  639. ChkSumOrg = buf->Checksum;
  640. if(ChkSum != ChkSumOrg)
  641. {
  642. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): backup SysConfigData checksum NG, read Factory default");
  643. fd = open("/dev/mtdblock12", O_RDWR);
  644. if(fd < 0)
  645. {
  646. free(buf);
  647. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): open mtdblock12 (Factory default) NG,rebooting..");
  648. if(ShmStatusCodeData != NULL)
  649. {
  650. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  651. }
  652. sleep(5);
  653. system("reboot -f");
  654. sleep(5);
  655. system("reboot -f");
  656. }
  657. memset(buf, 0, sizeof(struct SysConfigData));
  658. wrd = read(fd, buf, sizeof(struct SysConfigData));
  659. close(fd);
  660. if(wrd != sizeof(struct SysConfigData))
  661. {
  662. free(buf);
  663. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): read factory default SysConfigData data NG,rebooting..");
  664. if(ShmStatusCodeData != NULL)
  665. {
  666. ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed = 1;
  667. }
  668. sleep(5);
  669. system("reboot -f");
  670. sleep(5);
  671. system("reboot -f");
  672. }
  673. PtrBuf = (unsigned char *)buf;
  674. ChkSum = 0;
  675. for(wrd = 0; wrd < (sizeof(struct SysConfigData) - 4); wrd++)
  676. {
  677. ChkSum += PtrBuf[wrd];
  678. }
  679. ChkSumOrg = buf->Checksum;
  680. if(ChkSum != ChkSumOrg)
  681. {
  682. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): factory default SysConfigData checksum NG, restore factory default");
  683. goto DefaultShm;
  684. }
  685. }
  686. }
  687. //load OK
  688. memcpy((struct SysConfigData *)ptr, (struct SysConfigData *)buf, sizeof(struct SysConfigData));
  689. free(buf);
  690. SAVE_SYS_LOG_MSG_MAIN("LoadSysConfigAndInfo(): Load SysConfigData OK");
  691. return 1;
  692. DefaultShm:
  693. system("cd /root;./FactoryConfig");
  694. #if (FIRMWARE_VERSION_COMPILE_SETTING_RELEASE_MODE == DISABLE)
  695. {
  696. SAVE_SYS_LOG_MSG_MAIN("sync...");
  697. system("sync");
  698. }
  699. #endif
  700. sleep(5);
  701. system("reboot -f");
  702. sleep(5);
  703. system("reboot -f");
  704. }