@@ -125,6 +125,7 @@ typedef struct {
125
125
// Invalid driver ID in itf2drv[] ep2drv[][] mapping
126
126
enum { DRVID_INVALID = 0xFFu };
127
127
enum { ADDR_INVALID = 0xFFu };
128
+ enum { CONTROLLER_INVALID = 0xFFu };
128
129
129
130
#if CFG_TUSB_DEBUG >= 2
130
131
#define DRIVER_NAME (_name ) .name = _name,
@@ -203,7 +204,7 @@ enum { CONFIG_NUM = 1 }; // default to use configuration 1
203
204
// sum of end device + hub
204
205
#define TOTAL_DEVICES (CFG_TUH_DEVICE_MAX + CFG_TUH_HUB)
205
206
206
- static bool _usbh_initialized = false ;
207
+ static uint8_t _usbh_controller = CONTROLLER_INVALID ;
207
208
208
209
// Device with address = 0 for enumeration
209
210
static usbh_dev0_t _dev0 ;
@@ -280,8 +281,8 @@ void osal_task_delay(uint32_t msec)
280
281
{
281
282
(void ) msec ;
282
283
283
- const uint32_t start = hcd_frame_number (TUH_OPT_RHPORT );
284
- while ( ( hcd_frame_number (TUH_OPT_RHPORT ) - start ) < msec ) {}
284
+ const uint32_t start = hcd_frame_number (_usbh_controller );
285
+ while ( ( hcd_frame_number (_usbh_controller ) - start ) < msec ) {}
285
286
}
286
287
#endif
287
288
@@ -335,15 +336,15 @@ static void clear_device(usbh_device_t* dev)
335
336
336
337
bool tuh_inited (void )
337
338
{
338
- return _usbh_initialized ;
339
+ return _usbh_controller != CONTROLLER_INVALID ;
339
340
}
340
341
341
- bool tuh_init (uint8_t rhport )
342
+ bool tuh_init (uint8_t controller_id )
342
343
{
343
344
// skip if already initialized
344
- if (_usbh_initialized ) return _usbh_initialized ;
345
+ if ( tuh_inited () ) return true ;
345
346
346
- TU_LOG2 ("USBH init rhport %u\r\n" , rhport );
347
+ TU_LOG2 ("USBH init on controller %u\r\n" , controller_id );
347
348
TU_LOG2_INT (sizeof (usbh_device_t ));
348
349
TU_LOG2_INT (sizeof (hcd_event_t ));
349
350
TU_LOG2_INT (sizeof (_ctrl_xfer ));
@@ -376,10 +377,11 @@ bool tuh_init(uint8_t rhport)
376
377
usbh_class_drivers [drv_id ].init ();
377
378
}
378
379
379
- TU_ASSERT (hcd_init (rhport ));
380
- hcd_int_enable (rhport );
380
+ _usbh_controller = controller_id ;;
381
+
382
+ TU_ASSERT (hcd_init (controller_id ));
383
+ hcd_int_enable (controller_id );
381
384
382
- _usbh_initialized = true;
383
385
return true;
384
386
}
385
387
@@ -721,13 +723,13 @@ uint8_t* usbh_get_enum_buf(void)
721
723
722
724
void usbh_int_set (bool enabled )
723
725
{
724
- // TODO all host controller
726
+ // TODO all host controller if multiple is used
725
727
if (enabled )
726
728
{
727
- hcd_int_enable (TUH_OPT_RHPORT );
729
+ hcd_int_enable (_usbh_controller );
728
730
}else
729
731
{
730
- hcd_int_disable (TUH_OPT_RHPORT );
732
+ hcd_int_disable (_usbh_controller );
731
733
}
732
734
}
733
735
@@ -1238,14 +1240,15 @@ static void process_enumeration(tuh_xfer_t* xfer)
1238
1240
1239
1241
#if 0
1240
1242
case ENUM_RESET_2 :
1241
- // XXX note used by now, but may be needed for some devices !?
1243
+ // TODO not used by now, but may be needed for some devices !?
1242
1244
// Reset device again before Set Address
1243
1245
TU_LOG2 ("Port reset2 \r\n" );
1244
1246
if (_dev0 .hub_addr == 0 )
1245
1247
{
1246
1248
// connected directly to roothub
1247
1249
hcd_port_reset ( _dev0 .rhport );
1248
- osal_task_delay (RESET_DELAY );
1250
+ osal_task_delay (RESET_DELAY ); // TODO may not work for no-OS on MCU that require reset_end() since
1251
+ // sof of controller may not running while reseting
1249
1252
hcd_port_reset_end (_dev0 .rhport );
1250
1253
// TODO: fall through to SET ADDRESS, refactor later
1251
1254
}
@@ -1364,7 +1367,8 @@ static bool enum_new_device(hcd_event_t* event)
1364
1367
// connected/disconnected directly with roothub
1365
1368
// wait until device is stable TODO non blocking
1366
1369
hcd_port_reset (_dev0 .rhport );
1367
- osal_task_delay (RESET_DELAY );
1370
+ osal_task_delay (RESET_DELAY ); // TODO may not work for no-OS on MCU that require reset_end() since
1371
+ // sof of controller may not running while reseting
1368
1372
hcd_port_reset_end ( _dev0 .rhport );
1369
1373
1370
1374
// device unplugged while delaying
0 commit comments