编译Ubuntu22.04笔记
0 系统环境
运行在VMWare 虚拟机内的Ubuntu 22.04 LTS
R7 5800H 3.2GHz
8核16GB内存
150GB磁盘空间
1 编译前准备
本教程是在立创开发板官方百度网盘下载泰山派SDK并同步过repo的基础上进行的,若还未下载泰山派SDK,请移步教程https://wiki.lckfb.com/zh-hans/tspi-rk3566/project-case/fat-little-cell-phone/sdk-compile.html#linux-sdk
泰山派SDK存放位置为 ~/tspi/
1.1 下载并解压Rockchip Ubuntu SDK
前去https://github.com/Joshua-Riek/linux-rockchip/tree/jammy ,下载linux-rockchubuntu 5.10.0 -1012.12
下载完成后,解压
unzip jammy.zip将tspi目录下原来的kernel重命名为kernel_old。
mv ./tspi/kernel ./tspi/kernel_old将解压出的文件夹移动到泰山派SDK目录下,并重命名为kernel
mv linux-rockchip-jammy/ tspi/kernel1.2 复制泰山派设备树文件
将之前的kernel_old 下的tspi开头的设备树文件复制到新的kernel下
cp ~/tspi/kernel_old/arch/arm64/boot/dts/rockchip/tspi* ~/tspi/kernel/arch/arm64/boot/dts/rockchipcd ~/tspi/kernel/arch/arm64/boot/dts/rockchip编辑Makefile,
vim ~/tspi/kernel/arch/arm64/boot/dts/rockchip/Makefile新增一行:
dtb-$(CONFIG_ARCH_ROCKCHIP) += tspi-rk3566-user-v10-linux.dtb并保存退出
1.3 修改menuconfig
1.3.1 触摸屏
进入kernel目录
cd kernel
make ARCH=arm64 menuconfig找到
Device Drivers
-> Input device support
-> Generic input layer (needed for keyboard, mouse, ...) (INPUT [=y])
-> Touchscreens (INPUT_TOUCHSCREEN [=y])按Y键使能触摸屏 
1.3.2 WIFI
参考 https://blog.csdn.net/qq_65198598/article/details/145430241
搜索 AP6,按下1进入对应配置页面 
修改固件以及NVRAM路径,这里是指Ubuntu系统内的路径,后文会说如何将固件复制进去。 Firmware path和NVRAM path分别修改为
/lib/firmware/fw_bcm43438a1.bin
/lib/firmware/nvram_ap6212a.txt
1.3.3 GPU
(1)将Device Drivers > Graphics support > Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)下的Ignore drm ioctl permission 标记为 N

(2)将Device Drivers > Graphics support > Search (Panfros) > Graphics support下的Panfrost (DRM support for ARM Mali Midgard/Bifrost GPUs) 标记为 Y

(3)打开~/tspi/kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-core-v10.dtsi 将cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>; 这一行注释掉。 
(4)在GPU图像处理下新增两行:
clock-names = "gpu", "bus";
interrupt-names = "gpu", "mmu", "job";
1.3.4 保存退出
完成后保存 

退出后输入
make ARCH=arm64 savedefconfig
mv defconfig arch/arm64/configs/rockchip_linux_defconfig1.4 复制触摸驱动
将屏幕卖家给的屏幕驱动GT911_Config_08121A1_V90.cfg 复制到~/tspi/kernel/drivers/input/touchscreen/gt9xx/ 目录下
并在gt9xx_cfg.h中修改gtp_dat_9_7数组内容为
#include "GT911_Config_08121A1_V90.cfg"
1.5 安装GCC交叉编译工具
前往https://developer.arm.com/downloads/-/gnu-a/10-2-2020-11 下载gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
并将其解压至 ~/ 目录下
tar -xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
1.6 配置环境变量
编辑 ~/.bashrc
vim ~/.bashrc在文件最后新增三行
export ARCH=arm64
export CROSS_COMPILE=aarch64-none-linux-gnu-
export PATH=$PATH:/home/vrxiaojie/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin然后保存退出文件,使环境变量生效。
source ~/.bashrc可以使用
aarch64-none-linux-gnu-gcc -v查看是否能正确找到gcc编译器,若出现下图所示则为成功 
2 编译系统
2.1 编译SDK并打包固件
在~/tspi目录下执行全量编译
./build.sh all若为首次编译,按我的笔记本电脑配置需要约3小时。后续全量编译只需要十几分钟,若只是单独编译kernel等内容,则只需几分钟。 
在rockdev目录下生成.img镜像文件
./mkfirmware.sh
其中的rootfs相关文件需要被替换成RK版Ubuntu镜像文件,在后文会讲到。 
2.2 下载Ubuntu Base
前往源站 https://cdimage.ubuntu.com/ubuntu-base/releases/jammy/release/ 或前往镜像站https://mirrors.aliyun.com/ubuntu-cdimage/ubuntu-base/releases/22.04/release/ (速度较快)下载ubuntu-base-22.04.5-base-arm64.tar.gz 
在 ~/ 下新建一个ubuntu文件夹,并将压缩包解压至此
mkdir ~/ubuntu_rootfs
tar -xzvf ubuntu-base-22.04.5-base-arm64.tar.gz -C ~/ubuntu_rootfs/2.3 将WIFI固件复制进Ubuntu
为了使上面配置menuconfig的WIFI模块生效
sudo cp ~/tspi/external/rkwifibt/firmware/broadcom/AP6212A1/wifi/nvram_ap6212a.txt ~/ubuntu_rootfs/lib/firmware
sudo cp ~/tspi/external/rkwifibt/firmware/broadcom/AP6212A1/wifi/fw_bcm43438a1.bin ~/ubuntu_rootfs/lib/firmware2.4 安装模块至rootfs中
在 ~/tspi/kernel目录下编译模块
make modules
接着安装模块至ubuntu rootfs
make ARCH=arm64 modules_install INSTALL_MOD_PATH=../../ubuntu_rootfs
用ls命令能看到ubuntu_rootfs/lib/modules目录下多出了一个带数字的文件夹5.10.209,文件夹内包含了刚安装的模块

2.5 配置并挂载Ubuntu
以下内容参考 https://www.jlc-bbs.com/platform/a/310346
(1)在当前编译环境中安装仿真开发环境,
sudo apt install qemu-user-static(2)将当前编译环境中的仿真开发环境复制到目标系统文件夹
sudo cp /usr/bin/qemu-aarch64-static ubuntu_rootfs/usr/bin/(3)将当前编译环境中的网络配置文件复制到目标系统文件夹
sudo cp /etc/resolv.conf ubuntu_rootfs/etc/(4)修改目标系统中的软件源配置文件
sudo vim ubuntu_rootfs/etc/apt/sources.list将该文件原先的内容删掉,替换为以下内容:
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu-ports/ jammy-backports main restricted universe multiverse(5)编写挂载脚本
sudo vim mount.sh加入以下内容:
#!/bin/bash
function mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
#sudo mount -t devpts -o gid=5,mode=620 devpts ${2}dev/pts
sudo mount -o bind /dev/pts ${2}dev/pts
sudo chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev/pts
sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ];
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with tralling '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : $[2]
fi(6)添加脚本执行权限
sudo chmod +x mount.sh(7)挂载根文件系统
./mount.sh -m ubuntu_rootfs/注意: 当完成根文件系统挂载后,后续命令将在根文件系统中执行,直至根文件系统被卸载(后文会提及如何卸载)
2.6 在根文件系统中安装必要的软件
(1)更新安装软件包列表
apt update若在使用该命令时遇到问题:

其原因是/tmp文件夹的权限错误,只需使用chmod为/tmp赋777权限
chmod 777 /tmp
apt clean
apt update(2)更新和升级软件包
apt upgrade(3)在目标系统中安装必要的软件
apt install -y sudo vim udev net-tools ethtool udhcpc netplan.io language-pack-en-base iputils-ping openssh-sftp-server ntp usbutils alsa-utils libmtp9 language-pack-zh-han* bluetooth* bluez* blueman* wireless-tools network-manager dialog chromium-browser安装过程中会提示配置地区和时区,输入6 选择Asia 
接着输入70选择Shanghai 
(4)为了实现屏幕显示,安装桌面环境 ubuntu-desktop 注意,此过程相当耗时,如有提示缺少依赖,可用apt单独安装依赖后,继续安装桌面环境。
apt install ubuntu-desktop -y中途会让选择键盘布局,这里输入19,选择Chinese 
继续选择中文键盘布局 1
(5)卸载办公套件并清除相关配置文件
apt-get remove --purge libreoffice* -y(6)清理无用的软件
sudo apt autoremove(7)清理apt
sudo apt clean2.7 添加用户及启动配置
(1)在目标系统中添加用户
adduser vrxiaojie(2)为用户添加管理员权限
adduser vrxiaojie sudo(3)修改root用户密码
passwd root2.8 修改开机等待网络延迟时间
默认情况下,系统启动过程中会出现“A start job is running for wait for network to be Configured”的提示信息,然后开始倒计时5分钟,需要等待倒计时结束后才能继续启动系统,通过修改配置文件,将倒计时时间缩短到5秒或关闭倒计时。
vim /etc/systemd/system/network-online.target.wants/systemd-networkd-wait-online.service修改的配置文件内容:
ExecStart=/usr/bin/nm-online -s -q --timeout=02.9 添加分区释放的系统服务(重要)
默认情况下,rootfs分区烧录后,只有固件本身大小。通过添加系统服务,实现分区释放。 (1)修改配置文件
vim /etc/init.d/resize2fs.sh修改的配置文件内容:
#!/bin/bash -e
# resize filesystem mmcblk0p6
if [ ! -e "/usr/local/boot_flag" ] ;
then
echo "Resizing /dev/mmcblk0p6..."
resize2fs /dev/mmcblk0p6
touch /usr/local/boot_flag
fi(2)添加配置文件执行权限
chmod +x /etc/init.d/resize2fs.sh(3)创建执行上述脚本的系统服务
vim lib/systemd/system/resize2fs.service添加内容:
#start
[Unit]
Description=Setup rockchip platform environment
Before=lightdm.service
After=resize-helper.service
[Service]
Type=simple
ExecStart=/etc/init.d/resize2fs.sh
[Install]
WantedBy=multi-user.target
#end2.10 退出并卸载根文件系统
(1)退出根文件系统
exit(2)卸载根文件系统
sudo ./mount.sh -u ubuntu_rootfs/3 制作rootfs.img并烧录
3.1 制作文件系统rootfs分区
(1)创建空镜像文件
sudo dd if=/dev/zero of=ubuntu_rootfs.img bs=1M count=8192备注
镜像文件的大小需要大于上述根文件系统所在文件夹ubuntu_rootfs的整体大小,可以通过du命令查看ubuntu_rootfs文件夹的大小,然后通过设置count项的值,配置合适的镜像文件大小。
(2)将创建的镜像文件格式化为.ext4文件系统
sudo mkfs.ext4 ubuntu_rootfs.img(3)新建一个文件夹,用于挂载
sudo mkdir ubuntu_base_rootfs(4)为上述文件夹添加权限
sudo chmod 777 ubuntu_base_rootfs(5)将创建的空白镜像文件挂载到上述文件夹
sudo mount ubuntu_rootfs.img ubuntu_base_rootfs(6)将之前根文件系统所在文件夹内容全部复制到新建的空文件夹
sudo cp -rfp ubuntu_rootfs/* ubuntu_base_rootfs/(7)卸载镜像文件
sudo umount ubuntu_base_rootfs/(8)修复及检测镜像文件系统
sudo e2fsck -p -f ubuntu_rootfs.img(9)压缩镜像文件的大小
sudo resize2fs -M ubuntu_rootfs.img(10)查看镜像文件的大小
sudo du -sh ubuntu_rootfs.img(11)删除原rockdev下的rootfs.ext4和rootfs.img
rm ~/tspi/rockdev/rootfs.*(12)将刚刚创建的ubuntu_rootfs.img 移动到rockdev下并重命名为rootfs.img
mv ubuntu_rootfs.img ~/tspi/rockdev/rootfs.img3.2 烧录所有的img镜像至泰山派
在电脑端打开瑞芯微开发工具。若不知道如何通过工具烧录,参考https://wiki.lckfb.com/zh-hans/tspi-rk3566/sdk-compilation/linux-compilation.html#下载分散镜像
将泰山派用USB线连接到电脑,按住REC按键不放的同时,按下RST键,等待30秒左右,即可在开发工具中看到“发现一个LOADER设备”
除了backup以外的镜像均勾选上,并选择对应路径,点击烧录。 
4 扩容分区(可选)
参考:https://www.bilibili.com/opus/965804309452161045
默认的/dev/root大小才5GB,剩余空间仅900MB,完全不够用,因此,需要做扩容分区。
(1)打开rockdev下的parameter.txt,该文件是软链接到device/rockchip/rk356x/parameter-buildroot-fit.txt的。
说明
关注CMDLINE这行,格式为size@addr(name),其中size表示该分区大小,addr表示该分区起始地址,name表示分区名。注意的是,这里以512B为单位的而非1024B,所以rootfs的0x00c00000是12582912B/1024/1024/512B*1024B = 6GB,想要修改成12GB就是0x01800000 。
重点修改CMDLINE这行,注意修改rootfs的大小、oem和userdata的地址:
0x01800000@0x00058000(rootfs),0x00040000@0x01858000(oem),-@0x01898000(userdata:grow)
(2)打开官方下载工具,重新加载parameter文件,然后重新下载rootfs、oem、userdata分区
或者是执行命令打包镜像直接升级
./build.sh updateimg(3)烧录进去使用df -h命令查看,发现/dev/root分区并没有扩容,需要使用调整文件系统大小命令resize2fs调整到最大大小。
sudo resize2fs /dev/mmcblk0p6
5 最终效果
连接WIFI界面

系统信息界面,正确识别了Mali G52 GPU
