[RK3399][Android7.1] Display中的DRM Framebuffer

OS: Android 7.1
Board: Firefly-RK3399
Kernel: v4.4.55

以前产品使用的显示缓存是fb,即framebuffer;
引进drm之后,显示缓存使用的是drm fb了。

在display HAL层默认使用的是drm,可以从Android.mk中得出结论。

hardware/rockchip/hwcomposer/Android.mk:

BOARD_USES_DRM_HWCOMPOSER=true
ifeq ($(strip $(BOARD_USES_DRM_HWCOMPOSER)),true)
LOCAL_SHARED_LIBRARIES := \
	libcutils \
	libdrm \
......
LOCAL_SRC_FILES := \
	autolock.cpp \
	drmresources.cpp \
......
else
......
endif

其中用到了libdrm库,位于external/libdrm下面。


drm设备的添加:

rockchip_drm_platform_probe ->
  component_master_add_with_match ->
    try_to_bring_up_master -> //当所有component被bind之后,会调用master ops->bind,这块见前面drm内容介绍文章
      rockchip_drm_bind ->
        drm_dev_alloc -> //后续对drm的操作都包含在rockchip_drm_driver中,也包含了要注册设备节点对应的file_operations
        drm_dev_register

添加完成之后在/sys/class/drm会看到如下文件:
card0 card0-DSI-1 controlD64 renderD128 version


用户空间操作接口:
rockchip_drm_driver:

static struct drm_driver rockchip_drm_driver = {
......
	.open			= rockchip_drm_open,
......
	.ioctls			= rockchip_ioctls,
	.num_ioctls		= ARRAY_SIZE(rockchip_ioctls),
	.fops			= &rockchip_drm_driver_fops,

};

暴露给用户空间的file_operations是:

static const struct file_operations rockchip_drm_driver_fops = {
	.owner = THIS_MODULE,
	.open = drm_open,
	.mmap = rockchip_gem_mmap,
	.poll = drm_poll,
	.read = drm_read,
	.unlocked_ioctl = drm_ioctl,
#ifdef CONFIG_COMPAT
	.compat_ioctl = drm_compat_ioctl,
#endif
	.release = drm_release,
};

rockchip_drm_driver里的一些回调通过rockchip_drm_driver_fops调用到,比如
drm_open -> drm_open_helper -> dev->driver->open -> rockchip_drm_open


fb注册:
framebuffer的注册也从以往的 kernel/drivers/video/rockchip 挪到了 kernel/drivers/gpu/drm/rockchip 下面。

相关文件:
rockchip_drm_fbdev.c: rk framebuffer配置
rockchip_drm_fb.c: rk DRM fb相关
drm_fb_helper.c: DRM fb标准接口

注册流程:

rockchip_drm_bind ->
  rockchip_drm_fbdev_init ->
    drm_fb_helper_init //关联crtc
    drm_fb_helper_single_add_all_connectors //关联connector
    drm_fb_helper_initial_config -> 
      drm_fb_helper_probe_connector_modes ->	//配置connector的模式
        connector->funcs->fill_modes -> //当前用的是edp panel, 所以调用的是analogix_dp_connector_funcs里的函数指针
          drm_helper_probe_single_connector_modes analogix_dp_core.c
      drm_setup_crtcs //配置crtc
      drm_fb_helper_single_fb_probe ->	//注册fb
        fb_helper->funcs->fb_probe //注册之前先配置fb_info
        rockchip_drm_fbdev_create -> rockchip_drm_fbdev.c
                drm_fb_helper_alloc_fbi ->
                  framebuffer_alloc //分配一个标准struct fb_info
               rockchip_drm_framebuffer_init -> //初始化drm的framebuffer,注意不是之前说的标准显示框架中的framebuffer, 结构是struct drm_framebuffer
            rockchip_fb_alloc ->
              drm_helper_mode_fill_fb_struct //获取pitches,offsets, pixel_format等参数填充到fb中。
              drm_framebuffer_init  //记录当前fb个数,并且关联创建fb内存的回调函数,主要是rockchip_drm_fb_funcs变量里的rockchip_drm_fb_create_handle(),使用GEM分配内存
      register_framebuffer

register_framebuffer这个留着应该是还需要兼容标准的控制命令吧,这个是根据在HAL有对fb有ioctl的操作推断的,不是很确定,没有深入研究。

打开:
ctx->fb_fd = open("/dev/graphics/fb0", O_RDWR, 0);
控制:
 int err = ioctl(ctx->fb_fd, FBIOBLANK, fb_blank);

你可能感兴趣的:(子类__Display,RK3399)