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/AM3358:MUSB 驱动程序和端点使用

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/778528/linux-am3358-musb-driver-and-endpoint-usage

器件型号:AM3358

工具/软件:Linux


我们有大量的 USB 串行器件、我们的主机软件需要与这些器件进行主动通信。 我们使用的是 AM3358、并且在 TISDK 版本05.00.15上。

USB 设备树如下所示:
/:总线01.Port 1:DEV 1、class="root_hub"、Driver=musb-hdrc/1p、480M
  ||端口1:DEV 2、If 0、class="Hub"、Driver=hub/7p、480M
    端口1:DEV 8,如果为0,则为“集线器”,驱动程序=集线器/2p,12M
      ||端口2:DEV 10、IF 1、class="CDC"数据、Driver=CDC_ACM、12M
      ||端口2:DEV 10、If 0、CLASS="Communications"、Driver=CDC_ACM、12M
      ||端口1:DEV 9、If 0、CLASS="Communications"、Driver=CDC_ACM、12M
      ||端口1:DEV 9、If 1、class="CDC" Data、Driver=CDC_ACM、12M
    端口2:DEV 5、If 0、class="Hub"、Driver=hub/2p、480M
      端口1:DEV 6、If 1、class="CDC" Data、Driver=CDC_ETH,480M
      端口1:DEV 6、If 0、CLASS="Communications"、Driver=CDC_ETher、480M
      ||端口2:DEV 11、If 0、CLASS="Communications"、Driver=CDC_ACM、12M
      ||端口2:DEV 11、If 1、class="CDC" Data、Driver=CDC_ACM、12M
    ||端口4:DEV 7、IF 1、class="CDC"数据、Driver=CDC_ACM、480M
    ||端口4:DEV 7、If 0、CLASS="Communications (如果为0、则为"通信")、Driver=CDC_ACM、480M
    ||端口5:DEV 13、If 0、class="Hub"、Driver=hub/4p、480M
      ||端口4:DEV 14、If 0、CLASS="Communications"、Driver=CDC_ACM、12M
      ||端口4:DEV 14、IF 1、class="CDC"数据、Driver=CDC_ACM、12M
    ||端口6:DEV 12、If 0、CLASS="Communications"、Driver=CDC_ACM、12M
    ||端口6:DEV 12、IF 1、class="CDC"数据、Driver=CDC_ACM、12M

从读取 USB 描述符开始、所有这些器件都需要1个中断 EP IN、1个批量 EP IN 和1个批量 EP OUT。

当尝试一次打开每个 ACM 设备时、我在最后一个设备上撞到墙上、但 dmesg 中出现以下错误。

  [815.079223] musb-hdrc musb-hdrc.1:对于1x64、int hwep alloc 失败
  [815.079223] musb-hdrc musb-hdrc.1:Int[815.090737] CDC_ACM 1-1.1.1:1.0:ACM_PORT_ACTIVATE - USB_submit_话 术(ctrl IRQ)失败对于1x64、hwep alloc 失败

  [815.090737] CDC_ACM 1-1.1.1:1.0:ACM_PORT_ACTIVATE - USB_SUBMIT (Ctrl IRQ)失败

我已经阅读过一些论坛上的帖子、这些帖子涉及特定于中断端点的器件数量限制。 由于每个器件需要两个 EP IN、因此接入主机的端点是我的限制因素。

对我的 EP INs 进行计数、我看到:
4个集线器
1个 ECM 设备
6个 ACM 设备

当从用户空间打开设备时、ACM 设备的 EPS 看起来是分配的。 ECM 设备的 EP 在连接时分配(在我的情况下、是在启动期间)。

通过驱动程序读取数据似乎表明、一旦所有其他可用端点都用尽、EP1上的批量端点将会复用、因此我不太理解为什么我在执行此操作时会达到限制。

假定 EP0被保留用于控制、这将为专用批量传输留下3个潜在的 EPS 加上用于其它复用的 EP1。

我在这里缺少一些基础知识吗?

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

    您好!

    EP1复用仅在没有可用端点时使用、否则将为批量传输分配一个空闲端点。 请检查以下假设是否解释了该问题:

    -在连接任何 USB 设备之前,EP2~EP15的端点可用;

    -连接了4个集线器,假定 EP2~EP5,现在 EP6~EP15可用,每个集线器一个中断端点;

    -连接并打开1个 ECM、同时连接两个端点、假设 EP6和 EP7、现在 EP8~EP15可用、总共剩下8个端点;

    现在,如果连接并打开另外4个 ACM,它将占用8个端点,则不再有可用的端点,但仍有两个 ACM 设备要连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉。 您的上述假设是正确的。 我在尝试打开第5个 ACM 而不是第6个 ACM 时遇到错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    不用担心。 很高兴问题现在已清楚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不过、我仍有问题。 驱动程序中有逻辑、当我们用尽可用的端点时、可以使用该空闲端点(EP1)对批量传输进行多路复用、对吧? 该逻辑是否起作用?

    如果在打开第5个 ACM 时有一个用于中断的可用 EP、那么该 EP 会允许从器件传输数据吗?

    修改驱动程序以为我的配置保留足够的端点并在 EP1上对批量传输进行多路复用是否可行?

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

    您好!

    是的、EP1多路复用逻辑工作正常。 如果端点耗尽、新的批量端点请求将分配给 EP1。

    请测试下面的内核补丁、它会更改端点调度并将所有批量传输分配给 EP1、因此您将有足够的端点用于中断端点用例。 请注意、由于多路复用、批量传输性能可能不是很好、我之前没有测试过这种情况。

    e2e.ti.com/.../musb_5F00_ep_5F00_schedule_5F00_change.diff.txt

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

    我测试了您的补丁、这让我更接近。

    但是、我确实注意到、如果 EP_OUT 端点是多路复用的、我会遇到问题。  当我开始从 ACM 设备读取数据时、ECM 设备似乎处于饥饿状态。  我修改了您的补丁、使其仅适用于批量 EP_IN、然后开始运行。  我确实看到了您提到的性能。  我看到15-20ms 范围内的延迟尖峰。

    但是、当我尝试包含全速 ACM 设备时、情况会发生故障。  似乎不再触发 NAK 超时逻辑、并且器件保持 EP 1、直到我停止读取器。

    我在评论中看到以下内容。

    /*当批量请求为时启用批量 RX/TX NAK 超时方案
    *多路复用。 此方案在高速至全速模式下不起作用
    由于 NAK 中断不来自 A、所以速度方案
    *连接到高速器件的全速器件。
    *对于 HS 和、NAK 超时间隔为8 (128 μ 帧或16ms)
    对于 FS 器件、* 4 (8帧或8ms)。
    *

    我怀疑此限制是导致全速问题的原因吗?

    是否有其他方法触发超时、以便其他器件有机会传输数据?

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

    它确实会让您感觉达到了 NAK 超时限制。 但我不知道还有其他解决方法。

    驱动程序中实现的批量 EP1多路复用逻辑尚未通过 TI 的验证、因此我不建议使用它。 在您的用例中、问题似乎仅限于几个端点、我建议您在 AM335x 上同时使用两个 USB 控制器、并在两个控制器上均匀分布所有 USB 设备、以避免此端点限制。 我认为尝试修改内核驱动程序以实现无效函数不是一个好主意。