上篇编译lvgl案例,使用的是“d1阿里小程序_SDK”中的工具链,当时这个工具链是配置在Ubuntu虚机之上,今天将工具链部署在WSL上再做尝试。
Windows环境中下载d1阿里小程序_SDK,导出其中的工具链“d1-sdk.tar.xz”到D盘根目录(方便WSL访问)。
图9-1 WSL中路径就是/mnt/d/d1-sdk.tar.xz
WSL中拷贝工具链压缩包到主目录(做完后觉得可以不要这步,直接将D盘工具链解压到WSL的主目录就行)。然后就是执行命令解压“tar xvg d1-sdk.tar.xz”,得到目录“d1-sdk/”,包含四个文件。
图9-2 拷贝工具链压缩包
图9-3 解压工具链压缩包
接着还是要建立“~/.local/riscv64-toolchain”目录,因为这是工具链的默认安装位置,然后就是执行sh文件,执行解压和安装的过程。
图9-4 安装工具链
图9-5 每次使用前在安装路径生效环境变量
这个工具链的环境变量是通过“source”命令来临时生效的,每次使用时需要做一下,才能在当前控制台注册环境变量。接着,就可以利用“$CC”来进行编译了。
再次尝试编译,这里使用了VScode,因为可以开启WSL控制台,所以将Windows良好的编辑操作性和Linux的工具能力相结合。通过修改顶层Makefile,确定了编译工具就是$CC,而输出文件这里随便改名为“aa_demo”。
至于下载和执行效果,这里就不展示,有不清楚的朋友可以看我的上篇(https://bbs.eeworld.com.cn/thread-1198006-1-1.html)。
图9-6 修改环境变量和编译
对于在下这种API党来说,看文档学编程是主要技能,不过lvgl的文档总感觉组织结构上条理性不好,看了半天虽谈不上一头雾水,也算是雾里看花。
于是转而从两个方向进行借鉴,快速搭建一个按钮案例。
一个方向是论坛的博主manhuami2007的文章“【平头哥Sipeed LicheeRV 86 Panel测评】 4-移植lvgl-增加触控(https://bbs.eeworld.com.cn/thread-1198282-1-1.html)”。这位大神已经提供了两篇lvgl在86板上的移植方法。
另一个方向就是百问网(韦东山老师)提供的Demo(https://gitee.com/weidongshan/imx6ull-lvgl/blob/master/lv_100ask/src/lv_100ask_demo/lv_100ask_demo.c)。
整个开发也是不断试错的过程,这里就不再赘述,直接放代码——案例是基于博主manhuami2007共享的工程,不清楚的朋友可以看本人的上一篇帖子。
图9-7 选择lvgl的输入设备
#include "lvgl/lvgl.h"
#include "lv_drivers/display/fbdev.h"
#include "lv_drivers/indev/evdev.h"
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#define DISP_BUF_SIZE (128 * 1024)
//by author. declare event callback
LV_EVENT_CB_DECLARE(test_btn_click_cb);
//by author. the button's label
lv_obj_t * test_btn_label;
int i = 0;
//by author. the event callback -- make console output & change button's label
void test_btn_click_cb(lv_event_t *e) {
char buf[64];
sprintf(buf, "Clicked %d times", i++);
printf("%s\n", buf);
lv_label_set_text(test_btn_label, buf);
}
int main(void)
{
/*LittlevGL init*/
lv_init();
/*Linux frame buffer device init*/
fbdev_init(); //by author. initialize framebuffer device for display
evdev_init(); //by author. initialize event device for touchpad
/*A small buffer for LittlevGL to draw the screen's content*/
static lv_color_t buf[DISP_BUF_SIZE];
/*Initialize a descriptor for the buffer*/
static lv_disp_draw_buf_t disp_buf;
lv_disp_draw_buf_init(&disp_buf, buf, NULL, DISP_BUF_SIZE);
/*Initialize and register a display driver*/
static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.draw_buf = &disp_buf;
disp_drv.flush_cb = fbdev_flush;
disp_drv.hor_res = 480;
disp_drv.ver_res = 480;
lv_disp_drv_register(&disp_drv);
//by author. initialize and register event device
lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);
indev_drv.type = LV_INDEV_TYPE_POINTER; //by author. input device type, choice touchpad here
indev_drv.read_cb = evdev_read; //by author. callback to read input device data
lv_indev_t *my_indev = lv_indev_drv_register(&indev_drv);
/*Create a Demo*/
lv_obj_t *parent = lv_obj_create(lv_scr_act());
lv_obj_set_size(parent,480,480);
lv_obj_t * head_lable = lv_label_create(parent);
lv_label_set_text(head_lable,"LVGL Test With WSL & $CC Toolchain");
lv_obj_align(head_lable,LV_ALIGN_TOP_MID,0,50);
lv_obj_t * test_btn = lv_btn_create(parent);
lv_obj_set_pos(test_btn, 10, 10);
lv_obj_set_size(test_btn, 200, 50);
lv_obj_align(test_btn, LV_ALIGN_CENTER,0,50);
//by author. register clicked-event callback for the "test_btn" object
lv_obj_add_event_cb(test_btn, test_btn_click_cb, LV_EVENT_CLICKED, NULL);
test_btn_label = lv_label_create(test_btn);
lv_label_set_text(test_btn_label, "Click");
//by author. as you seen, the button's text actually is a label object attached to the button
lv_obj_center(test_btn_label);
/*Handle LitlevGL tasks (tickless mode)*/
while(1) {
lv_task_handler();
usleep(5000);
}
return 0;
}
引用: manhuami2007 发表于 2022-4-9 17:02 看你的帖子,感觉WSL比虚拟机好用,之后要尝试一下
是啊,也是最近通过Waft手册才了解到这个东西,听说现在已经有WSA了,Android子系统。
关键是文件的无障碍访问,windows良好的编辑环境。