<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux的USB設備驅動(dòng)技術(shù)介紹

基于嵌入式Linux的USB設備驅動(dòng)技術(shù)介紹

作者: 時(shí)間:2012-03-02 來(lái)源:網(wǎng)絡(luò ) 收藏

以其穩定、高效、易定制、硬件支持廣泛、源代碼開(kāi)放等特點(diǎn),已在領(lǐng)域迅速崛起,被國際上許多大型的跨國企業(yè)用作產(chǎn)品的系統平臺。

是Universal Serial Bus (通用串行總線(xiàn))的縮寫(xiě),是1995年由Microsoft、Compaq、IBM等公司聯(lián)合制定的一種新的PC串行通信協(xié)議。它是一種快速、靈活的總線(xiàn)接口。與其它通信接口相比較,接口的最大特點(diǎn)是易于使用,這也是的主要設計目標。USB的成功得益于在USB標準中除定義了通信的物理層和電器層標準外。還定義了一套相對完整的軟件協(xié)議堆棧。這使得多數USB設備都很容易在各種平臺上工作。作為一種高速總線(xiàn)接口,USB適用于多種設備(如數碼相機、MP3播放器、高速數據采集設備等)。另外,USB接口還支持熱插拔,而且所有的配置過(guò)程都由系統自動(dòng)完成,無(wú)須用戶(hù)干預。

1 下的USB

內核的不斷升級過(guò)程中,驅動(dòng)程序的結構相對穩定。由于USB設備也是外圍設備的一種,因此,它的驅動(dòng)程序結構與普通設備的驅動(dòng)程序相同。Linux系統的設備分為字符設備(CharDevice)和塊設備(BlockDevice)。字符設備支持面向塊字符的I/O操作,它不通過(guò)系統的快速緩存,而只支持順序存取。塊設備則支持面向塊的I/O操作,所有塊設備的I/O操作都通過(guò)在內核地址空間的I/O緩沖區進(jìn)行,可以支持幾乎任意長(cháng)度和任意位置上的I/O請求。塊設備與字符設備還有一點(diǎn)不同,就是塊設備必須能夠隨機存取(RandomAccess),字符設備則沒(méi)有這個(gè)要求。典型的字符設備包括鼠標、鍵盤(pán)、串行口等,而塊設備主要包括硬盤(pán)軟盤(pán)設備、CD-Rom等。由于USB設備主要都是通過(guò)快速串行通訊來(lái)讀寫(xiě)數據,因此一般都可作為字符設備來(lái)進(jìn)行處理。

2 Linux下的USB core

2.1 Linux中USB core與USB的結構關(guān)系

Linux操作系統中有一個(gè)叫做“USB core”的子系統,可提供支持USB程序的API和USB主機控制器的驅動(dòng)程序。同時(shí)提供有許多數據結構、宏定義和功能函數來(lái)對硬件或設備進(jìn)行支持。在Linux下編寫(xiě)USB設備的驅動(dòng)程序時(shí),從嚴格意義上講,就是使用這些USB core的子系統所定義的數據結構、宏和函數來(lái)編寫(xiě)數據的處理功能。在Linux下,core、host controller和driver三者之間的關(guān)系如圖1所示。



2.2 USB core的初始化

USB core從USB子系統的初始化開(kāi)始。USB子系統的初始化則在文件drivers/usb/core/usb.c里。其代碼如下:

subsys_initcall(usb_init);
module_exit(usb_exit);

代碼中的subsys_initcall是一個(gè)宏,相當于module_init,只不過(guò)因為這部分代碼是核心,開(kāi)發(fā)者通常把它看作一個(gè)子系統,而不僅僅是一個(gè)模塊。因為USB core模塊代表的不是某一個(gè)設備,而是所有USB設備賴(lài)以生存的模塊。因此,在Linux中,像這樣把一個(gè)類(lèi)別的歸結為一個(gè)子系統(比如PCI子系統、scsi子系統等)?;旧?,drivers/目錄下面第一層的每個(gè)目錄都可算作一個(gè)子系統,因為它們代表了一類(lèi)設備。一般地,usb_init是真正的初始化函數,而usb_exit()則是整個(gè)USB子系統結束時(shí)的清理函數:



函數usb_init主要完成初始化和注冊設備。

2.3 USB里的設備模型

Linux里一個(gè)很重要的概念是設備模型。對于驅動(dòng)來(lái)說(shuō),設備的概念就是總線(xiàn)和與其相連的各種設備。在內核里,總線(xiàn)、設備、驅動(dòng)也就是bus、device、driver是設備模型很重要的三個(gè)概念,它們都有自己專(zhuān)屬的結構。在include/linux/devide.h里的定義為:

struct bus_type {……};
struct device {……);
struct device_driver {……};

每次出現一個(gè)設備都要向總線(xiàn)注冊,每次出現一個(gè)驅動(dòng),也要向總線(xiàn)注冊。系統初始化時(shí),應掃描連接許多設備,并為每一個(gè)設備建立一個(gè)struct device的變量。每一次都應有一個(gè)驅動(dòng)程序,并要準備一個(gè)struct device_driver結構的變量。還要把這些變量加入相應的鏈表(如把device插入devices鏈表,driver插入drivers鏈表)。這樣,通過(guò)總線(xiàn)就能找到每一個(gè)設備和每一個(gè)驅動(dòng)。然而,假如計算機里只有設備卻沒(méi)有對應的驅動(dòng),那么設備將無(wú)法工作。反過(guò)來(lái),倘若只有驅動(dòng)卻沒(méi)有設備,驅動(dòng)也起不了任何作用。對于USB設備,它可以在計算機啟動(dòng)以后再插入或者拔出計算機。由于device可以在任何時(shí)刻出現,而driver也可以在任何時(shí)刻被加載,所以,每當一個(gè)struct device誕生時(shí),它就會(huì )去BUS的drivers鏈表中尋找自己的另一半。如果找到了匹配的設備,就調用device_bind_driver,并綁定好。

Linux設備模型中的總線(xiàn)落實(shí)在USB子系統里就是usb_bus_type,它在usb_init函數中可用retval=bus_register(usb_bus_type)語(yǔ)句注冊,而在driver.c文件里的定義如下:

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>