Esempio n. 1
0
void DF_EraseAppFile_Area(void)
{
    u16 i=0;
      /*
           1.先擦除0扇区   
           2.读出page48内容并将其写到第0扇区的page 0 
           3.读出page49内容并将其写到第0扇区的page 0
           4.擦除 6-38扇区 即 48page 到 304 page
           5.以后有数据过来就直接写入,不需要再擦除了 
        */
	
        SST25V_SectorErase_4KByte(0x0);
 	 DF_delay_ms(5);   
	 WatchDog_Feed();
       DF_ReadFlash(48,0,SST25Temp,PageSIZE);
	//DF_delay_ms(1);	 
        DF_WriteFlashDirect(0,0,SST25Temp,PageSIZE);
	 DF_delay_ms(1);	
	 WatchDog_Feed();
        DF_ReadFlash(49,0,SST25Temp,PageSIZE);
        DF_WriteFlashDirect(1,0,SST25Temp,PageSIZE);
	 DF_delay_ms(1);		
        for(i=6;i<134;i++)    // 要求是512K -> 128  erase sector 6-134      128K ->  32   
        {
            WatchDog_Feed();
            SST25V_SectorErase_4KByte(((u32)i*4096));
	     DF_delay_ms(5); 
	     WatchDog_Feed();		
        }
        DF_ReadFlash(0,0,SST25Temp,PageSIZE);
        DF_WriteFlashDirect(48,0,SST25Temp,PageSIZE); 
	 WatchDog_Feed();	
	 DF_delay_ms(1);		
        DF_ReadFlash(1,0,SST25Temp,PageSIZE);
	 WatchDog_Feed(); 	
        DF_WriteFlashDirect(49,0,SST25Temp,PageSIZE);
        rt_kprintf("\r\nSST25Ready\r\n"); 

}
Esempio n. 2
0
void MediaIndex_Init(void)  
{
   u8 i=0;
   
   memset((u8*)&MediaIndex,0,sizeof(MediaIndex)); 
   
   for(i=0;i<8;i++)
   {
     MediaIndex.ID=i+1;
	if(i==0)
     {
       MediaIndex.Type=0;
	   memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName));
	   memcpy(MediaIndex.FileName,"pic.jpg",7);
       DF_WriteFlashSector(DF_PicIndex_Page,0,(u8*)&MediaIndex,sizeof(MediaIndex));  
	   DF_delay_ms(50);
	   MediaIndex.Type=1;
	   memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName));
	   memcpy(MediaIndex.FileName,"sound.wav",9);
       DF_WriteFlashSector(DF_SoundIndex_Page,0,(u8*)&MediaIndex,sizeof(MediaIndex));  
	   DF_delay_ms(50);
	 }  
	else 
     {
       MediaIndex.Type=0;
	   memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName));
	   memcpy(MediaIndex.FileName,"pic.jpg",7);
       DF_WriteFlashDirect(DF_PicIndex_Page+i, 0,(u8*)&MediaIndex, sizeof(MediaIndex));    
       DF_delay_ms(10);    
	   MediaIndex.Type=1;
	   memset(MediaIndex.FileName,0,sizeof(MediaIndex.FileName));
	   memcpy(MediaIndex.FileName,"sound.wav",9);
       DF_WriteFlashDirect(DF_SoundIndex_Page+i,0,(u8*)&MediaIndex,sizeof(MediaIndex));      
	   DF_delay_ms(10);
	 }  
   }
}
Esempio n. 3
0
u8 Save_PerSecContent(u32 In_wr,u8 *content ,u16 saveLen)
{
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr=0;   //页内 地址偏移 
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page 
  
     pageoffset=(u32)(In_wr/7);                // 计算出 Page 偏移  除以7 
     InPageoffset=In_wr-(u32)(pageoffset*7);   // 计算出 页内偏移地址 
     InPageAddr=(u16)(InPageoffset*70);           // 计算出页内 字节   乘以 70 (每个记录70个字节)    
     if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Block  1Block=8Page  
     {
	  SST25V_SectorErase_4KByte((pageoffset+AvrgSpdSec_offset)*PageSIZE);	  // erase Sector 
	  mDelaymS(50);   
	  // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
      DF_ReadFlash(pageoffset+AvrgSpdSec_offset,InPageAddr,reg,1);
      DF_delay_us(10);
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
	   	{
	   	  In_wr++; 
		  AvrgSpdPerSec_write++;		  
		  if(AvrgSpdPerSec_write>=Max_SPDerSec) 
			   AvrgSpdPerSec_write=0;   
//		  rt_kprintf("\r\n    *******  每秒钟速度 写区域 Write area : %d  In_wr=%d  is   Dirity!  \r\n",AvrgSpdPerSec_write,In_wr);  
          //--------------------------
		  	 return false;
	   	}       
  //   3. Write Record Content 
     DF_WriteFlashDirect(pageoffset+AvrgSpdSec_offset,InPageAddr,content,saveLen);  //   写入信息
     DF_delay_ms(10);
	// rt_kprintf("\r\n Write PerMit Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",AverageSpdStart_offset,pageoffset,InPageoffset); 
     return true; 
  //-------------------------------------------------------------------------------------------- 
}
Esempio n. 4
0
//-----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------
u8 Save_DrvRecoder(u32 In_write,u8 *content ,u16 saveLen) 
{
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移 
    u16  InPageAddr=0;   //页内 地址偏移 
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page 
  
     pageoffset=(u32)(In_write>>1);                // 计算出 Page 偏移  除以2  
     InPageoffset=In_write-(u32)(pageoffset<<1);   // 计算出 页内偏移地址 
     InPageAddr=(u16)(InPageoffset<<8);           // 计算出页内 字节   乘以 256 (每个记录256个字节)  206(content)+1(FCS)
     if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Sector  1Sector=8 Page  
     {
        SST25V_SectorErase_4KByte((pageoffset+VehicleRecStart_offset)*PageSIZE);      // erase Sector	
        DF_delay_ms(70);
		// rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
        DF_ReadFlash(pageoffset+VehicleRecStart_offset,InPageAddr,reg,1); 
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址跳到下一个
	   	{
          In_write++;
		  Recorder_write++;		  
		  if(Recorder_write>=Max_RecoderNum)  
			   Recorder_write=0;  
		 // rt_kprintf("\r\n    *******   行车记录仪写区域 Write area : %d   is   Dirity!  \r\n",In_write);  
		  return false;
	   	}       
  //   3. Write Record Content 
     DF_WriteFlashDirect(pageoffset+VehicleRecStart_offset,InPageAddr,content,saveLen);  //   写入信息
     DF_delay_ms(8); 
	// rt_kprintf("\r\n DrvRec Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); 
		return true; 
  //-------------------------------------------------------------------------------------------- 
}
Esempio n. 5
0
u8 Save_MintPosition(u32 In_write,u8 *content ,u16 saveLen)
{    // 记录单位小时内每分钟的位置信息
	/*
	   NOTE : Flash  1 page = 512 Bytes  ; 1 Record = 32 Bytes ;  1page= 16 Records   1Sector=8Page=128Records
	*/
    u32  pageoffset=0;   //Page 偏移
	u8   reg[1]={0};
  //----------------------------------------------------------------------------------------------
  //   1. Judge  Whether  needs to Erase page     每条记录512个字节
  
     pageoffset=In_write;                // 计算出 Page 偏移  除以4  
        // 计算出 页内偏移地址 0
        // 计算出页内 字节   乘以 512 (每个记录512个字节)  485(content)+1(FCS)
     if((pageoffset%8)==0)  // 判断是否需要擦除Block  被移除到下一个Block  1Block=8 Page  
     {
	  SST25V_SectorErase_4KByte((pageoffset+AvrgMintPosit_offset)*PageSIZE);	  // erase Sector 
	  DF_delay_ms(50);
	  // rt_kprintf("\r\n Erase Cycle Block : %d\r\n",(pageoffset>>6));   
	 }
  //	   2. Filter write  area    
       DF_ReadFlash(pageoffset+AvrgMintPosit_offset,0,reg,1); 
	   if(reg[0]!=0xff)  // 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
	   	{
          In_write++;
		  AvrgMintPosit_write++;		  
		  if(AvrgMintPosit_write>=Max_MintPos) 
			   AvrgMintPosit_write=0;  
		 // rt_kprintf("\r\n    *******   行车记录仪写区域 Write area : %d   is   Dirity!  \r\n",In_write);  
		  //----------------------------
		  	return  false;
	   	}       
  //   3. Write Record Content 
       DF_WriteFlashDirect(pageoffset+AvrgMintPosit_offset,0,content,saveLen);  //   写入信息
       DF_delay_ms(10);
	// rt_kprintf("\r\n DrvRec Starpageoffset=%d  PageOffset= %d ,  InPageAddr= %d \r\n",VehicleRecStart_offset,pageoffset,InPageoffset); 
     return true; 
  //-------------------------------------------------------------------------------------------- 
}
Esempio n. 6
0
u8 Rx_data_save(u8 *str)
{
	u8 temp[4];
	u8 trans[256];
	u8 len =0;
	u32 i= 0;
	u32 test_head=0;
	memset(trans,0,256);
	memset(temp,0,4);
	
	for(i=0;i<16*512;i=i+256)
	{
	    if(i>=8*512)
	    {
	    	//下半部分显示时候显示上半部分
	    	SST25V_SectorErase_4KByte((8*(((u32)DF_BD_data_rx+8)/8))*PageSIZE);
			//Erase_flag =Top_15;
	    }
		if(i>=16*512)//保证随时都有可以写的空间
		{
		    i=0;//从新遍历
			//擦除上半部分显示下半部分
			SST25V_SectorErase_4KByte((8*((u32)DF_BD_data_rx/8))*PageSIZE);	
			//Erase_flag = After_15;
			rt_kprintf("erase the 8016-8023\r\n");
		}
		DF_ReadFlash(DF_BD_data_rx,i,temp,4);
		
		test_head = (temp[0]<<24)+(temp[1]<<16)+(temp[2]<<8)+temp[3];
		//rt_kprintf(" %d--%d--%d--%d--%d--%x\r\n",temp[0],temp[1],temp[2],temp[3],i,test_head);
		if(test_head==Max_value)
		{
	
			test_head = find_max_id(DF_BD_data_rx)+1;//最大ID自加1
		    //找出上一个ID值
	    	trans[0]=test_head>>24;
			trans[1]=(test_head>>16)&0xff;
			trans[2]=(test_head>>8)&0xff;
			trans[3]=test_head&0xff;
			len =(((str[16]<<8)+str[17])/8);
			//rt_kprintf("收到电文长度---%d",len);
			len =len+8;//根据协议加上7个字节(信息类别到电文长度)
		    trans[4] =len+4+6+1;//+4是加上计数+1长度+是时间长度=总长

			if(UDP_dataPacket_flag==0x02)
			{
				trans[5]=Temp_Gps_Gprs.Date[0];
				trans[6]=Temp_Gps_Gprs.Date[1];
				trans[7]=Temp_Gps_Gprs.Date[2]; 

				trans[8]=Temp_Gps_Gprs.Time[0]; 
				trans[9]=Temp_Gps_Gprs.Time[1]; 
				trans[10]=Temp_Gps_Gprs.Time[2]; 
			}
			else
			{
				time_now=Get_RTC(); 

				trans[5]= time_now.year;
				trans[6]= time_now.month;
				trans[7]= time_now.day;

				trans[8]= time_now.hour;
				trans[9]= time_now.min;
				trans[10]= time_now.sec;
			}
			/*
		    trans[5]=(((Gps_Gprs.Date[0])/10)<<4)+((Gps_Gprs.Date[0])%10);		
			trans[6]=((Gps_Gprs.Date[1]/10)<<4)+(Gps_Gprs.Date[1]%10); 
			trans[7]=((Gps_Gprs.Date[2]/10)<<4)+(Gps_Gprs.Date[2]%10);
			trans[8]=((Gps_Gprs.Time[0]/10)<<4)+(Gps_Gprs.Time[0]%10);
			trans[9]=((Gps_Gprs.Time[1]/10)<<4)+(Gps_Gprs.Time[1]%10);
			trans[10]=((Gps_Gprs.Time[2]/10)<<4)+(Gps_Gprs.Time[2]%10);	
			*/
			OutPrint_HEX("Time", trans+5, 6);//wxg_test
		    if(trans[4]>=256)
		    {
		    rt_kprintf("-------接收数据有误-----\r\n");
			return RT_ERROR;
		    }
			memcpy(trans+11,str+10,len);//将信息内容拷贝
			
			DF_WriteFlashDirect(DF_BD_data_rx,i,trans,trans[4]);
			//OutPrint_HEX("saved", trans, trans[4]);//wxg_test
			memset(temp,0,4);//清零
			return RT_EOK;
		}
			
	}
Esempio n. 7
0
         u8 Api_DFdirectory_Write(u8 *name,u8 *buffer, u16 len) 
         {
		 
               if(strcmp((const char*)name,spdpermin)==0)
		  {
		            Save_PerMinContent(AvrgSpdPerMin_write,buffer, len);
			     //-----  Record update----		
			  AvrgSpdPerMin_write++;
			  if(AvrgSpdPerMin_write>=Max_SPDSperMin)
			     AvrgSpdPerMin_write=0;
			  DF_Write_RecordAdd(AvrgSpdPerMin_write, AvrgSpdPerMin_write, TYPE_AvrgSpdAdd);   
			     //----------------------	 
			return true;	 
               }
		 if(strcmp((const char*)name,spd_warn)==0) 
		{
			   Common_WriteContent( ExpSpdRec_write, buffer, len, TYPE_ExpSpdAdd);    
			   //-----  Record update----	
			  ExpSpdRec_write++;
			  if(ExpSpdRec_write>=Max_SPDSperMin)
			      ExpSpdRec_write=0;
	                DF_Write_RecordAdd(ExpSpdRec_write, ExpSpdRec_write, TYPE_ExpSpdAdd); 	  
			  //-----  Record update----	
			   return true;
               }
                if(strcmp((const char*)name,tired_warn)==0) 
		 {
			   Common_WriteContent( TiredDrv_write, buffer, len,  TYPE_TiredDrvAdd);      
			   //-----  Record update----	
			  TiredDrv_write++;
			  if(TiredDrv_write>=Max_CommonNum)  
			  	TiredDrv_write=0;			  
			  DF_delay_us(10);
			  DF_Write_RecordAdd(TiredDrv_write,TiredDrv_read,TYPE_TiredDrvAdd);   
			  //-------------------------
			  return  true;
                }
				
		 if(strcmp((const char*)name,doubt_data)==0)
		{ 
		       Save_DrvRecoder(Recorder_write, buffer, len );   
			//-----  Record update----	    
			   Recorder_write++; 
			   if(Recorder_write>=Max_RecoderNum)  
			   	 Recorder_write=0;
			   DF_Write_RecordAdd(Recorder_write,Recorder_Read,TYPE_VechRecordAdd); 	
		       //-------------------------		   
			return true;
               }	
		 //------- MultiMedia   RAW  data  ---------
		 if(strcmp((const char*)name,voice)==0)
		{
	            DF_WriteFlashDirect(SoundStart_offdet+Dev_Voice.Voice_PageCounter,0,Dev_Voice.Voice_Reg,500);  
                   return true;
		 }
		if(strcmp((const char*)name,camera_1)==0)
		{
                     DF_WriteFlashDirect(pic_current_page,0,buffer, len);
			return true;		 
               }
		if(strcmp((const char*)name,camera_2)==0)
		{
                     DF_WriteFlashDirect(pic_current_page,0,buffer, len);
			return true;		 
               }
		if(strcmp((const char*)name,camera_3)==0)
		{
                      DF_WriteFlashDirect(pic_current_page,0,buffer, len);
			return true;		  
               }
	       if(strcmp((const char*)name,camera_4)==0)
		{
                      DF_WriteFlashDirect(pic_current_page,0,buffer, len); 
			return true;		  
               }	 
		
              return false;
         }
Esempio n. 8
0
u8  Common_WriteContent(u32 In_write,u8 *content ,u16 saveLen, u8 Type) 
{
  //-----------------------------------------------------
  u8     reg[1];
  //u8   regStr[25];   
  //-----------------------------------------------------
    u32  pageoffset=0;   //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr=0;   //页内 地址偏移 
	u32  Start_offset=0; 

   //--------------------------------------------------	
    //memset(regStr,0,sizeof(regStr)); 
  //  1.   Classify
    switch(Type)
    {
	
		case TYPE_TiredDrvAdd:
							 Start_offset=TiredDrvStart_offset;
							// memcpy(regStr,"疲劳驾驶",25);
							 break;
		case TYPE_ExpSpdAdd:
							 Start_offset=ExpSpdStart_offset;
							// memcpy(regStr,"超速报警",25);
							 break; 					 
		case TYPE_ErrorLogAdd:
							 Start_offset=AbNormalStart_offset;
							 //memcpy(regStr,"异常LOG",25); 
							 break; 
		case TYPE_LogInAdd:
							 Start_offset=LogIn_offset; 
							// memcpy(regStr,"登录记录",25);   
							 break; 
		case TYPE_SettingChgAdd:
							 Start_offset=SettingChg_offset;    
							 //memcpy(regStr,"参数修改",25);       
							 break; 					 
		default :
							 return false;		  					 
    }
	//----------------------------------------------------------------------------------------------
	//	 2. caculate address 
	 
		pageoffset=(u32)(In_write>>4);				 // 计算出 Page 偏移  除以16  
		InPageoffset=In_write-(u32)(pageoffset<<4);	 // 计算出 页内偏移地址 
		InPageAddr=(u16)(InPageoffset<<5);			 // 计算出页内 字节   乘以 32 (每个记录32个字节)
		if(((pageoffset%8)==0)&&(InPageoffset==0))  // 判断是否需要擦除Block  被移除到下一个Block	1Block=8Page  
		{
        SST25V_SectorErase_4KByte((pageoffset+Start_offset)*PageSIZE);      // erase Sector	
        DF_delay_ms(70);
		//  rt_kprintf("\r\n Common --- Erase Cycle Block : %d\r\n",(pageoffset>>6));    
		}
	 // 	  2. Filter write  area    
		DF_ReadFlash(pageoffset+Start_offset,InPageAddr,reg,1); 
		  if(reg[0]!=0xff)	// 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
		   {
			 In_write++;
			 if(In_write>=Max_CommonNum)
				  In_write=0;  
			         // rt_kprintf("\r\n	 *******   Common 写区域 Write area : %d	is	 Dirity!  \r\n",In_write);  
				 return false;
		   }	   
	 //   3. Write Record Content 
        DF_WriteFlashDirect(pageoffset+Start_offset,InPageAddr,content,saveLen);  //   写入信息
		DF_delay_ms(10);
		//rt_kprintf("\r\n Common Starpageoffset=%d	PageOffset= %d ,  InPageAddr= %d  TYPE= %s \r\n",CycleStart_offset,pageoffset,InPageoffset,regStr);  

     //   4. end  
        switch(Type) 
    {
	
		case TYPE_TiredDrvAdd:							 
							 TiredDrv_write=In_write;
							 break;
		case TYPE_ExpSpdAdd:
							 ExpSpdRec_write=In_write;
							 break; 					 
		case TYPE_AvrgSpdAdd:
							 AvrgSpdPerMin_write=In_write;
							 break;
		case TYPE_ErrorLogAdd:
							 ErrorLog_write=In_write;  
							 break; 
		case TYPE_LogInAdd:
							 Login_write=In_write;
							 break; 
		case TYPE_SettingChgAdd:
							 Settingchg_write=In_write;     
							 break; 					 
		default :
							 return false;	 						 
    }

	return true; 
	     	     
}
Esempio n. 9
0
/*更新北斗线程,接收调试串口来的数据,透传到gps串口中*/
void thread_usb_update( void* parameter )
{
rt_uint16_t i=0;

#define READ_PACKET_SIZE 1012

	void		( *msg )( void *p );
	int			fd = -1, count = 0;
	//rt_uint8_t	*pdata;             /*数据*/
	rt_err_t	res;
	rt_uint8_t  file_infor[20];
	rt_uint32_t file_datalen;       /*升级文件长度*/
	rt_uint16_t page,j;

	msg =(void (*)(void*)) parameter;

	ptr_read_packet= rt_malloc( 520 );
	if( ptr_read_packet == RT_NULL )
	{
	Exit_updata=0;
	check_error=1;
		msg( "E内存不足" );
		return;
	}
  //   1.  Lock DF and  Erase  File  Area
           DF_LOCK=1;
	    rt_thread_delay(2);
	    DF_EraseAppFile_Area();

	
/*查找U盘*/
      //--------------------------------------------------------------------------------
	while( 1 )
	{
		if( rt_device_find( "udisk" ) == RT_NULL ) /*没有找到*/
		{
			count++;
			if( count <= 10 )
			{
				msg( "I等待U盘插入" );
				
			}else
			{
				msg( "EU盘不存在" ); /*指示U盘不存在*/
				check_error=1;
				goto end_upgrade_usb_0;
			}
			rt_thread_delay( RT_TICK_PER_SECOND );
		}else
		{
			msg( "I查找升级文件" );
			break;
		}
	}
       
/*查找指定文件*/
	fd = open( "/udisk/UPDATE.TCB", O_RDONLY, 0 );
	if( fd >= 0 )
		msg( "I读取文件升级" );
	else
		{
		msg( "E升级文件不存在" );
		check_error=1;
		goto end_upgrade_usb_0;
		}
	file_datalen=0;//文件长度统计
	Updata_PacketNum=0;//升级进度指示 
	
      //-------------------------------------------------------------------------------
	while( 1 )
	{	
	    	rt_thread_delay(RT_TICK_PER_SECOND/2);
	res=0;
    res = read( fd, ptr_read_packet,514 );
	memcpy(fetch_data_514,ptr_read_packet,514);
	if(res<0)
		{
		msg("E读取文件出错");
		check_error=1;
		goto end_upgrade_usb_1;
		}
	else if( res == 514 )               /*判断是否为最后一包*/
		{
		Updata_PacketNum++;
		page=(((u16)fetch_data_514[0])<<8)+((u16)fetch_data_514[1]);
		file_datalen+=res;
           rt_kprintf("\r\n读取的数据page=%d,file_datalen=%d   ",page,file_datalen);
	    for(j=0;j<10;j++)
			rt_kprintf(" %2X",fetch_data_514[j]);
		rt_kprintf("\r\n");
		
		WatchDog_Feed();
		
		if(page==50)
			{
			  //-------- Version Type judge------
                     if(Update_HardSoft_Version_Judge(fetch_data_514+2)==false)   // +2 是内容
                      {
                         msg( "E固件类型不匹配" );
                        goto end_upgrade_usb_1;
			 }
			
			DF_WriteFlashDirect(50,0,&fetch_data_514[2],512);
			DF_ReadFlash(50,0,read_data_514,512);
			for(i=0;i<512;i++)
				{
				if(read_data_514[i]!=fetch_data_514[i+2])
					rt_kprintf("\r\n page=%d,i=%d,write=%X,read=%X",page,i,fetch_data_514[i+2],read_data_514[i]);
				}
			
			msg( "I文件升级完成" );
		    rt_kprintf("文件长度 = %d",file_datalen);
			DF_LOCK=0;
			goto end_upgrade_usb_1;
			}
		else
			{
			if(page%8==0)
				DF_WriteFlashSector(page,0,&fetch_data_514[2],512);
			else
				DF_WriteFlashDirect(page,0,&fetch_data_514[2],512);
			rt_thread_delay(3);
	       //---------- 下载内容比较判断 -----------------------------------------------		
			DF_ReadFlash(page,0,read_data_514,512);
			for(i=0;i<512;i++)
				{
				if(read_data_514[i]!=fetch_data_514[i+2])
					{
					      rt_kprintf("\r\n page=%d,i=%d,write=%X,read=%X",page,i,fetch_data_514[i+2],read_data_514[i]);
                    msg( "E写入文件错误" );
					check_error=1;
					      goto end_upgrade_usb_1; 
				       } 
				}
		//--------------------------------------------------------------------------	
			sprintf((char *)file_infor,"I升级第%d包",Updata_PacketNum);
			msg(file_infor);
			}
		}
	else
		{
		msg( "EU盘读取错误" );
		check_error=1;
		goto end_upgrade_usb_1;
		}	
	}
	//--------------------------------------------------------------------
end_upgrade_usb_1:
	if( fd >= 0 )
	{
		close( fd );
	}
end_upgrade_usb_0:
	Exit_updata=0;
	rt_free( ptr_read_packet);
	ptr_read_packet= RT_NULL; 
}
Esempio n. 10
0
//-----------------------------------------------------------------------------------------------------------
u8  Common_WriteContent(u32 In_write, u8 *content , u16 saveLen, u8 Type)
{
    //-----------------------------------------------------
    u8     reg[1];
    //u8   regStr[25];
    //-----------------------------------------------------
    u32  pageoffset = 0; //Page 偏移
    u32  InPageoffset;   //页内Record偏移
    u16  InPageAddr = 0; //页内 地址偏移
    u32  Start_offset = 0;

    //--------------------------------------------------
    //memset(regStr,0,sizeof(regStr));
    //  1.   Classify
    switch(Type)
    {

    case TYPE_ExpSpdAdd:
        Start_offset = ExpSpdStart_offset;
        // memcpy(regStr,"超速报警",25);
        break;
    default :
        return false;
    }
    //----------------------------------------------------------------------------------------------
    //	 2. caculate address

    pageoffset = (u32)(In_write >> 4);				 // 计算出 Page 偏移  除以16
    InPageoffset = In_write - (u32)(pageoffset << 4);	 // 计算出 页内偏移地址
    InPageAddr = (u16)(InPageoffset << 5);			 // 计算出页内 字节   乘以 32 (每个记录32个字节)
    if(((pageoffset % 8) == 0) && (InPageoffset == 0)) // 判断是否需要擦除Block  被移除到下一个Block	1Block=8Page
    {
        SST25V_SectorErase_4KByte((pageoffset + Start_offset)*PageSIZE);    // erase Sector
        DF_delay_ms(70);
    }
    // 	  2. Filter write  area
    DF_ReadFlash(pageoffset + Start_offset, InPageAddr, reg, 1);
    if(reg[0] != 0xff)	// 如果要写入的区域 dirty  ,则地址增然后从新开始寻找知道找到为止
    {
        In_write++;
        if(In_write >= Max_CommonNum)
            In_write = 0;
        return false;
    }
    //   3. Write Record Content
    DF_WriteFlashDirect(pageoffset + Start_offset, InPageAddr, content, saveLen); //   写入信息
    DF_delay_ms(10);

    //   4. end
    switch(Type)
    {

    case TYPE_ExpSpdAdd:
        ExpSpdRec_write = In_write;
        break;
    default :
        return false;
    }

    return true;

}
Esempio n. 11
0
void  Pic_Data_Process(void)
{
    u8  tmp[40];
    u8   pic_buf[600];
    u16 i = 0;

    DF_TAKE;
    // 1.    Judge   last  package
    PackageLen = _485_content_wr;
    if(PackageLen < PageSIZE)
        CameraState.last_package = 1;
    else if((CameraState.last_package == 0) && (_485_content[510] == 0xFF) && (_485_content[511] == 0xD9))
    {
        CameraState.last_package = 1;
    }
    //  2.    Block ++
    CameraState.block_counter++;
    //   3.    Check   first   packet
    if(CameraState.create_Flag == 1)  // 如果是第一包则创建文件 hhmmss_x.jpg
    {
        CameraState.create_Flag = 0; // clear
        memset(tmp, 0, sizeof(tmp));
        memset(PictureName, 0, sizeof(PictureName));
        //-----------  创建图片文件处理  -------------
        /*
         每张图片占32个page    其中第1个page 为图片索引,后边127个Page为图片内容
         SST25 开辟个区域做图片缓存
        */
        if(CameraState.Camera_Number == 1)
        {
            pic_current_page = PicStart_offset; //起始page 固定为缓存起始地址
            //擦除一个64K的区域用于图片存储

            Api_DFdirectory_Delete(camera_1);

        }
        else if(CameraState.Camera_Number == 2)
        {
            pic_current_page = PicStart_offset2; //起始page 固定为缓存起始地址
            //擦除一个64K的区域用于图片存储
            Api_DFdirectory_Delete(camera_2);
            ;
        }
        else if(CameraState.Camera_Number == 3)
        {
            pic_current_page = PicStart_offset3; //起始page 固定为缓存起始地址
            //擦除一个64K的区域用于图片存储
            Api_DFdirectory_Delete(camera_3);
        }
        else if(CameraState.Camera_Number == 4)
        {
            pic_current_page = PicStart_offset4; //起始page 固定为缓存起始地址
            //擦除一个64K的区域用于图片存储
            Api_DFdirectory_Delete(camera_4);
        }
        DF_delay_ms(150);
        WatchDog_Feed();
        pic_current_page++;  // 图片内容从 第二个page 开始 第一个Page 存储的是图片索引
        pic_PageIn_offset = 0; // 页内偏移清空
        pic_size = 0; // 清除图片大小
        //------------------------------------------
        memset(PictureName, 0, sizeof(PictureName));
		// sprintf((char*)PictureName,"0:%02d%02d%02d%02d%02d%02d-%d.jpg",time_now.year,time_now.month,time_now.day,time_now.hour,time_now.min,time_now.sec,CameraState.Camera_Number); 	
		sprintf((char*)PictureName,"%02d%02d%02d%02d%02d%02d-%d.jpg",time_now.year,time_now.month,time_now.day,time_now.hour,time_now.min,time_now.sec,CameraState.Camera_Number);	 
        if(GB19056.workstate == 0)
            rt_kprintf("\r\n              创建图片名称: %s \r\n           ", PictureName);
        WatchDog_Feed();


        WatchDog_Feed();
        // -----    写图片索引 -------
        Save_MediaIndex(0, PictureName, CameraState.Camera_Number, 0);
    }

    //  4.   填写存储图片内容数据  --------------------
    WatchDog_Feed();
    DF_WriteFlashDirect(pic_current_page, 0, _485_content, PackageLen); // 写一次一个Page 512Bytes
    delay_ms(150);

#ifdef TFCARD
    if(sd_ok)
        sd_writefile(PictureName, _485_content, PackageLen);
#endif
    //  rt_kprintf(" \r\n ---- pkg=%d  \r\n",CameraState.block_counter);

    //---  read compare
    memset(pic_buf, 0, 600);
    DF_ReadFlash(pic_current_page, 0, pic_buf, PackageLen);
    delay_ms(10);
    for(i = 0; i < PackageLen; i++)
    {
        if(pic_buf[i] != _485_content[i])
        {
            if(GB19056.workstate == 0)
                rt_kprintf(" \r\n write--read Error");
            // rt_kprintf(" \r\n ----read not equal write  where i=%d  Rd[i]=%2X  WR[i]=%2X \r\n",i,pic_buf[i],_485_content[i]);
            DF_WriteFlashDirect(pic_current_page, 0, _485_content, PackageLen); // 再写一次一个Page 512Bytes
            delay_ms(100);
            break;
        }
    }
    pic_size += PackageLen; // 图片大小累加
    pic_current_page++; //写一页加一
    // pic_PageIn_offset+=PackageLen;
    //  DF_delay_ms(50);
    //   5.   最后一包 ,即拍照结束
    if(CameraState.last_package == 1)
    {
        memset(_485_content, 0, sizeof(_485_content));
        _485_content_wr = 0;

        //-------------  图片拍照结束 相关处理  ------------------------------------
        //  1. 写图片索引
        if(CameraState.Camera_Number == 1)
            pic_current_page = PicStart_offset; //计算图片起始page
        else if(CameraState.Camera_Number == 2)
            pic_current_page = PicStart_offset2; //计算图片起始page
        else if(CameraState.Camera_Number == 3)
            pic_current_page = PicStart_offset3; //计算图片起始page
        else if(CameraState.Camera_Number == 4)
            pic_current_page = PicStart_offset4; //计算图片起始page
        PictureName[18] = CameraState.Camera_Number;
        memcpy(PictureName + 19, (u8 *)&pic_size, 4);
        DF_WriteFlashDirect(pic_current_page, 0, PictureName, 23);
        DF_delay_ms(8);

        //  5.1   更新图片读写记录
        //--------------------------------------------------------------------------
        if(GB19056.workstate == 0)
            rt_kprintf("\r\n        PicSize: %d Bytes\r\n    Camera  %d   End\r\n", pic_size, CameraState.Camera_Number);
        CameraState.SingleCamra_TakeResualt_BD = 0;	  //  单路摄像头拍照
        SD_ACKflag.f_BD_CentreTakeAck_0805H = 1; //  发送中心拍照命令应答
        //----------  Normal process ---------------------
        Camera_End(MultiTake.Taking);


        // 5.2   拍照完成后检查有没有多路 拍-----------Multi Take process--------------------
        if(1 == MultiTake.Taking)
        {
            switch(CameraState.Camera_Number)
            {
            case  1:
                //-------- old process---------------
                MultiTake.TakeResult[0] = Take_Success; // 表示第一路摄像头拍照失败
                //--------- new   process-------------
                MultiTake.Take_retry = 0;
                //-------------------------------------------
                if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
                    break;
                //----------拍照下一路摄像头-----------
                CameraState.Camera_Number = 2;
                //-------------------------
                Camera_Start(CameraState.Camera_Number);

                break;
            case  2:
                //-------- old process---------------
                MultiTake.TakeResult[1] = Take_Success; // 表示第一路摄像头拍照失败
                //--------- new   process-------------
                MultiTake.Take_retry = 0;
                //-------------------------------------------
                if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
                    break;
                //----------拍照下一路摄像头-----------
                CameraState.Camera_Number = 3;
                //-------------------------
                Camera_Start(CameraState.Camera_Number);

                break;
            case  3:
                //-------- old process---------------
                MultiTake.TakeResult[2] = Take_Success; // 表示第一路摄像头拍照失败
                //--------- new   process-------------
                MultiTake.Take_retry = 0;
                //-------------------------------------------
                if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
                    break;
                //----------拍照下一路摄像头-----------
                CameraState.Camera_Number = 4;
                //-------------------------
                Camera_Start(CameraState.Camera_Number);

                break;
            case  4:
                //-------- old process---------------
                MultiTake.TakeResult[3] = Take_Success; // 表示第一路摄像头拍照失败
                //--------- new   process-------------
                MultiTake.Take_retry = 0;

                //-------------------------------------------
                if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
                    break;

                break;
            default:
                MultiTake_End();
                break;

            }

        }
        else if((0 == MultiTake.Taking) && (0 == MultiTake.Transfering))
        {
            //------ 判断车门开关拍照是否上传状态 ------
            if((OpenDoor_StartTakeFlag == 1) && (Opendoor_transFLAG == 0))
            {
                MultiTake_End();   // 车门开关不上传
                OpenDoor_StartTakeFlag = 0;
            }
            else
            {
                //rt_kprintf("\r\n Single Camera !\r\n");
                if(CameraState.Camera_Take_not_trans == 0)
                    Photo_send_start(CameraState.Camera_Number);  //在不是多路拍照的情况下拍完就可以上传了
                else
                    CameraState.Camera_Take_not_trans = 0;
            }
        }
        //  拍照结束
    }
    else
    {

        //------- change state  -------
        CameraState.status = transfer;
        CameraState.OperateFlag = 0; // clear

        CameraState.TX_485const_Enable = 1; // 发送485 命令
        _485_RXstatus._485_receiveflag = IDLE_485;
        memset(_485_content, 0, sizeof(_485_content));
        _485_content_wr = 0;
        //rt_kprintf("\r\n  One Packet Over!\r\n");

    }
    DF_RELEASE;
}
Esempio n. 12
0
void  Pic_Data_Process(void) 
{
      u8  tmp[40]; 
      u8   pic_buf[600];
	    u16 i=0;
  

           // 1.    Judge   last  package  
            PackageLen=_485_content_wr;
             if(PackageLen<PageSIZE)
			  last_package=1;    	
	    else   
	      if((last_package==0)&&(_485_content[510]==0xFF)&&(_485_content[511]==0xD9))
		  {
		            last_package=1;        
		  }          
	   //  2.    Block ++	    
	      CameraState.block_counter++;
	  //   3.    Check   first   packet
            if(CameraState.create_Flag==1)    // 如果是第一包则创建文件 hhmmss_x.jpg
              {                  
                     CameraState.create_Flag=0; // clear 
					 memset(tmp,0,sizeof(tmp));
					 memset(PictureName,0,sizeof(PictureName));
					 //-----------  创建图片文件处理  -------------					 
					 /*
						 每张图片占32个page    其中第1个page 为图片索引,后边127个Page为图片内容	
						 SST25 开辟个区域做图片缓存 
					 */
                       DF_Read_RecordAdd(pic_write,pic_read,TYPE_PhotoAdd);					 
					 //pic_current_page=(pic_write<<5)+PicStart_offset; //计算图片起始page 
					if(Camera_Number==1) 
					{
					     pic_current_page=PicStart_offset; //起始page 固定为缓存起始地址
					     //擦除一个64K的区域用于图片存储  
					  
					     Api_DFdirectory_Delete(camera_1);
					  
					}
					else
					if(Camera_Number==2) 
					{
						 pic_current_page=PicStart_offset2; //起始page 固定为缓存起始地址
						 //擦除一个64K的区域用于图片存储  					   
					     Api_DFdirectory_Delete(camera_2);
					   ; 	 
					}	
					else
					if(Camera_Number==3) 
					{
						 pic_current_page=PicStart_offset3; //起始page 固定为缓存起始地址
						 //擦除一个64K的区域用于图片存储  
					     Api_DFdirectory_Delete(camera_3);   	 
					}
					else
					if(Camera_Number==4) 
					{
					     pic_current_page=PicStart_offset4; //起始page 固定为缓存起始地址
						 //擦除一个64K的区域用于图片存储  
					     Api_DFdirectory_Delete(camera_4); 	   
					}	
					 DF_delay_ms(150);  
					 WatchDog_Feed(); 
					 pic_current_page++;  // 图片内容从 第二个page 开始 第一个Page 存储的是图片索引 
					 pic_PageIn_offset=0; // 页内偏移清空 
					 pic_size=0; // 清除图片大小
					 //------------------------------------------					 
					 memset(PictureName,0,sizeof(PictureName));    
					 sprintf((char*)PictureName,"%d%d%d-%d.jpg",time_now.hour,time_now.min,time_now.sec,Camera_Number);  	
					 rt_kprintf("\r\n              创建图片名称: %s \r\n                  图片地址: %d ",PictureName,pic_write);   
					 WatchDog_Feed();  
        
		              //----- TF -------		         
				/*if(Udisk_Test_workState==1)	 	
		              {  
                               // creat_file(PictureName); //TF卡创建文件 
                                 rt_kprintf("\r\n   udisk  创建文件成功!");
                                 udisk_fd=open((const char*)PictureName, O_RDWR|O_CREAT, 0);  // 创建U 盘文件
                                 rt_kprintf(" \r\n udiskfile: %s  open res=%d   \r\n",PictureName, udisk_fd);  
		              }  */		              
				 WatchDog_Feed();         
                      // -----    写图片索引 -------
                      Save_MediaIndex(0,PictureName,Camera_Number,0);  					  
               	}  
			
	       //  4.   填写存储图片内容数据  --------------------		
	       WatchDog_Feed();  
		   DF_WriteFlashDirect(pic_current_page,0,_485_content, PackageLen);// 写一次一个Page 512Bytes
		   delay_ms(90);  
		   //rt_kprintf(" \r\n ---- write  pic_current_page=%d  \r\n",pic_current_page);   		   
		   rt_kprintf(" \r\n ---- packet=%d  \r\n",CameraState.block_counter);     
		  
                         //---  read compare 
		    memset(pic_buf,0,600);
		    DF_ReadFlash(pic_current_page,0,pic_buf, PackageLen);
			delay_ms(30);
		    for(i=0;i<PackageLen;i++)
		   {		if(pic_buf[i]!=_485_content[i])
		    	       {
		    	          rt_kprintf(" \r\n ----read not equal write  where i=%d  Rd[i]=%2X  WR[i]=%2X \r\n",i,pic_buf[i],_485_content[i]); 
						  DF_WriteFlashDirect(pic_current_page,0,_485_content, PackageLen);// 再写一次一个Page 512Bytes
		                  delay_ms(85);   
					      break;		  
		    	       }
		   }	 
                      //----- TF -------
		       /*       if((Udisk_Test_workState==1)&&(udisk_fd))
		              {
		                  fd_res=write(udisk_fd,_485_content, PackageLen);
	                         rt_kprintf("\r\n  wr--1 :%s  resualt=%d\r\n",PictureName,fd_res);	
				    if(fd_res<=0)
				        close(udisk_fd);
		              } 
		        */  
				   pic_size+=PackageLen;// 图片大小累加	 				   
				   pic_current_page++; //写一页加一
				  // pic_PageIn_offset+=PackageLen;  
				   DF_delay_ms(50);   
	   //   5.   最后一包 ,即拍照结束
		  if(last_package==1)
		 {
			   //f_close(&FileCameraIn);  //  拍照完成关闭图片文件
			   memset(_485_content,0,sizeof(_485_content)); 
			   _485_content_wr=0;			  

			   //-------------  图片拍照结束 相关处理  ------------------------------------
			   //  1. 写图片索引
			   if(Camera_Number==1)
				   pic_current_page=PicStart_offset; //计算图片起始page 
			   else
			   if(Camera_Number==2)
			         pic_current_page=PicStart_offset2; //计算图片起始page 
			   else
			   if(Camera_Number==3)
			         pic_current_page=PicStart_offset3; //计算图片起始page 
			   else
			   if(Camera_Number==4)
			         pic_current_page=PicStart_offset4; //计算图片起始page        
			   PictureName[18]=Camera_Number;
			   memcpy(PictureName+19,(u8*)&pic_size,4);	 			   
			   DF_WriteFlashDirect(pic_current_page,0,PictureName, 23);  
			   DF_delay_ms(8); 
			   
	               //  5.1   更新图片读写记录
	               pic_write++;
				   if(pic_write>=Max_PicNum)
				   	  pic_write=0;    
	               DF_Write_RecordAdd(pic_write,pic_read,TYPE_PhotoAdd);  
	               //--------------------------------------------------------------------------                  
	               rt_kprintf("\r\n        PicSize: %d Bytes\r\n    Camera  %d   End\r\n",pic_size,Camera_Number); 
		        SingleCamra_TakeResualt_BD=0;	    //  单路摄像头拍照		
		        SD_ACKflag.f_BD_CentreTakeAck_0805H=1;  //  发送中心拍照命令应答
		        //----------  Normal process ---------------------
			 End_Camera(); 

				
		        // 5.2   拍照完成后检查有没有多路 拍-----------Multi Take process--------------------
				   if(1==MultiTake.Taking)
				   {
					   switch(Camera_Number)
						 {
							case  1: 
	                                   //-------- old process---------------
	                                   MultiTake.TakeResult[0]=Take_Success;   // 表示第一路摄像头拍照失败
									   //--------- new   process-------------
	                                   MultiTake.Take_retry=0;
	                                   //-------------------------------------------
									   if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
									   	    break;
									   //----------拍照下一路摄像头-----------									   
										   Camera_Number=2;  
									   //-------------------------
									    Start_Camera(Camera_Number);
									 
								    break;
							case  2: 
	                                   //-------- old process---------------
	                                   MultiTake.TakeResult[1]=Take_Success;   // 表示第一路摄像头拍照失败
									   //--------- new   process-------------
	                                   MultiTake.Take_retry=0;
	                                   //-------------------------------------------
									   if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
									   	    break;
									   //----------拍照下一路摄像头-----------									   
										   Camera_Number=3;  
									   //-------------------------
									    Start_Camera(Camera_Number);
									 
								    break;
						   case  3: 
	                                   //-------- old process---------------
	                                   MultiTake.TakeResult[2]=Take_Success;   // 表示第一路摄像头拍照失败
									   //--------- new   process-------------
	                                   MultiTake.Take_retry=0;
	                                   //-------------------------------------------
									   if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
									   	    break;
									   //----------拍照下一路摄像头-----------									   
										   Camera_Number=4;   
									   //-------------------------
									    Start_Camera(Camera_Number);
									 
								    break;				
							case  4: 
	                                   //-------- old process---------------
	                                   MultiTake.TakeResult[3]=Take_Success;   // 表示第一路摄像头拍照失败
									   //--------- new   process-------------
	                                   MultiTake.Take_retry=0;
									   
	                                   //-------------------------------------------
									   if(CHKendTake_ReadyToSend())// 检查是否是最后的拍照线路
									   	    break;
									
								    break;					
						    default:
								    MultiTake_End();
	                                                     break;
								  
					   	 }		

					}		
				   else
				   if((0==MultiTake.Taking)&&(0==MultiTake.Transfering)) 
				    {    
				       //------ 判断车门开关拍照是否上传状态 ------
					    if((OpenDoor_StartTakeFlag==1)&&(Opendoor_transFLAG==0)) 
			                    {
			                         MultiTake_End();   // 车门开关不上传
			                         OpenDoor_StartTakeFlag=0;
							    }     
			                   else
			                   	{
									rt_kprintf("\r\n Single Camera !\r\n"); 
									if(Camera_Take_not_trans==0)  
											Photo_send_start(Camera_Number);  //在不是多路拍照的情况下拍完就可以上传了
									 else
									   Camera_Take_not_trans=0;					   
			                   	}
				   	}	
				    //  拍照结束  
	    }
	 else
	  {
	     
		 //------- change state  -------
		 CameraState.status=transfer;
		 CameraState.OperateFlag=0;   // clear 
	  
		  TX_485const_Enable=1;  // 发送485 命令
		   _485_RXstatus._485_receiveflag=IDLE_485;   
                 //rt_kprintf("\r\n  Head info_len : %d\r\n",_485_content_wr); 
		  memset(_485_content,0,sizeof(_485_content));
		  _485_content_wr=0;			  
		  //rt_kprintf("\r\n  One Packet Over!\r\n"); 	 
		 
	  } 			  
}