https://blog.csdn.net/zqixiao_09/article/details/50849735
上一篇我们介绍到创建设备文件的方法,利用cat /proc/devices查看申请到的设备名,设备号。第一种是使用mknod手工创建:mknod filename type major minor第二种是自动创建设备节点:自动创建设备节点是利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),有busybox配置、利用udev(mdev)来实现设备文件的自动创建,首先应保证支持udev(mdev),由busybox配置。 具体udev相关知识这里不详细阐述,可以移步Linux 文件系统与设备文件系统 —— udev 设备文件系统,这里主要讲使用方法。
在驱动中加入udev的支持做法:
* 在驱动初始化的代码里调用class_create()为该设备创建一个class
* 再为每个设备调用device_create()创建对应的设备
内核中定义的struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_create函数,可以用它创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,在调用device_create函数来在/dev目录下创建相应的设备节点
这样,加载模块的时候,用户空间中的udev会自动响应device_create函数,去/sysfs下寻找对应的类从而创建设备节点。
下面是两个函数的解析:
1、class_create(...) 函数
功能:创建一个类;
下面是具体定义:
owner:THIS_MODULE
name : 名字
__class_create(owner, name, &__key)源代码如下:
销毁函数:void class_destroy(struct class *cls)
2、device_create(...) 函数
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
功能:创建一个字符设备文件
参数:
struct class *class :类
struct device *parent:NULL
dev_t devt :设备号
void *drvdata :null、
const char *fmt :名字
返回:
struct device *
下面是源码解析:
device_create_vargs(class, parent, devt, drvdata, fmt, vargs)解析如下:
现在就不继续往下跟了,大家可以继续往下跟;
下面是一个实例:
hello.c
test.c
makefile
下面可以看几个class几个名字的对应关系: