总线设备驱动框架结构如下:
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这两大过程是不缺少的。