Linux USB 驱动开发(一)—— USB设备基础概念【转】
本文轉(zhuǎn)載自:http://blog.csdn.net/zqixiao_09/article/details/50984074
? 在終端用戶看來(lái),USB設(shè)備為主機(jī)提供了多種多樣的附加功能,如文件傳輸,聲音播放等,但對(duì)USB主機(jī)來(lái)說(shuō),它與所有USB設(shè)備的接口都是一致的。一個(gè)USB設(shè)備由3個(gè)功能模塊組成:USB總線接口、USB邏輯設(shè)備和功能單元:
a -- 這里的USB總線接口指的是USB設(shè)備中的串行接口引擎(SIE);
b -- USB邏輯設(shè)備被USB系統(tǒng)軟件看作是一個(gè)端點(diǎn)的集合;
c --?功能單元被客戶軟件看作是一個(gè)接口的集合。SIE、端點(diǎn)和接口都是USB設(shè)備的組成單元;
?
? ? ? ? 為了更好地描述USB設(shè)備的特征,USB提出了設(shè)備架構(gòu)的概念。從這個(gè)角度來(lái)看,可以認(rèn)為USB設(shè)備是由一些配置、接口和端點(diǎn)組成,即一個(gè)USB設(shè)備可以含有一個(gè)或多個(gè)配置,在每個(gè)配置中可含有一個(gè)或多個(gè)接口,在每個(gè)接口中可含有若干個(gè)端點(diǎn)。其中,配置和接口是對(duì)USB設(shè)備功能的抽象,實(shí)際的數(shù)據(jù)傳輸由端點(diǎn)來(lái)完成。在使用USB設(shè)備前,必須指明其采用的配置和接口。這個(gè)步驟一般是在設(shè)備接入主機(jī)時(shí)設(shè)備進(jìn)行枚舉時(shí)完成的
這些單元之間的關(guān)系如下:
?
設(shè)備通常有一個(gè)或多個(gè)配置;
配置通常有一個(gè)或多個(gè)接口;
接口通常有一個(gè)或多個(gè)設(shè)置;
接口有零或多個(gè)端點(diǎn)。
?
? ? ? ?這樣的概念太抽象了,可以這樣看:有一個(gè)設(shè)備,如支持視頻和音頻的一個(gè)播放器。那么,對(duì)于上面提到的4個(gè)描述符,對(duì)它們?cè)O(shè)置的時(shí)候,它們分別對(duì)于哪一個(gè)描述符呢? ?
? ? ? 從我現(xiàn)在的理解來(lái)看,這樣一個(gè)設(shè)備對(duì)應(yīng)一個(gè)設(shè)備描述符,支持視頻的功能對(duì)應(yīng)一個(gè)接口描述符,支持音頻功能的對(duì)應(yīng)一個(gè)接口描述符。為了支持視頻,在下層有多個(gè)端口同時(shí)工作為提供視頻數(shù)據(jù)傳輸?shù)闹С?#xff0c;所以有多個(gè)端點(diǎn)描述符。
? ? ? USB設(shè)備使用各種描述符來(lái)說(shuō)明其設(shè)備架構(gòu),包括設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符和字符串描述符,他們通常被保存在USB設(shè)備的固件程序中。
1、設(shè)備描述符
? ? ? 設(shè)備代表一個(gè)USB設(shè)備,它由一個(gè)或多個(gè)配置組成。設(shè)備描述符用于說(shuō)明設(shè)備的總體信息,并指明其所含的配置的個(gè)數(shù)。一個(gè)USB設(shè)備只能有一個(gè)設(shè)備描述符。
[cpp]?view plaincopy?
?
?
2、配置描述符
? ? ? ?一個(gè)USB設(shè)備可以包含一個(gè)或多個(gè)配置,如USB設(shè)備的低功耗模式和高功耗模式可分別對(duì)應(yīng)一個(gè)配置。在使用USB設(shè)備前,必須為其選擇一個(gè)合適的配置。配置描述符用于說(shuō)明USB設(shè)備中各個(gè)配置的特性,如配置所含接口的個(gè)數(shù)等。USB設(shè)備的每一個(gè)配置都必須有一個(gè)配置描述符。
[cpp]?view plaincopy?
?
3、接口描述符
? ? ? 一個(gè)配置可以包含一個(gè)或多個(gè)接口,例如對(duì)一個(gè)光驅(qū)來(lái)說(shuō),當(dāng)用于文件傳輸時(shí),使用其大容量存儲(chǔ)接口;而當(dāng)用于播放CD時(shí),使用其音頻接口。接口是端點(diǎn)的集合,可以包含一個(gè)或多個(gè)可替換設(shè)置,用戶能夠在USB處于配置狀態(tài)時(shí)改變當(dāng)前接口所含的個(gè)數(shù)和特性。接口描述符用于說(shuō)明設(shè)備中各個(gè)接口的特性,如接口所屬的設(shè)備類(lèi)及其子類(lèi)等。USB設(shè)備的每個(gè)接口都必須有一個(gè)接口描述符
[cpp]?view plaincopy?
?
4、端點(diǎn)描述符
?
? ? ? 端點(diǎn)是USB設(shè)備中的實(shí)際物理單元,USB數(shù)據(jù)傳輸就是在主機(jī)和USB設(shè)備各個(gè)端點(diǎn)之間進(jìn)行的。端點(diǎn)一般由USB接口芯片提供,例如Freescale公司的MC68HC908JB8和MC9S12UF32。USB設(shè)備中的每一個(gè)端點(diǎn)都有唯一的端點(diǎn)號(hào),每個(gè)端點(diǎn)所支持的數(shù)據(jù)傳輸方向一般而言也是確定的:或是輸入(IN),或是輸出(OUT)。也有些芯片提供的端點(diǎn)的數(shù)據(jù)方向是可以配置的,例如MC68HC908JB8包含有兩個(gè)用于數(shù)據(jù)收發(fā)的端點(diǎn):端點(diǎn)1和端點(diǎn)2。其中端點(diǎn)1只能用于數(shù)據(jù)發(fā)送,即支持輸入(IN)操作;端點(diǎn)2既能用于數(shù)據(jù)發(fā)送,也可用于數(shù)據(jù)接收,即支持輸入(IN)和輸出(OUT)操作。而MC9S12UF32具有6個(gè)端點(diǎn)。
? ? ?利用設(shè)備地址、端點(diǎn)號(hào)和傳輸方向就可以指定一個(gè)端點(diǎn),并與它進(jìn)行通信。端點(diǎn)的傳輸特性還決定了其與主機(jī)通信是所采用的傳輸類(lèi)型,例如控制端點(diǎn)只能使用控制傳輸。根據(jù)端點(diǎn)的不同用途,可將端點(diǎn)分為兩類(lèi):0號(hào)端點(diǎn)和非0號(hào)端點(diǎn)。
? ? ??0號(hào)端點(diǎn)比較特殊,它有數(shù)據(jù)輸入IN和數(shù)據(jù)輸出OUT兩個(gè)物理單元,且只能支持控制傳輸。所有的USB設(shè)備都必須含有一個(gè)0號(hào)端點(diǎn),用作默認(rèn)控制管道。USB系統(tǒng)軟件就是使用該管道與USB邏輯設(shè)備進(jìn)行配置通信的。0號(hào)端點(diǎn)在USB設(shè)備上的以后就可以使用,而非0號(hào)端點(diǎn)必須要在配置以后才可以使用。
? ? ?根據(jù)具體應(yīng)用的需要,USB設(shè)備還可以含有多個(gè)除0號(hào)端點(diǎn)以外的其他端點(diǎn)。對(duì)于低速設(shè)備,其附加的端點(diǎn)數(shù)最多為2個(gè);對(duì)于全速/高速設(shè)備,其附加的端點(diǎn)數(shù)最多為15個(gè)。
[cpp]?view plaincopy?
?
?
5、字符串描述符
? ? ? 在USB設(shè)備中通常還含有字符串描述符,以說(shuō)明一些專(zhuān)用信息,如制造商的名稱(chēng)、設(shè)備的序列號(hào)等。它的內(nèi)容以UNICODE的形式給出,且可以被客戶軟件所讀取。對(duì)USB設(shè)備來(lái)說(shuō),字符串描述符是可選的。
[cpp]?view plaincopy?
?
?
6、管道
? ? ? 在USB系統(tǒng)結(jié)構(gòu)中,可以認(rèn)為數(shù)據(jù)傳輸時(shí)在USB主機(jī)軟件與USB設(shè)備的各個(gè)端點(diǎn)之間直接進(jìn)行的,它們之間的連接稱(chēng)為管道。管道是在USB設(shè)備的配置過(guò)程中建立的。管道是對(duì)USB主機(jī)與USB設(shè)備間通信流的抽象,表示USB主機(jī)的數(shù)據(jù)緩沖區(qū)與USB設(shè)備的端點(diǎn)之間存在著邏輯數(shù)據(jù)傳輸,而實(shí)際的數(shù)據(jù)傳輸是由USB總線接口層來(lái)完成的。
? ? ?管道與USB設(shè)備中的端點(diǎn)一一對(duì)應(yīng)。一個(gè)USB設(shè)備含有多少個(gè)端點(diǎn),其與USB主機(jī)進(jìn)行通信時(shí)就可以使用多少條管道,且端點(diǎn)的類(lèi)型決定了管道中數(shù)據(jù)的傳輸類(lèi)型,例如中斷端點(diǎn)對(duì)應(yīng)中斷管道,且該管道只能進(jìn)行中斷傳輸。不論存在著多少條管道,在各個(gè)管道中進(jìn)行的數(shù)據(jù)傳輸都是相互獨(dú)立的。
?
7、USB端點(diǎn)分類(lèi)
? ? ? USB 通訊的最基本形式是通過(guò)端點(diǎn)。一個(gè)USB端點(diǎn)只能向一個(gè)方向傳輸數(shù)據(jù)(從主機(jī)到設(shè)備(稱(chēng)為輸出端點(diǎn))或者從設(shè)備到主機(jī)(稱(chēng)為輸入端點(diǎn)))。端點(diǎn)可被看作一個(gè)單向的管道。
? ? ?USB 端點(diǎn)有 4 種不同類(lèi)型, 分別具有不同的數(shù)據(jù)傳送方式:
1) 控制CONTROL?
? ? 控制端點(diǎn)被用來(lái)控制對(duì)USB設(shè)備的不同部分訪問(wèn). 通常用作配置設(shè)備、獲取設(shè)備信息、發(fā)送命令到設(shè)備或獲取設(shè)備狀態(tài)報(bào)告。這些端點(diǎn)通常較小。每個(gè) USB 設(shè)備都有一個(gè)控制端點(diǎn)稱(chēng)為"端點(diǎn) 0", 被 USB 核心用來(lái)在插入時(shí)配置設(shè)備。USB協(xié)議保證總有足夠的帶寬留給控制端點(diǎn)傳送數(shù)據(jù)到設(shè)備.
2) 中斷INTERRUPT?
? ? ?每當(dāng) USB 主機(jī)向設(shè)備請(qǐng)求數(shù)據(jù)時(shí),中斷端點(diǎn)以固定的速率傳送小量的數(shù)據(jù)。此為USB 鍵盤(pán)和鼠標(biāo)的主要的數(shù)據(jù)傳送方法。它還用以傳送數(shù)據(jù)到USB設(shè)備來(lái)控制設(shè)備。通常不用來(lái)傳送大量數(shù)據(jù)。USB協(xié)議保證總有足夠的帶寬留給中斷端點(diǎn)傳送數(shù)據(jù)到設(shè)備.
3) 批量BULK
? ? 批量端點(diǎn)用以傳送大量數(shù)據(jù)。這些端點(diǎn)通常比中斷端點(diǎn)大得多. 它們普遍用于不能有任何數(shù)據(jù)丟失的情況。USB 協(xié)議不保證傳輸在特定時(shí)間范圍內(nèi)完成。如果總線上沒(méi)有足夠的空間來(lái)發(fā)送整個(gè)BULK包,它被分為多個(gè)包進(jìn)行傳輸。這些端點(diǎn)普遍用于打印機(jī)、USB Mass Storage和USB網(wǎng)絡(luò)設(shè)備上。
4) 等時(shí)ISOCHRONOUS?
? ? 等時(shí)端點(diǎn)也批量傳送大量數(shù)據(jù), 但是這個(gè)數(shù)據(jù)不被保證能送達(dá)。這些端點(diǎn)用在可以處理數(shù)據(jù)丟失的設(shè)備中,并且更多依賴于保持持續(xù)的數(shù)據(jù)流。如音頻和視頻設(shè)備等等。
? ? 控制和批量端點(diǎn)用于異步數(shù)據(jù)傳送,而中斷和等時(shí)端點(diǎn)是周期性的。這意味著這些端點(diǎn)被設(shè)置來(lái)在固定的時(shí)間連續(xù)傳送數(shù)據(jù),USB 核心為它們保留了相應(yīng)的帶寬。
?
[cpp]?view plaincopy?
? ? ?當(dāng)調(diào)用USB設(shè)備驅(qū)動(dòng)調(diào)用usb_submit_urb提交urb請(qǐng)求時(shí),將調(diào)用int usb_hcd_link_urb_to_ep(struct usb_hcd *hcd, struct urb *urb)把此urb增加到urb_list的尾巴上。(hcd: Host Controller Driver,對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)struct usb_hcd )
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Linux USB 驱动开发(一)—— USB设备基础概念【转】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows 10小娜只显示文字而不发
- 下一篇: Linux基础 -- 命令执行顺序控制与