📄 bulkonly.c
字号:
//确认Meaningful
if ( mBOC.mCSW.mCSW_Status >= 2 && DataLength >= mBOC.mCSW.mCSW_Residue )
{
printf( " 收到的CSW: NON-Meaningful\n " ) ;
return( mResetErrorBOC( USB_INT_DISK_ERR ) ) ;
}
else if ( mBOC.mCSW.mCSW_Status == 0 )
return( USB_INT_SUCCESS );
else
{
printf( " 未知的Bulkonly传输错误,发生在CSW,该错误可能为CMD命令错误\n " ) ;
return( USB_INT_DISK_ERR ) ; //磁盘操作错误
}
}
/*********************************************************************************************************
** 函数名称: mDiskInquiry
** 功能描述: 获取磁盘特性
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出:
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mDiskInquiry( PUINT8 DataBuf )
{
mBOC.mCBW.mCBW_DataLen = 0x00000024 ;
mBOC.mCBW.mCBW_Flag = 0x80 ;
mBOC.mCBW.mCBW_CB_Len = 12 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x12 ; //命令码 Operation Code
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ; //Logical:Unit Number + Reserved + EVPD( Enable Vital Product Data )
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ; //Page Code:The UFI device supports only Page Code zero,Standard Inquiry Data.
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x24 ; //Allocation Length
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ; //Reserved
return( mBulkOnlyCmd( DataBuf ) ) ; //执行基于Bulk-only协议的命令
}
/*********************************************************************************************************
** 函数名称: Read Capacity
** 功能描述: 获取磁盘容量
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 要求设备返回当前容量
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mDiskCapacity( PUINT8 DataBuf )
{
mBOC.mCBW.mCBW_DataLen = 0x00000008 ;
mBOC.mCBW.mCBW_Flag = 0x80 ;
mBOC.mCBW.mCBW_CB_Len = 12 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x25 ; //命令码 Operation Code
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ; //Logical:Unit Number + Reserved + RelAdr
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ; //Logical Block Address( MSB ) -- Should be set to zero.
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ; //Logical Block Address
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x00 ; //Logical Block Address
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ; //Logical Block Address( LSB )
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ; //Reserved + PMI
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ; //Reserved
return( mBulkOnlyCmd( DataBuf ) ) ; //执行基于Bulk-only协议的命令
}
/*********************************************************************************************************
** 函数名称: Test Unit Ready
** 功能描述: 测试磁盘是否就绪
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 请求设备报告是否处于Ready状态
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mDiskTestReady( void )
{
mBOC.mCBW.mCBW_DataLen = 0 ;
mBOC.mCBW.mCBW_Flag = 0x00 ;
mBOC.mCBW.mCBW_CB_Len = 12 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x00 ; //命令码 Operation Code
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ; //Logical:Unit Number + Reserved
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ; //Logical Block Address( LSB )
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ; //Reserved
return( mBulkOnlyCmd( NULL ) ) ; //执行基于Bulk-only协议的命令
}
/*********************************************************************************************************
** 函数名称: Request Sense
** 功能描述: 检查磁盘错误状态
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 请求设备向主机返回执行结果
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mRequestSense( void )
{
UINT8 i ;
UINT8 s ;
UINT8 buf[ 18 ];
mDelaymS( 20 );
mBOC.mCBW.mCBW_DataLen = 0x00000012 ;
mBOC.mCBW.mCBW_Flag = 0x80 ;
mBOC.mCBW.mCBW_CB_Len = 12 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x03 ; //命令码 Operation Code
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ; //Logical:Unit Number + Reserved
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x12 ; //Allocation Length
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ; //Reserved
mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ; //Reserved
s = ( mBulkOnlyCmd( buf ) ) ; //执行基于Bulk-only协议的命令
printf( " The Sense Data is : " ) ;
for ( i = 0; i < 0x12; i ++ )
{
printf( "%x\n", ( UINT16 )buf[ i ] ) ;
}
return( s );
}
/*********************************************************************************************************
** 函数名称: mReadSector Read( 10 )
** 功能描述: 以扇区为单位从磁盘读取数据
**
** 输 入: StartLba: 操作的起始扇区号
** SectCount: 扇区数量
** DataBuf: 指向数据缓冲区
** 输 出: 请求设备向主机返回执行结果
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mReadSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf )
{
UINT32 len;
len = ( UINT32 )SectCount << 9 ;
mBOC.mCBW.mCBW_DataLen = len ;
mBOC.mCBW.mCBW_Flag = 0x80 ;
mBOC.mCBW.mCBW_CB_Len = 10 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x28 ; //命令码
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = ( UINT8 )( StartLba >> 24 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = ( UINT8 )( StartLba >> 16 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = ( UINT8 )( StartLba >> 8 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = ( UINT8 )( StartLba ) ;
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = SectCount ;
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;
return( mBulkOnlyCmd( DataBuf ) ) ; //执行基于Bulk-only协议的命令
}
/*********************************************************************************************************
** 函数名称: mWriteSector Write( 10 )
** 功能描述: 以扇区为单位将数据写入磁盘
**
** 输 入: StartLba: 操作的起始扇区号
** SectCount: 扇区数量
** DataBuf: 指向数据缓冲区
** 输 出: 请求设备向主机返回执行结果
**
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 mWriteSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf )
{
UINT32 len;
len = ( UINT32 )SectCount << 9 ;
mBOC.mCBW.mCBW_DataLen = len ;
mBOC.mCBW.mCBW_Flag = 0x00 ;
mBOC.mCBW.mCBW_CB_Len = 10 ;
mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x2A ; //命令码
mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 2 ] = ( UINT8 )( StartLba >> 24 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 3 ] = ( UINT8 )( StartLba >> 16 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 4 ] = ( UINT8 )( StartLba >> 8 ) ;
mBOC.mCBW.mCBW_CB_BUF[ 5 ] = ( UINT8 )( StartLba ) ;
mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;
mBOC.mCBW.mCBW_CB_BUF[ 8 ] = SectCount ;
mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;
return( mBulkOnlyCmd( DataBuf ) ) ; //执行基于Bulk-only协议的命令
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -