linux驱动开发(3、自动创建设备节点)


在之前的内容中,执行应用程序之前,都要手动使用 mknod命令来创建设备节点,这种方法非常的不方便,实际上现在的内核已经提供了一些接口,加上一个用户空间程序就可以实现自动删除与自动创建。

udev与mdev

引用维基百科的一段描述:

udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。

udev是一个用户空间程序,一般用在PC机上,而在嵌入式系统中常用简化版的mdev来替代,在使用busybox制作根文件系统时,里面就有mdev这个应用程序(需要在配置中勾选),位于/sbin/mdev

配置mdev热插拔

在根文件系统中的/etc/init.d/rcS文件中添加如下的内容:

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

常用接口

位于头文件:include\linux\device.h

class_create函数

此函数用以创建设备类,会在/sys/class/目录下生成对应的设备类,准确的说它应该是一个宏定义,原型如下:

#define class_create(owner, name)		\
({						\
	static struct lock_class_key __key;	\
	__class_create(owner, name, &__key);	\
})

class_destroy函数

此函数用以销毁设备类。

void class_destroy(struct class *cls);

device_create函数

此函数用以创建一个设备,也就对应了/dev/目录下的一个设备节点。

struct device *device_create(struct class *cls, struct device *parent,
			     dev_t devt, void *drvdata,
			     const char *fmt, ...);

device_destroy函数

此函数用以销毁对应的设备。

void device_destroy(struct class *cls, dev_t devt);

驱动中的修改

在驱动中还需要使用相应的接口来告知内核此驱动的信息,这样内核才能将信息传递给应用层的mdev程序来创建和删除设备节点。

static dev_t devno;
static struct class *test_char_dev_class;

static int __init test_init(void)
{
	/*省略注册字符设备步骤*/

    /*创建设备类*/
    test_char_dev_class = class_create(THIS_MODULE,"test_char_dev_class");
    /*创建设备*/
    device_create(test_char_dev_class,NULL,devno,NULL,"test_char_dev");

    return 0;
}

static void __exit test_exit(void)
{
    /*销毁设备*/
    device_destroy(test_char_dev_class,devno);
    /*销毁设备类*/
    class_destroy(test_char_dev_class);

	/*省略字符设备的注销步骤*/
}

完成以上的操作后,每次装载完驱动就可以不用再手动使用mknod命令来创建设备节点了,卸载驱动后对应的设备节点也会自动删除。

测试源码获取:点我

欢迎扫码关注我的微信公众号
漫长当下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值