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