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

📄 cmdfifo.h

📁 44b0+PDIUSBD12开发的U盘源码
💻 H
字号:
#ifndef __UFI_H__
#define __UFI_H__

#include"..\INC\user.h"
#include"..\D12\D12OP.h"

#include"FAT.h"

#include"..\INC\Uart.h"




#define UFI_INQUIRY					0x12
#define UFI_READ_CAPACITY			0x25
#define UFI_READ_FORMAT_CAPACITY	0x23
#define	UFI_READ					0x28
#define	UFI_WRITE					0x2a	
#define UFI_MODE_SENSE				0x1a
#define TEST_UNIT_READY				0x00
#define PREVENT_ALLOW_MEDIA_REMOVAL	0x1e


#define FAT_SECTOR_SIZE		512
#define SECTORS_PER_CLUSTER	8	//每簇大小为2048字(4096字节),为39VF1601的一个Page
#define CLUSTER_SIZE		FAT_SECTOR_SIZE*SECTORS_PER_CLUSTER

#define	MAX_LUN				0
#define BULKOUT_SIZE		64	


/*****************************************************************************/
#define MAX_PACKAGE_SIZE				64
#define ReadPipeBulkOut(DBuffer)		D12RdEp(4,DBuffer,MAX_PACKAGE_SIZE)
#define WritePipeBulkIn(DBuffer,DSize)	D12WrEp(5,DBuffer,DSize);
/*****************************************************************************/


/*****!!!极其注意 ARM int型 数据是字对齐的!!!*****/
typedef struct{
	U8	OperationCode;
	U8	LUN;
	
	U8	LBA;
	U8	LBA1;
	U8	LBA2;
	U8	LBA3;
	
	U8	ReserveA;
	U8  TransferLength;
	U8  TransferLength1;
	U8	ReserveB[3];
}UFI_TYPE;
/*****!!!极其注意 ARM int型 数据是字对齐的!!!*****/

typedef struct{
	U32 dCBWSignature;
	U32 dCBWTag;
	U32 dCBWDataTransferLength;
	U8  bmCBWFlags;
	U8	bCBWLUN;
	U8	bCBWCBLength;
	U8  CBWCB[16];
}CBW_TYPE;

typedef struct{
	U32	dCSWSignature;
	U32 dCSWTag;
	U32 dCSWDataResidue;
	U8	bCSWStatus;
}CSW_TYPE;



CSW_TYPE	CSW;

U16		RemainSize=0;
U8		CurSendSize;
U8 		DataBuffer[64];
U8		UFIBuffer[512];//[CLUSTER_SIZE];
U8*		pBulkInData;
BOOL 	CSWSendFlag=TRUE;

U8		UFICmdFIFO[640];
U8		CurUFICmdIndex=0;
U8		CurBulkOutDataIndex=0;

void UFIHandler(CBW_TYPE*);
void UFI_Inquiry(void);
void UFI_Read(UFI_TYPE*);
void UFI_ReadCapacity(void);
void UFI_ReadFormatCapacity(void);
void UFI_Write(void);
void UFI_ModeSense(void);
void UFI_TestUintReady(void);
void UFI_PreventAllowMediaRemoval(void);
//void InitUFIBuffer(void);
void UFI_Init(void);
void GetUFICmd(void);

void UFI_Init(){}

void GetUFICmd(){
	CBW_TYPE* pCBW; 
	
	pCBW=(CBW_TYPE*)(UFICmdFIFO+64*CurUFICmdIndex);
	if(++CurUFICmdIndex>=10){
		CurUFICmdIndex=0;
	}
	if(pCBW->dCBWSignature==0x43425355){
		UFIHandler(pCBW);
	}
	
}
/*******************************************************************************/
void BulkOut(){
	U32 size;
	
	
	
	size=ReadPipeBulkOut(UFICmdFIFO+64*CurBulkOutDataIndex);
	if(++CurBulkOutDataIndex>=10){
		CurBulkOutDataIndex=0;
	}
	//////////////////////////////////////////////////////////
	/*if(size==31){
		pCBW=(CBW_TYPE*)(CurUFICmdIndex);
		if(pCBW->dCBWSignature==0x43425355){
			UFIHandler(pCBW);
		}
	}*/
	
	

}


void BulkIn(){
	if(RemainSize==0&&CSWSendFlag==TRUE){
		GetUFICmd();
	}
	
	if(RemainSize>0){
		if(RemainSize>BULKOUT_SIZE){
			CurSendSize=BULKOUT_SIZE;
			RemainSize-=BULKOUT_SIZE;
			WritePipeBulkIn(pBulkInData,CurSendSize);
			pBulkInData+=BULKOUT_SIZE;
		}else{
			CurSendSize=RemainSize;
			RemainSize=0;
			WritePipeBulkIn(pBulkInData,CurSendSize);
		}
		Uart_Printf("\nSend size:",CurSendSize);
	}else{
		if(CSWSendFlag==FALSE){
			WritePipeBulkIn((U8*)(&CSW),13);
			CSWSendFlag=TRUE;
			Uart_SendString("\nSend Csw");
		}else{
			WritePipeBulkIn((U8*)(&CSW),0);
		}
	}
	
}

void UFIHandler(CBW_TYPE* pCBW){
	UFI_TYPE* pUFI;
	pUFI=(UFI_TYPE*)(&(pCBW->CBWCB));
	Uart_Printf("\nCommand:",pUFI->OperationCode);
	
	
	CSW.dCSWSignature=0x53425355;
	CSW.dCSWTag=pCBW->dCBWTag;
	
	switch(pUFI->OperationCode){
		case UFI_INQUIRY:				UFI_Inquiry();				break;
		case UFI_READ:					UFI_Read(pUFI);				break;	
		case UFI_READ_CAPACITY:			UFI_ReadCapacity();			break;
		case UFI_READ_FORMAT_CAPACITY:	UFI_ReadFormatCapacity();	break;
		case UFI_WRITE:					UFI_Write();				break;
		case UFI_MODE_SENSE:			UFI_ModeSense();			break;
		case TEST_UNIT_READY:			UFI_TestUintReady();		break;
		case PREVENT_ALLOW_MEDIA_REMOVAL:UFI_PreventAllowMediaRemoval();break;
		default:
			//CSW.bCSWStatus=0x00;
			break;
				
	}
	
	
	
}
/*************************************************************************/
/*************************************************************************/

void UFI_Inquiry(void){

	U8  InquiryData[36]={
		0x00,//外设类型 软磁盘设备
		0x80,//RMB 可移除介质
		0x02,//版本号
		0x02,//响应数据的格式
		0x1f,//附加数据长度
		0,0,0,//保留
		'B','7','0','7',0,0,0,0,//厂商信息
		'U','D','i','s','k',0,0,0,0,0,0,0,0,0,0,0,
		0,1,0,0//产品版本信息

	};
	
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	
	pBulkInData=InquiryData;
	RemainSize=36;
	CSWSendFlag=FALSE;
}

void UFI_ReadCapacity(){
	//((U32*)UFIBuffer)[0]=2047;	//Last logical block address
	//((U32*)UFIBuffer)[1]=1024;	//Block length in bytes
	U8	pd[8]={0x00,0x00,0x08,0x00,
			   0x00,0x00,0x02,0x00}; 
	
	
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	pBulkInData=pd;
	RemainSize=8;
	CSWSendFlag=FALSE;
}
void UFI_ReadFormatCapacity(){
	
	U8 bf[20]={0x00,0x00,0x00,0x10,
			   0x00,0x01,0xf4,0x00,
			   0x02,0x00,0x02,0x00,
			   0x00,0x01,0xf4,0x00,
			   0x00,0x00,0x02,0x00};
    
    //CSW.dCSWDataResidue=0xe8;
	CSW.bCSWStatus=0;
	
	pBulkInData=bf;
	RemainSize=20;
	CSWSendFlag=FALSE;
	
}



void UFI_Write(){
	RemainSize=0;
	CSWSendFlag=FALSE;
}

void UFI_ModeSense(){
	
	
	UFIBuffer[0]=0x03;
	UFIBuffer[1]=0x00;
	UFIBuffer[2]=0x00;
	UFIBuffer[3]=0x00;
	
	pBulkInData=UFIBuffer;
	RemainSize=4;
	CSWSendFlag=FALSE;
}

void UFI_TestUintReady(){
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	
	RemainSize=0;
	CSWSendFlag=FALSE;
}

void UFI_PreventAllowMediaRemoval(){
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	
	RemainSize=0;
	CSWSendFlag=FALSE;
}


void UFI_Read(UFI_TYPE* pUFI){
	U32 LBA;
	U8  Length;
	
	/*Uart_SendNum(*((U8*)pUFI));
	Uart_SendNum(*((U8*)pUFI+1));
	Uart_SendNum(*((U8*)pUFI+2));
	Uart_SendNum(*((U8*)pUFI+3));
	Uart_SendNum(*((U8*)pUFI+4));
	Uart_SendNum(*((U8*)pUFI+5));
	Uart_SendNum(*((U8*)pUFI+6));
	Uart_SendNum(*((U8*)pUFI+7));
	Uart_SendNum(*((U8*)pUFI+8));*/
	
	
	
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	
	//Uart_Printf("\nLength",ConvertToU16(&pUFI->TransferLength));
	//Uart_Printf("\nLBA",ConvertToU32(&pUFI->LBA));
	//if(*((int*)(&(pUFI->LBA)))==0){
	LBA=ConvertToU32(&pUFI->LBA);
	Length=ConvertToU16(&pUFI->TransferLength);
	//Uart_SendNum(LBA);
	//if(LBA==0){
	//	pBulkInData=VDisk;
	//}else{
		pBulkInData=VDisk+512*LBA;
	//}
		RemainSize=512*Length;
	
		CSWSendFlag=FALSE;
	

	
	/*}else{
		
		pBulkInData=UFIBuffer+512;
		RemainSize=512*(*((U8*)pUFI+8));
		CSWSendFlag=FALSE;
	
	}*/
	
	//Uart_Printf("List:",pUFI->List);
	//while(1);
	
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -