万象奥科RK3506官方SDK内置LVGL移植 Gui Guider程序
参考这篇文章: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版本与SDK中LVGL版本一致,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.txt、main.c、main.h、Makefile四个文件
最终如图:
二、修改文件
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即可看到屏幕正常显示和触摸了。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)