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

📄 rbc.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 4 页
字号:
			return retStatus;
		}
	}else if(__cdbInquirySPC.CmdSupportData){                           /*  可选命令的数据信息          */
	                                                                    
		__tpbulkErrorHandler(__CASECMDFAIL, 0);
		__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_ILLEGAL_COMMAND, 0x00);
		__tpbulkCSWHandler();                                           /*  进入批量传输的状态处理阶段  */
		return retStatus;
	}else{
        pucData = (__uint8*)&__GinquiryData;                            /*  标准请求数据                */        
		uiLen = sizeof(__STD_INQUIRYDATA);
	}

	retStatus = __MASS_SUCCESS;
 
	if ( uiLen > __GdwCBWXferLen ){
	    uiLen = __GdwCBWXferLen;
		__tpbulkErrorHandler(__CASE6, uiLen);                           /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);               /*  设置判别数据                */
	}else if ( uiLen == __GdwCBWXferLen ){
		__tpbulkErrorHandler(__CASE6, uiLen);                           /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);               /*  设置判别数据                */    
	}else{
		__tpbulkErrorHandler(__CASE5, uiLen);                           /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);               /*  设置判别数据                */
	}
	
    __tpbulkSendSetting(__BOTXferAtROM, pucData, uiLen);                /*  设置批量数据传输参数        */
    
	return retStatus;
#undef __cdbInquirySPC
}

/*********************************************************************************************************
** Function name:           __spcModeSelect
**
** Descriptions:            模式选择命令允许主机设置RBC设备的介质或设备参数。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
#if 0
__uint8 __spcModeSelect (void)
{
#define __cdbModeSelectSPC    __RBC_CDB.SpcCdb_ModeSelect
                                                 
	__tpbulkErrorHandler(__CASECMDFAIL, 0);                             /*  批量传输的错误检查和处理    */
	                                                                    /*  设置判别数据                */    
	__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_CDB, 0);
	__tpbulkCSWHandler();                                               /*  进入批量传输的状态处理阶段  */

	return __MASS_FAIL;

#undef __cdbModeSelectSPC
}
#endif

/*********************************************************************************************************
** Function name:           __spcModeSense
**
** Descriptions:            模式判别命令允许RBC设备向主机报告介质或设备参数。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                        
*********************************************************************************************************/
__uint8 __spcModeSense (void)
{
#define __cdbModeSenseSPC __RBC_CDB.SpcCdb_ModeSense
	__uint8   retStatus = __MASS_FAIL;
    __uint8  *pcuData = __MASS_NULL;
    __uint32  uiLen;
    
	if (__cdbModeSenseSPC.PageCode == __MODE_PAGE_RBC_DEVICE_PARAMETERS || 
	    __cdbModeSenseSPC.PageCode == __MODE_PAGE_ALL ){          
	                                                                    /*  报告设备参数页              */ 
		switch(__cdbModeSenseSPC.PageControl){
		
		case __PAGECTRL_CHANGEABLE:   
			pcuData = (__uint8*) &__GparaHeadMask;                      /*  报告设备参数页掩码          */
			uiLen   = __PARAMETER_LIST_LENGTH;
			break;

		case __PAGECTRL_DEFAULT:                                        /*  当前值和缺省值则报告缺省设  */
		case __PAGECTRL_CURRENT:                                        /*	备参数页                    */
			pcuData = (__uint8*)&__GdefaultParaPage;
			uiLen = __PARAMETER_LIST_LENGTH;
			break;

		case __PAGECTRL_SAVED:                                            
		default:                                                        /*  不支持保存参数页            */
			                                                            /*  retStatus = __MASS_FAIL;    */
			__tpbulkErrorHandler(__CASECMDFAIL, 0);
			__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_SAVE_ERROR, 0);
			__tpbulkCSWHandler();                                       /* 进入批量传输的状态处理阶段   */
			break;
		}
		
       
        
		if (__GdwCBWXferLen < uiLen){
			uiLen = __GdwCBWXferLen;
			__tpbulkErrorHandler(__CASE6, uiLen);                       /*  批量传输的错误检查和处理    */
			__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);           /*  设置判别数据                */ 
			
		}else if(__GdwCBWXferLen == uiLen){
			__tpbulkErrorHandler(__CASE6, uiLen);                       /*  批量传输的错误检查和处理    */
			__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);           /*  设置判别数据                */
			
		}else{
			__tpbulkErrorHandler(__CASE5, uiLen);                       /*  批量传输的错误检查和处理    */
			__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);           /*  设置判别数据                */
		}
        __tpbulkSendSetting(__BOTXferAtROM, pcuData, uiLen);            /*  设置批量数据传输参数        */
		retStatus = __MASS_SUCCESS;
	}else{
		                                                                /*  retStatus = __MASS_FAIL;    */
		__tpbulkErrorHandler(__CASECMDFAIL, 0);                         /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_CDB, 0);
		__tpbulkCSWHandler();                                           /*  进入批量传输的状态处理阶段  */
	}

	return retStatus;
#undef __cdbModeSenseSPC
}


/*********************************************************************************************************
** Function name:           __spcLockMedia
**
** Descriptions:            禁止/允许介质移除
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8 __spcLockMedia (void)
{
#define __cdbLockSPC __RBC_CDB.SpcCdb_Remove
                                                                       
	__GrbcPropertyData.bits.MediumRemovFlag = __cdbLockSPC.Prevent;     /*  保存禁止/允许介质移除状态   */
	
	__tpbulkErrorHandler(__CASE1, 0);                                   /*  批量传输的错误检查和处理    */
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
	__tpbulkCSWHandler();                                               /*  进入批量传输的状态处理阶段  */
	return __MASS_SUCCESS;

#undef __cdbLockSPC
}


/*********************************************************************************************************
** Function name:           __spcTestUnit
**
** Descriptions:            检查设备是否已经准备。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8   __spcTestUnit (void)
{
#define __cdbTestUnit __RBC_CDB.SpcCdb_TestUnit
        
	if ( msGetStatus() == __MS_READY ){                                 
	                                                                    /*  设备准备好                  */
		__tpbulkErrorHandler(__CASE1, 0);                               /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);               /*  设置判别数据                */
	}else{
		__tpbulkErrorHandler(__CASECMDFAIL, 0);                         /*  批量传输的错误检查和处理    */
		                                                                /*  设置判别数据                */
		__rbcBuildSenseData(__SCSI_SENSE_NOT_READY, __SCSI_ADSENSE_NO_MEDIA_IN_DEVICE, 0);
	}

	__tpbulkCSWHandler();                                               /*  进入批量传输的状态处理阶段  */
	return __MASS_SUCCESS;

#undef __cdbTestUnit
}

/*********************************************************************************************************
** Function name:           __spcRequestSense
**
** Descriptions:            请求判别数据
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          __MASS_FAIL
*********************************************************************************************************/
__uint8 __spcRequestSense (void)
{
#define __cdbRequestSenseSPC __RBC_CDB.SpcCdb_RequestSense

	__tpbulkErrorHandler(__CASE6, 0x12);                                /*  批量传输的错误检查和处理    */
	                                                                    /*  发送判别数据回主机          */ 
	                                                                    /*  设置批量数据传输参数        */             
    __tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&__GrbcSenseData, 0x12);
	return __MASS_SUCCESS;
	
#undef __cdbRequestSenseSPC
}

/*********************************************************************************************************
** Function name:           __spcReadLong
**
** Descriptions:            读格式化容量命令,RBC设备在批量输入端口上返回一个容量列表到主机。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/

__uint8 __spcReadLong (void)
{
#define __cdbReadLong __RBC_CDB.RE_FM_Capacities

    __PDISK_INFO pmsinfo = msGetInfo();                                 /*  取设备容量信息              */
 
	__cdbReadLong.Length = 0x10;                                        /*  容量列表长度                */
                                                                        /*  当前块容量,按大端格式存放  */
    __cdbReadLong.CapacityLBA[0]       = (__uint8)(pmsinfo->uiCapacity>>24);
    __cdbReadLong.CapacityLBA[1]       = (__uint8)((pmsinfo->uiCapacity<<8)>>24);
	__cdbReadLong.CapacityLBA[2]       = (__uint8)((pmsinfo->uiCapacity<<16)>>24);
	__cdbReadLong.CapacityLBA[3]       = (__uint8)((pmsinfo->uiCapacity<<24)>>24);
	
	__cdbReadLong.DescriptorCode       = 0x02;                          /*  当前容量描述符              */
	                                                                    /*  当前块大小                  */
	__cdbReadLong.CapacityLength[0]    = (__uint8)((pmsinfo->uiBlockLen<<8)>>24);   
	__cdbReadLong.CapacityLength[1]    = (__uint8)((pmsinfo->uiBlockLen<<16)>>24);
	__cdbReadLong.CapacityLength[2]    = (__uint8)((pmsinfo->uiBlockLen<<24)>>24);
	
	__cdbReadLong.FormattableLBA[0]    = __cdbReadLong.CapacityLBA[0];  /*  可格式化块容量              */
	__cdbReadLong.FormattableLBA[1]    = __cdbReadLong.CapacityLBA[1];  /*  按大端格式存放              */
	__cdbReadLong.FormattableLBA[2]    = __cdbReadLong.CapacityLBA[2];
	__cdbReadLong.FormattableLBA[3]    = __cdbReadLong.CapacityLBA[3];
		                                                                /*  可格式化块大小              */
	__cdbReadLong.FormattableLength[0] = __cdbReadLong.CapacityLength[0]; 
	__cdbReadLong.FormattableLength[1] = __cdbReadLong.CapacityLength[1];
	__cdbReadLong.FormattableLength[2] = __cdbReadLong.CapacityLength[2];
                                                                        /*  设置批量数据传输参数        */
    __tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&__cdbReadLong, sizeof(__READ_FORMAT_CAPACITIES));
    
    __tpbulkErrorHandler(__CASE1, sizeof(__READ_FORMAT_CAPACITIES));    /*  批量传输的错误检查和处理    */
    __rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
    
	return __MASS_SUCCESS;
	
#undef __cdbReadLong 
}


/*********************************************************************************************************
** Function name:           __rbcBuildSenseData
**
** Descriptions:            建立判别数据
**
** input parameters:        ucSenseKey
**                          ucASC
**                          ucASCQ
** output parameters:       无
**
** Returned value:          无                                                               
**                          
*********************************************************************************************************/
void __rbcBuildSenseData (__uint8 ucSenseKey, __uint8 ucASC, __uint8 ucASCQ)
{
	/*
     *  RBC_SenseData.ResponseCode = SCSI_RESPONSECODE_CURRENT_ERROR;
     *  RBC_SenseData.Valid = 0;
     *  //RBC_SenseData.SegmentNum = 0;
     *  RBC_SenseData.SenseKey =  SenseKey;
     *  //RBC_SenseData.Reserved0 = 0;
     *  //RBC_SenseData.WrongLenIndicator = 0;
     *  //RBC_SenseData.EndofMedium = 0;
     *  //RBC_SenseData.FileMark = 0;
     *  //RBC_SenseData.Info_0 = 0;
     *  //RBC_SenseData.Info_1 = 0;
     *  //RBC_SenseData.Info_2 = 0;
     *  //RBC_SenseData.Info_3 = 0;
     *  RBC_SenseData.AdditionalSenseLen = 0xa;
     *  //RBC_SenseData.CommandSpecInfo_0 = 0;
     *  //RBC_SenseData.CommandSpecInfo_1 = 0;
     *  //RBC_SenseData.CommandSpecInfo_2 = 0;
     *  //RBC_SenseData.CommandSpecInfo_3 = 0;
     *  RBC_SenseData.ASC = ASC;
     *  RBC_SenseData.ASCQ = ASCQ;
     *  //RBC_SenseData.FieldReplacableUnitCode = 0;
     *  //RBC_SenseData.SenseKeySpec_0 = 0;
     *  //RBC_SenseData.SenseKeySpecValid = 0;
     *  //RBC_SenseData.SenseKeySpec_1 = 0;
     *  //RBC_SenseData.SenseKeySpec_2 = 0;
	 */
    __GrbcSenseData.ResponseCode = __SCSI_RESPONSECODE_CURRENT_ERROR;
	__GrbcSenseData.Valid = 0;
	__GrbcSenseData.SenseKey =  ucSenseKey;
	__GrbcSenseData.AdditionalSenseLen = 0xa;
	__GrbcSenseData.ASC = ucASC;
	__GrbcSenseData.ASCQ = ucASCQ;
}

/*********************************************************************************************************
  End of file
*********************************************************************************************************/

⌨️ 快捷键说明

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