#11749·rt-thread

[Bug] [cherryusb] [EHCI] 未刷新SETUP包缓存,导致enumerate fail

Author: Memory-afkCreated Aug 25, 2026Updated Aug 28, 2026
LabelsbugBSP: NuvotonBSPArch: ARM/AArch64Componentcomponent: drivers

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);
    #endif
    
    int 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