遍历机制取决于传输类型(控制、批量、中断、等时).
OHCI 主机控制器(HC)遍历端点描述符(ED)链表的机制如下:
一、三类传输的遍历入口
HC 通过不同的寄存器获取三类链表的起始地址:
| 传输类型 | 链表名称 | HC 使用的寄存器入口 | 说明 |
|---|---|---|---|
| 控制传输 | 控制列表 | HcControlHeadED | 直接寄存器指针 |
| 批量传输 | 批量列表 | HcBulkHeadED | 直接寄存器指针 |
| 中断/等时传输 | 周期列表 | HccaInterruptTable + 帧索引 | 间接查表(无直接遍历寄存器) |
二、遍历流程核心步骤
1. 控制/批量列表(直接遍历)
HcControlHeadED / HcBulkHeadED
↓
[ED1] → NextED → [ED2] → NextED → ... → 0x00000000
| |
HeadP HeadP
↓ ↓
TD队列 TD队列2. 周期列表(间接查表遍历)
当前帧号 (HccaFrameNumber)
↓
计算索引 = (frame >> 5) & 0x1F
↓
HccaInterruptTable[索引] // 32个入口的表
↓
[ED链表头] → NextED → [ED链表] → ...三、关键硬件行为
遍历触发条件:
- 控制列表:
HcControl.CLE=1且ControlListFilled=1 - 批量列表:
HcControl.BLE=1且BulkListFilled=1 - 周期列表:
HcControl.PLE=1且每帧自动触发
- 控制列表:
ED就绪判断:
ED.HeadP != ED.TailP表示存在待处理TD遍历状态保持:
- 控制/批量:遍历完成或遇到
K=1(跳过位)时停止 - 周期列表:跨帧断点续传(HC内部保存当前ED位置)
- 控制/批量:遍历完成或遇到
四、总结
HC的遍历是硬件自动完成的:
- 控制/批量:从固定寄存器开始线性遍历
- 周期列表:每帧从中断表的不同入口开始遍历,实现时间片轮询
这种设计确保了三类传输的优先级调度(周期列表优先于控制列表,控制列表优先于批量列表)。
