支持LVGL的micropython固件编译(二)arm板移植

10 篇文章 2 订阅
3 篇文章 1 订阅

开发环境

软件:Ubuntu 18.04虚拟机

硬件:君正T31开发板,RV1109开发板,Hi3516DV300开发板

关于lvgl版本micropython源码下载编译部分上一章已做过讲解,链接:支持LVGL的micropython固件编译(一)

1.编译依赖库libffi

unix版mpy的源码编译需要依赖libffi,实际上标准cpython在3.7版本之后也是依赖这个的,关于这个的交叉编译再此不在赘述,不会的可以自己去百度,或者查看我之前的一篇文章作为参照:给arm板编译移植python(二)移植zlib与_ctypes,将编译好的库与头文件放置在自己指定的目录,例如:/home/lyr/work/t31_lib/libffi-3.3  后面编译的时候需要引用该路径

2.增加板级目录

如果编译过esp32等其他版本的mpy我们会发现在ports/esp32/目录下有个boards目录这里面放的就是基于esp32芯片的各种板子,每个板级目下都有一个.h文件以及.mk文件分别配置mpy功能选项以及编译配置。同样的unix端口下面也有,在ports/unix/目录下有varints目录类似于boards目录,在varints目录下新建我们的板级目录,例如我新建一个T31目录,可以拷贝varints/standard/目录下的两个文件进来(mpconfigvariant.h,mpconfigvariant.mk)

  • 配置mpconfigvariant.h文件

如上一章所说:我们的standard/mpconfigvariant.h文件中已经有如下内容,可以使用help('modules')查看内置模组

#define MICROPY_PY_BUILTINS_MEMORYVIEW_ITEMSIZE (1)
#define MICROPY_PY_BUILTINS_NEXT2      (1)
#define MICROPY_PY_BUILTINS_RANGE_BINOP (1)
#define MICROPY_PY_BUILTINS_HELP       (1)
#define MICROPY_PY_BUILTINS_HELP_MODULES (1)
  • 配置mpconfigvariant.mk文件

复制一下内容到该文件里,各项解释参照注释

# 设置编译出的固件位置与名称,默认在unix目录下
PROG ?= micropython-lvgl

# 设置交叉编译工具链,可以使用绝对路径
CROSS_COMPILE = mips-linux-gnu-#arm-himix200-linux-

# 引用libffi库
INC += -I/home/lyr/work/t31_lib/libffi-3.3/include
LDFLAGS += -L/home/lyr/work/t31_lib/libffi-3.3/lib

# 引用SDL库,T31板子linux无SDL支持,这里不启用
#INC += -I/home/lyr/work/t31_lib/SDL2/include
#LDFLAGS += -L/home/lyr/work/t31_lib/SDL2/lib

# 我的T31板子屏幕是16位色深的这里需要标明,32或24色深则无需配置该项
LV_CFLAGS="-DLV_COLOR_DEPTH=16"
  • 关于交叉编译工具链配置

       笔者默认你已经具有基本的arm交叉编译开发经验,所以你的开发环境里已经安装设置好了交叉编译工具链。在我们的mpy源码里如何引用我们自己设置的呢

       查看py\mkenv.mk文件,可知默认引用CROSS_COMPILE的交叉编译工具,因此我们只需要设置CROSS_COMPILE = 自己的交叉编译工具链,我以T31为例,在mkenv.mk文件中加入CROSS_COMPILE = mips-linux-gnu-即可,当然基于不破坏源码的原则我们把这个设置在板级mk文件里mpconfigvariant.mk。如果你像我一样同一个开发环境存在多个不同交叉编译器,而且有些编译器存在重名问题,比如都叫arm-linux-gnueabihf-gcc,那么你最好使用绝对路径引用交叉编译工具链。

3.取消SDL编译

对于我们嵌入式开发玩家来说,板子上跑的都是纯纯的linux, 不会像ubuntu这样带有桌面GUI,SDL也就没有用武之地,我们是通过linux的fb刷屏的,进入正题如何取消SDL编译。

  1. 打开ports\unix\mpconfigport.h文件,搜索MICROPY_PY_LVGL_SDL,并将该宏定义配置为0
  2. 打开ports\unix\Makefile文件,搜索 -lSDL2 并用#注释掉,搜索SDL_monitor.c所在位置,删除以下3行代码
lv_bindings/driver/SDL/SDL_monitor.c \
lv_bindings/driver/SDL/SDL_mouse.c \
lv_bindings/driver/SDL/modSDL.c \

4.编译

打开ports\unix\Makefile文件,第一行,VARIANT ?= standard改为 VARIANT ?= T31,以使我们直接make编译T31板子,或者直接执行make VARIANT=T31

有的可能会出现这种报错:

这是因为默认吧所有waring视为error导致,不同编译器语法检查程度不一样,我们可以放过waring,以继续编译,打开ports\unix\Makefile文件搜索-Werror并用#号注释。

编译

make clean
make -j

如图,固件已成功编译

拷贝到板子运行测试

5.其他编译问题

笔者在编译的时候发现会报这个错

起初以为是编译器问题,更换不同编译器后发现依然有问题,查到最后发现是mpy-cross对imagetools.py编译链接导致的问题,初以为是imagetools.py里有些不合语法的部分比如第128行末尾有个分号

但其实这个并不影响,删除后也是无法解决问题的,而且单独编译imagetools.py并无问题。经过后来的一番研究,得知这个问题是因为代码中加了native viper等加速代码段装饰导致,native viper加速依赖于目标板架构特定的汇编指令,arm上做了适配但对于不同芯片还是会有些许兼容性影响导致编译不过,在rv1109上这个编译不过,但是可以调用py脚本中仍然是可以使用native viper加速的,另外mpy固件中尚未支持risc-v架构芯片的native viper加速功能,有能力的可以试着自己搞一下。

我们这里可以先把ports\unix\variants\manifest.py文件里对imagetools.py模组的编译去掉,这个模组是用于lvgl中png解码的一个辅助工具,需要用到的话以py外部模组的方式放置调用也是可以的。注释掉多余模组也有利于减小固件体积。

    另外async_utils.py模组依赖_uasyncio模组,需要启用uasyncio的c模组,mpconfigvariant.h中增加这句#define MICROPY_PY_UASYNCIO            (1)

参照我的manifest.py

# manifest.py
freeze_as_mpy('$(MPY_DIR)/tools', 'upip.py')
freeze_as_mpy('$(MPY_DIR)/tools', 'upip_utarfile.py', opt=3)
freeze('$(MPY_DIR)/lib/lv_bindings/driver/linux', 'evdev.py')
freeze('$(MPY_DIR)/lib/lv_bindings/lib', 'lv_colors.py')
include("$(MPY_DIR)/extmod/uasyncio/manifest.py") # async_utils.py depend on this
freeze('$(MPY_DIR)/lib/lv_bindings/lib', 'async_utils.py')
# freeze('$(MPY_DIR)/lib/lv_bindings/lib', 'display_driver_utils.py')
# freeze('$(MPY_DIR)/lib/lv_bindings/lib', 'imagetools.py') # enable this will report error
freeze('$(MPY_DIR)/lib/lv_bindings/lib', 'fs_driver.py')

update---20211224----

最近把github上的一个ulab模组也编进去了,发现一个坑,lvgl的控件回调一旦触发就会出现错误:

TypeError: unexpected keyword argument ''
 

而且加入ulab之后的mpy解释器固件也从之前的1M变成了10M大小,不知道是不是哪里编译的有问题。先去掉这个好了,反正现在不玩这个。

关于lvgl的开发教程可以参考 micropython开发lvgl教程_舞刀书生的博客-CSDN博客

最后放一张真机运行图:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值