開發Linux系統裝置驅動程式並不難(轉)

BSDLite發表於2007-08-16
開發Linux系統裝置驅動程式並不難(轉)[@more@]  最近看了好多核心程式設計和驅動開發的教程,也參考了一些開發板上的例子。總結下來並不是想象的高不可及。開發驅動程式需要對 核心有一定的瞭解,並不是非要解讀的多麼透徹。

  以下所指的驅動程式都是針對具體裝置,並做成模組動態載入方式工作的。驅動程式框架是分層的,有些驅動並不是針對具體裝置的如ext2檔案系統的驅動,tcp/ip協議的驅動等等,這些可以稱之為軟碟機動,工作於其他具體裝置驅動程式之上。由於我們做的是嵌入式開發,僅僅編寫最低層的裝置驅動就可以了。

  裝置驅動程式通常分為字元裝置和塊裝置,這是泛指分類。區別就是有緩衝區的就是塊裝置,無緩衝區的就是字元裝置。但是在linux原始碼的drivers目錄下,不僅僅有block和char目錄,還有其他的各種裝置,那是因為有些開發人員為了方便並沒有根據這種分類而是採用了更為直觀的功能分類。比如sound目錄,大家一看就知道里面存放的是各種音訊驅動了。

  既然是裝置驅動,我們先看看裝置在linux中如何描述。在/dev目錄下存放有系統支援的所有裝置。裝置又可以成為裝置節點,如果往系統中新增新裝置,必須在/dev下建立相應的節點。一個裝置驅動程式往往可以驅動若干裝置,裝置透過主裝置號和次裝置號區分。同一主裝置號的所有裝置使用一個驅動程式。次裝置號為驅動程式提供瞭如何區分不同裝置的入口。有些情況下還可以根據次裝置號的高低4位區分裝置的工作型別。舉個例子以hda0-hda4和hdb0-hdb4的關係,hda代表第一塊硬碟,hdb代表第二塊硬碟,由於大家都是硬碟因此此用同一驅動程式,所以had和hdb的主裝置號一致。Hda後面的序號分別代表了該硬碟上的分割槽資訊,為了有效的區分這些分割槽,次裝置的設定做了分類,該位元組的高四位代表不同的硬碟的,而低4位代表分割槽索引。

  瞭解了裝置的描述,我們再看看軟體的環境。開發linux下驅動程式與你所使用的發行版本無關,不管你用redhat或mandrake等,都無所謂。真正影響你的是你當前所用的核心的版本。如果你打算在目標板上用2.4.x的核心,而你的主機上的linux用的卻是2.6.x的系統,你的開發將是件麻煩的事。問題出在什麼地方,你慢慢往下看就明白了。因此我們建議主機和目標系統採用同樣的核心版本。

  開發驅動過程中,由於採用的是核心引用,在程式編譯時是不需要連結到庫檔案的。因此lib路徑對我們就沒什麼用了。但是由於需要引用核心提供的各種資料結構和介面,必須設定好相應版本的include路徑,通常在/usr/include。在/usr/include下有好多標頭檔案,真正我們需要的只有/usr/include/linux目錄和/usr/include/asm目錄。

  驅動程式設計中有兩個函式和三個資料結構最重要。Init_module和cleanup_module這兩個函式。File_operations,inode,file這三個資料結構,在linux/fs.h中定義。至於其他的象記憶體操作,i/o操作,定時器,中斷,DMA等待都是提升部分了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-960637/,如需轉載,請註明出處,否則將追究法律責任。

相關文章