【CP210x 专栏】USB挂起(Suspend)和远程唤醒(Remote Wakeup)之间的关系
USB挂起(Suspend)和远程唤醒(Remote Wakeup)之间存在密切的关系,它们是一对相互配合的电源管理机制。让我详细解释它们之间的关系:
1. 概念定义
USB挂起(Suspend)
- 当USB总线上长时间没有活动时,USB主机(电脑)会将USB设备置于低功耗的挂起状态
- 在挂起状态下,设备大部分功能会被暂停以节省电力
- 设备进入一种"睡眠"模式,仅维持最基本的电路运行
远程唤醒(Remote Wakeup)
- 允许处于挂起状态的USB设备主动唤醒USB主机的功能
- 当设备检测到特定事件(如数据到达、状态变化等)时,可以向主机发送唤醒信号
- 使设备能够从挂起状态中恢复并重新开始正常工作
2. 两者之间的关系
依赖关系
- 远程唤醒依赖于挂起状态的存在:只有当设备处于挂起状态时,远程唤醒才有意义
- 挂起为远程唤醒提供了应用场景:没有挂起机制,就不需要远程唤醒功能
协同工作机制
// 在驱动中可以看到这种协同工作的体现:
static int ch343_port_activate(struct tty_port *port, struct tty_struct *tty)
{
...
ch343->control->needs_remote_wakeup = 1; // 启用远程唤醒
...
}
static void ch343_port_shutdown(struct tty_port *port)
{
...
ch343->control->needs_remote_wakeup = 0; // 禁用远程唤醒
...
}
3. 实际工作流程
- 系统空闲: USB主机检测到一段时间内无数据传输
- 进入挂起: 主机将USB设备置于挂起状态,设备进入低功耗模式
- 事件发生: 设备检测到外部事件(如串口接收到数据)
- 远程唤醒: 设备发送特殊的唤醒信号给主机
- 系统恢复: 主机退出挂起状态,恢复正常操作
- 继续通信: 数据传输得以继续进行
4. 技术实现要点
设备端要求
- 设备必须支持远程唤醒功能(硬件支持)
- 驱动需要正确设置
needs_remote_wakeup标志 - 设备需能在挂起状态下监控特定事件
主机端要求
- USB主机必须支持远程唤醒功能
- 需要在设备描述符中声明支持远程唤醒
- 主机操作系统需要启用相应的电源管理策略
5. 应用场景举例
对于串口设备来说,远程唤醒特别有用:
- 当计算机进入睡眠模式时,串口设备也进入挂起状态
- 如果外部设备通过串口发送数据,串口芯片可以检测到这一事件
- 芯片触发远程唤醒,通知主机有数据到达
- 主机从睡眠中唤醒,应用程序可以及时处理接收到的数据
这种方式既保证了系统的节能效果,又确保了对外部事件的及时响应能力,是在移动设备和嵌入式系统中非常重要的电源管理技术。
6. CP2102N 远程唤醒测试
要测试 CP2102N 的远程唤醒功能,必须先让 CP2102N 处于 USB 挂起状态。
为什么需要先进入挂起状态?
根据 CP2102N 数据手册的功能描述:
-
WAKEUP 引脚只在 USB 挂起状态下有效:
-
当 CP2102N 处于正常 USB 活动状态时,WAKEUP 引脚的状态变化不会产生唤醒信号。
-
只有当设备进入 USB 挂起状态(由主机通过 USB 总线挂起命令触发)时,WAKEUP 引脚的触发才能启动唤醒序列。
-
-
USB 挂起的触发条件:
-
主机操作系统进入睡眠/休眠模式
-
USB 主机控制器执行选择性挂起
-
手动触发系统挂起(如
sudo systemctl suspend)
-

浙公网安备 33010602011771号