espressif/esp_board_manager

0.5.0

Latest
uploaded 4 hours ago
Board manager for ESP-GMF

readme (zh)

# ESP Board Manager

[English](README.md)

这是由 Espressif 开发的专注于开发板设备初始化的板级管理组件。使用 YAML 文件来描述主控制器和外部功能设备的配置,能够自动生成配置代码,简化了添加新板子的过程。提供了统一的设备管理接口,不仅提高了设备初始化代码的可重用性,还简化了应用程序对各种开发板的适配。

> **版本要求:** 兼容 ESP-IDF release/v5.4(>= v5.4.3) 和 release/v5.5(>= v5.5.2) 分支。

## 功能特性

* **YAML 配置**: 使用 YAML 文件对外设和设备进行配置
* **代码生成**: 从 YAML 配置自动生成 C 代码
* **灵活的板级管理**: 提供统一的初始化流程,并支持模块化板级定制
* **统一的 API 接口**: 在不同板子配置下使用一致的 API 访问外设和设备
* **自动依赖管理**: 根据外设和设备依赖关系自动更新 `idf_component.yml` 文件
* **可扩展架构**: 允许轻松集成新的外设和设备,包括对现有组件不同版本的支持
* **全面的错误管理**: 提供统一的错误代码和强大的错误处理,包含详细消息
* **低内存占用**: 在 RAM 中仅存储必要的运行时指针;配置数据保持为 flash 中的只读数据

## 项目结构

```
esp_board_manager/
├── src/             # 源文件
├── include/         # 公共头文件
├── private_inc/     # 私有头文件
├── peripherals/     # 外设实现(periph_gpio、periph_i2c 等)
├── devices/         # 设备实现(dev_audio_codec、dev_display_lcd 等)
├── boards/          # 板级特定配置(YAML 文件、Kconfig、setup_device.c)
├── generators/      # 代码生成系统
├── gen_codes/                  # 生成的文件(自动创建)
│   └── Kconfig.in              # 统一 Kconfig 菜单
├── CMakeLists.txt              # 组件构建配置
├── idf_component.yml           # 组件清单
├── gen_bmgr_config_codes.py    # 主代码生成脚本
├── idf_ext.py                  # IDF 动作扩展
├── README.md                   # 本文件
├── README_CN.md                # 中文版本
├── user project components/gen_bmgr_codes/ # 生成的板子配置文件(自动创建)
│   ├── gen_board_periph_config.c
│   ├── gen_board_periph_handles.c
│   ├── gen_board_device_config.c
│   ├── gen_board_device_handles.c
│   ├── gen_board_info.c
│   ├── CMakeLists.txt
│   └── idf_component.yml
```

## 快速开始

### 1. 添加并激活组件

#### 1.1 从组件仓库自动下载 ESP Board Manager 组件

- 直接使用 `idf.py add-dependency esp_board_manager` 将 **esp_board_manager** 添加为依赖组件

- 或是手动将以下内容添加到你的 `idf_component.yml` 文件:

```yaml
espressif/esp_board_manager:
  version: "*"
  require: public
```

运行 `idf.py set-target` 或 `idf.py menuconfig` 来自动将 **esp_board_manager** 组件下载到 `YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager`。

> **注意:** 请查看目录 `YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager` 确保组件已经被下载到本地后再进行下一步操作。

设置 `IDF_EXTRA_ACTIONS_PATH` 环境变量以包含 ESP Board Manager 目录:

**Ubuntu and Mac:**

```bash
export IDF_EXTRA_ACTIONS_PATH=YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager
```

**Windows PowerShell:**

```powershell
$env:IDF_EXTRA_ACTIONS_PATH = "YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager"
```

**Windows 命令提示符 (CMD):**

```cmd
set IDF_EXTRA_ACTIONS_PATH=YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager
```

#### 1.2 使用本地的 ESP Board Manager 组件

将以下内容添加到你的 idf_component.yml 文件:

```yaml
espressif/esp_board_manager:
  override_path: /PATH/TO/YOUR_PATH/esp_board_manager
  version: "*"
  require: public
```

设置 `IDF_EXTRA_ACTIONS_PATH` 环境变量以包含 ESP Board Manager 目录:

**Ubuntu and Mac:**

```bash
export IDF_EXTRA_ACTIONS_PATH=/PATH/TO/YOUR_PATH/esp_board_manager
```

**Windows PowerShell:**

```powershell
$env:IDF_EXTRA_ACTIONS_PATH = "/PATH/TO/YOUR_PATH/esp_board_manager"
```

**Windows 命令提示符 (CMD):**

```cmd
set IDF_EXTRA_ACTIONS_PATH=/PATH/TO/YOUR_PATH/esp_board_manager
```

> **注意:** IDF action 扩展自动发现功能从 ESP-IDF v6.0 开始可用。从 IDF v6.0 开始无需设置 `IDF_EXTRA_ACTIONS_PATH`,因为它会自动发现 IDF action 扩展。

### 2. 扫描并选择板子

ESP Board Manager 支持 IDF action 扩展,提供与 ESP-IDF 构建系统的无缝集成。此功能允许您直接使用 `idf.py gen-bmgr-config` 命令,而无需手动运行 Python 脚本。

您可以使用 `-l` 选项验证组件路径配置是否正确,并打印可用的板子:

```bash
# 列出所有可用板子
idf.py gen-bmgr-config -l
```

然后通过名称或索引选择您的目标板子:

```bash
idf.py gen-bmgr-config -b YOUR_TARGET_BOARD
```

例如:

```bash
idf.py gen-bmgr-config -b echoear_core_board_v1_2  # 板子名称
idf.py gen-bmgr-config -b 3                        # 板子索引
```

如果需要切换其他的板子,可以执行以下命令,

> **注意:** 对于从仓库下载组件的用户,请先确保组件没有被删除,如果 `YOUR_PROJECT_ROOT_PATH/managed_components/espressif__esp_board_manager` 目录不存在了,请先执行`idf.py set-target` 或 `idf.py menuconfig` 来重新下载组件。

```bash
idf.py gen-bmgr-config -x  # 清除当前板子配置
idf.py gen-bmgr-config -b OTHER_BOARD
```

> **注意:** 更多用法可以查看 [命令行选项](#命令行选项)

此时板子配置文件会自动生成到 `YOUR_PROJECT_ROOT_PATH/components/gen_bmgr_codes` 路径,执行到这一步,初始化开发板所需的文件就已经生成完毕,接下来可以在您的应用程序中进行测试。

**生成的配置文件:**

- `components/gen_bmgr_codes/gen_board_periph_config.c` - 外设配置
- `components/gen_bmgr_codes/gen_board_periph_handles.c` - 外设句柄
- `components/gen_bmgr_codes/gen_board_device_config.c` - 设备配置
- `components/gen_bmgr_codes/gen_board_device_handles.c` - 设备句柄
- `components/gen_bmgr_codes/gen_board_info.c` - 板子元数据
- `components/gen_bmgr_codes/CMakeLists.txt` - 构建系统配置
- `components/gen_bmgr_codes/idf_component.yml` - 组件依赖关系

> **注意:** 遇到问题可以查看 [故障排除](#故障排除) 部分

### 3. 在您的应用程序中使用

```c
#include <stdio.h>
#include "esp_log.h"
#include "esp_err.h"
#include "esp_board_manager_includes.h"

static const char *TAG = "MAIN";

void app_main(void)
{
    // 初始化板级管理器,这将自动初始化所有外设和设备
    ESP_LOGI(TAG, "Initializing board manager...");
    int ret = esp_board_manager_init();
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to initialize board manager");
        return;
    }
    // 获取设备句柄,根据 esp_board_manager/boards/YOUR_TARGET_BOARD/board_devices.yaml 中的设备命名获取句柄
    dev_display_lcd_spi_handles_t *lcd_handle;
    ret = esp_board_manager_get_device_handle("display_lcd", &lcd_handle);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get LCD device");
        return;
    }
    // 获取设备配置,根据 esp_board_manager/boards/YOUR_TARGET_BOARD/board_devices.yaml 中的设备命名获取设备配置
    dev_audio_codec_config_t *device_config;
    ret = esp_board_manager_get_device_config("audio_dac", &device_config);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get device config");
        return;
    }
    // 打印板子信息
    esp_board_manager_print_board_info();
    // 打印板级管理器状态
    esp_board_manager_print();
    // 使用句柄...
}
```

> **注意:** 在 [`example`](example) 路径下提供了使用 `esp_board_manager` 初始化设备并获取句柄进行使用的简单样例可供参考。

## 支持的组件

### 支持的板级

| 板子名称 | 芯片 | 音频 | SD卡 | LCD | LCD 触摸 | 摄像头 | 按键 |
|---|---|---|---|---|---|---|---|
| [`Echoear Core Board V1.0`](https://docs.espressif.com/projects/esp-dev-kits/zh_CN/latest/esp32s3/echoear/user_guide_v1.0.html) | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ CTS816S | - | - |
| [`Echoear Core Board V1.2`](https://docs.espressif.com/projects/esp-dev-kits/zh_CN/latest/esp32s3/echoear/user_guide_v1.2.html) | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ CTS816S | - | - |
| Dual Eyes Board V1.0 | ESP32-S3 | ✅ ES8311 | ❌ | ✅ GC9A01 (双) | - | - | - |
| [`ESP-BOX-3`](https://github.com/espressif/esp-box/blob/master/docs/hardware_overview/esp32_s3_box_3/hardware_overview_for_box_3_cn.md) | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ GT911 | - | - |
| [`ESP32-S3 Korvo2 V3`](https://docs.espressif.com/projects/esp-adf/zh_CN/latest/design-guide/dev-boards/user-guide-esp32-s3-korvo-2.html) | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ILI9341 | ✅ TT21100 | ✅ DVP Camera | ✅ ADC button |
| ESP32-S3 Korvo2L | ESP32-S3 | ✅ ES8311 | ✅ SDMMC | ❌ | ❌ | ❌ | ❌ |
| [`Lyrat Mini V1.1`](https://docs.espressif.com/projects/esp-adf/zh_CN/latest/design-guide/dev-boards/get-started-esp32-lyrat-mini.html) | ESP32 | ✅ ES8388 | ✅ SDMMC | - | - | - | ✅ ADC button |
| [`ESP32-C5 Spot`](https://oshwhub.com/esp-college/esp-spot) | ESP32-C5 | ✅ ES8311 (双) | - | - | - | - | - |
| [`ESP32-P4 Function-EV`](https://docs.espressif.com/projects/esp-dev-kits/zh_CN/latest/esp32p4/esp32-p4-function-ev-board/user_guide.html) | ESP32-P4 | ✅ ES8311 | ✅ SDMMC | ✅ EK79007 | ✅ GT911 | ✅ CSI Camera | - |
| [`M5STACK CORES3`](https://docs.m5stack.com/zh_CN/core/CoreS3) | ESP32-S3 | ✅ AW88298 + ES7210 | ✅ SDSPI | ✅ ILI9342C | ✅ FT5x06 | ❌ | - |

注:'✅' 表示已经支持,'❌' 表示尚未支持,'-' 表示硬件不具备相应的能力

### 支持的设备类型

| 设备名称 | 描述 | 类型 | 子类型 | 外设 | 参考 YAML | 示例 |
|---|---|---|---|---|---|---|
| `audio_dac`<br/>`audio_adc` | 音频编解码器 | audio_codec | - | i2s<br/>i2c | [`dev_audio_codec.yaml`](devices/dev_audio_codec/dev_audio_codec.yaml) | **[`test_dev_audio_codec.c`](test_apps/main/test_dev_audio_codec.c)** <br/>带有 DAC/ADC、SD 卡播放、录音和回环测试的音频编解码器 |
| `display_lcd` | SPI LCD 显示屏(将被弃用) | display_lcd_spi | - | spi | [`dev_display_lcd_spi.yaml`](devices/dev_display_lcd_spi/dev_display_lcd_spi.yaml) | **[`test_dev_lcd_init.c`](test_apps/main/test_dev_lcd_init.c)** <br/>LCD 显示初始化和基本控制 |
| `display_lcd` | LCD 显示设备 | display_lcd | spi<br/>dsi | spi<br/>dsi | [`dev_display_lcd.yaml`](devices/dev_display_lcd/dev_display_lcd.yaml) | **[`test_dev_lcd_lvgl.c`](test_apps/main/test_dev_lcd_lvgl.c)** <br/>带有 LVGL、触摸屏和背光控制的 LCD 显示屏 |
| `fs_sdcard` | SDMMC SD 卡(将被弃用) | fatfs_sdcard | - | sdmmc | [`dev_fatfs_sdcard.yaml`](devices/dev_fatfs_sdcard/dev_fatfs_sdcard.yaml) | **[`test_dev_fatfs_sdcard.c`](test_apps/main/test_dev_fatfs_sdcard.c)** <br/>SD 卡操作和 FATFS 文件系统测试 |
| `fs_sdcard` | SPI SD 卡(将被弃用) | fatfs_sdcard_spi | - | spi | [`dev_fatfs_sdcard_spi.yaml`](devices/dev_fatfs_sdcard_spi/dev_fatfs_sdcard_spi.yaml) | **[`test_dev_fatfs_sdcard.c`](test_apps/main/test_dev_fatfs_sdcard.c)** <br/>SD 卡操作和 FATFS 文件系统测试 |
| `fs_fat` | FAT 文件系统设备 | fs_fat | sdmmc<br/>spi | sdmmc<br/>spi | [`dev_fs_fat.yaml`](devices/dev_fs_fat/dev_fs_fat.yaml) | **[`test_dev_fatfs_sdcard.c`](test_apps/main/test_dev_fatfs_sdcard.c)** <br/>SD 卡操作和 FATFS 文件系统测试 |
| `fs_spiffs` | SPIFFS 文件系统设备 | fs_spiffs | - | - | [`dev_fs_spiffs.yaml`](devices/dev_fs_spiffs/dev_fs_spiffs.yaml) | **[`test_dev_fs_spiffs.c`](test_apps/main/test_dev_fs_spiffs.c)** <br/>SPIFFS 文件系统测试 |
| `lcd_touch` | 触摸屏 | lcd_touch_i2c | - | i2c | [`dev_lcd_touch_i2c.yaml`](devices/dev_lcd_touch_i2c/dev_lcd_touch_i2c.yaml) | **[`test_dev_lcd_lvgl.c`](test_apps/main/test_dev_lcd_lvgl.c)** <br/>带有 LVGL、触摸屏和背光控制的 LCD 显示屏 |
| `sdcard_power_ctrl` | 电源控制设备 | power_ctrl | gpio | gpio | [`dev_power_ctrl.yaml`](devices/dev_power_ctrl/dev_power_ctrl.yaml) | - |
| `lcd_brightness` | LEDC 控制设备 | ledc_ctrl | - | ledc | [`dev_ledc_ctrl.yaml`](devices/dev_ledc_ctrl/dev_ledc_ctrl.yaml) | **[`test_dev_ledc.c`](test_apps/main/test_dev_ledc.c)** <br/>用于 PWM 和背光控制的 LEDC 设备 |
| `gpio_expander` | GPIO 扩展芯片 | gpio_expander | - | i2c | [`dev_gpio_expander.yaml`](devices/dev_gpio_expander/dev_gpio_expander.yaml) | **[`test_dev_gpio_expander.c`](test_apps/main/test_dev_gpio_expander.c)**<br/>GPIO 扩展芯片测试 |
| `camera` | 摄像头 | camera | dvp<br/>csi | i2c | [`dev_camera.yaml`](devices/dev_camera/dev_camera.yaml) | **[`test_dev_camera.c`](test_apps/main/test_dev_camera.c)** <br/>测试 Camera sensor 的视频流捕获能力 |
| `button` | 按键 | button | gpio<br/>adc | gpio<br/>adc | [`dev_button.yaml`](devices/dev_button/dev_button.yaml) | **[`test_dev_button.c`](test_apps/main/test_dev_button.c)** <br/>按钮测试 |

> 对于同一种设备,我们将不再使用接口类型来区分类型。例如,`dev_fatfs_sdcard` 和 `dev_fatfs_sdcard_spi` 将统一使用 `fs_fat` 进行管理,`dev_display_lcd_spi` 也将改为使用 `dev_display_lcd` 进行管理。
> 这三种设备类型将在未来版本中被弃用。用户可以参照 [`dev_fatfs_sdcard.yaml`](./devices/dev_fatfs_sdcard/dev_fatfs_sdcard.yaml)、[`dev_fatfs_sdcard_spi.yaml`](./devices/dev_fatfs_sdcard_spi/dev_fatfs_sdcard_spi.yaml) 和 [`dev_display_lcd_spi.yaml`](./devices/dev_display_lcd_spi/dev_display_lcd_spi.yaml) 文件,了解如何将原有配置迁移到新的设备类型。

### 支持的外设类型

| 外设名称 | 描述 | 类型 | 角色 | 参考 YAML | 示例 |
|---|---|---|---|---|---|
| `i2c_master` | I2C 通信 | i2c | master<br/>slave | [`periph_i2c.yml`](peripherals/periph_i2c/periph_i2c.yml) | **[`test_periph_i2c.c`](test_apps/main/periph/test_periph_i2c.c)**<br/>用于设备通信的 I2C 外设 |
| `spi_master`<br/>`spi_display`<br/>... | SPI 通信 | spi | master<br/>slave | [`periph_spi.yml`](peripherals/periph_spi/periph_spi.yml) | - |
| `i2s_audio_out`<br/>`i2s_audio_in` | 音频接口 | i2s | master<br/>slave | [`periph_i2s.yml`](peripherals/periph_i2s/periph_i2s.yml) | - |
| `gpio_pa_control`<br/>`gpio_backlight_control`<br/>... | 通用 I/O | gpio | none | [`periph_gpio.yml`](peripherals/periph_gpio/periph_gpio.yml) | **[`test_periph_gpio.c`](test_apps/main/periph/test_periph_gpio.c)**<br/>用于数字 I/O 操作的 GPIO 外设 |
| `ledc_backlight` | LEDC 控制/PWM | ledc | none | [`periph_ledc.yml`](peripherals/periph_ledc/periph_ledc.yml) | - |
| `uart_1` | UART 通信 | uart | tx<br/>rx | [`periph_uart.yml`](peripherals/periph_uart/periph_uart.yml) | **[`test_periph_uart.c`](test_apps/main/periph/test_periph_uart.c)**<br/>用于串行端口操作的 UART 外设 |
| `adc_unit_1` | ADC 模数转换 | adc | oneshot<br/>continuous | [`periph_adc.yml`](peripherals/periph_adc/periph_adc.yml) | **[`test_periph_adc.c`](test_apps/main/periph/test_periph_adc.c)**<br/>用于测量特定模拟 IO 管脚模拟信号的 ADC 外设 |
| `rmt_tx`, `rmt_rx` | 红外遥控 | rmt | tx<br/>rx | [`periph_rmt.yml`](peripherals/periph_rmt/periph_rmt.yml) | **[`test_periph_rmt.c`](test_apps/main/periph/test_periph_rmt.c)**<br/>使用 RMT 外设控制 WS2812 LED 灯带 |
| `pcnt_unit` | 脉冲计数器 | pcnt | none | [`periph_pcnt.yml`](peripherals/periph_pcnt/periph_pcnt.yml) | **[`test_periph_pcnt.c`](test_apps/main/periph/test_periph_anacmpr.c)**<br/>使用 PCNT 外设解码差分信号 |
| `anacmpr_unit_0` | 模拟比较器 | anacmpr | none | [`periph_anacmpr.yml`](peripherals/periph_anacmpr/periph_anacmpr.yml) | **[`test_periph_anacmpr.c`](test_apps/main/periph/test_periph_anacmpr.c)**<br/>用于比较源信号与参考信号的模拟比较器外设 |
| `dac_channel_0` | 数模转换器 | dac | oneshot<br/>continuous<br/>cosine | [`periph_dac.yml`](peripherals/periph_dac/periph_dac.yml) | **[`test_periph_dac.c`](test_apps/main/periph/test_periph_dac.c)**<br/>用于将数字值转换成模拟电压的 DAC 外设 |
| `mcpwm_group_0` | PWM 生成器 | mcpwm | none | [`periph_mcpwm.yml`](peripherals/periph_mcpwm/periph_mcpwm.yml) | **[`test_periph_mcpwm.c`](test_apps/main/periph/test_periph_mcpwm.c)**<br/>多功能 PWM 生成器外设 |
| `sdm` | Sigma Delta 调制器 | sdm | none | [`periph_sdm.yml`](peripherals/periph_sdm/periph_sdm.yml) | **[`test_periph_sdm.c`](test_apps/main/periph/test_periph_sdm.c)**<br/>用于脉冲密度调制的 SDM 外设 |
| `ldo_mipi` | LDO 低压差线性稳压器 | ldo | none | [`periph_ldo.yml`](peripherals/periph_ldo/periph_ldo.yml) | - |
| `dsi_display` | MIPI-DSI | dsi | none | [`periph_dsi.yml`](peripherals/periph_dsi/periph_dsi.yml) | - |

> 对于常用的设备和外设名称,我们提供了相应的宏定义可以直接使用,请参考 [esp_board_manager_defs.h](include/esp_board_manager_defs.h)

## 命令行选项

**板子选择:**

```bash
-b, --board BOARD_NAME           # 直接指定板子名称(绕过 sdkconfig 读取)
-b, --board BOARD_INDEX          # 通过索引指定板子
-c, --customer-path PATH         # 客户板子目录路径(使用 "NONE" 跳过)
-l, --list-boards                # 列出所有可用板子并退出
```

**生成控制:**

```bash
--kconfig-only                   # 仅生成 Kconfig 菜单系统(跳过板子配置生成)
--peripherals-only               # 仅处理外设(跳过设备)
--devices-only                   # 仅处理设备(跳过外设)
```

**SDKconfig 配置:**

```bash
--sdkconfig-only                 # 仅检查 sdkconfig 功能而不启用它们
--disable-sdkconfig-auto-update  # 禁用自动 sdkconfig 功能启用(默认启用)
```

**日志控制:**

```bash
--log-level LEVEL                # 设置日志级别: DEBUG, INFO, WARNING, ERROR (默认: INFO)
```

### 方法1: 作为 IDF Action 扩展使用(推荐)

使用命令 `idf.py gen-bmgr-config` 后加命令行选项,例如下面的用法:

```bash
# 列出可用板子
idf.py gen-bmgr-config -l

# 指定板子(名称或索引)
idf.py gen-bmgr-config -b echoear_core_board_v1_0
idf.py gen-bmgr-config -b 1

# 使用自定义板子
idf.py gen-bmgr-config -b my_board -c /path/to/custom/boards

# 清理生成的文件
idf.py gen-bmgr-config -x

...
```

### 方法2: 使用独立脚本

您也可以在 esp_board_manager 目录中直接使用独立脚本,例如下面的用法

```bash
# 列出可用板子
python gen_bmgr_config_codes.py -l

# 使用 -b 选项指定板子(名称或索引)
python gen_bmgr_config_codes.py -b echoear_core_board_v1_0
python gen_bmgr_config_codes.py -b 1

# 使用自定义板子
python gen_bmgr_config_codes.py 1 -c /custom/boards
python gen_bmgr_config_codes.py -b my_board -c /path/to/custom/boards

# 清理生成的文件
python gen_bmgr_config_codes.py -x
```

直接使用独立脚本时还有部分额外的用法:

```bash
# 从 sdkconfig 读取板子选择(如果存在)
python gen_bmgr_config_codes.py

# 将板子作为直接参数指定(名称或索引)
# 直接参数(不使用 `-b`)仅在直接调用脚本时有效,由于 ESP-IDF 框架限制,`idf.py` 不支持。
python gen_bmgr_config_codes.py esp32_s3_korvo2_v3
python gen_bmgr_config_codes.py 1
```

## 脚本执行流程

ESP Board Manager 使用 `gen_bmgr_config_codes.py` 进行代码生成,它在统一的工作流程中处理 Kconfig 菜单生成和板子配置生成。执行全面的 8 步流程,将 YAML 配置转换为 C 代码和构建系统文件:

1. **板子目录扫描**: 在默认、客户和组件目录中发现板子
2. **板子选择**: 从 sdkconfig 或命令行参数读取板子选择
3. **Kconfig 生成**: 为板子和组件选择创建统一 Kconfig 菜单系统
4. **配置文件发现**: 定位所选板子的 `board_peripherals.yaml` 和 `board_devices.yaml`
5. **外设处理**: 解析外设配置并生成 C 结构
6. **设备处理**: 处理设备配置、依赖关系并更新构建文件
7. **项目 sdkconfig 配置**: 根据板子设备和外设类型更新项目 sdkconfig
8. **文件生成**: 在工程文件夹的 `components/gen_bmgr_codes/` 中创建所有必要的 C 配置和句柄文件

**⚠️ 重要提示:** 切换板子时,脚本会在第 1 步中自动备份并删除现有的 `sdkconfig` 文件以防止配置污染(`--kconfig-only` 时跳过)。

## 自定义板子

`esp_board_manager` 支持模块化定制自己的开发板,具体的使用方法请参考:[如何创建自定义板子](docs/how_to_customize_board_cn.md)

## 路线图

ESP Board Manager 的未来开发计划(优先级从高到低):

- **支持更多外设和设备**: 添加更多外设、设备和板子
- **Web 可视化配置**: 结合大模型通过网页实现可视化和智能化的配置板子
- **完善文档**: 增加更多说明文档,如建立明确的规则以促进客户添加外设和设备
- **增强验证**: 全面的 YAML 格式检查、模式验证、输入验证和增强的规则验证
- **增强数据结构**: 增强数据或 YAML 结构以提高性能
- **版本管理**: 支持设备和外设的不同版本代码和解析器
- **插件架构**: 用于自定义设备和外设支持的可扩展插件系统

## 故障排除

### 找不到 `esp_board_manager` 路径

1. 检查项目主 `idf_component.yml` 中的 `esp_board_manager` 依赖项
2. 添加 `esp_board_manager` 依赖项后,运行 `idf.py menuconfig` 或 `idf.py build`。这些命令会将 `esp_board_manager` 下载到 `YOUR_PROJECT_ROOT_PATH/managed_components/`

### `idf.py gen-bmgr-config` 命令未找到

如果 `idf.py gen-bmgr-config` 无法识别:

1. 检查 `IDF_EXTRA_ACTIONS_PATH` 是否正确设置
2. 重新启动您的终端会话

### `undefined reference for g_board_devices and g_board_peripherals`

1. 确保您的项目中没有 `idf_build_set_property(MINIMAL_BUILD ON)`,因为 MINIMAL_BUILD 仅通过包含所有其他组件所需的"通用"组件来执行最小构建。
2. 确保您的项目有 `components/gen_bmgr_codes` 文件夹,其中包含生成的文件。这些文件是通过运行 `idf.py gen-bmgr-config -b YOUR_BOARD` 生成的。

### 切换开发板

**重要提示**:切换板子时,脚本会自动:

1. 将 `sdkconfig` 备份到 `sdkconfig.bmgr_board.backup` 并删除原文件,以防止配置污染
2. 将板子特定配置从 `boards/<board_name>/sdkconfig.defaults.board` 追加到您项目的 `sdkconfig.defaults`

切换板子时请始终使用 `idf.py gen-bmgr-config -b`(或 `python gen_bmgr_config_codes.py`)。使用 `idf.py menuconfig` 可能导致依赖错误。

### 依赖某些组件的问题

如果在运行 `idf.py set-target xxx`、`idf.py menuconfig` 或 `idf.py reconfigure` 时遇到以下错误:

```bash
ERROR: Because project depends on xxxxx which
doesn't match any versions, version solving failed.
```

或类似的错误:

```bash
Failed to resolve component 'esp_board_manager' required by component
  'gen_bmgr_codes': unknown name.
```

这可能是 board manager 上次残留的生成文件未被清除导致的。**您可以使用 `idf.py gen-bmgr-config -x`(或 `python gen_bmgr_config_codes.py -x`)清理生成的文件**,这将删除所有生成的 .c 和 .h 文件并重置 CMakeLists.txt 和 idf_component.yml。

### Undefined reference to 'g_esp_board_devices'

出现 `undefined reference to 'g_esp_board_device_handles'` 或 `undefined reference to 'g_esp_board_devices'` 错误是因为没有运行 `idf.py gen-bmgr-config -b YOUR_BOARD`。

## 许可证

本项目采用修改版 MIT 许可证 - 详情请参阅 [LICENSE](./LICENSE) 文件。

Links

Supports all targets

License: Custom

To add this component to your project, run:

idf.py add-dependency "espressif/esp_board_manager^0.5.0"

download archive

Stats

  • Archive size
    Archive size ~ 2.90 MB
  • Downloaded in total
    Downloaded in total 1.8k times
  • Downloaded this version
    This version: 0 times

Badge

espressif/esp_board_manager version: 0.5.0
|