1. 程式人生 > 其它 >linux字元裝置學習筆記(三)

linux字元裝置學習筆記(三)

技術標籤:驅動

字元裝置的註冊和登出

核心中用一個結構體struct cdev來表示一個字元裝置struct cdev cdev,這樣定義後,cdev就代表一個字元裝置
字元裝置的載入函式一般完成裝置號和裝置的註冊
裝置號註冊register_chrdev_reg
設備註冊cdev_add
字元裝置的解除安裝函式unregister_chrdev_region一般完成裝置號和裝置的登出
設備註銷cdev_del
裝置號登出unregister_chrdev_reg
在這裡插入圖片描述
程式碼示例

#include<linux/module.h>
#include<linux/kernel.h>
struct cdev cdev; //定義一個字元裝置 static int char_major = 250;//主裝置號 static int char_mintor = 0; //次裝置號 struct file_operation fops = { .owner = THIS_MODULE, } //載入函式 static int __init char_init(void) { int result; dev_t dev; //用dev_t型別來表示裝置號 dev = MKDEV(char_major,char_minor); //註冊裝置號 //引數:裝置號,裝置個數,裝置名字 result =
register_chardev_region(dev,1,"my_character device"); if(result<0) { printk("can not get major number %d\n",char_major); return result; } printk("register_chrdev_region success\n"); //要先初始化init csdv_init(&cdev,&fops); cdev.ower = THIS_MODULE;//表示這個結構體在那個模組中
//在add result = cdev_add(&cdev,dev,1); if(result) { //如果註冊裝置失敗,則要登出裝置號 printk("cdev_add files\n"); unregister_chrdev_region(dev,1); } printk("cdev_add success\n"); return 0; } //解除安裝函式 static void __exit char_exit(void) { dev_t dev; //上面那個是區域性變數,因此這裡需要在定義一遍 cdev_del(&cdev);//刪除裝置 dev = MKDEV(char_major,char_mintor); unregister_chrdev_region(dev,1); printk("unregister_chrdev_region success\n"); } module_init(char_init); module_exit(char_exit); MODULE_LICENSE("GPL");