树莓派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拼音输入法
你还在为树莓派无法安装中文输入法而到处找教程吗? 你还在为树莓派每次下载都要远隔重洋获取资源,龟速下载而烦恼吗? 为了解决这个问题,在这篇树莓派教程中,我将手把手叫你怎样安装 清华镜像系统和中文输入法 ...
随机推荐
- 基于zookeeper实现分布式锁和基于redis实现分布所的区别
1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑.当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占. redis实现分 ...
- mybatis 源码赏析(一)sql解析篇
本系列主要分为三部分,前两部分主要分析mybatis的实现原理,最后一部分结合spring,来看看mybtais是如何与spring结合的就是就是mybatis-spring的源码. 相较于sprin ...
- python—time模块
timetime模块提供各种时间相关的功能,与时间相关的模块有:time,datetime,calendar等. 时间有三种表示方式,一种是时间戳.一种是格式化时间.一种是时间元组.时间戳和格式化时间 ...
- ML-Agents(四)GridWorld
目录 ML-Agents(四)GridWorld Visual Observations Masking Discrete Actions 环境与训练参数 场景基本结构 代码分析 环境初始化代码 Ag ...
- python使用镜像源安装库
pip install django -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 豆瓣 :http://pypi.d ...
- 一文读懂什么是CA证书
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- 如何理解EventLoop--浏览器篇
前言 最近在准备春招,刷到了JS中的主要运行机制--Event Loop,觉得它的实现思路有必要整理一下,以防忘记.关于它在浏览器上的实现,我结合了自己的理解以及示例代码,想用最通俗的语言表达出来.如 ...
- Pytest系列(6) - conftest.py的详细讲解
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 什么是conftest.py 可以 ...
- Java并发基础05. 传统线程同步通信技术
先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首 ...
- 1039 Course List for Student (25分)
Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists o ...