開發linux裝置驅動程式並不是想象的那麼難
最近看了好多核心程式設計和驅動開發的教程,也參考了一些開發板上的例子。總結下來並不是想象的高不可及。開發驅動程式需要對 核心有一定的了解,並不是非要解讀的多麼透徹。
以下所指的驅動程式都是針對具體裝置,並做成模組動態載入方式工作的。驅動程式框架是分層的,有些驅動並不是針對具體裝置的如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/a**目錄。
驅動程式設計中有兩個函式和三個資料結構最重要。init_module和cleanup_module這兩個函式。file_operations,inode,file這三個資料結構,在linux/fs.h中定義。至於其他的象記憶體操作,i/o操作,定時器,中斷,dma等待都是提公升部分了。
linux裝置驅動程式 字元裝置驅動程式
先留個 有一起學習驅動程式的加qq295699450 字元裝置驅動 這篇比較惱火。載入成功,但是讀不出來資料,有知道怎麼回事的,留個言,一起討論下 資料結構 struct scull mem struct scull dev dev 整個驅動程式 如下 include include include...
Linux裝置驅動程式 字元裝置驅動程式
1.檢視主裝置號,次裝置號 進入 dev目錄執行ls l,第四,五列分別為主次裝置號,10,180,1,5,這些是主裝置號,而60,63這些就是次裝置號 130 shell android dev ls l crw rw r system radio 10,60 1969 12 31 21 00 a...
Linux字元裝置驅動程式開發
linux下的裝置驅動程式被組織為一組完成不同任務的函式的集合,通過這些函式使得windows的裝置操作猶如檔案一般。在應用程式看來,硬體裝置只是乙個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作,如open close read write 等。linux主要將裝置分為二類 字元裝置和...