# 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) 文件。
# 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) 文件。
idf.py add-dependency "jason-mao/gmf_board_manager^0.3.0-beta3"