参考这篇文章:https://blog.csdn.net/helizhen1993/article/details/157216781?fromshare=blogdetail&sharetype=blogdetail&sharerId=157216781&sharerefer=PC&sharesource=ztsggg&sharefrom=from_link

核心板:万象奥科 RK3506G2核心板

参考配置文件为:HD-RK3506-EVM

首先要保证Gui Guider使用的LVGL版本与SDKLVGL版本一致,RK3506官方SDK中LVGL版本为8.4.0和9.1。本项目使用Gui Guider版本为1.9.1,可以创建8.3.1和9.2的程序。创建完项目生成的代码格式如下:
在这里插入图片描述
在这里插入图片描述

一、将custom``generated两个文件夹放到SDK/app/lvgl_demo/my_demo/目录下,复制lvgl_demo/lv_demo/文件夹内的CMakeLists.txtmain.cmain.hMakefile四个文件

最终如图:
在这里插入图片描述

二、修改文件

1.修改my_demo/main.c如下:

/*
 * Copyright (c) 2021 Rockchip, Inc. All Rights Reserved.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#include <lvgl/lvgl.h>
#include <lvgl/lv_conf.h>

#include "main.h"
#include "gui_guider.h" /*新增*/
#include "events_init.h" /*新增*/

static int quit = 0;
lv_ui  guider_ui; /*新增*/

#if USE_DEMO_WIDGETS
extern void lv_demo_widgets(void);
#elif USE_DEMO_BENCHMARK
extern void lv_demo_benchmark(void);
#elif USE_DEMO_MUSIC
extern void lv_demo_music(void);
#endif

static void sigterm_handler(int sig)
{
    fprintf(stderr, "signal %d\n", sig);
    quit = 1;
}

int main(int argc, char **argv)
{
    signal(SIGINT, sigterm_handler);
    lv_port_init(0, 0, 0);

#if USE_DEMO_WIDGETS
    lv_demo_widgets();
#elif USE_DEMO_BENCHMARK
    lv_demo_benchmark();
#elif USE_DEMO_MUSIC
    lv_demo_music();
#endif
    setup_ui(&guider_ui); /*新增*/
    events_init(&guider_ui); /*新增*/
    while (!quit)
    {
        lv_task_handler();
        usleep(5000);
        lv_tick_inc(5); /*新增*/
    }

    return 0;
}

特别要注意的是lv_tick_inc(5)函数,由于内置LVGL8.4.0,是通过patch生成的lv_conf.h文件,一直没找到如何修改,无法定义时基导致触摸失灵,如果在lv_conf.h中开启则LV_TICK_CUSTOM不需要lv_tick_inc(5)函数。

#define LV_TICK_CUSTOM 1
#if LV_TICK_CUSTOM
    #define LV_TICK_CUSTOM_INCLUDE <stdint.h>         /*Header for the system time function*/
    #define LV_TICK_CUSTOM_SYS_TIME_EXPR (custom_tick_get())    /*Expression evaluating to current system time in ms*/
#endif   /*LV_TICK_CUSTOM*/

2.修改my_demo/CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.8)

project(my_demo)#新增

include_directories(${PROJECT_SOURCE_DIR}/./)
include_directories(./generated/guider_customer_fonts/)#新增
include_directories(./generated/)#新增
include_directories(./custom/)#新增

if (LVGL_DEMO_WIDGETS)
	add_definitions(-DUSE_DEMO_WIDGETS=1)
	set(LINK_LVGL_DEMOS ON)
elseif (LVGL_DEMO_BENCHMARK)
	add_definitions(-DUSE_DEMO_BENCHMARK=1)
	set(LINK_LVGL_DEMOS ON)
elseif (LVGL_DEMO_MUSIC)
	add_definitions(-DUSE_DEMO_MUSIC=1)
	set(LINK_LVGL_DEMOS ON)
endif()

aux_source_directory(. SRCS)
aux_source_directory(./custom SRCS)#新增
aux_source_directory(./generated SRCS)#新增
aux_source_directory(./generated/images SRCS)#新增
aux_source_directory(./generated/guider_fonts SRCS)#新增


add_executable(${PROJECT_NAME} ${SRCS})

install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
#install(PROGRAMS S10lv_demo DESTINATION /etc/init.d)#此处是把S10lv_Demo复制到/etc/init.d中,使能自启动,如果需要,还得改一下里面的内容

3.修改lvgl_demo/CMakeLists.txt如下:

如果在buildroot中启用rk_demo,则会编译rk_demo,否则编译自己的my_demo,这个与buildroot中的逻辑对应起来。

if (LV_USE_RK_DEMO)
	add_subdirectory(rk_demo)
#	add_subdirectory(gallery)
#	add_subdirectory(amp_monitor)
#	add_subdirectory(flexbus)
#	add_subdirectory(motor_demo)
else()
	add_subdirectory(my_demo)
	#add_subdirectory(lv_demo)
endif()

三、修改Buildroot配置

万象奥科官方手册 :SDK编译

1.根据手册步骤进入到Buildroot配置界面。

注意:buildroot构建文件系统时最终是以buildroot/output/xxxx/.config配置文件为准。在Buildroot目录中第1次运行make menuconfig 时会从默认的/buildroot/configs/rockchip_hd_rk3506g_evm_nand_defconfig【./build.sh lunch时选择的就是这块板子】生成.config文件,如果buildroot修改后也会保存到.config文件内,需要将修改后的.config文件替换rockchip_hd_rk3506g_evm_nand_defconfig文件,这样修改才会生效。

2.如果使用LVGL8.X,要使用lv_drivers要选择RKADK

在这里插入图片描述

另外LVGL configuration,可以配置颜色深度,内存大小,复杂UI时内存大小尽量配置大一点【此处受package/lvgl/config.in影响,限制了范围,可以修改】
在这里插入图片描述

3.修改app/lvgl_demo/lvgl8/evdev.h,对输入设备进行设置

开启use_evdev、修改分辨率

#ifndef USE_EVDEV
#  define USE_EVDEV           1
#endif



#if USE_EVDEV || USE_BSD_EVDEV
#  undef EVDEV_NAME
#  define EVDEV_NAME   "/dev/input/event0"        /*You can use the "evtest" Linux tool to get the list of devices and test them*/
#  define EVDEV_SWAP_AXES         0               /*Swap the x and y axes of the touchscreen*/

#  define DEFAULT_EVDEV_HOR_MIN   0
#  define DEFAULT_EVDEV_HOR_MAX   480
#  define DEFAULT_EVDEV_VER_MIN   0
#  define DEFAULT_EVDEV_VER_MAX   800
#endif  /*USE_EVDEV*/

4.修改app/lvgl_demo/lvgl8/evdev.c

注释掉这段缩放代码

/*if (evdev_calibrate)
{
    raw_x = map(raw_x, evdev_min_x, evdev_max_x,
                0, hor_res);
    raw_y = map(raw_y, evdev_min_y, evdev_max_y,
                0, ver_res);
}*/

原因是:通过evtest /dev/input/event0测试 上报的坐标是正确的,在evdev.c添加调试代码后,经过缩放坐标就不对了。

猜测根据:开机log显示分辨率为2160*1600,可能在下面代码中改变了evdev_calibrate,导致正确的坐标又经过缩放。

if ((evdev_min_x != 0) ||
            (evdev_max_x != disp_hor) ||
            (evdev_min_y != 0) ||
            (evdev_max_y != disp_ver))
    {
        const char *buf;
        buf = getenv("lv_disp_crop");
        if (buf)
            touch_crop = buf[0] - '0';
        if (!touch_crop)
        {
            evdev_calibrate = 1;
            printf("calibrate [%d,%d]x[%d,%d] to %dx%d\n",
                   evdev_min_x, evdev_max_x,
                   evdev_min_y, evdev_max_y,
                   disp_hor, disp_ver);
        }

注释完代码后,触摸是正常的了。

5.编译 烧录

没有开启自启动,只需要在ssh中输入my_demo即可看到屏幕正常显示和触摸了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐