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

📄 mass.c

📁 usb host在ARM7上的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
						if((SenseData.ASC==0x28)&&(SenseData.ASCQ==0x00))
						{/* NOT READY TO READY TRANSITION-MEDIA CHANGED */
							
						}
					}
				}
				else
					return NULL;
			}
			else
				return hMedLUNPtr;	/* 正常退出 */
		}
	}
	return NULL;
}

//********************************************************************************
//函数名称:Creat_Medium
//输入参数:hMedLUNPtr,逻辑单元描述符指针
//			LUNIndex,逻辑单元索引,0为第1个逻辑单元
//输出参数:无
//功能描述:关闭逻辑单元
//********************************************************************************
void Close_Medium(hMedLUN *hMedLUNPtr,unsigned char LUNIndex)
{
	if(hMedLUNPtr==NULL)
		return;
	if(hMedLUNPtr->MSC ==NULL)				/* 检验类描述结构指针*/
		return ;
	if(hMedLUNPtr->MSC->LUN < LUNIndex)		/* 检验逻辑单元索引 */
		return ;

	hMedLUNPtr->MSC->LUN_infor_ptr[LUNIndex]->LastLogicalBlookAddress =0;
	hMedLUNPtr->MSC->LUN_infor_ptr[LUNIndex]->BlockLengthInBytes=0;
}



//******************************************************************************************
// 函数名称:CommandBlockHandle
// 输入参数:tr_with_rbc_ptr,传输控制描述信息数据结构指针
// 输出参数:COMMAND_PASSED,命令完成
//				    COMMAND_FAILED,命令失败
//				    PHASE_ERROR,相位出错
//   				    PERSISTENT_FAILURE,严重出错
// 功能描述:大容量命令块处理,包括Bulk_Only和CBI-Only两个协议。
//******************************************************************************************
uint8 CommandBlockHandle(TR_With_RBC *tr_with_rbc_ptr)
{
	uint8	Statue;
	/* 单批量传输协议*/
	if( 0x50 == tr_with_rbc_ptr->MSC->ProtocolCode)
	{
		Statue = BulkOnlyComHandle( tr_with_rbc_ptr);
	}
	else
	/* CBI传输协议 */
	{
		Statue = CBIOnlyComHandle( tr_with_rbc_ptr);
	}
	return Statue;
}


//******************************************************************************************
//函数名称:GetThisInquiryData
//输入参数:hMedLUNPtr,逻辑单元描述符指针
//		  DataBuff_ptr,查询数据存放的结构指针
//输出参数:COMMAND_PASSED,命令完成
//		  COMMAND_FAILED,命令失败
//		  PHASE_ERROR,相位出错
//   		  PERSISTENT_FAILURE,严重出错
//功能描述:查询媒介信息,如厂商信息、产品信息及产品版本号。
//******************************************************************************************
 unsigned char	GetThisInquiryData(hMedLUN * hMedLUNPtr )
{
	TR_With_RBC		tr_with_rbc;
	unsigned char		InquiryDataBuf[36];
	unsigned char		Status;

	if(hMedLUNPtr->MSC==NULL)
		return	PERSISTENT_FAILURE;

	MCom_INQUIRY(hMedLUNPtr->MSC->RBC_BuffPtr);		// 命令设置
	tr_with_rbc.MSC = hMedLUNPtr->MSC;
	tr_with_rbc.LUN = hMedLUNPtr->LUN;
	tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 6:12;
	tr_with_rbc.DataTransferLength = 36;
	tr_with_rbc.Data_BuffPtr = InquiryDataBuf;
	tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
	tr_with_rbc.TrDirection = IN_DATA;
	Status = CommandBlockHandle( &tr_with_rbc );

	if( Status == COMMAND_PASSED)
	{
		memcpy(hMedLUNPtr->VendorInfo, &InquiryDataBuf[8], 8);
		memcpy(hMedLUNPtr->ProductInfo, &InquiryDataBuf[16], 16);
		memcpy(hMedLUNPtr->ProductRev, &InquiryDataBuf[32], 4);
	}
	else
	{	memset(hMedLUNPtr->VendorInfo,0,8) ;	
		memset(hMedLUNPtr->ProductInfo,0,8) ;	
		memset(hMedLUNPtr->ProductRev,0,8) ;	
	}
	return Status;
}

//*****************************************************************************
//功能描述:GetThisMediumCapacity
//输入参数:hMedLUNPtr
//输出参数:COMMAND_PASSED,命令完成
//				    COMMAND_FAILED,命令失败
//				    PHASE_ERROR,相位出错
//   				    PERSISTENT_FAILURE,严重出错
//功能描述:获取媒介的容量,块字节数及最后块地址.
//****************************************************************************
unsigned char	GetThisMediumCapacity(hMedLUN * hMedLUNPtr )
{

	TR_With_RBC		tr_with_rbc;
	unsigned char		CapacityDataBuf[8];
	unsigned char		Status;
	
	if(hMedLUNPtr->MSC==NULL)
		return	PERSISTENT_FAILURE;

	MCom_ReadCapacity(hMedLUNPtr->MSC->RBC_BuffPtr);
	tr_with_rbc.MSC = hMedLUNPtr->MSC;
	tr_with_rbc.LUN = hMedLUNPtr->LUN;
	tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 10:12;	/* 命令长度 */
	tr_with_rbc.DataTransferLength = 0x08;									/* 传输数据长度为8字节 */
	tr_with_rbc.Data_BuffPtr = CapacityDataBuf;
	tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
	tr_with_rbc.TrDirection = IN_DATA;
	Status = CommandBlockHandle( &tr_with_rbc );	

	if( Status == COMMAND_PASSED)
	{
		hMedLUNPtr->BlockLengthInBytes 			// 媒介块长度(字节数)
			= 	CapacityDataBuf[7] + 
				CapacityDataBuf[6]*0x100 + 
				CapacityDataBuf[5]*0x10000+
				CapacityDataBuf[4]*0x1000000;
		hMedLUNPtr->LastLogicalBlookAddress 		// 媒介最后块地址
			= 	CapacityDataBuf[3] + 
				CapacityDataBuf[2]*0x100 + 
				CapacityDataBuf[1]*0x10000+
				CapacityDataBuf[0]*0x1000000;
	}
	else
	{
		hMedLUNPtr->BlockLengthInBytes = 0;
		hMedLUNPtr->LastLogicalBlookAddress =0;
	}
	return Status;
}




//*****************************************************************************
//功能描述:GetRequestSense
//输入参数:hMedLUNPtr,逻辑单元描述数据结构指针
//				   SenseDataPtr,判别代码数据结构批针,保存返回数据
//输出参数:COMMAND_PASSED,命令完成
//				    COMMAND_FAILED,命令失败
//				    PHASE_ERROR,相位出错
//   				    PERSISTENT_FAILURE,严重出错
//功能描述:获取媒介的容量,块字节数及最后块地址.
//****************************************************************************
unsigned char	GetRequestSense(hMedLUN * hMedLUNPtr, SENSE_DATA *SenseDataPtr)
{
	TR_With_RBC		tr_with_rbc;
	unsigned char		SenseDataBuf[18];
	unsigned char		Status;

	if(hMedLUNPtr->MSC==NULL)
		return	PERSISTENT_FAILURE;
	
	MCom_RequestSense(hMedLUNPtr->MSC->RBC_BuffPtr);
	tr_with_rbc.MSC = hMedLUNPtr->MSC;
	tr_with_rbc.LUN = hMedLUNPtr->LUN;
	tr_with_rbc.CBLength = (hMedLUNPtr->MSC->ProtocolCode==0x50)? 0x0c:12;	/* 命令长度 */
	tr_with_rbc.DataTransferLength = 0x12;									/* 传输数据长度为8字节 */
	tr_with_rbc.Data_BuffPtr = SenseDataBuf;
	tr_with_rbc.RBC_BuffPtr = hMedLUNPtr->MSC->RBC_BuffPtr;
	tr_with_rbc.TrDirection = IN_DATA;
	Status = CommandBlockHandle( &tr_with_rbc );

	if( Status == COMMAND_PASSED)
	{
		SenseDataPtr->SenseKey = SenseDataBuf[2]&0x0f;
		SenseDataPtr->ASC = SenseDataBuf[12];
		SenseDataPtr->ASCQ = SenseDataBuf[13];
	}
	return Status;
}


//****************************************************************************
//函数名称:ReadBlockData
//输入参数:MediumPtr,操作媒体句柄
//				  BufferPtr,存缓数据缓冲区指针
//				  LBA,逻辑块地址
//				  TrBLength,逻辑块数目(1~0xffff)。
//输出参数:实际读入的字节数,设备不存在或未准备好返回0.
//功能描述:读逻辑单元块数据。
//***************************************************************************
unsigned short ReadBlockData(hMedLUN 		*MediumPtr, 
							   unsigned char 	*BufferPtr,
							   unsigned int 	LBA, 
							   unsigned short 	TrBLength)
{
	TR_With_RBC		tr_with_rbc;
	 unsigned char 	Status;
	SENSE_DATA		SenseData;
	
	if(MediumPtr->MSC==NULL)
		return	0;
	if( (MediumPtr->BlockLengthInBytes==0x00)||
	    (MediumPtr->LastLogicalBlookAddress == 0x00) )
	    	return	(0);

	MCom_Read10(MediumPtr->MSC->RBC_BuffPtr, LBA, TrBLength);
	tr_with_rbc.MSC = MediumPtr->MSC;
	tr_with_rbc.LUN = MediumPtr->LUN;
	tr_with_rbc.CBLength = (MediumPtr->MSC->ProtocolCode==0x50)? 0x0A:12;	/* 命令长度 */
	tr_with_rbc.DataTransferLength = TrBLength * MediumPtr->BlockLengthInBytes;									/* 传输数据长度为8字节 */
	tr_with_rbc.Data_BuffPtr = BufferPtr;
	tr_with_rbc.RBC_BuffPtr = MediumPtr->MSC->RBC_BuffPtr;
	tr_with_rbc.TrDirection = IN_DATA;
	Status = CommandBlockHandle( &tr_with_rbc );

	if( Status == COMMAND_PASSED)
	{
		return tr_with_rbc.DataTransferLength;	// 返回传输的数据长度(字节)
	}
	else
	{
		if(GetRequestSense(MediumPtr, &SenseData))
			return NULL;
		else
		{	/* 这里分析出错原因 */
			if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00))
			{/* MEDIUM NOT PRESENT */
				MediumPtr->BlockLengthInBytes = NULL;
				MediumPtr->LastLogicalBlookAddress = NULL;
			}
		}
	}
	return (0);								// 出错返回0
}



//****************************************************************************
//函数名称:WriteBlockData
//输入参数:MediumPtr,操作媒体句柄
//				  BufferPtr,存缓数据缓冲区指针
//				  LBA,逻辑块地址
//				  TrBLength,逻辑块数目(1~0xffff)。
//输出参数:实际读入的字节数,设备不存在或未准备好返回NULL.
//功能描述:写逻辑单元块数据。 
//***************************************************************************
unsigned short WriteBlockData(hMedLUN 		*MediumPtr, 
							   unsigned char 	*BufferPtr,
							   unsigned int 	LBA, 
							   unsigned short 	TrBLength)
{
	TR_With_RBC		tr_with_rbc;
	 unsigned char 	Status;
	SENSE_DATA		SenseData;
	
	if(MediumPtr->MSC==NULL)
		return	(0);
	if( (MediumPtr->BlockLengthInBytes==0x00)||
	    (MediumPtr->LastLogicalBlookAddress == 0x00) )
	    	return	(0);
			
	MCom_Write10(MediumPtr->MSC->RBC_BuffPtr, LBA, TrBLength);
	tr_with_rbc.MSC = MediumPtr->MSC;
	tr_with_rbc.LUN = MediumPtr->LUN;
	tr_with_rbc.CBLength = (MediumPtr->MSC->ProtocolCode==0x50)? 0x0A:12;	/* 命令长度 */
	tr_with_rbc.DataTransferLength = TrBLength * MediumPtr->BlockLengthInBytes;									/* 传输数据长度为8字节 */
	tr_with_rbc.Data_BuffPtr = BufferPtr;
	tr_with_rbc.RBC_BuffPtr = MediumPtr->MSC->RBC_BuffPtr;
	tr_with_rbc.TrDirection = OUT_DATA;
	Status = CommandBlockHandle( &tr_with_rbc );

	if( Status == COMMAND_PASSED)
	{
		return tr_with_rbc.DataTransferLength;	// 返回传输的数据长度(字节)
	}
	else
	{
		if(GetRequestSense(MediumPtr, &SenseData))
			return NULL;
		else
		{	/* 这里分析出错原因 */
			if((SenseData.ASC==0x3a)&&(SenseData.ASCQ==0x00))
			{/* MEDIUM NOT PRESENT */
				MediumPtr->BlockLengthInBytes = NULL;
				MediumPtr->LastLogicalBlookAddress = NULL;
			}
		}
	}
	return (0);								// 出错返回0
}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -