linux驱动学习笔记(二)

为什么要mknod ?

Linux一切皆文件,系统与设备通信之前,要建立一个存放在/dev目录下的设备文件,默认情况下就已经生成了很多设备文件,有时候自己手动新建一些设备文件,这就会用到mknod。mknod 的标准形式为:   mknod DEVNAME {b | c}  MAJOR  MINOR

主次设备号如何理解?

为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。换句话说,主设备号代表这个设备类,次设备号代表这个设备驱动对应的多个实例。当然,前提是驱动中需要支持多实例,才可以创建多个设备文件。

为什么有的设备文件无需mknod也能创建?(如misc_device )

回顾mknod创建设备文件节点的过程,可以发现,只是用了这么几个参数,设备名,设备类型,主次设备号,而这些在驱动中都是可以获得或者指定的。因此,完全可以把mknod做的事情放到driver里完成,比如init函数中做完类似的工作,就可以直接生成对应的设备号了。

不借助mknod, 如何自动创建字符设备呢?

流程如下:

driver --> 创建一个设备驱动class --->创建属于class的device---> 调用device_create--> 生成设备文件

// 1.1创建class /注销class
struct class * class_create(struct module *owner,const char *name);
参数:
struct module *owner---> class属于哪些一个module --->THIS_MODULE
const char *name --->自定义的类名.
返回值:
NULL -->失败
void class_destroy(struct class * cls)

例:
struct class *led_class=class_create(THIS_MODULE,"led_class");
class_destroy(led_class)
//1.2创建device 
struct device *device_create(struct class *class, struct device *parent,
                                    dev_t devt, void *drvdata, const char *fmt, ...)
参数:
struct class *class --->当前device属于那个class
struct device *parent --->device的parent,一般为NULL
dev_t devt --->设备号
void *drvdata --->设备的私有数据,一般为NULL
const char *fmt ---》 device的名字,也就是设备文件名
返回值:
struct device *
NULL -->失败
//注销
void device_destroy(struct class * class,dev_t devt);

misc 设备驱动会在misc_register 内部会调用device_create,所以misc 设备无需mknod就能创建文件节点。

class_create的作用是什么?

class_create()用于动态创建设备的逻辑类,并完成部分字段的初始化,然后将其添加进Linux内核系统中。此函数的执行效果就是在目录/sys/class下创建一个新的文件夹,此文件夹的名字为此函数的第二个输入参数。目录中的设备就是使用此创建的class创建的device(device_create函数创建)

 

posted on 2022-05-02 09:59  疾速瓜牛  阅读(109)  评论(0编辑  收藏  举报

导航