【平头哥Sipeed LicheeRV 86 Panel测评】九、lvgl再使用

sonicfirr   2022-4-8 20:04 楼主

上篇编译lvgl案例,使用的是“d1阿里小程序_SDK”中的工具链,当时这个工具链是配置在Ubuntu虚机之上,今天将工具链部署在WSL上再做尝试。

1WSL搭建lvgl工具链

Windows环境中下载d1阿里小程序_SDK,导出其中的工具链“d1-sdk.tar.xz”到D盘根目录(方便WSL访问)。

 

image-20220408200258-1.png  

9-1 WSL中路径就是/mnt/d/d1-sdk.tar.xz

 

WSL中拷贝工具链压缩包到主目录(做完后觉得可以不要这步,直接将D盘工具链解压到WSL的主目录就行)。然后就是执行命令解压“tar xvg d1-sdk.tar.xz”,得到目录“d1-sdk/”,包含四个文件。

 

image-20220408200258-2.png  

9-2 拷贝工具链压缩包

 

image-20220408200258-3.png  

9-3 解压工具链压缩包

 

接着还是要建立~/.local/riscv64-toolchain”目录,因为这是工具链的默认安装位置,然后就是执行sh文件,执行解压和安装的过程。

 

image-20220408200258-4.png  

9-4 安装工具链

 

image-20220408200258-5.png  

9-5 每次使用前在安装路径生效环境变量

 

这个工具链的环境变量是通过source”命令来临时生效的,每次使用时需要做一下,才能在当前控制台注册环境变量。接着,就可以利用“$CC”来进行编译了。

再次尝试编译,这里使用了VScode,因为可以开启WSL控制台,所以将Windows良好的编辑操作性和Linux的工具能力相结合。通过修改顶层Makefile,确定了编译工具就是$CC,而输出文件这里随便改名为“aa_demo”。

至于下载和执行效果,这里就不展示,有不清楚的朋友可以看我的上篇(https://bbs.eeworld.com.cn/thread-1198006-1-1.html)。

 

image-20220408200258-6.png  

image-20220408200258-7.png  

9-6 修改环境变量和编译

 

2lvgl按钮点击测试

对于在下这种API党来说,看文档学编程是主要技能,不过lvgl的文档总感觉组织结构上条理性不好,看了半天虽谈不上一头雾水,也算是雾里看花。

于是转而从两个方向进行借鉴,快速搭建一个按钮案例。

一个方向是论坛的博主manhuami2007的文章“【平头哥Sipeed LicheeRV 86 Panel测评】 4-移植lvgl-增加触控(https://bbs.eeworld.com.cn/thread-1198282-1-1.html)”。这位大神已经提供了两篇lvgl86板上的移植方法。

另一个方向就是百问网(韦东山老师)提供的Demohttps://gitee.com/weidongshan/imx6ull-lvgl/blob/master/lv_100ask/src/lv_100ask_demo/lv_100ask_demo.c)。

整个开发也是不断试错的过程,这里就不再赘述,直接放代码——案例是基于博主manhuami2007共享的工程,不清楚的朋友可以看本人的上一篇帖子。

 

image-20220408200258-8.png  

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;
}

1649418325771.gif  

回复评论 (4)

看你的帖子,感觉WSL比虚拟机好用,之后要尝试一下
点赞  2022-4-9 17:02

确实同感,WSL搭建lvgl工具链方法看来挺好用

点赞  2022-4-9 17:05
引用: manhuami2007 发表于 2022-4-9 17:02 看你的帖子,感觉WSL比虚拟机好用,之后要尝试一下

是啊,也是最近通过Waft手册才了解到这个东西,听说现在已经有WSA了,Android子系统。

关键是文件的无障碍访问,windows良好的编辑环境。

点赞  2022-4-9 20:41
后续测试发现“LV_EVENT_CB_DECLARE(test_btn_click_cb);”可以不用
点赞  2022-4-10 15:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复