📄 fat32.c
字号:
#include "USB_SYS.h"
// 8BIT BYTE;
// 16BIT WORD;
// 32BIT LWORD;
//BYTE MassStorageDataBuf[0x200];
//BYTE MassStorageDataBuf[0x200];
#pragma pack(push)
#pragma pack(1)
typedef struct
{
WORD Addr;/////ok
} DBR,*pDBR;
DBR Dbr32;
typedef struct
{
WORD Addr; /////ok
BYTE Num; /////ok
WORD Length;/////ok
} FAT,*pFAT;
FAT Fat32;
typedef struct
{
WORD Addr;////OK
BYTE Size;////OK
WORD ClusterHao;////OK
} ROOT,*pROOT;
ROOT Root32;
typedef struct
{
BYTE Name[11];/////ok
LWORD Size;/////ok
BYTE Fat[8];////ok
LWORD SectorNum; ////ok
WORD SectorSize; ////ok
WORD ClusterNum; ////////////????OK
BYTE ClusterSize; ////ok 单位:扇区
BYTE Class;////ok
} DISKINFO,*pDISKINFO;
DISKINFO Diskinfo32;
typedef struct
{
BYTE Name[8];////OK
BYTE ExtName[3];////OK
LWORD Size;
BYTE Class;////OK
WORD Addr;
} FILEINFO,*pFILEINFO;
FILEINFO Fileinfo32[64];
#pragma pack(pop)
BYTE ASCII_Test( BYTE c )
{
if((c>31)&&(c<123)) return 0;
else return 1;
}
BYTE Analyse_Sector0(void)
{
if(UFLReadSector(0))
{
Dbr32.Addr=(WORD)MassStorageDataBuf[455]<<8|(WORD)MassStorageDataBuf[454];
Diskinfo32.SectorNum=(LWORD)MassStorageDataBuf[461]<<24|(LWORD)MassStorageDataBuf[460]<<16|
(LWORD)MassStorageDataBuf[459]<<8|(LWORD)MassStorageDataBuf[458]; //总扇区数
Uart_Printf("得到 --> DBA 地址和总扇区数 \n");
}
else{
Uart_Printf("error at Analyse_Sector0(void) \n");
return FALSE;
}
return TRUE;
}
BYTE Analyse_DBR(void)
{
BYTE i=0,j;
while(i<20){
if(UFLReadSector(Dbr32.Addr)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return FALSE;
Diskinfo32.SectorSize = (WORD)MassStorageDataBuf[0x0C]<<8|(WORD)MassStorageDataBuf[0x0B];//每扇区字节数
Diskinfo32.ClusterSize = MassStorageDataBuf[0x0D];//每簇扇区数
Uart_Printf("SectorSize = %d (512),ClusterSize = %d\n",Diskinfo32.SectorSize,Diskinfo32.ClusterSize);
Fat32.Addr = Dbr32.Addr+((WORD)MassStorageDataBuf[0x0F]<<8|(WORD)MassStorageDataBuf[0x0E]);
//fat表地址=系统引导记录(长为一个扇区)地址+保留扇区数
Fat32.Num = MassStorageDataBuf[0x10]; //fat的个数
Uart_Printf("FAT Num = %d \n",Fat32.Num);
Uart_Printf("FAT Addr = %ld \n",Fat32.Addr);
Diskinfo32.Class = MassStorageDataBuf[0x15];
Diskinfo32.Size = Diskinfo32.SectorSize*(Diskinfo32.SectorNum/1024);//(单位KB)
for(j=0;j<8;j++)
{
Diskinfo32.Fat[i] = MassStorageDataBuf[0x52+i];
Uart_Printf("%c",Diskinfo32.Fat[i]);
}
Uart_Printf("\n");
Fat32.Length =(WORD)MassStorageDataBuf[0x25]<<8|(WORD)MassStorageDataBuf[0x24];//每个fat占的扇区数
Root32.Addr = Fat32.Addr+Fat32.Length*Fat32.Num;//根目录地址
Root32.ClusterHao = MassStorageDataBuf[0x2D]<<8|MassStorageDataBuf[0x2C];
Root32.Size=Diskinfo32.ClusterSize;//根目录占多少个扇区
Uart_Printf("RootDirSize = %d \n",Root32.Size);
return TRUE;
}
BYTE Analyse_ROOT(void)
{
BYTE i=0,j,k=1;
while(i<20){
if(UFLReadSector(Root32.Addr)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return FALSE;
for(i=0;i<11;i++)
{
Diskinfo32.Name[i] = MassStorageDataBuf[i];
}
//////////////////////////////////
for(j=0;j<16;j++)
{
if(ASCII_Test(MassStorageDataBuf[0+(j+1)*32])==0)
{
Uart_Printf("文件名 :");
for(i=0;i<8;i++)
{
Fileinfo32[j].Name[i] = MassStorageDataBuf[i+(j+1)*32];
Uart_Printf("%c",Fileinfo32[j].Name[i]);
}
Fileinfo32[j].ExtName[0] = MassStorageDataBuf[8+(j+1)*32];
Fileinfo32[j].ExtName[1] = MassStorageDataBuf[9+(j+1)*32];
Fileinfo32[j].ExtName[2] = MassStorageDataBuf[10+(j+1)*32];
Uart_Printf(" 扩展名 :%c%c%c",MassStorageDataBuf[8+(j+1)*32],MassStorageDataBuf[9+(j+1)*32],MassStorageDataBuf[10+(j+1)*32]);
Fileinfo32[j].Class = MassStorageDataBuf[11+(j+1)*32];
if(Fileinfo32[j].Class&(1<<4)) Uart_Printf(" 属性 :文件夹\n");
else Uart_Printf(" 属性 :文件\n");
Fileinfo32[j].Size = (LWORD)MassStorageDataBuf[31+(j+1)*32]<<24|(LWORD)MassStorageDataBuf[30+(j+1)*32]<<16|(LWORD)MassStorageDataBuf[29+(j+1)*32]<<8|(LWORD)MassStorageDataBuf[28+(j+1)*32];
Fileinfo32[j].Addr = MassStorageDataBuf[27+(j+1)*32]<<8|MassStorageDataBuf[26+(j+1)*32];
}
else Fileinfo32[j].Name[0] = 0 ;
}
while(k!=(Diskinfo32.ClusterSize))
{
while(i<20){
if(UFLReadSector(Root32.Addr+k)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return FALSE;
for(j=0;j<16;j++)
{
if(ASCII_Test(MassStorageDataBuf[0+j*32])==0)
{
Uart_Printf("文件名 :");
for(i=0;i<8;i++)
{
Fileinfo32[16*k+j].Name[i] = MassStorageDataBuf[i+j*32];
Uart_Printf("%c",Fileinfo32[16*k+j].Name[i]);
}
Fileinfo32[16*k+j].ExtName[0] = MassStorageDataBuf[8+j*32];
Fileinfo32[16*k+j].ExtName[1] = MassStorageDataBuf[9+j*32];
Fileinfo32[16*k+j].ExtName[2] = MassStorageDataBuf[10+j*32];
Uart_Printf(" 扩展名 :%c%c%c",MassStorageDataBuf[8+j*32],MassStorageDataBuf[9+j*32],MassStorageDataBuf[10+j*32]);
Fileinfo32[16*k+j].Class = MassStorageDataBuf[11+j*32];
if(Fileinfo32[16*k+j].Class&(1<<4)) Uart_Printf(" 属性 :文件夹");
else Uart_Printf(" 属性 :文件");
Fileinfo32[16*k+j].Size = (LWORD)MassStorageDataBuf[31+j*32]<<24|(LWORD)MassStorageDataBuf[30+j*32]<<16|(LWORD)MassStorageDataBuf[29+j*32]<<8|(LWORD)MassStorageDataBuf[28+j*32];
Fileinfo32[16*k+j].Addr = MassStorageDataBuf[27+j*32]<<8|MassStorageDataBuf[26+j*32];
}
else Fileinfo32[j].Name[0] = 0 ;
}
}
return TRUE;
}
BYTE Analyse_FAT(void)
{
}
BYTE Analyse_FILE(void)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -