跳转至

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 硬件环境搭建适配

PIN

LCD模组端

接主板

1

VDD-2.8V

主板连接Sensor板后,接到Sensor板2.8V

2

GND

GND

3

RST

GPIO6_5,复用为GPIO,RST信号接到R814

4

CS

GPIO7_0,复用为SPI0_CSN,下件R802和R803、R848

5

GND

GND

6

SCL

GPIO6_7,复用为SPI0_SCLK,下件R845和R803、R807

7

GND

GND

8

SDA

GPIO6_6,复用为SPI0_SDO,下件R805和R806

9

GND

GND

10

TE

GPIO7_1,复用为GPIO,下件R846和R847

11

RS

GPIO7_3,复用为GPIO,下件R3和R4

12

K

接4.3Ω电阻到地

13

A

接到主板3.3V

14

IOVCC

接到主板1.8V

Sensor配置

GPIO7_2

复用为Sensor0_rstn,上件R801

GPIO6_4

复用为Sensor0_clk

GPIO0_7

复用为I2C0_SDA,用于配置Sensor,上件R1106,下件R1119

GPIO0_6

复用为I2C0_SCL,用于配置Sensor,上件R1105,下件R1120

跳线帽

J1302接跳线帽

专业名词与缩写:

  • 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 即可完成编译:

cd samples/mpp/spi_lcd && 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,加载命令为:

./load3516cv610_20s_debug -i

如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。

如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于/ko目录下,在系统启动后会自动加载这些ko。

2.3 配置管脚复用

加载完公共驱动后,接下来需要配置管脚复用,使 sensor 能够正常工作:

bspmm 0x11130034 0x1233
bspmm 0x11130030 0x1233

2.4 加载LCD屏相关驱动

配置完管脚复用后,最后还需要加载LCD屏相关的ko,主要有:

  1. LCD 屏 peripheral 驱动 spi_xxx.ko : 具体 ko 名因屏型号而异,由屏厂提供,这里已经提供了一部分LCD屏幕驱动源码。
  2. DMA驱动ot_spi_dma_transfer.ko: 位于 out/ko/下,使用insmod加载即可。
  3. 按顺序先加载 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服务。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,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 数据流通路。

调用命令

./sample_spi_lcd 0

会出现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!。

正确性判断
  1. LCD 屏有画面(sensor 画面),无明显撕裂(TE 同步生效)。
  2. rgb565 文件存在且大小 = widthheight2 字节。
  3. 每 50 帧日志中 average frame rate 接近屏 TE 帧率(一般 30~60fps),spi_send_cnt 持续递增。
  4. 按回车后程序正常退出,日志显示绿色 program exit normally!。

数据流

图 1 数据流程

3.2 case 1 stream in -> spi lcd

启动 input.h265→FFmpeg/H.265 VDEC→SPI LCD 数据流通路。

调用命令

./sample_spi_lcd 1

解码本地 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!。

正确性判断
  1. LCD 屏有画面(H.265 解码画面),无明显撕裂(TE 同步生效)。
  2. rgb565 文件存在且大小 = widthheight2 字节。
  3. 每 50 帧日志中 average frame rate 接近屏 TE 帧率(一般 30~60fps),spi_send_cnt 持续递增。
  4. 按回车后程序正常退出,日志显示绿色 program exit normally!。

数据流

图 2 数据流程