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 小工具

Guru**** 2581915 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/627474/linux-am3352-dynamic-reconfiguration-of-usb-gadget

器件型号:AM3352

工具/软件:Linux

抱歉、我是交叉发帖、 原始未回答的帖子、请点击此处

您好!

我帮助的客户是将 AM3352 与处理器 SDK 02.00.01.07搭配使用。

此产品正在生产中、并由终端客户使用。

新功能请求导致工厂需要加载特殊值。

目前、USB 子系统配置为具有大容量存储小工具配置的外设。 这种情况一直很好。

为了使工厂能够以更自动化的方式与器件交互、我们尝试将小工具从大容量存储器件动态重新配置为串行 ACM 小工具器件。 我们不希望两者同时配置。 我们只想在出厂时配置 USB 串行端口小工具。

这不奏效。

为了动态重新配置、我尝试定义了两个可能的小工具、例如:

/sys/kernel/config/usb_gadget/massStorageGadget

/sys/kernel/config/usb_gadget/serialGadget

然后、只需使用以下命令禁用大容量存储小工具:

回显"">/sys/kernel/config/usb_gadget/massStorageGadget/UDC

并使用以下命令启用串行端口小工具:

回显"musb-hdrc.0.auto">/sys/kernel/config/usb_gadget/serialGadget/UDC

这似乎可以正常工作、直到我们将 USB 电缆连接到器件、然后我们在 dmesg 中看到以下错误消息:

[839.828577] Mass Storage Function,版本:2009/09/11
[839.834234] LUN:可移动文件:(无介质)
[839.920019] LUN 数量=1
[839.924408] UDC musb-hdrc.0.auto:注册 UDC 驱动程序[massStorageGadget]
[839.924503] configfs-gadget 小工具:添加'Mass Storage function'/cf558d00至 config 'c1'/cf4c9c98
[839.927476] configfs-gadget 小工具:I/O 线程 pid:310
[839.927544] configfs-gadget musb-hdrc.0.auto: USB_gadget_UDC_start
[839.928461] mass _storage.ms0/lun.0:打开后备文件:/dev/mmcblk0p6
[888.788641] configfs-gadget musb-hdrc.0.auto:取消注册 UDC 驱动程序[massStorageGadget]
[888.791621] configfs-gadget musb-hdrc.0.auto: USB_gadget_UDC_stop
[888.791706] configfs-gadget 小工具:解除绑定函数'My Storage Function'/cf558d00
[888.813452] configfs-gadget 小工具:解除绑定
[896.092545] userial_init:注册的4个 ttyGS*设备
[896.286606] UDC musb-hdrc.0.auto:注册 UDC 驱动程序[serialGadget]
[896.286763] configfs-gadget 小工具:将'ACM'/cf242e40添加到 config 'c1'/cc21ea98
[896.286837] configfs-gadget 小工具:ACM ttyGS0:双速输入/ep1in 输出/ep1out 通知/ep2in
[896.286873] configfs-gadget musb-hdrc.0.auto: USB_gadget_UDC_start
[903.351816] musb_h_ep0_IRQ 1164:结束0无 URB
[903.356656] musb_h_ep0_IRQ 1164:结束0无 URB
[904.593829] musb_h_ep0_IRQ 1164:结束0无 URB

< "no="" urb="" for="" end="" 0"="" msg="" multiple="" times="">>

查看驱动程序代码、"no URB for end 0"似乎是一个致命问题或"should not eur"错误。

主机 PC 此时未检测到器件。

有什么想法吗? 我找到启用串行端口的唯一方法是重新引导并仅启用串行小工具。 我还可以在单个复合小工具中同时启用串行和大容量存储、这是可行的、但这并不是理想的、因为现在我们的最终客户需要配置 Windows。 (如预期的那样、可与 Linux 完美配合使用。)。

此外、仅禁用大容量存储小工具并重新启用大容量存储小工具会导致相同的"端0无 URB "问题、主机 PC 再次看不到器件。 我必须重新引导设备才能再次启用小工具。

因此、问题如下:

*如何动态重新配置外设 USB 设置? 这是可行的吗?

*是否有办法在 Linux 中"硬复位" USB 子系统而无需重新启动器件/Linux?

*或者、我们如何将串行端口动态添加到已配置为大容量存储的复合小工具中?

非常感谢、

Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew、

    很抱歉我迟到了。

    [引用用户="Matthew Eshlemlem"]如何动态重新配置外围设备 USB 设置? 这是可行的吗?

    根据"动态"的方式、触发重新配置的因素、这是可能的。

    [引用用户="Matthew Eshlemlem"]是否可以在不重启器件/Linux 的情况下"硬重置"Linux 中的 USB 子系统?

    是的、您可以取消绑定/绑定 USB 控制器驱动程序、它将重置控制器。

    [引用 user="Matthew Eshleman "]我们如何将串行端口动态添加到已配置为大容量存储的复合小工具中?[/quot]

    下面随附的是我很久以前编写的 bash 脚本,它显示了如何创建具有多个函数的复合小工具驱动程序。 该脚本还可以撕下复合文件(使用-d 选项),并且可以多次运行该脚本以重复创建/销毁复合文件。 希望此脚本能为您提供一些有关如何解决问题的提示。

    e2e.ti.com/.../usbconfigfs.sh.txt 

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

    您好、 刘斌、

    非常感谢您的脚本。 它可以与脚本中提供的 USB 函数配合使用。

    但是、一旦我添加大容量存储功能、此脚本似乎与我当前尝试的问题相同... 禁用后再重新启用后、它不起作用、我开始看到相同的错误消息:

    "musb_h_ep0_IRQ 1164:端0无 URB "

    如果您有时间,是否可以创建与大容量存储配合使用的脚本? 您的脚本与我以前的方法基本相同、但我们需要大容量存储。 我猜这仍然是一个驱动器问题、但也许 TI 知道解决方法。

    因此、我报告的问题似乎是大容量存储功能所特有的。

    如果需要任何其他信息、请告诉我。

    此致、

    Matthew

    https://covemountainsoftware.com/consulting/

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

    Mattew、

    我还没有机会尝试一下。 但是、它是否仅在复合小工具中存在其他小工具函数时失败、甚至仅在 mass_storage.usb0本身时失败?

    要查看故障、您是否必须将 AM335x USB 端口连接到 USB 主机才能完成枚举? 或者无需连接到 USB 主机?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这种情况仅发生在大容量存储小工具上。

    断开 USB 连接时执行重新配置。 然后、是的、必须在重新配置后连接到主机。 这是错误发生且无任何作用的情况。 查看我的原始帖子以了解日志和错误消息...

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

    Matthew、

    我修改了我的脚本(附在下面)以创建 mass 存储功能、但仍然无法看到问题、我一直重复运行命令"usbconfigfs.sh"和"usbconfigfs.sh -d"。 您能告诉我错过了哪个步骤来触发故障吗?

    e2e.ti.com/.../8154.usbconfigfs.sh.txt

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

    非常奇怪。 我当然能够在第二天复制以前的脚本,但现在我无法复制以前的脚本或新的脚本。

    我将继续调查这些差异。 非常感谢您的回答和帮助。

    在我向前迈进的过程中、有一件事可能会有所帮助、这条错误消息到底意味着什么? 如果我理解了这条消息、可能会有所帮助...

    [903.351816] musb_h_ep0_IRQ 1164:结束0无 URB


    再次感谢您的帮助!

    Matthew

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

    没关系。 再次尝试、突然再次出现此错误。 必须涉及微妙的计时问题? 不确定。

    附件是使用新脚本再次发生此问题的日志。 重现步骤:

    1) 1)使用 SDK 02.00.01.07。

    2) 2)运行脚本

    3) 3)连接到 PC。 确认有效连接。

    4)运行脚本-d (teardown)

    5)断开(不确定断开时是否重要)

    6) 6)运行脚本

    7) 7)重新连接到 PC

    8) 8)确认连接、同时检查设备上的 dmesg。

    9) 9)重复。

    在过去、此问题在步骤7中立即发生。 但今天我不得不重复所有步骤、可能是在发生前10次。

    此外、正如您将在捕获的 dmesg 输出中看到的、我还在串行端口和海量存储配置之间交换了数据。 也许这是关键点。

    再次感谢您、

    Matthew

    e2e.ti.com/.../dmesgLogUsbIssue.txt

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

    [引用用户="Matthew Eshlemlem"[903.351816] musb_h_ep0_IRQ 1164:结尾0没有 URB

    啊,我应该更多地注意这个日志消息。 我知道"端0没有 URB "意味着 endpoint0有中断、但 ISR 在要处理的队列中找不到 URB、这是一个不应该发生的错误条件。 但直到现在、我才意识到日志消息具有"musb_h_ep0_IRQ"、这是一种主机模式功能。 不应调用此函数、因为在此用例中 USB 控制器应处于外设模式。

    在较旧的内核中有一个驱动程序错误、但在较新的内核中已修复、在临界情况下无法正确检查控制器模式。 我想这可能是驱动程序进入错误路由的原因-主机模式。 您是否可以切换到最新的 AM335x 内核以测试问题是否仍然发生?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于此器件已经上市、我们目前担心内核的改变。 我*可以*将其作为实验进行更改。 但是、奇怪的是、是否有一个可能有用的确切补丁?

    是的、哪个最接近 SDK 02.00.01.07的 SDK 内核具有此修复程序?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Matthew、

    我刚刚在 SDK 2.0.1.7中检查了内核、该内核应该已经有修复程序。 是否可以连接您的驱动程序/USB/MUSB / MUSB 内核.c? 我想仔细检查一下。

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

    我们的 DTS 文件具有:

    usb0{(&U)

    状态="正常";

    DR_MODE ="外设";

    };

    附加的是 musb_core.c 文件。

    谢谢!

    e2e.ti.com/.../musb_5F00_core.c

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

    Mattew、

    我在司机中发现了一个可疑的地方。 您能否在 SDK 2.0.1.7内核中应用以下调试补丁、并查看问题发生时日志中是否显示 DEV_ERR 消息?

    diff --git a/drivers/usb/structureb/musb_gadget.c b/drivers/usb/musb/gadb_gadget.c
    index 4c481cd66c77..a05f6f39dbf8 100644
    -- a/drivers/USB/musb/musb_musb_g.c
    +++b/musb_b_dusb_b_b_b_200b
    @@@@ b
    
    切换(musb->xceiv->OTG->状态){
    默认值:
    - dev_dbg (musb->控制器,"未处理的断开%s,设置 a_idle\n"
    ,+ DEV_ERR(Musb->controller),“未处理的断开%s,设置 A_idle\n?,
    USB_OTG_STACE_STRING (musb->xceiv->OTG->state));
    musb->xceiv->OTG->state = OTG_State_a_idle;
    MUSB_HST_MODE (MUSB);
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Mattew、您的 DTS 和 musb_core.c 看起来是正确的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    好的、我重建了内核和模块、并根据您的请求进行了安装。

    然后、我执行了以下操作:

    *确认我们的正常应用程序工作正常(快速检查)

    *重新启动

    * ssh

    *运行新脚本创建大容量存储设备

    *连接到 PC

    *不执行任何操作(我记得之前的操作中、我将生成的驱动器格式化为 FAT、这次我没有执行任何操作)

    *拔下电缆(在主机 PC 上未弹出或执行任何操作)

    *使用-d 运行脚本(断开)

    *只为串行端口配置运行脚本

    *连接电缆。

    *错误、不起作用。 (这一次是第一次尝试)

    连接的是 dmesg 输出。

    e2e.ti.com/.../dmesgLogUsbIssueWithChange.txt

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

    mattew、

    我仍然无法在我的身边重现此问题。

    dmesg 日志"未处理的断开转换(A_IDLE)"的最后一行发生在应用调试补丁之前的前面、对吧?

    在某种程度上、驱动程序运行到主机模式、USB 控制器产生了断开事件。 我不确定如何操作、以前从未见过此问题。

    是否可以恢复最后一个调试补丁并应用以下补丁? 希望它能给正在发生的事情带来一些胶水。

    e2e.ti.com/.../usbgadgetfs_2D00_debug.diff.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、上一个帖子中的补丁中有一个拼写错误。 第9行是
    DEV_ERR (musb_controller、...)
    应该是什么
    DEV_ERR(Musb->controller,...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请改用以下调试补丁。

    e2e.ti.com/.../1374.usbgadgetfs_2D00_debug.diff.txt

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

    谢谢你。 该报告再次转载。 步骤为:

    *重新启动

    * ssh

    *运行新脚本创建大容量存储设备

    *连接到 PC (在本例中为 Mac OS、BTW)

    *不执行任何操作(我记得在之前的操作中、我将生成的驱动器格式化为 FAT、这次我没有执行任何操作)

    *拔下电缆(我没有弹出主机 PC 或执行任何操作)

    *使用-d 运行脚本(断开)

    *为仅串行端口配置(或仅大容量存储配置)运行脚本

    *连接电缆。

    *错误,USB 无法正常工作。 (这一次是第一次尝试)(注:必须重新引导才能恢复)

      *注:只有当我将 USB 电缆连接到 PC 时,才会出现错误。

    此外,我只能使用大容量存储脚本进行复制。 即、创建大容量存储、连接到 PC、断开连接、拆卸、 创建大容量存储、连接到 PC、错误...  也为此附加了日志。

    附件是两个 dmesg 日志。

    e2e.ti.com/.../dmesgLogUsbIssueWithMoreDebugChanges.txt

    e2e.ti.com/.../dmesgLogUsbIssueWithMoreDebugChangesMassStorageOnly.txt

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

    Matthew、

    好的、这两个日志都显示已生成 SESSREQ 中断、这会导致驱动器过渡到主机模式路由。 SESSREQ 中断是 USB OTG 协议的一部分、这是我们从未需要的。 我想您的电路板硬件设计存在与 SESSREQ 中断相关的问题。

    现在、我认为您有两个选择:

    1.发送电路板原理图进行审阅。 但是、由于它已经投入生产、我想我们无论如何都无法修改电路板

    2.您可以应用以下权变措施补丁、忽略 SESSREQ 中断。 这将为您解决问题。

    diff --git a/drivers/usb/musb_core.c b/drivers/USB/musb/musb_core.c
    index 08a69f4f4d5a.793080d27a2b 100644
    -- a/drivers/usb/structure/musb_core.c
    ++ b/drivers/usb/usb_musb_musb_musb_10064b --/musb_musb_musb_musb_musb_musb_musb_musb_musb_musb.c +
    @@ 60b @@、musb_musb_musb_musb_mus_
    IF (int_USB 和 MUSB_INTR_SESSREQ){
    void __iomem *mbase = musb->mregs;
    
    + 返回 IRQ_Handled;
    +
    如果((devctl & MUSB_DEVCTL_VBUS)== MUSB_DEVCTL_VBUS
    &&(devctl & MUSB_DEVCTL_BDEVICE){
    dev_dbg (musb->控制器,“SessReq while on B state”);
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢! 此修补程序似乎可以解决问题。 我现在已经创建/连接/销毁/断开连接/创建/连接了很多次、到目前为止没有任何故障。

    我也已将您的意见告知硬件团队。
    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴问题得到解决。 感谢您的更新。