新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > USB設(shè)備驅(qū)動開發(fā)-USB協(xié)議相關(guān)(1)

USB設(shè)備驅(qū)動開發(fā)-USB協(xié)議相關(guān)(1)

作者: 時間:2016-12-12 來源:網(wǎng)絡(luò) 收藏
一、USB設(shè)備模型

USB設(shè)備模型從物理上分為兩個部分:主機(host)控制端作為主機端,驅(qū)動的設(shè)備是USB Host Controller;外設(shè)端被稱為設(shè)備端,驅(qū)動的設(shè)備是USB Device Controller。因此,USB設(shè)備驅(qū)動應(yīng)該分為主機端驅(qū)動和設(shè)備端驅(qū)動兩部分,只是由于USB協(xié)議的主從定位思想,從設(shè)備只需要響應(yīng)主機控制器的請求,不能主動發(fā)起請求,通常所說的USB驅(qū)動都是指主機端的驅(qū)動程序。但近年來隨著嵌入式設(shè)備的廣泛使用,運行Linux系統(tǒng)嵌入式設(shè)備也需要通過USB協(xié)議與主機端通信,因此從設(shè)備端的Linux也需要進行USB設(shè)備驅(qū)動程序開發(fā),為了避免和主機端的USB設(shè)備驅(qū)動開發(fā)混淆,就將運行Linux的從設(shè)備驅(qū)動開發(fā)成為USB gadget driver,進入與device driver區(qū)分開。

本文引用地址:http://m.butianyuan.cn/article/201612/329082.htm

二、與驅(qū)動開發(fā)相關(guān)的USB協(xié)議規(guī)范

1. USB設(shè)備被分為三層:

usb host controller:最底層,也是總線接口層,負(fù)責(zé)傳輸和接收數(shù)據(jù)包;

usb core:USB核心層,Linux系統(tǒng)已經(jīng)根據(jù)USB協(xié)議規(guī)范實現(xiàn)的通用接口。作為中間層,主要完成總線與設(shè)備上端點的通信,端點是數(shù)據(jù)最終的生產(chǎn)者和消費者,一個設(shè)備可以有多個端點。因此,這一層其實就是總線和端點的路由。

usb function:USB功能層,調(diào)用下層的接口實現(xiàn)不同的功能,如USB鼠標(biāo)、USB鍵盤、USB話筒。通常的USB驅(qū)動開發(fā)指的都是這層的工作。

2. USB設(shè)備的狀態(tài)和狀態(tài)機轉(zhuǎn)換

Attached:USB設(shè)備接入或拔出,USB協(xié)議規(guī)范只定義了USB設(shè)備接入時的狀態(tài);

Powered:USB設(shè)備的供電分為兩種,從USB總線取電的稱為總線供電,USB設(shè)備從外部取電的稱為自供電。即時是自供電設(shè)備在插入前已經(jīng)接通電源仍不能認(rèn)為其處于Powered狀態(tài),只有插入Attached加電后才處于Powered狀態(tài);

支持兩種供電模式的設(shè)備可以通過配置描述符來向主機報告它當(dāng)前的供電模式。

Default:當(dāng)設(shè)備處于Powered狀態(tài)后,仍不能相應(yīng)任何總線通信,只有設(shè)備手段總線的reset請求后,設(shè)備才能通過默認(rèn)地址進行通信。設(shè)備被成功reset后,可以相應(yīng)配置描述符請求并返回相應(yīng)的信息;

Addess:在設(shè)備被reset后,每個USB設(shè)備將被分配一個獨一無二的地址,USB設(shè)備在其掛起期間仍擁有這個地址。不論USB被分配了獨一無二的地址或使用的默認(rèn)地址,都能通過默認(rèn)的通道(pipe,即每個設(shè)備的0號端點)進行通信;

Configured:在設(shè)備的功能被正常使用前,設(shè)備必須被配置。從設(shè)備端來講,配置就是正常處理一個帶有非0參數(shù)的SetConfiguration()請求。包括將每個端點的數(shù)據(jù)包默認(rèn)類型設(shè)為DATA0;

Suspended:電源管理相關(guān),在沒有總線傳輸?shù)囊欢螘r間后,USB設(shè)備將自動進入suspend狀態(tài)。在suspend狀態(tài),USB設(shè)備自身維護它分配的地址和配置。當(dāng)有一個總線激活信號后,設(shè)備從suspend狀態(tài)返回。USB設(shè)備也可以支持遠(yuǎn)程喚醒(Remote Wakeup)來喚醒處于suspend狀態(tài)的主機控制器,但需支持host可以使能或關(guān)閉這個功能。

3. 總線枚舉

當(dāng)一個USB設(shè)備接入或拔出時,主機需要通過總線枚舉功能來管理設(shè)備的狀態(tài)。當(dāng)設(shè)備接入時,將采取下面的措施:

1. 當(dāng)設(shè)備接入后,接入的HUB通過一個狀態(tài)改變通道通知主機這個事件,這時USB設(shè)備處于Powered狀態(tài)并且其連接的端口是disabled的;

2. 主機詢問HUB這次事件的類型等信息;

3. 當(dāng)主機了解這是個插入事件后,將enable設(shè)備接入的端口并等待100ms,讓設(shè)備的供電穩(wěn)定,然后向這個端口發(fā)出reset命令;

4. HUB執(zhí)行這次reset操作,USB設(shè)備將處于default狀態(tài),同時可以從Vbus獲取不超過100ma的電源。當(dāng)前設(shè)備的寄存器和狀態(tài)都被reset了,并且可以通過默認(rèn)地址進行響應(yīng);

5. 主機將給USB設(shè)備分配一個獨一無二的地址,設(shè)備將進入address狀態(tài);

6. 在USB設(shè)備獲取獨一無二的地址之間,通過默認(rèn)地址的默認(rèn)控制通道仍然可以訪問,host獲取設(shè)備描述符來決定默認(rèn)控制通道的最大數(shù)據(jù)載荷;

7. 主機將從設(shè)備獲取全部配置信息,從0到n-1的配置描述符,即設(shè)備所擁有的所有配置描述符;這將花費幾毫秒;

8. 通過獲取的配置信息來決定設(shè)備將被如何使用,主機將分配各設(shè)備一個配置值,這時設(shè)備處于configured狀態(tài)同時所有的端點也就具有這個配置下的特性,USB設(shè)備也將獲取在其所指定的配置中的電流值。設(shè)備處于可用狀態(tài)了;



評論


技術(shù)專區(qū)

關(guān)閉