· 操作寄存器
Host Controller(HC)包含一组在芯片上的操作寄存器,这些寄存器被映射到系统可寻址空间的非缓存部分。这些寄存器由Host Controller Driver(HCD)使用。根据这些寄存器的功能,它们被分为四个分区,分别用于控制和状态、内存指针、帧计数器和根集线器。所有寄存器应作为双字读取和写入。
保留位可能在本规范的未来版本中分配。为确保互操作性,不使用保留字段的Host Controller Driver不应假设保留字段包含0。此外,Host Controller Driver应始终保留保留字段的值。当修改可读写寄存器时,Host Controller Driver应先读取寄存器,修改所需的位,然后用保留字段仍包含读取值的方式写回寄存器。或者,Host Controller Driver可以维护先前写入值的内存副本,修改后再写入Host Controller寄存器。当写入设置/清除寄存器时,写入保留字段的位应为0。
7.1 控制与状态部分
7.1.1 HcRevision 寄存器(0x00)
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
7:0 | REV | RO | RO | 0x10 | 此只读字段包含此主机控制器所实现的 HCI 规范版本的 BCD 表示。例如,值 11h 对应版本 1.1。所有符合本规范的主机控制器实现都将具有值 10h。 |
31:8 | / | RO | RO | 0x0 | reserved |
7.1.2 HcControl 寄存器(0x04)
HcControl 寄存器定义了主机控制器的操作模式。此寄存器中的大多数字段仅由主机控制器驱动程序修改,但 HostControllerFunctionalState 和 RemoteWakeupConnected 除外。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 | ||||||||||
1:0 | CBSR | RW | RO | 0x0 | ControlBulkServiceRatio: 批量控制服务比率 此位指定控制端点描述符(Control ED)和批量端点描述符(Bulk ED)之间的服务比率。在处理任何非周期性列表之前,主机控制器必须将指定的比率与其内部已处理的非空控制端点描述符数量进行比较,以确定是继续服务另一个控制端点描述符还是切换到批量端点描述符。此内部计数在跨帧边界时会被保留。在复位时,主机控制器驱动程序负责恢复此值。
| ||||||||||
2 | PLE | RW | RO | 0x0 | PeriodicListEnable: 周期列表表示能 此位设置为启用在下一帧中对周期性列表的处理。如果被主机控制器驱动程序清除,在下一个 SOF 之后将不处理周期性列表。主机控制器在开始处理列表之前必须检查此位。 | ||||||||||
3 | IE | RW | RO | 0x0 | IsochronousEnable: 同步使能 此位由主机控制器驱动程序用于启用 / 禁用对同步端点描述符(Isochronous ED)的处理。在一帧中处理周期性列表时,如果主机控制器找到一个同步端点描述符(F = 1),它将检查此位的状态。如果设置(启用),主机控制器将继续处理该端点描述符。如果清除(禁用),主机控制器将停止处理周期性列表(此时该列表仅包含同步端点描述符),并开始处理下一帧中的批量 / 控制列表。设置此位保证在下一帧生效。 | ||||||||||
4 | CLE | RW | RO | 0x0 | ControlListEnable: 控制列表使能 此位设置为启用在下一帧中对控制列表的处理。如果被主机控制器驱动程序清除,在下一个 SOF 之后将不处理控制列表。主机控制器在确定处理该列表时必须检查此位。当禁用时,主机控制器驱动程序可以修改该列表。如果 HcControlCurrentED 指向要删除的端点描述符,主机控制器驱动程序必须在重新启用列表处理之前更新 HcControlCurrentED 指针。 | ||||||||||
5 | BLE | RW | RO | 0x0 | BulkListEnable: 批量列表使能 此位设置为启用在下一帧中对批量列表的处理。如果被主机控制器驱动程序清除,在下一个 SOF 之后将不处理批量列表。主机控制器在确定处理该列表时必须检查此位。当禁用时,主机控制器驱动程序可以修改该列表。如果 HcBulkCurrentED 指向要删除的端点描述符,主机控制器驱动程序必须在重新启用列表处理之前更新 HcBulkCurrentED 指针。 | ||||||||||
7:6 | HCFS | RW | RW | 0x0 | HostControllerFunctionalState for USB: USB的主机控制器功能状态 此位指定主机控制器的 USB 功能状态 00b:USBRESET 01b:USBRESUME 11b:USBSUSPEND 10b:USBOPERATIONAL。 从其他状态转换到 USBOPERATIONAL 状态将导致在 1 毫秒后开始生成 SOF。主机控制器驱动程序可以通过读取 HcInterruptStatus 寄存器的 StartofFrame 字段来确定主机控制器是否已开始发送 SOF。 此字段仅在 USBSUSPEND 状态下可由主机控制器更改。主机控制器在检测到下游端口的恢复信号后,可以从 USBSUSPEND 状态转换到 USBRESUME 状态。 主机控制器在软件复位后进入 USBSUSPEND 状态,在硬件复位后进入 USBRESET 状态,后者还会复位根集线器并向下游端口断言后续的复位信号。 | ||||||||||
8 | IR | RW | RO | 0x0 | InterruptRouting: 中断路由 此位确定在 HcInterruptStatus 寄存器中注册的事件所产生的中断的路由。如果清除,所有中断都路由到正常的主机总线中断机制。如果设置,中断路由到系统管理中断(SMI)。主机控制器驱动程序在硬件复位时清除此位,但在软件复位时不改变此位。主机控制器驱动程序使用此位作为标记来指示主机控制器的所有权。 | ||||||||||
9 | RWC | RW | RW | 0x0 | RemoteWakeupConnected: 远程唤醒被连接 此位指示主机控制器是否支持远程唤醒信号。如果系统支持并使用远程唤醒,系统固件有责任在 POST 期间设置此位。主机控制器在硬件复位时清除此位,但在软件复位时不改变此位。主机系统的远程唤醒信号是特定于主机总线的,本规范中未描述。 | ||||||||||
10 | RWE | RW | RO | 0x0 | RemoteWakeupEnable: 远程唤醒使能 此位由主机控制器驱动程序用于在检测到上游恢复信号时启用或禁用远程唤醒功能。当此位设置且 HcInterruptStatus 寄存器中的 ResumeDetected 位设置时,将向主机系统发出远程唤醒信号。设置此位对硬件中断的产生没有影响。 | ||||||||||
31:11 | / | RO | RO | 0x0 | reserved |
7.1.3 HcCommandStatus 寄存器(0x08)
HcCommandStatus 寄存器用于主机控制器接收主机控制器驱动程序发出的命令,并反映主机控制器的当前状态。对于主机控制器驱动程序,它看起来像一个 “写设置” 寄存器。主机控制器必须确保写入为 “1” 的位在寄存器中被设置,而写入为 “0” 的位在寄存器中保持不变。主机控制器驱动程序可以向主机控制器发出多个不同的命令,而不必担心会破坏先前发出的命令。主机控制器驱动程序对所有位具有正常的读访问权限。
SchedulingOverrunCount 字段指示主机控制器检测到调度超限错误的帧数。当周期性列表在帧结束(EOF)之前未完成时,会发生这种情况。当检测到调度超限错误时,主机控制器递增计数器并设置 HcInterruptStatus 寄存器中的 SchedulingOverrun 字段。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | HCR | RW | RW | 0x0 | HostControllerReset: 主机控制器复位 此位由 HCD 设置以启动 HC 的软件复位。无论 HC 的功能状态如何,它都会进入 USB SUSPEND 状态,在此状态下,除了指定的其他寄存器(例如 HcControl 的 InterruptRouting 字段)外,大多数操作寄存器都会被复位,并且不允许主机总线访问。此位在复位操作完成后由 HC 清除。复位操作必须在 10 微秒内完成。此位设置时不应导致根 hub 复位,也不应向下游端口发出后续复位信号。 |
1 | CLF | RW | RW | 0x0 | ControlListFilled: 控制列表填充 此位用于指示控制列表上是否有任何传输描述符(TD)。每当 HCD 将 TD 添加到控制列表中的端点描述符(ED)时,它都会设置此位。 当 HC 开始处理控制列表的头部时,它会检查 CLF。只要 ControlListFilled 为 0,HC 就不会开始处理控制列表。如果 CF 为 1,HC 将开始处理控制列表并将 ControlListFilled 设置为 0。如果 HC 在列表中找到 TD,则 HC 将 ControlListFilled 设置为 1,导致控制列表处理继续。如果在控制列表上未找到 TD,并且 HCD 未设置 ControlListFilled,则在 HC 完成控制列表处理时 ControlListFilled 仍将为 0,并且控制列表处理将停止。 |
2 | BLF | RW | RW | 0x0 | BulkListFilled 批量列表填充 此位用于指示批量列表上是否有任何 TD。每当 HCD 将 TD 添加到批量列表中的 ED 时,它都会设置此位。 当 HC 开始处理批量列表的头部时,它会检查 BF。只要 BulkListFilled 为 0,HC 就不会开始处理批量列表。如果 BulkListFilled 为 1,HC 将开始处理批量列表并将 BF 设置为 0。如果 HC 在列表中找到 TD,则 HC 将 BulkListFilled 设置为 1,导致批量列表处理继续。如果在批量列表上未找到 TD,并且 HCD 未设置 BulkListFilled,则在 HC 完成批量列表处理时 BulkListFilled 仍将为 0,并且批量列表处理将停止。 |
3 | OCR | RW | RW | 0x0 | OwnershipChangeRequest 所有权变更请求 此位由操作系统的 HCD 设置以请求更改 HC 的控制权。设置后,HC 将设置 HcInterruptStatus 中的 Ownership Change 字段。在控制权交接后,此位被清除并保持清除状态,直到操作系统 HCD 的下一个请求。 |
15:4 | / | RO | RO | 0x0 | reserved |
17:16 | SOC | RW | RW | 0x0 | SchedulingOverrunCount 调度超限计数 这些位在每次调度超限错误时递增。它初始化为 00b,并在 11b 时回绕。即使 HcInterruptStatus 中的 SchedulingOverrun 已被设置,当检测到调度超限时,此计数器也会递增。这由 HCD 用于监视任何持续的调度问题。 |
31:18 | / | RO | RO | 0x0 | reserved |
7.1.4 HcInterruptStatus 寄存器(0x0C)
此寄存器提供导致硬件中断的各种事件的状态。当事件发生时,主机控制器设置此寄存器中的相应位。当位被设置时,如果在 HcInterruptEnable 寄存器中启用了中断(见 7.1.5 节)并且 MasterInterruptEnable 位被设置,则会产生硬件中断。主机控制器驱动程序可以通过向要清除位的位置写入 “1” 来清除此寄存器中的特定位。主机控制器驱动程序不能设置这些位中的任何一位。主机控制器永远不会清除此位。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | SO | RW | RW | 0x0 | SchedulingOverrun 调度超限 在当前帧的 USB 调度超限且完成 HccaFrameNumber 更新后被设置。调度超限还会致使 HcCommandStatus 中的 SchedulingOverrunCount 字段递增。 |
1 | WDH | RW | RW | 0x0 | WritebackDoneHead 写回完成头部 当主机控制器将 HcDoneHead 写入 HccaDoneHead 后,该位立即被设置。在该位被清除之前,不会对 HccaDoneHead 进行进一步更新。主机控制器驱动程序应仅在保存了 HccaDoneHead 的内容后清除该位。 |
2 | SF | RW | RW | 0x0 | StartofFrame 起始帧 主机控制器在每一帧开始且在 HccaFrameNumber 更新后设置该位。主机控制器同时会生成一个 SOF 令牌。 |
3 | RD | RW | RW | 0x0 | ResumeDetected 恢复检测 当主机控制器检测到 USB 设备发出恢复信号时,该位被设置。从无恢复信号到有恢复信号的转换会导致该位被设置。当主机控制器驱动程序设置 USBRESUME 状态时,该位不会被设置 |
4 | UE | RW | RW | 0x0 | UnrecoverableError 不可恢复错误 当主机控制器检测到与 USB 无关的系统错误时,该位被设置。在系统错误被纠正之前,主机控制器不应进行任何处理或信号传输。主机控制器驱动程序在主机控制器复位后清除该位。 |
5 | FNO | RW | RW | 0x0 | FrameNumberOverflow 帧编号溢出 当 HcFmNumber 的最高位(位 15)的值发生变化,从 0 变为 1 或从 1 变为 0,且在 HccaFrameNumber 更新后,该位被设置。 |
6 | RHSC | RW | RW | 0x0 | RootHubStatusChange 根集线器状态改变 当 HcRhStatus 或任何 HcRhPortStatus [下游端口号] 的内容发生变化时,该位被设置。 |
29:7 | / | RO | RO | 0x0 | reserved |
30 | OC | RW | RW | 0x0 | OwnershipChange 所有权改变 当主机控制器驱动程序设置 HcCommandStatus 中的 OwnershipChangeRequest 字段时,主机控制器设置该位。当该事件未被屏蔽时,将立即产生系统管理中断(SMI)。当 SMI 引脚未实现时,该位被绑定为 0。 |
31 | / | RO | RO | 0x0 | reserved |
7.1.5 HcInterruptEnable 寄存器(0x10)
HcInterruptEnable 寄存器中的每个使能位都与 HcInterruptStatus 寄存器中的相关中断位相对应。该寄存器用于控制哪些事件会产生硬件中断。当 HcInterruptStatus 寄存器中的某一位被设置为 “1”,并且 HcInterruptEnable 寄存器中的相应位也被设置为 “1”,同时 MasterInterruptEnable 位也为 “1” 时,主机总线就会请求硬件中断。
向该寄存器中的某位写入 “1” 会设置相应位,而写入 “0” 则保持相应位不变。读取该寄存器时,会返回其当前值。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | SO | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因调度超限导致的中断生成。 |
1 | WDH | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因 HcDoneHead 写回导致的中断生成。 |
2 | SF | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因帧起始导致的中断生成。 |
3 | RD | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因恢复检测导致的中断生成。 |
4 | UE | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因不可恢复错误导致的中断生成。 |
5 | FNO | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因帧编号溢出导致的中断生成。 |
6 | RHSC | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因根集线器状态改变导致的中断生成。 |
29:7 | / | RO | RO | 0x0 | reserved |
30 | OC | RW | RO | 0x0 | 0 - 忽略; 1 - 启用因所有权改变导致的中断生成。 |
31 | MIE | RW | RO | 0x0 | 写入 “0” 被主机控制器忽略。 写入 “1” 则启用因该寄存器其他位所指定事件导致的中断生成。此位被主机控制器驱动程序用作主中断使能。 |
7.1.6 HcInterruptDisable 寄存器(0x14)
HcInterruptDisable 寄存器中的每个禁止位都与 HcInterruptStatus 寄存器中的相关中断位相对应。HcInterruptDisable 寄存器与 HcInterruptEnable 寄存器相关联。因此,向该寄存器中的某位写入 “1” 会清除 HcInterruptEnable 寄存器中的相应位,而写入 “0” 则保持 HcInterruptEnable 寄存器中的相应位不变。读取时,返回 HcInterruptEnable 寄存器的当前值。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | SO | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因调度超限导致的中断生成。 |
1 | WDH | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因 HcDoneHead 写回导致的中断生成。 |
2 | SF | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因帧起始导致的中断生成。 |
3 | RD | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因恢复检测导致的中断生成。 |
4 | UE | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因不可恢复错误导致的中断生成。 |
5 | FNO | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因帧编号溢出导致的中断生成。 |
6 | RHSC | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因根集线器状态改变导致的中断生成。 |
29:7 | / | RO | RO | 0x0 | reserved |
30 | OC | RW | RO | 0x0 | 0 - 忽略; 1 - 禁止因所有权改变导致的中断生成。 |
31 | MIE | RW | RO | 0x0 | 写入 “0” 被主机控制器忽略。 写入 “1” 则禁止因该寄存器其他位所指定事件导致的中断生成。此位在硬件或软件复位后被设置。 |
7.2 内存指针部分
7.2.1 HcHCCA 寄存器(0x18)
HcHCCA 寄存器包含主机控制器通信区域(Host Controller Communication Area,HCCA)的物理地址。主机控制器驱动程序通过向 HcHCCA 写入全 1 并读取其内容来确定对齐限制。通过检查低位中零的数量来评估对齐方式。最小对齐为 256 字节,因此,当读取时,位 0 到位 7 必须始终返回 “0”。详细描述可在第 4 章中找到。此区域用于保存主机控制器和主机控制器驱动程序都可访问的控制结构和中断表。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
7:0 | HCCA | RW | RO | 0x0 | 主机控制器通信区域的基地址。 |
31:8 | / | RO | RO | 0x0 | reserved |
7.2.2 HcPeriodCurrentED 寄存器(0x1C)
HcPeriodCurrentED 寄存器包含当前同步或中断端点描述符的物理地址。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | PCED | RO | RW | 0x0 | PeriodCurrentED: 当前周期端点描述符 主机控制器使用此寄存器指向一个端点描述符的头部,该ED在当前帧将处理的周期列表中。在处理完一个周期端点描述符后,主机控制器会更新此寄存器的内容。主机控制器驱动程序可以读取此寄存器的内容,以确定在读取时正在处理当前的端点描述符。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.2.3 HcControlHeadED 寄存器(0x20)
HcControlHeadED 寄存器包含控制列表中第一个端点描述符的物理地址。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | CHED | RW | RO | 0x0 | ControlCurrentED: 控制头端点描述符 主机控制器从 HcControlHeadED 指针开始遍历控制列表。其内容在主机控制器初始化期间从 HCCA 加载。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.2.4 HcControlCurrentED 寄存器(0x24)
HcControlCurrentED 寄存器包含控制列表中当前端点描述符的物理地址。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | CCED | RW | RW | 0x0 | ControlCurrentED: 当前控制端点描述符 此指针在处理完当前端点描述符后指向下一个端点描述符。主机控制器将从上次帧停止的位置继续处理列表。当到达控制列表末尾时,主机控制器检查 HcCommandStatus 中的 ControlListFilled 位。如果该位被设置,它将 HcControlHeadED 的内容复制到HcControlCurrentED 并清除该位;如果未设置,则不执行任何操作。仅当 HcControl 中的 ControlListEnable 被清除时,主机控制器驱动程序才允许修改此寄存器。当该位被设置时,主机控制器驱动程序仅读取此寄存器的瞬时值。初始时,此寄存器被设置为零以指示控制列表的末尾。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.2.5 HcBulkHeadED 寄存器(0x28)
HcBulkHeadED 寄存器包含批量列表中第一个端点描述符的物理地址。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | BHED | RW | RO | 0x0 | BulkHeadED: 批量头端点描述符 主机控制器从 HcBulkHeadED 指针开始遍历批量列表。其内容在主机控制器初始化期间从 HCCA 加载。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.2.6 HcBulkCurrentED 寄存器(0x2C)
HcBulkCurrentED 寄存器包含批量列表中当前端点的物理地址。由于批量列表将以循环方式服务,端点将根据其插入列表的顺序排列。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | BCED | RW | RW | 0x0 | BulkCurrentED: 当前批量端点描述符 此指针在主机控制器处理完当前端点后指向下一个端点描述符。主机控制器将从上次帧停止的位置继续处理列表。当到达批量列表末尾时,主机控制器检查 HcControl 中的 ControlListFilled 位。如果该位被设置,它将 HcBulkHeadED 的内容复制到 HcBulkCurrentED 并清除该位;如果未设置,则不执行任何操作。仅当 HcControl 中的 BulkListEnable 被清除时,主机控制器驱动程序才允许修改此寄存器。当该位被设置时,主机控制器驱动程序仅读取此寄存器的瞬时值。初始时,此寄存器被设置为零以指示批量列表的末尾。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.2.7 HcDoneHead 寄存器(0x30)
HcDoneHead 寄存器包含添加到完成队列中的最后一个已完成传输描述符的物理地址。在正常操作中,主机控制器驱动程序通常不需要读取此寄存器,因为其内容会定期写入 HCCA。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
3:0 | DH | RO | RW | 0x0 | DoneHead: 完成头 当一个传输描述符完成时,主机控制器将 HcDoneHead 的内容写入该传输描述符的 NextTD 字段。然后,主机控制器用该传输描述符的地址覆盖 HcDoneHead 的内容。每当主机控制器将此寄存器的内容写入 HCCA 时,此寄存器将被设置为零。同时,它还会设置 HcInterruptStatus 中的 WritebackDoneHead 位。 |
31:4 | / | RO | RO | 0x0 | reserved |
7.3 帧计数器部分
7.3.1 HcFmInterval 寄存器(0x34)
HcFmInterval 寄存器包含一个 14 位的值,该值表示帧中的位时间(bit time)间隔(即两个连续 SOF 之间的间隔),以及一个 15 位的值,该值表示主机控制器在不导致调度超限的情况下,可以传输或接收的全速最大数据包大小。主机控制器驱动程序可以通过在每个 SOF 时写入新值来对 FrameInterval 进行微调。这为主机控制器提供了必要的可编程性,针对同步外部时钟资源和调整任何未知本地时钟偏移。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
13:0 | FI | RW | RO | 0x2EDF | FrameInterval: 帧间隔 此值指定两个连续 SOF 之间的位时间间隔。标称值设置为 11,999。主机控制器驱动程序应在复位主机控制器之前存储此字段的当前值,因为将 HcCommandStatus 中的 HostControllerReset 字段置位会导致主机控制器将此字段复位为其标称值。主机控制器驱动程序可以选择在复位序列完成后恢复存储的值。 |
15:14 | / | RO | RO | 0x0 | reserved |
30:16 | FSMPS | RW | RO | TBD (待定) | FSLargestDataPacket: 全速最大数据包大小 此字段指定在每个帧开始时加载到最大数据包计数器的值。计数器值表示在任何给定时间主机控制器在单个事务中可以发送或接收的最大数据量(以位为单位),而不会导致调度超限。该字段的值由主机控制器驱动程序计算。 |
31 | FIT | RW | RO | 0x0 | FrameIntervalToggle: 帧间隔翻转 每当主机控制器驱动程序向 FrameInterval 加载新值时,应翻转此位。 |
7.3.2 HcFmRemaining 寄存器(0x38)
HcFmRemaining 寄存器是一个 14 位递减计数器,显示当前帧中剩余的位时间。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
13:0 | FR | RO | RW | 0x0 | FrameRemaining: 帧剩余 此计数器在每个位时间递减。当它达到零时,在下一个位时间边界加载 HcFmInterval 中指定的 FrameInterval 值。当进入 USBOPERATIONAL 状态时,主机控制器重新加载 HcFmInterval 中的 FrameInterval 值,并从下一个 SOF 开始使用更新后的值。 |
30:14 | / | RO | RO | 0x0 | reserved |
31 | FRT | RO | RW | 0x0 | FrameRemainingToggle: 帧剩余翻转 每当 FrameRemaining 达到零时,此位从 HcFmInterval 中的 FrameIntervalToggle 字段加载。主机控制器驱动程序使用此位来同步 FrameInterval 和 FrameRemaining。 |
7.3.3 HcFmNumber 寄存器(0x3C)
HcFmNumber 寄存器是一个 16 位计数器。它为主机控制器和主机控制器驱动程序中发生的事件提供定时参考。主机控制器驱动程序可以使用此寄存器中指定的 16 位值生成一个 32 位帧号,而无需频繁访问该寄存器。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
15:0 | FN | RO | RW | 0x0 | FrameNumber: 帧号 当 HcFmRemaining 重新加载时,此值递增。它将在达到 0xffff后回滚到0x0。当进入 USBOPERATIONAL 状态时,此值将自动递增。在主机控制器递增 FrameNumber 并发送 SOF 之后,但在读取该帧中的第一个端点描述符之前,主机控制器将 FrameNumber 的内容写入 HCCA。写入 HCCA 后,主机控制器将在 HcInterruptStatus 中设置 StartofFrame 位。 |
31:16 | / | RO | RO | 0x0 | reserved |
7.3.4 HcPeriodicStart 寄存器(0x40)
HcPeriodicStart 寄存器有一个 14 位可编程值,该值确定主机控制器应开始处理周期列表的最早时间。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
13:0 | PS | RW | RO | 0x0 | PeriodicStart: 周期开始 硬件复位后,此字段被清除。然后在主机控制器初始化期间由主机控制器驱动程序设置。该值大致计算为 HcFmInterval 值的 90%。典型值为 3E67h。当 HcFmRemaining 达到指定值时,周期列表的处理将优先于控制 / 批量处理。因此,主机控制器将在完成当前正在进行的控制或批量事务后开始处理中断列表。 |
31:14 | / | RO | RO | 0x0 | reserved |
7.3.5 HcLSThreshold 寄存器(0x44)
HcLSThreshold 寄存器包含一个 11 位的值,主机控制器使用该值来确定是否在 EOF(帧结束)之前提交传输最多 8 字节的低速数据包。主机控制器和主机控制器驱动程序都不允许更改此值。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
11:0 | LST | RW | R | 0x0628 | LSThreshold: 低速阈值 该 11 位值用于主机控制器判断在 EOF 之前是否进行低速数据包(最大 8 字节)的传输决策,其值固定,不允许被主机控制器或主机控制器驱动程序修改。 |
31:12 | / | RO | RO | 0x0 | reserved |
7.4 根集线器部分
此分区中的所有寄存器都专用于 USB 根集线器,它虽是主机控制器的一个组成部分,但在功能上仍是一个独立的实体。主机控制器驱动程序(HCD)通过寄存器接口模拟通用串行总线驱动程序(USBD)对根集线器的访问。HCD 维护许多 USB 定义的集线器功能,这些功能在硬件中并非必须支持。例如,集线器的设备、配置、接口和端点描述符仅由 HCD 维护,以及类描述符的一些静态字段。HCD 还维护和解码根集线器的设备地址以及其他一些更适合软件而非硬件处理的琐碎操作。
根集线器寄存器接口的开发旨在保持与系统中常见集线器的位组织和操作的相似性。以下是四个寄存器定义:HcRhDescriptorA、HcRhDescriptorB、HcRhStatus 和 HcRhPortStatus [1:NDP]。每个寄存器都按双字(Dword)进行读写。这些寄存器仅在初始化期间写入,以与系统实现相对应。HcRhDescriptorA 和 HcRhDescriptorB 寄存器应实现为无论主机控制器(HC)的 USB 状态如何均可写入。HcRhStatus 和 HcRhPortStatus 必须在 USBOPERATIONAL 状态下可写入。
注意:表格中IS 表示该字段是特定方式实现的复位值。
7.4.1 HcRhDescriptorA 寄存器(0x48)
HcRhDescriptorA 寄存器是描述根集线器特性的两个寄存器中的第一个。复位值因实现而异。集线器类描述符的描述符长度(11)、描述符类型(待定)和集线器控制器当前(0)字段由 HCD 模拟。所有其他字段位于 HcRhDescriptorA 和 HcRhDescriptorB 寄存器中。
位域 | 名称 | HCD属性 | HC属性 | 上电复位(值) | 描述 |
7:0 | NDP | RO | RO | IS | NumberDownstreamPorts: 下游端口数量 这些位指定根集线器支持的下游端口数量。这是特定实现的,最小端口数量为 1,OpenHCI 支持的最大端口数量为 15。 |
8 | NPS | RW | RO | IS | NoPowerSwitching: 无电源切换 这些位用于指定是否支持电源切换或端口是否始终供电。这是特定于实现的,当此位清零时,PowerSwitchingMode 指定全部或每个端口的切换。 0 :表示端口电源切换。 1 :表示端口在主机控制器加电时始终供电。 |
9 | PSM | RW | RO | IS | PowerSwitchingMode: 电源切换模式 此位用于指定根集线器端口电源切换的控制方式。这是特定于实现的,仅当 NoPowerSwitching 字段清零时此字段有效。 0 :表示所有端口同时供电。 1 :表示每个端口单独供电。此模式允许端口电源由全局开关或每端口切换控制。如果 PortPowerControlMask 位被设置,则端口仅响应端口电源命令(Set/ClearPortPower);如果端口掩码清零,则端口仅由全局电源开关(Set/ClearGlobalPower)控制。 |
10 | DT | RW | RO | 0x0 | DeviceType: 设备类型 此位指定根集线器不是复合设备,根集线器不允许是复合设备,此位应始终读 / 写为 0。 |
11 | OCPM | RW | RO | IS | OverCurrentProtectionMode: 过流保护模式 此位描述根集线器端口过流状态的报告方式。复位时,此字段应反映与 PowerSwitchingMode 相同的模式。仅当 NoOverCurrentProtection 字段清零时此字段有效。 0 :表示所有下游端口的过流状态集体报告。 1: 表示按端口报告过流状态。 |
12 | NOCP | RW | RO | IS | NoOverCurrentProtection: 无过流保护 此位描述根集线器端口过流状态的报告方式。当此位清零时,OverCurrentProtectionMode 字段指定全局或每端口报告。 0: 表示集体报告所有下游端口的过流状态。 1: 表示不支持过流保护。 |
23:13 | / | RO | RO | IS | reserved |
31:24 | POTPGT | RW | RO | IS | PowerOnToPowerGoodTime: 电源开启到电源良好时间 此字节指定 HCD 在访问根集线器已供电端口之前必须等待的持续时间。这是特定于实现的,时间单位为 2ms,持续时间计算为 POTPGT * 2ms。 |
7.4.2 HcRhDescriptorB 寄存器(0x4C)
位域 | 名称 | HCD属性 | HC属性 | 上电复位(值) | 描述 |
15:0 | DR | RW | RO | IS | DeviceRemovable: 设备可移除 每个位专用于根集线器的一个端口。清零表示设备可移除,置位表示设备不可移除 bit 0:reserved bit 1 :对应连接到端口 #1 的设备 bit 2 :对应连接到端口 #2 的设备 ··· bit 15 :对应连接到端口 #15 的设备。 |
31:16 | PPCM | RW | RO | IS | PortPowerControlMask: 端口电源控制掩码 每一位都指示当电源切换模式(PowerSwitchingMode)被设置时,一个端口是否受全局电源控制命令的影响。当该位被设置时,端口的电源状态仅受每端口电源控制(设置 / 清除端口电源,Set/ClearPortPower)的影响。当该位被清除时,端口由全局电源开关(设置 / 清除全局电源,Set/ClearGlobalPower)控制。如果设备被配置为全局切换模式(PowerSwitchingMode = 0),此字段无效。 bit 0:reserved bit 1 :端口 #1 的联动电源掩码 bit 2 :端口 #2 的联动电源掩码 ··· bit 15 :端口 #15 的联动电源掩码 |
7.4.3 HcRhStatus 寄存器(0x50)
HcRhStatus 寄存器分为两部分。双字的低字表示集线器状态字段,高字表示集线器状态改变字段。保留位应始终写入 “0”。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | LPS | RW | RO | 0x0 | (read) LocalPowerStatus: 本地电源状态 根集线器不支持本地电源状态功能,因此此位始终读为 “0”。 (write) ClearGlobalPower:清除全局电源 在全局电源模式(PowerSwitchingMode = 0)下,将此位写入 “1” 可关闭所有端口的电源(清除 PortPowerStatus)。在每端口电源模式下,仅清除 PortPowerControlMask 位未设置的端口的 PortPowerStatus。写入 “0” 无效。 |
1 | OCI | RO | RW | 0x0 | OverCurrentIndicator: 过流指示器 当实现全局报告过流情况时,此位报告过流条件。置位表示存在过流条件,清零表示所有电源操作正常。如果实现每端口过流保护,则此位始终为 “0” |
14:2 | / | RO | RO | 0x0 | reserved |
15 | DRWE | RW | RO | 0x0 | (read) DeviceRemoteWakeupEnable: 设备远程唤醒使能 此位使 ConnectStatusChange 位作为恢复事件,导致从 USBSUSPEND 到 USBRESUME 状态的转换并设置 ResumeDetected 中断。 0 :表示 ConnectStatusChange 不是远程唤醒事件。 1 :表示 ConnectStatusChange 是远程唤醒事件。 (write) SetRemoteWakeupEnable: 设置远程唤醒使能 写入 “1” 设置设备远程唤醒使能 。 写入 “0” 不起作用。 |
16 | LPSC | RW | RO | 0x0 | (read) LocalPowerStatusChange: 本地电源状态改变 根集线器不支持本地电源状态功能,因此此位始终读为 “0”。 (write) SetGlobalPower: 设置全局电源 |
17 | CCIC | RW | RW | 0x0 | OverCurrentIndicatorChange: 过流指示器改变 当此寄存器的 OCI 字段发生变化时,由硬件设置此位。主机控制器驱动程序通过写入 “1” 清除此位。写入 “0” 不起作用。 |
30:18 | / | RO | RO | 0x0 | reserved |
31 | CRWE | WO | RO | - | (write) ClearRemoteWakeupEnable: 清除远程唤醒使能 写入 “1” 清除远程唤醒使能,写入 “0” 不起作用。 |
7.4.4 HcRhPortStatus[1:NDP] 寄存器(0x54~0x54+N*0x4)
HcRhPortStatus [1:NDP] 寄存器用于基于每个端口控制和报告端口事件。NumberDownstreamPorts 表示在硬件中实现的 HcRhPortStatus 寄存器的数量。低字用于反映端口状态,而高字反映状态改变位。一些状态位具有特殊的写入行为(见下文)。如果在写入更改端口状态时正在进行事务(从令牌到握手),则必须推迟产生的端口状态改变,直到事务完成。保留位应始终写入 “0”。
位域 | 名称 | HCD属性 | HC属性 | 复位值 | 描述 |
0 | CCS | RW | RW | 0x0 | (read) CurrentConnectStatus: 当前连接状态 此位反映下游端口的当前状态。 0 :表示没有设备连接 1 :表示有设备连接。 (write) ClearPortEnable: 清除端口使能 主机控制器驱动程序写入 “1” 以清除 PortEnableStatus 位,写入 “0” 无效。当前连接状态不受任何写入操作影响。
注意:当连接的设备不可移除(DeviceRemovable [NDP])时,此位始终读为 “1b”。 |
1 | PES | RW | RW | 0x0 | (read) PortEnableStatus: 端口使能状态 此位指示端口是启用还是禁用。当根集线器检测到过流条件、断开事件、电源关闭或操作总线错误(如乱码)时,可能会清除此位。此更改还会导致 PortEnabledStatusChange 被设置。主机控制器驱动程序通过写入 SetPortEnable 来设置此位,通过写入 ClearPortEnable 来清除它。当 CurrentConnectStatus 被清除时,此位不能被设置。在端口复位完成(ResetStatusChange 被设置)或端口挂起(SuspendStatusChange 被设置)时,如果此位尚未设置,也会被设置。 0 :表示端口禁用 1 :表示端口启用 (write) SetPortEnable: 设置端口使能 |
2 | PSS | RW | RW | 0x0 | (read) PortSuspendStatus: 端口挂起状态 此位指示端口是挂起还是处于恢复序列中。通过写入 SetPortSuspend 来设置,在恢复间隔结束时,当 PortSuspendStatusChange 被设置时清除。当 CurrentConnectStatus 被清除时,此位不能被设置。在端口复位结束时(PortResetStatusChange 被设置)或当主机控制器置于 USBRESUME 状态时,此位也会被清除。如果上游恢复正在进行,它应传播到主机控制器。 0 :表示端口未挂起 1 :表示端口挂起 (write) SetPortSuspend: 设置端口挂起 |
3 | POCI | RW | RW | 0x0 | (read) PortOverCurrentIndicator: 端口过流指示器 仅当根集线器配置为按端口报告过流条件时,此位才有效。如果不支持按端口过流报告,则此位设置为 0。如果清除,此端口的所有电源操作正常。如果设置,表示此端口存在过流条件。此位始终反映过流输入信号。 0 :表示无过流条件 1 :表示检测到过流条件。 (write) ClearSuspendStatus: 清除挂起状态 |
4 | PRS | RW | RW | 0x0 | (read) PortResetStatus: 端口复位状态 当通过写入 SetPortReset 设置此位时,端口复位信号被断言。复位完成后,当 PortResetStatusChange 被设置时,此位被清除。当 CurrentConnectStatus 被清除时,此位不能被设置。 0: 表示端口复位信号未激活 1 :表示端口复位信号激活 (write) SetPortReset: 设置端口复位 |
7:5 | / | RO | RO | 0x0 | reserved |
8 | PPS | RW | RW | 0x0 | (read) PortPowerStatus: 端口电源状态 此位指示端口电源是打开还是关闭。如果端口电源控制掩码(PortPowerControlMask)被设置,则 Set/ClearPortPower 命令被启用。如果掩码未设置,仅 Set/ClearGlobalPower 命令被启用。当端口电源被禁用时,CurrentConnectStatus、PortEnableStatus、PortSuspendStatus 和 PortResetStatus 应被复位。 0: 表示端口电源关闭 1 :表示端口电源打开。 (write) SetPortPower: 设置端口电源 主机控制器驱动程序写入 “1” 来设置 PortPowerStatus 位,写入 “0” 无效。 注意:如果不支持电源切换,此位始终读为 “1b”。 |
9 | LSDA | RW | RW | 0xX | (read) LowSpeedDeviceAttached: 低速设备被连接 此位指示连接到此端口的设备速度。当设置时,表示低速设备连接到此端口;当清除时,表示全速设备连接到此端口。此字段仅在 CurrentConnectStatus 被设置时有效。 0 表示全速设备连接 1 表示低速设备连接 (write) ClearPortPower: 清除端口电源 |
15:10 | / | RO | RO | 0x0 | reserved |
16 | CSC | RW | RW | 0x0 | ConnectStatusChange: 连接状态改变 每当发生连接或断开事件时,此位被设置。主机控制器驱动程序(HCD)写入 “1” 来清除此位。写入 “0” 无效。如果在执行设置端口复位(SetPortReset)、设置端口使能(SetPortEnable)或设置端口挂起(SetPortSuspend)写入操作时当前连接状态(CurrentConnectStatus)被清除,此位将被设置,以强制驱动程序重新评估连接状态,因为如果端口已断开,这些写入操作不应发生。 0 :当前连接状态无变化 1 :当前连接状态有变化 注意:如果设备可移除(DeviceRemovable [NDP])位被设置,此位仅在根集线器复位后被设置,以通知系统设备已连接。 |
17 | PESC | RW | RW | 0x0 | PortEnableStatusChange: 端口使能状态改变 当硬件事件导致端口使能状态(PortEnableStatus)位被清除时,此位被设置。主机控制器驱动程序(HCD)写入操作导致的变化不会设置此位。HCD 写入 “1” 来清除此位。写入 “0” 无效。 0 :端口使能状态无变化 1 :端口使能状态有变化 |
18 | PSSC | RW | RW | 0x0 | PortSuspendStatusChange: 端口挂起状态改变 当完整的恢复序列完成时,此位被设置。该序列包括 20 毫秒的恢复脉冲、低速(LS)结束包(EOP)以及 3 毫秒的重新同步(resychronization)延迟。主机控制器驱动程序(HCD)写入 “1” 来清除此位。写入 “0” 无效。当复位状态改变(ResetStatusChange)位被设置时,此位也被清除。 0 :表示恢复未完成 1 :表示恢复已完成 |
19 | OCIC | RW | RW | 0x0 | PortOverCurrentIndicatorChange: 端口过流指示器改变 此位仅在按端口报告过流情况时才有效。当根集线器改变端口过流指示器(PortOverCurrentIndicator)位时,此位被设置。主机控制器驱动程序(HCD)写入 “1” 来清除此位。写入 “0” 无效。 0 :表示端口过流指示器无变化 1 :表示端口过流指示器已改变 |
20 | PRSC | RW | RW | 0x0 | PortResetStatusChange: 端口复位状态改变 此位在 10 毫秒的端口复位信号结束时被置位。主机控制器驱动程序(HCD)写入 “1” 来清除此位。写入 “0” 无效。 0 :表示 端口复位未完成 1 :表示端口复位已完成 |
31:21 | / | RO | RO | 0x0 | reserved |