4、U1状态(省电状态1):进入条件、退出延迟、功耗节省对比

好,咱们接着聊LTSSM的省电状态。前面讲完了U0和U0的各个子状态,现在轮到U1了。

U1,全称是“省电状态1”。说白了,它就是USB链路在空闲时,进入的第一个浅度睡眠。我经常跟团队里的新人说,U1就是打个盹,U2才是睡大觉。这个比喻很形象,你想想看,打个盹醒来很快,但省的电也有限;睡大觉省电多,但醒来费劲。

在USB3.2和USB4里,U1的基本逻辑是一样的——链路空闲就睡,有数据就醒。但具体怎么睡、怎么醒,差别还真不小。我当年在调试一个USB4的功耗优化项目时,就因为在U1的退出延迟上没算对,导致整个系统的吞吐量上不去。嗯,这里面的坑,我待会儿会细说。

4.1 进入条件:谁说了算?

先看进入条件。U1的进入,不是设备想进就能进的,得链路两端的“主机”和“设备”都同意才行。

USB3.2的U1进入

在USB3.2里,进入U1的流程是这样的:

  • 空闲检测:链路层检测到一段时间内没有数据包传输。这个时间由硬件计数器控制,一般是几微秒到几十微秒。
  • 握手协商:一端(通常是主机)发送一个“进入U1”的请求(LGO_U1),另一端必须回复“同意”(LAU),然后双方一起切到U1。
  • 强制条件:如果链路长时间空闲(比如几百微秒),即使没握手,硬件也会强制进入U1。我见过有些老芯片在这个强制逻辑上有bug,导致链路卡死。

关键点:USB3.2的U1进入,是链路层主动发起的。主机说了算,但设备可以“拒绝”(NACK)。不过设备一般不会拒绝,除非它正在处理内部事务。

USB4的U1进入

USB4的U1进入,逻辑上更复杂一些,因为它要管理多条通道(Lane)。

  • 基于时间门限:USB4定义了一个“U1进入超时时间”(Timeout for U1 Entry),这个值可以在连接初始化时协商。我习惯把它设成10微秒左右,太短容易误触发,太长又省不了电。
  • 所有通道空闲:对于USB4的2通道模式,必须所有通道都空闲,才能进入U1。如果有一条通道还在传数据,另一条通道即使闲着,也不能进U1。这个设计我一开始觉得不合理,后来想想,是为了避免通道间状态不一致导致的同步问题。
  • 协议层参与:USB4的U1进入,不仅仅是链路层的事,协议层(比如DisplayPort隧道、PCIe隧道)也会参与决策。如果某个隧道还在工作,链路层就不能擅自进入U1。

注意:USB4的U1进入,比USB3.2多了“协议层仲裁”这一步。这意味着,即使物理链路空闲,如果协议层有未完成的事务,U1也进不去。我曾经遇到过一个案例,DisplayPort的音频流没停,导致U1一直进不去,功耗高了20%。

4.2 退出延迟:谁醒得快?

退出延迟,是衡量U1性能的核心指标。说白了,就是从“收到唤醒信号”到“链路恢复U0能传数据”需要多长时间。

这个时间,直接决定了系统的响应速度。如果延迟太大,CPU等数据等得花儿都谢了;如果延迟太小,又可能因为噪声误唤醒而频繁进出U1,反而更耗电。

USB3.2的U1退出延迟

USB3.2的U1退出,非常快。规范里给出的典型值是:

  • 退出延迟:约 1微秒几微秒
  • 唤醒机制:任何一端发送一个“退出U1”的信号(比如电气上的LFPS脉冲),另一端检测到后,立即开始恢复时钟和数据同步。

为什么这么快?因为U1状态下,PLL(锁相环)没有完全关闭,只是进入了低功耗模式。时钟还在跑,只是精度降低了。所以唤醒时,只需要重新锁定一下相位,不需要重新启动PLL。

我的经验:在USB3.2的U1退出延迟测试中,我见过最快的芯片能做到0.8微秒。但大多数芯片在1.5微秒左右。如果你在做系统级功耗优化,建议把U1的退出延迟设成2微秒,留点余量,避免因为工艺偏差导致时序违例。

USB4的U1退出延迟

USB4的U1退出,比USB3.2要慢一些。原因有两个:

  • 多通道同步:2条通道都要从U1恢复到U0,而且必须同步。如果一条通道先醒了,得等另一条通道也醒了,才能一起切回U0。这个等待时间,就是额外的开销。
  • 时钟恢复更复杂:USB4的速率更高(20Gbps甚至40Gbps),对时钟精度的要求也更高。U1状态下,时钟可能进入了更深的省电模式,恢复时需要更长的锁定时间。

USB4的U1退出延迟,规范里没有给出固定值,但根据我的实测:

  • 典型值:约 3微秒5微秒
  • 最差值:如果遇到通道间同步问题,可能达到10微秒以上。

对比总结:USB3.2的U1退出延迟约1-2微秒,USB4的U1退出延迟约3-5微秒。USB4慢了2-3倍,但换来的是更高的带宽和更灵活的隧道架构。这个取舍,我觉得是值得的。

4.3 功耗节省:省了多少电?

功耗节省,是U1存在的意义。如果省不了多少电,那还不如一直待在U0。

USB3.2的U1功耗节省

USB3.2的U1,功耗节省效果比较有限。因为PLL没关,只是降低了活动频率。

  • 典型功耗:U0状态下,一条USB3.2 Gen2链路(10Gbps)的功耗大约在 1-2瓦(包括PHY和链路层)。进入U1后,功耗可以降到 200-300毫瓦
  • 节省比例:大约节省了 70%-80% 的功耗。

这个比例看起来不错,但绝对值还是有点高。毕竟200毫瓦对于移动设备来说,还是不小的负担。所以USB3.2还有U2和U3,用来进一步省电。

USB4的U1功耗节省

USB4的U1,功耗节省效果更好。因为USB4的PHY设计更先进,而且U1状态下可以关闭更多的模拟电路。

  • 典型功耗:USB4 U0状态下,一条通道的功耗大约在 2-3瓦(40Gbps速率)。进入U1后,功耗可以降到 100-200毫瓦
  • 节省比例:大约节省了 90%-95% 的功耗。

为什么会这样?因为USB4的U1状态下,发送器和接收器的大部分模拟电路都可以关闭,只保留一个低功耗的检测电路,用来监听唤醒信号。而USB3.2的U1,发送器和接收器还处于半工作状态。

注意:USB4的U1功耗虽然低,但退出延迟长。如果你的应用场景是“频繁小数据包交互”(比如鼠标、键盘),那U1可能反而更耗电。因为频繁进出U1,退出时的功耗开销会抵消掉省下的电。我建议,对于这类设备,直接禁用U1,只用U0和U2。

4.4 核心差异对比表

好了,说了这么多,咱们用一张表来总结USB3.2和USB4在U1状态上的核心差异:

对比项 USB3.2 U1 USB4 U1
进入条件 链路层空闲检测 + 握手 所有通道空闲 + 协议层仲裁
退出延迟 1-2微秒 3-5微秒
功耗节省 70%-80%(降至200-300mW) 90%-95%(降至100-200mW)
PLL状态 低功耗模式,未关闭 可关闭,仅保留检测电路
适用场景 中等空闲时间(几十微秒级) 较长空闲时间(百微秒级以上)

4.5 知识体系流程图

为了让你更直观地理解U1状态在整个LTSSM中的位置,以及USB3.2和USB4的差异,我画了一张流程图:

U1状态:USB3.2 vs USB4 核心逻辑对比 U0(活动状态) 空闲检测 U1(省电状态1) 唤醒信号 U0(恢复活动) USB3.2 特点 • 链路层主动发起 • 单通道空闲即可 • 退出延迟:1-2μs • 功耗节省:70-80% • PLL低功耗模式 • 适合中等空闲 USB4 特点 • 协议层参与仲裁 • 所有通道空闲 • 退出延迟:3-5μs • 功耗节省:90-95% • PLL可完全关闭 • 适合较长空闲 核心差异总结 1. USB3.2 U1:快进快出,适合短时空闲,但省电有限。 2. USB4 U1:慢进慢出,适合长时空闲,省电效果显著。 3. 选择建议:根据系统空闲模式,灵活配置U1超时时间。

这张图很清楚地展示了:USB3.2的U1是“轻量级”的,适合快速响应;USB4的U1是“深度”的,适合长时间省电。两者没有绝对的好坏,关键看你的系统需求。

4.6 避坑指南

最后,分享几个我在项目中踩过的坑,希望能帮你少走弯路:

  • 坑1:U1超时时间设得太短。我曾经在一个USB4项目中,把U1进入超时设成了2微秒。结果链路稍微有点抖动,就频繁进出U1,导致吞吐量下降了30%。后来改成了10微秒,问题解决。
  • 坑2:忽略协议层的影响。在USB4中,如果DisplayPort或PCIe隧道有未完成的事务,U1是进不去的。我建议在调试时,先确认所有隧道都处于空闲状态,再测试U1的功耗。
  • 坑3:退出延迟测试不准确。测试U1退出延迟时,一定要用示波器抓取LFPS信号和数据的恢复时间。不要只看软件日志,软件日志的精度不够,容易误导。

我的建议:对于大多数消费电子产品,U1的进入超时设在10-20微秒是比较合理的。既不会太敏感,也不会太迟钝。如果你在做低功耗IoT设备,可以适当延长到50微秒,减少进出U1的次数。

好了,U1状态就讲到这里。记住一句话:U1是USB链路省电的第一道防线,用好了能省不少电,用不好反而会拖累性能。下一章,咱们聊聊U2状态,那个才是真正的“深度睡眠”。


公众号:蓝海资料掘金营,微信deep3321