linux驱动学习笔记(一)
Linux驱动的三个概念:设备,驱动,总线;
什么是设备?如何理解设备?
- 在设备树(device tree)中的每一个节点都代表一个设备,每个设备都在/dev下面有自己的一席之地(确认一下这句话?)
- 从物理的角度看,一个要被控制的对象就是一个设备
什么是驱动?
我们写的驱动程序,编译出来的ko是驱动
驱动是用来控制设备的,驱动需要匹配对应的设备, 鼠标的驱动控制鼠标,lcd的驱动控制lcdc, gpu的驱动控制gpu.
insmod的时候发生了什么?
insmod的时候会加载我们写的驱动,并执行我们写的xx_init函数,在rmmod的时候执行我们的xx_exit函数
为什么单靠dts就可以控制某些的driver的加载,无需手动去insmod?
在linux内核启动过程中,当驱动程序的driver->name与dts中的某个节点(设备)的compatible完全对应,就会调用该驱动的probe函数。通俗的说,在内核启动解析dtb的时候,会去找每一个dtb的设备节点的compatible字段是否与内核中的某个driver的name的symbol对应的上,如果对应的上,这个driver的代码就会得到执行。这里需要注意,要把driver移植成platform driver才会有probe函数去注册,才能享受dts等优点。
驱动中的class是什么概念?
在/sys下面有一个class目录,该目录下包含所有注册在kernel的设备类型,每个设备类型表达具有一种功能的设备,每个设备类型子目录下面是具体设备的符号链接,指向/sys/devices/下的具体设备。设备类型和设备并不是一一对应的。
class,是设备类,完全是抽象出来的概念,没有对应的实体。所谓设备类,是指提供的用户接口相似的一类设备的集合,常见的设备类的有block、tty、input、usb等等。
看一下具体的数据结构:
struct class { const char *name; struct module *owner; struct class_attribute *class_attrs; struct device_attribute *dev_attrs; struct kobject *dev_kobj; int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env); char *(*devnode)(struct device *dev, mode_t *mode); void (*class_release)(struct class *class); void (*dev_release)(struct device *dev); int (*suspend)(struct device *dev, pm_message_t state); int (*resume)(struct device *dev); const struct dev_pm_ops *pm; struct class_private *p; };
这篇博客讲得很好,引用一下:https://www.cnblogs.com/xinghuo123/p/12872037.html