国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Linux的最小USB驅(qū)動程序框架設(shè)計

2012-07-25 03:19:20倪遠平
微處理機 2012年3期
關(guān)鍵詞:集線器驅(qū)動程序端點

方 騫,倪遠平

(昆明理工大學(xué),昆明650051)

1 引言

隨著電腦軟件和硬件的快速發(fā)展,傳統(tǒng)的接口如串口、并口等通訊方式已經(jīng)不能滿足現(xiàn)有系統(tǒng)或者設(shè)備的數(shù)據(jù)傳輸需求。在這個背景下,以Intel為首的七家公司于1994年推出了USB(Universal Serial Bus)通用串行總線協(xié)議概念,主要是為了解決接口標(biāo)準(zhǔn)太多、傳輸速率偏低的弊端。每個USB設(shè)備都有專門的驅(qū)動程序來支持,研究所有USB驅(qū)動程序共同的部分,為快速開發(fā)不同USB設(shè)備的驅(qū)動程序提供了一個參考框架,節(jié)省了開發(fā)周期。

通過介紹Linux驅(qū)動程序的相關(guān)知識,以及對USB系統(tǒng)的深入理解,試圖構(gòu)造一個Linux下最小的USB驅(qū)動程序框架。

2 Linux驅(qū)動程序

在Linux內(nèi)核中,任何設(shè)備都是以相對應(yīng)的文件方式存在的,對設(shè)備的任何操作實際上都是通過對這個設(shè)備文件的操作完成的。讀寫設(shè)備文件就相當(dāng)于操作設(shè)備的輸入和輸出。由于各個設(shè)備文件所對應(yīng)的接口不同,設(shè)備驅(qū)動程序在Linux內(nèi)核中就起著這樣一個特殊的作用,它們像一個個黑盒子一樣,使某個特定的硬件響應(yīng)一個定義良好的內(nèi)部編程接口,而這些接口完全隱藏了設(shè)備的工作細節(jié),它們對用戶來說是完全透明的,甚至感覺不到它們的存在。實際上,當(dāng)用戶進行操作時,內(nèi)核將這種操作轉(zhuǎn)換成一組標(biāo)準(zhǔn)化的調(diào)用再繼續(xù)執(zhí)行,而設(shè)備驅(qū)動程序的任務(wù)就是將這些調(diào)用映射到作用于實際硬件設(shè)備的特有操作上。

Linux系統(tǒng)設(shè)備有三種,一般分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。字符設(shè)備是能夠像字節(jié)流一樣被訪問的設(shè)備,沒有緩存,對它的讀寫是以字節(jié)為單位的。塊設(shè)備上的數(shù)據(jù)以塊的形式存放,讀寫都有緩存的支持,而且能夠隨機存取。網(wǎng)絡(luò)設(shè)備同時具有字符設(shè)備和塊設(shè)備的部分特點,它的輸入和輸出是有結(jié)構(gòu)的,但數(shù)據(jù)的大小卻是不固定的。網(wǎng)絡(luò)設(shè)備在Linux里有一系列專門的處理方式,這里就不再詳細介紹。

3 USB基礎(chǔ)

3.1 USB的硬件結(jié)構(gòu)

USB(Universal Serial Bus)即“通用串行外部總線”,是主機和外圍設(shè)備之間的一種連接。USB采用四線電纜,其中兩根是用來傳送數(shù)據(jù)的串行通道,另外兩根為下游的設(shè)備提供電源。

USB是基于令牌的總線。USB主機控制器廣播令牌,總線上設(shè)備檢測令牌中的地址是否與自身相符,通過接收或發(fā)送數(shù)據(jù)給主機來響應(yīng)。USB系統(tǒng)采用級聯(lián)星型拓撲,該拓撲由三個基本部分組成:主機(Host)、集線器(Hub)和功能設(shè)備。USB主機控制器通過根集線器與其他USB設(shè)備相連。集線器也屬于USB設(shè)備,通過它可以在一個USB接口上擴展出多個接口。除根集線器外,最多可以層疊5個集線器。一條USB總線上可以外接127個設(shè)備,包括根集線器和其他集線器。圖1為USB總線的連接方式。

圖1 USB總線的連接方式

3.2 USB的軟件架構(gòu)

每個USB只有一個主機,它包括USB總線接口和USB系統(tǒng)。USB總線接口處理電氣層與協(xié)議層互連。USB系統(tǒng)用主控制器管理主機與USB設(shè)備間的數(shù)據(jù)傳輸,它與主控制器間的接口依賴于主控制器的硬件定義。同時,USB系統(tǒng)也負責(zé)管理USB資源,這使客戶訪問USB成為可能。

USB客戶軟件位于軟件結(jié)構(gòu)的最高層,負責(zé)處理特定USB設(shè)備驅(qū)動器??蛻舫绦?qū)用枋鏊兄苯幼饔糜谠O(shè)備的軟件入口。當(dāng)設(shè)備被系統(tǒng)檢測到后,這些客戶程序?qū)⒅苯幼饔糜谕鈬布?。這個共享的特性將USB系統(tǒng)軟件置于客戶及其設(shè)備之間,由客戶程序?qū)SB驅(qū)動程序在客戶端形成的設(shè)備映像進行處理。

3.3 USB的數(shù)據(jù)流傳輸

端點是USB設(shè)備中的實際物理單元,USB數(shù)據(jù)傳輸就是在主機和USB設(shè)備各個端點之間進行的。USB端點有四種不同的類型,控制、中斷、批量和等時。控制和批量端點用于異步的數(shù)據(jù)傳輸,而中斷和等時端點是周期性的。USB端點只能往一個方向傳送數(shù)據(jù),可以看作是單向管道,它被捆綁為接口,而USB接口只處理一種USB邏輯連接。USB接口本身又被捆綁為配置,一個USB設(shè)備可以有多個配置,而且可以在配置之間切換以改變設(shè)備的狀態(tài)。

4 Linux系統(tǒng)最小USB驅(qū)動程序框架實現(xiàn)

每個USB設(shè)備都會有一個相應(yīng)的驅(qū)動程序,結(jié)合Linux內(nèi)核源代碼,將討論所有USB設(shè)備所共通的部分,在這里并不列出全部代碼,而是將其中核心部分列出加以討論。

要實現(xiàn)一個USB的驅(qū)動程序,首先要構(gòu)造一個內(nèi)核模塊,這個模塊定義了兩個函數(shù),其中一個在模塊被裝載到內(nèi)核時調(diào)用,而另一個則在模塊被移除時調(diào)用。此時,這個簡單的模塊還不是驅(qū)動程序,需要在這兩個函數(shù)內(nèi)加入注冊和注銷USB設(shè)備的函數(shù)才能成為一個驅(qū)動程序模塊。注冊函數(shù)在USB驅(qū)動程序加載時被調(diào)用,注銷函數(shù)在卸載時被調(diào)用。

demo_driver是一個usb_driver類型的結(jié)構(gòu)體,這個結(jié)構(gòu)體包括許多回調(diào)函數(shù)和變量,它們向USB核心代碼描述了USB驅(qū)動程序。以下是這個結(jié)構(gòu)體的主要成員:

THIS_MODULE是指向該驅(qū)動程序模塊所有者的指針,USB核心使用它來正確地對該USB驅(qū)動程序進行引用計數(shù),使它不會在不合適的時刻被卸載掉。demo是指向驅(qū)動程序名字的指針,在內(nèi)核的所有USB驅(qū)動程序中它必須是唯一的,通常被設(shè)置為和驅(qū)動程序模塊相同的名字。

demo_table是指向struct usb_device_id表的指針。如果沒有設(shè)置該變量,USB驅(qū)動程序中的探測回調(diào)函數(shù)不會被調(diào)用。

MODULE_DEVICE_TABLE(usb,demo_table);

USB_DEMO_INFO_ID代表的是USB設(shè)備的主次設(shè)備號,在demo_table中包含很多條這樣的設(shè)備信息。只要其中包含所要連接的USB設(shè)備信息,主機就能識別這個設(shè)備。寫新的USB設(shè)備驅(qū)動時,也只需將新設(shè)備的主次設(shè)備號加入這個表中,就能被主機識別。

demo_probe和demo_disconnect是指向USB驅(qū)動程序中探測函數(shù)和斷開函數(shù)的指針。當(dāng)USB核心認為它有一個struct usb_interface可以由該驅(qū)動程序處理時,它將調(diào)用探測函數(shù)。

當(dāng)struct usb_interface被從系統(tǒng)中移除或者驅(qū)動程序正在從USB核心中卸載時,USB核心將調(diào)用斷開函數(shù)。

demo_class是探測函數(shù)和斷開函數(shù)中注冊某個設(shè)備或注銷某個設(shè)備時所調(diào)用的函數(shù)需要的參數(shù),它是一個指向usb_class_driver結(jié)構(gòu)的指針,定義許多不同的參數(shù),在注冊一個設(shè)備號時USB驅(qū)動程序需要USB核心知道這些參數(shù)。

demo是用來描述設(shè)備的名字。USB_DEMO_MINOR_BASE是為該驅(qū)動程序指派的次設(shè)備號范圍的開始值。與該驅(qū)動程序相關(guān)聯(lián)的所有設(shè)備都是唯一的,以該值開始遞增的次設(shè)備號來創(chuàng)建的。demo_fops是指向struct file_operations的指針,驅(qū)動程序定義該結(jié)構(gòu)體,用它來注冊為字符設(shè)備,其中包含了一組函數(shù)指針。每個打開的文件和一組函數(shù)關(guān)聯(lián)。這些操作主要用來實現(xiàn)系統(tǒng)調(diào)用,這里簡單定義了open、release、read、write這幾個最基本的函數(shù)。

現(xiàn)在,我們只需定義這幾個空函數(shù),就可以實現(xiàn)一個最小的USB驅(qū)動程序的框架。

5 結(jié)束語

隨著USB接口的廣泛應(yīng)用,對于USB驅(qū)動程序的研究顯得尤為重要。USB驅(qū)動程序框架,實現(xiàn)的是USB設(shè)備不同應(yīng)用程序之外所共有的部分,只要在程序中加入不同設(shè)備的信息,就能夠完成對不同設(shè)備的識別。如果要實現(xiàn)USB設(shè)備的不同功能,僅需要修改驅(qū)動程序中demo_fops結(jié)構(gòu)體中的操作函數(shù)就能夠完成。試驗證明,上面設(shè)計的程序運行良好,通用性很高,具有很強的可移植性。

[1] [美]Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman,著.Linux設(shè)備驅(qū)動程序[M].魏永明,耿岳,鐘書毅,譯.北京:中國電力出版社,2005.

[2] 韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2010.

[3] 毛德操,胡希明.Linux內(nèi)核源代碼情景分析[M].杭州:浙江大學(xué)出版社,2003.

猜你喜歡
集線器驅(qū)動程序端點
非特征端點條件下PM函數(shù)的迭代根
音樂聆賞新世代 Bowers & Wilkins Formation Audio無線音樂集線器
不等式求解過程中端點的確定
參數(shù)型Marcinkiewicz積分算子及其交換子的加權(quán)端點估計
基丁能雖匹配延拓法LMD端點效應(yīng)處理
Microchip拓寬USB3.0集線器應(yīng)用范圍
Microchip推出具有FlexConnect功能的新型智能集線器,拓寬USB 3.0集線器的應(yīng)用范圍
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
驅(qū)動程序更新與推薦
涪陵区| 定兴县| 南岸区| 抚顺县| 姜堰市| 凌云县| 大兴区| 绥德县| 商河县| 荃湾区| 白河县| 即墨市| 元谋县| 苏尼特右旗| 吉木乃县| 诏安县| 金阳县| 玉田县| 图片| 安溪县| 江北区| 三明市| 乐亭县| 平凉市| 元谋县| 尉氏县| 平陆县| 合阳县| 紫金县| 友谊县| 开远市| 北票市| 南岸区| 元朗区| 瓦房店市| 龙川县| 新闻| 化州市| 普定县| 叶城县| 昭苏县|