?? 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 + -