本文介绍RockPI 4A
单板DRM
模块master
设备bind
函数rockchip_drm_bind()
。
文件:drivers/gpu/drm/rockchip/rockchip_drm_drv.c
。
功能:完成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
设备。