?? mass_bulk.c
字號:
CapacityDataBuf[5]*0x10000+
CapacityDataBuf[4]*0x1000000;
medium_ptr->LastLogicalBlookAddress // 媒介最后塊地址
= CapacityDataBuf[3] +
CapacityDataBuf[2]*0x100 +
CapacityDataBuf[1]*0x10000+
CapacityDataBuf[0]*0x1000000;
return COMMAND_PASSED;
FAILURE:
medium_ptr->BlockLengthInBytes = 0;
medium_ptr->LastLogicalBlookAddress =0;
return COMMAND_FAILED;
}
INT8U Test_UnitReady(hMedLUN *medium_ptr)
{
COMMAND_BLOCK_WRAPPER *CBW_ptr;
READ_CAPACITY *CBWCB_ptr;
INT16U err;
if (medium_ptr->MSC == NULL) {
return PERSISTENT_FAILURE;
}
CBW_ptr = (COMMAND_BLOCK_WRAPPER *)(medium_ptr->MSC->CBW_Buff);
CBW_ptr->dCBW_Tag++;
CBW_ptr->dCBW_DataXferLen_0 = 0;
CBW_ptr->dCBW_DataXferLen_1 = 0;
CBW_ptr->dCBW_DataXferLen_2 = 0;
CBW_ptr->dCBW_DataXferLen_3 = 0;
CBW_ptr->bCBW_Flag = CBW_OUT_DATA;
CBW_ptr->bCBW_LUN = medium_ptr->LUN;
CBW_ptr->bCBW_CDBLength = 6;
//CBWCB_ptr = (READ_CAPACITY *)CBW_ptr->CBWCB;
//memset((INT8U *)CBWCB_ptr, 0x00, 16);
//CBWCB_ptr->OperationCode = UFI_READCAPACITY;
memset(CBW_ptr->CBWCB, 0x00, 16);
CBW_ptr->CBWCB[0] = 0x00;
err = Bulk_Transfer(DirectionPID_OUT, (INT8U *)CBW_ptr, 31, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Get_CSWStatus(medium_ptr);
if (err) {
goto FAILURE;
}
return COMMAND_PASSED;
FAILURE:
return COMMAND_FAILED;
}
//**********************************************************************************************
// 函數名稱:GetMassBulkOnlyInfo
// 輸入參數:mass_i_ptr,大容量類設備描述數據結構指針
// 輸出參數:出錯返回NULL
// 正確返回最后一個邏輯單元描述指針
// 功能描述:獲取大容量類CBI協議設備描述信息。
//**********************************************************************************************
hMedLUN *BulkOnlyGet_MassInfo(MassStorageClass *mass_i_ptr)
{
INT8U MediumIndex;
hMedLUN *medium_infor_ptr;
COMMAND_BLOCK_WRAPPER *CBW_ptr;
/*
CBW_ptr = (COMMAND_BLOCK_WRAPPER *)(mass_i_ptr->CBW_Buff);
CBW_ptr = (void *)0x002000CA;
CBW_ptr->dCBW_Tag++;
*/
mass_i_ptr->CBW_Buff[0] = 0x55;
mass_i_ptr->CBW_Buff[1] = 0x53;
mass_i_ptr->CBW_Buff[2] = 0x42;
mass_i_ptr->CBW_Buff[3] = 0x43;
if (FALSE == Reset_MassStorage(mass_i_ptr->dvi_ptr)) {
return NULL;
}
mass_i_ptr->LUN = Get_MaxLUN(mass_i_ptr->dvi_ptr);
for(MediumIndex = 0;mass_i_ptr->LUN +1>MediumIndex;MediumIndex++)
{
medium_infor_ptr = mass_i_ptr->LUN_info_ptr[MediumIndex];
medium_infor_ptr->LUN = MediumIndex;
medium_infor_ptr->MSC = mass_i_ptr ;
medium_infor_ptr->BlockLengthInBytes = 0;
medium_infor_ptr->LastLogicalBlookAddress=0;
if( Get_ThisInquiryData( medium_infor_ptr ) ) // 獲取產品及廠家信息
return NULL ;
}
return medium_infor_ptr;
}
//*****************************************************************************
//功能描述:GetRequestSense
//輸入參數:hMedLUNPtr,邏輯單元描述數據結構指針
// SenseDataPtr,判別代碼數據結構批針,保存返回數據
//輸出參數:COMMAND_PASSED,命令完成
// COMMAND_FAILED,命令失敗
// PHASE_ERROR,相位出錯
// PERSISTENT_FAILURE,嚴重出錯
//功能描述:獲取媒介的容量,塊字節數及最后塊地址.
//****************************************************************************
INT8U Get_RequestSense(hMedLUN *medium_ptr, SENSE_DATA *SenseData_ptr)
{
INT8U SenseDataBuf[18];
INQUIRY_COMMAND *inquiry_ptr;
COMMAND_BLOCK_WRAPPER *CBW_ptr;
REQUEST_SENSE *CBWCB_ptr;
INT16U err;
if (medium_ptr->MSC == NULL) {
return PERSISTENT_FAILURE;
}
CBW_ptr = (COMMAND_BLOCK_WRAPPER *)(medium_ptr->MSC->CBW_Buff);
CBW_ptr->dCBW_Tag++;
CBW_ptr->dCBW_DataXferLen_0 = 18;
CBW_ptr->dCBW_DataXferLen_1 = 0;
CBW_ptr->dCBW_DataXferLen_2 = 0;
CBW_ptr->dCBW_DataXferLen_3 = 0;
CBW_ptr->bCBW_Flag = CBW_IN_DATA;
CBW_ptr->bCBW_LUN = medium_ptr->LUN;
CBW_ptr->bCBW_CDBLength = 12;
CBWCB_ptr = (REQUEST_SENSE *)CBW_ptr->CBWCB;
memset((INT8U *)CBWCB_ptr, 0x00, 16);
CBWCB_ptr->OperationCode = UFI_READCAPACITY;
CBWCB_ptr->AllocationLength = 18;
err = Bulk_Transfer(DirectionPID_OUT, (INT8U *)CBW_ptr, 31, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Bulk_Transfer(DirectionPID_IN, SenseDataBuf, 18, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Get_CSWStatus(medium_ptr);
if (err) {
goto FAILURE;
}
SenseData_ptr->SenseKey = SenseDataBuf[2]&0x0f;
SenseData_ptr->ASC = SenseDataBuf[12];
SenseData_ptr->ASCQ = SenseDataBuf[13];
return COMMAND_PASSED;
FAILURE:
return COMMAND_FAILED;
}
//****************************************************************************
//函數名稱:ReadBlockData
//輸入參數:MediumPtr,操作媒體句柄
// BufferPtr,存緩數據緩沖區指針
// LBA,邏輯塊地址
// TrBLength,邏輯塊數目(1~0xffff)。
//輸出參數:實際讀入的字節數,設備不存在或未準備好返回0.
//功能描述:讀邏輯單元塊數據。
//***************************************************************************
INT32U Read_BlockData(hMedLUN *medium_ptr,
INT8U *data_ptr,
unsigned int LBA,
unsigned short block_num)
{
SENSE_DATA SenseData;
INQUIRY_COMMAND *inquiry_ptr;
COMMAND_BLOCK_WRAPPER *CBW_ptr;
READ_10 *CBWCB_ptr;
INT16U err;
INT32U DataSize;
if (medium_ptr->MSC == NULL) {
return 0;
}
if ( (medium_ptr->BlockLengthInBytes==0x00)
||(medium_ptr->LastLogicalBlookAddress==0x00) ) {
return 0;
}
DataSize = block_num * medium_ptr->BlockLengthInBytes;
CBW_ptr = (COMMAND_BLOCK_WRAPPER *)(medium_ptr->MSC->CBW_Buff);
CBW_ptr->dCBW_Tag++;
CBW_ptr->dCBW_DataXferLen_0 = (INT8U)DataSize;
CBW_ptr->dCBW_DataXferLen_1 = (INT8U)(DataSize/0x100);
CBW_ptr->dCBW_DataXferLen_2 = (INT8U)(DataSize/0x10000);
CBW_ptr->dCBW_DataXferLen_3 = (INT8U)(DataSize/0x1000000);
CBW_ptr->bCBW_Flag = CBW_IN_DATA;
CBW_ptr->bCBW_LUN = medium_ptr->LUN;
CBW_ptr->bCBW_CDBLength = 12;
CBWCB_ptr = (READ_10 *)CBW_ptr->CBWCB;
memset((INT8U *)CBWCB_ptr, 0x00, 16);
CBWCB_ptr->OperationCode = UFI_READ10;
CBWCB_ptr->LBA_0 = (INT8U) LBA;
CBWCB_ptr->LBA_1 = (INT8U)(LBA/0x100);
CBWCB_ptr->LBA_2 = (INT8U)(LBA/0x10000);
CBWCB_ptr->LBA_3 = (INT8U)(LBA/0x1000000);
CBWCB_ptr->TransferLength_0 = (INT8U)block_num;
CBWCB_ptr->TransferLength_1 = (INT8U)(block_num/0x100);
err = Bulk_Transfer(DirectionPID_OUT, (INT8U *)CBW_ptr, 31, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Bulk_Transfer(DirectionPID_IN, data_ptr, DataSize, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Get_CSWStatus(medium_ptr);
if (err) {
goto FAILURE;
}
return DataSize;
FAILURE:
if (Get_RequestSense(medium_ptr, &SenseData)) {
return 0;
}
else {
if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00)) {
medium_ptr->BlockLengthInBytes = NULL;
medium_ptr->LastLogicalBlookAddress = NULL;
}
}
return 0;
}
//****************************************************************************
//函數名稱:WriteBlockData
//輸入參數:MediumPtr,操作媒體句柄
// BufferPtr,存緩數據緩沖區指針
// LBA,邏輯塊地址
// TrBLength,邏輯塊數目(1~0xffff)。
//輸出參數:實際讀入的字節數,設備不存在或未準備好返回NULL.
//功能描述:寫邏輯單元塊數據。
//***************************************************************************
INT32U Write_BlockData( hMedLUN *medium_ptr,
INT8U *data_ptr,
unsigned int LBA,
unsigned short block_num)
{
SENSE_DATA SenseData;
INQUIRY_COMMAND *inquiry_ptr;
COMMAND_BLOCK_WRAPPER *CBW_ptr;
WRITE_10 *CBWCB_ptr;
INT16U err;
INT32U DataSize;
if (medium_ptr->MSC == NULL) {
return 0;
}
if ( (medium_ptr->BlockLengthInBytes==0x00)
||(medium_ptr->LastLogicalBlookAddress==0x00) ) {
return 0;
}
DataSize = block_num * medium_ptr->BlockLengthInBytes;
CBW_ptr = (COMMAND_BLOCK_WRAPPER *)(medium_ptr->MSC->CBW_Buff);
CBW_ptr->dCBW_Tag++;
CBW_ptr->dCBW_DataXferLen_0 = (INT8U)DataSize;
CBW_ptr->dCBW_DataXferLen_1 = (INT8U)(DataSize/0x100);
CBW_ptr->dCBW_DataXferLen_2 = (INT8U)(DataSize/0x10000);
CBW_ptr->dCBW_DataXferLen_3 = (INT8U)(DataSize/0x1000000);
CBW_ptr->bCBW_Flag = CBW_OUT_DATA;
CBW_ptr->bCBW_LUN = medium_ptr->LUN;
CBW_ptr->bCBW_CDBLength = 12;
CBWCB_ptr = (WRITE_10 *)CBW_ptr->CBWCB;
memset((INT8U *)CBWCB_ptr, 0x00, 16);
CBWCB_ptr->OperationCode = UFI_READ10;
CBWCB_ptr->LBA_0 = (INT8U) LBA;
CBWCB_ptr->LBA_1 = (INT8U)(LBA/0x100);
CBWCB_ptr->LBA_2 = (INT8U)(LBA/0x10000);
CBWCB_ptr->LBA_3 = (INT8U)(LBA/0x1000000);
CBWCB_ptr->TransferLength_0 = (INT8U)block_num;
CBWCB_ptr->TransferLength_1 = (INT8U)(block_num/0x100);
err = Bulk_Transfer(DirectionPID_OUT, (INT8U *)CBW_ptr, 31, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Bulk_Transfer(DirectionPID_OUT, data_ptr, DataSize, medium_ptr->MSC->dvi_ptr);
if(err) {
goto FAILURE;
}
err = Get_CSWStatus(medium_ptr);
if (err) {
goto FAILURE;
}
return DataSize;
FAILURE:
if (Get_RequestSense(medium_ptr, &SenseData) ){
return 0;
}
else {
if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00)) {
medium_ptr->BlockLengthInBytes = NULL;
medium_ptr->LastLogicalBlookAddress = NULL;
}
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -