linux裝置驅動
linux系統把裝置驅動分成字元裝置、塊裝置和網路裝置三種型別。
核心為裝置驅動提供了註冊和管理的介面,裝置驅動還可以使用核心提供的其他功能以及訪問核心資源。
pci區域性匯流排
早期的計算機有眾多匯流排標準。從最初的8位匯流排到16位匯流排,到目前主流的32位匯流排,不同廠商都制定了自己的匯流排標準。不同的匯流排裝置給裝置驅動的設計帶了麻煩,直到後來pci區域性匯流排出台這種局面才得到緩解,並且逐步成為事實上的標準。
pci是英文peripheral component interconnect的縮寫,中文意思是外設部件互連標準。
pci區域性匯流排標準最早由英特爾公司為制定,最初主要應用在pc機。目前已經被越來越多的嵌入式系統已經其他型別的計算機系統使用。
設計pci的原因是由於之前的匯流排有許多的缺點,歸納總結為以下幾點:
pci匯流排採用軟體配置位址和其它匯流排資訊的方法,避免了手工配置裝置在匯流排位址帶來的麻煩,此外,pci還支援通過橋的方式擴充套件匯流排的處理能力。
linux裝置驅動基本概念
在linux系統中,所有的資源都是作為檔案管理的,裝置驅動也不例外,裝置驅動通常是作為一類特殊的檔案存放在/dev目錄下。
total 0這裡僅列出了一部分檔案,裝置檔案屬性最開始的乙個字元c表示該裝置檔案關聯的是乙個字元裝置;b表示關聯的是乙個塊裝置。在檔案列表的中間部分有兩個數字,第乙個數字稱做主裝置號,第二個數字稱做次裝置號。crw------- 1 root root 10, 58 jun 8 11:40 alarm
crw------- 1 root root 10, 59 jun 8 11:40 ashmem
crw------t 1 root root 10, 235 jun 8 11:40 autofs
crw------- 1 root root 10, 60 jun 8 11:40 binder
drwxr-xr-x 2 root root 740 jun 8 2013 block
drwxr-xr-x 2 root root 80 jun 8 2013 bsg
crw------t 1 root root 10, 234 jun 8 11:40 btrfs-control
drwxr-xr-x 3 root root 60 jun 8 2013 bus
lrwxrwxrwx 1 root root 3 jun 8 11:40 cdrom -> sr0
lrwxrwxrwx 1 root root 3 jun 8 11:40 cdrw -> sr0
drwxr-xr-x 2 root root 3700 jun 8 11:40 char
crw------- 1 root root 5, 1 jun 8 11:40 console
lrwxrwxrwx 1 root root 11 jun 8 11:40 core -> /proc/kcore
drwxr-xr-x 2 root root 60 jun 8 11:40 cpu
crw------- 1 root root 10, 57 jun 8 11:40 cpu_dma_latency
drwxr-xr-x 6 root root 120 jun 8 2013 disk
在核心中使用主裝置號標識乙個裝置,次裝置號提供給裝置驅動使用。
在打工乙個裝置的時候,核心會根據裝置的主裝置號得到裝置驅動,並且把次裝置傳遞給驅動。linux核心為所有裝置都分配了主裝置號,在編寫驅動程式之前需要參考核心**documentation/devices.txt檔案,確保使用的裝置號沒有被占用。
在使用乙個裝置之前,需要使用linux提供的mknod命令建立裝置檔案。mknod命令格式如下
mknod [option] ... name type [major minor]其中,name是裝置檔名稱;type是裝置型別,c**字元裝置,b代表塊裝置;major是主裝置號,minor是次裝置號。option是選項,-m引數用於指定裝置檔案訪問許可權。
linux核心按照外部裝置工作特點把裝置分成了字元裝置、塊裝置和網路裝置3種基本型別。
在編寫裝置驅動的時候,需要使用核心提供的裝置驅動介面,向核心提供具體裝置的操作方法。
字元裝置
字元裝置是linux系統最簡單的一類裝置。
應用程式可以像操作普通檔案一樣操作字元裝置。常見的串列埠、數據機都是字元裝置。
編寫字元裝置驅動需要使用核心提供的register_chardev()函式註冊乙個字元裝置驅動。
函式定義如下:
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
fops是指向函式指標陣列的結構指標,驅動程式的入口函式都包括在這個指標內部。
該函式的返回值如果小於0表示註冊裝置驅動失敗,如果設定major為0,表示由核心動態分配主裝置號,函式的返回值是主裝置號。
當使用register_chardve()函式成功註冊乙個字元裝置後,會在/proc/devices檔案中顯示出裝置資訊
mystery@lcw:~$ cat /proc/devices刪除了一些,其中character devices是字元裝置驅動列表,block devices是塊裝置驅動列表,數字代表主裝置驅動,後面是裝置驅動名稱。character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttys
7 vcs
10 misc
13 input
21 sg
29 fb
99 ppdev
108 ppp
253 watchdog
254 rtc
block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
253 virtblk
254 mdp
與註冊驅動相反,核心提供了unregister_chardev()函式解除安裝裝置驅動or
int unregister_chrdev(unsigned int major, const char *name);
核心會比較裝置驅動名稱與裝置號是否相同,如果不同函式返回-einval。錯誤地解除安裝裝置驅動會帶來嚴重後果,因此在解除安裝驅動的時候應該對函式返回值做判斷。
在register_chardev()函式中有乙個fops引數,該引數指向乙個file_operation結構,該結構包含了驅動上的所有操作。隨著核心功能的不斷增加,file_operations結構的定義也越來越複雜。
大部分驅動都沒有提供所有的函式,對於字元裝置來說,常用的函式如下
塊裝置
與字元裝置相比,塊裝置要複雜的多。
最主要的差別是塊裝置帶有緩衝,字元裝置沒有。
塊裝置傳輸資料只能以塊作為單位讀寫,字元裝置是以位元組作為最小讀寫單位的。塊裝置對於i/o請求有對應的緩衝區,可以選擇響應的順序,如採用特定的排程策略等;字元裝置只能順序訪問。
此外,塊裝置提供了隨機訪問的能力,而字元裝置之順序讀取資料。
塊裝置提供了乙個類似字元裝置的訪問函式結構block_device_operations,定義如下
其中,open、release、ioctl等函式的功能與字元裝置相同。struct block_device_operations
;
塊裝置提供了幾個特有的函式成員:
網路裝置
在linux核心中,網路裝置是一類特殊的裝置,因此被單獨設計為一種型別的驅動。
與其他裝置不同的是,網路裝置不是通過裝置檔案訪問的,在/dev目錄下不會看到任何網路裝置。因此,網路裝置的操作不是通過檔案操作實現的。
linux核心為了抽象網路裝置介面,為其定義了乙個介面用於遮蔽網路環境下各種網路裝置的差別。核心對所有網路裝置的訪問都通過這個抽象的介面,介面對上層網路協議提供相同的操作方法。
本文出自 「成鵬致遠」 部落格,請務必保留此出處
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動 SPI驅動
spi驅動匯流排架構 spi核心層 x spi控制器驅動層 x spi裝置驅動層 spi函式介面 api 簡單介紹spi協議,硬體原理 4412datasheet sdi 資料輸入buf i2c scl6 sdo 資料輸出buf i2c sda6 sclk 時鐘buf gpc1 1 cs 片選bk ...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...