【问题标题】:How do kernel get to know when a USB device goes to low power mode by itself (not initiated by host)?内核如何知道 USB 设备何时自行进入低功耗模式(不是由主机启动)?
【发布时间】:2017-07-27 13:15:32
【问题描述】:

一个 USB 设备可以进入低功耗模式(支持挂起和恢复)。

主机也可以为设备启动挂起和恢复,在这种情况下,主机知道设备状态。

场景是:

  • 设备启动低功耗模式。
  • 主机驱动程序想要访问有关设备低功耗状态的信息
  • 驱动程序如何从 Linux 内核获取此信息?

【问题讨论】:

  • sysfs 可以提供此信息,请参见此处:kernel.org/doc/html/latest/driver-api/usb/power-management.html
  • 谢谢,@ApriOri,他们在这里提到了如何启用和禁用远程唤醒、暂停和恢复功能以及如何设置 autosuspend_delay_ms。这些都是关于 USB 设备行为的配置。当设备处于由设备本身启动的低功耗模式时,我需要设备的状态。 .....这样我就可以控制设备的恢复。没有关于控制 Resume 过程的信息。

标签: android linux linux-kernel usb device-driver


【解决方案1】:

根据 USB 规范,USB 设备不能暂停与 USB 主机的链接。只有主机可以暂停链接。此外,挂起(U3)与低功耗模式(U1/U2)不同。设备可以通过与主机协商而不是挂起来开始切换到低功耗模式。

现在让我们考虑您的意思是低功耗模式 (U1/U2),然后主机驱动程序无法知道端口何时切换到由设备启动的低功耗模式,因为不会有任何事件发生。您需要自行监控链路状态,以查看链路是否已切换到低功耗模式。

据我所知,有一个 API 用于获取连接到集线器的设备的链接状态。

static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
                u32 *status, u32 status_reg)

您可以使用此 API 来跟踪通过外部集线器连接的设备的链接状态。但是没有可用于读取根集线器端口链接状态的 API。如果主机控制器驱动程序公开任何接口,则可以使用该接口。

查看 dwc3 控制器代码,它公开了一个可用于读取链接状态的 debugfs 接口。

路径-usb/dwc3/debugfs.c

API -

static int dwc3_link_state_show(struct seq_file *s, void *unused)

PS - 我认为你有 XHCI 控制器。但它对于 EHCI 控制器也几乎相同。设备永远不能暂停 USB 链接。

【讨论】:

  • 非常感谢,:-),@Shaibal,是的,我使用了 Suspend|Resume 术语,当我们从 USB 和主机驱动程序等不同角度进行讨论时,可能会改变范围。但是是的,我的意思是 USB 设备能够启动电源模式。正如您所说,主机驱动程序无法识别这些更改。
  • 你能@Shaibal 帮我知道,我如何从主机驱动程序(从内核而不是固件)发送 SET FEATURE 命令(U1/U2 启用),以便我可以针对特定情况禁用此功能我正在使用此驱动程序的操作系统。 [如果我再次使用错误的术语,请帮助我] 具体来说,我想从内核驱动程序发送 USB 命令。
  • 您需要发送 CLEAR_FEATURE 来禁用 U1/U2 功能。您可以在主机中编写一个应用程序来对您的设备进行控制传输,并且 libusb 是最好的。关注github.com/tytouf/libusb-cdc-example/blob/master/cdc_example.c,以libusb为例。
  • 请记住,只有在设备处于配置状态时,您才能发送 clear_feature(U1/U2)
猜你喜欢
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多