亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        方 騫,倪遠平

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

        1 引言

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

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

        2 Linux驅(qū)動程序

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

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

        3 USB基礎

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

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

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

        圖1 USB總線的連接方式

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

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

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

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

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

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

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

        要實現(xiàn)一個USB的驅(qū)動程序,首先要構(gòu)造一個內(nèi)核模塊,這個模塊定義了兩個函數(shù),其中一個在模塊被裝載到內(nèi)核時調(diào)用,而另一個則在模塊被移除時調(diào)用。此時,這個簡單的模塊還不是驅(qū)動程序,需要在這兩個函數(shù)內(nèi)加入注冊和注銷USB設備的函數(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ū)動程序中它必須是唯一的,通常被設置為和驅(qū)動程序模塊相同的名字。

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

        MODULE_DEVICE_TABLE(usb,demo_table);

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

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

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

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

        demo是用來描述設備的名字。USB_DEMO_MINOR_BASE是為該驅(qū)動程序指派的次設備號范圍的開始值。與該驅(qū)動程序相關(guān)聯(lián)的所有設備都是唯一的,以該值開始遞增的次設備號來創(chuàng)建的。demo_fops是指向struct file_operations的指針,驅(qū)動程序定義該結(jié)構(gòu)體,用它來注冊為字符設備,其中包含了一組函數(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接口的廣泛應用,對于USB驅(qū)動程序的研究顯得尤為重要。USB驅(qū)動程序框架,實現(xiàn)的是USB設備不同應用程序之外所共有的部分,只要在程序中加入不同設備的信息,就能夠完成對不同設備的識別。如果要實現(xiàn)USB設備的不同功能,僅需要修改驅(qū)動程序中demo_fops結(jié)構(gòu)體中的操作函數(shù)就能夠完成。試驗證明,上面設計的程序運行良好,通用性很高,具有很強的可移植性。

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

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

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

        猜你喜歡
        集線器驅(qū)動程序端點
        非特征端點條件下PM函數(shù)的迭代根
        音樂聆賞新世代 Bowers & Wilkins Formation Audio無線音樂集線器
        不等式求解過程中端點的確定
        參數(shù)型Marcinkiewicz積分算子及其交換子的加權(quán)端點估計
        基丁能雖匹配延拓法LMD端點效應處理
        Microchip拓寬USB3.0集線器應用范圍
        Microchip推出具有FlexConnect功能的新型智能集線器,拓寬USB 3.0集線器的應用范圍
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        驅(qū)動程序更新與推薦
        国产一区二区三区涩涩| 99久久精品日本一区二区免费| 国产精女同一区二区三区久| 国产日产桃色精品久久久| 综合成人亚洲网友偷自拍| 亚洲国产综合久久天堂| 亚洲女同一区二区| 中文字幕爆乳julia女教师| 国产主播无套内射一区| 国产亚洲成年网址在线观看| 久久综合九色综合久久久| 国产日本精品一二三四区| 久久99热狠狠色精品一区| 熟女无套内射线观56| 精品国产一区二区三区久久久狼| 欧美xxxxx精品| 午夜视频在线观看国产19| 波多野结衣av一区二区全免费观看| 中文字字幕在线精品乱码| 中文AV怡红院| 97激情在线视频五月天视频| 国产成人精品一区二区三区av | 国产亚洲3p一区二区| 日本欧美大码a在线观看| 精品无码国产自产拍在线观看 | 久久精品成人91一区二区 | 久久久国产熟女综合一区二区三区 | 一区二区三区极品少妇| 国产精品久久国产精品99 gif| 人妻av乱片av出轨| 国产v精品成人免费视频400条| 人妻熟女中文字幕av| 欧美性猛交xxxx乱大交极品| 亚洲av无码精品色午夜在线观看| 亚洲国产成人va在线观看天堂| 青草青草久热精品视频国产4| 国产女人av一级一区二区三区| 中文字幕人妻少妇伦伦| 亚洲国产精品久久人人爱| 91亚洲国产成人aⅴ毛片大全| av成人资源在线播放|