加油加油坚持住!
1、
Linux驱动模型:驱动模型即将各模型中共有的部分抽象成C结构体。Linux2.4版本前无驱动模型的概念,每个驱动写的代码因人而异,随后为规范书写方式,发明了驱动模型,即提取公共信息组成一个个类,为添加设备和驱动提供统一的接口,使得开发变得简单化、规范化,但驱动本身仍然存在开发难度,设备(触摸屏、蓝牙等)的最底层代码不需要驱动工程师搞,Linux设备模型也不需要驱动工程师搞,驱动工程师需要做的是把二者结合。早期的驱动是需要手动inmod的,有驱动模型后直接注册即可。
驱动模型分为四类:类、总线、设备、驱动、Kobject、sysfs、udev。
深入理解Linux设备模型与驱动开发-CSDN博客 (五星推荐)
比如led,rtc,beep,key这类结构简单的设备,它们的控制不需要时序,它们没有相应的物理总线。所以linux内核不会为它们创建驱动总线。为了是这部分设备的驱动开发也能够遵循设备驱动模型,linux内核引入了一种虚拟的总线——平台总线(platform bus)。
2、Linux的底层模型(主要是写内核的人写的,搞驱动的一般不用)
基本结构体Kobject:各类对象的最小单元,对象引用计数(kref)、维护对象链表(entry、parent)、对象上锁(kset)、对用户空间的描述(ktype)。
kobj_type:提供在sysfs下的操作。attribute:sysfs下的属性;sysfs_ops:对象在sysfs下的操作方法。
kset:描述sysfs下的目录关系。
驱动开发注意包含和引用的关系,包含是结构体成员,绑定是指针。如
struct kobject {
const char *name;
struct list_head entry; // 上下节点 包含关系
struct kobject *parent; // 上下层之间 绑定关系
struct kset *kset; // 上锁 绑定关系
struct kobj_type *ktype;
struct sysfs_dirent *sd;
struct kref kref; // 对象引用计数
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
3、Linux的上层模型
device_driver是驱动程序在内核驱动框架中的抽象。
name:驱动程序的名字,用于驱动与对应设备的匹配。
probe:用于检测此设备是否可以用本驱动,毕竟不同厂家的设备对应的驱动是不同的。
内核中驱动会被类和总线双重管理。
模型思想即面向对象的思想,结构体包一层结构体即类继承类,有一个基类(device_driver),然后创建子类(usb_device)。驱动开发要有思想复杂度!一层套一层。