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

📄 tpbulk.c

📁 smartARM2400 USB OTG例程
💻 C
📖 第 1 页 / 共 2 页
字号:
		__GtpbulkCSW.bCSWStatus = __CSW_GOOD;
		break;

	case __CASE2:                                                       /*  Hn<Di                       */
	case __CASE3:                                                       /*  Hn<Do                       */
		/*
		 *  GbitBOTStallAtBulkIn = 1; // may or may-not
		 */
		__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
		break;

	case __CASE4:                                                       /*  Hi>Dn                       */
	case __CASE5:                                                       /*  Hi>Di                       */
		__GbitBOTStallAtBulkIn = 1;
		__GtpbulkCSW.bCSWStatus = __CSW_FAIL;                           /*  CSW_GOOD or CSW_FAIL        */
		break;


	case __CASE7:                                                       /*  Hi<Di                       */
	case __CASE8:                                                       /*  Hi<>Do                      */
		/*
		 *  __GbitBOTStallAtBulkIn = 1; // may or may-not
		 */
		__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
		break;

	case __CASE9:                                                       /*  Ho>Dn                       */
	case __CASE11:                                                      /*  Ho>Do                       */
        /*
         *  __GbitBOTStallAtBulkOut = 1; // may or may-not
         */
		__GtpbulkCSW.bCSWStatus = __CSW_FAIL;                           /*  CSW_GOOD or CSW_FAIL        */
		break;

	case __CASE10:                                                      /*  Ho<>Di                      */
	case __CASE13:                                                      /*  Ho<Do                       */
		/*
		 *  __GbitBOTStallAtBulkIn = 1;// may or may-not
         *  __GbitBOTStallAtBulkOut = 1;// may or may-not
         */
		__GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
		break;

	case __CASECBW:                                                     /*  invalid CBW                 */
        /*
		 *  __GbitBOTStallAtBulkIn = 1;// may or may-not
         *  __GbitBOTStallAtBulkOut = 1;// may or may-not
         */
		 __GtpbulkCSW.bCSWStatus = __CSW_PHASE_ERROR;
		 break;

	case __CASECMDFAIL:
        __GbitBOTStallAtBulkIn = 1;
        __GtpbulkCSW.bCSWStatus = __CSW_FAIL;
		break;

	default:
		break;
	}

	__GtpbulkCSW.dwCSWSignature = __CSW_SIGNATURE;                      /*  0x55534253 CSW后固有的特征码*/
}

/*********************************************************************************************************
** Function name:           __tpbulkCSWHandler
**
** Descriptions:            USB批量传输的命令状态处理阶段
**
** input parameters:        无
**                          
** output parameters:       无
** Returned value:          无                                                               
**                          
*********************************************************************************************************/

void __tpbulkCSWHandler ( void )                  
{
	if (__GbitBOTStallAtBulkIn){                   
	    /*
	     *  停止批量输入端点的处理
	     */
        __BIEPStall();                                                  /*  设置Bulk-In端点状态为停止   */
		__GtpbulkCSW.dwCSWDataResidue += __GdwBOTXferResidue;
		
   		__GcBOTXferSpace &= __BOTXFERSPACE_MASK;
		__GbitBOTXferatRAM = 1;                                         /*  从RAM传输数据               */
		__GpucBOTXferData = (__uint8*) &__GtpbulkCSW;                   /*  CSW数据指针                 */
	    __GdwBOTXferResidue = 13;                                       /*  CSW包的数据长度 (13B)       */
		                                                                /*  不要用sizeof(__CSW),可能!=13*/
	    __GcBOTFsmState = __USBFSM4BOT_CSW;                             /*  设置CSW包传输标志位         */
    }else if(__GbitBOTStallAtBulkOut){
        /*
	     *  停止批量输出端点的处理
	     */
    	__BOEPStall();                                                  /*  设置Bulk-Out端点状态为停止  */
	    __GcBOTFsmState = __USBFSM4BOT_STALL;                           /*  设置端点空闲标志位          */     
    }else{
		__GtpbulkCSW.dwCSWDataResidue += __GdwBOTXferResidue;           /*  设置设备未处理的数据量      */
		
		__GcBOTXferSpace &= __BOTXFERSPACE_MASK;                        /*  清各传输地址标志位0x0F      */
		__GbitBOTXferatRAM = 1;                                         /*  从RAM传输数据               */
		__GpucBOTXferData = (__uint8*) &__GtpbulkCSW;                   /*  设置CSW包数据指针           */    
	    __GdwBOTXferResidue = 13;                                       /*  CSW包数据长度               */
		                                                                /*  不要用sizeof(__CSW)         */
	    __GcBOTFsmState = __USBFSM4BOT_CSW;                             /*  设置CSW包传输标志位         */
    }
}

/*********************************************************************************************************
  Bulk-Only TP - Class Request   Handler
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:           __tpbulkResetATA
**
** Descriptions:            批量传输的大容量存储器复位
**
** input parameters:        无
**                          
** output parameters:       无
** Returned value:          无                                                               
**                          
*********************************************************************************************************/
void __tpbulkResetATA (void)
{
    msReset();                                                          /*  存储器复位,初始化          */
    __singleTransmit(0, 0);
}

/*********************************************************************************************************
** Function name:           __tpbulkGetMaxLUN
**
** Descriptions:            设备支持的最大逻辑单元数目
**
** input parameters:        无
**                          
** output parameters:       无
** Returned value:          无                                                               
**                          
*********************************************************************************************************/
void __tpbulkGetMaxLUN (void)
{
    __uint8 c = __MAXLUN;
    __singleTransmit(&c, 1);
}

/*********************************************************************************************************
  Bulk Only Transport support functions
*********************************************************************************************************/

/*********************************************************************************************************
** Function name:           __tpbulkRead
**
** Descriptions:            批量读取数据
**
** input  parameters:        
** global parameters:       __GdwBOTXferResidue    批量传输数据剩余字节数,函数内会减去传送字节数
**                          __GpucBOTXferData       批量传输的数据指针,函数内会调整指针                       
** output parameters:       无
** Returned value:          实际读入的数据量或__BULKEP_RW_ERR                                                              
**                          
*********************************************************************************************************/

__uint16 __tpbulkRead (void)      
{
    __uint16 usLen;

	if (__GdwBOTXferResidue == 0){
	    return 0;
	}
                                                            
    if (__GdwBOTXferResidue >= __BULK_PACKET_SIZE){                     /*  每次最多只能读取1包数据     */
        usLen = __BULK_PACKET_SIZE;
    }else{
        usLen = (__uint16)__GdwBOTXferResidue;
    }
    
    usLen = __bulkRead(usLen, __GpucBOTXferData);                       /*  读取数据到指定地址          */

    if (usLen != __BULKEP_RW_ERR){
        __GdwBOTXferResidue -= usLen; 
        __GpucBOTXferData += usLen;                                     /*  调整批量传输指针            */ 
    }    
                                                                                                                        
	return usLen;         							                    /*  返回已读数据长度            */
	
}

/*********************************************************************************************************
** Function name:           __tpbulkWrite
**
** Descriptions:            批量发送数据
**
** input parameters:        无
** global parameters:       __GdwBOTXferResidue    批量传输数据剩余字节数,函数内会减去传送字节数
**                          __GpucBOTXferData      批量传输的数据指针,函数内会调整指针               
** output parameters:       无
** Returned value:          实际发送的数据量或__BULKEP_RW_ERR                                                              
**                          
*********************************************************************************************************/

__uint16 __tpbulkWrite (void)      
{
	__uint16 usLen;

    if (__GdwBOTXferResidue == 0){
	    return 0;
	}	
  
    if (__GdwBOTXferResidue >= __BULK_PACKET_SIZE){                     /*  每次最多只能发送1包数据     */
        usLen = __BULK_PACKET_SIZE;
    }else{
        usLen = (__uint16)__GdwBOTXferResidue;
    }      
    usLen = __bulkWrite(usLen, __GpucBOTXferData);                      /*  发送指定地址的数据          */
    
    if (usLen != __BULKEP_RW_ERR){
        __GdwBOTXferResidue -= usLen;
        __GpucBOTXferData += usLen;                                     /*  调整批量传输指针            */
    }
	return usLen;         							                    /*  返回已读数据长度            */
}

/*********************************************************************************************************
** Function name:           __tpbulkIsCBWValid
**
** Descriptions:            效检CBW是否有效
**
** input parameters:        无         
** output parameters:       无
** Returned value:          有效返回1, 无效返回0                                                             
**                          
*********************************************************************************************************/
__uint8 __tpbulkIsCBWValid ( void)    
{
	if( __GtpbulkCBW.dwCBWSignature == __CBW_SIGNATURE && 
	    __GtpbulkCBW.bCBWLUN < (__MAXLUN+1) && 
        __GtpbulkCBW.bCBWCDBLen <= __MAX_CDBLEN ){                      /*  0x55534243,MAX_CDBLEN=0x10  */    
		__GbCurLun = __GtpbulkCBW.bCBWLUN;                              /*  设置当前逻辑单元            */
		return(1);
	}else{
		return(0);
	}                     
}

/*********************************************************************************************************
** Function name:           __tpbulkSendSetting
**
** Descriptions:            设置设备到主机的批量数据传输参数
**
** input parameters:        ucXferSpace     传输数据的存储类型
**                          pucXferData     传输数据的指针
**                          uiXferLen       准备传输的字节数
** output parameters:       无
** Returned value:          无                                                               
**                          
*********************************************************************************************************/
void __tpbulkSendSetting ( __uint8  ucXferSpace,
                           __uint8 *pucXferData,
                           __uint32 uiXferLen
                         )
{
    __GcBOTXferSpace &= __BOTXFERSPACE_MASK;
    __GcBOTXferSpace = (__uint8)(__GcBOTXferSpace | ucXferSpace);       /*  设置传输数据的存储类型      */
    __GdwBOTXferResidue = uiXferLen;                                    /*  设置批量传输数据剩余字节数  */
    __GpucBOTXferData = pucXferData;                                    /*  设置批量传输的数据指针      */
    __GcBOTFsmState = __USBFSM4BOT_DATAIN;                              /*  设置状态机为DATAIN          */
}

/*********************************************************************************************************
** Function name:           __tpbulkRecvSetting
**
** Descriptions:            设置主机到设备的批量数据传输参数
**
** input parameters:        ucXferSpace     传输数据的存储类型
**                          pucXferData     传输数据的指针
**                          uiXferLen       准备传输的字节数
** output parameters:       无
** Returned value:          无                                                               
**                          
*********************************************************************************************************/
void __tpbulkRecvSetting ( __uint8  ucXferSpace,
                           __uint8 *pucXferData,
                           __uint32 uiXferLen
                         )
{
    __GcBOTXferSpace &= __BOTXFERSPACE_MASK;                                    
    __GcBOTXferSpace = (__uint8)(__GcBOTXferSpace | ucXferSpace);       /*  设置传输数据的存储类型      */
    __GdwBOTXferResidue = uiXferLen;                                    /*  设置批量传输数据剩余字节数  */
    __GpucBOTXferData = pucXferData;                                    /*  设置批量传输的数据指针      */
    __GcBOTFsmState = __USBFSM4BOT_DATAOUT;                             /*  设置状态机为DATAOUT         */
}


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

⌨️ 快捷键说明

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