创建的是一个真正可被系统识别的字符设备。
在 002 的基础上增加了:
| 新增内容 | 作用 |
|---|---|
struct cdev cdev_test | 内核中代表一个字符设备 |
struct file_operations fops | 定义设备的操作接口(open/read/write 等) |
cdev_init() | 把 cdev 和 file_operations 绑定 |
cdev_add() | 向内核注册,设备变为"活"状态 |
cdev_del() | 卸载时移除 cdev |
代码:003_register_cdev.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/kdev_t.h>
dev_t dev_no; // 设备号
struct cdev cdev_test; // 字符设备结构体
struct file_operations fops = {
.owner = THIS_MODULE
};
//设备名称
static char* name = "003_register_cdev";
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wyl");
MODULE_DESCRIPTION("003_register_cdev");
static int modulecdev_init(void)
{
int ret;
ret = alloc_chrdev_region(&dev_no, 0, 1, name);
if (ret<0) {
printk("alloc_chrdev_region failed\n");
return ret;
}
printk("major:%d, minor:%d\n", MAJOR(dev_no), MINOR(dev_no));
cdev_init(&cdev_test, &fops);
cdev_add(&cdev_test, dev_no, 1);
return 0;
}
static void modulecdev_exit(void)
{
cdev_del(&cdev_test);
unregister_chrdev_region(dev_no, 1);
printk("modulecdev exit\n");
}
module_init(modulecdev_init);
module_exit(modulecdev_exit);