Please help me debug USB descriptors

ihabawad
Posts: 9
Joined: Sat Mar 28, 2020 5:07 pm

Please help me debug USB descriptors

Postby ihabawad » Sat Jan 20, 2024 2:06 am

Greetings folks,

I am trying to set up an ESP32-S3 as a USB *device* with the following interfaces:

* USB HID
* USB CDC

I looked through the examples and did my best, and the result is the attached program. When I connect this to my Ubuntu Linux system, and run "usb-devices", I get the following:

S: Manufacturer=Airball.aero
S: Product=Knob+CANBus peripheral
S: SerialNumber=123456
C: #Ifs= 3 Cfg#= 1 Atr=a0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00 Driver=usbhid
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=10ms
I: If#= 1 Alt= 0 #EPs= 0 Cls=02(commc) Sub=02 Prot=00 Driver=(none)
I: If#= 2 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=(none)
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=83(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms

Note that If#=1 has zero endpoints, when it should have 1 endpoint. Perhaps as a result, the "cdc_acm" driver is not binding to this interface. What am I doing wrong?

Ihab
Attachments
knob_main.c
(3.87 KiB) Downloaded 116 times

ihabawad
Posts: 9
Joined: Sat Mar 28, 2020 5:07 pm

Re: Please help me debug USB descriptors

Postby ihabawad » Sat Jan 20, 2024 7:21 pm

Here are some more results, isolated for clarity. Note that, in the code, I am merely commenting out certain areas, and changing the number of interfaces, to clarify what is being changed. My question is, if Case A and Case B work, then why does Case C not work?

CASE A: ONE HID INTERFACE (works correctly)

Code: Select all

#define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN /* + 1 * TUD_CDC_DESC_LEN */ + 1 * TUD_HID_DESC_LEN)

static const uint8_t configuration_descriptor[] = {
    // Configuration number, interface count, string index, total length, attribute, power in mA
    TUD_CONFIG_DESCRIPTOR(1, 1, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),

    // CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
    // TUD_CDC_DESCRIPTOR(0, 4, 0x81, 8, 0x82, 0x83, 64),

    // Interface number, string index, boot protocol, report descriptor len, EP In address, size & polling interval
    TUD_HID_DESCRIPTOR(1, 4, false, sizeof(hid_report_descriptor), 0x84, 16, 10),
};
Result from "usb-devices":

Code: Select all

S:  Manufacturer=Airball.aero
S:  Product=Knob+CANBus peripheral
S:  SerialNumber=123456
C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 1 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
E:  Ad=84(I) Atr=03(Int.) MxPS=  16 Ivl=10ms
CASE B: ONE CDC INTERFACE (works correctly)

Code: Select all

#define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN + 1 * TUD_CDC_DESC_LEN /* + 1 * TUD_HID_DESC_LEN */)

static const uint8_t configuration_descriptor[] = {
    // Configuration number, interface count, string index, total length, attribute, power in mA
    TUD_CONFIG_DESCRIPTOR(1, 1, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),

    // CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
    TUD_CDC_DESCRIPTOR(0, 4, 0x81, 8, 0x82, 0x83, 64),

    // Interface number, string index, boot protocol, report descriptor len, EP In address, size & polling interval
    // TUD_HID_DESCRIPTOR(1, 4, false, sizeof(hid_report_descriptor), 0x84, 16, 10),
};
Result from "usb-devices":

Code: Select all

S:  Manufacturer=Airball.aero
S:  Product=Knob+CANBus peripheral
S:  SerialNumber=123456
C:  #Ifs= 2 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=00 Driver=cdc_acm
E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=16ms
I:  If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
E:  Ad=82(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
E:  Ad=83(I) Atr=02(Bulk) MxPS=  64 Ivl=0ms
Additionally, the Linux system correctly shows a device, "/dev/ttyACM0".

CASE C: ONE HID AND ONE CDC INTERFACE (does not work)

Code: Select all

#define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN + 1 * TUD_CDC_DESC_LEN + 1 * TUD_HID_DESC_LEN)

static const uint8_t configuration_descriptor[] = {
    // Configuration number, interface count, string index, total length, attribute, power in mA
    TUD_CONFIG_DESCRIPTOR(1, 2, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),

    // CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.
    TUD_CDC_DESCRIPTOR(0, 4, 0x81, 8, 0x82, 0x83, 64),

    // Interface number, string index, boot protocol, report descriptor len, EP In address, size & polling interval
    TUD_HID_DESCRIPTOR(1, 4, false, sizeof(hid_report_descriptor), 0x84, 16, 10),
};
Result from "usb-devices":

Code: Select all

S:  Manufacturer=Airball.aero
S:  Product=Knob+CANBus peripheral
S:  SerialNumber=123456
C:  #Ifs= 0 Cfg#= 0 Atr= MxPwr=
I:  If#= 0 Alt= 0 #EPs= 0 Cls=(none)() Sub= Prot= Driver=
I see no suspicious error messages in the serial console:

Code: Select all

ESP-ROM:esp32s3-20210327
Build:Mar 27 2021
rst:0x1 (POWERON),boot:0x2b (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x3fce3820,len:0x1718
load:0x403c9700,len:0x4
load:0x403c9704,len:0xc20
load:0x403cc700,len:0x2f20
entry 0x403c9910
I (27) boot: ESP-IDF v5.2-dev-2164-g3befd5fff7 2nd stage bootloader
I (27) boot: compile time Jan 17 2024 21:01:07
I (28) boot: Multicore bootloader
I (32) boot: chip revision: v0.1
I (36) boot.esp32s3: Boot SPI Speed : 80MHz
I (40) boot.esp32s3: SPI Mode       : DIO
I (45) boot.esp32s3: SPI Flash Size : 2MB
I (50) boot: Enabling RNG early entropy source...
I (55) boot: Partition Table:
I (59) boot: ## Label            Usage          Type ST Offset   Length
I (66) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (74) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (81) boot:  2 factory          factory app      00 00 00010000 00100000
I (88) boot: End of partition table
I (93) esp_image: segment 0: paddr=00010020 vaddr=3c030020 size=0c770h ( 51056) map
I (110) esp_image: segment 1: paddr=0001c798 vaddr=3fc91f00 size=02948h ( 10568) load
I (113) esp_image: segment 2: paddr=0001f0e8 vaddr=40374000 size=00f30h (  3888) load
I (119) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=20074h (131188) map
I (150) esp_image: segment 4: paddr=0004009c vaddr=40374f30 size=0cf0ch ( 53004) load
I (168) boot: Loaded app from partition at offset 0x10000
I (168) boot: Disabling RNG early entropy source...
I (179) cpu_start: Multicore app
I (180) cpu_start: Pro cpu up.
I (180) cpu_start: Starting app cpu, entry point is 0x40375238
I (0) cpu_start: App cpu up.
I (198) cpu_start: Pro cpu start user code
I (198) cpu_start: cpu freq: 160000000 Hz
I (203) cpu_start: Application information:
I (203) cpu_start: Project name:     knob
I (206) cpu_start: App version:      1
I (210) cpu_start: Compile time:     Jan 17 2024 21:01:23
I (217) cpu_start: ELF file SHA256:  3a5b1a879...
I (222) cpu_start: ESP-IDF:          v5.2-dev-2164-g3befd5fff7
I (228) cpu_start: Min chip rev:     v0.0
I (233) cpu_start: Max chip rev:     v0.99 
I (238) cpu_start: Chip rev:         v0.1
I (243) heap_init: Initializing. RAM available for dynamic allocation:
I (250) heap_init: At 3FC95B90 len 00053B80 (334 KiB): DRAM
I (256) heap_init: At 3FCE9710 len 00005724 (21 KiB): STACK/DRAM
I (263) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (269) heap_init: At 600FE010 len 00001FD8 (7 KiB): RTCRAM
I (276) spi_flash: detected chip: generic
I (280) spi_flash: flash io: dio
W (284) spi_flash: Detected size(8192k) larger than the size in the binary image header(2048k). Using the size in the binary image header.
I (297) sleep: Configure to isolate all GPIO pins in sleep state
I (304) sleep: Enable automatic switching of GPIO sleep configuration
I (311) app_start: Starting scheduler on CPU0
I (316) app_start: Starting scheduler on CPU1
I (316) main_task: Started on CPU0
I (326) main_task: Calling app_main()
W (326) TinyUSB: The device's device descriptor is not provided by user, using default.
I (386) tusb_desc: 
┌─────────────────────────────────┐
│  USB Device Descriptor Summary  │
├───────────────────┬─────────────┤
│bDeviceClass       │ 239         │
├───────────────────┼─────────────┤
│bDeviceSubClass    │ 2           │
├───────────────────┼─────────────┤
│bDeviceProtocol    │ 1           │
├───────────────────┼─────────────┤
│bMaxPacketSize0    │ 64          │
├───────────────────┼─────────────┤
│idVendor           │ 0x303a      │
├───────────────────┼─────────────┤
│idProduct          │ 0x4005      │
├───────────────────┼─────────────┤
│bcdDevice          │ 0x100       │
├───────────────────┼─────────────┤
│iManufacturer      │ 0x1         │
├───────────────────┼─────────────┤
│iProduct           │ 0x2         │
├───────────────────┼─────────────┤
│iSerialNumber      │ 0x3         │
├───────────────────┼─────────────┤
│bNumConfigurations │ 0x1         │
└───────────────────┴─────────────┘
I (546) TinyUSB: TinyUSB Driver installed
I (546) knob: Sending Keyboard report
I (606) main_task: Returned from app_main()

Who is online

Users browsing this forum: No registered users and 103 guests