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

📄 mass_bulk.c

📁 zlg/fs源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -