Linux设备驱动模型概述(Linux device driver model overview)

平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上。在系统每注册一个设备时,会寻找与之匹配的驱动;相反,在系统每注册一个驱动时,会寻找与之匹配的设备,而匹配由总线来完成。

Linux设备驱动模型概述(Linux device driver model overview)

平台设备通常作为系统中自治实体(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()成功,驱动和设备将会被成功绑定。

 

当注册设备时,将检查总线上的驱动是否匹配,由下面三种不同的方式去匹配:

  1. 当注册设备时,将检查该总线的驱动是否匹配,平台设备应该在系统引起期间尽早注册。
  2. 当驱动使用platform_driver_register()注册时,将检查总线上所有未绑定的。驱动通常在引导过程中稍后注册,或通过加装模块时注册。
  3. 像使用platform_driver_register()注册一样用platform_driver_probe()来注册,除非另一设备注册时不会调用驱动的platform_driver_probe()。

 

多个平台驱动实例使用相同的平台驱动实现。可参阅Documentation\driver-model\platform.txt和include\linux\platform_device.h获得更多的信息