2017-07-27 186 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

相關問題