lv_micropython for ESP32/S2/S3/C3

        由于官方的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.mfbz.cn/a/555969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视觉信息保真度VIF算法详细介绍

来源 算法核心思想来源该篇论文A VISUAL INFORMATION FIDELITY APPROACH TO VIDEO QUALITY ASSESSMENT;是2005年的一篇高引用文章; 是一种全参考的视频图像评价算法;在奈飞开源的视频质量评价工具vmaf中将其作为一个判断维度,具体关于vmaf介绍可以参考视频质量评价工具vmaf…

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

机器学习笔记 - 使用 OpenCV 的结构化森林进行边缘检测

一、简述 边缘检测是计算机视觉领域中一项非常重要的任务。这是许多纯计算机视觉任务(例如轮廓检测)的第一步。即使涉及深度学习,较深层也首先学习识别边缘,然后再学习图像的复杂特征。所以,我们可以说边缘检测在计算机视觉领域非常重要。拥有良好且高效的图像边缘检测算法…

微信小程序实现美食检索功能

1、打开浏览器搜索:腾讯位置服务 2、注册一个账号,有账号的直接登陆就行 3、注册登陆成功后,点击控制台 4、进入控制台后点击我的应用——>创建应用 5、添加key,注意看注释 6、key添加成功后,开始分配额度(配额&…

复合机器人在磁钢上下料中的应用及其优势分析

复合机器人是一种集成了移动机器人和工业机器人功能的设备,其独特之处在于拥有“手、脚、眼、脑”的综合能力,从而实现了更高的灵活性和操作效率。在磁钢上下料的应用场景中,复合机器人能够发挥显著的优势。 首先,复合机器人可以根…

【 书生·浦语大模型实战营】作业(五):LMDeploy 量化部署

【 书生浦语大模型实战营】作业(五):LMDeploy 量化部署 🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系…

vscode绿绿主题setting config

下载插件Green Tree Theme 选greentree ctrl shift p找到setting {"workbench.colorTheme": "Green Tree","editor.fontSize": 16.5, // 字号"workbench.colorCustomizations": {"[Green Tree]": {"activityBarBadge.…

android远程更新下载apk

最近业务有涉及到&#xff0c;奈何是个app代码小白&#xff0c;遂记录一下 一&#xff1a;AndroidManifest.xml文件配置 application标签里面加上 android:networkSecurityConfig"xml/network_config" <!-- app下载更新配置--> <uses-permission andr…

Hugging Face 推出 Idefics2 视觉语言模型

Hugging Face 公司宣布推出 Idefics2&#xff0c;这是一个多功能模型&#xff0c;能够理解和生成基于图像和文本的文字回复。该模型为回答视觉问题、描述视觉内容、根据图像创作故事、文档信息提取&#xff0c;甚至根据视觉输入执行算术运算树立了新的标杆。 Idefics2 仅有 80…

java死锁

一、什么是死锁 锁是个非常有用的工具&#xff0c;运用场景非常多&#xff0c;因为它使用起来非常简单&#xff0c;而且易于理解。但同时它也会带来一些困扰&#xff0c;那就是可能会引起死锁&#xff0c;一旦产生死锁&#xff0c;就会造成系统功能不可用。 比如我们现在有Th…

网络防火墙技术知多少?了解如何保护您的网络安全

在当前以网络为核心的世界中&#xff0c;网络安全成为了至关重要的议题。网络防火墙是一种常见的保护网络安全的技术&#xff0c;用于监控和控制网络流量&#xff0c;阻止未经授权的访问和恶意活动。今天德迅云安全就带您了解下防火墙的一些相关功能和类型。 防火墙的五个功能…

使用clickhouse-backup迁移数据

作者&#xff1a;俊达 1 说明 上一篇文章中&#xff0c;我们介绍了clickhouse-backup工具。除了备份恢复&#xff0c;我们也可以使用该工具来迁移数据。 这篇文章中&#xff0c;我们提供一个使用clickhouse-backup做集群迁移的方案。 2 前置条件 1、源端和目标端网络联通&a…

SRIO系列-仿真测试

一、前言 前两篇已经讲述了SRIO协议的概况&#xff0c;以及xilinx SRIO IP核的使用方式&#xff0c;已经在搭建工程的过程中时钟和复位的注意事项。 二、设计框图 整个框图也是按照之前的工程进行搭建&#xff0c;首先时SRIO_Channel&#xff0c;由SRIO IP核和时钟、复位模块…

使用yolov5训练自己的目标检测模型

使用yolov5训练自己的目标检测模型 使用yolov5训练自己的目标检测模型1. 项目的克隆2. 项目代码结构3. 环境的安装和依赖的安装4. 数据集和预训练权重的准备4.1利用labelimg标注数据和数据的准备4.1.1 **labelimg介绍:**4.1. 2 labelimg的安装 4.2 使用labelimg4.2.1 数据准备4…

[疑难杂症2024-003]如何判断一张没有头信息的dcm图像,是否是压缩图像?

本文由Markdown语法编辑器编辑完成&#xff0e; 1. 前言: DCM格式&#xff0c;是医学图像领域里面的通用格式&#xff0e;DCM图像一般分为两大部分&#xff0c;一部分是TAG信息&#xff0c;一部分是像素. 而TAG信息&#xff0c;一般又会分为两部分&#xff0c;如下图所示, 是…

编写Spark独立应用程序

执行本文之前&#xff0c;先搭建好spark的开发环境&#xff0c;我目前只搭建了standalone模式&#xff0c;参考链接 &#xff1a; Spark Standalone模式部署-CSDN博客 1. 安装sbt 1&#xff09;下载sbt 网址&#xff1a;https://www.scala-sbt.org/download.html &#xff0c…

Linux 系统下的进程间通信 IPC 入门 「下」

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IvPHnEsC6ZdIHaFL8Deazg 共享内存 我们在进程间传输比较大的数据块时&#xff0c;通常选用共享内存的方式。共享内存大小也是有限制的&#xff0…

Python进阶编程 --- 3.闭包、装饰器、设计模式、多线程、网络编程、正则表达式、递归

文章目录 第三章&#xff1a;3.1 闭包3.2 装饰器语法糖写法 3.3 设计模式3.3.1 单例模式3.3.2 工厂模式 3.4 多线程3.4.1 进程、线程和并行执行3.4.2 多线程编程 3.5 网络编程3.5.1 Socket3.5.2 服务端开发3.5.3 客户端开发 3.6 正则表达式3.6.1 基础匹配3.6.2 元字符匹配单字符…

风力发电自动化控制系统中的智能化技术应用研究

风力发电自动化控制系统中的智能化技术应用研究 随碳中和目标的提出和执行&#xff0c;风能发电作为新能源行业的核心部分&#xff0c;步入了它的黄金发展期。由于风能资源具有间歇性、随机性等特点&#xff0c;这给风电的高效利用带来了巨大挑战。为了增强风力发电系统的工作效…

Py深度学习基础|Numpy基础总结

注&#xff1a;本文来自菜鸟教程学习总结 一、数组属性 NumPy 的数组中比较重要 ndarray 对象属性有&#xff1a; 注意&#xff1a;使用reshape后&#xff0c;数组的结构&#xff08;即元素的排列顺序和内在连接&#xff09;没有改变&#xff0c;但因为返回的是一个视图&#…
最新文章