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ù)自動分配設備號。主設備號是關(guān)鍵,次設備號可以看成是該類設備的計數(shù)。通過MAJOR()可以得到主設備號。
字符設備一般會創(chuàng)建一個數(shù)據(jù)結(jié)構(gòu),里邊包含了cdev結(jié)構(gòu)、設備數(shù)據(jù)和其他數(shù)據(jù),可以根據(jù)自己實際需求添加。然后創(chuàng)建該結(jié)構(gòu)的指針。
分配完設備號,接下來給字符設備數(shù)據(jù)結(jié)構(gòu)分配存儲空間。
創(chuàng)建設備類
初始化字符設備、添加字符設備到內(nèi)核和創(chuàng)建設備。
這里涉及到一個結(jié)構(gòu)file_operations,這個結(jié)構(gòu)里包含了文件操作函數(shù)列表,所有操作這個字符設備的動作函數(shù)地址都保存在這個結(jié)構(gòu)里。
結(jié)構(gòu)的定義在頭文件fs.h中,這個結(jié)構(gòu)有很多內(nèi)容,不過常用的就那么幾個。
如果沒遇到問題,到這里字符設備就創(chuàng)建成功了。如果失敗,就會goto到錯誤處理的地方,這里用goto是因為失敗后要把前面可能申請的資源釋放掉,而且有順序,這里一定要注意。
在exit函數(shù)中要有對應的注銷或釋放資源的操作,順序跟創(chuàng)建時相反,后創(chuàng)建的先釋放,先創(chuàng)建的后釋放。
下面要完成的工作就是實現(xiàn)file_operations結(jié)構(gòu)中的函數(shù)。對于簡單的字符設備,最常見的操作是open、read、write、ioctl、release等。
open函數(shù)這里只是簡單的獲取了一下字符數(shù)據(jù)結(jié)構(gòu)體的指針。container_of函數(shù)很有意思,可以根據(jù)結(jié)構(gòu)成員的地址找到結(jié)構(gòu)體數(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ù)就是在設備文件關(guān)閉時需要做的操作。這里的關(guān)閉是指打開該文件的文件描述符個數(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ā)的第一步。
-
存儲
+關(guān)注
關(guān)注
13文章
4320瀏覽量
85911 -
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209739 -
設備
+關(guān)注
關(guān)注
2文章
4517瀏覽量
70693 -
字符
+關(guān)注
關(guān)注
0文章
233瀏覽量
25222 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4333瀏覽量
62705
發(fā)布評論請先 登錄
相關(guān)推薦
評論