泰山派RK3566开发板笔记
官方给的SDK是在 Ubuntu 18.04 下搭建编译的。最开始的想法是在我的工作机运行两个虚拟机,然后通过 VirtIOFS 挂载项目文件夹,Ubuntu 24.04 编辑,Ubuntu 18.04 编译。不过这些会遇到文件更改时间戳不一致的问题,从而报错。
2025-10-10T14:07:31 ERROR: Clock skew detected. File /home/amass/Projects/tspi_linux_sdk_repo_20240131/buildroot/output/rockchip_rk3566/build/gstreamer1-rockchip-master/build/meson-private/coredata.dat has a time stamp 0.0051s in the future.
所以尝试通过Docker 运行 Ubuntu 18.04 容器构建。
# docker run -it -d -h Ubuntu --name lckfb -v /mnt/cache/Projects:/home/amass/Projects registry.cn-shenzhen.aliyuncs.com/amass_law/ubuntu_dev:18.04
# docker exec -it -w /home/amass/Projects -u amass lckfb bash
docker run -it --rm -h Ubuntu --name lckfb \
-v /mnt/cache/Projects:/home/amass/Projects \
-w /home/amass/Projects \
-u amass \
registry.cn-shenzhen.aliyuncs.com/amass_law/ubuntu_dev:18.04 bash
docker run -it --privileged --rm -h Ubuntu --name lckfb \
-v /home/amass/Projects:/home/amass/Projects \
-v /home/amass/.ssh:/home/amass/.ssh \
-w /home/amass/Projects \
-u amass \
registry.cn-shenzhen.aliyuncs.com/amass_law/ubuntu_dev:18.04 bash
mkdir tspi_linux_sdk_repo_20240131 && cd ./tspi_linux_sdk_repo_20240131
cp ../tspi_linux_sdk_repo_20240131.tar.gz .
tar xzvf ./tspi_linux_sdk_repo_20240131.tar.gz
.repo/repo/repo sync -l -j28
cp ../buildroot_dl_4c7c9df616fb.tar.gz .
tar xzvf ./buildroot_dl_4c7c9df616fb.tar.gz
安装依赖包:
apt install make bc time file wget cpio unzip rsync xxd whiptail gcc device-tree-compiler python python3 bison flex libssl-dev bzip2 liblz4-tool git expect g++ texinfo ncurses-dev fakeroot
修改 device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk,将 RK_JOBS 设置为 CPU 线程数,加快编译速度
# 板级配置,选择 BoardConfig-rk3566-tspi-v10.mk
./build.sh device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk
# 确认配置是否生效
./build.sh -h kernel
export RK_ROOTFS_SYSTEM=buildroot
# ./build.sh kernel
./build.sh all
# 固件打包
./mkfirmware.sh
./build.sh updateimg
# 清理全部
./build.sh cleanall
配置电源选项,貌似只有第一次才会弹出对话框选择,后续即使重新 cleanall 也不会重新弹出对话框让你重新选择了。需要把整个项目文件夹全删了,重新配置。
3300000 PMUIO2 Supply Power Voltage(uV) → 第二个
3300000 VCCIO1 Supply Power Voltage(uV) → 第二个
3300000 VCCIO3 Supply Power Voltage(uV) → 第二个
1800000 VCCIO4 Supply Power Voltage(uV) → 第一个
3300000 VCCIO5 Supply Power Voltage(uV) → 第二个
1800000 VCCIO6 Supply Power Voltage(uV) → 第一个
3300000 VCCIO7 Supply Power Voltage(uV) → 第二个
SDK
泰山派提供的 SDK 版本比较旧,我们可以参考野火鲁班猫提供的资料进行参考。它同样提供了镜像构建与部署的说明文档。
Buildroot 添加包
Buildroot 所支持的包都在文件夹 buildroot/package 下。
在执行 ./build.sh buildroot 时,首先会输出如下信息:
processing option: buildroot
==========Start building buildroot==========
TARGET_BUILDROOT_CONFIG=rockchip_rk3566
=========================================
Top of tree: /home/amass/Projects/tspi_linux_sdk_repo_20240131
===========================================
#TARGET_BOARD=rk3566
#OUTPUT_DIR=output/rockchip_rk3566
#CONFIG=rockchip_rk3566_defconfig
===========================================
如果上面的信息,我们可以知道泰山派的 Buildroot 默认配置文件为 buildroot/configs/rockchip_rk3566_defconfig。所以如果我们要添加包时,例如 buildroot/package/openssh,就可以直接在 buildroot/configs/rockchip_rk3566_defconfig 文件中按照 buildroot/package/openssh/Config.in 的选项添加如下内容:
BR2_PACKAGE_GDB_DEBUGGER=y
BR2_PACKAGE_OPENSSH=y
BR2_PACKAGE_OPENSSH_SERVER=y
BR2_PACKAGE_OPENSSH_CLIENT=y
BR2_PACKAGE_OPENSSH_KEY_UTILS=y
BR2_PACKAGE_FFMPEG=y
BR2_PACKAGE_FFMPEG_FFMPEG=y
BR2_PACKAGE_FFMPEG_FFPROBE=y
BR2_PACKAGE_FFMPEG_AVRESAMPLE=y
BR2_PACKAGE_FFMPEG_POSTPROC=y
BR2_PACKAGE_FFMPEG_SWSCALE=y
BR2_PACKAGE_HAS_LIBGLES=y
BR2_PACKAGE_QT5=y
BR2_PACKAGE_QT5BASE_CONCURRENT=y
BR2_PACKAGE_QT5BASE_GUI=y
BR2_PACKAGE_QT5BASE_WIDGETS=y
BR2_PACKAGE_BROTLI=y
...其它配置项...
可以单独对每个包测试:
make <package>-reconfigure
make <package>-rebuild
make <package>-reinstall
例如包 buildroot/package/qt5 :
# 选择 rockchip_rk3566
source envsetup.sh
make qt5-reconfigure
make qt5-rebuild
make qt5-reinstall
然后清除之前全部构建内容,重新构建。
patch
在生产 patch 补丁时, diff 路径开头应避免 ./ 的路径。
应使用 :
diff -auNr brotli-1.1.0/ brotli-1.1.0.bak/ > 0001-cmake-version.patch
而不是:
diff -auNr ./brotli-1.1.0/ ./brotli-1.1.0.bak/ > 0001-cmake-version.patch # 这个会导致误解!!!
使用 ./ 开头,会对 patch 的 -p 剥离路径前缀造成困扰。如何加入了 ./,其其实也是一个层级。那么 Buildroot 在合入 patch 补丁时就会失败。
自定义添加Package - Qt6
在自定义添加 Package 时,我们可以仿照 buildroot/package/boost/boost.mk 实现 qt6.mk、Config.in 文件。原因有以下几点:
- 我比较熟悉 Boost 库的构建。
- 其构建步骤也非常简单,其构建工具 B2 为自编译。所以整个构建最简依赖只有 GCC 编译器工具链。
- 因为其使用 B2 作为构建工具,Buildroot 没有为其提供
pkg-cmake.mk、pkg-qmake.mk内类似的便捷 Make 函数。而仅引用了最基础的pkg-generic.mk文件,有利于我们更加了解 Buildroot Package 的构建细节。
选用 Qt6 作为自定义包添加的原因:
- 目前所接触的嵌入式环境 Qt 版本还停留在 Qt5,作为一个 New is Better 的坚定主义者,在 Qt6 刚发布我就已经切换到 Qt6上去了。
- 最新的 Buildroot 源码包已经内置支持 Qt5,我们可以以此作为参考。
- 尝试在嵌入式Linux下编译及部署 Qt6 也是一次学习。
- Qt6 交叉编译要求在编译设备端 Qt6 前,需要先编译主机端 Qt6 以提供一些工具。正好可以深入学习
Config.in.host相关的配置,以及 package 之间的依赖管理。
自己实现Qt6 buildroot package,要求在选中 BR2_PACKAGE_QT 时,BR2_PACKAGE_HOST_QT要被选中。构建的时候 需要先编译 Host 包,再编译 Qt 包。
QT6_VERSION = 6.10.0
QT6_SOURCE = qt-everywhere-src-$(QT6_VERSION).tar.xz
QT6_SITE = https://download.qt.io/official_releases/qt/6.10/$(QT6_VERSION)/single
QT6_DEPENDENCIES = host-pkgconf host-qt6 libgles wayland libxkbcommon
define QT6_IGNORE_STATX
patch -i $(QT6_PKGDIR)target-patches/0001-statx-stx_mnt_id.patch $(@D)/qtbase/src/corelib/io/qstorageinfo_linux.cpp
endef
QT6_POST_PATCH_HOOKS += QT6_IGNORE_STATX
QT6_INSTALL_STAGING = YES
define QT6_CONFIGURE_CMDS
cd $(@D) && ./configure -release -opengl es2 -nomake examples -nomake tests -skip qtwebengine,qtwebview,qtwebchannel,qtlanguageserver,qt5compat,qtremoteobjects,qtspeech,qtgrpc,qtmultimedia,qtlottie -qt-host-path $(HOST_DIR)/usr -prefix /usr -- -DCMAKE_TOOLCHAIN_FILE=$(HOST_DIR)/share/buildroot/toolchainfile.cmake -DCMAKE_C_FLAGS="-lmali" -DCMAKE_CXX_FLAGS="-lmali"
endef
define QT6_BUILD_CMDS
cd $(@D) && cmake --build . --parallel
endef
define QT6_INSTALL_TARGET_CMDS
cd $(@D) && DESTDIR=$(TARGET_DIR) cmake --install .
endef
define QT6_INSTALL_STAGING_CMDS
cd $(@D) && DESTDIR=$(STAGING_DIR) cmake --install .
endef
define HOST_QT6_CONFIGURE_CMDS
cd $(@D) && ./configure -prefix $(HOST_DIR)/usr -release -shared -nomake examples -nomake tests -skip qtwebengine,qtwebview,qtwebchannel,qtlanguageserver,qt5compat,qt3d,qtremoteobjects,qtspeech,qtgrpc,qtvirtualkeyboard,qttranslations,qthttpserver,qtactiveqt,qtquickeffectmaker,qtserialport,qtlocation,qtpositioning,qtquicktimeline,qtmultimedia,qtcharts,qtcoap,qtconnectivity,qtdatavis3d,qtsensors,qtlottie,qtmqtt
endef
define HOST_QT6_BUILD_CMDS
cd $(@D) && cmake --build . --parallel
endef
define HOST_QT6_INSTALL_CMDS
cd $(@D) && cmake --install .
endef
$(eval $(generic-package))
$(eval $(host-generic-package))
取消 IO电源域配置 打印,修改 buildroot/package/rockchip/rkscript/rkscript.mk 文件,注释 RKSCRIPT_INSTALL_TARGET_IO_DOMAIN_SCRIPT 相关内容。
3.1寸屏幕的分辨率为480x800。
设置背光:
echo 20 > /sys/class/backlight/backlight/brightness
U-boot logo
更换Uboot开机logo,参考 Rockchip_Developer_Guide_UBoot_Nextdev_CN.pdf 章节 5.5 Display。
Weston
旋转
屏幕旋转,参照手册 Rockchip_Developer_Guide_Buildroot_Weston_CN.pdf。
echo "output:all:rotate270" > /tmp/.weston_drm.conf
echo "output:DSI-1::rotate180" > /tmp/.weston_drm.conf
目前如下配置不支持,原因还不知道:
[output]
name=DSI-1
transform=rotate90
结合上述结论,可以修改 buildroot/package/weston/S49weston 文件,加入 在 start_weston() 函数开头加上 echo "output:all:rotate270" > /tmp/.weston_drm.conf 。
背景图、隐藏状态栏
修改 weston 配置文件:
[shell]
background-image=/etc/xdg/weston/background.jpg
panel-position=none
wifi连接:
wifi_start.sh amass.law 'your_password'
Ubuntu 24.04 的 SSH 版本太高,无法成功连接 Buildroot 的 SSHD,需要显示指定:
ssh -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa root@192.168.5.40
代码管理
Rockchip 是 通过 repo 对 sdk 进行管理分发的,泰山派使用本地repo提供了sdk。为了方便学习,我们将修改的git仓库提交至gitea仓库,然后修改repo。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="ssh://git@gitea.amass.fun:2022/" name="gitea"/>
<project name="rk3566/buildroot" path="buildroot" remote="gitea" revision="master" clone-depth="1">
<linkfile src="build/Makefile" dest="Makefile"/>
<linkfile src="build/envsetup.sh" dest="envsetup.sh"/>
</project>
<project name="rk3566/device-rockchip" path="device/rockchip" remote="gitea" revision="master" clone-depth="1">
<linkfile src="common/mkfirmware.sh" dest="mkfirmware.sh"/>
<linkfile src="common/build.sh" dest="build.sh"/>
<linkfile src="common/rkflash.sh" dest="rkflash.sh"/>
<linkfile src="rk356x" dest="device/rockchip/.target_product"/>
</project>
<project name="rk3566/linux-rga" path="external/linux-rga" remote="gitea" revision="master" clone-depth="1"/>
<project name="rk3566/kernel" path="kernel" remote="gitea" revision="master" clone-depth="1"/>
<project name="rk3566/mpp" path="external/mpp" remote="gitea" revision="master" clone-depth="1"/>
</manifest>
然后单独强制同步:
.repo/repo/repo sync --no-manifest-update --force-sync kernel
.repo/repo/repo sync --no-manifest-update --force-sync buildroot
.repo/repo/repo sync --no-manifest-update --force-sync device/rockchip
重新同步文件夹:
.repo/repo/repo sync external/libmali
oem 和 userdata 分区
在 Rockchip_Developer_Guide_Linux_Software_CN.pdf 的 8.1.3 系统分区说明 说到:
- oem 分区:给⼚家使⽤,存放⼚家的 APP 或数据。挂载在
/oem⽬录。 - userdata 分区:供 APP 临时⽣成⽂件或给最终⽤⼾使⽤,挂载在
/userdata⽬录下。
在执行 ./mkfirmware.sh 时,即可打包 oem 和 userdata 分区镜像。这两个分区镜像的配置文件为 device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk。重点关注 RK_OEM_DIR 和 RK_USERDATA_DIR:
export RK_OEM_DIR=oem_normal
export RK_USERDATA_DIR=userdata_normal
它表示打包时,将 device/rockchip/oem/oem_normal 文件夹内的内容制作为oem分区镜像,将 device/rockchip/userdata/userdata_normal 文件夹内的内容制作为userdata分区镜像。
目前 userdata 分区在第一次烧录开机时会被格式化,具体原因未知。为了不耽误后续进度,暂时先搁置。这个问知道的人(例如 Rockchip Redmine)应该会比较快。
参考 Installing-Python-2.7-and-pip-on-Ubuntu-24.04-Noble-LTS 这篇文章安装 Python2.7:
wget https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz
tar xzf Python-2.7.18.tgz
cd Python-2.7.18
./configure --enable-optimizations --enable-shared CFLAGS="-fPIC" CXXFLAGS="-fPIC"
make -j20
sudo make install
即使在 Ubuntu 24.04 安装 Python 2.7 后,整个 SDK 还是无法编译成功。一些 buildroot 的 package 在 gcc version 13.3.0 下会编译失败。Ubuntu 18.04 的 gcc 默认版本为 7.5.0。
应用程序
通过 buildroot/output/rockchip_rk3566/.config 的 BR2_ROOTFS_OVERLAY 值可知,board/rockchip/rk356x/fs-overlay/的内容在制作镜像时,会被打包进去。所以我们一些系统性的脚本可以放这里,例如 /etc/init.d 下的服务管理脚本
字体文件(.ttf)可以放在 /usr/share/fonts 目录下。
应用开机全屏
因为我们使用的是 wayland weston 作为图形后端,而希望板子上电启动后,直接从开机 logo 切换到 我们的应用。默认情况是显示开机logo,然后短暂会显示 weston 桌面,然后再显示我们的GUI应用。这时我们可以参考 Rockchip_Developer_Guide_Buildroot_Weston_CN.pdf 所述,启动 weston 时短暂冻结Weston屏幕内容 :
start_weston() {
/usr/bin/weston --warm-up&
}
RGB三色灯的驱动和控制
泰山派的驱动文档介绍不咋全面,为了快速学习。我们结合设备树文件 kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dts 和以前在百问网学习的一点驱动基础知识做深化学习。
由 device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk 的变量 RK_KERNEL_DTS 指定设备树文件
curl https://storage.googleapis.com/git-repo-downloads/repo