module.h包含可裝載模組需要的大量符號和函式定義,包含init.h的目的是指定初始化和清除**,struct file是在中定義的。
註冊字元裝置使用
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
移除字元裝置使用
int unregister_chrdev(unsigned int major, const char *name);
init函式是在insmod時被呼叫的,exit函式是在rmmod時被呼叫的。
使用命令 cat /proc/devices 可以檢視裝置的主裝置號。
如果核心沒有為我們生成裝置檔案,我們需要手動生成:
mknod /dev/led_driver c 234 0
__init標記表示該函式只在初始化期間使用,在模組被裝載後,模組裝載器就會將初始化函式扔掉,這樣可將函式占用的記憶體釋放出來。
__exit修飾的函式只在模組解除安裝或系統關閉時被呼叫,如果模組被直接內嵌到核心中,或者核心的配置不允許解除安裝模組,則被標記為__exit
的模組將被簡單丟棄。
驅動程式:
#include #include #include #include #include #define led_major 234 #define device_name "led_driver" static unsigned long led_table=; static unsigned long led_cfg_table=; int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd , unsigned long arg) return 0; } struct file_operations led_ops = ; static int __init init_led(void) for(i = 0; i < 4; i++) printk(device_name "initialized\n"); return 0; } static void __exit exit_led(void) module_init(init_led); module_exit(exit_led); module_license("gpl"); module_author("liwanpeng");
測試程式:
#include #include #include #include #include int main() else close(fd); } return 0; }
效果:此時led燈也輪流閃爍。
Linux驅動修煉之道
一些學習linux驅動的筆記整理在這裡與大家分享,如果那裡有錯誤也請高手指出。若干年後能進入intel開源中心或ibm搞linux kernel是我目前的目標。君子藏器於身,待時而動。文章 不斷更新中。linux驅動修煉之道 流水燈 linux驅動修煉之道 按鍵 linux驅動修煉之道 lcd背光與...
Linux驅動修煉之道
linux驅動修煉之道 流水燈 linux驅動修煉之道 按鍵 linux驅動修煉之道 lcd背光與gpio控制 linux核心訪問外設i o資源的方式 linux裝置管理檔案系統,mdev,熱插拔 linux驅動修煉之道 混雜裝置 linux驅動修煉之道 clock框架 linux裝置模型 上 之底...
Linux驅動修煉之道
linux驅動修煉之道 流水燈 linux驅動修煉之道 按鍵 linux驅動修煉之道 lcd背光與gpio控制 linux核心訪問外設i o資源的方式 linux裝置管理檔案系統,mdev,熱插拔 linux驅動修煉之道 混雜裝置 linux驅動修煉之道 clock框架 linux裝置模型 上 之底...