?? 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 + -