spi_lcd 快速入门
1. 概述与作用
本样例演示 Hi3516CV610 通过 SPI 接口把视频流送到外接 SPI LCD 屏上显示的完整流程,覆盖两条典型数据通路:
case 0 :sensor输入,走 sensor→VI→VPSS→IVE→SPI LCD 的实时采集链路
case 1 :灌码流输入,走 H.265 文件→FFmpeg→VDEC→SPI LCD 的解码回放链路
两条链路最终都通过 ot_spi_dma_transfer.ko 提供的 SPI DMA 通道把 RGB565 像素送到 LCD 屏,并通过 TE(Tear-Effect)信号做帧同步,避免撕裂。
此样例需要参考《Hi3516CV610 硬件设计用户指南(QFN)》搭建硬件环境,lcd屏幕管脚与单板连接管脚对应关系如表1所示:
表 1 硬件环境搭建适配
专业名词与缩写:
- SPI — Serial Peripheral Interface,串行外设接口,用于把像素数据发送到 LCD
- LCD — Liquid Crystal Display,液晶显示屏
- DC — Data/Command,LCD 数据/命令切换引脚(表中RS即DC引脚)
- TE — Tear-Effect,LCD tear-effect GPIO 信号,用于帧同步
- IVE — Intelligent Video Engine,海思硬件 CV 加速器,本样例用于 YUV→RGB CSC
- CSC — Color Space Conversion,NV12→RGB888 通过
hi_mpi_ive_csc完成- NEON — ARM SIMD 指令集,软件 BGR888→RGB565 转换
- VDEC — Video DECoder,H.265 解码
- H.265/HEVC — 输入流编码格式
- VB — Video Buffer pool,视频缓存池
- VPSS — Video Process Sub-System,sensor 帧旋转/缩放
- VENC — Video ENCoder
- VI — Video Input,sensor→ISP→VPSS
- DMA — Direct Memory Access,SPI 上的
ot_spi_dma_transfer.ko
2. 执行准备
在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。
2.1 编译
1、在FFmpeg官网下载ffmpeg-7.1.tar.gz软件包, 存到目录 open_source/ffmpeg/ffmpeg-7.1.tar.gz。
2、进入样例目录执行 make 即可完成编译:
编译成功之后,在当前目录下会生成一个sample_spi_lcd的可执行文件,可以放社区支持的开发板上运行。
2.2 加载公共驱动
ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本,load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。
由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令为:
如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。
如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于
/ko目录下,在系统启动后会自动加载这些ko。
2.3 配置管脚复用
加载完公共驱动后,接下来需要配置管脚复用,使 sensor 能够正常工作:
2.4 加载LCD屏相关驱动
配置完管脚复用后,最后还需要加载LCD屏相关的ko,主要有:
- LCD 屏 peripheral 驱动
spi_xxx.ko: 具体 ko 名因屏型号而异,由屏厂提供,这里已经提供了一部分LCD屏幕驱动源码。 - DMA驱动
ot_spi_dma_transfer.ko: 位于out/ko/下,使用insmod加载即可。 - 按顺序先加载
spi_xxx.ko, 然后加载ot_spi_dma_transfer.ko。
2.5 运行时依赖
在运行样例前,需要提前准备:
-
硬件:参考《Hi3516CV610 硬件设计用户指南(QFN)》,保证lcd屏幕管脚与单板连接管脚对应。同时保证引脚复用配置正确:在
sysconfig中配置 SPI_SCL/SPI_MISO/SPI_CSN/DC/TE 引脚到 LCD 屏对应的 GPIO 功能,否则 SPI 时钟与数据/命令切换、TE 帧同步无法工作。 -
指定运行时依赖的so库路径
MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:
```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```
如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于
/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。
- 启动MPP服务
当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:
```shell
cd samples/mpp/sdk_server && make
```
在单板上执行./sdk_server &即可启动MPP服务。
- sdk_server同样依赖
soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;- 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于
/usr/bin目录下,并在系统启动时会自动启动sdk_server。
- 样例运行时候需要的资源文件
case 1(H.265 解码)依赖 samples/mpp/spi_lcd/input.h265(248KB H.265 样例流),缺失时 FFmpeg/VDEC 打开失败,程序异常退出。
2.6 运行样例
调用语法:./sample_spi_lcd <index>。启动后程序交互式提示用户选择 VI/VPSS 模式(0=ONLINE/ONLINE,1=ONLINE/OFFLINE,2=OFFLINE/ONLINE,3=OFFLINE/OFFLINE)。可以执行./sample_spi_lcd -h查看用法。
3. 支持的 Case 列表
对完整 2 个 case 说明如下:
3.1 case 0 sensor in -> spi lcd
对接 SENSOR,启动 VI→VPSS→IVE CSC→NEON RGB565→SPI DMA 数据流通路。
调用命令
会出现VI/VPSS在线/离线模式选择,如下提示,根据实际需要进行选择即可。
vi vpss mode list:
(0) VI_ONLINE_VPSS_ONLINE
(1) VI_ONLINE_VPSS_OFFLINE
(2) VI_OFFLINE_VPSS_ONLINE
(3) VI_OFFLINE_VPSS_OFFLINE
please select mode:
实时 sensor 采集,旋转 270° 显示,按回车停止。
输出文件
-
LCD 屏显示 sensor 实时画面(旋转 270°)
-
首帧额外 dump:
rgb565(大小 = widthheight2 字节,RGB565 原始像素),文件位于样例的运行目录。
控制台日志
正常序列:
Saving video stream .....
sum cost X, spi_send_cnt:Y, every frame cost Z, average frame rate Nfps # 每 50 帧打印一次
program exit normally! # 绿色
异常时显示红色 program exit abnormally!。
正确性判断
- LCD 屏有画面(sensor 画面),无明显撕裂(TE 同步生效)。
rgb565文件存在且大小 = widthheight2 字节。- 每 50 帧日志中
average frame rate接近屏 TE 帧率(一般 30~60fps),spi_send_cnt持续递增。 - 按回车后程序正常退出,日志显示绿色
program exit normally!。
数据流

3.2 case 1 stream in -> spi lcd
启动 input.h265→FFmpeg/H.265 VDEC→SPI LCD 数据流通路。
调用命令
解码本地 H.265 文件后推送 LCD,按回车停止。
输出文件
-
LCD 屏显示 H.265 解码视频。
-
首帧额外 dump:
rgb565(大小 = widthheight2 字节,RGB565 原始像素),文件位于样例的运行目录。
控制台日志
正常序列:
Saving video stream .....
sum cost X, spi_send_cnt:Y, every frame cost Z, average frame rate Nfps # 每 50 帧打印一次
program exit normally! # 绿色
异常时显示红色 program exit abnormally!。
正确性判断
- LCD 屏有画面(H.265 解码画面),无明显撕裂(TE 同步生效)。
rgb565文件存在且大小 = widthheight2 字节。- 每 50 帧日志中
average frame rate接近屏 TE 帧率(一般 30~60fps),spi_send_cnt持续递增。 - 按回车后程序正常退出,日志显示绿色
program exit normally!。
数据流
