Linux設(shè)備模型中:bus_type、device、device_driver 《Linux設(shè)備驅(qū)動(dòng)程序》的linux設(shè)備模型章中說(shuō)到設(shè)備模型中,所有設(shè)備都通過(guò)總線相連。 添加設(shè)備devA,必須指定其device結(jié)構(gòu)體的bus_type域,初始化其他域,然后調(diào)用device_register(&devA),將設(shè)備devA 注冊(cè)到指定總線。 添加該設(shè)備驅(qū)動(dòng)driverA,也必須指定其device_driver結(jié)構(gòu)體的bus_type域,初始化其他域,然后調(diào)用driver_register(&driverA), 將該驅(qū)動(dòng)注冊(cè)到總線上。 如果驅(qū)動(dòng)driverA和設(shè)備devA匹配成功,即調(diào)用probe函數(shù)成功,則建立他們之間的符號(hào)鏈接,即將設(shè)備與驅(qū)動(dòng)捆綁起來(lái)。 而實(shí)際我看Linux源代碼中卻大量使用platform_device, struct platform_device { const char * name; u32 id; struct device dev; u32 num_resources; struct resource * resource; }; 和 struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); int (*suspend_late)(struct platform_device *, pm_message_t state); int (*resume_early)(struct platform_device *); int (*resume)(struct platform_device *); struct device_driver driver; }; 從結(jié)構(gòu)體可以看出,platform_device是device派生出,platform_driver是device_driver派生出 同樣添加設(shè)備PlatformDevA,初始化platform_device結(jié)構(gòu)體的dev域時(shí),沒(méi)有初始化其bus_type域,而實(shí)際將該設(shè)備添加在sys/bus/platform/devices目錄下, 在源代碼中哪里可以看到這部分代碼。 同樣添加驅(qū)動(dòng)PlatformDrvA,初始化platform_driver結(jié)構(gòu)體的driver域時(shí),沒(méi)有初始化其bus_type域,而實(shí)際將該驅(qū)動(dòng)添加在sys/bus/platform/drivers目錄下, 在源代碼中哪里可以看到這部分代碼。 還有 struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_head list; struct device *parent; struct device *this_device; }; 與字符型設(shè)備 struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int count; }; 從結(jié)構(gòu)體可以看出,miscdevice是device派生出,它與platform_device區(qū)別: 1、platform_device中有設(shè)備使用的資源的信息resource。 2、miscdevice中有該設(shè)備的使用方法file_operations。 |
|
|
來(lái)自: nt_bookworm > 《驅(qū)動(dòng)》