跳到主要内容

Rockchip DRM Direct Show 开发指南

:::info 文档信息

文档标识:RK-YH-YF-454 · 发布版本:V1.0.0 · 发布日期:2022-03-01 · 页数:8 · 语言:中文

原始文档:Rockchip_Develop_Guide_DRM_Direct_Show_CN.pdf

:::

章节大纲​

  • Rockchip DRM Direct Show 开发指南(P1)
    • Direct Show API 及使用说明(P4)
      • API 说明(P4)
        • 获取 DRM 设备(P4)
        • 申请内存(P4)
        • 获取 crtc(P5)
        • 获取 plane(P5)
        • 提交显示(P5)
        • 关闭图层(P6)
        • 释放内存(P6)
      • 使用流程(P6)
    • 自动测试用例说明(P7)
    • Kernel Logo 显示说明(P7)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. Direct Show API 及使用说明​

1.1 API 说明​

1.1.1 获取 DRM 设备​

struct drm_device *rockchip_drm_get_dev(void);

用于获取 DRM 设备,后面的内存申请和释放,crtc 和 plane 的获取、提交显示等流程都需要用到 DRM设备。

1.1.2 申请内存​

int rockchip_drm_direct_show_alloc_buffer(struct drm_device *drm,
struct rockchip_drm_direct_show_buffer
*buffer)

buffer 输入:

变量说明
widthbuffer 的宽,单位是 Pixel
heightbuffer 的高,单位是 Pixel
pixel format _buffer 的格式,具体定义可以参考:include/uapi/drm/drm fourcc.h _
flag用于指定 buffer的类型,默认值0是离散非连续内存,ROCKCHIP BO CONTIG是 _ _ 连续内存

buffer 输出:

变量说明
bpp根据 buffer->pixel format 获取的每个 Pixel bit 数量 _
pitch[3]根据 buffer->width、buffer->pixel format 以及一些对齐规则获取当前 buffer 的虚宽 _
vir addr[3] _当前申请 buffer 内核态的虚拟地址
phy addr[3] _当前申请 buffer 的物理地址
rk gem obj _ _rockchip drm gem 驱动用于管理当前 buffer的抽象
fbdrm plane 显示中对当前buffer的抽象
dmabuf fd _当前buffer export 出来的dmabuf fd,可能会被其他模块使用 _

对 buffer->pitch[3]、buffer->vir_addr[3]、buffer->phy_addr[3] 的说明:

以 buffer->pitch[3] 为例,对于 RGB 格式默认使用 buffer->pitch[0],如果是 NV12 格式有2个 plane 的,使用 buffer->pitch[0] 和 buffer->pitch[1],如果是有3个palne 的则使用: buffer->pitch[0]、 buffer->pitch[1] 和buffer->pitch[2]。

1.1.3 获取 crtc​

struct drm_crtc *rockchip_drm_direct_show_get_crtc(struct drm_device *drm)

用于获取当前正在使用的 crtc。

1.1.4 获取 plane​

struct drm_plane *rockchip_drm_direct_show_get_plane(struct drm_device *drm,
char *name)

根据 name 信息获取对应的 plane,获取的 plane 会被用于显示,如获取 Esmart0-win0:

plane = rockchip_drm_direct_show_get_plane(drm_dev, "Esmart0-win0")

1.1.5 提交显示​

int rockchip_drm_direct_show_commit(struct drm_device *drm,
struct rockchip_drm_direct_show_commit_info
*commit_info)
commit info 变量 _说明
crtc指定提交的 crtc
plane指定提交的 plane
buffer提交用于显示的 buffer
top zpos _false:按默认配置,true: 设定最顶层
src x/src y/src w/src h _ _ _ _buffer 中用于显示部分的偏移和大小,具体可以参考下图说明
dst x/dst y/dst w/dst h _ _ _ _当前图层显示在屏幕上的位置和大小,具体可以参考下图说明

1.1.6 关闭图层​

int rockchip_drm_direct_show_disable_plane(struct drm_device *drm,
struct drm_plane *plane)

如不需要继续显示当前图层的信息可以通过该接口关闭图层显示。

1.1.7 释放内存​

void rockchip_drm_direct_show_free_buffer(struct drm_device *drm,
struct rockchip_drm_direct_show_buffer
*buffer)

图层关闭后,如 buffer 无需继续使用,可以通过该接口释放和回收内存。

1.2 使用流程​

Rockchip DRM Direct Show 默认是关闭的,如需要使用该功能,可以在 rockchip_defconfig 将其打开:

diff --git a/arch/arm64/configs/rockchip_defconfig
b/arch/arm64/configs/rockchip_defconfig
index b1c92060c6f9..2e3091f8631f 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -588,6 +588,8 @@ CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
CONFIG_DRM_DP_AUX_CHARDEV=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_ROCKCHIP=y
+CONFIG_ROCKCHIP_DRM_DIRECT_SHOW=y

使用流程基本可以按以下7个步骤进行:

  1. 获取 drm 设备;2. 根据需要申请对应格式和大小的 buffer;3. 向申请的 buffer 中绘制需要的图像;4. 获取 crtc 和 plane;5. 提交显示;6. 如不需要继续显示,可以关闭图层;7. 释放和回收内存;

2. 自动测试用例说明​

基于 Rockchip DRM Direct Show 实现了Rockchip DRM 自动测试程序,可以用于开发者参考使用,也可以用于作为 Rockchip DRM 驱动的自动测试程序。该功能默认是关闭的,可以在 rockchip_defconfig 将其打开:

diff --git a/arch/arm64/configs/rockchip_defconfig
b/arch/arm64/configs/rockchip_defconfig
index b1c92060c6f9..2e3091f8631f 100644
--- a/arch/arm64/configs/rockchip_defconfig
+++ b/arch/arm64/configs/rockchip_defconfig
@@ -588,6 +588,8 @@ CONFIG_DRM_IGNORE_IOTCL_PERMIT=y
CONFIG_DRM_DP_AUX_CHARDEV=y
CONFIG_DRM_LOAD_EDID_FIRMWARE=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_ROCKCHIP_DRM_DIRECT_SHOW=y
+CONFIG_ROCKCHIP_DRM_SELF_TEST=y

3. Kernel Logo 显示说明​

部分产品没有使用 rockchip 官方的 uboot 或者因为某种原因无法打开 uboot logo 显示,但是又需要 kernel logo 显示的,可以通过修改 Direct Show 自动测试程序实现该功能:

diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_self_test.c
b/drivers/gpu/drm/rockchip/rockchip_drm_self_test.c
index 74c395441e96..355632125914 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_self_test.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_self_test.c
@@ -20,7 +20,7 @@
#include "kernel_logo_img.h"
-#define USE_BUFFER_NUM 2
+#define USE_BUFFER_NUM 1
#define BUFFER_WIDTH   652
#define BUFFER_HEIGHT 268
#define BUFFER_FORMAT DRM_FORMAT_RGB565 /*
DRM_FORMAT_RGB565/DRM_FORMAT_XRGB8888/DRM_FORMAT_NV12 */
@@ -159,7 +159,7 @@ static void rockchip_drm_self_test_commit(struct work_struct
*work)
goto free_buffer;
}
-#if 1 /* for self test pattern */
+#if 0 /* for self test pattern */
/* commit to display */
do {
u32 i = 0;

其中 kernel_logo_img.h 是通过使用bmp2hex等工具将 bmp 文件转成对应的数据保存的文件,并根据实际使用的图片修改:BUFFER_WIDTH、BUFFER_HEIGHT 以及BUFFER_FORMAT 的宏定义。

如果无法找到合适的 bmp2hex 工具可以从 rockchip redmine 以下链接搜索 bmp2hex 获取:https://redmine.r ock-chips.com/documents/97。