3.8. sample_vot 使用说明
功能描述: sample_vot 示例程序,基于 DRM 框架,实现如下功能:
sample_vot: 读取图片或创建帧缓存并填充颜色后,送入 HDMI 显示sample_rotation_square: 实现对正方形进行旋转的案例(目前不支持长方形的旋转 90 度和 270 度)sample_blend: 实现 3 个图层的融合
开发板上连接 HDMI 的方法请查阅 HDMI 接口 章节。
注意:必须先手动加载 HDMI 的驱动程序 : ./insmode_driver.sh
3.8.1. sample_vot
3.8.1.1. 功能概述
功能描述:sample_vot 通过输入不同的参数 , 可以演示如下功能:
列出 HDMI 显示器支持的分辨率
读取图片,送入 HDMI 显示
创建帧缓存并填充颜色后,送入 HDMI 显示
软件架构说明

代码位置及目录结构
代码位置
app/samples/platform_samples/sample_vot目录结构
sample_vot/
├── Makefile
├── sample_vot
├── sample_vot.c
└── sample_vot.o
API 流程说明
根据输入参数的不同,编码流程分为 2 种情况:
| 情况描述 | 特点 | 不同点,在图中文字的背景颜色 |
|---|---|---|
| 直接显示内存中的数据 | 从 DRM 框架中申请内存 | 黄色 |
| 读取文件并显示 | 从外部申请内存,传递给 DRM 框架 | 绿色 |
sample

图中带背景的函数是对 DRM 接口的封装,下面详细说明每个函数的功能和流程:
__create_and_mmap_drm_frame_buffer( 黄色背景 ): 调用 DRM 接口从 DRM 框架中申请内存__wraper_dma_buffer_to_drm_frame_buffer( 绿色背景 ): 从外部申请内存,传递给 DRM 框架display_setup: 调用 DRM 接口获取合适的connector并根据需要设置对应的crtc和connector__add_property: 调用 DRM 接口设置属性, 完成图层的显示
下面展示上面提到的 4 个函数的流程图
__create_and_mmap_drm_frame_buffer

__wraper_dma_buffer_to_drm_frame_buffer

display_setup

__add_property

3.8.1.2. 编译部署
编译
进入 sample_vot 目录,执行
make编译输出成果物是 sample_vot 源码目录下的
sample_vot详细程序编译方式请查阅 编译方法 章节
程序部署
把目录
sample_vot和resource上传到开发板/userdata目录下进入
sample_vot运行chmod +x sample_vot命令给程序赋予可执行权限
3.8.1.3. 运行
程序运行方法
执行程序:./sample_vot
程序参数选项说明
./sample_vot -l查看接入的 HDMI 显示器支持的分辨率列表./sample_vot -f读取../resource/nv12_1920x1080.yuv并送入到显示器中显示./sample_vot创建帧缓存并填充 RGB 的数据后,送入到显示器中显示
运行效果
列出显示器支持的分辨率
执行命令:
./sample_vot -l
日志输出:
Print param Config:
Function : print connector support resolution.
Print [hdmi] connector support resolution:
[0] 1920x1080 60.00fps
[1] 1920x1080 59.94fps
[2] 1920x1080i 60.00fps
[3] 1920x1080i 59.94fps
[4] 1920x1080 50.00fps
[5] 1920x1080i 50.00fps
[6] 1920x1080 24.00fps
[7] 1920x1080 23.98fps
显示器循环显示 RGB 背景
执行命令:
./sample_vot
运行日志:
Print param Config:
Function : display.
Input : default data (R, G, B).
Output :
Resolution: select connector's first config from EDID
Connector: hdmi
display select resolution :1920*1080 .
效果说明: 显示器会间隔 2 秒,循环切换颜色:红、绿、蓝
显示器显示文件
执行命令:
./sample_vot -f
运行日志:
Print param Config:
Function : display.
Input : file(../resource/nv12_1920x1080.yuv).
Output :
Resolution: 1920*1080
Connector: hdmi
display select resolution :1920*1080 .
效果说明:
显示器会把图片 ../resource/nv12_1920x1080.yuv 显示到屏幕上
3.8.2. sample_rotation_square
3.8.2.1. 功能概述
功能描述:sample_rotation_square 实现显示画面间隔 2s 循环旋转 0 度、 90 度、 180 度、 270 度。
软件架构说明

代码位置及目录结构
代码位置
app/samples/platform_samples/sample_rotation_square目录结构
sample_rotation_square/
├── Makefile
├── sample_rotation_square
├── sample_rotation_square.c
└── sample_rotation_square.o
API 流程说明
sample

图中带背景的函数是对 DRM 接口的封装,下面详细说明每个函数的功能和流程:
display_setup( 红色背景 ): 调用 DRM 接口获取合适的connector并根据需要设置对应的crtc和connectorfind_overlay_plane_id( 红色背景 ):遍历所有的 plane 找到支持旋转的 plane__create_and_mmap_drm_frame_buffer( 黄色背景 ): 调用 DRM 接口从 DRM 框__destroy_and_unmmap_drm_frame_buffer( 黄色背景 ): 调用 DRM 接口释放从 DRM 框架中申请的内存__add_property( 红色背景 ): 调用 DRM 接口设置属性,完成图层的旋转和显示
display_setup

find_overlay_plane_id

__add_property

__create_and_mmap_drm_frame_buffer

__destroy_and_unmmap_drm_frame_buffer

3.8.2.2. 编译部署
编译
进入 sample_rotation_square 目录,执行
make编译输出成果物是 sample_rotation_square 源码目录下的
sample_rotation_square详细程序编译方式请查阅 编译方法 章节
程序部署
把目录
sample_rotation_square和resource上传到开发板/userdata目录下进入
sample_rotation_square运行chmod +x sample_rotation_square命令给程序赋予可执行权限
3.8.2.3. 运行
程序运行方法
执行程序:./sample_rotation_square
程序参数选项说明
无
运行效果
执行命令:
./sample_rotation_square
日志输出:
Print param Config:
Output :
Resolution: select connector's first config from EDID
Connector: hdmi
display select resolution :1920*1080 .
效果说明 :
显示器会显示 一个白色的正方形,四个角分别是:红色、绿色、蓝色、黄色
间隔 2s 按照如下角度 旋转: 0 度、 90 度、 180 度、 270 度
3.8.3. sample_blend
3.8.3.1. 功能概述
功能描述:sample_blend 实现 3 个图层进行 alpha 融合后显示的示例
软件架构说明

代码位置及目录结构
代码位置
app/samples/platform_samples/sample_blend目录结构
sample_blend/
├── Makefile
├── sample_blend
├── sample_blend.c
└── sample_blend.o
API 流程说明
sample

图中带背景的函数是对 DRM 接口的封装,下面详细说明每个函数的功能和流程:
display_setup( 红色背景 ): 调用 DRM 接口获取合适的connector并根据需要设置对应的crtc和connectorfind_plane_ids( 红色背景 ): 遍历所有的 plane 找到支持融合的 plane__create_and_mmap_drm_frame_buffer( 黄色背景 ): 调用 DRM 接口从 DRM 框架中申请内存__destroy_and_unmmap_drm_frame_buffer( 黄色背景 ): 调用 DRM 接口释放从 DRM 框架中申请的内存__add_property( 红色背景 ): 调用 DRM 接口设置属性,完成多个图层的融合和显示
display_setup

find_plane_ids

__add_property

__create_and_mmap_drm_frame_buffer

3.8.3.2. 编译部署
编译
进入 sample_blend 目录,执行
make编译输出成果物是 sample_blend 源码目录下的
sample_blend详细程序编译方式请查阅 编译方法 章节
程序部署
把目录
sample_blend上传到开发板/userdata目录下进入
sample_blend运行chmod +x sample_blend命令给程序赋予可执行权限
3.8.3.3. 运行
程序运行方法
执行程序:./sample_blend
程序参数选项说明
./sample_blend -m 0 -v 30000m 指定融合的模式, v 指定融合数值,参数详细描述如下:
融合数值: 有效范围是 0 - 65535, 默认是 32767
融合模式: 0:Pre-multiplied 1:Coverage 2: None, 默认是 None
Pre-multiplied 模式 :
out.rgb = plane_alpha * fg.rgb + (1 - (plane_alpha * fg.alpha)) * bg.rgbCoverage 模式:
out.rgb = plane_alpha * fg.alpha * fg.rgb + (1 - (plane_alpha * fg.alpha)) * bg.rgbNone 模式:
out.rgb = plane_alpha * fg.rgb + (1 - plane_alpha) * bg.rgb
公式中相关参数解释如下:
plane_alpha: 融合数值(-v 指定的数值 /65535 )fg.alpha: 背景图片的融合数值fg.rgb: 当前像素的透明度值bg.rgb: 背景图片的透明度值
运行效果
执行命令:
./sample_blend -m 0 -v 30000
日志输出:
Print param Config:
AplhaBlend Param :
Mode : Coverage
Formula : out.rgb = plane_alpha * fg.alpha * fg.rgb + (1 - (plane_alpha * fg.alpha)) * bg.rgb
Value : 32767
display select resolution :1920*1080 .
效果说明:
显示器会显示 一个白色为底部,中间分别显示 红色、绿色、蓝色 3 个相交的矩形
未相交的部分和背景色融合
相交的部分:先和背景色融合,两个矩形框的颜色再融合
3.8.3.4. 常见问题
问题 1:
描述: Linux DRM 驱动变化时,图层的 ID 号可能会变化
解决办法:程序中最好不要指定图层 ID,推荐使用 plane 的名字去匹配,比如函数
find_plane_ids
问题 2 :
描述:使用 DRM 框架时,不知道有那些图层,以及各个图层的功能
解决办法:使用 命令
modetest -M vs-drm -a进行查看,详细信息见:DRM 调试信息与硬件的对应关系
问题 3 :
描述:编写 demo 程序运行后,发现没有生效,想知道如何快速排除是否是硬件的问题
解决办法:使用命令
modetest -M vs-drm -a -s 75@31:1920x1080 -P 33@31:1920x1080@NV12, 详细信息见:DRM 快速体验