refactor, add cdch_internal_control_complete()
This commit is contained in:
@@ -119,6 +119,7 @@ static void cdch_internal_control_complete(tuh_xfer_t *xfer);
|
|||||||
//------------- ACM prototypes -------------//
|
//------------- ACM prototypes -------------//
|
||||||
static bool acm_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
static bool acm_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
||||||
static bool acm_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
static bool acm_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
|
static void acm_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
|
|
||||||
static bool acm_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool acm_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
static bool acm_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool acm_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
@@ -144,8 +145,7 @@ static uint16_t const cp210x_vid_pid_list[][2] = {CFG_TUH_CDC_CP210X_VID_PID_LIS
|
|||||||
|
|
||||||
static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
||||||
static bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
static bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
static void acm_internal_control_complete(tuh_xfer_t *xfer);
|
static void cp210x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
static void cp210x_internal_control_complete(tuh_xfer_t *xfer);
|
|
||||||
|
|
||||||
static bool cp210x_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool cp210x_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
static bool cp210x_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool cp210x_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
@@ -159,7 +159,7 @@ static uint16_t const ch34x_vid_pid_list[][2] = {CFG_TUH_CDC_CH34X_VID_PID_LIST}
|
|||||||
|
|
||||||
static bool ch34x_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
static bool ch34x_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
||||||
static bool ch34x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
static bool ch34x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
static void ch34x_internal_control_complete(tuh_xfer_t *xfer);
|
static void ch34x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
|
|
||||||
static bool ch34x_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool ch34x_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
static bool ch34x_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool ch34x_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
@@ -174,7 +174,7 @@ static const pl2303_type_data_t pl2303_type_data[PL2303_TYPE_COUNT] = {PL2303_TY
|
|||||||
|
|
||||||
static bool pl2303_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
static bool pl2303_open(uint8_t daddr, tusb_desc_interface_t const * itf_desc, uint16_t max_len);
|
||||||
static bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
static bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
static void pl2303_internal_control_complete(tuh_xfer_t *xfer);
|
static void pl2303_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);
|
||||||
|
|
||||||
static bool pl2303_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool pl2303_set_baudrate(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
static bool pl2303_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
static bool pl2303_set_data_format(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);
|
||||||
@@ -237,6 +237,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
|
|||||||
.is_2stage_line_coding = false,
|
.is_2stage_line_coding = false,
|
||||||
.open = acm_open,
|
.open = acm_open,
|
||||||
.process_set_config = acm_process_set_config,
|
.process_set_config = acm_process_set_config,
|
||||||
|
.request_complete = acm_internal_control_complete,
|
||||||
|
|
||||||
.set_control_line_state = acm_set_control_line_state,
|
.set_control_line_state = acm_set_control_line_state,
|
||||||
.set_baudrate = acm_set_baudrate,
|
.set_baudrate = acm_set_baudrate,
|
||||||
.set_data_format = acm_set_data_format,
|
.set_data_format = acm_set_data_format,
|
||||||
@@ -252,6 +254,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
|
|||||||
.open = ftdi_open,
|
.open = ftdi_open,
|
||||||
.process_set_config = ftdi_proccess_set_config,
|
.process_set_config = ftdi_proccess_set_config,
|
||||||
.request_complete = ftdi_internal_control_complete,
|
.request_complete = ftdi_internal_control_complete,
|
||||||
|
|
||||||
.set_control_line_state = ftdi_set_modem_ctrl,
|
.set_control_line_state = ftdi_set_modem_ctrl,
|
||||||
.set_baudrate = ftdi_set_baudrate,
|
.set_baudrate = ftdi_set_baudrate,
|
||||||
.set_data_format = ftdi_set_data_format,
|
.set_data_format = ftdi_set_data_format,
|
||||||
@@ -267,6 +270,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
|
|||||||
.is_2stage_line_coding = true,
|
.is_2stage_line_coding = true,
|
||||||
.open = cp210x_open,
|
.open = cp210x_open,
|
||||||
.process_set_config = cp210x_process_set_config,
|
.process_set_config = cp210x_process_set_config,
|
||||||
|
.request_complete = cp210x_internal_control_complete,
|
||||||
|
|
||||||
.set_control_line_state = cp210x_set_modem_ctrl,
|
.set_control_line_state = cp210x_set_modem_ctrl,
|
||||||
.set_baudrate = cp210x_set_baudrate,
|
.set_baudrate = cp210x_set_baudrate,
|
||||||
.set_data_format = cp210x_set_data_format,
|
.set_data_format = cp210x_set_data_format,
|
||||||
@@ -282,6 +287,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
|
|||||||
.is_2stage_line_coding = true,
|
.is_2stage_line_coding = true,
|
||||||
.open = ch34x_open,
|
.open = ch34x_open,
|
||||||
.process_set_config = ch34x_process_set_config,
|
.process_set_config = ch34x_process_set_config,
|
||||||
|
.request_complete = ch34x_internal_control_complete,
|
||||||
|
|
||||||
.set_control_line_state = ch34x_set_modem_ctrl,
|
.set_control_line_state = ch34x_set_modem_ctrl,
|
||||||
.set_baudrate = ch34x_set_baudrate,
|
.set_baudrate = ch34x_set_baudrate,
|
||||||
.set_data_format = ch34x_set_data_format,
|
.set_data_format = ch34x_set_data_format,
|
||||||
@@ -297,6 +304,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
|
|||||||
.is_2stage_line_coding = false,
|
.is_2stage_line_coding = false,
|
||||||
.open = pl2303_open,
|
.open = pl2303_open,
|
||||||
.process_set_config = pl2303_process_set_config,
|
.process_set_config = pl2303_process_set_config,
|
||||||
|
.request_complete = pl2303_internal_control_complete,
|
||||||
|
|
||||||
.set_control_line_state = pl2303_set_modem_ctrl,
|
.set_control_line_state = pl2303_set_modem_ctrl,
|
||||||
.set_baudrate = pl2303_set_baudrate,
|
.set_baudrate = pl2303_set_baudrate,
|
||||||
.set_data_format = pl2303_set_data_format,
|
.set_data_format = pl2303_set_data_format,
|
||||||
@@ -904,15 +913,11 @@ static void cdch_internal_control_complete(tuh_xfer_t *xfer) {
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
// internal control complete to update state such as line state, encoding
|
// internal control complete to update state such as line state, encoding
|
||||||
static void acm_internal_control_complete(tuh_xfer_t *xfer) {
|
static void acm_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
|
||||||
uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
|
TU_VERIFY (xfer->result == XFER_RESULT_SUCCESS,);
|
||||||
uint8_t idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
const tusb_control_request_t * setup = xfer->setup;
|
||||||
cdch_interface_t *p_cdc = get_itf(idx);
|
|
||||||
TU_ASSERT(p_cdc, );
|
|
||||||
bool const success = (xfer->result == XFER_RESULT_SUCCESS);
|
|
||||||
|
|
||||||
if (success) {
|
switch (setup->bRequest) {
|
||||||
switch (xfer->setup->bRequest) {
|
|
||||||
case CDC_REQUEST_SET_CONTROL_LINE_STATE:
|
case CDC_REQUEST_SET_CONTROL_LINE_STATE:
|
||||||
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
||||||
break;
|
break;
|
||||||
@@ -921,20 +926,15 @@ static void acm_internal_control_complete(tuh_xfer_t *xfer) {
|
|||||||
p_cdc->line.coding = p_cdc->requested_line.coding;
|
p_cdc->line.coding = p_cdc->requested_line.coding;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: break;
|
default:
|
||||||
}
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
xfer->complete_cb = p_cdc->user_complete_cb;
|
|
||||||
if (xfer->complete_cb) {
|
|
||||||
xfer->complete_cb(xfer);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acm_set_control_line_state(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool acm_set_control_line_state(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
TU_VERIFY(p_cdc->acm.capability.support_line_request);
|
TU_VERIFY(p_cdc->acm.capability.support_line_request);
|
||||||
|
|
||||||
tusb_control_request_t const request = {
|
const tusb_control_request_t request = {
|
||||||
.bmRequestType_bit = {
|
.bmRequestType_bit = {
|
||||||
.recipient = TUSB_REQ_RCPT_INTERFACE,
|
.recipient = TUSB_REQ_RCPT_INTERFACE,
|
||||||
.type = TUSB_REQ_TYPE_CLASS,
|
.type = TUSB_REQ_TYPE_CLASS,
|
||||||
@@ -953,7 +953,7 @@ static bool acm_set_control_line_state(cdch_interface_t *p_cdc, tuh_xfer_cb_t co
|
|||||||
.ep_addr = 0,
|
.ep_addr = 0,
|
||||||
.setup = &request,
|
.setup = &request,
|
||||||
.buffer = NULL,
|
.buffer = NULL,
|
||||||
.complete_cb = complete_cb ? acm_internal_control_complete : NULL,
|
.complete_cb = complete_cb ? cdch_internal_control_complete : NULL,
|
||||||
.user_data = user_data
|
.user_data = user_data
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -990,7 +990,7 @@ static bool acm_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_
|
|||||||
.ep_addr = 0,
|
.ep_addr = 0,
|
||||||
.setup = &request,
|
.setup = &request,
|
||||||
.buffer = enum_buf,
|
.buffer = enum_buf,
|
||||||
.complete_cb = complete_cb ? acm_internal_control_complete : NULL,
|
.complete_cb = complete_cb ? cdch_internal_control_complete : NULL,
|
||||||
.user_data = user_data
|
.user_data = user_data
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1178,6 +1178,7 @@ static bool ftdi_set_data_request(cdch_interface_t *p_cdc, tuh_xfer_cb_t complet
|
|||||||
|
|
||||||
// internal control complete to update state such as line state, line_coding
|
// internal control complete to update state such as line state, line_coding
|
||||||
static void ftdi_internal_control_complete(cdch_interface_t* p_cdc, tuh_xfer_t *xfer) {
|
static void ftdi_internal_control_complete(cdch_interface_t* p_cdc, tuh_xfer_t *xfer) {
|
||||||
|
TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
|
||||||
const tusb_control_request_t * setup = xfer->setup;
|
const tusb_control_request_t * setup = xfer->setup;
|
||||||
if (xfer->result == XFER_RESULT_SUCCESS) {
|
if (xfer->result == XFER_RESULT_SUCCESS) {
|
||||||
if (setup->bRequest == FTDI_SIO_SET_MODEM_CTRL_REQUEST &&
|
if (setup->bRequest == FTDI_SIO_SET_MODEM_CTRL_REQUEST &&
|
||||||
@@ -1650,14 +1651,8 @@ static inline bool cp210x_set_mhs(cdch_interface_t *p_cdc, tuh_xfer_cb_t complet
|
|||||||
//------------- Driver API -------------//
|
//------------- Driver API -------------//
|
||||||
|
|
||||||
// internal control complete to update state such as line state, encoding
|
// internal control complete to update state such as line state, encoding
|
||||||
static void cp210x_internal_control_complete(tuh_xfer_t *xfer) {
|
static void cp210x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
|
||||||
uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
|
TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
|
||||||
uint8_t idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
|
||||||
cdch_interface_t *p_cdc = get_itf(idx);
|
|
||||||
TU_ASSERT(p_cdc, );
|
|
||||||
bool const success = (xfer->result == XFER_RESULT_SUCCESS);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
switch (xfer->setup->bRequest) {
|
switch (xfer->setup->bRequest) {
|
||||||
case CP210X_SET_MHS:
|
case CP210X_SET_MHS:
|
||||||
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
||||||
@@ -1677,23 +1672,15 @@ static void cp210x_internal_control_complete(tuh_xfer_t *xfer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xfer->complete_cb = p_cdc->user_complete_cb;
|
|
||||||
if (xfer->complete_cb) {
|
|
||||||
xfer->complete_cb(xfer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool cp210x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool cp210x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(cp210x_set_baudrate_request(p_cdc, complete_cb ? cp210x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(cp210x_set_baudrate_request(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cp210x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool cp210x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(cp210x_set_line_ctl(p_cdc, complete_cb ? cp210x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(cp210x_set_line_ctl(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1701,7 +1688,7 @@ static void cp210x_set_line_coding_stage1_complete(tuh_xfer_t *xfer) {
|
|||||||
uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
|
uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
|
||||||
set_line_coding_stage1_complete(xfer, itf_num,
|
set_line_coding_stage1_complete(xfer, itf_num,
|
||||||
cp210x_set_line_ctl, // control request function to set data format
|
cp210x_set_line_ctl, // control request function to set data format
|
||||||
cp210x_internal_control_complete); // control complete function to be called after request
|
cdch_internal_control_complete); // control complete function to be called after request
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2 stages: set baudrate (stage1) + set data format (stage2)
|
// 2 stages: set baudrate (stage1) + set data format (stage2)
|
||||||
@@ -1710,14 +1697,13 @@ static bool cp210x_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t comple
|
|||||||
cp210x_set_baudrate_request, // control request function to set baudrate
|
cp210x_set_baudrate_request, // control request function to set baudrate
|
||||||
cp210x_set_line_ctl, // control request function to set data format
|
cp210x_set_line_ctl, // control request function to set data format
|
||||||
cp210x_set_line_coding_stage1_complete, // function to be called after stage 1 completed
|
cp210x_set_line_coding_stage1_complete, // function to be called after stage 1 completed
|
||||||
cp210x_internal_control_complete, // control complete function to be called after request
|
cdch_internal_control_complete, // control complete function to be called after request
|
||||||
complete_cb, user_data);
|
complete_cb, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool cp210x_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool cp210x_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(cp210x_set_mhs(p_cdc, complete_cb ? cp210x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(cp210x_set_mhs(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1761,7 +1747,7 @@ static bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
p_cdc->requested_line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM;
|
p_cdc->requested_line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM;
|
||||||
p_cdc->user_complete_cb = cdch_process_set_config;
|
p_cdc->user_complete_cb = cdch_process_set_config;
|
||||||
TU_ASSERT(cp210x_set_baudrate_request(p_cdc, cp210x_internal_control_complete, CONFIG_CP210X_SET_LINE_CTL));
|
TU_ASSERT(cp210x_set_baudrate_request(p_cdc, cdch_internal_control_complete, CONFIG_CP210X_SET_LINE_CTL));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
@@ -1770,7 +1756,7 @@ static bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
case CONFIG_CP210X_SET_LINE_CTL:
|
case CONFIG_CP210X_SET_LINE_CTL:
|
||||||
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
p_cdc->user_complete_cb = cdch_process_set_config;
|
p_cdc->user_complete_cb = cdch_process_set_config;
|
||||||
TU_ASSERT(cp210x_set_line_ctl(p_cdc, cp210x_internal_control_complete, CONFIG_CP210X_SET_DTR_RTS));
|
TU_ASSERT(cp210x_set_line_ctl(p_cdc, cdch_internal_control_complete, CONFIG_CP210X_SET_DTR_RTS));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
@@ -1780,7 +1766,7 @@ static bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
||||||
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
||||||
p_cdc->user_complete_cb = cdch_process_set_config;
|
p_cdc->user_complete_cb = cdch_process_set_config;
|
||||||
TU_ASSERT(cp210x_set_mhs(p_cdc, cp210x_internal_control_complete, CONFIG_CP210X_COMPLETE));
|
TU_ASSERT(cp210x_set_mhs(p_cdc, cdch_internal_control_complete, CONFIG_CP210X_COMPLETE));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
@@ -1891,15 +1877,8 @@ static bool ch34x_modem_ctrl_request(cdch_interface_t *p_cdc, tuh_xfer_cb_t comp
|
|||||||
//------------- Driver API -------------//
|
//------------- Driver API -------------//
|
||||||
|
|
||||||
// internal control complete to update state such as line state, encoding
|
// internal control complete to update state such as line state, encoding
|
||||||
static void ch34x_internal_control_complete(tuh_xfer_t *xfer) {
|
static void ch34x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
|
||||||
// CH34x has only interface 0, because wIndex is used as payload and not for bInterfaceNumber
|
TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
|
||||||
uint8_t const itf_num = 0;
|
|
||||||
uint8_t idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
|
||||||
cdch_interface_t *p_cdc = get_itf(idx);
|
|
||||||
TU_ASSERT(p_cdc, );
|
|
||||||
bool const success = (xfer->result == XFER_RESULT_SUCCESS);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
switch (xfer->setup->bRequest) {
|
switch (xfer->setup->bRequest) {
|
||||||
case CH34X_REQ_WRITE_REG:
|
case CH34X_REQ_WRITE_REG:
|
||||||
// register write request
|
// register write request
|
||||||
@@ -1928,23 +1907,15 @@ static void ch34x_internal_control_complete(tuh_xfer_t *xfer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xfer->complete_cb = p_cdc->user_complete_cb;
|
|
||||||
if (xfer->complete_cb) {
|
|
||||||
xfer->complete_cb(xfer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool ch34x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool ch34x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(ch34x_write_reg_data_format(p_cdc, complete_cb ? ch34x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(ch34x_write_reg_data_format(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ch34x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool ch34x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(ch34x_write_reg_baudrate(p_cdc, complete_cb ? ch34x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(ch34x_write_reg_baudrate(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1953,7 +1924,7 @@ static void ch34x_set_line_coding_stage1_complete(tuh_xfer_t *xfer) {
|
|||||||
uint8_t const itf_num = 0;
|
uint8_t const itf_num = 0;
|
||||||
set_line_coding_stage1_complete(xfer, itf_num,
|
set_line_coding_stage1_complete(xfer, itf_num,
|
||||||
ch34x_write_reg_data_format, // control request function to set data format
|
ch34x_write_reg_data_format, // control request function to set data format
|
||||||
ch34x_internal_control_complete); // control complete function to be called after request
|
cdch_internal_control_complete); // control complete function to be called after request
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2 stages: set baudrate (stage1) + set data format (stage2)
|
// 2 stages: set baudrate (stage1) + set data format (stage2)
|
||||||
@@ -1962,14 +1933,13 @@ static bool ch34x_set_line_coding(cdch_interface_t * p_cdc, tuh_xfer_cb_t comple
|
|||||||
ch34x_write_reg_baudrate, // control request function to set baudrate
|
ch34x_write_reg_baudrate, // control request function to set baudrate
|
||||||
ch34x_write_reg_data_format, // control request function to set data format
|
ch34x_write_reg_data_format, // control request function to set data format
|
||||||
ch34x_set_line_coding_stage1_complete, // function to be called after stage 1 completed
|
ch34x_set_line_coding_stage1_complete, // function to be called after stage 1 completed
|
||||||
ch34x_internal_control_complete, // control complete function to be called after request
|
cdch_internal_control_complete, // control complete function to be called after request
|
||||||
complete_cb, user_data);
|
complete_cb, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ch34x_set_modem_ctrl(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool ch34x_set_modem_ctrl(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(ch34x_modem_ctrl_request(p_cdc, complete_cb ? ch34x_internal_control_complete : NULL, user_data));
|
TU_ASSERT(ch34x_modem_ctrl_request(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2055,7 +2025,7 @@ static bool ch34x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
||||||
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
||||||
p_cdc->user_complete_cb = cdch_process_set_config;
|
p_cdc->user_complete_cb = cdch_process_set_config;
|
||||||
TU_ASSERT(ch34x_modem_ctrl_request(p_cdc, ch34x_internal_control_complete, CONFIG_CH34X_COMPLETE));
|
TU_ASSERT(ch34x_modem_ctrl_request(p_cdc, cdch_internal_control_complete, CONFIG_CH34X_COMPLETE));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
@@ -2293,15 +2263,8 @@ static inline int pl2303_clear_halt(cdch_interface_t *p_cdc, uint8_t endp, tuh_x
|
|||||||
//------------- Driver API -------------//
|
//------------- Driver API -------------//
|
||||||
|
|
||||||
// internal control complete to update state such as line state, encoding
|
// internal control complete to update state such as line state, encoding
|
||||||
static void pl2303_internal_control_complete(tuh_xfer_t *xfer) {
|
static void pl2303_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
|
||||||
// PL2303 has only interface 0, because wIndex is used as payload and not for bInterfaceNumber
|
TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
|
||||||
uint8_t const itf_num = 0;
|
|
||||||
uint8_t idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
|
|
||||||
cdch_interface_t *p_cdc = get_itf(idx);
|
|
||||||
TU_ASSERT(p_cdc, );
|
|
||||||
bool const success = (xfer->result == XFER_RESULT_SUCCESS);
|
|
||||||
|
|
||||||
if (success) {
|
|
||||||
if (xfer->setup->bRequest == PL2303_SET_LINE_REQUEST &&
|
if (xfer->setup->bRequest == PL2303_SET_LINE_REQUEST &&
|
||||||
xfer->setup->bmRequestType == PL2303_SET_LINE_REQUEST_TYPE) {
|
xfer->setup->bmRequestType == PL2303_SET_LINE_REQUEST_TYPE) {
|
||||||
p_cdc->line.coding = p_cdc->requested_line.coding;
|
p_cdc->line.coding = p_cdc->requested_line.coding;
|
||||||
@@ -2312,22 +2275,16 @@ static void pl2303_internal_control_complete(tuh_xfer_t *xfer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xfer->complete_cb = p_cdc->user_complete_cb;
|
|
||||||
if (xfer->complete_cb) {
|
|
||||||
xfer->complete_cb(xfer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool pl2303_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool pl2303_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? pl2303_internal_control_complete : NULL, user_data));
|
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pl2303_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool pl2303_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
p_cdc->requested_line.coding.bit_rate = p_cdc->line.coding.bit_rate;
|
p_cdc->requested_line.coding.bit_rate = p_cdc->line.coding.bit_rate;
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? pl2303_internal_control_complete : NULL, user_data));
|
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2336,14 +2293,14 @@ static bool pl2303_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_
|
|||||||
p_cdc->requested_line.coding.parity = p_cdc->line.coding.parity;
|
p_cdc->requested_line.coding.parity = p_cdc->line.coding.parity;
|
||||||
p_cdc->requested_line.coding.data_bits = p_cdc->line.coding.data_bits;
|
p_cdc->requested_line.coding.data_bits = p_cdc->line.coding.data_bits;
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? pl2303_internal_control_complete : NULL, user_data));
|
TU_ASSERT(pl2303_set_line_request(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool pl2303_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
static bool pl2303_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
|
||||||
// PL2303 has the same bit coding
|
// PL2303 has the same bit coding
|
||||||
p_cdc->user_complete_cb = complete_cb;
|
p_cdc->user_complete_cb = complete_cb;
|
||||||
TU_ASSERT(pl2303_set_control_lines(p_cdc, complete_cb ? pl2303_internal_control_complete : NULL, user_data));
|
TU_ASSERT(pl2303_set_control_lines(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2557,7 +2514,7 @@ static bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
case CONFIG_PL2303_LINE_CODING:
|
case CONFIG_PL2303_LINE_CODING:
|
||||||
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
|
||||||
p_cdc->requested_line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM;
|
p_cdc->requested_line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM;
|
||||||
TU_ASSERT(pl2303_set_line_request(p_cdc, pl2303_internal_control_complete, CONFIG_PL2303_MODEM_CONTROL));
|
TU_ASSERT(pl2303_set_line_request(p_cdc, cdch_internal_control_complete, CONFIG_PL2303_MODEM_CONTROL));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
@@ -2566,7 +2523,7 @@ static bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
|
|||||||
case CONFIG_PL2303_MODEM_CONTROL:
|
case CONFIG_PL2303_MODEM_CONTROL:
|
||||||
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
#ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM
|
||||||
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
|
||||||
TU_ASSERT(pl2303_set_control_lines(p_cdc, pl2303_internal_control_complete, CONFIG_PL2303_COMPLETE));
|
TU_ASSERT(pl2303_set_control_lines(p_cdc, cdch_internal_control_complete, CONFIG_PL2303_COMPLETE));
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
TU_ATTR_FALLTHROUGH;
|
TU_ATTR_FALLTHROUGH;
|
||||||
|
Reference in New Issue
Block a user