40
40
bNumConfigurations 1
41
41
*
42
42
*/
43
-
44
43
#ifdef ARDUINO_ARCH_RP2040
45
44
// pio-usb is required for rp2040 host
46
45
#include " pio_usb.h"
63
62
#include " Adafruit_TinyUSB.h"
64
63
65
64
#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421
65
+
66
66
#include " SPI.h"
67
67
68
68
// USB Host object using MAX3421E: SPI, CS, INT
@@ -86,18 +86,20 @@ typedef struct {
86
86
dev_info_t dev_info[CFG_TUH_DEVICE_MAX] = { 0 };
87
87
88
88
#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421
89
+
89
90
void setup () {
90
91
Serial.begin (115200 );
91
- // while ( !Serial ) delay(10); // wait for native usb
92
-
93
- Serial.println (" TinyUSB Dual Device Info Example" );
94
92
95
- // run host stack on controller (rhport) 1
93
+ // init host stack on controller (rhport) 1
96
94
USBHost.begin (1 );
95
+
96
+ while ( !Serial ) delay (10 ); // wait for native usb
97
+ Serial.println (" TinyUSB Dual Device Info Example" );
97
98
}
98
99
99
100
void loop () {
100
101
USBHost.task ();
102
+ Serial.flush ();
101
103
}
102
104
103
105
#elif defined(ARDUINO_ARCH_RP2040)
@@ -171,19 +173,20 @@ void loop1() {
171
173
// --------------------------------------------------------------------+
172
174
// TinyUSB Host callbacks
173
175
// --------------------------------------------------------------------+
174
- void print_device_descriptor (tuh_xfer_t * xfer);
176
+ void print_device_descriptor (tuh_xfer_t *xfer);
177
+
175
178
void utf16_to_utf8 (uint16_t *temp_buf, size_t buf_len);
176
179
177
180
void print_lsusb (void ) {
178
181
bool no_device = true ;
179
- for ( uint8_t daddr = 1 ; daddr < CFG_TUH_DEVICE_MAX+ 1 ; daddr++ ) {
182
+ for (uint8_t daddr = 1 ; daddr < CFG_TUH_DEVICE_MAX + 1 ; daddr++) {
180
183
// TODO can use tuh_mounted(daddr), but tinyusb has an bug
181
184
// use local connected flag instead
182
- dev_info_t * dev = &dev_info[daddr- 1 ];
183
- if ( dev->mounted ) {
185
+ dev_info_t * dev = &dev_info[daddr - 1 ];
186
+ if (dev->mounted ) {
184
187
Serial.printf (" Device %u: ID %04x:%04x %s %s\r\n " , daddr,
185
188
dev->desc_device .idVendor , dev->desc_device .idProduct ,
186
- (char *) dev->manufacturer , (char *) dev->product );
189
+ (char *) dev->manufacturer , (char *) dev->product );
187
190
188
191
no_device = false ;
189
192
}
@@ -195,39 +198,35 @@ void print_lsusb(void) {
195
198
}
196
199
197
200
// Invoked when device is mounted (configured)
198
- void tuh_mount_cb (uint8_t daddr)
199
- {
201
+ void tuh_mount_cb (uint8_t daddr) {
200
202
Serial.printf (" Device attached, address = %d\r\n " , daddr);
201
203
202
- dev_info_t * dev = &dev_info[daddr- 1 ];
204
+ dev_info_t * dev = &dev_info[daddr - 1 ];
203
205
dev->mounted = true ;
204
206
205
207
// Get Device Descriptor
206
208
tuh_descriptor_get_device (daddr, &dev->desc_device , 18 , print_device_descriptor, 0 );
207
209
}
208
210
209
211
// / Invoked when device is unmounted (bus reset/unplugged)
210
- void tuh_umount_cb (uint8_t daddr)
211
- {
212
+ void tuh_umount_cb (uint8_t daddr) {
212
213
Serial.printf (" Device removed, address = %d\r\n " , daddr);
213
- dev_info_t * dev = &dev_info[daddr- 1 ];
214
+ dev_info_t * dev = &dev_info[daddr - 1 ];
214
215
dev->mounted = false ;
215
216
216
217
// print device summary
217
218
print_lsusb ();
218
219
}
219
220
220
- void print_device_descriptor (tuh_xfer_t * xfer)
221
- {
222
- if ( XFER_RESULT_SUCCESS != xfer->result )
223
- {
221
+ void print_device_descriptor (tuh_xfer_t *xfer) {
222
+ if (XFER_RESULT_SUCCESS != xfer->result ) {
224
223
Serial.printf (" Failed to get device descriptor\r\n " );
225
224
return ;
226
225
}
227
226
228
227
uint8_t const daddr = xfer->daddr ;
229
- dev_info_t * dev = &dev_info[daddr- 1 ];
230
- tusb_desc_device_t * desc = &dev->desc_device ;
228
+ dev_info_t * dev = &dev_info[daddr - 1 ];
229
+ tusb_desc_device_t * desc = &dev->desc_device ;
231
230
232
231
Serial.printf (" Device %u: ID %04x:%04x\r\n " , daddr, desc->idVendor , desc->idProduct );
233
232
Serial.printf (" Device Descriptor:\r\n " );
@@ -244,23 +243,26 @@ void print_device_descriptor(tuh_xfer_t* xfer)
244
243
245
244
// Get String descriptor using Sync API
246
245
Serial.printf (" iManufacturer %u " , desc->iManufacturer );
247
- if (XFER_RESULT_SUCCESS == tuh_descriptor_get_manufacturer_string_sync (daddr, LANGUAGE_ID, dev->manufacturer , sizeof (dev->manufacturer )) ) {
246
+ if (XFER_RESULT_SUCCESS ==
247
+ tuh_descriptor_get_manufacturer_string_sync (daddr, LANGUAGE_ID, dev->manufacturer , sizeof (dev->manufacturer ))) {
248
248
utf16_to_utf8 (dev->manufacturer , sizeof (dev->manufacturer ));
249
- Serial.printf ((char *) dev->manufacturer );
249
+ Serial.printf ((char *) dev->manufacturer );
250
250
}
251
251
Serial.printf (" \r\n " );
252
252
253
253
Serial.printf (" iProduct %u " , desc->iProduct );
254
- if (XFER_RESULT_SUCCESS == tuh_descriptor_get_product_string_sync (daddr, LANGUAGE_ID, dev->product , sizeof (dev->product ))) {
254
+ if (XFER_RESULT_SUCCESS ==
255
+ tuh_descriptor_get_product_string_sync (daddr, LANGUAGE_ID, dev->product , sizeof (dev->product ))) {
255
256
utf16_to_utf8 (dev->product , sizeof (dev->product ));
256
- Serial.printf ((char *) dev->product );
257
+ Serial.printf ((char *) dev->product );
257
258
}
258
259
Serial.printf (" \r\n " );
259
260
260
261
Serial.printf (" iSerialNumber %u " , desc->iSerialNumber );
261
- if (XFER_RESULT_SUCCESS == tuh_descriptor_get_serial_string_sync (daddr, LANGUAGE_ID, dev->serial , sizeof (dev->serial ))) {
262
+ if (XFER_RESULT_SUCCESS ==
263
+ tuh_descriptor_get_serial_string_sync (daddr, LANGUAGE_ID, dev->serial , sizeof (dev->serial ))) {
262
264
utf16_to_utf8 (dev->serial , sizeof (dev->serial ));
263
- Serial.printf ((char *) dev->serial );
265
+ Serial.printf ((char *) dev->serial );
264
266
}
265
267
Serial.printf (" \r\n " );
266
268
@@ -276,21 +278,21 @@ void print_device_descriptor(tuh_xfer_t* xfer)
276
278
277
279
static void _convert_utf16le_to_utf8 (const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) {
278
280
// TODO: Check for runover.
279
- (void )utf8_len;
281
+ (void ) utf8_len;
280
282
// Get the UTF-16 length out of the data itself.
281
283
282
284
for (size_t i = 0 ; i < utf16_len; i++) {
283
285
uint16_t chr = utf16[i];
284
286
if (chr < 0x80 ) {
285
287
*utf8++ = chr & 0xff ;
286
288
} else if (chr < 0x800 ) {
287
- *utf8++ = (uint8_t )(0xC0 | (chr >> 6 & 0x1F ));
288
- *utf8++ = (uint8_t )(0x80 | (chr >> 0 & 0x3F ));
289
+ *utf8++ = (uint8_t ) (0xC0 | (chr >> 6 & 0x1F ));
290
+ *utf8++ = (uint8_t ) (0x80 | (chr >> 0 & 0x3F ));
289
291
} else {
290
292
// TODO: Verify surrogate.
291
- *utf8++ = (uint8_t )(0xE0 | (chr >> 12 & 0x0F ));
292
- *utf8++ = (uint8_t )(0x80 | (chr >> 6 & 0x3F ));
293
- *utf8++ = (uint8_t )(0x80 | (chr >> 0 & 0x3F ));
293
+ *utf8++ = (uint8_t ) (0xE0 | (chr >> 12 & 0x0F ));
294
+ *utf8++ = (uint8_t ) (0x80 | (chr >> 6 & 0x3F ));
295
+ *utf8++ = (uint8_t ) (0x80 | (chr >> 0 & 0x3F ));
294
296
}
295
297
// TODO: Handle UTF-16 code points that take two entries.
296
298
}
@@ -318,6 +320,5 @@ void utf16_to_utf8(uint16_t *temp_buf, size_t buf_len) {
318
320
size_t utf8_len = _count_utf8_bytes (temp_buf + 1 , utf16_len);
319
321
320
322
_convert_utf16le_to_utf8 (temp_buf + 1 , utf16_len, (uint8_t *) temp_buf, buf_len);
321
- ((uint8_t *) temp_buf)[utf8_len] = ' \0 ' ;
323
+ ((uint8_t *) temp_buf)[utf8_len] = ' \0 ' ;
322
324
}
323
-
0 commit comments