• 树莓派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了。

  • 相关阅读:
    迭代器和生成器
    python装饰器详述
    python爬虫-Response对象的属性
    python爬虫入门-开发环境与小例子
    c语言贪吃蛇详解5.GameOver功能与显示成绩
    c语言贪吃蛇详解4.食物的投放与蛇的变长
    vb实验7-找出小于18000的最大素数
    qt学习教程1.qt开发环境搭建
    链栈类模板实现
    顺序栈类模板实现
  • 原文地址:https://www.cnblogs.com/bigmagic/p/12781065.html
Copyright © 2020-2023  润新知