• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    嵌入式linux下USB設(shè)備自動(dòng)加載

    2010-03-16 07:44:22董光
    關(guān)鍵詞:U盤(pán)驅(qū)動(dòng)程序腳本

    董光

    (長(zhǎng)春理工大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,長(zhǎng)春 130022)

    在Linux操作系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序是操作系統(tǒng)內(nèi)核與硬件設(shè)備之間的接口,分為驅(qū)動(dòng)程序與操作系統(tǒng)內(nèi)核的接口、驅(qū)動(dòng)程序與系統(tǒng)引導(dǎo)的接口、驅(qū)動(dòng)程序與設(shè)備的接口[1]。它屏蔽了硬件的細(xì)節(jié),是內(nèi)核的一部分,完成對(duì)設(shè)備初始化和釋放;對(duì)設(shè)備進(jìn)行管理,包括實(shí)時(shí)參數(shù)設(shè)置以及提供對(duì)設(shè)備的操作接口;負(fù)責(zé)應(yīng)用程序和設(shè)備文件間的數(shù)據(jù)傳輸;檢測(cè)處理設(shè)備出現(xiàn)的錯(cuò)誤[2]。在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。

    1 嵌入式linux驅(qū)動(dòng)分析

    1.1 Linux設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)及特點(diǎn)

    每個(gè)設(shè)備文件都有其文件屬性(c/b),表示是字符設(shè)備還是塊設(shè)備。兩個(gè)設(shè)備號(hào),主設(shè)備號(hào)標(biāo)識(shí)驅(qū)動(dòng)程序,取值空間是0到255,其中USB設(shè)備是180。從設(shè)備號(hào)標(biāo)識(shí)使用同一個(gè)設(shè)備驅(qū)動(dòng)程序的不同的硬件設(shè)備[3]。

    設(shè)備驅(qū)動(dòng)程序由三部分組成:1.自動(dòng)配置和初始化子程序,負(fù)責(zé)檢測(cè)所要驅(qū)動(dòng)的硬件設(shè)備是否存在和是否能正常工作。2.服務(wù)于 I/O的子程序,又稱(chēng)驅(qū)動(dòng)程序的上半部分。3.中斷服務(wù)程序,又稱(chēng)驅(qū)動(dòng)程序的下半部。

    在 linux中,設(shè)備驅(qū)動(dòng)程序是核心的一部分,象核心中其它代碼一樣,出錯(cuò)將導(dǎo)致系統(tǒng)的嚴(yán)重?fù)p傷。設(shè)備驅(qū)動(dòng)程序必須為L(zhǎng)inux核心或者其從屬子系統(tǒng)提供一個(gè)標(biāo)準(zhǔn)接口。多數(shù)的Linux設(shè)備驅(qū)動(dòng)程序可以在核心模塊發(fā)出加載請(qǐng)求時(shí)進(jìn)行加載,同時(shí)在不再使用設(shè)備時(shí)進(jìn)行卸載。Linux設(shè)備驅(qū)動(dòng)程序可以連接到核心中。當(dāng)核心被編譯時(shí),哪些驅(qū)動(dòng)程序被連入核心是用戶自己可以進(jìn)行配置的。當(dāng)系統(tǒng)啟動(dòng)及設(shè)備驅(qū)動(dòng)程序初始化的時(shí)候查找它所控制的硬件設(shè)備。

    1.2 USB設(shè)備驅(qū)動(dòng)

    Linux為USB創(chuàng)建了USB文件系統(tǒng),所有的USB設(shè)備驅(qū)動(dòng)程序和任何連接到主機(jī)的USB設(shè)備的接口都被USB文件系統(tǒng)管理。USB文件系統(tǒng)使得所有USB設(shè)備看起來(lái)只是一個(gè)普通文件,并且對(duì)USB總線上的設(shè)備的增加和刪除進(jìn)行動(dòng)態(tài)監(jiān)控[4]。

    USB系統(tǒng)包括硬件電路和軟件兩部分,硬件上通過(guò)USB芯片實(shí)現(xiàn)。軟件部分由USB主機(jī)控制器驅(qū)動(dòng)程序HCD(Host Controller Driver)、USB核心驅(qū)動(dòng)USBD(UniversalSerialBusDriver)和USB設(shè)備驅(qū)動(dòng)組成。其中HCD和USBD就是我們通常說(shuō)的協(xié)議棧,這兩部分共同處理與協(xié)議相關(guān)的操作,如圖1所示??蛻舳蓑?qū)動(dòng)程序可以包含多個(gè),不同的功能接口對(duì)應(yīng)不同的驅(qū)動(dòng)程序,它們不直接與 USB設(shè)備硬件打交道,而是通過(guò)協(xié)議棧的抽象處理來(lái)完成與設(shè)備的不同功能接口之間的通信[5]。

    圖1 USB系統(tǒng)的層次結(jié)構(gòu)Fi.1 Systematic adecker of USB

    USB設(shè)備驅(qū)動(dòng)是最終與應(yīng)用程序交互的軟件模塊,其主要為應(yīng)用程序提供訪問(wèn)接口、提供驅(qū)動(dòng)程序管理、設(shè)備接口的插拔處理和對(duì)設(shè)備控制與驅(qū)動(dòng)等功能。但是,對(duì)于不同設(shè)備驅(qū)動(dòng)程序,其功能的具體實(shí)現(xiàn)不同,在開(kāi)發(fā)時(shí),須對(duì) USB提供類(lèi)協(xié)議進(jìn)行分析。

    2 熱插拔腳本實(shí)現(xiàn)USB設(shè)備自動(dòng)加載

    2.1 USB Host的OHCI標(biāo)準(zhǔn)

    1995 年底,Compaq、Microsoft、NationalSemiconductor公司推出了USBOHCI(Open HostControl Interface,開(kāi)放式主控制器接口)標(biāo)準(zhǔn)。OHCI是一個(gè)完全開(kāi)放的標(biāo)準(zhǔn),它定義了一系列寄存器和相關(guān)的數(shù)據(jù)結(jié)構(gòu),以統(tǒng)一 USB主機(jī)控制器和驅(qū)動(dòng)程序接口,其結(jié)構(gòu)如圖2所示。

    圖2OHCI在USB中的層次Fig.2 OHCI is in arrangement of ideas in USB

    2.2 Linux的USB OHCI驅(qū)動(dòng)程序接口分析

    因?yàn)橛蠴HCI定義的寄存器標(biāo)準(zhǔn),Linux下也提供相應(yīng)的驅(qū)動(dòng)程序,所以只要符合OHCI標(biāo)準(zhǔn)的USB主機(jī)接口,很容易在Linux下被驅(qū)動(dòng)起來(lái)。

    常用的 USB設(shè)備主要有 U盤(pán)、USB鍵盤(pán)/鼠標(biāo)、USB攝像頭等,它們?cè)贚inux內(nèi)核中都有相應(yīng)的驅(qū)動(dòng)程序??赏ㄟ^(guò)配置Linux內(nèi)核時(shí)在USBsupport菜單中添加對(duì)各種USB設(shè)備的支持。U盤(pán)的驅(qū)動(dòng)程序是USBMass Storage support;USB鍵盤(pán)/鼠標(biāo)是USBHumanInterfaceDevices(HID)。使用PreliminaryUSBdevicefilesystem選項(xiàng),可開(kāi)啟USB設(shè)備文件系統(tǒng)的支持。系統(tǒng)啟動(dòng)后通過(guò)命令Mount-t usbdevfs none/proc/bus/usb加載 USB設(shè)備文件系統(tǒng)。

    從上述可以看到,USB總線上有兩個(gè)設(shè)備:最底層是 OHCI標(biāo)準(zhǔn)的根 Hub(Product=USB OHCI RootHub),在它上面是一個(gè)USB大容量存儲(chǔ)設(shè)備(Product=USB Mass Storage Device),也就是 U盤(pán)。

    2.3 USB熱插拔腳本

    USB是一種熱插拔總線,它允許在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)地添加或刪除設(shè)備。但是,還不能實(shí)現(xiàn)USB設(shè)備的自動(dòng)加載,而必須通過(guò)命令掛載后才能正常使用。從linux2.4內(nèi)核開(kāi)始,引入了hotplug的方法實(shí)現(xiàn)對(duì)熱插拔的支持。在配置內(nèi)核時(shí),選擇 General setup中的選項(xiàng)Sopporthot-pluggabledevices可實(shí)現(xiàn)內(nèi)核對(duì)hotplug的支持。有了熱插拔的支持后,就可以插入一個(gè)新設(shè)備并立即使用該設(shè)備了,因?yàn)橄到y(tǒng)內(nèi)核可主動(dòng)調(diào)用一個(gè)熱插拔的時(shí)間來(lái)自動(dòng)配置新插入的設(shè)備。熱插拔事件可用來(lái)調(diào)用一個(gè)代理任務(wù)來(lái)配置適配器、子系統(tǒng)或程序。代理任務(wù)利用腳本來(lái)處理并管理這種配置。這種腳本的框架就稱(chēng)為熱插拔策略代理。這些代理與/sbin/hotplug腳本中的一項(xiàng)綁定在一起。這個(gè)腳本可用來(lái)調(diào)試和記錄事件的變化,并控制系統(tǒng)的熱插拔代理。熱插拔代理是目錄/etc/hotplug中的一些腳本文件。一個(gè)熱插拔時(shí)間可調(diào)用一個(gè)或多個(gè)代理類(lèi)型,其名稱(chēng)格式為type.agent。對(duì)于USB設(shè)備來(lái)說(shuō)就是/etc/hotplug/usb.agent。系統(tǒng)上電啟動(dòng)正常以后,一個(gè)USB設(shè)備的hotplug調(diào)用過(guò)程如下:

    1.用戶插入U(xiǎn)SB設(shè)備。

    2.USB總線報(bào)告有新設(shè)備插入,讀取設(shè)備的PID(product ID)、VID(vendor ID)等相關(guān)信息。

    3.如果找到驅(qū)動(dòng)程序,則 Linux會(huì)自動(dòng)加載對(duì)應(yīng)的USB設(shè)備驅(qū)動(dòng)程序。

    4.內(nèi)核調(diào)用文件系統(tǒng)中的/sbin/hotplug腳本,并傳遞相關(guān)的環(huán)境變量。

    5./sbin/hotplug腳本進(jìn)行解析后,發(fā)現(xiàn)是 USB設(shè)備,它會(huì)調(diào)用USB設(shè)備配置代理腳本/etc/hotplug/usb.agent。

    6./etc/hotplug/usb.agent腳本根據(jù)讀取到的設(shè)備信息PID、VID和Class等判斷設(shè)備類(lèi)型,實(shí)現(xiàn)相應(yīng)的動(dòng)作,如模塊加載對(duì)應(yīng)的驅(qū)動(dòng)程序等。

    從這個(gè)過(guò)程中可見(jiàn),hotplug是內(nèi)核主動(dòng)發(fā)起調(diào)用應(yīng)用程序的過(guò)程。/sbin/hotplug腳本是所有 hotplug的入口。

    其關(guān)鍵腳本如下:

    如果有 USB設(shè)備插入系統(tǒng)內(nèi)核,就會(huì)相當(dāng)于以下面命令行的方式調(diào)用hotplug腳本:

    經(jīng)過(guò)/sbin/hotplug,/etc/hotplug/usb.agent就會(huì)被調(diào)用。

    2.4 U盤(pán)的自動(dòng)加載實(shí)現(xiàn)

    本文的開(kāi)發(fā)環(huán)境是在 Windows下安裝虛擬機(jī)VMWare5.5,并在虛擬機(jī)中安裝Linux Red Hat 9.0操作系統(tǒng),所有工作都是在此環(huán)境下完成的。

    在安裝 Linux系統(tǒng)時(shí),選擇“內(nèi)核開(kāi)發(fā)”選項(xiàng),內(nèi)核源碼就直接安裝在/usr/src的目錄下,版本號(hào)為2.4.20-8。在Linux系統(tǒng)中配置U盤(pán)驅(qū)動(dòng)程序(USB Mass Storage support),按照Mass Storage協(xié)議,把U盤(pán)作為一個(gè)虛擬的SCSI磁盤(pán)設(shè)備來(lái)使用。所以,要想正常使用 U盤(pán),還需要內(nèi)核支持SCSI設(shè)備,在配置內(nèi)核時(shí),選擇對(duì) SCSI設(shè)備(SCSI support)的支持。

    系統(tǒng)上電啟動(dòng)正常以后,當(dāng)一個(gè)U盤(pán)插入時(shí),系統(tǒng)會(huì)發(fā)生如下動(dòng)作:

    1.用戶插入U(xiǎn)盤(pán)。

    2.USB總線報(bào)告有新設(shè)備插入,讀取設(shè)備相關(guān)信息,得知是U盤(pán)設(shè)備。

    3.找到并啟用Mass Storage驅(qū)動(dòng)程序。

    4.系統(tǒng)會(huì)添加一個(gè)新的SCSI設(shè)備,并通過(guò)設(shè)備文件系統(tǒng)在/dev/scsi目錄下創(chuàng)建節(jié)點(diǎn)。

    5.內(nèi)核調(diào)用文件系統(tǒng)中的/sbin/hotplug腳本,并傳遞相關(guān)的環(huán)境變量。

    6./sbin/hotplug腳本進(jìn)行解析后,發(fā)現(xiàn)是 USB設(shè)備,它會(huì)調(diào)用USB設(shè)備配置代理腳本/etc/hotplug/usb.agent。

    通常,當(dāng)U盤(pán)插入以后,可通過(guò)命令:

    把U盤(pán)掛載到/mnt/udisk目錄下,或者也可使用/etc/fstab中的路徑。

    要想實(shí)現(xiàn)U盤(pán)插入以后的自動(dòng)掛載,需在/etc/hotplug/usb.agent腳本中添加如下代碼:

    其中,環(huán)境變量$ACTION為add,表示有設(shè)備插入;remove表示設(shè)備被拔出。“USB_MASS_INT_CLASS=”8“”代表 USB Mass Storage設(shè)備(按照USB Mass Storage協(xié)議,所有的U盤(pán)設(shè)備class都為8)。內(nèi)核在調(diào)用hotplug時(shí),把USB的class通過(guò)參數(shù)傳遞給/sbin/hotplug腳本,接著被傳遞到usb.agent腳本中。usb.agent腳本通過(guò)分析傳遞進(jìn)來(lái)的參數(shù),把當(dāng)前USB設(shè)備的class記錄在環(huán)境變量$usb_bInterfaceClass中。通過(guò)它與 USB_MASS_INT_CLASS的比較,就可以判斷 U盤(pán)設(shè)備。接著,在“/dev/scsi”目錄下搜索/bus0/target0/lun0/part1設(shè)備,搜索到以后進(jìn)行自動(dòng)加載工作。

    3 結(jié)束語(yǔ)

    根據(jù) USB支持熱插拔特性,本文提出了利用熱插拔腳本實(shí)現(xiàn) USB設(shè)備自動(dòng)加載的方法,并對(duì)此方法做了詳細(xì)的說(shuō)明。最后利用熱插拔腳本實(shí)現(xiàn)Linux系統(tǒng)對(duì)U盤(pán)的自動(dòng)加載,完成對(duì)Linux驅(qū)動(dòng)程序的改進(jìn)。

    實(shí)現(xiàn) USB設(shè)備的自動(dòng)加從結(jié)果上來(lái)看,利用熱插拔腳本載,無(wú)論使用裝有Linux系統(tǒng)的PC機(jī)還是裝有 Linux系統(tǒng)的嵌入式設(shè)備,用戶在使用USB設(shè)備時(shí)都不再需要手動(dòng)加載。不僅提高工作效率,同時(shí)也避免手動(dòng)加載時(shí)輸入命令容易出錯(cuò)的問(wèn)題。

    [1]李駒光,鄭耿.基于嵌入式Linux的設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)[J].電腦編程技巧與維護(hù),2005,11(11):15-19.

    [2]Klaus Wehrle,F(xiàn)rank Pahlke.The Linux Networking Architecture:Design and Implementation of Network Protocols in the Linux Kernel[J].Prentice Hall,2004:99-104.

    [3]巍騖,張煥強(qiáng),方貴明.基于Linux的USB驅(qū)動(dòng)程序?qū)崿F(xiàn)[J].計(jì)算機(jī)應(yīng)用,2002,22(8):17-19.

    [4]鄭智.嵌入式Linux下USB驅(qū)動(dòng)程序開(kāi)發(fā)研究[J].武漢理工大學(xué)學(xué)報(bào)信息與管理工程版,2006,28(7):117-120.

    [5]Imai,Yoshiro.A Linux-based engineering education with hardware implementation,devicedrivers'programming and network literacy learning[J].ITHET 2004:463-46.

    猜你喜歡
    U盤(pán)驅(qū)動(dòng)程序腳本
    酒駕
    安奇奇與小cool 龍(第二回)
    采用U盤(pán)文件冗余方案實(shí)現(xiàn)TSP系統(tǒng)的可靠裝載
    數(shù)據(jù)庫(kù)系統(tǒng)shell腳本應(yīng)用
    快樂(lè)假期
    U盤(pán)“鬧肚子”
    一招鑒定擴(kuò)容u盤(pán)
    U盤(pán)丟失 隨貼尋物啟事
    驅(qū)動(dòng)程序更新與推薦
    驅(qū)動(dòng)程序更新與推薦
    博爱县| 玛纳斯县| 澳门| 新昌县| 柳河县| 黄平县| 乌拉特前旗| 安新县| 永春县| 太仓市| 梧州市| 汉中市| 日土县| 浪卡子县| 类乌齐县| 香格里拉县| 红桥区| 简阳市| 乌拉特中旗| 新沂市| 榆树市| 武威市| 桐乡市| 南岸区| 河间市| 伊川县| 团风县| 法库县| 仙桃市| 神木县| 黑山县| 安徽省| 保靖县| 珠海市| 同仁县| 八宿县| 内江市| 绿春县| 长顺县| 子洲县| 竹山县|