一、设备模型(驱动模型)的介绍和架构
device model & driver model
设备模型从2.5版内核引入,最早是为了解决电源管理,热插拔等方面的问题,后来扩展到内核的很多领域。
(1)设备结构体
设备模型的核心内容是在内存中创建和实际存在设备一一对应的结构体,结构体中记录设备的物理信息,并且通过结构体间的关系对应设备的硬件拓扑。设备结构体的生存周期和设备一致,如果将设备移除,则内核会释放对应的结构体。
设备结构体根据设备的总线进行分类:
usb总线的设备对应的结构体为usb_device
#include <linux/usb.h>
pci/pci-e总线的设备结构体为pci_dev;
#include <linux/pci.h>
i2c总线的设备结构体为i2c_client;
#include <linux/i2c.h>
spi总线的设备结构体为spi_device;
#include <linux/spi/spi.h>
三总线(platform)设备的结构体为platform_device;
#include <linux/platform_device.h>
热插拔:usb/pci
非热插拔:i2c/spi/platform
热插拔总线的设备结构体可以自动生成或删除;非热插拔总线的设备结构体需要由程序员自行生成或删除;
对于嵌入式设备来说,绝大多数设备都是用地址/数据/控制线连接的。内核将该总线称为platform总线,挂在总线上的设备结构体为platform_device。由于platform总线非热插拔,因此platform_device需要内核的移植或驱动开发人员手工准备。
(2)用户态的访问接口
通过/sys目录下的文件,可以访问内核中设备模型相关的结构体。
/sys目录下的文件,和/proc下文件的实现机制很类似,也类似于windows下的设备管理器。
/sys下的目录和内核中实际存在的设备模型结构体对应,如果内核的结构体存在(比如插入一个U盘),则/sys下会有对应的目录;如果结构体不存在了(U盘拔出),则/sys下的对应目录消失。
如果访问/sys下的文件,那么会调用内核中和该文件对应的函数,通过函数返回设备模型结构体的信息。