RT-Thread / RT-Thread/rt-thread
[Bug] [cherryusb] [EHCI] 未刷新SETUP包缓存,导致enumerate fail
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 12.2k
- Forks
- 5.4k
- Avg merge
- 4d 12h
- Merged PRs (30d)
- 40
Description
RT-Thread Version
v5.2.2
Affected area
Device drivers
Hardware/BSP vendor
Nuvoton
Architecture
ARM / AArch64
Board and hardware details
N9H30
Develop Toolchain
GCC
Describe the bug
未刷新 SETUP 包缓存前
-
LOG
[I/USB] EHCI HCIVERSION:0x0095
[I/USB] EHCI HCSPARAMS:0x000012
[I/USB] EHCI HCCPARAMS:0x0000
[I/USB] EHCI ppc:1, n_ports:2, n_cc:0, n_pcc:0
[I/USB] EHCI uses tt for ls/fs device
[D/usbh_hub] Port change:0x04
[D/usbh_hub] Port change:0x04
[D/usbh_hub] Port 2 change
[D/usbh_hub] port 2, status:0x101, change:0x01
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x503, change:0x02
[I/usbh_hub] New high-speed device on Bus 0, Hub 1, Port 2 connected
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0100, wIndex 0x0000, wLength 0x0008
[D/usbh_core] Device rev=0200 cls=09 sub=00 proto=02 size=64
[D/usbh_core] Setup: bmRequestType 0x00, bRequest 0x05, wValue 0x0002, wIndex 0x0000, wLength 0x0000
[W/usbh_core] Control transfer failed, errorcode -9, retrying...
[W/usbh_core] Control transfer failed, errorcode -9, retrying...
[E/usbh_core] Failed to set devaddr,errorcode:-9
[I/usbh_core] Device on Bus 0, Hub 1, Port 2 disconnected
[E/usbh_hub] Port 2 enumerate fail
刷新 SETUP 包缓存后
-
CODE
#if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) // 刷新 SETUP 包缓存 usb_dcache_flush((uintptr_t)urb->setup, 8); #endifint usbh_submit_urb(struct usbh_urb *urb) { struct ehci_qh_hw *qh = NULL; size_t flags; int ret = 0; struct usbh_hub *hub; struct usbh_hubport *hport; struct usbh_bus *bus; if (!urb || !urb->hport || !urb->ep || !urb->hport->bus) { return -USB_ERR_INVAL; } #ifdef CONFIG_USB_DCACHE_ENABLE USB_ASSERT_MSG(!((uintptr_t)urb->setup % CONFIG_USB_ALIGN_SIZE) && !((uintptr_t)urb->transfer_buffer % CONFIG_USB_ALIGN_SIZE), "urb->setup or urb->transfer_buffer is not aligned %d", CONFIG_USB_ALIGN_SIZE); #endif bus = urb->hport->bus; /* find active hubport in roothub */ hport = urb->hport; hub = urb->hport->parent; while (!hub->is_roothub) { hport = hub->parent; hub = hub->parent->parent; } #ifdef CONFIG_USB_EHCI_WITH_OHCI if (EHCI_HCOR->portsc[hport->port - 1] & EHCI_PORTSC_OWNER) { return ohci_submit_urb(urb); } #endif if (!urb->hport->connected || !(EHCI_HCOR->portsc[hport->port - 1] & EHCI_PORTSC_CCS)) { return -USB_ERR_NOTCONN; } if (urb->errorcode == -USB_ERR_BUSY) { return -USB_ERR_BUSY; } flags = usb_osal_enter_critical_section(); urb->hcpriv = NULL; urb->errorcode = -USB_ERR_BUSY; urb->actual_length = 0; #if defined(CONFIG_USB_EHCI_DESC_DCACHE_ENABLE) // 刷新 SETUP 包缓存 usb_dcache_flush((uintptr_t)urb->setup, 8); #endif usb_osal_leave_critical_section(flags); switch (USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes)) { case USB_ENDPOINT_TYPE_CONTROL: qh = ehci_control_urb_init(bus, urb, urb->setup, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } break; case USB_ENDPOINT_TYPE_BULK: qh = ehci_bulk_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } break; case USB_ENDPOINT_TYPE_INTERRUPT: qh = ehci_intr_urb_init(bus, urb, urb->transfer_buffer, urb->transfer_buffer_length); if (qh == NULL) { return -USB_ERR_NOMEM; } break; case USB_ENDPOINT_TYPE_ISOCHRONOUS: #ifdef CONFIG_USB_EHCI_ISO ret = ehci_iso_urb_init(bus, urb); #endif break; default: break; } if (urb->timeout > 0) { /* wait until timeout or sem give */ ret = usb_osal_sem_take(qh->waitsem, urb->timeout); if (ret < 0) { goto errout_timeout; } urb->timeout = 0; ret = urb->errorcode; /* we can free qh when waitsem is done */ ehci_qh_free(bus, qh); } return ret; errout_timeout: urb->timeout = 0; usbh_kill_urb(urb); return ret; } -
LOG
[I/USB] EHCI HCIVERSION:0x0095
[I/USB] EHCI HCSPARAMS:0x000012
[I/USB] EHCI HCCPARAMS:0x0000
[I/USB] EHCI ppc:1, n_ports:2, n_cc:0, n_pcc:0
[I/USB] EHCI uses tt for ls/fs device
[D/usbh_hub] Port change:0x04
[D/usbh_hub] Port change:0x04
[D/usbh_hub] Port 2 change
[D/usbh_hub] port 2, status:0x101, change:0x01
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x101, change:0x00
[D/usbh_hub] Port 2, status:0x503, change:0x02
[I/usbh_hub] New high-speed device on Bus 0, Hub 1, Port 2 connected
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0100, wIndex 0x0000, wLength 0x0008
[D/usbh_core] Device rev=0200 cls=09 sub=00 proto=02 size=64
[D/usbh_core] Setup: bmRequestType 0x00, bRequest 0x05, wValue 0x0002, wIndex 0x0000, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0100, wIndex 0x0000, wLength 0x0012
[I/usbh_core] New device found,idVendor:1a86,idProduct:8091,bcdDevice:1310
[I/usbh_core] The device has 1 bNumConfigurations
[D/usbh_core] The device selects config 0
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0200, wIndex 0x0000, wLength 0x0009
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0200, wIndex 0x0000, wLength 0x0029
[I/usbh_core] The device has 1 interfaces
[D/usbh_core] Setup: bmRequestType 0x00, bRequest 0x09, wValue 0x0001, wIndex 0x0000, wLength 0x0000
[I/usbh_core] Enumeration success, start loading class driver
[I/usbh_core] Loading hub class driver on interface 0
[D/usbh_core] Setup: bmRequestType 0xa0, bRequest 0x06, wValue 0x2900, wIndex 0x0000, wLength 0x0009
[D/usbh_hub] Hub Descriptor:
[D/usbh_hub] bLength: 0x09
[D/usbh_hub] bDescriptorType: 0x29
[D/usbh_hub] bNbrPorts: 0x04
[D/usbh_hub] wHubCharacteristics: 0x0020
[D/usbh_hub] bPwrOn2PwrGood: 0x30
[D/usbh_hub] bHubContrCurrent: 0x64
[D/usbh_hub] DeviceRemovable: 0x00
[D/usbh_hub] PortPwrCtrlMask: 0xff
[I/usbh_hub] Ep=81 Attr=03 Mps=1 Interval=12 Mult=00
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x03, wValue 0x0008, wIndex 0x0001, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x03, wValue 0x0008, wIndex 0x0002, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x03, wValue 0x0008, wIndex 0x0003, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x03, wValue 0x0008, wIndex 0x0004, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] port 1, status:0x101, change:0x01
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0002, wLength 0x0004
[D/usbh_hub] port 2, status:0x100, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0003, wLength 0x0004
[D/usbh_hub] port 3, status:0x100, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0004, wLength 0x0004
[D/usbh_hub] port 4, status:0x100, change:0x00
[I/usbh_hub] Register HUB Class:/dev/hub2
[D/usbh_hub] Port change:0x02
[D/usbh_hub] Port 1 change
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] port 1, status:0x101, change:0x01
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x01, wValue 0x0010, wIndex 0x0001, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x101, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x101, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x101, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x101, change:0x00
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x101, change:0x00
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x03, wValue 0x0004, wIndex 0x0001, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0xa3, bRequest 0x00, wValue 0x0000, wIndex 0x0001, wLength 0x0004
[D/usbh_hub] Port 1, status:0x503, change:0x10
[D/usbh_core] Setup: bmRequestType 0x23, bRequest 0x01, wValue 0x0014, wIndex 0x0001, wLength 0x0000
[I/usbh_hub] New high-speed device on Bus 0, Hub 2, Port 1 connected
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0100, wIndex 0x0000, wLength 0x0008
[D/usbh_core] Device rev=0200 cls=00 sub=00 proto=00 size=64
[D/usbh_core] Setup: bmRequestType 0x00, bRequest 0x05, wValue 0x0003, wIndex 0x0000, wLength 0x0000
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0100, wIndex 0x0000, wLength 0x0012
[I/usbh_core] New device found,idVendor:0951,idProduct:1665,bcdDevice:0110
[I/usbh_core] The device has 1 bNumConfigurations
[D/usbh_core] The device selects config 0
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0200, wIndex 0x0000, wLength 0x0009
[D/usbh_core] Setup: bmRequestType 0x80, bRequest 0x06, wValue 0x0200, wIndex 0x0000, wLength 0x0020
[I/usbh_core] The device has 1 interfaces
[D/usbh_core] Setup: bmRequestType 0x00, bRequest 0x09, wValue 0x0001, wIndex 0x0000, wLength 0x0000
[I/usbh_core] Enumeration success, start loading class driver
[I/usbh_core] Loading msc class driver on interface 0
[D/usbh_core] Setup: bmRequestType 0xa1, bRequest 0xfe, wValue 0x0000, wIndex 0x0000, wLength 0x0001
[I/usbh_msc] Get max LUN:1
[I/usbh_msc] Ep=81 Attr=02 Mps=512 Interval=00 Mult=00
[I/usbh_msc] Ep=02 Attr=02 Mps=512 Interval=00 Mult=00
[I/usbh_msc] Register MSC Class:/dev/sda
[D/usbh_hub] Port change:0x00
[D/usbh_hub] Port change:0x00
[D/usbh_hub] Port change:0x00
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000000
[D/usbh_msc] flags: 0x00
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x06
[D/usbh_msc] CB:
[D/usbh_msc] 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000024
[D/usbh_msc] flags: 0x80
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x06
[D/usbh_msc] CB:
[D/usbh_msc] 0x12 0x00 0x00 0x00 0x24 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000008
[D/usbh_msc] flags: 0x80
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x0a
[D/usbh_msc] CB:
[D/usbh_msc] 0x25 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
[I/usbh_msc] Capacity info:
[I/usbh_msc] Block num:30277632,block size:512
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000200
[D/usbh_msc] flags: 0x80
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x0a
[D/usbh_msc] CB:
[D/usbh_msc] 0x28 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000200
[D/usbh_msc] flags: 0x80
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x0a
[D/usbh_msc] CB:
[D/usbh_msc] 0x28 0x00 0x00 0x00 0x1f 0x80 0x00 0x00
[D/usbh_msc] 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
[D/usbh_msc] CBW:
[D/usbh_msc] signature: 0x43425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] datlen: 0x00000200
[D/usbh_msc] flags: 0x80
[D/usbh_msc] lun: 0x00
[D/usbh_msc] cblen: 0x0a
[D/usbh_msc] CB:
[D/usbh_msc] 0x28 0x00 0x00 0x00 0x1f 0x81 0x00 0x00
[D/usbh_msc] 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
[D/usbh_msc] CSW:
[D/usbh_msc] signature: 0x53425355
[D/usbh_msc] tag: 0x00000000
[D/usbh_msc] residue: 0x00000000
[D/usbh_msc] status: 0x00
udisk: /dev/sda mount successfully
Other additional context
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by locating usbh_submit_urb and the CONFIG_USB_EHCI_DESC_DCACHE_ENABLE path, then compare the failed and successful EHCI enumeration logs on the N9H30. Confirm that setup requests enumerate the device successfully with data-cache handling enabled, without regressing other USB transfers.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c
- Domain
- embedded-iot, operating-systems
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 52/100