⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fw.c

📁 汽车记录仪元代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				  			    DBUF[i+j+1] = sectnum / 256 + ((sectnum+1)%16) * 16;
								DBUF[i+j+2] = (sectnum+1) / 16;
							  }
						   j=fdir_unsize-3;
					  	   DBUF[i+j+1]=DBUF[i+j+1]|0xf0;
					  	   DBUF[i+j+2]=0xff;
						}
		
					  if(attr)
					  {
						   DBUF[i]=0xff;
			  	           DBUF[i+1]=DBUF[i+1]|0x0f;
					  }
		
					   if(!write_disk(0,FATLBA+start_FATsect,1)) return(0);
//					   EZUSB_Delay(50);
					   if(!write_disk(0,FATLBA+start_FATsect+FAT_sect_Num,1)) return(0);
//				       EZUSB_Delay(50);
		
				       FATLBA=(FATLBA*512+i)*2/3;
				       return(FATLBA);
				       }
					}
				i ++;
			}
		}

/*    for(i=0;i<420;i++)      //file file_unit_size + direct 1
		    {
				if ((FATLBA*512+i)%3==0)
				{
					free=0; 
					for(j=0;j<fdir_unsize;j++)
					{
			            free+=DBUF[i+j];
						kick_watchdog();  	//踢看门狗
					}
			        if(free==0) 
			        { 
						if (fdir_unsize%2)
						{
						   	  for(j=0;j<fdir_unsize-3;j+=3)           // file address in FAT table
					          {
								sectnum = (FATLBA*512+i+j)*2/3+1;
								DBUF[i+j] = sectnum % 256;
				  			    DBUF[i+j+1] = sectnum / 256 + ((sectnum+1)%16) * 16;
								DBUF[i+j+2] = (sectnum+1) / 16;
							  }
							  j=fdir_unsize-3;
					          DBUF[i+j]=0xff;
					  	      DBUF[i+j+1]=0x0f;
					  	      DBUF[i+j+2]=0x00;
					  	}
						else
						{
							for(j=0;j<fdir_unsize;j+=3)           // file address in FAT table
					          {
								sectnum = (FATLBA*512+i+j)*2/3+1;
								DBUF[i+j] = sectnum % 256;
				  			    DBUF[i+j+1] = sectnum / 256 + ((sectnum+1)%16) * 16;
								DBUF[i+j+2] = (sectnum+1) / 16;
							  }
						   j=fdir_unsize-3;
					  	   DBUF[i+j+1]=DBUF[i+j+1]|0xf0;
					  	   DBUF[i+j+2]=0xff;
						}
		
					  if(attr)
					  {
						   DBUF[i]=0xff;
			  	           DBUF[i+1]=DBUF[i+1]|0x0f;
					  }
		
					   if(!write_disk(0,FATLBA+start_FATsect,1)) return(0);
//					   EZUSB_Delay(50);
					   if(!write_disk(0,FATLBA+start_FATsect+FAT_sect_Num,1)) return(0);
//				       EZUSB_Delay(50);
		
				       FATLBA=(FATLBA*512+i)*2/3;
				       return(FATLBA);
			       }
				}
		    }
		  }
		  */
		  return(0);

  		case 16:

		  fdir_unsize=file_unsize+attr;

		  for(FATLBA=0;FATLBA<FAT_sect_Num;FATLBA++)
		  { if(!read_disk(0,FATLBA+start_FATsect,1)) return(0);
		    for(i=0;i<256-fdir_unsize;i++)      //file file_unit_size + direct 1
		    { free=0; 
		       for(j=0;j<fdir_unsize*2;j++)
			   {
		           free+=DBUF[i*2+j];
		    	   kick_watchdog();  	//踢看门狗
			   }
		       if(free==0) 
		       {  for(j=0;j<fdir_unsize-1;j++)           // file address in FAT table
			      { DBUF[i*2+j*2]=i+j+1;
		  	        DBUF[i*2+j*2+1]=(BYTE)(FATLBA);
				  }
		            DBUF[i*2+j*2]=255;
		  	        DBUF[i*2+j*2+1]=255;
					if(attr)
					{    DBUF[i*2]=255;
		  	             DBUF[i*2+1]=255;
					}   
				   if(!write_disk(0,FATLBA+start_FATsect,1)) return(0);
//				   EZUSB_Delay(50);
				   if(!write_disk(0,FATLBA+start_FATsect+FAT_sect_Num,1)) return(0);
//			       EZUSB_Delay(50);
		         // j=write_disk(0,FATLBA+start_FATsect+FAT_sect_Num,1);
		        FATLBA=FATLBA*256+i;
		        
		        return(FATLBA);
		      }
		
		    }
		  }
		  return(0);

  		default:
		  return(0);
  	}
}


//enter into a directory 
BYTE write_dir2(WORD dir2star)		//写二级目录的头部
{
       WORD i;
 
        if(!read_disk(0,dir2star,1)) return (0);
                  

             i=0;
       
            DBUF[i+0]=0x2E;
            DBUF[i+1]=0x20;
	        DBUF[i+2]=0x20;
	        DBUF[i+3]=0x20;
	        DBUF[i+4]=0x20;
	        DBUF[i+5]=0x20;
	        DBUF[i+6]=0x20;
	        DBUF[i+7]=0x20;
	        DBUF[i+8]=0x20;
	        DBUF[i+9]=0x20;
	        DBUF[i+10]=0x20;
	        DBUF[i+11]=0x10;

		  //Updated by Bian Zhuoyue in Feb 13,2004
          DBUF[i+12]=0;
          DBUF[i+13]=0;	 
          DBUF[i+14]=0;
          DBUF[i+15]=0;
          DBUF[i+16]=0;
          DBUF[i+17]=0;
          DBUF[i+18]=0;
          DBUF[i+19]=0;
          DBUF[i+20]=0;
          DBUF[i+21]=0;
		  //The End of Update

	  
	        DBUF[i+22]=(BYTE)(pfiles.time);
	        DBUF[i+23]=(BYTE)(pfiles.time>>8);
	        DBUF[i+24]=(BYTE)(pfiles.date);
	        DBUF[i+25]=(BYTE)(pfiles.date>>8);
	        DBUF[i+26]=(BYTE)(pfiles.star_unit);
	        DBUF[i+27]=(BYTE)(pfiles.star_unit>>8);
	        DBUF[i+28]=0;
	        DBUF[i+29]=0;
	        DBUF[i+30]=0;
	        DBUF[i+31]=0;
	             
            i+=32;
     
             DBUF[i+0]=0x2E;
             DBUF[i+1]=0x2E;
	         DBUF[i+2]=0x20;
	         DBUF[i+3]=0x20;
	         DBUF[i+4]=0x20;
	         DBUF[i+5]=0x20;
	         DBUF[i+6]=0x20;
	         DBUF[i+7]=0x20;
	         DBUF[i+8]=0x20;
	         DBUF[i+9]=0x20;
	         DBUF[i+10]=0x20;
	         DBUF[i+11]=0x10;

		  //Updated by Bian Zhuoyue in Feb 13,2004
          DBUF[i+12]=0;
          DBUF[i+13]=0;	 
          DBUF[i+14]=0;
          DBUF[i+15]=0;
          DBUF[i+16]=0;
          DBUF[i+17]=0;
          DBUF[i+18]=0;
          DBUF[i+19]=0;
          DBUF[i+20]=0;
          DBUF[i+21]=0;
		  //The End of Update

	  
	         DBUF[i+22]=(BYTE)(pfiles.time);
	         DBUF[i+23]=(BYTE)(pfiles.time>>8);
	         DBUF[i+24]=(BYTE)(pfiles.date);
	         DBUF[i+25]=(BYTE)(pfiles.date>>8);
	         DBUF[i+26]=0;
	         DBUF[i+27]=0;
	         DBUF[i+28]=0;
	         DBUF[i+29]=0;
	         DBUF[i+30]=0;
	         DBUF[i+31]=0;
			  for(i=64;i<512;i++)
		      DBUF[i]=0; 
	          if(!write_disk(0,dir2star,1)) return(0);
			  if(!read_disk(0,2,1)) return(0);		//?????
//			  for(i=dir2star+1;i<dir2star+sectpunit;i++)

//			  if(!write_disk(0,i,1)) return (0);
			  if(!write_disk(0,dir2star+1,sectpunit-1)) return (0);

             return(1);	              
           	      
}

//write file name or direct name in the sector
BYTE write_name(WORD DIR_star,WORD DIR_end,BYTE attr)		//写文件名或目录名(目录名文件长度为零)
{
  WORD i=0;
  WORD DIRLBA=DIR_star;
  for(;DIRLBA<DIR_end;DIRLBA++)
  {  if(!read_disk(0,DIRLBA,1)) return(0);
     i=0;
	 
     while(i<500)
     {
       if(attr)     
           if(DBUF[i]==0xe5||DBUF[i]==0)
           {  DBUF[i+0]=pfiles.names[0];
              DBUF[i+1]=pfiles.names[1];
	          DBUF[i+2]=pfiles.names[2];
	          DBUF[i+3]=pfiles.names[3];
     	      DBUF[i+4]=pfiles.names[4];
	          DBUF[i+5]=pfiles.names[5];
	          DBUF[i+6]=pfiles.names[6];
	          DBUF[i+7]=pfiles.names[7];
	          DBUF[i+8]=pfiles.type[0];
	          DBUF[i+9]=pfiles.type[1];
	          DBUF[i+10]=pfiles.type[2];
	          DBUF[i+11]=pfiles.attri;

			  //Updated by Bian Zhuoyue in Feb 13,2004
	          DBUF[i+12]=0;
	          DBUF[i+13]=0;	 
	          DBUF[i+14]=0;
	          DBUF[i+15]=0;
	          DBUF[i+16]=0;
	          DBUF[i+17]=0;
	          DBUF[i+18]=0;
	          DBUF[i+19]=0;
	          DBUF[i+20]=0;
	          DBUF[i+21]=0;
			  //The End of Update

	          DBUF[i+22]=(BYTE)(pfiles.time);
	          DBUF[i+23]=(BYTE)(pfiles.time>>8);
	          DBUF[i+24]=(BYTE)(pfiles.date);
	          DBUF[i+25]=(BYTE)(pfiles.date>>8);
	          DBUF[i+26]=(BYTE)(pfiles.star_unit);
	          DBUF[i+27]=(BYTE)(pfiles.star_unit>>8);
              DBUF[i+28]=0;
	          DBUF[i+29]=0;
	          DBUF[i+30]=0;
	          DBUF[i+31]=0;
	    
	       if(!write_disk(0,DIRLBA,1)) return(0);
	       return(1);
	     
          }
 	   if(!attr)
          if((DBUF[i]==0)||(DBUF[i]==0xe5))
          {  
			  DBUF[i+0]=pfiles.names[0];
              DBUF[i+1]=pfiles.names[1];
	          DBUF[i+2]=pfiles.names[2];
	          DBUF[i+3]=pfiles.names[3];
     	      DBUF[i+4]=pfiles.names[4];
	          DBUF[i+5]=pfiles.names[5];
	          DBUF[i+6]=pfiles.names[6];
	          DBUF[i+7]=pfiles.names[7];
	          DBUF[i+8]=pfiles.type[0];
	          DBUF[i+9]=pfiles.type[1];
	          DBUF[i+10]=pfiles.type[2];
	          DBUF[i+11]=pfiles.attri;

 			  //Updated by Bian Zhuoyue in Feb 13,2004
	          DBUF[i+12]=0;
	          DBUF[i+13]=0;	 
	          DBUF[i+14]=0;
	          DBUF[i+15]=0;
	          DBUF[i+16]=0;
	          DBUF[i+17]=0;
	          DBUF[i+18]=0;
	          DBUF[i+19]=0;
	          DBUF[i+20]=0;
	          DBUF[i+21]=0;
			  //The End of Update

	          DBUF[i+22]=(BYTE)(pfiles.time);
	          DBUF[i+23]=(BYTE)(pfiles.time>>8);
	          DBUF[i+24]=(BYTE)(pfiles.date);
	          DBUF[i+25]=(BYTE)(pfiles.date>>8);
	          DBUF[i+26]=(BYTE)(pfiles.star_unit);
	          DBUF[i+27]=(BYTE)(pfiles.star_unit>>8);
              DBUF[i+28]=(BYTE)(pfiles.size);
	          DBUF[i+29]=(BYTE)(pfiles.size>>8);
	          DBUF[i+30]=(BYTE)(pfiles.size>>16);
	          DBUF[i+31]=(BYTE)(pfiles.size>>24);
		      if(!write_disk(0,DIRLBA,1)) return(0);
	          return(1);
	          
          } 


	     i+=32;
        } 
    }
    return(0);
}    




BYTE write_file(WORD file_star) 		//写文件内容
{WORD fileLBA;//,i;

//  for(i=0;i<74;i++)    DBUF[i]=48+i;DBUF[i]='\n';  
//  for(i=75;i<150;i++)  DBUF[i]=i-28;DBUF[i]='\n';
//  for(i=151;i<224;i++) DBUF[i]=i-102;DBUF[i]='\n';
//  for(i=225;i<300;i++) DBUF[i]=i-175;DBUF[i]='\n';
//  for(i=301;i<374;i++) DBUF[i]=i-253;DBUF[i]='\n';
//  for(i=375;i<450;i++) DBUF[i]=i-327;DBUF[i]='\n';
//  for(i=451;i<511;i++) DBUF[i]=i-403;DBUF[i]='\n';

  for(fileLBA=0;fileLBA<file_unsize*sectpunit;fileLBA+=128)
  {//unit_ready();     //start at 128KB
   if(!write_disk8(fileLBA,0,fileLBA+file_star,128)) return(0);
   kick_watchdog ();
//   EZUSB_Delay(3);
  }
    
//  for(fileLBA=0;fileLBA<file_unsize*sectpunit;fileLBA+=8)
//  {
//  	if(!write_disk8(fileLBA,0,fileLBA+file_star,8)) return(0);
//   	EZUSB_Delay(2);
//  }

return(1);
}

BYTE  hostwrite_i2c(BYTE *fname,BYTE *dname,BYTE type)      
{   
    WORD i,unit_starLBA,dir2sLBA,fileLBA,start_sect,dir1_star;  
	WORD FATaddr,FATID;
	WORD NextFAT;
	bit ODD;

    for(i=0;i<4;i++)
       {  sl811h_init();		//SL811H初始化
          if(slave_detect())    //设备例举
	        break;    
	   }
	   if(i==4) return 4; // No disk


    Attr=1; 
        
 	if(!read_disk(0,0x0,1)) return(0);   //read master boot sector	读主扇区(0号)
    
   
    start_sect=DBUF[0x1C6]+(WORD)(DBUF[0x1C7])*256; 	//得到PARTITION 1的开始扇区
    start_FATsect=start_sect+1; 	//得到FAT表的开始扇区
    if(!read_disk(0,start_sect,1)) return(0); //read partition one sector	读1号扇区
    
    FAT_sect_Num=DBUF[0x16]+(WORD)(DBUF[0x17])*256;		//得到FAT表的长度
    sectpunit=DBUF[0x0D];         // sector per unit   	每个簇有多少个扇区
    file_unsize=1;	//512BYTE
    dir1_star=start_FATsect+FAT_sect_Num*2;		//一级目录的开始扇区(根目录),长度为20扇区
	unit_starLBA=dir1_star+(DBUF[0x12]<<4)+(DBUF[0x11]>>4);      //二级目录与文件的开始扇区(上面的加20)
    FATaddr = 0;
	ODD = 0;
	kick_watchdog ();

    if(search_name(dname,dir1_star,unit_starLBA))   //判断有无同名目录,无返回0
    {     
	    	    
		dir2sLBA=unit_starLBA+(pfiles.star_unit-2)*sectpunit;		//目录开始扇区
	//加改变目录后的块地址!!
	//从FAT表中得到
	//顺序为本地址->下级地址->......
	//从这里开始
		FATID = pfiles.star_unit;
		while ( FATID < 0x0ff0 )
		{
			kick_watchdog ();

            if(search_name(fname,dir2sLBA,dir2sLBA+sectpunit))		//判断有无同名文件,无返回0
            {
				fileLBA=unit_starLBA+(pfiles.star_unit-2)*sectpunit;		//文件内容开始扇区
                if(!read_disk(0,fileLBA,1)) return(0);		//读取文件,写入I2C
				if ( type == 1 )
				{
					if (!ULIS ()) return (0);
					if (!write_disk(0,fileLBA,1)) return (0);//不允许段电!!
				}
				if ( type == 2 )
				{
					if (!UDown ())return (0);
				}
				return (1);
            }
			FATaddr = FATID / 2 * 3;
			if ( FATID % 2 )
			{
				ODD = 1;
				FATaddr ++;
			}
			else
			{
				ODD = 0;
			}
			if ( FATaddr % 512 == 511 )
			{
				if (!read_disk(0,start_FATsect + FATaddr / 512,1)) return (0);
				if ( ODD )
				{
					NextFAT = DBUF [511] >> 4;
				}
				else
				{
					NextFAT = DBUF [511];
				}
				if (!read_disk(0,start_FATsect + FATaddr / 512 + 1,1)) return (0);
				if ( ODD )
				{
					NextFAT += DBUF [0] * 0x10;
				}
				else
				{
					NextFAT += ( DBUF [0] & 0x0F ) * 0x100;
				}
			}
			else
			{
				if (!read_disk(0,start_FATsect + FATaddr / 512,1)) return (0);
				if ( ODD )
				{
					NextFAT = ( DBUF [ FATaddr % 512 ] >> 4 );
					NextFAT += DBUF [ FATaddr % 512 + 1 ] * 0x10;
				}
				else
				{
					NextFAT = DBUF [ FATaddr % 512 ];
					NextFAT += ( DBUF [ FATaddr % 512 + 1 ] & 0x0F ) * 0x100;
				}
			}
			FATID = NextFAT;
			dir2sLBA = ( NextFAT - 2 ) * sectpunit + unit_starLBA;
		}
        return(3);//no file name
	//到这里结束,直到FAT表中为结束符号时(FF0-FFF)结束!
    }
    return(2);// no dir name
}

unsigned char ULIS ()
{
	unsigned char ProNo [6];
	unsigned char i,j;
	bit same;

	same = 1;	

	for ( i = 0; i < 6; i ++ )
	{
		ProNo [i] = i2c_read ( 0x36 + i );
	}

	for ( j = 0; j < 85; j ++ )
	{
		if ( ProNo [0] == ( DBUF [ 6 * j + 2 ] & 0x7F ))
		{
			for ( i = 1; i < 6; i ++ )
			{
				if ( ProNo [i] != DBUF [ 6 * j + i + 2 ] )
				{
					same = 0;
					break;
				}
				else
				{
					same = 1;
				}
			}
		}
		else
		{
			same = 0;
		}

		if ( same )
		{
			i2c_write ( 0x3C, 1 );
			DBUF [ 6 * j + 2 ] = ( DBUF [ 6 * j + 2 ] | 0x80 );
			return (1);
		}
	}

	return (0);
}

unsigned char UDown ()
{
	unsigned int i;	

	for ( i = 0; i < 6; i ++ )
	{
		if ( DBUF [ 0x36 + i ] != i2c_read ( 0x36 + i ))
		{
			return (0);
		}
	}

	for ( i = 0; i < 0x36; i ++ )
	{
		i2c_write ( i, DBUF [i] );
	}

	for ( i = 0x40; i < 0x100; i ++ )
	{
		i2c_write ( i, DBUF [i] );
	}

	return (1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -