OHCI寄存器
與連接埠power控制相關的寄存器:
HcRhDescriptor.NPS NoPowerSwitchiingHcRhDescriptor.PSM PowerSwitchingModeHcRhStatus.LPS ClearGlobalPowerHcRhStatus.LPSC SetGlobalPowerHcRhDescriptorB.PPCM PortPowerControlMaskHcRhPortStatus.LSDA ClearPortPowerHcRhPortStatus.PPS SetPortPower
配置框圖
與remote wakeup相關的寄存器:
HcControl.RWC RemoteWakeupConnected //support remote wakeupHcControl.RWE RemoteWakeupEnable //enable remote wakeup by upstream resume signalingHcRhstatus.DRWE DeviceRemoteWakeupEnable //enables ConnectStatusChange bit as a resume event
與suspend/resume/reset相關的寄存器:
HcRhPortStatus[i].PSS SetPortSuspend //suspendHcRhPortStatus[i].POCI ClearSuspendStatus //resumeHcRhPortStatus[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之協議介紹