内核如何知道 USB 设备何时自行进入低功耗模式(不是由主机启动)?
How do kernel get to know when a USB device goes to low power mode by itself (not initiated by host)?
一个 USB 设备可以进入低功耗模式(支持挂起和恢复)。
主机也可以为设备启动挂起和恢复,在这种情况下,主机知道设备状态。
场景是:
- 设备启动低功耗模式。
- 主机驱动程序想要访问有关设备低功耗状态的信息
- 驱动程序如何从 Linux 内核获取此信息?
根据 USB 规范,USB 设备无法将 link 挂起到 USB 主机。只有主机可以暂停 link。此外,挂起(U3)与低功耗模式(U1/U2)不同。设备可以通过与主机协商而不是暂停来开始切换到低功耗模式。
现在假设您指的是低功耗模式 (U1/U2),那么主机驱动程序无法知道端口何时切换到由设备启动的低功耗模式,因为不会有任何事件发生。您需要自己监控 link 状态,看看 link 是否已切换到低功耗模式。
据我所知,有一个 API 用于获取连接到集线器的设备的 link 状态。
static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
u32 *status, u32 status_reg)
您可以使用此 API 来跟踪通过外部集线器连接的设备的 link 状态。但是没有 API 可用于读取根集线器端口 link 状态。如果主机控制器驱动程序公开任何接口,则可以使用该接口。
查看 dwc3 控制器代码,它公开了一个可用于读取 link 状态的 debugfs 接口。
路径 - usb/dwc3/debugfs.c
API -
static int dwc3_link_state_show(struct seq_file *s, void *unused)
PS - 我认为你有 XHCI 控制器。但 EHCI 控制器也几乎相同。设备永远无法挂起 USB link.
一个 USB 设备可以进入低功耗模式(支持挂起和恢复)。
主机也可以为设备启动挂起和恢复,在这种情况下,主机知道设备状态。
场景是:
- 设备启动低功耗模式。
- 主机驱动程序想要访问有关设备低功耗状态的信息
- 驱动程序如何从 Linux 内核获取此信息?
根据 USB 规范,USB 设备无法将 link 挂起到 USB 主机。只有主机可以暂停 link。此外,挂起(U3)与低功耗模式(U1/U2)不同。设备可以通过与主机协商而不是暂停来开始切换到低功耗模式。
现在假设您指的是低功耗模式 (U1/U2),那么主机驱动程序无法知道端口何时切换到由设备启动的低功耗模式,因为不会有任何事件发生。您需要自己监控 link 状态,看看 link 是否已切换到低功耗模式。
据我所知,有一个 API 用于获取连接到集线器的设备的 link 状态。
static void xhci_hub_report_link_state(struct xhci_hcd *xhci,
u32 *status, u32 status_reg)
您可以使用此 API 来跟踪通过外部集线器连接的设备的 link 状态。但是没有 API 可用于读取根集线器端口 link 状态。如果主机控制器驱动程序公开任何接口,则可以使用该接口。
查看 dwc3 控制器代码,它公开了一个可用于读取 link 状态的 debugfs 接口。
路径 - usb/dwc3/debugfs.c
API -
static int dwc3_link_state_show(struct seq_file *s, void *unused)
PS - 我认为你有 XHCI 控制器。但 EHCI 控制器也几乎相同。设备永远无法挂起 USB link.