跳到主要内容

泰山派RK3566开发板笔记

阅读量: 101
阅读人次: 102

官方给的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 的选项添加如下内容:

buildroot/configs/rockchip_rk3566_defconfig
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.mkConfig.in 文件。原因有以下几点:

  • 我比较熟悉 Boost 库的构建。
  • 其构建步骤也非常简单,其构建工具 B2 为自编译。所以整个构建最简依赖只有 GCC 编译器工具链。
  • 因为其使用 B2 作为构建工具,Buildroot 没有为其提供 pkg-cmake.mkpkg-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 包。

buildroot/package/qt6/qt6.mk
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

更换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

目前如下配置不支持,原因还不知道:

/etc/xdg/weston/weston.ini
[output]
name=DSI-1
transform=rotate90

结合上述结论,可以修改 buildroot/package/weston/S49weston 文件,加入 在 start_weston() 函数开头加上 echo "output:all:rotate270" > /tmp/.weston_drm.conf

背景图、隐藏状态栏

修改 weston 配置文件:

buildroot/board/rockchip/common/base/etc/xdg/weston/weston.ini
[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。

.repo/manifests/rk356x_linux_tspi_release.xml
<?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.pdf8.1.3 系统分区说明 说到:

  • oem 分区:给⼚家使⽤,存放⼚家的 APP 或数据。挂载在 /oem ⽬录。
  • userdata 分区:供 APP 临时⽣成⽂件或给最终⽤⼾使⽤,挂载在 /userdata ⽬录下。

在执行 ./mkfirmware.sh 时,即可打包 oem 和 userdata 分区镜像。这两个分区镜像的配置文件为 device/rockchip/rk356x/BoardConfig-rk3566-tspi-v10.mk。重点关注 RK_OEM_DIRRK_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/.configBR2_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屏幕内容 :

/etc/init.d/S49weston
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