<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于嵌入式Linux的USB設備驅動技術介紹

          基于嵌入式Linux的USB設備驅動技術介紹

          作者: 時間:2012-03-02 來源:網(wǎng)絡 收藏

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

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

          1 下的USB

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

          2 Linux下的USB core

          2.1 Linux中USB core與USB的結構關系

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



          2.2 USB core的初始化

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

          subsys_initcall(usb_init);
          module_exit(usb_exit);

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



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

          2.3 USB里的設備模型

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

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

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

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

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();