lvgl7.0移植使用说明
LVGL移植是比较容易的,在源码的porting目录中有以下几个文件:
disp文件是显示相关的移植文件,indev是输入设备的相关移植文件,其中输入设备包括触控,鼠标,键盘等。fs是文件系统相关的移植文件,主要是保存一些图像资源在文件系统中。
lv_port_disp
- 调用lv_disp_buf_init定义1个或2个用于图像计算的缓存buff,最小为显示像素宽度单个像素大小,推荐定义为20x显示像素宽度单个像素大小的buff两个,当然如果内存足够可以定义更多的buff会有一定的速度提升。
- 实现void disp_init(void)函数,用于并配置好显存初值,初始化并启动ltdc。
- 实现void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)函数。用于从color_p指针处将对应的数据搬运到显存指定位置,像素位置数据从area获取,即area->x1;area->x2;area->y1; area->y2。
- 对于拥有GUP或其他图形硬件加速器的系统还可以定义实现gpu_blend、gpu_fill函数,分别用于像素合成和像素填充,这两个功能对应dma2d来说都是可以实现的。当然对于没有这样硬件资源的系统直接使用这两个函数的默认软件实现即可。
lv_port_indev(以触控为例)
- 实现void touchpad_init(void)函数,用于初始化触控硬件,这里我们测试使用的是一款IIC通讯的触控模块。
- 实现bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)函数。这个函数需要实现的功能就是读取当前的触控数据,若当前存在触控,则将data->state = LV_INDEV_STATE_PR,并且当前触摸的点x,y值分别填入data->point.x和data->point.y。若当前不存在触控则将data->state = LV_INDEV_STATE_REL;即可。这个函数将在GUI系统启动或被GUI任务定期查询调用,而我们实现时即在这里通过IIC发送请求读取触控IC内的当前状态即可。
lv_port_fs
- lv_port_fs的实现需要的接口为最基本的通用文件系统接口,顾名思义,这里不再赘述。
lv_conf
位于源码根目录lv_conf.h文件为lvgl的配置文件,这里需要配置一些显示相关的特性。关键性配置如下:
- 显示器宽度 #define LV_HOR_RES_MAX (480)
- 显示器高度 #define LV_VER_RES_MAX (320)
- 色彩深度(格式) #define LV_COLOR_DEPTH 16
- 刷新率 #define LV_DISP_DEF_REFR_PERIOD 30
- DPI #define LV_DPI 130
显示器宽度高度会决定GUI计算输出的数据,色彩深度会决定使用的输出格式,DPI配置正确才能将正确的字号大小输出在显示器上,刷新率目前仅用于分析GUI性能使用。
其他运行机制相关
LVGL对于使用RTOS和裸机运行均有支持。无论是在什么环境运行均需要每隔110ms时间调用lv_tick_inc(x)函数,x为110。该函数将为GUI提供时基。对于裸机系统可以使用tick中断来完成,对于RTOS环境可以使用一个较高优先级任务来提供。最后还需要在系统主循环内轮询调用lv_task_handler()函数,对于裸机在main函数轮询即可,对于RTOS可以在一个一般优先级的任务内进行。
下图为最终main函数的启动示例。其中创建demo示例函数是使用了官方提供的一个演示demo。