聯(lián)想軟件設計中心嵌入式研發(fā)處系統設計工程師 USB設備越來(lái)越多,而Linux在硬件配置上仍然沒(méi)有做到完全即插即用,對于Linux怎樣配置和使用他們,也越來(lái)越成為困擾我們的一大問(wèn)題。本文著(zhù)力從Linux系統下設備驅動(dòng)的架構,去闡述怎樣去使用和配置以及怎樣編制USB設備驅動(dòng)。對于一般用戶(hù),可以使我們明晰Linux設備驅動(dòng)方式,為更好地配置和使用USB設備提供了方便;而對于希望開(kāi)發(fā)Linux系統下USB設備驅動(dòng)的程序員,提供了初步學(xué)習USB驅動(dòng)架構的機會(huì )。 前言 目前USB接口雖然只發(fā)展了2代(USB1.0/1.1,USB2.0),但是USB綜合了一個(gè)多平臺標準的所有優(yōu)點(diǎn) -- 包括降低成本,增加兼容性,可連接大量的外部設備,融合先進(jìn)的功能和品質(zhì)。使其逐步成為PC接口標準,進(jìn)入了高速發(fā)展期。 那么對于使用Linux系統,正確支持和配置常見(jiàn)的USB設備,就是其使用必不可少的關(guān)鍵一步。 相關(guān)技術(shù)基礎 模塊(module)是在內核空間運行的程序,實(shí)際上是一種目標對象文件,沒(méi)有鏈接,不能獨立運行,但是可以裝載到系統中作為內核的一部分運行,從而可以動(dòng)態(tài)擴充內核的功能。模塊最主要的用處就是用來(lái)實(shí)現設備驅動(dòng)程序。 Linux下對于一個(gè)硬件的驅動(dòng),可以有兩種方式:直接加載到內核代碼中,啟動(dòng)內核時(shí)就會(huì )驅動(dòng)此硬件設備。另一種就是以模塊方式,編譯生成一個(gè).o文件。當應用程序需要時(shí)再加載進(jìn)內核空間運行。所以我們所說(shuō)的一個(gè)硬件的驅動(dòng)程序,通常指的就是一個(gè)驅動(dòng)模塊。 設備文件 對于一個(gè)設備,它可以在/dev下面存在一個(gè)對應的邏輯設備節點(diǎn),這個(gè)節點(diǎn)以文件的形式存在,但它不是普通意義上的文件,它是設備文件,更確切的說(shuō),它是設備節點(diǎn)。這個(gè)節點(diǎn)是通過(guò)mknod命令建立的,其中指定了主設備號和次設備號。主設備號表明了某一類(lèi)設備,一般對應著(zhù)確定的驅動(dòng)程序;次設備號一般是區分不同屬性,例如不同的使用方法,不同的位置,不同的操作。這個(gè)設備號是從/proc/devices文件中獲得的,所以一般是先有驅動(dòng)程序在內核中,才有設備節點(diǎn)在目錄中。這個(gè)設備號(特指主設備號)的主要作用,就是聲明設備所使用的驅動(dòng)程序。驅動(dòng)程序和設備號是一一對應的,當你打開(kāi)一個(gè)設備文件時(shí),操作系統就已經(jīng)知道這個(gè)設備所對應的驅動(dòng)程序。 SCSI 設備 SCSI是有別于IDE的一個(gè)計算機標準接口?,F在大部分平板式掃描儀、CD-R刻錄機、MO光磁盤(pán)機等漸漸趨向使用SCSI接口,加之SCSI又能提供一個(gè)高速傳送通道,所以,接觸到SCSI設備的用戶(hù)會(huì )越來(lái)越多。Linux支持很多種的SCSI設備,例如:SCSI硬盤(pán)、SCSI光驅、SCSI磁帶機。更重要的是,Linux提供了IDE設備對SCSI的模擬(ide-scsi.o模塊),我們通常會(huì )就把IDE光驅模擬為SCSI光驅進(jìn)行訪(fǎng)問(wèn)。因為在Linux中很多軟件都只能操作SCSI光驅。例如大多數刻錄軟件、一些媒體播放軟件。通常我們的USB存儲設備,也模擬為SCSI硬盤(pán)而進(jìn)行訪(fǎng)問(wèn)。 Linux硬件驅動(dòng)架構 對于一個(gè)硬件,Linux是這樣來(lái)進(jìn)行驅動(dòng)的:首先,我們必須提供一個(gè).o的驅動(dòng)模塊文件(這里我們只說(shuō)明模塊方式,其實(shí)內核方式是類(lèi)似的)。我們要使用這個(gè)驅動(dòng)程序,首先要加載運行它(insmod *.o)。這樣驅動(dòng)就會(huì )根據自己的類(lèi)型(字符設備類(lèi)型或塊設備類(lèi)型,例如鼠標就是字符設備而硬盤(pán)就是塊設備)向系統注冊,注冊成功系統會(huì )反饋一個(gè)主設備號,這個(gè)主設備號就是系統對它的唯一標識(例如硬盤(pán)塊設備在/proc/devices中顯示的主設備號為3 ,我們用ls -l /dev/had看到的主設備就肯定是3)。驅動(dòng)就是根據此主設備號來(lái)創(chuàng )建一個(gè)一般放置在/dev目錄下的設備文件(mknod命令用來(lái)創(chuàng )建它,它必須用主設備號這個(gè)參數)。在我們要訪(fǎng)問(wèn)此硬件時(shí),就可以對設備文件通過(guò)open、read、write等命令進(jìn)行。而驅動(dòng)就會(huì )接收到相應的read、write操作而根據自己的模塊中的相應函數進(jìn)行了。 其中還有幾個(gè)比較有關(guān)系的東西:一個(gè)是/lib/modules/2.4.XX目錄,它下面就是針對當前內核版本的模塊。只要你的模塊依賴(lài)關(guān)系正確(可以通過(guò)depmod設置),你就可以通過(guò)modprobe 命令加載而不需要知道具體模塊文件位置。 另一個(gè)是/etc/modules.conf文件,它定義了一些常用設備的別名。系統就可以在需要此設備支持時(shí),正確尋找驅動(dòng)模塊。例如alias eth0 e100,就代表第一塊網(wǎng)卡的驅動(dòng)模塊為e100.o。他們的關(guān)系圖如下: ![]() 配置USB設備 要啟用 Linux USB 支持,首先進(jìn)入"USB support"節并啟用"Support for USB"選項(對應模塊為usbcore.o)。盡管這個(gè)步驟相當直觀(guān)明了,但接下來(lái)的 Linux USB 設置步驟則會(huì )讓人感到糊涂。特別地,現在需要選擇用于系統的正確 USB 主控制器驅動(dòng)程序。選項是"EHCI" (對應模塊為ehci-hcd.o)、"UHCI" (對應模塊為usb-uhci.o)、"UHCI (alternate driver)"和"OHCI" (對應模塊為usb-ohci.o)。這是許多人對 Linux 的 USB 開(kāi)始感到困惑的地方。 要理解"EHCI"及其同類(lèi)是什么,首先要知道每塊支持插入 USB 設備的主板或 PCI 卡都需要有 USB 主控制器芯片組。這個(gè)特別的芯片組與插入系統的 USB 設備進(jìn)行相互操作,并負責處理允許 USB 設備與系統其它部分通信所必需的所有低層次細節。 Linux USB 驅動(dòng)程序有三種不同的 USB 主控制器選項是因為在主板和 PCI 卡上有三種不同類(lèi)型的 USB 芯片。"EHCI"驅動(dòng)程序設計成為實(shí)現新的高速 USB 2.0 協(xié)議的芯片提供支持。"OHCI"驅動(dòng)程序用來(lái)為非 PC 系統上的(以及帶有 SiS 和 ALi 芯片組的 PC 主板上的)USB 芯片提供支持。"UHCI"驅動(dòng)程序用來(lái)為大多數其它 PC 主板(包括 Intel 和 Via)上的 USB 實(shí)現提供支持。只需選擇與希望啟用的 USB 支持的類(lèi)型對應的"?HCI"驅動(dòng)程序即可。如有疑惑,為保險起見(jiàn),可以啟用"EHCI"、"UHCI" (兩者中任選一種,它們之間沒(méi)有明顯的區別)和"OHCI"。( 趙明注:根據文檔,EHCI已經(jīng)包含了UHCI和OHCI,但目前就我個(gè)人的測試,單獨加EHCI是不行的,通常我的做法是根據主板類(lèi)型加載UHCI或OHCI后,再加載EHCI這樣才可以支持USB2.0設備)。 啟用了"USB support"和適當的"?HCI"USB 主控制器驅動(dòng)程序后,使 USB 啟動(dòng)并運行只需再進(jìn)行幾個(gè)步驟。應該啟用"Preliminary USB device filesystem",然后確保啟用所有特定于將與 Linux 一起使用的實(shí)際 USB 外圍設備的驅動(dòng)程序。例如,為了啟用對 USB 游戲控制器的支持,我啟用了"USB Human Interface Device (full HID) support"。我還啟用了主"Input core support" 節下的"Input core support"和"Joystick support"。 一旦用新的已啟用 USB 的內核重新引導后,若/proc/bus/usb下沒(méi)有相應USB設備信息,應輸入以下命令將 USB 設備文件系統手動(dòng)掛裝到 /proc/bus/usb:
為了在系統引導時(shí)自動(dòng)掛裝 USB 設備文件系統,請將下面一行添加到 /etc/fstab 中的 /proc 掛裝行之后:
模塊的配置方法. 在很多時(shí)候,我們的USB設備驅動(dòng)并不包含在內核中。其實(shí)我們只要根據它所需要使用的模塊,逐一加載。就可以使它啟作用。 首先要確保在內核編譯時(shí)以模塊方式選擇了相應支持。這樣我們就應該可以在/lib/modules/2.4.XX目錄看到相應.o文件。在加載模塊時(shí),我們只需要運行modprobe xxx.o就可以了(modprobe主要加載系統已經(jīng)通過(guò)depmod登記過(guò)的模塊,insmod一般是針對具體.o文件進(jìn)行加載) 對應USB設備下面一些模塊是關(guān)鍵的。
相關(guān)模塊
注意kernel config其中一項:
最好選上,要不某些同時(shí)支持多個(gè)口的讀卡器只能顯示一個(gè)。若模塊方式就要帶參數安裝或提前在/etc/modules.conf中加入以下項,來(lái)支持多個(gè)LUN。
常見(jiàn)USB設備及其配置 在Linux 2.4的內核中已經(jīng)支持不下20種設備。它支持幾乎所有的通用設備如鍵盤(pán)、鼠標、modem、打印機等,并不斷地添加廠(chǎng)商新的設備象數碼相機、MP3、網(wǎng)卡等。下面就是幾個(gè)最常見(jiàn)設備的介紹和使用方法: USB鼠標: 鍵盤(pán)和鼠標屬于低速的輸入設備,對于已經(jīng)為用戶(hù)認可的PS/2接口,USB鍵盤(pán)和USB鼠標似乎并沒(méi)有太多更優(yōu)越的地方?,F在的大部分鼠標采用了PS/2接口,不過(guò)USB接口的鼠標也越來(lái)越多,兩者相比,各有優(yōu)勢:一般來(lái)說(shuō),USB的鼠標接口的帶寬大于PS/2鼠標,也就是說(shuō)在同樣的時(shí)間內,USB鼠標掃描次數就要多于PS/2鼠標,這樣在定位上USB鼠標就更為精確;同時(shí)USB接口鼠標的默認采樣率也比較高,達到125HZ,而PS/2接口的鼠標僅有40HZ(Windows 9x/Me)或是60HZ(Windows NT/2000)。 對于USB設備你當然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
USB鼠標為了使其正常工作,您必須先插入模塊usbmouse.o和mousedev.o
若你把HID input layer支持和input core 支持也作為模塊方式安裝,那么啟動(dòng)hid模塊和input模塊也是必要的。
USB鍵盤(pán): 一般的,我們現在使用的鍵盤(pán)大多是PS/2的,USB鍵盤(pán)還比較少見(jiàn),但是下來(lái)的發(fā)展,鍵盤(pán)將向USB接口靠攏。使用USB鍵盤(pán)基本上沒(méi)有太多的要求,只需在主板的BIOS設定對USB鍵盤(pán)的支持,就可以在各系統中完全無(wú)障礙的使用,而且更可以真正做到在即插即用和熱插拔使用,并能提供兩個(gè)USB連接埠:讓您可以輕易地直接將具有USB接頭的裝置接在您的鍵盤(pán)上,而非計算機的后面。 同樣你當然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
然后您還必須插入鍵盤(pán)模塊usbkbd.o,以及keybdev.o,這樣usb鍵盤(pán)才能夠正常工作。此時(shí),運行的系統命令:
同樣若你把HID input layer支持和input core 支持也作為模塊方式安裝,那么啟動(dòng)hid模塊和input模塊也是必要的。 U盤(pán)和USB讀卡器: 數碼存儲設備現在對我們來(lái)說(shuō)已經(jīng)是相當普遍的了。CF卡、SD卡、Memory Stick等存儲卡已經(jīng)遍及我們的身邊,通常,他們的讀卡器都是USB接口的。另外,很多MP3、數碼相機也都是USB接口和計算機進(jìn)行數據傳遞。更我們的U盤(pán)、USB硬盤(pán),作為移動(dòng)存儲設備,已經(jīng)成為我們的必須裝備。 在Linux下這些設備通常都是以一種叫做usb-storage的方式進(jìn)行驅動(dòng)。要使用他們必須加載此模塊
當然,usbcore.o 和usb-uhci.o或usb-ohci也肯定是不可缺少的。另外,若你系統中SCSI支持也是模塊方式,那么下面的模塊也要加載
在加載完這些模塊后,我們插入U盤(pán)或存儲卡,就會(huì )發(fā)現系統中多了一個(gè)SCSI硬盤(pán),通過(guò)正確地mount它,就可以使用了(SCSI硬盤(pán)一般為/dev/sd?,可參照文章后面的常見(jiàn)問(wèn)題解答)。
Linux支持的其他USB設備。 MODEM--(比較常見(jiàn))網(wǎng)絡(luò )設備 攝像頭--(比較常見(jiàn))例如ov511.o 聯(lián)機線(xiàn)--可以讓你的兩臺電腦用USB線(xiàn)實(shí)現網(wǎng)絡(luò )功能。usbnet.o 顯示器--(我沒(méi)見(jiàn)過(guò)) 游戲桿 電視盒--(比較常見(jiàn)) 手寫(xiě)板--(比較常見(jiàn)) 掃描儀--(比較常見(jiàn)) 刻錄機--(比較常見(jiàn)) 打印機--(比較常見(jiàn)) 注意:上面所說(shuō)的每個(gè)驅動(dòng)模塊,并不是都要手動(dòng)加載,有很多系統會(huì )在啟動(dòng)或你的應用需要時(shí)自動(dòng)加載的,寫(xiě)明這些模塊,是便于你在不能夠使用USB設備時(shí),可以自行檢查。只要用lsmod確保以上模塊已經(jīng)被系統加載,你的設備就應該可以正常工作了。當然注意有些模塊已經(jīng)以?xún)群朔绞皆趉ernel啟動(dòng)時(shí)存在了(這些模塊文件在/lib/modules/2.4.XX中是找不到的)。
|
聯(lián)系客服