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

📄 u_disk.c

📁 基于Embest开发环境
💻 C
📖 第 1 页 / 共 2 页
字号:
//#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 + -