added line control function using cdc_line_control_state_t

This commit is contained in:
IngHK
2024-03-10 08:20:12 +01:00
parent e0551043ca
commit a9cc07fc83
2 changed files with 38 additions and 7 deletions

View File

@@ -50,8 +50,9 @@
DADDR, ITF_NUM, NAME, ##__VA_ARGS__) DADDR, ITF_NUM, NAME, ##__VA_ARGS__)
#define TU_LOG_P_CDC(TXT,...) TU_LOG_CDC(TXT, p_cdc->daddr, p_cdc->bInterfaceNumber, \ #define TU_LOG_P_CDC(TXT,...) TU_LOG_CDC(TXT, p_cdc->daddr, p_cdc->bInterfaceNumber, \
serial_drivers[p_cdc->serial_drid].name, ##__VA_ARGS__) serial_drivers[p_cdc->serial_drid].name, ##__VA_ARGS__)
#define TU_LOG_P_CDC_BOOL(TXT,VAL) TU_LOG_P_CDC(TXT " " #VAL " = %s", VAL ? "true" : "false" ) #define TU_LOG_P_CDC_BOOL(TXT,VAL) TU_LOG_P_CDC(TXT " " #VAL " = %d", VAL)
// assert and set config complete
#define TU_ASSERT_COMPLETE_DEFINE(_cond, _itf_offset) \ #define TU_ASSERT_COMPLETE_DEFINE(_cond, _itf_offset) \
do { \ do { \
if (!(_cond)) { _MESS_FAILED(); TU_BREAKPOINT(); set_config_complete(idx, _itf_offset, false); } \ if (!(_cond)) { _MESS_FAILED(); TU_BREAKPOINT(); set_config_complete(idx, _itf_offset, false); } \
@@ -586,24 +587,48 @@ static bool set_function_call (
} }
} }
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) { bool tuh_cdc_set_control_line_state_u(uint8_t idx, cdc_line_control_state_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
// uses cdc_line_control_state_t union for line_state
cdch_interface_t * p_cdc = get_itf(idx); cdch_interface_t * p_cdc = get_itf(idx);
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT); TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);
TU_LOG_P_CDC("set control line state line_state = %u", line_state); TU_LOG_P_CDC("set control line state dtr = %u rts = %u", line_state.dtr, line_state.rts );
cdch_serial_driver_t const * driver = &serial_drivers[p_cdc->serial_drid]; cdch_serial_driver_t const * driver = &serial_drivers[p_cdc->serial_drid];
p_cdc->requested_line_state.all = (uint8_t) line_state; p_cdc->requested_line_state = line_state;
bool ret = set_function_call(p_cdc, driver->set_control_line_state, complete_cb, user_data); bool ret = set_function_call(p_cdc, driver->set_control_line_state, complete_cb, user_data);
if (ret && !complete_cb) { if (ret && !complete_cb) {
p_cdc->line_state.all = (uint8_t) line_state; p_cdc->line_state = line_state;
} }
// TU_LOG_P_CDC_BOOL("set control line state", ret); // TU_LOG_P_CDC_BOOL("set control line state", ret);
return ret; return ret;
} }
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
// uses uint16_t for line_state => DTR (bit 0), RTS (bit 1)
return tuh_cdc_set_control_line_state_u(idx, (cdc_line_control_state_t) { .all = (uint8_t) line_state },
complete_cb, user_data);
}
bool tuh_cdc_set_dtr(uint8_t idx, bool dtr_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
cdch_interface_t * p_cdc = get_itf(idx);
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);
cdc_line_control_state_t const line_state = { .dtr = dtr_state, .rts = p_cdc->line_state.rts };
return tuh_cdc_set_control_line_state_u(idx, line_state, complete_cb, user_data);
}
bool tuh_cdc_set_rts(uint8_t idx, bool rts_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
cdch_interface_t * p_cdc = get_itf(idx);
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);
cdc_line_control_state_t const line_state = { .rts = rts_state, .dtr = p_cdc->line_state.dtr };
return tuh_cdc_set_control_line_state_u(idx, line_state, complete_cb, user_data);
}
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data) { bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
cdch_interface_t * p_cdc = get_itf(idx); cdch_interface_t * p_cdc = get_itf(idx);
TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT); TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);

View File

@@ -132,8 +132,14 @@ bool tuh_cdc_read_clear (uint8_t idx);
// - The function will return true if transfer is successful, false otherwise. // - The function will return true if transfer is successful, false otherwise.
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Request to Set Control Line State: DTR (bit 0), RTS (bit 1) // Request to Set Control Line State
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data); bool tuh_cdc_set_control_line_state_u(uint8_t idx, cdc_line_control_state_t line_state, // uses cdc_line_control_state_t union for line_state
tuh_xfer_cb_t complete_cb, uintptr_t user_data);
bool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, // uses uint16_t for line_state (legacy function)
tuh_xfer_cb_t complete_cb, uintptr_t user_data); // DTR (bit 0), RTS (bit 1)
bool tuh_cdc_set_dtr(uint8_t idx, bool dtr_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data); // Request to Set DTR
bool tuh_cdc_set_rts(uint8_t idx, bool rts_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data); // Request to Set RTS
// Request to set baudrate // Request to set baudrate
bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data); bool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);