HcFmInterval 寄存器详解(OHCI 规范)

HcFmInterval Register = 帧间隔寄存器

1. 功能概述

HcFmInterval 是 USB OHCI(Open Host Controller Interface)主机控制器(HC)的核心寄存器之一,用于控制 USB 帧(Frame)的时间长度周期性传输的调度基准。它直接影响 SOF(Start of Frame)包的生成频率、帧计数器的最大值,以及 HC 的内部时钟校准。


2. 寄存器字段定义

HcFmInterval 是一个 32 位(Dword) 寄存器,包含以下关键字段:

位域 名称 功能描述
31:16 FI (Frame Interval) 定义 USB 帧的时长(单位:μs),默认值 0x2EDF(对应 11935 μs ≈ 12ms)。
15 FSMPS (Full Speed Max Packet Size) 控制全速(12 Mbps)设备的最大数据包大小(通常保留)。
14:0 保留位 必须保持写入时的原始值(Read-Modify-Write)。
FI(Frame Interval)的计算
  • 默认值0x2EDF(16 进制) = 11935 μs11.935 ms(接近 USB 标准的 1ms 帧,但 OHCI 允许更长帧)。
  • 实际帧长度
    HcFmInterval 帧间隔寄存器 - 图1

3. 核心作用

  1. 控制 SOF 生成频率

    • HC 每完成一个帧(Frame)后,会根据 FI 的值生成下一个 SOF 包(Start of Frame)。
    • SOF 是 USB 总线的时序基准,用于同步中断/等时传输。
  2. 定义帧计数器(Frame Counter)范围

    • FI 的值决定了帧计数器的最大值(HcFmNumber 寄存器)。
    • 例如,FI=0x2EDF 时,帧计数器范围为 0–0x2EDF(即 0–11935)。
  3. 影响周期性传输列表(Periodic List)

    • HcPeriodicStart 寄存器的有效值必须小于 FI
    • HC 会在每个帧周期内遍历 Periodic List,执行中断/等时传输。

4. 驱动(HCD)的配置要求

  1. 初始化设置

    • 硬件复位后,HcFmInterval 通常为 0x00002EDF(默认值)。
    • HCD 需确保 FI 值与 USB 设备的需求匹配(例如,兼容 USB 1.1 的 1ms 帧)。
    // 示例:设置帧间隔为 1ms(标准值)
    write_reg(HcFmInterval, 0x00002EDF);
  2. 动态调整(可选)

    • 某些场景(如低功耗模式)可能需要延长帧长度(增大 FI),但会降低传输实时性。
  3. 保留位处理

    • 修改 HcFmInterval 时,必须保留未使用的位(Read-Modify-Write 操作):
      uint32_t value = read_reg(HcFmInterval);
      value = (value & 0xFFFF0000) | 0x2EDF; // 仅修改低 16 位
      write_reg(HcFmInterval, value);

5. 硬件行为

  • 帧计数器回绕:当 HcFmNumber 达到 FI 值时,自动归零并触发 SOF。
  • HcControl 的关系:仅当 HCFS=10b (USBOPERATIONAL) 时,HC 才会基于 FI 生成 SOF。

6. 典型应用场景

  1. 标准 USB 通信

    • FI=0x2EDF 确保 1ms 帧间隔,兼容 USB 1.1/2.0 设备。
  2. 低功耗模式

    • 增大 FI 可减少 SOF 频率(如设为 10ms),但会降低中断传输的实时性。
  3. 调试与错误恢复

    • 修改 FI 可用于检测 HC 的时钟校准问题。

7. 注意事项

  • 不可设为 0FI 的最小值为 1,否则 HC 行为未定义。
  • 与 PHY 时钟同步FI 需与 HC 的基准时钟(通常 12 MHz)匹配。
  • 兼容性:非标准 FI 值可能导致 USB 设备无法正常枚举。

总结

HcFmInterval 是 OHCI 主机控制器的 时序核心寄存器,通过控制帧长度和 SOF 生成,直接影响 USB 总线的调度精度。驱动开发者需确保其配置符合协议要求,并在修改时严格遵守保留位规范。