第十节、注册字符类设备
本节用于介绍如何注册字符类设备
注册杂项设备:
misc_register(&misc_dev);
注销杂项设备:
misc_deregister(&misc dev);
cdev结构体:描述字符设备的一个结构体
文件位置路径:include/linux/cdev.h
struct cdev {
struct kobject kobj;
struct module *owner; //属于哪一个模块
const struct file_operations *ops; //文件操作集
struct list_head list; //链表的节点
dev_t dev; //设备号
unsigned int count; //次设备号的数量
} __randomize_layout;
步骤一、定义一个cdev结构体
步骤二、使用cdev_init函数初始化cdev结构体成员变量
文件位置路径:include/linux/cdev.h
实际函数位置路径:fs/char_dev.c
void cdev_init(struct cdev *, const struct file_operations *);
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;//可以发现这个函数就是把文件操作集写给cdev的成员变量ops
}
//参数
//cdev:要初始化的cdev
//fops:文件操作集
步骤三、使用cdev_add函数注册到内核
文件位置路径:include/linux/cdev.h
实际函数位置路径:fs/char_dev.c
int cdev_add(struct cdev *, dev_t, unsigned);
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
//参数
//p:cdev的结构体指针
//dev:设备号
//count:设备号的数量
注销字符设备
文件位置路径:include/linux/cdev.h
实际函数位置路径:fs/char_dev.c
void cdev_del(struct cdev *);
void cdev_del(struct cdev *p)
//参数
//p:cdev的结构体指针
字符设备注册完之后不会自动生成设备节点。
我们需要使用mknod命令创建一个设备节点
格式:
mknod 名称 类型 主设备号 次设备号
root@localhost:~# mknod /dev/chrdev c 235 0