深入分析总线设备驱动模型的框架

总线设备驱动框架结构如下:

device_add:

1)会把device代表的结构体放入总线的bus_dev链表中;

2)从bus_drv链表中取出每个drv,用总线的match函数判断drv能否支持该dev;

3)如果能够支持,则调用drv中的probe函数;

driver_register:

1)会把driver代表的结构体放入总线的bus_drv链表中;

2)从bus_dev链表中取出每个dev,用总线的match函数判断该drv能否支持取出的dev;

3)如果能够支持,则调用drv中的probe函数。

注意:match函数是根据驱动的名字和设备的名字是否一致来进行判断,如果两者相同,则调用驱动中的probe函数。至于在probe里面做什么事情,完全由自己决定。

接下来,看一下platform_driver 和platform_device结构体。

1 struct platform_driver {
2     int (*probe)(struct platform_device *);
3     int (*remove)(struct platform_device *);
4     void (*shutdown)(struct platform_device *);
5     int (*suspend)(struct platform_device *, pm_message_t state);
6     int (*resume)(struct platform_device *);
7     struct device_driver driver;
8     const struct platform_device_id *id_table;
9 };
 1 struct platform_device {
 2     const char    * name;
 3     int        id;
 4     struct device    dev;
 5     u32        num_resources;
 6     struct resource    * resource;
 7 
 8     const struct platform_device_id    *id_entry;
 9 
10     /* MFD cell pointer */
11     struct mfd_cell *mfd_cell;
12 
13     /* arch specific additions */
14     struct pdev_archdata    archdata;
15 };

总线设备驱动模型的大致过程就是这样的,虽然随着内核版本的提高,描述设备板级信息的这部分代码被设备树逐渐代替。但是不管如何代替,device_add和driver_register这两大过程是不缺少的。

posted @ 2019-07-14 22:08  一代枭雄  阅读(548)  评论(0编辑  收藏  举报