@@ -437,22 +437,78 @@ static void cdch_internal_control_complete(tuh_xfer_t* xfer)
437
437
bool tuh_cdc_set_control_line_state (uint8_t idx , uint16_t line_state , tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
438
438
cdch_interface_t * p_cdc = get_itf (idx );
439
439
TU_VERIFY (p_cdc && p_cdc -> serial_drid < SERIAL_DRIVER_COUNT );
440
- return serial_drivers [p_cdc -> serial_drid ].set_control_line_state (p_cdc , line_state , complete_cb , user_data );
440
+ cdch_serial_driver_t const * driver = & serial_drivers [p_cdc -> serial_drid ];
441
+
442
+ if ( complete_cb ) {
443
+ return driver -> set_control_line_state (p_cdc , line_state , complete_cb , user_data );
444
+ }else {
445
+ // blocking
446
+ xfer_result_t result ;
447
+ bool ret = driver -> set_control_line_state (p_cdc , line_state , complete_cb , (uintptr_t ) & result );
448
+
449
+ if (user_data ) {
450
+ // user_data is not NULL, return result via user_data
451
+ * ((xfer_result_t * ) user_data ) = result ;
452
+ }
453
+
454
+ if (result == XFER_RESULT_SUCCESS ) {
455
+ p_cdc -> line_state = (uint8_t ) line_state ;
456
+ }
457
+
458
+ return ret ;
459
+ }
441
460
}
442
461
443
462
bool tuh_cdc_set_baudrate (uint8_t idx , uint32_t baudrate , tuh_xfer_cb_t complete_cb , uintptr_t user_data ) {
444
463
cdch_interface_t * p_cdc = get_itf (idx );
445
464
TU_VERIFY (p_cdc && p_cdc -> serial_drid < SERIAL_DRIVER_COUNT );
446
- return serial_drivers [p_cdc -> serial_drid ].set_baudrate (p_cdc , baudrate , complete_cb , user_data );
465
+ cdch_serial_driver_t const * driver = & serial_drivers [p_cdc -> serial_drid ];
466
+
467
+ if ( complete_cb ) {
468
+ return driver -> set_baudrate (p_cdc , baudrate , complete_cb , user_data );
469
+ }else {
470
+ // blocking
471
+ xfer_result_t result ;
472
+ bool ret = driver -> set_baudrate (p_cdc , baudrate , complete_cb , (uintptr_t ) & result );
473
+
474
+ if (user_data ) {
475
+ // user_data is not NULL, return result via user_data
476
+ * ((xfer_result_t * ) user_data ) = result ;
477
+ }
478
+
479
+ if (result == XFER_RESULT_SUCCESS ) {
480
+ p_cdc -> line_coding .bit_rate = baudrate ;
481
+ }
482
+
483
+ return ret ;
484
+ }
447
485
}
448
486
449
487
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 )
450
488
{
451
489
cdch_interface_t * p_cdc = get_itf (idx );
452
- TU_VERIFY (p_cdc );
453
490
// only ACM support this set line coding request
454
- TU_VERIFY (p_cdc -> serial_drid == SERIAL_DRIVER_ACM && p_cdc -> acm_capability .support_line_request );
455
- return acm_set_line_coding (p_cdc , line_coding , complete_cb , user_data );
491
+ TU_VERIFY (p_cdc && p_cdc -> serial_drid == SERIAL_DRIVER_ACM );
492
+ TU_VERIFY (p_cdc -> acm_capability .support_line_request );
493
+
494
+ if ( complete_cb ) {
495
+ return acm_set_line_coding (p_cdc , line_coding , complete_cb , user_data );
496
+ }else {
497
+ // blocking
498
+ xfer_result_t result ;
499
+ bool ret = acm_set_line_coding (p_cdc , line_coding , complete_cb , (uintptr_t ) & result );
500
+
501
+ if (user_data ) {
502
+ // user_data is not NULL, return result via user_data
503
+ * ((xfer_result_t * ) user_data ) = result ;
504
+ }
505
+
506
+ if (result == XFER_RESULT_SUCCESS ) {
507
+ p_cdc -> line_coding = * line_coding ;
508
+ }
509
+
510
+ return ret ;
511
+ }
456
512
}
457
513
458
514
//--------------------------------------------------------------------+
@@ -752,6 +808,7 @@ static void acm_process_config(tuh_xfer_t* xfer)
752
808
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 ) {
753
809
TU_VERIFY (p_cdc -> acm_capability .support_line_request );
754
810
TU_LOG_CDCH ("CDC ACM Set Control Line State\r\n" );
811
+
755
812
tusb_control_request_t const request = {
756
813
.bmRequestType_bit = {
757
814
.recipient = TUSB_REQ_RCPT_INTERFACE ,
@@ -771,7 +828,7 @@ static bool acm_set_control_line_state(cdch_interface_t* p_cdc, uint16_t line_st
771
828
.ep_addr = 0 ,
772
829
.setup = & request ,
773
830
.buffer = NULL ,
774
- .complete_cb = cdch_internal_control_complete ,
831
+ .complete_cb = complete_cb ? cdch_internal_control_complete : NULL , // complete_cb is NULL for sync call
775
832
.user_data = user_data
776
833
};
777
834
@@ -804,7 +861,7 @@ static bool acm_set_line_coding(cdch_interface_t* p_cdc, cdc_line_coding_t const
804
861
.ep_addr = 0 ,
805
862
.setup = & request ,
806
863
.buffer = enum_buf ,
807
- .complete_cb = cdch_internal_control_complete ,
864
+ .complete_cb = complete_cb ? cdch_internal_control_complete : NULL , // complete_cb is NULL for sync call
808
865
.user_data = user_data
809
866
};
810
867
@@ -886,7 +943,8 @@ static bool ftdi_sio_set_modem_ctrl(cdch_interface_t* p_cdc, uint16_t line_state
886
943
{
887
944
TU_LOG_CDCH ("CDC FTDI Set Control Line State\r\n" );
888
945
p_cdc -> user_control_cb = complete_cb ;
889
- TU_ASSERT (ftdi_sio_set_request (p_cdc , FTDI_SIO_MODEM_CTRL , 0x0300 | line_state , cdch_internal_control_complete , user_data ));
946
+ TU_ASSERT (ftdi_sio_set_request (p_cdc , FTDI_SIO_MODEM_CTRL , 0x0300 | line_state ,
947
+ complete_cb ? cdch_internal_control_complete : NULL , user_data ));
890
948
return true;
891
949
}
892
950
@@ -923,7 +981,8 @@ static bool ftdi_sio_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tu
923
981
924
982
p_cdc -> user_control_cb = complete_cb ;
925
983
_ftdi_requested_baud = baudrate ;
926
- TU_ASSERT (ftdi_sio_set_request (p_cdc , FTDI_SIO_SET_BAUD_RATE , divisor , cdch_internal_control_complete , user_data ));
984
+ TU_ASSERT (ftdi_sio_set_request (p_cdc , FTDI_SIO_SET_BAUD_RATE , divisor ,
985
+ complete_cb ? cdch_internal_control_complete : NULL , user_data ));
927
986
928
987
return true;
929
988
}
@@ -1056,14 +1115,16 @@ static bool cp210x_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_
1056
1115
TU_LOG_CDCH ("CDC CP210x Set BaudRate = %lu\n" , baudrate );
1057
1116
uint32_t baud_le = tu_htole32 (baudrate );
1058
1117
p_cdc -> user_control_cb = complete_cb ;
1059
- return cp210x_set_request (p_cdc , CP210X_SET_BAUDRATE , 0 , (uint8_t * ) & baud_le , 4 , cdch_internal_control_complete , user_data );
1118
+ return cp210x_set_request (p_cdc , CP210X_SET_BAUDRATE , 0 , (uint8_t * ) & baud_le , 4 ,
1119
+ complete_cb ? cdch_internal_control_complete : NULL , user_data );
1060
1120
}
1061
1121
1062
1122
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 )
1063
1123
{
1064
1124
TU_LOG_CDCH ("CDC CP210x Set Control Line State\r\n" );
1065
1125
p_cdc -> user_control_cb = complete_cb ;
1066
- return cp210x_set_request (p_cdc , CP210X_SET_MHS , 0x0300 | line_state , NULL , 0 , cdch_internal_control_complete , user_data );
1126
+ return cp210x_set_request (p_cdc , CP210X_SET_MHS , 0x0300 | line_state , NULL , 0 ,
1127
+ complete_cb ? cdch_internal_control_complete : NULL , user_data );
1067
1128
}
1068
1129
1069
1130
static void cp210x_process_config (tuh_xfer_t * xfer ) {
0 commit comments