Linux中很多設備都是字符設備,使用ls -l查看/dev下的設備,前面帶c的都是字符設備。
字符設備的創(chuàng)建比較容易,而且有一套固定的模式,掌握了模式完全可以“套模板”。更多的精力應該花在業(yè)務邏輯的部分。
Linux的每個設備都有一個主設備號和次設備號,創(chuàng)建字符設備第一步就是給它分配設備號。如果是自己用,可以任意給定一個沒有用過的設備號,也可以讓系統(tǒng)自動分配。但是如果要發(fā)布給不同的人不同的機器使用,就不能隨便。推薦使用系統(tǒng)自動分配的方式。
下面代碼中根據(jù)有沒有給定設備號決定是指定還是自動分配設備號,dev變量里包含了主設備號和次設備號。MKDEV就是將兩個數(shù)字合成的。register_chrdev_region()函數(shù)注冊字符設備,alloc_chrdev_region()函數(shù)自動分配設備號。主設備號是關鍵,次設備號可以看成是該類設備的計數(shù)。通過MAJOR()可以得到主設備號。
字符設備一般會創(chuàng)建一個數(shù)據(jù)結構,里邊包含了cdev結構、設備數(shù)據(jù)和其他數(shù)據(jù),可以根據(jù)自己實際需求添加。然后創(chuàng)建該結構的指針。
分配完設備號,接下來給字符設備數(shù)據(jù)結構分配存儲空間。
創(chuàng)建設備類
初始化字符設備、添加字符設備到內(nèi)核和創(chuàng)建設備。
這里涉及到一個結構file_operations,這個結構里包含了文件操作函數(shù)列表,所有操作這個字符設備的動作函數(shù)地址都保存在這個結構里。
結構的定義在頭文件fs.h中,這個結構有很多內(nèi)容,不過常用的就那么幾個。
如果沒遇到問題,到這里字符設備就創(chuàng)建成功了。如果失敗,就會goto到錯誤處理的地方,這里用goto是因為失敗后要把前面可能申請的資源釋放掉,而且有順序,這里一定要注意。
在exit函數(shù)中要有對應的注銷或釋放資源的操作,順序跟創(chuàng)建時相反,后創(chuàng)建的先釋放,先創(chuàng)建的后釋放。
下面要完成的工作就是實現(xiàn)file_operations結構中的函數(shù)。對于簡單的字符設備,最常見的操作是open、read、write、ioctl、release等。
open函數(shù)這里只是簡單的獲取了一下字符數(shù)據(jù)結構體的指針。container_of函數(shù)很有意思,可以根據(jù)結構成員的地址找到結構體數(shù)據(jù)的地址。
read函數(shù)要實現(xiàn)將內(nèi)核空間的數(shù)據(jù)傳到用戶空間的功能,copy_to_user()函數(shù)就是干這個的,第一個和第三個參數(shù)就是read函數(shù)的形參,中間是內(nèi)核的數(shù)據(jù)。這里的count是字節(jié)個數(shù)。
write函數(shù)實現(xiàn)的功能與read相反,使用copy_from_user()和memdup_user()函數(shù)可以實現(xiàn)。
ioctl函數(shù)實現(xiàn)一些設備獨有操作的函數(shù),i2c設備和spi設備就大量使用了ioctl。
release函數(shù)就是在設備文件關閉時需要做的操作。這里的關閉是指打開該文件的文件描述符個數(shù)為0了,如果不為0只會將計數(shù)減1而不會真正調(diào)用release函數(shù)。
具體的實例可以參看Linux源碼中i2c-dev.c中i2c設備驅(qū)動的實現(xiàn)。
必要的頭文件:
編譯模塊并插入到內(nèi)核后,在/dev目錄下會創(chuàng)建對應的設備文件。
在/sys/class下會創(chuàng)建對應的設備類目錄。
ok,以上就是簡單的創(chuàng)建字符設備的過程,通過字符設備可以實現(xiàn)內(nèi)核與用戶空間的數(shù)據(jù)交換。學習字符設備的創(chuàng)建也是學習linux驅(qū)動開發(fā)的第一步。
-
存儲
+關注
關注
13文章
4532瀏覽量
87443 -
Linux
+關注
關注
87文章
11511瀏覽量
213763 -
設備
+關注
關注
2文章
4668瀏覽量
71746 -
字符
+關注
關注
0文章
237瀏覽量
25593 -
函數(shù)
+關注
關注
3文章
4381瀏覽量
64857
發(fā)布評論請先 登錄
Linux驅(qū)動開發(fā):字符設備驅(qū)動開發(fā)理論
Linux字符設備驅(qū)動開發(fā)框架介紹

Linux驅(qū)動中創(chuàng)建procfs接口的方法

字符設備驅(qū)動——申請、創(chuàng)建、應用.
嵌入式Linux字符設備驅(qū)動的設計與應用
嵌入式Linux字符設備驅(qū)動的設計與應用
基于PXA255開發(fā)板外圍字符設備的嵌入式Linux字符設備驅(qū)動設計與應用

linux字符設備驅(qū)動的關鍵:自動創(chuàng)建設備及其節(jié)點
Linux字符設備架構是如何實現(xiàn)的
如何在Linux系統(tǒng)下自動創(chuàng)建設備節(jié)點
Linux新字符設備驅(qū)動開發(fā)方式

評論