1 驱动shutdown顺序
系统关机或重启的过程中,会调用设备驱动的shutdown函数来完成设备的关闭操作,有需要的设备可以在驱动中定义该函数。其调用流程如下:
kernel_restart
kernel_restart_prepare
device_shutdown // 逆向遍历devices_kset->list所有device
dev->driver->shutdown

由此可见,各个驱动shutdown的顺序由设备在链表中的位置决定,后添加的先调用。设备添加到链表中的流程如下:

device_initialize
device_add
kobject_add
kobj_kset_join
list_add_tail(&kobj->entry, &kobj->kset->list)

由此可见,设备注册时,会把节点添加到devices_kset->list末尾。因此驱动的shutdown顺序是设备注册的逆序,而在通过dts创建设备的系统中,设备的注册顺序是设备节点在dts中的前后顺序。

2 USB主机PORTSC寄存器
2.1 EHCI
Connected:
PORTSC1.CCS (bit 0) - Current Connection Status
PORTSC1.CSC (bit 1) - Connection Status Change

Reset - Great Than 10ms:
PORTSC1.PR (bit 8) - Port Reset
PORTSC1.PE (bit 2) - Port Enable

Disconnected:
PORTSC1.CCS (bit 0) 
PORTSC1.CSC (bit 1)
PORTSC1.PEC(bit 3) - Port Enable Change

2.2 xHCI
Connected:
PORTSC.CCS (bit0 ) - Current Connection Status

Reset - Great Than 10ms:
PORTSC.PR (bit4) - Port Reset
PORTSC.PED (bit1) - Port Enabled/Disabled

echo "file xhci-hub.c +p" > /d/dynamic_debug/control
dmesg -n4
wPortStatus & 0x03表示复位成功

3 EHCI电源管理
3.1 休眠唤醒流程

suspend usb_device时,先suspend usb interface,再挂起整个设备,也就是调用generic.c(类似于Windows CCGP)驱动的generic_suspend();
resume usb_device时,先唤醒整个设备,也就是调用generic.c(类似于Windows CCGP)驱动的generic_resume(),再resume usb interface。

3.2 LS/FS/HS Early Suspend Interrupt
DWC2 databook indicates if the core sets "ErlySusp" bit, an idle state has been detected on the USB for 3 ms. This situation can be occurred when waiting a request from user daemon. So, we should keep the connection between udc and gadget even though this interrupt is occurred.

3.3 External Hub reset-resume Issue
hub_port_connect_change()
usb_detect_quirks(), which will set“udev->persist_enabled = 1”
hub_activate(), which checks“udev->persist_enabled == 1”,
then sets “udev->reset_resume = 1; ”the“reset_resume”flag will cause EHCI stack calls
usb_port_resume() to reset the external hub when the system exits suspend-to-RAM.

3.4 HS Device Suspend和Resume
Suspend:
1)高速设备在收到挂起信号(3ms空闲)后,应在0.125ms内切换到全速状态,也就是说要把下拉终端电阻45Ω移除,并在D+数据线上重新挂上1.5k上拉电阻。
2)设备在随后的100-875μs内检测数据线上的状态。如果该状态是一个Full speed J,那么说明host发下来的是一个挂起信号;如果此时该状态是SE0,说明是host drive数据线D+/D-到0,这是一个复位信号(复位信号会持续至少10ms时间)。
Resume:
因为设备挂起时处于全速状态,当host需要设备退出suspend状态时,先发送一个持续时间超过20ms的Fulll Speed K状态,设备看到K状态结束的1.3us(持续2个 LS bit位时间)内醒过来,而host需要在3ms内发送uSOF信号以维持正常的高速信号模式,否则设备又将进入suspend。

4 xHCI电源管理

4.1 Gadget Runtime-PM APIs
@ include/linux/usb/gadget.h
static inline int usb_gadget_autopm_get(struct usb_gadget *gadget);
static inline void usb_gadget_autopm_put(struct usb_gadget *gadget);

4.2 HS LPM
L0:means ON
L1:means SLEEP
L2:traditional USB 2.0 suspend
L3:means OFF

4.3 SS LPM
U0: normal work
U1/U2: 一般都不支持的,Linux DT直接禁止了,因为绝大部分的USB3的U1/U2都是有问题的。
U3: suspend

4.4 USB3 Resume
1)LTSSM处于U3状态;
2)PHY收到LFPS WAKEUP信号,通知Link层LTSSM,LTSSM指导PHY也发送LFPS给对端设备;
3)LTSSM进入Recovery状态,包括TS1,TS2,IDLE训练;
4)持续发送TS1直到成功接收到对端发送的8个TS1,然后进入TS2阶段;在TS2阶段,需要接收到对端发送的至少8个TS2,并且自己给对端至少也发送了16个TS2,此时TS1,TS2训练成功;
5)确认TS1和TS2训练是否成功,如果TS1和TS2都成功,转入下一步;否则,如果TS1或者TS2训练失败,转入SS.Inactive;
6)LTSSM指导PHY进行IDLE训练,接收到对端发送的至少8个空闲符号时,确保自己也同时至少发送了16个IDLE符号给对端;
7)确认上一步是否成功,如果成功,转入U0;否则转入SS.Inactive。
注意:
LFPS和IDLE都是PIPE(PHY Interface for PCI Express)接口PHY实施的;
而TS1,TS2训练序列是LTSSM生成的数据;
LGOOD_0 to LGOOD_7的发送表示Link层已成功收到对端发送的数据(CRC校验正确);
LCRD_A to LCRD_D(CRD means Credit)的发送表示Link层已成功将接收的数据push入protocol层,说明Link层LCRD_X对应的buffer可用了(USB3协议实施时,Link层最多可缓存接收到的4个packets)。

4.5 全局禁止运行时autosuspend
echo -1 >/sys/module/usbcore/parameters/autosuspend

4.6 autosuspend
Intel APL (Gen9, A39X0) 8-port MPH xHCI会注册2个host,一个是usb1(LS/FS/HS),另一个是usb2(SS)。
禁止usb1电源管理:
echo on > /sys/bus/usb/devices/usb1/power/control
禁止usb2电源管理:
echo on > /sys/bus/usb/devices/usb2/power/control

5 Abbreviations
ARC:Argonant RISC Core
CCGP:Windows USB Common Class Generic Parent,Linux内核类似的驱动就是usb_generic_driver(generic.c)
CCGP MI_:Common Class Generic Parent Multi Interface
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
MDATA:More DATA,USB双缓冲(ep_kind配置使能)切换机制对应到DATA0和DATA1
Quirks:the attributes of a device that are considered to be noncompliant with expected operation
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.
USB Host枚举时-71错误码可能原因:DP和DM走线太长导致眼图差;DP和DM接反了
USB KVM:KVM是键盘(Keyboard)、显示器(Video)、鼠标(Mouse)的缩写;KVM端口是25-pin,包含VGA接口和USB接口
uSOF:micro Start of Frame,125us

Android USB电源管理相关推荐

  1. Android的电源管理

    我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论: 应用层的使用: Android提供了现成android.os.PowerManager类,该 ...

  2. android电源驱动程序,[转]Android虚拟电源管理驱动

    Android系统如果没有电源管理相关的驱动程序,在启动时将会提示如下错误: I/SystemServer(   50): Starting Battery Service. E/BatterySer ...

  3. 【Android】电源管理,进入和退出 Suspend To RAM

    汽车电源管理 CarPowerManagementService 实现 Suspend To RAM 以及 Shutdown: CarPowerManager 电源状态改变时的回调: 深度睡眠功能(将 ...

  4. usb电源管理允许计算机关闭此设备,关闭USB设备电源和关闭USB电源设备的两种解决方案...

    症状: 当您发现"可移动硬盘图标"经常无缘无故消失,然后自己再次出现. 您可以将这种现象称为"电源关闭"或"电源关闭". 在这种情况下硬盘变 ...

  5. Android之电源管理 PowerManager解决远程拍照手机黑屏问题

    解决的问题: 这次使用PowerManager是因为我们后台远程拍照的时候,不支持手机黑屏情况拍照,如果手机黑屏,然后用PowerManager进行临时运行CPU 功能介绍: PowerManager ...

  6. android系统自动休眠代码流程,Android P 电源管理(4)待机流程

    电视遥控器,短端走待机(str待机)流程, 长按是关机,走关机流程,记录下待机流程. 参考博客 待机流程 Android P引入自动待机功能,只有存在WakeLock,wakeup_count就不会为 ...

  7. android电源管理

    Android 的电源管理也是很重要的一部分.比如在待机的时候关掉不用的设备,timeout之后的屏幕和键盘背光的关闭,用户操作的时候该打开多少设备等等,这些都直接关系到产品的待机时间,以及用户体验. ...

  8. android 休眠唤醒驱动流程分析,Android 电源管理——gotosleep和userActivity关注

    一.Android power management应用层分析 Android提供了android.os.PowerManager类,该类用于控制设备的电源状态的切换. 该类对外有三个接口函数: 1. ...

  9. Android 电源管理————gotosleep和userActivity关注

    一.Android power management应用层分析 Android提供了android.os.PowerManager类,该类用于控制设备的电源状态的切换.     该类对外有三个接口函数 ...

  10. linux 电源管理 唤醒,Android 4.0 中的PowerManager(电源管理--休眠唤醒) [转]

    转发请注明出处: 最近,在学习让系统进入休眠的过程中,学习了电源管理的相关知识.为了备忘和理清思路现整理成文,以便日后查阅. 移动设备由于自身的限制有一个硬伤就是电量的消耗问题.由于电池的电量有限,所 ...

最新文章

  1. python界面不同按钮实现不同功能-python tkinter实现界面切换的示例代码
  2. from import 导入时找不到module的解决办法(Python模块包中_init_.py文件的作用)
  3. redis 能不能监听特定的key失效_php监听redis key失效触发回调事件
  4. Spring异步调用原理及SpringAop拦截器链原理
  5. python-变量操作-字符串
  6. Spring Data Elasticsearch案例详解
  7. svn ignore 命令行用法
  8. 删除小于一定尺寸的模型
  9. 安装phpmyadmin
  10. 西南交通大学计算机应用基础,西南交通大学计算机应用基础作业-客观部分
  11. c语言伪代码写for循环,伪代码撰写规范
  12. NLP自然语言理解-中科院(宗成庆) P1~P4
  13. uat测试和sit测试_测试三角形,金字塔和圆形以及UAT
  14. 小米开源文件管理器MiCodeFileExplorer-源码研究(9)-入口分析
  15. 2017.9.29 红红火火恍恍惚惚
  16. 2022快手春节跳一跳红包到 怎么获得66元红包?
  17. java 读取word 带格式_java读取word带格式_游戏下载_游戏攻略资讯_尽在搜狗爱玩
  18. openGL控制FPS (每秒传输的帧数)
  19. SSRF在有无回显方面的利用及其思考与总结
  20. u盘启动 联想一体机_联想一体机怎么设置U盘启动?

热门文章

  1. 在R和Python中求峰度和偏度
  2. 怎样使用计算机的桌面助手,win10系统有一个360桌面助手如何使用
  3. 2116: 简简单单的数学题(快速幂||爆longlong处理)
  4. 微信小程序资源汇总整理
  5. 【模型 5.0】幸福sharp模型之专注:上一次的巅峰体验是什么时候?
  6. java4.25生成车牌号_泸牌16年涨882倍 超25万人拍一张车牌为哪般?
  7. 串口485接法图_485通讯接线方式
  8. 首届技术播客月开播在即
  9. matlab用imcrop进行图片裁剪,并用imwrite存图
  10. Origin 2017 给曲线加标记符号