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 -------------//
|
||||
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);
|
||||
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;
|
||||
|
||||
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;
|
||||
switch (setup->bRequest) {
|
||||
case CDC_REQUEST_SET_CONTROL_LINE_STATE:
|
||||
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
||||
break;
|
||||
|
||||
case CDC_REQUEST_SET_LINE_CODING:
|
||||
p_cdc->line.coding = p_cdc->requested_line.coding;
|
||||
break;
|
||||
case CDC_REQUEST_SET_LINE_CODING:
|
||||
p_cdc->line.coding = p_cdc->requested_line.coding;
|
||||
break;
|
||||
|
||||
default: 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);
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
case CP210X_SET_BAUDRATE:
|
||||
p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
|
||||
break;
|
||||
|
||||
case CP210X_SET_BAUDRATE:
|
||||
p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;
|
||||
break;
|
||||
|
||||
default: 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);
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
default: break;
|
||||
}
|
||||
break;
|
||||
|
||||
default: break;
|
||||
}
|
||||
break;
|
||||
case CH34X_REQ_MODEM_CTRL:
|
||||
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
||||
break;
|
||||
|
||||
case CH34X_REQ_MODEM_CTRL:
|
||||
p_cdc->line.control_state = p_cdc->requested_line.control_state;
|
||||
break;
|
||||
|
||||
default: 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;
|
||||
|
Reference in New Issue
Block a user