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

📄 ufi.c

📁 SL811H的驱动
💻 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 + -