32#if (CFG_TUH_ENABLED && CFG_TUH_CDC)
40#ifndef CFG_TUH_CDC_LOG_LEVEL
41 #define CFG_TUH_CDC_LOG_LEVEL CFG_TUH_LOG_LEVEL
44#define TU_LOG_DRV(...) TU_LOG(CFG_TUH_CDC_LOG_LEVEL, __VA_ARGS__)
64 #if CFG_TUH_CDC_FTDI || CFG_TUH_CDC_CP210X || CFG_TUH_CDC_CH34X
75 uint8_t tx_ff_buf[CFG_TUH_CDC_TX_BUFSIZE];
76 CFG_TUH_MEM_ALIGN uint8_t tx_ep_buf[CFG_TUH_CDC_TX_EPSIZE];
78 uint8_t rx_ff_buf[CFG_TUH_CDC_TX_BUFSIZE];
79 CFG_TUH_MEM_ALIGN uint8_t rx_ep_buf[CFG_TUH_CDC_TX_EPSIZE];
115#if CFG_TUH_CDC_CP210X
152#if CFG_TUH_CDC_CP210X
164 uint16_t
const (*vid_pid_list)[2];
200 #if CFG_TUH_CDC_CP210X
213 #if CFG_TUH_CDC_CH34X
234 TU_ASSERT(idx < CFG_TUH_CDC, NULL);
237 return (p_cdc->
daddr != 0) ? p_cdc : NULL;
241 for(uint8_t i=0; i<CFG_TUH_CDC; i++) {
244 (ep_addr == p_cdc->
ep_notif || ep_addr == p_cdc->
stream.rx.ep_addr || ep_addr == p_cdc->
stream.tx.ep_addr)) {
253 for(uint8_t i=0; i<CFG_TUH_CDC; i++) {
260 p_cdc->line_state = 0;
277 for (uint8_t i = 0; i < CFG_TUH_CDC; i++) {
287 TU_VERIFY(p_cdc &&
info);
297 desc->bAlternateSetting = 0;
302 desc->iInterface = 0;
331 *line_coding = p_cdc->line_coding;
410 uint16_t
const value = tu_le16toh(
xfer->setup->wValue);
415 switch (
xfer->setup->bRequest) {
417 p_cdc->line_state = (uint8_t) value;
432 switch (
xfer->setup->bRequest) {
433 case FTDI_SIO_MODEM_CTRL:
434 p_cdc->line_state = (uint8_t) value;
437 case FTDI_SIO_SET_BAUD_RATE:
438 p_cdc->line_coding.bit_rate = p_cdc->requested_line_coding.bit_rate;
446 #if CFG_TUH_CDC_CP210X
448 switch(
xfer->setup->bRequest) {
450 p_cdc->line_state = (uint8_t) value;
453 case CP210X_SET_BAUDRATE: {
456 p_cdc->line_coding.bit_rate = tu_le32toh(baudrate);
465 #if CFG_TUH_CDC_CH34X
467 switch (
xfer->setup->bRequest) {
468 case CH34X_REQ_WRITE_REG:
471 case CH34X_REG16_DIVISOR_PRESCALER:
473 p_cdc->line_coding.bit_rate = p_cdc->requested_line_coding.bit_rate;
476 case CH32X_REG16_LCR2_LCR:
478 p_cdc->line_coding.stop_bits = p_cdc->requested_line_coding.stop_bits;
479 p_cdc->line_coding.parity = p_cdc->requested_line_coding.parity;
480 p_cdc->line_coding.data_bits = p_cdc->requested_line_coding.data_bits;
487 case CH34X_REQ_MODEM_CTRL: {
489 uint16_t
const modem_signal = ~value;
490 if (modem_signal & CH34X_BIT_RTS) {
496 if (modem_signal & CH34X_BIT_DTR) {
513 xfer->complete_cb = p_cdc->user_control_cb;
514 if (
xfer->complete_cb) {
521 uint8_t
const itf_num = (uint8_t) tu_le16toh(
xfer->setup->wIndex);
543 p_cdc->line_state = (uint8_t) line_state;
566 p_cdc->line_coding.bit_rate = baudrate;
590 p_cdc->line_coding.stop_bits = stop_bits;
591 p_cdc->line_coding.parity = parity;
592 p_cdc->line_coding.data_bits = data_bits;
615 p_cdc->line_coding = *line_coding;
627 for (
size_t i = 0; i < CFG_TUH_CDC; i++) {
630 p_cdc->
stream.tx_ff_buf, CFG_TUH_CDC_TX_BUFSIZE,
631 p_cdc->
stream.tx_ep_buf, CFG_TUH_CDC_TX_EPSIZE);
634 p_cdc->
stream.rx_ff_buf, CFG_TUH_CDC_RX_BUFSIZE,
635 p_cdc->
stream.rx_ep_buf, CFG_TUH_CDC_RX_EPSIZE);
642 for (
size_t i = 0; i < CFG_TUH_CDC; i++) {
651 for (uint8_t idx = 0; idx < CFG_TUH_CDC; idx++) {
654 TU_LOG_DRV(
" CDCh close addr = %u index = %u\r\n",
daddr, idx);
676 if ( ep_addr == p_cdc->
stream.tx.ep_addr ) {
685 }
else if ( ep_addr == p_cdc->
stream.rx.ep_addr ) {
702 }
else if ( ep_addr == p_cdc->
ep_notif ) {
716 for (
size_t i = 0; i < 2; i++) {
751 return driver->
open(
daddr, itf_desc, max_len);
761 TU_LOG_DRV(
"CDCh Set Configure complete\r\n");
802 uint8_t
const* p_desc_end = ((uint8_t
const*) itf_desc) + max_len;
847 uint8_t
const itf_num = (uint8_t) tu_le16toh(
xfer->setup->wIndex);
854 #if CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
863 #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
884 TU_LOG_DRV(
"CDC ACM Set Control Line State\r\n");
893 .wValue = tu_htole16(line_state),
901 .daddr = p_cdc->
daddr,
914 TU_LOG_DRV(
"CDC ACM Set Line Conding\r\n");
934 .daddr = p_cdc->
daddr,
948 TU_LOG_DRV(
"CDC ACM Set Data Format\r\n");
951 line_coding.
bit_rate = p_cdc->line_coding.bit_rate;
953 line_coding.
parity = parity;
987 TU_LOG_DRV(
"FTDI opened\r\n");
1005 .bRequest = command,
1006 .wValue = tu_htole16(value),
1012 .daddr = p_cdc->
daddr,
1049 TU_LOG_DRV(
"CDC FTDI Set Control Line State\r\n");
1057 const uint8_t divfrac[8] = { 0, 3, 2, 4, 1, 5, 6, 7 };
1061 uint32_t divisor3 = base / (2 * baud);
1062 divisor = (divisor3 >> 3);
1063 divisor |= (uint32_t) divfrac[divisor3 & 0x7] << 14;
1069 else if (divisor == 0x4001) {
1082 TU_LOG_DRV(
"CDC FTDI Set BaudRate = %" PRIu32
", divisor = 0x%04x\r\n", baudrate, divisor);
1085 p_cdc->requested_line_coding.bit_rate = baudrate;
1093 uintptr_t
const state =
xfer->user_data;
1094 uint8_t
const itf_num = (uint8_t) tu_le16toh(
xfer->setup->wIndex);
1106 #if CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
1110 TU_ATTR_FALLTHROUGH;
1114 #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
1119 TU_ATTR_FALLTHROUGH;
1125 #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
1132 TU_ATTR_FALLTHROUGH;
1150#if CFG_TUH_CDC_CP210X
1168 TU_LOG_DRV(
"CP210x opened\r\n");
1185 .bRequest = command,
1186 .wValue = tu_htole16(value),
1188 .wLength = tu_htole16(length)
1192 uint8_t* enum_buf = NULL;
1194 if (
buffer && length > 0) {
1200 .daddr = p_cdc->
daddr,
1225 TU_LOG_DRV(
"CDC CP210x Set BaudRate = %" PRIu32
"\r\n", baudrate);
1226 uint32_t baud_le = tu_htole32(baudrate);
1245 TU_LOG_DRV(
"CDC CP210x Set Control Line State\r\n");
1252 uintptr_t
const state =
xfer->user_data;
1253 uint8_t
const itf_num = (uint8_t) tu_le16toh(
xfer->setup->wIndex);
1264 #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
1269 TU_ATTR_FALLTHROUGH;
1274 #if defined(CFG_TUH_CDC_LINE_CODING_ON_ENUM) && 0
1278 TU_ATTR_FALLTHROUGH;
1283 #if CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
1287 TU_ATTR_FALLTHROUGH;
1304#if CFG_TUH_CDC_CH34X
1306static uint8_t
ch34x_get_lcr(uint8_t stop_bits, uint8_t parity, uint8_t data_bits);
1317 .direction = direction & 0x01u
1320 .
wValue = tu_htole16 (value),
1321 .wIndex = tu_htole16 (index),
1322 .wLength = tu_htole16 (length)
1326 uint8_t* enum_buf = NULL;
1328 if (
buffer && length > 0) {
1336 .daddr = p_cdc->
daddr,
1338 .setup = &request_setup,
1372 TU_ASSERT(
ch34x_write_reg(p_cdc, CH34X_REG16_DIVISOR_PRESCALER, div_ps,
1387 p_cdc->requested_line_coding.stop_bits = stop_bits;
1388 p_cdc->requested_line_coding.parity = parity;
1389 p_cdc->requested_line_coding.data_bits = data_bits;
1391 uint8_t
const lcr =
ch34x_get_lcr(stop_bits, parity, data_bits);
1393 TU_ASSERT (
ch34x_control_out(p_cdc, CH34X_REQ_WRITE_REG, CH32X_REG16_LCR2_LCR, lcr,
1400 p_cdc->requested_line_coding.bit_rate = baudrate;
1409 uint8_t
const itf_num = 0;
1416 p_cdc->line_coding.bit_rate = p_cdc->requested_line_coding.bit_rate;
1417 TU_ASSERT(
ch34x_set_data_format(p_cdc, p_cdc->requested_line_coding.stop_bits, p_cdc->requested_line_coding.parity,
1421 xfer->complete_cb = p_cdc->user_control_cb;
1422 if (
xfer->complete_cb) {
1431 p_cdc->requested_line_coding = *line_coding;
1445 p_cdc->line_coding.bit_rate = line_coding->
bit_rate;
1449 NULL, (uintptr_t) &result));
1451 p_cdc->line_coding.stop_bits = line_coding->
stop_bits;
1452 p_cdc->line_coding.parity = line_coding->
parity;
1453 p_cdc->line_coding.data_bits = line_coding->
data_bits;
1466 uint8_t control = 0;
1468 control |= CH34X_BIT_RTS;
1471 control |= CH34X_BIT_DTR;
1501 TU_LOG_DRV (
"CH34x opened\r\n");
1521 uint8_t
const itf_num = 0;
1524 uintptr_t
const state =
xfer->user_data;
1531 TU_LOG_DRV(
"[%u] CDCh CH34x attempt to read Chip Version\r\n", p_cdc->
daddr);
1538 TU_LOG_DRV(
"[%u] CDCh CH34x Chip Version = %02x\r\n", p_cdc->
daddr, version);
1540 TU_ASSERT (version >= 0x30,);
1544 TU_ASSERT(div_ps, );
1554 p_cdc->line_coding = ((
cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X);
1586 TU_VERIFY(baval != 0 && baval <= 2000000, 0);
1599 if (baval > 6000000 / 255) {
1602 }
else if (baval > 750000 / 255) {
1605 }
else if (baval > 93750 / 255) {
1612 a = (uint8_t) (c / baval);
1613 if (a == 0 || a == 0xFF) {
1616 if ((c / a - baval) > (baval - c / (a + 1))) {
1619 a = (uint8_t) (256 - a);
1626 return (uint16_t) ((uint16_t)a << 8 | 0x80 | b);
1630static uint8_t
ch34x_get_lcr(uint8_t stop_bits, uint8_t parity, uint8_t data_bits) {
1631 uint8_t lcr = CH34X_LCR_ENABLE_RX | CH34X_LCR_ENABLE_TX;
1632 TU_VERIFY(data_bits >= 5 && data_bits <= 8, 0);
1633 lcr |= (uint8_t) (data_bits - 5);
1640 lcr |= CH34X_LCR_ENABLE_PAR;
1644 lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_PAR_EVEN;
1648 lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_MARK_SPACE;
1652 lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_MARK_SPACE | CH34X_LCR_PAR_EVEN;
1661 lcr |= CH34X_LCR_STOP_BITS_2;
bool tuh_cdc_write_clear(uint8_t idx)
@ CONFIG_ACM_SET_CONTROL_LINE_STATE
@ CONFIG_ACM_SET_LINE_CODING
static bool acm_set_control_line_state(cdch_interface_t *p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_cdc_set_data_format(uint8_t idx, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool cdch_open(uint8_t rhport, uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
static bool ch34x_control_in(cdch_interface_t *p_cdc, uint8_t request, uint16_t value, uint16_t index, uint8_t *buffer, uint16_t buffersize, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ch34x_set_modem_ctrl(cdch_interface_t *p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
@ CONFIG_FTDI_SET_BAUDRATE
static bool acm_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
static uint16_t const ch34x_vid_pid_list[][2]
static uint16_t const ftdi_vid_pid_list[][2]
static bool ftdi_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len)
static void process_internal_control_complete(tuh_xfer_t *xfer, uint8_t itf_num)
static bool acm_set_baudrate(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool cp210x_set_baudrate(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool acm_set_line_coding(cdch_interface_t *p_cdc, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static CFG_TUH_MEM_SECTION cdch_interface_t cdch_data[CFG_TUH_CDC]
bool cdch_set_config(uint8_t daddr, uint8_t itf_num)
static void acm_process_config(tuh_xfer_t *xfer)
static bool ftdi_sio_set_request(cdch_interface_t *p_cdc, uint8_t command, uint16_t value, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
TU_VERIFY_STATIC(TU_ARRAY_SIZE(serial_drivers)==SERIAL_DRIVER_COUNT, "Serial driver count mismatch")
static bool ch34x_set_line_coding(cdch_interface_t *p_cdc, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool cp210x_set_modem_ctrl(cdch_interface_t *p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ftdi_sio_set_baudrate(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ftdi_sio_set_modem_ctrl(cdch_interface_t *p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool cp210x_ifc_enable(cdch_interface_t *p_cdc, uint16_t enabled, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
@ CONFIG_CH34X_MODEM_CONTROL
@ CONFIG_CH34X_SERIAL_INIT
@ CONFIG_CH34X_READ_VERSION
@ CONFIG_CH34X_FLOW_CONTROL
@ CONFIG_CH34X_SPECIAL_REG_WRITE
static uint32_t ftdi_232bm_baud_to_divisor(uint32_t baud)
static uint8_t get_idx_by_ep_addr(uint8_t daddr, uint8_t ep_addr)
static bool open_ep_stream_pair(cdch_interface_t *p_cdc, tusb_desc_endpoint_t const *desc_ep)
uint32_t tuh_cdc_write_available(uint8_t idx)
bool tuh_cdc_read_clear(uint8_t idx)
static void set_config_complete(cdch_interface_t *p_cdc, uint8_t idx, uint8_t itf_num)
static bool ch34x_control_out(cdch_interface_t *p_cdc, uint8_t request, uint16_t value, uint16_t index, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static const cdch_serial_driver_t serial_drivers[]
static bool cp210x_set_line_coding(cdch_interface_t *p_cdc, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
uint32_t tuh_cdc_read(uint8_t idx, void *buffer, uint32_t bufsize)
static cdch_interface_t * make_new_itf(uint8_t daddr, tusb_desc_interface_t const *itf_desc)
bool tuh_cdc_itf_get_info(uint8_t idx, tuh_itf_info_t *info)
static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
bool tuh_cdc_mounted(uint8_t idx)
static void ch34x_set_line_coding_stage1_complete(tuh_xfer_t *xfer)
static void cdch_internal_control_complete(tuh_xfer_t *xfer)
bool tuh_cdc_get_local_line_coding(uint8_t idx, cdc_line_coding_t *line_coding)
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_cdc_peek(uint8_t idx, uint8_t *ch)
bool tuh_cdc_set_line_coding(uint8_t idx, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
void cdch_close(uint8_t daddr)
static uint16_t const cp210x_vid_pid_list[][2]
static bool ftdi_sio_reset(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ch34x_set_baudrate(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static void ch34x_control_complete(tuh_xfer_t *xfer)
static uint8_t ch34x_get_lcr(uint8_t stop_bits, uint8_t parity, uint8_t data_bits)
@ CONFIG_CP210X_IFC_ENABLE
@ CONFIG_CP210X_SET_BAUDRATE
@ CONFIG_CP210X_SET_LINE_CTL
@ CONFIG_CP210X_SET_DTR_RTS
static bool cp210x_set_data_format(cdch_interface_t *p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ftdi_set_line_coding(cdch_interface_t *p_cdc, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool tuh_cdc_get_rts(uint8_t idx)
static cdch_interface_t * get_itf(uint8_t idx)
static bool cp210x_set_request(cdch_interface_t *p_cdc, uint8_t command, uint16_t value, uint8_t *buffer, uint16_t length, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes)
bool tuh_cdc_get_dtr(uint8_t idx)
static uint16_t ch34x_get_divisor_prescaler(uint32_t baval)
uint32_t tuh_cdc_write(uint8_t idx, void const *buffer, uint32_t bufsize)
static bool ch34x_write_reg_baudrate(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ftdi_set_data_format(cdch_interface_t *p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ch34x_set_data_format(cdch_interface_t *p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool acm_set_data_format(cdch_interface_t *p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
uint32_t tuh_cdc_write_flush(uint8_t idx)
uint32_t tuh_cdc_read_available(uint8_t idx)
static bool ch34x_write_reg(cdch_interface_t *p_cdc, uint16_t reg, uint16_t reg_value, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static bool ch34x_set_request(cdch_interface_t *p_cdc, uint8_t direction, uint8_t request, uint16_t value, uint16_t index, uint8_t *buffer, uint16_t length, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
uint8_t tuh_cdc_itf_get_index(uint8_t daddr, uint8_t itf_num)
static bool ch34x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len)
static void ch34x_process_config(tuh_xfer_t *xfer)
static void cp210x_process_config(tuh_xfer_t *xfer)
static void ftdi_process_config(tuh_xfer_t *xfer)
static uint32_t ftdi_232bm_baud_base_to_divisor(uint32_t baud, uint32_t base)
TU_ATTR_WEAK void tuh_cdc_mount_cb(uint8_t idx)
TU_ATTR_WEAK void tuh_cdc_umount_cb(uint8_t idx)
TU_ATTR_WEAK void tuh_cdc_rx_cb(uint8_t idx)
TU_ATTR_WEAK void tuh_cdc_tx_complete_cb(uint8_t idx)
xfer_td_t xfer[EP_CBI_COUNT+1][2]
static usb_descriptor_buffers_t desc
struct TU_ATTR_PACKED cdc_line_coding_t
static uint8_t cdc_functional_desc_typeof(uint8_t const *p_desc)
@ CDC_REQUEST_SET_LINE_CODING
@ CDC_REQUEST_SET_CONTROL_LINE_STATE
@ CDC_LINE_CODING_STOP_BITS_1_5
@ CDC_LINE_CODING_STOP_BITS_2
@ CDC_LINE_CODING_PARITY_MARK
@ CDC_LINE_CODING_PARITY_ODD
@ CDC_LINE_CODING_PARITY_SPACE
@ CDC_LINE_CODING_PARITY_EVEN
@ CDC_LINE_CODING_PARITY_NONE
@ CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT
Abstract Control Management Functional Descriptor.
@ CDC_CONTROL_LINE_STATE_DTR
@ CDC_CONTROL_LINE_STATE_RTS
static void process_set_config(tuh_xfer_t *xfer)
static void * memcpy(void *dst, const void *src, size_t n)
AUDIO Channel Cluster Descriptor (4.1)
struct TU_ATTR_PACKED::@16::TU_ATTR_PACKED bmRequestType_bit
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
uint8_t stop_bits
0: 1 stop bit - 1: 1.5 stop bits - 2: 2 stop bits
uint8_t support_line_request
Device supports the request combination of Set_Line_Coding, Set_Control_Line_State,...
uint8_t bDescriptorType
Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.
uint8_t bInterfaceClass
Class code (assigned by the USB-IF).
uint8_t parity
0: None - 1: Odd - 2: Even - 3: Mark - 4: Space
struct TU_ATTR_PACKED::@5 bmCapabilities
uint8_t data_bits
can be 5, 6, 7, 8 or 16
uint8_t bInterfaceSubClass
Subclass code (assigned by the USB-IF). These codes are qualified by the value of the bInterfaceCla...
uint8_t bNumEndpoints
Number of endpoints used by this interface (excluding endpoint zero). If this value is zero,...
uint8_t bInterfaceProtocol
Protocol code (assigned by the USB). These codes are qualified by the value of the bInterfaceClass ...
uint8_t bInterfaceNumber
Number of this interface. Zero-based value identifying the index in the array of concurrent interface...
uint8_t bInterfaceSubClass
cdc_acm_capability_t acm_capability
uint8_t bInterfaceProtocol
bool(*const open)(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len)
uint16_t const vid_pid_count
uint16_t const (* vid_pid_list)[2]
bool(*const set_data_format)(cdch_interface_t *p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
void(*const process_set_config)(tuh_xfer_t *xfer)
bool(*const set_control_line_state)(cdch_interface_t *p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool(*const set_baudrate)(cdch_interface_t *p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
bool(*const set_line_coding)(cdch_interface_t *p_cdc, cdc_line_coding_t const *line_coding, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_u16(uint8_t high, uint8_t low)
bool tu_edpt_stream_write_zlp_if_needed(uint8_t hwid, tu_edpt_stream_t *s, uint32_t last_xferred_bytes)
static TU_ATTR_ALWAYS_INLINE bool tu_edpt_stream_clear(tu_edpt_stream_t *s)
static TU_ATTR_ALWAYS_INLINE void tu_edpt_stream_read_xfer_complete_offset(tu_edpt_stream_t *s, uint32_t xferred_bytes, uint32_t skip_offset)
static TU_ATTR_ALWAYS_INLINE void tu_edpt_stream_close(tu_edpt_stream_t *s)
static TU_ATTR_ALWAYS_INLINE bool tu_edpt_stream_peek(tu_edpt_stream_t *s, uint8_t *ch)
static TU_ATTR_ALWAYS_INLINE uint32_t tu_edpt_stream_read_available(tu_edpt_stream_t *s)
uint32_t tu_edpt_stream_read_xfer(uint8_t hwid, tu_edpt_stream_t *s)
uint32_t tu_edpt_stream_read(uint8_t hwid, tu_edpt_stream_t *s, void *buffer, uint32_t bufsize)
uint32_t tu_edpt_stream_write_available(uint8_t hwid, tu_edpt_stream_t *s)
uint32_t tu_edpt_stream_write_xfer(uint8_t hwid, tu_edpt_stream_t *s)
uint32_t tu_edpt_stream_write(uint8_t hwid, tu_edpt_stream_t *s, void const *buffer, uint32_t bufsize)
static TU_ATTR_ALWAYS_INLINE void tu_edpt_stream_read_xfer_complete(tu_edpt_stream_t *s, uint32_t xferred_bytes)
static TU_ATTR_ALWAYS_INLINE void tu_edpt_stream_open(tu_edpt_stream_t *s, tusb_desc_endpoint_t const *desc_ep)
bool tu_edpt_stream_init(tu_edpt_stream_t *s, bool is_host, bool is_tx, bool overwritable, void *ff_buf, uint16_t ff_bufsize, uint8_t *ep_buf, uint16_t ep_bufsize)
bool tu_edpt_stream_deinit(tu_edpt_stream_t *s)
@ TUSB_CLASS_VENDOR_SPECIFIC
@ TUSB_REQ_RCPT_INTERFACE
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_desc_type(void const *desc)
struct TU_ATTR_PACKED tusb_desc_interface_t
USB Interface Descriptor.
static TU_ATTR_ALWAYS_INLINE uint8_t const * tu_desc_next(void const *desc)
bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t *vid, uint16_t *pid)
void usbh_driver_set_config_complete(uint8_t dev_addr, uint8_t itf_num)
CFG_TUH_MEM_ALIGN tusb_control_request_t request
uint8_t * usbh_get_enum_buf(void)
bool tuh_control_xfer(tuh_xfer_t *xfer)
tuh_xfer_cb_t complete_cb
bool tuh_edpt_open(uint8_t dev_addr, tusb_desc_endpoint_t const *desc_ep)
void(* tuh_xfer_cb_t)(tuh_xfer_t *xfer)