You are on page 1of 29

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.

tw
或來電(02)2705-5066
本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066


本書為大專院校的教科書籍而作,可以用於USB的通識教學,更適用於USB裝
置的韌體設計之課程,尤其適用於進階微控器技術或是進階電腦介面技術的課程。

本書分為二部分,第一部分介紹USB 2.0規範書,第二部分則引導讀者設計製
作USB裝置中最普遍的HID裝置。USB 2.0規範書中有關裝置的規範幾乎全部被本
書涵蓋,另外觸及HID 1.1規範書和HID用途表文件HUT 1.12。這些資料的整理與
介紹都著眼於裝置韌體上的應用;當然提供許多練習是教科書的必要條件。許多
微控器高手遇到USB裝置的韌體設計都會心寒三分,尤其以程式龐大和除錯艱難
最讓人卻步。本書提出一套系統化的設計流程,讓整個USB裝置設計與製作成為
反掌之易,這點已經在近期的數次USB技術培訓班獲得驗證。所以強調系統化設
計是本書的創舉和特色,希望為國家培植大量的USB裝置設計人才。

本書可以當作一學期的USB的通識教學材料,以教導前三章為主,和展示第
十章的雙工通信裝置作結。當然,一學期的USB裝置設計課程或是進階微控器與
電腦介面課程是最適用的,第7至10章提供四種實用裝置的自行設計練習,大量範
例和誘導式的實作練習應該是實作的好教材。如果時數不足,可以忽略第2.4至2.7
節,第三章全章,和第5.4和5.5節。第三章的內容只會被第八章和第十章的實作練
習使用到,必要時教師作補充說明即可。本書內容曾用於30小時的密集培訓班課
程,教材採用第一章,第2.1∼2.3節,第四章,第5.1∼5.4節,第六章,第七章,
最後加上展示第十章的雙工通信裝置。如果課程希望增加專題製作,第十章是必
要教材,可以由第10.9節衍生出一些專題題目。雖然本書的第二部分必須使用單一
種USB微控器來介紹系統化的設計技術(即松翰公司的SN8P系列),但是這不限
制本書的內容不適用於其他廠牌的USB微控器之教學。只要不是老舊8051架構的
USB微控器都能直接應用本書的內容,附錄A介紹Cypress公司的USB微控器就是
一個明證。本書另外備有適用松翰SN8P微控器和Cypress M8C微控器的二種實驗
板,相關販售商資訊可以在作者網頁取得。

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 001


或來電(02)2705-5066
作者試圖將USB裝置設計技術分級,本書內容可以達到第三級。

第五級:USB 2.0規範書與HID報告描述元(第一和二章)
第四級:USB裝置韌體編撰能力(第六至九章)
第三級:HID裝置獨立設計與製作(第三章和第十章)
第二級:巨量型或同時型傳輸任一種裝置韌體設計
第一級:巨量型和同時型傳輸二種裝置韌體設計

受限於書籍市場規模,在台灣出一本優良的專業書籍之經濟誘因非常低。
所幸,承蒙松翰科技股份有限公司給予本書撰寫的計畫案,經過一年餘終於問
世。感謝我的碩士生魏愷小姐的幫忙,製作第十章的視窗式應用程式。過去三年
來連續不斷的開了15次給業界的USB培訓班,其中不得不佩服和感謝林町達先生
的招生能力。最興奮的莫過得知,學員學成不久就幫公司開出產品,例如精博、
美亞、太瀚等。培訓班學員的鞭策與鼓勵,讓我不斷的改進教材,形成本書的雛
型。另一方面,由於對未學好的學員之愧疚,讓我思索到增加實作份量和設計適
切的實作題目,一次又一次的驗證成效,才加入本書成為教材。學員中王百川先
生和葉秋城先生如影隨形,一再參加我不同內容的USB培訓班,最讓我動容。尤
其王先生還幫忙比較其他教師的USB培訓班,提供我改進意見。另一學員陳德宗
好學不倦,四處學習使用各種USB微控器,將我的教材發揮得淋漓盡緻。另外,
也要謝謝聯發科學員黃怡菁小姐,她因工作關係,不斷以電子郵件詢問一些有關
雙工通信裝置的設計困惑,在不勝其擾和她的認真好學精神下,促成我撰寫第十
章的念頭,內容當然要解決實際雙工通信介面的所有實際應用,才能減少日後的
電子郵件。每位作者都希望他的書籍能夠成為名山大業,這還需要讀者惠賜寶貴
的回饋意見。

林錫寬
2007年8月

002 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
目錄

目 錄
第一部分 → 此部分的三章都有章後選擇式的問題

第一章 → USB2.0描述元 003
1.1 →基本知識 004
1.2 →描述元架構 007
1.3 →標準描述元 012
1.4 →HID類別特定描述元 036
1.5 →HID用途表格 074
1.6 →工具:USBComp 095
1.7 →大量儲存類別規範 099
第二章 →USB2.0通信協定 117
2.1 →概 述 118
2.2 →封 包 124
2.3 →交 易 130
2.4 →傳 輸 139
2.5 →咨求函數 169
2.6 →USB匯流排列舉 189
2.7 →大量儲存類別的特定咨求 199
第三章 →主機端應用程式 203
3.1 →前 言 204
3.2 →實作見習:範例HidDevice.cpp 206

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
3.3 →主程式 216
3.4 →讀寫動作 221
3.5 →介面尋找與取得 226
3.6 →取得介面的操作把 240
3.7 →實作練習 249
3.8 →進階學習 262

第二部分
第四章 →SN8P組合語言 271
4.1 →組合語言語法 272
4.2 →基本運算程式 289
4.3 →中 斷 310
4.4 →輸出入暫存器 320
4.5 →韌體發展系統 326
4.6 →指令集 333
第五章 →USB韌體模組 335
5.1 →韌體架構 336
5.2 →USB韌體模組構想 338
5.3 →實際體驗 345
5.4 →USB韌體模組實現 350
5.5 →咨求函數副程式 389
第六章 →HID裝置 417
6.1 →電腦鍵盤 418
6.2 →多媒體鍵盤 433

002 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
目錄

6.3 →初始化程式 445
6.4 →主程式迴路 451
6.5 →懸置副程式 468
6.6 →中斷型輸入之程式模組 474
6.7 →實作練習 491
第七章 →設計練習:電腦滑鼠 499
7.1 →USB滑鼠的硬體 500
7.2 →系統化的韌體設計 508
7.3 →描述元 509
7.4 →USB韌體模組參數設定 517
7.5 →主程式檔mouse_main.asm 517
7.6 →滑鼠週邊功能檔mouse_task.asm 523
7.7 →測 試 531
第八章 →設計練習:消費者用途按鍵 535
8.1 →硬 體 536
8.2 →系統化的韌體設計 536
8.3 →描述元 538
8.4 →USB韌體模組參數設定 541
8.5 →主程式檔consumer_main.asm 542
8.6 →週邊功能檔consumer_task.asm 546
8.7 →測 試 549
第九章 →設計練習:鍵盤與滑鼠複合的裝置 557
9.1 →鍵盤與滑鼠複合裝置的硬體 558
9.2 →系統化的韌體設計 564

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 003


或來電(02)2705-5066
9.3 →描述元 565
9.4 →USB韌體模組參數設定 569
9.5 →主程式檔kybd_mouse_main.asm 570
9.6 →滑鼠週邊功能檔mouse_task.asm 572
9.7 →測 試 573
第十章 →設計練習:雙工通信的USB裝置 577
10.1 →雙工通信裝置的規格 578
10.2 →主機端應用程式 583
10.3 →系統化的韌體設計 588
10.4 →描述元 589
10.5 →USB韌體模組參數設定 594
10.6 →主程式檔duplex_main.asm 597
10.7 →週邊功能檔keys_matrix_task.asm 609
10.8 →測試 615
10.9 →專題實作 622

附錄
Cypress EnCoRe II晶片之比較 627
A.1 →M8C組合語言語法 628
A.2 →多媒體鍵盤 650
A.3 →指令集 686
習題解答 688

004 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一部分
第一章 USB2.0描述元
第二章 USB2.0通信協定
第三章 主機端應用程式

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章
USB2.0描述元

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
1.1 基本知識

通用串列匯流排 (universal serial bus) USB是同步式串列通信介面的一種,


所以通信對象一方為主機,另外一方為僕機。USB規定只有一台主機 (host),
通常為個人電腦,但是可以有許多僕機,稱作USB裝置 (USB device)。一個
USB裝置連接於一個USB接頭 (port),但是實際通信的單位卻是介面,也就是
一個裝置可以有數個介面,例如鍵盤與滑鼠複合裝置 (composite device) 有二
個介面:鍵盤和滑鼠。USB通訊都是低位元組的低位元先傳,所以編碼儲存方
式採用little endian格式,也就是低位元組儲存在記憶體低位址的位置。

USB通訊協定中,主機與裝置間一個完整有意義的數據之通訊過程稱作
傳輸 (transfer)。USB通訊架構屬於多工系統,主機與多個裝置作數據傳輸採
分段輪流的多工架構。傳輸必須分成數段,每一段要一次做完才將通訊權分給
另外一個裝置,這種段落稱作交易 (transaction)。因此傳輸是由一個或數個交
易組成,用以傳遞一筆有意義的數據。一個交易含有多個半雙工通訊(即雙向
通訊,但是每次僅能一方為發訊者,另一方為收訊者),這種通訊的最小單
元就稱作封包 (packet)。例如,主機要讀取裝置的描述元,就先發送要執行讀
取的交易(一種SETUP交易),交易中第一個封包為SETUP封包(標示這是
SETUP交易),第二個才是命令數據性封包,第三個是裝置回給主機的確認
收到之承領封包;接著主機會再要求作數個輸入交易,請裝置將描述元資料傳
給主機,當然輸入交易也有三個不同的封包;傳輸的最後一個交易為交握交
易,用以確認傳輸的成功。

USB2.0規範書中規定低速和全速的匯流排速度是以1 ms產生一個USB訊
框 (frame),而高速匯流排則125 µs產生一個USB微訊框 (micro-frame)。一個
USB訊框會塞入數個交易,二個連續的交易可能會隸屬於不同的傳輸,不同的
傳輸也可能針對不同的裝置。交易和封包將在第二章作詳細的介紹。

004 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

傳輸方式有四種:控制型傳輸 (control transfer),中斷型傳輸 (interrupt


transfer),巨量型傳輸 (bulk transfer),同時型傳輸 (isochronous transfer)。由
於低速裝置只能擁有前二種傳輸,所以初學者只要精通控制型傳輸和中斷型傳
輸即可。各種傳輸之簡介如下:

主要用於訊息型數據 (message-type data),例如:組態、命令


控制型傳輸:
和狀態的通信,有需求時才執行的一種傳輸。裝置插入主機
後所作的匯流排列舉都是使用控制型傳輸。

適用於低頻率的流動型數據 (stream-type data),目的在對不時


中斷型傳輸:
更新的數據 (recurring data) 作傳輸。精確一點而言,即是在
每個有限的週期內 (bounded period) 作一次的小量數據發送或
接收。這段間隔時間內,數據可能更換了數次,也可能沒更
換,但是都只發送一次。

主要用於不定時的大量數據 (large-packet data),這種傳輸是使


巨量型傳輸:
用匯流排的空閒時段,傳輸無急迫性,可以等待。例如,檔
案的傳輸。

主要用於與時間緊密相關 (time-relevant) 的週期性、持續性流


同時型傳輸:
動型數據。這種傳輸沒有交握機制,一筆傳輸失敗時不重傳,
下一筆改傳最新的當時刻數據,所以數據流失無所謂(或不
重要),但是要保證收到的數據是當時刻的新數據。例如:
視訊和音訊,傳輸失敗就停格;如果要求每筆傳輸都正確無
誤,反而會造成失真。

主機和裝置的架構都分成三層如圖1.1(a)所示。主機和裝置的最低層各有一

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 005


或來電(02)2705-5066
個串列介面引擎 (SIE, serial interface engine),本書皆稱其為USB引擎以避免和
一般串列傳輸引擎混淆(例如:SPI和I2C引擎);它們經由USB纜線互通。主
機的SIE包含於主機控制器 (host controller) 內,使用作業系統內的主機控制器
驅動程式 (host controller driver) 和USB系統軟體 (USB system SW) 連接,然
後再透過USB裝置驅動程式和客戶軟體(或稱應用程式)連接。USB裝置驅動
程式主要在提供便利的函式給應用程式來操作USB裝置。裝置的SIE會將收送
的數據存於或取於端點的記憶體緩衝區 (endpoint buffers),還有USB通信狀態
是用USB暫存器當作SIE和韌體間的溝通橋樑。對於USB韌體工程師,只要專
注於裝置的韌體部分和主機的應用程式,所以也可以視為USB傳輸是直接在這
二者間進行,忽略其他二層的存在。

為了主機與裝置第二層間的關係之邏輯描述而定義管線 (pipe) 。一條


管線 是裝置的一個端點與主機的 USB 軟體使用的記憶體緩衝區之 邏輯結
合 (logical association) ,如圖 1.1(b) 所示。 端點 (endpoint) 實體上也是裝
置的記憶體緩衝區分配給 SIE 作數據收發的暫存區。當裝置插入主機,作
完匯流排列舉後, USB 軟體會分配一塊記憶體區來對應裝置的個別端點,

主機 USB裝置 主機應用程式
Client SW 記憶體緩衝區
韌體程式
(Application SW)
USB Driver
通信數據流
USB System SW 管線
端點 USB
Host Controller
緩衝區 暫存器
Driver
Host USB Bus 端點
SIE SIE
Controller USB纜線 Interface
USB裝置介面
(a) (b)

圖1.1 USB通信系統:(a)通信層;(b)數據流邏輯圖

006 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

讓後續的通信數據流如同在一個邏輯管線間進行,不會流到不對應的記憶
體緩衝區。管線依傳輸種類分類,控制型管線 (control pipe) 用來作控制型
傳輸,而中斷型管線 (interrupt pipe)、巨量型管線 (bulk pipe)、同時型管線
(isochronous pipe) 分別作中斷型傳輸、巨量型傳輸、和同時型傳輸。控制型
管線 可以作輸出和輸入 雙向 的傳輸,但是 其他型管線 只能作 單向 的傳輸。例
如,中斷型管線又分中斷型輸入管線 (interrupt IN pipe) 和中斷型輸出管線
(interrupt OUT pipe)。在USB規範中所謂輸出入都是以主機為觀點,所以USB
裝置的輸入端點是要將數據輸入給主機。低速USB裝置只能作控制型傳輸和中
斷型傳輸,一般都擁有三個端點,端點0連接於一條控制型管線,所以又稱作
控制型端點﹔而端點1和2可以設定為連接於一條中斷型輸入或輸出管線,所以
稱作中斷型輸入端點或中斷型輸出端點。注意,任何USB裝置都必須具備一個
稱為「內定控制型端點」,而且其編號必須為端點0,這個端點內定要作匯流排
列舉。

USB2.0規範書定義一條管線只有一個端點,但是沒有明說一個端點只能
用於一條管線,也沒禁止一個端點用於數條管線。市面上某些USB裝置,將
同一個端點同時用於輸入管線和輸出管線,只要數據傳輸採用半雙工模式(雙向
通信,但是每次僅能一方為發訊者,另一方為收訊者),都可以運作正常。不
過,還是建議盡量一個端點只用於一條管線。

1.2 描述元架構

任何 USB 裝置都需要向電腦主機通報它的屬性和運作 (attributes and


operations) 。 USB 的規範書制定了固定的通報格式,稱為 USB 描述元
(descriptors)。USB裝置的種類非常龐大,不是一個人或一個團隊所能完全精
通,也無必要完全精通﹔只要能理解自己有興趣的裝置類別的描述元定義,
且能應用自如即可。人性化介面裝置 (HID, human interface device) 為USB裝

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 007


或來電(02)2705-5066
置類別 (device classes) 中最普遍也最容易學的。人性化介面裝置涵蓋所有被人
們用來操作電腦系統的裝置。典型的HID裝置有鍵盤,滑鼠,軌跡球,搖桿,
機具用的控制面板,遊戲機的方向盤、踏板、和排檔等,以及其他如簡易數
據傳輸像讀條碼機、溫度計、電氣量計等。本章主要介紹HID裝置和它的描述
元。第1.7節會附帶介紹大量儲存類別。

依據USB規範書,描述元分二部分:標準描述元 (standard descriptors) 和


類別特定描述元 (class-specific descriptors)。這裡以介紹HID類別為主。

一個裝置的描述元架構是以裝置描述元 (device) 啟始。一個裝置(一個


USB接頭連接的裝置)僅能有一個裝置描述元,裝置描述元中會交代組態描述
元 (configuration) 的個數和字串 (string) 描述元的索引。組態描述元至少要有
一個,然而字串描述元是可有可無。圖1.2說明USB描述元的架構。USB裝置

標準描述元

裝置描述元 裝置資格者描述元 字串描述元

組態描述元 其他速度組態描述元

介面描述元 介面描述元

類別描述元 類別描述元

端點描述元 端點描述元 報告描述元 實體描述元

圖1.2 描述元架構圖

008 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

實際運作是以介面 (interface) 為單位,裝置的組態就是在描述介面的個數和


運作方式。所以組態資料集合 (configuration information set) 涵蓋本身組態描
述元外,另外包含介面描述元 (interface)、類別描述元 (class)、和端點描述元
(endpoint)。因為USB裝置需要將這四種描述元當作完整的組態資料一起傳給
主機,所以裝置的韌體需要將這四種描述元依序排列在一起。類別描述元會宣
告是否有額外的類別特定描述元。以HID類別而言,類別描述元會進一步交代
報告 (report) 描述元和實體 (physical) 描述元的個數和長度,其中實體描述元
是可有可無。以上是USB1.1規範書中規定的描述元。

USB2.0規範書另外多出二個描述元:裝置資格者描述元 (device qualifier)


和其他速度組態描述元 (other speed configuration)。低速和全速的裝置不得使
用這二個描述元。高速的裝置也只有在支援全速運作時才需要用到這二個描述
元。

這些描述元中,裝置描述元、組態描述元、介面描述元、端點描述元、字
串描述元、和USB2.0規範書增加的裝置資格者描述元與其他速度組態描述元
都屬於標準描述元部份。而其他如HID類別描述元、報告描述元、和實體描述
元則屬於HID的類別特定描述元部份。標準描述元的格式在Universal Serial Bus
Specification文件(本書光碟片中usb_20.pdf檔)的第九章中定義,而HID類別
特定描述元的格式定義則在Device Class Definition for Human Interface Device文件
(本書光碟片中HID1_11.pdf檔)。有關USB的文件都可以在USB組織的網站
中下載,網址為www.usb.org。HID的資料在www.usb.org/developers/hidpage。

每個描述元都分為數個欄位 (fields),一個欄位的長度可以是一個位元組
至數個位元組。欄位的數據型態 (data type) 由欄位名稱最前頭的前置字母來表
示,例如bLength的數據型態為位元組 (byte)。USB用到的數據型態前置字母如
表1.1所列。

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 009


或來電(02)2705-5066
表1.1 數據型態的前置字母

b bcd bm d i id w
位元組 位元碼數字 位元圖 雙字組 索引 識別碼 字組
(byte) (binary-coded (bitmap) (double (index) (ID) (word)
decimal) word)

任何描述元的格式最前二個位元組分別為描述元長度 (bLength) 和描述元


型別 (bDescriptorType)。如果描述元長度之值比規範書規定的小時,則整個描
述元將被主機視為無效描述元﹔若是大於規定,主機仍會接收所宣告長度的所
有數據,不過多於規定的後面位元組將被忽視不儲存。表1.2列出描述元型別
的代碼與長度。

表1.2 描述元型別的代碼與長度

裝置 其他速度
裝置 組態 字串 介面 端點 HID類別 報告 實體
資格者 組態
代碼 01h 02h 03h 04h 05h 06h 07h 21h 22h 23h
長度 12h 09h 不定 09h 07h 0Ah 09h 不定 不定 不定

在裝置描述元中需要宣告裝置的類別於欄位bDeviceClass,表1.3列出USB
規範書中目前所制定的類別。如果類別碼(bDeviceClass)為00h,則該裝置的類
別由介面描述元宣告,也就是該裝置屬於介面裝置,可能一個裝置有不同類別
的數個介面。HID裝置屬於介面裝置,所以它的bDeviceClass = 00h。已經制定
的介面類別碼則列於表1.4,bInterfaceClass為介面描述元中的一個欄位。第1.7
節要介紹的大量儲存類別,就是介面類別為Mass Storage。

010 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

表1.3 裝置類別碼

裝置類別 bDeviceClass
介面描述元來宣告 00h bDeviceSubClas=0
bDeviceProtocol=0
通信裝置 02h bDeviceSubClas=0
bDeviceProtocol=0
集線器(HUB) 09h bDeviceSubClas=0
bDeviceProtocol=0
錯誤診斷裝置 DCh bDeviceSubClas=1表可程式者
bDeviceProtocol=1表USB1.0相容
無線傳輸控制裝置 E0h bDeviceSubClas=1 表RF 控制器
bDeviceProtocol=1表藍芽
廠商自訂 FFh

表1.4 介面類別碼

介面類別 bInterfaceClass
Audio 01h
CDC Control 02h
HID 03h
Physical 05h
Image 06h
Printer 07h
Mass Storage 08h
HUB 09h
CDC-Data 0Ah
Chip/Smart Card 0Bh
Content Security 0Dh
Diagnostic Device DCh
Wireless Controller E0h
Application Specific FEh
Vendor-Specific FFh

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 011


或來電(02)2705-5066
1.3 標準描述元

1.3.1 裝置描述元
表1.5是裝置描述元的格式。裝置描述元的長度固定為18個位元組,型別
代碼為1。第三欄位的USB版本,必須以BCD方式表示,即一個位元組中最高
四位元和最低四位元的值僅能是0~9,此欄佔用二個位元組,最低的位元組為
次版本號碼,例如0110h為1.1版。裝置類別、次類別、和協定碼這三欄的值完
全由USB規範書指定,如表1.3所示。如果裝置類別欄設為0,則其類別將在介
面描述元中指定,如此可以讓每個介面定義成不同的類別,否則介面的類別統
一由裝置描述元指定。HID類別有自己的類別特定的描述元,因而允許一個
USB裝置中的某個介面定義為HID介面,而其他介面可以是別的類別,所以
HID裝置一律由介面描述元來宣告類別。注意,如果欄位bcdUSB填0200h,則
要多考慮裝置資格者描述元與其他速度組態描述元;高速裝置只能填0200h,
而全速或低速裝置可以填0110h或0200h。全速或低速裝置就算使用USB2.0版
本,也要將裝置資格者描述元與其他速度組態描述元留空白,但是在主機來咨
求這二個描述元時,要回以咨求失效。

表1.5 裝置描述元

長 度 範例值
欄位名 位 差 名 稱
(Bytes) (說明)
bLength 0 1 描述元長度 12h (固定值)
bDescriptorType 1 1 描述元型別 01h (固定值)
bcdUSB 2 2 USB版本 0110h (1.1版)
bDeviceClass 4 1 裝置類別 00h (HID之值)
bDeviceSubClass 5 1 裝置次類別 00h (HID之值)
bDeviceProtocol 6 1 裝置協定碼 00h (HID之值)
bMaxPacketSize 7 1 最大封包尺寸 08h

012 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

長 度 範例值
欄位名 位 差 名 稱
(Bytes) (說明)
idVendor 8 2 製造商識別碼 FFFFh(自訂)
idProduct 10 2 產品識別碼 0001h
bcdDevice 12 2 裝置版本 0100h (1.00版)
iManufacturer 14 1 製造商名稱索 04h
引 (字串描述元之第5位元組)
iProduct 15 1 產品名稱索引 0Eh
(字串描述元之第15位元組)
iSerialNumber 16 1 產品序號索引 30h
(字串描述元之第49位元組)
bNumConfigurations 17 1 組態個數 01h (1個組態)

裝置描述元中的最大封包尺寸欄僅用於描述裝置的內定控制管線,在這管
線上的裝置端點通稱為端點0 (endpoint 0)。至於其他的管線上的端點要用端點
描述元來交代屬性。最大封包尺寸的值對於全速裝置可以為8,16,32,或 64;
但是高速裝置的必須是64,也就是要有64個位元組的端點緩衝區;而低速裝置
的必須是8。表1.5的範例中,端點0的最大封包尺寸為8個位元組,也就是裝置
的端點0擁有8個位元組的緩衝記憶體來儲存要發送或接收到的數據。

製造商的識別碼必須向USB協會申請,否則自訂的會和其他廠商重複,但
是不影響裝置的使用。產品識別碼和裝置版本則由製造商自行設定。如果未具
有USB協會授與的製造商的識別碼,則需要使用FFFFh。

製造商名稱、產品名稱、產品序號是以字串方式來通知主機,在裝置描述
元中僅將該名稱在字串描述元中的位差以索引值方式列出,稱作位差索引宣告
法。若是索引值為0表示不提供該項名稱。表1.5範例中,製造商名稱的字串從
字串描述元第5+2位元組開始(前二個位元組分別為該字串的描述元長度和描
述元型別,請看字串描述元之第1.3節),產品名稱從第15+2位元組開始,產

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 013


或來電(02)2705-5066
品序號從第49+2位元組開始。市面產品常省略產品序號,因為一件產品一個序
號,每燒錄一件就要改一個序號在製造上比較麻煩;如果每件產品的序號都相
同就失去序號的意義。如果字串的位差索引值超出255,則可以用另外一種順
序索引宣告法,也就是1表示第一個字串,2表示第2個字串,以此類推;但是韌
體程式要作一個對應表,對應到字串描述元中的位差。

裝置描述元最後一個欄位為 組態的個數 。絕大多數的裝置都只有一個組


態。J. Hyde的「USB Design by Example」 (1999, John Wiley & Sons) 第一版書
中第148至150頁有一個使用二個組態的範例(第二版卻刪除此範例),主機一
開始使用編號1的組態,爾後再由應用程式來切換使用第二個組態,有興趣的
讀者可以自行參考。

1.3.2 字串描述元
表 1.6 是字串描述元的格式。字串描述元由許多小描述元組成,每個小
描述元仍以該小描述元長度和描述元型別起始,當然描述元型別皆為 3 。索
引位差為 0 之子描述元為 啟始子描述元 ,用於紀錄所使用到的語言之識別碼
(LANGID, language ID),它以陣列方式表示:wLANGID[0], wLANGID[1],
..., wLANGID[n],其中n+1為使用到的語言個數。其他子描述元才是真正字
串描述元。關於語言識別碼可以參考文件Language Identifiers(本書光碟片中
USB_LANGIDs.pdf檔)。下面列出英文和中文的所有次語言,僅供參考:

英 文 中 文

次語言 LANGID 次語言 LANGID 次語言 LANGID


美國 0409h 牙買加 2009h 繁體(台灣) 0404h
英國 0809h 加勒比 2409h 簡體(中國) 0804h
澳大利亞 0c09h 貝里斯 2809h 香港 0c04h
加拿大 1009h 千里達 2c09h 新加坡 1004h

014 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

英 文 中 文

次語言 LANGID 次語言 LANGID 次語言 LANGID


紐西蘭 1409h 辛巴威 3009h 澳門 1404h
愛爾蘭 1809h 菲律賓 3409h
南非 1c09h

在其他子描述元中,字串直接在描述元長度和描述元型別之後,字串
必須以 Unicode UTF-16LE的編碼方式來紀錄。 Unicode碼有三種: UTF-8 ,
UTF-16,和UTF-32分別用8位元、16位元、和32位元來表示符號。UTF32將
所有符號都用四個位元組表示;而UTF16將常用的符號用二個位元組表示,
對罕用的符號則用雙16位元表示。USB規範書要求使用UTF-16格式,而且
儲存方式為little endian,即低位元組儲存於記憶位址低的空間。英文字母的
UTF-16碼正好是ASCII碼再加上一個空白位元組,即0000h~007Fh對應到
ASCII的00h~7Fh。許多USB晶片的組譯器會將英文字母轉成UTF-16碼。關
於Unicode碼,可以到網站www.unicode.org中點選[code charts]取得資料,例
如,英文為Basic Latin,而中文為CJK Unified Ideographs,中文注音符號為
Bopomofo。如果裝置使用中文的產品名稱,建議多加wLangID[1] = 0404h
(微軟的作業系統會自動辨識所用到的語言,所以可以省略此宣告);此外中
文的UTF-16碼需要自己查unicode-cjk.pdf來輸入對應碼,例如「滑鼠」的碼為
6ED1h和9F20h。

注意,在表1.6的範例中,位差4為紀錄製造商名稱的子描述元起始位置,
其正是在裝置描述元中宣告的製造商名稱之索引值。同理,位差14和位差48分
別為所宣告的產品名稱和產品序號之索引值。

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 015


或來電(02)2705-5066
表1.6 字串描述元

長度 範例值
欄位名 位 差 名 稱
(Bytes) (說明)
bLength 0 1 語言陣列長度 04h
bDescriptorType 1 1 描述元型別 03h (固定值)
wLANGID[0] 2 2 語言識別碼陣列 0409h (英文)
… 4 … (其他使用的語言)
bLength 4 1 製造商名稱長度 0Ah
bDescriptorType 5 1 描述元型別 03h (固定值)
bString 6 8 製造商名稱 “ACME”
bLength 14 1 產品名稱長度 22h
bDescriptorType 15 1 描述元型別 03h (固定值)
bString 16 32 產品名稱 “Locator Keyboard”
bLength 48 1 產品序號長度 0Eh
bDescriptorType 19 1 描述元型別 03h (固定值)
bString 50 12 產品序號 “000000ABC123”

別的文件(不是USB2.0規範書)有提到產品序號字串只能使用BCD格式
的符號,即數字0~9和字母A~F;而且至少12個符號,以便主機據此產生一個
含idVender,idProduct,和這個字串的全域獨一識別碼(GUID, globally unique
identifier)。同樣產品的每個裝置之產品序號字串要不一樣,以方便主機識別
(請參考第1.7節)。

1.3.3 組態描述元
一個USB裝置的功能被使用之前,裝置要先被組織好(be configured)﹔正
確的說,應該是設定好組態。所謂組態就是一個或以上介面合成一個硬體裝置
的組織;而介面就是特定數據通信的單體,由端點來組成。主機會先向USB裝
置取得組態資料,然後下咨求函數(「咨求」之意為來函要求處理,請參考第
二章之定義)來設定組態(set configuration),也就是選擇一個組態描述元來組

016 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

織運作的硬體裝置。

每個USB裝置至少要有一個組態。無論USB裝置只有一個或超過一個以上
的組態,都需要用設定組態的咨求函數來選擇組態編號,如此才完成組態設定
(configured)。因此,可以將數種不同用途的韌體寫於一個USB裝置內,主機
可以利用不同的驅動程式來選用不一樣的組態,如此就可以達到一種USB裝置
晶片可以作不同用途的USB裝置。這個目的是要藉大量來達到生產晶片的經濟
規模。儘管如此,目前市面上還都是一個裝置只有一個組態。組態的下屬成員
是介面和端點,必要時再外加上類別資料。

每個組態可以擁有一個或以上的介面,而每個介面可以擁有一個或以上的
端點。介面其實是一組具有單一特性與功能的端點的集合。請特別注意,同一
個介面允許有不同的設定,稱作替換設定(alternate setting),其目的是要在其他
介面仍正常運作下允許改變一個介面的部分功能。驅動程式可以利用設定介面
的咨求函數來選擇介面的替換設定。

主機是利用讀取描述元的咨求函數來取得描述元資料。依據USB規範書,
當咨求函數要讀取組態描述元時,裝置必須將完整的組態資料集合(組態描述
元、介面描述元、類別描述元、和端點描述元的資料)都回傳給主機。因此這
些描述元的排列有一定的順序。

範例說明:
假設有一個組態擁有二個HID介面,而每一個介面都有二個端點,其中第一個
介面(介面編號InterfaceNumber = 00h)有二個替換設定(AlternateSetting
= 00h和AlternateSetting = 01h)。描述元的排列順序必須如下所示,其中每
個介面所屬的二個端點之先後順序不重要:

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 017


或來電(02)2705-5066
; Configuration Descriptor
; Interface 0 Descriptor (Alternate Setting 0)
; HID Class Descriptor 0.0
; Endpoint Descriptor
; Endpoint Descriptor
; Interface 0 Descriptor (Alternate Setting 1)
; HID Class Descriptor 0.1
; Endpoint Descriptor
; Endpoint Descriptor
; Interface 1 Descriptor
; HID Class Descriptor 1
; Endpoint Descriptor
; Endpoint Descriptor

表1.7是組態描述元的格式。第三欄位紀錄組態資料集合總長,其含括該組
態轄下的所有介面描述元、類別描述元、端點描述元的長度﹔以表1.7中的範
例,總長為59 = 9 + (9 + 9 + 7) + (9 + 9 + 7),後二個括號內數值分別為二個介
面和其類別與端點之描述元長。第一個介面為鍵盤,第二個為滑鼠,所以這個
組態有二個介面,第四欄位的介面個數就須填02h。第五欄位為組態編號,必
需為正整數,例如01h,02h等﹔主機設定組態時,即依據這個編號來選擇要使
用的組態。第六欄位為組態名稱索引,如同裝置描述元中的製造商名稱索引,
用來宣告該名稱在字串描述元中的位差。

018 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
第一章|USB2.0描述元

表1.7 組態描述元

長 度 範例值
欄位名 位 差 名 稱
(Bytes) (說明)
bLength 0 1 描述元長度 09h (固定值)
bDescriptorType 1 1 描述元型別 02h (固定值)
bTotalLength 2 2 組態資料集合總長 003bh (59位元組)
bNumInterfaces 4 1 介面個數 02h (2個介面)
bConfigurationValue 5 1 組態編號 01h (no.=1)
iConfiguration 6 1 組態名稱索引 00h (無名稱)
bmAttributes 7 1 組態屬性 10100000b
bMaxPower 8 1 最大消耗電流 32h (=100mA)
(單位2mA)

第七欄位的組態屬性是以位元圖型態表示:

D7 D6 D5 D4 D3 D2 D1 D0
bmAttributes
1 自供電源 遠端喚醒 0 0 0 0 0

除了位元D5和D6外,其餘位元皆為固定值。D6 = 1表示裝置具備自供電源,
此時仍可同時使用匯流排提供的電源。D6 = 0則不具備自供電源,完全由匯流
排提供的電源。D5 = 1為支援遠端喚醒功能,D5 = 0則不支援此項功能。遠端
喚醒功能是裝置有權將休眠中的主機叫醒。具有遠端喚醒功能的裝置允許主機
來禁能和致能這項功能;但是自供電源不允許主機作切換,只能裝置自行作切
換。

第八欄位用於宣告匯流排提供的電源之最大功率,由於電壓為固定5 V,所
以功率就直接用電流量來表示,此處所用單位為2 mA,因此最大電流為255 ×
2 = 510 mA。一般裝置都建議使用100 mA或以下的匯流排電流,因為在匯流排

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw 019


或來電(02)2705-5066
列舉完成(或稱組態設成)前,USB匯流排只提供一個裝置最多100 mA(稱
作1 unit load)。一般USB集線器(hub)也僅提供一個裝置100 mA的正常運作
電流,除非標明為高功率集線器。

1.3.4 介面描述元
介面描述元主要提供該介面使用的端點個數 (bNumEndpoints) 和所屬的類
別 (bInterfaceClass)﹔另外為了不同設定的區別,要有介面編號和替換設定。介
面編號和替換設定的值都是從零起算:第一個介面為00h,第二個介面為01h﹔
每個介面中的第一個替換設定為00h,第二個為01h。第一個替換設定為裝置重
置後的內定設定。另外,可以賦予介面名稱,最後一個欄位以索引值來宣告該
名稱在字串描述元的位差。請參考表1.8。

端點個數為不含內定的控制型端點0的其他端點之數目,如果此介面僅使
用端點0,則此欄之值為0,後面也不需要端點描述元。端點0已經在裝置描述
元中描述了,它是公用的端點。

HID類別的碼為3。HID有一個次類別:0為無次類別,1為boot次類別。HID
有二種不同的協定:鍵盤(協定碼為1),滑鼠(協定碼為2)。介面協定是為了
支援boot介面,如果次類別不是boot,則介面協定碼需填為0。所謂boot介面的
裝置是這個介面在主機作業系統軟體未安裝前,可以由主機的韌體(例如BIOS)
來使用,當然boot介面的報告描述元要符合BIOS的要求,才能正常運作。第
1.4.9節會以電腦滑鼠與鍵盤為例來闡述boot介面協定與HID介面協定之區別。

USB2.0規範書的第5.7.3節規定,高速裝置中每個介面的內定設定(即替
換設定碼為0)所轄的中斷型端點單次交易傳輸量不可以大於64個位元組,所以
在該端點的端點描述元之最大封包尺寸值必須小於或等於64。其他的替換設定

020 USB2.0 與HID裝置之系統化設計|SN8P系列


本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066
USB2.0與HID裝置之系統化設計:SN8P系列/
林錫寬編著. --初版.--臺北市:五南,
2007.08
 面; 公分
ISBN 978-957-11-4898-4 (平裝)
1.電腦界面 2.電腦週邊設備
471.56 96016197

5D97

USB2.0與HID裝置之系統化
設計-SN8P系列
作  者 ─ 林錫寬(144.2)

發 行 人 ─ 楊榮川

總 編 輯 ─ 龐君豪

主  編 ─ 穆文娟

責任編輯 ─ 蔡曉雯

文字編輯 ─ 陳書彥

封面設計 ─ 簡愷立

出 版 者 ─ 五南圖書出版股份有限公司

地  址:106台 北 市 大 安 區 和 平 東 路 二 段 3 3 9 號 4 樓

電  話:(02)2705-5066  傳  真:(02)2706-6100

網  址:http://www.wunan.com.tw

電子郵件:wunan@wunan.com.tw

劃撥帳號:0 1 0 6 8 9 5 3

戶  名:五南圖書出版股份有限公司

台中市駐區辦公室/台中市中區中山路6號

電  話:(04)2223-0891  傳  真:(04)2223-3549

高雄市駐區辦公室/高雄市新興區中山一路290號

電  話:(07)2358-702   傳  真:(07)2350-236

法律顧問 得力商務律師事務所 張澤平律師

出版日期 2 0 0 7 年 9 月 初 版 一 刷

定  價 新 臺 幣 7 8 0 元

※版權所有.欲利用本書內容,必須徵求本公司同意※

本試閱檔為五南所有。如欲購買此書,請至五南網站 www.wunan.com.tw
或來電(02)2705-5066

You might also like