Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RA8-M85-vision-board
LittlevGL_LVGL
【RA8D1-Vision Board】适配 LVGL V8
发布于 2024-04-20 01:39:32 浏览:992
订阅该版
[TOC] # 开箱 有幸参与RT-Thread # Vision Board 开发板的测评活动,经过了几天的等待终于收到了开发板,包装很精致 ![4.jpg](https://oss-club.rt-thread.org/uploads/20240420/5e11abf61ac45f34df1db6bfd6f532a8.jpg.webp) 因为是做的 LVGL 的评测任务,带了一个配套的 mipi 屏幕和 PCB 板载的触摸矩阵 ![1.jpg](https://oss-club.rt-thread.org/uploads/20240420/c13e44a83eb7e3abaf91193343f00bd2.jpg.webp) 开发板非常的小巧精致,果然还是黑色沉金的板子最帅 ![3.jpg](https://oss-club.rt-thread.org/uploads/20240420/b7d62a6f2734ecddfd95af24e2286c86.jpg.webp) > 由于需要用到 LVGL 代码比较庞大,编译工具链是 ARM GCC,所以果断放弃了在 Windows 下面进行开发,并在 Ubuntu 18.04 中完成开发 ## 开发环境搭建 ### 拉取 SDK 先将 Vision Board 的官方 SDK 仓库克隆下来。用 tree 命令可以看到有许多的示例工程。 ![Pasted image 20240416232314.png](https://oss-club.rt-thread.org/uploads/20240420/39c5fad85264d1a653443382fdbf4581.png.webp) 然后进入到 mipi 屏的 lvgl 例程文件夹里 ``` cd projects/lvgl/vision_board_mipi_2.0inch_lvgl ``` ### 配置环境 ##### 基础工具 安装 gcc-arm-none-eabi 编译工具链 > 官网下载链接: https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.10/gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 然后解压到 /opt 中 ``` tar xvf gcc-arm-none-eabi*.tar.bz2 -C /opt ``` 环境变量可以设置,也可以不设置,后面还有初始化脚本来设置 安装 python3、python3-pip、pyocd、scons ``` sudo apt install python3 python3-pip sudo python3 -m pip install pyocd scons ``` pyocd搜索一下8D1可以搜到(可能需要更新pyocd索引,网络原因大概率会非常慢,搜不到也没关系,也可以手动导入pack) ``` pyocd pack find 8D1 ``` ![Pasted image 20240417105025.png](https://oss-club.rt-thread.org/uploads/20240420/ef4ca8dcd2c9d1fbb71ff1d80a5d8e78.png.webp) 网络比较好的话就直接安装这个pack包就可以 ``` pyocd pack -i R7FA8 ``` > 官网 pack 地址 https://www2.renesas.eu/Keil_MDK_Packs/Renesas.RA_DFP.5.2.0.pack 手动导入 pack 包方法:将从官网下载下来的 Renesas.RA_DFP.5.2.0.pack 包放在当前目录,在当前目录下新建文件 pyocd.yaml 填入如下内容 ```yaml pack: - ./Renesas.RA_DFP.5.2.0.pack ``` 然后执行下面这个命令,可以搜到 8D1就完成了,后续可以用pyocd来调试、烧录 ![Pasted image 20240417102823.png](https://oss-club.rt-thread.org/uploads/20240420/8970f1cf8ae7907293cfae1c73e13d2b.png.webp) ##### 配置 env 工具 env 工具是 RT-Thread官方提供的一个工具,这里直接用脚本安装 ``` wget https://gitee.com/RT-Thread-Mirror/env/raw/master/touch_env.sh chmod +x touch_env.sh ./touch_env.sh ``` 初始化 env的命令是 source ~/.env/env.sh ##### 环境变量脚本 这一步的来源可以打开 rtconfig.py 进行查看得知 - CROSS_TOOL 交叉编译工具类型,可以用 RTT_CC 来设置,这里用的是 arm 的 gcc,所以直接指定 RTT_CC 为 gcc - EXEC_PATH 交叉编译工具链路径,可以通过 RTT_EXEC_PATH 来设置,所以是刚才 gcc-arm-none-eabi 的目录 /opt/gcc-arm-none-eabi-10.3-2021.10/bin ![Pasted image 20240417112951.png](https://oss-club.rt-thread.org/uploads/20240420/4560eba42e1df1dad902f478b339664c.png.webp) - 还有一个 RT_ROOT 是指定 rt-thread 的源码目录,这里不做设置,打开 SConstruct 文件(这文件默认没有高亮,:set filetype=python 可以打开高亮)可以看到 RT_ROOT 是会自动搜索的,所以就不用管了 ![Pasted image 20240417113647.png](https://oss-club.rt-thread.org/uploads/20240420/8f83da00e67b123eac7a3e0bf1827844.png.webp) ##### 测试 综上写个环境初始化脚本,保存在~目录或者其他位置,这里保存在了~/myscripts/env_rtt.sh > 把 env 的初始化放在上面是因为 env 会修改 RTT_EXEC_PATH 变量到 /usr/bin 同时,写了几个脚本来实现一键软连接 SDK 根目录的库代码并编译、烧录、配置 ```sh source ~/.env/env.sh export RTT_CC=gcc export RTT_EXEC_PATH=/opt/gcc-arm-none-eabi-10.3-2021.10/bin alias build='chmod +x ./mklinks.sh && ./mklinks.sh>/dev/null 2>&1 || scons -j16' alias flash='sudo pyocd flash --target=R7FA8D1BH --erase=sector --frequency=10000000 rtthread.elf' alias config='scons --menuconfig' alias clean='scons --clean' export build export flash export config export clean ``` 然后 source ~/myscripts/env_rtt.sh 初始化环境,build 一键编译 ![Pasted image 20240417162648.png](https://oss-club.rt-thread.org/uploads/20240420/ca01f936fc4cdc75820c953022613832.png.webp) flash 一键烧录 ![Pasted image 20240417234233.png](https://oss-club.rt-thread.org/uploads/20240420/dce96a7e3e247bca8035275cd224febf.png.webp) 运行现象 ![test.jpg](https://oss-club.rt-thread.org/uploads/20240420/09b6bc8480a6110879da2e74398fd68d.jpg.webp) 成功运行 SDK 中 LVGL V9 的示例工程 这搭建虽然步骤多了些,但是成功的把编译整个工程,包括lvgl那一堆代码,缩短到了 4s,效率第一 # LVGL V8 适配 ## 配置到 V8 版本 在 lvgl 目录下复制一份重命名为 vision_board_mipi_2.0inch_lvglv8 ![Pasted image 20240418001632.png](https://oss-club.rt-thread.org/uploads/20240420/07963f5a5e0ec5c77b507a8a7543fdb1.png.webp) config 或者 scons --menuconfig 打开配置 RT-Thread online packages > multimedia packages > LVGL: powerful and easy-to-use embedded GUI library > LVGL (official): Light and Versatile Graphics Library ,切换到 V8.3.5 版本 ![Pasted image 20240418002120.png](https://oss-club.rt-thread.org/uploads/20240420/1f3c10b29e26351dad426d9cded83060.png.webp) 然后 执行 pkgs --update 更新 ## porting 适配 适配 LVGL 的文件都存放在 board/lvgl 目录中,切换 V9 到 V8 版本需要修改 lv_conf.h、lv_port_disp.c、lv_port_indev.c 文件和鼠标光标的图像文件 mouse_cursor_icon.c,这里用的光标的图像文件为,可以在这个网站中在线将 png 图片转换成 LVGL 的图片代码 https://lvgl.io/tools/imageconverter ![icon.png](https://oss-club.rt-thread.org/uploads/20240420/2708105d39659fd5442b1f80e371ed15.png) 适配的代码篇幅太长,都放在了文末,这里介绍下适配的思路 ### 显示 porting 显示的 porting 基本都存放在 lv_port_disp.c 中,在 V9 版本中的适配代码如下 ```c static void disp_flush(lv_display_t *display, const lv_area_t *area, uint8_t *px_map) { if (!lv_display_flush_is_last(display)) return; #if defined(RENESAS_CORTEX_M85) #if (BSP_CFG_DCACHE_ENABLED) int32_t size; /* Invalidate cache - so the HW can access any data written by the CPU */ size = sizeof(fb_background[0]); SCB_CleanInvalidateDCache_by_Addr(px_map, size); #endif #endif R_GLCDC_BufferChange(&g_display0_ctrl, (uint8_t *) px_map, (display_frame_layer_t) 0); } ``` 在 LVGL 官网的文档中 ![Pasted image 20240418110956.png](https://oss-club.rt-thread.org/uploads/20240420/b548b3f64ac63a4798761182b7864de7.png.webp) 设备注册代码 ```c lv_display_t *disp = lv_display_create(LV_HOR_RES_MAX, LV_VER_RES_MAX); lv_display_set_flush_cb(disp, disp_flush); lv_display_set_flush_wait_cb(disp, vsync_wait_cb); lv_display_set_buffers(disp, &fb_background[0][0], &fb_background[1][0], sizeof(fb_background[0]), LV_DISPLAY_RENDER_MODE_DIRECT); ``` LVGL V8 的移植也是这两个函数,只是改了改一些 API 而已,换一下名字就可以,具体代码见文末 ### 输入设备 porting ## benchmark 测试 测电脑用鲁大师,测 LVGL 当然就是 benchmark 的 demo 了,在 board/lvgl 文件夹中的 Kconfig 搜索 config BSP_USING_LVGL_BENCHMARK_DEMO,把下面的 select BSP_USING_LVGL_WIDGETS_DEMO 给注释掉 ``` config BSP_USING_LVGL_BENCHMARK_DEMO #select BSP_USING_LVGL_WIDGETS_DEMO bool "Enable LVGL benchmark demo" default n ``` 把 demo/benchmark 文件夹直接删除。然后把官方的 V8.3.5 版本的 benchmark 文件夹的代码拷贝过来,此时这个文件夹里面的代码是不会参与编译的,需要编写一个 SConscript 文件,代码如下 ```python import rtconfig from building import * src = Glob('*.c') src += Glob('assets/*.c') group = DefineGroup('LVGL-demo', src, depend = ['BSP_USING_LVGL_BENCHMARK_DEMO']) Return('group') ``` 这时 benchmark 的 demo 就参与到编译中了,还需要在配置中去使能它,在 > Hardware Drivers Config > On-chip Peripheral Drivers > Enable LVGL demo for LCD 下面 ![Pasted image 20240418011320.png](https://oss-club.rt-thread.org/uploads/20240420/6dc63b89c2a443afa1dcf94b190c77a1.png.webp) 然后编译、烧录到开发板 ![bench2.jpg](https://oss-club.rt-thread.org/uploads/20240420/83bd92b848b066bfffe7420e2521d2e5.jpg.webp) ![bench.jpg](https://oss-club.rt-thread.org/uploads/20240420/c6b5cc1f77f2ad1bcb3f91ee027f2022.jpg.webp) LVGL V8 成功运行,但是 benchmark 的表现比 V9 要差一些,具体原因还不清楚,猜测可能是 V9 对于有 2D 图像单元的 MCU 适配更好 ### 适配代码 #### lv_conf.h ```c #ifndef LV_CONF_H #define LV_CONF_H #include
#define LV_USE_SYSMON 1 #define LV_USE_PERF_MONITOR 1 #define LV_COLOR_DEPTH 16 #define LV_HOR_RES_MAX 480 #define LV_VER_RES_MAX 360 #define LV_COLOR_16_SWAP 0 #ifdef BSP_USING_LVGL_DAVE2D #define LV_USE_DRAW_DAVE2D 1 #endif /*turn-on helium acceleration when Arm-2D and the Helium-powered device are detected */ #ifdef BSP_USING_LVGL_ARM2D #if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE #define LV_USE_DRAW_SW_ASM LV_DRAW_SW_ASM_HELIUM #define LV_USE_DRAW_ARM2D 1 #define LV_USE_DRAW_ARM2D_SYNC 1 #endif #endif #ifdef BSP_USING_LVGL_WIDGETS_DEMO #define LV_USE_DEMO_WIDGETS 1 #define LV_DEMO_WIDGETS_SLIDESHOW 0 #endif /* BSP_USING_LVGL_WIDGETS_DEMO */ /*Benchmark your system*/ #ifdef BSP_USING_LVGL_BENCHMARK_DEMO #define LV_USE_DEMO_BENCHMARK 1 /*Use RGB565A8 images with 16 bit color depth instead of ARGB8565*/ #define LV_DEMO_BENCHMARK_RGB565A8 1 #define LV_FONT_MONTSERRAT_14 1 #define LV_FONT_MONTSERRAT_24 1 #endif /* BSP_USING_LVGL_BENCHMARK_DEMO */ /*Stress test for LVGL*/ #ifdef BSP_USING_LVGL_STRESS_DEMO #define LV_USE_DEMO_STRESS 1 #endif /* BSP_USING_LVGL_STRESS_DEMO */ /*Render test for LVGL*/ #ifdef BSP_USING_LVGL_RENDER_DEMO #define LV_USE_DEMO_RENDER 1 #endif /* BSP_USING_LVGL_RENDER_DEMO */ /*Music player demo*/ #ifdef BSP_USING_LVGL_MUSIC_DEMO #define LV_USE_DEMO_MUSIC 1 #define LV_DEMO_MUSIC_SQUARE 1 #define LV_DEMO_MUSIC_LANDSCAPE 0 #define LV_DEMO_MUSIC_ROUND 0 #define LV_DEMO_MUSIC_LARGE 0 #define LV_DEMO_MUSIC_AUTO_PLAY 0 #define LV_FONT_MONTSERRAT_12 1 #define LV_FONT_MONTSERRAT_16 1 #endif /* BSP_USING_LVGL_MUSIC_DEMO */ #ifdef _LV_LOG_LEVEL_TRACE /*Enable/disable LV_LOG_TRACE in modules that produces a huge number of logs*/ #define LV_LOG_TRACE_MEM 1 #define LV_LOG_TRACE_TIMER 1 #define LV_LOG_TRACE_INDEV 1 #define LV_LOG_TRACE_DISP_REFR 1 #define LV_LOG_TRACE_EVENT 1 #define LV_LOG_TRACE_OBJ_CREATE 1 #define LV_LOG_TRACE_LAYOUT 1 #define LV_LOG_TRACE_ANIM 1 #else #define LV_USE_LOG 0 #define LV_LOG_PRINTF 0 #endif //#define LV_ASSERT_HANDLER_INCLUDE
//#define LV_ASSERT_HANDLER while(1); /*Halt by default*/ #ifdef _LV_USE_ASSERT_NULL #define LV_USE_ASSERT_NULL 1 #endif #ifdef _LV_USE_ASSERT_MALLOC #define LV_USE_ASSERT_MALLOC 1 #endif #ifdef _LV_USE_ASSERT_STYLE #define LV_USE_ASSERT_STYLE 1 #endif #ifdef _LV_USE_ASSERT_MEM_INTEGRITY #define LV_USE_ASSERT_MEM_INTEGRITY 1 #endif #ifdef _LV_USE_ASSERT_OBJ #define LV_USE_ASSERT_OBJ 1 #endif //"Widget usage" #ifndef _LV_USE_ARC #define LV_USE_ARC 1 #endif #ifndef _LV_USE_BAR #define LV_USE_BAR 1 #endif #ifndef _LV_USE_BTN #define LV_USE_BTN 1 #endif #ifndef _LV_USE_BTNMATRIX #define LV_USE_BTNMATRIX 1 #endif #ifndef _LV_USE_CANVAS #define LV_USE_CANVAS 1 #endif #ifndef _LV_USE_CHECKBOX #define LV_USE_CHECKBOX 1 #endif #ifndef _LV_USE_DROPDOWN #define LV_USE_DROPDOWN 1 #endif #ifndef _LV_USE_IMG #define LV_USE_IMG 1 #endif #ifndef _LV_USE_LABEL #define LV_USE_LABEL 1 #endif #ifndef _LV_LABEL_TEXT_SELECTION #define LV_LABEL_TEXT_SELECTION 1 #endif #ifndef _LV_LABEL_LONG_TXT_HINT #define LV_LABEL_LONG_TXT_HINT 1 #endif #ifndef _LV_USE_LINE #define LV_USE_LINE 1 #endif #ifndef _LV_USE_ROLLER #define LV_USE_ROLLER 1 #endif #ifdef _LV_ROLLER_INF_PAGES #define LV_ROLLER_INF_PAGES _LV_ROLLER_INF_PAGES #endif #ifndef _LV_USE_SLIDER #define LV_USE_SLIDER 1 #endif #ifndef _LV_USE_SWITCH #define LV_USE_SWITCH 1 #endif #ifndef _LV_USE_TEXTAREA #define LV_USE_TEXTAREA 1 #endif #ifdef _LV_TEXTAREA_DEF_PWD_SHOW_TIME #define LV_TEXTAREA_DEF_PWD_SHOW_TIME _LV_TEXTAREA_DEF_PWD_SHOW_TIME #endif #ifndef _LV_USE_TABLE #define LV_USE_TABLE 1 #endif //"Extra Widgets" #ifndef _LV_USE_ANIMIMG #define LV_USE_ANIMIMG 1 #endif #ifndef _LV_USE_CALENDAR #define LV_USE_CALENDAR 1 #endif #ifndef _LV_CALENDAR_WEEK_STARTS_MONDA #define LV_CALENDAR_WEEK_STARTS_MONDA 1 #endif #ifndef _LV_USE_CALENDAR_HEADER_ARROW #define LV_USE_CALENDAR_HEADER_ARROW 1 #endif #ifndef _LV_USE_CALENDAR_HEADER_DROPDO #define LV_USE_CALENDAR_HEADER_DROPDO 1 #endif #ifndef _LV_USE_CHART #define LV_USE_CHART 1 #endif #ifndef _LV_USE_COLORWHEEL #define LV_USE_COLORWHEEL 1 #endif #ifndef _LV_USE_IMGBTN #define LV_USE_IMGBTN 1 #endif #ifndef _LV_USE_KEYBOARD #define LV_USE_KEYBOARD 1 #endif #ifndef _LV_USE_LED #define LV_USE_LED 1 #endif #ifndef _LV_USE_LIST #define LV_USE_LIST 1 #endif #ifndef _LV_USE_MENU #define LV_USE_MENU 1 #endif #ifndef _LV_USE_METER #define LV_USE_METER 1 #endif #ifndef _LV_USE_MSGBOX #define LV_USE_MSGBOX 1 #endif #ifndef _LV_USE_SPINBOX #define LV_USE_SPINBOX 1 #endif #ifndef _LV_USE_SPINNER #define LV_USE_SPINNER 1 #endif #ifndef _LV_USE_TABVIEW #define LV_USE_TABVIEW 1 #endif #ifndef _LV_USE_TILEVIEW #define LV_USE_TILEVIEW 1 #endif #ifndef _LV_USE_WIN #define LV_USE_WIN 1 #endif #ifndef _LV_USE_SPAN #define LV_USE_SPAN 1 #endif #ifdef _LV_SPAN_SNIPPET_STACK_SIZE #define LV_SPAN_SNIPPET_STACK_SIZE _LV_SPAN_SNIPPET_STACK_SIZE #endif //"Layouts" #ifndef _LV_USE_FLEX #define LV_USE_FLEX 1 #endif #ifndef _LV_USE_GRID #define LV_USE_GRID 1 #endif #ifndef _LV_USE_THEME_DEFAULT #define LV_USE_THEME_DEFAULT 1 #endif #ifndef _LV_THEME_DEFAULT_DARK #define LV_THEME_DEFAULT_DARK 1 #endif #ifndef _LV_THEME_DEFAULT_GROW #define LV_THEME_DEFAULT_GROW 1 #endif #ifdef _LV_THEME_DEFAULT_TRANSITION_TIME #define LV_THEME_DEFAULT_TRANSITION_TIME _LV_THEME_DEFAULT_TRANSITION_TIME #endif #ifndef _LV_USE_THEME_BASIC #define LV_USE_THEME_BASIC 1 #endif //"Enable built-in fonts" #define LV_FONT_MONTSERRAT_8 1 #define LV_FONT_MONTSERRAT_10 1 #define LV_FONT_MONTSERRAT_10 1 #define LV_FONT_MONTSERRAT_14 1 #define LV_FONT_MONTSERRAT_16 1 #define LV_FONT_MONTSERRAT_18 1 #define LV_FONT_MONTSERRAT_20 1 #define LV_FONT_MONTSERRAT_22 1 #define LV_FONT_MONTSERRAT_24 1 #define LV_FONT_MONTSERRAT_26 1 #define LV_FONT_MONTSERRAT_28 1 #define LV_FONT_MONTSERRAT_30 1 #define LV_FONT_MONTSERRAT_32 1 #define LV_FONT_MONTSERRAT_34 1 #define LV_FONT_MONTSERRAT_36 1 #define LV_FONT_MONTSERRAT_38 0 #define LV_FONT_MONTSERRAT_40 0 #define LV_FONT_MONTSERRAT_42 0 #define LV_FONT_MONTSERRAT_44 0 #define LV_FONT_MONTSERRAT_48 0 #define LV_FONT_MONTSERRAT_12_SUBPX 0 #define LV_FONT_MONTSERRAT_28_COMPRESSED 0 #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0 #define LV_FONT_SIMSUN_16_CJK 0 #define LV_FONT_UNSCII_8 0 #define LV_FONT_UNSCII_16 0 #ifdef _LV_FONT_MONTSERRAT_8 #undef LV_FONT_MONTSERRAT_8 #define LV_FONT_MONTSERRAT_8 1 #endif #ifdef _LV_FONT_MONTSERRAT_10 #undef LV_FONT_MONTSERRAT_10 #define LV_FONT_MONTSERRAT_10 1 #endif #ifdef _LV_FONT_MONTSERRAT_12 #undef LV_FONT_MONTSERRAT_12 #define LV_FONT_MONTSERRAT_12 1 #endif #ifdef _LV_FONT_MONTSERRAT_14 #undef LV_FONT_MONTSERRAT_14 #define LV_FONT_MONTSERRAT_14 1 #endif #ifdef _LV_FONT_MONTSERRAT_16 #undef LV_FONT_MONTSERRAT_16 #define LV_FONT_MONTSERRAT_16 1 #endif #ifdef _LV_FONT_MONTSERRAT_18 #undef LV_FONT_MONTSERRAT_18 #define LV_FONT_MONTSERRAT_18 1 #endif #ifdef _LV_FONT_MONTSERRAT_20 #undef LV_FONT_MONTSERRAT_20 #define LV_FONT_MONTSERRAT_20 1 #endif #ifdef _LV_FONT_MONTSERRAT_22 #undef LV_FONT_MONTSERRAT_22 #define LV_FONT_MONTSERRAT_22 1 #endif #ifdef _LV_FONT_MONTSERRAT_24 #undef LV_FONT_MONTSERRAT_24 #define LV_FONT_MONTSERRAT_24 1 #endif #ifdef _LV_FONT_MONTSERRAT_26 #undef LV_FONT_MONTSERRAT_26 #define LV_FONT_MONTSERRAT_26 1 #endif #ifdef _LV_FONT_MONTSERRAT_28 #undef LV_FONT_MONTSERRAT_28 #define LV_FONT_MONTSERRAT_28 1 #endif #ifdef _LV_FONT_MONTSERRAT_30 #undef LV_FONT_MONTSERRAT_30 #define LV_FONT_MONTSERRAT_30 1 #endif #ifdef _LV_FONT_MONTSERRAT_32 #undef LV_FONT_MONTSERRAT_32 #define LV_FONT_MONTSERRAT_32 1 #endif #ifdef _LV_FONT_MONTSERRAT_34 #undef LV_FONT_MONTSERRAT_34 #define LV_FONT_MONTSERRAT_34 1 #endif #ifdef _LV_FONT_MONTSERRAT_36 #undef LV_FONT_MONTSERRAT_36 #define LV_FONT_MONTSERRAT_36 1 #endif #ifdef _LV_FONT_MONTSERRAT_38 #undef LV_FONT_MONTSERRAT_38 #define LV_FONT_MONTSERRAT_38 1 #endif #ifdef _LV_FONT_MONTSERRAT_40 #undef LV_FONT_MONTSERRAT_40 #define LV_FONT_MONTSERRAT_40 1 #endif #ifdef _LV_FONT_MONTSERRAT_42 #undef LV_FONT_MONTSERRAT_42 #define LV_FONT_MONTSERRAT_42 1 #endif #ifdef _LV_FONT_MONTSERRAT_44 #undef LV_FONT_MONTSERRAT_44 #define LV_FONT_MONTSERRAT_44 1 #endif #ifdef _LV_FONT_MONTSERRAT_46 #undef LV_FONT_MONTSERRAT_46 #define LV_FONT_MONTSERRAT_46 1 #endif #ifdef _LV_FONT_MONTSERRAT_48 #undef LV_FONT_MONTSERRAT_48 #define LV_FONT_MONTSERRAT_48 1 #endif #ifdef _LV_FONT_MONTSERRAT_12_SUBPX #undef LV_FONT_MONTSERRAT_12_SUBPX #define LV_FONT_MONTSERRAT_12_SUBPX 1 #endif #ifdef _LV_FONT_MONTSERRAT_28_COMPRESSED #undef LV_FONT_MONTSERRAT_28_COMPRESSED #define LV_FONT_MONTSERRAT_28_COMPRESSED 1 #endif #ifdef _LV_FONT_DEJAVU_16_PERSIAN_HEBREW #undef LV_FONT_DEJAVU_16_PERSIAN_HEBREW #define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1 #endif #ifdef _LV_FONT_SIMSUN_16_CJK #undef LV_FONT_SIMSUN_16_CJK #define LV_FONT_SIMSUN_16_CJK 1 #endif #ifdef _LV_FONT_UNSCII_8 #undef LV_FONT_UNSCII_8 #define LV_FONT_UNSCII_8 1 #endif #ifdef _LV_FONT_UNSCII_16 #undef LV_FONT_UNSCII_16 #define LV_FONT_UNSCII_16 1 #endif #ifdef _LV_FONT_CUSTOM #define LV_FONT_CUSTOM 1 #endif #ifdef _LV_FONT_CUSTOM_DECLARE #define LV_FONT_CUSTOM_DECLARE _LV_FONT_CUSTOM_DECLARE #endif /*------------------ * DEFAULT FONT *-----------------*/ #ifdef _LV_FONT_DEFAULT_MONTSERRAT_8 # define LV_FONT_DEFAULT &lv_font_montserrat_8 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_10) # define LV_FONT_DEFAULT &lv_font_montserrat_10 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_12) # define LV_FONT_DEFAULT &lv_font_montserrat_12 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_14) # define LV_FONT_DEFAULT &lv_font_montserrat_14 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_16) # define LV_FONT_DEFAULT &lv_font_montserrat_16 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_18) # define LV_FONT_DEFAULT &lv_font_montserrat_18 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_20) # define LV_FONT_DEFAULT &lv_font_montserrat_20 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_22) # define LV_FONT_DEFAULT &lv_font_montserrat_22 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_24) # define LV_FONT_DEFAULT &lv_font_montserrat_24 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_26) # define LV_FONT_DEFAULT &lv_font_montserrat_26 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_28) # define LV_FONT_DEFAULT &lv_font_montserrat_28 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_30) # define LV_FONT_DEFAULT &lv_font_montserrat_30 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_32) # define LV_FONT_DEFAULT &lv_font_montserrat_32 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_34) # define LV_FONT_DEFAULT &lv_font_montserrat_34 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_36) # define LV_FONT_DEFAULT &lv_font_montserrat_36 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_38) # define LV_FONT_DEFAULT &lv_font_montserrat_38 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_40) # define LV_FONT_DEFAULT &lv_font_montserrat_40 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_42) # define LV_FONT_DEFAULT &lv_font_montserrat_42 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_44) # define LV_FONT_DEFAULT &lv_font_montserrat_44 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_46) # define LV_FONT_DEFAULT &lv_font_montserrat_46 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_48) # define LV_FONT_DEFAULT &lv_font_montserrat_48 #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_12_SUBPX) # define LV_FONT_DEFAULT &lv_font_montserrat_12_subpx #elif defined(_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED) # define LV_FONT_DEFAULT &lv_font_montserrat_28_compressed #elif defined(_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW) # define LV_FONT_DEFAULT &lv_font_dejavu_16_persian_hebrew #elif defined(_LV_FONT_DEFAULT_SIMSUN_16_CJK) # define LV_FONT_DEFAULT &lv_font_simsun_16_cjk #elif defined(_LV_FONT_DEFAULT_UNSCII_8) # define LV_FONT_DEFAULT &lv_font_unscii_8 #elif defined(_LV_FONT_DEFAULT_UNSCII_16) # define LV_FONT_DEFAULT &lv_font_unscii_16 #endif #ifdef _LV_TXT_ENC_UTF8 # define LV_TXT_ENC LV_TXT_ENC_UTF8 #elif defined(_LV_TXT_ENC_ASCII) # define LV_TXT_ENC LV_TXT_ENC_ASCII #endif #endif ``` #### lv_port_disp.c ```c #include
#include
#include "ra8/lcd_config.h" #include "hal_data.h" static rt_sem_t _SemaphoreVsync = RT_NULL; static uint8_t lvgl_init_flag = 0; void DisplayVsyncCallback(display_callback_args_t *p_args) { rt_interrupt_enter(); if (DISPLAY_EVENT_LINE_DETECTION == p_args->event) { if (lvgl_init_flag != 0) rt_sem_release(_SemaphoreVsync); } rt_interrupt_leave(); } static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) { #if defined(RENESAS_CORTEX_M85) #if (BSP_CFG_DCACHE_ENABLED) int32_t size; /* Invalidate cache - so the HW can access any data written by the CPU */ size = sizeof(fb_background[0]); SCB_CleanInvalidateDCache_by_Addr(px_map, size); #endif #endif uint32_t ii = 0; for (uint32_t j = area->y1; j < area->y2+1; j++) { uint32_t begin = j * 480 * 2; for (uint32_t i = area->x1; i < area->x2+1; i++) { *(uint16_t *)&(fb_background[0][(i << 1)+ begin]) = color_p[ii++].full; } } lv_disp_flush_ready(disp_drv); rt_sem_take(_SemaphoreVsync, RT_WAITING_FOREVER); } void lv_port_disp_init(void) { static rt_device_t device; /* LCD Device Init */ device = rt_device_find("lcd"); RT_ASSERT(device != RT_NULL); _SemaphoreVsync = rt_sem_create("lvgl_sem", 1, RT_IPC_FLAG_PRIO); if (RT_NULL == _SemaphoreVsync) { rt_kprintf("lvgl semaphore create failed\r\n"); RT_ASSERT(0); } static lv_disp_draw_buf_t draw_buf_dsc_3; static lv_color_t buf_3_1[LV_HOR_RES_MAX * LV_VER_RES_MAX]; lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, NULL, LV_HOR_RES_MAX * LV_VER_RES_MAX); static lv_disp_drv_t disp_drv; lv_disp_drv_init(&disp_drv); disp_drv.hor_res = LV_HOR_RES_MAX; disp_drv.ver_res = LV_VER_RES_MAX; disp_drv.flush_cb = disp_flush; disp_drv.draw_buf = &draw_buf_dsc_3; lv_disp_drv_register(&disp_drv); lvgl_init_flag = 1; } ``` #### lv_port_indev.c ```c #include
#include
#include "cst812t.h" #define DBG_TAG "lv_port_indev" #define DBG_LVL DBG_LOG #include
#include "hal_data.h" static rt_device_t touch_dev = RT_NULL; static struct rt_touch_data read_data; lv_indev_t *indev_touchpad; static rt_err_t touch_probe() { touch_dev = rt_device_find("cst8xx"); if (touch_dev == RT_NULL) { LOG_E("can't find device cst8xx"); return -RT_ERROR; } if (rt_device_open(touch_dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK) { LOG_E("open device failed!"); return -RT_ERROR; } return RT_EOK; } static void touchpad_read(lv_indev_drv_t *indev_drv, lv_indev_data_t *data) { if (rt_device_read(touch_dev, 0, &read_data, 1) == 1) { data->point.x = read_data.x_coordinate; data->point.y = read_data.y_coordinate; switch (read_data.event) { case TOUCH_EVENT_UP: data->state = LV_INDEV_STATE_REL; break; case TOUCH_EVENT_DOWN: data->state = LV_INDEV_STATE_PR; break; case TOUCH_EVENT_MOVE: data->state = LV_INDEV_STATE_PR; break; default: break; } } } #define RST_PIN "p000" #define INT_PIN "p010" #define TOUCH_DEVICE_NAME "sci3i" int rt_hw_cst812t_register(void) { struct rt_touch_config cfg; rt_base_t int_pin = rt_pin_get(INT_PIN); rt_base_t rst_pin = rt_pin_get(RST_PIN); cfg.dev_name = TOUCH_DEVICE_NAME; cfg.irq_pin.pin = int_pin; cfg.irq_pin.mode = PIN_MODE_INPUT_PULLUP; cfg.user_data = &rst_pin; rt_hw_cst8xx_init("cst8xx", &cfg); cst8xx_probe(); cst8xx_reset(20); return RT_EOK; } INIT_DEVICE_EXPORT(rt_hw_cst812t_register); void lv_port_indev_init(void) { static lv_indev_drv_t indev_drv; if (touch_probe() != RT_EOK) { rt_kprintf("probe cst812t failed.\n"); return; } /*Register a touchpad input device*/ lv_indev_drv_init(&indev_drv); indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = touchpad_read; indev_touchpad = lv_indev_drv_register(&indev_drv); 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(indev_touchpad, cursor_obj); /* Connect the image object to the driver*/ } ``` #### mouse_cursor_icon.c 图标文件太大了,超出了论坛的最大字数,可以用上文提到的网站自行转换一下
3
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
pomin
这家伙很懒,什么也没写!
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
1
LittlevGL + DMA2D 显示图案扭曲
2
LittleVGL2RTT软件包还有在维护吗,测试遇到一些问题求解
3
使用littlevgl2rtt软件包实例运行不成功,emwin正常
4
关于littlevgl2rtt软件包刷频慢的解决方案?
5
移植了littlevGUI之后,用动态 线程去跑例程会卡死
6
lvgl的字体、图片文件如何升级?
7
qemu-vexpress-a9bsp下的littvgl工程可以实现触屏操作吗?
8
LVGL控件刷新死机问题
9
在lvgl上设置一个时间显示的label,一段时间后所有控件消失。
10
littlevgl2rtt和littlevgl的pc模拟器源码不兼容吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部