📄 u_test.c
字号:
#include <host_811.h>
WORD xdata TotalWriteSize,ErrorCapacity;
LWORD xdata ValidCapacity;
WORD CheckFreeCapacity(WORD TotalWriteSize,WORD *FreeList,WORD ErrorCapacity);//查询U盘空闲容量,得到空闲簇的地址列表
BYTE ResultExport(WORD *FreeList);//结果导出到一个文件
unsigned char U_Disk_Test(void)
{
BYTE i;
BYTE xdata FATNum;
sl811h_init();
i=0;
while(!SLAVE_ENUMERATED){
slave_detect();
i++;
if(i>0x10) return 0x01;//没有检测到USB设备
}
if(uDev[1].bClass!=0x08){//判断USB设备是否是U盘
return 0x02;//USB设备不是U盘
}
if(uDev[1].bNumOfEPs<2){//判断USB设备端点个数
return 0x03;//USB设备不是U盘
}
//确定端口的输入输出特性
EPOut =0x00;
EPIn =0x00;
if((uDev[1].bEPAddr[1]==0x01)&&(uDev[1].bEPAddr[2]==0x82)){
EPOut =0x01;
EPIn =0x02;
}
if((uDev[1].bEPAddr[1]==0x81)&&(uDev[1].bEPAddr[2]==0x02)){
EPOut =0x02;
EPIn =0x01;
}
if((EPOut ==0x00)||(EPIn ==0x00)){
return 0x04;//USB设备不是U盘
}
//判断端点的传输特性,必须是批量传输
if((uDev[1].bAttr[1]!=0x02)||(uDev[1].bAttr[2]!=0x02)){
return 0x05;//USB设备不是U盘
}
OutPayLoad=WordSwap(uDev[1].wPayLoad[EPOut]);
InPayLoad=WordSwap(uDev[1].wPayLoad[EPIn]);
// Get_LUN();//取得设备最大逻辑单元,对爱国者迷你王128M(U盘型),Max_LUN=1
// MaxLUN=MassStorageDataBuf[0];
// if(MaxLUN>1) return 0x11;//USB设备不支持本通信协议
if(!UFLInquiry()){//获取设备信息
return 0x06;//USB设备不支持本通信协议
}
i=0;
while(i<20){
if(UFLReadCapacity()) break;
USB_Delay(200);
Reset_U();//如果读取数据失败,则Reset USB设备和接口
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return 0x07;//USB设备不支持本通信协议
/*********************************************************************************
Read Main Boot Record(MBR) Sector=0x00
MassStorageDataBuf[446]==0x80 --> First partition is active partition
MassStorageDataBuf[450]==0x04 --> FAT16
0x01 --> FAT12
0x06 --> BigFAT16
0x07 --> NTFS
0x0B --> FAT32
0x0C --> FAT32 LBA
**********************************************************************************/
// if(MaxLUN){//U盘为爱国者128M
// DBRAddr=0;
// }
// else{
if(UFLRead10(0x00)){
// if((MassStorageDataBuf[446]==0x80)){
DBRAddr=(WORD)MassStorageDataBuf[455]<<8|(WORD)MassStorageDataBuf[454];
USBCapacity=(LWORD)MassStorageDataBuf[461]<<24|(LWORD)MassStorageDataBuf[460]<<16|
(LWORD)MassStorageDataBuf[459]<<8|(LWORD)MassStorageDataBuf[458];
// }
}
else{
return 0x09;//USB设备不支持本通信协议
}
// }
/*********************************************************************************
Read DOS Boot Record Sector=DBRAddr
MassStorageDataBuf[11,12] w Byte Pre Sector
MassStorageDataBuf[13] b Sector Pre Cluster
MassStorageDataBuf[14,15] w Reserved sector
MassStorageDataBuf[16] b Number of FATs
MassStorageDataBuf[17,18] w Entry of Root
MassStorageDataBuf[22,23] w Sector Pre FAT
**********************************************************************************/
i=0;
while(i<20){
if(UFLRead10(DBRAddr)) break;
USB_Delay(200);
Reset_U();
USB_Delay(200);
UFLRequestSense();
USB_Delay(200);
i++;
}
if(i==20) return 0x0a;//USB设备不支持本通信协议
SectorSize=(WORD)MassStorageDataBuf[12]<<8|(WORD)MassStorageDataBuf[11];
ClusterSize=MassStorageDataBuf[13];
FATAddr=DBRAddr+((WORD)MassStorageDataBuf[15]<<8|(WORD)MassStorageDataBuf[14]);
FATNum=MassStorageDataBuf[16];
RootDirNum=(WORD)MassStorageDataBuf[18]<<8|(WORD)MassStorageDataBuf[17];
RootDirSize=(RootDirNum<<5)/SectorSize;
FATLength =(WORD)MassStorageDataBuf[23]<<8|(WORD)MassStorageDataBuf[22];
RootDirAddr=FATAddr+FATLength*FATNum;
FileDataAddr=RootDirAddr+RootDirSize;
// if(MaxLUN)//U盘为爱国者128M
// USBCapacity=(LWORD)MassStorageDataBuf[35]<<24|(LWORD)MassStorageDataBuf[34]<<16|
// (LWORD)MassStorageDataBuf[33]<<8|(LWORD)MassStorageDataBuf[32];
ValidCapacity=USBCapacity-1-RootDirSize-FATLength*FATNum;
ErrorCapacity=(LWORD)(FATLength*256-2)*ClusterSize-ValidCapacity;
UFLRead10(FATAddr);//读FAT表
UFLRead10(RootDirAddr);//读根目录区
return 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -