?? mass.c
字號:
#include "HostStack.h"
MassStorageClass *create_mass_class_instance( device_instance *dvi_ptr );
void dispose_mass_class_instance( device_instance *dvi_ptr );
unsigned char MassStorageReset(device_instance * DevicePtr);
unsigned char GetMaxLUN(device_instance * DevicePtr);
unsigned char GetThisInquiryData(hMedLUN * hMedLUNPtr);
unsigned char GetThisMediumCapacity(hMedLUN * hMedLUNPtr);
unsigned char GetRequestSense(hMedLUN * hMedLUNPtr, SENSE_DATA *SenseDataPtr);
hMedLUN *GetMassBulkOnlyInfo(MassStorageClass *mass_i_ptr);
hMedLUN *GetMassCBIOnlyInfo(MassStorageClass *mass_i_ptr);
//******************************************************************************************
// 函數名稱:mass_init_commands
// 輸入參數:dvi_ptr,設備描述信息數據結構指針
// 輸出參數:正常返回0,出錯返回非0。
// 功能描述:大容量類設備初始化函數
//******************************************************************************************
unsigned short mass_init_commands( device_instance *dvi_ptr )
{ MassStorageClass *mass_i_ptr;
mass_i_ptr= create_mass_class_instance( dvi_ptr );
if ( NULL == mass_i_ptr )
return (1);
dvi_ptr->class_instance_ptr = mass_i_ptr;
return ( 0 );
}
MassStorageClass MSCDevices[MAX_MASS_DEVICES_DEFINE];
/*初始化大容量類內存 */
void ini_mass_device_mem(void)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_DEFINE ;i++)
MSCDevices[i].dvi_ptr = NULL;
}
/* 獲取大容量類內存 */
MassStorageClass *malloc_mass_device_mem(void)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_DEFINE ;i++)
if(MSCDevices[i].dvi_ptr==NULL)
{
MSCDevices[i].dvi_ptr = (device_instance *)(-1);
return &MSCDevices[i];
}
return NULL;
}
/*釋放大容量類內存 */
void free_mass_device_mem(MassStorageClass * MSC_ptr)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_DEFINE ;i++)
if( &MSCDevices[i] == MSC_ptr )
MSC_ptr->dvi_ptr = NULL;
}
/******************************************************************/
/* 邏輯單元內存管理 */
//初始化大容量類設備邏輯單元描述符內存
/******************************************************************/
#define MAX_MASS_DEVICES_LUN_DEFINE MAX_MASS_DEVICES_DEFINE+ 3
hMedLUN MSCDeviceLNUs[MAX_MASS_DEVICES_LUN_DEFINE];
void ini_mass_device_LUN_mem(void)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_LUN_DEFINE ;i++)
MSCDeviceLNUs[i].MSC = NULL;
}
hMedLUN *malloc_mass_device_LUN_mem(void)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_LUN_DEFINE ;i++)
if(MSCDeviceLNUs[i].MSC==NULL)
{
MSCDeviceLNUs[i].MSC = (MassStorageClass *)(-1);
return &MSCDeviceLNUs[i];
}
return NULL;
}
void free_mass_device_LNU_mem(hMedLUN * MSCLUN_ptr)
{
uint16 i;
for( i=0; i<MAX_MASS_DEVICES_LUN_DEFINE ;i++)
if( &MSCDeviceLNUs[i] == MSCLUN_ptr)
MSCLUN_ptr->MSC = NULL;
}
//************************************************************************************
// 函數名稱:create_mass_class_instance
// 輸入參數:dvi_ptr,設備描述信息數據結構指針
// 輸出參數:設描述信息結構指針
// 功能描述:建立大容量類設備實例
//************************************************************************************
MassStorageClass *create_mass_class_instance( device_instance *dvi_ptr )
{
// This instance will be disposed in function "dispose_device()"
MassStorageClass *mass_i_ptr;
endpoint_info *epi_ptr;
transfer_instance *tr_instance_ptr;
if ( NULL == (mass_i_ptr = malloc_mass_device_mem()) )/*分配內存*/
return NULL ;
mass_i_ptr->LUN = 0 ;
mass_i_ptr->dvi_ptr = dvi_ptr;
mass_i_ptr->setup_epi_ptr = dvi_ptr->epi_ptr[0];
mass_i_ptr->ProtocolCode = Get_bInterfaceProtocol(dvi_ptr);
mass_i_ptr->SubclassCode = Get_bInterfaceSubClass(dvi_ptr);
mass_i_ptr->tr_bulk_in_ptr = NULL ;
mass_i_ptr->tr_bulk_out_ptr = NULL ;
mass_i_ptr->tr_int_in_ptr = NULL ;
mass_i_ptr->CBW_BuffPtr = NULL ;
/* 創建傳輸描述符 */
epi_ptr = find_endport_type(dvi_ptr, Ep_TransferType_Bulk, Ep_Direction_IN_ENDPOINT, 1);
if( epi_ptr == NULL )
return NULL ;
if(NO_OPEN_ATL_TRANSFER==(tr_instance_ptr=atl_open_transfer_instance( epi_ptr )))
return NULL ;
mass_i_ptr->tr_bulk_in_ptr = tr_instance_ptr;
epi_ptr = find_endport_type(dvi_ptr, Ep_TransferType_Bulk, Ep_Direction_OUT_ENDPOINT, 1);
if( epi_ptr == NULL )
return NULL ;
if(NO_OPEN_ATL_TRANSFER==(tr_instance_ptr=atl_open_transfer_instance( epi_ptr )))
return NULL ;
mass_i_ptr->tr_bulk_out_ptr = tr_instance_ptr;
/* 保存大容量設備的接口子類及傳輸協議代碼 */
if(mass_i_ptr->ProtocolCode == 0x50) /* Bulk-Only */
{
if(GetMassBulkOnlyInfo(mass_i_ptr) == NULL)
return NULL;
}
else /* CBI-Only */
{
if(GetMassCBIOnlyInfo(mass_i_ptr) == NULL)
return NULL;
}
return ( mass_i_ptr );
}
//**********************************************************************************************
// 函數名稱:GetMassBulkOnlyInfo
// 輸入參數:mass_i_ptr,大容量類設備描述數據結構指針
// 輸出參數:出錯返回NULL
// 正確返回最后一個邏輯單元描述指針
// 功能描述:獲取大容量類CBI協議設備描述信息。
//**********************************************************************************************
hMedLUN *GetMassBulkOnlyInfo(MassStorageClass *mass_i_ptr)
{
unsigned char MediumIndex;
hMedLUN *medium_infor_ptr;
mass_i_ptr->CBW_BuffPtr = malloc( sizeof( unsigned char )* 31 ); // 為CBW包分配固定內存
if(mass_i_ptr->CBW_BuffPtr ==NULL)
return NULL ;
mass_i_ptr->CBW_BuffPtr[0] = 0x55;
mass_i_ptr->CBW_BuffPtr[1] = 0x53;
mass_i_ptr->CBW_BuffPtr[2] = 0x42;
mass_i_ptr->CBW_BuffPtr[3] = 0x43;
// if(FALSE ==MassStorageReset(mass_i_ptr->dvi_ptr))// 大容量設備復位
// return NULL ;
//mass_i_ptr->LUN = GetMaxLUN(mass_i_ptr->dvi_ptr); //獲取媒體最大邏輯單元號
mass_i_ptr->LUN = 0;
for(MediumIndex = 0;mass_i_ptr->LUN +1>MediumIndex;MediumIndex++)
{
if ( NULL == (medium_infor_ptr= malloc_mass_device_LUN_mem()) ) /*分配內存*/
break ;
mass_i_ptr->LUN_infor_ptr[MediumIndex] = medium_infor_ptr; // 保存邏輯單元描述信息數據結構指針
medium_infor_ptr->LUN = MediumIndex;
medium_infor_ptr->MSC = mass_i_ptr ;
medium_infor_ptr->BlockLengthInBytes = 0;
medium_infor_ptr->LastLogicalBlookAddress=0;
if( GetThisInquiryData( medium_infor_ptr ) ) // 獲取產品及廠家信息
return NULL ;
}
return medium_infor_ptr;
}
//**********************************************************************************************
// 函數名稱:GetMassCBIOnlyInfo
// 輸入參數:mass_i_ptr,大容量類設備描述數據結構指針
// 輸出參數:出錯返回NULL
// 正確返回邏輯單元描述指針
// 功能描述:獲取大容量類CBI協議設備描述信息。
//**********************************************************************************************
hMedLUN *GetMassCBIOnlyInfo(MassStorageClass *mass_i_ptr)
{
hMedLUN *medium_infor_ptr;
endpoint_info *epi_ptr;
transfer_instance *tr_instance_ptr;
if( NULL == (epi_ptr = find_endport_type(mass_i_ptr->dvi_ptr, Ep_TransferType_Interrupt, Ep_Direction_IN_ENDPOINT, 1)))
return NULL ;
if(NO_OPEN_ATL_TRANSFER==(tr_instance_ptr=atl_open_transfer_instance( epi_ptr )))
return NULL ;
mass_i_ptr->tr_int_in_ptr = tr_instance_ptr;
if ( NULL == (medium_infor_ptr = malloc_mass_device_LUN_mem()) ) /*分配內存*/
return NULL ;
mass_i_ptr->LUN_infor_ptr[0] = medium_infor_ptr; // 保存邏輯單元描述信息數據結構指針
medium_infor_ptr->LUN = 0;
medium_infor_ptr->MSC = mass_i_ptr ;
medium_infor_ptr->BlockLengthInBytes = 0;
medium_infor_ptr->LastLogicalBlookAddress=0;
if(GetThisInquiryData(medium_infor_ptr) ) // 獲取產品及廠家信息
return NULL ;
return medium_infor_ptr;
}
//**********************************************************************************************
// 函數名稱:dispose_mass_class_instance
// 輸入參數:dvi_ptr,設備描述信息數據結構指針
// 輸出參數:無
// 功能描述:刪除大容量設備處理。
//**********************************************************************************************
void dispose_mass_class_instance( device_instance *dvi_ptr )
{
MassStorageClass *mass_i_ptr;
unsigned short i;
mass_i_ptr = (MassStorageClass *)mass_instance_ptr( dvi_ptr );
if(mass_i_ptr==NULL)
return;
/* 刪除傳輸描述符 */
if(mass_i_ptr->tr_bulk_in_ptr)
atl_close_transfer_instance(mass_i_ptr->tr_bulk_in_ptr);
if(mass_i_ptr->tr_bulk_out_ptr)
atl_close_transfer_instance(mass_i_ptr->tr_bulk_out_ptr);
if(mass_i_ptr->tr_int_in_ptr)
atl_close_transfer_instance(mass_i_ptr->tr_int_in_ptr);
/* 釋放命令塊占用的內存*/
if(mass_i_ptr->CBW_BuffPtr)
free(mass_i_ptr->CBW_BuffPtr);
/* 釋放邏輯單元描述信息數據結構 */
for(i=0;i <= mass_i_ptr->LUN+1; i++)
if(mass_i_ptr->LUN_infor_ptr[i])
{
free_mass_device_LNU_mem(mass_i_ptr->LUN_infor_ptr[i]);
mass_i_ptr->LUN_infor_ptr[i] = NULL;
}
/* 釋放大容量類設備描述符 */
if( dvi_ptr->class_instance_ptr )
free_mass_device_mem(dvi_ptr->class_instance_ptr);
dvi_ptr->class_instance_ptr = NULL;
}
//******************************************************************************************
// 函數名稱:mass_dispose_process
// 輸入參數:dvi_ptr,設備描述信息數據結構指針
// 輸出參數:返回0
// 功能描述:刪除大容量類設備處理函數
//******************************************************************************************
unsigned short mass_dispose_process( device_instance *dvi_ptr )
{
dispose_mass_class_instance(dvi_ptr);
return ( 0 );
}
//********************************************************************************
//函數名稱:Creat_Medium
//輸入參數:dvi_ptr,大容量設備的設備描述信息結構指針
// LUNIndex,邏輯單元索引,0為第1個邏輯單元
//輸出參數:邏輯單元存在,返回邏輯單元描述符指針
// 邏輯單元不存在,返回一個容指針
//功能描述:建立(獲取)大容量設備的一個媒介(邏輯單元)描述符。
//********************************************************************************
hMedLUN * Creat_Medium(device_instance *dvi_ptr ,unsigned char LUNIndex)
{
hMedLUN * hMedLUNPtr=0;
MassStorageClass *MSC_ptr;
unsigned char i,Statue;
SENSE_DATA SenseData;
MSC_ptr = mass_instance_ptr(dvi_ptr);
if(MSC_ptr ==NULL) /* 檢驗類描述結構指針*/
return NULL;
if(MSC_ptr->LUN < LUNIndex) /* 檢驗邏輯單元索引 */
return NULL;
if( (MSC_ptr->LUN_infor_ptr[LUNIndex]->LastLogicalBlookAddress==0)
&& ( MSC_ptr->LUN_infor_ptr[LUNIndex]->BlockLengthInBytes==0))
{
hMedLUNPtr = MSC_ptr->LUN_infor_ptr[LUNIndex];
for( i=0; i<3; i++ )
{
Statue = GetThisMediumCapacity(hMedLUNPtr);
if(Statue)
{
if(Statue== COMMAND_FAILED)
{ if(GetRequestSense(hMedLUNPtr, &SenseData))
return NULL;
else
{ /* 這里分析出錯原因 */
if((SenseData.ASC==0x34)&&(SenseData.ASCQ==0x00))
{/* MEDIUM NOT PRESENT */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -