19.10.2013 Views

偏移

偏移

偏移

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

飛思卡爾半導體<br />

應用筆記<br />

高端ColdFire系列USB模塊<br />

EHCI數據結構的實現<br />

作者: Melissa Hunter<br />

微處理器部<br />

1 引 言<br />

ColdFire系列的一些高端產品(如MCF532x、MCF5253、<br />

MCF5445x)包含兼容ECHI的USB主機控制器或USB雙模式<br />

(移動USB,OTG USB)控制器。雙模式(dual-role)模塊<br />

可 以 將 設 備 設 置 為 U S B 主 機 、 U S B 設 備 或 移 動 U S B<br />

設備模式。在主機模式下,所有的USB模塊都與EHCI相<br />

兼容。EHCI規範定義了控制USB數據運轉的寄存器集和數<br />

據結構。<br />

EHCI規範是為PC而設計的,因此允許主機在一個端口很好<br />

的支持多種不同類型的設備。對嵌入式系統來說,需要一種<br />

比較簡單的USB實現方法。本文的目的就是論述一種EHCI<br />

數據結構的簡化版本,該簡化版本中USB主機驅動支持一些<br />

需求的USB設備而不是整個EHCI協議棧。本文闡明了不同<br />

的數據怎樣在一起使用並提供了基本實例。<br />

本文的目的是指導開發一個簡單的驅動,該驅動允許和多種<br />

不同類型設備中的一種設備相通信。例如:如果你要支持<br />

鼠標,那麼你可以創建一個只能驅動鼠標的鼠標驅動。<br />

如果插入不同的USB設備,就會返回一個錯誤。假設數據傳<br />

輸的大小不大于4K。本文要求讀者對基本的USB規範比較<br />

熟悉。<br />

本文所討論的數據結構不支持USB或EHCI的所有特性。<br />

為了簡化EHCI數據結構,同步傳輸不討論。本文還假設<br />

在同一時刻一個端口只有一個設備。SPLIT事務只有在與<br />

通過USB2.0集線器的相連的全速或低速設備通信時才會被<br />

使用,因此不在討論之列。不支持同步和SPLIT事務使得<br />

完全取消一些EHCI數據結構,剩余數據結構的許多字段也<br />

沒有被使用。<br />

© Freescale Semiconductor, Inc., 2008. All rights reserved. .<br />

文件編號:AN3520<br />

版本:0, 09/2007<br />

1 引言 .................................................................... 1<br />

2 USB主机概述 ....................................................... 2<br />

2.1 隊列首部 (QH) ............................................... 2<br />

2.1.1 隊列首部平行鏈接指針(<strong>偏移</strong>:0x00) ......... 3<br />

2.1.2 端點特性(<strong>偏移</strong>:0x04) ........................... 3<br />

2.1.3 端點性能(<strong>偏移</strong>:0x08) ........................... 4<br />

2.1.4 (指向)當前qTD指針(<strong>偏移</strong>:0x0C) ............. 4<br />

2.1.5 qTD覆蓋區域(overlay area)<br />

(<strong>偏移</strong>:0x10-0x2C) ........................................... 4<br />

2.2 隊列元素傳輸描述符 (qTD) ............................... 4<br />

2.2.1 (指向)下一個qTD指針(<strong>偏移</strong>:0x00) .......... 5<br />

2.2.2 qTD令牌(<strong>偏移</strong>:0x08) ........................... 5<br />

2.2.3 qTD緩衝頁指針(<strong>偏移</strong>:0x0C) ................. 7<br />

2.3 周期表 (調度) ................................................. 7<br />

2.3.1 幀列表鏈接指針 .................................... 8<br />

2.3.2 周期表(調度)遍歷(過程) .......................... 8<br />

2.3.3 在周期表(調度)中增加中斷隊列首部 ......... 9<br />

2.4 異步表 (調度) ................................................ 10<br />

2.4.1 異步表(調度)遍歷(過程) .........................10<br />

2.4.2 在異步表(調度)中增加控制和<br />

批量隊列首部(QH) .................................. 11<br />

3 USB主机實例 ......................................................11<br />

3.1 控制隊列首部 ................................................ 11<br />

3.1.1 隊列首部水平鏈接指針實例(<strong>偏移</strong>:0x00) . 12<br />

3.1.2 端點特性(<strong>偏移</strong>:0x04) .......................... 12<br />

3.1.3 端點性能(<strong>偏移</strong>:0x8) ............................ 13<br />

3.1.4 當前qTD指針(<strong>偏移</strong>:0xC) ..................... 13<br />

3.1.5 下一qTD指針(<strong>偏移</strong>:0x10) .................... 13<br />

3.2 獲取設備描述符qTDs ..................................... 13<br />

3.2.1 獲取描述符SETUP包 ............................14<br />

3.2.2 IN包 ................................................. 15<br />

3.2.3 OUT包 .............................................. 17<br />

3.3 中斷隊列首部 ................................................18<br />

3.3.1 隊列首部水平鏈接指針實例(<strong>偏移</strong>:0x00) . 19<br />

3.3.2 端點特性(<strong>偏移</strong>:0x04) ..........................19<br />

3.3.3 端點性能(<strong>偏移</strong>:0x8) ........................... 20<br />

3.3.4 當前qTD指針(<strong>偏移</strong>:0xC) ..................... 20<br />

3.3.5 下一qTD指針(<strong>偏移</strong>:0x10) .................... 20<br />

3.4 周期幀列表初始化 ......................................... 20<br />

3.5 中斷qTD ...................................................... 21<br />

3.5.1 下一qTD指針(<strong>偏移</strong>:0x00) .................... 21<br />

3.5.2 qTD令牌(<strong>偏移</strong>:0x08) .......................... 22<br />

3.5.3 qTD緩衝區指針(<strong>偏移</strong>:0x0C) ................ 22<br />

4 補充說明 ............................................................ 22


2 . 1 . 1 隊 列 首 部 平 行 鏈 接 指 針 ( 偏 移 : 0 x 0 0 )<br />

飛思卡爾半導體<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

QH的第一個長字包含了一個鏈接指針指向下一個待處理的數據對象,該對象在本隊列中的所有要求的處理都完<br />

成之後處理。控制位定義如表2-1所示。該指針可能指向一個隊列首部或者一個同步傳輸描述符。在本文中,他<br />

總是指向下一個QH。<br />

31-5<br />

QHLP<br />

表2-1 隊列首部平行鏈接指針<br />

字段 描述<br />

4-1 寫0001<br />

0<br />

T<br />

隊列首部平行鏈接指針,該字段包含下一個在平行鏈表中<br />

待處理的QH的地址,相應的地址為[31:5]<br />

終止<br />

0 指針有效<br />

1 最後一個QH(指針無效)<br />

2 . 1 . 2 端 點 特 性 ( 偏 移 : 0 x 0 4 )<br />

QH的第二個長字詳細說明了端點的靜態信息。這些信息在端點的生命周期中不改變。這些字段由USB主機的軟<br />

件協議棧在QH建立時設置,並且決不被主機控制器硬件所修改。<br />

表2-2 端點特性<br />

字段 描述<br />

31-27 寫00000<br />

26-16<br />

最大包長度<br />

15 H<br />

14 寫1<br />

13-12<br />

EPS<br />

11-8<br />

端點<br />

7 寫0<br />

6-0<br />

設備地址<br />

設置相關端點的最大包大小。設備描述符指定最大包長度。本字段<br />

允許的最大值為0x400 (1024)。<br />

首部回收邊界標志位,該標志位由系統軟件設置來標記一隊列首部<br />

作為异步調度的首部。<br />

端點速度。<br />

00 全速(12Mb/s)01低速(1.5Mb/s)10 高速(480Mb/s)11保留<br />

端點號。該4比特的字段選擇設備特定的端點號作為數據源或者數據接<br />

收端點<br />

該字段選擇特定設備作為數據源或數據接收設備


AN3520應用筆記<br />

2 . 1 . 3 端 點 性 能 ( 偏 移 : 0 x 0 8 )<br />

QH的第三個長字指明了和SPLIT事務相關的一些參數,因此該長字的大部分總是設為相同的值。<br />

表2-3 端點性能<br />

字段 描述<br />

31-8 寫0x400_0000。<br />

7-0<br />

uFrame S-mask<br />

中斷調度屏蔽。該字段只有中斷端點使用。控制和塊端點該字段寫<br />

0x00。屏蔽位對應于一幀中的每一微幀。如果當前微幀號與S-mask的<br />

值相匹配,那麼該QH用來處理當前微幀的。全速中斷端點最小的輪詢<br />

間隔為1ms,那麼對全速或低速中斷端點該字段總是被設為1。<br />

對于高速端點S-mask的值可以被輪詢間隔小于1ms的中斷所使用。<br />

例如:值0xFF表示每個微幀(每隔125us)中斷被處理,而值0x11表示<br />

每四個微幀(500us)中斷被處理。<br />

2 . 1 . 4 ( 指 向 ) 當 前 q T D 指 針 ( 偏 移 : 0 x 0 C )<br />

該長字是當前被處理的qTD的地址。主機控制器在讀入qTD時寫該字段。當創建一個新QH時,軟件不需要初始化<br />

該長字。<br />

2 . 1 . 5 qTD覆蓋區域(overlay area)(<strong>偏移</strong>:0x10-0x2C)<br />

這個區域的八個長字是當前正在被處理或上次處理的有用的qTD的拷貝。當一次傳輸在進行時,控制器將增加的<br />

狀態信息寫入到qTD覆蓋區域。傳輸完成後,結果被寫回到原有的qTD區域(當前qTD指針所指向的地址)。<br />

這些值在主機拷貝進當前qTD時進行初始化。因此,不需要軟件初始化這些字段。唯一例外的是指向下一個qTD<br />

的指針字段,該字段需要在創建一新QH時軟件進行初始設置,該字段應被設為該端點要處理的第一個qTD的<br />

地址(利用T標志位清零表明以一有效的指針),控制器用該地址去訪問該端點qTD鏈表的起始。<br />

2 . 2 隊 列 元 素 傳 輸 描 述 符 ( q T D )<br />

qTD定義了控制、批量、中斷傳輸的實際數據活動。qTD被當作一個單鏈表處理。QH中的下一qTD指針(next qTD<br />

pointer)要被初始化為鏈表中的第一個qTD的地址。第一個qTD處理完成後,控制器使用第一個qTD中的next qTD<br />

pointer去查找第二個qTD,就此重複直到一個qTD的next qTD pointer字段無效為止。QTD一定要個32字節的<br />

邊界對齊。<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


圖2 是EHCI規範中定義的qTD的簡化版本,可傳輸的數據最大為4KB。<br />

1. 主機控制器可讀/寫;其他為只讀。<br />

飛思卡爾半導體<br />

圖2 簡化的隊列頭部(QH)設計<br />

2 . 2 . 1 ( 指 向 ) 下 一 個 q T D 指 針 ( 偏 移 : 0 x 0 0 )<br />

qTD的第一個長字是指向另一個qTD的指針,該指針用來創建一個qTD的單鏈表。<br />

31-5<br />

指向下一個qTD的指針<br />

表2-4 qTD下個元素傳輸指針 (長字0)<br />

字段 描述<br />

該字段包含寫一個待處理的qTD的物理地址。相應的地址為[31:5]<br />

4-1 保留。這幾位的數據對操作無影響<br />

0<br />

T<br />

2 . 2 . 2 q T D 令 牌 ( 偏 移 : 0 x 0 8 )<br />

終止,該標志位通知主機控制器該隊列中沒有有效的入口了<br />

0 指針有效 (指向一個有效的qTD)<br />

1 指針無效<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

dt 1<br />

隊列元素傳輸描述符的第三個長字包括主機控制執行一個USB事務所需要的大部分信息(剩下的端點和地址信息<br />

在QH中指明)。<br />

傳輸的字節總數<br />

下一個qTD指南<br />

000_0000_0000_0000_0000_0000_0000_0000<br />

ioc 000 1<br />

1<br />

緩衝區指南<br />

Cerr 1 PID<br />

Code<br />

0000_0000_0000_0000_0000_0000_0000_0000<br />

0000_0000_0000_0000_0000_0000_0000_0000<br />

0000_0000_0000_0000_0000_0000_0000_0000<br />

0000_0000_0000_0000_0000_0000_0000_0000<br />

0000<br />

Status 1<br />

T<br />

1<br />

0x00<br />

0x04<br />

0x08<br />

0x0C<br />

0x10<br />

0x14<br />

0x18<br />

0x1C


AN3520應用筆記<br />

表2-5 qTD令牌 (長字2)<br />

字段 描述<br />

31<br />

dt<br />

30-16<br />

傳輸字節總數<br />

15 ioc<br />

14-10 寫000<br />

11-10<br />

Cerr<br />

9-8<br />

PID碼<br />

7-0<br />

狀態<br />

數據觸發。該位控制數據觸發次序。IN和OUT事務該位設為1,<br />

SETUP數據包該位清零。<br />

該字段指明與該傳輸描述符一起傳輸的字節總數。該字段值根據成功完成的<br />

事務中傳輸的數據量減少。<br />

當主機控制器取該傳輸描述符時(active 標志位為1),如果該字段值為零,那麼<br />

主機控制器執行一個0長度的事務並放棄該傳輸描述符。<br />

注意:該字段可以設置的最大值為4K(0x1000),該值是單頁指針所能訪問的<br />

最大字節數。主機控制器可以通過多頁指針適應更大的傳輸。但是本文中為了<br />

簡化數據結構最大傳輸大小為4KB。<br />

完成中斷,如果該位被設置,qTD完成時主機控制器應在下個中斷之前產生一<br />

個中斷。<br />

錯誤計數。該2比特的向下計數器跟蹤(記錄)執行該qTD時檢測到的連續<br />

錯誤數。主機控制器減少計數為每個連續的錯誤並將它寫回到qTD,如果事務<br />

失敗。該位寫0x03,表示該傳輸最多允許三次重試。<br />

如果計數器計數從1減為0,主機控制器標記qTD為非激活,並設置挂起、錯誤<br />

狀態標志位。如果USBINTR寄存器中的USB錯誤中斷允許位設置,就會產生<br />

一個中斷。中間執行狀態回寫到QH的覆蓋區域,而不是qTD。<br />

該字段是傳輸描述符相關的事務使用的令牌碼。<br />

00 OUT令牌 (產生令牌碼0xE1)<br />

01 IN令牌 (產生令牌碼0x69)<br />

10 SETUP令牌 (產生令牌碼0x2D) (中斷傳輸模式未定義,例如隊列首部的<br />

uFrame S-mask 字段非零。)<br />

11保留<br />

主機控制器使用該字段將單個命令執行狀態回傳給主機控制驅動(HCD)軟件。<br />

該字段包含該qTD執行的最後事務的狀態<br />

位 狀態字段描述<br />

7<br />

6<br />

激活。設置該位表明qTD已被初始化,並準備使用。使能主機控制器<br />

事務執行<br />

挂起。主機控制器根據狀態更新設置該位表明在設備或者端點qTD<br />

發生了一個嚴重的錯誤<br />

5 數據緩衝錯誤<br />

4 檢測到幀傳輸中的總線動作<br />

3 事務錯誤<br />

2 丟幀<br />

1 SPLIT事務狀態。寫0<br />

0 Ping狀態 (P)/ERR<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


2 . 2 . 3 q T D 緩 衝 頁 指 針 ( 偏 移 : 0 x 0 C )<br />

qTD緩衝頁指針用來指明傳輸數據緩衝區的內存地址。<br />

飛思卡爾半導體<br />

表2-6 qTD緩衝區指針<br />

字段 描述<br />

31-0 緩衝區指針<br />

2 . 3 周 期 表 ( 調 度 )<br />

圖3 周期表(調度)的結構圖。所以中斷傳輸使用這種表(調度)。<br />

USB寄存器<br />

FRINDEX<br />

PERIODICLISTBASE<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

緩衝區指針。指明qTD使用的數據緩衝區的內存地址。主機控制器<br />

使用地址的(31-12位)作為4KB的頁的頁指針,而地址的11-0位作為的<br />

頁內索引。主控制器只增加頁內索引,而不增加頁地址,這就是本文<br />

中傳輸大小限于4K的原因。<br />

數據緩衝區的不能越過4KB的頁邊界。一般應用中大多數傳輸是<br />

小的,通過謹慎的安排堆可以避免運行時緩衝區對齊問題。如果在<br />

堆空間中從(4KB的)頁起始處為QHs、qTDs和數據緩衝區分配內存<br />

空間,並且應用不會在同一時刻需要大于4KB的數據結構和緩衝區,<br />

那麼數據緩衝區對齊就不涉及到。<br />

如果數據結構和數據緩衝區需要大于4KB,有以下幾種方法避免數據<br />

緩衝區跨過頁(4KB)邊界:<br />

強制數據緩衝區4KB對齊,但這樣不能有效的利用內存除非大多數傳<br />

輸接近4KB。<br />

使每個數據緩衝區跟自身大小對齊。如:16字節的傳輸跟16字節的<br />

邊界地址對齊。這樣可以高效的使用內存,但增加了一些代碼處理<br />

對齊。<br />

週期幀<br />

列表元素<br />

地址<br />

1024,512或256<br />

元素<br />

週期幀列表<br />

•<br />

圖3 周期調度組織<br />

中斷隊列<br />

頭 qTDs<br />


AN3520應用筆記<br />

USB模塊的PERIODICLISTBASE寄存器和FRINDEX(13-3位)組合成一個指針指向一指針數組,該數組命名為<br />

周期幀列表(periodic frame list)。指向周期幀列表的指針隨幀(1ms)遞增。<br />

周期幀列表是4KB的頁對齊的幀列錶鏈接指針數組,幀列表的長度可以通過USBCMD[FS]字段設定。EHCI規範<br />

支持周期幀列表包含1024、512或256個元素。USB模塊周期幀列表可以有128、64、32、16或8元素。在內存<br />

較小嵌入式應用中,使用非EHCI兼容的幀列表大小有助于減少USB軟件所需要的內存空間。<br />

2 . 3 . 1 幀 列 錶 鏈 接 指 針<br />

幀列錶鏈接指針指向主機控制器在周期調度中當前幀的的第一個處理項。該鏈接指針在周期幀列表中與長字邊界<br />

對齊。圖4是幀列錶鏈接指針的格式。<br />

31 5 4 3 2 1 0<br />

圖4 幀列錶鏈指針的格式<br />

幀列錶鏈接指針訪問的內存對象32字節對齊的,(幀列表指針中的最低有效位The least significant bits in a frame<br />

list pointer key the host controller as to the type of object the pointer is referencing)。對中斷傳輸來說幀列錶鏈<br />

接指針總是指向一個QH(TYPE = 0b01)。<br />

最低有效位為終止位,該位用來表明指針的內容是否有效。當該位設置時,主機控制器忽略幀列表中的項;<br />

清零時,幀列錶鏈接指針可用來訪問引用的對象,本文中為QH。<br />

2 . 3 . 2 周 期 表 ( 調 度 ) 遍 曆 ( 過 程 )<br />

周 期 表 ( 調 度 ) 可 通 過 周 期 調 度 使 能 位 ( U S B C M D [ P S E ] ) 來 使 能 或 禁 止 。 P S E 位 的 改 變 不 一 定 即 時 生 效 。<br />

USBSTS[PS]位反應了周期表(調度)的當前狀態。如果PS位清零,主機控制器就不嘗試遍曆周期表。同樣,如果<br />

PS位設置,在微幀(每125us)的起始USB控制器通過查找周期表調度USB通信量。周期通信量保證了總線帶寬,<br />

這樣看來周期表(調度)的優先級比异步表(調度)的高。控制器使用指向周期幀列表的指針訪問當前幀列錶鏈接<br />

指針。如果T標志位清零(表示為有效指針)控制器幀列錶鏈接指針指向的QH。<br />

主機控制器在每個微幀的開始調度周期通信量,但指向周期幀列表的指針只會為一個整幀而增加。周期幀列表中<br />

的每一項會被訪問8次每幀。QH[uFrame S-mask]字段值確定每個微幀如果通信量用來調度一已知的QH。<br />

如果找到的QH對當前微幀是有效的,那麼主機控制器就處理列表中該QH的所有qTD。當第一個QH的qTDs<br />

完成後,控制器檢測第一個QH是否指向另一個QH。如果有,將移到第二個QH並處理它的qTDs。如此重複直到<br />

最後一個QH(該QH不指向另一個QH)。此時,控制器切換到异步表(調度)。微幀中剩下的所有時間用來處理<br />

异步表(調度)傳輸。<br />

幀列表鏈指針<br />

如果周期表(調度)禁止或者當前列錶鏈接指針中的T標志位被設置,那麼整個幀可以使用异步表(調度)通信量。<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

00<br />

Typ<br />

T<br />

飛思卡爾半導體


2 . 3 . 3 在 周 期 表 ( 調 度 ) 中 增 加 中 斷 隊 列 首 部<br />

飛思卡爾半導體<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

當一個中斷設備端點被激活後,主機軟件應該為那個端點創建一個QH並連接到周期表中。QHs被鏈接到<br />

周期表中因此它們將被以適當的速率輪詢。每一個周期幀列表項使用1ms。因此,每個周期幀列表中不指向已知<br />

QH的項會有1ms的延時。<br />

例如:為了為FS/LS中斷獲得8ms的輪詢速率,周期幀列表中每逢第八項指向QH (QH[uFrame S-mask]位應被<br />

置位)。<br />

圖5 是怎樣為一單中斷設置周期幀列表的例子,該中斷每4ms輪詢一次。周期幀列表中每逢4項是指向相同的<br />

QH這樣得到想要的輪詢速率。<br />

USB寄存器<br />

FRINDEX<br />

PERIODICLISTBASE<br />

週期幀<br />

列表元素<br />

地址<br />

1024,512或256<br />

元素<br />

圖5 周期幀列表實例 - 每4ms輪詢一次的中斷<br />

如果一個高速(HS)中斷需要小于1ms的輪詢速率,QH[uFrame S-mask]的值產生想要的輪詢速率。QH鏈接到<br />

周期幀列表中的每一個項,QH[uFrame S-mask]字段中的設置位之間的間隔決定中斷上生的頻率。<br />

例如:QH[uFrame S-mask]設置為0b01010101(間隔為1),那麼每隔一個微幀產生中斷(每250us)。值<br />

0b00010001(間隔為4)產生一個中斷每4個微幀(每500us)。<br />

週期幀列表<br />

• •<br />

•<br />

••<br />

•<br />

中斷隊列<br />

頭<br />

qTDs


AN3520應用筆記<br />

2 . 4 異 步 表 ( 調 度 )<br />

圖6是异步表(調度)的結構圖。該表(調度)在所有控制和批量傳輸中使用。因為控制和批量傳輸不保證USB總線帶<br />

寬,控制器只有在以下情況使用該列表:<br />

• 到達周期列表的結尾<br />

• 周期列表禁止<br />

• 周期列表空<br />

10<br />

圖6 同步調度組織<br />

异步列表是一個簡單的隊列首部循環表,ASYNCLISTADDR寄存器指向該表。軟件應初始化ASYNCLISTADDR使<br />

它指向第一個QH。控制器處理列表時設置ASYNCLISTADDR指向下一個QH。在這種方式下,控制器在處理完周<br />

期隊列之後,它並沒有返回到异步列表的開始處,而是回到上次離開的點進行處理。這就為异步隊列中的QH實<br />

現了徹底的循環服務。<br />

USB寄存器<br />

ASYNCLISTADDR<br />

qTDs<br />

2 . 4 . 1 异 異 步 表 ( 調 度 ) 遍 曆 ( 過 程 )<br />

异步表(調度)遍曆可以通過异步表(調度)使能位(USBCMD[ASE])來使能或禁止。ASE位的改變不一定即時生效。<br />

USBSTS[AS]位反應了异步表(調度)的當前狀態。如果AS位清零,主機控制器就不嘗試遍曆异步表。同樣,如果<br />

AS位設置,主機控制器使用ASYNCLISTADDR寄存器遍曆异步表。<br />

主機控制器使用ASYNCLISTADDR寄存器的值開始遍曆异步表,讀第一個引用的QH並執行事務並以適合的方法遍<br />

曆鏈表。主控制器處理完异步表,就保持最後訪問的QH的平行指針在ASYNCLISTADDR寄存器。下次再訪問异<br />

步表時這就是第一個服務的QH。這就實現了處理异步表的循環共享。<br />

H<br />

批量/控制首隊列部<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


主機控制器在以下事件發生時結束處理异步表:<br />

• 到達微幀的末尾<br />

• 主機控制器檢測到列表空<br />

• 异步表(調度)禁止(USBCMD[ASE]清空)<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

2 . 4 . 2 在 異 步 表 ( 調 度 ) 中 增 加 控 制 和 批 量 隊 列 首 部 ( Q H )<br />

每當一個新的設備端點激活就有一個QH加入到列表中。該端點的所有通信量在一個qTD中設置並鏈接到合適的<br />

QH上。主機控制器通過環中的QHs循環檢測激活的qTDs。<br />

因為异步表(調度)在一個環中處理QH,所以异步表激活時環不能斷開。這表示向异步表中添加或從中移除QH時<br />

要小心進行。<br />

3 U S B 主 機 實 例<br />

現在通過查看可用的USB主機軟件獲得數據結構的使用實例。該部分討論了Freescale’s ColdFire網站(http://<br />

www.freescale.com/coldfire)上提供的MCF532XSC.Zip文件中“m5329evb_usb_host_mouse_test”演示代碼。<br />

該代碼:<br />

(1) 設置USB模塊為主機模式。<br />

(2) 枚舉一個USB鼠標。<br />

(3) 從鼠標中讀取<strong>偏移</strong>和按鍵信息。<br />

本文使用MCF532XSC.zip作為一個具體實例,但該實例中的代碼可以容易地移植到其他包含兼容EHCI的主機控<br />

制器或雙模式USB控制器的ColdFire設備。<br />

3 . 1 控 制 隊 列 首 部<br />

一旦主機控制器檢測到接入了新的USB設備,首先就是建立一個QH處理枚舉設備的控制通信量。圖7是簡化的<br />

QH,橫線下的值是實例中將QH初始化為端點0QH的值。因為在創建QH時它們不需要軟件初始化,QTD覆蓋區<br />

在實例中已刪除。實例軟件中總是在覆蓋區清零以使得方便讀取QH的值。QH初始後,該QH成為异步列表中的<br />

第一也是唯一的QH,因此寄存器ASYNCLISTADDR中為該QH的地址。<br />

飛思卡爾半導體 11


AN3520應用筆記<br />

1<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

圖7 端點0控制隊列頭部實例<br />

3 . 1 . 1 隊 列 首 部 水 平 鏈 接 指 針 實 例 ( 偏 移 : 0 x 0 0 )<br />

表3-7 隊列首部水平鏈接指針<br />

字段 描述<br />

31-5 QHLP<br />

4-1 0b0001<br />

該QH的對應的地址,QH本身駐留在0x4010-52E0,因為此刻只有一<br />

個QH所以指向它本身。<br />

0 T 清零表明水平鏈接指針值有效<br />

3 . 1 . 2 端 點 特 性 ( 偏 移 : 0 x 0 4 )<br />

表3-8 端點特性<br />

字段 描述<br />

31-27 0b00000<br />

26-16最大包長度<br />

最大包長度初始為0x40。該值應修改為設備描述符中實際的最大包<br />

長度<br />

15H 設置該位標明該QH為异步表的首部<br />

14 0b1<br />

13-12 EPS 0b01表明低速端點,因為鼠標為低速設備<br />

11-8 EndPt 端點號為0,這是枚舉用的默認端點<br />

7 寫0<br />

6-0設備地址<br />

隊列首部水平鏈接指針<br />

0x4010_52E2<br />

00000 最大幀長 H 1 EPS EndPt 0 設備地址 0x04<br />

0x0040_D000<br />

0100_0000_0000_0000_0000_0000<br />

當前qTD指南<br />

下一個qTD指針<br />

0x4000_0000<br />

0x0000_0000<br />

0x0000_0001<br />

初始時設備地址設為0.在主機為設備分配地址之前這是設備的默認地<br />

址。一旦設置地址命令發送到設備,該字段應被更新為設備新的地址<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

0001<br />

µ Frame<br />

S-mask<br />

00000<br />

000<br />

T<br />

T<br />

0x00<br />

0x08<br />

0x0C<br />

0x10<br />

飛思卡爾半導體


3 . 1 . 3 端 點 性 能 ( 偏 移 : 0 x 8 )<br />

表3-9 端點性能<br />

字段 描述<br />

31-8 寫0x400_0000。<br />

7-0 uFrame S-mask 控制端點S-mask清零<br />

3 . 1 . 4 當 前 q T D 指 針 ( 偏 移 : 0 x C )<br />

當前qTD指針不需要軟件初始化,但在該例中已被寫0。為了調試這樣可以較為容易地讀取QH。<br />

3 . 1 . 5 下 一 q T D 指 針 ( 偏 移 : 0 x 1 0 )<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

下一qTD指針寫0x0000_0001,這樣表明該QH當前沒有指向一個有效的qTD。一旦該端點的qTDs初始化,那麼<br />

該值應更新指向鏈表中第一個qTD。<br />

3 . 2 獲 取 設 備 描 述 符 q T D s<br />

此時异步列表已建立並使能,但主機控制器還未申請任何總線周期。為了申請USB通行量需要創建一些qTDs。<br />

USB枚舉過程中第一步是讀取連接設備的設備描述符,以此為例初始化qTDs。設備描述符提供接入設備的基本<br />

信息,這些信息包括設備端點0所支持的最大包長度。讀入最大包長度後,QH[Maximum Packet Length]字段被<br />

改寫以與設備性能向適應。<br />

為了讀入設備描述符,需要三次不同的傳輸:<br />

(1) 與setup包一起發送獲取設備描述符命令<br />

(2) 主機發送IN包以允許設備發送描述符<br />

(3) 主機發送一個0長度的OUT包以響應描述符的接收<br />

飛思卡爾半導體 1


AN3520應用筆記<br />

3 . 2 . 1 獲 取 描 述 符 S E T U P 包<br />

圖8是簡化的qTD,以及軟件實例中用來發送獲取描述符命令的實際值。因為qTD的最後四個長字在實例中沒有<br />

使用,所以已刪除。實例中總是清零qTD的最後4個長字以使得讀取qTD的值簡便。<br />

1<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

圖8 獲取描述符SETUP包的qTD的實例<br />

3 . 2 . 1 . 1 下 一 q T D 指 針 ( 偏 移 : 0 x 0 0 )<br />

表3-10 qTD下一元素傳輸指針(長字0)<br />

字段 描述<br />

31-5<br />

下一qTD指針<br />

4-1 0b0000<br />

下一個qTD指南<br />

0x4010_5220<br />

000_0000_0000_0000_0000_0000_0000_0000<br />

0x0000_0001<br />

dt 傳輸的字節總數 ioc 000 Cerr<br />

0x0008_0E80<br />

緩衝區指針<br />

0x4010_5C5C<br />

該指針指向IN包qTD。在本例中指向地址0x4010_5220。IN Packet<br />

詳見3.2.2部分<br />

0 T 該位清零表明下一qTD指針值有效<br />

PID<br />

Code<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

0000<br />

T<br />

1<br />

0x00<br />

0x04<br />

狀態 0x08<br />

0x0C<br />

飛思卡爾半導體


3 . 2 . 1 . 2 q T D 令 牌 ( 偏 移 : 0 x 0 8 )<br />

表3-11 qTD令牌(長字2)<br />

字段 描述<br />

31<br />

dt<br />

發送SETUP包該位清零<br />

30-16 傳輸總字節數 SETUP包為8字節該位設置為0x8<br />

15<br />

ioc<br />

14-10 0b000<br />

11-10<br />

Cerr<br />

9-8<br />

PID碼<br />

7-0<br />

狀態<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

該位清零。在OUT包的結束,申請一中斷表明整個獲取描述符事務的<br />

完成。<br />

設為0b11以允許最多三次連續重試<br />

SETUP 的PID為0b10<br />

0x80標記qTD激活的並待主機控制器硬件處理<br />

3 . 2 . 1 . 3 q T D 緩 衝 區 頁 指 針 ( 偏 移 : 0 x 0 C )<br />

表3-12 qTD緩衝區指針<br />

字段 描述<br />

31-0<br />

緩衝區指針<br />

3 . 2 . 2 I N 包<br />

發送數據緩衝區位置在0x4010_5E2C.0x8006_0001和0x0000_4000,<br />

轉換為一GET_DESCRIPTOR命令,其中描述符類型為DEVICE,長度<br />

為64字節。<br />

圖9是簡化的qTD圖,以及軟件實例中的用于發送IN命令讀取設備描述符的實際值。<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

下一個qTD指南<br />

0x4010_51C0<br />

000_0000_0000_0000_0000_0000_0000_0000<br />

0x0000_0001<br />

dt 傳輸的字節總數 ioc 000 Cerr<br />

0x8040_0D80<br />

緩衝區指針<br />

0x4010_60F8<br />

圖9 獲取描述符IN包的qTD的實例<br />

PID<br />

Code<br />

飛思卡爾半導體 1<br />

0000<br />

T<br />

1<br />

0x00<br />

0x04<br />

狀態 0x08<br />

0x0C


AN3520應用筆記<br />

3 . 2 . 2 . 1 下 一 q T D 指 針 ( 偏 移 : 0 x 0 0 )<br />

1<br />

表3-13 qTD下一元素傳輸指針(長字0)<br />

字段 描述<br />

31-5下一qTD指針<br />

4-1 0b0000<br />

0<br />

T<br />

該指針指向OUT包qTD,本例中位于0x4010_51C0。OUT Packet詳見<br />

3.2.3部分<br />

該位清零表明下一qTD指針值有效。<br />

3 . 2 . 2 . 2 q T D 令 牌 ( 偏 移 : 0 x 0 8 )<br />

表3-14 qTD令牌(長字2)<br />

字段 描述<br />

31<br />

dt<br />

30-16<br />

傳輸的總字節數<br />

15<br />

ioc<br />

14-10 0b000<br />

11-10<br />

Cerr<br />

9-8<br />

PID碼<br />

7-0<br />

狀態<br />

請求IN包所以該位置位<br />

設為0x40。鼠標最大包長度為8,因此發送設備描述符頭8個字節。這<br />

遠小于請求的長度,主機控制認為包已結束不再請求更多數據。<br />

設備描述符實際18字節長,因此讀到的8個字節不是整個描述符。但是<br />

這已經足夠確定設備端點0支持的最大數據包長度(設備描述符的第八<br />

個字節是最大包長度)。該值被寫入到QH[Maximum Packet Length]<br />

字段後,主機控制器識別8個字節為設備的整包並作出相應的應答。<br />

例如:在枚舉過程中第二次讀取設備描述符,這次主機請求3個不同的<br />

IN包。前兩個為整8個字節,最後一個IN設備只發送兩個字節。因為這<br />

小于最大包長度,主機認為這是結束包。<br />

該位清零。在OUT包的結束,申請一中斷表明整個獲取描述符事務的<br />

完成。<br />

設為0b11以允許最多三次連續重試<br />

IN的PID為0b01<br />

0x80標記qTD激活的並待主機控制器硬件處理<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


3 . 2 . 2 . 3 q T D 緩 衝 區 指 針 ( 偏 移 : 0 x 0 C )<br />

表3-15 qTD緩衝區指針<br />

字段 描述<br />

31-0<br />

3 . 2 . 3 O U T 包<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

0x4010_60F8緩衝區的位置,該緩衝區存放是主機控制器接收到設備<br />

的數據。<br />

圖10是簡化的qTD圖,以及軟件實例中的用于發送OUT命令響應接收到設備描述符的實際值。<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

下一個qTD指南<br />

0xDEAD_0001<br />

000_0000_0000_0000_0000_0000_0000_0000<br />

0x0000_0001<br />

dt 傳輸的字節總數 ioc 000 Cerr<br />

0x8000_8C80<br />

緩衝區指針<br />

0x0000_0000<br />

圖10 獲取描述符OUT包的qTD的實例<br />

PID<br />

Code<br />

3 . 2 . 3 . 1 下 一 q T D 指 針 ( 偏 移 : 0 x 0 0 )<br />

表3-16 qTD下一元素傳輸指針(長字0)<br />

字段 描述<br />

31-5<br />

下一qTD指針<br />

4-1 0b0000<br />

0<br />

T<br />

飛思卡爾半導體 1<br />

0000<br />

T<br />

1<br />

0x00<br />

0x04<br />

狀態 0x08<br />

OUT包完成獲取設備描述符事務所需要的最後qTD。此時沒有其他的通<br />

信請求。因此,下一qTD指針為無效值。例程中使用0xDEAD_0001,可<br />

以容易地識別qTD鏈的結束。<br />

該位置位表明下一qTD指針值有效<br />

0x0C


AN3520應用筆記<br />

3 . 2 . 3 . 2 q T D 令 牌 ( 偏 移 : 0 x 0 8 )<br />

1<br />

表3-17 qTD令牌(長字2)<br />

字段 描述<br />

31<br />

dt<br />

30-16<br />

傳輸總字節數<br />

15<br />

ioc<br />

發送OUT包該位置位<br />

設為人0x0。OUT是用來確認的0長度的事務,因此主機沒有實際數據<br />

發送。<br />

14-10 0b000<br />

11-10<br />

Cerr<br />

9-8<br />

PID碼<br />

7-0<br />

狀態<br />

整個獲取描述符事務完成置位請求一個中斷<br />

設為0b11以允許最多三次連續重試<br />

OUT的PID為0b00<br />

0x80標記qTD激活的並待主機控制器硬件處理<br />

3 . 2 . 3 . 3 q T D 緩 衝 區 頁 指 針 ( 偏 移 : 0 x 0 C )<br />

表3-18 qTD緩衝區指針<br />

字段 描述<br />

31-0<br />

緩衝區指針<br />

3 . 3 中 斷 隊 列 首 部<br />

緩衝區指針清零。因為沒有數據發送數據緩衝區不需要。<br />

從鼠標讀入描述符後,例程配置一QH與一中斷端點通信。鼠標使用中斷端點返回x-和y-<strong>偏移</strong>信息、按鍵數據和滾<br />

動信息(返回數據的格式隨鼠標不同變化)。<br />

圖11是簡化的QH圖,以及例程中用來初始化QH為端點1的中斷QH的值。<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

圖11 中斷隊列頭部實例<br />

3 . 3 . 1 隊 列 首 部 水 平 鏈 接 指 針 實 例 ( 偏 移 : 0 x 0 0 )<br />

表3-19 隊列首部水平鏈接指針<br />

字段 描述<br />

31-5<br />

QHLP<br />

4-1 0b0001<br />

0<br />

T<br />

該值與QH的地址相對應。QH本身駐留在0x4010_4240。<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

置位該位表明水平鏈接指針值無效。因為該QH加入周期表中,在异步<br />

表的循環鏈表中不使用。<br />

3 . 3 . 2 端 點 特 性 ( 偏 移 : 0 x 0 4 )<br />

表3-20 端點特性<br />

字段 描述<br />

31-27 0b00000<br />

26-16<br />

最大包長度<br />

15<br />

H<br />

14 0b1<br />

最大包長度設為0x08。這和設備端點描述符中最大包的大小一致。<br />

USB鼠標最大包大小總是為0x8。<br />

清零應為該位在周期表中不使用<br />

13-12 EPS 0b01表明一個低速端點,因為鼠標是低速設備<br />

11-8 EndPt 端點號為1,因為這是鼠標中斷通信使用的端點<br />

7 寫0<br />

6-0<br />

設備地址<br />

隊列首部水平鏈接指針<br />

0x4010_4243<br />

00000 最大幀長 H 1 EPS EndPt 0 設備地址 0x04<br />

0x0008_5102<br />

0100_0000_0000_0000_0000_0000<br />

當前qTD指南<br />

下一個qTD指針<br />

0x4000_0001<br />

0x0000_0000<br />

0x0000_0001<br />

設備地址設為2。這是例程中枚舉過程中分配給設備的地址。<br />

飛思卡爾半導體 1<br />

0001<br />

µ Frame<br />

S-mask<br />

00000<br />

000<br />

T<br />

T<br />

<strong>偏移</strong>量<br />

0x00<br />

0x08<br />

0x0C<br />

0x10


AN3520應用筆記<br />

3 . 3 . 3 端 點 性 能 ( 偏 移 : 0 x 8 )<br />

0<br />

表3-21 端點性能<br />

字段 描述<br />

31-8 寫0x400_0000<br />

7-0<br />

uFrame S-mask<br />

S-mask值設為1,因為該QH為低速(LS)中斷端點所用。<br />

3 . 3 . 4 當 前 q T D 指 針 ( 偏 移 : 0 x C )<br />

當前qTD指針不需要軟件初始化,但在本例中寫0,出于調試目的這樣做可以更為簡單的讀取QH。<br />

3 . 3 . 5 下 一 q T D 指 針 ( 偏 移 : 0 x 1 0 )<br />

下一qTD指針寫0x0000_0001。這表明該QH指向一無效qTD。在為該端點創建一qTD後,該字段應寫入指向第一個qTD<br />

的值。<br />

3 . 4 周 期 幀 列 表 初 始 化<br />

此時,例程配置周期幀列表。函數periodic_schedule_init實現以下功能:<br />

• 初始化USBCMD[FS]字段,該字段定義周期幀列表的大小<br />

• 為周期幀列表分配內存空間<br />

• 用長字0x0000_0001填充幀列表,表示當前幀列表指針無效<br />

• 寄存器PERIODICLISTBASE用來設置指向幀列表<br />

• 周期表使能<br />

現在,中斷QH需要鏈接到周期幀列表中去建立想要的輪詢速率。例程中默認設置周期幀列表大小為32。幀列表中<br />

的第一項設為0x4010_4242一指向中斷QH。<br />

這意味每32ms設備被輪詢一次(1ms/幀列表指針×32幀列表指針)。輪詢速率可以通過讓更多的幀列表指針指向中<br />

斷QH來增加。也可以通過減小幀列表大小提高輪詢速率。<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體


3 . 5 中 斷 q T D<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

AN3520應用筆記<br />

周期表此時已經運行,但是需要一個qTD移動數據。例程使用一個qTD來中斷通信。該qTD配置為可以容納20個<br />

USB鼠標的包。一旦接收到20個包,傳輸總字節數和緩衝區指針字段重新初始化為原來值,這樣該qTD就可以在<br />

連續環中再次使用。<br />

圖12是在例程中使用的中斷qTD的實際值。<br />

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 <strong>偏移</strong>量<br />

圖12 中斷qTD實例<br />

3 . 5 . 1 下 一 q T D 指 針 ( 偏 移 : 0 x 0 0 )<br />

表3-22 qTD下一元素傳輸指針(長字0)<br />

字段 描述<br />

31-5<br />

下一qTD指針<br />

4-1 0b0000<br />

0<br />

T<br />

下一個qTD指南<br />

0xDEAD_0001<br />

000_0000_0000_0000_0000_0000_0000_0000<br />

0x0000_0001<br />

dt 傳輸的字節總數 io 000 Cerr<br />

0x8064_8D80<br />

緩衝區指針<br />

0x4010_6268<br />

該qTD是QH的唯一qTD。因為qTD的鏈表不需要,下一qTD指針值無效<br />

該位置位表明下一qTD指針值無效<br />

PID<br />

Code<br />

飛思卡爾半導體 1<br />

0000<br />

T<br />

1<br />

0x00<br />

0x04<br />

狀態 0x08<br />

0x0C


AN3520應用筆記<br />

3 . 5 . 2 q T D 令 牌 ( 偏 移 : 0 x 0 8 )<br />

表3-23 qTD令牌(長字2)<br />

字段 描述<br />

31<br />

dt<br />

30-16<br />

傳輸總字節數<br />

15<br />

ioc<br />

14-10 0b000<br />

11-10<br />

Cerr<br />

9-8<br />

PID碼<br />

7-0<br />

狀態<br />

發送IN包該位置位<br />

傳輸總字節數為鼠標的20個包的大小。包大小由設備端點描述符的第<br />

4個字節定義。因為包大小變化依賴于鼠標,所以傳輸總字節數也變<br />

化。在本例中,連接到M5329EVB的鼠標一個IN包返回5個字節的數<br />

據。因此該總字節數ı100(0x64)。<br />

事務完成後該位設置以親求中斷<br />

設為0b11以允許最多三次連續重試<br />

IN的PID為0b01<br />

0x80標記qTD激活的並待主機控制器硬件處理<br />

3 . 5 . 3 q T D 緩 衝 區 指 針 ( 偏 移 : 0 x 0 C )<br />

表3-24 qTD緩衝區指針<br />

字段 描述<br />

31-0<br />

緩衝區指針<br />

4 補 充 說 明<br />

緩衝區的位置為0x4010_6268,該緩衝區存儲從設備讀到的數據<br />

表25列出了一些其他的資源,這些資源可以用來查找更多USB和EHCI的相關信息。<br />

表3-25 其他資源<br />

文檔 網站 描述<br />

Universal Serial Bus<br />

Specification<br />

Enhanced Host Controller<br />

Interface Specification<br />

http://www.usb.org/developers/docs USB官方規範<br />

http://www.intel.com/technology/usb/spec.htm EHCI官方規範<br />

高端ColdFire系列USB模塊EHCI數據結構的實現, Rev. 0<br />

飛思卡爾半導體

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!