USB總線是一種典型的熱插拔的總線標(biāo)準(zhǔn),由于其優(yōu)異的性能幾乎成為了當(dāng)下大小設(shè)備中的標(biāo)配。
USB的驅(qū)動(dòng)可以分為3類:SoC的USB控制器的驅(qū)動(dòng),主機(jī)端USB設(shè)備的驅(qū)動(dòng),設(shè)備上的USB Gadget驅(qū)動(dòng),通常,對(duì)于USB這種標(biāo)準(zhǔn)化的設(shè)備,內(nèi)核已經(jīng)將主機(jī)控制器的驅(qū)動(dòng)編寫好了,設(shè)備上的Gadget驅(qū)動(dòng)通常只運(yùn)行固件程序而不是基于Linux, 所以驅(qū)動(dòng)工程師的主要工作就是編寫主機(jī)端的USB設(shè)備驅(qū)動(dòng)。

USB子系統(tǒng)框架

下圖表示了Linux中USB子系統(tǒng)的框架結(jié)構(gòu),和i2c一樣,USB子系統(tǒng)也可分為三層:**設(shè)備驅(qū)動(dòng)層--USB核心--控制器驅(qū)動(dòng)層*

移動(dòng)開(kāi)發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開(kāi)發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

作為熱插拔總線, USB和非熱插拔總線最大的區(qū)別就是總線無(wú)法事前獲知設(shè)備的信息以及設(shè)備何時(shí)被插入或拔出,所以也就不能使用任意一種形式將設(shè)備信息事前寫入內(nèi)核。
為了解決由于熱插拔引起的設(shè)備識(shí)別問(wèn)題,USB總線通過(guò)枚舉的方式來(lái)獲取一個(gè)接入總線的USB設(shè)備的設(shè)備信息——一個(gè)由device->config->interface->endpoint逐級(jí)描述的設(shè)備,基于分離的思想,USB子系統(tǒng)中設(shè)計(jì)了一組結(jié)構(gòu)來(lái)描述這幾個(gè)維度的設(shè)備信息,相比之下,i2c總線只要一個(gè)i2c_client即可描述一個(gè)設(shè)備.

USB總線上的所有通信都是由主機(jī)發(fā)起的,所以本質(zhì)上,USB都是采用輪詢的方式進(jìn)行的。USB總線會(huì)使用輪詢的方式不斷檢測(cè)總線上是否有設(shè)備接入,如果有設(shè)備接入相應(yīng)的D+D-就會(huì)有電平變化。然后總線就會(huì)按照USB規(guī)定的協(xié)議與設(shè)備進(jìn)行通信,設(shè)備將存儲(chǔ)在自身的設(shè)備信息依次交給主機(jī),主機(jī)將這些信息按照4層模型組織起來(lái)。上報(bào)到內(nèi)核,內(nèi)核中的USB子系統(tǒng)再去匹配相應(yīng)的驅(qū)動(dòng),USB設(shè)備驅(qū)動(dòng)是面向interface這一層次的信息的

作為一種高度標(biāo)準(zhǔn)化的設(shè)備, 雖然USB本身十分復(fù)雜, 但是內(nèi)核已經(jīng)為我們完成了相當(dāng)多的工作, 下述的常用設(shè)備驅(qū)動(dòng)在內(nèi)核中已經(jīng)實(shí)現(xiàn)了。很多時(shí)候, 驅(qū)動(dòng)的難度不是看設(shè)備的復(fù)雜程度, 而是看標(biāo)準(zhǔn)化程度

  • 音頻設(shè)備類

  • 通信設(shè)備類

  • HID設(shè)備類

  • 顯示設(shè)備類

  • 海量存儲(chǔ)設(shè)備類

  • 電源設(shè)備類

  • 打印設(shè)備類

  • 集線器設(shè)備類

核心結(jié)構(gòu)和方法簡(jiǎn)述

核心結(jié)構(gòu)

基于分離的思想,USB子系統(tǒng)也提供了描述一個(gè)USB設(shè)備的結(jié)構(gòu),只不過(guò)基于USB協(xié)議,完整描述一個(gè)USB設(shè)備信息需要9個(gè)結(jié)構(gòu),這些結(jié)構(gòu)中,前4個(gè)用來(lái)描述一個(gè)USB設(shè)備的硬件信息,即設(shè)備本身的信息,這些信息是寫入到設(shè)備的eeprom的,在任何USB主機(jī)中看到的都一樣,這些信息可以使用lsusb -v命令來(lái)查看; 后5個(gè)描述一個(gè)USB設(shè)備的軟件信息,即除了硬件信息之外,Linux為了管理一個(gè)USB設(shè)備還要封裝一些信息,是OS-specific的信息; USB設(shè)備硬件信息和軟件信息的關(guān)系類似于中斷子系統(tǒng)中的硬件中斷和內(nèi)核中斷,只不過(guò)更復(fù)雜一點(diǎn)。