Linux中自动创建设备节点的LED灯驱动开发流程
目录
一、设备号注册和注销
1、使用如下函数注册和注销字符设备时,浪费了很多次设备号,还需要手动指定主设备号;而且当我们使用 modprobe 加载驱动程序以后,还需要使用命令mknod手动在 /dev 目录下创建设备节点
int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
void unregister_chrdev(unsigned int major, const char *name)
2、如果没有指定设备号的话就使用如下函数来申请设备号
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
如果给定了设备的主设备号和次设备号就使用如下所示函数来注册设备号即可
int register_chrdev_region(dev_t from, unsigned count, const char *name)
注销字符设备之后要释放掉设备号,不管是通过 alloc_chrdev_region函数还是register_chrdev_region函数申请的设备号,统一使用如下释放函数:
void unregister_chrdev_region(dev_t from, unsigned count)
二、字符设备添加与删除
在linux中,使用 include/linux/cdev.h/cdev 结构体表示字符设备
(1)初始化字符设备
cdev_init(struct cdev *, const struct file_operations *);
(2)向linux内核添加一个字符设备
int cdev_add(struct cdev *, dev_t, unsigned);
(3)删除一个字符设备
void cdev_del(struct cdev *);
三、自动创建设备节点
自此,通过 cdev_add 向内核添加字符设备后,也还是需要通过 mknod 手动在 /dev目录下添加对应的设备节点,这在实际的项目开发中是不现实的,在添加完字符设备后需要能自动创建相应的设备节点,这里就会用到udev机制。
udev是一个用户程序,在 Linux下通过 udev来实现设备文件的创建与删除, udev可以检测系统中硬件设备状态,可以根据系统中硬件设备状态来创建或者删除设备文件。比如使用modprobe命令成功加载驱动模块以后就自动在 /dev目录下创建对应的设备节点文件 ,使用rmmod命令卸载驱动模块以后就 删除掉 /dev目录下的设备节点文件。 使用 busybox构建根文件系统的时候, busybox会创建一个 udev的简化版本 mdev,所以在嵌入式 Linux中我们使用mdev来实现设备节点文件的自动创建与删除, Linux系统中的热插拔事件也由 mdev管理,在/etc/init.d/rcS文件中如下语句
echo /sbin/mdev > /proc/sys/kernel/hotplug
实现过程:
1、创建和摧毁类
struct class *class_create (struct module *owner, const char *name);
void class_destroy(struct class *cls);
2、创建和删除设备
struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
void device_destroy(struct class *class, dev_t devt)
四、测试验证