Skip to content

Commit a32ef1c

Browse files
committed
more host serial refactor
1 parent 9698a08 commit a32ef1c

File tree

1 file changed

+47
-65
lines changed

1 file changed

+47
-65
lines changed

src/class/cdc/cdc_host.c

Lines changed: 47 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -154,21 +154,23 @@ enum {
154154
};
155155

156156
enum {
157-
CONFIG_FTDI_RESET,
157+
CONFIG_FTDI_RESET = 0,
158158
CONFIG_FTDI_MODEM_CTRL,
159159
CONFIG_FTDI_SET_BAUDRATE,
160160
CONFIG_FTDI_SET_DATA,
161161
CONFIG_FTDI_COMPLETE
162162
};
163163

164-
static bool ftdih_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {
164+
static bool ftdi_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {
165165
// FTDI Interface includes 1 vendor interface + 2 bulk endpoints
166166
TU_VERIFY(itf_desc->bInterfaceSubClass == 0xff && itf_desc->bInterfaceProtocol == 0xff && itf_desc->bNumEndpoints == 2);
167167
TU_VERIFY(sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t) <= max_len);
168168

169169
cdch_interface_t * p_cdc = make_new_itf(daddr, itf_desc);
170170
TU_VERIFY(p_cdc);
171171

172+
TU_LOG_CDCH("FTDI opened\r\n");
173+
172174
p_cdc->serial_protocol = SERIAL_PROTOCOL_FTDI;
173175

174176
// endpoint pair
@@ -178,22 +180,19 @@ static bool ftdih_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uin
178180
return open_ep_stream_pair(p_cdc, desc_ep);
179181
}
180182

181-
static bool ftdih_sio_reset(cdch_interface_t* p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
182-
{
183+
static bool ftdi_sio_set_request(cdch_interface_t* p_cdc, uint8_t command, uint16_t value, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {
183184
tusb_control_request_t const request = {
184185
.bmRequestType_bit = {
185186
.recipient = TUSB_REQ_RCPT_DEVICE,
186187
.type = TUSB_REQ_TYPE_VENDOR,
187188
.direction = TUSB_DIR_OUT
188189
},
189-
.bRequest = FTDI_SIO_RESET,
190-
.wValue = tu_htole16(FTDI_SIO_RESET_SIO),
190+
.bRequest = command,
191+
.wValue = tu_htole16(value),
191192
.wIndex = 0,
192193
.wLength = 0
193194
};
194195

195-
p_cdc->user_control_cb = complete_cb;
196-
197196
tuh_xfer_t xfer = {
198197
.daddr = p_cdc->daddr,
199198
.ep_addr = 0,
@@ -203,70 +202,30 @@ static bool ftdih_sio_reset(cdch_interface_t* p_cdc, tuh_xfer_cb_t complete_cb,
203202
.user_data = user_data
204203
};
205204

206-
TU_ASSERT(tuh_control_xfer(&xfer));
205+
return tuh_control_xfer(&xfer);
206+
}
207+
208+
static bool ftdi_sio_reset(cdch_interface_t* p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
209+
{
210+
TU_ASSERT(ftdi_sio_set_request(p_cdc, FTDI_SIO_RESET, FTDI_SIO_RESET_SIO, complete_cb, user_data));
207211
return true;
208212
}
209213

210214
static bool ftdi_sio_modem_ctrl(cdch_interface_t* p_cdc, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
211215
{
212-
tusb_control_request_t const request = {
213-
.bmRequestType_bit = {
214-
.recipient = TUSB_REQ_RCPT_INTERFACE,
215-
.type = TUSB_REQ_TYPE_VENDOR,
216-
.direction = TUSB_DIR_OUT
217-
},
218-
.bRequest = FTDI_SIO_MODEM_CTRL,
219-
.wValue = tu_htole16(0x0300 | line_state), // 0x0300 is DTR and RTS enable
220-
.wIndex = 0, // port
221-
.wLength = 0
222-
};
223-
224216
p_cdc->user_control_cb = complete_cb;
225-
226-
tuh_xfer_t xfer = {
227-
.daddr = p_cdc->daddr,
228-
.ep_addr = 0,
229-
.setup = &request,
230-
.buffer = NULL,
231-
.complete_cb = cdch_internal_control_complete,
232-
.user_data = user_data
233-
};
234-
235-
TU_ASSERT(tuh_control_xfer(&xfer));
217+
TU_ASSERT(ftdi_sio_set_request(p_cdc, FTDI_SIO_MODEM_CTRL, 0x0300 | line_state, cdch_internal_control_complete, user_data));
236218
return true;
237219
}
238220

239221
static bool ftdi_sio_set_baudrate(cdch_interface_t* p_cdc, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
240222
{
241223
// TODO baudrate to baud divisor
242224
(void) baudrate;
243-
244225
uint16_t divisor = 0x4138; // FIXME hardcoded to 9600 baud
245226

246-
tusb_control_request_t const request = {
247-
.bmRequestType_bit = {
248-
.recipient = TUSB_REQ_RCPT_INTERFACE,
249-
.type = TUSB_REQ_TYPE_VENDOR,
250-
.direction = TUSB_DIR_OUT
251-
},
252-
.bRequest = FTDI_SIO_SET_BAUD_RATE,
253-
.wValue = tu_htole16(divisor),
254-
.wIndex = 0, // port
255-
.wLength = 0
256-
};
257-
258227
p_cdc->user_control_cb = complete_cb;
259-
260-
tuh_xfer_t xfer = {
261-
.daddr = p_cdc->daddr,
262-
.ep_addr = 0,
263-
.setup = &request,
264-
.buffer = NULL,
265-
.complete_cb = cdch_internal_control_complete,
266-
.user_data = user_data
267-
};
268-
269-
TU_ASSERT(tuh_control_xfer(&xfer));
228+
TU_ASSERT(ftdi_sio_set_request(p_cdc, FTDI_SIO_SET_BAUD_RATE, divisor, cdch_internal_control_complete, user_data));
270229
return true;
271230
}
272231

@@ -280,7 +239,7 @@ static void process_ftdi_config(tuh_xfer_t* xfer) {
280239
switch(state) {
281240
// Note may need to read FTDI eeprom
282241
case CONFIG_FTDI_RESET:
283-
TU_ASSERT(ftdih_sio_reset(p_cdc, process_ftdi_config, CONFIG_FTDI_MODEM_CTRL),);
242+
TU_ASSERT(ftdi_sio_reset(p_cdc, process_ftdi_config, CONFIG_FTDI_MODEM_CTRL),);
284243
break;
285244

286245
case CONFIG_FTDI_MODEM_CTRL:
@@ -335,6 +294,13 @@ enum {
335294
CP210X_PID_COUNT = sizeof(cp210x_pids) / sizeof(cp210x_pids[0])
336295
};
337296

297+
enum {
298+
CONFIG_CP210X_IFC_ENABLE = 0,
299+
CONFIG_CP210X_SET_BAUDRATE,
300+
CONFIG_CP210X_SET_LINE_CTL,
301+
CONFIG_CP210X_SET_MHS
302+
};
303+
338304
static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {
339305
// CP210x Interface includes 1 vendor interface + 2 bulk endpoints
340306
TU_VERIFY(itf_desc->bInterfaceSubClass == 0 && itf_desc->bInterfaceProtocol == 0 && itf_desc->bNumEndpoints == 2);
@@ -343,6 +309,7 @@ static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, ui
343309
cdch_interface_t * p_cdc = make_new_itf(daddr, itf_desc);
344310
TU_VERIFY(p_cdc);
345311

312+
TU_LOG_CDCH("CP210x opened\r\n");
346313
p_cdc->serial_protocol = SERIAL_PROTOCOL_CP210X;
347314

348315
// endpoint pair
@@ -352,6 +319,22 @@ static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, ui
352319
return open_ep_stream_pair(p_cdc, desc_ep);
353320
}
354321

322+
static void process_cp210x_config(tuh_xfer_t* xfer) {
323+
uintptr_t const state = xfer->user_data;
324+
uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);
325+
uint8_t const idx = tuh_cdc_itf_get_index(xfer->daddr, itf_num);
326+
cdch_interface_t *p_cdc = get_itf(idx);
327+
TU_ASSERT(p_cdc,);
328+
329+
switch (state) {
330+
case CONFIG_CP210X_IFC_ENABLE:
331+
332+
break;
333+
334+
default: break;
335+
}
336+
}
337+
355338
#endif
356339

357340
//--------------------------------------------------------------------+
@@ -740,7 +723,7 @@ bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t
740723
enum
741724
{
742725
// ACM
743-
CONFIG_ACM_SET_CONTROL_LINE_STATE,
726+
CONFIG_ACM_SET_CONTROL_LINE_STATE = 0,
744727
CONFIG_ACM_SET_LINE_CODING,
745728
CONFIG_ACM_COMPLETE,
746729
};
@@ -840,7 +823,7 @@ bool cdch_open(uint8_t rhport, uint8_t daddr, tusb_desc_interface_t const *itf_d
840823
if (TU_FTDI_VID == vid) {
841824
for (size_t i = 0; i < FTDI_PID_COUNT; i++) {
842825
if (ftdi_pids[i] == pid) {
843-
return ftdih_open(daddr, itf_desc, max_len);
826+
return ftdi_open(daddr, itf_desc, max_len);
844827
}
845828
}
846829
}
@@ -918,9 +901,10 @@ bool cdch_set_config(uint8_t daddr, uint8_t itf_num)
918901
request.wIndex = tu_htole16((uint16_t) itf_num);
919902

920903
tuh_xfer_t xfer;
921-
xfer.daddr = daddr;
922-
xfer.result = XFER_RESULT_SUCCESS;
923-
xfer.setup = &request;
904+
xfer.daddr = daddr;
905+
xfer.result = XFER_RESULT_SUCCESS;
906+
xfer.setup = &request;
907+
xfer.user_data = 0;
924908

925909
// fake transfer to kick-off process
926910
uint8_t const idx = tuh_cdc_itf_get_index(daddr, itf_num);
@@ -929,20 +913,18 @@ bool cdch_set_config(uint8_t daddr, uint8_t itf_num)
929913

930914
switch (p_cdc->serial_protocol) {
931915
case SERIAL_PROTOCOL_ACM:
932-
xfer.user_data = CONFIG_ACM_SET_CONTROL_LINE_STATE;
933916
process_acm_config(&xfer);
934917
break;
935918

936919
#if CFG_TUH_CDC_FTDI
937920
case SERIAL_PROTOCOL_FTDI:
938-
xfer.user_data = CONFIG_FTDI_RESET;
939921
process_ftdi_config(&xfer);
940922
break;
941923
#endif
942924

943925
#if CFG_TUH_CDC_CP210X
944926
case SERIAL_PROTOCOL_CP210X:
945-
//xfer.user_data = CONFIG_SET_CONTROL_LINE_STATE;
927+
process_cp210x_config(&xfer);
946928
break;
947929
#endif
948930

0 commit comments

Comments
 (0)