[USB编程] 我做的stm32转 ch340 的usb转串口,基于ucos,代码流程更明了

[复制链接]
 楼主| ljxh401 发表于 2021-1-29 15:55 | 显示全部楼层 |阅读模式
整个枚举过程 更加简单,明了,移植更加方便


核心代码如下
  1. void JkData_Setup0(USB_REQ *pReq)
  2. {
  3.         INT8U err;
  4.         //printf("r:%02X%04X%02X\r\n",pReq->USBbRequest,pReq->USBwValues,pReq->USBwLengths);
  5.         if (pReq->USBbRequest == GET_DESCRIPTOR)
  6.         {
  7.           ONE_DESCRIPTOR *pDescriptor=NULL;//=(ONE_DESCRIPTOR*)&Device_Descriptor;
  8.           if ( (pReq->USBbmRequestType& (REQUEST_TYPE | RECIPIENT)) == (STANDARD_REQUEST | DEVICE_RECIPIENT))
  9.           {
  10.                 switch(pReq->USBwValues>>8)
  11.                 {
  12.                         case DEVICE_DESCRIPTOR:
  13.                                 pDescriptor=(ONE_DESCRIPTOR*)&Device_Descriptor;
  14.                                 break;
  15.                         case CONFIG_DESCRIPTOR:
  16.                                 pDescriptor=(ONE_DESCRIPTOR*)&Config_Descriptor;
  17.                                 break;
  18.                         case STRING_DESCRIPTOR:
  19.                                 pDescriptor=(ONE_DESCRIPTOR*)&String_Descriptor[pReq->USBwValues&0xff];
  20.                                 break;
  21.                 }
  22.                 err=SendEp0Data(pDescriptor->Descriptor,pReq->USBwLengths,pDescriptor->Descriptor_Size);
  23.           }
  24.         }
  25.         else if(pReq->USBbRequest == SET_ADDRESS)
  26.         {
  27.                 //返回一个空回复,作为事务的状态回复
  28.                 if(SendEp0Data(NULL,0,0)==OS_NO_ERR)
  29.                         SetDeviceAddress(pReq->USBwValues&0xff);
  30.         }
  31.         else if(pReq->USBbRequest==SET_CONFIGURATION)
  32.         {
  33.                 //返回一个空回复,作为事务的状态回复
  34.                 SendEp0Data(NULL,0,0);
  35.                 usbConfig=pReq->USBwValues;
  36.         }
  37.         else
  38.                 Ep0SetupCustom(pReq);
  39. }

  40. INT8U SetupHandle(void)
  41. {
  42.         USB_REQ req;       
  43.         INT8U *pBuf = PMAAddr + (INT8U *)(_GetEPRxAddr(ENDP0) * 2);         /* *2 for 32 bits addr */
  44.         req.USBbmRequestType=*pBuf++;
  45.         req.USBbRequest=*pBuf++;
  46.         pBuf+=2;
  47.         req.USBwValues=pBuf[0]+((INT16U)pBuf[1]<<8);
  48.         pBuf+=4;
  49.         req.USBwIndexs=pBuf[0]+((INT16U)pBuf[1]<<8);
  50.         pBuf+=4;
  51.         req.USBwLengths=pBuf[0]+((INT16U)pBuf[1]<<8);
  52.         JkData_Setup0(&req);
  53.         return 1;
  54. }

  55. /*---- U S B   T A S K ----
  56. 【功能】:将usb
  57. 的端点0的控制中断,描述符上移动到这里来,让代码更加清晰,这里是尝试移植stm32的虚拟串口的
  58. 【参数】:****
  59. 【返回】:****
  60. 【说明】:****
  61. --------------作者:卢杰西   2021年1月23日17:12:35--------------------------------*/
  62. void UsbTask(void *pt)
  63. {
  64.         INT8U err;
  65.         INT32U msg;
  66.         CREATE_SMSG(OSQUsbEP0, 10);
  67.         InitUsb();
  68.         while(1)
  69.         {
  70.                 msg=(INT32U)OSQPend(OSQUsbEP0,0,&err);
  71.                 if ((msg & EP_CTR_TX) != 0)
  72.                 {
  73.                         SetEPRxValid(ENDP0);
  74.                 }
  75.                 else if ((msg &EP_SETUP) != 0)
  76.                 {
  77.                         SetupHandle();
  78.                 }
  79.                 else if ((msg & EP_CTR_RX) != 0)
  80.                 {
  81.                         SetEPRxValid(ENDP0);
  82.                 }
  83.         }
  84. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
McuPlayer 发表于 2021-2-6 18:05 | 显示全部楼层
很棒,代码风格也不错,注释也规范
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

230

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

52

主题

230

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部