19 if (!channel->initialised_)
23 ESP_LOGE(TAG,
"Control transfer failed, status=%s", esp_err_to_name(
status.error_code));
24 channel->initialised_ =
false;
29 uint32_t clk = 12000000;
31 auto baud_rate = channel->baud_rate_;
32 if (baud_rate < 256000) {
33 if (baud_rate > 6000000 / 255) {
36 }
else if (baud_rate > 750000 / 255) {
39 }
else if (baud_rate > 93750 / 255) {
47 ESP_LOGV(TAG,
"baud_rate: %" PRIu32
", divisor: %d, clk: %" PRIu32, baud_rate, divisor, clk);
48 auto factor =
static_cast<uint8_t
>(clk / baud_rate);
49 if (factor == 0 || factor == 0xFF) {
50 ESP_LOGE(TAG,
"Invalid baud rate %" PRIu32, baud_rate);
51 channel->initialised_ =
false;
54 if ((clk / factor - baud_rate) > (baud_rate - clk / (factor + 1)))
56 factor = 256 - factor;
58 uint16_t value = 0xC0;
61 switch (channel->parity_) {
65 value |= 8 | ((channel->parity_ - 1) << 4);
68 value |= channel->data_bits_ - 5;
71 uint8_t cmd = 0xA1 + channel->index_;
72 if (channel->index_ >= 2)
74 this->
control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd, value, (factor << 8) | divisor, callback);