在 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 帧号)。
?
- 有效值范围:
0x0000
到HcFmInterval
寄存器中定义的 最大帧号减 1(例如,若帧列表长度为 1024,则范围为 0–1023)。 - 复位值:硬件复位后通常为
0x0000
。
3. 工作原理
帧号(Frame Number):
- HC 内部维护一个 14-bit 帧计数器,每 1ms 递增一次(对应 USB 的 1ms 帧周期)。
- 当帧计数器达到
HcFmInterval
中定义的最大值(如 0x2EDF)时,自动回绕到 0。
周期性列表的触发条件:
- 当 当前帧号 ≥
HcPeriodicStart
时,HC 开始遍历 Periodic List(存储在内存中的链表结构),执行其中的传输描述符(TDs)。 - 例如:若
HcPeriodicStart=100
,则 HC 会在帧号 100 时开始调度周期性传输。
- 当 当前帧号 ≥
与
HcFmInterval
的关系:HcFmInterval
定义了帧列表的总长度(如 1024 帧),而HcPeriodicStart
决定从哪一帧开始处理周期性传输。- 典型配置:
HcFmInterval = 0x2EDF; // 默认帧间隔(对应 11935 μs,约 12ms) HcPeriodicStart = 0x0000; // 从第 0 帧开始处理 Periodic List
4. 驱动(HCD)的职责
初始化:
- 在 HC 初始化阶段,HCD 需设置
HcPeriodicStart
为一个合理的起始帧号(通常为 0)。 - 示例代码:
write_reg(HcPeriodicStart, 0x0000); // 从第 0 帧开始
- 在 HC 初始化阶段,HCD 需设置
动态调整:
- 若需延迟周期性传输(如电源管理),HCD 可修改
HcPeriodicStart
为未来的帧号:current_frame = read_reg(HcFmNumber); // 读取当前帧号 write_reg(HcPeriodicStart, current_frame + 10); // 10 帧后启动
- 若需延迟周期性传输(如电源管理),HCD 可修改
5. 硬件行为
- 自动回绕:当帧计数器超过
HcFmInterval
时,HC 会自动回绕到 0,并继续比较HcPeriodicStart
。 - 与
HcControl
的关系:- 仅当
HcControl
中的HCFS=10b (USBOPERATIONAL)
时,HC 才会处理周期性传输。
- 仅当
6. 典型应用场景
中断传输调度:
- 键盘或鼠标等设备的中断传输需每 N 帧执行一次,
HcPeriodicStart
确保传输从正确帧开始。
- 键盘或鼠标等设备的中断传输需每 N 帧执行一次,
等时传输同步:
- 音频设备需要严格的时序,通过
HcPeriodicStart
对齐传输起始点。
- 音频设备需要严格的时序,通过
低功耗模式:
- 在系统挂起前,HCD 可设置
HcPeriodicStart
为一个未来帧号,暂停周期性传输以省电。
- 在系统挂起前,HCD 可设置
7. 注意事项
- 帧号对齐:
HcPeriodicStart
必须小于HcFmInterval
,否则行为未定义。 - 实时性:修改
HcPeriodicStart
后,需等待若干帧才能生效(取决于当前帧号)。 - 与
HcRhDescriptorA
的关联:Root Hub 的下游端口状态可能影响周期性传输的实际执行。
总结
HcPeriodicStart
是 OHCI 中 周期性传输的时间调度锚点,通过控制起始帧号确保中断/等时传输按协议要求的时间间隔执行。驱动开发者需合理配置该寄存器以平衡实时性和功耗需求。