ESPHome 2026.3.0-dev
Loading...
Searching...
No Matches
ch34x.cpp
Go to the documentation of this file.
1#if defined(USE_ESP32_VARIANT_ESP32P4) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)
2#include "usb_uart.h"
3#include "usb/usb_host.h"
4#include "esphome/core/log.h"
5
7
9
10using namespace bytebuffer;
16 // enable the channels
17 for (auto channel : this->channels_) {
18 if (!channel->initialised_.load())
19 continue;
21 if (!status.success) {
22 ESP_LOGE(TAG, "Control transfer failed, status=%s", esp_err_to_name(status.error_code));
23 channel->initialised_.store(false);
24 }
25 };
26
27 uint8_t divisor = 7;
28 uint32_t clk = 12000000;
29
30 auto baud_rate = channel->baud_rate_;
31 if (baud_rate < 256000) {
32 if (baud_rate > 6000000 / 255) {
33 divisor = 3;
34 clk = 6000000;
35 } else if (baud_rate > 750000 / 255) {
36 divisor = 2;
37 clk = 750000;
38 } else if (baud_rate > 93750 / 255) {
39 divisor = 1;
40 clk = 93750;
41 } else {
42 divisor = 0;
43 clk = 11719;
44 }
45 }
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);
51 continue;
52 }
53 if ((clk / factor - baud_rate) > (baud_rate - clk / (factor + 1)))
54 factor++;
55 factor = 256 - factor;
56
57 uint16_t value = 0xC0;
58 if (channel->stop_bits_ == UART_CONFIG_STOP_BITS_2)
59 value |= 4;
60 switch (channel->parity_) {
62 break;
63 default:
64 value |= 8 | ((channel->parity_ - 1) << 4);
65 break;
66 }
67 value |= channel->data_bits_ - 5;
68 value <<= 8;
69 value |= 0x8C;
70 uint8_t cmd = 0xA1 + channel->index_;
71 if (channel->index_ >= 2)
72 cmd += 0xE;
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);
75 }
76 this->start_channels();
77}
78} // namespace esphome::usb_uart
79
80#endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3
uint8_t status
Definition bl0942.h:8
bool control_transfer(uint8_t type, uint8_t request, uint16_t value, uint16_t index, const transfer_cb_t &callback, const std::vector< uint8_t > &data={})
std::vector< USBUartChannel * > channels_
Definition usb_uart.h:163
void enable_channels() override
CH34x.
Definition ch34x.cpp:15
void start_channels()
Resets per-channel transfer flags and posts the first bulk IN transfer.
Definition usb_uart.cpp:523
std::function< void(const TransferStatus &)> transfer_cb_t
Definition usb_host.h:83