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

📄 usbd.c

📁 smartARM2400 USB host例程
💻 C
📖 第 1 页 / 共 4 页
字号:
                                               ((ucEpNum & 0x0F) << 7) | __GucUsbDevAddr;
            GusbHostFlags.ucIntrOutPipe = 1;
            __hcEnableSchedule(ucTranType);
        }
        break;
        
    case USB_TRAN_TYPE_INTR_IN:                                         /*  中断 IN 传输                */
        if (GusbHostFlags.ucIntrInPipe == 0) {
            __GpohciEd->edsIntrIn.uiControl = (usMaxPktSize << 16) | (1 << 14) | (__GucUsbSpeed << 13) |
                                              ((ucEpNum & 0x0F) << 7) | __GucUsbDevAddr;
            GusbHostFlags.ucIntrInPipe = 1;
            __hcEnableSchedule(ucTranType);
        }
        break;
        
    default:
        return FALSE;
    }
    
    return TRUE;
}

/*********************************************************************************************************
** Function name:       usbPipeClose
** Descriptions:        关闭传输管道
** input parameters:    ucTranType  传输类型
** output parameters:   None
** Returned value:      TRUE : 成功  FALSE : 失败
*********************************************************************************************************/
USB_BOOL usbPipeClose (USB_INT8U ucTranType)
{
    __hcDisEnSchedAndWaitNextFrame(ucTranType);
    
    OS_ENTER_CRITICAL();
    
    switch (ucTranType) {
    
    case USB_TRAN_TYPE_CONTROL:
        __GpohciEd->edsControl.uiControl |= 1 << 14;
        GusbHostFlags.ucCtrlPipe = 0;
        break;
        
    case USB_TRAN_TYPE_BULK_OUT:
        __GpohciEd->edsBulkOut.uiControl |= 1 << 14;
        GusbHostFlags.ucBulkOutPipe = 0;
        break;
        
    case USB_TRAN_TYPE_BULK_IN:
        __GpohciEd->edsBulkIn.uiControl |= 1 << 14;
        GusbHostFlags.ucBulkInPipe = 0;
        break;
        
    case USB_TRAN_TYPE_INTR_OUT:
        __GpohciEd->edsIntrOut.uiControl |= 1 << 14;
        GusbHostFlags.ucIntrOutPipe = 0;
        break;
        
    case USB_TRAN_TYPE_INTR_IN:
        __GpohciEd->edsIntrIn.uiControl |= 1 << 14;
        GusbHostFlags.ucIntrInPipe = 0;
        break;
        
    default:
        break;
    }
    
    OS_EXIT_CRITICAL();
    
    return TRUE;
}

void __usbGetDevString (void);
/*********************************************************************************************************
** Function name:       __taskUsbEnum
** Descriptions:        uC/OS-II任务,负责对插入的设备进行枚举
** input parameters:    pdata   uC/OS-II参数
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __taskUsbEnum (void *pdata)
{
    USB_INT8U  i, ucRet;
    USB_INT8U  ucBuf[22] = {0};
    USB_INT16U usConfigDescLen; 
    USB_INT8U *pucTmp;

    i = 0;
    do {
        do {
            /*
             *  USB规范规定在检测到设备插入后至少要等待100ms才能开始枚举,此处等待350ms 左右
             */
           	OSTimeDly(70);                                              
            	
          	if (GusbHostFlags.ucAttached == 0) {
           	    break;
           	}
           	usbBusReset();                                              /*  复位USB总线			        */
           	OSTimeDly(10);
           	__ohciEnableInt(__USB_INT_RHSC);                            /*  复位总线将会禁止连接改变中断*/
           	                                                            /*  故在复位后就重新使能该中断  */
           	USBDEBUG_SENDSTR("\r\n usbEnumerate...\r\n\r\n");
           	
           	__hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
           	__GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~(1 << 13)) |
           	                                   (__GucUsbSpeed << 13);   /*  配置端点速度(全速或低速)    */
           	__hcEnableSchedule(USB_TRAN_TYPE_CONTROL);

           	ucRet = usbGetDeviceDescription(0x08, ucBuf);               /*  获取设备描述符的前8字节     */
           	if (ucRet != USB_ERR_SUCESS) {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }
                break;
           	}
           	
           	pucTmp = (USB_INT8U *)&GusbDeviceDescr;
           	usbMemCopy(pucTmp, ucBuf, 0x08);                            /*  将获取到的数据填充到设备    */
           	                                                            /*  ...描述符的结构体变量中     */
           	
           	if ((GusbDeviceDescr.bLength != 0x12) || (GusbDeviceDescr.bDescriptorType != 0x01)) {
           	    break;                                                  /*  获取到的设备描述符错误      */
           	}
           	
           	__hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
           	__GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~(0x7f << 16)) |
           	                                   (GusbDeviceDescr.bMaxPacketSize0 << 16);
           	__hcEnableSchedule(USB_TRAN_TYPE_CONTROL);
           	
           	ucRet = usbSetAddress(0x01);                                /*  设置从机地址: 0x01          */
           	if (ucRet == USB_ERR_SUCESS) {
                __GucUsbDevAddr = 0x01;
                __hcDisEnSchedAndWaitNextFrame(USB_TRAN_TYPE_CONTROL);
                __GpohciEd->edsControl.uiControl = (__GpohciEd->edsControl.uiControl & ~0xff) | __GucUsbDevAddr;
                __hcEnableSchedule(USB_TRAN_TYPE_CONTROL);
           	} else {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }
           	    break;
          	}
          	
           	ucRet = usbGetDeviceDescription(0x12, ucBuf);               /*  重新获取0x12字节的设备描述符*/
           	if (ucRet != USB_ERR_SUCESS) {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }   
                break;
           	}
           	pucTmp = (USB_INT8U *)&GusbDeviceDescr;
           	usbMemCopy(pucTmp, ucBuf, 0x12);                            /*  将获取到的数据填充到设备    */
           	                                                            /*  ...描述符的结构体变量中     */
           	__usbGetDevString();                                        /*  获取产商字符串描述符和产品字*/
           	                                                            /*  符串描述符,并发送到调试接口 */
           	ucRet = usbGetConfigDescription(0, 0, 9, ucBuf);            /*  获取9字节的配置描述符       */
           	if (ucRet != USB_ERR_SUCESS) {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }
                break;
           	}
           	pucTmp = (USB_INT8U *)&GusbConfigDescr;
           	usbMemCopy(pucTmp, ucBuf, 0x09);                            /*  将获取到的数据填充到配置    */
           	                                                            /*  ...描述符的结构体变量中     */
           	usConfigDescLen = (USB_INT16U)(GusbConfigDescr.wTotalLength1 << 8);
           	usConfigDescLen = (USB_INT16U)(usConfigDescLen + GusbConfigDescr.wTotalLength0);
           	                                                            /*  计算总配置描述符长度        */
           	pucTmp = NULL;
           	pucTmp = (USB_INT8U *)malloc(usConfigDescLen);
           	if (pucTmp == NULL) {
           	    break;
           	}
           	ucRet = usbGetConfigDescription(0, 0, usConfigDescLen, pucTmp); 
           	                                                            /*  获取所有的设备描述符        */
           	if (ucRet != USB_ERR_SUCESS) {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }
                break;
           	} else{
           	    usbInterfaceEpConfig(pucTmp, usConfigDescLen);          /*  获取到的配置描述符中的接口  */
            }                                                           /*  ..描述符和端点描述符进行整理*/
           	free(pucTmp);                                               /*  释放缓冲区                  */
           	
           	ucRet = usbSetConfiguratiton();                             /*  设置配置                    */
           	if (ucRet != USB_ERR_SUCESS) {
                if (ucRet == USB_ERR_STALL) {                
                    usbClearFeature_EP(0);
                }
                break;
           	}
            GusbHostFlags.ucEnumed = 1;                                 /*  标志枚举成功                */
            USBDEBUG_SENDSTR("\r\n usbEnumerate sucess!\r\n");
            
            usbPipeOpen(USB_TRAN_TYPE_INTR_OUT);
            usbPipeOpen(USB_TRAN_TYPE_INTR_IN);
            usbPipeOpen(USB_TRAN_TYPE_BULK_OUT);
            usbPipeOpen(USB_TRAN_TYPE_BULK_IN);

        } while (0);
        if (GusbHostFlags.ucEnumed) {
            if (__GpEnumSucessCallBack) {
                (*__GpEnumSucessCallBack)();                            /*  执行枚举成功回调函数        */
            }
            break;
        }
    } while (i++ < 3);
    if (GusbHostFlags.ucEnumed == 0) {
        USBDEBUG_SENDSTR("\r\n usbEnumerate failed!\r\n");
    }
    
    USBDEBUG_SENDSTR("\r\n Delete usbEnumerate task!\r\n\r\n");
    OSTaskDel(OS_PRIO_SELF);
    
    while (1) {
        ;
    }
}

/*********************************************************************************************************
** Function name:       __usbGetDevString
** Descriptions:        获取供应商描述符和产品描述符,并发送到调试接口上
** input parameters:    None
** output parameters:   None
** Returned value:      None
*********************************************************************************************************/
void __usbGetDevString (void)
{
    USB_INT8U  ucBuf[44];
    USB_INT16U usLanID, usLen;
    INT8U      i, ucRet;
    
   	ucRet = usbGetStringDescription(0, 0, 4, ucBuf);                    /*  获取4字节语言ID             */
   	if (ucRet != USB_ERR_SUCESS) {
        if (ucRet == USB_ERR_STALL) {                
            usbClearFeature_EP(0);
        } 
        return;
   	} else {
   	    usLanID = (USB_INT16U)(ucBuf[3] << 8);
   	    usLanID = (USB_INT16U)(usLanID | ucBuf[2]);                     /*  语言ID                      */
   	}

   	if (GusbDeviceDescr.iManufacturer) {
   	    ucBuf[1] = 0;
   	    ucRet = usbGetStringDescription(GusbDeviceDescr.iManufacturer, 
   	                                    usLanID, 2, ucBuf);             /*  获取供应商字符串描述符前两字节*/
       	if (ucBuf[1] != 0x03) {
       	    return;
       	}
       	usLen = ucBuf[0];                                               /*  获取供应商字符串描述符长度  */
       	if (usLen > sizeof(ucBuf)) {
       	    usLen = sizeof(ucBuf);
       	}
       	ucRet = usbGetStringDescription(GusbDeviceDescr.iManufacturer, 
   	                                    usLanID, usLen, ucBuf);         /*  获取供应商字符串描述符      */
       	if (ucRet != USB_ERR_SUCESS) {
            if (ucRet == USB_ERR_STALL) {                
                usbClearFeature_EP(0);
            } else {
                return;
            }
       	} else {
       	    USBDEBUG_SENDSTR("\r\nManufacturer : ");
       	    if (usLanID == 0x0409) {
       	        for (i = 2; i < usLen; i+=2) {
       	            USBDEBUG_SENDCHAR(ucBuf[i]);
                }
            } else {  
                for (i = 2; i < usLen; i++) {
       	            USBDEBUG_SENDCHAR(ucBuf[i]);
                }
            } 	        
       	}
    }
    
   	if (GusbDeviceDescr.iProduct) {
   	    ucBuf[1] = 0;
   	    ucRet = usbGetStringDescription(GusbDeviceDescr.iProduct, 
   	                                    usLanID, 2, ucBuf);             /*  获取产品字符串描述符前两字节*/
       	if (ucBuf[1] != 0x03) {
       	    return;
       	}
       	usLen = ucBuf[0];                                               /*  获取产品字符串描述符长度  */
       	if (usLen > sizeof(ucBuf)) {
       	    usLen = sizeof(ucBuf);
       	}
       	ucRet = usbGetStringDescription(GusbDeviceDescr.iProduct, 
   	                                    usLanID, usLen, ucBuf);         /*  获取供应商字符串描述符      */
       	if (ucRet != USB_ERR_SUCESS) {
            if (ucRet == USB_ERR_STALL) {                
                usbClearFeature_EP(0);
            } else {
                return;
            }
       	} else {
       	    USBDEBUG_SENDSTR("\r\nProduct : ");
       	    if (usLanID == 0x0409) {
       	        for (i = 2; i < usLen; i+=2) {

⌨️ 快捷键说明

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