USB电源管理
内容:
---------
*什么是电源管理?
*什么是远程唤醒?
* USB设备何时闲置?
*动态PM的形式
*动态PM的用户界面
*更改默认的空闲延迟时间
*警告
*电源管理的驱动程序界面
*自动挂起和自动恢复的驱动程序界面
*驱动程序界面的其他部分
*互斥
*动态PM和系统PM之间的交互
* xHCI硬件链接PM
* USB端口电源控制
*用于端口电源控制的用户界面
*建议的用户空间端口电源策略

什么是电源管理?
-------------------------

电源管理(PM)是通过暂停来节省能源的做法
不使用的计算机系统部件。虽然一个
组件处于“挂起”状态,处于低功能状态;它
甚至可能会完全关闭。悬浮的成分可以是
当内核“恢复”(返回全功能状态)时
需要使用它。(还有一些PM的形式,其中组件是
置于功能较低但仍可使用的状态,而不是
暂停; 例如降低CPU的时钟速率。这
文档将不会讨论其他形式。)

当挂起的部件包括CPU和其余大多数部件时
系统,我们称其为“系统挂起”。当一个特定的
在整个系统仍在运行时关闭设备,我们
称其为“动态暂停”(也称为“运行时暂停”或
“选择性暂停”)。本文件主要集中于如何
尽管系统PM是在USB子系统中实现的,但动态PM是在USB子系统中实现的
涵盖了一定程度(有关更多信息,请参见Documentation / power / *。txt
有关系统PM的信息)。

仅当内核是使用CONFIG_SUSPEND构建的时,才提供系统PM支持。
或启用CONFIG_HIBERNATION。只要有USB,就有动态PM支持
内核是在启用CONFIG_PM的情况下构建的。

[从历史上看,只有在以下情况下才对USB提供动态PM支持:
内核是在启用CONFIG_USB_SUSPEND的情况下构建的(具体取决于
CONFIG_PM_RUNTIME)。从3.10内核版本开始,支持动态PM
只要使用CONFIG_PM_RUNTIME构建内核,就存在USB for USB
已启用。CONFIG_USB_SUSPEND选项已删除。]

什么是远程唤醒?
----------------------

暂停设备后,通常要等到设备恢复后,
计算机告诉它。同样,如果整个计算机
暂停,它通常不会恢复,直到用户告诉它
按下电源按钮或打开盖子。

但是,某些设备可以自行恢复,或者
要求内核恢复它们,甚至告诉整个计算机
恢复。此功能有几个名称,例如“ Wake On
LAN”;我们通常将其称为“远程唤醒”。
设备已启用远程唤醒功能,并且已暂停,可能会恢复
本身(或发送要恢复的请求)以响应某些外部
事件。例如,当按键被按下时,暂停的键盘会恢复运行。
按下,或插入设备后恢复挂起的USB集线器。

USB设备什么时候空闲?
--------------------------

每当内核认为自己不忙时,设备就处于空闲状态
任何重要的事情,因此都是被暂停的候选人。这
确切的定义取决于设备的驱动程序;允许司机
声明即使没有实际的设备也不处于空闲状态
沟通正在发生。(例如,集线器不被视为空闲
除非插入该集线器的所有设备都已挂起。)
此外,只要程序保持运行状态,就不会将设备视为空闲设备
其usbfs文件打开,无论是否正在进行任何I / O。

如果USB设备没有驱动程序,则其usbfs文件不会打开,也不会打开
通过sysfs被访问,那么它肯定是空闲的。

动态PM的形式
-------------------

动态挂起发生在内核决定挂起空闲状态时
设备。简称为“自动暂停”。通常,设备
除非闲置了最短时间,否则不会自动暂停
时间,即所谓的空闲延迟时间。

当然,内核主动执行的任何操作都不应该
防止计算机或其设备正常工作。如果一个
设备已被自动挂起,并且程序尝试使用该设备,
内核将自动恢复设备(自动恢复)。为了
出于同样的原因,自动暂停的设备通常会进行远程唤醒
如果设备支持远程唤醒,则启用。

值得一提的是,许多USB驱动程序不支持
自动暂停。实际上,在撰写本文时(Linux 2.6.23),
只有支持它的驱动程序是集线器驱动程序kaweth,asix,
usblp,usblcd和usb-skeleton(不计算在内)。如果一个
不支持的驱动程序已绑定到设备,则该设备将不会
自动暂停。实际上,内核假装设备永远不会
空闲。

我们可以将电源管理事件分为两大类:
内部和外部。外部事件是由某些事件触发的事件
USB堆栈外部的代理:系统挂起/恢复(由触发
用户空间),手动动态恢复(也由用户空间触发)和
远程唤醒(由设备触发)。内部事件是那些
在USB堆栈中触发:自动暂停和自动恢复。注意
所有动态暂停事件都是内部的;外部代理商不是
允许发出动态挂起。

动态PM的用户界面
---------------------------------

用于控制动态PM的用户界面位于电源/
每个USB设备的sysfs目录的子目录,即
/sys/bus/usb/devices/…/power/,其中“ …”是设备的ID。这
相关的属性文件是:唤醒,控制和
autosuspend_delay_ms。(可能还会有一个名为“ level”的文件;这是
从2.6.35内核开始不推荐使用该文件,并由替换为
“控制”文件。在2.6.38中,“ autosuspend”文件将被弃用
并替换为“ autosuspend_delay_ms”文件。唯一的区别
是较新的文件表示延迟(以毫秒为单位),而
较旧的文件使用秒。令人困惑的是,这两个文件都存在于2.6.37中
但只有“自动暂停”有效。)

电源/唤醒如果设备不支持,则此文件为空远程唤醒。否则,文件包含单词“启用”或单词“禁用”,您可以将这些单词写到文件中。该设置确定当设备接下来被挂起。(如果更改了设置在设备暂停期间,更改不会进行直到下一个暂停为止。)功率控制该文件包含两个单词之一:“ on”或“ auto”。您可以将这些单词写到文件中以更改设备的设置。“开”表示应该恢复设备,并且不允许自动暂停。(当然,系统仍然允许暂停。)“自动”是内核处于正常状态的状态允许自动挂起和自动恢复设备。(在2.6.32以下的内核中,您还可以指定“挂起”,表示该设备应保留暂停,不允许自动恢复。这设置不再受支持。)power / autosuspend_delay_ms该文件包含一个整数值,即设备应保持空闲状态的毫秒数在内核将其自动挂起之前(空闲延迟时间)。默认值为2000。0表示自动挂起设备闲置后立即变为负值值表示永不自动暂停。你可以写一个编号以更改自动暂停的文件空闲延迟时间。

将“ -1”写入power / autosuspend_delay_ms并将“ on”写入
电源/控制功能本质上是一样的-它们都可以防止
设备被自动挂起。是的,这是
API。

(在2.6.21中,将“ 0”写入电源/自动暂停会阻止设备
不会自动暂停;该行为在2.6.22中进行了更改。这
在2.6.21之前不存在power / autosuspend属性,并且
在2.6.22之前不存在power / level属性。功率控制
在2.6.34中添加了,并在power / autosuspend_delay_ms中添加了
2.6.37,但直到2.6.38才起作用。)

更改默认的空闲延迟时间
------------------------------------

默认的自动挂起空闲延迟时间(以秒为单位)由
usbcore中的模块参数。您可以在usbcore时指定值
已加载。例如,将其设置为5秒而不是2秒,您将
做:

modprobe usbcore autosuspend = 5

同样,您可以在/etc/modprobe.d中添加一个配置文件。
一行说:

选项usbcore autosuspend = 5

一些发行版会在启动过程中很早就加载usbcore模块
通过从initramfs运行的程序或脚本来进行处理
图像。要更改参数值,您必须重新构建该值
图像。

如果将usbcore编译到内核中而不是作为可加载项构建
模块,您可以添加

usbcore.autosuspend = 5

到内核​​的启动命令行。

最后,在系统处于运行状态时可以更改参数值
跑步。如果您这样做:

回声5> / sys / module / usbcore / parameters / autosuspend

那么每个新的USB设备都会有其自动暂停的空闲延迟
初始化为5。(现有设备的空闲延迟值
不会受到影响。)

将初始默认的idle-delay设置为-1将防止任何
自动暂停任何USB设备。这样做的好处是可以让您
然后为选定的设备启用自动暂停功能。

警示语
--------

USB规范指出所有USB设备都必须支持电源
管理。然而,可悲的事实是,许多设备没有
很好地支持它。您可以暂停它们,但是当您
尝试恢复它们,他们将自己与USB总线断开连接,或者
他们完全停止工作。这似乎特别普遍
在打印机和扫描仪之间,但还有许多其他类型的设备
同样的缺陷。

因此,默认情况下,内核会禁用自动暂停(
所有其他设备的电源/控制属性均初始化为“ on”)
比集线器。至少,集线器似乎在以下方面表现良好
对此。

(在2.6.21和2.6.22中不是这种情况。启用了自动暂停
默认情况下,几乎所有USB设备都可以使用。许多人经验丰富
结果出现问题。)

这意味着除非用户注意,否则非集线器设备不会自动挂起
或某个程序明确启用了它。截至撰写本文时,还没有
任何广泛的程序都可以做到这一点;我们希望在不久的将来
HAL等未来的设备管理器将采用此功能
责任。在此期间,您可以随时执行
手动进行必要的操作或将其添加到udev脚本中。你可以
同时更改空闲延迟时间;2秒不是最好的选择
每个设备。

如果驾驶员知道其设备具有适当的挂起/恢复支持,
它可以自行启用所有自动暂停功能。例如,视频
便携式计算机的网络摄像头驱动程序可能会执行此操作(在最近的内核中,
这样做),因为这些设备很少使用,因此通常应
自动暂停。

有时候,即使设备确实可以正常工作
自动挂起仍然存在问题。例如usbhid驱动程序
它管理键盘和鼠标,具有自动挂起支持。测试
许多键盘显示在悬浮键盘上输入内容,而
尽管如此,仍会导致键盘进行远程唤醒
经常会导致击键丢失。对老鼠的测试表明,其中一些
其中的一个将响应按钮发出远程唤醒请求
按下但不运动,有些则不响应。

内核不会阻止您在设备上启用自动挂起
那无法处理。理论上甚至有可能损坏
设备在错误的时间挂起。(极不可能,但
可能。)保重。

电源管理的驱动程序界面
-----------------------------------------

USB驱动程序支持外部电源管理的要求
相当谦虚;驾驶员只需要定义

。暂停
。恢复
.reset_resume

usb_driver结构中的方法,而reset_resume方法是
可选的。方法的工作非常简单:

调用suspend方法来警告驱动程序
设备将被暂停。如果驾驶员返回
负错误代码,挂起将被中止。一般
驱动程序将返回0,在这种情况下,它必须取消所有
未完成的URB(usb_kill_urb()),并且不再提交。调用resume方法来告诉驱动程序
设备已恢复并且驱动程序可以恢复正常
手术。URB可以再次提交。调用reset_resume方法来告诉驱动程序
设备已恢复并且也已重置。
驱动程序应重做任何必要的设备初始化,
因为该设备可能已经失去了大部分或全部状态
(尽管接口的设置与
暂停之前)。

如果设备在挂起期间断开连接或断电,
将调用断开连接方法,而不是继续调用,或
reset_resume方法。这也很可能在以下情况下发生
由于许多系统未保持挂起状态,因此从休眠状态中唤醒
休眠期间USB主机控制器的当前电流。(它的
可以通过以下方法解决冬眠-力量-断开连接问题
使用USB Persist工具。)

USB Persist工具使用reset_resume方法(请参见
Documentation / usb / persist.txt),也可以在某些情况下使用
在未启用CONFIG_USB_PERSIST的情况下。目前,如果
设备在恢复过程中被重置,并且驱动程序没有
reset_resume方法,驱动程序不会收到有关以下内容的任何通知
简历。以后的内核将调用驱动程序的断开连接方法。
2.6.23不会执行此操作。

USB驱动程序已绑定到接口,因此它们会挂起并恢复
接口被挂起或恢复时,将调用方法。在
原则上,可能要挂起设备上的某些接口(即,
强制这些接口的驱动程序停止所有活动),而无需
挂起其他接口。USB内核不允许这样做。全部
设备本身被挂起且所有设备都挂起时,接口也被挂起
恢复设备后,接口也会恢复。不可能的
暂停或恢复设备的部分但不是全部接口。这
您能找到的最接近的方法是取消绑定接口的驱动程序。

自动挂起和自动恢复的驱动程序界面
-------------------------------------------------- --

为了支持自动暂停和自动恢复,驱动程序应实施所有
上面列出的三种方法。另外,驾驶员表示
通过设置.supports_autosuspend标志,它支持自动暂停
在其usb_driver结构中。然后负责通知
只要USB核心的接口之一变得忙碌或空闲,就可以使用它。这
驱动程序通过调用以下六个函数来做到这一点:

int usb_autopm_get_interface(struct usb_interface * intf);
无效的usb_autopm_put_interface(struct usb_interface * intf);
int usb_autopm_get_interface_async(struct usb_interface * intf);
无效的usb_autopm_put_interface_async(struct usb_interface * intf);
无效的usb_autopm_get_interface_no_resume(struct usb_interface * intf);
无效的usb_autopm_put_interface_no_suspend(struct usb_interface * intf);

这些功能通过在
usb_interface的嵌入式设备结构。当计数器> 0时
那么该接口就被认为是繁忙的,内核将不会
自动挂起接口的设备。当使用计数器为0时
那么该接口就被认为是空闲的,内核可能
自动挂起设备。

驾驶员不必担心平衡使用情况的变化
柜台; 当驱动程序出现时,USB内核将撤消所有剩余的“获取”
从其接口解除绑定。因此,驾驶员不得致电
任何usb_autopm_ *函数在其disconnect()例程具有
回。

使用异步例程的驱动程序负责自己的
同步与互斥。

usb_autopm_get_interface()递增使用计数器,并
如果设备已挂起,则执行自动恢复。如果
自动恢复失败,计数器递减。usb_autopm_put_interface()减少使用计数器,并
如果新值= 0,则尝试自动挂起。usb_autopm_get_interface_async()和
usb_autopm_put_interface_async()与
他们的非异步对手。最大的不同是
使用工作队列进行简历或暂停其部分工作
职位。结果,可以在原子上下文中调用它们,
例如URB的完成处理程序,但是当他们返回
设备通常不会处于所需状态。usb_autopm_get_interface_no_resume()和
usb_autopm_put_interface_no_suspend()仅递增或
减少使用计数器;他们不尝试进行
自动恢复或自动暂停。因此,它们可以被调用
原子上下文。

最简单的用法是驱动程序调用
usb_autopm_get_interface()在其打开例程中,以及
usb_autopm_put_interface()在其关闭或释放例程中。但是其他
模式是可能的。

上面提到的自动挂起尝试通常会失败一次
原因或其他。例如,电源/控制属性可能是
设置为“ on”,否则可能无法在同一设备上使用其他接口
空闲。这是完全正常的。如果失败的原因是
设备没有闲置足够长的时间,已安排了计时器
自动暂停空闲延迟后自动执行操作
已过期。

自动继续尝试也可能会失败,尽管失败意味着
设备不再存在或无法正常运行。不像
自动暂停,自动恢复没有空闲延迟。

驱动程序界面的其他部分
-----------------------------------

驱动程序可以通过调用以下方式为其设备启用自动暂停功能:

usb_enable_autosuspend(struct usb_device * udev);

在他们的probe()例程中,如果他们知道该设备有能力
正确暂停和恢复。这完全等同于
将“自动”写入设备的电源/控制属性。同样地,
驱动程序可以通过调用禁用自动暂停

usb_disable_autosuspend(struct usb_device * udev);

这与将“ on”写入电源/控制属性完全相同。

有时,驱动程序需要确保启用了远程唤醒
在自动暂停期间。例如,没有多大意义
如果用户无法使键盘执行以下操作,则会自动挂起键盘:
通过在其上键入远程唤醒。如果驱动程序设置
intf-> needs_remote_wakeup设为1,内核不会自动暂停
设备,如果远程唤醒不可用。(如果设备已经
自动暂停,但是,设置此标志不会导致内核
自动恢复。通常,驱动程序会在其探针中设置此标志
方法,此时保证设备不会
自动暂停。)

如果驱动程序在中断上下文中异步执行其I / O,则它将
在开始输出之前应调用usb_autopm_get_interface_async()并
当输出队列耗尽时,usb_autopm_put_interface_async()。什么时候
它收到一个输入事件,它应该调用

usb_mark_last_busy(struct usb_device * udev);

在事件处理程序中。这告诉PM核心设备只是
忙,因此下一个自动暂停的空闲延迟到期
被推回去。许多usb_autopm_ *例程也进行了此调用,
因此,驱动程序仅在中断驱动输入到达时才需要担心。

异步操作始终会受到竞争的影响。例如,一个
驱动程序可以一次调用usb_autopm_get_interface_async()例程
当核心刚刚完成判定设备已闲置的时间时
足够长的时间,但尚未解决,将其称为暂停驱动程序
方法。挂起方法必须负责与
I / O请求例程和URB完成处理程序;这应该
如果驱动程序需要使用
设备。

绝对不应允许外部暂停调用以这种方式失败,
仅自动暂停通话。驾驶员可以通过申请将他们区分开
PMSG_IS_AUTO()宏到挂起的message参数
方法; 对于内部PM事件(自动暂停),它将返回True,并且
对于外部PM事件为False。

互斥
----------------

对于外部事件-不一定是自动暂停或
自动恢复-设备信号量(udev-> dev.sem)将在以下情况下保留
调用suspend或resume方法。这意味着外部
暂停/恢复事件与探查调用互斥,
断开连接,pre_reset和post_reset;USB内核保证了
自动暂停/自动恢复事件也是如此。

如果驱动程序要在某些情况下阻止所有挂起/继续通话
关键部分,最好的方法是锁定设备并拨打电话
usb_autopm_get_interface()(并在
关键部分)。持有设备信号灯将阻止所有
外部PM调用,而usb_autopm_get_interface()将阻止任何
内部PM调用,即使失败。(运动:为什么?)

动态PM与系统PM之间的交互
--------------------------------------------

动态电源管理和系统电源管理可以交互
几种方法。

首先,当系统挂起时,设备可能已经自动挂起
发生。由于系统挂起应该像
在可能的情况下,设备应在系统之后保持挂起状态
恢复。但是这种理论在实践中可能行不通。随着时间的推移
内核在这方面的行为已经改变。截至2.6.37
策略是在系统恢复期间恢复所有设备,并让它们
处理自己的运行时之后会暂停。

其次,动态电源管理事件可能会作为系统发生
暂停正在进行中。窗口很短,因为系统
暂挂不会花费很长时间(通常是几秒钟),但是可能会发生。
例如,挂起的设备可能会在发出警报时发送远程唤醒信号,
系统正在挂起。远程唤醒可能会成功,这将
导致系统挂起中止。如果没有远程唤醒
成功,它可能仍然保持活动状态,从而导致系统
系统挂起完成后立即恢复。或遥控器
唤醒可能会失败并迷路。哪个结果发生取决于时间
以及硬件和固件设计。

xHCI硬件链接PM
---------------------

xHCI主机控制器提供了USB2.0的硬件链路电源管理
(xHCI 1.0功能)和支持链接PM的usb3.0设备。经过
启用硬件LPM后,主机可以自动将设备放入
低功耗状态(对于USB2.0设备为L1,对于USB3.0设备为U1 / U2),
哪个状态设备可以非常快速地进入并恢复。

用于控制硬件LPM的用户界面位于
每个USB设备的sysfs目录的power /子目录,即
/sys/bus/usb/devices/…/power/,其中“ …”是设备的ID。这
相关的属性文件是usb2_hardware_lpm和usb3_hardware_lpm。

电源/ usb2_hardware_lpm将支持LPM的USB2设备插入xHCI主机根集线器,支持软件LPM,主机将为其运行软件LPM测试;如果设备进入L1状态并成功恢复,主机支持USB2硬件LPM,此文件将显示并驱动程序将为设备启用硬件LPM。你可以将y / Y / 1或n / N / 0写入文件以启用/禁用手动USB2硬件LPM。这主要是出于测试目的。电源/ usb3_hardware_lpm_u1
电源/ usb3_hardware_lpm_u2将支持USB 3.0 lpm的设备插入支持链接PM的xHCI主机将检查U1是否BOS中已经设置了U2出口等待时间描述符 如果检查通过并且主机支持USB3硬件LPM,USB3硬件LPM将为设备启用,将创建这些文件。这些文件包含一个字符串值(启用或禁用)指示USB3硬件LPM U1还是U2已为设备启用。USB端口电源控制
----------------------

除了挂起端点设备和启用硬件
在受控链路电源管理中,USB子系统还具有
在某些情况下具有关闭端口电源的功能。力量是
通过对集线器的Set / ClearPortFeature(PORT_POWER)请求进行控制。
对于根集线器或平台内部集线器,主机控制器
驱动程序将PORT_POWER请求转换为平台固件(ACPI)
方法调用以设置端口电源状态。有关更多背景信息,请参见
Linux Plumbers Conference 2012幻灯片[1]和视频[2]:

收到ClearPortFeature(PORT_POWER)请求后,USB端口为
逻辑关闭,并可能触发端口VBUS的实际丢失[3]。
集线器将多个端口组合成一个端口时,可以维持VBUS
共享电源井,导致电源保留到该组中的所有端口之前
被关闭。VBUS也可以通过为以下目的配置的集线器端口进行维护:
收费应用程序。在任何情况下,逻辑上关闭的端口都将丢失
与它的设备连接,不响应热插拔事件,并且不
响应远程唤醒事件*。

警告:关闭端口可能会导致无法热添加设备。
有关详细信息,请参见“用于端口电源控制的用户界面”。

就对设备本身的影响而言,它类似于设备
在系统挂起期间经历,即电源会话丢失。任何
行为异常的USB设备或驱动程序将被挂起
同样受到端口电源重启事件的影响。因此,
实现共享相同的设备恢复路径(并且使用相同的路径)
怪癖)作为系统恢复集线器的路径。

[1]:http://dl.dropbox.com/u/96820575/sarah-sharp-lpt-port-power-off2-mini.pdf
[2]:http://linuxplumbers.ubicast.tv/videos/usb-port-power-off-kerneluserspace-api/
[3]:USB 3.1第10.12节
*唤醒注意:如果设备配置为发送唤醒事件,则端口
电源控制的实现将阻止对该设备的关机尝试
港口。

用于端口电源控制的用户界面
-------------------------------------

端口电源控制机制使用PM运行时系统。关机是
通过清除端口设备的power / pm_qos_no_power_off标志来请求
(默认为1)。如果端口断开连接,它将立即收到一个
ClearPortFeature(PORT_POWER)请求。否则,它将遵守pm运行时
规定并要求附加的子设备和所有后代被暂停。
此机制取决于集线器广告端口中的集线器电源开关
集线器描述符(wHubCharacteristics逻辑电源切换模式字段)。

注意,某些接口设备/驱动程序不支持自动挂起。用户空间可能
需要先取消绑定接口驱动程序,然后usb_device才会挂起。一个
缺省情况下,未绑定的接口设备处于挂起状态。解除绑定时,请小心
取消绑定接口驱动程序,而不是父USB设备的驱动程序。还,
让集线器接口驱动程序受约束。如果是USB设备的驱动程序(不是
接口)是未绑定的,内核不再能够恢复设备。如果一个
集线器接口驱动程序未绑定,对其子端口的控制丢失,所有
连接的子设备将断开连接。一个好的经验法则是,如果
设备的“驱动程序/模块”链接指向/ sys / module / usbcore,然后解除绑定
它将干扰端口电源控制。

用于端口电源控制的相关文件的示例。注意,在这个例子中
这些文件是相对于USB集线器设备(前缀)的。

 前缀= / sys / devices / pci0000:00/0000:00:14.0 / usb3 / 3-1附属的儿童设备+集线器端口设备+ |集线器接口设备+ | |vvv$ prefix / 3-1:1.0 / 3-1-port1 /设备$ prefix / 3-1:1.0 / 3-1-port1 / power / pm_qos_no_power_off$ prefix / 3-1:1.0 / 3-1-port1 /设备/电源/控制$ prefix / 3-1:1.0 / 3-1-port1 / device / 3-1.1:<intf0> /驱动程序/取消绑定$ prefix / 3-1:1.0 / 3-1-port1 / device / 3-1.1:<intf1> /驱动程序/取消绑定...$ prefix / 3-1:1.0 / 3-1-port1 / device / 3-1.1:<intfN> /驱动程序/取消绑定

除了这些文件之外,某些端口可能还具有指向该端口的“对等”链接
另一个枢纽。期望所有超高速端口都有一个
高速同行。

$ prefix / 3-1:1.0 / 3-1-port1 / peer-> …/…/…/…/usb2/2-1/2-1:1.0/2-1-port1
…/…/…/…/usb2/2-1/2-1:1.0/2-1-port1/peer-> …/…/…/…/usb3/3-1 /3-1:1.0/3-1-port1

与“配套端口”或“ ehci / xhci共享切换端口”不同
对等端口只是高速和超高速接口引脚,
组合成一个usb3连接器。对等端口共享相同的端口
祖先XHCI设备。

关闭超速端口电源后,设备可能会降级其端口
连接并尝试连接到高速引脚。这
实现采取措施来防止这种情况:

1 /端口挂起按顺序进行,以确保关闭高速端口的电源
在允许他们的超速同行断电之前。含义是
在超高速端口上将pm_qos_no_power_off设置为零可能不会导致
断开端口电源,直到其高速对等方进入运行时挂起状态
状态。如果用户空间想要暂停,请注意
确保超速端口将关闭电源。

2 /端口恢复按顺序执行,以强制超速端口在其上电之前打开电源
高速同行。

3 /端口恢复始终会触发连接的子设备恢复。之后
电源会话丢失设备可能已被删除,或者需要重置。
当父端口重新获得电源时恢复子设备可解决这些问题
指出并钳制最大端口电源循环频率,以子速率为准
设备可以挂起(自动暂停延迟)和继续(重置-恢复延迟)。

与端口电源控制相关的Sysfs文件:
/ power / pm_qos_no_power_off:
该可写标志控制空闲端口的状态。
一旦所有的孩子和后代都暂停了
端口可能会挂起/关闭电源,但前提是
pm_qos_no_power_off为’0’。如果pm_qos_no_power_off为
“ 1”端口将保持活动/通电状态,无论
后代的统计数据。默认为1。

<hubdev-portX> / power / runtime_status:此文件反映端口是否为“活动”(电源打开)或“已暂停”(逻辑上已关闭)。没有迹象表明用户空间是否仍提供VBUS。<hubdev-portX> / connect_type:用户空间的建议性只读标志,指示端口的位置和连接类型。它返回“ hotplug”,“ hardwired”,“ not used”这四个值之一,和“未知”。除未知外,所有值均由平台固件。“ hotplug”表示外部可连接/可见平台上的端口。通常,用户空间会选择保持此类端口通电以处理新设备连接事件。“硬连线”是指不可见但可见的端口可连接的。示例是USB的内部端口可以通过外部连接断开的蓝牙或带有USB摄像头的端口。这是预期是安全的,以允许这些端口挂起提供pm_qos_no_power_off与任何切换连接门的开关。用户空间必须安排用于端口之前要连接的设备关闭电源,或在启用前激活端口通过开关连接。“未使用”是指预期的内部端口永远不要连接任何设备。这些可能是空的内部端口,或物理上不存在的端口暴露在平台上。被认为是安全的始终关闭电源。“未知”表示平台固件不提供该端口的信息。最常指外部集线器端口,应视为“热插拔”用于政策决策。注意1:由于我们依赖BIOS来获取此ACPI信息正确,USB端口说明可能是丢失或错误。注意2:请注意清除pm_qos_no_power_off。一次电源关闭此端口将不响应新的连接事件。一旦连接了子设备,其他约束条件就会出现
在允许端口断电之前应用。<child> / power / control:必须为“自动”,端口不会关闭电源,直到<child> / power / runtime_status反映“已暂停”状态。默认值由子设备驱动程序控制。<child> / power / persist:对于大多数设备,此默认设置为“ 1”,并指示是否内核可以跨设备持久保存设备的配置电源会话丢失(挂起/端口电源事件)。什么时候该值是“ 0”(古怪的设备),端口关闭电源是禁用的。<child> / driver / unbind:具有唤醒功能的设备将阻止端口关闭电源。在这一次清除USB内部的唯一机制接口设备的唤醒功能将取消绑定它的驱动程序。

相对于端口设备的关机先决条件设置摘要:

回声0> power / pm_qos_no_power_off
echo 0> peer / power / pm_qos_no_power_off#如果存在
echo auto> power / control#这是默认值
回声自动> <child> / power / control
echo 1> <child> / power / persist#这是默认值建议的用户空间端口电源策略
-------------------------------------

如上所述,用户空间需要谨慎并谨慎考虑
端口启用了关机功能。

默认配置是所有端口都以
power / pm_qos_no_power_off设置为“ 1”,导致端口始终保留
积极的。

对平台固件的端口描述有信心
(端口的ACPI _PLD记录填充“ connect_type”)用户空间可以
清除所有“未使用”端口的pm_qos_no_power_off。一样可以
如果电源关闭与任何
端口的连接开关。

更具侵略性的用户空间策略是启用USB端口电源关闭
所有端口(将 / power / pm_qos_no_power_off设置为’0’)
某些外部因素表明用户已停止与
系统。例如,发行版可能想要关闭所有USB的电源
屏幕变黑时将端口插入,并在屏幕变黑时重新为其供电
积极的。智能手机和平板电脑可能需要在以下情况下关闭USB端口的电源
用户按下电源按钮。

linux usb 动态pm 学习记录相关推荐

  1. USB设备驱动学习记录

    0:EHCI主控架构 1.关于设备地址SET_ADDRESS设置的逻辑: 可以看到set_address命令最终通过USB_DRV_WriteReg8(&musb->faddr, g_u ...

  2. 和菜鸟一起学linux之DBUS基础学习记录

    转自:http://blog.csdn.net/eastmoon502136/article/details/10044993 D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用 ...

  3. java jdk动态代理学习记录

    转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...

  4. JAVA 动态代理学习记录

    打算用JAVA实现一个简单的RPC框架,看完RPC参考代码之后,感觉RPC的实现主要用到了两个方面的JAVA知识:网络通信和动态代理.因此,先补补动态代理的知识.---多看看代码中写的注释 参考:Ja ...

  5. linux 桌面系统开发学习记录

    前言 来了deepin做文件管理器项目开发,已经有了4个月时间了,学了些许linux基础知识,这个让我联想到linux下做应用开发的一些优点和缺点,先暂时做个凌乱的总结,以便后期整理资料.这里的资料整 ...

  6. linux个人学习记录

    linux学习记录 资料: Linux 黑马程序员_bilibili AcWing Linux基础课 可能是东半球最全面易懂的 Tmux 使用教程! Shell 教程 | 菜鸟教程 (runoob.c ...

  7. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  8. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

  9. Linux驱动开发之USB驱动深入学习(三)——USB2.0ECHI驱动注册

    一.前言 本篇博客仅对ECHI主机控制器驱动的注册部分进行简要叙述,后面再对一些重要的接口进行分析讲解. 二.USB 1.概述 USB(Universal Serial Bus)即"通用外部 ...

最新文章

  1. 如何利用PN结来测量温度?
  2. 图片批量重命名编号_碾压市面上90%“批量改名、批量重命名软件”
  3. IIS部署时提示:InvalidOperationException:未能映射路径“/”
  4. linux系列(十六):which命令
  5. python修行之路(六 三级菜单实例)
  6. 意外分配– JIT编译抖动
  7. python基础:python循环、三元运算、字典、文件操作
  8. 喜用神最正确的算法_各种电磁仿真算法的优缺点和适用范围(FDTD, FEM和MOM等)...
  9. Exchange Server 2010核心服务器角色介绍
  10. 分享基于silverlight的一个大文件上传控件
  11. uchome中的$_SC:系统全局配置
  12. Android嵌套滑动冲突
  13. android 大牛播放组件,大牛播放器安卓版_大牛播放器好不好用
  14. FlashMX2004组件事件简单调试器
  15. 华为android解锁,华为bootloader怎么解锁 华为手机bootloader解锁教程
  16. 低代码学习教程:如何编辑自定义打印模版?
  17. html默认office打开如何更改,怎么设置office默认打开方式,修改office的默认打开方式...
  18. NYOJ-71 独木舟上的旅行
  19. 大山深处的孩子,正在看见更远的星空
  20. 小程序毕设作品之微信积分商城小程序毕业设计成品(5)任务书

热门文章

  1. 运动蓝牙耳机哪个牌子好性价比高、性价比高的运动蓝牙耳机推荐
  2. poj1013 假硬币
  3. NOIP2017年易错选择题整理,我的错题本
  4. 三个动作就能养生健身!
  5. vs2017运行环境_从零开始针对 .NET 应用的 DevOps 运营实践 运行环境搭建
  6. 股票量化分析工具QTYX使用攻略系列——远程量化机器人
  7. 火狐浏览器打开一片空白解决方法
  8. JavaScript中BOM及DOM的学习
  9. 2080显卡服务器系统驱动,英伟达显卡2080ti设备驱动问题
  10. Java认识和开发环境搭建