流水源 发表于 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>© 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; }
所在话题
参与活动
-
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
网络 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16 -
滴滴押注社区团购,明确“投入不设上限,要做市场第一”
线下 2020-10-16