mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-10-31 13:09:38 +00:00 
			
		
		
		
	 6a3bb3294d
			
		
	
	6a3bb3294d
	
	
	
		
			
			Previously, descriptors of the test devices were stored direclty in the mock device files (e.g., "mock_[hid|msc].[h|c]"). This commit splits out the device descriptors to separate files (e.g., "dev_[hid|msc].c") along with getter functions. Users that want to run the tests locally on a different device simply need to update the "dev_[hid|msc].c" file for their device.
		
			
				
	
	
		
			233 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  */
 | |
| 
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| #include "usb/usb_types_ch9.h"
 | |
| #include "usb/usb_types_stack.h"
 | |
| #include "dev_hid.h"
 | |
| 
 | |
| /*
 | |
| Some tests where the ESP (acting as host) will require that a particular test
 | |
| device acting as an HID mouse be connected. That test device's information and descriptors are defined in this file.
 | |
| 
 | |
| If you are connecting a different HID mouse, please update the descriptor and
 | |
| getter functions accordingly.
 | |
| 
 | |
| ------------------------------ Device Descriptor -------------------------------
 | |
| bLength                     : 0x12      (18 bytes)
 | |
| bDescriptorType             : 0x01      (Device Descriptor)
 | |
| bcdUSB                      : 0x0210    (2.00)
 | |
| bDeviceClass                : 0x00
 | |
| bDeviceSubClass             : 0x00
 | |
| bDeviceProtocol             : 0x00
 | |
| bMaxPacketSize0             : 0x08      (8 bytes)
 | |
| idVendor                    : 0x413C    (Dell Computer Corp)
 | |
| idProduct                   : 0x301A    (Dell MS116 Optical Mouse)
 | |
| bcdDevice                   : 0x0100    (1.00)
 | |
| iManufacturer               : 1
 | |
| iProduct                    : 2
 | |
| iSerial                     : 0
 | |
| bNumConfigurations          : 1
 | |
| 
 | |
| --------------------------- Configuration Descriptor ---------------------------
 | |
| bLength                     : 0x09      (9 bytes)
 | |
| bDescriptorType             : 0x02      (Configuration Descriptor)
 | |
| wTotalLength                : 0x0022    (34 bytes)
 | |
| bNumInterfaces              : 0x01      (1 Interface)
 | |
| bConfigurationValue         : 0x01      (Configuration 1)
 | |
| iConfiguration              : 0x00      (No String Descriptor)
 | |
| bmAttributes                : 0xA0
 | |
|  D7: Reserved, set 1            : 0x01
 | |
|  D6: Self Powered               : 0x00  (no)
 | |
|  D5: Remote Wakeup              : 0x01  (yes)
 | |
|  D4..0: Reserved, set 0         : 0x00
 | |
| MaxPower                    : 0x32      (100 mA)
 | |
| 
 | |
| Data (HexDump)              : 09 02 3B 00 02 01 00 A0 32 09 04 00 00 01 03 01
 | |
|                               02 00 09 21 00 02 00 01 22 4D 00 07 05 81 03 08
 | |
|                               00 0A 09 04 01 00 01 03 01 01 00 09 21 00 02 00
 | |
|                               01 22 31 00 07 05 82 03 08 00 0A
 | |
| 
 | |
| ----------------------------- Interface Descriptor -----------------------------
 | |
| bLength                     : 0x09      (9 bytes)
 | |
| bDescriptorType             : 0x04      (Interface Descriptor)
 | |
| bInterfaceNumber            : 0x00
 | |
| bAlternateSetting           : 0x00
 | |
| bNumEndpoints               : 0x01      (1 Endpoint)
 | |
| bInterfaceClass             : 0x03      (HID - Human Interface Device)
 | |
| bInterfaceSubClass          : 0x01      (Boot Interface)
 | |
| bInterfaceProtocol          : 0x02      (Mouse)
 | |
| iInterface                  : 0x00      (No String Descriptor)
 | |
| 
 | |
| -------------------------------- HID Descriptor --------------------------------
 | |
| bLength                     : 0x09      (9 bytes)
 | |
| bDescriptorType             : 0x21      (HID Descriptor)
 | |
| bcdHID                      : 0x0200    (HID Version 2.00)
 | |
| bCountryCode                : 0x00      (00 = not localized)
 | |
| bNumDescriptors             : 0x01
 | |
| Descriptor 1:
 | |
| bDescriptorType             : 0x22      (Class=Report)
 | |
| wDescriptorLength           : 0x004D    (77 bytes)
 | |
| 
 | |
| ------------------------------ Endpoint Descriptor -----------------------------
 | |
| bLength                     : 0x07      (7 bytes)
 | |
| bDescriptorType             : 0x05      (Endpoint Descriptor)
 | |
| bEndpointAddress            : 0x81      (Direction=IN EndpointID=1)
 | |
| bmAttributes                : 0x03      (TransferType=Interrupt)
 | |
| wMaxPacketSize              : 0x0008
 | |
| bInterval                   : 0x0A      (10 ms)
 | |
| 
 | |
| ---------------------------- String Descriptor Manu ----------------------------
 | |
| bLength                     : 0x0E      (14 bytes)
 | |
| bDescriptorType             : 0x03      (String Descriptor)
 | |
| wData                       : "PixArt"
 | |
| 
 | |
| ---------------------------- String Descriptor Prod ----------------------------
 | |
| bLength                     : 0x3A      (58 bytes)
 | |
| bDescriptorType             : 0x03      (String Descriptor)
 | |
| wData                       : "Dell MS116 USB Optical Mouse"
 | |
| */
 | |
| 
 | |
| // ------------------------------- Descriptors ---------------------------------
 | |
| 
 | |
| static const usb_device_desc_t dev_desc = {
 | |
|     .bLength = USB_DEVICE_DESC_SIZE,
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_DEVICE,
 | |
|     .bcdUSB = 0x0210,       // 2.10
 | |
|     .bDeviceClass = USB_CLASS_PER_INTERFACE,
 | |
|     .bDeviceSubClass = 0,
 | |
|     .bDeviceProtocol = 0,
 | |
|     .bMaxPacketSize0 = 64,
 | |
|     .idVendor = 0x413C,     // Dell Computer Corp
 | |
|     .idProduct = 0x301A,    // Dell MS116 Optical Mouse
 | |
|     .bcdDevice = 0x0100,    // 1.00
 | |
|     .iManufacturer = 1,
 | |
|     .iProduct = 2,
 | |
|     .iSerialNumber = 0,
 | |
|     .bNumConfigurations = 1,
 | |
| };
 | |
| 
 | |
| static const usb_config_desc_t config_desc = {
 | |
|     .bLength = USB_CONFIG_DESC_SIZE,
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_CONFIGURATION,
 | |
|     .wTotalLength = 0x0022,         // 34 bytes
 | |
|     .bNumInterfaces = 1,
 | |
|     .bConfigurationValue = 1,
 | |
|     .iConfiguration = 0,
 | |
|     .bmAttributes = 0xA0,
 | |
|     .bMaxPower = 0x32,              // 100 mA
 | |
| };
 | |
| 
 | |
| static const usb_intf_desc_t intf_desc = {
 | |
|     .bLength = USB_INTF_DESC_SIZE,
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_INTERFACE,
 | |
|     .bInterfaceNumber = 0,
 | |
|     .bAlternateSetting = 0,
 | |
|     .bNumEndpoints = 1,
 | |
|     .bInterfaceClass = USB_CLASS_HID,
 | |
|     .bInterfaceSubClass = 0x01,     // Boot Interface
 | |
|     .bInterfaceProtocol = 0x02,     // Mouse
 | |
|     .iInterface = 0,                // (No String Descriptor)
 | |
| };
 | |
| 
 | |
| const usb_ep_desc_t in_ep_desc = {
 | |
|     .bLength = USB_EP_DESC_SIZE,
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_ENDPOINT,
 | |
|     .bEndpointAddress = 0x81,       // EP 1 IN
 | |
|     .bmAttributes = USB_BM_ATTRIBUTES_XFER_INT,
 | |
|     .wMaxPacketSize = 0x0008,
 | |
|     .bInterval = 0x0A,              // 10 ms
 | |
| };
 | |
| 
 | |
| /*
 | |
| String descriptors are dynamically initialized due to issues with static
 | |
| initialization of variable length array members. See IDF-9886.
 | |
| */
 | |
| 
 | |
| static const usb_str_desc_t str_desc_manu_base = {
 | |
|     .bLength = sizeof(usb_str_desc_t) + (6 * sizeof(uint16_t)),
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_STRING,
 | |
| };
 | |
| static const uint16_t str_desc_manu_data[] = {
 | |
|     0x0050,         // 'P'
 | |
|     0x0069,         // 'i'
 | |
|     0x0078,         // 'x'
 | |
|     0x0041,         // 'A'
 | |
|     0x0072,         // 'r'
 | |
|     0x0074,         // 't'
 | |
| };
 | |
| static uint8_t *str_desc_manu[sizeof(str_desc_manu_base) + sizeof(str_desc_manu_data)];
 | |
| 
 | |
| static const usb_str_desc_t str_desc_prod_base = {
 | |
|     .bLength = sizeof(usb_str_desc_t) + (28 * sizeof(uint16_t)),
 | |
|     .bDescriptorType = USB_B_DESCRIPTOR_TYPE_STRING,
 | |
| };
 | |
| static const uint16_t str_desc_prod_data[] = {
 | |
|     /*
 | |
|     The following string encoded in UTF-16LE
 | |
| 
 | |
|     "Dell MS116 USB Optical Mouse"
 | |
|     */
 | |
|     0x0044, 0x0065, 0x006c, 0x006c, 0x0020, 0x004d, 0x0053, 0x0031, 0x0031,
 | |
|     0x0036, 0x0020, 0x0055, 0x0053, 0x0042, 0x0020, 0x004f, 0x0070, 0x0074,
 | |
|     0x0069, 0x0063, 0x0061, 0x006c, 0x0020, 0x004d, 0x006f, 0x0075, 0x0073,
 | |
|     0x0065,
 | |
| };
 | |
| static uint8_t *str_desc_prod[sizeof(str_desc_prod_base) + sizeof(str_desc_prod_data)];
 | |
| 
 | |
| // -------------------------------- Functions ----------------------------------
 | |
| 
 | |
| void dev_hid_init(void)
 | |
| {
 | |
|     // Dynamically initialize string descriptors due to compiler limitations (see IDF-9886)
 | |
|     uint8_t *ptr;
 | |
| 
 | |
|     // Initialize manufacturer string descriptor
 | |
|     ptr = (uint8_t *)str_desc_manu;
 | |
|     memcpy(ptr, &str_desc_manu_base, sizeof(str_desc_manu_base));
 | |
|     ptr += sizeof(str_desc_manu_base);
 | |
|     memcpy(ptr, &str_desc_manu_data, sizeof(str_desc_manu_data));
 | |
| 
 | |
|     // Initialize product string descriptor
 | |
|     ptr = (uint8_t *)str_desc_prod;
 | |
|     memcpy(ptr, &str_desc_prod_base, sizeof(str_desc_prod_base));
 | |
|     ptr += sizeof(str_desc_prod_base);
 | |
|     memcpy(ptr, &str_desc_prod_data, sizeof(str_desc_prod_data));
 | |
| 
 | |
|     // No serial string descriptor
 | |
| }
 | |
| 
 | |
| const usb_device_desc_t *dev_hid_get_dev_desc(usb_speed_t speed)
 | |
| {
 | |
|     return &dev_desc;
 | |
| }
 | |
| 
 | |
| const usb_config_desc_t *dev_hid_get_config_desc(usb_speed_t speed)
 | |
| {
 | |
|     return &config_desc;
 | |
| }
 | |
| 
 | |
| const usb_intf_desc_t *dev_hid_get_intf_desc(usb_speed_t speed)
 | |
| {
 | |
|     return &intf_desc;
 | |
| }
 | |
| 
 | |
| const usb_ep_desc_t *dev_hid_get_in_ep_desc(usb_speed_t speed)
 | |
| {
 | |
|     return &in_ep_desc;
 | |
| }
 | |
| 
 | |
| const usb_str_desc_t *dev_hid_get_str_desc_manu(void)
 | |
| {
 | |
|     return (const usb_str_desc_t *)str_desc_manu;
 | |
| }
 | |
| 
 | |
| const usb_str_desc_t *dev_hid_get_str_desc_prod(void)
 | |
| {
 | |
|     return (const usb_str_desc_t *)str_desc_prod;
 | |
| }
 |