你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

st-img
chrome
st-img
firefox
st-img
safari
st-img
ie8及以上
shequ.stmicroelectronics.cn
  • ST意法半导体官网
  • STM32中文官网
  • ST全球论坛
登录/注册
  • 首页
  • 技术问答
  • 话题
  • 资源
  • 创客秀
  • 视频
  • 标签
  • 积分商城
  • 每日签到
leonardodavinci

leonardodavinci

 

回答数 0 关注数 0
关注 私信
  • 动态99
  • 提问
  • 回答0
  • 创客秀 0
  • 分享 0
  • 关注0
3 回答

USB HID端点2能收不能发?

USB
leonardodavinci leonardodavinci 回答时间: 2020-5-13 11:13

流水源 发表于 2020-5-13 08:40 代码都没有怎么看? 不好意思,我可能说的不够清楚,因为是在STM32_USB-Host-Device_Lib_V2.2.0库的基础上修改的,只修改了usbd_customhid_core.c这个文件的内容。我把完整的内容贴出来。 /**   ******************************************************************************   * @file    usbd_customhid_core.c   * @author  MCD Application Team   * @version V1.2.0   * @date    09-November-2015   * @brief   This file provides the CUSTOM_HID core functions.   *   * @verbatim   *         *          ===================================================================         *                                CUSTOM_HID Class  Description   *          ===================================================================   *           This module manages the HID class V1.11 following the "Device Class Definition   *           for Human Interface Devices (CUSTOM_HID) Version 1.11 Jun 27, 2001".   *           This driver implements the following aspects of the specification:   *             - The Boot Interface Subclass   *             - The Mouse protocol   *             - Usage Page : Generic Desktop   *             - Usage : Vendor   *             - Collection : Application   *         * @note     In HS mode and when the DMA is used, all variables and data structures   *           dealing with the DMA during the transaction process should be 32-bit aligned.   *              *         *  @endverbatim   *   ******************************************************************************   * @attention   *   * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>   *   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");   * You may not use this file except in compliance with the License.   * You may obtain a copy of the License at:   *   *        http://www.st.com/software_license_agreement_liberty_v2   *   * Unless required by applicable law or agreed to in writing, software   * distributed under the License is distributed on an "AS IS" BASIS,   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   * See the License for the specific language governing permissions and   * limitations under the License.   *   ******************************************************************************   */ /* Includes ------------------------------------------------------------------*/ #include "usbd_customhid_core.h" #include "usbd_desc.h" #include "usbd_req.h" extern void addData2RcvBuffer(u8 *pData, u8 Len); /** @defgroup USBD_CUSTOM_HID_Private_FunctionPrototypes   * @{   */ uint8_t  USBD_CUSTOM_HID_Init (void  *pdev,                                uint8_t cfgidx); uint8_t  USBD_CUSTOM_HID_DeInit (void  *pdev,                                  uint8_t cfgidx); uint8_t  USBD_CUSTOM_HID_Setup (void  *pdev,                                 USB_SETUP_REQ *req); static uint8_t  *USBD_CUSTOM_HID_GetCfgDesc (uint8_t speed, uint16_t *length); uint8_t  USBD_CUSTOM_HID_DataIn (void  *pdev, uint8_t epnum); uint8_t  USBD_CUSTOM_HID_DataOut (void  *pdev, uint8_t epnum); uint8_t  USBD_CUSTOM_HID_EP0_RxReady (void  *pdev); /**   * @}   */ /** @defgroup USBD_HID_Private_Variables   * @{   */ USBD_Class_cb_TypeDef  USBD_CUSTOMHID_cb = {   USBD_CUSTOM_HID_Init,   USBD_CUSTOM_HID_DeInit,   USBD_CUSTOM_HID_Setup,   NULL, /*EP0_TxSent*/     USBD_CUSTOM_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */   USBD_CUSTOM_HID_DataIn, /*DataIn*/   USBD_CUSTOM_HID_DataOut,   NULL, /*SOF */   NULL,   NULL,         USBD_CUSTOM_HID_GetCfgDesc, #ifdef USB_OTG_HS_CORE     USBD_CUSTOM_HID_GetCfgDesc, /* use same config as per FS */ #endif   }; uint8_t USB_HID_RcvBuf[64]; uint8_t USBD_HID_Report_ID=0; __IO uint32_t IsReportAvailable = 0; uint8_t usbRcvCnt = 0; //extern uint8_t PrevXferDone; #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED   #if defined ( __ICCARM__ ) /*!< IAR Compiler */     #pragma data_alignment=4      #endif #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */         __ALIGN_BEGIN static uint32_t  USBD_HID_AltSet  __ALIGN_END = 0; #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED   #if defined ( __ICCARM__ ) /*!< IAR Compiler */     #pragma data_alignment=4      #endif #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */       __ALIGN_BEGIN static uint32_t  USBD_HID_Protocol  __ALIGN_END = 0; #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED   #if defined ( __ICCARM__ ) /*!< IAR Compiler */     #pragma data_alignment=4      #endif #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */   __ALIGN_BEGIN static uint32_t  USBD_HID_IdleState __ALIGN_END = 0; #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED   #if defined ( __ICCARM__ ) /*!< IAR Compiler */     #pragma data_alignment=4      #endif #endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ /* USB HID device Configuration Descriptor */ __ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuration Descriptor size */   USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */   USB_CUSTOM_HID_CONFIG_DESC_SIZ,   /* wTotalLength: Bytes returned */   0x00,   0x01,         /*bNumInterfaces: 1 interface*/   0x01,         /*bConfigurationValue: Configuration value*/   0x00,         /*iConfiguration: Index of string descriptor describing   the configuration*/   0xC0,         /*bmAttributes: bus powered and Support Remote Wake-up */   0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/   /************** Descriptor of Custom HID interface ****************/   /* 09 */   0x09,         /*bLength: Interface Descriptor size*/   USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/   0x00,         /*bInterfaceNumber: Number of Interface*/   0x00,         /*bAlternateSetting: Alternate setting*/   0x02,         /*bNumEndpoints*/   0x03,         /*bInterfaceClass: HID*/   0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/   0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/   0,            /*iInterface: Index of string descriptor*/   /******************** Descriptor of Custom HID ********************/   /* 18 */   0x09,         /*bLength: HID Descriptor size*/   CUSTOM_HID_DESCRIPTOR_TYPE, /*bDescriptorType: HID*/   0x11,         /*bcdHID: HID Class Spec release number*/   0x01,   0x00,         /*bCountryCode: Hardware target country*/   0x01,         /*bNumDescriptors: Number of HID class descriptors to follow*/   0x22,         /*bDescriptorType*/   USBD_CUSTOM_HID_REPORT_DESC_SIZE,/*wItemLength: Total length of Report descriptor*/   0x00,   /******************** Descriptor of Custom HID endpoints ***********/   /* 27 */   0x07,          /* bLength: Endpoint Descriptor size */   USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */   HID_IN_EP,     /* bEndpointAddress: Endpoint Address (IN) */   0x03,          /* bmAttributes: Interrupt endpoint */   0x40,  //HID_IN_PACKET, /* wMaxPacketSize:  Bytes max */   0x00,   0x20,          /* bInterval: Polling Interval (32 ms) */   /* 34 */   0x07,                 /* bLength: Endpoint Descriptor size */   USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */   /*        Endpoint descriptor type */   HID_OUT_EP,        /* bEndpointAddress: */   /*        Endpoint Address (OUT) */   0x03,        /* bmAttributes: Interrupt endpoint */   0x40, //HID_OUT_PACKET,        /* wMaxPacketSize: 2 Bytes max  */   0x00,   0x20,        /* bInterval: Polling Interval (20 ms) */   /* 41 */ } ; #ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED   #if defined ( __ICCARM__ ) /*!< IAR Compiler */     #pragma data_alignment=4      #endif #endif __ALIGN_BEGIN static uint8_t CustomHID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = {   0x06,0x00,0xff,/* USAGE_PAGE  */   0x05, 0x8c, /* USAGE_PAGE (ST Page) */   0x09, 0x01, /* USAGE (Demo Kit) */   0xa1, 0x01, /* COLLECTION (Application) */   // The Input report   0x09,0x03, // USAGE ID - Vendor defined   0x15,0x00, // LOGICAL_MINIMUM (0)   0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)   0x75,0x08, // REPORT_SIZE (8bit)   0x95,0x40, // REPORT_COUNT (64Byte)   0x81,0x02, // INPUT (Data,Var,Abs)   // The Output report   0x09,0x04, // USAGE ID - Vendor defined   0x15,0x00, // LOGICAL_MINIMUM (0)   0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)   0x75,0x08, // REPORT_SIZE (8bit)   0x95,0x40, // REPORT_COUNT (64Byte)   0x91,0x02, // OUTPUT (Data,Var,Abs)   0xc0                          /*     END_COLLECTION                     */ }; /**   * @}   */ /** @defgroup USBD_HID_Private_Functions   * @{   */ /**   * @brief  USBD_HID_Init   *         Initialize the HID interface   * @param  pdev: device instance   * @param  cfgidx: Configuration index   * @retval status   */ uint8_t  USBD_CUSTOM_HID_Init (void  *pdev,                                uint8_t cfgidx) {   /* Open EP IN */   DCD_EP_Open(pdev,               HID_IN_EP,               HID_IN_PACKET,               USB_OTG_EP_INT);   /* Open EP OUT */   DCD_EP_Open(pdev,               HID_OUT_EP,               HID_OUT_PACKET,               USB_OTG_EP_INT);   /*Receive Data*/   DCD_EP_PrepareRx(pdev,HID_OUT_EP, USB_HID_RcvBuf,64);   return USBD_OK; } /**   * @brief  USBD_HID_Init   *         DeInitialize the HID layer   * @param  pdev: device instance   * @param  cfgidx: Configuration index   * @retval status   */ uint8_t  USBD_CUSTOM_HID_DeInit (void  *pdev,                                  uint8_t cfgidx) {   /* Close HID EPs */   DCD_EP_Close (pdev , HID_IN_EP);   DCD_EP_Close (pdev , HID_OUT_EP);   return USBD_OK; } /**   * @brief  USBD_HID_Setup   *         Handle the HID specific requests   * @param  pdev: instance   * @param  req: usb requests   * @retval status   */ uint8_t  USBD_CUSTOM_HID_Setup (void  *pdev,                                 USB_SETUP_REQ *req) {   uint8_t USBD_HID_Report_LENGTH=0;   uint16_t len = 0;   uint8_t  *pbuf = NULL;   switch (req->bmRequest & USB_REQ_TYPE_MASK)   {   case USB_REQ_TYPE_CLASS :       switch (req->bRequest)     {     case CUSTOM_HID_REQ_SET_PROTOCOL:       USBD_HID_Protocol = (uint8_t)(req->wValue);       break;     case CUSTOM_HID_REQ_GET_PROTOCOL:       USBD_CtlSendData (pdev,                         (uint8_t *)&USBD_HID_Protocol,                         1);          break;     case CUSTOM_HID_REQ_SET_IDLE:       USBD_HID_IdleState = (uint8_t)(req->wValue >> 8);       break;     case CUSTOM_HID_REQ_GET_IDLE:       USBD_CtlSendData (pdev,                         (uint8_t *)&USBD_HID_IdleState,                         1);               break;     case CUSTOM_HID_REQ_SET_REPORT:       IsReportAvailable = 1;       USBD_HID_Report_ID = (uint8_t)(req->wValue);       USBD_HID_Report_LENGTH = (uint8_t)(req->wLength);       USBD_CtlPrepareRx (pdev, USB_HID_RcvBuf, USBD_HID_Report_LENGTH);       break;           default:       USBD_CtlError (pdev, req);       return USBD_FAIL;     }     break;   case USB_REQ_TYPE_STANDARD:     switch (req->bRequest)     {     case USB_REQ_GET_DESCRIPTOR:       if( req->wValue >> 8 == CUSTOM_HID_REPORT_DESC)       {         len = MIN(USBD_CUSTOM_HID_REPORT_DESC_SIZE , req->wLength);         pbuf = (uint8_t*)CustomHID_ReportDesc;       }       else if( req->wValue >> 8 == CUSTOM_HID_DESCRIPTOR_TYPE)       {         pbuf = (uint8_t*)USBD_CUSTOM_HID_CfgDesc + 0x12;         len = MIN(USB_CUSTOM_HID_DESC_SIZ , req->wLength);       }       USBD_CtlSendData (pdev,                         pbuf,                         len);       break;     case USB_REQ_GET_INTERFACE :       USBD_CtlSendData (pdev,                         (uint8_t *)&USBD_HID_AltSet,                         1);       break;     case USB_REQ_SET_INTERFACE :       USBD_HID_AltSet = (uint8_t)(req->wValue);       break;     }   }   return USBD_OK; } /**   * @brief  USBD_HID_SendReport   *         Send HID Report   * @param  pdev: device instance   * @param  buff: pointer to report   * @retval status   */ uint8_t USBD_CUSTOM_HID_SendReport     (USB_OTG_CORE_HANDLE  *pdev,                                  uint8_t *report,                                  uint16_t len) {   if (pdev->dev.device_status == USB_OTG_CONFIGURED )   {     DCD_EP_Tx (pdev, HID_IN_EP, report, len);   }   return USBD_OK; } /**   * @brief  USBD_HID_GetCfgDesc   *         return configuration descriptor   * @param  speed : current device speed   * @param  length : pointer data length   * @retval pointer to descriptor buffer   */ static uint8_t  *USBD_CUSTOM_HID_GetCfgDesc (uint8_t speed, uint16_t *length) {   *length = sizeof (USBD_CUSTOM_HID_CfgDesc);   return USBD_CUSTOM_HID_CfgDesc; } /**   * @brief  USBD_HID_DataIn   *         handle data IN Stage   * @param  pdev: device instance   * @param  epnum: endpoint index   * @retval status   */ uint8_t  USBD_CUSTOM_HID_DataIn (void  *pdev,                               uint8_t epnum) {   /* Ensure that the FIFO is empty before a new transfer, this condition could   be caused by  a new transfer before the end of the previous transfer */   DCD_EP_Flush(pdev, HID_IN_EP);   //if (epnum == 2) PrevXferDone = 1;   return USBD_OK; } /**   * @brief  USBD_HID_DataOut   *         handle data IN Stage   * @param  pdev: device instance   * @param  epnum: endpoint index   * @retval status   */ uint8_t  USBD_CUSTOM_HID_DataOut (void  *pdev,                                   uint8_t epnum) {   /*查看接收数据长度 */   usbRcvCnt = USBD_GetRxCount(pdev, epnum);   DCD_EP_PrepareRx(pdev,HID_OUT_EP, USB_HID_RcvBuf, 64);   addData2RcvBuffer(USB_HID_RcvBuf, usbRcvCnt);   return USBD_OK; } /**   * @brief  USBD_HID_EP0_RxReady   *         Handles control request data.   * @param  pdev: device instance   * @param  epnum: endpoint index   * @retval status   */ uint8_t USBD_CUSTOM_HID_EP0_RxReady(void *pdev) {   return USBD_OK; }

赞0
leonardodavinci leonardodavinci


阅读作者更多的帖子

所在话题

参与活动

  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    网络 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16
  • 滴滴押注社区团购,明确“投入不设上限,要做市场第一”

    线下 2020-10-16