2. 自动创建设备节点

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几个名字的对应关系:

扫描二维码关注公众号,回复: 1790628 查看本文章

猜你喜欢

转载自www.cnblogs.com/Ocean-Star/p/9245638.html
今日推荐