Skip to content

Commit 55cb713

Browse files
committed
- add new API tuh_cdc_set_data_format()
- add typedef for cdc enum
1 parent c196a2e commit 55cb713

File tree

3 files changed

+95
-28
lines changed

3 files changed

+95
-28
lines changed

src/class/cdc/cdc.h

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ typedef enum{
136136
//--------------------------------------------------------------------+
137137

138138
/// Communication Interface Management Element Request Codes
139-
typedef enum
140-
{
139+
typedef enum {
141140
CDC_REQUEST_SEND_ENCAPSULATED_COMMAND = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface
142141
CDC_REQUEST_GET_ENCAPSULATED_RESPONSE = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.
143142
CDC_REQUEST_SET_COMM_FEATURE = 0x02,
@@ -180,39 +179,38 @@ typedef enum
180179
CDC_REQUEST_GET_ATM_VC_STATISTICS = 0x53,
181180

182181
CDC_REQUEST_MDLM_SEMANTIC_MODEL = 0x60,
183-
}cdc_management_request_t;
182+
} cdc_management_request_t;
184183

185-
enum {
184+
typedef enum {
186185
CDC_CONTROL_LINE_STATE_DTR = 0x01,
187186
CDC_CONTROL_LINE_STATE_RTS = 0x02,
188-
};
187+
} cdc_control_line_state_t;
189188

190-
enum {
189+
typedef enum {
191190
CDC_LINE_CODING_STOP_BITS_1 = 0, // 1 bit
192191
CDC_LINE_CODING_STOP_BITS_1_5 = 1, // 1.5 bits
193192
CDC_LINE_CODING_STOP_BITS_2 = 2, // 2 bits
194-
};
193+
} cdc_line_coding_stopbits_t;
195194

196195
// TODO Backward compatible for typos. Maybe removed in the future release
197196
#define CDC_LINE_CONDING_STOP_BITS_1 CDC_LINE_CODING_STOP_BITS_1
198197
#define CDC_LINE_CONDING_STOP_BITS_1_5 CDC_LINE_CODING_STOP_BITS_1_5
199198
#define CDC_LINE_CONDING_STOP_BITS_2 CDC_LINE_CODING_STOP_BITS_2
200199

201-
enum {
200+
typedef enum {
202201
CDC_LINE_CODING_PARITY_NONE = 0,
203202
CDC_LINE_CODING_PARITY_ODD = 1,
204203
CDC_LINE_CODING_PARITY_EVEN = 2,
205204
CDC_LINE_CODING_PARITY_MARK = 3,
206205
CDC_LINE_CODING_PARITY_SPACE = 4,
207-
};
206+
} cdc_line_coding_parity_t;
208207

209208
//--------------------------------------------------------------------+
210209
// Management Element Notification (Notification Endpoint)
211210
//--------------------------------------------------------------------+
212211

213212
/// 6.3 Notification Codes
214-
typedef enum
215-
{
213+
typedef enum {
216214
CDC_NOTIF_NETWORK_CONNECTION = 0x00, ///< This notification allows the device to notify the host about network connection status.
217215
CDC_NOTIF_RESPONSE_AVAILABLE = 0x01, ///< This notification allows the device to notify the hostthat a response is available. This response can be retrieved with a subsequent \ref CDC_REQUEST_GET_ENCAPSULATED_RESPONSE request.
218216
CDC_NOTIF_AUX_JACK_HOOK_STATE = 0x08,

src/class/cdc/cdc_host.c

Lines changed: 79 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -90,25 +90,24 @@ static cdch_interface_t cdch_data[CFG_TUH_CDC];
9090
static bool acm_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
9191
static void acm_process_config(tuh_xfer_t* xfer);
9292

93+
static bool acm_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
94+
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);
9395
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);
9496
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);
95-
static bool acm_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
9697

9798
//------------- FTDI prototypes -------------//
9899
#if CFG_TUH_CDC_FTDI
99100
#include "serial/ftdi_sio.h"
100101

101102
static uint16_t const ftdi_vid_pid_list[][2] = {CFG_TUH_CDC_FTDI_VID_PID_LIST};
102103

103-
// Store last request baudrate since divisor to baudrate is not easy
104-
// static uint32_t _ftdi_requested_baud;
105-
106104
static bool ftdi_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);
107105
static void ftdi_process_config(tuh_xfer_t* xfer);
108106

107+
static bool ftdi_sio_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
108+
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);
109109
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);
110110
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);
111-
static bool ftdi_sio_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
112111
#endif
113112

114113
//------------- CP210X prototypes -------------//
@@ -120,9 +119,10 @@ static uint16_t const cp210x_vid_pid_list[][2] = {CFG_TUH_CDC_CP210X_VID_PID_LIS
120119
static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len);
121120
static void cp210x_process_config(tuh_xfer_t* xfer);
122121

122+
static bool cp210x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
123+
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);
123124
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);
124125
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);
125-
static bool cp210x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
126126
#endif
127127

128128
//------------- CH34x prototypes -------------//
@@ -131,16 +131,16 @@ static bool cp210x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_
131131

132132
static uint16_t const ch34x_vid_pid_list[][2] = {CFG_TUH_CDC_CH34X_VID_PID_LIST};
133133

134-
static bool ch34x_open ( uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len );
135-
static void ch34x_process_config ( tuh_xfer_t* xfer );
134+
static bool ch34x_open(uint8_t daddr, tusb_desc_interface_t const* itf_desc, uint16_t max_len);
135+
static void ch34x_process_config(tuh_xfer_t* xfer);
136136

137+
static bool ch34x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
138+
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);
137139
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);
138-
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 );
139-
static bool ch34x_set_baudrate ( cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data );
140+
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);
140141
#endif
141142

142143
//------------- Common -------------//
143-
144144
enum {
145145
SERIAL_DRIVER_ACM = 0,
146146

@@ -166,6 +166,7 @@ typedef struct {
166166
void (*const process_set_config)(tuh_xfer_t* xfer);
167167
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);
168168
bool (*const set_baudrate)(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
169+
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);
169170
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);
170171
} cdch_serial_driver_t;
171172

@@ -178,6 +179,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
178179
.process_set_config = acm_process_config,
179180
.set_control_line_state = acm_set_control_line_state,
180181
.set_baudrate = acm_set_baudrate,
182+
.set_data_format = acm_set_data_format,
181183
.set_line_coding = acm_set_line_coding
182184
},
183185

@@ -189,6 +191,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
189191
.process_set_config = ftdi_process_config,
190192
.set_control_line_state = ftdi_sio_set_modem_ctrl,
191193
.set_baudrate = ftdi_sio_set_baudrate,
194+
.set_data_format = ftdi_set_data_format,
192195
.set_line_coding = ftdi_set_line_coding
193196
},
194197
#endif
@@ -201,6 +204,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
201204
.process_set_config = cp210x_process_config,
202205
.set_control_line_state = cp210x_set_modem_ctrl,
203206
.set_baudrate = cp210x_set_baudrate,
207+
.set_data_format = cp210x_set_data_format,
204208
.set_line_coding = cp210x_set_line_coding
205209
},
206210
#endif
@@ -213,6 +217,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
213217
.process_set_config = ch34x_process_config,
214218
.set_control_line_state = ch34x_set_modem_ctrl,
215219
.set_baudrate = ch34x_set_baudrate,
220+
.set_data_format = ch34x_set_data_format,
216221
.set_line_coding = ch34x_set_line_coding
217222
},
218223
#endif
@@ -562,6 +567,32 @@ bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete
562567
}
563568
}
564569

570+
bool tuh_cdc_set_data_format(uint8_t idx, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,
571+
tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
572+
cdch_interface_t* p_cdc = get_itf(idx);
573+
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);
574+
cdch_serial_driver_t const* driver = &serial_drivers[p_cdc->serial_drid];
575+
576+
if (complete_cb) {
577+
return driver->set_data_format(p_cdc, stop_bits, parity, data_bits, complete_cb, user_data);
578+
} else {
579+
// blocking
580+
xfer_result_t result = XFER_RESULT_INVALID;
581+
bool ret = driver->set_data_format(p_cdc, stop_bits, parity, data_bits, complete_cb, (uintptr_t) &result);
582+
583+
if (user_data) {
584+
// user_data is not NULL, return result via user_data
585+
*((xfer_result_t*) user_data) = result;
586+
}
587+
588+
TU_VERIFY(ret && result == XFER_RESULT_SUCCESS);
589+
p_cdc->line_coding.stop_bits = stop_bits;
590+
p_cdc->line_coding.parity = parity;
591+
p_cdc->line_coding.data_bits = data_bits;
592+
return true;
593+
}
594+
}
595+
565596
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) {
566597
cdch_interface_t* p_cdc = get_itf(idx);
567598
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);
@@ -900,6 +931,19 @@ static bool acm_set_line_coding(cdch_interface_t* p_cdc, cdc_line_coding_t const
900931
return true;
901932
}
902933

934+
static bool acm_set_data_format(cdch_interface_t* p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,
935+
tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
936+
TU_LOG_DRV("CDC ACM Set Data Format\r\n");
937+
938+
cdc_line_coding_t line_coding;
939+
line_coding.bit_rate = p_cdc->line_coding.bit_rate;
940+
line_coding.stop_bits = stop_bits;
941+
line_coding.parity = parity;
942+
line_coding.data_bits = data_bits;
943+
944+
return acm_set_line_coding(p_cdc, &line_coding, complete_cb, user_data);
945+
}
946+
903947
static bool acm_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
904948
TU_VERIFY(p_cdc->acm_capability.support_line_request);
905949
cdc_line_coding_t line_coding = p_cdc->line_coding;
@@ -968,6 +1012,18 @@ static bool ftdi_sio_reset(cdch_interface_t* p_cdc, tuh_xfer_cb_t complete_cb, u
9681012
return ftdi_sio_set_request(p_cdc, FTDI_SIO_RESET, FTDI_SIO_RESET_SIO, complete_cb, user_data);
9691013
}
9701014

1015+
static bool ftdi_set_data_format(cdch_interface_t* p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,
1016+
tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
1017+
(void) p_cdc;
1018+
(void) stop_bits;
1019+
(void) parity;
1020+
(void) data_bits;
1021+
(void) complete_cb;
1022+
(void) user_data;
1023+
// TODO not implemented yet
1024+
return false;
1025+
}
1026+
9711027
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) {
9721028
(void) p_cdc;
9731029
(void) line_coding;
@@ -1161,6 +1217,18 @@ static bool cp210x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_
11611217
complete_cb ? cdch_internal_control_complete : NULL, user_data);
11621218
}
11631219

1220+
static bool cp210x_set_data_format(cdch_interface_t* p_cdc, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,
1221+
tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
1222+
(void) p_cdc;
1223+
(void) stop_bits;
1224+
(void) parity;
1225+
(void) data_bits;
1226+
(void) complete_cb;
1227+
(void) user_data;
1228+
// TODO not implemented yet
1229+
return false;
1230+
}
1231+
11641232
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) {
11651233
TU_LOG_DRV("CDC CP210x Set Control Line State\r\n");
11661234
p_cdc->user_control_cb = complete_cb;

src/class/cdc/cdc_host.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,11 @@ bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_c
148148
// Request to set baudrate
149149
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
150150

151-
// Request to Set Line Coding (ACM only)
152-
// Should only use if you don't work with serial devices such as FTDI/CP210x
151+
// Request to set data format
152+
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);
153+
154+
// Request to Set Line Coding = baudrate + data format
155+
// Note: only implemented by ACM and CH34x, not supported by FTDI and CP210x yet
153156
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);
154157

155158
// Request to Get Line Coding (ACM only)
@@ -159,15 +162,13 @@ bool tuh_cdc_set_line_coding(uint8_t idx, cdc_line_coding_t const* line_coding,
159162

160163
// Connect by set both DTR, RTS
161164
TU_ATTR_ALWAYS_INLINE static inline
162-
bool tuh_cdc_connect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
163-
{
165+
bool tuh_cdc_connect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
164166
return tuh_cdc_set_control_line_state(idx, CDC_CONTROL_LINE_STATE_DTR | CDC_CONTROL_LINE_STATE_RTS, complete_cb, user_data);
165167
}
166168

167169
// Disconnect by clear both DTR, RTS
168170
TU_ATTR_ALWAYS_INLINE static inline
169-
bool tuh_cdc_disconnect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
170-
{
171+
bool tuh_cdc_disconnect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
171172
return tuh_cdc_set_control_line_state(idx, 0x00, complete_cb, user_data);
172173
}
173174

0 commit comments

Comments
 (0)