USB OHCI(Open Host Controller Interface) 规范中,HcPeriodicStart 是一个关键寄存器,用于控制 周期性传输(Periodic Transfers) 的起始帧号。

以下是其详细说明:


1. 作用

HcPeriodicStart 定义了主机控制器(HC)开始处理 周期性传输列表(Periodic List) 的起始帧号(Frame Number)。

  • 周期性传输 包括:
    • 中断传输(Interrupt Transfers)
    • 等时传输(Isochronous Transfers)
      这些传输需要在固定的时间间隔(如每 N 帧)被调度。

2. 寄存器特性

  • 位宽:通常为 15-bit(具体取决于实现,但至少覆盖 14-bit 帧号)。

    ?

  • 有效值范围0x0000HcFmInterval 寄存器中定义的 最大帧号减 1(例如,若帧列表长度为 1024,则范围为 0–1023)。
  • 复位值:硬件复位后通常为 0x0000

3. 工作原理

  1. 帧号(Frame Number)

    • HC 内部维护一个 14-bit 帧计数器,每 1ms 递增一次(对应 USB 的 1ms 帧周期)。
    • 当帧计数器达到 HcFmInterval 中定义的最大值(如 0x2EDF)时,自动回绕到 0。
  2. 周期性列表的触发条件

    • 当前帧号 ≥ HcPeriodicStart 时,HC 开始遍历 Periodic List(存储在内存中的链表结构),执行其中的传输描述符(TDs)。
    • 例如:若 HcPeriodicStart=100,则 HC 会在帧号 100 时开始调度周期性传输。
  3. HcFmInterval 的关系

    • HcFmInterval 定义了帧列表的总长度(如 1024 帧),而 HcPeriodicStart 决定从哪一帧开始处理周期性传输。
    • 典型配置:
      HcFmInterval = 0x2EDF;  // 默认帧间隔(对应 11935 μs,约 12ms)
      HcPeriodicStart = 0x0000; // 从第 0 帧开始处理 Periodic List

4. 驱动(HCD)的职责

  1. 初始化

    • 在 HC 初始化阶段,HCD 需设置 HcPeriodicStart 为一个合理的起始帧号(通常为 0)。
    • 示例代码:
      write_reg(HcPeriodicStart, 0x0000); // 从第 0 帧开始
  2. 动态调整

    • 若需延迟周期性传输(如电源管理),HCD 可修改 HcPeriodicStart 为未来的帧号:
      current_frame = read_reg(HcFmNumber); // 读取当前帧号
      write_reg(HcPeriodicStart, current_frame + 10); // 10 帧后启动

5. 硬件行为

  • 自动回绕:当帧计数器超过 HcFmInterval 时,HC 会自动回绕到 0,并继续比较 HcPeriodicStart
  • HcControl 的关系
    • 仅当 HcControl 中的 HCFS=10b (USBOPERATIONAL) 时,HC 才会处理周期性传输。

6. 典型应用场景

  1. 中断传输调度

    • 键盘或鼠标等设备的中断传输需每 N 帧执行一次,HcPeriodicStart 确保传输从正确帧开始。
  2. 等时传输同步

    • 音频设备需要严格的时序,通过 HcPeriodicStart 对齐传输起始点。
  3. 低功耗模式

    • 在系统挂起前,HCD 可设置 HcPeriodicStart 为一个未来帧号,暂停周期性传输以省电。

7. 注意事项

  • 帧号对齐HcPeriodicStart 必须小于 HcFmInterval,否则行为未定义。
  • 实时性:修改 HcPeriodicStart 后,需等待若干帧才能生效(取决于当前帧号)。
  • HcRhDescriptorA 的关联:Root Hub 的下游端口状态可能影响周期性传输的实际执行。

总结

HcPeriodicStart 是 OHCI 中 周期性传输的时间调度锚点,通过控制起始帧号确保中断/等时传输按协议要求的时间间隔执行。驱动开发者需合理配置该寄存器以平衡实时性和功耗需求。