1. 收集硬件参数
先记录芯片与 Flash / PSRAM 容量、LCD 控制器与总线、分辨率和旋转、RGB565 字节序、触控 IC 与坐标范围、背光、电源、USB / UART 路由。使用原理图核对引脚,不能直接照搬其他板子的 GPIO。
2. 建立板级 component
创建以下结构:
firmware/boards/my-board/
board.cmake
CMakeLists.txt
idf_component.yml
sdkconfig.defaults
partitions.csv
include/pxa_board.h
src/my_board.cc
templates/board/ 提供 README 和 .example 元数据,尚不是可以复制即编译的完整 BSP。可从最接近硬件的现有板级实现参考 CMake 与驱动组合,再替换为自己的实现。
board.cmake 示例(仅适用于 ESP32-S3 板子):
set(PXA_BOARD_TARGET "esp32s3")
set(PXA_BOARD_COMPONENT "my-board")
板级物理依赖放在本目录的 idf_component.yml。只有所有板子都需要的依赖才进入公共 manifest。
3. 实现 board port
导出 pxa_board_register_selected(),在实现中调用 pxa_board_register() 注册 pxa_board_port_t。结构体设定 struct_size,port 本身和 context 都必须在注册后持续有效;注册函数保存指针,不复制结构体。
| 必需回调 | 应完成的工作 |
|---|---|
initialize |
初始化板级资源;成功后返回 true |
display |
返回有效的 lv_display_t* |
display_profile |
填充逻辑尺寸、形状与安全边距 |
以下是注册结构的示意片段,my_* 函数必须由 BSP 实现,不能直接拿来编译:
static pxa_board_port_t port = {0};
port.struct_size = sizeof(port);
port.initialize = my_initialize;
port.display = my_display;
port.display_profile = my_display_profile;
pxa_board_register(&port);
可选回调覆盖网络、音量 / 亮度、系统 ready、首帧、诊断与截图。先让仅显示的最小板子启动,再逐项增加能力。
4. 配置存储与内存
在分区表定义符合实际 Flash 容量的 LittleFS 数据分区,再配置相同的分区标签和挂载点。按真实硬件配置 PSRAM、DMA 可用内存、任务栈与像素缓冲。不要复制与自身容量不符的分区偏移或内存配置。
5. 打通显示与输入
先画纯色和边框,验证方向、颜色与裁切;再接 LVGL flush 完成通知;最后把触控坐标映射到相同逻辑空间。显示 Profile 与输入旋转应一致。
高频数据通路留在板级实现:framebuffer 所有权、DMA 提交、像素转换与 PCM 传输不能通过 board port 逐像素或逐采样转发。异步传输完成前不得复用或释放缓冲区。
6. 构建与桌面 Profile
tools/firmware.sh my-board build
创建 simulator/profiles/my-board.toml 表达尺寸和输入语义,字段、圆屏与安全区配置参考 Profile 与多设备模拟。模拟器 Profile 不替代 BSP,也不会自动新增打包器的 CPU target。
7. 最小验收清单
冷启动与重复重启 → 首帧 → 触控边界 → Hello 包安装 → App 启停 → 截图 → 内存压力与连续运行 → 存储恢复。完成基础通路后再接音频和网络,详细定位见板子调试。