嵌入式Linux系统中利用mdev自动创建设备文件节点
mdev是busybox自带的一个简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的
mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点。
使用mdev自动创建设备文件节点分为以下几个步骤:
(1)、在编译时加上对mdev的支持。
Linux System Utilities--->
mdev
Support /etc/mdev.conf
Support command execution at device addition/removal
(2)、在启动时加上使用mdev的命令。
在启动脚本文件rcS文件中增加如下启动命令来挂载sys文件系统和tmpfs文件系统,同时启动mdev应用程序。
/bin/mount -n -t tmpfs tmpfs /dev/shm
/bin/mount -n -t sysfs none /sys
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
/bin/hotplug
(3)、在设备驱动程序中加上对类设备接口的支持。
在驱动程序的设备探测函数probe中,使用下面的类似语句,就能在类设备目录下添加包含设备号的名为“dev”的属性文件,并通过mdev在/dev目录下产生相应的设备文件,比如:
#define DEVICE_NAME "ledS0"
mixed_class = class_create(THIS_MODULE,DEVICE_NAME); //注册设备类
补充:
设备文件的创建有两种方法,其中就是在创建文件系统过程中用到的mknod命令。该命令的形式如下:
mknod filename (type,c,b,l) 主设备号 次设备号
其中type说明是那一类设备(字符设备c,块设备b,套接字l),主设备号用来确定那一类设备,而次设备号主要用来确定这一类设备中的某一个设备www.it165.net。
例如:mknod memdev0 c 555 0 就是创建了一个主设备号为555,次设备号为0的字符设备。
二、在驱动中动态添加设备文件节点会减少麻烦。
具体的实现主要包括两个过程。
1、创建一个设备类,主要依据函数class_create()实现。
2、依据设备类创建一个设备文件,主要依据device_create()
基本的实现过程应该是在设备驱动初始化过程中首先得到申请到设备号之后创建一个设备类,采用class_create()实现。
class_create(owner, name)
参数的意义:owner是指设备的拥有者,因此可以直接THIS_MODULE复制给owner,而name是设备类的名字。返回值是一个设备类的指针。这样就创建了一个设备类。
设备添加到内核中以后然后根据设备类要创建设备文件,依据device_create实现函数,其中的函数形式如下实现。
struct device *device_create(struct class *class, struct device *parent,dev_t devt, void *drvdata, const char *fmt, ...)
参数的意义分别是设备类指针、设备的父设备,设备号、以及设备的数据、然后是设备文件的名字,参数具有不定性。
在设备退出过程中我们当然也要释放分配好的这些资源。具体的采用device_destroy释放分配好的设备文件,
void device_destroy(struct class *class, dev_t devt)
参数主要是设备类和设备号。
同时也要释放设备类。主要采用函数class_destroy()
void class_destroy(struct class *cls)
参数是设备类。