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

📄 massstorage.c

📁 ARM主USB程序
💻 C
字号:
#include "..\sl811\ezusb.h"
#include "..\sl811\ezregs.h"
#include "massstorage.h"
#include "..\sl811\host_811.h"
#include "..\target\def.h"
#include "..\target\44blib.h"
//#define OutPayLoad 64
//#define InPayLoad 64
CBW MassStorageCBW;
CSW MassStorageCSW;
BYTE MassStorageDataBuf[40];
 WORD SwapINT16(WORD dData);
 DWORD SwapINT32(DWORD dData);
 extern pUSBDEV  uDev[MAX_DEV];
/*
***************************************************************************************************
*  描述:UFI查询命令
*  函数原型:
*  入口参数:
*  出口参数:
*  附加信息:
***************************************************************************************************
*/
BYTE UFI_INQUIRY(void)//查询,获取设备信息
{
BYTE MassStorageStatusBuf[13];
MassStorageCBW.dCBWSignature=CBWSIGNATURE;
MassStorageCBW.dCBWTag= 0x28fa8b87;
MassStorageCBW.dCBWDataTransferLength[0]= 0x24;
MassStorageCBW.dCBWDataTransferLength[1]= 0x00;
MassStorageCBW.dCBWDataTransferLength[2]= 0x00;
MassStorageCBW.dCBWDataTransferLength[3]= 0x00;
MassStorageCBW.bmCBWFlags= 0x80; //D7位=0表示主机到设备的数据输出
//D7位=1表示设备到主机的数据输入
MassStorageCBW.bCBWLUN= 0;//表示接受该命令的设备的逻辑单元号LUN
MassStorageCBW.bCBWCBLength= 0x0C;
//表示CBWCB的长度,即将要发送的特定子类的长度

MassStorageCBW.CBWCB[0]= 0x12;
MassStorageCBW.CBWCB[1]= 0x0;
MassStorageCBW.CBWCB[2]= 0x0;
MassStorageCBW.CBWCB[3]= 0x0;
MassStorageCBW.CBWCB[4]= 0x24;
MassStorageCBW.CBWCB[5]= 0x0;
MassStorageCBW.CBWCB[6] = 0x00;
MassStorageCBW.CBWCB[7] = 0x00;
MassStorageCBW.CBWCB[8] = 0x00;
MassStorageCBW.CBWCB[9] = 0x00;
MassStorageCBW.CBWCB[10] = 0x00;
MassStorageCBW.CBWCB[11] = 0x00;
MassStorageCBW.CBWCB[12] = 0x00;
MassStorageCBW.CBWCB[13] = 0x00;
MassStorageCBW.CBWCB[14] = 0x00;
MassStorageCBW.CBWCB[15] = 0x00;

if(!BulkSend(31,(BYTE*)&MassStorageCBW)) //发送命令
{
//ErrorCode=0x01;
Uart_Printf("error\n");
return FALSE;
}
//EZUSB_Delay(20000);//严时200MS
Uart_Printf("UFI_INQUIRY write ok\n");
if(!BulkReceive(  36,MassStorageDataBuf )) //设备到主机的数据传输,在此句无数据返回
{
//ErrorCode=0x01;
return FALSE;
}
Uart_Printf("%x",MassStorageDataBuf);
Uart_Printf("UFI_INQUIRY read ok\n");
if(!BulkReceive(  13,MassStorageStatusBuf ))
{
//ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00)
{
//ErrorCode=0x01;
return FALSE;
}
Uart_Printf("UFI_INQUIRY send ok\n");
return TRUE;
}

/*
***************************************************************************************************
*  描述:UFI读容量命令
*  函数原型:
*  入口参数:
*  出口参数:
*  附加信息:
***************************************************************************************************
*/
BYTE UFI_READCAPACITY(void)
{
   
    
     BYTE MassStorageStatusBuf[13];
     MassStorageCBW.dCBWSignature =CBWSIGNATURE;
     MassStorageCBW.dCBWTag = 0x28FA8B87;
     MassStorageCBW.dCBWDataTransferLength[0] = 0x08;
     MassStorageCBW.dCBWDataTransferLength[1]= 0x0;
     MassStorageCBW.dCBWDataTransferLength[2]= 0x0;
     MassStorageCBW.dCBWDataTransferLength[3]= 0x0;
     MassStorageCBW.bmCBWFlags = 0x80;
     MassStorageCBW.bCBWLUN = 0;
     MassStorageCBW.bCBWCBLength = 0x0C;
     MassStorageCBW.CBWCB[0] = 0x25;       //操作码
     MassStorageCBW.CBWCB[1] = 0x00;              
     MassStorageCBW.CBWCB[2] = 0x00;
     MassStorageCBW.CBWCB[3] = 0x00;
     MassStorageCBW.CBWCB[4] = 0x00;
     MassStorageCBW.CBWCB[5] = 0x00;
     MassStorageCBW.CBWCB[6] = 0x00;
     MassStorageCBW.CBWCB[7] = 0x00;
     MassStorageCBW.CBWCB[8] = 0x00;
     MassStorageCBW.CBWCB[9] = 0x00;
     MassStorageCBW.CBWCB[10] = 0x00;
     MassStorageCBW.CBWCB[11] = 0x00;
     MassStorageCBW.CBWCB[12] = 0x00;
     MassStorageCBW.CBWCB[13] = 0x00;
     MassStorageCBW.CBWCB[14] = 0x00;
     MassStorageCBW.CBWCB[15] = 0x00;
     
if(!BulkSend(31,(BYTE*)&MassStorageCBW)) //发送命令
{
//ErrorCode=0x01;
return FALSE;
}

Uart_Printf("write ok\n");
if(BulkReceive(  8,MassStorageDataBuf )) 
{
//ErrorCode=0x01;
return FALSE;
}


if(!BulkReceive(  13,MassStorageStatusBuf))
{
//ErrorCode=0x01;
return FALSE;
}


if(MassStorageStatusBuf[12]!=0x00)
{
//ErrorCode=0x01;
return FALSE;
}
return TRUE;
}

/*
***************************************************************************************************
*  描述:UFI读命令
*  函数原型:
*  入口参数:
*  出口参数:
*  附加信息:
***************************************************************************************************
*/
BYTE UFI_READ(DWORD lba,BYTE *pDataBuf)
{
   
      BYTE MassStorageStatusBuf[13];
     
     MassStorageCBW.dCBWSignature = CBWSIGNATURE;
     MassStorageCBW.dCBWTag = 0x28FA8B87;
     MassStorageCBW.dCBWDataTransferLength[0] = 0x00;
     MassStorageCBW.dCBWDataTransferLength[1]= 0x02;
     MassStorageCBW.dCBWDataTransferLength[2]= 0x00;
     MassStorageCBW.dCBWDataTransferLength[3]= 0x00;
     MassStorageCBW.bmCBWFlags = 0x80;
     MassStorageCBW.bCBWLUN = 0;
     MassStorageCBW.bCBWCBLength = 0x0C;
     MassStorageCBW.CBWCB[0] = 0x28;                       //操作码  
     MassStorageCBW.CBWCB[1] = 0x00;
     MassStorageCBW.CBWCB[2] = (unsigned char)(lba>>24);   //逻辑块地址(MSB)
     MassStorageCBW.CBWCB[3] = (unsigned char)(lba>>16);
     MassStorageCBW.CBWCB[4] = (unsigned char)(lba>>8);
     MassStorageCBW.CBWCB[5] = (unsigned char)(lba);       //逻辑块地址(LSB)
     MassStorageCBW.CBWCB[6] = 0x00;   
     MassStorageCBW.CBWCB[7] = 0x00;                       //传输数据长度(MSB)
     MassStorageCBW.CBWCB[8] = 0x01;                       //传输数据长度(LSB) 
     MassStorageCBW.CBWCB[9] = 0x00;   
     MassStorageCBW.CBWCB[10] = 0x00;   
     MassStorageCBW.CBWCB[11] = 0x00;   
     MassStorageCBW.CBWCB[12] = 0x00;
     MassStorageCBW.CBWCB[13] = 0x00;
     MassStorageCBW.CBWCB[14] = 0x00;
     MassStorageCBW.CBWCB[15] = 0x00;
if(!BulkSend(31,(BYTE*)&MassStorageCBW)) //设备到主机的数据传输,在此句无数据返回
{
//ErrorCode=0x01;
return FALSE;
}
if(!BulkReceive( 512,pDataBuf))//  暂时定为常数512
{
//ErrorCode=0x01;
return FALSE;
}
if(!BulkReceive(  13,MassStorageStatusBuf))
{
//ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00)
{
//ErrorCode=0x01;
return FALSE;
}
return TRUE;
}

/*
***************************************************************************************************
*  描述:UFI写命令
*  函数原型:
*  入口参数:
*  出口参数:
*  附加信息:
***************************************************************************************************
*/
BYTE UFI_WRITE(DWORD lab,BYTE *pDataBuf)
{
    
  
      BYTE MassStorageStatusBuf[13];
     MassStorageCBW.dCBWSignature = 0x55534243;
     MassStorageCBW.dCBWTag = 0xb4D977c1;
     MassStorageCBW.dCBWDataTransferLength[0] = 0x00;
     MassStorageCBW.dCBWDataTransferLength[1]= 0x02;
     MassStorageCBW.dCBWDataTransferLength[2]= 0x00;
     MassStorageCBW.dCBWDataTransferLength[3]= 0x00;
     MassStorageCBW.bmCBWFlags = 0x00;
     MassStorageCBW.bCBWLUN = 0;
     MassStorageCBW.bCBWCBLength = 0x0C;
     MassStorageCBW.CBWCB[0] = 0x2A;                       //操作码  
     MassStorageCBW.CBWCB[1] = 0x00;
     MassStorageCBW.CBWCB[2] = (unsigned char)(lab>>24);   //逻辑块地址(MSB)
     MassStorageCBW.CBWCB[3] = (unsigned char)(lab>>16);
     MassStorageCBW.CBWCB[4] = (unsigned char)(lab>>8);
     MassStorageCBW.CBWCB[5] = (unsigned char)(lab);       //逻辑块地址(LSB)
     MassStorageCBW.CBWCB[6] = 0x00;   
     MassStorageCBW.CBWCB[7] = 0x00;                       //传输数据长度(MSB)
     MassStorageCBW.CBWCB[8] = 0x01;                       //传输数据长度(LSB) 
     MassStorageCBW.CBWCB[9] = 0x00;   
     MassStorageCBW.CBWCB[10] = 0x00;   
     MassStorageCBW.CBWCB[11] = 0x00;   
     MassStorageCBW.CBWCB[12] = 0x00;
     MassStorageCBW.CBWCB[13] = 0x00;
     MassStorageCBW.CBWCB[14] = 0x00;
     MassStorageCBW.CBWCB[15] = 0x00;
     
if(!BulkSend(31,(BYTE*)&MassStorageCBW)) //设备到主机的数据传输,在此句无数据返回
{
//ErrorCode=0x01;
return FALSE;
}
if(!BulkSend( 512,pDataBuf))//  暂时定为常数512
{
//ErrorCode=0x01;
return FALSE;
}
if(!BulkReceive(  13,MassStorageStatusBuf))
{
//ErrorCode=0x01;
return FALSE;
}
if(MassStorageStatusBuf[12]!=0x00)
{
//ErrorCode=0x01;
return FALSE;
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
BYTE usbReadPage(WORD block,WORD page,BYTE *pPage)

{


DWORD logicblockaddr;

logicblockaddr=block*32+page;

if(!UFI_READ(logicblockaddr,pPage))
return FALSE;

return TRUE;


}




////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////



BYTE  usbWritePage(WORD block,WORD page,BYTE *pPage)

{

DWORD logicblockaddr;

logicblockaddr=block*32+page;

if(!UFI_WRITE(logicblockaddr,pPage))
return FALSE;
return TRUE;
}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -