📄 u_disk.c
字号:
#include <host_811.h>
BYTE xdata ErrorCode=0x00;
BYTE xdata EPOut,EPIn,MaxLUN;
WORD xdata OutPayLoad,InPayLoad;
LWORD xdata USBCapacity;
BYTE xdata MassStorageDataBuf[0x200];
WORD xdata DBRAddr,FATAddr,RootDirAddr,FileDataAddr;
WORD xdata RootDirNum,SectorSize,FATLength;//,FreeCapacity
BYTE xdata ClusterSize,RootDirSize;
extern WORD xdata TotalResultSize;
BYTE Get_LUN()
{
return VendorCmd(1,0xa1,0xfe,0x00,0x00,0x0001,MassStorageDataBuf);
}
BYTE Reset_U()
{
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()//查询,获取设备信息
{
BYTE data i;
CBW xdata MassStorageCBW;
BYTE xdata MassStorageStatusBuf[13];
//
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;
//
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;
}
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()//主机请求判别参数
{
BYTE data i;
CBW xdata MassStorageCBW;
BYTE xdata MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x55534243;
MassStorageCBW.dCBWTag = 0x28fa8b87;
MassStorageCBW.bCBWLUN = MaxLUN;//0 1
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()//读容量
{
BYTE data i;
CBW xdata MassStorageCBW;
BYTE xdata MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x55534243;
MassStorageCBW.dCBWTag = 0x8049EF80;
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;
}
BYTE UFLRead10(LWORD LBA)//读一个扇区
{
BYTE data i;
CBW xdata MassStorageCBW;
BYTE xdata MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x55534243;
MassStorageCBW.dCBWTag = 0x28fa8b87;
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 UFLWrite10(LWORD LBA)//写一个扇区
{
BYTE data i;
CBW xdata MassStorageCBW;
BYTE xdata MassStorageStatusBuf[13];
//
MassStorageCBW.dCBWSignature = 0x55534243;
MassStorageCBW.dCBWTag = 0x28fa8b87;
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -