📄 fw.c
字号:
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 + -