summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorhathach <[email protected]>2025-06-20 17:25:58 +0700
committerhathach <[email protected]>2025-06-20 17:25:58 +0700
commit470e12febca6e371de03120508ef44db28e8501d (patch)
tree4cd326198bf0ebd6e6b9671e4e2d95b548717d17 /src/class
parent900d0d974b177959ffeaa1f34de72daf2ef72694 (diff)
refactor, add cdch_internal_control_complete()
Diffstat (limited to 'src/class')
-rw-r--r--src/class/cdc/cdc_host.c233
1 files changed, 95 insertions, 138 deletions
diff --git a/src/class/cdc/cdc_host.c b/src/class/cdc/cdc_host.c
index f36487758..1786f7815 100644
--- a/src/class/cdc/cdc_host.c
+++ b/src/class/cdc/cdc_host.c
@@ -119,6 +119,7 @@ static void cdch_internal_control_complete(tuh_xfer_t *xfer);
//------------- ACM prototypes -------------//
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 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_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_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(tuh_xfer_t *xfer);
+static void cp210x_internal_control_complete(cdch_interface_t *p_cdc, 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_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_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_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_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_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,
.open = acm_open,
.process_set_config = acm_process_set_config,
+ .request_complete = acm_internal_control_complete,
+
.set_control_line_state = acm_set_control_line_state,
.set_baudrate = acm_set_baudrate,
.set_data_format = acm_set_data_format,
@@ -252,6 +254,7 @@ static const cdch_serial_driver_t serial_drivers[] = {
.open = ftdi_open,
.process_set_config = ftdi_proccess_set_config,
.request_complete = ftdi_internal_control_complete,
+
.set_control_line_state = ftdi_set_modem_ctrl,
.set_baudrate = ftdi_set_baudrate,
.set_data_format = ftdi_set_data_format,
@@ -267,6 +270,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
.is_2stage_line_coding = true,
.open = cp210x_open,
.process_set_config = cp210x_process_set_config,
+ .request_complete = cp210x_internal_control_complete,
+
.set_control_line_state = cp210x_set_modem_ctrl,
.set_baudrate = cp210x_set_baudrate,
.set_data_format = cp210x_set_data_format,
@@ -282,6 +287,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
.is_2stage_line_coding = true,
.open = ch34x_open,
.process_set_config = ch34x_process_set_config,
+ .request_complete = ch34x_internal_control_complete,
+
.set_control_line_state = ch34x_set_modem_ctrl,
.set_baudrate = ch34x_set_baudrate,
.set_data_format = ch34x_set_data_format,
@@ -297,6 +304,8 @@ static const cdch_serial_driver_t serial_drivers[] = {
.is_2stage_line_coding = false,
.open = pl2303_open,
.process_set_config = pl2303_process_set_config,
+ .request_complete = pl2303_internal_control_complete,
+
.set_control_line_state = pl2303_set_modem_ctrl,
.set_baudrate = pl2303_set_baudrate,
.set_data_format = pl2303_set_data_format,
@@ -904,37 +913,28 @@ static void cdch_internal_control_complete(tuh_xfer_t *xfer) {
//--------------------------------------------------------------------+
// internal control complete to update state such as line state, encoding
-static void acm_internal_control_complete(tuh_xfer_t *xfer) {
- uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
- 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) {
- case CDC_REQUEST_SET_CONTROL_LINE_STATE:
- p_cdc->line.control_state = p_cdc->requested_line.control_state;
- break;
+static void acm_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;
- case CDC_REQUEST_SET_LINE_CODING:
- p_cdc->line.coding = p_cdc->requested_line.coding;
- break;
+ switch (setup->bRequest) {
+ case CDC_REQUEST_SET_CONTROL_LINE_STATE:
+ p_cdc->line.control_state = p_cdc->requested_line.control_state;
+ break;
- default: break;
- }
- }
+ case CDC_REQUEST_SET_LINE_CODING:
+ p_cdc->line.coding = p_cdc->requested_line.coding;
+ break;
- xfer->complete_cb = p_cdc->user_complete_cb;
- if (xfer->complete_cb) {
- xfer->complete_cb(xfer);
+ default:
+ break;
}
}
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);
- tusb_control_request_t const request = {
+ const tusb_control_request_t request = {
.bmRequestType_bit = {
.recipient = TUSB_REQ_RCPT_INTERFACE,
.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,
.setup = &request,
.buffer = NULL,
- .complete_cb = complete_cb ? acm_internal_control_complete : NULL,
+ .complete_cb = complete_cb ? cdch_internal_control_complete : NULL,
.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,
.setup = &request,
.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
};
@@ -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
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;
if (xfer->result == XFER_RESULT_SUCCESS) {
if (setup->bRequest == FTDI_SIO_SET_MODEM_CTRL_REQUEST &&
@@ -1650,50 +1651,36 @@ static inline bool cp210x_set_mhs(cdch_interface_t *p_cdc, tuh_xfer_cb_t complet
//------------- Driver API -------------//
// internal control complete to update state such as line state, encoding
-static void cp210x_internal_control_complete(tuh_xfer_t *xfer) {
- uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
- 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) {
- case CP210X_SET_MHS:
- p_cdc->line.control_state = p_cdc->requested_line.control_state;
- break;
-
- case CP210X_SET_LINE_CTL:
- p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;
- p_cdc->line.coding.parity = p_cdc->requested_line.coding.parity;
- p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;
- break;
+static void cp210x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
+ TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
+ switch (xfer->setup->bRequest) {
+ case CP210X_SET_MHS:
+ p_cdc->line.control_state = p_cdc->requested_line.control_state;
+ break;
- case CP210X_SET_BAUDRATE:
- p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
- break;
+ case CP210X_SET_LINE_CTL:
+ p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;
+ p_cdc->line.coding.parity = p_cdc->requested_line.coding.parity;
+ p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;
+ break;
- default: break;
- }
- }
+ case CP210X_SET_BAUDRATE:
+ p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
+ break;
- xfer->complete_cb = p_cdc->user_complete_cb;
- if (xfer->complete_cb) {
- xfer->complete_cb(xfer);
+ default: break;
}
}
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;
- 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;
}
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;
- 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;
}
@@ -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);
set_line_coding_stage1_complete(xfer, itf_num,
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)
@@ -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_line_ctl, // control request function to set data format
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);
}
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;
- 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;
}
@@ -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
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;
- 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;
#else
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:
#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM
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;
#else
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
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
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;
#else
TU_ATTR_FALLTHROUGH;
@@ -1891,60 +1877,45 @@ static bool ch34x_modem_ctrl_request(cdch_interface_t *p_cdc, tuh_xfer_cb_t comp
//------------- Driver API -------------//
// internal control complete to update state such as line state, encoding
-static void ch34x_internal_control_complete(tuh_xfer_t *xfer) {
- // CH34x has only interface 0, because wIndex is used as payload and not for bInterfaceNumber
- 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) {
- case CH34X_REQ_WRITE_REG:
- // register write request
- switch (tu_le16toh(xfer->setup->wValue)) {
- case CH34X_REG16_DIVISOR_PRESCALER:
- // baudrate
- p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
- break;
-
- case CH32X_REG16_LCR2_LCR:
- // data format
- p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;
- p_cdc->line.coding.parity = p_cdc->requested_line.coding.parity;
- p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;
- break;
+static void ch34x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
+ TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
+ switch (xfer->setup->bRequest) {
+ case CH34X_REQ_WRITE_REG:
+ // register write request
+ switch (tu_le16toh(xfer->setup->wValue)) {
+ case CH34X_REG16_DIVISOR_PRESCALER:
+ // baudrate
+ p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
+ break;
- default: break;
- }
- break;
+ case CH32X_REG16_LCR2_LCR:
+ // data format
+ p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;
+ p_cdc->line.coding.parity = p_cdc->requested_line.coding.parity;
+ p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;
+ break;
- case CH34X_REQ_MODEM_CTRL:
- p_cdc->line.control_state = p_cdc->requested_line.control_state;
- break;
+ default: break;
+ }
+ break;
- default: break;
- }
- }
+ case CH34X_REQ_MODEM_CTRL:
+ p_cdc->line.control_state = p_cdc->requested_line.control_state;
+ break;
- xfer->complete_cb = p_cdc->user_complete_cb;
- if (xfer->complete_cb) {
- xfer->complete_cb(xfer);
+ default: break;
}
}
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;
- 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;
}
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;
- 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;
}
@@ -1953,7 +1924,7 @@ static void ch34x_set_line_coding_stage1_complete(tuh_xfer_t *xfer) {
uint8_t const itf_num = 0;
set_line_coding_stage1_complete(xfer, itf_num,
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)
@@ -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_data_format, // control request function to set data format
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);
}
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;
- 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;
}
@@ -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
p_cdc->requested_line.control_state.value = CFG_TUH_CDC_LINE_CONTROL_ON_ENUM;
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;
#else
TU_ATTR_FALLTHROUGH;
@@ -2293,41 +2263,28 @@ static inline int pl2303_clear_halt(cdch_interface_t *p_cdc, uint8_t endp, tuh_x
//------------- Driver API -------------//
// internal control complete to update state such as line state, encoding
-static void pl2303_internal_control_complete(tuh_xfer_t *xfer) {
- // PL2303 has only interface 0, because wIndex is used as payload and not for bInterfaceNumber
- 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 &&
- xfer->setup->bmRequestType == PL2303_SET_LINE_REQUEST_TYPE) {
- p_cdc->line.coding = p_cdc->requested_line.coding;
- }
- if (xfer->setup->bRequest == PL2303_SET_CONTROL_REQUEST &&
- xfer->setup->bmRequestType == PL2303_SET_CONTROL_REQUEST_TYPE) {
- p_cdc->line.control_state = p_cdc->requested_line.control_state;
- }
+static void pl2303_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {
+ TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);
+ if (xfer->setup->bRequest == PL2303_SET_LINE_REQUEST &&
+ xfer->setup->bmRequestType == PL2303_SET_LINE_REQUEST_TYPE) {
+ p_cdc->line.coding = p_cdc->requested_line.coding;
}
-
- xfer->complete_cb = p_cdc->user_complete_cb;
- if (xfer->complete_cb) {
- xfer->complete_cb(xfer);
+ if (xfer->setup->bRequest == PL2303_SET_CONTROL_REQUEST &&
+ xfer->setup->bmRequestType == PL2303_SET_CONTROL_REQUEST_TYPE) {
+ p_cdc->line.control_state = p_cdc->requested_line.control_state;
}
}
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;
- 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;
}
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->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;
}
@@ -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.data_bits = p_cdc->line.coding.data_bits;
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;
}
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
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;
}
@@ -2557,7 +2514,7 @@ static bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer)
case CONFIG_PL2303_LINE_CODING:
#ifdef 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;
#else
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:
#ifdef 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;
#else
TU_ATTR_FALLTHROUGH;