linux字元裝置學習筆記(三)
阿新 • • 發佈:2020-12-21
技術標籤:驅動
字元裝置的註冊和登出
核心中用一個結構體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");