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

📄 ufi.c

📁 arm(s3c440b)读写u盘源程序
💻 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 + -