您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Linux DRM平臺(tái)驅(qū)動(dòng)匹配和探測(cè)的方法是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Linux內(nèi)核通過(guò)module_platform_driver(rockchip_drm_platform_driver)
函數(shù)注冊(cè)RK3399 DRM框架驅(qū)動(dòng)代碼,該宏展開(kāi)如下:
static int __init rockchip_drm_platform_driver_init(void){ return platform_driver_register(&rockchip_drm_platform_driver);}...
下面通過(guò)分析函數(shù)platform_driver_register()
的調(diào)用流程,展示RK3399 DRM框架platform_device
和platform_driver
匹配過(guò)程和驅(qū)動(dòng)探測(cè)過(guò)程。
具體調(diào)用流程如下:
rockchip_drm_platform_driver_init()-> ## rockchip_drm_drv.c platform_driver_register()-> ## platform_device.h __platform_driver_register()-> ## platform.c driver_register()-> ## driver.c bus_add_driver()-> ## bus.c driver_attach()-> ## dd.c bus_for_each_dev()-> ## bus.c __driver_attach()-> ## dd.c 1.driver_match_device()-> ## base.h match platform_match() ## platform.c 開(kāi)始match 2.driver_probe_device()-> ## dd.c probe really_probe()-> ## dd.c platform_drv_probe()-> ## platform.c 開(kāi)始probe rockchip_drm_platform_probe() ## rockchip_drm_drv.c
在注冊(cè)Linux內(nèi)核platform
總線時(shí),相關(guān)的總線類型定義如下:
struct bus_type platform_bus_type = { .name = "platform", .dev_groups = platform_dev_groups, .match = platform_match, .uevent = platform_uevent, .pm = &platform_dev_pm_ops,};EXPORT_SYMBOL_GPL(platform_bus_type);
在bus_type
結(jié)構(gòu)體中定義了platform device
和platform driver
的匹配函數(shù)platform_match()
,具體實(shí)現(xiàn)如下:
static int platform_match(struct device *dev, struct device_driver *drv){ struct platform_device *pdev = to_platform_device(dev); struct platform_driver *pdrv = to_platform_driver(drv); /* When driver_override is set, only bind to the matching driver */ if (pdev->driver_override) return !strcmp(pdev->driver_override, drv->name); ## 1.設(shè)備樹(shù)匹配 /* Attempt an OF style match first */ if (of_driver_match_device(dev, drv)) return 1; ## 2.ACPI類型匹配(無(wú)) /* Then try ACPI style match */ if (acpi_driver_match_device(dev, drv)) return 1; ## 3.id table匹配 /* Then try to match against the id table */ if (pdrv->id_table) return platform_match_id(pdrv->id_table, pdev) != NULL; ## 4.device和driver名字匹配 /* fall-back to driver name match */ return (strcmp(pdev->name, drv->name) == 0);}
platform device
和platform driver
的匹配方法包括:
1、設(shè)備樹(shù)匹配
匹配方法:比較dts設(shè)備節(jié)點(diǎn)的compatible
屬性定義和驅(qū)動(dòng)文件中of_device_id
中的compatible
定義是否相同。
注:RK3399 DRM驅(qū)動(dòng)使用的是設(shè)備樹(shù)匹配.
#1. rockchip_drm_drv.c compatible定義static const struct of_device_id rockchip_drm_dt_ids[] = { { .compatible = "rockchip,display-subsystem", }, ...};MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);static struct platform_driver rockchip_drm_platform_driver = { ... .driver = { .name = "rockchip-drm", .of_match_table = rockchip_drm_dt_ids, ... },};#2. rk3399.dtsi compatible定義 display_subsystem: display-subsystem { compatible = "rockchip,display-subsystem"; ... };
2、ACPI類型匹配 (無(wú))
3、id table匹配
4、device和driver名字匹配
在實(shí)現(xiàn)了DRM的platform device
和platform driver
匹配后,會(huì)進(jìn)入Linux內(nèi)核的platform_driver
中的probe
探測(cè)函數(shù)進(jìn)行DRM驅(qū)動(dòng)探測(cè)函數(shù)的調(diào)用。platform_driver
初始化如下:
int __platform_driver_register(struct platform_driver *drv, struct module *owner){ drv->driver.owner = owner; drv->driver.bus = &platform_bus_type; drv->driver.probe = platform_drv_probe; drv->driver.remove = platform_drv_remove; drv->driver.shutdown = platform_drv_shutdown; return driver_register(&drv->driver);}
platform_drv_probe
實(shí)現(xiàn)如下:
static int platform_drv_probe(struct device *_dev){ struct platform_driver *drv = to_platform_driver(_dev->driver); struct platform_device *dev = to_platform_device(_dev); int ret; ... ret = dev_pm_domain_attach(_dev, true); if (ret != -EPROBE_DEFER) { if (drv->probe) { ## 調(diào)用各驅(qū)動(dòng)的probe函數(shù)(例:DRM的rockchip_drm_platform_driver()) ret = drv->probe(dev); if (ret) dev_pm_domain_detach(_dev, true); } else { /* don't fail if just dev_pm_domain_attach failed */ ret = 0; } } ...}
“Linux DRM平臺(tái)驅(qū)動(dòng)匹配和探測(cè)的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。