47 const usb_config_desc_t *config_desc;
48 const usb_device_desc_t *device_desc;
49 int conf_offset = 0, ep_offset;
50 std::vector<CdcEps> cdc_devs{};
53 if (usb_host_get_device_descriptor(dev_hdl, &device_desc) != ESP_OK) {
54 ESP_LOGE(TAG,
"get_device_descriptor failed");
57 if (usb_host_get_active_config_descriptor(dev_hdl, &config_desc) != ESP_OK) {
58 ESP_LOGE(TAG,
"get_active_config_descriptor failed");
61 ESP_LOGD(TAG,
"bDeviceClass: %u, bDeviceSubClass: %u", device_desc->bDeviceClass, device_desc->bDeviceSubClass);
62 ESP_LOGD(TAG,
"bNumInterfaces: %u", config_desc->bNumInterfaces);
63 if (device_desc->bDeviceClass != 0) {
64 ESP_LOGE(TAG,
"bDeviceClass != 0");
68 for (uint8_t i = 0; i != config_desc->bNumInterfaces; i++) {
69 auto data_desc = usb_parse_interface_descriptor(config_desc, 0, 0, &conf_offset);
71 ESP_LOGE(TAG,
"data_desc: usb_parse_interface_descriptor failed");
74 if (data_desc->bNumEndpoints != 2 || data_desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) {
75 ESP_LOGE(TAG,
"data_desc: bInterfaceClass == %u, bInterfaceSubClass == %u, bNumEndpoints == %u",
76 data_desc->bInterfaceClass, data_desc->bInterfaceSubClass, data_desc->bNumEndpoints);
79 ep_offset = conf_offset;
80 auto out_ep = usb_parse_endpoint_descriptor_by_index(data_desc, 0, config_desc->wTotalLength, &ep_offset);
82 ESP_LOGE(TAG,
"out_ep: usb_parse_endpoint_descriptor_by_index failed");
85 ep_offset = conf_offset;
86 auto in_ep = usb_parse_endpoint_descriptor_by_index(data_desc, 1, config_desc->wTotalLength, &ep_offset);
88 ESP_LOGE(TAG,
"in_ep: usb_parse_endpoint_descriptor_by_index failed");
91 if (in_ep->bEndpointAddress & usb_host::USB_DIR_IN) {
92 cdc_devs.push_back({
CdcEps{
nullptr, in_ep, out_ep, data_desc->bInterfaceNumber}});
94 cdc_devs.push_back({
CdcEps{
nullptr, out_ep, in_ep, data_desc->bInterfaceNumber}});
103 if (!channel->initialised_)
107 ESP_LOGE(TAG,
"Control transfer failed, status=%s", esp_err_to_name(
status.error_code));
108 channel->initialised_ =
false;
111 this->
control_transfer(USB_VENDOR_IFC | usb_host::USB_DIR_OUT, IFC_ENABLE, 1, channel->index_, callback);
112 uint16_t line_control = channel->stop_bits_;
113 line_control |=
static_cast<uint8_t
>(channel->parity_) << 4;
114 line_control |= channel->data_bits_ << 8;
115 ESP_LOGD(TAG,
"Line control value 0x%X", line_control);
116 this->
control_transfer(USB_VENDOR_IFC | usb_host::USB_DIR_OUT, SET_LINE_CTL, line_control, channel->index_,
119 this->
control_transfer(USB_VENDOR_IFC | usb_host::USB_DIR_OUT, SET_BAUDRATE, 0, channel->index_, callback,