Program Listing for File usb_cdc.c
↰ Return to documentation for file (components/wifi_sniffer/usb_cdc.c)
#include "usb_cdc.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "esp_log.h"
static const char *TAG = "USB_CDC";
static bool s_cdc_ready = false;
/* --- line state callback: DTR 올라올 때만 ready --- */
static void line_state_changed_cb(int itf, cdcacm_event_t *event)
{
(void)itf;
bool dtr = event->line_state_changed_data.dtr; // 호스트가 포트 open 하면 1
bool rts = event->line_state_changed_data.rts; // 필요하면 같이 사용
s_cdc_ready = dtr;
ESP_LOGI(TAG, "line_state: DTR=%d, RTS=%d -> ready=%d", dtr, rts, s_cdc_ready);
}
void usb_cdc_init(void)
{
// Initialize TinyUSB driver
tinyusb_config_t tusb_cfg = {
.device_descriptor = NULL,
.string_descriptor = NULL,
.external_phy = false,
.configuration_descriptor= NULL,
};
ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
// Initialize CDC-ACM
tinyusb_config_cdcacm_t acm_cfg = {
.usb_dev = TINYUSB_USBDEV_0,
.cdc_port = TINYUSB_CDC_ACM_0,
.rx_unread_buf_sz = 64,
.callback_rx = NULL,
.callback_rx_wanted_char = NULL,
.callback_line_state_changed = line_state_changed_cb,
.callback_line_coding_changed = NULL,
};
ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
ESP_LOGI(TAG, "USB CDC initialized");
}
bool usb_cdc_ready(void)
{
// 호스트가 실제로 포트를 연 상태인지 + TinyUSB 연결 여부
// Use TinyUSB's direct API to check connection state
return s_cdc_ready && tud_cdc_connected();
}
size_t usb_cdc_write(const uint8_t *data, size_t len)
{
if (!usb_cdc_ready()) {
return 0;
}
// Use TinyUSB CDC ACM write function
size_t queued = tinyusb_cdcacm_write_queue(TINYUSB_CDC_ACM_0, data, len);
tinyusb_cdcacm_write_flush(TINYUSB_CDC_ACM_0, 0); // 바로 전송
return queued;
}
size_t usb_cdc_read(uint8_t *data, size_t len)
{
size_t rx_size = 0;
esp_err_t ret = tinyusb_cdcacm_read(TINYUSB_CDC_ACM_0, data, len, &rx_size);
if (ret != ESP_OK) {
return 0;
}
return rx_size;
}
void usb_cdc_flush(void)
{
tinyusb_cdcacm_write_flush(TINYUSB_CDC_ACM_0, 0);
}