溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux DRM平臺驅動匹配和探測的方法是什么

發布時間:2021-11-23 14:48:27 來源:億速云 閱讀:184 作者:iii 欄目:互聯網科技

本篇內容介紹了“Linux DRM平臺驅動匹配和探測的方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Linux內核通過module_platform_driver(rockchip_drm_platform_driver)函數注冊RK3399 DRM框架驅動代碼,該宏展開如下:

static int __init rockchip_drm_platform_driver_init(void){    return platform_driver_register(&rockchip_drm_platform_driver);}...

下面通過分析函數platform_driver_register()的調用流程,展示RK3399 DRM框架platform_deviceplatform_driver匹配過程和驅動探測過程。

具體調用流程如下:

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        開始match                                2.driver_probe_device()->                  ## dd.c probe                                    really_probe()->                       ## dd.c                                        platform_drv_probe()->             ## platform.c        開始probe                                            rockchip_drm_platform_probe()  ## rockchip_drm_drv.c
一、match實現

在注冊Linux內核platform總線時,相關的總線類型定義如下:

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結構體中定義了platform deviceplatform driver的匹配函數platform_match(),具體實現如下:

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.設備樹匹配    /* Attempt an OF style match first */    if (of_driver_match_device(dev, drv))        return 1;    ## 2.ACPI類型匹配(無)    /* 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 deviceplatform driver的匹配方法包括:

1、設備樹匹配

匹配方法:比較dts設備節點的compatible屬性定義和驅動文件中of_device_id中的compatible定義是否相同。

注:RK3399 DRM驅動使用的是設備樹匹配.

#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類型匹配 (無)

3、id table匹配

4、device和driver名字匹配

二、probe實現

在實現了DRM的platform deviceplatform driver匹配后,會進入Linux內核的platform_driver中的probe探測函數進行DRM驅動探測函數的調用。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實現如下:

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) {            ## 調用各驅動的probe函數(例: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平臺驅動匹配和探測的方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女