|
1 |
| -/* |
| 1 | +/* |
2 | 2 | * The MIT License (MIT)
|
3 | 3 | *
|
4 | 4 | * Copyright (c) 2019 Ha Thach (tinyusb.org)
|
|
54 | 54 | // USBH-HCD common data structure
|
55 | 55 | //--------------------------------------------------------------------+
|
56 | 56 |
|
57 |
| -// device0 struct must be strictly a subset of normal device struct |
58 |
| -// TODO refactor later |
59 | 57 | typedef struct
|
60 | 58 | {
|
61 | 59 | // port
|
62 | 60 | uint8_t rhport;
|
63 | 61 | uint8_t hub_addr;
|
64 | 62 | uint8_t hub_port;
|
65 | 63 | uint8_t speed;
|
| 64 | + volatile uint8_t enumerating; |
66 | 65 |
|
67 |
| - struct TU_ATTR_PACKED |
68 |
| - { |
69 |
| - volatile uint8_t connected : 1; |
70 |
| - volatile uint8_t addressed : 1; |
71 |
| - volatile uint8_t configured : 1; |
72 |
| - volatile uint8_t suspended : 1; |
73 |
| - }; |
74 |
| - |
| 66 | +// struct TU_ATTR_PACKED { |
| 67 | +// uint8_t speed : 4; // packed speed to save footprint |
| 68 | +// volatile uint8_t enumerating : 1; |
| 69 | +// uint8_t TU_RESERVED : 3; |
| 70 | +// }; |
75 | 71 | } usbh_dev0_t;
|
76 | 72 |
|
77 | 73 | typedef struct {
|
@@ -402,10 +398,18 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
|
402 | 398 | switch (event.event_id)
|
403 | 399 | {
|
404 | 400 | case HCD_EVENT_DEVICE_ATTACH:
|
405 |
| - // TODO due to the shared _usbh_ctrl_buf, we must complete enumerating |
| 401 | + // due to the shared _usbh_ctrl_buf, we must complete enumerating |
406 | 402 | // one device before enumerating another one.
|
407 |
| - TU_LOG_USBH("[%u:] USBH DEVICE ATTACH\r\n", event.rhport); |
408 |
| - enum_new_device(&event); |
| 403 | + if ( _dev0.enumerating ) |
| 404 | + { |
| 405 | + TU_LOG1("[%u:] USBH Defer Attach until current enumeration complete\r\n", event.rhport); |
| 406 | + osal_queue_send(_usbh_q, &event, in_isr); |
| 407 | + }else |
| 408 | + { |
| 409 | + TU_LOG1("[%u:] USBH DEVICE ATTACH\r\n", event.rhport); |
| 410 | + _dev0.enumerating = 1; |
| 411 | + enum_new_device(&event); |
| 412 | + } |
409 | 413 | break;
|
410 | 414 |
|
411 | 415 | case HCD_EVENT_DEVICE_REMOVE:
|
@@ -1623,6 +1627,9 @@ void usbh_driver_set_config_complete(uint8_t dev_addr, uint8_t itf_num)
|
1623 | 1627 |
|
1624 | 1628 | static void enum_full_complete(void)
|
1625 | 1629 | {
|
| 1630 | + // mark enumeration as complete |
| 1631 | + _dev0.enumerating = 0; |
| 1632 | + |
1626 | 1633 | #if CFG_TUH_HUB
|
1627 | 1634 | // get next hub status
|
1628 | 1635 | if (_dev0.hub_addr) hub_edpt_status_xfer(_dev0.hub_addr);
|
|
0 commit comments