1.前言
字符设备驱动是最简单的驱动,实现对设备文件的打开,读写操作,但对于一些更加复杂的功能使用字符设备驱动框架来写可能完成不了这个功能,比如电源管理,热插拔事件,在Linux内核中I2C驱动,SPI驱动,PCIE驱动都使用设备模型来完成驱动的编写。如果说字符设备驱动编写相当于在大山深处造房子,水电等基础设施要自己建造,那么使用设备模型编写驱动则相当于在城区建新房,水电直接使用就可以。在Linux内核中,设备模型的基本元素由kobject,kset,ktype组成,每一个kobject都对应sysfs文件夹下的一个目录,作为一个结构体基类嵌入到其他结构体中,如cdev,class,device,driver等结构体中,kset也是sysfs文件夹下的一个目录,用来批量管理kobject,kobj_type则是为kobject对象构建多个属性文件,并为每一个属性文件提供操作接口。
2.驱动模型
2.1 驱动模型一
这是Linux内核中最常用的设备模型,其中kobject关联sysfs下的一个目录,kset对象继承kobject,所以kset也关联sysfs下的一个目录,kset中有一个kobject链表头,会将各个kobject通过链表的方式串联起来,链表中的kobject对象可以通过其中的kset指针找到其所属的上一级kset对象,也可以通过其parent指针找到所属的上一级kobject对象,从而找到所属的上一级kset对象。kset也可以管理下一级的kset对象,下一级的kset对象通过设置其kset指针来找到上一级的kset对象,如下图所示
2.2 驱动模型2
一个kobject对象管理多个kobject对象,其中通过设置kobject对象的*parent指针来找到上一级的kobject对象,存在的问题是上一级的kobject对象无法通过遍历找到下一级的kobject
、
在Linux内核中一般使用第一种设备模型进行驱动的编写