This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM4378:Linux USB2.0驱动程序?

Guru**** 1475205 points
Other Parts Discussed in Thread: AM4378
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver

器件型号:AM4378

为了寻址 USB 控制器 pf AM437x、我使用的是 dwc3驱动程序。 该驱动程序仅适用于 xhci-hcd。 dwc3和 xhci 通常用于寻址 USB 3.0控制器、而不是 USB 2.0。

除了同时从 USB 3.0记忆棒中读取和写入大量数据(例如在该存储器上解压缩文件)之外、上述驱动程序的组合通常效果非常好。 然后、我将收到"reset high-speed USB device number 2 using xhci-hcd"错误、需要重新安装磁盘。

排除硬件问题-我们的主板的行为与 TI EVM 主板相同-某些可在互联网上找到的文章(如 https://access.redhat.com/solutions/194273 )建议使用 USB 2.0驱动程序 EHI-hcd。 我已经尝试过这个、但是我没有找到任何方法来使 dwc3与 EHCI-hcd 一起工作或者通过使用 dwc3的替代驱动程序。

在 Linux 中、是否有办法在 USB 2.0模式下解决 AM4378的 USB 控制器、或者是否修复了复位高速错误? 我也可以回到4.19.59、它似乎没有这个问题(我们没有进行广泛的测试)。

谢谢大家、此致

Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    您是否使用适用于 AM437x 的 TI 处理器 SDK Linux? 哪个版本?

    [引用 userid="413639" URL"~/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver 文件]该驱动程序仅适用于 xhci-hcd。 dwc3和 xhci 通常用于寻址 USB 3.0控制器、而不是 USB 2.0。

    不是真的。 XHCI 并不意味着 USB3.0控制器。

    [引用 userid="413639" URL"~/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver "]一些可在互联网上找到的文章,如 https://access.redhat.com/solutions/194273 ,建议使用 USB 2.0驱动程序 EHI-hcd。

    也不正确。 AM437x 上使用的 USB 控制器不兼容 EHCI、而是兼容 xHCI。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、如果所有这些都不正确、则有人可能需要更改驱动程序名称和内核状态消息、声明 USB 3.0。。。

    总之、您建议使用哪种解决方案?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Peter、

    [引用 userid="413639" URL"~/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver/4406594 #4406594"]有人可能需要更改 rhe 驱动程序名称和内核状态消息,声明 USB 3.0...

    我不确定我是否理解您的意见。 请详述一下。

    [引用 userid="413639" URL"~/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver/4406594 #4406594"]不管 怎样,您建议使用哪种解决方案?  [/报价]

    请回答我关于您在 AM437x 上运行什么 Linux 的第一个问题? 我需要先了解问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的刘斌:

    我正在使用 SDK 08.02.00.24、它对应于内核版本5.10.100。

    Linux 内核检测到:

    [4.118806]集线器1-0:1.0:找到 USB 集线器
    [4.122749]集线器1-0:1.0:检测到1个端口
    [4.127297] xhci-hcd xhci-hcd.0.auto: xHCI 主机控制器
    [4.132932] xhci-hcd xhci-hcd.0.auto:注册新 USB 总线、分配总线编号2
    [4.140683] xhci-hcd xhci-hcd.0.auto:主机支持 USB 3.0 SuperSpeed
    [4.147340] USB USB2:我们不知道该主机的 LPM 算法、因此禁用了 LPM。
    [4.155832] USB USB2:找到新的 USB 设备、idVendor=1d6b、idProduct=0003、bcdDevice= 5.10
    [4.164168] USB USB2:新 USB 器件字符串:MFR=3、Product=2、SerialNumber=1

    Linux 内核文档标题:

    支持 XHCI HCD (USB 3.0)
    支持 EHCI HCD (USB 2.0)

    如果未连接任何设备、lsusb 会报告:

    总线002设备001:ID 1d6b:0003 Linux Foundation 3.0根集线器
    总线001设备002:ID 24a9:205a
    总线001器件001:ID 1d6b:0002 Linux Foundation 2.0根集线器

    modinfo dwc3状态:

    文件名:/lib/modules/5.1.110/kernel/drivers/usb/dwc3/dwc3.ko
    说明:DesignWare USB3 DRD 控制器驱动程序
    许可证:GPL v2
    作者:Felipe Balbi
    别名:平台:dwc3
    srcversion:E6EE8F401C1A63BEF771D3B
    别名:共:N*T*Csynopsys, dwc3C*
    别名:共:N*T*Csynopsys, dwc3.
    别名:共:N*T*Csnps,dwc3C*
    别名:共:N*T*Csnps,dwc3.
    取决于:UDC 内核、USB 公共
    intree:Y
    名称:dwc3
    vermagic:5.1.110 SMP 抢占 mod_unload MODVERSIONS ARMv7 p2v8
    在任何情况下、我的问题是驱动程序显示 USB 3.0、问题是在连接 USB 3.0记忆棒的情况下执行繁重的读/写操作时、我收到"reset high-speed USB device number 2 using xhci-hcd"错误。 如果我使用 USB 2.0存储器、则没有问题。
    我的想法是强制控制器采用 USB 2.0模式、但如果有另一种方法阻止 Linux 通过上述错误消息重新启动 USB 驱动程序、我将非常高兴。
    此致
    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Peter、

    我知道所有这些内核消息都令人困惑、这主要是因为 xHCI 规范是如何定义的以及 USB3.x 规范和 USB2.0规范是如何共存的。 我不想在这里解释详细信息(我甚至不知道从哪里开始、所有相关的 xHCI、USB 3.x 和 USB2.0规范都有数万页...)、因为我担心它可能会给您带来更多的困惑、 如果我无法在这里的几个段落中总结相关的 USB 规范。

    相反,我认为我们需要集中注意这个问题,看看是否可以解决这个问题。 我可能需要在 AM437x EVM 上重复该问题并对其进行调试。 请描述触发错误的步骤吗? 我知道它只发生在 USB2.0记忆棒中、但如何使用它来触发错误?

    顺便说一下、您是否有指向您提到的文档的链接?

    [引用 userid="413639" URL"~/support/processors-group/processors/f/processors-forum/1171067/am4378-linux-usb2-0-driver/4406641 #4406641"]

    Linux 内核文档标题:

    支持 XHCI HCD (USB 3.0)
    支持 EHCI HCD (USB 2.0)

    [/报价]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin Liu、

    很抱歉让您等待、同时我们还做了一些测试。

    首先、您是对的:当在 AM437x 上使用 xHCI 驱动程序时、显示 USB 3.0总线、而器件通过2.0控制器连接到总线。 这样就可以了、USB 3.0集线器似乎只是虚拟的。

    但是、在我们的电路板和 EVM 电路板上、当您通过并行读取和写入操作对系统施加压力时、我们始终会重复面临相同的问题。

    场景:
    1.创建大小为500 MB 的 zip 存档文件。 在我们的案例中、未压缩的大小为2GB。
    2.将文件解压缩到同一文件夹中,以便有连续的 R/W 活动。

    结果:
    在某些时候、您将收到一 条或多条"使用 xhci-hcd"重置高速 USB 器件编号2 "消息。 随机重置将足够快、以便文件操作继续(在某些情况下甚至正确结束)、或者使 Linux 失去挂载点需要太长时间。

    在我们的所有测试中、只有最近的 USB 3.0存储器发生了这种情况、我们无法重现 USB 2.0存储器的问题。 我无法告诉您 USB 版本是否是设备速度的原因。 可能是速度问题、因为我们无法使用 USB 3.0硬盘重新生成错误。 文件系统对错误本身没有影响,只是对错误后恢复的可能性没有影响(从不使用 FAT32恢复,有时使用 exFAT 和 ext4恢复)。

    内核或 SDK 版本没有区别(使用 SDK 06.01.00.08、06.03.00.106、08.02.00.24)。 由于驱动程序支持、我们仅在08.02.00.24 (内核5.10.100)上使用 exFAT 进行了测试。

    没有机会在具有相同内核版本且仅使用 USB 2.0端口的 PC 上重现相同的行为。

    此致
    Peter

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    感谢您提供详细信息。 我将尝试复制它并查看。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin Lui、您对此案例是否有任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    很抱歉耽误你的回答。 我尝试了几个 USB 超高速拇指驱动器解压缩 AM437x GP EVM 上的800+MB 文件、但在我的测试中未发生 USB 总线重置问题。

    但是、您能否尝试使用以下内核补丁来查看它是否能够解决您的设置中的问题? 该补丁过去帮助一些客户在 USB2.0端口上使用 USB3.0拇指驱动器。

    diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
    index 2a58030d26bb..141f9c23867a 100644
    --- a/drivers/usb/core/hub.c
    +++ b/drivers/usb/core/hub.c
    @@ -4569,7 +4569,6 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev)
            struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent);
            int connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN;
    
    -       if (!udev->usb2_hw_lpm_capable || !udev->bos)
                    return;
    
            if (hub)