USB設(shè)備驅(qū)動(dòng)開發(fā)-USB協(xié)議相關(guān)(1)
USB設(shè)備模型從物理上分為兩個(gè)部分:主機(jī)(host)控制端作為主機(jī)端,驅(qū)動(dòng)的設(shè)備是USB Host Controller;外設(shè)端被稱為設(shè)備端,驅(qū)動(dòng)的設(shè)備是USB Device Controller。因此,USB設(shè)備驅(qū)動(dòng)應(yīng)該分為主機(jī)端驅(qū)動(dòng)和設(shè)備端驅(qū)動(dòng)兩部分,只是由于USB協(xié)議的主從定位思想,從設(shè)備只需要響應(yīng)主機(jī)控制器的請求,不能主動(dòng)發(fā)起請求,通常所說的USB驅(qū)動(dòng)都是指主機(jī)端的驅(qū)動(dòng)程序。但近年來隨著嵌入式設(shè)備的廣泛使用,運(yùn)行Linux系統(tǒng)嵌入式設(shè)備也需要通過USB協(xié)議與主機(jī)端通信,因此從設(shè)備端的Linux也需要進(jìn)行USB設(shè)備驅(qū)動(dòng)程序開發(fā),為了避免和主機(jī)端的USB設(shè)備驅(qū)動(dòng)開發(fā)混淆,就將運(yùn)行Linux的從設(shè)備驅(qū)動(dòng)開發(fā)成為USB gadget driver,進(jìn)入與device driver區(qū)分開。
本文引用地址:http://butianyuan.cn/article/201612/329082.htm二、與驅(qū)動(dòng)開發(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ī)范實(shí)現(xiàn)的通用接口。作為中間層,主要完成總線與設(shè)備上端點(diǎn)的通信,端點(diǎn)是數(shù)據(jù)最終的生產(chǎn)者和消費(fèi)者,一個(gè)設(shè)備可以有多個(gè)端點(diǎn)。因此,這一層其實(shí)就是總線和端點(diǎn)的路由。
usb function:USB功能層,調(diào)用下層的接口實(shí)現(xiàn)不同的功能,如USB鼠標(biāo)、USB鍵盤、USB話筒。通常的USB驅(qū)動(dòng)開發(fā)指的都是這層的工作。
2. USB設(shè)備的狀態(tài)和狀態(tài)機(jī)轉(zhuǎn)換
Attached:USB設(shè)備接入或拔出,USB協(xié)議規(guī)范只定義了USB設(shè)備接入時(shí)的狀態(tài);
Powered:USB設(shè)備的供電分為兩種,從USB總線取電的稱為總線供電,USB設(shè)備從外部取電的稱為自供電。即時(shí)是自供電設(shè)備在插入前已經(jīng)接通電源仍不能認(rèn)為其處于Powered狀態(tài),只有插入Attached加電后才處于Powered狀態(tài);
支持兩種供電模式的設(shè)備可以通過配置描述符來向主機(jī)報(bào)告它當(dāng)前的供電模式。
Default:當(dāng)設(shè)備處于Powered狀態(tài)后,仍不能相應(yīng)任何總線通信,只有設(shè)備手段總線的reset請求后,設(shè)備才能通過默認(rèn)地址進(jìn)行通信。設(shè)備被成功reset后,可以相應(yīng)配置描述符請求并返回相應(yīng)的信息;
Addess:在設(shè)備被reset后,每個(gè)USB設(shè)備將被分配一個(gè)獨(dú)一無二的地址,USB設(shè)備在其掛起期間仍擁有這個(gè)地址。不論USB被分配了獨(dú)一無二的地址或使用的默認(rèn)地址,都能通過默認(rèn)的通道(pipe,即每個(gè)設(shè)備的0號(hào)端點(diǎn))進(jìn)行通信;
Configured:在設(shè)備的功能被正常使用前,設(shè)備必須被配置。從設(shè)備端來講,配置就是正常處理一個(gè)帶有非0參數(shù)的SetConfiguration()請求。包括將每個(gè)端點(diǎn)的數(shù)據(jù)包默認(rèn)類型設(shè)為DATA0;
Suspended:電源管理相關(guān),在沒有總線傳輸?shù)囊欢螘r(shí)間后,USB設(shè)備將自動(dòng)進(jìn)入suspend狀態(tài)。在suspend狀態(tài),USB設(shè)備自身維護(hù)它分配的地址和配置。當(dāng)有一個(gè)總線激活信號(hào)后,設(shè)備從suspend狀態(tài)返回。USB設(shè)備也可以支持遠(yuǎn)程喚醒(Remote Wakeup)來喚醒處于suspend狀態(tài)的主機(jī)控制器,但需支持host可以使能或關(guān)閉這個(gè)功能。
3. 總線枚舉
當(dāng)一個(gè)USB設(shè)備接入或拔出時(shí),主機(jī)需要通過總線枚舉功能來管理設(shè)備的狀態(tài)。當(dāng)設(shè)備接入時(shí),將采取下面的措施:
1. 當(dāng)設(shè)備接入后,接入的HUB通過一個(gè)狀態(tài)改變通道通知主機(jī)這個(gè)事件,這時(shí)USB設(shè)備處于Powered狀態(tài)并且其連接的端口是disabled的;
2. 主機(jī)詢問HUB這次事件的類型等信息;
3. 當(dāng)主機(jī)了解這是個(gè)插入事件后,將enable設(shè)備接入的端口并等待100ms,讓設(shè)備的供電穩(wěn)定,然后向這個(gè)端口發(fā)出reset命令;
4. HUB執(zhí)行這次reset操作,USB設(shè)備將處于default狀態(tài),同時(shí)可以從Vbus獲取不超過100ma的電源。當(dāng)前設(shè)備的寄存器和狀態(tài)都被reset了,并且可以通過默認(rèn)地址進(jìn)行響應(yīng);
5. 主機(jī)將給USB設(shè)備分配一個(gè)獨(dú)一無二的地址,設(shè)備將進(jìn)入address狀態(tài);
6. 在USB設(shè)備獲取獨(dú)一無二的地址之間,通過默認(rèn)地址的默認(rèn)控制通道仍然可以訪問,host獲取設(shè)備描述符來決定默認(rèn)控制通道的最大數(shù)據(jù)載荷;
7. 主機(jī)將從設(shè)備獲取全部配置信息,從0到n-1的配置描述符,即設(shè)備所擁有的所有配置描述符;這將花費(fèi)幾毫秒;
8. 通過獲取的配置信息來決定設(shè)備將被如何使用,主機(jī)將分配各設(shè)備一個(gè)配置值,這時(shí)設(shè)備處于configured狀態(tài)同時(shí)所有的端點(diǎn)也就具有這個(gè)配置下的特性,USB設(shè)備也將獲取在其所指定的配置中的電流值。設(shè)備處于可用狀態(tài)了;
評(píng)論