#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //for pow #include #include "define.h" //#define Debug struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; struct PsuData *ShmPsuData ; struct CHAdeMOData *ShmCHAdeMOData; struct CcsData *ShmCcsData; struct PrimaryMcuData *ShmPrimaryMcuData; struct FanModuleData *ShmFanModuleData; struct RelayModuleData *ShmRelayModuleData; struct OCPP16Data *ShmOCPP16Data; #ifdef SystemLogMessage int StoreLogMsg(unsigned char *DataString) { unsigned char Buf[256]; time_t CurrentTime; struct tm *tm; memset(Buf,0,sizeof(Buf)); CurrentTime = time(NULL); tm=localtime(&CurrentTime); sprintf(Buf,"echo \"%04d.%02d.%02d %02d:%02d:%02d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, DataString, tm->tm_year+1900,tm->tm_mon+1); system(Buf); #ifdef Debug printf("%s \n",DataString); #endif } #endif int DiffTimeb(struct timeb ST, struct timeb ET) { //return milli-second unsigned int StartTime,StopTime; StartTime=(unsigned int)ST.time; StopTime=(unsigned int)ET.time; return (StopTime-StartTime)*1000+ET.millitm-ST.millitm; } /**************************************************************************************/ /**************************Create all share memory *********************************/ /**************************************************************************************/ int CreatShareMemory() { int MeterSMId; //creat ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmSysConfigAndInfo NG"); #endif return 0; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmSysConfigAndInfo NG"); #endif return 0; } memset(ShmSysConfigAndInfo,0,sizeof(struct SysConfigAndInfo)); //creat ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmStatusCodeData NG"); #endif return 0; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmStatusCodeData NG"); #endif return 0; } memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData)); //creat ShmPsuData if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmPsuData NG"); #endif return 0; } else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmPsuData NG"); #endif return 0; } memset(ShmPsuData,0,sizeof(struct PsuData)); //creat ShmCHAdeMOData if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmCHAdeMOData NG"); #endif return 0; } else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmCHAdeMOData NG"); #endif return 0; } memset(ShmCHAdeMOData,0,sizeof(struct CHAdeMOData)); //creat ShmCcsData if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmCcsData NG"); #endif return 0; } else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmCcsData NG"); #endif return 0; } memset(ShmCcsData,0,sizeof(struct CcsData)); //creat ShmPrimaryMcuData if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmPrimaryMcuData NG"); #endif return 0; } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmPrimaryMcuData NG"); #endif return 0; } memset(ShmPrimaryMcuData,0,sizeof(struct PrimaryMcuData)); //creat ShmFanModuleData if ((MeterSMId = shmget(ShmFanBdKey, sizeof(struct FanModuleData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmFanModuleData NG"); #endif return 0; } else if ((ShmFanModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmFanModuleData NG"); #endif return 0; } memset(ShmFanModuleData,0,sizeof(struct FanModuleData)); //creat ShmRelayModuleData if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmRelayModuleData NG"); #endif return 0; } else if ((ShmRelayModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmRelayModuleData NG"); #endif return 0; } memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData)); //creat ShmOCPP16Data if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmget ShmOCPP16Data NG"); #endif return 0; } else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1) { #ifdef SystemLogMessage StoreLogMsg("[main]CreatShareMemory:shmat ShmOCPP16Data NG"); #endif return 0; } // memset(ShmOCPP16Data,0,sizeof(struct OCPP16Data)); return 1; } /**************************************************************************************/ /****************Following functions are CSU initialization***************************/ /**************************************************************************************/ void InitGPIO() { /*****************0~3, 4 bank, bank x 32+ num*********************/ /***************************************************************/ /*************** GPIO 0 ***************************************/ /***************************************************************/ /* GPMC_AD8 => GPIO0_22 */ /*ID BD1_1*/ system("echo 22 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio22/direction"); /* GPMC_AD9 => GPIO0_23 */ /*ID BD1_2*/ system("echo 23 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio23/direction"); /* GPMC_AD10 => GPIO0_26 */ /*IO BD1_1*/ system("echo 26 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio26/direction"); /* GPMC_AD11 => GPIO0_27 */ /*IO BD1_2*/ system("echo 27 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio27/direction"); /* RMII1_REF_CLK => GPIO0_29 */ /*USB 0 OCP detection*/ system("echo 29 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio29/direction"); /*XDMA_EVENT_INTR0 => GPIO0_19 */ /*AM_RFID_RST*/ system("echo 19 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio19/direction"); system("echo 0 > /sys/class/gpio/gpio19/value"); /*XDMA_EVENT_INTR1 => GPIO0_20 */ /*AM_RFID_ICC*/ system("echo 20 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio20/direction"); /***************************************************************/ /*************** GPIO 1 ***************************************/ /***************************************************************/ /* GPMC_AD12 => GPIO1_12 */ /*ID BD2_1*/ system("echo 44 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio44/direction"); /* GPMC_AD13 => GPIO1_13 */ /*ID BD2_2*/ system("echo 45 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio45/direction"); /* GPMC_AD14 => GPIO1_14 */ /*IO BD2_1*/ system("echo 46 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio46/direction"); /* GPMC_AD15 => GPIO1_15 */ /*IO BD2_2*/ system("echo 47 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio47/direction"); /***************************************************************/ /*************** GPIO 2 ***************************************/ /***************************************************************/ /*LCD_AC_BIAS_EN => GPIO2_25*/ /*RS-485 for module DE control*/ system("echo 89 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio89/direction"); system("echo 0 > /sys/class/gpio/gpio89/value"); /*LCD_HSYNC => GPIO2_23*/ /*RS-485 for module RE control*/ system("echo 87 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio87/direction"); system("echo 0 > /sys/class/gpio/gpio87/value"); /*LCD_PCLK => GPIO2_24*/ /*CCS communication board 1 proximity*/ system("echo 88 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio88/direction"); /*LCD_VSYNC => GPIO2_22*/ /*CCS communication board 2 proximity*/ system("echo 86 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio86/direction"); /***************************************************************/ /*************** GPIO 3 ***************************************/ /***************************************************************/ /*MCASP0_FSX => GPIO3_15*/ /*Emergency Stop button detect*/ system("echo 111 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio111/direction"); /*MCASP0_ACLKR => GPIO3_18*/ /*USB1 OCP detect*/ system("echo 114 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio114/direction"); /*MCASP0_AHCLKR => GPIO3_17*/ /*Emergency IO for AM3352 and STM32F407*/ system("echo 113 > /sys/class/gpio/export"); system("echo \"in\" > /sys/class/gpio/gpio113/direction"); /*MCASP0_ACLKX => GPIO3_14*/ /*Ethernet PHY reset*/ system("echo 110 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio110/direction"); system("echo 0 > /sys/class/gpio/gpio110/value"); /* MCASP0_FSR => GPIO3_19 */ /*SMR Enable control_1*/ system("echo 115 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio115/direction"); system("echo 0 > /sys/class/gpio/gpio115/value"); /* MCASP0_AXR0 => GPIO3_16 */ /*CSU board function OK indicator.*/ system("echo 112 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio112/direction"); system("echo 0 > /sys/class/gpio/gpio112/value"); /* MCASP0_AXR1 => GPIO3_20 */ /*SMR Enable control_2*/ system("echo 116 > /sys/class/gpio/export"); system("echo \"out\" > /sys/class/gpio/gpio116/direction"); system("echo 0 > /sys/class/gpio/gpio116/value"); #ifdef SystemLogMessage StoreLogMsg("[main]InitGPIO: Initial GPIO OK"); #endif } int LoadSysConfigAndInfo(struct SysConfigData *ptr) { int fd,wrd; struct SysConfigData *buf; unsigned char *PtrBuf; unsigned int ChkSum,ChkSumOrg; if((buf=malloc(sizeof(struct SysConfigData)))==NULL) { #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo:malloc buffer NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } memset(buf, 0, sizeof(struct SysConfigData)); fd = open("/dev/mtdblock10", O_RDWR); if (fd < 0) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo:open mtdblock10 NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } wrd=read(fd, buf,sizeof(struct SysConfigData)); close(fd); if(wrd!=(sizeof(struct SysConfigData))) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: read SysConfigData data NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } PtrBuf=(unsigned char *)buf; ChkSum=0; for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++) { ChkSum+=PtrBuf[wrd]; } ChkSumOrg=buf->Checksum; if(ChkSum!=ChkSumOrg) { #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: Primary SysConfigData checksum NG, read backup"); #endif fd = open("/dev/mtdblock11", O_RDWR); if (fd < 0) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: open mtdblock11 (backup) NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } memset(buf, 0, sizeof(struct SysConfigData)); wrd=read(fd, buf,sizeof(struct SysConfigData)); close(fd); if(wrd!=sizeof(struct SysConfigData)) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: read backup SysConfigData data NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } PtrBuf=(unsigned char *)buf; ChkSum=0; for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++) { ChkSum+=PtrBuf[wrd]; } ChkSumOrg=buf->Checksum; if(ChkSum!=ChkSumOrg) { #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: backup SysConfigData checksum NG, read Factory default"); #endif fd = open("/dev/mtdblock12", O_RDWR); if (fd < 0) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: open mtdblock12 (Factory default) NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } memset(buf, 0, sizeof(struct SysConfigData)); wrd=read(fd, buf,sizeof(struct SysConfigData)); close(fd); if(wrd!=sizeof(struct SysConfigData)) { free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: read factory default SysConfigData data NG,rebooting.."); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CsuInitFailed=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } PtrBuf=(unsigned char *)buf; ChkSum=0; for(wrd=0;wrd<(sizeof(struct SysConfigData)-4);wrd++) { ChkSum+=PtrBuf[wrd]; } ChkSumOrg=buf->Checksum; if(ChkSum!=ChkSumOrg) { #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: factory default SysConfigData checksum NG, restore factory default"); #endif goto DefaultShm; } } } //load OK memcpy((struct SysConfigData *)ptr,(struct SysConfigData *)buf,sizeof(struct SysConfigData)); free(buf); #ifdef SystemLogMessage StoreLogMsg("[main]LoadSysConfigAndInfo: Load SysConfigData OK"); #endif return 1; DefaultShm: system("cd /root;./FactoryConfig"); system("sync"); sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } void InitEthernet() { char tmpbuf[256]; unsigned int address; system("echo 1 > /sys/class/gpio/gpio110/value");//reset PHY sleep(2); //Init Eth0 for internet memset(tmpbuf,0,256); sprintf(tmpbuf,"/sbin/ifconfig eth0 %s netmask %s up", ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress, ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthSubmaskAddress); system(tmpbuf); memset(tmpbuf,0,256); sprintf(tmpbuf,"route add default gw %s eth0 ", ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress); system(tmpbuf); //Init Eth1 for administrator tool memset(tmpbuf,0,256); sprintf(tmpbuf,"/sbin/ifconfig eth1 %s netmask %s up", ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthIpAddress, ShmSysConfigAndInfo->SysConfig.Eth1Interface.EthSubmaskAddress); system(tmpbuf); //Run DHCP client if enabled system("killall udhcpc"); system("rm -rf /etc/resolv.conf"); system("echo nameserver 8.8.8.8 > /etc/resolv.conf"); //Google DNS server system("echo nameserver 180.76.76.76 > /etc/resolv.conf"); //Baidu DNS server if(ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthDhcpClient==0) system("/sbin/udhcpc -i eth0 -s /root/simple.script > /dev/null &"); #ifdef SystemLogMessage StoreLogMsg("[main]InitEthernet: Initial Ethernet OK"); #endif } int Initialization() { InitGPIO(); LoadSysConfigAndInfo(&ShmSysConfigAndInfo->SysConfig); InitEthernet(); #ifdef SystemLogMessage StoreLogMsg("[main]Initialization: Initialization OK"); #endif } int SpawnTask() { system("/root/EventLogging &"); system("/root/LcmControl &"); system("/root/InternalComm &"); system("/root/PrimaryComm &"); system("/root/EvComm &"); system("/root/OcppBackend &"); /* if 4G model system("/root/4gModem &"); else if WiFi model system("/root/WiFiModem &"); */ } int StoreUsrConfigData(struct SysConfigData *UsrData) { int fd,wrd; unsigned int i,Chk; unsigned char *ptr; Chk=0; ptr=(unsigned char *)UsrData; for(i=0;iChecksum=Chk; fd = open("/dev/mtdblock10", O_RDWR); if (fd < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]StoreUsrConfigData: open /dev/mtdblock10 NG"); #endif return 0; } wrd=write(fd, UsrData, sizeof(struct SysConfigData)); close(fd); if(wrd!=(sizeof(struct SysConfigData))) { #ifdef SystemLogMessage StoreLogMsg("[main]StoreUsrConfigData: write /dev/mtdblock10 NG"); #endif return 0; } fd = open("/dev/mtdblock11", O_RDWR); if (fd < 0) { #ifdef SystemLogMessage StoreLogMsg("[main]StoreUsrConfigData: open /dev/mtdblock11(backup) NG"); #endif return 0; } wrd=write(fd, UsrData, sizeof(struct SysConfigData)); close(fd); if(wrd!=(sizeof(struct SysConfigData))) { #ifdef SystemLogMessage StoreLogMsg("[main]StoreUsrConfigData: write /dev/mtdblock11(backup) NG"); #endif return 0; } return 1; } /**************************************************************/ /************** main function********************************/ /*************************************************************/ int main(int argc,char *argv[]) { int Rtn=0; unsigned int StartTime; struct timeb StartChargingTime,CurrentChargingTime,ChargingLoopTime; float ChargingPower,ChargingEnergy; //Create all share memory if(CreatShareMemory()==0) { #ifdef SystemLogMessage StoreLogMsg("[main]main:CreatShareMemory NG"); #endif if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1; } sleep(5); system("reboot -f"); sleep(5); system("reboot -f"); } //CSU Initialization Initialization(); //task spawn //SpawnTask(); /**************************************************************/ /************** main Loop********************************/ /*****************************************************************/ while(1) { sleep(10); }//main while }