移植MicroPython的LVGL绑定到ESP32

不知道为什么没人提供ESP32现成的MicroPython的LVGL绑定固件,编译了一个并记录步骤。

步骤

以下步骤均在Linux系统完成,其他系统类似,不再赘述

切换ESP-IDF版本

LVGL官方提供的绑定版本最高支持v4.4, 参见《Setting up ESP-IDF and the build environment》。

The ESP-IDF changes quickly and MicroPython only supports certain versions. Currently MicroPython supports v4.0.2, v4.1.1, v4.2.2, v4.3.2 and v4.4, although other IDF v4 versions may also work.

ESP-IDF 变化很快,MicroPython 仅支持某些版本。目前 MicroPython 支持 v4.0.2、v4.1.1、v4.2.2、v4.3.2 和 v4.4,但其他 IDF v4 版本也可以工作。

如果已经安装了IDF,无需重新下载,进入esp/esp-idf,这是一个Git仓库,执行如下命令切换版本分支:

1
git switch release/v4.4

切换分支后,需要重新初始化Git子模块:

1
git submodule update --init --recursive

完成后,执行git status会发现还有些文件有变更,一般是之前的版本遗留的文件,删除这些变更。

这里我执行了:

1
2
rm -rf $(git status -s | cut -b 4-255) # 删除未加入Git的变更
git restore components/esptool_py/esptool # 恢复Git管理的变更

再次查看git status确保没有变更。

重新安装IDF:

1
esp/esp-idf/install.sh

编译lv_micropython

首先克隆仓库:

1
git clone https://github.com/lvgl/lv_micropython.git

进入仓库,激活IDF环境:

1
source export.sh

执行如下指令编译ESP32:

1
2
make -C mpy-cross
make -C ports/esp32 LV_CFLAGS="-DLV_COLOR_DEPTH=16" BOARD=GENERIC submodules deploy

When using IL9341 driver, the color depth need to be set to match ILI9341. This can be done from the command line.

使用IL9341驱动程序时,需要设置颜色深度以匹配ILI9341。这可以从命令行完成。

  • LV_CFLAGS are used to override color depth, for ILI9341 compatibility.

    LV_CFLAGS用于覆盖颜色深度,以实现 ILI9341 兼容性。

    • LV_COLOR_DEPTH=16 is needed if you plan to use the ILI9341 driver.

      如果您计划使用 ILI9341 驱动程序,则需要LV_COLOR_DEPTH=16

  • BOARD - I use WROVER board with SPIRAM. You can choose other boards from ports/esp32/boards/ directory.

    BOARD - 我使用带有 SPIRAM 的 WROVER 板。您可以从ports/esp32/boards/目录中选择其他板。

  • deploy - make command will create ESP32 port of Micropython, and will try to deploy it through USB-UART bridge.

    deploy - make 命令将创建 Micropython 的 ESP32 端口,并尝试通过 USB-UART 桥来部署它。

编译会报错,因为缺少Git子模块,初始化一下:

1
2
git submodule update --init --recursive lib/lv_bindings
git submodule update --init --recursive lib/berkeley-db-1.xx

如果还报错缺哪个,就初始化哪个,这里我是这两个报错。

再次编译,会报错lv_micropython/ports/esp32/network_common.c静态断言错误:

1
2
3
4
5
6
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
#define TEST_WIFI_AUTH_MAX 9
#else
#define TEST_WIFI_AUTH_MAX 8
#endif
_Static_assert(WIFI_AUTH_MAX == TEST_WIFI_AUTH_MAX, "Synchronize WIFI_AUTH_XXX constants with the ESP-IDF. Look at esp-idf/components/esp_wifi/include/esp_wifi_types.h");

查看esp-idf/components/esp_wifi/include/esp_wifi_types.h,发现是个枚举:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
/* Strength of authmodes */
/* OPEN < WEP < WPA_PSK < WPA2_PSK = WPA_WPA2_PSK < WAPI_PSK < WPA3_PSK = WPA2_WPA3_PSK */
typedef enum {
    WIFI_AUTH_OPEN = 0,         /**< authenticate mode : open */
    WIFI_AUTH_WEP,              /**< authenticate mode : WEP */
    WIFI_AUTH_WPA_PSK,          /**< authenticate mode : WPA_PSK */
    WIFI_AUTH_WPA2_PSK,         /**< authenticate mode : WPA2_PSK */
    WIFI_AUTH_WPA_WPA2_PSK,     /**< authenticate mode : WPA_WPA2_PSK */
    WIFI_AUTH_ENTERPRISE,       /**< authenticate mode : WiFi EAP security */
    WIFI_AUTH_WPA2_ENTERPRISE = WIFI_AUTH_ENTERPRISE,  /**< authenticate mode : WiFi EAP security */
    WIFI_AUTH_WPA3_PSK,         /**< authenticate mode : WPA3_PSK */
    WIFI_AUTH_WPA2_WPA3_PSK,    /**< authenticate mode : WPA2_WPA3_PSK */
    WIFI_AUTH_WAPI_PSK,         /**< authenticate mode : WAPI_PSK */
    WIFI_AUTH_WPA3_ENT_192,     /**< authenticate mode : WPA3_ENT_SUITE_B_192_BIT */
    WIFI_AUTH_MAX
} wifi_auth_mode_t;

数了下,WIFI_AUTH_MAX等于10,因此把TEST_WIFI_AUTH_MAX都改成10,过编译就行。

现在就可以过编译了,编译完会自动烧录。

自定义 ESP32 板

默认板子的Flash只有4MB,但是手上的板子使用的是16MB,为此需要自定义板子配置。

具体步骤可以参考《Defining a custom ESP32 board》。

直接上命令,复制一个板子配置模板GENERIC_16M

1
cp boards/GENERIC boards/GENERIC_16M -r

SIL_WESP32板子复制一份sdkconfig.boardGENERIC_16M文件夹。

修改内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 16 MB flash

CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
CONFIG_ESPTOOLPY_FLASHSIZE="16MB"

# Fast flash

CONFIG_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_ESP32_REV_MIN_1=y

# OTA

CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions-16MiB-ota.csv"

编辑mpconfigboard.cmake,修改内容如下:

1
2
3
4
5
set(SDKCONFIG_DEFAULTS
    boards/sdkconfig.base
    boards/sdkconfig.ble
    boards/GENERIC_16M/sdkconfig.board
)

重新编译:

1
make -C ports/esp32 LV_CFLAGS="-DLV_COLOR_DEPTH=16" BOARD=GENERIC submodules deploy

固件下载

固件下载

引用