📄 ufi.c
字号:
#include "host_811.h"
extern BLOCK BlockCommand;
extern USBDEV uDev;
extern UINT8 bBUF[256];
//**********************************************************************************
//Functions
//
//**********************************************************************************
UINT8 BulkOut(UINT8 *pbBuffer,UINT16 len/*,UINT16 lba*/);
UINT8 BulkIn(UINT8 *pbBuffer,UINT16 len);
UINT8 Inquiry(void);
UINT8 TestUnit(void);
UINT8 LockMedia(void);
UINT8 RequestSense(void);
UINT8 ReadCapacity(void);
UINT8 Read(UINT32 dlba,UINT8 blen,UINT8 *pbBuffer);
UINT8 Write(UINT32 dlba,UINT8 blen,UINT8 *pbBuffer);
UINT8 PollDisk(void);
//**********************************************************************************
// END of Functions
//
//**********************************************************************************
extern UINT8 usbXfer(UINT8 usbaddr, UINT8 endpoint, UINT8 pid,UINT16 wPayload, UINT16 wLen, UINT8 *buffer);
extern void DelayMs(UINT8 nFactor);
extern UINT16 WordSwap(UINT16 input);
extern UINT32 DWordSwap(UINT32 dData);
//*********************************************************************
//*底层的批量传输函数
//*********************************************************************
UINT8 BulkOut(UINT8 *pbBuffer,/*UINT*/UINT16 len/*//UINT// UINT16 lba*/)
{
UINT16 j;
////////////////////////////////////////////////////////////////////////
while(len>0)
{
if (len >64)
j = 64;
else
j= len;
if(!usbXfer(0x01,uDev.bEpOut,PID_OUT,64,j,pbBuffer))
return FALSE;
len-=j;
pbBuffer=pbBuffer+j;
}
return TRUE;
}
UINT8 BulkIn(UINT8 *pbBuffer,/*UINT*/UINT16 len)
{
UINT8 i;
////////////////////////////////////////////////////////////////////////
if(len)
{
i=100;
while(!usbXfer(0x01,uDev.bEpin,PID_IN,64,len,pbBuffer))
{
i--;
}
if(i<=0)
return FALSE;
}
return TRUE;
}
//**********************************************************************
//获取U盘的硬件信息
//**********************************************************************
UINT8 Inquiry(void)
{
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x00000024;//0x24000000;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=sizeof(INQUIRY);
//-----------------------------------------------------------------
//包含在CBWCB中的Inquiry命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.OperationCode=UFI_CMD_INQUIRY;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.Reserved0=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.PageCode=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Inquiry.AllocationLen=0x24;
DelayMs(20);
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)))
return FALSE;
DelayMs(20);
if(!BulkIn(bBUF,38))
return FALSE;
if(!BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//测试U盘是否可用
//**********************************************************************
UINT8 TestUnit(void)
{
BlockCommand.CbwBlock.dCBW_Signature=(CBW_SIGNATURE); //CBW_SIGNATURE
BlockCommand.CbwBlock.dCBW_Tag=(0x60a624de);//0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x00000000;
BlockCommand.CbwBlock.bCBW_Flag=0x00;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=sizeof(TEST_UNIT);
//-----------------------------------------------------------------
//包含在CBWCB中的TestUnit命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_TestUnit.OperationCode=UFI_CMD_TESTUNITREADY;
DelayMs(70);
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)))
return FALSE;
DelayMs(150);
if(!BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//让U盘传回必要数据
//**********************************************************************
UINT8 RequestSense(void)
{
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x0000000e;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=sizeof(REQUEST_SENSE);
//-----------------------------------------------------------------
//包含在CBWCB中的RSEQUESTSENS命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_RequestSense.OperationCode=UFI_CMD_REQUESTSENSE;
BlockCommand.CbwBlock.CBWCommand.Ufi_RequestSense.AllocationLen=0x0e;
DelayMs(45);
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)/*,0*/))
return FALSE;
DelayMs(45);
if(!BulkIn((UINT8 *)bBUF,18))
return FALSE;
DelayMs(45);
if(!BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//读取已格U盘的容量
//**********************************************************************
UINT8 ReadCapacity(void)
{
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0x60a624de;
BlockCommand.CbwBlock.dCBW_DataXferLen=0x00000008;
BlockCommand.CbwBlock.bCBW_Flag=0x80;
BlockCommand.CbwBlock.bCBW_LUN=0;
//BlockCommand.CbwBlock.CBW_CDBLen=sizeof(READ_CAPACITY);
BlockCommand.CbwBlock.bCBW_CDBLen=sizeof(READ_CAPACITY);
//-----------------------------------------------------------------
//包含在CBWCB中的READCAPACITY命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_ReadCapacity.OperationCode=UFI_CMD_READCAPACITY;
DelayMs(45);
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)/*,0*/))
return FALSE;
DelayMs(45);
if(!BulkIn((UINT8 *)bBUF,8))
return FALSE;
DelayMs(45);
if(!BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//读取U盘中的数据
//**********************************************************************
UINT8 Read(UINT32 dlba,UINT8 blen,UINT8 *pbBuffer)
{ UINT8 i;
////////////////////////////////////////////////////////////////////////
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=sizeof(READ);
//-----------------------------------------------------------------
//包含在CBWCB中的READ命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.OperationCode=UFI_CMD_READ;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.Reserved1=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.LBA=DWordSwap(dlba);
BlockCommand.CbwBlock.CBWCommand.Ufi_Read.ReadLength=WordSwap(blen);
DelayMs(100);
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)/*,0*/))
return FALSE;
DelayMs(50);
i=100;
while(i--)
{
DelayMs(1);
if(BulkIn(pbBuffer,blen*512))
break;
}
if(i==0)
return FALSE;
DelayMs(2);
if(!BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
return FALSE;
return TRUE;
}
//**********************************************************************
//写数据到U盘
//**********************************************************************
UINT8 Write(UINT32 dlba,UINT8 blen,UINT8 *pbBuffer)
{
UINT8 i;
////////////////////////////////////////////////////////////////////////
BlockCommand.CbwBlock.dCBW_Signature=CBW_SIGNATURE;
BlockCommand.CbwBlock.dCBW_Tag=0xb4d977c1;
BlockCommand.CbwBlock.dCBW_DataXferLen=(blen*512);
BlockCommand.CbwBlock.bCBW_Flag=0x0;
BlockCommand.CbwBlock.bCBW_LUN=0;
BlockCommand.CbwBlock.bCBW_CDBLen=sizeof(WRITE);
//-----------------------------------------------------------------
//包含在CBWCB中的WRITE命令
//------------------------------------------------------------------
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.OperationCode=UFI_CMD_WRITE;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.Reserved1=0;
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.LBA=DWordSwap(dlba);
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.WriteLength=WordSwap(blen);
BlockCommand.CbwBlock.CBWCommand.Ufi_Write.Reserved2=0;
if(!BulkOut((UINT8 *)&BlockCommand.CbwBlock,sizeof(BlockCommand.CbwBlock)/*,0*/))
return FALSE;
DelayMs(200);
if(!BulkOut(pbBuffer,512*blen/*,dlba*/))
return FALSE;
i=10;
while(i--)
{
if(BulkIn((UINT8 *)&BlockCommand.CswBlock,13))
break;
}
if(i==0)
return FALSE;
return TRUE;
}
UINT8 PollDisk(void)
{
DelayMs(100);
if(!Inquiry())
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(!TestUnit())
// return FALSE;
if(!RequestSense())
return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -