@@ -90,25 +90,24 @@ static cdch_interface_t cdch_data[CFG_TUH_CDC];
9090static bool acm_open (uint8_t daddr , tusb_desc_interface_t const * itf_desc , uint16_t max_len );
9191static 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 );
9395static 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 );
9496static 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
101102static 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-
106104static bool ftdi_open (uint8_t daddr , const tusb_desc_interface_t * itf_desc , uint16_t max_len );
107105static 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 );
109109static 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 );
110110static 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
120119static bool cp210x_open (uint8_t daddr , tusb_desc_interface_t const * itf_desc , uint16_t max_len );
121120static 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 );
123124static 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 );
124125static 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
132132static 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 );
137139static 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-
144144enum {
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+
565596bool 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+
903947static 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+
9711027static 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+
11641232static 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 ;
0 commit comments