Linux下驅動框架與雜項字符設備框架介紹
1. linux下驅動框架介紹
1.1 驅動框架分類
linux下驅動框架分為3大類型:
字符設備 ---------
塊設備 存儲設備 SD 硬盤
網絡設備 網卡 無線 有線
字符設備和塊設備都會生成設備節點在/dev目錄下。
網絡設備不會生成設備節點. 可以使用ifconfig查看
字符設備標準框架詳細區分:
RTC設備驅動
LCD屏設備驅動—幀緩沖設備框架
聲卡設備驅動—音頻設備
標準輸入設備驅動—輸入子系統框架
…等等
內核提供的字符設備注冊的方式: 原生的—最底層注冊方式
早期設備注冊方式—linux 2.6
標準設備注冊方式
雜項設備注冊方式
比如: 溫度傳感器、濕度傳感器、光照度、門鎖、LED燈、蜂鳴器 驅動都是使用字符設備框架編寫
1.2 驅動框架代碼模板
示例代碼:
#include
1.3 Makefile示例代碼
KER_DRI=/home/wbyq/work/linux-3.5/linux-3.5 all: make -C $(KER_DRI) M=`pwd` modules clean: make -C $(KER_DRI) M=`pwd` modules clean obj-m += drv_hello.o
編譯完成之后,生成的驅動文件名稱還是xxxx.ko文件。以ko為后綴。
1.4 安裝驅動過程
[root@wbyq ]#insmod drv_hello.ko [ 435.765000] Hello 驅動注冊-安裝成功. [root@wbyq ]#rmmod drv_hello.ko rmmod: can't change directory to '/lib/modules': No such file or directory [root@wbyq ]#mkdir /lib/modules [root@wbyq ]#rmmod drv_hello.ko rmmod: can't change directory to '3.5.0-FriendlyARM': No such file or directory [root@wbyq ]# [root@wbyq ]# [root@wbyq ]#mkdir /lib/modules/3.5.0-FriendlyARM [root@wbyq ]#rmmod drv_hello.ko [ 1024.225000] Hello 驅動注銷成功. [root@wbyq ]#insmod drv_hello.ko [ 1080.500000] Hello 驅動注冊-安裝成功. [root@wbyq ]#lsmod drv_hello 614 0 - Live 0xbf004000 (O) [root@wbyq ]#modinfo drv_hello.ko modinfo: can't open '/lib/modules/3.5.0-FriendlyARM/modules.dep': No such file or directory [root@wbyq ]#touch /lib/modules/3.5.0-FriendlyARM/modules.dep [root@wbyq ]#modinfo drv_hello.ko filename: drv_hello.ko license: GPL depends: vermagic: 3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8 [root@wbyq ]#
驅動的安裝方式:
動態安裝. lsmod 查看動態方式安裝的驅動.
靜態安裝. 靜態是固化到內核里的。
2. 雜項設備框架
2.1 框架結構介紹
雜項字符設備的主設備號固定: 10 主設備號: 0 ~ 255
次設備號范圍: 0 ~ 255
Linux內核尋找驅動節點是依靠設備號尋找的。
設備號: 主設備號(區分類型)、次設備號(區分同類型的具體設備)
主設備號: 10 ,240
下面是查看串口設備節點、MMC設備節點的詳細信息:
下面是雜項設備的模型圖:
Linux下把無法分類的一些設備都歸類為雜項設備,雜項設備本身就是字符設備,只是簡單封裝了一層,注冊調用更加簡單。雜項設備(misc device)是在嵌入式系統中用得比較多的一種設備驅動。
在Linux內核的include\linux目錄下有Miscdevice.h文件,misc設備定義及其內核提供的相關函數在這里。
內核用struct miscdevice的結構體來描述雜項設備:
struct miscdevice { int minor; //次設備號,雜項設備的主設備?10 const char *name; //設備的名稱 const struct file_operations *fops; //文件操作 /* 下面的成員是供內核使用 ,驅動編寫不需要理會 */ struct list_head list; //misc_list的鏈表頭 struct device *parent; //父設備 struct device *this_device; //當前設備,是device_create的返回值 };
雜項設備結構里有一個文件集合指針,當字符設備驅動安裝成功之后,在應用層是open函數打開這個設備文件,會訪問到驅動層里文件集合對應的函數。
文件操作集合的模型圖:
2.2 蜂鳴器驅動示例代碼
這是蜂鳴器的驅動層示例代碼,使用雜項設備框架編寫:
應用層的代碼:
#include
2.3 運行效果
Linux
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。