- 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 设备的可靠识别。
