3.8. sample_vot 使用说明
功能
sample_vot: 读取图片 或 创建 帧 缓存 并 填充 颜色 后,送入 HDMI 显示 sample_rotation_square: 实现对 正方形 进行 旋转 的 案例(目前 不 支持 长方形 的 旋转 90 度 和 270 度) sample_blend: 实现 3 个图层 的 融合 sample_vot_drm_hotplug: 读取图片 或 创建 帧 缓存 并 填充 颜色 后,送入 HDMI 显示,支持 HDMI 热插拔 检测,基于 Page Flip 的 异步 送显
开发板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 流程说明
根据
| 情况 |
特点 | 不同点,在 |
|---|---|---|
| 直接 |
从 DRM 框架 |
黄色 |
| 读取 |
从 |
绿色 |
sample

图中带
__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 接口设置 属性, 完成 图层 的 显示
下面
__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 .
效果
显示器显示文件
执行命令:
./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 实现
软件架构说明

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

图中带
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 个
软件架构说明

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

图中带
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 显示器
支持 的 分辨率 读取
图片,送入 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 完成 事件
下面
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 未
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插入
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 后,提示 找到 显示 连接,重新 送显 图片