@@ -1223,46 +1223,12 @@ static void cp210x_process_config(tuh_xfer_t* xfer) {
12231223
12241224#if CFG_TUH_CDC_CH34X
12251225
1226- enum {
1227- CONFIG_CH34X_READ_VERSION = 0 ,
1228- CONFIG_CH34X_SERIAL_INIT ,
1229- CONFIG_CH34X_SPECIAL_REG_WRITE ,
1230- CONFIG_CH34X_FLOW_CONTROL ,
1231- CONFIG_CH34X_MODEM_CONTROL ,
1232- CONFIG_CH34X_COMPLETE
1233- };
1234-
12351226static uint8_t ch34x_get_lcr (uint8_t stop_bits , uint8_t parity , uint8_t data_bits );
12361227static uint16_t ch34x_get_divisor_prescaler (uint32_t baval );
12371228
1238- static bool ch34x_open (uint8_t daddr , tusb_desc_interface_t const * itf_desc , uint16_t max_len ) {
1239- // CH34x Interface includes 1 vendor interface + 2 bulk + 1 interrupt endpoints
1240- TU_VERIFY (itf_desc -> bNumEndpoints == 3 );
1241- TU_VERIFY (sizeof (tusb_desc_interface_t ) + 3 * sizeof (tusb_desc_endpoint_t ) <= max_len );
1242-
1243- cdch_interface_t * p_cdc = make_new_itf (daddr , itf_desc );
1244- TU_VERIFY (p_cdc );
1245-
1246- TU_LOG_DRV ("CH34x opened\r\n" );
1247- p_cdc -> serial_drid = SERIAL_DRIVER_CH34X ;
1248-
1249- tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const * ) tu_desc_next (itf_desc );
1250-
1251- // data endpoints expected to be in pairs
1252- TU_ASSERT (open_ep_stream_pair (p_cdc , desc_ep ));
1253- desc_ep += 2 ;
1254-
1255- // Interrupt endpoint: not used for now
1256- TU_ASSERT (TUSB_DESC_ENDPOINT == tu_desc_type (desc_ep ) &&
1257- TUSB_XFER_INTERRUPT == desc_ep -> bmAttributes .xfer );
1258- TU_ASSERT (tuh_edpt_open (daddr , desc_ep ));
1259- p_cdc -> ep_notif = desc_ep -> bEndpointAddress ;
1260-
1261- return true;
1262- }
1263-
1229+ //------------- control requestt -------------//
12641230static bool ch34x_set_request (cdch_interface_t * p_cdc , uint8_t direction , uint8_t request , uint16_t value ,
1265- uint16_t index , uint8_t * buffer , uint16_t length , tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
1231+ uint16_t index , uint8_t * buffer , uint16_t length , tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
12661232 tusb_control_request_t const request_setup = {
12671233 .bmRequestType_bit = {
12681234 .recipient = TUSB_REQ_RCPT_DEVICE ,
@@ -1318,6 +1284,17 @@ static bool ch34x_write_reg(cdch_interface_t* p_cdc, uint16_t reg, uint16_t reg_
13181284// return ch34x_control_in ( p_cdc, CH34X_REQ_READ_REG, reg, 0, buffer, buffersize, complete_cb, user_data );
13191285//}
13201286
1287+ static bool ch34x_write_reg_baudrate (cdch_interface_t * p_cdc , uint32_t baudrate ,
1288+ tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
1289+ uint16_t const div_ps = ch34x_get_divisor_prescaler (baudrate );
1290+ TU_VERIFY (div_ps != 0 );
1291+ TU_ASSERT (ch34x_write_reg (p_cdc , CH34X_REG16_DIVISOR_PRESCALER , div_ps ,
1292+ complete_cb , user_data ));
1293+ return true;
1294+ }
1295+
1296+ //------------- Driver API -------------//
1297+
13211298// internal control complete to update state such as line state, encoding
13221299static void ch34x_control_complete (tuh_xfer_t * xfer ) {
13231300 // CH34x only has 1 interface and use wIndex as payload and not for bInterfaceNumber
@@ -1339,15 +1316,6 @@ static bool ch34x_set_data_format(cdch_interface_t* p_cdc, uint8_t stop_bits, ui
13391316 return true;
13401317}
13411318
1342- static bool ch34x_write_reg_baudrate (cdch_interface_t * p_cdc , uint32_t baudrate ,
1343- tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
1344- uint16_t const div_ps = ch34x_get_divisor_prescaler (baudrate );
1345- TU_VERIFY (div_ps != 0 );
1346- TU_ASSERT (ch34x_write_reg (p_cdc , CH34X_REG16_DIVISOR_PRESCALER , div_ps ,
1347- complete_cb , user_data ));
1348- return true;
1349- }
1350-
13511319static bool ch34x_set_baudrate (cdch_interface_t * p_cdc , uint32_t baudrate ,
13521320 tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
13531321 p_cdc -> requested_line_coding .bit_rate = baudrate ;
@@ -1432,6 +1400,42 @@ static bool ch34x_set_modem_ctrl(cdch_interface_t* p_cdc, uint16_t line_state,
14321400 return true;
14331401}
14341402
1403+ //------------- Enumeration -------------//
1404+ enum {
1405+ CONFIG_CH34X_READ_VERSION = 0 ,
1406+ CONFIG_CH34X_SERIAL_INIT ,
1407+ CONFIG_CH34X_SPECIAL_REG_WRITE ,
1408+ CONFIG_CH34X_FLOW_CONTROL ,
1409+ CONFIG_CH34X_MODEM_CONTROL ,
1410+ CONFIG_CH34X_COMPLETE
1411+ };
1412+
1413+ static bool ch34x_open (uint8_t daddr , tusb_desc_interface_t const * itf_desc , uint16_t max_len ) {
1414+ // CH34x Interface includes 1 vendor interface + 2 bulk + 1 interrupt endpoints
1415+ TU_VERIFY (itf_desc -> bNumEndpoints == 3 );
1416+ TU_VERIFY (sizeof (tusb_desc_interface_t ) + 3 * sizeof (tusb_desc_endpoint_t ) <= max_len );
1417+
1418+ cdch_interface_t * p_cdc = make_new_itf (daddr , itf_desc );
1419+ TU_VERIFY (p_cdc );
1420+
1421+ TU_LOG_DRV ("CH34x opened\r\n" );
1422+ p_cdc -> serial_drid = SERIAL_DRIVER_CH34X ;
1423+
1424+ tusb_desc_endpoint_t const * desc_ep = (tusb_desc_endpoint_t const * ) tu_desc_next (itf_desc );
1425+
1426+ // data endpoints expected to be in pairs
1427+ TU_ASSERT (open_ep_stream_pair (p_cdc , desc_ep ));
1428+ desc_ep += 2 ;
1429+
1430+ // Interrupt endpoint: not used for now
1431+ TU_ASSERT (TUSB_DESC_ENDPOINT == tu_desc_type (desc_ep ) &&
1432+ TUSB_XFER_INTERRUPT == desc_ep -> bmAttributes .xfer );
1433+ TU_ASSERT (tuh_edpt_open (daddr , desc_ep ));
1434+ p_cdc -> ep_notif = desc_ep -> bEndpointAddress ;
1435+
1436+ return true;
1437+ }
1438+
14351439static void ch34x_process_config (tuh_xfer_t * xfer ) {
14361440 // CH34x only has 1 interface and use wIndex as payload and not for bInterfaceNumber
14371441 uint8_t const itf_num = 0 ;
0 commit comments