Daniel_T
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1663回复:14

Fat文件系靳

楼主#
更多 发布于:2004-12-09 18:13
描述

最新喜欢:

mapoflmapofl
Daniel_T
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-12-10 11:21
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-12-11 20:04
4M 是FAT12.

你的设想在windows下没错,系统正是如此操作的
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-12-11 20:06
[quote]描述
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-12-11 20:08
和 8.3 文件名,至少占用两个FDT
Daniel_T
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-12-11 20:12
谢谢回复,是长文件名没错。是否如果只有4M,系统就一定按照Fat12来存储文件?Fat12的表看起来没什么规则是的:(

另:已经放分:)
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-12-11 21:28
呵呵,等我找些FAT文件系统的资料在给你传上来,你现自己看看
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-12-11 21:36
Fat12 是每个簇在FAT表中用12bit来描述,FAT16 则用 16bit, FAT32 用 32bit
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-12-11 21:40
参考以下code

static unsigned long get_NextCluster(unsigned long cluster)
{
unsigned long fatsec;
unsigned long res;
unsigned long LBA_FAT;

LBA_FAT = LogStartSector+ RsvdSecCnt;

if (fsFatType == FAT32BIT){
fatsec = cluster / 0x180;
fat_sec_ofs = cluster % 0x180;
fat_sec_ofs *= 4;
}
else

if (fsFatType == FAT16BIT) {
fatsec = cluster / 0x300;
fat_sec_ofs = cluster % 0x300;
fat_sec_ofs *= 2;
} else { /* FAT16BIT */
fatsec = cluster / 0x400;
fat_sec_ofs = cluster % 0x400;
fat_sec_ofs = (fat_sec_ofs * 3) / 2;
};
fatsec *= 3;
if (fatsec != fat_sec_no) {
// DbgPrint("nNEW fatn");
if(stBIOS_PARA.NumFATSectors <fatsec){
TracePrint2(MSG_ERROR,"Error NEW FAT Reading %d  precluster %08Xn",fatsec,cluster);
return FATERROR;
}
// TracePrint2(MSG_FAT,"NEW FAT Reading %d %08X n",fatsec,cluster);
res = read_LBA ( LBA_FAT+fatsec, 3*512, fat_sec, 1);
if (res ) {
return FATERROR;
};
};

fat_sec_no = fatsec;

if (FAT32BIT == fsFatType) {
res = ((fat_sec[fat_sec_ofs+3] &0x0F)<<24)|
((fat_sec[fat_sec_ofs+2] &0xFF)<<16 )|
(( fat_sec[fat_sec_ofs+1] &0xFF)<<8 )|
( fat_sec[fat_sec_ofs]  &0xFF);
}
else {
res = (unsigned long)
((fat_sec[fat_sec_ofs+1]  &0xFF )<<8)|
(fat_sec[fat_sec_ofs]  &0xFF);

if (fsFatType == FAT12BIT) {
if (cluster & 1){
res >>= 4;
}
else{
res &= 0xFFF;
}
};
}
return res;
}

[编辑 -  12/11/04 by  linguohui]

[编辑 -  12/11/04 by  linguohui]
wsqss2004
驱动小牛
驱动小牛
  • 注册日期2004-06-11
  • 最后登录2012-02-17
  • 粉丝0
  • 关注0
  • 积分994分
  • 威望202点
  • 贡献值2点
  • 好评度91点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-12-13 13:22
我想问在FAT表中0xF8,0xFF,0xF0,0xFF.是占用了几个镞?
还有在文件目录表FDT中怎么才能使那些标记为0xe5的32字节数据删除? 楼上的意思是长文件名就要64字节了?可是文件系统说明中说的是用哪个10字节的保留区啊?
linguohui
驱动牛犊
驱动牛犊
  • 注册日期2002-05-17
  • 最后登录2012-09-19
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望8点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-12-13 23:42
我想问在FAT表中0xF8,0xFF,0xF0,0xFF.是占用了几个镞?
还有在文件目录表FDT中怎么才能使那些标记为0xe5的32字节数据删除? 楼上的意思是长文件名就要64字节了?可是文件系统说明中说的是用哪个10字节的保留区啊?


0xF8,0xFF,0xF0,0xFF 是FAT表的标签

长文件名要至少64字节(32bytes for 8.3, 32bytes以上 for LFN)
(LFN max length 260, max FDT 20)

文件目录表FDT中怎么才能使那些标记为0xe5的32字节数据删除
如果是由windows来管理的话,算法如下:
1.如果有未分配簇,则直接使用这些簇
2.如果没有未分配簇,则回收已删除文件的空间,再使用这些簇
Daniel_T
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-12-14 09:16
著著回答╋收
wsqss2004
驱动小牛
驱动小牛
  • 注册日期2004-06-11
  • 最后登录2012-02-17
  • 粉丝0
  • 关注0
  • 积分994分
  • 威望202点
  • 贡献值2点
  • 好评度91点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-12-14 09:22
0xF8,0xFF,0xF0,0xFF 是FAT表的标签
-----------------------------------------------------------
1,那我如果在fat,fdt,dbr等占用3镞,那该怎么设置FAT表呢?我是16k/cluster,那62M的话就要占用16page,我是用的FAT16,用32的话可行不?还有在DBR中的哪个磁头,磁道,我用nand_flash该怎么设置?
-----------------------------------------------------------
2,我的数据缓冲为新片内部ram2048,但也就是接收512Bytes就写入nand_flash中。该怎么设置才好呢?现在才40kB/s
Daniel_T
驱动牛犊
驱动牛犊
  • 注册日期2004-11-24
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-12-14 20:35
1.应该是修改DBR表可以达到你的要求,因为原来最初我的第一个文件都是从第3簇开始的,改了DBR才变成从第2簇开始,具体我不记得了:)
2.我现在的速度和你一样,你试试看不对FLASH操作能达到多少速度?我想速度主要的局限在单片机这方面,而不在D12。不知各位大大有什么好的提速方法????
wsqss2004
驱动小牛
驱动小牛
  • 注册日期2004-06-11
  • 最后登录2012-02-17
  • 粉丝0
  • 关注0
  • 积分994分
  • 威望202点
  • 贡献值2点
  • 好评度91点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-12-14 21:20
我现在每次开机上电时在FDT或DBR区都会增加64字节的数据。列如:
第63是0xff,那后面就会添加64字节的0xff.不知是怎么回事?
最奇怪的是我分2个扇区一镞,就会在DBR区添家。分32个扇区一镞就会在FDT区添加。代码如下:
void SCSIWrite10(void)
{  
    register BYTE i;
bit LBA_Swicth=1;  //Ture/Dummy address select
data DWORD D_LBA,S_LBA,Write_LBA_S,ST; //Dummy Address Concerned
data BYTE SM;
    data DWORD S_D_LBA;  //Destination address temp
    data DWORD Write_LBA;  //Write Address
data DWORD Length_Write; //Write length
extern xdata BYTE Temp_Buffer[528]; //receive data Buffer
  //  xdata BYTE Receive_data16[16]={0};
  //-----------------------------------------------------------------
data struct SCSIWrite10Str *SCSICmdWrite10=SCSICBW->CBWCB;  
Length_Write=(((DWORD)SCSICBW->dDataLength3)<<16)|(((DWORD)SCSICBW->dDataLength2)<<8)
                   |((DWORD)SCSICBW->dDataLength1);
   Write_LBA=(((DWORD)SCSICmdWrite10->LBA2)<<16)|(((DWORD)SCSICmdWrite10->LBA3)<<8)
                |((DWORD)SCSICmdWrite10->LBA4);
    Write_LBA +=32;
  //  Receive_data16[10]=0x55;
  //  Receive_data16[11]=0x88;
  //---------------------------------------------------------------------//
  //  Plane 0 : 4088 Block <0x0001ff00> 4092 Block <0x01ff80>
  //  Plane 1 : 4089 Block <0x0001ff20> 4093 Block <0x01ffa0>
  //  Plane 2 : 4090 Block <0x0001ff40> 4094 Block <0x01ffc0>
  //  Plane 3 : 4091 Block <0x0001ff60> 4095 Block <0x01ffe0>
  //-------------------------------------------------------------------//
D_LBA=0x0001e000;  //destination address  // =4088
//---------------------Receive-Data-then-Write------------------------------
    do{
      if(LBA_Swicth)
    {
           //-----------Initialize-Source-address------------------
Write_LBA_S=Write_LBA;
    ST=Write_LBA_S >>5;      //div  //Block number
SM=(BYTE)(Write_LBA_S-(ST<<5));  //mod  //page in block  //current page number
S_LBA=ST<<5;   //first page number in block
 //--------------------Destination--address-Find--------------
D_LBA=0x0001fe00;  //destination address  // =4088                        
             S_D_LBA=ST-((ST>>2)<<2); // ST MOD 4  
             D_LBA=D_LBA+(S_D_LBA<<5); //plane select
Nand_Erase_one_block(D_LBA);
            //------------------read-first->current-pages--------------
    for(i=0;i<SM;i++)
 { //------------------data-----512B------------------
   Nand_Copy_page(0x00,S_LBA,0x00,D_LBA);    
                S_LBA +=1; //source address
                D_LBA +=1; //destination address
              }
           LBA_Swicth=0;  //LBA_Address Switch :1= real address ,0= Dummy(Temp) address
         }  
//----------------------data-Write-------512B-----------------------------------
        P3_4=0;        
   USBEP2_Read_Mass_data(Temp_Buffer);      //Read data(512Bytes) from host
        P3_4=1;        
      Nand_Write_one_Page(0x00, D_LBA, Temp_Buffer); //Write data to Dummy Address
     D_LBA ++; S_LBA ++; SM ++;        //Address increase
//--------------Tail-data-opinion----------------------------------------
  if( Length_Write>=512) { Length_Write -=512; Write_LBA +=1;} //real address increase  
    //--------------Tail-Page-Write--------------------------------------------
       if((SM>=31)||(Length_Write<=0))  // end Page in block OR  data write complete
  {
               //----------------Tail-page-write-temp-address-----------------------  
  for(;SM<32;SM++)
    { //--------------512B----------------------------------
      Nand_Copy_page(0x00,S_LBA,0x00,D_LBA);
                   S_LBA +=1;  // source address
                   D_LBA +=1;  // destination address
}
 //------------Erase-Source-Block----------------------
  Nand_Erase_one_block(Write_LBA_S);
//------------------------------------------------
  D_LBA -=32;  //destination address reset to the first page in the block
  S_LBA -=32;  //source address reset to the first page in Block
               for(i=0;i<32;i++)
       {  //---------Copy-back-data---512B-----------------------------
                   Nand_Copy_page(0x00,D_LBA,0x00,S_LBA);
                   S_LBA +=1;  D_LBA +=1;
                  }              
               LBA_Swicth=1;  //next Block reset
              
        }
      
    }while(Length_Write>0);            
   //------------------------Clear-Receive-Trigger---------------
    CLEAR_BIT_1(UEPSTAX); //clear RoutB0
    CLEAR_BIT_6(UEPSTAX); //clear RoutB1            
    
 }
游客

返回顶部