📄 ufi.c
字号:
#include "DataType.h"
#include "host_811.h"
#include "ufi.h"
#include "console.h"
#include "FAT.h"
BYTE bBUF[256];
BLOCK BlockCommand;
extern USBDEV uDev;
//*********************************************************************
//*底层的批量传输函数
//*********************************************************************
BYTE BulkOut(BYTE *pbBuffer,U16 len)
{
//WORD j;
//S8 i=100;
////////////////////////////////////////////////////////////////////////
/* while(len>0)
{
if (len >64)
j = 64;
else
j= len;
while(i--)
{
if(usbXfer(0x01,uDev.bEpOut,PID_OUT,64,j,pbBuffer))
break;
if(i<=2)
return FALSE;
}
len-=j;
pbBuffer=pbBuffer+j;
}*/
if(len)
return usbXfer(01,uDev.bEpOut,PID_OUT,64,len,pbBuffer);
return TRUE;
}
BYTE BulkIn(BYTE *pbBuffer,U16 len)
{
U16 i;
////////////////////////////////////////////////////////////////////////
i=100;
if(len)
{
while(i--)
{
if(usbXfer(0x01,uDev.bEpin,PID_IN,64,len,pbBuffer))
break;
if(i<=2)
return FALSE;
}
}
return TRUE;
}
BYTE Inquiry(void)
{
//BYTE i;
BYTE bBUF[256];
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x24;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=6;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_INQUIRY;
//-----------------------------------------------------------------
//包含在CBWCB中的Inquiry命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.Reserved0=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.PageCode=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.AllocationLen=0x24;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.Resverd2=0;
if(!BulkOut((BYTE *)&BlockCommand.CbwBlock,31))
return FALSE;
if(!BulkIn(bBUF,38))
return FALSE;
if(!BulkIn((BYTE *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//让U盘传回必要数据
//**********************************************************************
BYTE RequestSense(void)
{
U8 BUF[512];
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x0e;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=12;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_REQUESTSENSE;
/////////////////////////////////////
//cdbRequestSenseSPC.OperationCode=SPC_CMD_REQUESTSENSE;
BlockCommand.CbwBlock.CBWCommand.Ufi_RequestSense.AllocationLen=0x0e;
//////////////////////////////////////
if(!BulkOut((U8 *)&BlockCommand.CbwBlock,31))
return FALSE;
if(!BulkIn(BUF,18))
return FALSE;
if(!BulkIn((U8 *)&BlockCommand.CswBlock,13))
return FALSE;
/////////////////////////////
return TRUE;
}
//**********************************************************************
//测试U盘是否可用www.8dragon.com
//**********************************************************************
BYTE TestUnit(void)
{
//BYTE i;
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x00000000;
BlockCommand.CbwBlock.bCBW_Flag=0x00;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=12;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_TESTUNITREADY;
/////////////////////////////////////
//////////////////////////////////////
if(!BulkOut((U8 *)&BlockCommand.CbwBlock,31))
return FALSE;
if(!BulkIn((U8 *)&BlockCommand.CswBlock,13))
return FALSE;
////////////////////////////
return TRUE;
}
//**********************************************************************
//读取已格U盘的容量
//**********************************************************************
BYTE ReadCapacity(void)
{
BYTE bBUF[256];
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x08;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_CDBLen=12;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_READCAPACITY;
//-----------------------------------------------------------------
//包含在CBWCB中的READCAPACITY命令
//------------------------------------------------------------------
if(!BulkOut((BYTE *)&BlockCommand.CbwBlock,31))
return FALSE;
// Delay(1000000);
if(!BulkIn((BYTE *)bBUF,8))
return FALSE;
if(!BulkIn((BYTE *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//读取U盘中的数据
//**********************************************************************
BYTE Read(DWORD dlba,BYTE blen,BYTE *pbBuffer)
{
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=blen*512;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=12;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_READ;
//-----------------------------------------------------------------
//包含在CBWCB中的READ命令
//------------------------------------------------------------------
//BlockCommand.CbwBlock.CBWCommand.Ufi_Read.OperationCode=UFI_CMD_READ;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.Reserved1=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.L0=dlba;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.L1=dlba>>8;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.L2=dlba>>16;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.L3=dlba>>24;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.ReadLength=WordSwap(blen);
if(!BulkOut((BYTE *)&BlockCommand.CbwBlock,31))
return FALSE;
if(!BulkIn(pbBuffer,blen*512))
return FALSE;
if(!BulkIn((BYTE *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//写数据到U盘
//**********************************************************************
BYTE Write(DWORD dlba,BYTE blen,BYTE *pbBuffer)
{
S8 i;
// U8 bBUF[256];
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=blen*512;
BlockCommand.CbwBlock.bCBW_Flag=0x0;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=12;
BlockCommand.CbwBlock.OperationCode=UFI_CMD_WRITE;
//-----------------------------------------------------------------
//包含在CBWCB中的WRITE命令
//------------------------------------------------------------------
//BlockCommand.CbwBlock.CBWCommand.Ufi_Write.OperationCode=UFI_CMD_WRITE;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.Reserved1=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.L0=dlba;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.L1=dlba>>8;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.L2=dlba>>16;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.L3=dlba>>24;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.WriteLength=WordSwap(blen);
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.Reserved2=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.Reserved3=0;
Delay(600000);
if(!BulkOut((BYTE *)&BlockCommand.CbwBlock,31))
return FALSE;
Delay(600000);
if(!BulkOut(pbBuffer,512*blen))
return FALSE;
i=10;
// Delay(8000);
while(i--)
{
if(BulkIn((BYTE *)&BlockCommand.CswBlock,13))
break;
}
if(i<=0)
return FALSE;
return TRUE;
}
BYTE PollDisk(void)
{
//也许需要延长一定的时间,在每个测试参数后面
// BYTE Cache[512];
// int i;,n
// BYTE Cache[512],t=0;
// U16 i;
//也许需要延长一定的时间,在每个测试参数后面
if(!Inquiry())
return FALSE;
//if(!SPC_READLONG())
// return FALSE;
if(!TestUnit())
return FALSE;
if(!RequestSense())
return FALSE;
if(!TestUnit())
return FALSE;
if(!ReadCapacity())
return FALSE;
////////////////////////////////////////////////////
if(!RequestSense())
return FALSE;
if(!TestUnit())
return FALSE;
if(!ReadCapacity())
return FALSE;
if(!InitFsys())
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -