Linux 下面对 driver 的定义:
struct device_driver {
const char * name;
struct bus_type * bus;
struct completion unloaded;
struct kobject kobj;
struct klist klist_devices;
struct klist_node knode_bus;
struct module * owner;
const char * mod_name; /* used for built-in modules */
struct module_kobject * mkobj;
int (*probe) (struct device * dev);
int (*remove) (struct device * dev);
void (*shutdown) (struct device * dev);
int (*suspend) (struct device * dev, pm_message_t state);
int (*resume) (struct device * dev);
unsigned int multithread_probe:1;
};
我们一个个来看,
Name :就是这个 driver 的名字;
Bus :就是这个 driver 是挂在上面 bus 上面的;
Unloaded :这个以后再讨论;
Kobj :这个可以理解为 driver 结构的父亲,如果从面向对象的角度来看的话;
Klist_devices: 这个就是由此 driver 驱动的设备列表;
Knode_bus: 这个就是用来挂在它说属的 bus 链表上的节点,顺着这个链表就可以找到所有的挂在这个 bus 上的所有的 driver ;
Owner :这个 driver 所属的模块;
Mod_name: 模块名字;
mkobj: 模块的顶层描述;
probe :这个是很关键的函数,用来初始化此 driver 驱动的硬件,还有其它能够正常为应用层提供服务说需要提前做的事都需要在这里做;
remove :这个就是移除的时候做的事情;
suspend :这个应该是睡眠的时候做的事情,也就是说上层通过这个函数实现对硬件的电源策略控制;
resume :这个就是从睡眠中醒来需要对硬件所做的事都需要在这里做;
multithread_probe :是否启用多线程 probe ;
分析完了 driver 的结构,我们看看为什么需要这样的设计,也就是说,如果我们自己需要实现一套架构用来实现同样的功能,我们需要做什么呢?
Driver 应该提供的功能