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.

[参考译文] Linux/AM3352:USB RNDIS 连接有时不起作用

Guru**** 2541200 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/763864/linux-am3352-usb-rndis-connection-doesn-t-work-at-times

器件型号:AM3352

工具/软件:Linux

我们使用的是内核版本4.9.31 (Arago Krogoth)。 我们有时面临的问题如下:

  1. 将 USB 闪存驱动器连接至系统
  2. 断开 USB 闪存驱动器
  3. 连接 USB 电缆(通过 USB 连接获得以太网(RNDIS))  
  4. 未检测到 USB 电缆。 要使其正常工作、请再次将 USB 闪存驱动器连接并断开到系统上、或者我们需要重新加载驱动程序(musb_dsp)。 执行此序列后、连接 USB 电缆会导致 RNDIS 连接正常工作

请注意、我们并非始终面临此问题。 我怀疑由于在 USB 主机和设备模式之间切换而导致这种情况。 是否有任何补丁或这是已知问题? 是否有要调试的指针或步骤?



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

    这是定制硬件吗? 您是否在 dmesg 日志中看到任何故障?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fariya、

    请在步骤2之后但在步骤3之前在电路板上运行以下命令、以获取更多信息。

    # grep DevCtl /sys/kernel/debug/musb-hdrc.0/regdump
    # cat /sys/devices/platform/ocp/47400000.usb/47401400.usb/musb-hdrc.0/mode

    这假设您使用 USB0。 如果您使用 USB1端口、请相应地调整路径。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bin Liu、

    在步骤2之后、在步骤3之前、输出如下:

    CAT /sys/devices/platform/ocp/47400000.usb/47401400.usb/musb-hdrc.0/mode
    A_WAIT_VRISE

    grep DevCtl /sys/kernel/debug/musb-hdrc.0/regdump
    Devctl:19

    是否有任何关于可能出错的输入? 为什么 USB 卡在 A_WAIT_VRISE 状态? 感谢你的帮助。

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

    此问题是由内核中的软件错误引起的。 请使用以下链接中的内核补丁来解决问题。

    e2e.ti.com/.../2779439
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Bin Liu! 这解决了问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢 Bin Liu! 修补程序解决了该问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴看到问题得到解决。 感谢您的更新。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin Liu、

    遗憾的是、应用此补丁后、一个特定的 USB 闪存驱动器未被检测到。 请注意、我的内核版本是4.9.31。  我可以看到的状态转换是 a_idle 到 a_wait_vrise --> a_idle->a_wait_vrise ... 这会持续发生、并且无法检测到器件。 如果我恢复您建议的修补程序,则会检测到设备(a_idle --> a_wait_vrise --> a_host)。 您能否建议如何解决此问题? 我需要拥有补丁(您之前提供的补丁)、因为它可以解决我的问题、但应用补丁会给我带来另一个问题、即在 USB 闪存驱动器中无法检测到什么情况。

    非常感谢您的帮助。

    谢谢
    法里亚

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

    您是否认为补丁应该已经检查(musb->port_mode =MUSB_port_mode_host || musb->port_mode =MUSB_port_mode_dual_role)而不仅仅是 musb->port_mode == MUSB_port_mode_host?

    案例 OTG_State_a_Wait_VRISE:
    if (musb->port_mode =MUSB_port_mode_host){
    musb->xceiv->OTG->state = OTG_State_a_WAIT_BCON;

    等待您的回复。

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

    否、补丁正确、我们只想为仅主机端口提高状态。

    是否仅此特定 USB 拇指驱动器出现故障或您的所有 USB 设备均出现故障?
    这是在您的定制板上还是在 TI 支持的 AM335x 平台上? 如果您的电路板、请提供原理图的 USB 部分。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bin Liu、

    这似乎是唯一一个使用最新补丁失败的 USB 拇指驱动器(如果我恢复您的补丁、相同的拇指驱动器工作正常)。 我可以给您提供您的官方 TI 电子邮件 ID、以便与您分享原理图吗?

    此致、
    法里亚
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fariya、我已向您发送了一份友谊请求、您应该会在那里看到我的电子邮件。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    USBn_ID 上不应存在电阻器。 如果需要 DRD 或仅器件操作、_ID 应悬空。 如果需要仅主机操作、则_ID 应直接绑定到 GND。

    USBn_VBUS 上没有足够的电容。 由于 VBUS 电压下降、10uF 无法可靠地用于所有 USB 器件。 尝试用120uF 替换它、并查看在主机模式下问题是否仍然存在。 请注意、使用相同的 VBUS 电容无法实现对 USB 主机和 USB 器件的100%支持、虽然10uF 是一种常见的解决方案、但不能依赖它来支持所有 USB 器件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fariya、

    我不确定这是否相关、但最近我们在驱动程序中修复了竞态条件、请应用以下补丁。

    marc.info/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我们进行了推荐的硬件修改,但仍然无法检测到特定的 USB 闪存驱动器(SanDisk 64GB)。 我们在公司内部获得了一些更相似的制造 SanDisk 闪存驱动器… 我们正在执行更多的测试、并应随时向您发布。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin、

    此修补程序不起作用。 即使在进行了硬件修改+应用此补丁+早期补丁(musb_dsp)后、我们仍然会遇到相同的检测问题。 此问题与 SanDisk 64GB 笔驱动器之一以及我们拥有的其他 SanDisk 64GB 挂起器非常一致、但我们并非一直都遇到此问题。 请注意、如果我们恢复 MUSB 驱动程序补丁、根本没有检测问题。

    请告诉我可以捕获哪些信息来帮助调试。

    此致、
    法里亚

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

    插入拇指驱动器时、您能否先使用示波器探测 USB0_VBUS 和 USB0_DRVVBUS 引脚? 基于此结果、我将为您提供如何获取内核日志的说明。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    第一次捕获是在检测到 USB 闪存驱动器时进行的。  

    以下是未检测到 USB 闪存驱动器的情况


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

    您好 Fariya、

    感谢捕获、它显示了 USB 控制器本身在这两种情况下似乎都能正常工作。 假设故障拇指驱动器是高速器件、您能否在探测中添加 D+线? 我想看看在这两种情况下 USB0_VBUS 和 D+上拉之间是否存在任何时序差异。

    如果无法同时使用3个探针、则可以移除探测 USB0_DRVVBUS 信号、因为我们知道它与 USB0_VBUS 信号的行为方式。

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

    e2e.ti.com/.../Not-detected.zip

    附件是未检测到 USB 闪存驱动器的情况下的捕获。

    此致、

    法里亚

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

    您好 Fariya、

    在工作内核中枚举此拇指驱动器是否需要比其他驱动器更长的时间?

    请在故障情况下应用以下调试补丁。 它将时间从2秒增加到10秒、我希望该驱动器可以使用此补丁进行枚举、请提供控制台枚举日志、我想检查时间戳。

    diff -git a/drivers/usb/musb_core.c b/drivers/usb/musb_core.c
    index 358fectia54945.427494e74ec2 100644
    -- a/drivers/usb/susb/smusb_core.c
    ++ b/drivers/usb/usb_musb_790,0_musb_musb_musb_musb_core.c
    @@@@
    
    MUSB -> ep0_Stage = MUSB_EP0_START;
    
    + dev_info (musb->控制器,"int 0x10\n");
    musb->intxe = musb->epmask;
    musb_writew (musb->mregs、MUSB_INTRTXE、musb->intxe);
    
    
    
    
    
    void b->inrxe = musb->epmask & 0xfffe;diff --git a/drivers/USB/musb/musb_dsps.c b/drivers/USB/musb/musb_dsps.c index 9f125e179acd.866c6801fe49 100644 -- a/drivers/usb+dsps/musb+未@@@@的 dsps/musb_statusb+dsps/musb+6、b + dsps/musb+ 6、2、musb+dsps /dsps/musb+ 6、musb+ 6、2
    musb->xceiv->OTG->state = OTG_State_a_idle;
    MUSB_HST_MODE (MUSB);
    }
    - if (!(devctl & MUSB_DEVCTL_SESSION)&&!SKIP_SESSION)
    + 如果(!(devctl & MUSB_DEVCTL_SESSION)&&!SKIP_SESSION){
    + dev_info (musb->控制器,"开始会话\n");
    MUSB 写入(mregs、MUSB_DEVCTL、MUSB_DEVCTL_SESSION);
    +}
    mod_timer (&***->timer、jiffies +
    mss_TO_jiffies (WRP->POLL_TIMEOUT);
    中断;
    @@-339、8 +341、9 @@静态 irqreturn_t DSP_interrupt (int IRQ、void * HCI)
    MUSB_HST_MODE (MUSB);
    musb->xceiv->OTG->default_a = 1;
    musb->xceiv->OTG->state = OTG_State_a_Wait_VRISE
    ;+ dev_info (musb->controller、"drvbus high\n");
    mod_timer (&***->timer、jiffies +
    - mss_TO_jiffies (WRP->POLL_TIMEOUT);
    + mss_TO_jiffies (10000));
    } 否则{
    MUSB ->是_活动= 0;
    MUSB_DEV_MODE (MUSB)
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin、

    即使在应用补丁后、也无法检测到 USB 设备。 以下是日志:

    4278.719891] musb-hdrc musb-hdrc.0:开始会话
    [4278.772454] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4278.772551] VBUS 开启(A_WAIT_VRISE)、devctl 09
    [4291.199894] musb-hdrc musb-hdrc.0:启动会话
    [4291.252740] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4291.252843] VBUS 打开(A_WAIT_VRISE)、devctl 09
    [4303.359885] musb-hdrc musb-hdrc.0:启动会话
    [4303.412777] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4303.412880] VBUS 打开(A_WAIT_VRISE)、devctl 09
    [4315.519874] musb-hdrc musb-hdrc.0:开始会话
    [4315.572738] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4315.572841] VBUS 开启(A_WAIT_VRISE)、devctl 09
    [4327.679756] musb-hdrc musb-hdrc.0:启动会话
    [4327.732517] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4327.732619] VBUS 开启(A_WAIT_VRISE)、devctl 01
    [4339.839886] musb-hdrc musb-hdrc.0:启动会话
    [4339.892456] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4339.892556] VBUS 开启(A_WAIT_VRISE)、devctl 01

    我必须为我的内核移植此修补程序(4.9.30)。 附加 musb_core.c 和 musb_dsps.c 供您参考:

    e2e.ti.com/.../4478.musb_5F00_core.ce2e.ti.com/.../musb_5F00_dsps.c

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

    USB 主机似乎等待了10秒、但仍未检测到拇指驱动器。

    在工作情况下(没有第一个修复补丁的内核)连接拇指驱动器时、您是否注意到、串行控制台显示枚举日志或枚举在插入后几乎立即发生?

    您能否将最后一个调试补丁应用到工作内核(没有第一个修复补丁)并提供内核日志? 我想检查两者之间的消息时间戳

    musb-hdrc musb-hdrc.0:drvbus 高电平
    musb-hdrc musb-hdrc.0:int 0x10
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bin、

    非常感谢 此特定的 SanDisk 驱动器无需花费太多时间(~3s)即可检测(没有任何补丁)。 但是,在我应用最新的修补程序+而没有第一个修补程序之后,似乎需要花费20秒以上的时间来检测。 以下是日志:

    [4331.599724] musb-hdrc musb-hdrc.0:启动会话
    [4331.652355] musb-hdrc musb-hdrc.0:drvbus 高电平
    [4351.894962] musb-hdrc musb-hdrc.0:int 0x10
    [4352.149603] USB 1-1:使用 musb-hdrc 的新型高速 USB 器件编号3
    [4352.328518] USB 存储设备1-1:1.0:检测到 USB 大容量存储设备
    [4352.341106] SCSI host0:USB-storage 1-1:1.0
    [4353.361494] SCSI 0:0:0:0:0:直接访问 SanDisk Cruzer 铲刀 1.00 PQ:0 ANSI:6
    [4353.36874] SD 0:0:0:0:0:[SDA] 124059648 512字节逻辑块:(63.5 GB/59.2 GiB)
    [4353.374432] SD 0:0:0:0:0:[SDA]写保护关闭
    [4353.374522] SD 0:0:0:0:0:[SDA]模式检测:43 00 00
    [4353.375533] SD 0:0:0:0:0:[SDA]写入高速缓存:禁用、读取高速缓存:启用、不支持 DPO 或 FUA
    [4353.391548] sda:sda1.
    [4353.399443] SD 0:0:0:0:[SDA]连接的 SCSI 可移动磁盘


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

    您好 Fariya、

    您是否意味着在没有任何补丁程序的情况下检测到 SanDisk 驱动器大约3秒? 请仅使用最新补丁再次执行相同的测试、但不要应用补丁中的最后一个块(这会改变计时器)。 因此、唯一的变化是3个 print 语句。 很抱歉、我昨天应该问这个测试。

    基本上不应用此块:

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

    您好、Bin Liu、

    以下是您请求的日志(从"开始会话"开始3秒、即当器件插入到"新的高速 USB 器件"时)

    1773.7598660] musb-hdrc musb-hdrc.0:启动会话

    [1773.812495] musb-hdrc musb-hdrc.0:drvbus 高电平

    [1775.924915] musb-hdrc musb-hdrc.0:int 0x10

    [1776.209768] USB 1-1:使用 musb-hdrc 的新型高速 USB 器件编号2

    [1776.389361] USB-STORAGE 1-1:1.0:检测到 USB 大容量存储设备

    [1776.405424] SCSI host0:USB-storage 1-1:1.0

    [177441514(XV) SCSI 0:0:0:0:0:直接访问    SanDisk Cruzer Blade    1.00 PQ:0 ANSI:6.

    [17746101] SD 0:0:0:0:0:[SDA] 124059648 512字节逻辑块:(63.5 GB/59.2 GiB)

    [177448091] SD 0:0:0:0:0:[SDA]写保护关闭

    [1777.448166] SD 0:0:0:0:0:[SDA]模式检测:43 00 00

    [1777.448973] SD 0:0:0:0:[SDA]写入高速缓存:禁用、读取高速缓存:启用、不支持 DPO 或 FUA

    [1777.468559] sda:sda1.

    [1777.473201] SD 0:0:0:0:[SDA]连接的 SCSI 可拆卸磁盘

     另一个迭代:

    1821.599851] musb-hdrc musb-hdrc.0:启动会话

    [1821.652488] musb-hdrc musb-hdrc.0:drvbus 高电平

    [1825.879840] musb-hdrc musb-hdrc.0:int 0x10

    [1826.139746] USB 1-1:使用 musb-hdrc 的新型高速 USB 器件编号2

    [1826.317139] USB-STORAGE 1-1:1.0:检测到 USB 大容量存储设备

    [1826.328451] SCSI host0:USB-storage 1-1:1.0

    [1827.361764] SCSI 0:0:0:0:直接访问    SanDisk Cruzer Blade    1.00 PQ:0 ANSI:6

    [1827.366732] SD 0:0:0:0:0:[SDA] 124059648 512字节逻辑块:(63.5 GB/59.2 GiB)

    [1827.36878] SD 0:0:0:0:0:[SDA]写保护关闭

    [1827.36882] SD 0:0:0:0:0:[SDA]模式检测:43 00 00 00

    [1827.373324] SD 0:0:0:0:0:[SDA]写入高速缓存:禁用、读取高速缓存:启用、不支持 DPO 或 FUA

    [1827.387482] sda:sda1.

    [1827.399143] SD 0:0:0:0:[SDA]连接的 SCSI 可移动磁盘

    此致、

    法里亚

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

    您好 Fariya、

    我查看了 MUSB 驱动程序并再次进行了一些测试、但看不到任何明显的问题、这可能会导致您在 SanDisk 驱动器上遇到枚举问题、而且我也无法复制此问题。

    您在第一篇帖子中提到了您使用内核 v4.9.31。 v4.9.31不用于任何 TI 处理器 SDK Linux 版本。 几天前发布的驱动程序文件 musb_dsps.c 和 musb_core.c 与内核社区 v4.9.31版本中的文件不匹配、在 v4.9.31版本之上还有一些附加补丁、 我想知道您使用的内核中是否有任何代码更改导致了问题。 因此、为了消除这一因素、您能否使用我发送的第一个修复补丁来测试最近发布的任何 TI Processor SDK Linux 内核的 SanDisk 拇指驱动器、以查看问题是否仍然发生?

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

    您好、Bin Liu、

    感谢您的回复。 我们使用的 Linux 内核版本是4.9.30、而不是4.9.31。

    此致、
    法里亚

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

    MUSB 驱动程序在 v4.9.30到 v4.9.31之间没有任何变化。 因此、请使用最新的 Processor SDK 内核进行测试、以便我们在同一张图片上看到。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、刘斌。 感谢你的帮助。 我们将使用最新的处理器 SDK 进行测试、并将返回。

    此致、
    法里亚
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Fariya、您好、测试是否有任何更新?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Fariya、

    我没有听到您的反馈,我认为您能够解决您的问题。 如果不是、只需在下面发布回复(如果该线程由于超时而锁定、则创建新线程)。 谢谢。