OHCI寄存器
與端口power控制相關的寄存器:
HcRhDescriptor.NPS NoPowerSwitchiing
HcRhDescriptor.PSM PowerSwitchingMode
HcRhStatus.LPS ClearGlobalPower
HcRhStatus.LPSC SetGlobalPower
HcRhDescriptorB.PPCM PortPowerControlMask
HcRhPortStatus.LSDA ClearPortPower
HcRhPortStatus.PPS SetPortPower
配置框圖
與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
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
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。
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
參考文章
- 基于OHCI的USB主機
- 基于OHCI協定的S3C2440 USB Host Driver之協定介紹