@@ -154,21 +154,23 @@ enum {
154
154
};
155
155
156
156
enum {
157
- CONFIG_FTDI_RESET ,
157
+ CONFIG_FTDI_RESET = 0 ,
158
158
CONFIG_FTDI_MODEM_CTRL ,
159
159
CONFIG_FTDI_SET_BAUDRATE ,
160
160
CONFIG_FTDI_SET_DATA ,
161
161
CONFIG_FTDI_COMPLETE
162
162
};
163
163
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 ) {
165
165
// FTDI Interface includes 1 vendor interface + 2 bulk endpoints
166
166
TU_VERIFY (itf_desc -> bInterfaceSubClass == 0xff && itf_desc -> bInterfaceProtocol == 0xff && itf_desc -> bNumEndpoints == 2 );
167
167
TU_VERIFY (sizeof (tusb_desc_interface_t ) + 2 * sizeof (tusb_desc_endpoint_t ) <= max_len );
168
168
169
169
cdch_interface_t * p_cdc = make_new_itf (daddr , itf_desc );
170
170
TU_VERIFY (p_cdc );
171
171
172
+ TU_LOG_CDCH ("FTDI opened\r\n" );
173
+
172
174
p_cdc -> serial_protocol = SERIAL_PROTOCOL_FTDI ;
173
175
174
176
// endpoint pair
@@ -178,22 +180,19 @@ static bool ftdih_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, uin
178
180
return open_ep_stream_pair (p_cdc , desc_ep );
179
181
}
180
182
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 ) {
183
184
tusb_control_request_t const request = {
184
185
.bmRequestType_bit = {
185
186
.recipient = TUSB_REQ_RCPT_DEVICE ,
186
187
.type = TUSB_REQ_TYPE_VENDOR ,
187
188
.direction = TUSB_DIR_OUT
188
189
},
189
- .bRequest = FTDI_SIO_RESET ,
190
- .wValue = tu_htole16 (FTDI_SIO_RESET_SIO ),
190
+ .bRequest = command ,
191
+ .wValue = tu_htole16 (value ),
191
192
.wIndex = 0 ,
192
193
.wLength = 0
193
194
};
194
195
195
- p_cdc -> user_control_cb = complete_cb ;
196
-
197
196
tuh_xfer_t xfer = {
198
197
.daddr = p_cdc -> daddr ,
199
198
.ep_addr = 0 ,
@@ -203,70 +202,30 @@ static bool ftdih_sio_reset(cdch_interface_t* p_cdc, tuh_xfer_cb_t complete_cb,
203
202
.user_data = user_data
204
203
};
205
204
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 ));
207
211
return true;
208
212
}
209
213
210
214
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 )
211
215
{
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
-
224
216
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 ));
236
218
return true;
237
219
}
238
220
239
221
static bool ftdi_sio_set_baudrate (cdch_interface_t * p_cdc , uint32_t baudrate , tuh_xfer_cb_t complete_cb , uintptr_t user_data )
240
222
{
241
223
// TODO baudrate to baud divisor
242
224
(void ) baudrate ;
243
-
244
225
uint16_t divisor = 0x4138 ; // FIXME hardcoded to 9600 baud
245
226
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
-
258
227
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 ));
270
229
return true;
271
230
}
272
231
@@ -280,7 +239,7 @@ static void process_ftdi_config(tuh_xfer_t* xfer) {
280
239
switch (state ) {
281
240
// Note may need to read FTDI eeprom
282
241
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 ),);
284
243
break ;
285
244
286
245
case CONFIG_FTDI_MODEM_CTRL :
@@ -335,6 +294,13 @@ enum {
335
294
CP210X_PID_COUNT = sizeof (cp210x_pids ) / sizeof (cp210x_pids [0 ])
336
295
};
337
296
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
+
338
304
static bool cp210x_open (uint8_t daddr , tusb_desc_interface_t const * itf_desc , uint16_t max_len ) {
339
305
// CP210x Interface includes 1 vendor interface + 2 bulk endpoints
340
306
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
343
309
cdch_interface_t * p_cdc = make_new_itf (daddr , itf_desc );
344
310
TU_VERIFY (p_cdc );
345
311
312
+ TU_LOG_CDCH ("CP210x opened\r\n" );
346
313
p_cdc -> serial_protocol = SERIAL_PROTOCOL_CP210X ;
347
314
348
315
// endpoint pair
@@ -352,6 +319,22 @@ static bool cp210x_open(uint8_t daddr, tusb_desc_interface_t const *itf_desc, ui
352
319
return open_ep_stream_pair (p_cdc , desc_ep );
353
320
}
354
321
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
+
355
338
#endif
356
339
357
340
//--------------------------------------------------------------------+
@@ -740,7 +723,7 @@ bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t
740
723
enum
741
724
{
742
725
// ACM
743
- CONFIG_ACM_SET_CONTROL_LINE_STATE ,
726
+ CONFIG_ACM_SET_CONTROL_LINE_STATE = 0 ,
744
727
CONFIG_ACM_SET_LINE_CODING ,
745
728
CONFIG_ACM_COMPLETE ,
746
729
};
@@ -840,7 +823,7 @@ bool cdch_open(uint8_t rhport, uint8_t daddr, tusb_desc_interface_t const *itf_d
840
823
if (TU_FTDI_VID == vid ) {
841
824
for (size_t i = 0 ; i < FTDI_PID_COUNT ; i ++ ) {
842
825
if (ftdi_pids [i ] == pid ) {
843
- return ftdih_open (daddr , itf_desc , max_len );
826
+ return ftdi_open (daddr , itf_desc , max_len );
844
827
}
845
828
}
846
829
}
@@ -918,9 +901,10 @@ bool cdch_set_config(uint8_t daddr, uint8_t itf_num)
918
901
request .wIndex = tu_htole16 ((uint16_t ) itf_num );
919
902
920
903
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 ;
924
908
925
909
// fake transfer to kick-off process
926
910
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)
929
913
930
914
switch (p_cdc -> serial_protocol ) {
931
915
case SERIAL_PROTOCOL_ACM :
932
- xfer .user_data = CONFIG_ACM_SET_CONTROL_LINE_STATE ;
933
916
process_acm_config (& xfer );
934
917
break ;
935
918
936
919
#if CFG_TUH_CDC_FTDI
937
920
case SERIAL_PROTOCOL_FTDI :
938
- xfer .user_data = CONFIG_FTDI_RESET ;
939
921
process_ftdi_config (& xfer );
940
922
break ;
941
923
#endif
942
924
943
925
#if CFG_TUH_CDC_CP210X
944
926
case SERIAL_PROTOCOL_CP210X :
945
- // xfer.user_data = CONFIG_SET_CONTROL_LINE_STATE ;
927
+ process_cp210x_config ( & xfer ) ;
946
928
break ;
947
929
#endif
948
930
0 commit comments