Linux驱动程序--自动创建设备文件
文章摘要:
本文主要描述了自动创建Linux设备文件的几种常用方法。
方法一:class(推荐)
#include <linux/device.h>
struct class *myclass;
dev_t devno;
创建设备文件(模块加载时):
// 创建自定义类:字符串为类名称
myclass = class_create(THIS_MODULE,"myclass");
// 创建设备:字符串为设备名称
device_create(myclass,NULL,devno,"mydevice");
移除自动创建的设备文件(模块移除时):
// 移除设备
device_destroy(myclass, devno);
// 移除类
class_destroy(myclass);
当驱动模块被加载时,udev(mdev)就会自动在/dev目录下创建"mydevice"设备文件
注意事项:
1.本方法适用于内核版本为2.6以上的系统,需要udev(mdev)支持;
2.device_create函数在更新的版本中修改了参数列表(可变参数),这样会造成新旧版版本的驱动程序不通通过编译,需注意;(2.6.18之后的版本,已为变参,具体哪个版本开始的,已不再考证);
3.可以单独注册一个自定义的类并导出,在驱动程序中直接导入类就行了,无需再创建及删除类;
4.目前来说,此种方法比较主流,推荐使用。
方法二:混杂设备
将设备声明为混杂设备即可,此种方法比较简单,适用于简单的驱动程序;
但此种方法最多只支持255个混杂设备(也差不多够用了);
声明一个混杂设备:
static struct miscdevice sync_miscdev = {
.minor = MISC_DYNAMIC_MINOR,
.name ="sync_dev", //设备文件名称
.fops = &sync_fops, //文件操作
};
注册设备至内核:
misc_register(&sync_miscdev);
注销设备:
misc_deregister(&sync_miscdev);
早期方法:脚本
采用脚本读取/proc/devices来获取设备号,并创建设备文件;
#!/bin/sh
module="scull"
device="scull"
mode="664"
/sbin/insmod ./$module.ko $* || exit 1
# remove stale nodes
rm -f /dev/${device}[0-3]
major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices)
mknod /dev/${device}0 c $major 0
mknod /dev/${device}1 c $major 1
mknod /dev/${device}2 c $major 2
mknod /dev/${device}3 c $major 3
group="staff"
grep -q '^staff:' /etc/group || group="wheel"
chgrp $group /dev/${device}[0-3]
chmod $mode /dev/${device}[0-3]
注意事项:
《Linux设备驱动程序》中有详细说明;脚本法适用于所有系统,一般只在早期采用,2.6之后均转向class实现;