sysfs文件系统
sysfs文件系统是Linux2.6版本引入的虚拟文件系统。sysfs把连接在系统上的设备模型组织_
成为一个分级的层次视图。并且可以向用户空间导出内核数据结构以及属性。
比如下面的图可以看出来当前支持的总线和相关的数据
在sys文件系统中每一个目录都对应着一个kobj结构体 所以kobj结构体也是驱动的基础
当目录下面的文件有关系的时候(比如iic总线目录下的多个设备)我们使用key_set把这些目录进行链接
在代码中也就是一个链表
上面的设计好处在于 让用户空间的文件分布或者引用包含关系非常明了同时解耦让用户空间的应用方便调用
设备总线设计思想
如果是单片机的驱动
#i fdef NXP
#define addr_ base
0x10
#define addr_ offset 0x10
#elif RK
#define addr_ base 0x20
#define addr_ offset 0x20
#endif
void eth_ sed() {
write (addr_ base+addr_ offset, 0x1) ;
write (addr_ base+addr_ offset, 0x2) ;
|}
这样写尽管也可以做的驱动对不同设备的兼容,但是耦合度比较高。但是不太符合Linux 的需求。那Linux是怎么做的呢?
Linux支持世界上几乎所有的,不同功能的硬件。所以Linux驱动-定要跨平台。而且现在支持的硬件数量在一直增 加,代码的复杂程度也在.上升。为了做好设备驱动的管理,并降低驱动开发难度。兼容设备的热拔插和电源管理。
Linux 对硬件设备进行了分类和归纳,并抽象出来了一套标准的数据结构和接口。这个就是设备模型。
设备模型包含总线,设备,驱动和类四个概念。
总线:总线是CPU和设备进行信息交互的通道,所有的设备都要连接到总线上。总线包含
虛拟总线和外设总线。
设备:将系统中所有硬件设备的共同属性,比如名字,属性,从属关系,类等信息抽象出来,
就是设备
类:具有相似功能或者属性的设备。
驱动:硬件设备对应的驱动程序。
这边把控制器也抽象出来 设计一条虚拟总线 整体都符设备匹配驱动的感觉
每个bus下面都有dev和drv两个目录里面的链表把和这个bus相关的 设备与驱动都链接起来 使用bus.match每当有新的drv注册的时候主动调用 当两个名称匹配的时候 bus也提供了probe函数 一般这个函数后面直接指向dev的probe函数