HcRhDescriptorA 寄存器详解(OHCI 规范)

1. 功能概述

HcRhDescriptorA 是 USB OHCI 主机控制器中 根集线器(Root Hub) 的核心配置寄存器,用于描述根集线器的 物理特性全局行为,例如端口数量、电源管理模式等。该寄存器在主机控制器初始化阶段由驱动(HCD)配置,且不受主机控制器状态影响(始终可写)。


2. 寄存器字段定义

HcRhDescriptorA32 位(Dword) 寄存器,具体位域如下:

位域 名称 功能描述
31:24 NDP (Number of Downstream Ports) 下行端口数量
• 值范围 0x010x0F(支持最多 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 补充扩展功能(如端口电流限制)。
  • 状态无关性
    无论主机控制器处于 USBRESETUSBOPERATIONAL 状态,均可修改此寄存器。

5. 注意事项

  1. 端口数量(NDP)

    • 必须与实际物理端口数一致,否则可能导致未定义行为。
    • OHCI 规范限定最大 15 个端口(0x0F)。
  2. 电源与过流配置

    • 若硬件不支持某功能(如独立电源),需将 NPSNOCP 设为 1
    • 错误配置可能损坏设备(如禁用过流保护时短路)。
  3. 复合设备(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. 注意事项

  1. 默认值
    • 硬件复位后 POTPGT 通常为 0x02(4 ms),但需以硬件手册为准。
  2. 与 USB 协议的关系
    • USB 2.0 规范要求至少 100 ms 的端口电源稳定时间(对应 POTPGT=0x32)。
    • OHCI 允许更小值以提高性能,但可能降低兼容性。
  3. 调试建议
    • 若设备频繁枚举失败,可尝试增大 POTPGT 值(如设为 0x64/200 ms)。

中文术语

  • PowerOnToPowerGoodTime电源开启至稳定时间
  • Port Power Status (PPS)端口电源状态
  • VBUS总线电压(USB 电源线)

总结

POTPGT 是平衡 电源稳定性枚举速度 的关键参数,驱动开发者需根据硬件手册配置合理值,并在电源操作后严格遵循等待时间,确保 USB 设备的可靠识别。