LVGL测试

LVGL简介

LVGL(轻量级图形库)是一款开源的图形用户界面(GUI)库,旨在为嵌入式设备提供高效、低资源消耗的图形显示解决方案。它广泛应用于低功耗、资源受限的嵌入式系统中,支持多种硬件平台,并提供丰富的图形界面组件和动画效果。

LVGL 是完全开源的,这有几个显著的优势。首先,它让你可以完全掌控该库,因为你不仅可以查看、修改、编译和调试底层源代码,还可以完全获取它。一旦下载,它就属于你了。这种不依赖单一供应商的独立性具有巨大的价值。此外,开源还鼓励协作与知识共享,全球的开发者都在为软件的改进做出贡献,使其变得更加可靠并功能更加丰富,以解决现实生活中的各种问题。

LVGL 采用 MIT 许可证发布,允许用户自由使用、修改和分发软件,而无需承担复杂的限制或条件。这为开发者和企业提供了灵活性,可以将该软件集成到自己的项目中,甚至用于商业目的,同时仍需保留对原作者的署名。

VDMA简介

AXI VDMA(简称 VDMA),是 Xilinx 提供的软核 IP,用于将 AXI Stream 格式的数据流转换为 Memory Map 格式的数据流或将 Memory Map 格式的数据流转换为 AXI Stream 格式的数据流,也就是说 VDMA 旨在提供从 AXI4 域到 AXI4-Stream 域的视频读/写传输功能,从而实现系统内存(主要指 DDR3)和基于 AXI4-Stream 的目标视频 IP 之间的高速数据移动。其功能和 AXI DMA( DMA)有些类似,主要是为 PS 端存储器和 AXI4-Stream 类目标外设存储器之间提供高带宽的数据搬运。VDMA 是针对视频图像应用而做的升级版的 DMA,和 DMA 相比,VDMA 增加了帧缓存(Frame Buffer)的缓冲机制和动态同步锁相(GenLock)等功能。VDMA 集成了视频专用功能,如帧同步和 2D DMA 传输等,非常适合基于 ZYNQ 架构上的图像和视频处理,缩短了开发者的开发周期。

LCD触摸屏

这里使用的液晶屏的分辨率是1024*600,接口为RGB888,触摸芯片为GT911。液晶屏的具体参数如下图:

image-20250822102741030

 

 

创建vivado工程

在本设计中,图像显示流程的核心任务是实现 LVGL 图形库在 RGB LCD 上的驱动与显示功能。系统整体架构如图所示,主要由 处理系统(PS)可编程逻辑(PL) 协同完成。

具体过程如下:

总体框架:

image-20250805090638457

在之前创建的vivado工程基础上进行,此前工程已经包含了HDMI、PL_NET等功能,其相关配置可以参考之前的配置步骤,本次我们主要是需要补充或修改一些配置:

补充zynq PS的相关配置:

image-20250822103808391

此处的FCLK_CLK0给LVGL使用,FCLK_CLK1 给HDMI使用,FCLK_CLK2给PL_NET1使用。

image-20250822104302196

此处HP0为HDMI使用,HP1为LVGL使用。

image-20250822104725441

通过EMIO添加7个GPIO引脚,用于 LCD 屏和触摸屏的控制信号。

image-20250822105528683

添加VDMA,搜索并添加VDMA模块,并双击打开这个模块的配置页

image-20250731162618441

本次工程只用到了 VDMA的 读功能,所以这里勾除了Enable Write Channel功能,帧缓存为2, 因为我们显示的内容是RGB888(24位色),所以 stream Data Width 改为24 。 Line Buffer Depth改为2048,Read Burst Size 修改成64。

image-20250731162840942

增加video out 模块,这个模块的作用是将AXI4-Stream 的数据流转换成标准的视频格式输出,与RGB LCD屏幕对应。

image-20250731165810614

clock mode改成independent ,Timing Mode:因为后面我们要用video timing controller 模块来提供视频时序,所以这里选择slave模式:

image-20250731170337068

增加Video Timing Controller 模块:搜索并添加 video timing controller模块,并双击打开配置页

 

image-20250731170526406

第一页:

image-20250731170702535

第二页:

在第二页我们设置分辨率,这里我们先设置1024X600, 选择CUSTOM,其他的参数按下图所示填写即可。后面可以通过PS端的vitis代码修改这些配置。

相应的参数,其描述可以参考:Video Beginner Series 16: Understanding Video Timing with the VTC IP

image-20250731170858279

根据下图进行修改参数,修改方式将在下文进行叙述。

 

增加clk_wiz模块:搜索并添加 clk_wiz模块,并双击打开配置页:

image-20250731174318633

按照下图所示进行配置:需要使能AXI接口,这样可以通过vitis控制输出频率。

image-20250731174348654

image-20250731174411056

 

这时我们已经得到了所需要的各个模块,接下来的工作就是连接各个模块。

 

左键 video out 模块的vid_io_out 端口的“加号”,展开端口的内容,并选中vid_active_video,vid_data,vid_hsync,vid_vsync这几个信号,并右键make external 将信号引出

image-20250731171911618

分别将这些信号重命名为lcd_de,lcd_data,lcd_hsync,lcd_vsync。 (选中信号,在左侧窗格的name 中修改)

image-20250731173509721

将VTC(Video Timing Controller)模块的clk与clk_out1像素时钟链接,因为这个clk和像素时钟需要高度同步,同理Axi4-Stream to video_out模块的clk也应该和这个像素时钟连接。

image-20250731174550095

增加video timing 模块的GEN_CLKEN连线如下图所示

image-20250731175434383

点 Run connection automation 来自动连接剩下的走线

image-20250731175455968

在弹出的设置对话框里勾选所有内容之后系统将自动帮我们连接好剩下的信号线以及添加需要的模块。

添加一个constant模块来添加一个常量1,用于连接我们各个模块的ce以及aclken 使能信号

image-20250731175728700

image-20250731175858429

最终的连接图如下:高亮的IP为本工程新增的IP

image-20250902140013062

保存工程,然后点击source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper。

image-20250801090722040

根据原理图进行管脚配置:

image-20250801143429974

配置完成的.xdc:

对工程进行编译和综合,生成bitstream,File→Export→Export hardware,导出.xsa文件

创建vitis工程

新建平台工程:

image-20250730115142359

image-20250730115513634

选择刚才导出的.xsa文件,并将操作系统改为freertos操作系统:

image-20250804174649206

新建应用工程:

image-20250730115853514

image-20250730120012260

在此选择空文件

image-20250730120108384

添加文件并修改:

创建Touch文件

在src下创建clk_wiz文件夹:用来设置IP核的输出时钟频率

image-20250730134515934

image-20250804091526290

添加.c文件

创建display_ctrl文件

代码来源:https://github.com/Digilent/Zybo-hdmi-out/tree/master/sdk/displaydemo/src/display_ctrl

image-20250804094923894

在vga_modes.h里需要根据我们屏幕的分辨率修改以下参数:

image-20250822114919485

根据上面的时序表进行配置:

创建Touch文件

创建touch.c touch.h,使用GT911触摸屏:

image-20250804102146048

关于GT911

该芯片是一颗电容触摸屏驱动 IC,支持 100Hz 触点扫描频率,支持 5 点触摸,支持 18*10 个检测通道。GT911 与 FPGA 的连接是通过 4 根线:SDA、SCL、RST 和 INT。其中:SDA 和 SCL 是 I2C 通信用的,RST 是复位脚(低电平有效),INT 是中断信号。GT911采用标准的I2C通信,最大通信速率为400KHz。GT911 的I2C器件地址可以是0X14或者0X5D,当复位结束后的 5ms 内,如果 INT 是高电平,则使用 0X14 作为地址,否则使用 0X5D 作为地址。本次我们使用 0xBA 作为器件地址。

代码如下:

创建vdma文件:

创建vdma.c vdma.h:

image-20250804103508171

具体代码实现可以参考xilinx提供的例子

image-20250804104355196

image-20250804104443461

image-20250804104459768

VDMA部分代码:

创建dma文件:

和vdma一样,代码可以以xilinx提供的例子为模板

image-20250804105359842

根据模板进行修改代码:

需要注意的是一个DMA通道能搬移的长度是有限制的(在dma的bsp代码中:xdmaps.c)

LCD在不同的分辨率下,一次需要搬移的数据长度也就不一样。比如在1024*600分辨率、RGB888格式下,一次DMA需要1024 * 600 * 3=1843200字节。

在高分辨率下,搬移的数据长度有可能超出一个DMA通道能搬移的最大长度。这时可以将burst size和burst len设大,也可以将需要搬移的数据分成多个DMA通道去搬移。

DMA部分代码:

 

移植lvgl文件

LVGL_V9.2.2源码下载地址

在src下创建两个文件夹:lvgl/lvgl和lvgl/lvgl_app,

image-20250801150638056

复制lvgl-9.2.2/src和lvgl-9.2.2/examples到src/lvgl/lvgl下;

复制lvgl-9.2.2/lv_version.h 、 lvgl-9.2.2/lv_version.h.in、 lvgl-9.2.2/lvgl.h 到 src/lvgl/lvgl下

image-20250805093929984

复制lvgl-9.2.2/lv_conf_template.h到src/lvgl下,并rename为lv_conf.h

image-20250805093950548

对lv_conf.h文件的内容按照下图所示进行修改代码:

image-20250801152055815

 

image-20250801152205535

 

image-20250801152226076

 

image-20250801152245671

删除src/lvgl/lvgl/examples下除porting外的其他所有文件和文件夹,删除porting文件下的osal文件夹

在平台工程中的freertos配置中,将tick_rate配置为1000,即1ms一次tick;use_tick_hook置为true

image-20250801153442257

在main.c中添加

 

修改以下四个文件

四个文件中的#if 0改为#if 1

lv_port_indev_template.c文件按以下作出修改:

lv_port_disp_template.c文件中修改屏幕的宽度和高度并添加:其余部分保持不变

添加main.c

image-20250730133911127

最后创建好的全部文件如下:

image-20250801155705429

编译调试

将触摸屏,ZYNQ开发板进行连接,

使用TYPE-C连接开发板JTAG口和电脑,进行Build,debug,观察LCD显示。

image-20250822144736415