register_chrdev(MEM_MAJOR,"char0",&fops) 向内核注册了一个字符设备(不只是注册了设备号,还做了 cdev 的初始化以及 cdev 的注册)。第一个参数为主设备号,0代表动态分配,这里的 MEM_MAJOR 为1;第二个参数是设备的名字;第三个参数为文件操作指针,完成注册后,在 /proc/devices 中第一个字符设备我们就看到了 :/char0。
static const struct file_operations fops = {
.read = il3945_sta_dbgfs_stats_table_read,
.open = simple_open,
.llseek = default_llseek,
};
自动创建节点
在驱动中加入对 udev 的支持(自动创建设备节点)的主要做法是:在驱动初始化的代码里调用 class_create() 为该设备创建一个 class,再为每个设备调用 device_create() 创建对应的设备。
内核中定义的 struct class 结构体,顾名思义,一个 struct class 结构体类型的变量对应一个类,内核同时提供了 class_create() 函数,可以用它来创建一个类(class),这个类(class)存放在 sysfs 下面,一旦创建好了这个类,再调用 device_create() 函数来在 /dev 目录下创建相应的设备节点。
这样,加载模块的时候,用户空间中的 udev 会自动响应 device_create() 函数,去 /sysfs 下寻找对应的类,从而创建设备节点。
————————————————
版权声明:本文为CSDN博主「BestW2Y」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u014674293/article/details/101377823/