Rockchip · AI & Linux Hub

显示与音频

Rockchip RT-Thread 显示完整开发指南:VOP、面板、局部刷新与 Color Key

Rockchip RT-Thread 显示完整开发指南:VOP、面板、局部刷新与 Color Key — V1.4.0

· ArmSoM Editorial · Rockchip source documentation · 17 分钟阅读

完整整理中文 RK-KF-YF-105 V1.4.0 的技术正文。原稿支持范围见下表,属于 RT-Thread 驱动,不是 Linux DRM 配置。ArmSoM 使用前必须核对具体 SoC、RT-Thread BSP/HAL、VOP、显示接口、面板型号、时序与供电;未确认具体板卡组合,因此标为平台参考,不声称所有板卡支持。无英文原稿,四语全部使用中文 PDF 的16幅技术原图,表格/代码截图另转为可编辑正文。原文示例未作硬件验证。

SoC RT-Thread
RK2108 lts-v3.1.x
RK3308 lts-v4.1.x
RV1109/RV1126 lts-v3.1.x
RV1103/RV1106 lts-v4.1.x
RK2118 lts-v4.1.x
RK3506 lts-v4.1.x

原文疑点保留:VOP文件表写 dsp/rockchip-common/...,其他路径写bsp;色矩阵图的列向量乘法顺序以及部分定点结果(如0.0691对应0x05、0.0880对应0x08)与所述乘0x80方法不一致;未改值。6.4把hsync/vsync称为porch,而图写pulse,MIPI时钟单位原样为Mbps。第4章结构表不是第7章示例所用字段的完整清单。图中的初始化数组是截图片段,不补造结尾或命令;原文YUVY422拼写保留。请按实际HAL、寄存器和屏规格核对,不直接运行未核实初始化值。

ArmSoM Docs · RT-Thread

1. 概述

Rockchip RT-Thread 显示驱动基于 RT-Thread IO 设备驱动模型向 OS 注册 LCD 驱动,能支持 LittlevGL 等GUI 应用,同时为了充分发挥 Rockchip 显示模块的性能,我们拓展了一些接口,加入了多图层合成、颜色效果调整、后级缩放、MIPI switch 等功能的支持。

1.1 基本概念

CRTC:显示控制器,在 rockchip 平台是 SOC 内部 VOP(部分文档也称为 LCDC)模块的抽象;Plane:图层,在 rockchip 平台是 SOC 内部 VOP(LCDC)模块 win 图层的抽象;Encoder/Connector:输出转换器的软件抽象,指 RGB、LVDS、DSI、eDP、HDMI 等显示接口;Panel:各种 LCD、HDMI 等显示设备的抽象;

1.2 显示通路

RK2108

RK2108显示通路

RK2108显示通路

其他平台详见文档《Rockchip_Developer_Guide_DRM_Display_Driver_CN》中关于显示通路的介绍。

2. 软件框架

显示软件框架

显示软件框架

2.1 Driver 层驱动文件

Driver File description
Core bsp/rockchip-common/drivers/drv_display.c rt-thread 显示框架文件,负责向 rt-thread 注册显示驱
动,加载显示模块驱动,负责应用和显示驱动的对
接,管理所有显示模块。
VOP bsp/rockchip-common/drivers/drv_vop.c
dsp/rockchip-common/drivers/drv_vop.h
VOP 显示模块驱动
DSI bsp/rockchip-common/drivers/drv_dsi.c
bsp/rockchip-common/drivers/drv_dsi.h
DSI/DPHY 显示模块驱动
PANEL bsp/rockchip-common/drivers/drv_panel.c
bsp/rockchip-common/drivers/drv_panel_cfg.h
panel 驱动,抽象初始化命令,时序,电源管理等屏
相关的操作。

2.2 HAL 层驱动文件

Driver File Description
Core bsp/rockchip-common/hal/lib/hal/inc/hal_display.h 显示相关基础数据结构的定义
VOP bsp/rockchip-common/hal/lib/hal/src/hal_vop.c
bsp/rockchip-common/hal/lib/hal/inc/hal_vop.h
VOP 模块硬件基础功能的实现
DSI bsp/rockchip-common/hal/lib/hal/src/hal_dsi.c
bsp/rockchip-common/hal/lib/hal/inc/hal_dsi.h
DSI/DPHY 模块硬件功能实现

3. 常用接口说明

rt-thread GUI 应用和驱动通过各种 control(类似 linux 下的 IOCTL)交互,目前扩展的 control 主要有以下几个:

Control Description
RK_DISPLAY_CTRL_ENABLE 打开显示设备
RK_DISPLAY_CTRL_DISABLE 关闭显示设备
RK_DISPLAY_CTRL_SET_PLANE 设定指定图层
RK_DISPLAY_CTRL_SET_SCALE 设置后级缩放
RK_DISPLAY_CTRL_LOAD_LUT 配置 bpp 格式的查找表
RK_DISPLAY_CTRL_SET_COLOR_MATRIX 设置颜色转换矩阵
RK_DISPLAY_CTRL_SET_GAMMA_COE 设置 gamma 调节系数
RK_DISPLAY_CTRL_SET_BCSH 配置 bcsh 调节系数,用于调节亮度,对比度,饱
和度和色度
RK_DISPLAY_CTRL_SET_POST_CLIP 设置 clip 系数
RK_DISPLAY_CTRL_MIPI_SWITCH 切换 MIPI switch 通路
Control Description
RK_DISPLAY_CTRL_COMMIT 更新显示配置

4. 关键数据结构说明

4.1 struct display_state

显示驱动最核心的结构体,包括了 RTT 中定义的 device 结构体和 graphic_info 以及 rockchip 平台对硬件设备抽象的结构体。

Parameters Description
struct rt_device_graphic_info graphic_info RTT 驱动中描述显示设备信息的结构体
struct rt_device lcd LCD 设备结构体
uint32_t *rtt_framebuffer RTT 驱动中 frambuffer 的地址
struct crtc_state crtc_state 用于描述 Rockchip 显示控制器 VOP
struct connector_state conn_state 用于描述 Rockchip 显示转换模块 MIPI DSI
struct panel_state panel_state 用于描述显示设备初始化命令,电源等相关信息
struct DISPLAY_MODE_INFO mode 用于描述扫描时序等屏相关信息

4.2 struct crtc_state

用于描述 Rockchip 处理器 VOP 模块的结构体,主要包括以下信息:

Parameters Description
struct VOP_REG *hw_base VOP 模块寄存器基地址
const struct rockchip_crtc_funcs *funcs 实现 vop 模块基本功能的函数指针
struct CRTC_WIN_STATE win_state WIN 图层的结构
struct VOP_POST_SCALE_INFO post_scale 用于描述后级缩放信息
uint8_t irqno VOP 模块的中断号
uint8_t power_state 电源状态

4.3 struct CRTC_WIN_STATE

用于描述 Rockchip 处理器 VOP 模块 WIN 图层的结构体,主要包括以下信息:

Parameters Description
bool winEn 图层控制开关 0:关闭图层,1:打开图层
uint8_t winId 图层指定,0,1,2 分别表示 win0,win1,win2
uint8_t zpos 图层z序配置,0,1,2 表示图层从低到高的顺序
uint8_t format 格式配置,可以配置的值参考 rt-thread/include/rtdef.h
uint32_t yrgbAddr RGBX 格式地址或者 YUV 数据 Y 分量地址
uint32_t cbcrAddr YUV 数据 UV 分量地址
uint16_t xVir 虚宽,需要 4Byte 对齐
uint16_t srcX 图层在屏上显示位置的 X 坐标
uint16_t srcY 图层在屏上显示位置的 Y 坐标
uint16_t srcW 图层在屏上显示的宽
uint16_t srcH 图层在屏上显示的高
uint8_t hwFormat 驱动转换成硬件的配置,应用层无需配置
uint16_t hwCrtcX 驱动转换成硬件的配置,应用层无需配置
uint16_t hwCrtcY 驱动转换成硬件的配置,应用层无需配置
uint16_t xLoopOffset X 方向 loop 配置
uint16_t yLoopOffset Y 方向 loop 配置
bool alphaEn alpha 使能配置
uint8_t alphaMode alpha 模式,全局 alpha:VOP_ALPHA_MODE_USER_DEFINED 或者
per-pixel:alpha VOP_ALPHA_MODE_PER_PIXEL
uint8_t alphaPreMul 是否 alpha 预乘:YES:VOP_PREMULT_ALPHA,
NO:VOP_NON_PREMULT_ALPHA
uint8_t alphaSatMode 是否修改 alpha 的值:1:alpha = alpha + alpha[7],
0:alpha value no change,建议配置为 0
uint8_t globalAlphaValue 全局 alpha 的值:0~0xff
uint32_t *lut bpp 格式查找表,可以参考 display_test.c 中的定义,也可以用户自定义

4.4 struct VOP_POST_SCALE_INFO

用于描述 Rockchip 处理器 VOP 模块后级缩放的结构体,主要包括以下信息:

Parameters Description
uint16_t srcW 缩放源 x 方向的分辨率
uint16_t srcH 缩放源 y 方向的分辨率
uint16_t dstX 缩放后在屏上显示位置的 X 坐标
uint16_t dstY 缩放后在屏上显示位置的 Y 坐标
uint16_t dstW 缩放后在屏上显示的宽
uint16_t dstH 缩放后在屏上显示的高
bool postScaleEn 硬件缩放使能配置,驱动做判断,应用层无需配置
eVOP_PostSclMode postSclHmode 硬件缩放倍数,驱动做计算,应用层无需配置
eVOP_PostSclMode postSclVmode 硬件缩放倍数,驱动做计算,应用层无需配置

4.5 struct VOP_BCSH_INFO

用于描述 Rockchip 处理器 VOP 模块后级 BCSH 的结构体,主要包括以下信息:

Parameters Description
uint8_t brightness 修改亮度,配置范围 0~100,默认值为 50
uint8_t contrast 修改对比度,配置范围 0~100,默认值为 50
uint8_t satCon 修改饱和度,配置范围 0~100,默认值为 50
uint8_t hue 修改色度,配置范围 0~100,默认值为 50

4.6 struct VOP_COLOR_MATRIX_INFO

用于描述 Rockchip 处理器 VOP 模块后级 color matrix 的结构体,主要包括以下信息:

Parameters Description
bool colorMatrixEn 控制开关
uint8_t *colorMatrixCoe 转换矩阵系数
uint8_t *colorMatrixOffset 转换矩阵偏移

颜色转换矩阵原图

颜色转换矩阵原图

[csc_out0]   [csc_in0]   [coe00 coe01 coe02]   [offset0]
[csc_out1] = [csc_in1] X [coe10 coe11 coe12] + [offset1]
[csc_out2]   [csc_in2]   [coe20 coe21 coe22]   [offset2]

例子:bt709tobt2020 转换矩阵:

{0.6274, 0.3293, 0.0433},
{0.0691, 0.9195, 0.0114},
{0.0164, 0.0880, 0.8956}

按 0x80 定点后为(bit7 为符号位)

coe00 = 0.6274 * 0x80  = 0x50
coe01 = 0.3293 * 0x80  = 0x2a
coe02 = 0.0433 * 0x80  = 0x05

同理可得:

colorMatrixCoe[3][3] = {
    {0x50, 0x2a, 0x05},
    {0x05, 0x75, 0x02},
    {0x02, 0x08, 0x72}
};

4.7 struct VOP_POST_CLIP_INFO

用于描述 Rockchip 处理器 VOP 模块后级 clip 的结构体,主要包括以下信息:

Parameters Description
bool postClipEn 控制开关
uint8_t postYThres 需要 clip 的值

5. 对齐要求

5.1 数据对齐要求

RK2108

RK2108数据对齐要求

RK2108数据对齐要求

格式 crtc W (pixel对齐) crtc H (行对齐) xLoopOffset (pixel对齐) yLoopOffset (行对齐) xVir (Byte对齐) act_xoff (pixel对齐) act_yoff (行对齐)
RGB ARGB8888 1 1 1 1 4 1 1
RGB RGB888 1 1 1 1 4 1 1
RGB RGB565 1 1 1 1 4 1 1
RGB RGB444 1 1 2 1 4 2 1
YUV YUV420 4bit 4 2 4 2 4 4 2
YUV YUV420 8bit 2 2 2 2 4 2 2
YUV YUV422 4bit 4 1 4 1 4 4 1
YUV YUV422 8bit 2 1 2 1 4 2 1
YUV YUV444 4bit 4 1 4 1 4 4 1
YUV YUV444 8bit 1 1 1 1 4 1 1
YUV YUVY422 4bit 2 1 2 1 4 2 1
YUV YUVY422 8bit 2 1 2 1 4 2 1
8BPP 1 1 1 1 4 1 1
4BPP 1 1 2 1 4 2 1
2BPP 1 1 4 1 4 4 1
1BPP 1 1 8 1 4 8 1

5.2 屏对齐要求

有些屏本身有对齐要求,以 S6E3HC2 屏为例:配置为 1440x3120 的时候 DSC 的 slice 大小为 720x65,所以区域刷新时显示的位置需要按 720x65 对齐,显示区域的大小需要按 720x195 对齐;配置为 720x1560 的时候 DSC 的 slice 大小为 360x52,所以区域刷新时显示的位置需要按 360x52 对齐,显示区域的大小需要按 360x390 对齐。

6. 屏配置说明

6.1 选择驱动已支持的屏

按以下通路选择对应屏的配置文件:

cd bsp/rockchip-pisces
    scons --menuconfig
        RT-Thread rockchip common drivers  --->
            Panel Type (R17 SS mipi panel, resolution is 1080x2340)  --->

6.2 增加一块新的屏支持

  1. 进入屏配置文件目录:cd bsp/rockchip-common/drivers/panel_cfg;

  2. 拷贝当前目录下的一个.h 文件 new_panel.h,参考本文 6.4 章节并根据屏 spec 的定义,修改文件中屏的配置参数;

  3. 回到上一级目录 cd ../;即 bsp/rockchip-common/drivers/目录下;

  4. 打开 Kconfig 文件 ,搜索 ”Panel Type”,参考其他 config RT_USING_PANEL 配置定义新屏的配置RT_USING_PANEL_NEW_PANEL;

Kconfig新增面板示例

Kconfig新增面板示例

--- a/bsp/rockchip-common/drivers/Kconfig
+++ b/bsp/rockchip-common/drivers/Kconfig
@@ -58,6 +58,9 @@ choice

     config RT_USING_PANEL_S6E3HC2_X4
        bool "S6E3HC2_X4 mipi panel, resolution is 720x1560"
+
+    config RT_USING_PANEL_NEW_PANEL
+       bool "It's a new panel demo, resolution is wxh"
 endchoice

6.3 常见的扫描时序图

显示扫描时序

显示扫描时序

6.4 屏配置参数说明

Parameters Description
RT_HW_LCD_XRES 屏水平方向分辨率,对应 6.3 图中的 hactive
RT_HW_LCD_YRES 屏垂直方向分辨率,对应 6.3 图中的 vactive
RT_HW_LCD_PIXEL_CLOCK 像素时钟,单位 khz
RT_HW_LCD_LANE_MBPS MIPI DPHY CLK Lane 时钟,单位 Mbps
RT_HW_LCD_LEFT_MARGIN 屏左消隐,对应 6.3 图中的 hback-porch
RT_HW_LCD_RIGHT_MARGIN 屏右消隐,对应 6.3 图中的 hfront-porch
RT_HW_LCD_UPPER_MARGIN 屏上消隐,对应 6.3 图中的 vback-porch
RT_HW_LCD_LOWER_MARGIN 屏下消隐,对应 6.3 图中的 vfront-porch
RT_HW_LCD_HSYNC_LEN 屏水平同步时间,对应 6.3 图中的 hsync-porch
RT_HW_LCD_VSYNC_LEN 屏垂直同步时间,对应 6.3 图中的 vsync-porch
RT_HW_LCD_CONN_TYPE 屏的类型,如: RK_DISPLAY_CONNECTOR_DSI
RT_HW_LCD_BUS_FORMAT 屏的接口类型,如:
MEDIA_BUS_FMT_RGB888_1X24
RT_HW_LCD_VMODE_FLAG 屏的极性、是否支持 DSC 配置等
RT_HW_LCD_INIT_CMD_TYPE CMD 类型, CMD_TYPE_DEFAULT 默认为 mipi
CMD
RT_HW_LCD_DISPLAY_MODE CMD 模式和 video 模式选择
RT_HW_LCD_AREA_DISPLAY 是否支持区域刷新
RT_HW_LCD_XACT_ALIGN 屏显示区域宽对齐要求,单位为像素
RT_HW_LCD_YACT_ALIGN 屏显示区域高对齐要求,单位为像素
Parameters Description
RT_HW_LCD_XPOS_ALIGN 屏显示区域X坐标对齐要求,单位为像素
RT_HW_LCD_YPOS_ALIGN 屏显示区域Y坐标对齐要求,单位为像素
RT_HW_LCD_PREPARE_DELAY_MS 屏准备就绪可以开始接收图像数据所需时间,单位为
毫秒
RT_HW_LCD_UNPREPARE_DELAY_MS 屏完全掉电所需时间,单位为毫秒
RT_HW_LCD_ENABLE_DELAY_MS 屏从准备就绪到正常显示图像所需时间,单位为毫秒
RT_HW_LCD_DISABLE_DELAY_MS 屏从正常显示图像状态退出所需时间,单位为毫秒
RT_HW_LCD_INIT_DELAY_MS 屏从复位到可以正常发送初始化命令所需时间,单位
为毫秒
RT_HW_LCD_RESET_DELAY_MS 屏完整复位所需时间,单位为毫秒
struct rockchip_cmd cmd_on[] 屏初始化命令
struct rockchip_cmd cmd_off[] 屏反初始化命令
struct rockchip_cmd cmd_aod_on[] 屏进入aod模式初始化命令
struct rockchip_cmd cmd_aod_off[] 屏退出aod模式初始化命令

6.5 屏初始化命令说明

  1. 下面以 MIPI DSI CMD 为例说明:

初始化命令截图片段

初始化命令截图片段

struct rockchip_cmd cmd_on[] =
{
    /* sleep out */
    {0x05, 0x05, 0x01, {0x11}},
    /* FD Setting */
    {0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},
    {0x23, 0x00, 0x02, {0xb0, 0x01}},
    {0x23, 0x00, 0x02, {0xcd, 0x01}},
    {0x29, 0x14, 0x03, {0xf0, 0xa5, 0xa5}},
    /* 4. Common Setting */
    /* 4.1 TE(Vync) ON/OFF */
    {0x29, 0x00, 0x03, {0x9f, 0xa5, 0xa5}},
    {0x15, 0x00, 0x02, {0x35, 0x00}},
    {0x29, 0x00, 0x03, {0x9f, 0x5a, 0x5a}},

前 3 个字节(16 进制),分别代表 Data Type,Delay,Payload Length,从第四个字节开始的数据代表长度为 Payload Length 的实际有效数据。

  1. 第一条命令的解析如下:

第一条初始化命令

第一条初始化命令

/* sleep out */
{0x05, 0x05, 0x01, {0x11}},

Data Type:0x05 (DCS Short Write)Delay:0x05 (5 ms)Payload Length:0x01 (1 Bytes)Payload:0x11

  1. 第二条命令解析如下:

第二条初始化命令

第二条初始化命令

/* FD Setting */
{0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},

Data Type:0x29 (Gereric Long Write)Delay:0x00 (0 ms)Payload Length:0x03 (3 Bytes)Payload:0xf0 0x5a 0x5a

  1. Data Type 定义

处理器源数据包类型表

处理器源数据包类型表

Data Type (hex) Data Type (binary) 说明 包类型
0x01 00 0001 垂直同步开始 短
0x11 01 0001 垂直同步结束 短
0x21 10 0001 水平同步开始 短
0x31 11 0001 水平同步结束 短
0x08 00 1000 传输结束包 (EoTp) 短
0x02 00 0010 关闭颜色模式(CM)命令 短
0x12 01 0010 开启颜色模式(CM)命令 短
0x22 10 0010 关闭外设命令 短
0x32 11 0010 开启外设命令 短
0x03 00 0011 Generic短写,无参数 短
0x13 01 0011 Generic短写,1个参数 短
0x23 10 0011 Generic短写,2个参数 短
0x04 00 0100 Generic读,无参数 短
0x14 01 0100 Generic读,1个参数 短
0x24 10 0100 Generic读,2个参数 短
0x05 00 0101 DCS短写,无参数 短
0x15 01 0101 DCS短写,1个参数 短
0x06 00 0110 DCS读,无参数 短
0x37 11 0111 设置最大返回包大小 短
0x09 00 1001 空包,无数据 长
0x19 01 1001 消隐包,无数据 长
0x29 10 1001 Generic长写 长
0x39 11 1001 DCS长写/write_LUT命令包 长
0x0C 00 1100 松散打包像素流,20-bit YCbCr,4:2:2 长
0x1C 01 1100 打包像素流,24-bit YCbCr,4:2:2 长
0x2C 10 1100 打包像素流,16-bit YCbCr,4:2:2 长
0x0D 00 1101 打包像素流,30-bit RGB,10-10-10 长
0x1D 01 1101 打包像素流,36-bit RGB,12-12-12 长

数据包类型续表

数据包类型续表

Data Type (hex) Data Type (binary) 说明 包类型
0x3D 11 1101 打包像素流,12-bit YCbCr,4:2:0 长
0x0E 00 1110 打包像素流,16-bit RGB,5-6-5 长
0x1E 01 1110 打包像素流,18-bit RGB,6-6-6 长
0x2E 10 1110 松散打包像素流,18-bit RGB,6-6-6 长
0x3E 11 1110 打包像素流,24-bit RGB,8-8-8 长
0xX0 / 0xXF / unspecified XX 0000 / XX 1111 禁止使用;全部未指定代码为保留值  
  1. DCS Write

DCS Write类型

DCS Write类型

Data Type (hex) Data Type (binary) 说明 包类型
0x05 00 0101 DCS短写,无参数 短
0x15 01 0101 DCS短写,1个参数 短
0x39 11 1001 DCS长写/write_LUT命令包 长

DCS packet 包括一个字节的 dcs 命令,以及 n 个字节的 parameters。如果 n < 2,将以 Short Packet 的形式对 Payload 进行打包。n = 0,表示只发送 dcs 命令,不带参数,DataType 为 0x05;n = 1,表示发送 dcs 命令,带一个参数,Data Type 为 0x15。如果 n >= 2,将以 Long Packet 的形式对 Payload 进行打包。此时发送 dcs 命令,带 n 个参数,Data Type为 0x39。

  1. Generic Write

Generic Write类型

Generic Write类型

Data Type (hex) Data Type (binary) 说明 包类型
0x03 00 0011 Generic短写,无参数 短
0x13 01 0011 Generic短写,1个参数 短
0x23 10 0011 Generic短写,2个参数 短
0x29 10 1001 Generic长写 长

Gerneic Packet 包括 n 个字节的 parameters。如果 n < 3,将以 Short Packet 的形式对 Payload 进行打包。n = 0,表示 no parameters,Data Type 为0x03;n = 1,表示 1 parameter,Data Type 为 0x13;n = 2,表示 2 parameters,Data Type 为 0x23。如果 n >= 3,将以 Long Packet 的形式进行对 Payload 打包,表示 n parameters,Data Type 为 0x29。

  1. Delay表示当前 Packet 发送完成之后,需要延时多少 ms,再开始发送下一条命令。

  2. Payload Length表示 Packet 的有效负载长度。

  3. Payload表示 Packet 的有效负载,长度为 Payload Length。

  4. Example

调光设置与命令示例

调光设置与命令示例

Command R/W Values 说明
0xF0 W { 0x5A, 0x5A } 二级密钥访问使能
0xB0 W { 0x07 }  
0xB7 W { 0xXX }; /* 0xFF : 255Frames; ~; 0x01 : 1Frame */ 调光速度设置
0xF0 W { 0xA5, 0xA5 } 二级密钥访问禁用
0x53 W { 0x28 } WRCTRLD
0x51 W { 0xXX, 0xXX }; /* Brightness can control */ WRDISBV
/* 5.1 Dimming Setting */
{0x29, 0x00, 0x03, {0xf0, 0x5a, 0x5a}},
{0x23, 0x00, 0x02, {0xb0, 0x07}},
{0x23, 0x00, 0x02, {0xb7, 0x01}},
{0x29, 0x00, 0x03, {0xf0, 0xa5, 0xa5}},
{0x15, 0x00, 0x02, {0x53, 0x28}},
{0x39, 0x00, 0x03, {0x51, 0x03, 0xff}},

7. display_test 工具

display_test 仅适用于 RK2108 平台,其他平台需要使用下文中介绍的 modetest 工具来测试显示功能。

7.1 支持的测试 case

使用命令:

display_test cmd
dsc; winloop; winmove; winalpha; scale; coe;  bcsh; gamma; clip; mipi_switch;
ebook; color_bar
CMD Description
winloop 测试图层 loop 功能
winmove 测试图层的移动
dsc 根据 2k 屏 dsc 对齐要求测试区域刷新
winalpha 测试图层 alpha 功能
scale 测试后级缩放功能
coe 测试验证转换转换功能,demo 中使用 709to2020
bcsh 测试 bcsh 改变亮度、对比度、饱和度、色度
gamma 通过 gamma 曲线改变显示效果
clip 测试 clip 功能
mipi_switch 测试 mipi switch 功能
ebook 显示 1bpp 格式图片的电子书 demo
color_bar 显示 color_bar loop 的 demo

7.2 demo 说明

  1. LCD 设备
g_display_dev = rt_device_find("lcd");
RT_ASSERT(g_display_dev != RT_NULL);
  1. 打开 lcd 设备
ret = rt_device_open(g_display_dev, RT_DEVICE_FLAG_RDWR);
RT_ASSERT(ret == RT_EOK);
  1. 使能 lcd 设备
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_ENABLE, NULL);
RT_ASSERT(ret == RT_EOK);
  1. 获得屏相关信息
ret = rt_device_control(g_display_dev, RTGRAPHIC_CTRL_GET_INFO, (void *)graphic_info);
RT_ASSERT(ret == RT_EOK);
  1. 初始化 win_config, post_scale 配置信息win_config 的初始化:
static void display_win_init(struct CRTC_WIN_STATE *win_config)
{
    win_config->winEn = true;
    win_config->winId = 0;
    win_config->zpos  = 0;
    win_config->format   = SRC_DATA_FMT;
    win_config->yrgbAddr = (uint32_t)rtt_framebuffer_test;
    win_config->cbcrAddr = (uint32_t)rtt_framebuffer_uv;
    win_config->yrgbLength = 0;
    win_config->cbcrLength = 0;
    win_config->xVir = SRC_DATA_W;
    win_config->srcX = 0;
    win_config->srcY = 0;
    win_config->srcW = SRC_DATA_W;
    win_config->srcH = SRC_DATA_H;
    win_config->crtcX = 0;
    win_config->crtcY = 0;
    win_config->crtcW = SRC_DATA_W;
    win_config->crtcH = SRC_DATA_H;
    win_config->xLoopOffset = 0;
    win_config->yLoopOffset = 0;
}

post_scale 初始化(全屏显示不缩放)

static void display_post_init(struct CRTC_WIN_STATE *win_config,
                              struct VOP_POST_SCALE_INFO *post_scale,
                              struct rt_device_graphic_info *graphic_info)
{
    post_scale->srcW = graphic_info->width;
    post_scale->srcH = graphic_info->height;
    post_scale->dstX = 0;
    post_scale->dstY = 0;
    post_scale->dstW = graphic_info->width;
    post_scale->dstH = graphic_info->height;
}

post_scale 初始化(区域刷新水平和垂直分别做 2 倍放大)

static void display_post_init(struct CRTC_WIN_STATE *win_config,
                              struct VOP_POST_SCALE_INFO *post_scale,
                              struct rt_device_graphic_info *graphic_info)
{
    post_scale->srcW = graphic_info->width / 2;
    post_scale->srcH = win_config->srcH;
    post_scale->dstX = 0;
    post_scale->dstY = 0;
    post_scale->dstW = graphic_info->width;
    post_scale->dstH = win_config->srcH * 2;
}
  1. 如果是 bpp 格式图片,load lut 调色板,如果不是 bpp 格式可以忽略
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_LOAD_LUT, &lut_state);
RT_ASSERT(ret == RT_EOK);
  1. 配置 post_scale 确认缩放前的数据大小和缩放后显示的大小
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);
  1. 配置 win_config 图层信息
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);
  1. 提交显示
ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);

显示一帧的流程可以参考以上步骤 1 到步骤 9 执行,如果是刷新多帧,可以在修改 win_config 和post_scale 配置 后重复执行步骤 7、8、9。

7.3 区域刷新坐标配置说明

  1. 同时支持 X 和 Y 方向区域刷新屏的配置 demo

XY区域刷新坐标

XY区域刷新坐标

红色区域为 win0 图层,坐标为 (X0,Y0),大小为 (W0,H0),此时配置:

win_config->winId = 0;
win_config->winEn = 1;
……
win_config->srcX = X0;
win_config->srcY = Y0;
win_config->srcW = W0;
win_config->srcH = H0;

绿色区域为 win1 图层,坐标为 (X1,Y1),大小为 (W1,H1),此时配置:

win_config->winId = 1;
win_config->winEn = 1;
……
win_config->srcX = X1;
win_config->srcY = Y1;
win_config->srcW = W1;
win_config->srcH = H1;

后级缩放配置

post_scale->srcW = W1;
post_scale->srcH = H2;
post_scale->dstX = X1;
post_scale->dstY = Y0;
post_scale->dstW = W1;
post_scale->dstH = H2;

实际配置显示的代码中要求先配置后级的缩放参数:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);

然后调用 WIN0, WIN1 的配置:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);

最后提交显示:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);
  1. 只支持 Y 方向不支持 X 方向区域刷新配置 demo

仅Y区域刷新坐标

仅Y区域刷新坐标

红色区域为 win0 图层,坐标为 (X0,Y0),大小为 (W0,H0),此时配置:

win_config->winId = 0;
win_config->winEn = 1;
……
win_config->srcX = X0;
win_config->srcY = Y0;
win_config->srcW = W0;
win_config->srcH = H0;

绿色区域为 win1 图层,坐标为 (X1,Y1),大小为 (W1,H1),此时配置:

win_config->winId = 1;
win_config->winEn = 1;
……
win_config->srcX = X1;
win_config->srcY = Y1;
win_config->srcW = W1;
win_config->srcH = H1;

后级缩放配置

post_scale->srcW = Xres;
post_scale->srcH = H2;
post_scale->dstX = 0;
post_scale->dstY = Y0;
post_scale->dstW = Xres;
post_scale->dstH = H2;

由于不支持 X 方向的区域刷新,所以和 1 中的对比,post scale 的 src 和 dstW 都配置为屏实际的宽Xres,dstX 配置为 0,其他的和 1 中的步骤一致:实际配置显示的代码中要求先配置后级的缩放参数:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_SCALE, post_scale);
RT_ASSERT(ret == RT_EOK);

然后调用 WIN0, WIN1 的配置:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_SET_PLANE, win_config);
RT_ASSERT(ret == RT_EOK);

最后提交显示:

ret = rt_device_control(g_display_dev, RK_DISPLAY_CTRL_COMMIT, NULL);
RT_ASSERT(ret == RT_EOK);

8. modetest 工具

8.1 支持的测试 case

modetest [-afgp]

        -p <plane_id>:<w>x<h>:<crtc_w>x<crtc_h>[+<x>+<y>][#<zpos>][@<format>]  set plane
        -f <pattern>    specify fill pattern
        -a      test alpha
        -g      test gamma

示例指令:

modetest -p 0:720x1280:720x1280@AR24 -a -g

9. Color Key 使用说明

VOP 支持关键色全透的效果即指定图层中某一种颜色实现透视到下一图层或者背景层的效果,驱动提供win_config 中的 colorKey 参数用来配置 color key 功能,其中 bit[23, 0] 分别表示 RGB 三个分量的关键色数据,bit24 用来表示打开或者关闭 color key 功能。下面分别以 RGB888 和 RGB565 两中格式说明 color key 配置方法,R_VAL,G_VAL,B_VAL 分别表示要透视的RGB 三个分量的值:

#define COLOR_KEY_EN    BIT(24)

9.1 RGB888 格式配置 Color Key 的方法

  1. 实现红色全透,配置:
win_config->colorKey = 0xFF0000 | COLOR_KEY_EN;
  1. 实现绿色全透,配置:
win_config->colorKey = 0x00FF00 | COLOR_KEY_EN;
  1. 实现蓝色全透,配置:
win_config->colorKey = 0x0000FF | COLOR_KEY_EN;

即:

win_config->colorKey = (R_VAL << 16) | (G_VAL << 8) | (B_VAL) | COLOR_KEY_EN;

9.2 RGB565 格式配置 Color Key 的方法

  1. 实现红色全透,配置:
win_config->colorKey = 0xF80000 | COLOR_KEY_EN;
  1. 实现绿色全透,配置:
win_config->colorKey = 0x00FC00 | COLOR_KEY_EN;
  1. 实现蓝色全透,配置:
win_config->colorKey = 0x0000F8 | COLOR_KEY_EN;

即:

R_VAL_CONFIG = R_VAL << 3;  //R[4,0] -> R[7,0]

G_VAL_CONFIG = G_VAL << 2;  //G[5,0] -> G[7,0]

B_VAL_CONFIG = B_VAL << 3;  //B[4,0] -> B[7,0]

win_config->colorKey = (R_VAL_CONFIG  << 16) | (G_VAL_CONFIG << 8) | B_VAL_CONFIG | COLOR_KEY_EN;

9.3 关闭 Color Key 的方法

win_config->colorKey = 0;

10. 更新 lut 的方法

图层的 lut 在使用时需要打开 lut_en,打开 lut_en 后 lut 会被保护起来,即此时无法读写 lut 的寄存器,如果在不同的场景切换需要更新 lut 的配置,而 lut_en 的开关需要帧生效,所以更新 lut 需要按如下步骤操作:

  1. 关闭lut(1) 设置图层的格式为非 bpp 格式,即不能是以下几种格式
RTGRAPHIC_PIXEL_FORMAT_GRAY1
RTGRAPHIC_PIXEL_FORMAT_GRAY4,
RTGRAPHIC_PIXEL_FORMAT_GRAY16,
RTGRAPHIC_PIXEL_FORMAT_GRAY256,
RTGRAPHIC_PIXEL_FORMAT_RGB332,

(2) 关闭所有图层,在屏幕无显示内容的位置刷新一帧 32x32 大小的图片,32x32 不是固定大小,目的就是刷新一帧无效的显示让关闭 lut_en 生效,同时不影响当前屏幕上的显示。

  1. 更新 lut更新 lut 数组,调用 RK_DISPLAY_CTRL_LOAD_LUT 更新 lut。

  2. 配置新的一帧将 win 中的格式设置为对应的 bpp 格式刷一帧,此时新的 lut 生效。

11. 参考文档

  1. Rockchip DRM Display Driver Development Guide

  2. Rockchip_DRM_Panel_Porting_Guide.pdf

浏览此主题 → · 入门路线 →