From 5a957a13b6e2ab3755fbd995398e7318308b04ca Mon Sep 17 00:00:00 2001
From: H_sw <2355861377@qq.com>
Date: Sat, 10 Oct 2026 17:49:46 +0800
Subject: [PATCH 1/2] feat: add ESP32-S3 LR1121 OLED XF board profile
---
README.md | 17 +++
README_ZH.md | 16 +++
.../board_devices.yaml | 125 ++++++++++++++++++
.../board_info.yaml | 5 +
.../board_peripherals.yaml | 124 +++++++++++++++++
docs/BOARDS.md | 30 +++++
docs/BOARDS_ZH.md | 21 +++
docs/CI.md | 4 +-
docs/CI_ZH.md | 2 +-
9 files changed, 341 insertions(+), 3 deletions(-)
create mode 100644 boards/esp32_s3_lr1121_oled_1_54_xf/board_devices.yaml
create mode 100644 boards/esp32_s3_lr1121_oled_1_54_xf/board_info.yaml
create mode 100644 boards/esp32_s3_lr1121_oled_1_54_xf/board_peripherals.yaml
diff --git a/README.md b/README.md
index e1c7113..7a27db8 100644
--- a/README.md
+++ b/README.md
@@ -69,6 +69,19 @@ bilingual documentation, and generation/build checks.
Board definition · Product documentation
+
+
+
+
+
+ |
+
+ ESP32-S3-LR1121-OLED-1.54-XF
+ Board definition · Product documentation
+ |
+
@@ -80,6 +93,7 @@ such as `spi_sd` describe a bus; they do not imply a complete storage applicatio
| Board | Chip | Device definitions | Peripheral definitions |
| --- | --- | --- | --- |
+| [`esp32_s3_lr1121_oled_1_54_xf`](boards/esp32_s3_lr1121_oled_1_54_xf/) | ESP32-S3 | `button_boot`, `button_power`, `button_menu`, `button_ptt`, `button_rtc_irq`, `radio`, `oled`, `rtc`, `battery`, `audio`, `sdcard` | `i2c_main`, `spi_radio`, `gpio_boot`, `gpio_power`, `gpio_menu`, `gpio_ptt`, `gpio_rtc_irq`, `gpio_amplifier`, `gpio_radio_cs`, `gpio_radio_irq`, `gpio_radio_reset`, `gpio_radio_busy`, `i2s_speaker`, `i2s_microphone` |
| [`esp32_s3_touch_amoled_1_75c`](boards/esp32_s3_touch_amoled_1_75c/) | ESP32-S3 | `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
| [`esp32_s3_touch_amoled_1_8`](boards/esp32_s3_touch_amoled_1_8/) | ESP32-S3 | `gpio_expander`, `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch`, `fs_sdcard` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
| [`esp32_s3_touch_amoled_2_16`](boards/esp32_s3_touch_amoled_2_16/) | ESP32-S3 | `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch`, `fs_sdcard` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
@@ -92,6 +106,9 @@ Definitions live under `boards//`. The three AMOLED profiles come
from Espressif Brookesia; see [board revisions and migration notes](docs/BOARDS.md).
CI validates generation and compilation; physical operation requires board testing.
+The LR1121 OLED XF profile provides hardware definitions and requires application-side
+custom device adapters; see [its support scope](docs/BOARDS.md#lr1121-oled-154-xf-definition-scope).
+
## 🚀 Quick start
diff --git a/README_ZH.md b/README_ZH.md
index 4cf10a9..2e96c29 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -68,6 +68,18 @@
板卡定义 · 产品文档
+
+
+
+
+
+ |
+
+ ESP32-S3-LR1121-OLED-1.54-XF
+ 板卡定义 · 产品文档
+ |
+
@@ -79,6 +91,7 @@
| 开发板 | 芯片 | 设备定义 | 外设定义 |
| --- | --- | --- | --- |
+| [`esp32_s3_lr1121_oled_1_54_xf`](boards/esp32_s3_lr1121_oled_1_54_xf/) | ESP32-S3 | `button_boot`, `button_power`, `button_menu`, `button_ptt`, `button_rtc_irq`, `radio`, `oled`, `rtc`, `battery`, `audio`, `sdcard` | `i2c_main`, `spi_radio`, `gpio_boot`, `gpio_power`, `gpio_menu`, `gpio_ptt`, `gpio_rtc_irq`, `gpio_amplifier`, `gpio_radio_cs`, `gpio_radio_irq`, `gpio_radio_reset`, `gpio_radio_busy`, `i2s_speaker`, `i2s_microphone` |
| [`esp32_s3_touch_amoled_1_75c`](boards/esp32_s3_touch_amoled_1_75c/) | ESP32-S3 | `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
| [`esp32_s3_touch_amoled_1_8`](boards/esp32_s3_touch_amoled_1_8/) | ESP32-S3 | `gpio_expander`, `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch`, `fs_sdcard` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
| [`esp32_s3_touch_amoled_2_16`](boards/esp32_s3_touch_amoled_2_16/) | ESP32-S3 | `axp2101_power_manager`, `audio_dac`, `audio_adc`, `display_lcd`, `lcd_touch`, `fs_sdcard` | `i2c_master`, `i2s_audio_out`, `i2s_audio_in`, `gpio_pa_control`, `spi_display` |
@@ -90,6 +103,9 @@
板卡定义统一放在 `boards/<完整型号>/`。新增的三个 AMOLED 型号来自 Espressif Brookesia,
详见[硬件版本与迁移说明](docs/BOARDS_ZH.md)。CI 校验生成与编译,实机运行效果需要单独测试。
+LR1121 OLED XF 配置提供硬件定义,自定义设备需要应用侧适配代码,详见
+[支持范围](docs/BOARDS_ZH.md#lr1121-oled-154-xf-定义范围)。
+
## 🚀 快速开始
diff --git a/boards/esp32_s3_lr1121_oled_1_54_xf/board_devices.yaml b/boards/esp32_s3_lr1121_oled_1_54_xf/board_devices.yaml
new file mode 100644
index 0000000..2e3cf22
--- /dev/null
+++ b/boards/esp32_s3_lr1121_oled_1_54_xf/board_devices.yaml
@@ -0,0 +1,125 @@
+devices:
+- name: button_boot
+ type: button
+ sub_type: gpio
+ init_skip: true
+ config:
+ active_level: 0
+ peripherals:
+ - gpio_name: gpio_boot
+- name: button_power
+ type: button
+ sub_type: gpio
+ init_skip: true
+ config:
+ active_level: 0
+ disable_pull: true
+ peripherals:
+ - gpio_name: gpio_power
+- name: button_menu
+ type: button
+ sub_type: gpio
+ init_skip: true
+ config:
+ active_level: 0
+ peripherals:
+ - gpio_name: gpio_menu
+- name: button_ptt
+ type: button
+ sub_type: gpio
+ init_skip: true
+ config:
+ active_level: 0
+ peripherals:
+ - gpio_name: gpio_ptt
+- name: button_rtc_irq
+ type: button
+ sub_type: gpio
+ init_skip: true
+ config:
+ active_level: 0
+ peripherals:
+ - gpio_name: gpio_rtc_irq
+- name: radio
+ type: custom
+ chip: lr1121
+ init_skip: true
+ config:
+ clock_hz: 8000000
+ mode: 0
+ queue_size: 1
+ peripherals:
+ - name: spi_radio
+ - name: gpio_radio_cs
+ - name: gpio_radio_irq
+ - name: gpio_radio_reset
+- name: oled
+ type: custom
+ chip: ssd1309
+ init_skip: true
+ config:
+ address: 60
+ clock_hz: 400000
+ width: 128
+ height: 64
+ bits_per_pixel: 1
+ reset_gpio: -1
+ rotation: 0
+ num_fbs: 1
+ invert_color: false
+ control_phase_bytes: 1
+ dc_bit_offset: 6
+ cmd_bits: 8
+ param_bits: 8
+ peripherals:
+ - name: i2c_main
+- name: rtc
+ type: custom
+ chip: pcf85063a
+ init_skip: true
+ config:
+ address: 81
+ peripherals:
+ - name: i2c_main
+- name: battery
+ type: custom
+ chip: bq27220
+ init_skip: true
+ config:
+ address: 85
+ clock_hz: 100000
+ charge_threshold_ma: 20
+ peripherals:
+ - name: i2c_main
+- name: audio
+ type: custom
+ chip: es8311_es7210
+ init_skip: true
+ config:
+ speaker_address: 24
+ microphone_address: 64
+ sample_rate: 16000
+ peripherals:
+ - name: i2c_main
+ - name: i2s_speaker
+ - name: i2s_microphone
+ - name: gpio_amplifier
+- name: sdcard
+ type: fs_fat
+ sub_type: sdmmc
+ init_skip: true
+ config:
+ mount_point: /sdcard
+ vfs_config:
+ format_if_mount_failed: false
+ max_files: 5
+ allocation_unit_size: 16384
+ sub_config:
+ slot: SDMMC_HOST_SLOT_1
+ frequency: SDMMC_FREQ_DEFAULT
+ bus_width: 1
+ slot_flags: SDMMC_SLOT_FLAG_INTERNAL_PULLUP
+ pins:
+ clk: 12
+ cmd: 10
+ d0: 11
diff --git a/boards/esp32_s3_lr1121_oled_1_54_xf/board_info.yaml b/boards/esp32_s3_lr1121_oled_1_54_xf/board_info.yaml
new file mode 100644
index 0000000..c8d8aa2
--- /dev/null
+++ b/boards/esp32_s3_lr1121_oled_1_54_xf/board_info.yaml
@@ -0,0 +1,5 @@
+board: esp32_s3_lr1121_oled_1_54_xf
+chip: esp32s3
+version: 1.0.0
+description: Waveshare ESP32-S3-LR1121-OLED-1.54-XF common digital board
+manufacturer: Waveshare
diff --git a/boards/esp32_s3_lr1121_oled_1_54_xf/board_peripherals.yaml b/boards/esp32_s3_lr1121_oled_1_54_xf/board_peripherals.yaml
new file mode 100644
index 0000000..c1981c3
--- /dev/null
+++ b/boards/esp32_s3_lr1121_oled_1_54_xf/board_peripherals.yaml
@@ -0,0 +1,124 @@
+peripherals:
+- name: i2c_main
+ type: i2c
+ config:
+ port: 0
+ pins:
+ sda: 13
+ scl: 14
+ enable_internal_pullup: true
+ glitch_count: 7
+- name: spi_radio
+ type: spi
+ config:
+ spi_bus_config:
+ spi_port: SPI3_HOST
+ mosi_io_num: 45
+ miso_io_num: 46
+ sclk_io_num: 40
+ max_transfer_sz: 4092
+- name: gpio_boot
+ type: gpio
+ config:
+ pin: 0
+ mode: GPIO_MODE_INPUT
+ pull_up: true
+ default_level: 0
+- name: gpio_power
+ type: gpio
+ config:
+ pin: 4
+ mode: GPIO_MODE_INPUT
+ pull_up: false
+ default_level: 0
+- name: gpio_menu
+ type: gpio
+ config:
+ pin: 5
+ mode: GPIO_MODE_INPUT
+ pull_up: true
+ default_level: 0
+- name: gpio_ptt
+ type: gpio
+ config:
+ pin: 6
+ mode: GPIO_MODE_INPUT
+ pull_up: true
+ default_level: 0
+- name: gpio_rtc_irq
+ type: gpio
+ config:
+ pin: 7
+ mode: GPIO_MODE_INPUT
+ pull_up: true
+ default_level: 0
+- name: gpio_amplifier
+ type: gpio
+ config:
+ pin: 8
+ mode: GPIO_MODE_OUTPUT
+ pull_up: false
+ default_level: 0
+- name: gpio_radio_cs
+ type: gpio
+ config:
+ pin: 42
+ mode: GPIO_MODE_OUTPUT
+ pull_up: false
+ default_level: 1
+- name: gpio_radio_irq
+ type: gpio
+ config:
+ pin: 38
+ mode: GPIO_MODE_INPUT
+ pull_up: false
+ default_level: 0
+- name: gpio_radio_reset
+ type: gpio
+ config:
+ pin: 39
+ mode: GPIO_MODE_OUTPUT
+ pull_up: false
+ default_level: 1
+- name: gpio_radio_busy
+ type: gpio
+ config:
+ pin: 41
+ mode: GPIO_MODE_INPUT
+ pull_up: false
+ default_level: 0
+- name: i2s_speaker
+ type: i2s
+ role: master
+ format: std-out
+ config:
+ port: 0
+ sample_rate_hz: 16000
+ data_bit_width: 16
+ slot_mode: I2S_SLOT_MODE_MONO
+ slot_mask: I2S_STD_SLOT_LEFT
+ pins:
+ mclk: 17
+ bclk: 18
+ ws: 21
+ dout: 16
+ din: -1
+- name: i2s_microphone
+ type: i2s
+ role: master
+ format: tdm-in
+ config:
+ port: 0
+ sample_rate_hz: 16000
+ data_bit_width: 16
+ slot_mode: I2S_SLOT_MODE_STEREO
+ slot_mask: I2S_TDM_SLOT0 | I2S_TDM_SLOT1 | I2S_TDM_SLOT2 | I2S_TDM_SLOT3
+ pins:
+ mclk: 17
+ bclk: 18
+ ws: 21
+ dout: -1
+ din: 15
+ total_slot: 4
+ ws_width: 0
+ left_align: false
diff --git a/docs/BOARDS.md b/docs/BOARDS.md
index fd04ddc..538aac7 100644
--- a/docs/BOARDS.md
+++ b/docs/BOARDS.md
@@ -9,6 +9,7 @@ is `waveshare/waveshare_boards`. Keep all definitions in:
```text
boards/
+ esp32_s3_lr1121_oled_1_54_xf/
esp32_s3_touch_lcd_7/
esp32_s3_touch_amoled_1_75c/
esp32_s3_touch_amoled_1_8/
@@ -30,6 +31,35 @@ passes this version's override-dependency name filter. No upstream patch or
customer-path argument is needed. See the pinned
[discovery implementation](https://github.com/espressif/esp-board-manager/blob/2beb9b22b0892b343bd555a1ebc9929a7edce8fc/generators/config_generator.py).
+## LR1121 OLED 1.54 XF definition scope
+
+`esp32_s3_lr1121_oled_1_54_xf` imports the three YAML files from the
+[product's factory-source profile](https://github.com/waveshareteam/esp32-s3-lr1121-oled-1.54/tree/a0bf73932ef06d047810b17888cc7e33f064680e/firmware/12_factory_demo/components/esp32_s3_lr1121_oled_1_54_support/boards/esp32_s3_lr1121_oled_1_54_xf) without changing its hardware values.
+The hardware reference is the product repository's [schematic](https://github.com/waveshareteam/esp32-s3-lr1121-oled-1.54/blob/a0bf73932ef06d047810b17888cc7e33f064680e/hardware/schematics/esp32-s3-lr1121-oled-1_54_schematics.pdf).
+The profile describes ESP32-S3 GPIOs, shared I2C, LR1121 SPI, speaker/microphone
+I2S, buttons and one-bit SDMMC.
+
+This is a hardware-definition profile. All devices retain `init_skip: true` for
+application-controlled initialization. `radio`, `oled`, `rtc`, `battery` and
+`audio` are custom devices; this pack does not include their initialization
+callbacks, product adapters or managed driver dependencies. Applications must
+supply and register those adapters before initializing the devices by name.
+Calling `esp_board_manager_init()` alone does not make these devices usable.
+Buttons and SD use built-in Board Manager device types and also require explicit
+initialization. SD mount failure does not automatically format the card.
+
+The radio adapter must also initialize the separately declared `gpio_radio_busy`;
+it is not in the custom radio's four-entry peripheral list. The audio defaults
+are 16 kHz with STD speaker output and four-slot TDM microphone input. Application
+profiles such as the walkie-talkie's 8 kHz capture need their own configuration.
+When adopting this published profile, remove duplicate application-local board
+YAML definitions while retaining the required product adapters.
+
+Generation and compilation checks do not validate device initialization, shared
+I2S operation, RF settings, power behavior or physical wiring. Hardware testing
+has not been performed for this import; verify the exact PCB revision and those
+functions separately before claiming complete product support.
+
## Imported source and adaptations
The three AMOLED definitions originate from
diff --git a/docs/BOARDS_ZH.md b/docs/BOARDS_ZH.md
index eecbbd5..b1ca2b2 100644
--- a/docs/BOARDS_ZH.md
+++ b/docs/BOARDS_ZH.md
@@ -9,6 +9,7 @@
```text
boards/
+ esp32_s3_lr1121_oled_1_54_xf/
esp32_s3_touch_lcd_7/
esp32_s3_touch_amoled_1_75c/
esp32_s3_touch_amoled_1_8/
@@ -27,6 +28,26 @@ boards/
`_boards` 后缀能够通过该版本对覆盖依赖名称的筛选,无需修改上级组件或传入 customer-path 参数。
依据见固定版本的[扫描实现](https://github.com/espressif/esp-board-manager/blob/2beb9b22b0892b343bd555a1ebc9929a7edce8fc/generators/config_generator.py)。
+## LR1121 OLED 1.54 XF 定义范围
+
+`esp32_s3_lr1121_oled_1_54_xf` 的三份 YAML 来自
+[产品出厂示例源码中的板卡配置](https://github.com/waveshareteam/esp32-s3-lr1121-oled-1.54/tree/a0bf73932ef06d047810b17888cc7e33f064680e/firmware/12_factory_demo/components/esp32_s3_lr1121_oled_1_54_support/boards/esp32_s3_lr1121_oled_1_54_xf),保留原有硬件参数。
+对应硬件资料为产品仓库中的[原理图](https://github.com/waveshareteam/esp32-s3-lr1121-oled-1.54/blob/a0bf73932ef06d047810b17888cc7e33f064680e/hardware/schematics/esp32-s3-lr1121-oled-1_54_schematics.pdf)。
+配置描述 ESP32-S3 GPIO、共用 I2C、LR1121 SPI、扬声器与麦克风 I2S、按键和单线 SDMMC。
+
+本次提供硬件定义,所有设备保留 `init_skip: true`,由应用按需初始化。
+`radio`、`oled`、`rtc`、`battery` 和 `audio` 为自定义设备;本组件包未包含这些设备的
+初始化回调、产品适配代码或托管驱动依赖。应用必须提供并注册适配代码,再按名称初始化设备。
+仅调用 `esp_board_manager_init()` 不会使这些设备可用。
+按键和 SD 使用 Board Manager 内置设备类型,同样需要显式初始化;SD 挂载失败不会自动格式化。
+
+无线适配代码还需初始化单独声明的 `gpio_radio_busy`,它不在自定义 radio 的四项外设列表中。
+音频默认使用 16 kHz、STD 扬声器输出与四时隙 TDM 麦克风输入;对讲机的 8 kHz 采集等应用配置
+需另行设置。产品工程采用发布后的板卡定义时,应移除应用中重复的板卡 YAML,同时保留所需适配代码。
+
+生成与编译检查不验证设备初始化、共用 I2S 工作情况、射频设置、电源行为或实际接线。
+本次导入尚未进行实机测试;声明完整产品支持前,需核对具体 PCB 版本并分别验证这些功能。
+
## 导入来源与适配
三个 AMOLED 定义来自
diff --git a/docs/CI.md b/docs/CI.md
index 3a30bef..2772a80 100644
--- a/docs/CI.md
+++ b/docs/CI.md
@@ -15,8 +15,8 @@ published versions satisfying the range are tested, with duplicates removed.
Registry lookup failures fail the job. Each matrix entry records an exact version.
The initial Board Manager floor is **0.7.2**, matching the reference board-pack
-template. The current floor and latest resolve to the same version, giving eight
-board builds across the two IDF lines. Keep the floor until a deliberate
+template. Five board profiles are discovered. Each resolved Board Manager version
+adds ten builds across the two IDF lines. Keep the floor until a deliberate
compatibility change is tested. Unsupported catalog profiles or generation failures fail CI; they are
not counted as successful builds.
diff --git a/docs/CI_ZH.md b/docs/CI_ZH.md
index d4bfd13..b7b51d2 100644
--- a/docs/CI_ZH.md
+++ b/docs/CI_ZH.md
@@ -13,7 +13,7 @@
相同版本合并。组件库查询失败会使任务失败,每个矩阵项均记录明确版本。
Board Manager 初始最低版本为 **0.7.2**,与参考板卡包模板一致。
-当前最低版与最新版相同,四块板卡在两个 IDF 版本线上共八项编译。
+当前发现五块板卡,每个解析出的 Board Manager 版本在两个 IDF 版本线上共十项编译。
调整最低版本前需要明确兼容性变更并测试。
不支持的芯片能力配置或生成失败会使 CI 失败,不会被计为编译成功。
From ca3868e31f8ce3008725bde75cfcbdcb8dbfd805 Mon Sep 17 00:00:00 2001
From: H_sw <2355861377@qq.com>
Date: Mon, 12 Oct 2026 09:38:37 +0800
Subject: [PATCH 2/2] chore: bump board pack version to 0.1.2
---
idf_component.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/idf_component.yml b/idf_component.yml
index 51ab5a6..647620c 100644
--- a/idf_component.yml
+++ b/idf_component.yml
@@ -1,4 +1,4 @@
-version: "0.1.1"
+version: "0.1.2"
description: Waveshare board definitions for ESP Board Manager
license: Apache-2.0
url: https://github.com/waveshareteam/waveshare_boards