⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_disk.c

📁 开发一个U盘的全套资料
💻 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 + -