阅读:1663回复:14
Fat文件系靳
描述
|
|
最新喜欢:mapofl |
沙发#
发布于:2004-12-10 11:21
出
|
|
板凳#
发布于:2004-12-11 20:04
4M 是FAT12.
你的设想在windows下没错,系统正是如此操作的 |
|
地板#
发布于:2004-12-11 20:06
[quote]描述
|
|
地下室#
发布于:2004-12-11 20:08
和 8.3 文件名,至少占用两个FDT
|
|
5楼#
发布于:2004-12-11 20:12
谢谢回复,是长文件名没错。是否如果只有4M,系统就一定按照Fat12来存储文件?Fat12的表看起来没什么规则是的:(
另:已经放分:) |
|
6楼#
发布于:2004-12-11 21:28
呵呵,等我找些FAT文件系统的资料在给你传上来,你现自己看看
|
|
7楼#
发布于:2004-12-11 21:36
Fat12 是每个簇在FAT表中用12bit来描述,FAT16 则用 16bit, FAT32 用 32bit
|
|
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] |
|
9楼#
发布于:2004-12-13 13:22
我想问在FAT表中0xF8,0xFF,0xF0,0xFF.是占用了几个镞?
还有在文件目录表FDT中怎么才能使那些标记为0xe5的32字节数据删除? 楼上的意思是长文件名就要64字节了?可是文件系统说明中说的是用哪个10字节的保留区啊? |
|
10楼#
发布于:2004-12-13 23:42
我想问在FAT表中0xF8,0xFF,0xF0,0xFF.是占用了几个镞? 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.如果没有未分配簇,则回收已删除文件的空间,再使用这些簇 |
|
11楼#
发布于:2004-12-14 09:16
著著回答╋收
|
|
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 |
|
13楼#
发布于:2004-12-14 20:35
1.应该是修改DBR表可以达到你的要求,因为原来最初我的第一个文件都是从第3簇开始的,改了DBR才变成从第2簇开始,具体我不记得了:)
2.我现在的速度和你一样,你试试看不对FLASH操作能达到多少速度?我想速度主要的局限在单片机这方面,而不在D12。不知各位大大有什么好的提速方法???? |
|
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 } |
|