milk-v duo 交叉编译 LVGL

milk-v duo 交叉编译 LVGL

目标:交叉编译 LVGL,并在之前已完成的 milk-v duo 通过 SPI 驱动 ST7789v 液晶上显示。

1、lvgl 代码下载

LVGL 已提供 Linux 的 fb 工程,该工程已通过 git submodule 子仓库形式集成了 lvgl 和 lvgl_drivers 两个子仓库。

$ git clone https://github.com/lvgl/lv_port_linux_frame_buffer
$ cd lv_port_linux_frame_buffer
$ git submodule update --init --recursive

2、修改 makefile:

CC              = /home/share/samba/risc-v/duo-buildroot-sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-gcc
CFLAGS          ?= -O3 -g0 -march=rv64imafdcvxthead -mcpu=c906fdv -mcmodel=medany -mabi=lp64d -Wall -Wshadow -I$(LVGL_DIR)/ $(WARNINGS)

toolchain 地址设置为 milk-v duo SDK所在目录对应 gcc 地址。

3、修改配置

  • 修改 main.c 中的显示长和宽,我的液晶为 240*320。
disp_drv.hor_res = 240;
disp_drv.ver_res = 320;
  • 当前液晶没有适配触摸,所以把输入相关的代码注释掉
#if 0
    evdev_init();
    static lv_indev_drv_t indev_drv_1;
    lv_indev_drv_init(&indev_drv_1); /*Basic initialization*/
    indev_drv_1.type = LV_INDEV_TYPE_POINTER;

    /*This function will be called periodically (by the library) to get the mouse position and state*/
    indev_drv_1.read_cb = evdev_read;
    lv_indev_t *mouse_indev = lv_indev_drv_register(&indev_drv_1);

    /*Set a cursor for the mouse*/
    LV_IMG_DECLARE(mouse_cursor_icon)
    lv_obj_t * cursor_obj = lv_img_create(lv_scr_act()); /*Create an image object for the cursor */
    lv_img_set_src(cursor_obj, &mouse_cursor_icon);           /*Set the image source*/
    lv_indev_set_cursor(mouse_indev, cursor_obj);             /*Connect the image  object to the driver*/

#endif
  • 修改 lv_conf.h 颜色深度为 16bit
#define LV_COLOR_DEPTH 16
  • 如后续运行颜色不对,可修改 LV_COLOR_16_SWAP 为 1。

4、编译运行

  1. 编译 输入 make clean && make 即可开始编译,编译完成后 demo 文件位于 build/bin 目录下。
  2. 使用 scp demo root@192.168.42.1:/root 传至 milk-v duo 开发板,scp 密码为 milkv。
  3. 使用 chmod +x demo && ./demo 开始运行。
  4. 更换 demo
  5. main() 函数中替换 demo
// lv_demo_widgets();
    lv_demo_benchmark();
  • lv_conf.h 修改配置 #define LV_USE_DEMO_BENCHMARK 1

测试结果为 FPS: 100 左右

5、错误解决

  1. 第一次运行会报以下错误
[root@milkv-duo]~# ./demo 
-sh: ./demo: not found

经过 milk-v 论坛查询,得知此错误由于缺少了一个动态链接库。在 milk-v duo 开发板上运行如下命令即可正常运行。

[root@milkv-duo]~# ln -s /lib/ld-musl-riscv64v0p7_xthead.so.1 /lib/ld-musl-riscv64xthead.so.1
  1. ioctl(FBIOBLANK): Invalid argument 错误 该问题为 lv_drivers/display/fbdev.c 下判断亮度控制引起的。
  • 方法1:
// Make sure that the display is on.
    if (ioctl(fbfd, FBIOBLANK, FB_BLANK_UNBLANK) != 0) {
        perror("ioctl(FBIOBLANK)");
        // return;
    }
  • 方法2: 在 SDK 中添加背光 LED 控制的管脚 修改 build/boards/cv180x/cv1800b_milkv_duo_sd/dts_riscv/cv1800b_milkv_duo_sd.dts 文件,添加 led = <&porta 15 GPIO_ACTIVE_HIGH>;, 并将背光管脚接至 GPIOA15。
&spi2 {
    status = "okay";
    /delete-node/ spidev@0;
    st7789v: st7789v@0{
        compatible = "sitronix,st7789v";
        reg = <0>;
        status = "okay";
        spi-max-frequency = <48000000>;
        spi-cpol;
        spi-cpha;
        rotate = <0>;
        fps = <60>;
        rgb;
        buswidth = <8>;

        dc = <&porta 24 GPIO_ACTIVE_HIGH>;
        reset = <&porta 23 GPIO_ACTIVE_HIGH>;
        led = <&porta 15 GPIO_ACTIVE_HIGH>;

        debug = <0x0>;
    };
};

编辑于 2023-12-16 22:19・IP 属地浙江