📄 u_disk.c
字号:
//#include "host_811.h"
#include "USB_SYS.h"
BYTE ErrorCode=0x00;
BYTE EPOut,EPIn,MaxLUN; //~~此5个参数在u_test中付值
WORD OutPayLoad,InPayLoad;
LWORD USBCapacity; //~~在u_test中付值
BYTE MassStorageDataBuf[0x200]; //数据缓冲区
WORD DBRAddr,FATAddr,RootDirAddr,FileDataAddr;
WORD RootDirNum,SectorSize,FATLength; //FreeCapacity
BYTE ClusterSize,RootDirSize;
extern WORD TotalResultSize;
///////////////////////////////////////////////////////////////////////////////////////////
BYTE Get_LUN(void)
{
return VendorCmd(1,0xa1,0xfe,0x00,0x00,0x0001,MassStorageDataBuf);
}
//////////////////////////////////////////////////////////////////////////////////////////
BYTE Reset_U(void)
{
VendorCmd(1,0x21,0xff,0x00,0x02,0x0000,NULL);
VendorCmd(1,0x02,0x01,0x00,0x02,0x0000,NULL);
VendorCmd(1,0x02,0x01,0x00,0x03,0x0000,NULL);
return 1;
}
///////////////////////////////////////////////////////////////////////////////////////////
BYTE UFLInquiry(void)//查询,获取设备信息
{
BYTE i;
CBW MassStorageCBW;
BYTE MassStorageStatusBuf[13];
MassStorageCBW.dCBWSignature = 0x43425355;
MassStorageCBW.dCBWTag = 0x878bfa28;
//MassStorageCBW.dCBWSignature = 0x55534243;
//MassStorageCBW.dCBWTag = 0x28fa8b87;
MassStorageCBW.bCBWLUN = MaxLUN;
MassStorageCBW.bCBWCBLength = 0xC;
MassStorageCBW.bmCBWFlags = 0x80;
MassStorageCBW.dCBWDataTransferLength[0]=0x24;
MassStorageCBW.dCBWDataTransferLength[1]=0x0;
MassStorageCBW.dCBWDataTransferLength[2]=0x0;
MassStorageCBW.dCBWDataTransferLength[3]=0x0;
MassStorageCBW.CBWCB[0] = 0x12;
MassStorageCBW.CBWCB[1] = 0x0;
MassStorageCBW.CBWCB[2] = 0x0;
MassStorageCBW.CBWCB[3] = 0x0;
MassStorageCBW.CBWCB[4] = 0x24;
MassStorageCBW.CBWCB[5] = 0x0;
for(i=6;i<0x10;i++) MassStorageCBW.CBWCB[i]=0x0;
//~~命令传输(cbw)
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,31,(BYTE *)&MassStorageCBW)){ //CBW
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
//**读查询命令的返回值//~~即数据收入
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,36,(BYTE *)&MassStorageDataBuf)){
ErrorCode=0x01;
return FALSE;
}
//~~状态传输(csw)
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,13,(BYTE *)&MassStorageStatusBuf)){//CSW
ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00){ //~~判断命令是否成功
ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////
BYTE UFLRequestSense(void)//主机请求判别参数
{
BYTE i;
CBW MassStorageCBW;
BYTE MassStorageStatusBuf[13];
MassStorageCBW.dCBWSignature = 0x43425355;
MassStorageCBW.dCBWTag = 0x878bfa28;
MassStorageCBW.bCBWLUN = MaxLUN;
MassStorageCBW.bCBWCBLength = 0x0c;
MassStorageCBW.bmCBWFlags = 0x80;
MassStorageCBW.dCBWDataTransferLength[0]=0x12;
MassStorageCBW.dCBWDataTransferLength[1]=0x0;
MassStorageCBW.dCBWDataTransferLength[2]=0x0;
MassStorageCBW.dCBWDataTransferLength[3]=0x0;
MassStorageCBW.CBWCB[0] = 0x3;
MassStorageCBW.CBWCB[1] = 0x0;
MassStorageCBW.CBWCB[2] = 0x0;
MassStorageCBW.CBWCB[3] = 0x0;
MassStorageCBW.CBWCB[4] = 0x12;
MassStorageCBW.CBWCB[5] = 0x0;
for(i=6;i<0x10;i++) MassStorageCBW.CBWCB[i]=0x0;
//
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,31,(BYTE *)&MassStorageCBW)){ //CBW
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,18,(BYTE *)&MassStorageDataBuf)){
ErrorCode=0x01;
return FALSE;
}
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,13,(BYTE *)&MassStorageStatusBuf)){//CSW
ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00){
ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////
BYTE UFLReadCapacity(void)//读容量
{
BYTE i;
CBW MassStorageCBW;
BYTE MassStorageStatusBuf[13];
MassStorageCBW.dCBWSignature = 0x43425355;
MassStorageCBW.dCBWTag = 0x80EF4980;
MassStorageCBW.bCBWLUN = MaxLUN;
MassStorageCBW.bCBWCBLength = 0xC;
MassStorageCBW.bmCBWFlags = 0x80;
MassStorageCBW.dCBWDataTransferLength[0]=0x8;
MassStorageCBW.dCBWDataTransferLength[1]=0x0;
MassStorageCBW.dCBWDataTransferLength[2]=0x0;
MassStorageCBW.dCBWDataTransferLength[3]=0x0;
MassStorageCBW.CBWCB[0] = 0x25;
for(i=1;i<0x10;i++) MassStorageCBW.CBWCB[i]=0x0;
//
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,31,(BYTE *)&MassStorageCBW)){ //CBW
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,8,(BYTE *)&MassStorageDataBuf)){
ErrorCode=0x01;
return FALSE;
}
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,13,(BYTE *)&MassStorageStatusBuf)){//CSW
ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00){
ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// 读一个以LBA 开始的扇区512 B 字节的内容存放在MassStorageDataBuf[512] 中
//
//////////////////////////////////////////////////////////////////////////////////////////
BYTE UFLReadSector(LWORD LBA)//读一个扇区
{
BYTE i;
CBW MassStorageCBW;
BYTE MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x43425355;
MassStorageCBW.dCBWTag = 0x878bfa28;
MassStorageCBW.bCBWLUN = MaxLUN;
MassStorageCBW.bCBWCBLength = 0xC;
MassStorageCBW.bmCBWFlags = 0x80;
MassStorageCBW.dCBWDataTransferLength[0]=0x00;
MassStorageCBW.dCBWDataTransferLength[1]=0x02;
MassStorageCBW.dCBWDataTransferLength[2]=0x0;
MassStorageCBW.dCBWDataTransferLength[3]=0x0;
MassStorageCBW.CBWCB[0] = 0x28;
MassStorageCBW.CBWCB[1] = 0x00;
MassStorageCBW.CBWCB[2] = (LBA>>24)&0xff;
MassStorageCBW.CBWCB[3] = (LBA>>16)&0xff;
MassStorageCBW.CBWCB[4] = (LBA>>8)&0xff;
MassStorageCBW.CBWCB[5] = LBA&0xff;
for(i=6;i<0x10;i++) MassStorageCBW.CBWCB[i]=0x0;
MassStorageCBW.CBWCB[8] = 0x01;
//
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,31,(BYTE *)&MassStorageCBW)){ //CBW
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,0x200,MassStorageDataBuf)){
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,13,(BYTE *)&MassStorageStatusBuf)){//CSW
ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00){
ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////
BYTE UFLWriteSector(LWORD LBA)//写一个扇区,将MassStorageDataBuf写入LBA扇区
{
BYTE i;
CBW MassStorageCBW;
BYTE MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x43425355;
MassStorageCBW.dCBWTag = 0x878bfa28;
MassStorageCBW.bCBWLUN = MaxLUN;
MassStorageCBW.bCBWCBLength = 0xC;
MassStorageCBW.bmCBWFlags = 0x00;
MassStorageCBW.dCBWDataTransferLength[0]=0x00;
MassStorageCBW.dCBWDataTransferLength[1]=0x02;
MassStorageCBW.dCBWDataTransferLength[2]=0x0;
MassStorageCBW.dCBWDataTransferLength[3]=0x0;
MassStorageCBW.CBWCB[0] = 0x2A;
MassStorageCBW.CBWCB[1] = 0x00;
MassStorageCBW.CBWCB[2] = (LBA>>24)&0xff;
MassStorageCBW.CBWCB[3] = (LBA>>16)&0xff;
MassStorageCBW.CBWCB[4] = (LBA>>8)&0xff;
MassStorageCBW.CBWCB[5] = LBA&0xff;
for(i=6;i<0x10;i++) MassStorageCBW.CBWCB[i]=0x0;
MassStorageCBW.CBWCB[8] = 0x01;
//
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,31,(BYTE *)&MassStorageCBW)){ //CBW
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPOut,PID_OUT,0,OutPayLoad,0x200,MassStorageDataBuf)){
ErrorCode=0x01;
return FALSE;
}
USB_Delay(200);
if(!usbXfer(1,EPIn,PID_IN,0,InPayLoad,13,(BYTE *)&MassStorageStatusBuf)){//CSW
ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00){
ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
////////////////////////////////////////// 新添加/////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//extern SYS_INFO_BLOCK xdata DeviceInfo;
//extern FILE_INFO xdata ThisFile;
//extern unsigned char xdata DBUF[BUFFER_LENGTH];
//unsigned char xdata FATBUF[512];
//////////////////////////////////////////////////////////////////////////////////
LWORD FirstSectorofCluster(WORD clusterNum)//得到这个簇的首扇区号,clusernum是簇号
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -