系统与硬件

PXA 创作与开发指南

全新板子的适配

从板级目录和三个必需回调开始,逐步打通显示、输入与应用运行。

中文指南 · 5 分钟阅读 · PXA 0.10.0
适用环境与阅读准备

适用环境硬件移植

开始前已获取工作区;准备驱动、分区和目标芯片工具链

术语速查 →

用 AI 开始适配

把这句话交给能执行命令的 AI 编程助手,并提供原理图、芯片型号和可用参考驱动:

请读取 https://pxa.doit.am/board-agent.md,把我提供的开发板适配到 PXA。只修改新板目录、对应模拟器 Profile 和生成的本板依赖锁,不修改 PXA 接口、SDK、共享运行时或其他板子。先核对硬件资料,再实现、构建并按已有授权进行真机验收。

板适配使用独立的固件工作区,需要该仓库指定的 ESP-IDF 环境。应用开发用的独立 DevKit 无法替代固件工具链。配置 agent:

uv run --python 3.12 https://pxa.doit.am/setup.py --workspace . --mode board
.pxa/pxa board init my-board --target esp32s3 --reference pai-touch

工具生成板目录和现有 board-port 回调骨架,记录修改边界,并将未知硬件参数留在 board-port.json。脚手架有明确的编译阻断提示;它没有猜测 GPIO、供电或 Flash 分区,也不代表已适配成功。

填好硬件信息并实现驱动后运行 board check my-board、board build my-board。修改已有板时,先运行 scope begin --mode board --board my-board。交付前运行 scope check:SDK、ABI、共享组件和其他板子改动会列为越界,工具不会擅自还原文件。

这些检查是修改审计,不是操作系统沙箱。新 CPU 后端或缺失的平台接口需要单独的平台开发任务;不能为了适配一块板而悄悄改动应用接口。下面是实际实现顺序。

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 启停 → 截图 → 内存压力与连续运行 → 存储恢复。完成基础通路后再接音频和网络,详细定位见板子调试。

参考实现与资料zh-CN/adding-a-board.md ↗include/pxa_board_api.h ↗board/README.zh-CN.md ↗

输入关键词,搜索全部教程。