18 if (!channel->initialised_.load())
22 ESP_LOGE(TAG,
"Control transfer failed, status=%s", esp_err_to_name(
status.error_code));
23 channel->initialised_.store(
false);
28 uint32_t clk = 12000000;
30 auto baud_rate = channel->baud_rate_;
31 if (baud_rate < 256000) {
32 if (baud_rate > 6000000 / 255) {
35 }
else if (baud_rate > 750000 / 255) {
38 }
else if (baud_rate > 93750 / 255) {
46 ESP_LOGV(TAG,
"baud_rate: %" PRIu32
", divisor: %d, clk: %" PRIu32, baud_rate, divisor, clk);
47 auto factor =
static_cast<uint8_t
>(clk / baud_rate);
48 if (factor == 0 || factor == 0xFF) {
49 ESP_LOGE(TAG,
"Invalid baud rate %" PRIu32, baud_rate);
50 channel->initialised_.store(
false);
53 if ((clk / factor - baud_rate) > (baud_rate - clk / (factor + 1)))
55 factor = 256 - factor;
57 uint16_t value = 0xC0;
60 switch (channel->parity_) {
64 value |= 8 | ((channel->parity_ - 1) << 4);
67 value |= channel->data_bits_ - 5;
70 uint8_t cmd = 0xA1 + channel->index_;
71 if (channel->index_ >= 2)
73 this->
control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd, value, (factor << 8) | divisor, callback);
74 this->
control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd + 3, 0x80, 0, callback);