HcRhStatus 寄存器详解(OHCI 规范)
1. 功能概述
HcRhStatus 是 USB OHCI 主机控制器中 根集线器(Root Hub)的全局状态寄存器,用于监控和控制根集线器的电源状态、过流保护等关键事件。该寄存器需在 主机控制器处于 USBOPERATIONAL 状态(HcControl.HCFS=10b) 时才能写入。
2. 寄存器字段定义
HcRhStatus 为 32 位(Dword) 寄存器,支持 读写(R/W) 和 写1清零(Write-1-to-Clear) 操作,具体位域如下:
| 位域 | 名称 | 类型 | 功能描述 |
|---|---|---|---|
| 31:17 | 保留位 | — | 必须写入 0,读取时忽略。 |
| 16 | CRWE (Clear Remote Wakeup Enable) |
W1C | 远程唤醒使能清零: • 写 1 清除 HcControl.RWE 位(禁用远程唤醒)。 |
| 15 | OCIC (Over-Current Indicator Change) |
R/W1C | 过流状态变化标志: • 1:检测到过流事件(需软件处理)。• 写 1 清零。 |
| 14 | LPSC (Local Power Status Change) |
R/W1C | 本地电源状态变化标志: • 1:电源状态变化(如从低功耗恢复)。• 写 1 清零。 |
| 13:2 | 保留位 | — | 必须写入 0,读取时忽略。 |
| 1 | OCIA (Over-Current Indicator Active) |
R | 过流激活状态(只读): • 1:当前存在过流条件(需紧急处理)。 |
| 0 | LPSC (Local Power Status) |
R/W | 本地电源状态: • 0:本地电源关闭(低功耗模式)。• 1:本地电源开启。 |
3. 核心功能
电源管理
- 通过
LPSC位控制根集线器的本地电源开关,支持低功耗模式。 LPSC变化时触发LPSC标志(需软件清零)。
- 通过
过流保护
OCIA实时反映过流状态,OCIC标志记录过流事件(需软件响应后清零)。- 典型处理流程:
if (read_reg(HcRhStatus) & (1 << OCIC)) { // 1. 禁用故障端口(写 HcRhPortStatus[n].PPS=0) // 2. 清除 OCIC 标志 write_reg(HcRhStatus, (1 << OCIC)); }
远程唤醒控制
- 通过
CRWE位快速禁用远程唤醒功能(无需修改HcControl寄存器)。
- 通过
4. 驱动开发示例
场景 1:处理过流事件
uint32_t status = read_reg(HcRhStatus);
if (status & (1 << OCIC)) {
// 禁用所有端口电源(假设全局电源模式)
write_reg(HcRhPortStatus[ALL_PORTS], (1 << PPS)); // PPS=0
// 清除 OCIC 标志
write_reg(HcRhStatus, (1 << OCIC));
}
场景 2:进入低功耗模式
// 关闭本地电源
uint32_t status = read_reg(HcRhStatus);
status &= ~(1 << LPSC); // LPSC=0
write_reg(HcRhStatus, status);
5. 硬件行为
- 写1清零(W1C)字段:
OCIC和LPSC标志位需通过写1清零,写0无效。 - 状态同步延迟:
修改LPSC后,需等待LPSC标志位触发(约 1ms)以确认电源状态切换完成。
6. 注意事项
- 写入时机:
仅在HcControl.HCFS=10b(USBOPERATIONAL)时写入有效,否则忽略。 - 保留位处理:
必须通过 Read-Modify-Write 操作保留未使用位。 - 过流恢复:
清除过流条件后,需重新使能端口电源(HcRhPortStatus[n].PPS=1)。
中文术语对照
| 英文 | 中文 |
|---|---|
| Over-Current | 过流 |
| Local Power | 本地电源 |
| Remote Wakeup | 远程唤醒 |
| Write-1-to-Clear (W1C) | 写1清零 |
总结
HcRhStatus 是根集线器的 全局状态与应急控制中心,驱动开发者需重点关注其过流事件处理和电源管理功能,确保在硬件异常时快速响应,同时遵循状态寄存器的访问规则(如 W1C 操作和状态机依赖)。
v1.0
LPSC 位于 bit[16]
