Linux设备驱动模型概述(Linux device driver model overview)
https://www.linuxidc.com/Linux/2016-10/136247.htm
https://linux-kernel-labs.github.io/master/labs/device_model.html
原創[图片上传中...(image-166116-1575861306521-2)]
loongembedded[图片上传中...(image-e58e8c-1575861306521-1)]
2018-12-25 21:30
平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上。在系统每注册一个设备时,会寻找与之匹配的驱动;相反,在系统每注册一个驱动时,会寻找与之匹配的设备,而匹配由总线来完成。
[图片上传中...(image-ad48b5-1575861306520-0)]
平台设备通常作为系统中自治实体(autonomous entities)出现,平台设备给出驱动绑定使用的名字和资源列表,如地址和IRQ。
struct platform_device {//平台设备
const char *name;//驱动使用此name和设备树中的对比来进行绑定
int id;//设备实例号,-1表示此设备只有一个实例
bool id_auto;
struct device dev;
u32 num_resources;
struct resource *resource;
const struct platform_device_id *id_entry;
char *driver_override; /* Driver name to force a match */
/* MFD cell pointer */
struct mfd_cell *mfd_cell;
/* arch specific additions */
struct pdev_archdata archdata;
};
平台驱动遵循提供比如probe()和remove()方法的标准驱动模型约定。驱动绑定由驱动core自动执行,驱动和设备之间匹配后会调用驱动的probe(),如果Prebe()成功,驱动和设备将会被成功绑定。
当注册设备时,将检查总线上的驱动是否匹配,由下面三种不同的方式去匹配:
- 当注册设备时,将检查该总线的驱动是否匹配,平台设备应该在系统引起期间尽早注册。
- 当驱动使用platform_driver_register()注册时,将检查总线上所有未绑定的。驱动通常在引导过程中稍后注册,或通过加装模块时注册。
- 像使用platform_driver_register()注册一样用platform_driver_probe()来注册,除非另一设备注册时不会调用驱动的platform_driver_probe()。
多个平台驱动实例使用相同的平台驱动实现。可参阅Documentation\driver-model\platform.txt和include\linux\platform_device.h获得更多的信息