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

USB HID端点2能收不能发?

[复制链接]
leonardodavinci 提问时间:2020-5-12 22:13 /
大家好,
最近在弄一个HID+MSC的复合设备,基于STM32_USB-Host-Device_Lib_V2.2.0 库进行修改。
芯片使用的是STM32F429IG
下面是我的端点定义
#define MSC_IN_EP                    0x81       //bit7: 0-OUT  1-IN 即0X8x 为输入端点x
#define MSC_OUT_EP                 0x01

#define MSC_MAX_PACKET          64
#define MSC_MEDIA_PACKET       32*1024   

#define HID_IN_EP                    0x82
#define HID_OUT_EP                 0x02

#define HID_IN_PACKET                0x40
#define HID_OUT_PACKET             0x40


端点1用于MSC,端点2用于HID设备。

我遇到的问题是,系统能正常枚举复合设备,且能正常读写MSC设备。
HID端点STM32能正常接收,但是PC却收不到HID发送的数据。
也就是说0x82端点没有起到发送的作用,找了很久没找到原因。

把MSC的端点和HID的端点互换,也就是改成
#define MSC_IN_EP                    0x82       //bit7: 0-OUT  1-IN 即0X8x 为输入端点x
#define MSC_OUT_EP                 0x02


#define HID_IN_EP                    0x81
#define HID_OUT_EP                 0x01

此时HID能正常收发,MSC设备无法识别。

只有端点1能正常工作,似乎是哪里还没有改到,
请帮忙看一下,感谢。


收藏 评论3 发布时间:2020-5-12 22:13

举报

3个回答
leonardodavinci 回答时间:2020-5-12 22:15:51
这里是我目前的usbd_customhid_core.c文件中的设备配置描述符和报告描述符


/* 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 */
} ;

__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                     */
};

流水源 回答时间:2020-5-13 08:40:14
代码都没有怎么看?
leonardodavinci 回答时间:2020-5-13 11:13:20
流水源 发表于 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;
}


usbd_customhid_core.rar

下载

3.85 KB, 下载次数: 2, 下载积分: ST金币 -1

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版