usb linux 系統 (4)

1、  EHCI控制器

       EHCI的基本概念

OTG成功的發現了設備並把控制器切換到相應的狀態,如果這種狀態是HOST狀態,那EHCI控制器就該上場了。

EHCI算是後起之秀,到了USB2.0以後才提出來的。EHCI主要是爲了支持高速設備,如果一個控制器還要支持低速和全速設備,還需要有UHCIOHCI的支持。

USB2.0中與EHCI配合使用支持低速和全速設備的OHCI/UHCI叫作兼容控制器,下面這張有名的圖很好的描述了USB2.0主控制器的組成。

clip_image002

可見,一個號稱支持USB2.0的控制器很可能不止一個主控制器,除了必不可少的EHCI之外,很可能還會有OHCI/UHCI等來輔助處理低速設備的數據傳輸。如果只有EHCI控制器又想支持低速設備呢,那就需要能夠支持(Transaction Translator)事務翻譯的HUB來配合了,ECHIHUB之間通過分割事務(一種數據傳輸方式)來處理低速和全速等設備。

主機控制器的初始化:   

當系統起動時,主控制器枚舉,爲EHCI寄存器分配一個基址,設置 FLADJ寄存器一個指定值 ,當初始化電源或 HCReset寄存器時,寄存器都初設置成默認值,如下下所示,當硬件重置後,僅有操作系列寄存器不是默認值

Operational Register Default Value (after Reset)

USBCMD 00080000h (00080B00h if Asynchronous Schedule Park Capability is a one)

USBSTS 00001000h

USBINTR 00000000h

FRINDEX 00000000h

CTRLDSSEGMENT 00000000h

PERIODICLISTBASE Undefined

ASYNCLISTADDR Undefined

CONFIGFLAG 00000000h

PORTSC 00002000h (w/PPC set to one); 00003000h (w/PPC set to a zero)

 

 

爲了初始化EHCI主控制器,系統軟件操作如下:

1)在所有的接口數據結構創建後,設置 CTRLDSSEGMENT寄存器爲 4-Gigabyte模式。

2)寫一個合適的值到 USBINTR寄存器,使能合適的中斷。

3)向 PERIODICLIST BASE寫入週期調度鏈表的基址。如果週期調度鏈表沒有可調度的數據,將其鏈表成員的 T-Bits設置 爲1

4) 設置USBCMD寄存器,指定中斷處理程序入口,調度鏈表的長度,設置 Run/Stop 位來控制調度是否開始。

5)向 CONFIGFLAG寄存器寫1, 查找USB主控制器由幾個控制器(一個EHCI和零個以上的OHCH/UHCI)組成。

經過以上的操作,整個USB2.0主控制器(EHCI和兼容控制器)就可以工作了,端口(這裏的端口和設備的端點的概念有區別,主要是指EHCI/OHCI/UHCI的數據端口)寄性器報告系統的連接狀態。

即然一個USB2.0是由EHCI和幾個兼容控制器組成,那這幾個控制器是怎麼配個的呢,系統軟件又應該如何控制它們呢。這就涉及到一個路由(route)的問題。這個路由和網絡上的路由概念並不多,一個主機上有幾個網卡,數據要從正確的網卡傳出去,不至於迷路,就需要路由算法。USB主控制器也有這個問題,主控制器可能是一個EHCI和幾個OHCI/UHCI組成,數據是怎樣找到合適的端口並傳送出去呢。

 

clip_image004

所幸的是,EHCI的規中對此有要求,硬件完成了大多數的工作,系統軟件是需要作一下簡單的控制。

EHCI和兼容控制器有自己的狀態和獨立的寄存器,每一個傳輸都可以通過路由邏輯選擇一個適當的控制器來傳輸, Configured Flag ( CF)寄存器用來作路由的控制,當重置或上電後,是缺省的路由控制策略,如果系統只有兼容控制器的驅動而沒有EHCI驅動,則系統只支持全速和低速設備。

 HCSPARAMS寄存器的N_CC位指示兼容控制器是由那一種(OHCI/EHCI)控制器來實現的,如果N_CC位是0,則表示沒有兼容控制器,這時USB2.0-HCI系統則不能支持全速和低速的設備,如果要支持,只有通過USB2.0標準 的HUB來協助。

 

 

 

 

 

 

注:轉載請註明出處 [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章