1. 程式人生 > >5. 嵌入式linux驅動-linux裝置分類

5. 嵌入式linux驅動-linux裝置分類

1. Linux裝置分類

  Linux 系統中的裝置可以分為字元裝置、塊裝置和網路裝置這3 類。 字元裝置:字元裝置是能夠像位元組流一樣被訪問的裝置,當對字元裝置發出讀寫請求,相應的I/O 操作立即發生。Linux 系統中很多裝置都是字元裝置,如字元終端、串列埠、鍵盤、滑鼠等。在嵌入式Linux 開發中,接觸最多的就是字元裝置以及驅動。 塊裝置:塊裝置是Linux 系統中進行I/O 操作時必須以塊為單位進行訪問的裝置,塊裝置能夠安裝檔案系統。塊裝置驅動會利用一塊系統記憶體作為緩衝區,因此對塊裝置發出讀寫訪問,並不一定立即產生硬體I/O 操作。Linux 系統中常見的塊裝置有如硬碟、軟碟機等等。 網路裝置

:網路裝置既可以是網絡卡這樣的硬體裝置,也可以是一個純軟體裝置如迴環裝置。網路裝置由Linux的網路子系統驅動,負責資料包的傳送和接收,而不是面向流裝置,因此在Linux系統檔案系統中網路裝置沒有節點。對網路裝置的訪問是通過socket呼叫產生,而不是普通的檔案操作如open/close 和read/write 等。

2. 裝置編號

  裝置編號由主和從構成。在Linux核心中,使用dev_t型別來儲存裝置編號。在 2.62.6 版本的linux 核心中, dev_t是一個 32 位數,高 12 位是主裝置號,低 20位是次裝置號。   主裝置號標識對應的驅動程式,告訴Linux核心使用哪個驅動程式該裝置。如果多個裝置使用同一驅動程式,則它們擁有相的主號。例如/dev/ttyS0~3這 4個裝置,擁有相同的主裝置號4,說明它們使用同一份驅動:

$ ls -l /dev/ttyS* 
crw-rw----  1  root  dialout  4, 64  2001-01-07 17:48  /dev/ttyS0
crw-rw----  1  root  dialout  4, 65  2001-01-07 17:48  /dev/ttyS1
crw-rw----  1  root  dialout  4, 66  2001-01-07 17:48  /dev/ttyS2
crw-rw----  1  root  dialout  4, 67  2001-01-07 17:48  /dev/ttyS3

  主裝置號由系統來維護,儘管儘管Linux2.6可以容納大量的 裝置,但是在使用主裝置號時候, 注意一定不要使用系統已經使用的主裝置號。當前運系統佔了哪些主裝置號通過/proc/devices檔案檢視。

# cat /proc/devices
Character devices: 
1 mem
4 /dev/vc/0
5 /dev/tty
5 /dev/console 
7 vcs
10 misc
13 input
14 sound
29 fb
90 mtd
116 alsa
180 usb
189 usb_devi
252 usbmon
253 ubi0
254 rtc
Block devices: 
7 loop
31 mtdblock
65 sd
67 sd
68 sd
69 sd
70 sd
71 sd 
128 sd
129 sd
130 sd
131 sd 
132 sd 
133 sd
134 sd
135 sd

  從裝置號也稱次,用於確定該檔案所指的。如果一個驅動可以驅動一組相似的裝置,此時就需要依賴於次裝置號對這些外進行區分。 動一組相似的裝置,此時就需要依賴於次號對這些外進行區分。 動一組相似的裝置,此時就需要依賴於次號對這些外進行區分。   獲取一個裝置的編號,應當使用<linux/kdev_t.h>中定義的 巨集,而不應當對裝置號位數和表述結構做任何假設,因為這樣會導致不相容以前的核心或者未來版本備號和表述方式發生變化。例如獲取一個裝置 和表述方式發生變化。例如獲取一個裝置 和表述方式發生變化。例如獲取一個裝置 和表述方式發生變化。例如獲取一個裝置 和表述方式發生變化。例如獲取一個裝置 和表述方式發生變化。例如獲取一個裝置 dev 的主次裝置號,可用:

MAJOR(dev_t dev); 
MINOR(dev_t dev);

  如果已知一個裝置的主次號,要轉換成 dev_t 型別的裝置編號,則應當使用:

MKDEV(int major, minor);

3. 裝置節點

  裝置(包括硬體裝置)在Linux 系統下,表現為裝置節點,也稱裝置檔案。裝置檔案是一種特殊的檔案,它們儲存在檔案系統中(通常在/dev 目錄下),但它們僅佔用檔案目錄項而不涉及儲存資料。事實上,它們僅僅記錄了其所屬的裝置類別、主裝置號和從裝置號等設 備相關資訊。   來看兩個典型的裝置檔案的詳細資訊:

$ ls -l /dev/ttyS0 /dev/sda1
brw-rw---- 1 root disk    8, 1  2011-01-07 17:48 /dev/sda1
crw-rw---- 1 root dialout 4, 64 2011-01-07 17:48 /dev/ttyS0

  以/dev/ttyS0 的資訊為例,該裝置節點對應於系統的串列埠:

  • /dev/ttyS0是裝置節點名稱。
  • c表示該裝置是字元。
  • 主裝置主號為 4,從裝置號為 64 。   裝置分為字元裝置、塊裝置和網路裝置,而網路裝置沒有裝置節點,所以裝置檔案基本上就分為字元檔案和塊設兩類,在節點屬性中分別以 備檔案和塊設兩類,在裝置節點屬性中分別以 cb來表示,即c表示字元裝置節點檔案,b表示塊裝置節點檔案。   當程式開啟一個裝置檔案時,核心就可以獲取對應裝置的裝置型別、主裝置號和次裝置號資訊,核心也就知道了程式需要操作使用哪個裝置驅動。在隨後對這檔案的操作都會呼叫相應的驅動程式函式,同時把從裝置號傳遞給驅動程式。