logo
0
0
WeChat Login
tspi-3-Linux-260402
rename: tspi-overlay-config → ovtree

ovtree — 设备树插件管理工具

TUI/CLI 工具,用于在运行时管理设备树插件。Go + Bubble Tea,单个静态二进制,零运行时依赖。

适用于任何 Linux 发行版(Ubuntu、Debian、Buildroot 等),只要 U-Boot 支持 overlay 加载。

English

工作原理

┌─────────────────────────────────────────────────────────┐ │ 用户执行: 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 ← 工具本体

移植到其他 SDK

本工具与发行版无关,可以集成到任何 Rockchip Linux SDK。你需要准备三样东西:

1. U-Boot:Overlay 加载器

你的 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

2. Kernel:编译 Overlay DTS 文件

在你的板级 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

3. 构建脚本:编译、部署、安装

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

移植检查清单

  • U-Boot 能读取 /boot/overlays/.ubootenv 并加载列出的 .dtbo 文件
  • 内核构建能将你的 .dts overlay 源码编译为 .dtbo
  • overlays.ini 已部署到 rootfs 的 /boot/overlays/
  • .ubootenv 在构建时从 overlays.ini 生成
  • ovtree 二进制已安装到 /usr/local/bin/
  • 板子能重启并应用通过 TUI 选择的 overlay

overlays.ini 格式

# 互斥组 — 同组内同一时间只能启用一个 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
字段必填说明
enabledtruefalse
name_zh中文显示名称
name_en英文显示名称
desc_zh中文描述
desc_en英文描述
group互斥组名称(留空 = 无约束)

使用方法

TUI 模式

sudo ovtree # 首先选择语言 sudo ovtree --lang=zh # 直接进入中文 sudo ovtree --lang=en # 直接进入英文

CLI 模式

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 # 全部禁用

运行时添加新 Overlay

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+