树莓派3b在rt-thread上移植LittlevGL
树莓派3b在rt-thread上移植LittlevGL
1.本文概述
本文主要针对树莓派3b,对rt-thread上移植lvgl进行叙述。用最简单的办法,实现rtt移植lvgl的过程。只需要加几个文件,就可以在使用最新版本的LittlevGL图形库了。
本文也可以在raspi qemu上进行测试,不用实际硬件开发板就可以学习LittlevGL的开发以及rt-thread的开发。

2.资源准备
硬件资源:
树莓派3b+hdmi屏
或者采用树莓派的qemu进行模拟。相关文章可以关注我微信公众号,教你如何进行树莓派rtt环境搭建,以及qemu环境搭建。这里就不多进行叙述了。
软件资源:
获取rtt的源代码:
https://github.com/RT-Thread/rt-thread
进入相关树莓派3b的bsp目录
rt-thread/bsp/raspberry-pi/raspi3-64/
接着获取lvgl的源代码
https://github.com/littlevgl/lvgl
3.上手体验
第一步:下载源代码
https://github.com/bigmagic123/lvgl
这里是在lvgl原版工程上fork的,只添加了几个文件,后面详细描述如何修改。
放到rt-thread/bsp/raspberry-pi/raspi3-64/applications文件夹下:

其中lv_conf.h在lvgl/lv_rtt_port文件夹目录;

第二步:rtt配置使用lvgl
在rt-thread/bsp/raspberry-pi/raspi3-64输入scons --menuconfig。或者在env工具中直接输入menuconfig。

第三步:编译
在控制台输入scons即可开始编译。
CC build/kernel/src/scheduler.o
CC build/kernel/src/signal.o
CC build/kernel/src/thread.o
CC build/kernel/src/timer.o
LINK rtthread.elf
aarch64-elf-objcopy -O binary rtthread.elf kernel8.img
aarch64-elf-size rtthread.elf
text data bss dec hex filename
308672 3856 95872 408400 63b50 rtthread.elf
scons: done building targets.
将生成的kernel8.img放到树莓派3b的sd卡中,并且在串口控制台输入test_lvgl即可看到画面出来。

此时显示屏上的效果如下:

用大屏看的更加清楚

当然,如果手上没有树莓派硬件,也可以通过qemu进行体验。首先需要安装最新版本的qemu。建立如下的运行脚本即可。
if [ ! -f "sd.bin" ]; then
dd if=/dev/zero of=sd.bin bs=1024 count=65536
fi
qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio -sd sd.bin -monitor pty
执行效果如下

4.rt-thread与lvgl进行无缝对接
这一步很关键,如何在尽量少的修改下进行无缝的对接,这就需要理解lvgl与rtt的驱动框架模型。
首先rtt采用的是SCons的方式进行编译,而LittlevGL却是采用makefile的方式进行。这里新增几个Sconscript脚本就可以了。
在lvgl项目的工程下面,添加如下的Sconscript脚本
# RT-Thread building script for bridge
import os
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
if GetDepend('RT_USING_LVGL'):
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(d, 'SConscript'))
Return('objs')
以上的意思是寻找该目录下的子目录,去找SConscript脚本。
接着在lvgl/src也添加上述的脚本。
接着在lvgl/src子目录下的lv_core、lv_draw、lv_font、lv_hal、lv_misc、lv_objx、lv_themes下添加下面脚本
from building import *
cwd = GetCurrentDir()
src = Glob('*.c') + Glob('*.cpp')+ Glob('*.a')
CPPPATH = [cwd, str(Dir('#'))]
group = DefineGroup('lv_hal', src, depend = [''],CPPPATH = CPPPATH)
Return('group')
该脚本的含义就是编译该目录下的所有文件。这样就可以使用scons编译lvgl了。
接着写对接驱动,为了不修改太多的lvgl相关的东西,我建立了一个lv_rtt_port的目录,专门对接lvgl。

其中lv_conf.h是lvgl工程下lv_conf_template.h的修改版本,主要修改屏的宽高,以及BPP。
lv_port_rtt.c是rtt的lcd驱动框架和lvgl的对接部分的实现。
sysmon.c是https://github.com/littlevgl/lv_examples的demo程序,在lv_apps目录下。
rtt_lvgl_test.c是在rtt上实现的测试lvgl的程序,开启一个gui线程。
这部分完成就可以了。
另外在rtt修改的地方只有一处,就是对接tick的驱动。
void rt_hw_timer_isr(int vector, void *parameter)
{
#ifdef BSP_USING_CORETIMER
rt_hw_set_gtimer_val(timerStep);
#else
ARM_TIMER_IRQCLR = 0;
#endif
#ifdef RT_USING_LVGL
lv_tick_inc(1);
#endif
rt_tick_increase();
}
这里是硬件定时器,每一个tick产生一次中断,由于目前没有用到其他的定时器,这里使用的和操作系统同一个tick。也可以用独立的tick或者软件定时器实现。
这些操作完成之后,lvgl就可以在rtt上运行了。
5.总结
如何在rtt上实现LittlevGL的移植其实非常容易,只需要掌握rtt的文件组织方式,并且合理的使用scons进行文件组织。lvgl对接起来总的说起来就是三步:
1.对接lcd的framebuff
2.对接tick
3.对接触摸
然后去实现绘图功能。
后续在树莓派3b上会移植spi接口的屏,会带上触摸功能,就可以更加便捷的玩转树莓派,玩转LittlevGL以及学习rtt了。

树莓派3b在rt-thread上移植LittlevGL的更多相关文章
- 树莓派3B+上运行.Net Core项目
最近买了个树莓派3B+,准备把自己写的一个.Net Core爬虫挂在上面跑 买之前没有想到树莓派因为是今年新出的,导致驱动以及系统啥的都不是很完善,导致走了很多弯路,早知道买树莓派3就不用那么多折腾了 ...
- 在树莓派3B上安装node.js
本文主讲如何在树莓派3B上安装node.js 环境描述1. 树莓派安装了`2016-11-25-raspbian-jessie-lite`(PS:在此版本的镜像中,默认禁用了ssh,在烧录好镜像之后, ...
- 树莓派3B的食用方法-1(装系统 网线ssh连接)
首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...
- 树莓派3B+通过路由器进SSH和VNC
1.打开树莓派官网 www.raspberrypi.org 选择 ”Raspbian Stretch with desktop and recommended software“ 并下载 镜像包含推荐 ...
- 树莓派3b+ Ubuntu 16.04 MATA系统 ssh远程登陆后修改主机名、用户密码和用户名
写在前面: 刚刚开始写博客,记录下自己的学习过程,备忘. 最近在使用树莓派做智能小车的开发,使用的是树莓派3b+,安装的是Ubuntu 16.04 MATA 系统,安装系统后需要修改主机名,登陆密码以 ...
- 树莓派3b安装Nginx和php7和百度语音合成模块
1.安装sox系统mp3音频播放模块(项目需要) sudo apt-get install lame sudo apt-get install sox sudo apt-get install lib ...
- 树莓派3B+首次登陆通过网络
树莓派3B+默认串口不能登录,即使可使用可需要通过连线方式连接,如何才能直接通过网络ssh登录树莓派呢? 串口问题及使用 树莓派3的UART串口的使用问题,该串口问题的官方反馈及回复请参考这两篇官方博 ...
- 树莓派3B+简单入门
刚刚入手一个树莓派3B+,树莓派板子.3.5寸电阻触摸屏.16G内存卡.外壳电源等一系列配件一共花了360大洋,这东西真不便宜.这里介绍一下系统安装.3.5寸屏幕安装.VNC远程屏幕. 先给大家看一下 ...
- 树莓派3B/3B+ 清华镜像系统和安装中文输入法Fcitx及Google拼音输入法
你还在为树莓派无法安装中文输入法而到处找教程吗? 你还在为树莓派每次下载都要远隔重洋获取资源,龟速下载而烦恼吗? 为了解决这个问题,在这篇树莓派教程中,我将手把手叫你怎样安装 清华镜像系统和中文输入法 ...
随机推荐
- nodejs 模块加载顺序
nodejs 模块加载顺序 一.当引入模块的形式是 require('lt') 时(1).先找当前文件夹下的node_modules文件夹下的lt文件夹下的package.json 文件指定的main ...
- HDU - 1622 用到了层次遍历
题意: 给出一些字符串,由(,)包着,表示一个节点,逗号前面是节点的值,后面是节点从根节点走向自己位置的路线,输入以( )结尾,如果这组数据可以构成一个完整的树,输出层次遍历结果,否则输出not co ...
- arcgis发布服务后显示证书不安全,将https改为http
arcgis server发布服务后显示证书不安全,无法浏览. 要通过https://localhost:port/arcgis/admin作如下修改 update之后地图服务会重启,耐心等待一会儿就 ...
- Word文档转html并提取标题
最近做了一个功能,需要将word文档转化成html的格式,并提取出标题生成导航.考虑到功能的复杂程度,将需要降低为对“标题1”这种格式进行提取. docx为后缀的文档(word2007)支持XML的文 ...
- [noip模拟赛]某种数列问题<dp>
某种数列问题 (jx.cpp/c/pas) 1000MS 256MB 众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以 ...
- 透过 ReentrantLock 分析 AQS 的实现原理
对于 Java 开发者来说,都会碰到多线程访问公共资源的情况,这时候,往往都是通过加锁来保证访问资源结果的正确性.在 java 中通常采用下面两种方式来解决加锁得问题: synchronized 关键 ...
- Linux操作系统及调用接口
Linux操作系统包含以下各子系统: 系统调用子系统:操作系统的功能调用同一入口: 进程管理子系统:对执行程序进行生命周期和资源管理: 内存管理子系统:对系统的内存进行管理.分配.回收.隔离: 文件子 ...
- vue-cli3引入svg图标全过程以及遇到的坑
https://blog.csdn.net/weixin_41229588/article/details/101159755 一.配置 1.安装依赖: npm install svg-sprite- ...
- 16个实例讲述如何写好App描述
App描述很重要,很多人都知道,但你有没有亲自比较.研究过别人的app是如何描述的呢? 毫无疑问,app描述页面不仅仅是描述,它更多是一个销售页面,开发者不能面对面向用户营销自己的产品,因此app ...
- go 接口与动态类型
Go 没有类:数据(结构体或更一般的类型)和方法是一种松耦合的正交关系. 二.动态方法调用 通常需要编译器静态检查的支持:当变量被赋值给一个接口类型的变量时,编译器会检查其是否实现了该接口的所有函数.