Android USB电源管理
The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host.
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电源管理
The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host. 1 驱动shutdown顺序 系统关机或重启的过程中,会调用设备驱动的shutdown函数来完成设备的关闭操作,有需要的设备可以在驱动中定义该函数。其…...
YOLO目标检测——路标数据集+已标注voc和yolo格式标签下载分享
实际项目应用:自动驾驶、视频监控和安防、物体识别和分类、城市规划和地理信息系统等等数据集说明:YOLO路标目标检测数据集,真实场景的高质量图片数据,数据场景丰富,图片格式为jpg,共900张图片,…...
Item-Based Recommendations with Hadoop
Mahout在MapReduce上实现了Item-Based Collaborative Filtering,这里我尝试运行一下。 安装Hadoop 从下载Mahout并解压 准备数据 下载1 Million MovieLens Dataset,解压得到ratings.dat,用 sed ‘s/:😦[0-9]{1,}):😦…...
基于物理层网络编码的相位同步算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................%数据长度 Len…...
数据结构——七大排序[源码+动图+性能测试]
本章代码gitee仓库:排序 文章目录 🎃0. 思维导图🧨1. 插入排序✨1.1 直接插入排序✨1.2 希尔排序 🎊2. 选择排序🎋2.1 直接选择排序🎋2.2 堆排序 🎏3. 交换排序🎐3.1 冒泡排序&#…...
G. The Morning Star
Problem - G - Codeforces 思路:想了挺长时间的,一直没想到一个简便的方法在瞎搞。我们发现对于某个点来说,其他的点如果能够跟他匹配,那么一定在这8个方向上,而同时这8个方向其实对应这4条直线,假设点为(x…...
电池的健康状态 SOH 估计
电池的健康状态 SOH 估计 SOH(State of Health)估计通常用于描述电池的健康状态,即电池当前容量与初始容量的比值。 一种常见的SOH估计方法是基于经验的电池寿命预测方法,包括循环周期数法、安时法与加权安时法、面向事件的老化…...
Web 安全之 Permissions Policy(权限策略)详解
什么是 Permissions Policy(权限策略)? Permissions Policy 为 web 开发人员提供了明确声明哪些功能可以在网站上使用,哪些功能不能在网站上使用的机制。可以设置一组策略,用于限制站点代码可以访问的 API 或者修改浏…...
【黄啊码】nginx如何设置php运行的
禁止访问 PHP 脚本可以通过 Nginx 服务器配置中的多种方式来实现。以下是其中的一些常见方法,您可以根据实际需求选择合适的方式: 1 禁用 PHP 解析: 在 Nginx 配置中,确保 PHP 脚本无法被解析,从而禁止 PHP 执行。 lo…...
无涯教程-JavaScript - ISPMT函数
描述 ISPMT函数计算在特定投资期间支付的利息。提供此功能是为了与Lotus 1-2-3兼容。 语法 ISPMT (rate, per, nper, pv)争论 Argument描述Required/OptionalRateThe interest rate for the investment.RequiredPerThe period for which you want to find the interest, an…...
LeetCode 面试题 03.05. 栈排序
文章目录 一、题目二、C# 题解 一、题目 栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和…...
构建微服务项目时启动网关服务失败的解决方案
启动网关服务时报“Unable to create the temporary folder: C:\WINDOWS\TEMP\/nio-file-upload”错误。 代码与之前没有任何变化,但就是启动不了,观察错误意思大概是不能创建临时文件夹:C盘下的WINDOWS下的TEMP目录下的nio-file-upload这个东…...
零基础教程:使用yolov8训练无人机VisDrone数据集
1.准备数据集 1.先给出VisDrone2019数据集的下载地址: 链接:https://pan.baidu.com/s/1e2Q0NgNT-H-Acb2H0Cx8sg 提取码:31dl 2.将数据集VisDrone放在datasets目录下面 2.数据集转换程序 1.在根目录下面新建一个.py文件,取名叫…...
【Mysql专题】使用Mysql做排行榜,线上实例
背景 我们这里有个需求,对存量用户的余额做排行处理,这个实现方式很多,这边介绍的是,通过Mysql直接实现,将排名也直接返回出来。 我知道大家在网上能找到一大把这种实例,我在这里可不是【重复造轮子】。我…...
matlab数据处理: cell table array+datetime
原数据文件.csv matlab xlsread(filename{i},B2:T2881) 会同于Excel最多1048576行 舍弃 a{1,i} xlsread(filename{i},‘B2:T2881’);%读取excel文件,选定区域’B2:G2881’ readcell(filename{i},Range,E2:M2881) 会全部读取 优选 对于日期 yyyy-MM-dd HH:mm:ss.000 matlab cel…...
如何应用运营商大数据精准营销?
如何应用运营商大数据精准营销? 越来越多的企业逐渐觉察到运营商大数据所带来的商业价值,精准营销也被他们用的越来越娴熟。那么,企业的大数据精准营销该如何应用呢?想必是很多资源有限的中小型公司最想了解的。 一 数据驱动运营…...
AJAX学习笔记5同步与异步理解
AJAX学习笔记4解决乱码问题_biubiubiu0706的博客-CSDN博客 示例 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>演示AJAX同步和异步</title> </head> <body> <script…...
911面试
WebPack分包 webpack分包 ts泛型 ts泛型 优化if-else和switch 优化if-else 左侧固定,右侧自适应 左侧固定,右侧自适应...
【Java基础篇 | 面向对象】—— 继承
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 继承允许一个类继承另一个…...
DELL precision上安装nvidia A4000驱动 cuda cudnn
一、安装驱动 参考这篇文章进行安装Ubuntu安装Nvidia显卡驱动_Kevin__47的博客-CSDN博客 【出现问题】 禁用nouveau后出现黑屏,有几行代码,断线一直在闪 【解决方法】 1、参考这篇文章Ubuntu20.04安装nvidia显卡驱动并解决重启后黑屏问题_ubuntu安装…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
