- HcRhDescriptorA 寄存器详解(OHCI 规范)
- 1. 功能概述
- 2. 寄存器字段定义
- 3. 典型配置示例
- 场景 1:2 端口独立电源控制
- 场景 2:4 端口全局电源(低成本设计)
- 4. 硬件行为
- 5. 注意事项
- 中文译名与术语
- 总结
- v1.0
- bit[9] NPS
- NoPowerSwitching (NPS) 位详解
- 1. 功能定义
- 2. 与
PowerSwitchingMode
(PSM) 的关系 - 3. 硬件依赖性与配置建议
- 4. 驱动开发注意事项
- 5. 与 USB 协议的关联
- 中文技术术语
- 总结
- bit[31,24] POTPGT
- PowerOnToPowerGoodTime (POTPGT) 参数详解
- 1. 功能定义
- 2. 作用场景
- 3. 典型配置
- 4. 驱动开发实现
- 5. 硬件行为
- 6. 注意事项
- 中文术语
- 总结
HcRhDescriptorA 寄存器详解(OHCI 规范)
1. 功能概述
HcRhDescriptorA
是 USB OHCI 主机控制器中 根集线器(Root Hub) 的核心配置寄存器,用于描述根集线器的 物理特性 和 全局行为,例如端口数量、电源管理模式等。该寄存器在主机控制器初始化阶段由驱动(HCD)配置,且不受主机控制器状态影响(始终可写)。
2. 寄存器字段定义
HcRhDescriptorA
为 32 位(Dword) 寄存器,具体位域如下:
位域 | 名称 | 功能描述 |
---|---|---|
31:24 | NDP (Number of Downstream Ports) |
下行端口数量: • 值范围 0x01 –0x0F (支持最多 15 个端口)。• 例如 0x02 表示 2 个 USB 端口。 |
23:13 | PSM (Power Switching Mode) |
电源切换模式: • 0 :全局电源模式(所有端口共用一个电源开关)。• 1 :每端口独立电源控制。 |
12 | NPS (No Power Switching) |
无电源切换: • 1 :根集线器不支持电源开关(始终供电)。• 0 :支持电源开关(依赖 PSM )。 |
11 | DT (Device Type) |
设备类型: • 0 :通用集线器(Compatible Hub)。• 1 :复合设备(Compound Device)。 |
10:8 | OCPM (Over-Current Protection Mode) |
过流保护模式: • 0 :全局过流保护(所有端口共享一个检测电路)。• 1 :每端口独立过流保护。 |
7 | NOCP (No Over-Current Protection) |
无过流保护: • 1 :禁用过流保护(风险操作!)。• 0 :启用过流保护。 |
6:0 | 保留位 | 必须写入 0 ,读取时忽略。 |
3. 典型配置示例
场景 1:2 端口独立电源控制
// NDP=2, PSM=1 (每端口电源), NPS=0 (支持开关), DT=0 (通用集线器), OCPM=1 (独立过流保护)
uint32_t value = (0x02 << 24) | (1 << 13) | (0 << 12) | (0 << 11) | (1 << 8);
write_reg(HcRhDescriptorA, value);
场景 2:4 端口全局电源(低成本设计)
// NDP=4, PSM=0 (全局电源), NPS=0, OCPM=0 (全局过流)
uint32_t value = (0x04 << 24) | (0 << 13) | (0 << 12) | (0 << 8);
write_reg(HcRhDescriptorA, value);
4. 硬件行为
- 初始化要求:
该寄存器必须在 主机控制器启动前 配置,以匹配硬件设计(如端口数量、电源电路类型)。 - 与
HcRhDescriptorB
的关系:DescriptorA
定义基础特性,DescriptorB
补充扩展功能(如端口电流限制)。 - 状态无关性:
无论主机控制器处于USBRESET
或USBOPERATIONAL
状态,均可修改此寄存器。
5. 注意事项
端口数量(NDP):
- 必须与实际物理端口数一致,否则可能导致未定义行为。
- OHCI 规范限定最大 15 个端口(
0x0F
)。
电源与过流配置:
- 若硬件不支持某功能(如独立电源),需将
NPS
或NOCP
设为1
。 - 错误配置可能损坏设备(如禁用过流保护时短路)。
- 若硬件不支持某功能(如独立电源),需将
复合设备(DT=1):
- 仅当根集线器与主机控制器为同一物理芯片时使用,需配合
HcRhDescriptorB
配置。
- 仅当根集线器与主机控制器为同一物理芯片时使用,需配合
中文译名与术语
- HcRhDescriptorA → 根集线器描述符寄存器A
- NDP → 下行端口数量
- PSM → 电源切换模式
- OCPM → 过流保护模式
总结
HcRhDescriptorA
是 OHCI 根集线器的 硬件能力声明寄存器,驱动开发者需根据实际硬件特性(如端口数、电源设计)精准配置,否则可能导致功能异常或硬件故障。配置时需严格遵循字段定义,并优先参考具体硬件手册的推荐值。
v1.0
bit[9] NPS
NoPowerSwitching (NPS) 位详解
1. 功能定义
NoPowerSwitching
(NPS)是 HcRhDescriptorA
寄存器中的一个控制位(位12),用于声明 根集线器(Root Hub)的电源管理能力:
0
:根集线器的端口支持 电源开关控制(可通过软件开启/关闭端口供电)。1
:端口 始终供电(只要主机控制器上电,端口即带电,无软件控制能力)。
2. 与 PowerSwitchingMode
(PSM) 的关系
- 当
NPS=0
时:PSM
(位23-13)进一步指定电源切换模式:PSM=0
:全局电源切换(所有端口共用一个电源开关)。PSM=1
:每端口独立电源切换(每个端口有独立开关)。
- 当
NPS=1
时:PSM
字段无效(硬件忽略其值),端口始终供电。
3. 硬件依赖性与配置建议
- 实现相关:
该功能完全依赖硬件设计。若硬件无电源开关电路,必须设NPS=1
。 - 典型场景:
- 低成本设计:
NPS=1
(省去电源开关电路)。 - 高灵活性设计:
NPS=0
+PSM=1
(支持独立控制每个端口的电源)。
- 低成本设计:
4. 驱动开发注意事项
- 初始化时必须配置:
// 示例:禁用电源切换(端口始终供电) uint32_t desc_a = read_reg(HcRhDescriptorA); desc_a |= (1 << 12); // 设置 NPS=1 write_reg(HcRhDescriptorA, desc_a);
- 安全影响:
NPS=1
时,无法通过软件切断故障端口的电源,可能增加短路风险。- 若硬件实际支持电源切换但误设
NPS=1
,会导致电源管理功能失效。
5. 与 USB 协议的关联
- USB 2.0 规范要求:
集线器必须支持电源切换(NPS=0
),除非是 总线供电(Bus-Powered) 的低功耗集线器。 - OHCI 的灵活性:
允许通过NPS
位适配不同硬件设计,但需在驱动中正确声明。
中文技术术语
- NoPowerSwitching (NPS) → 无电源切换
- PowerSwitchingMode (PSM) → 电源切换模式
- Global/Per-Port Switching → 全局/每端口电源切换
总结
NoPowerSwitching
是硬件能力的声明位,驱动开发者需根据实际电路设计配置该位,并确保与 PSM
字段的逻辑一致性。错误配置可能导致电源管理功能异常或硬件兼容性问题。
bit[31,24] POTPGT
PowerOnToPowerGoodTime (POTPGT) 参数详解
1. 功能定义
PowerOnToPowerGoodTime
(简称 POTPGT)是 USB 根集线器(Root Hub)的一个关键时间参数,用于指定 从端口电源开启到稳定可用的最小等待时间。
- 单位:2 ms(毫秒)
- 计算公式:实际等待时间 =
POTPGT 值 × 2 ms
2. 作用场景
当主机控制器驱动(HCD)通过 HcRhPortStatus[n].PPS
(Port Power Status)开启某端口的电源后,必须等待 POTPGT × 2 ms 才能对该端口执行操作(如复位、枚举设备)。
- 硬件依赖:该值由根集线器硬件设计决定(如电源电路响应速度)。
3. 典型配置
POTPGT 值 | 实际等待时间 | 适用硬件 |
---|---|---|
0x01 |
2 ms | 快速响应的电源电路(如低功耗设计) |
0x32 (50) |
100 ms | 高电流端口(需更长时间稳定电压) |
0xFF (255) |
510 ms | 极端保守设计(兼容性测试) |
4. 驱动开发实现
// 示例:开启端口后等待电源稳定
void enable_port(uint8_t port_num) {
// 1. 开启端口电源
write_reg(HcRhPortStatus[port_num], (1 << PPS)); // PPS=1
// 2. 读取 POTPGT(通常存储在 HcRhDescriptorB 或硬件手册指定位置)
uint8_t potpgt = (read_reg(HcRhDescriptorB) >> 24) & 0xFF;
// 3. 计算等待时间(单位:微秒)
uint32_t delay_us = potpgt * 2000; // 2 ms → 2000 μs
// 4. 延时(需根据操作系统选择API)
udelay(delay_us); // Linux内核中的微秒级延时函数
}
5. 硬件行为
- 电源稳定信号:
硬件内部通过电压检测电路判断电源是否达到VBUS
稳定值(通常 4.75–5.25V),但软件仅需依赖 POTPGT 计时。 - 超时处理:
若等待时间不足,后续端口操作(如发送复位信号)可能导致设备枚举失败。
6. 注意事项
- 默认值:
- 硬件复位后 POTPGT 通常为
0x02
(4 ms),但需以硬件手册为准。
- 硬件复位后 POTPGT 通常为
- 与 USB 协议的关系:
- USB 2.0 规范要求至少 100 ms 的端口电源稳定时间(对应
POTPGT=0x32
)。 - OHCI 允许更小值以提高性能,但可能降低兼容性。
- USB 2.0 规范要求至少 100 ms 的端口电源稳定时间(对应
- 调试建议:
- 若设备频繁枚举失败,可尝试增大 POTPGT 值(如设为
0x64
/200 ms)。
- 若设备频繁枚举失败,可尝试增大 POTPGT 值(如设为
中文术语
- PowerOnToPowerGoodTime → 电源开启至稳定时间
- Port Power Status (PPS) → 端口电源状态
- VBUS → 总线电压(USB 电源线)
总结
POTPGT 是平衡 电源稳定性 与 枚举速度 的关键参数,驱动开发者需根据硬件手册配置合理值,并在电源操作后严格遵循等待时间,确保 USB 设备的可靠识别。