main.c 25 KB

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