3.8. sample_vot 使用说明
功能描述: sample_vot 示例程序,基于 DRM 框架,实现如下功能:
sample_vot: 读取图片或创建帧缓存并填充颜色后,送入 HDMI 显示sample_rotation_square: 实现对正方形进行旋转的案例(目前不支持长方形的旋转 90 度和 270 度)sample_blend: 实现 3 个图层的融合sample_vot_drm_hotplug: 读取图片或创建帧缓存并填充颜色后,送入 HDMI 显示,支持 HDMI 热插拔检测,基于 Page Flip 的异步送显
开发板上连接 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 快速体验
3.8.4. sample_vot_drm_hotplug
3.8.4.1. 功能概述
功能描述:sample_vot_drm_hotplug 主要在 sample_vot 的基础上增加了 HDMI 热插拔检测、select 事件循环和基于 Page Flip 的异步送显,可以“先起程序再插线”或拔掉再插上时自动重连并重新显示。通过输入不同的参数 , 可以演示如下功能:
列出 HDMI 显示器支持的分辨率
读取图片,送入 HDMI 显示
创建帧缓存并填充颜色后,送入 HDMI 显示
软件架构说明

代码位置及目录结构
代码位置
app/samples/platform_samples/sample_vot_drm_hotplug目录结构
sample_vot_drm_hotplug/
├── sample_vot_drm_hotplug
├── sample_vot_async.c
├── Makefile
├── drm_hotplug.h
└── drm_hotplug.c
API 流程说明
| 情况描述 | 在图中文字的背景颜色 |
|---|---|
| HDMI 显示热插拔 | 黄色 |
| DRM Page Flip 事件 | 绿色 |
sample

图中带颜色背景的函数说明和流程:
setup_udev_drm_monitor( 黄色背景 ): 创建并初始化一个 udev 监听器,只接收 DRM 子系统 的设备事件(如 HDMI 插拔)handle_udev_drm_hotplug( 黄色背景 ): 处理一次 从 udev monitor 读到的 DRM 热插拔事件,并根据当前 connector 状态判断是「插入」还是「拔出」setup_drm_event_context( 绿色背景 ): 初始化 DRM 事件上下文(drmEventContext),用来接收并处理 DRM 内核上报的 Page Flip 完成事件
下面展示上面提到的 3 个函数的流程图
setup_udev_drm_monitor

handle_udev_drm_hotplug

setup_drm_event_context

3.8.4.2. 编译部署
编译
进入 sample_vot_drm_hotplug 目录,执行
make编译输出成果物是 sample_vot_drm_hotplug 源码目录下的
sample_vot_drm_hotplug详细程序编译方式请查阅 编译方法 章节
程序部署
把目录
sample_vot_drm_hotplug和resource上传到开发板/userdata目录下进入
sample_vot_drm_hotplug运行chmod +x sample_vot_drm_hotplug命令给程序赋予可执行权限
3.8.4.3. 运行
程序运行方法
执行程序:./sample_vot_drm_hotplug
程序参数选项说明
./sample_vot_drm_hotplug -l查看接入的 HDMI 显示器支持的分辨率列表./sample_vot_drm_hotplug -f读取../resource/nv12_1920x1080.yuv并送入到显示器中显示./sample_vot_drm_hotplug创建帧缓存并填充 RGB 的数据后,送入到显示器中显示
运行效果
列出显示器支持的分辨率
执行命令:
./sample_vot_drm_hotplug -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 背景及 HDMI 热插拔效果
执行命令:
./sample_vot_drm_hotplug
HDMI 未插入板端,启动程序后插入 HDMI,然后再拔出 HDMI,运行日志:
Print param Config:
Function : display.
Input : default data (R, G, B).
Output :
Resolution: select connector's first config from EDID
Connector: hdmi
search hdmi connector: connector id is 75
display connector type 11 is not connected.
display_setup: no valid mode for connector type 11 (output=hdmi)
display_setup not ready, will wait for connector hotplug in main loop.
DRM hotplug event detected on /dev/dri/card0 (connector_type=11)
DRM connector is now CONNECTED (id=75)
hdmi index: 00 ch:3840 cv:2160 vrefresh:60
hdmi index: 01 ch:3840 cv:2160 vrefresh:60
hdmi index: 02 ch:3840 cv:2160 vrefresh:30
hdmi index: 03 ch:3840 cv:2160 vrefresh:30
hdmi index: 04 ch:3840 cv:2160 vrefresh:25
hdmi index: 05 ch:3840 cv:2160 vrefresh:24
hdmi index: 06 ch:3840 cv:2160 vrefresh:24
hdmi index: 07 ch:2560 cv:1440 vrefresh:60
hdmi index: 08 ch:1920 cv:1080 vrefresh:60
display connector connector found mode info.
display select resolution :1920*1080 .
Connector is now connected, start display.
page flip event: frame=2104 time=8937.489720
page flip event: frame=2225 time=8939.506395
page flip event: frame=2346 time=8941.523063
page flip event: frame=2467 time=8943.539721
page flip event: frame=2588 time=8945.556395
DRM hotplug event detected on /dev/dri/card0 (connector_type=11)
DRM connector is now DISCONNECTED (id=75)
效果说明:
程序启动后提示未找到 HDMI 连接,在 HDMI 线插入后,程序开始送显
送显时触发 page flip 事件并打印日志
显示器会间隔 2 秒,循环切换颜色:红、绿、蓝
拔出 HDMI 后,显示断开连接并停止送显
显示器显示文件及 HDMI 热插拔效果
执行命令:
./sample_vot_drm_hotplug -f
HDMI插入板端,启动程序后拔出 HDMI,再插入 HDMI,运行日志:
Print param Config:
Function : display.
Input : file(../resource/nv12_1920x1080.yuv).
Output :
Resolution: 1920*1080
Connector: hdmi
search hdmi connector: connector id is 75
hdmi index: 00 ch:3840 cv:2160 vrefresh:60
hdmi index: 01 ch:3840 cv:2160 vrefresh:60
hdmi index: 02 ch:3840 cv:2160 vrefresh:30
hdmi index: 03 ch:3840 cv:2160 vrefresh:30
hdmi index: 04 ch:3840 cv:2160 vrefresh:25
hdmi index: 05 ch:3840 cv:2160 vrefresh:24
hdmi index: 06 ch:3840 cv:2160 vrefresh:24
hdmi index: 07 ch:2560 cv:1440 vrefresh:60
hdmi index: 08 ch:1920 cv:1080 vrefresh:60
display connector connector found mode info.
display select resolution :1920*1080 .
page flip event: frame=4379 time=9518.206396
DRM hotplug event detected on /dev/dri/card0 (connector_type=11)
DRM connector is now DISCONNECTED (id=75)
DRM hotplug event detected on /dev/dri/card0 (connector_type=11)
DRM connector is now CONNECTED (id=75)
hdmi index: 00 ch:3840 cv:2160 vrefresh:60
hdmi index: 01 ch:3840 cv:2160 vrefresh:60
hdmi index: 02 ch:3840 cv:2160 vrefresh:60
hdmi index: 03 ch:3840 cv:2160 vrefresh:30
hdmi index: 04 ch:3840 cv:2160 vrefresh:30
hdmi index: 05 ch:3840 cv:2160 vrefresh:25
hdmi index: 06 ch:3840 cv:2160 vrefresh:24
hdmi index: 07 ch:3840 cv:2160 vrefresh:24
hdmi index: 08 ch:2560 cv:1440 vrefresh:60
hdmi index: 09 ch:1920 cv:1080 vrefresh:60
display connector connector found mode info.
display select resolution :1920*1080 .
Connector is now connected, start display.
page flip event: frame=4985 time=9533.806383
效果说明:
程序启动后提示找到显示连接,并开始送显,显示器会把图片
../resource/nv12_1920x1080.yuv显示到屏幕上拔出 HDMI 后,显示断开连接并停止送显
再插入 HDMI 后,提示找到显示连接,重新送显图片