本文介紹RockPI 4A
單板DRM
模塊master
設備bind
函數rockchip_drm_bind()
。框架
文件:drivers/gpu/drm/rockchip/rockchip_drm_drv.c
。函數
功能:完成DRM
主設備的初始化,並調用全部從設備的bind
函數初始化整個顯示系統。post
執行流程見下圖:atom
一、drm_dev_alloc(&rockchip_drm_driver, dev)spa
功能:分配並初始化一個DRM
設備,後續調用drm_dev_register()
完成設備註冊。debug
重點關注設備驅動實現(rockchip_drm_driver
),後續配合libdrm介紹
。code
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
框架已實現的函數,各廠家可直接使用,無需適配。component
二、drm_dev_set_unique(drm_dev, "%s", dev_name(dev))blog
功能:設置DRM
設備的惟一名稱(dev->unique
),即display-subsystem。
ip
三、devfreq_get_devfreq_by_phandle(dev, 0)
功能:獲取devfreq
。
四、devm_clk_get(dev, "hdmi-tmds-pll")
功能:獲取hdmi-tmds-pll
時鐘。
五、devm_clk_get(dev, "default-vop-pll")
功能:獲取default-vop-pll
時鐘。
六、fence_context_alloc(1)
功能:分配1組fence contexts
。
七、rockchip_drm_init_iommu(drm_dev)
功能:初始化IOMMU
。
IOMMU(Input/Output Memory Management Unit)
:把設備訪問的虛擬地址轉換成物理地址。
MMU
:把CPU
訪問的虛擬地址轉換成物理地址。
八、drm_mode_config_init(drm_dev)
功能:初始化mode_config
,建立DRM
框架標準屬性。
九、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, };
十、rockchip_drm_create_properties(drm_dev)
功能:設置rockchip drm
屬性。
十一、component_bind_all(dev, drm_dev)
功能:調用全部從設備bind
驅動。
十二、rockchip_attach_connector_property(drm_dev)
功能:賦值connector
的屬性(brightness、contrast、saturation和hue
)。
brightness
:亮度
contrast
:對比度
saturation
:飽和度
hue
:色調
1三、drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc)
功能:初始化vblank
。
1四、drm_mode_config_reset(drm_dev)
功能:復位Plane、CRTC、Encoder和Connector
。
1五、rockchip_drm_set_property_default(drm_dev)
功能:設置Connector
的默認屬性。
1六、drm_kms_helper_poll_init(drm_dev)
功能:使能KMS
輪詢機制。
1七、rockchip_gem_pool_init(drm_dev)
功能:初始化內存池。
1八、of_reserved_mem_device_init(drm_dev->dev)
功能:將dts
配置中預留的memory
分配給device
。
1九、rockchip_drm_fbdev_init(drm_dev)
功能:初始化framebuffer
。
20、drm_dev_register(drm_dev, 0)
功能:註冊DRM
設備。