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

📄 mass.c

📁 usb host在ARM7上的实现
💻 C
📖 第 1 页 / 共 2 页
字号:

#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);	//获取媒体最大逻辑单元号
	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 + -