LVGL是一款嵌入式开发比较常用的开源GUI库,lvgl本身采用c以面向对象的方式开发,这种高级特性可以很好的适应高级语言,所以采用python开发也是不错的选择。现在我们就尝试下使用micropython开发lvgl应用。官方对micropython已经做了移植支持,采用pycparser工具将lvgl c源码进行封装出一个中间c文件做为mpy模组接口。lvgl官方github上已经做好了带有移植lvlg的micropython例子,我们直接下载下来编译即可使用。
开发环境
软件:Ubuntu 18.04虚拟机
1.安装依赖的环境
sudo apt-get install git make gcc libncurses5-dev flex bison gperf python-serial
如果已经安装过了,不会再次安装
2.下载源码
github仓库地址:GitHub - lvgl/lv_micropython: Micropython bindings to LVGL for Embedded devices, Unix and JavaScript
网络好的同学可以直接
git clone https://github.com/lvgl/lv_micropython.git
下代码,网不好的话可以科学上网,或者用gitee中转一下的方法拉代码,在个人gitee账号里采用从GitHub导入仓库的方法建立gitee上的仓库,然后在从gitee上拉代码,下面以我的为例。
git clone https://gitee.com/l_y_r/lv_micropython.git
我的gitee仓库可能不会经常同步github仓库,需要最新代码建议自己处理下。
代码下好后编译会发现很多报错,很多依赖库找不到,因为我们还没有更新子模组,很多库都是空文件。更新子模组:
cd lv_micropython
git submodule update --init
cd lv_micropython/lib/lv_bindings/
git submodule update --init
这时候网不好的同学可能会比较痛苦,要更新下载的子模组比较多,因为这些子模组包含了mpy所有端口依赖的子模组,而且依然是从github拉取的。
不过如果你跟我一样只是玩unix端口编译的话,可以选择只更新以下几个子模组:
cd lv_micropython/
git submodule init lib/berkeley-db-1.xx
git submodule init lib/axtls
git submodule init lib/mbedtls
git submodule init lib/micropython-lib
git submodule init lib/lv_bindings
git submodule updatecd lv_micropython/lib/lv_bindings/
git submodule init lvgl
git submodule init pycparser
git submodule updatecd lv_micropython/lib/lv_bindings/driver/png/
git submodule init lodepng
git submodule update
submodule update失败就多试几次,就可以了。
3.编译
编译mpy-cross工具:
cd lv_micropython
make -C mpy-cross
编译unix端口的mpy:
make -C ports/unix/
编译好后测试下
./ports/unix/micropython
结果如下图:
可以发现目前的lv_micropython是采用1.14版本的,执行help('modules')查看支持的模组报错,这是因为我们编出来的standard版本得mpy没有启用help指令,修改源码启用即可。ctrl-D退出mpy的repl。
打开ports\unix\variants\standard\mpconfigvariant.h文件,在下面加入这几句,然后保存。
#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)
重新编译mpy:
cd lv_micropython/ports/unix
make clean
make -j
执行编好的固件看下结果:
help('modules')已经可以使用了,通过查看内置的模组跟标准的mpy对比发现我们这个里面含有SDL,fb, evdev,lodepng, imagetools, lvgl, lv_colors等模组,这些就是lvgl添加的组件。
其中lvgl模组就是mpy版本的GUI库,其他各个模组的用处后面用到的时候在做讲解。
4.Demo测试
lvgl官方提供的测试例子在这个路径下:lib\lv_bindings\examples
可以用编译出来的micropython解释器去执行该目录下的测试脚本。
举个栗子:
打开/lib/lv_bindings/examples/advanced_demo.py文件,在末尾加入以下代码:
if __name__ == '__main__':import timewhile True:time.sleep(1)
执行
./micropython ../../lib/lv_bindings/examples/advanced_demo.py
结果如图:
至此我们支持lvgl开发的micropython固件就编译好了,在这种带有桌面GUI的ubuntu系统上,lvgl图形加载是依靠SDL实现的,分析demo代码就能知道SDL模组作为了屏幕显示的驱动,把我们的图形加载到屏幕。micropython这种东西我们肯定是要放在板子上玩的,下一篇继续讲如何给跑linux系统的arm板编译移植。
支持LVGL的micropython固件编译(二)arm板移植