Thursday, January 20, 2011

USB OHCI Introduction(part 1)

開門見山直接進入主題:在一開機hardware reset後,device driver都還沒有介入之前,HC是在USBReset的state。OHCI spec 6.2.2提到,這個時候HC會拉reset signal通知整個bus,同時HcFmNumber這個register還不會增加count(HcFmNumber用來計算總共經過了幾個time frame)。HCD把HcControl裡的HCFS bit改成10b: UsbOPERATIONAL,從此以後進入UsbOPERATIONAL state。(其他state暫時不要管,主要focus在瞭解運作的原理)

以下這張圖個人認為可以當作OHCI controller如何運作的一個代表。
每個time frame在full/low speed device來說佔有1ms,也就是在下面兩個FRAME Boundary之間間隔。在進入operational state的下一個frame boundary開始會送出SOF packet。為什麼HC會知道要送出SOF是根據HcFmRemaining這個register從0變成HcFmInterval的時候。HcFmRemaining主要的公用是用來倒數計時,初始值是11999=0x2EDF是從HcFmInterval來。full speed是12MHz,所以外部的clock每秒供給12,000,000,1ms就有12,000次。連零都算則HcFmInterval就定為11999。(這邊會有疑慮,外部的clock如果不準,這時候counter算出來就會有問題,實際上的時間就會比較短或長,因此spec上面有說這個值driver可以自己設。而且在periodic list裡,每個interrupt entry list的transaction時間長度是用usb 2.0 spec 5.11.3上面提供的公式算出來的,所以如果frame counter的時間少於實際的時間,傳輸起來會產生schedule overrun,transaction會做不完)

在SOF Token傳完以後(不知道多久會傳完)首先開始Non-periodic lists傳輸Non-periodic包含了control & bulk transfer。在OHCI裡把control transfer看得比bulk transfer還重要,所以在HcControl register有CBSR(control bulk service ratio)這兩個bits可以設定做一個bulk transaction可以做幾個control transaction。把control list的transaction結束以後會檢查有沒有滿足比率,如果是四比一,會做四個control list的transaction,再做一個bulk的transaction。等到做到爽就會開始periodic list的處理。何謂做到爽?OHCI定義了一個HcPeriodicStart這個register用來作為何時開始開始periodic list(interrupt & isochronous)的傳輸,HC在每次frame的結束會把HcFmRemaining拿來和HcFmRemaining做比較。如果相等periodic list傳輸開始,non-periodic結束。在periodic list裡面Interrupt list的處理,是比isochronous list還先的,之後講periodic list transfer你可以看到periodic list interrupt table那個樹狀結構,isochronous ED總是放在整個list的最後面,interrupt ED擺在前面。等到periodic list做完,才會回到Non-periodic lists,回來以後Control:Bulk繼續按照比率執行。直到Frame結束他們的比例會繼續維持著到下一個frame。
在Frame Boundary做了四件事情,有前後順序:
1. HcFrameRemaining register的值從0變成HcFrameInterval所存的值。
2. HcFrameNumber加一
3. 把HcFrameNumber的值copy到HccaFrameNumber
4. 如果StartOfFrame的bit在interrupt enable register有設定則發出StartOfFrame interrupt。

一開始的SOF token:就像下面的USB Bus State會K...J...K...J...這樣一直不停的變換下去。

0 意見: