📄 ufi.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 + -