mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
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;
|
|
}
|