本教程适用于为YY3568开发板构建Ubuntu 20.04/22.04 Linux(kernel 5.10)固件。构建Ubuntu固件的过程主要分为两部分,分别是
本教程中涉及到的SDK/固件/ROOTFS资料下载地址是:
https://pan.baidu.com/s/1W2WDEoFJLIlduxHmjIypaw?=x4br 提取码: x4br
按照rockchip官方建议,这里采用Ubuntu 22.04(x86_64)作为主机编译环境。此外其他Ubuntu版本也是可以的,具体支持列表如下
sudo apt-get update && sudo apt-get install git ssh make gcc libssl-dev \
liblz4-tool expect expect-dev g++ patchelf chrpath gawk texinfo chrpath \
diffstat binfmt-support qemu-user-static live-build bison flex fakeroot \
cmake gcc-multilib g++-multilib unzip device-tree-compiler ncurses-dev \
libgucharmap-2-90-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu
以上安装命令适用于Ubuntu22.04,其他版本请根据安装包名称采用对应的安装命令,若编译遇到报
错,可以视报错信息,安装对应的软件包。其中:
sudo sed -i '$a 43.154.68.204\tkgithub.com' /etc/hosts
sudo sed -i '$a 43.155.83.75\traw.kgithub.com
objects.githubusercontent.kgithub.com' /etc/hosts
国内用户请从网盘中获取Ubuntu Linux SDK。这里教程对应的是yy3568-ubuntu-linux-sdk-230821.tar.gz。后面有更新的,请最新的包。
链接: https://pan.baidu.com/s/1mEaK6tjmsPyO2z6-9nx4CA?pwd=yy35
提取码: yy35
获取SDK后,本地创建工作目录,比如
$ mkdir yy3568
$ cd yy3568
$ tar -xf ../yy3568-ubuntu-linux-sdk-230821.tar.gz
$ cd sdk
$ git checkout HEAD .
$ export YY_SDK_ROOT=${PWD} # 可选,为后面方面描述方便设置了该环境变量
用户解压完sdk后,进入sdk根目录。直接选择板型编译即可
cd $YY_SDK_ROOT
./build.sh rk3568-yy3568_defconfig
成功后输出大概如下
Switching to defconfig: /xxx/.chip/rk3568-yy3568_defconfig
make: Leaving directory '/xxx/device/rockchip/common'
输入下述命令进入漫长的固件编译流程
cd $YY_SDK_ROOT
./build.sh
需要特别注意的是,由于网络环境的原因,build.sh
经常会构建ubuntu rootfs失败,所以建议用户可以在build.sh
时先忽略rootfs的构建,方法如下(告诉sdk已经存在对应的rootfs)
# 用户也可以使用已经预先制作好的rootfs替换当前dd出来的假个rootfs
$ dd if=/dev/zero of=ubuntu/ubuntu-rootfs-22.04.3.ext4 bs=1M count=100
$ dd if=/dev/zero of=ubuntu/ubuntu-rootfs-20.04.5.ext4 bs=1M count=100
$ ./build.sh
当前SDK已经在${YY_SDK_ROOT}/ubuntu下放了2个预编译好的ubuntu rootfs(仅支持控制台)。用户可以直接基于此rootfs,用chroot的办法直接对它进行定制。
编译buildroot时(recovery使用)会自动联网下载软件包,此时需要保持网络畅通。SDK默认配置的是Ubuntu 20.04,编译过程会自动下载ubuntu-core并制作一个控制台模式的rootfs,路径是${SDK_ROOT}/ubuntu/ubuntu-rootfs-20.04.x.ext4。一般情况下我们制作的ubuntu系统是带桌面环境,后面会有定制ubuntu rootfs的章节。注意:我们不会使用SDK自动生成的ubuntu rootfs,原因是自动生成的rootfs由于网络环境原因,非常容易出错。
固件完成编译后,生成的固件路径为output/RK3568-YY3568/latest/IMAGES/update.img
$ upgrade_tool uf output/RK3568-YY3568/latest/IMAGES/update.img
比如烧录rootfs
$ cd $YY_SDK_ROOT
$ upgrade_tool ul output/firmware/MiniLoaderAll.bin
$ upgrade_tool di -p output/firmware/parameter.txt
$ upgrade_tool di -rootfs output/firmware/rootfs.img #根据实际修改
$ upgrade_tool rd #重启设备
烧录内核
$ cd $YY_SDK_ROOT
$ upgrade_tool ul output/firmware/MiniLoaderAll.bin
$ upgrade_tool di -p output/firmware/parameter.txt
$ upgrade_tool di -b kernel/boot.img
$ upgrade_tool rd #重启设备
请参考debian固件烧录即可,无特殊需求。
$ export YY_UBUNTU_DL_URL=https://mirrors.bfsu.edu.cn/ubuntu-cdimage/ubuntu-base/releases
$ wget ${YY_UBUNTU_DL_URL}/20.04.5/release/ubuntu-base-20.04.5-base-arm64.tar.gz
$ sudo rm -rf ubuntu-20.04-rootfs && mkdir ubuntu-20.04-rootfs
$ sudo tar -xf ubuntu-base-20.04.5-base-arm64.tar.gz -C ubuntu-20.04-rootfs/
$ export YY_UBUNTU_TARGET_DIR=${PWD}/ubuntu-20.04-rootfs
$ sudo mount -t proc proc ${YY_UBUNTU_TARGET_DIR}/proc
$ sudo mount -t sysfs sysfs ${YY_UBUNTU_TARGET_DIR}/sys
$ sudo mount -o bind /dev ${YY_UBUNTU_TARGET_DIR}/dev
$ sudo mount -o bind /dev/pts ${YY_UBUNTU_TARGET_DIR}/dev/pts
$ sudo cp -v /etc/resolv.conf ${YY_UBUNTU_TARGET_DIR}/etc/resolv.conf
$ # sudo cp -v sources.list ${YY_UBUNTU_TARGET_DIR}/etc/apt/sources.list #可选
$ echo "nameserver 8.8.8.8" | sudo tee -a ${YY_UBUNTU_TARGET_DIR}/etc/resolv.conf
$ echo "nameserver 114.114.114.114" |sudo tee -a ${YY_UBUNTU_TARGET_DIR}/etc/resolv.conf
$ sudo chroot ${YY_UBUNTU_TARGET_DIR}
# apt update -y
# apt upgrade -y
# useradd -s '/bin/bash' -r -m -G adm,sudo,plugdev,lpadmin youyeetoo
# passwd youyeetoo # 设置用户密码
# passwd # 设置root用户密码
# apt install -y sudo net-tools systemd udhcpc
# apt install lxqt-* lxqt
# rm -rf /var/lib/apt/lists/*
# rm -rf /var/cache/*
退出文件系统后,请确认新挂载的/dev/pts, /dev, /proc, /sys已经卸载
$ export YY_UBUNTU_TARGET_DIR=${PWD}/ubuntu-20.04-rootfs
$ sudo umount ${YY_UBUNTU_TARGET_DIR}/dev/pts
$ sudo umount ${YY_UBUNTU_TARGET_DIR}/dev
$ sudo umount ${YY_UBUNTU_TARGET_DIR}/sys
$ sudo umount ${YY_UBUNTU_TARGET_DIR}/proc
$ export YY_UBUNTU_TARGET_DIR=${PWD}/ubuntu-20.04-rootfs
$ IMAGE_SIZE_MB=$(( $(sudo du -sh -m ${YY_UBUNTU_TARGET_DIR} | cut -f1) + 500 ))
$ ROOTFSIMAGE=ubuntu-rootfs-${YY_UBUNTU_VER}.ext4
$ echo "Gen rootfs image, size=${IMAGE_SIZE_MB}MB"
$ dd if=/dev/zero of=${ROOTFSIMAGE} bs=1M count=0 seek=${IMAGE_SIZE_MB}
$ sudo mkfs.ext4 -d ${YY_UBUNTU_TARGET_DIR} ${ROOTFSIMAGE}
步骤同20.04,请参考上述流程
Ubuntu 22.04/20.04生成的rootfs名称如下
名称必须一致,由于apt upgrade
后会升级最末为的小版本号,比如20.04.6,但这没有关系。复制rootfs到SDK的ubuntu目录下,然后运行./build.sh
重新生成固件。
我们已经预编译好了一些Ubuntu 20.04/22.04下的deb包,用户下载后直接dpkg -i xxx.deb
即可。比如packages目录下,
为方便定制修改ubuntu固件,用户可以使用rockchip提供的解压固件命令行工具对固件进行解包和重新打包。
比如拿到yy3568-u20-dep-xxx.img.7z固件包后,使用7z把压缩包解压成yy3568-u20-dep-xxx.img,然后使用下述命令对固件进行解包
$ cd $YY_SDK_ROOT
$ mkdir out
$ tools/linux/Linux_Pack_Firmware/rockdev/rkImageMaker -unpack yy3568-u20-dep-xxx.img out
执行完上述命令后,在out目录下生成文件
boot.bin firmware.img
接着使用afptool继续解包
$ tools/linux/Linux_Pack_Firmware/rockdev/afptool -unpack out/firmware.img out
执行成功后,out目录内容如下
$ tree out
out
├── boot.bin
├── firmware.img
├── Image
│ ├── boot.img
│ ├── misc.img
│ ├── oem.img
│ ├── recovery.img
│ ├── rootfs.img
│ ├── uboot.img
│ └── userdata.img
├── MiniLoaderAll.bin
├── package-file
└── parameter.txt
1 directory, 12 files
用户获得以上分区的image后,可以自行定制并重新打包。
可以有2种方式。
$ ./build.sh firmware
参考文件tools/linux/Linux_Pack_Firmware/rockdev/rk356x-mkupdate.sh
,内容如下
#!/bin/bash
pause()
{
echo "Press any key to quit:"
read -n1 -s key
exit 1
}
echo "start to make update.img..."
if [ ! -f "Image/parameter" -a ! -f "Image/parameter.txt" ]; then
echo "Error:No found parameter!"
exit 1
fi
if [ ! -f "package-file" ]; then
echo "Error:No found package-file!"
exit 1
fi
./afptool -pack ./ Image/update.img || pause
./rkImageMaker -RK3568 Image/MiniLoaderAll.bin Image/update.img \
update.img -os_type:androidos || pause
echo "Making ./Image/update.img OK."
#echo "Press any key to quit:"
#read -n1 -s key
exit $?
用户需要自行熟悉相关的命令行工具
用户有时需要在yy3568板子上通过apt-get install xxx
安装软件包或者做一些简单的定制,然后把rootfs image导出并重新生成固件。此时,用户可以先在板子上把系统运行起来,完成定制后用dd命令把末尾分区复制成rootfs.img。生成新的rootfs镜像后,可以参考本文重新生成固件即可。在dd出rootfs.img前建议执行
# rm -rf /var/lib/apt/lists/*
# rm -rf /var/cache/*
这样生成rootfs更见精简。