美文网首页嵌入式软硬件
Linux DRM那些事-master设备bind

Linux DRM那些事-master设备bind

作者: 小田BSP | 来源:发表于2021-05-01 11:02 被阅读0次

    本文介绍RockPI 4A单板DRM模块master设备bind函数rockchip_drm_bind()

    文件:drivers/gpu/drm/rockchip/rockchip_drm_drv.c

    功能:完成DRM主设备的初始化,并调用所有从设备的bind函数初始化整个显示系统。

    执行流程见下图:

    rockchip_drm_bind函数

    1、drm_dev_alloc(&rockchip_drm_driver, dev)

    功能:分配并初始化一个DRM设备,后续调用drm_dev_register()完成设备注册。

    重点关注设备驱动实现(rockchip_drm_driver),后续配合libdrm介绍

    static struct drm_driver rockchip_drm_driver = {
        .driver_features    = DRIVER_MODESET | DRIVER_GEM |
                      DRIVER_PRIME | DRIVER_ATOMIC |
                      DRIVER_RENDER,
        .preclose       = rockchip_drm_preclose,
        .lastclose      = rockchip_drm_lastclose,
        .get_vblank_counter = drm_vblank_no_hw_counter,
        .open           = rockchip_drm_open,
        .postclose      = rockchip_drm_postclose,
        .enable_vblank      = rockchip_drm_crtc_enable_vblank,   
        .disable_vblank     = rockchip_drm_crtc_disable_vblank,  
        .gem_vm_ops     = &rockchip_drm_vm_ops,
        .gem_free_object    = rockchip_gem_free_object,
        .dumb_create        = rockchip_gem_dumb_create,          
        .dumb_map_offset    = rockchip_gem_dumb_map_offset,      
        .dumb_destroy       = drm_gem_dumb_destroy,
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
        .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
        .gem_prime_import   = drm_gem_prime_import,
        .gem_prime_export   = drm_gem_prime_export,
        .gem_prime_get_sg_table = rockchip_gem_prime_get_sg_table,
        .gem_prime_import_sg_table  = rockchip_gem_prime_import_sg_table,
        .gem_prime_vmap     = rockchip_gem_prime_vmap,
        .gem_prime_vunmap   = rockchip_gem_prime_vunmap,
        .gem_prime_mmap     = rockchip_gem_mmap_buf,
        .gem_prime_begin_cpu_access = rockchip_gem_prime_begin_cpu_access,
        .gem_prime_end_cpu_access = rockchip_gem_prime_end_cpu_access,
    #ifdef CONFIG_DEBUG_FS
        .debugfs_init       = rockchip_drm_debugfs_init,
        .debugfs_cleanup    = rockchip_drm_debugfs_cleanup,
    #endif
        .ioctls         = rockchip_ioctls,
        .num_ioctls     = ARRAY_SIZE(rockchip_ioctls),
        .fops           = &rockchip_drm_driver_fops,
        .name   = DRIVER_NAME,
        .desc   = DRIVER_DESC,
        .date   = DRIVER_DATE,
        .major  = DRIVER_MAJOR,
        .minor  = DRIVER_MINOR,
    }
    

    drm_开头的函数是DRM框架已实现的函数,各厂家可直接使用,无需适配。

    2、drm_dev_set_unique(drm_dev, "%s", dev_name(dev))

    功能:设置DRM设备的唯一名称(dev->unique),即display-subsystem

    3、devfreq_get_devfreq_by_phandle(dev, 0)

    功能:获取devfreq

    4、devm_clk_get(dev, "hdmi-tmds-pll")

    功能:获取hdmi-tmds-pll时钟。

    5、devm_clk_get(dev, "default-vop-pll")

    功能:获取default-vop-pll时钟。

    6、fence_context_alloc(1)

    功能:分配1组fence contexts

    7、rockchip_drm_init_iommu(drm_dev)

    功能:初始化IOMMU

    IOMMU(Input/Output Memory Management Unit):把设备访问的虚拟地址转换成物理地址。

    MMU:把CPU访问的虚拟地址转换成物理地址。

    8、drm_mode_config_init(drm_dev)

    功能:初始化mode_config,创建DRM框架标准属性。

    9、rockchip_drm_mode_config_init(drm_dev)

    功能:设置rockchip mode_config的宽和高限制,注册drm_mode_config_funcs

    static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
        .fb_create = rockchip_user_fb_create, 
        .output_poll_changed = rockchip_drm_output_poll_changed,
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = rockchip_drm_atomic_commit,
    };
    

    10、rockchip_drm_create_properties(drm_dev)

    功能:设置rockchip drm属性。

    11、component_bind_all(dev, drm_dev)

    功能:调用所有从设备bind驱动。

    12、rockchip_attach_connector_property(drm_dev)

    功能:赋值connector的属性(brightness、contrast、saturation和hue)。

    brightness:亮度

    contrast:对比度

    saturation:饱和度

    hue:色调

    13、drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc)

    功能:初始化vblank

    14、drm_mode_config_reset(drm_dev)

    功能:复位Plane、CRTC、Encoder和Connector

    15、rockchip_drm_set_property_default(drm_dev)

    功能:设置Connector的默认属性。

    16、drm_kms_helper_poll_init(drm_dev)

    功能:使能KMS轮询机制。

    17、rockchip_gem_pool_init(drm_dev)

    功能:初始化内存池。

    18、of_reserved_mem_device_init(drm_dev->dev)

    功能:将dts配置中预留的memory分配给device

    19、rockchip_drm_fbdev_init(drm_dev)

    功能:初始化framebuffer

    20、drm_dev_register(drm_dev, 0)

    功能:注册DRM设备。

    注:本文仅在简书、OSCHINA和今日头条发布过,转载请标注原作者和链接。

    相关文章

      网友评论

        本文标题:Linux DRM那些事-master设备bind

        本文链接:https://www.haomeiwen.com/subject/ufyarltx.html