USB 設備愈來愈多,而Linux在硬件配置上仍然沒有作到徹底即插即用,對於Linux怎樣配置和使用他們,也愈來愈成爲困擾咱們的一大問題。本文着力從 Linux系統下設備驅動的架構,去闡述怎樣去使用和配置以及怎樣編制USB設備驅動。對於通常用戶,可使咱們明晰Linux設備驅動方式,爲更好地配置和使用USB設備提供了方便;而對於但願開發Linux系統下USB設備驅動的程序員,提供了初步學習USB驅動架構的機會。
配置USB設備
內核中配置.
要啓用 Linux USB 支持,首先進入"USB support"節並啓用"Support for USB"選項(對應模塊爲usbcore.o)。儘管這個步驟至關直觀明瞭,但接下來的 Linux USB 設置步驟則會讓人感到糊塗。特別地,如今須要選擇用於系統的正確 USB 主控制器驅動程序。選項是"EHCI" (對應模塊爲ehci-hcd.o)、"UHCI" (對應模塊爲usb-uhci.o)、"UHCI (alternate driver)"和"OHCI" (對應模塊爲usb-ohci.o)。這是許多人對 Linux 的 USB 開始感到困惑的地方。
要理解"EHCI"及其同類是什麼,首先要知道每塊支持插入 USB 設備的主板或 PCI 卡都須要有 USB 主控制器芯片組。這個特別的芯片組與插入系統的 USB 設備進行相互操做,並負責處理容許 USB 設備與系統其它部分通訊所必需的全部低層次細節。
Linux USB 驅動程序有三種不一樣的 USB 主控制器選項是由於在主板和 PCI 卡上有三種不一樣類型的 USB 芯片。"EHCI"驅動程序設計成爲實現新的高速 USB 2.0 協議的芯片提供支持。"OHCI"驅動程序用來爲非 PC 系統上的(以及帶有 SiS 和 ALi 芯片組的 PC 主板上的)USB 芯片提供支持。"UHCI"驅動程序用來爲大多數其它 PC 主板(包括 Intel 和 Via)上的 USB 實現提供支持。只需選擇與但願啓用的 USB 支持的類型對應的"?HCI"驅動程序便可。若有疑惑,爲保險起見,能夠啓用"EHCI"、"UHCI" (二者中任選一種,它們之間沒有明顯的區別)和"OHCI"。( 趙明注:根據文檔,EHCI已經包含了UHCI和OHCI,但目前就我我的的測試,單獨加EHCI是不行的,一般個人作法是根據主板類型加載UHCI或OHCI後,再加載EHCI這樣才能夠支持USB2.0設備)。
啓用了"USB support"和適當的"?HCI"USB 主控制器驅動程序後,使 USB 啓動並運行只需再進行幾個步驟。應該啓用"Preliminary USB device filesystem",而後確保啓用全部特定於將與 Linux 一塊兒使用的實際 USB 外圍設備的驅動程序。例如,爲了啓用對 USB 遊戲控制器的支持,我啓用了"USB Human Interface Device (full HID) support"。我還啓用了主"Input core support" 節下的"Input core support"和"Joystick support"。
一旦用新的已啓用 USB 的內核從新引導後,若/proc/bus/usb下沒有相應USB設備信息,應輸入如下命令將 USB 設備文件系統手動掛裝到 /proc/bus/usb:
# mount -t usbdevfs none /proc/bus/usb
爲了在系統引導時自動掛裝 USB 設備文件系統,請將下面一行添加到 /etc/fstab 中的 /proc 掛裝行以後:
none /proc/bus/usb usbdevfs defaults 0 0
模塊的配置方法.
在不少時候,咱們的USB設備驅動並不包含在內核中。其實咱們只要根據它所須要使用的模塊,逐一加載。就可使它啓做用。
首先要確保在內核編譯時以模塊方式選擇了相應支持。這樣咱們就應該能夠在/lib/modules/2.4.XX目錄看到相應.o文件。在加載模塊時,咱們只須要運行modprobe xxx.o就能夠了(modprobe主要加載系統已經經過depmod登記過的模塊,insmod通常是針對具體.o文件進行加載)
對應USB設備下面一些模塊是關鍵的。
usbcore.o 要支持usb所須要的最基礎模塊
usb-uhci.o (已經提過)
usb-ohci.o (已經提過)
uhci.o 另外一個uhci驅動程序,我也不知道有什麼用,通常不要加載,會死機的
ehci-hcd.o (已經提過 usb2.0)
hid.o USB人機界面設備,像鼠標呀、鍵盤呀都須要
usb-storage.o USB存儲設備,U盤等用到
相關模塊
ide-disk.o IDE硬盤
ide-scsi.o 把IDE設備模擬SCSI接口
scsi_mod.o SCSI支持
注意kernel config其中一項:
Probe all LUNs on each SCSI device
最好選上,要不某些同時支持多個口的讀卡器只能顯示一個。若模塊方式就要帶參數安裝或提早在/etc/modules.conf中加入如下項,來支持多個LUN。
add options scsi_mod max_scsi_luns=9
sd_mod.o SCSI硬盤
sr_mod.o SCSI光盤
sg.o SCSI通用支持(在某些探測U盤、SCSI探測中會用到)
常見USB設備及其配置
在Linux 2.4的內核中已經支持不下20種設備。它支持幾乎全部的通用設備如鍵盤、鼠標、modem、打印機等,並不斷地添加廠商新的設備象數碼相機、MP三、網卡等。下面就是幾個最多見設備的介紹和使用方法:
USB鼠標:
鍵盤和鼠標屬於低速的輸入設備,對於已經爲用戶承認的PS/2接口,USB鍵盤和USB鼠標彷佛並無太多更優越的地方。如今的大部分鼠標採用了PS/2接口,不過USB接口的鼠標也愈來愈多,二者相比,各有優點:通常來講,USB的鼠標接口的帶寬大於PS/2鼠標,也就是說在一樣的時間內,USB鼠標掃描次數就要多於PS/2鼠標,這樣在定位上USB鼠標就更爲精確;同時USB接口鼠標的默認採樣率也比較高,達到125HZ,而PS/2接口的鼠標僅有 40HZ(Windows 9x/Me)或是60HZ(Windows NT/2000)。
對於USB設備你固然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
USB鼠標爲了使其正常工做,您必須先插入模塊usbmouse.o和mousedev.o
modprobe usbmouse
modprobe mousedev
若你把HID input layer支持和input core 支持也做爲模塊方式安裝,那麼啓動hid模塊和input模塊也是必要的。
modprobe hid
modprobe input
USB鍵盤:
通常的,咱們如今使用的鍵盤大可能是PS/2的,USB鍵盤還比較少見,可是下來的發展,鍵盤將向USB接口靠攏。使用USB鍵盤基本上沒有太多的要求,只需在主板的BIOS設定對USB鍵盤的支持,就能夠在各系統中徹底無障礙的使用,並且更能夠真正作到在即插即用和熱插拔使用,並能提供兩個USB鏈接埠:讓您能夠輕易地直接將具備USB接頭的裝置接在您的鍵盤上,而非計算機的後面。
一樣你固然必須先插入相應的USB控制器模塊:usb-uhci.o或usb-ohci.o
modprobe usb-uhci
而後您還必須插入鍵盤模塊usbkbd.o,以及keybdev.o,這樣usb鍵盤纔可以正常工做。此時,運行的系統命令:
modprobe usbkbd
modprobe keybdev
一樣若你把HID input layer支持和input core 支持也做爲模塊方式安裝,那麼啓動hid模塊和input模塊也是必要的。
U盤和USB讀卡器:
數碼存儲設備如今對咱們來講已是至關廣泛的了。CF卡、SD卡、Memory Stick等存儲卡已經遍佈咱們的身邊,一般,他們的讀卡器都是USB接口的。另外,不少MP三、數碼相機也都是USB接口和計算機進行數據傳遞。更咱們的U盤、USB硬盤,做爲移動存儲設備,已經成爲咱們的必須裝備。
在Linux下這些設備一般都是以一種叫作usb-storage的方式進行驅動。要使用他們必須加載此模塊
modprobe usb-storage
固然,usbcore.o 和usb-uhci.o或usb-ohci也確定是不可缺乏的。另外,若你係統中SCSI支持也是模塊方式,那麼下面的模塊也要加載
modprobe scsi_mod
modprobe sd_mod
在加載完這些模塊後,咱們插入U盤或存儲卡,就會發現系統中多了一個SCSI硬盤,經過正確地mount它,就可使用了(SCSI硬盤通常爲/dev/sd?,可參照文章後面的常見問題解答)。
mount /dev/sda1 /mnt
Linux支持的其餘USB設備。
MODEM--(比較常見)
網絡設備
攝像頭--(比較常見)例如ov511.o
聯機線--可讓你的兩臺電腦用USB線實現網絡功能。usbnet.o
顯示器--(我沒見過)
遊戲杆
電視盒--(比較常見)
手寫板--(比較常見)
掃描儀--(比較常見)
刻錄機--(比較常見)
打印機--(比較常見)
注意:
上面所說的每一個驅動模塊,並非都要手動加載,有不少系統會在啓動或你的應用須要時自動加載的,寫明這些模塊,是便於你在不可以使用USB設備時,能夠自行檢查。只要用lsmod確保以上模塊已經被系統加載,你的設備就應該能夠正常工做了。固然注意有些模塊已經之內核方式在kernel啓動時存在了(這些模塊文件在/lib/modules/2.4.XX中是找不到的)。
最常碰見的USB問題
1. 有USB設備的系統安裝完redhat 7.3啓動死機問題
有USB 設備,當你剛裝完redhat 7.3第一次啓動時,總會死掉。主要緣由是Linux在安裝時探測到有usb-uhci和ehci-hcd兩個控制器,但在啓動時,加載完usb- uhci再加載ehci-hcd就會有衝突。分析認爲redhat7.3系統內核在支持USB2.0標準上存在問題。在其餘版本的Linux中均不存在此問題。
解決辦法:在lilo或grub啓動時用命令行傳遞參數init=/sbin/init。這樣在啓動後就不運行其餘服務而直接啓動shell。而後運行
mount -o remount,rw / 使/ 可寫,init直接啓動的系統默認只mount /爲只讀
而後vi /etc/modules.config文件
刪除alias usb-controller1 ehci-hcd一行。或前面加#註釋掉
而後mount -o remount,ro / 使/ 只讀,避免直接關機破壞文件系統
而後就能夠按Ctrl-Alt-Delete直接重啓了
或許,你有更簡單的辦法:換USB鍵盤和鼠標爲PS2接口,啓動後修改/etc/modules.config文件。
2. 咱們已經知道U盤在Linux中會模擬爲SCSI設備去訪問,可怎麼知道它對應那個SCSI設備呢?
方法1:推測。一般你第一次插入一個SCSI設備,它就是sda,第二個就是sdb以此類推。你啓動Linux插入一個U盤,就試試sda,換了一個就多是sdb。這裏注意兩個特例:1)你用的是聯想U盤,它可能存在兩個設備區(一個用於加密或啓動電腦),這樣就可能一次用掉兩個sda、sdb,換個U盤就是sdc、sdd。2)聯想數碼電腦中,可能已經有了六合一讀卡器。它一樣也是USB存儲設備。它會佔掉一個或兩個SCSI設備號。
方法2:看信息。其實,只要你提早把usb-storage.o、scsi_mod.o、sd_mod.o模塊加載(直接在kernel中也能夠)了,在你插入和拔出U盤時,系統會自動打出信息以下:
SCSI device sda: 60928 512-byte hdwr sectors ( 31 MB )
sda: Write Protect is on
根據此信息,你就知道它在sda上了。固然,可能你的系統信息級別比較高,上述信息可能沒有打出,這時候你只要tail /var/log/messages就能夠看到了。
方法3:一樣,cat /proc/partitions也能夠看到分區信息,其中sd?就是U盤所對應的了。若根本沒有sd設備,就要檢查你的SCSI模塊和usb-storage模塊是否正確加載了。
3. 在使用U盤或存儲卡時,我該mount /dev/sda仍是/dev/sda1呢?
這是一個歷史遺留問題。存儲卡最初尺寸很小,不少廠商在使用時,就直接使用存儲,不含有分區表信息。而隨着存儲卡尺寸的不斷擴大,它也就引入了相似硬盤分區的概念。例如/dev/hda你能夠分紅主分區hda一、hda2擴展分區hda3,而後把擴展分區hda3又分爲邏輯分區hda五、hda六、hda7 等。這樣,一般的U盤就被分紅一個分區sda1,相似把硬盤整個分區分紅一個主分區hda1。實際上,咱們徹底能夠經過fdisk /dev/sda對存儲卡進行徹底相似硬盤的分區方式分紅sda一、sda2甚至邏輯分區sda五、sda6。實際上,對USB硬盤目前你的確須要這樣,由於它一般都是多少G的容量。並且一般,它裏面就是筆記本硬盤。
一個好玩的問題。你在Linux下用fdisk /dev/sda 對U盤進行了多分區,這時候到windows下,你會發現怎麼找,怎麼格式化,U盤都只能找到第一個分區大小尺寸,並且使用看不出任何問題。這主要是 windows驅動對U盤都只支持一個分區的緣故。你是否是能夠利用它來進行一些文件的隱藏和保護?你是否是能夠和某些人沒玩過Linux的人開些玩笑:你的U盤容量變小了J。
如今較多的數碼設備也和windows同樣,是把全部U盤容量分爲一個,因此在對待U盤的時候,一般你mount的是sda1。但對於某些特殊的數碼設備格式化的U盤或存儲卡(目前我發現的是一款聯想的支持模擬USB軟盤的U盤和個人一個數碼相機),你就要mount /dev/sda。由於它根本就沒分區表(若mount /dev/sda1一般的效果是死掉)。其實,這些信息,只要你注意了/proc/partitions文件,都應該注意到的。
4. 每次插入U盤,都要尋找對應設備文件名,都要手動mount,我能不能作到象windows那樣插入就可使用呢。
固然能夠,不過你須要作一些工做。我這裏只提供一些信息幫助你去嘗試完成設置:Linux內核提供了一種叫hotplug支持的東西,它可讓你係統在 PCI設備、USB等設備插拔時作一些事情。而automount 功能可使你的軟驅、光盤等設備的分區自動掛載和自動卸載。你甚至能夠在KDE桌面中建立相應的圖標,方便你操做。具體設置方法就要你本身去嘗試了。反正我使用Linux已經麻木了,不就是敲一行命令嘛。
前言
USB 是英文"Universal Serial Bus"的縮寫,意爲"通用串行總線"。是由Compaq(康柏)、DEC、IBM、Intel、NEC、微軟以及Northern Telecom(北方電訊)等公司於1994年11月共同提出的,主要目的就是爲了解決接口標準太多的弊端。USB使用一個4針插頭做爲標準插頭,並經過這個標準接頭,採用菊花瓣形式把全部外設鏈接起來,它採用串行方式傳輸數據,目前最大數據傳輸率爲12Mbps, 支持多數據流和多個設備並行操做,容許外設熱插拔。
目前USB接口雖然只發展了2代(USB1.0/1.1,USB2.0),可是USB綜合了一個多平臺標準的全部優勢 -- 包括下降成本,增長兼容性,可鏈接大量的外部設備,融合先進的功能和品質。使其逐步成爲PC接口標準,進入了高速發展期。
那麼對於使用Linux系統,正確支持和配置常見的USB設備,就是其使用必不可少的關鍵一步。
相關技術基礎
模塊(驅動程序) 模塊(module)是在內核空間運行的程序,其實是一種目標對象文件,沒有連接,不能獨立運行,可是能夠裝載到系統中做爲內核的一部分運行,從而能夠動態擴充內核的功能。模塊最主要的用處就是用來實現設備驅動程序。 Linux下對於一個硬件的驅動,能夠有兩種方式:直接加載到內核代碼中,啓動內核時就會驅動此硬件設備。另外一種就是以模塊方式,編譯生成一個.o文件。當應用程序須要時再加載進內核空間運行。因此咱們所說的一個硬件的驅動程序,一般指的就是一個驅動模塊。 設備文件 對於一個設備,它能夠在/dev下面存在一個對應的邏輯設備節點,這個節點以文件的形式存在,但它不是普通意義上的文件,它是設備文件,更確切的說,它是設備節點。這個節點是經過mknod命令創建的,其中指定了主設備號和次設備號。主設備號代表了某一類設備,通常對應着肯定的驅動程序;次設備號通常是區分不一樣屬性,例如不一樣的使用方法,不一樣的位置,不一樣的操做。這個設備號是從/proc/devices文件中得到的,因此通常是先有驅動程序在內核中,纔有設備節點在目錄中。這個設備號(特指主設備號)的主要做用,就是聲明設備所使用的驅動程序。驅動程序和設備號是一一對應的,當你打開一個設備文件時,操做系統就已經知道這個設備所對應的驅動程序。 SCSI 設備 SCSI 是有別於IDE的一個計算機標準接口。如今大部分平板式掃描儀、CD-R刻錄機、MO光磁盤機等漸漸趨向使用SCSI接口,加之SCSI又能提供一個高速傳送通道,因此,接觸到SCSI設備的用戶會愈來愈多。Linux支持不少種的SCSI設備,例如:SCSI硬盤、SCSI光驅、SCSI磁帶機。更重要的是,Linux提供了IDE設備對SCSI的模擬(ide-scsi.o模塊),咱們一般會就把IDE光驅模擬爲SCSI光驅進行訪問。由於在 Linux中不少軟件都只能操做SCSI光驅。例如大多數刻錄軟件、一些媒體播放軟件。一般咱們的USB存儲設備,也模擬爲SCSI硬盤而進行訪問。 Linux硬件驅動架構 對於一個硬件,Linux是這樣來進行驅動的:首先,咱們必須提供一個.o的驅動模塊文件(這裏咱們只說明模塊方式,其實內核方式是相似的)。咱們要使用這個驅動程序,首先要加載運行它(insmod *.o)。這樣驅動就會根據本身的類型(字符設備類型或塊設備類型,例如鼠標就是字符設備而硬盤就是塊設備)向系統註冊,註冊成功系統會反饋一個主設備號,這個主設備號就是系統對它的惟一標識(例如硬盤塊設備在/proc/devices中顯示的主設備號爲3 ,咱們用ls -l /dev/had看到的主設備就確定是3)。驅動就是根據此主設備號來建立一個通常放置在/dev目錄下的設備文件(mknod命令用來建立它,它必須用主設備號這個參數)。在咱們要訪問此硬件時,就能夠對設備文件經過open、read、write等命令進行。而驅動就會接收到相應的read、 write操做而根據本身的模塊中的相應函數進行了。 其中還有幾個比較有關係的東西:一個是 /lib/modules/2.4.XX目錄,它下面就是針對當前內核版本的模塊。只要你的模塊依賴關係正確(能夠經過depmod設置),你就能夠經過 modprobe 命令加載而不須要知道具體模塊文件位置。另外一個是/etc/modules.conf文件,它定義了一些經常使用設備的別名。系統就能夠在須要此設備支持時,正確尋找驅動模塊。例如alias eth0 e100,就表明第一塊網卡的驅動模塊爲e100.o。