当系统进入启动阶段,主机控制器开始被枚举,其寄存器空间会被赋一个基地址,而BIOS会为FLADJ(Frame Length Adjustment Register)寄存器设置一个系统指定值。在初始上电或者HCReset(通过硬件或者USBCMD寄存器的HCReset位实现)后,所有的操作寄存器(operational registers)会被赋予一个默认初始值,如表4-1所示。在一个硬件reset之后,所有辅助电源设备中只有操作寄存器会被设置初试默认值。
要初始化主机控制器,软件按如下步骤来设计:
1. 用分配接口数据结构的4Gigabyte 段来Program CTRLDSSEGMENT寄存器。
2.在USBINTR寄存器中写入特定的值以使能相应的中断。
3.将Periodic Frame List的基地址写入到PERIODICLIST BASE寄存器。如果周期调度(periodic schedule)中没有可以调度的元素(work item),周期调度表(Periodic Frame List)中的所有元素的T-Bit 位都需要置1。
4.通过写USBCMD寄存器来设置中断门限和调度表的大小(frame list size (if applicabel)),还要设置 Run/Stop位来打开主机控制器。
5.对CONFIGFLAG寄存器写1来将所有的端口路由到EHCI控制器。
这时,主机控制器开始运行而端口寄存器也可以开始检测设备的连接等等事件。而系统软件则可以通过reset过程(port 处于enabled 状态)来枚举一个端口了。此时此刻,(he port is active with SOFs occurring down the enabled port enabled High-speed ports),但是调度还没有被使能。而EHCI主机控制器是不会用transmit SOFs来使能全速/低速端口。
系统软件必须要把一个控制传输/块传输的queue head地址写入到ASYNDLISTADDR寄存器才能通过一部调度来和设备进行通信。而软件代码也需要通过对USBCMD寄存器的 Asynchronous Schedule Enable bit位写1才能使能异步调度。而要想进行周期调度,系统软件就必须在USBCMD的Periodic Schedule Enable bit位写一来使能周期调度。这里要注意的是在首个端口reset and enabled之前调度机制就可能被开启。
每当要对USBCMD寄存器写入一个值时,软件必须要知道自己在做什么,写入值的时候必须要保留非相关的值不被修改。
阅读(2431) | 评论(0) | 转发(0) |