歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux管理 >> Linux維護 >> Linux下USB設備的原理、配置、常見問題

Linux下USB設備的原理、配置、常見問題

日期:2017/3/2 10:42:58   编辑:Linux維護

  USB設備越來越多,而Linux在硬件配置上仍然沒有做到完全即插即用,對於Linux怎樣配置和使用他們,也越來越成為困擾我們的一大問題。本文著力從Linux系統下設備驅動的架構,去闡述怎樣去使用和配置以及怎樣編制USB設備驅動。對於一般用戶,可以使我們明晰Linux設備驅動方式,為更好地配置和使用USB設備提供了方便;而對於希望開發Linux系統下USB設備驅動的程序員,提供了初步學習USB驅動架構的機會。

  前言

  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。他們的關系圖如下:

  配置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、打印機等,並不斷地添加廠商新的設備象數碼相機、MP3、網卡等。下面就是幾個最常見設備的介紹和使用方法: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接口的。另外,很多MP3、數碼相機也都是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

  顯示器--(我沒見過)

Copyright © Linux教程網 All Rights Reserved