前言:一个字符设备驱动程序对应一组设备驱动程序的操作函数file_operations,但是一个设备可以有多个次设备,由次设备号代表。主设备号(高12位)和次设备号(低20位)组成的设备号指向一个具体的设备,该设备在内核中用一个结构体表示,里面保存自身特有的数据内容,打开设备文件时,在驱动的操作函数里面根据次设备号找到描述链表中的结构体。
在结构体链表中,保存了在probe中初始化好的该设备的结构体,在需要的时候根据次设备号在链表中获取。
创建设备子系统:
- 注册主设备号,register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
- 使用设备号(主设备号+次设备号)注册字符设备驱动register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
- 创建struct class,class_register(&video_class);
- 创建设备节点,vdev->dev.class = &video_class;和device_register(&vdev->dev);//注册设备
把class作为全局变量,在设备节点生成的函数中调用device_register函数生成设备节点文件。
struct class、struct device的区别
- class 指的是 设备类(device classes),是对于设备的高级抽象
- device用于描述设备相关的信息设备之间的层次关系,以及设备与总线、驱动的关系。
一个 struct class 结构体类型变量对应一个类,内核提供了class_create() 函数,可以用它来创建一个类,这个类存放于 sysfs 下面。
一旦创建了类,再调用 device_create() 函数在 /dev 目录下创建相应的设备节点。
注意:使用device创建设备节点,device的class需要初始化为class_create函数生成的class。