11 生成字符类设备节点 本实验介绍一下如何生成字符设备的设备节点,这部分和前面注册杂项设备类似,不过在调用生成设备节点的时候需要额外的添加一个设备类。 11.1 创建设备类 在前面介绍的设备中的模型,例如总线bus、设备device、驱动driver 都是有明确的定义。bus 代表总线,device 代表实际的设备和接口,driver 代表驱动。Linux 中的class 是设备类,它是一个抽象的概念,没有对应的实体。它是提供给用户接口相似的一类设备的集合。常见的有输入子系统input、u***、串口tty、块设备block 等。 以4412 的串口为例,它有四个串口,不可能为每一个串口都重复申请设备以及设备节点,因为它们有类似的地方,而且很多代码都是重复的地方,所以引入了一个抽象的类,将其打包为ttySACX,在实际调用串口的时候,只需要修改X 值,就可以调用不同的串口。对于本实验中的设备,它有两个子设备,将对应两个设备节点,所以需要用到class 类这样一个概念。 创建设备类的函数class_create 在头文件“include/linux/device.h”中,使用命令“vim include/linux/device.h”打开头文件,如下图所示。
如上图所示,函数class_create(owner, name)只有两个参数:参数owner:一般是THIS_MODULE;参数name:设备名称。调用函数class_create 会返回一个class 结构体变量。class 结构体变量在头文件include/linux/device.h 的280 行,如下图所示。
如上图所示,看着复杂,其实不用管,在实际应用中就是给创建设备节点用的。在代码中,只需要定义一个class 变量,然后在创建设备节点的时候作为一个参数赋值使用即可。 还有释放设备类class 的函数class_destroy,就只有一个参数class。这个函数也是在头文件“include/linux/device.h”中,如下图所示。
11.2 创建字符设备节点 创建设备节点的函数device_create 在头文件“include/linux/device.h”,如下图所示。
函数extern struct device *device_create(struct class *cls, struct device *parent,dev_t devt, void *drvdata,const char *fmt, ...);中的参数比较多。参数struct class *cls:设备所属于的类,前面创建类的返回值;参数struct device *parent:设备的父设备,NULL;参数dev_t devt:设备号;参数void *drvdata:设备数据,NULL;参数const char *fmt:设备名称如上图所示,还有一个摧毁设备节点的函数extern void device_destroy(struct class *cls,dev_t devt);只有两个参数,分别是设备类和设备号。 11.3 源代码 如下图所示,首先添加头文件“linux/device.h”,然后将设备名称改为chardevnode。
然后定义一个设备类,如下图所示。
如下图所示,在初始化函数中添加申请设备类以及创建设备节点的代码。
最后在退出函数中添加释放设备以及释放内存的代码,如下图所示。
完善字符设备中file_opera tions 剩余的函数变量 如下图所示,添加打开关闭等操作的函数。
将结构体file_operations my_fops 补全,如下图所示。
好了,十一天学会Linux驱动编程计划到这里就结束了!真心希望这些经验能帮互助到大家。 这些也是我在学习嵌入式驱动编写过程中总结的经验。 讲的都很浅显,还望大神们不要喷我。
祝愿大家在Linux道路上越走越顺!
更多精彩,请关注我的微信公众号“小拇指的脑瓜子” PS:扫描我的头像也是可以的哦!
|