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 應該提供的功能