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

📄 rbc.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 4 页
字号:
		ucRetStatus = __spcReadLong();                                  /*  0x23                        */
		break;

	default:
		                                                                /*  无效 CBW                    */
		__tpbulkErrorHandler(__CASECBW, 0);                             /*  批量传输的错误检查和处理    */
		__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST,               /*  设置判别数据                */
		                    __SCSI_ADSENSE_ILLEGAL_COMMAND,
		                    0);
		__tpbulkCSWHandler();                                           /*  进入批量传输的状态处理阶段  */
		break;                                                         
	}

	return ucRetStatus;
#undef __cdbGeneric
}

/*********************************************************************************************************
  Reduced Block Command Support
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:           __rbcFormat
**
** Descriptions:            格式化单元命令
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          __MASS_FAIL
*********************************************************************************************************/
#if 0
__uint8 __rbcFormat(void)
{
	__tpbulkErrorHandler(__CASECMDFAIL, 0);                             /*  不支持命令                  */
	                                                                    /*  设置判别数据                */    
	__rbcBuildSenseData(__SCSI_SENSE_MEDIUM_ERROR, __SCSI_ADSENSE_FORMAT_ERROR, 0x01);
	__tpbulkCSWHandler();                                               /*  进入批量传输的状态处理阶段  */

	return __MASS_SUCCESS;

}
#endif

/*********************************************************************************************************
** Function name:           __rbcRead
**
** Descriptions:            读(10)命令要求RBC设备传输数据到主机。记录在逻辑块地址的最新数据值将被返回。
**
** input parameters:        无
** output parameters:       无
** Returned value:          TURE                                                               
**                          
*********************************************************************************************************/

__uint8 __rbcRead (void)
{
#define __cdbRead __RBC_CDB.RbcCdb_Read
                                                                     
    __msReadSetting((((__uint32)__cdbRead.LBA[0])<<24) +                /*  RBC设备读数据块之前的设置   */
                    (((__uint32)__cdbRead.LBA[1])<<16) +                /*  第1个参数为逻辑块地址       */
                    (((__uint32)__cdbRead.LBA[2])<<8) +                 /*  第2个参数为准备传输的块数   */
                    (__uint32)__cdbRead.LBA[3],                             
	                (((__uint32)__cdbRead.XferLength[0])<<8) +             
	                (__uint32)__cdbRead.XferLength[1]);                                          
    
    __tpbulkSendSetting( __BOTXferAtATA,
                         __GpucMassStorageBuf,
                         __GdwCBWXferLen);                              /*  设置批量数据传输参数        */
   
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
	                                                                    /*  批量传输的错误检查和处理    */
	__tpbulkErrorHandler(__CASE6, __GdwCBWXferLen);                     /*  __GdwCBWXferLen 会被修改    */         
 
	return __MASS_SUCCESS;

#undef __cdbRead
}

/*********************************************************************************************************
** Function name:           __rbcWrite
**
** Descriptions:            写(10)命令要求RBC设备写进从主机传输到介质的数据。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/

__uint8 __rbcWrite (void)
{
#define __cdbWrite __RBC_CDB.RbcCdb_Write

    __msWriteSetting((((__uint32)__cdbWrite.LBA[0])<<24) +              /*  RBC设备写数据块之前的设置   */
                     (((__uint32)__cdbWrite.LBA[1])<<16) +              /*  第1个参数为逻辑块地址       */
                     (((__uint32)__cdbWrite.LBA[2])<<8) +               /*  第2个参数为准备传输的块数   */
                     (__uint32)__cdbWrite.LBA[3],                           
	                 (((__uint32)__cdbWrite.XferLength[0])<<8) +             
	                 (__uint32)__cdbWrite.XferLength[1]);           

	__tpbulkRecvSetting(__BOTXferAtATA,
	                    __GpucMassStorageBuf,
	                    __GdwCBWXferLen);                               /*  设置批量数据传输参数        */
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
	                                                                    /*  批量传输的错误检查和处理    */
	__tpbulkErrorHandler(__CASE12, __GdwCBWXferLen);                    /*  __GdwCBWXferLen 会被修改    */
	
	return __MASS_SUCCESS;

#undef __cdbWrite
}

/*********************************************************************************************************
** Function name:           __rbcReadCapacity
**
** Descriptions:            读容量命令允许主机请求当前存储介质的容量(逻辑块数和块大小)。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8 __rbcReadCapacity (void)
{
#define __cdbReadCap __RBC_CDB.RbcCdb_ReadCapacity
    __uint32   tmp;
    __PDISK_INFO  pmsinfo = msGetInfo();                                /*  取设备容量信息              */

	tmp = pmsinfo->uiCapacity - 1;                                      /*  最后扇区号码                */	                                                                    
	__cdbReadCap.CapData.LBA[0] = (__uint8)(tmp>>24);                   /*  按大端格式存放              */
	__cdbReadCap.CapData.LBA[1] = (__uint8)((tmp<<8)>>24);
	__cdbReadCap.CapData.LBA[2] = (__uint8)((tmp<<16)>>24);
	__cdbReadCap.CapData.LBA[3] = (__uint8)((tmp<<24)>>24);
                                                                        /*  按大端格式存放              */    
	__cdbReadCap.CapData.BlockLen[0] = (__uint8)(pmsinfo->uiBlockLen>>24);
	__cdbReadCap.CapData.BlockLen[1] = (__uint8)((pmsinfo->uiBlockLen<<8)>>24);
	__cdbReadCap.CapData.BlockLen[2] = (__uint8)((pmsinfo->uiBlockLen<<16)>>24);
	__cdbReadCap.CapData.BlockLen[3] = (__uint8)((pmsinfo->uiBlockLen<<24)>>24);
	
	
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
	__tpbulkErrorHandler(__CASE6, sizeof(__READ_CAPACITY_DATA));        /*  批量传输的错误检查和处理    */
	                                                                    /*  设置批量数据传输参数        */
	__tpbulkSendSetting(__BOTXferAtRAM, (__uint8*)&(__cdbReadCap.CapData), sizeof(__READ_CAPACITY_DATA));
                
	return __MASS_SUCCESS;
#undef __cdbReadCap
}

#if 1
/*********************************************************************************************************
** Function name:           __rbcOnOffUnit
**
** Descriptions:            停止/启动单元命令指示RBC设备允许或禁止介质访问操作,设置电源状态 
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8 __rbcOnOffUnit (void)
{
#define __cdbOnOffUnit __RBC_CDB.RbcCdb_OnOffUnit

	switch(__cdbOnOffUnit.PowerConditions){
	
	case __PWR_NOCHANGE:
		switch(__cdbOnOffUnit.MediumState){
		
		case __MEDIUM_LOAD:                                             /*  加载介质                    */                              
			break;
			
		case __MEDIUM_UNLOAD:                                           /*  卸载介质                    */
			break;
			    
		case __MEDIUM_STOP:                                             /*  停止介质                    */
			break;
			
		case __MEDIUM_READY:                                            /*  准备介质                    */
			break;
		}
		break;
		
	case __PWR_ACTIVE:                                                  /*  活动状态                    */
		break;
		
	case __PWR_IDLE:                                                    /*  空闲状态                    */
		break;
		
	case __PWR_STANDBY:                                                 /*  就绪状态                    */
		break;
		
	case __PWR_SLEEP:                                                   /*  休眠状态                    */
		break;
		
	case __PWR_DEVCTRL:                                                 /*  default: 由设备控制         */
	default: 
		break;
	}
                                                                        
	__GrbcPropertyData.bits.MediumState = __cdbOnOffUnit.MediumState;   /*  保存介质访问设置            */    
	__GrbcPropertyData.bits.PowerState = __cdbOnOffUnit.PowerConditions;/*  保存电源状态                */

	__tpbulkErrorHandler(__CASE1, 0);                                   /*  批量传输的错误检查和处理    */
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */

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

	return __MASS_SUCCESS;
#undef __cdbOnOffUnit
}

/*********************************************************************************************************
** Function name:           __rbcSyncCache
**
** Descriptions:            同步缓冲区数据,如果缓冲区数据比介质的新,则把缓冲区数据写入到介质。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8 __rbcSyncCache (void)
{
#define __cdbSyncRBC __RBC_CDB.RbcCdb_SyncCache

	__tpbulkErrorHandler(__CASE1, 0);                                   /*  批量传输的错误检查和处理    */
	__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);                   /*  设置判别数据                */
    __tpbulkCSWHandler();                                               /*  进入批量传输的状态处理阶段  */
	return __MASS_SUCCESS;
	
#undef __cdbSyncRBC
}

/*********************************************************************************************************
** Function name:           __rbcVerify
**
** Descriptions:            请求RBC设备验证介质上的数据。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8  __rbcVerify (void)
{
#define __cdbVerifyRBC __RBC_CDB.RbcCdb_Verify

    if( __GdwCBWXferLen == 0 ){                                         /*  没有逻辑块将被验证          */
		__tpbulkErrorHandler(__CASE1, 0);                               /*  设置主机/设备数据传输情况   */    
		__rbcBuildSenseData(__SCSI_SENSE_NO_SENSE, 0, 0);               /*  设置判别数据                */
	    __tpbulkCSWHandler();                                           /*  Goto USBFSM4BOT_CSWPROC;    */  
	}else{                                                              
	    /*
	     *   根据主机发下来的数据验证介质上的数据(没有支持)
	     */
   		__tpbulkErrorHandler(__CSW_FAIL, 0);                            /*  批量传输的错误检查和处理    */
		                                                                /*  设置判别数据                */
		__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_INVALID_PARAMETER, 0);
		__tpbulkCSWHandler();                                           /*  进入批量传输的状态处理阶段  */       
		return __MASS_FAIL;
	}
	               
	return __MASS_SUCCESS;
	
#undef __cdbVerifyRBC
}

#endif

/*********************************************************************************************************
  SCSI Primary Command Support
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:           __spcInquiry
**
** Descriptions:            查询命令请求发送到主机的RBC设备参数的信息。它用作主机上的驱动器访问RBC设备的
**                          配置,特别是在接通电源和硬件复位之后使用。
**
** input parameters:        无
** output parameters:       无
** Returned value:          __MASS_SUCCESS                                                               
**                          
*********************************************************************************************************/
__uint8 __spcInquiry (void)
{
#define __cdbInquirySPC __RBC_CDB.SpcCdb_Inquiry
	__uint8	  retStatus = __MASS_FAIL;
	__uint8  *pucData   = __MASS_NULL;
	__uint32  uiLen = 0; 

	if(__cdbInquirySPC.EnableVPD){
		switch(__cdbInquirySPC.PageCode){                             
		                                                                /*  重要的设备数据信息          */    
		case __VPDPAGE_SERIAL_NUMBER:                                   /*  Unit Serial Number page     */
			pucData = (__uint8*)&__GserialPage;
			uiLen = sizeof(__VPD_SERIAL_PAGE);
			break;

		case __VPDPAGE_DEVICE_IDENTITY:                                 /*  Device ID page              */        
			retStatus = __MASS_SUCCESS;
			pucData = (__uint8*)&__GdeviceIDPage;
			uiLen = sizeof(__VPD_DEVICE_ID_PAGE);
			break;

		default:
			__tpbulkErrorHandler(__CASECMDFAIL, 0);                      
			                                                            /*  设置判别数据                */
			__rbcBuildSenseData(__SCSI_SENSE_ILLEGAL_REQUEST, __SCSI_ADSENSE_ILLEGAL_COMMAND, 0x00);
			__tpbulkCSWHandler();                                       /* 进入批量传输的状态处理阶段   */      

⌨️ 快捷键说明

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