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

📄 ufi.h

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

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

#include"FAT.h"
#include"1601driver.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 UFI_TEST_UNIT_READY			0x00
#define UFI_PREVENT_ALLOW_MEDIA_REMOVAL	0x1e
#define UFI_VERIFY					0x2f


#define SECTOR_SIZE			512


#define	MAX_LUN				0
#define BULKOUT_SIZE		64	


/******************************Flash相关**************************************/
#define DISK_ADDRESS			0x00040000	//模拟U盘位于Flash 512k处

#define READ_DISK(addr)			*((U16*)((DISK_ADDRESS+addr)<<1))
#define ERASE_SECTOR(addr)		Erase_Sector(DISK_ADDRESS+addr)
#define PROGRAM_SECTOR(src,dst)	Program_Sector(src,DISK_ADDRESS+dst)
#define DISK_BUFFER_SIZE		SECTOR_SIZE_1601*2					
/*****************************************************************************/		

/*****************************************************************************/
#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;
/**************************************************************************************/
U32		RemainSize;/*及其注意当要求发送128扇区时值为65536,若为 U16 则溢出!!!!!!*/
/**************************************************************************************/
U8		CurSendSize;
U8 		BulkOutDataBuffer[MAX_PACKAGE_SIZE];
U8		WriteDataBuffer[SECTOR_SIZE];
U8		TmpArray[MAX_PACKAGE_SIZE];
U8*		pBulkInData;
U8*		pWriteData;
BOOL 	CSWSendFlag=TRUE;

U8		DiskBuffer[DISK_BUFFER_SIZE];//4k Flash缓冲
U32		BulkOutDataSize,DiskSecIndex,CurDiskBufferDataAddr;


void UFIHandler(CBW_TYPE*);
void UFI_Inquiry(void);
void UFI_Read(UFI_TYPE*);
void UFI_ReadCapacity(void);
void UFI_ReadFormatCapacity(void);
void UFI_Write(UFI_TYPE* pUFI);
void UFI_ModeSense(void);
void UFI_TestUintReady(void);
void UFI_PreventAllowMediaRemoval(void);

void UFI_Init(void);
void UFI_Init(){}

void WriteToDisk(U8* pDataBuffer,int Size);
void UFI_Verify(void);
void ReadDisk(U8*,U32,U32);

/*******************************************************************************/
void BulkOut(){
	int index,size;
	CBW_TYPE* pCBW; 
	
	
	size=ReadPipeBulkOut(BulkOutDataBuffer);
	
	if(size==31){
		pCBW=(CBW_TYPE*)BulkOutDataBuffer;
		if(pCBW->dCBWSignature==0x43425355){
			UFIHandler(pCBW);
		}
	}else{
		if(size==0){
			//Uart_SendString("BulkOut zero");
			return;
		}
		if(size!=64)
			Uart_Printf("Size=",size);
		for(index=0;index<size;index++){
			DiskBuffer[CurDiskBufferDataAddr+index]=BulkOutDataBuffer[index];
		}
		
		CurDiskBufferDataAddr+=size;
		BulkOutDataSize-=size;
		//Uart_Printf("\nBulkOutDataSize",BulkOutDataSize);
		//Uart_Printf("\nCurDiskBufferDataAddr",CurDiskBufferDataAddr);
		if(BulkOutDataSize==0){
			PROGRAM_SECTOR((U16*)DiskBuffer,SECTOR_SIZE_1601*DiskSecIndex);
			
			//Uart_Printf("\nDiskSecIndex 1",DiskSecIndex);	
		}else if(CurDiskBufferDataAddr>=DISK_BUFFER_SIZE){
			
			PROGRAM_SECTOR((U16*)DiskBuffer,SECTOR_SIZE_1601*DiskSecIndex);
			//Uart_Printf("\nDiskSecIndex 2",DiskSecIndex);	
			
			CurDiskBufferDataAddr=0;
			DiskSecIndex++;
			if(BulkOutDataSize<DISK_BUFFER_SIZE){
				ReadDisk(DiskBuffer,DiskSecIndex*SECTOR_SIZE_1601*2,DISK_BUFFER_SIZE);
			}
		
		}
		
	}
	
	

}
void BulkIn(){

	
	
	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");
		}
	}
	/*********************************************************************/
	//!!!!及其注意,切不可在主机不要求的情况下发送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(pUFI);			break;
		case UFI_MODE_SENSE:			UFI_ModeSense();			break;
		case UFI_TEST_UNIT_READY:		UFI_TestUintReady();		break;
		case UFI_VERIFY:				UFI_Verify();				break;
		case UFI_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(){
	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_ModeSense(){
	
	
	TmpArray[0]=0x03;
	TmpArray[1]=0x00;
	TmpArray[2]=0x00;
	TmpArray[3]=0x00;
	
	pBulkInData=TmpArray;
	RemainSize=4;
	CSWSendFlag=FALSE;
}

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

void UFI_Verify(){
	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;
	U16 Length;
		
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
		
	LBA=ConvertToU32(&pUFI->LBA);
	Length=ConvertToU16(&pUFI->TransferLength);
	
	//Uart_SendString("\nREAD");
	//Uart_Printf("  LBA",LBA);
	//Uart_Printf("  Length",Length);
	

	ReadDisk(DiskBuffer,SECTOR_SIZE*LBA,512*Length);
	pBulkInData=DiskBuffer;
	RemainSize=SECTOR_SIZE*Length;
	CSWSendFlag=FALSE;
	
}

void UFI_Write(UFI_TYPE* pUFI){
	U32 LBA;
	U16 Length;
	
	
	
	CSW.dCSWDataResidue=0;
	CSW.bCSWStatus=0;
	
	
	
	LBA=ConvertToU32(&pUFI->LBA);
	Length=ConvertToU16(&pUFI->TransferLength);
	
	//Uart_SendString("\nWrite");
	//Uart_Printf("  LBA",LBA);
	//Uart_Printf("  Length",Length);
	BulkOutDataSize=Length*SECTOR_SIZE;
	DiskSecIndex=(SECTOR_SIZE*LBA/2)/SECTOR_SIZE_1601;
	CurDiskBufferDataAddr=SECTOR_SIZE*LBA-DiskSecIndex*SECTOR_SIZE_1601*2;
	
	
	
	if(BulkOutDataSize<DISK_BUFFER_SIZE){
		ReadDisk(DiskBuffer,DiskSecIndex*SECTOR_SIZE_1601*2,DISK_BUFFER_SIZE);
	}
	
	RemainSize=0;
	CSWSendFlag=FALSE;
}

void WriteToDisk(U8* pData,int size){
	static int CurSize=0;
	int i;
	
	for(i=0;i<size;i++){
		WriteDataBuffer[CurSize+i]=pData[i];
	}
	CurSize+=size;
	if(CurSize>=SECTOR_SIZE){
		for(i=0;i<CurSize;i++){
			pWriteData[i]=WriteDataBuffer[i];
		}
		pWriteData+=CurSize;
		CurSize=0;
	}
}

void ReadDisk(U8* pDataBuffer,U32 addr,U32 Size){
	U32 Index,U16Size,U16Addr;
	
	U16Size=Size>>1;
	U16Addr=addr>>1;
	for(Index=0;Index<U16Size;Index++){
		*((U16*)pDataBuffer+Index)=READ_DISK(U16Addr+Index);
	}
}
#endif

⌨️ 快捷键说明

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