樹莓派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文件夾下:

2020-04-26_16-17

其中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_corelv_drawlv_fontlv_hallv_misclv_objxlv_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.chttps://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了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM