天天看点

OHCI(一) - OHCI specOHCI寄存器EDTDED与TDHCCA参考文章

OHCI寄存器

与端口power控制相关的寄存器:

HcRhDescriptor.NPS      NoPowerSwitchiing
HcRhDescriptor.PSM      PowerSwitchingMode
HcRhStatus.LPS          ClearGlobalPower
HcRhStatus.LPSC         SetGlobalPower
HcRhDescriptorB.PPCM    PortPowerControlMask
HcRhPortStatus.LSDA     ClearPortPower
HcRhPortStatus.PPS      SetPortPower
           

配置框图

OHCI(一) - OHCI specOHCI寄存器EDTDED与TDHCCA参考文章

与remote wakeup相关的寄存器:

HcControl.RWC   RemoteWakeupConnected //support remote wakeup
HcControl.RWE   RemoteWakeupEnable //enable remote wakeup by upstream resume signaling
HcRhstatus.DRWE DeviceRemoteWakeupEnable //enables ConnectStatusChange bit as a resume event
           

与suspend/resume/reset相关的寄存器:

HcRhPortStatus[i].PSS   SetPortSuspend      //suspend
HcRhPortStatus[i].POCI  ClearSuspendStatus  //resume
HcRhPortStatus[i].PRS   SetPortReset        //reset
           

ED

OHCI(一) - OHCI specOHCI寄存器EDTDED与TDHCCA参考文章

ED(Endpoint Descriptor)包含了HC所使用的端点的信息,包括端点地址,传输速度,最大数据包尺寸等,在ED中包含所使用的TD链表头指针HeadP和尾指针TailP,还有指向下一个ED的NextED。

当HC处理ED时,首先会看Skip和Halted位,如果任何一个被设置,那么HC会跳过此ED然后去处理后一个ED,如果Skip和Halted都没有被设置,会比较HeadP和TailP,不同的话,HeadP指向的TD就要被处理,HeadP和TailP相同的话,说明这个ED已经没有需要被处理的TD了,可以处理下一个ED了。

主要使用控制寄存器HcControl(PLE, IE, CLE, BLE)和命令状态寄存器HcCommandStatus(CLF, BLF)进行控制。

以控制传输为例:

1. 在控制传输之前,需要设置好相应的ED和TD参数

2. 启动传输时需要设置control传输HcControlHeadED寄存器和HcControlCurrentED寄存器,然后设置控制寄存器允许处理控制传输列表,控制状态寄存器有控制传输列表数据需要传输

HcControlHeadED

HcControlCurrentED

HcControl = 0x90; //设置允许处理控制传输列表

HcCommandStatus = OHCI_HC_COMMAND_STATUS_CLF;

3. 在中断处理程序中判断数据传输是否结束。

TD

OHCI(一) - OHCI specOHCI寄存器EDTDED与TDHCCA参考文章

TD(Transport Descriptor)是系统内存的数据结构,被HC用于定义从端点收发数据的缓冲区。TD分为general TD和isochronous TD,general TD用于中断,控制,批量传输端点,isochronous TD用于同步传输端点。

ED与TD

一般来说每个端点使用一个ED,比如control transfer只需要一个ED,而bulk transfer则需要2个ED,分别用于bulk out端点和bulk in端点。

control transfer的ED下面有3个TD,分别是SETUP, DATA, STATUS(对于没有DATA阶段的命令,不需要相应的TD)

bulk write的out ED下面有2个TD,分别是CBW, DATA,in ED下面有一个TD,CSW

bulk read的out ED下面有1个TD,分别是CBW,in ED下面有两个TD,DATA, CSW

HCD负责ED的链表节点添加和链表节点删除

HCD负责TD的链表节点添加,正常情况下,由HC负责TD的链表节点删除,但是如果传输出错或者来自客户软件的取消,则要由HCD负责TD的链表节点删除。

当HC将TD链表节点删除时,首先会将这个TD从To do queue中删除,然后将这个TD添加到Done queue中。

说明:Done queue可以从HCCA的HccaDoneHead中获取,而To do queue其实是ED中的HeadP和TailP指向的链表,每次往ED中添加TD是采用后插法,即往尾部添加TD,并更新TailP。

HCCA

HCCA(Host Controller Communication Area)是一个256字节对齐的内存数据结构,通常与HC的交互可以通过读取HCCA结构的值或者写入HC操作寄存器来完成。系统软件通过HcHCCA寄存器设置HCCA的地址到HC。

OHCI(一) - OHCI specOHCI寄存器EDTDED与TDHCCA参考文章

HCCA.HccaDoneHead与HcDoneHead

HcDoneHead register contains the physical address of the last completed Transfer Descriptor that was added to the Done queue. When the HC reaches the end of a frame and its differed interrupt register is 0, it will do:

1) when TD completed, HC writes HcDoneHead to the NextTD field of TD

2) HC overwrites HcDoneHead with the address of this TD

3) HC writes HcDoneHead to HCCA.HccaDoneHead and then set HcDoneHead to zero, it alsa set WDH of HcInterruptStatus.

4) HCCA.HccaDoneHead is not written by the HC again until HCD clear WDH bit in HcInterruptStatus

参考文章

  1. 基于OHCI的USB主机
  2. 基于OHCI协议的S3C2440 USB Host Driver之协议介绍