【lvgl】linux开发板搭建环境
前言
本章介绍如何在linux开发板准备好了fb0的情况下移植lvgl。
抓取源码
git clone https://github.com/lvgl/lvgl.git
git clone https://github.com/lvgl/lv_drivers.git
git clone https://github.com/lvgl/lv_demos.git
git clone https://github.com/lvgl/lv_port_linux_frame_buffer.git
注意:如果https一直无法成功,可以配一下ssh
配置ssh
获取ssh key
ssh-keygen -t rsa -C "xxx@qq.com"
#一直回车
结束之后会显示你的ssh存在哪里,比如~/.ssh/id_rsa.pub
读取这个文件
cat ~/.ssh/id_rsa.pub
是以ssh-rsa开头的内容,将其全部复制。
github网页中,选择setting,添加ssh key并保存。
使用下述命令抓取代码。
git clone git@github.com:lvgl/lvgl.git
git clone git@github.com:lvgl/lv_drivers.git
git clone git@github.com:lvgl/lv_demos.git
git clone git@github.com:lvgl/lv_port_linux_frame_buffer.git
切换分支
cd lvgl
git checkout release/v8.1
cd ../lv_drivers
git checkout release/v8.1
cd ../lv_demos
git checkout release/v8.1
cd ../lv_port_linux_frame_buffer
git checkout release/v8.2
git branch -a
参考:https://blog.csdn.net/dhy_el/article/details/132791764
复制文件
cp lvgl/lv_conf_template.h test/lv_conf.h
cp -r lvgl test/
cp lv_drivers/lv_drv_conf_template.h test/lv_drv_conf.h
cp -r lv_drivers test/
cp lv_demos/lv_demo_conf_template.h test/lv_demo_conf.h
cp -r lv_demos test/
cp lv_port_linux_frame_buffer/main.c test
cp lv_port_linux_frame_buffer/Makefile test
修改配置
lv_conf.h
youkai@ubuntu:~/0_pro/lvgl/lv_port_linux_frame_buffer$ diff lv_conf.h lvgl/lv_conf_template.h
15c15
< #if 1 /*Set it to "1" to enable content*/
---
> #if 0 /*Set it to "1" to enable content*/
52c52
< # define LV_MEM_SIZE (10U * 1024U * 1024U) /*[bytes]*/
---
> # define LV_MEM_SIZE (32U * 1024U) /*[bytes]*/
81c81
< #define LV_DISP_DEF_REFR_PERIOD 10 /*[ms]*/
---
> #define LV_DISP_DEF_REFR_PERIOD 30 /*[ms]*/
84c84
< #define LV_INDEV_DEF_READ_PERIOD 10 /*[ms]*/
---
> #define LV_INDEV_DEF_READ_PERIOD 30 /*[ms]*/
88c88
< #define LV_TICK_CUSTOM 1
---
> #define LV_TICK_CUSTOM 0
90,93c90,91
< // #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
< // #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
< #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*/
---
> #define LV_TICK_CUSTOM_INCLUDE "Arduino.h" /*Header for the system time function*/
> #define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis()) /*Expression evaluating to current system time in ms*/
176c174
< #define LV_USE_LOG 1
---
> #define LV_USE_LOG 0
190c188
< # define LV_LOG_PRINTF 1
---
> # define LV_LOG_PRINTF 0
307,309c305,307
< #define LV_FONT_MONTSERRAT_8 1
< #define LV_FONT_MONTSERRAT_10 1
< #define LV_FONT_MONTSERRAT_12 1
---
> #define LV_FONT_MONTSERRAT_8 0
> #define LV_FONT_MONTSERRAT_10 0
> #define LV_FONT_MONTSERRAT_12 0
311c309
< #define LV_FONT_MONTSERRAT_16 1
---
> #define LV_FONT_MONTSERRAT_16 0
lv_drv_conf.h
youkai@ubuntu:~/0_pro/lvgl/lv_port_linux_frame_buffer$ diff lv_drv_conf.h lv_drivers/lv_drv_conf_template.h
11c11
< #if 1 /*Set it to "1" to enable the content*/
---
> #if 0 /*Set it to "1" to enable the content*/
319c319
< # define USE_FBDEV 1
---
> # define USE_FBDEV 0
lv_demo_conf.h
youkai@ubuntu:~/0_pro/lvgl/lv_port_linux_frame_buffer$ diff lv_demo_conf.h lv_demos/lv_demo_conf_template.h
11c11
< #if 1 /*Set it to "1" to enable the content*/
---
> #if 0 /*Set it to "1" to enable the content*/
29c29
< #define LV_USE_DEMO_WIDGETS 1
---
> #define LV_USE_DEMO_WIDGETS 0
main.c
#include "lvgl/lvgl.h"
// #include "lvgl/demos/lv_demos.h"
#include "lv_demos/lv_demo.h"
#include "lv_drivers/display/fbdev.h"
// #include "lv_drivers/indev/evdev.h"
#include <unistd.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>#define DISP_BUF_SIZE (128 * 160 * 2)int main(void)
{/*LittlevGL init*/lv_init();/*Linux frame buffer device init*/fbdev_init();/*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 = 128;disp_drv.ver_res = 160;lv_disp_drv_register(&disp_drv);// 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*//*Create a Demo*/lv_demo_widgets();/*Handle LitlevGL tasks (tickless mode)*/while(1) {lv_timer_handler();usleep(5000);}return 0;
}/*Set in lv_conf.h as `LV_TICK_CUSTOM_SYS_TIME_EXPR`*/
uint32_t custom_tick_get(void)
{static uint64_t start_ms = 0;if(start_ms == 0) {struct timeval tv_start;gettimeofday(&tv_start, NULL);start_ms = (tv_start.tv_sec * 1000000 + tv_start.tv_usec) / 1000;}struct timeval tv_now;gettimeofday(&tv_now, NULL);uint64_t now_ms;now_ms = (tv_now.tv_sec * 1000000 + tv_now.tv_usec) / 1000;uint32_t time_ms = now_ms - start_ms;return time_ms;
}
makefile
注意
- CC是你使用的gcc路径
- 需要添加demo的mk
- 移除mouse_cursor_icon.c,对应代码中也移除了。
#
# Makefile
#
CC = /home/youkai/0_pro/luckfox/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
# CC = /home/youkai/0_pro/milkv/duo_buildroot_sdk/duo-buildroot-sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-gcc
LVGL_DIR_NAME ?= lvgl
LVGL_DIR ?= ${shell pwd}
CFLAGS ?= -O3 -g0 -I$(LVGL_DIR)/ -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifiers -Wall -Wextra -Wno-unused-function -Wno-error=strict-prototypes -Wpointer-arith -fno-strict-aliasing -Wno-error=cpp -Wuninitialized -Wmaybe-uninitialized -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wno-cast-qual -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wformat-security -Wno-ignored-qualifiers -Wno-error=pedantic -Wno-sign-compare -Wno-error=missing-prototypes -Wdouble-promotion -Wclobbered -Wdeprecated -Wempty-body -Wtype-limits -Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -Wno-unused-parameter -Wno-missing-field-initializers -Wuninitialized -Wmaybe-uninitialized -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wtype-limits -Wsizeof-pointer-memaccess -Wno-format-nonliteral -Wpointer-arith -Wno-cast-qual -Wmissing-prototypes -Wunreachable-code -Wno-switch-default -Wreturn-type -Wmultichar -Wno-discarded-qualifiers -Wformat-security -Wno-ignored-qualifiers -Wno-sign-compare
LDFLAGS ?= -lm
BIN = demo#Collect the files to compile
MAINSRC = ./main.cinclude $(LVGL_DIR)/lvgl/lvgl.mk
include $(LVGL_DIR)/lv_drivers/lv_drivers.mk
include $(LVGL_DIR)/lv_demos/lv_demo.mk# CSRCS +=$(LVGL_DIR)/mouse_cursor_icon.cOBJEXT ?= .oAOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))MAINOBJ = $(MAINSRC:.c=$(OBJEXT))SRCS = $(ASRCS) $(CSRCS) $(MAINSRC)
OBJS = $(AOBJS) $(COBJS)## MAINOBJ -> OBJFILESall: default%.o: %.c@$(CC) $(CFLAGS) -c $< -o $@@echo "CC $<"default: $(AOBJS) $(COBJS) $(MAINOBJ)$(CC) -o $(BIN) $(MAINOBJ) $(AOBJS) $(COBJS) $(LDFLAGS)clean: rm -f $(BIN) $(AOBJS) $(COBJS) $(MAINOBJ)
编译
youkai@ubuntu:~/0_pro/lvgl/pro_lvgl/test$ make
youkai@ubuntu:~/0_pro/lvgl/pro_lvgl/test$ file demo
demo: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, with debug_info, not strippedyoukai@ubuntu:~/0_pro/lvgl/pro_lvgl/test$ file demo
demo: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-riscv64xthead.so.1, with debug_info, not stripped
/lib/ld-uClibc.so.0 —— luckfox所需要的so。
/lib/ld-musl-riscv64xthead.so.1 —— milkv-duo所需要的so。
运行——milkv-duo
[root@milkv]~# ls
demo_milkv
[root@milkv]~# chmod 777 demo_milkv
[root@milkv]~# ./demo_milkv
[Warn] (0.023, +23) lv_demo_widgets: LV_FONT_MONTSERRAT_18 is not enabled for the widgets demo. Using LV_FONT_DEFAULT instead. (in lv_demo_widgets.c line #130)
^C
[root@milkv]~#
至此,可以成功的使用lvgl显示demo,不过还需要自己实现功能。
相关文章:

【lvgl】linux开发板搭建环境
前言 本章介绍如何在linux开发板准备好了fb0的情况下移植lvgl。 抓取源码 git clone https://github.com/lvgl/lvgl.git git clone https://github.com/lvgl/lv_drivers.git git clone https://github.com/lvgl/lv_demos.git git clone https://github.com/lvgl/lv_port_lin…...
C之(10)CMocka-单元测试框架使用
CMocka基础使用 Author:Once Day Date:2023年6月15日 参考文档: GoogleTest User’s Guide | GoogleTest嵌入式自动化单元测试(2)-Cmocka - 知乎 (zhihu.com)使用 cmocka 进行单元测试 | 前尘逐梦 (qianchenzhumeng.github.io)cmocka - un…...

如何在idea中使用maven搭建tomcat环境
目录 一、创建maven项目 二、完善代码结构 三、引入依赖和插件 四、启动tomcat,运行项目 (1)点击添加配置 (2)点击左上角的加号,选择maven (3)输入运行命令 五、验证 一、创建…...
单点登录
单点登录(Single Sign-On,简称SSO)是一种可以让用户在多个应用程序和网站中使用同一组登录凭证的技术,即用户只需通过一次身份验证,就可以访问多个应用和网站。以下是单点登录的相关知识点: 1. 身份验证机…...

大数据(十):数据可视化(二)
专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…...

pytorch+LSTM实现使用单参数预测,以及多参数预测(代码注释版)
开发前准备: 环境管理:Anaconda python: 3.8 显卡:NVIDIA3060 pytorch: 到官网选择conda版本,使用的是CUDA11.8 编译器: PyCharm 简述: 本次使用seaborn库中的flights数据集来做试验,我们通过…...

腾讯云3年/5年特惠云服务器购买入口及攻略
腾讯云是腾讯旗下云计算品牌,为了吸引用户经常推出各种优惠活动,最吸引用户的还是特惠云服务器,下面给大家分享腾讯云3年/5年时长特惠服务器购买入口及教程! 购买入口:传送门>>> 购买攻略: 进入…...

【Linux】jdk Tomcat MySql的安装及Linux后端接口部署
一,jdk安装 1.1 上传安装包到服务器 打开MobaXterm通过Linux地址连接到Linux并登入Linux,再将主机中的配置文件复制到MobaXterm 使用命令查看:ll 1.2 解压对应的安装包 解压jdk 解压命令:tar -xvf jdk 加键盘中Tab键即可…...

天空卫士为集度智能汽车系上“安全带”
10月27日,集度汽车在北京正式发布了旗下首款量产车型——极越 01 SUV。极越 01 SUV 是一款集科技、智能、美学于一身的纯电动中大型SUV,号称全球首款“AI 汽车机器人”。作为集度的合作伙伴,天空卫士第一时间送上祝福,祝愿极越大卖…...

vue el-table-column 修改一整列的背景颜色
目录 修改表头以及一整列数据的背景颜色,效果如下: 总结 修改表头以及一整列数据的背景颜色,效果如下: 修改表头背景颜色:在el-table绑定header-cell-style 修改一整列的数据背景颜色:在el-table绑定:cel…...

docker 安装 minio (单体架构)
文字归档:https://www.yuque.com/u27599042/coding_star/qcsmgom7basm6y64 查询 minio 镜像 docker search minio拉取镜像 docker pull minio/minio创建启动 minio 容器 用户名长度至少为 3,密码长度至少为 8 docker run \ -p 9000:9000 \ -p 9090:909…...
docker搭建kafka
1.拉取zookeeper镜像 注意:云服务器需要设置安全策略放行2181与9092端口,否则访问失败 #默认拉取最新版本镜像 docker pull wurstmeister/zookeeper#检查镜像是否拉取成功 docker images | grep zookeeper2.通过docker运行zookeeper #docker容器单机启…...
给Nginx配置环境变量
给Nginx配置环境变量 Nginx安装目录下的二进制可执行文件nginx的很多命令,要想使用这些命令前提是需要进入sbin目录下才能使用,很不方便,如何去优化,我们可以将该二进制可执行文件加入到系统的环境变量,这样的话在任何…...

CHS零壹视频恢复程序高级版视频修复OCR使用方法
目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR,OCR是一种光学识别系统,高级版最新版本中不仅仅是在视频恢复中支持OCR,同时视频修复模块也增加了OCR功能,此功能可以针对一些批量修复的视频文件(如执法仪…...

android display 杂谈(三)WMS
用来记录学习wms,后续会一点一点更新。。。。。。 代码:android14 WMS是在SystemServer进程中启动的 在SystemServer中的main方法中,调用run方法。 private void run() { // Initialize native services.初始化服务,加载andro…...
Docker Macvlan网络创建及通信配置
环境说明 4: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000link/ether 7c:83:34:bc:e0:c2 brd ff:ff:ff:ff:ff:ffinet 10.5.1.33/24 brd 10.5.1.255 scope global dynamic bond0宿主机配置 变量配置 eth…...

删除文件要谨慎!如何在Linux中删除目录或文件
删除目录和文件是任何操作系统中最基本但最重要的功能之一。在Linux中,如果运行的是窗口环境,则可以使用文件管理器应用程序查找和删除文件。也许你是通过SSH远程登录的,或者你的Linux计算机没有安装GUI,或者你想对你要删除的内容有更多的控制权。与Linux中的任何东西一样,…...

使用 Docker 部署高可用 MongoDB 分片集群
使用 Docker 部署 MongoDB 集群 Mongodb 集群搭建 mongodb 集群搭建的方式有三种: 主从备份(Master - Slave)模式,或者叫主从复制模式。副本集(Replica Set)模式。分片(Sharding)…...
树莓派安装64位桌面版Ubuntu教程
事实证明不用显示屏没办法连接64位桌面版的22.04Ubuntu,虽然不用显示屏可以安装64位服务器版的22.04Ubuntu.或者虽然有但是我并不知道,我也不想再花时间去知道了,因为我已经花了3天时间了。 步骤: 1:下载64位22.04Ub…...

【sql注入】sql关卡1~4
前言: 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...