lv_micropython for ESP32/S2/S3/C3

news2024/12/23 14:00:11

        由于官方的lv_micropython编译ESP32S3/S2/C3会报错,因为这些芯片的esp-idf底层重写了接口,参照网友提供的方法修改lv_bindings/driver/esp32里的文件,解决编译错误。 

问题列举:Issues · lvgl/lv_binding_micropython · GitHub

一、修改lv_bindings

1、修改espidf.h文件

文件路径:lv_micropython\lib\lv_bindings\driver\esp32

错误提示:

error: implicit declaration of function 'I2S_TIMING_REG'; did you mean 'I2S_RX_TIMING_REG'? [-Werror=implicit-function-declaration]
     REG_SET_BIT( I2S_TIMING_REG(i2s_num), BIT(9));

解决方案:

SPH0645_WORKAROUND()函数之前增加代码

#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2
    #define I2S_TIMING_REG I2S_TX_TIMING_REG
    #define I2S_CONF_REG I2S_TX_CONF_REG
#endif

错误提示:

/home/caiyong/share/lv_micropython/lib/lv_bindings/driver/esp32/espidf.h:180:21: error: 'SPI_HOST' undeclared here (not in a function); did you mean 'SPI3_HOST'?
     ENUM_SPI_HOST = SPI_HOST,
                     ^~~~~~~~
                     SPI3_HOST
/home/caiyong/share/lv_micropython/lib/lv_bindings/driver/esp32/espidf.h:181:22: error: 'HSPI_HOST' undeclared here (not in a function); did you mean 'SPI3_HOST'?
     ENUM_HSPI_HOST = HSPI_HOST,
                      ^~~~~~~~~
                      SPI3_HOST
/home/caiyong/share/lv_micropython/lib/lv_bindings/driver/esp32/espidf.h:182:22: error: 'VSPI_HOST' undeclared here (not in a function); did you mean 'SPI3_HOST'?
     ENUM_VSPI_HOST = VSPI_HOST,
                      ^~~~~~~~~
                      SPI3_HOST

解决方案:

将以下代码 

// SPI HOST enum was changed to macros on v4
enum {
    ENUM_SPI_HOST = SPI_HOST,
    ENUM_HSPI_HOST = HSPI_HOST,
    ENUM_VSPI_HOST = VSPI_HOST,
};
#endif

改为

// SPI HOST enum was changed to macros on v4
enum {
#ifdef CONFIG_IDF_TARGET_ESP32
    ENUM_SPI_HOST = SPI_HOST,
    ENUM_HSPI_HOST = HSPI_HOST,
    ENUM_VSPI_HOST = VSPI_HOST,
#else
    ENUM_SPI_HOST = SPI1_HOST,
    ENUM_HSPI_HOST = SPI2_HOST,
    ENUM_VSPI_HOST = SPI3_HOST,
#endif
};
#endif
2、修改modrtch.c文件

文件路径:lv_micropython\lib\lv_bindings\driver\esp32

错误提示:

 error: 'ADC1_GPIO36_CHANNEL' undeclared here (not in a function); did you mean 'ADC1_GPIO6_CHANNEL'?
 #define GPIO_TO_ADC_ELEMENT(x) [x] = CONCAT3(ADC1_GPIO, x, _CHANNEL)

解决方案:

将以下代码

static const int gpio_to_adc[] = {
        GPIO_TO_ADC_ELEMENT(36),
        GPIO_TO_ADC_ELEMENT(37),
        GPIO_TO_ADC_ELEMENT(38),
        GPIO_TO_ADC_ELEMENT(39),
        GPIO_TO_ADC_ELEMENT(32),
        GPIO_TO_ADC_ELEMENT(33),
        GPIO_TO_ADC_ELEMENT(34),
        GPIO_TO_ADC_ELEMENT(35),
};

改为

static const int gpio_to_adc[] = {
#if (CONFIG_IDF_TARGET_ESP32)
        GPIO_TO_ADC_ELEMENT(36),
        GPIO_TO_ADC_ELEMENT(37),
        GPIO_TO_ADC_ELEMENT(38),
        GPIO_TO_ADC_ELEMENT(39),
        GPIO_TO_ADC_ELEMENT(32),
        GPIO_TO_ADC_ELEMENT(33),
        GPIO_TO_ADC_ELEMENT(34),
        GPIO_TO_ADC_ELEMENT(35),
#elif (CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3)
        GPIO_TO_ADC_ELEMENT(1),
        GPIO_TO_ADC_ELEMENT(2),
        GPIO_TO_ADC_ELEMENT(3),
        GPIO_TO_ADC_ELEMENT(4),
        GPIO_TO_ADC_ELEMENT(5),
        GPIO_TO_ADC_ELEMENT(6),
        GPIO_TO_ADC_ELEMENT(7),
        GPIO_TO_ADC_ELEMENT(8),
        GPIO_TO_ADC_ELEMENT(9),
        GPIO_TO_ADC_ELEMENT(10),
#elif (CONFIG_IDF_TARGET_ESP32C3)
        GPIO_TO_ADC_ELEMENT(1),
        GPIO_TO_ADC_ELEMENT(2),
        GPIO_TO_ADC_ELEMENT(3),
        GPIO_TO_ADC_ELEMENT(4),
#endif 
};

错误提示:

 error: implicit declaration of function 'adc_gpio_init'; did you mean 'gpio_init'? [-Werror=implicit-function-declaration]
     adc_gpio_init(ADC_UNIT_1, adc_channel);
     ^~~~~~~~~~~~~
     gpio_init

解决方案:

将以下代码

adc_gpio_init(ADC_UNIT_1, adc_channel);

改为

#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2
    adc_gpio_init(ADC_UNIT_1, adc_channel);
#endif
3、修改mkrules.cmake文件

文件路径:lv_micropython\lib\lv_bindings

将以下代码

            FILTER
                i2s_ll.h
                i2s_hal.h
                esp_intr_alloc.h
                soc/spi_periph.h
                rom/ets_sys.h
                soc/sens_struct.h
                soc/rtc.h
                driver/periph_ctrl.h

改为

            FILTER
                i2s_ll.h
                i2s_hal.h
                esp_intr_alloc.h
                soc/spi_periph.h
                rom/ets_sys.h
                soc/sens_struct.h
                soc/rtc.h
                driver/periph_ctrl.h
                esp_eth/include/esp_eth.h
                esp_eth/include/esp_eth_netif_glue.h
                esp_eth/include/esp_eth_phy.h
                esp_eth/include/esp_eth_com.h
                esp_eth/include/esp_eth_mac.h
                esp_eth/include/eth_phy_regs_struct.h
                freertos/FreeRTOSConfig_arch.h
                rom/lldesc.h
                driver/rtc_io.h
4、修改文件espidf.c

文件路径:lv_micropython\lib\lv_bindings\driver\esp32

错误提示:

/home/caiyong/.espressif/tools/xtensa-esp32s3-elf/esp-2021r2-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/bin/ld: esp-idf/main/libmain.a(lv_espidf.c.obj):(.rodata.mp_gpio_input_get_high_mpobj+0xc): undefined reference to `gpio_input_get_high'
/home/caiyong/.espressif/tools/xtensa-esp32s3-elf/esp-2021r2-8.4.0/xtensa-esp32s3-elf/bin/../lib/gcc/xtensa-esp32s3-elf/8.4.0/../../../../xtensa-esp32s3-elf/bin/ld: esp-idf/main/libmain.a(lv_espidf.c.obj):(.rodata.mp_gpio_output_set_high_mpobj+0xc): undefined reference to `gpio_output_set_high'

原因:gpio_output_set_high()、gpio_input_get_high()这些函数在esp-idf的/components/esp_rom/include/esp32s3/rom/gpio.h中定义了,但是没有实现。

解决方案参考: 

在文件开头部分添加以下代码

#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2
    inline uint32_t gpio_input_get_high(void){return 0;}
    inline void gpio_output_set_high(uint32_t set_mask, uint32_t clear_mask, uint32_t enable_mask, uint32_t disable_mask){}
	inline void gpio_pad_input_disable(uint32_t gpio_num){}
#endif

 乐鑫开发人员解决方案:ESP32-S3 ROM not provide gpio_input_get_high and gpio_output_set_high function? (IDFGH-8773) · Issue #10205 · espressif/esp-idf · GitHub

去掉gpio.h中没有实现函数的定义。 

二、编译

1、编译ESP32S3

参考文档:ubuntu环境编译micropython(lvgl for esp32s3)固件 - 哔哩哔哩 (bilibili.com)

执行命令:

cd lv_micropython
export IDF_TARGET=esp32s3
make -C ports/esp32 LV_CFLAGS="-DLV_COLOR_DEPTH=16" BOARD=GENERIC_S3

错误提示:

Error: app partition is too small for binary micropython.bin size 0x1f0110:
  - Part 'factory' 0/0 @ 0x10000 size 0x1f0000 (overflow 0x110)
esp-idf/esptool_py/CMakeFiles/app_check_size.dir/build.make:70: recipe for target 'esp-idf/esptool_py/CMakeFiles/app_check_size' failed

原因:编译出的micropython.bin 的尺寸是0x1f0110而分配给app的partition为0x1f0000。

解决方案:修改partitions table文件,打开ports/esp32/build-GENERIC_S3/sdkconfig可以看到所用partitions table文件为partitions-8MiB.csv,鼠标右键,选择Open With LibreOffice Calc。

 总共8MB,vfs分了6MB,factory 分了1.9375MB。将factory改为0x2F0000,vfs改为0x500000。

修改之后再次编译,编译成功:

2、编译EPS32C3

 执行指令:

cd lv_micropython
export IDF_TARGET=esp32c3
make -C ports/esp32 LV_CFLAGS="-DLV_COLOR_DEPTH=16" BOARD=GENERIC_c3

错误提示:

/home/caiyong/share/esp-idf/components/soc/esp32c3/include/soc/soc.h:75:50: error: 'DR_REG_I2S_BASE' undeclared (first use in this function); did you mean 'DR_REG_I2S0_BASE'?
 #define REG_I2S_BASE(i)                         (DR_REG_I2S_BASE + (i) * 0x1E000)

原因:没有定义DR_REG_I2S_BASE,esp-idf/components/soc/esp32c3/include/soc/soc.h中只定义了DR_REG_I2S0_BASE。

解决方案:将DR_REG_I2S_BASE 改为DR_REG_I2S0_BASE。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven的dependencyManagement与dependencies区别

先说结论:Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。 在maven多模块项目的pom文件中,有的小伙伴会发现最外层的pom文件和里面的pom文件有个地方不一样 如下图 父pom 子pom 一般来说是在maven的最外父工程pom文件里&…

4.18学习总结

多线程补充 等待唤醒机制 现在有两条线程在运行,其中一条线程可以创造一个特殊的数据供另一条线程使用,但这个数据的创建也有要求:在同一时间只允许有一个这样的特殊数据,那么我们要怎样去完成呢?如果用普通的多线程…

云原生Kubernetes: K8S 1.29版本 部署Kuboard

目录 一、实验 1.环境 2.K8S 1.29版本 部署Kuboard (第一种方式) 3.K8S 1.29版本 部署Kuboard (第二种方式) 4.K8S 1.29版本 使用Kuboard 二、问题 1.docker如何在node节点间移动镜像 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注ma…

Java学习-Module的概念和使用、IDEA的常用设置及常用快捷键

Module的概念和使用 【1】在Eclipse中我们有Workspace (工作空间)和Project (工程)的概念,在IDEA中只有Project (工程)和Module (模块)的概念。 这里的对应关系为: IDEA官网说明: An Eclipse workspace is similar to a project in IntelliJ IDEA An Eclipse pr…

二刷大数据(三)- Flink1.17

目录 Flink概念与SparkStreaming区别分层API 工作流程部署模式**Local Mode****Standalone Mode****YARN Mode****Kubernetes Mode****Application Mode** 运行架构stand alone 核心概念算子链任务槽 窗口窗口**窗口的目的与作用****时间窗口(Time Windows&#xff…

ARouter之kotlin build.gradle.kts

ARouter之kotlin build.gradle.kts kotlin的配置需要用到kapt 项目的build.gradle.kts plugins {id("com.android.application") version "8.1.2" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply falseid(&…

typecho博客的相对地址实现

typecho其中的博客地址,必须写上绝对地址,否则在迁移网址的时候会出现问题,例如页面记载异常 修改其中的 typecho\var\Widget\Options\General.php 中的165行左右, /** 站点地址 */if (!defined(__TYPECHO_SITE_URL__)) {$siteUrl new Form\Element\Text(siteUrl,null,$this-…

OpenCV从入门到精通实战(五)——dnn加载深度学习模型

从指定路径读取图像文件、利用OpenCV进行图像处理,以及使用Caffe框架进行深度学习预测的过程。 下面是程序的主要步骤和对应的实现代码总结: 1. 导入必要的工具包和模型 程序开始先导入需要的库os、numpy、cv2,同时导入utils_paths模块&…

【opencv】dnn示例-person_reid.cpp 人员识别(ReID,Re-Identification)系统

ReID(Re-Identification,即对摄像机视野外的人进行再识别) 0030_c1_f0056923.jpg 0042_c5_f0068994.jpg 0056_c8_f0017063.jpg 以上为输出结果:result文件夹下 galleryLIst.txt queryList.txt 模型下载: https://github.com/ReID-Team/ReID_e…

华为手机p70即将上市,国内手机市场或迎来新局面?

4月15日,华为官宣手机品牌全新升级,p系列品牌升级为Pura。华为P70系列手机预计将于2024年第一季度末发布,而网友也纷纷表示期待p70在拍照、性能上的全新突破。 网友们对华为P70系列的热情高涨,也印证了国内高端手机市场的潜力巨大…

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习:简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习:简介 在这个视频中,我将开始介绍聚类算法。这将是一个激动人心的时刻,因为这是我们学习的第一个非监督学习算法。我们…

数仓建模—数据仓库初识

数仓建模—数据仓库初识 数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse"一书中所提出的定义被广泛接受 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integ…

SOLIDWORKS Composer如何使用3D工具实现更真实的动画效果

当我们使用SOLIDWORKS composer创建动画时,往往会涉及到产品的安装与拆解,现实生活中我们在拆卸组装产品的时候,我们往往需要一些工具的协助,比如扳手、螺丝刀等等,那么我们如何在虚拟动画中也将这一过程以逼真的形式展…

【网站项目】新生报到系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【XR806开发板试用】XR806在U8G2上增加MQTT+JSON控制

一、前言 U8G2移植参见之前写的文章 https://aijishu.com/a/1060000000292472本次增加MQTTJSON是站在大佬的肩膀上,参见 https://aijishu.com/a/1060000000284320CJSON的使用,参见 https://blog.csdn.net/fengxinlinux/article/details/53121287 二、成…

Hive进阶(2)----HDFS写入数据流程(赋图助君理解)

HDFS写入数据流程 一、写入流程 1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址&…

如何部署npm私有仓库以及在项目中如何使用

如何部署npm私有仓库以及在项目中如何使用 为什么要部署npm私有仓库? 安全性:私有仓库允许团队存放内部研发的、不宜公开发布的代码包,只对特定用户或者团队可见和可用,从而保护公司的知识产权和商业秘密。模块的复用性&#xf…

友元,const成员,static成员变量,static成员函数

友元: friend关键字: 1.友元函数: 语法: friend在类中修饰一个函数。 那么这个函数定义到全局时仍可以访问该类的私有成员的。 (定义时不需要用friend,而是需要在全局定义前,在要使用的成员的类里进行声明&#xff…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

Tensorflow小技巧01:检测本地Tensorflow的版本

前言: 以Pycharm为例,Windwos10系统,检测本地环境的Tensorflow的版本: 1 打开Pycharm窗口 2 在窗口中输入: pythonPython 3.9.5 (tags/v3.9.5:0a7dcbd, May 3 2021, 17:27:52) [MSC v.1928 64 bit (AMD64)] on win…