Skip to content

Commit 732686c

Browse files
committed
add tuh_cdc_set_baudrate()
1 parent ee58278 commit 732686c

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

src/class/cdc/cdc_host.c

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,6 @@ static cdch_interface_t* make_new_itf(uint8_t daddr, tusb_desc_interface_t const
126126
return NULL;
127127
}
128128

129-
static inline bool support_line_request(cdch_interface_t const* p_cdc) {
130-
return (p_cdc->serial_protocol == SERIAL_PROTOCOL_ACM && p_cdc->acm_capability.support_line_request) ||
131-
(p_cdc->serial_protocol == SERIAL_PROTOCOL_FTDI);
132-
}
133-
134129
static bool open_ep_stream_pair(cdch_interface_t* p_cdc , tusb_desc_endpoint_t const *desc_ep);
135130
static void set_config_complete(cdch_interface_t * p_cdc, uint8_t idx, uint8_t itf_num);
136131
static void cdch_internal_control_complete(tuh_xfer_t* xfer);
@@ -391,10 +386,11 @@ static bool acm_set_control_line_state(cdch_interface_t* p_cdc, uint16_t line_st
391386
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
392387
{
393388
cdch_interface_t* p_cdc = get_itf(idx);
394-
TU_VERIFY(p_cdc && support_line_request(p_cdc));
389+
TU_VERIFY(p_cdc);
395390

396391
switch(p_cdc->serial_protocol) {
397392
case SERIAL_PROTOCOL_ACM:
393+
TU_VERIFY(p_cdc->acm_capability.support_line_request);
398394
return acm_set_control_line_state(p_cdc, line_state, complete_cb, user_data);
399395

400396
#if CFG_TUH_CDC_FTDI
@@ -413,6 +409,8 @@ bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_c
413409
}
414410

415411
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) {
412+
TU_LOG_CDCH("CDC ACM Set Line Conding\r\n");
413+
416414
tusb_control_request_t const request = {
417415
.bmRequestType_bit = {
418416
.recipient = TUSB_REQ_RCPT_INTERFACE,
@@ -446,11 +444,11 @@ bool acm_set_line_coding(cdch_interface_t* p_cdc, cdc_line_coding_t const* line_
446444
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)
447445
{
448446
cdch_interface_t* p_cdc = get_itf(idx);
449-
TU_VERIFY(p_cdc && support_line_request(p_cdc));
450-
TU_LOG_CDCH("CDC Set Line Conding\r\n");
447+
TU_VERIFY(p_cdc);
451448

452449
switch(p_cdc->serial_protocol) {
453450
case SERIAL_PROTOCOL_ACM:
451+
TU_VERIFY(p_cdc->acm_capability.support_line_request);
454452
return acm_set_line_coding(p_cdc, line_coding, complete_cb, user_data);
455453

456454
#if CFG_TUH_CDC_FTDI
@@ -468,6 +466,33 @@ bool tuh_cdc_set_line_coding(uint8_t idx, cdc_line_coding_t const* line_coding,
468466
}
469467
}
470468

469+
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
470+
cdch_interface_t* p_cdc = get_itf(idx);
471+
TU_VERIFY(p_cdc);
472+
473+
switch(p_cdc->serial_protocol) {
474+
case SERIAL_PROTOCOL_ACM: {
475+
TU_VERIFY(p_cdc->acm_capability.support_line_request);
476+
cdc_line_coding_t line_coding = p_cdc->line_coding;
477+
line_coding.bit_rate = baudrate;
478+
return acm_set_line_coding(p_cdc, &line_coding, complete_cb, user_data);
479+
}
480+
481+
#if CFG_TUH_CDC_FTDI
482+
case SERIAL_PROTOCOL_FTDI:
483+
// FTDI need to set baud rate and data bits, parity, stop bits separately
484+
return ftdi_sio_set_baudrate(p_cdc, baudrate, complete_cb, user_data);
485+
#endif
486+
487+
#if CFG_TUH_CDC_CP210X
488+
case SERIAL_PROTOCOL_CP210X:
489+
return cp210x_set_baudrate(p_cdc, baudrate, complete_cb, user_data);
490+
#endif
491+
492+
default: return false;
493+
}
494+
}
495+
471496
//--------------------------------------------------------------------+
472497
// CLASS-USBH API
473498
//--------------------------------------------------------------------+
@@ -722,7 +747,7 @@ static void process_acm_config(tuh_xfer_t* xfer)
722747
if (p_cdc->acm_capability.support_line_request)
723748
{
724749
cdc_line_coding_t line_coding = CFG_TUH_CDC_LINE_CODING_ON_ENUM;
725-
TU_ASSERT(tuh_cdc_set_line_coding(idx, &line_coding, process_acm_config, CONFIG_ACM_COMPLETE), );
750+
TU_ASSERT(acm_set_line_coding(p_cdc, &line_coding, process_acm_config, CONFIG_ACM_COMPLETE), );
726751
break;
727752
}
728753
#endif

src/class/cdc/cdc_host.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,22 +140,27 @@ bool tuh_cdc_read_clear (uint8_t idx);
140140
// Request to Set Control Line State: DTR (bit 0), RTS (bit 1)
141141
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
142142

143-
// Request to Set Line Coding
143+
// Request to set baudrate
144+
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
145+
146+
// Request to Set Line Coding (ACM only)
144147
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);
145148

146-
// Request to Get Line Coding
149+
// Request to Get Line Coding (ACM only)
147150
// Should only use if tuh_cdc_set_line_coding() / tuh_cdc_get_line_coding() never got invoked and
148151
// CFG_TUH_CDC_LINE_CODING_ON_ENUM is not defined
149152
// bool tuh_cdc_get_line_coding(uint8_t idx, cdc_line_coding_t* coding);
150153

151154
// Connect by set both DTR, RTS
152-
static inline bool tuh_cdc_connect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
155+
TU_ATTR_ALWAYS_INLINE static inline
156+
bool tuh_cdc_connect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
153157
{
154158
return tuh_cdc_set_control_line_state(idx, CDC_CONTROL_LINE_STATE_DTR | CDC_CONTROL_LINE_STATE_RTS, complete_cb, user_data);
155159
}
156160

157161
// Disconnect by clear both DTR, RTS
158-
static inline bool tuh_cdc_disconnect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
162+
TU_ATTR_ALWAYS_INLINE static inline
163+
bool tuh_cdc_disconnect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
159164
{
160165
return tuh_cdc_set_control_line_state(idx, 0x00, complete_cb, user_data);
161166
}

0 commit comments

Comments
 (0)