按照国嵌的视频教程上来说的,最后就是—自动创建设备文件!
其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!!
不管了,写完收工,睡觉!
(四)、嵌入式Linux内核驱动进阶
(7)、字符设备驱动(自动创建设备节点)—⑥
1、概念
在前面的实验中饿设备驱动程序由于无法自动创建设备节点,这里只好利用 mknod 命令手动创建设备节点。
实际上 Linux 内核为我们提供了一组函数,可以用来再模块加载的时候自动在 /dev
目录下创建相应的设备节点,并在卸载模块式删除该节点。
当然前提条件是在应用层移植了 udev(Linux Kernel 2.6
系列的设备管理器,它是工作在用户空间的),在嵌入式系统中则使用 busybox 的 mdev 替代。
内核中定义了 struct class 结构体,顾名思义,一个 struct class
结构体类型变量对应一个类。内核同时提供了 class_creat(...) 函数,可以用它来创建一个类,这个类存放于 sysfs
下面。一旦创建好了这个类,再调用 device_creat(...) 函数来在 /dev 目录下创建相应的设备节点。
这样在加载模块的时候,用户空间中的 udev/mdev 就会自动相应 device_creat(...) 函数,去
/sys/class 下寻找对应的类从而创建设备节点。
注意:
在较 kernel 2.6 早的内核版本中,device_creat(...) 函数名称不同,它是
class_device_creat(...),所以在新的内核中编译以前的模块程序有时会报错,这是因为函数名称不同,而且里面的参数设置也有一些变化。
2.编程接口
①、class_create
函数功能:
创建一个 class 结构。
头文件:
#include
函数原型:
struct class *class_creat(struct module *owner,const char
*name)
参数说明:
owner:指定类的所有者是哪个模块。
name:指定类名。
返回值:
成功返回 class 结构,失败返回错误号。
②、class_destory
函数功能:
销毁一个 class 结构。
头文件:
#include
函数原型:
void class_destory(struct class *cls)
参数说明:
class:待销毁的类。
返回值:
无
③、device_create
函数功能:
创建一个设备,并将它注册到 sysfs 中。
头文件:
#include
函数原型:
struct device *device_create(struct class *class,struct device
*parent,dev_t devt,void *drvdata,const char *fmt,...)
参数说明:
class:指定所要创建的设备所从属的类。
parent:这个设备的父设备,如果没有就指定为 NULL。
devt:设备号。
drvdata:被添加到该设备用于回调的数据,没有则置位 NULL。
fmt:设备名称。
...:可以是从设备号,作为格式字符串 fmt 的参数。
④、device_destory
函数功能:
移除一个被 device_creat() 创建的设备。
头文件:
#include
函数原型:
void device_destory(struct class *class,dev_t devt)
参数说明:
class:指定所要移除的设备所从属的类。
devt:设备号。
返回值:
无