TUI/CLI 工具,用于在运行时管理设备树插件。Go + Bubble Tea,单个静态二进制,零运行时依赖。
适用于任何 Linux 发行版(Ubuntu、Debian、Buildroot 等),只要 U-Boot 支持 overlay 加载。
┌─────────────────────────────────────────────────────────┐ │ 用户执行: sudo ovtree │ │ ↓ │ │ overlays.ini ──(读写)── TUI / CLI │ │ ↓ │ │ .ubootenv ──(保存时自动生成)── │ │ ↓ │ │ U-Boot 启动 ──(读取 .ubootenv)── 加载 *.dtbo │ └─────────────────────────────────────────────────────────┘
所有文件集中在 /boot/overlays/:
/boot/overlays/ ├── overlays.ini ← 唯一配置源(人类编辑这个) ├── .ubootenv ← 自动生成(U-Boot 读这个) ├── example-dsi.dtbo ← 编译好的 overlay 二进制 └── example-spi.dtbo /usr/local/bin/ └── ovtree ← 工具本体
本工具与发行版无关,可以集成到任何 Rockchip Linux SDK。你需要准备三样东西:
你的 U-Boot 需要包含一个 overlay 加载器,它从 rootfs 分区读取 /boot/overlays/.ubootenv,并在启动时将列出的 .dtbo 文件应用到设备树。
.ubootenv 格式很简单:
# auto-generated — do not edit
overlays=your-overlay-a.dtbo your-overlay-b.dtbo
参考实现:u-boot/arch/arm/mach-rockchip/overlay_loader.c
你的加载器需要匹配的关键参数:
| 项目 | 值 |
|---|---|
| 配置文件路径 | /boot/overlays/.ubootenv |
| DTBO 目录 | /boot/overlays/ |
| 配置格式 | overlays=<名称1>.dtbo <名称2>.dtbo ... |
| 最大 overlay 数 | 128 |
| 单个 DTBO 最大 | 256 KB |
在你的板级 DTS 文件旁创建 device-tree-overlays/ 目录:
kernel/arch/arm64/boot/dts/<vendor>/device-tree-overlays/ ├── Makefile ├── overlays.ini └── overlays/ ├── your-board-dsi-screen.dts └── your-board-spi-device.dts
Makefile 使用内核的 dtc 将 .dts 编译为 .dtbo:
DTC ?= dtc
CPP ?= cpp
KERNEL_DIR ?= $(shell cd ../../../.. && pwd)
DTS_CPPFLAGS = -nostdinc -undef -D__DTS__ -x assembler-with-cpp
DTS_INCLUDE = -I$(KERNEL_DIR)/include \
-I$(KERNEL_DIR)/arch/arm64/boot/dts \
-I$(KERNEL_DIR)/arch/arm64/boot/dts/rockchip
SRCS = $(wildcard overlays/*.dts)
DTBOS = $(SRCS:.dts=.dtbo)
.PHONY: overlays clean
overlays: $(DTBOS)
%.dtbo: %.dts.tmp
$(DTC) -@ -I dts -O dtb -o $@ $<
%.dts.tmp: %.dts
$(CPP) $(DTS_CPPFLAGS) $(DTS_INCLUDE) -o $@ $<
clean:
rm -f overlays/*.dtbo overlays/*.dts.tmp
SDK 构建过程中需要完成三步:
步骤 A — 编译 overlay + TUI 工具(在内核构建阶段):
# 编译 .dts → .dtbo
make -C "$OVERLAY_DIR" overlays DTC="kernel/scripts/dtc/dtc"
# 复制产物
mkdir -p "$OUTPUT_DIR/overlays/overlays"
cp "$OVERLAY_DIR/overlays.ini" "$OUTPUT_DIR/overlays/overlays/"
cp "$OVERLAY_DIR/overlays/"*.dtbo "$OUTPUT_DIR/overlays/overlays/"
# 编译 TUI 工具(需要 Go 1.21+)
cd app/ovtree
INSTALL_DIR="$OUTPUT_DIR/overlays" ./scripts/build.sh
步骤 B — 安装到 rootfs(post-rootfs 钩子,所有发行版通用):
# 安装 DTBO 文件 + 配置
mkdir -p "$TARGET_ROOTFS/boot/overlays"
cp overlays/*.dtbo "$TARGET_ROOTFS/boot/overlays/"
cp overlays/overlays.ini "$TARGET_ROOTFS/boot/overlays/"
# 从 overlays.ini 生成 .ubootenv(解析 enabled=true 的段)
# ... 完整解析器见 post-dts-overlays.sh
# 安装 TUI 二进制
install -m 755 ovtree "$TARGET_ROOTFS/usr/local/bin/"
步骤 C — 验证(在目标板上):
ls /boot/overlays/ # 应有 *.dtbo + overlays.ini + .ubootenv
which ovtree # 应在 PATH 中
sudo ovtree # 应启动 TUI
/boot/overlays/.ubootenv 并加载列出的 .dtbo 文件.dts overlay 源码编译为 .dtbooverlays.ini 已部署到 rootfs 的 /boot/overlays/.ubootenv 在构建时从 overlays.ini 生成ovtree 二进制已安装到 /usr/local/bin/# 互斥组 — 同组内同一时间只能启用一个 overlay
[group:dsi-display]
type = group
name_zh = DSI 显示屏
name_en = DSI Display
desc_zh = 同一时间只能使用一个 DSI 屏幕
desc_en = Only one DSI display can be active at a time
# Overlay 条目 — 段名必须与 .dtbo 文件名一致
[your-board-dsi-screen.dtbo]
enabled = false
name_zh = 10.1寸 MIPI 屏幕
name_en = 10.1" MIPI Display
desc_zh = 800x1280, 4-lane MIPI, GT9xx 触控
desc_en = 800x1280, 4-lane MIPI, GT9xx Touch
group = dsi-display
| 字段 | 必填 | 说明 |
|---|---|---|
enabled | 是 | true 或 false |
name_zh | 是 | 中文显示名称 |
name_en | 是 | 英文显示名称 |
desc_zh | 否 | 中文描述 |
desc_en | 否 | 英文描述 |
group | 否 | 互斥组名称(留空 = 无约束) |
sudo ovtree # 首先选择语言
sudo ovtree --lang=zh # 直接进入中文
sudo ovtree --lang=en # 直接进入英文
sudo ovtree list # JSON 列出所有 overlay
sudo ovtree status # 查看已启用的 overlay
sudo ovtree enable your-overlay.dtbo # 启用
sudo ovtree disable your-overlay.dtbo # 禁用
sudo ovtree disable-all # 全部禁用
scp your-overlay.dtbo root@board:/boot/overlays/
sudo ovtree # 选择"添加新插件"
# 检测/安装 Go,交叉编译 arm64,安装二进制
./scripts/build.sh
# 自定义安装目录
INSTALL_DIR=/path/to/output ./scripts/build.sh
# 通过 Makefile
make build # 交叉编译 arm64
make build-host # 本机编译(用于测试)
make INSTALL=/custom/path install
要求:Go 1.21+(build.sh 会在缺失时自动安装)
ovtree/ ├── main.go # 入口 ├── embed.go # go:embed 内嵌默认 overlays.ini ├── defaults/ │ └── overlays.ini # 内嵌回退配置 ├── cmd/ # CLI 命令 (root, list, enable, disable, status, disable-all) ├── engine/ # 配置加载/保存、互斥检查、dtbo 校验、.ubo同步 ├── i18n/ # 双串 (zh/en) ├── tui/ # Bubble Tea 页面 (语言选择、菜单、分组配置、确认等) ├── scripts/build.sh # 自动安装 Go + 交叉编译 + 安装 └── Makefile
GPL-2.0+