2017-07-27 42 views
0

一个USB设备有能力进入低功耗模式(支持暂停和恢复)。内核如何知道USB设备本身何时进入低功耗模式(非主机启动)?

主机还可以发起挂起和恢复的设备,在这种情况下,主机知道设备的状态。

的情况是:

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

sysfs可以提供此信息,请参阅此处:https://www.kernel.org/doc/html/latest/driver-api/usb/power-management.html – ApriOri

+0

感谢@ApriOri在这里他们提到了如何您可以启用和禁用远程唤醒,挂起和恢复功能以及如何设置autosuspend_delay_ms。这些都是关于USB设备行为的配置。当设备处于由设备本身启动的低功耗模式时,我需要设备的状态。 .....所以我可以控制设备的恢复。没有关于控制恢复过程的信息。 – AnuragChauhan

回答

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。如果主机控制器驱动程序公开任何接口,那么可以使用它。

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

路径 - USB/dwc3/debugfs.c

API -

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

PS - 我已经考虑过你有XHCI控制器。但是它对于EHCI控制器也几乎相同。设备不能挂起USB链接。

+0

非常感谢,:-),@Shaibal,是的,我使用了Suspend | Resume术语,当我们从USB和From Host Driver等不同角度讨论时,可能会改变范围。但是,我的意思是在USB设备的能力下启动电源模式。正如您所说的,主机驱动程序无法识别这些更改。 – AnuragChauhan

+0

你能@Shaibal帮助我知道,我怎么能发送设置特征命令(U1/U2启用)从主机驱动程序(不是从固件内核),这样我可以禁用此功能为特定操作系统我用这为其驱动程序。 [帮助我如果我再次使用错误的术语] 具体而言,我想从Kernel Driver发送USB命令。 – AnuragChauhan

+1

您需要发送CLEAR_FEATURE以禁用U1/U2功能。你可以在主机上写一个应用程序来控制传输到你的设备,而且libusb是最好的。按照https://github.com/tytouf/libusb-cdc-example/blob/master/cdc_example.c作为libusb的示例。 – Shaibal

相关问题