Linux系統下的硬體驅動-USB裝置

來源:互聯網
上載者:User

Linux系統下的硬體驅動-USB裝置(上)

 

 

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。

配置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存放裝置,隨身碟等用到 ;

相關模組 :

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通用支援(在某些探測隨身碟、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

 

 

Linux系統下的硬體驅動―USB裝置(下)

 

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模組也是必要的。

隨身碟和USB讀卡機

數位存放裝置現在對我們來說已經是相當普遍的了。CF卡、SD卡、Memory Stick等儲存卡已經遍及我們的身邊,通常,他們的讀卡機都是USB介面的。另外,很多MP3、數位相機也都是USB介面和電腦進行資料傳遞。更我們 的隨身碟、USB硬碟,作為移動存放裝置,已經成為我們的必須裝備。

在Linux下這些裝置通常都是以一種叫做usb-storage的方式進行驅動。要使用他們必須載入此模組

modprobe usb-storage

當然,usbcore.o 和usb-uhci.o或usb-ohci也肯定是不可缺少的。另外,若你系統中SCSI支援也是模組方式,那麼下面的模組也要載入

modprobe scsi_mod

modprobe sd_mod

在載入完這些模組後,我們插入隨身碟或儲存卡,就會發現系統中多了一個SCSI硬碟,通過正確地mount它,就可以使用了(SCSI硬碟一般為/dev/sd?,可參照文章後面的常見問題集)。

mount /dev/sda1 /mnt

Linux支援的其他USB裝置。

MODEM--(比較常見)。

網路裝置

網路攝影機--(比較常見)例如ov511;

聯機線--可以讓你的兩台電腦用USB線實現網路功能。usbnet。;

顯示器--(我沒見過) 。

遊戲杆

電視盒--(比較常見);

手寫板--(比較常見);

掃描器--(比較常見);

燒錄機--(比較常見);

印表機--(比較常見)。

注意:上面所說的每個驅動模組,並不是都要手動載入,有很多系統會在啟動或你的應用需要時自 動載入的,寫明這些模組,是便於你在不能夠使用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. 我們已經知道隨身碟在Linux中會類比為SCSI裝置去訪問,可怎麼知道它對應那個SCSI裝置呢?

方法1:推測。通常你第一次插入一個SCSI裝置,它就是sda,第二個就是sdb以此類 推。你啟動Linux插入一個隨身碟,就試試sda,換了一個就可能是sdb。這裡注意兩個特例:1) 你用的是聯想隨身碟,它可能存在兩個裝置區(一個用於加密或啟動電腦),這樣就可能一次用掉兩個sda、sdb,換個隨身碟就是sdc、sdd。2) 聯想數位電腦中,可能已經有了六合一讀卡機。它同樣也是USB存放裝置。它會佔掉一個或兩個SCSI裝置號。

方法2:看資訊。其實,只要你提前把usb-storage.o、scsi_mod.o、sd_mod.o模組載入(直接在kernel中也可以)了,在你插入和拔出隨身碟時,系統會自動打出資訊如下:

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?就是隨身碟所對應的了。若根本沒有sd裝置,就要檢查你的SCSI模組和usb-storage模組是否正確載入了。

3. 在使用隨身碟或儲存卡時,我該mount /dev/sda還是/dev/sda1呢?

這是一個曆史遺留問題。儲存卡最初尺寸很小,很多廠商在使用時,就直接使用儲存,不含有分區 表資訊。而隨著儲存卡尺寸的不斷擴大,它也就引入了類似硬碟分區的概念。例如/dev/hda你可以分成主要磁碟分割hda1、hda2擴充分區hda3,然後 把擴充分區hda3又分為邏輯分區hda5、hda6、hda7等。這樣,通常的隨身碟就被分成一個分區sda1,類似把硬碟整個分區分成一個主要磁碟分割 hda1。實際上,我們完全可以通過fdisk /dev/sda對儲存卡進行完全類似硬碟的分區方式分成sda1、sda2甚至邏輯分區sda5、sda6。實際上,對USB硬碟目前你的確需要這樣, 因為它通常都是多少G的容量。而且通常,它裡面就是筆記本硬碟。

一個好玩的問題。你在Linux下用fdisk /dev/sda 對隨身碟進行了多分區,這時候到windows下,你會發現怎麼找,怎麼格式化,隨身碟都只能找到第一個分區大小尺寸,而且使用看不出任何問題。這主要是 windows驅動對隨身碟都只支援一個分區的緣故。你是不是可以利用它來進行一些檔案的隱藏和保護?你是不是可以和某些人沒玩過Linux的人開些玩笑: 你的隨身碟容量變小了J。

現在較多的數位裝置也和windows一樣,是把所有隨身碟容量分為一個,所以在對待隨身碟的時 候,通常你mount的是sda1。但對於某些特殊的數位裝置格式化的隨身碟或儲存卡(目前我發現的是一款聯想的支援類比USB磁碟片的隨身碟和我的一個數位相 機),你就要mount /dev/sda。因為它根本就沒分區表(若mount /dev/sda1通常的效果是死掉)。其實,這些資訊,只要你注意了/proc/partitions檔案,都應該注意到的。

4. 每次插入隨身碟,都要尋找對應裝置檔案名稱,都要手動mount,我能不能做到象windows那樣插入就可以使用呢。

當然可以,不過你需要做一些工作。我這裡只提供一些資訊協助你去嘗試完成設定:Linux內 核提供了一種叫hotplug支援的東西,它可以讓你系統在PCI裝置、USB等裝置插拔時做一些事情。而automount 功能可以使你的軟碟機、光碟片等裝置的分區自動掛載和自動卸載。你甚至可以在KDE案頭中建立相應的表徵圖,方便你操作。具體設定方法就要你自己去嘗試了。反正 我使用Linux已經麻木了,不就是敲一行命令嘛。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.