linux usb 系統 (5)

EHCI協議中規定有幾種數據模型:

Periodic Frame List

Asynchronous List Queue Head Pointer

Isochronous (High-Speed) Transfer Descriptor (iTD)

Split Transaction Isochronous Transfer Descriptor (siTD)

Queue Element Transfer Descriptor (qTD)

Queue Head

Periodic Frame Span Traversal Node (FSTN)

以上數據模型(或稱數據結構)就是EHCI的關鍵,具體的定義可以查找EHCI 的spec (Enhanced Host Controller Interface Specification for Universal Serial Bus)。EHCI控制器驅動實出上就是對這幾種據結構的管理與操作。

EHCI控制器以協議的形式將這些數據模型規範下來,方案驅動設計者設計出通用的驅動,也方便非驅動設計者重用己有的驅動代碼。要做到這一點,EHCI對硬件部份也需要作出一些必要的規定,這就是硬件對軟件的接口--寄存器。

<>中對寄存器的序列及功能作了詳細的定義,主要有以下三部份:

PCI Configuration Registers (USB)

Host Controller Capability Registers

Host Controller Operational Registers

PCI Configuration Registers的定義我們不必太關心,arm中一般不會有這一部份,我們需要詳細瞭解的是Host Controller Capability Registers 和Host Controller Operational Registers這兩大板塊,

Enhanced Host Controller Capability Registers

Offset

Size

Mnemonic

Power Well

Register Name

 

00h

1

CAPLENGTH

 

Capability Register Length

 

01h

1

Reserved

 

N/A

 

02h

2

HCIVERSION

 

Interface Version Number

 

04h

4

HCSPARAMS

 

Structural Parameters

 

08h

4

HCCPARAMS

 

Capability Parameters

 

0Ch

8

HCSP-PORTROUTE

 

Companion Port Route Description

 

Host Controller Operational Registers

Offset

Mnemonic

Register Name

Power Well

   

00h

USBCMD

USB Command

     

04h

USBSTS

USB Status

     

08h

USBINTR

USB Interrupt Enable

     

0ch

FRINDEX

USB Frame Index

     

10h

CTRLDSSEGMENT

4G Segment Selector

     

14h

PERIODICLISTBASE

Frame List Base Address

     

18h

ASYNCLISTADDR

Next Asynchronous List Address

     

1C-3F

Reserved

       

40H

CONFIGFLAG

Configured Flag Register

     

44H

PORTSC(1-N_PORTS)

Port Status/Control

     

在一些主芯片的spec中,USB主控制器的部份就介紹得很簡單,大多數只是像我這樣簡單的說一下USB主控制器的標準,再列一下寄存器的序列,然後讓讀者去查找<這樣的文檔。

上表中標成紅色的寄存器是我們需要主要關注的,echi主控制器會以此爲入口,對各種數據模型進行調度。

主控制器的調度主要分爲兩大數,一類可以稱爲時間片的調度,多數控制器會以此種調度爲主,另一種則是異步(Asynchronous)調度。

USB協議中把USB的傳輸類型分爲控制傳輸,批量傳輸,中斷傳輸,等時傳輸。這幾種傳輸類型的定義其實是邏輯上的。我們知道,USB的物理數據通道就一條(D+/D-),要怎樣才能達到USB協議中這幾種傳輸類型的要求呢,這就要看主控制器是如何調度的了。

在EHCI中,把等時傳輸和中斷傳輸都用進間片調度來控制。請看下圖:

clip_image002
所謂的分時調度,就是把每秒的時間分爲若干片(一般是1024/256等),每一個時間片(Frame)處理一組(一般是ISO數據)數據。

CPU會把ISO數據和INT數據建立一張表放在內核中,而ECHI的寄存器FRINDEX則會跟蹤這個表,每一個時間片加-,FRINDEX所指之處,控制器就會把這處指針所指向的數據結構中的數據送到總線上去。整個過程看起來有點像是CPU的調度。

有了時間片的調度,其實控制器就可以完成所有的功能,但爲了方便用戶的使用,控制器還提拱了另一種調度來處理實時性要求不是很強的數據。

clip_image004
這種調試一般叫做異步調度,也就是AsyncListAddr發威的時候了,CPU把塊傳輸和控制傳輸的數據按協議要求的數據結構在內存中安排好並建立一個鏈表,AsyncListAddr則會跟蹤這個鏈表,控制器則把AsyncListAddr所指向的數據搬運到USB總線上去。

異步調度比ISO調度要簡單得多了。至於異步調試和同步調度之間如何協調,EHCI控制器會處理這個問題,再也不用軟件來操心了。

有了以上的簡章介紹,我們知道EHCI的規範中對寄存器,數據結構和控制方式都有了詳細的規定,linux是怎樣執行這個規定的呢。

 

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

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