5

小田BSP的个人空间

 3 years ago
source link: https://my.oschina.net/u/4702401/blog/5037759
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Linux DRM那些事-master设备bind

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

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

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

执行流程见下图:

up-b6f948ec9725a2a747bad374b3ee9ad36e1.png

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设备。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK