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函数创建)