/******************************************************************************** * File Name: ProductPara.c * Function Describe: * Explain: * Writer: ShiLiangWen * Date: 2015-7-6 *******************************************************************************/ #define THIS_FILE_ID 6 //----------------------------------------------------------------------------- #include "includes.h" SUT_PRODUCT_PARA sutProductPara; //读取指定地址的半字(16位数据) //faddr:读地址(此地址必须为2的倍数!!) //返回值:对应数据. u16 STMFLASH_ReadHalfWord(u32 faddr) { return *(vu16*)faddr; } //从指定地址开始读出指定长度的数据 //ReadAddr:起始地址 //pBuffer:数据指针 //NumToWrite:半字(16位)数 void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead) { u16 i; for(i=0;i=(STM32_FLASH_BASE+1024*STM32_FLASH_SIZE)))return;//非法地址 if(WriteAddr&0x0000003ff)return;//非页首地址 RunMake(THIS_FILE_ID); FLASH_Unlock(); //解锁 RunMake(THIS_FILE_ID); status=FLASH_ErasePage(WriteAddr);//擦除这个扇区 if(status!=FLASH_COMPLETE){ RunMake(THIS_FILE_ID); return; } RunMake(THIS_FILE_ID); //写入 for(i = 0; i < DataLen; i+=2) { //数据8位融合为16位 temp = (((unsigned short)pData[i+1])<<8) + ((unsigned short)pData[i]); FLASH_ProgramHalfWord((WriteAddr+i),temp); } RunMake(THIS_FILE_ID); FLASH_Lock();//上锁 RunMake(THIS_FILE_ID); } /********************************************************************************************************** ************************************************************************************************************/ void ReadFlashData(unsigned long ReadAddr,unsigned char *pData,unsigned short DataLen) { int i,j; unsigned short temp; j=0; for(i=0;i>8)&0xff; } } void printfATHCODE(void) { char buf[3], buf2[50]; snprintf(buf2, sizeof(buf2), "index=%d,time=%d",sutProductPara.m_GPS_TimeIndex,sutGpsInfo.GPS_UploadTime); SlwTrace(INF, buf2,1); } /********************************************************************************************************** SaveProductParaToFlash ************************************************************************************************************/ void SaveProductParaToFlash(char *recoreInfo) { uint32_t tick; char recBuf[60]; PWR_EN_HIGH; if(sutProductPara.takeNoteFlag) { //记录保存相关信息到SPI FLASH tick=RTC_GetCounter(); //时间 位置 机型 序列号 snprintf(recBuf, sizeof(recBuf), "[rec]%d,%s,%s,%08x|\r\n",tick,recoreInfo,sutProductPara.ProductName,sutProductPara.PSN); sFlash_Write(recBuf, RECORD_INFO_ADDRESS, sizeof(recBuf)); SlwTrace(INF, recBuf, 0); } //////////////////////// WritePageData(MAIN_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA)); DelayMs(100); WritePageData(BACKUP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA)); PWR_EN_LOW; } void ResetMip(void) { sutProductPara.ManagerIP[0] = DEFAULT_LOAD_IP0; sutProductPara.ManagerIP[1] = DEFAULT_LOAD_IP1; sutProductPara.ManagerIP[2] = DEFAULT_LOAD_IP2; sutProductPara.ManagerIP[3] = DEFAULT_LOAD_IP3; sutProductPara.ManagerPort = DEFAULT_LOAD_PORT; } void ResetCip(void) { sutProductPara.ConfigSerIP[0] = DEFAULT_CONFIG_IP0; sutProductPara.ConfigSerIP[1] = DEFAULT_CONFIG_IP1; sutProductPara.ConfigSerIP[2] = DEFAULT_CONFIG_IP2; sutProductPara.ConfigSerIP[3] = DEFAULT_CONFIG_IP3; sutProductPara.ConfigSerPort = DEFAULT_CONFIG_PORT; } void ResetFip(void) { sutProductPara.MFotaIP[0]=FOTA_IAP_IP0; sutProductPara.MFotaIP[1]=FOTA_IAP_IP1; sutProductPara.MFotaIP[2]=FOTA_IAP_IP2; sutProductPara.MFotaIP[3]=FOTA_IAP_IP3; sutProductPara.MFotaPort=FOTA_IAP_PORT; } void FotaIpCheck(void) { char resetflag; resetflag=0; if(sutProductPara.ProductVersion != PRODUCT_VERSION) { if((sutProductPara.MFotaIP[0] == 0xFF && sutProductPara.MFotaIP[1] == 0xFF && sutProductPara.MFotaIP[2] == 0xFF && sutProductPara.MFotaIP[3] == 0xFF) || sutProductPara.MFotaPort == 0xFFFF) { resetflag=1; } if(sutProductPara.ProductVersion <= 107 && PRODUCT_VERSION >= 108) { resetflag=2; } if(resetflag) ResetFip(); } } /******************************************************************** *SaveParaToFlash 将sutNetPara重要参数保存到FLASH *********************************************************************/ #if 1 //主参数区:127K MAIN_CONFIG_ADDR //备份参数:126K BACKUP_CONFIG_ADDR //1、使用时主要使用主参数区参数 //2、每次更新主参数区时,一并更新备份参数区 //3、开机后读取主参数区以及备份区 //3.1、如果两者的NAME和PSN都全为FF,则认为是第一次启动,初始化所有主备参数; //3.2、非3.1的情况下,如果主区的NAME不为PRODUCT_NAME(第一次初始化时设置)时,或者主区的PSN为非法值(1000000= MIN_PSN_NUM && sutProductPara.PSN <= MAX_PSN_NUM))//PSN符合范围 { mainLogic=1;//主区参数合法 } //3.2、检测备份合法性 backupLogic=0;//设置不合法 if(0==strcmp(backupPara.ProductName,PRODUCT_NAME) && //产品名字相同 (backupPara.PSN >= MIN_PSN_NUM && backupPara.PSN <= MAX_PSN_NUM)) //PSN符合范围 { backupLogic=1;//备份参数合法 } //3.3、如果主备都不合法,则进行刷机 if(0==mainLogic && 0==backupLogic) { GetUniStringByID(sutProductPara.HARDID); SlwTrace(INF, "[1]Rst all para!",1); memset((unsigned char *)&sutProductPara,0,sizeof(SUT_PRODUCT_PARA)); sutProductPara.PasswordInable=0; sutProductPara.McuFlag =MCU_FLAG; //MCU标识 sutProductPara.IapFlag =0x88; //IAP标志 0x00--无应用程序 0x55--需要空中升级 0x88--正常运行应用程序 sutProductPara.ModemType =MODEM_TYPE; sutProductPara.GpsType =GPS_TYPE; sutProductPara.FoTaServerSel=0;//FOTA服务器选择 0--POC Server 1--GPS Server strcpy(sutProductPara.ProductName,PRODUCT_NAME); sutProductPara.ProductVersion=PRODUCT_VERSION; sutProductPara.PocPort =POC_SERVER_PORT; sutProductPara.GpsPort =TSGPS_SERVER_PORT; sutProductPara.GpsPort2 =TSGPS_SERVER_PORT2; sutProductPara.FoTaPort =FOTA_SERVER_PORT; sutProductPara.PSN =MIN_PSN_NUM;//未写号情况下PSN为150000000 sutProductPara.g_net=0; //网模自动 //strcpy(sutProductPara.Password ,"123456"); strcpy(sutProductPara.domain,DOMAIN_SERVER); strcpy(sutProductPara.PIP,POC_SERVER_IP); strcpy(sutProductPara.PIP2,POC_SERVER_IP2); sutProductPara.Ipselect=0; sutProductPara.SwitchIpFlag=0; strcpy(sutProductPara.GIP,GPS_SERVER_IP); strcpy(sutProductPara.GIP2,GPS_SERVER_IP2); sutProductPara.SwitchIpCt=0; sutProductPara.SwitchGipct=0; strcpy(sutProductPara.MEID,"00000000000000"); //14位 最后一位为0 strcpy(sutProductPara.APNApn, APN_APN); strcpy(sutProductPara.APNName,APN_NAME); strcpy(sutProductPara.APNPass,APN_PASSWORD); sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; ResetMip(); /////////////////////////////////////////// ResetCip(); strcpy(sutProductPara.APNApn, APN_APN); sutProductPara.APNIndex=APN_NUM-1;//默认使用资源文件中的第4个APN //然后保存参数 saveType=1;//两个区都保存为:sutProductPara } //3.4、如果主合法,备非法,主copy到备 else if(1==mainLogic && 0==backupLogic) { SlwTrace(INF, "[2]main-->backup",1); saveType=2;//仅保存:backupPara } //3.5、如果主非法,备合法,备copy到主 else if(0==mainLogic && 1==backupLogic) { SlwTrace(INF, "[3]backup-->main",1); memcpy((unsigned char *)&sutProductPara, (unsigned char *)&backupPara, sizeof(SUT_PRODUCT_PARA)); saveType=3;//仅保存:sutProductPara } //3.6、如果主备都合法,但不一致,主copy到备 else if(1==mainLogic && 1==backupLogic && sutProductPara.PSN != backupPara.PSN) { SlwTrace(INF, "[4]main-->backup",1); saveType=2;//仅保存:backupPara } //3.7、如果主备都合法,但一致,不做任何操作 else //{ SlwTrace(INF, "[5]LogicOk",1); //检测是否版本发生了变更 if(sutProductPara.ProductVersion != PRODUCT_VERSION) {//版本号发生了变化 FotaIpCheck(); sutProductPara.Ipselect=0; sutProductPara.SwitchIpFlag=0; sutProductPara.GIPSelect=0; sutProductPara.SwitchGIPFlag=0; sutProductPara.SwitchIpCt=0; sutProductPara.SwitchGipct=0; sutProductPara.APNIndex=APN_NUM-1; sutProductPara.ProductVersion=PRODUCT_VERSION; strcpy(sutProductPara.domain,DOMAIN_SERVER); //1.1 GPS upload time --> 15 seconds sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX;//恢复GPS默认上传时间 //2.2 LCD back light no need to set here, it will reset in maintask init if LCD file changed //如检测集群与配置服参数是否有效,使得以前版本无此功能,然后升级版本后能生效此功能 if((sutProductPara.ManagerIP[0] == 0xFF && sutProductPara.ManagerIP[1] == 0xFF && sutProductPara.ManagerIP[2] == 0xFF && sutProductPara.ManagerIP[3] == 0xFF) || sutProductPara.ManagerPort == 0xFFFF) { ResetMip(); } if((sutProductPara.ConfigSerIP[0] == 0xFF && sutProductPara.ConfigSerIP[1] == 0xFF && sutProductPara.ConfigSerIP[2] == 0xFF && sutProductPara.ConfigSerIP[3] == 0xFF) || sutProductPara.ConfigSerPort == 0xFFFF) { ResetCip(); } saveType=1;//两个区都保存为:sutProductPara SlwTrace(INF, "[6]Ver-Changed",1); } //} //检测GPS上传定位参数索引是否合法 if(sutProductPara.m_GPS_TimeIndex >= sizeof(GPS_TimeTable)) { sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; saveType=1; } GpsTimeUpdate(); if(sutProductPara.Ipselect>1){ sutProductPara.Ipselect=0; saveType=1; } if(sutProductPara.GIPSelect>1){ sutProductPara.GIPSelect=0; saveType=1; } if(sutProductPara.SwitchGIPFlag > 1){ sutProductPara.SwitchGIPFlag=0; saveType=1; } if(sutProductPara.SwitchIpFlag > 1){ sutProductPara.SwitchIpFlag=0; saveType=1; } //执行参数保存 switch(saveType) { case 1://两个区都保存为:sutProductPara case 2://仅保存:backupPara case 3://仅保存:sutProductPara snprintf(buf, sizeof(buf), "READ_PARA_%d",saveType); SaveProductParaToFlash(buf); break; default:break; } SlwTrace(INF, "ParaRead_Done",1); printf("APN_INDEX:%d\r\n",sutProductPara.APNIndex); } #else void ReadProductParaFromFlash(void) { unsigned char Rand; unsigned char needSaveFlag; needSaveFlag = 0; Rand=GetRandBySTM32ID(); ReadFlashData(MAIN_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA)); if(MCU_FLAG!=sutProductPara.McuFlag || Rand!=sutProductPara.Rand \ || 0!=strcmp(sutProductPara.ProductName,PRODUCT_NAME)){ SlwTrace(INF,"Reset Config Param!",1); memset((unsigned char *)&sutProductPara,0,sizeof(SUT_PRODUCT_PARA)); sutProductPara.McuFlag=MCU_FLAG; //MCU标识 sutProductPara.IapFlag=0x88; //IAP标志 0x00--无应用程序 0x55--需要空中升级 0x88--正常运行应用程序 sutProductPara.ModemType=MODEM_TYPE; sutProductPara.GpsType=GPS_TYPE; sutProductPara.g_net=0; sutProductPara.Rand=GetRandBySTM32ID(); //伪随机数,此数值和STM32硬件ID关联,每个不同的IC数值将不同 sutProductPara.FoTaServerSel=0;//FOTA服务器选择 0--POC Server 1--GPS Server strcpy(sutProductPara.ProductName,PRODUCT_NAME); sutProductPara.ProductVersion=PRODUCT_VERSION; sutProductPara.PocPort=POC_SERVER_PORT; sutProductPara.GpsPort=TSGPS_SERVER_PORT; sutProductPara.FoTaPort=FOTA_SERVER_PORT; sutProductPara.PSN=150000000;//未写号情况下PSN为150000000 strcpy(sutProductPara.PIP,POC_SERVER_IP); strcpy(sutProductPara.GIP,GPS_SERVER_IP); strcpy(sutProductPara.MEID,"00000000000000"); //14位 最后一位为0 strcpy(sutProductPara.APNApn, APN_APN); strcpy(sutProductPara.APNName,APN_NAME); strcpy(sutProductPara.APNPass,APN_PASSWORD); sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; sutProductPara.ManagerIP[0] = DEFAULT_LOAD_IP0; sutProductPara.ManagerIP[1] = DEFAULT_LOAD_IP1; sutProductPara.ManagerIP[2] = DEFAULT_LOAD_IP2; sutProductPara.ManagerIP[3] = DEFAULT_LOAD_IP3; sutProductPara.ManagerPort = DEFAULT_LOAD_PORT; /////////////////////////////////////////// sutProductPara.ConfigSerIP[0] = DEFAULT_CONFIG_IP0; sutProductPara.ConfigSerIP[1] = DEFAULT_CONFIG_IP1; sutProductPara.ConfigSerIP[2] = DEFAULT_CONFIG_IP2; sutProductPara.ConfigSerIP[3] = DEFAULT_CONFIG_IP3; sutProductPara.ConfigSerPort = DEFAULT_CONFIG_PORT; strcpy(sutProductPara.APNApn, APN_APN); sutProductPara.ApnParaIndex=0;//默认使用资源文件中的第一个APN needSaveFlag=1; } else if(PRODUCT_VERSION!=sutProductPara.ProductVersion){ sutProductPara.ProductVersion=PRODUCT_VERSION; //Note V519:Version change //1.1 GPS upload time --> 15 seconds sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; //2.2 LCD back light no need to set here, it will reset in maintask init if LCD file changed /////////////////////////// if((sutProductPara.ManagerIP[0] == 0xFF && sutProductPara.ManagerIP[1] == 0xFF && sutProductPara.ManagerIP[2] == 0xFF && sutProductPara.ManagerIP[3] == 0xFF) || sutProductPara.ManagerPort == 0xFFFF) { sutProductPara.ManagerIP[0] = DEFAULT_LOAD_IP0; sutProductPara.ManagerIP[1] = DEFAULT_LOAD_IP1; sutProductPara.ManagerIP[2] = DEFAULT_LOAD_IP2; sutProductPara.ManagerIP[3] = DEFAULT_LOAD_IP3; sutProductPara.ManagerPort = DEFAULT_LOAD_PORT; } if((sutProductPara.ConfigSerIP[0] == 0xFF && sutProductPara.ConfigSerIP[1] == 0xFF && sutProductPara.ConfigSerIP[2] == 0xFF && sutProductPara.ConfigSerIP[3] == 0xFF) || sutProductPara.ConfigSerPort == 0xFFFF) { sutProductPara.ConfigSerIP[0] = DEFAULT_CONFIG_IP0; sutProductPara.ConfigSerIP[1] = DEFAULT_CONFIG_IP1; sutProductPara.ConfigSerIP[2] = DEFAULT_CONFIG_IP2; sutProductPara.ConfigSerIP[3] = DEFAULT_CONFIG_IP3; sutProductPara.ConfigSerPort = DEFAULT_CONFIG_PORT; } needSaveFlag=1; } if(sutProductPara.m_GPS_TimeIndex >= sizeof(GPS_TimeTable)) { sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; needSaveFlag=1; } GpsTimeUpdate(); sutPocStatus.LoginStatus = 0; if(needSaveFlag) SaveProductParaToFlash(); //////////////////////////////// //sutProductPara.PSN=166000013; } #endif void GpsTimeUpdate(void) { sutGpsInfo.GPS_UploadTime = GPS_TimeTable[sutProductPara.m_GPS_TimeIndex];//20160825,这里再加载GPS时间,用户体验:在改了GPS值后,重启没放卡,去菜单看说GPS值没改到 if(sutGpsInfo.GPS_UploadTime)//判断GPS是否已关,根据上传时间来算 { GPS_PWREN_HIGH; g_uiGpsStat=1; } else{ GPS_PWREN_LOW; g_uiGpsStat=0; //sutGpsInfo.isGpsWork=0; } } /************************************file begin*******************************/