赞
踩
最近买了一款匠芯创的D13X带屏幕的开发板,查了一下支持的功能,发现SDK中默认支持LVGL。最近也在玩Gui Guider,就想着能不能移植到匠芯创的平台上面,看了一下代码结构和Gui Guider导出的文件,发现是支持的,就把移植的过程记录了下来。其他芯片也可以参考这个移植过程,核心是导出编译文件的添加和编译脚本的设置。我这里用的Gui Guider 的版本是V1.6,V1.7的配置导出的文件和V1.6基本是一致的。
后续有时间应该还会写一个python
脚本,自动把移植的处理的工作省略掉。
v8
版本。添加图片资源:
进行简单的UI配置,生成C项目:
在 custom/custom.c 添加下面代码
添加的代码:
static void btn_label_time_add_cb(lv_event_t * e) { static int times = 0; lv_obj_t *label = lv_event_get_user_data(e); lv_event_code_t code = lv_event_get_code(e); if (code == LV_EVENT_CLICKED) { times++; lv_label_set_text_fmt(label, "Clike me time %d", times); } } void custom_init(lv_ui *ui) { /* Add your codes here */ lv_obj_add_event_cb(ui->screen_btn_1, btn_label_time_add_cb, LV_EVENT_ALL, ui->screen_btn_1_label); }
测试运行:
至此,Gui Guider 简单使用教程结束,下面将介绍Gui Guider 生成的代码目录结构和Luban-lite(匠芯创SDK的名称)的目录结构,方便大家理解。
Gui Guider 导出一个完整的项目文件包含下面这些内容:
上面的文件,我们关注custom、generated、import还有linux/main.c 即可,移植其他无需关注。下面重点介绍这几个目录。
你的代码编写入口函数在 void custom_init(lv_ui *ui);
,这个需要被调用的。
如果有额外的LVGL 的配置lv_conf_ext.h
这个里面的宏定义也是需要拿到。复制到lv_config.h
中。因为模拟器的lv_config.h
引用了这个配置。大部分情况并不需要修改这个配置,就无需添加。
这个是Gui Guider 自动生成的代码,都放这里面了,这里面几乎全部文件都是需要用到的。
下面是目录介绍:
导进Gui Guider 生成的资源文件和本身自带的资源文件
mian.c 中有我们需要用到的全局变量和入口函数需要我们关注,这里仅贴出关键代码,其他代码并未贴出
lv_ui guider_ui; /* 全局变量 */
int main(int argc, char ** argv)
{
/* APP入口初始化函数 */
setup_ui(&guider_ui);
events_init(&guider_ui);
custom_init(&guider_ui);
}
至此,我们已经知道了下面基本关系:
下面将简单介绍一下Luban-lite Lvgl部分的目录,以方便移植。
下面是 lvgl 目录介绍:
我们重点关注 aic_demo、aic_ui.*、lv_conf.h 即可
这里系统跑到是RT-THREAD实时操作系统,lvgl 作为一个线程单独运行。
LVGL 线程入口函数:
void lv_user_gui_init(void)
{
lv_img_cache_set_size(LV_CACHE_IMG_NUM);
aic_dec_create();
aic_ui_init(); /* 用户应用初始化在这里 */
}
#ifdef KERNEL_RTTHREAD
extern int lvgl_thread_init(void);
INIT_APP_EXPORT(lvgl_thread_init); /* 导出LVGL 函数符号表,自动调用初始化函数 */
#endif
lv_user_gui_init
这里的作用就类似于PC 的main
函数,所有lvgl的调用都在这个函数里面了
用户应用的入口函数,所有APP都是在 aic_ui.c 里面初始化。
void aic_ui_init()
{
#ifdef AIC_LVGL_METER_DEMO
extern void gui_guider_demo_ui_init();
gui_guider_demo_ui_init();
#endif
#ifdef AIC_LVGL_MUSIC_DEMO
extern void lv_demo_music(void);
lv_demo_music();
#endif
return;
}
应用APP 存放的目录,所有应用都放在这个目录下。
至此,我们已经知道了下面基本关系:
基本内容就介绍到这里,让我们开始移植
移植的核心就是将源文件添加进去编译,将资源文件放到开发板中
在/luban-lite/packages/artinchip/lvgl-ui/aic_demo
下添加 gui_guider_demo 、gui_guider_dem\lvgl_src 目录
将gui guider 生成的 C 项目文件的 custom
、generated
复制到 gui_guider_demo 目录下。
并将gui guider 生成的 C 项目文件的import
下的文件拉到gui_guider_dem/lvgl_src/lvgl_data
下面。
将SConscript
编译脚本复制到gui_guider_demo 目录下。注意所有复制的SConscript 编译脚本都是一样的,脚本的实际内容是搜索当前路径下所有的SConscript 文件和 源文件
创建gui_guider_demo_ui.c
和 gui_guider_demo_ui.h
,并添加入口函数和相关头文件。
创建的 gui_guider_demo_ui.c
内容如下:
#include <unistd.h> #include <time.h> #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include "lvgl.h" #include "aic_ui.h" #include "lv_port_disp.h" #include "mpp_fb.h" #include "meter_ui.h" /* gui guider head file */ #include "./custom/custom.h" #include "./generated/gui_guider.h" #include "./generated/events_init.h" #include "./generated/widgets_init.h" #include "./generated/guider_customer_fonts/guider_customer_fonts.h" #include "./generated/guider_fonts/guider_fonts.h" lv_ui guider_ui; void gui_guider_demo_ui_init() { /* 用户APP 入口 */ setup_ui(&guider_ui); events_init(&guider_ui); custom_init(&guider_ui); }
创建的 gui_guider_demo_ui.h
内容如下:
#ifndef GUI_GUIDER_DEMO_UI_H
#define GUI_GUIDER_DEMO_UI_H
#ifdef __cplusplus
extern "C" {
#endif
void gui_guider_demo_ui_init();
#ifdef __cplusplus
} /*extern "C"*/
#endif
#endif
删除所有目录的 generated.mk ,并将上面 ./SConscript 复制到下面几个目录下以及其子目录:
注意,我们可以不把generated/images
编译进代码中,如果不编译进代码中就不存放SConscript脚本。
删除不需要用到的矢量字体文件,实际字库文件都可以删掉。Gui Guider实际导出的字体是C文件,并没有用到矢量字库。
将 custom/lv_conf_ext.h 定义的宏复制到 lv_conf.h 中,由于这里并没有 用户定义的宏就不需要复制过去
将AIC_LVGL_METER_DEMO的内容替换为下面
void aic_ui_init()
{
#ifdef AIC_LVGL_METER_DEMO
extern void gui_guider_demo_ui_init();
gui_guider_demo_ui_init();
#endif
return;
}
这里的源文件修改只是把LVGL 图片文件的方式进行修改,将其改成动态读取图片,而不是都以数组的形式编译进代码。这样做的好处就是,代码量更小,能存放更多的图片。缺点就是,不支持图片的部分操作,比如recolor,resize。如果图片比较多的情况,建议修改一下源文件。
修改generated/setup_scr_screen.c
:
#include "../custom/custom.h"
#include "aic_ui.h"
lv_img_set_src(ui->screen_img_1, LVGL_PATH(image/i_am_bg.png));
命令行运行:scons --menuconfig
配置资源存放路径和编译demo选择。
Application options --->
[*] Using File System Image 0 --->
(packages/artinchip/lvgl-ui/aic_demo/gui_guider_demo/lvgl_src/) Data Directory
[*] ArtInChip LVGL demo --->
select LVGL demo (LVGL demo of meter) --->
点击下面链接下载参考代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。