/******************************************************************************** * 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; unsigned char HardRevision[40]; //读取指定地址的半字(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=(FLASH_BASE+STM32_FLASH_SIZE*1024)))return;//非法地址 if(WriteAddr&0x0000003ff){ printf("addr ---erro\r\n"); return;//非页首地址 } FLASH_Unlock(); //解锁 FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_WaitForLastBank1Operation(0xffffff); //FLASH->CR&= ~0x00000080; //FLASH->CR|= 0x00000080; status=1; printf("status1=%d\r\n",status); status=FLASH_ErasePage(WriteAddr);//擦除这个扇区 printf("status2=%d\r\n",status); if(status!=FLASH_COMPLETE){ //tsk_unlock(); printf("erase erro-----%d\r\n",status); FLASH_Lock(); return; } // //写入 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); } FLASH_Lock();//上锁 //tsk_unlock(); } /********************************************************************************************************** ************************************************************************************************************/ 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; } } /********************************************************************************************************** SaveProductParaToFlash ************************************************************************************************************/ void SaveProductParaToFlash(char *recoreInfo) { static char *p="123456789"; // 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(BACKUP_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA)); DelayMs(100); WritePageData(MAIN_CONFIG_ADDR,(unsigned char *)&sutProductPara,sizeof(SUT_PRODUCT_PARA)); //PWR_EN_LOW; } /******************************************************************** *SaveParaToFlash 将sutNetPara重要参数保存到FLASH *********************************************************************/ //主参数区: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) { SlwTrace(INF, "[1]Rst all para!",1); memset((unsigned char *)&sutProductPara,0,sizeof(SUT_PRODUCT_PARA)); sutProductPara.McuFlag =MCU_FLAG; //MCU标识 sutProductPara.IapFlag =0x88; //IAP标志 0x00--无应用程序 0x55--需要空中升级 0x88--正常运行应用程序 strcpy(sutProductPara.ProductName,PRODUCT_NAME); sutProductPara.ProductVersion=PRODUCT_VERSION; sutProductPara.PocPort =POC_SERVER_PORT; sutProductPara.GpsPort =TSGPS_SERVER_PORT; sutProductPara.PSN =MIN_PSN_NUM;//未写号情况下PSN为150000000 sutProductPara.g_net=0; //网模自动 strcpy(sutProductPara.PIP,POC_SERVER_IP); strcpy(sutProductPara.GIP,GPS_SERVER_IP); strcpy(sutProductPara.APNApn, APN_APN); strcpy(sutProductPara.APNName,APN_NAME); strcpy(sutProductPara.APNPass,APN_PASSWORD); sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX; strcpy(sutProductPara.Net_Mode,NET_MODE); //4G strcpy(sutProductPara.Language,LANGUAGE); //CN strcpy(sutProductPara.Local,LOCAL); //CN strcpy(sutProductPara.Channel,MODECHANNEL); //channel strcpy(sutProductPara.IMEI,"00000000000000"); //14位 最后一位为0 strcpy(sutProductPara.Keysound,KEY_SOUND); sutProductPara.SendToneEnadble=1; sutProductPara.RecvToneEnadble=1; sutProductPara.PromptToneEnable=1; sutProductPara.FastInterface=0; sutProductPara.Aw8735=0; sutProductPara.Netmode=0; sutProductPara.LowConsumption=0; sutProductPara.LCDSetIndex=0; strcpy(sutProductPara.APNApn, APN_APN); sutProductPara.APNIndex=0;//默认使用资源文件中的第一个APN sutProductPara.VolLv=8; //然后保存参数 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.APNIndex=0;//默认使用资源文件中的第一个APN sutProductPara.ProductVersion=PRODUCT_VERSION; strcpy(sutProductPara.Keysound,KEY_SOUND); //1.1 GPS upload time --> 15 seconds sutProductPara.m_GPS_TimeIndex = DEFAULT_GPS_SEND_TIME_INDEX;//恢复GPS默认上传时间 sutProductPara.FastInterface=0; sutProductPara.Aw8735=0; sutProductPara.Netmode=0; sutProductPara.LowConsumption=0; sutProductPara.LCDSetIndex=0; 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; } if(sutProductPara.SendToneEnadble>1) { sutProductPara.SendToneEnadble=1; saveType=1; } if(sutProductPara.RecvToneEnadble>1) { sutProductPara.RecvToneEnadble=1; saveType=1; } if(sutProductPara.PromptToneEnable>1) { sutProductPara.PromptToneEnable=1; saveType=1; } if(sutProductPara.FastInterface>2) { sutProductPara.SendToneEnadble=0; saveType=1; } if(sutProductPara.Aw8735>1) { sutProductPara.Aw8735=0; saveType=1; } if(sutProductPara.Netmode>3) { sutProductPara.Netmode=0; saveType=1; } if(sutProductPara.LowConsumption>1) { sutProductPara.LowConsumption=0; saveType=1; } if(sutProductPara.LCDSetIndex>4) { sutProductPara.LCDSetIndex=0; saveType=1; } if(sutProductPara.VolLv>11){ sutProductPara.VolLv=11; } // GpsTimeUpdate(); //执行参数保存 switch(saveType) { case 1://两个区都保存为:sutProductPara case 2://仅保存:backupPara case 3://仅保存:sutProductPara snprintf(buf, sizeof(buf), "READ_PARA_%d",saveType); printf("%s\r\n",buf); SaveProductParaToFlash(buf); break; default:break; } //soc ID替代IMEI if(GetUniStringByID(sutProductPara.HARDID)==1){ snprintf(buf, sizeof(buf), "[01]hardID:%s\r\n", sutProductPara.HARDID); SlwTrace(INF, buf,1); } SlwTrace(INF, "ParaRead_Done\r\n",1); printf("APN_INDEX:%d\r\n",sutProductPara.APNIndex); } 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*******************************/