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

📄 usbd.c

📁 smartARM2400 USB host例程
💻 C
📖 第 1 页 / 共 4 页
字号:

/*********************************************************************************************************
** Function name:       usbSunchFrame
** Descriptions:        同步帧请求,用于设置并报告端点的同步帧号
** input parameters:    wIndex  端点号
** output parameters:   pucData 返回的帧号
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_INT8U usbSunchFrame (USB_INT16U wIndex, USB_INT8U *pucData)
{
    return USB_ERR_SOFT_NOT_SUPPORT;                                    /*  当前版本不支持同步传输      */
}


/*********************************************************************************************************
** Function name:       usbInterfaceEpConfig
** Descriptions:        根据获取到的配置描述符数据找出接口描述符及其端点描述符,
**                      并将其填充到相应的描述符结构体中
** input parameters:    pucBuf          获取到的配置描述符数据缓冲区
**                      usConfigDescLen 配置描述符总长度
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbInterfaceEpConfig (USB_INT8U *pucBuf, USB_INT16U usConfigDescLen)
{   
    USB_INT8U  ucEpNum;
    USB_INT16U usTmp; 
    USB_INT16U usCount;
    USB_INT16U usMaxPktSize;
    USB_INT8U *pucTmp;

    USB_INT8   cInterfaceIndex;
    USB_INT8U  ucBulkInIndex, ucBulkOutIndex;
    USB_INT8U  ucIntrInIndex, ucIntrOutIndex;
    USB_INT8U  ucIsoInIndex, ucIsoOutIndex;

    USBDEBUG_SENDSTR("\t...usbInterfaceEpConfig\r\n");
    
   	/*
   	 *  获取接口和端点的描述符信息
   	 */
   	cInterfaceIndex = -1;
   	usCount = 9;                                                        /*  跳过9字节基本的配置描述符   */
   	do {
   	    usTmp = *(pucBuf + usCount + 1);                                /*  描述符类型                  */
   	    if (usTmp == __USB_INTERFACE_DESCRIPTOR_TYPE) {                 /*  接口描述符                  */
   	        cInterfaceIndex++;
   	        GusbInterEpDescr[cInterfaceIndex].ucInterfaceIndex = cInterfaceIndex;
   	        if (cInterfaceIndex >= __USB_MAX_INTERFACE) {               /*  含有的接口描述符已超过了    */
   	            break;                                                  /*  ...预定的接口描述符数       */
   	        }
   	        
   	        /*
   	         *  找到第cInterfaceIndex个接口
   	         */
   	        pucTmp = (USB_INT8U *)&(GusbInterEpDescr[cInterfaceIndex].usbInterfaceDescr);
   	        usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_INTERFACE_DESCRIPTOR));
      	    
      	    /*
      	     *  清零该接口的各端点计数器,以方便对下一接口的端点数进行计数
      	     */
      	    ucBulkInIndex  = 0;
   	        ucBulkOutIndex = 0;
   	        ucIntrInIndex  = 0;
   	        ucIntrOutIndex = 0;
   	        ucIsoInIndex   = 0;
   	        ucIsoOutIndex  = 0;
   	        
	    } else if (usTmp == __USB_ENDPOINT_DESCRIPTOR_TYPE) {           /*  端点描述符                  */
	        if (cInterfaceIndex < 0) {                                  /*  尚未找到接口描述符          */
	            return FALSE;
	        }
	        
   	        if ( (*(pucBuf + usCount + 3) & 0x03) == 0x01) {            /*  同步传输                    */ 
   	            if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/*  IN 端点                     */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbIsoInEpDescr[ucIsoInIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucIsoInEpNum++;
   	            } else {                                                /*  OUT 端点                    */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbIsoOutEpDescr[ucIsoOutIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucIsoOutEpNum++;
   	            }
   	        } else if ( (*(pucBuf + usCount + 3) & 0x03) == 0x02) {     /*  块传输                      */
   	            if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/*  IN 端点                     */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbBulkInEpDescr[ucBulkInIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucBulkInEpNum++;
   	            } else {                                                /*  OUT 端点                    */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbBulkOutEpDescr[ucBulkOutIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucBulkOutEpNum++;
   	            } 
   	        } else if ( (*(pucBuf + usCount + 3) & 0x03) == 0x03) {     /*  中断传输                    */
   	            if ( (*(pucBuf + usCount + 2) & (USB_INT8U)0x80) != 0) {/*  IN 端点                     */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbIntrInEpDescr[ucIntrInIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucIntrInEpNum++;
   	            } else {                                                /*  OUT 端点                    */
   	                pucTmp = (USB_INT8U *)&GusbInterEpDescr[cInterfaceIndex].\
   	                                       usbIntrOutEpDescr[ucIntrOutIndex++];
   	                GusbInterEpDescr[cInterfaceIndex].ucIntrOutEpNum++;
   	            }
   	        }
   	        usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_ENDPOINT_DESCRIPTOR));
   	                                                                    /*  将数据填充到相应的端点描述符*/
   	                                                                    /*  ...结构体变量               */
            ucEpNum = *(pucBuf + usCount + 2);
            ucEpNum = (USB_INT8U)(((ucEpNum >> 3) | ucEpNum) & 0x1F);
            usMaxPktSize = (USB_INT16U)(*(pucBuf + usCount + 5) << 8);
            usMaxPktSize = (USB_INT16U)(usMaxPktSize + *(pucBuf + usCount + 4));
            __GusEpMaxPktSize[cInterfaceIndex][ucEpNum] = usMaxPktSize;
            
        } else if (usTmp == __USB_OTG_DESCRIPTOR_TYPE) {                /*  OTG描述符                   */
            pucTmp = (USB_INT8U *)&GusbOtgDescr;
            usbMemCopy(pucTmp, pucBuf + usCount, sizeof(USB_OTG_DESCRIPTOR));
        
        } else {                                                        /*  对其它类型描述符跳过,不关心 */
            ;
        }
        usCount = (USB_INT16U)(usCount + *(pucBuf + usCount));          /*  更新计数器                  */
    } while (usCount < usConfigDescLen);
    
    if (cInterfaceIndex < 0) {                                          /*  未找到接口描述符            */
        return FALSE;
    }
    
    /*
     *  将所具有的接口描述符总数写到每个接口描述符结构体变量的ucInterfaceNum字段中
     */
    for (usCount = 0; usCount <= cInterfaceIndex; usCount++) {     
        GusbInterEpDescr[usCount].ucInterfaceNum = (USB_INT8U)(cInterfaceIndex + 1);
    }
    
    return TRUE;
}

/*********************************************************************************************************
** Function name:       usbGetEpMaxPktSize
** Descriptions:        获取端点的最大包大小
** input parameters:    ucInterfaceIndex 接口索引
**                      ucEpNum          端点号
** output parameters:   None
** Returned value:      > 0 : 所要端点的最大包大小,  0 : 失败,表示端点ucEpNum不存在
*********************************************************************************************************/
USB_INT16U usbGetEpMaxPktSize (USB_INT8U ucInterfaceIndex, USB_INT8U ucEpNum)
{
    ucEpNum = (USB_INT8U)(((ucEpNum >> 3) | ucEpNum) & 0x1F);
    
    return __GusEpMaxPktSize[ucInterfaceIndex][ucEpNum];
}

/*********************************************************************************************************
** Function name:       usbIsDeviceReady
** Descriptions:        判断设备是否准备好
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 设备准备好   FALSE : 设备未准备好
*********************************************************************************************************/
USB_BOOL usbIsDeviceReady (void)
{
    return (USB_BOOL)(GusbHostFlags.ucEnumed == 1); 
}

/*********************************************************************************************************
** Function name:       usbIsDeviceAttach
** Descriptions:        判断设备是否插入
** input parameters:    None
** output parameters:   None
** Returned value:      TRUE : 设备已插入   FALSE : 设备未准备插入
*********************************************************************************************************/
USB_BOOL usbIsDeviceAttach (void)
{
    return (USB_BOOL)(GusbHostFlags.ucAttached == 1); 
}

/*********************************************************************************************************
** Function name:       usbGetDeviceType
** Descriptions:        获取设备类型信息,包括设备类型,所支持协议等
** input parameters:    ucInterfaceIndex 接口号
** output parameters:   pusbDeviceType   设备类型
** Returned value:      TRUE : 成功   FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbGetDeviceType (USB_INT8U ucInterfaceIndex, PUSB_DEVICE_TYPE pusbDeviceType)
{
    if (!usbIsDeviceReady()) {
        return FALSE;
    }
    
    pusbDeviceType->bDeviceClass    = GusbDeviceDescr.bDeviceClass;
    pusbDeviceType->bDeviceProtocol = GusbDeviceDescr.bDeviceProtocol;
    
    pusbDeviceType->bInterfaceClass = GusbInterEpDescr[ucInterfaceIndex].\
                                      usbInterfaceDescr.bInterfaceClass;
    pusbDeviceType->bInterfaceProtocol = GusbInterEpDescr[ucInterfaceIndex].\
                                         usbInterfaceDescr.bInterfaceProtocol;
    pusbDeviceType->bInterfaceSubClass = GusbInterEpDescr[ucInterfaceIndex].\
                                         usbInterfaceDescr.bInterfaceSubClass;
   
    return TRUE;
}

/*********************************************************************************************************
** Function name:       usbGetEp
** Descriptions:        获取非控制端点的端点号
** input parameters:    ucInterface 接口号
**                      ucTranType  传输类型
** output parameters:   None
** Returned value:      > 0 : 端点号,  = 0 : 获取失败,可能是设备不存在该类型端点
*********************************************************************************************************/
USB_INT8U usbGetEp (USB_INT8U ucInterface, USB_INT8U ucTranType)
{
    USB_INT8U ucEpNum = 0;
    
    switch (ucTranType) {
    
    case USB_TRAN_TYPE_BULK_OUT:                                        /*  Bulk OUT 传输               */
        ucEpNum = GusbInterEpDescr[ucInterface].usbBulkOutEpDescr[0].bEndpointAddress;
        break;
        
    case USB_TRAN_TYPE_BULK_IN:                                         /*  Bulk IN 传输                */
        ucEpNum = GusbInterEpDescr[ucInterface].usbBulkInEpDescr[0].bEndpointAddress;
        break;
           
    case USB_TRAN_TYPE_INTR_OUT:                                        /*  Intrrupt OUT  传输          */
        ucEpNum = GusbInterEpDescr[ucInterface].usbIntrOutEpDescr[0].bEndpointAddress;
        break;
        
    case USB_TRAN_TYPE_INTR_IN:                                         /*  Intrrupt IN 传输            */
        ucEpNum = GusbInterEpDescr[ucInterface].usbIntrInEpDescr[0].bEndpointAddress;
        break;
        
    default:                                                            /*  不支持的传输类型            */
        ucEpNum = 0;
    }
    
    return ucEpNum;
}

/*********************************************************************************************************
** Function name:       usbGetVer
** Descriptions:        取得USB协议栈的版本号
** input parameters:    None
** output parameters:   None
** Returned value:      32位版本号
*********************************************************************************************************/
INT32U usbGetVer (void)
{
#define __CPU_TYPE          2468

#define __USB_TYPE_DEVICE   0
#define __USB_TYPE_HOST     1U
#define __USB_TYPE_OTG      2U

#define __USB_TYPE          __USB_TYPE_HOST

#define __USB_VERSION       0x0100

	return (__USB_TYPE_HOST << 30) | (__CPU_TYPE << 16) | __USB_VERSION;/*  主机协议栈,for LPC2468,     */
														                /*  ...版本 0x0100              */
}

#ifdef __cplusplus
 }
#endif

/*********************************************************************************************************
** Function name:       __usbdInit
** Descriptions:        USBD层的环境初始化
** input parameters:    pEnumSucessCallBack: 枚举成功时回调函数
**                      pDevDisconCallBack:  设备拨出时回调函数
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __usbdInit (void (*pEnumSucessCallBack)(void), void (*pDevDisconCallBack)(void))
{
    __GucUsbDevAddr                = 0;
    
    __GusbHostEvtCnt.ucDataTranCnt = 0;
    __GusbHostEvtCnt.ucStdTranCnt  = 0;
    
    GusbHostFlags.bExitDataOperaReq = FALSE;
    GusbHostFlags.bExitStdOperaReq  = FALSE;
    
    __GpEnumSucessCallBack = pEnumSucessCallBack;
    __GpDevDisconCallBack  = pDevDisconCallBack;
    
    usbMemSet(&GusbDeviceDescr, 0, sizeof(GusbDeviceDescr));
    usbMemSet(&GusbConfigDescr, 0, sizeof(GusbConfigDescr));
    usbMemSet(&GusbOtgDescr, 0, sizeof(GusbOtgDescr));
    usbMemSet(&GusbInterEpDescr, 0, sizeof(GusbInterEpDescr));
    usbMemSet(&__GusEpMaxPktSize, 0, sizeof(__GusEpMaxPktSize));
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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