jason-mao/gmf_board_manager

0.3.0-beta3

Pre-release
uploaded 1 week ago
Board manager for ESP-GMF

readme (zh)

# GMF Board Manager

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

## 功能特性

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

## 项目结构

```
gmf_board_manager/
├── board_manager.h/c          # 主板级管理器 API
├── board_periph.h/c           # 外设管理
├── board_devices.h/c          # 设备管理
├── board_err.h/c              # 统一错误管理系统
├── board_names.h              # 关键字列表
├── peripherals/               # 外设实现
│   ├── periph_gpio.c/py/h     # GPIO 外设
│   ├── ...
├── devices/                   # 设备实现
│   ├── dev_audio_codec/       # 音频编解码器设备
│   ├── ...
├── boards/                    # 默认板级特定配置
│   ├── echoear_core_board_v1_0/
│   │   ├── board_peripherals.yaml
│   │   ├── board_devices.yaml
│   │   ├── board_info.yaml
│   │   └── Kconfig
│   └── ...
├── generators/                # 代码生成系统
├── gen_codes/                 # 生成的文件(自动创建)
│   └── Kconfig.in             # 统一 Kconfig 菜单
├── 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
├── gen_config_codes.py        # 主代码生成脚本
├── gen_kconfig.py             # Kconfig 生成脚本
├── gmf_board_manager_ext.py   # IDF action 扩展
├── README.md                  # 此文件
└── README_CN.md               # 中文版本说明
```

## 快速开始

### 1. 设置 IDF Action 扩展

GMF Board Manager 现在支持 IDF action 扩展,提供与 ESP-IDF 构建系统的无缝集成。设置 `IDF_EXTRA_ACTIONS_PATH` 环境变量以包含 GMF Board Manager 目录:

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

如果您将此组件添加到项目的 yml 依赖项中,可以使用以下路径:

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

如果遇到任何问题,请参考 ## 故障排除 部分。

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

您可以使用 `-l` 选项发现可用的板级:

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

# 或使用独立脚本
python YOUR_BOARD_MANAGER_PATH/gen_config_codes.py -l
```

然后选择您的目标板级:
```bash
idf.py gmf-gen-config -b YOUR_TARGET_BOARD
```

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

```c
#include <stdio.h>
#include "esp_log.h"
#include "esp_err.h"
#include "board_manager.h"
#include "board_periph.h"
#include "board_devices.h"
#include "dev_audio_codec.h"
#include "dev_display_lcd_spi.h"

static const char *TAG = "MAIN";

void app_main(void)
{
    // 初始化板级管理器
    ESP_LOGI(TAG, "Initializing board manager...");
    int ret = board_manager_init();
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to initialize board manager");
        return;
    }

    // 获取外设句柄
    void *spi_handle;
    ret = board_manager_get_periph_handle("spi-1", &spi_handle);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPI peripheral");
        return;
    }

    // 获取设备句柄
    dev_display_lcd_spi_handles_t *lcd_handle;
    ret = board_manager_get_device_handle("lcd_display", &lcd_handle);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get LCD device");
        return;
    }

    // 获取设备配置
    audio_codec_config_t *device_config;
    ret = board_manager_get_device_config("audio_dac", &device_config);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get device config");
        return;
    }

    // 打印板级信息
    board_manager_print_board_info();

    // 打印板级管理器状态
    board_manager_print();

    // 使用句柄...
}
```

### 4. 更多示例

有关综合使用示例,请参考 `test_apps/main/` 目录中的测试应用程序:

#### 设备示例
- **[`test_dev_audio_codec.c`](test_apps/main/test_dev_audio_codec.c)** - 带有 DAC/ADC、SD 卡播放、录音和回环测试的音频编解码器
- **[`test_dev_lcd_init.c`](test_apps/main/test_dev_lcd_init.c)** - LCD 显示初始化和基本控制
- **[`test_dev_lcd_lvgl.c`](test_apps/main/test_dev_lcd_lvgl.c)** - 带有 LVGL、触摸屏和背光控制的 LCD 显示屏
- **[`test_dev_pwr_ctrl.c`](test_apps/main/test_dev_pwr_ctrl.c)** - 基于 GPIO 的 LCD 和音频设备电源管理
- **[`test_dev_fatfs_sdcard.c`](test_apps/main/test_dev_fatfs_sdcard.c)** - SD 卡操作和 FATFS 文件系统测试
- **[`test_dev_fs_spiffs.c`](test_apps/main/test_dev_fs_spiffs.c)** - SPIFFS 文件系统测试

#### 外设示例
- **[`test_periph_ledc.c`](test_apps/main/test_periph_ledc.c)** - 用于 PWM 和背光控制的 LEDC 外设
- **[`test_periph_i2c.c`](test_apps/main/test_periph_i2c.c)** - 用于设备通信的 I2C 外设
- **[`test_periph_gpio.c`](test_apps/main/test_periph_gpio.c)** - 用于数字 I/O 操作的 GPIO 外设

#### 用户接口

Board Manager 的设备名称推荐用于用户项目,而外设名称不推荐。这是因为设备名称是功能命名的,不包含额外信息,使其更容易适配多个板级。Board Manager 提供的设备名称是**保留关键字**,请参阅 [board_names.h](./board_names.h)。以下设备名称可用于用户应用程序:

| 设备名称 | 描述 |
|-------------|-------------|
| `audio_dac`, `audio_adc` | 音频编解码器设备 |
| `display_lcd` | LCD 显示设备 |
| `fs_sdcard` | SD 卡设备 |
| `fs_spiffs` | SPIFFS 文件系统设备 |
| `lcd_touch` | 触摸屏设备 |
| `lcd_power` | LCD 电源控制 |
| `lcd_brightness` | LCD 亮度控制 |

## YAML 配置规则
有关详细的 YAML 配置规则和格式规范,请参阅 [设备和外设规则](docs/device_and_peripheral_rules.md)。

## 自定义板级

### 创建新板级

#### 创建板级文件夹和文件

1. **创建板级目录**
   ```bash
   mkdir boards/<board_name>
   cd boards/<board_name>
   ```

2. **创建必需文件**
   ```bash
   touch board_peripherals.yaml
   touch board_devices.yaml
   touch board_info.yaml
   touch Kconfig
   ```

3. **配置 Kconfig**
   ```kconfig
   config BOARD_<BOARD_NAME>
       bool "<Board Display Name>"
       depends on SOC_<CHIP_TYPE>  # optional
   ```

4. **添加板级信息**
   ```yaml
   # board_info.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>
   description: "<board description>"
   manufacturer: "<manufacturer_name>"
   ```

5. **定义外设**
   ```yaml
   # board_peripherals.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>

   peripherals:
     - name: <peripheral_name>
       type: <peripheral_type>
       role: <peripheral_role>
       config:
         # 外设特定配置
   ```

6. **定义设备**
   ```yaml
   # board_devices.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>

   devices:
     - name: <device_name>
       type: <device_type>
       config:
         # 设备特定配置
       peripherals:
         - name: <peripheral_name>
    ```

### 板级路径

GMF Board Manager 支持通过三个不同的路径位置进行板级配置,为不同的部署场景提供灵活性:

1. **主板级目录**: 随包提供的内置板级,路径如 `gmf_board_manager/boards`
2. **用户项目组件**: 在项目组件中定义的自定义板级,路径如 `{PROJECT_ROOT}/components/{component_name}/boards`
3. **自定义客户路径**: 自定义位置的外部板级定义。用户通过 `gen_config_codes.py` 中的 `-c` 参数指定路径,使用命令行如 `idf.py -DBOARD_CUSTOMER_PATH=./path/to/boards menuconfig` 来设置自定义路径。

### 验证和使用新板级

1. **验证板级配置**
   ```bash
   # 测试您的板级配置是否有效
   # 对于主板级和用户项目组件(默认路径)
   idf.py gmf-gen-config -b <board_name>

   # 对于自定义客户路径(外部位置)
   idf.py gmf-gen-config -b <board_name> -c /path/to/custom/boards

   # 或使用独立脚本
   cd  YOUR_GMF_BOARD_MANAGER_PATH
   python gen_config_codes.py -b <board_name>
   python gen_config_codes.py -b <board_name> -c /path/to/custom/boards
   ```

   **检查成功**: 如果板级配置有效,将在工程路径中生成以下文件:
   - `components/gen_bmgr_codes/gen_board_periph_handles.c` - 外设句柄定义
   - `components/gen_bmgr_codes/gen_board_periph_config.c` - 外设配置结构
   - `components/gen_bmgr_codes/gen_board_device_handles.c` - 设备句柄定义
   - `components/gen_bmgr_codes/gen_board_device_config.c` - 设备配置结构
   - `components/gen_bmgr_codes/gen_board_info.c` - 板级元数据
   - `components/gen_bmgr_codes/CMakeLists.txt` - 构建系统配置
   - `components/gen_bmgr_codes/idf_component.yml` - 组件依赖关系

   **如果出现错误**: 检查您的 YAML 文件是否有语法错误、缺失字段或无效配置。

   **注意**: 当您首次运行 `idf.py gmf-gen-config` 时,脚本将自动生成 Kconfig 菜单系统。

## 支持的组件

### 支持的外设类型

| 外设 | 类型 | 角色 | 状态 | 描述 |
|------------|------|------|--------|-------------|
| GPIO | gpio | output/input | ✅ 支持 | 通用 I/O |
| I2C | i2c | master/slave | ✅ 支持 | I2C 通信 |
| SPI | spi | master/slave | ✅ 支持 | SPI 通信 |
| I2S | i2s | master/slave | ✅ 支持 | 音频接口 |
| LEDC | ledc | pwm | ✅ 支持 | LED 控制/PWM |

### 支持的设备类型

| 设备 | 类型 | 芯片 | 外设 | 状态 | 描述 | 测试功能 |
|--------|------|------|------------|--------|-------------|----------------|
| 音频编解码器 | audio_codec | ES8311 | i2s/i2c | ✅ 支持 | 带有 DAC/ADC 的音频编解码器 | 音频播放、录音、回环 |
| 音频编解码器 | audio_codec | ES7210 | i2s/i2c | ✅ 支持 | 音频 ADC 编解码器 | 音频录音、麦克风测试 |
| 音频编解码器 | audio_codec | ES8388 | i2s/i2c | ✅ 支持 | 带有 DAC 的音频编解码器 | 音频播放、扬声器测试 |
| LCD 显示屏 | display_lcd_spi | ST77916 | spi | ✅ 支持 | SPI LCD 显示屏 | 显示测试、屏幕对齐 |
| LCD 显示屏 | display_lcd_spi | GC9A01 | spi | ✅ 支持 | 圆形 LCD 显示屏 | 双显示测试 |
| 触摸屏 | lcd_touch_i2c | FT5x06 | i2c | ✅ 支持 | I2C 触摸屏 | 触摸测试、按钮测试 |
| SD 卡 | fatfs_sdcard | - | sdmmc | ✅ 支持 | SD 卡存储 | SD 卡测试、IMU 测试 |
| SPIFFS 文件系统 | fs_spiffs | - | - | ✅ 支持 | SPIFFS 文件系统 | 文件系统测试 |
| GPIO 控制 | gpio_ctrl | - | gpio | ✅ 支持 | GPIO 控制设备 | 电源控制测试 |
| LEDC 控制 | ledc_ctrl | - | ledc | ✅ 支持 | LEDC 控制设备 | PWM 控制测试 |
| IMU | imu | BMI270 | i2c | ❌ | 惯性测量单元 | IMU 测试、传感器测试 |

### 支持的板级

| 板级名称 | 芯片 | 音频 | SD卡 | LCD | LCD 触摸 |
|------------|------|-------|--------|-----|-----------|
| Echoear Core Board V1.0 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ FT5x06 |
| Dual Eyes Board V1.0 | ESP32-S3 | ✅ ES8311 | ❌ | ✅ GC9A01 (双) | ❌ |
| ESP-BOX-3 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ FT5x06 |
| ESP32-S3 Korvo2 V3 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ❌ | ❌ |
| ESP32-S3 Korvo2L | ESP32-S3 | ✅ ES8311 | ✅ SDMMC | ❌ | ❌ |
| Lyrat Mini V1.1 | ESP32-S3 | ✅ ES8388 | ✅ SDMMC | ❌ | ❌ |
| ESP32-C5 Spot | ESP32-C5 | ✅ ES8311 (双) | ❌ | ❌ | ❌ |

## 板级管理器设置

### 自动 SDK 配置更新

控制板级管理器是否根据检测到的设备和外设类型自动更新 sdkconfig。

**默认**: 启用 (`y`)

**通过 sdkconfig 禁用**:
```bash
# 使用 menuconfig
idf.py menuconfig
# 导航到: Component config → GMF Board Manager Configuration → Board Manager Setting

# 在 sdkconfig 中设置
CONFIG_GMF_BOARD_MANAGER_AUTO_CONFIG_DEVICE_AND_PERIPHERAL=n
```
如果您想启用超出 YAML 中定义的设备或外设类型,请禁用此选项。

## 脚本执行流程

GMF Board Manager 使用 `gen_config_codes.py` 进行代码生成,它在统一的工作流程中处理 Kconfig 菜单生成和板级配置生成。

### `gen_config_codes.py` - 配置生成器

执行全面的 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 配置和句柄文件

#### 命令行选项

**板级选择:**
```bash
-b, --board BOARD_NAME           # 直接指定板级名称(绕过 sdkconfig 读取)
-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)
```

#### 使用示例


### 设置 IDF Action 扩展(推荐)

GMF Board Manager 现在支持 IDF action 扩展,提供与 ESP-IDF 构建系统的无缝集成:

#### 安装

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

```bash
export IDF_EXTRA_ACTIONS_PATH="/PATH/TO/YOUR_PATH/gmf_board_manager"
```

#### 使用

```bash
# 基本使用
idf.py gmf-gen-config -b echoear_core_board_v1_0

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

# 仅生成 Kconfig
idf.py gmf-gen-config --kconfig-only

# 仅处理外设
idf.py gmf-gen-config -b echoear_core_board_v1_0 --peripherals-only

# 列出可用板级
idf.py gmf-gen-config -l

# 设置日志级别为 DEBUG 以获取详细输出
idf.py gmf-gen-config --log-level DEBUG
```

### 方法 2: 独立脚本

您也可以在 gmf_board_manager 目录中直接使用独立脚本。

**以下描述了 `gen_config_codes.py` 支持的所有参数,这些参数也适用于 `idf.py gmf-gen-config`:**

**基本使用:**
```bash
# 使用 sdkconfig 和默认板级
python gen_config_codes.py

# 直接指定板级
python gen_config_codes.py -b echoear_core_board_v1_0

# 添加客户板级目录
python gen_config_codes.py -c /path/to/custom/boards

# 板级和自定义路径
python gen_config_codes.py -b my_board -c /path/to/custom/boards

# 列出可用板级
python gen_config_codes.py -l

# 禁用自动 sdkconfig 更新
python gen_config_codes.py --disable-sdkconfig-auto-update

# 设置日志级别为 DEBUG 以获取详细输出
python gen_config_codes.py --log-level DEBUG
```

**部分生成:**
```bash
# 仅处理外设
python gen_config_codes.py --peripherals-only

# 仅处理设备
python gen_config_codes.py --devices-only

# 检查 sdkconfig 功能而不启用
python gen_config_codes.py --sdkconfig-only
```

#### 生成的文件

**配置文件:**
- `gen_codes/Kconfig.in` - 板级选择的统一 Kconfig 菜单
- `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` - 组件依赖关系

**注意:** 生成的文件按以下方式组织:
- Kconfig 文件放在 `gen_codes/` 目录中
- 板级配置文件放在工程目录的 `components/gen_bmgr_codes/` 中以与 ESP-IDF 构建系统集成
- 如果这些目录不存在,生成脚本会自动创建,不应手动修改

## 路线图

GMF Board Manager 的未来开发计划:
- **构建工作流程**: 提高效率并简化构建工作流程
- **版本管理**: 支持设备和外设的不同版本代码和解析器
- **插件架构**: 用于自定义设备和外设支持的可扩展插件系统
- **增强验证**: 全面的 YAML 格式检查、模式验证、输入验证和增强的规则验证,具有改进的错误报告
- **增强初始化流程**: 支持跳过特定组件或在不同核心上调用初始化
- **明确定义规则**: 建立明确的规则以促进客户添加外设和设备
- **扩展组件支持**: 添加更多外设、设备和板级

## 故障排除

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

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

如果 `idf.py gmf-gen-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 gmf-gen-config -b YOUR_BOARD` 生成的。

### **切换开发板**
强烈建议使用 `idf.py gmf-gen-config -b`。使用 `idf.py menuconfig` 选择板级可能会导致依赖错误。

## 许可证

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

readme_zh (zh)

# GMF Board Manager

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

## 功能特性

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

## 项目结构

```
gmf_board_manager/
├── board_manager.h/c          # 主板级管理器 API
├── board_periph.h/c           # 外设管理
├── board_devices.h/c          # 设备管理
├── board_err.h/c              # 统一错误管理系统
├── board_names.h              # 关键字列表
├── peripherals/               # 外设实现
│   ├── periph_gpio.c/py/h     # GPIO 外设
│   ├── ...
├── devices/                   # 设备实现
│   ├── dev_audio_codec/       # 音频编解码器设备
│   ├── ...
├── boards/                    # 默认板级特定配置
│   ├── echoear_core_board_v1_0/
│   │   ├── board_peripherals.yaml
│   │   ├── board_devices.yaml
│   │   ├── board_info.yaml
│   │   └── Kconfig
│   └── ...
├── generators/                # 代码生成系统
├── gen_codes/                 # 生成的文件(自动创建)
│   └── Kconfig.in             # 统一 Kconfig 菜单
├── 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
├── gen_config_codes.py        # 主代码生成脚本
├── gen_kconfig.py             # Kconfig 生成脚本
├── gmf_board_manager_ext.py   # IDF action 扩展
├── README.md                  # 此文件
└── README_CN.md               # 中文版本说明
```

## 快速开始

### 1. 设置 IDF Action 扩展

GMF Board Manager 现在支持 IDF action 扩展,提供与 ESP-IDF 构建系统的无缝集成。设置 `IDF_EXTRA_ACTIONS_PATH` 环境变量以包含 GMF Board Manager 目录:

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

如果您将此组件添加到项目的 yml 依赖项中,可以使用以下路径:

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

如果遇到任何问题,请参考 ## 故障排除 部分。

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

您可以使用 `-l` 选项发现可用的板级:

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

# 或使用独立脚本
python YOUR_BOARD_MANAGER_PATH/gen_config_codes.py -l
```

然后选择您的目标板级:
```bash
idf.py gmf-gen-config -b YOUR_TARGET_BOARD
```

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

```c
#include <stdio.h>
#include "esp_log.h"
#include "esp_err.h"
#include "board_manager.h"
#include "board_periph.h"
#include "board_devices.h"
#include "dev_audio_codec.h"
#include "dev_display_lcd_spi.h"

static const char *TAG = "MAIN";

void app_main(void)
{
    // 初始化板级管理器
    ESP_LOGI(TAG, "Initializing board manager...");
    int ret = board_manager_init();
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to initialize board manager");
        return;
    }

    // 获取外设句柄
    void *spi_handle;
    ret = board_manager_get_periph_handle("spi-1", &spi_handle);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPI peripheral");
        return;
    }

    // 获取设备句柄
    dev_display_lcd_spi_handles_t *lcd_handle;
    ret = board_manager_get_device_handle("lcd_display", &lcd_handle);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get LCD device");
        return;
    }

    // 获取设备配置
    audio_codec_config_t *device_config;
    ret = board_manager_get_device_config("audio_dac", &device_config);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get device config");
        return;
    }

    // 打印板级信息
    board_manager_print_board_info();

    // 打印板级管理器状态
    board_manager_print();

    // 使用句柄...
}
```

### 4. 更多示例

有关综合使用示例,请参考 `test_apps/main/` 目录中的测试应用程序:

#### 设备示例
- **[`test_dev_audio_codec.c`](test_apps/main/test_dev_audio_codec.c)** - 带有 DAC/ADC、SD 卡播放、录音和回环测试的音频编解码器
- **[`test_dev_lcd_init.c`](test_apps/main/test_dev_lcd_init.c)** - LCD 显示初始化和基本控制
- **[`test_dev_lcd_lvgl.c`](test_apps/main/test_dev_lcd_lvgl.c)** - 带有 LVGL、触摸屏和背光控制的 LCD 显示屏
- **[`test_dev_pwr_ctrl.c`](test_apps/main/test_dev_pwr_ctrl.c)** - 基于 GPIO 的 LCD 和音频设备电源管理
- **[`test_dev_fatfs_sdcard.c`](test_apps/main/test_dev_fatfs_sdcard.c)** - SD 卡操作和 FATFS 文件系统测试
- **[`test_dev_fs_spiffs.c`](test_apps/main/test_dev_fs_spiffs.c)** - SPIFFS 文件系统测试

#### 外设示例
- **[`test_periph_ledc.c`](test_apps/main/test_periph_ledc.c)** - 用于 PWM 和背光控制的 LEDC 外设
- **[`test_periph_i2c.c`](test_apps/main/test_periph_i2c.c)** - 用于设备通信的 I2C 外设
- **[`test_periph_gpio.c`](test_apps/main/test_periph_gpio.c)** - 用于数字 I/O 操作的 GPIO 外设

#### 用户接口

Board Manager 的设备名称推荐用于用户项目,而外设名称不推荐。这是因为设备名称是功能命名的,不包含额外信息,使其更容易适配多个板级。Board Manager 提供的设备名称是**保留关键字**,请参阅 [board_names.h](./board_names.h)。以下设备名称可用于用户应用程序:

| 设备名称 | 描述 |
|-------------|-------------|
| `audio_dac`, `audio_adc` | 音频编解码器设备 |
| `display_lcd` | LCD 显示设备 |
| `fs_sdcard` | SD 卡设备 |
| `fs_spiffs` | SPIFFS 文件系统设备 |
| `lcd_touch` | 触摸屏设备 |
| `lcd_power` | LCD 电源控制 |
| `lcd_brightness` | LCD 亮度控制 |

## YAML 配置规则
有关详细的 YAML 配置规则和格式规范,请参阅 [设备和外设规则](docs/device_and_peripheral_rules.md)。

## 自定义板级

### 创建新板级

#### 创建板级文件夹和文件

1. **创建板级目录**
   ```bash
   mkdir boards/<board_name>
   cd boards/<board_name>
   ```

2. **创建必需文件**
   ```bash
   touch board_peripherals.yaml
   touch board_devices.yaml
   touch board_info.yaml
   touch Kconfig
   ```

3. **配置 Kconfig**
   ```kconfig
   config BOARD_<BOARD_NAME>
       bool "<Board Display Name>"
       depends on SOC_<CHIP_TYPE>  # optional
   ```

4. **添加板级信息**
   ```yaml
   # board_info.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>
   description: "<board description>"
   manufacturer: "<manufacturer_name>"
   ```

5. **定义外设**
   ```yaml
   # board_peripherals.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>

   peripherals:
     - name: <peripheral_name>
       type: <peripheral_type>
       role: <peripheral_role>
       config:
         # 外设特定配置
   ```

6. **定义设备**
   ```yaml
   # board_devices.yaml
   board: <board_name>
   chip: <chip_type>
   version: <version>

   devices:
     - name: <device_name>
       type: <device_type>
       config:
         # 设备特定配置
       peripherals:
         - name: <peripheral_name>
    ```

### 板级路径

GMF Board Manager 支持通过三个不同的路径位置进行板级配置,为不同的部署场景提供灵活性:

1. **主板级目录**: 随包提供的内置板级,路径如 `gmf_board_manager/boards`
2. **用户项目组件**: 在项目组件中定义的自定义板级,路径如 `{PROJECT_ROOT}/components/{component_name}/boards`
3. **自定义客户路径**: 自定义位置的外部板级定义。用户通过 `gen_config_codes.py` 中的 `-c` 参数指定路径,使用命令行如 `idf.py -DBOARD_CUSTOMER_PATH=./path/to/boards menuconfig` 来设置自定义路径。

### 验证和使用新板级

1. **验证板级配置**
   ```bash
   # 测试您的板级配置是否有效
   # 对于主板级和用户项目组件(默认路径)
   idf.py gmf-gen-config -b <board_name>

   # 对于自定义客户路径(外部位置)
   idf.py gmf-gen-config -b <board_name> -c /path/to/custom/boards

   # 或使用独立脚本
   cd  YOUR_GMF_BOARD_MANAGER_PATH
   python gen_config_codes.py -b <board_name>
   python gen_config_codes.py -b <board_name> -c /path/to/custom/boards
   ```

   **检查成功**: 如果板级配置有效,将在工程路径中生成以下文件:
   - `components/gen_bmgr_codes/gen_board_periph_handles.c` - 外设句柄定义
   - `components/gen_bmgr_codes/gen_board_periph_config.c` - 外设配置结构
   - `components/gen_bmgr_codes/gen_board_device_handles.c` - 设备句柄定义
   - `components/gen_bmgr_codes/gen_board_device_config.c` - 设备配置结构
   - `components/gen_bmgr_codes/gen_board_info.c` - 板级元数据
   - `components/gen_bmgr_codes/CMakeLists.txt` - 构建系统配置
   - `components/gen_bmgr_codes/idf_component.yml` - 组件依赖关系

   **如果出现错误**: 检查您的 YAML 文件是否有语法错误、缺失字段或无效配置。

   **注意**: 当您首次运行 `idf.py gmf-gen-config` 时,脚本将自动生成 Kconfig 菜单系统。

## 支持的组件

### 支持的外设类型

| 外设 | 类型 | 角色 | 状态 | 描述 |
|------------|------|------|--------|-------------|
| GPIO | gpio | output/input | ✅ 支持 | 通用 I/O |
| I2C | i2c | master/slave | ✅ 支持 | I2C 通信 |
| SPI | spi | master/slave | ✅ 支持 | SPI 通信 |
| I2S | i2s | master/slave | ✅ 支持 | 音频接口 |
| LEDC | ledc | pwm | ✅ 支持 | LED 控制/PWM |

### 支持的设备类型

| 设备 | 类型 | 芯片 | 外设 | 状态 | 描述 | 测试功能 |
|--------|------|------|------------|--------|-------------|----------------|
| 音频编解码器 | audio_codec | ES8311 | i2s/i2c | ✅ 支持 | 带有 DAC/ADC 的音频编解码器 | 音频播放、录音、回环 |
| 音频编解码器 | audio_codec | ES7210 | i2s/i2c | ✅ 支持 | 音频 ADC 编解码器 | 音频录音、麦克风测试 |
| 音频编解码器 | audio_codec | ES8388 | i2s/i2c | ✅ 支持 | 带有 DAC 的音频编解码器 | 音频播放、扬声器测试 |
| LCD 显示屏 | display_lcd_spi | ST77916 | spi | ✅ 支持 | SPI LCD 显示屏 | 显示测试、屏幕对齐 |
| LCD 显示屏 | display_lcd_spi | GC9A01 | spi | ✅ 支持 | 圆形 LCD 显示屏 | 双显示测试 |
| 触摸屏 | lcd_touch_i2c | FT5x06 | i2c | ✅ 支持 | I2C 触摸屏 | 触摸测试、按钮测试 |
| SD 卡 | fatfs_sdcard | - | sdmmc | ✅ 支持 | SD 卡存储 | SD 卡测试、IMU 测试 |
| SPIFFS 文件系统 | fs_spiffs | - | - | ✅ 支持 | SPIFFS 文件系统 | 文件系统测试 |
| GPIO 控制 | gpio_ctrl | - | gpio | ✅ 支持 | GPIO 控制设备 | 电源控制测试 |
| LEDC 控制 | ledc_ctrl | - | ledc | ✅ 支持 | LEDC 控制设备 | PWM 控制测试 |
| IMU | imu | BMI270 | i2c | ❌ | 惯性测量单元 | IMU 测试、传感器测试 |

### 支持的板级

| 板级名称 | 芯片 | 音频 | SD卡 | LCD | LCD 触摸 |
|------------|------|-------|--------|-----|-----------|
| Echoear Core Board V1.0 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ FT5x06 |
| Dual Eyes Board V1.0 | ESP32-S3 | ✅ ES8311 | ❌ | ✅ GC9A01 (双) | ❌ |
| ESP-BOX-3 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ✅ ST77916 | ✅ FT5x06 |
| ESP32-S3 Korvo2 V3 | ESP32-S3 | ✅ ES8311 + ES7210 | ✅ SDMMC | ❌ | ❌ |
| ESP32-S3 Korvo2L | ESP32-S3 | ✅ ES8311 | ✅ SDMMC | ❌ | ❌ |
| Lyrat Mini V1.1 | ESP32-S3 | ✅ ES8388 | ✅ SDMMC | ❌ | ❌ |
| ESP32-C5 Spot | ESP32-C5 | ✅ ES8311 (双) | ❌ | ❌ | ❌ |

## 板级管理器设置

### 自动 SDK 配置更新

控制板级管理器是否根据检测到的设备和外设类型自动更新 sdkconfig。

**默认**: 启用 (`y`)

**通过 sdkconfig 禁用**:
```bash
# 使用 menuconfig
idf.py menuconfig
# 导航到: Component config → GMF Board Manager Configuration → Board Manager Setting

# 在 sdkconfig 中设置
CONFIG_GMF_BOARD_MANAGER_AUTO_CONFIG_DEVICE_AND_PERIPHERAL=n
```
如果您想启用超出 YAML 中定义的设备或外设类型,请禁用此选项。

## 脚本执行流程

GMF Board Manager 使用 `gen_config_codes.py` 进行代码生成,它在统一的工作流程中处理 Kconfig 菜单生成和板级配置生成。

### `gen_config_codes.py` - 配置生成器

执行全面的 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 配置和句柄文件

#### 命令行选项

**板级选择:**
```bash
-b, --board BOARD_NAME           # 直接指定板级名称(绕过 sdkconfig 读取)
-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)
```

#### 使用示例


### 设置 IDF Action 扩展(推荐)

GMF Board Manager 现在支持 IDF action 扩展,提供与 ESP-IDF 构建系统的无缝集成:

#### 安装

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

```bash
export IDF_EXTRA_ACTIONS_PATH="/PATH/TO/YOUR_PATH/gmf_board_manager"
```

#### 使用

```bash
# 基本使用
idf.py gmf-gen-config -b echoear_core_board_v1_0

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

# 仅生成 Kconfig
idf.py gmf-gen-config --kconfig-only

# 仅处理外设
idf.py gmf-gen-config -b echoear_core_board_v1_0 --peripherals-only

# 列出可用板级
idf.py gmf-gen-config -l

# 设置日志级别为 DEBUG 以获取详细输出
idf.py gmf-gen-config --log-level DEBUG
```

### 方法 2: 独立脚本

您也可以在 gmf_board_manager 目录中直接使用独立脚本。

**以下描述了 `gen_config_codes.py` 支持的所有参数,这些参数也适用于 `idf.py gmf-gen-config`:**

**基本使用:**
```bash
# 使用 sdkconfig 和默认板级
python gen_config_codes.py

# 直接指定板级
python gen_config_codes.py -b echoear_core_board_v1_0

# 添加客户板级目录
python gen_config_codes.py -c /path/to/custom/boards

# 板级和自定义路径
python gen_config_codes.py -b my_board -c /path/to/custom/boards

# 列出可用板级
python gen_config_codes.py -l

# 禁用自动 sdkconfig 更新
python gen_config_codes.py --disable-sdkconfig-auto-update

# 设置日志级别为 DEBUG 以获取详细输出
python gen_config_codes.py --log-level DEBUG
```

**部分生成:**
```bash
# 仅处理外设
python gen_config_codes.py --peripherals-only

# 仅处理设备
python gen_config_codes.py --devices-only

# 检查 sdkconfig 功能而不启用
python gen_config_codes.py --sdkconfig-only
```

#### 生成的文件

**配置文件:**
- `gen_codes/Kconfig.in` - 板级选择的统一 Kconfig 菜单
- `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` - 组件依赖关系

**注意:** 生成的文件按以下方式组织:
- Kconfig 文件放在 `gen_codes/` 目录中
- 板级配置文件放在工程目录的 `components/gen_bmgr_codes/` 中以与 ESP-IDF 构建系统集成
- 如果这些目录不存在,生成脚本会自动创建,不应手动修改

## 路线图

GMF Board Manager 的未来开发计划:
- **构建工作流程**: 提高效率并简化构建工作流程
- **版本管理**: 支持设备和外设的不同版本代码和解析器
- **插件架构**: 用于自定义设备和外设支持的可扩展插件系统
- **增强验证**: 全面的 YAML 格式检查、模式验证、输入验证和增强的规则验证,具有改进的错误报告
- **增强初始化流程**: 支持跳过特定组件或在不同核心上调用初始化
- **明确定义规则**: 建立明确的规则以促进客户添加外设和设备
- **扩展组件支持**: 添加更多外设、设备和板级

## 故障排除

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

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

如果 `idf.py gmf-gen-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 gmf-gen-config -b YOUR_BOARD` 生成的。

### **切换开发板**
强烈建议使用 `idf.py gmf-gen-config -b`。使用 `idf.py menuconfig` 选择板级可能会导致依赖错误。

## 许可证

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

Links

Supports all targets

License: Custom

To add this component to your project, run:

idf.py add-dependency "jason-mao/gmf_board_manager^0.3.0-beta3"

or download archive

Stats

  • Archive size
    Archive size ~ 964.83 KB
  • Downloaded in total
    Downloaded in total 26 times
  • Downloaded this version
    This version: 3 times

Badge

jason-mao/gmf_board_manager version: 0.3.0-beta3
|