8#include "esp_intr_alloc.h"
10#include "soc/soc_caps.h"
13#if SOC_USB_SERIAL_JTAG_SUPPORTED && \
14 ((defined(CONFIG_IDF_TARGET_ESP32C3) && CONFIG_IDF_TARGET_ESP32C3) || \
15 (defined(CONFIG_IDF_TARGET_ESP32C6) && CONFIG_IDF_TARGET_ESP32C6))
20#if defined(CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG) && CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
22 "ESP32CDCJtag conflicts with ESP-IDF primary USB Serial/JTAG console. "
23 "Set CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=n or disable this backend.");
26class ESP32CDCJtag :
public UART
29 explicit ESP32CDCJtag(
30 size_t rx_buffer_size = 1024,
size_t tx_buffer_size = 512,
31 uint32_t tx_queue_size = 5,
32 UART::Configuration config = {115200, UART::Parity::NO_PARITY, 8, 1});
35 ErrorCode SetConfig(UART::Configuration config)
override;
42 static void IsrEntry(
void* arg);
47 void HandleInterrupt();
50 bool LoadActiveTxFromQueue(
bool in_isr);
51 bool LoadPendingTxFromQueue(
bool in_isr);
52 bool DequeueTxToSlot(uint8_t* slot,
size_t& size, WriteInfoBlock& info,
bool in_isr);
53 bool StartActiveTransfer(
bool in_isr);
54 bool StartAndReportActive(
bool in_isr);
55 void StopTxTransfer();
56 void OnTxTransferDone(
bool in_isr, ErrorCode result);
57 bool PumpTx(
bool in_isr);
58 void PushRxBytes(
const uint8_t* data,
size_t size,
bool in_isr);
60 void ClearPendingTx();
61 void ResetTxState(
bool in_isr);
63 UART::Configuration config_;
64 uint8_t* tx_slot_storage_ =
nullptr;
65 size_t tx_slot_size_ = 0;
66 uint8_t* tx_slot_a_ =
nullptr;
67 uint8_t* tx_slot_b_ =
nullptr;
68 intr_handle_t intr_handle_ =
nullptr;
69 bool intr_installed_ =
false;
70 bool hw_inited_ =
false;
71 const uint8_t* tx_active_ptr_ =
nullptr;
72 size_t tx_active_size_ = 0;
73 size_t tx_active_offset_ = 0;
74 WriteInfoBlock tx_active_info_ = {};
75 bool tx_active_valid_ =
false;
76 const uint8_t* tx_pending_ptr_ =
nullptr;
77 size_t tx_pending_size_ = 0;
78 bool tx_pending_valid_ =
false;
79 WriteInfoBlock tx_pending_info_ = {};
80 Flag::Atomic tx_busy_{};
81 Flag::Plain in_tx_isr_;
84 WritePort _write_port;
ErrorCode(* ReadFun)(ReadPort &port, bool in_isr)
Function pointer type for read operations.
ErrorCode(* WriteFun)(WritePort &port, bool in_isr)
Function pointer type for write operations.