8. 引导系统从固态硬盘启动¶
本章节将介绍如何制作固态启动镜像包、如何烧录镜像到固态硬盘并从固态硬盘启动系统。
与从eMMC或SD卡启动系统相比,从固态硬盘启动系统有以下好处:
更高的读写速度
更大的存储空间
更好的耐用性
更高的性能稳定性
软件运行更流畅
8.1. 实现机制¶
由于瑞芯微的芯片不支持直接从芯片内部的BootRom初始化、识别固态硬盘,需要BootRom先从SPI NOR Flash/eMMC/SD中读取固件启动运⾏,包含DDR初始化和SPL, SPL完成后再启动uboot,而在uboot阶段可初始化PCIE/SATA外设。
因此,需要将固件烧录到SPI NOR Flash/eMMC/SD中,启动到uboot阶段,再初始化固态硬盘,最后引导系统从固态硬盘启动。
由于鲁班猫板卡默认都没有SPI NOR Flash或有预留接口没有贴芯片,因此,只介绍如何通过eMMC/SD引导系统从固态硬盘中启动。
8.2. 引导系统从msata固态启动¶
对于使用rk3566、rk3576、rk3588s主控芯片的鲁班猫系列板卡,没有M.2接口,无法使用M.2固态硬盘,但是有MINI PCIE接口,而MINI PCIE接口信号可复用为sata信号,可接msata固态硬盘。
对于使用rk3568、rk3588主控芯片的鲁班猫系列板卡,有M.2接口,因此不考虑使用msata固态,而使用PCIE协议的M.2固态。
目前已支持从msata固态启动的板卡:
LubanCat-1
LubanCat-1IO
LubanCat-1H
LubanCat-3
LubanCat-3IO
LubanCat-4
提示
如果某鲁班猫板卡不在以上列表,但希望添加支持从msata固态启动系统,请联系淘宝技术支持进行反馈。
8.2.1. 制作固态启动镜像包¶
8.2.1.1. 重新编译uboot¶
由于默认配置文件是没有支持sata相关配置的,因此发布的通用镜像默认不能在uboot阶段初始化msata固态硬盘。 如果需要支持初始化msata固态硬盘需要使用对应的msata配置文件重新编译uboot。
注意
编译uboot源码需要借助SDK源码,请根据前面构建系统镜像章节获取对应板卡的SDK源码。
8.2.1.1.1. 获取uboot源码¶
野火uboot源码地址: https://github.com/LubanCat/u-boot/tree/main
支持msata启动的分支为 main 分支,sdk源码中的uboot源码不一定使用该分支,因此需要替换uboot源码。
1 2 3 4 5 | #进入sdk源码根目录,重命名原uboot源码
mv u-boot u-boot-old
#获取main分支的uboot源码
git clone --depth=1 -b main https://github.com/LubanCat/u-boot.git
|
板卡配置文件位于uboot源码/configs目录下,对应的配置文件如下:
rk3566系列:lubancat-rk3566-msata_defconfig
rk3576系列:lubancat-rk3576-msata_defconfig
rk3588s系列:lubancat-4-rk3588s-msata_defconfig
8.2.1.1.2. 获取编译工具链¶
SDK自带编译工具链,但是通过uboot源码中的make.sh脚本手动编译uboot时,脚本中指定了以下变量:
1 2 3 | CROSS_COMPILE_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-linux-gnu-"
|
因此,需要使用6.3.1版本的交叉编译工具链,但是不是每个SDK都带这个工具链,SDK中的工具链位于 SDK源码/prebuilts/gcc/linux-x86/aarch64/
目录下,
如果没有6.3.1版本的交叉编译工具链,可以执行以下命令获取工具链,或者修改make.sh脚本指定使用SDK源码中带有的工具链。
1 2 3 4 5 | #从SDK根目录进入工具链目录
cd prebuilts/gcc/linux-x86/aarch64/
#获取6.3.1版本工具链
git clone --depth=1 https://github.com/LubanCat/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.git
|
8.2.1.1.3. 编译uboot源码¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #进入uboot源码根目录
cd u-boot
#清除旧编译输出
make clean
#根据板卡配置文件名称进行编译,配置文件名称为xxx_defconfig,则编译为./make.sh xxx
#以rk3566系列为例
./make.sh lubancat-rk3566-msata
#以rk3576系列为例
./make.sh lubancat-rk3576-msata
#以rk3588s系列为例
./make.sh lubancat-4-rk3588s-msata
|
编译成功后在uboot源码根目录生成名为 uboot.img
的文件,该文件就是我们需要的支持msata的uboot镜像文件。

8.2.1.2. 重新编译内核设备树¶
由于内核主设备树默认配置MINI PCIE接口的功能为PCIE,不能识别msata固态硬盘,因此需要切换为SATA功能。
8.2.1.2.1. 开启sata节点¶
rk3566系列的MINI PCIE接口对应设备树节点为:
pcie2x1、sata2
rk3576系列的MINI PCIE接口对应设备树节点为:
pcie0、sata0
rk3588系列的MINI PCIE接口对应设备树节点为:
pcie2x1l2、sata0
以LubanCat-1板卡为例,对应主设备树名称为 rk3566-lubancat-1.dts
,修改 sdk源码/kernel/arch/arm64/boot/dts/rockchip/rk3566-lubancat-1.dts
在主设备树找到pcie2x1节点,修改内容如下:
1 2 3 4 5 6 7 8 9 10 11 | &pcie2x1 {
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>;
disable-gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
vpcie3v3-supply = <&pcie2_3v3>;
status = "disabled";
};
&sata2 {
vpcie3v3-supply = <&pcie2_3v3>;
status = "okay";
};
|
也就是将pcie2x1节点disabled,然后添加sata2节点使能,其中sata2节点的vpcie3v3-supply引用的电源要和pcie2x1节点的一致,修改完成后如下图所示:

8.2.1.2.2. 编译设备树¶
借助LubanCat-SDK提供的编译环境,我们在编译kernel镜像的同时也会编译对应的设备树。
在LubanCat-SDK根目录下运行以下命令编译内核:
1 2 | # 编译kerneldeb文件
./build.sh kerneldeb
|
也可以参照驱动手册的 使用内核的构建脚本编译设备树 章节单独编译设备树。
编译得到的与设备树源码相同目录下,相同名称以.dtb结尾的文件就是我们需要的设备树dtb文件。

8.2.1.3. 解包发布镜像并重新打包¶
为了方便我们不重新编译镜像,而是使用野火发布的通用镜像进行解包,解包后替换并修改一些组件,再重新打包成完整镜像,从而得到支持固态启动镜像包。
8.2.1.3.1. 解包镜像¶
注意
解包镜像需要在Linux环境使用Linux_Pack_Firmware根据进行解包,不要在windows解包。
访问资料网盘/6-开发软件/,获取Linux_Pack_Firmware_v2.29.zip
将Linux_Pack_Firmware_v2.29.zip解压到Linux PC或虚拟机中。
1 2 | #解压
unzip Linux_Pack_Firmware_v2.29.zip
|
访问资料网盘获取需要的系统镜像,传到Linux_Pack_Firmware/rockdev目录下。
以LubanCat-1的Debian xfce镜像为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #进入工具目录
cd Linux_Pack_Firmware/rockdev/
#解压镜像,根据实际压缩包名称而定
7z x lubancat-rk3566-debian10-xfce-20250303_update.7z
#重命名镜像为update.img,根据实际镜像名称而定
mv lubancat-rk3566-debian10-xfce-20250303_update.img update.img
#解包镜像
./unpack.sh
#解包镜像的到output目录
#查看output目录
ls output
#信息输出如下
boot.img MiniLoaderAll.bin package-file parameter.txt rootfs.img uboot.img
|
8.2.1.3.2. 替换和修改镜像组件¶
8.2.1.3.2.1. 替换uboot.img¶
将前面编译uboot源码生成的uboot.img替换解包生成uboot.img
1 2 | #替换uboot.img,根据自己的实际路径确定
cp -f ~/LubanCat_Linux_rk356x_SDK/u-boot/uboot.img ~/Linux_Pack_Firmware/rockdev/output/
|
8.2.1.3.2.2. 修改boot.img¶
由于通用镜像默认没有支持引导启动msata配置,因此需要进行修改,引导配置位于boot.img中的boot.scr, 又因为boot.scr是由boot.cmd生成的,所以我们要修改的是boot.img中的boot.cmd,然后生成boot.scr。
1 2 3 4 5 6 7 8 | #进入解包输出目录
cd Linux_Pack_Firmware/rockdev/output/
#挂载boot.img
sudo mount boot.img /mnt
#修改boot.cmd
sudo vi /mnt/boot.cmd
|
将boot.cmd的内容替换为以下内容,与原文件差异内容为以下高亮部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | echo [boot.cmd] run boot.cmd scripts ...;
sata_boot=1
if test "$sata_boot" = "1"; then
setenv devnum_old ${devnum}
scsi scan
if test "$board" =~ "3588" -o "$board" =~ "3576"; then
setenv devnum 1
else
setenv devnum 0
fi
scsi device ${devnum}
if test $? -eq 0; then
setenv devtype scsi
setenv rootfspart /dev/sda3
if test ! -e ${devtype} ${devnum}:${distro_bootpart} /rk-kernel.dtb; then
rockusb 0 scsi ${devnum}
fi
else
setenv devnum ${devnum_old}
setenv rootfspart /dev/mmcblk${devnum}p3
fi
else
setenv rootfspart /dev/mmcblk${devnum}p3
fi
if test -e ${devtype} ${devnum}:${distro_bootpart} /uEnv/uEnv.txt; then
echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt ...;
load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt;
echo [boot.cmd] Importing environment from ${devtype} ...
env import -t ${env_addr_r} 0x8000
setenv bootargs ${bootargs} root=${rootfspart} boot_part=${distro_bootpart} ${cmdline}
printenv bootargs
echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r} ...
load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r}
echo [boot.cmd] loading ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r} ...
load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r}
echo [boot.cmd] loading default rk-kernel.dtb
load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /rk-kernel.dtb
fdt addr ${fdt_addr_r}
fdt set /chosen bootargs
echo [boot.cmd] dtoverlay from /uEnv/uEnv.txt
setenv dev_bootpart ${devnum}:${distro_bootpart}
dtfile ${fdt_addr_r} ${fdt_over_addr} /uEnv/uEnv.txt ${env_addr_r}
echo [boot.cmd] [${devtype} ${devnum}:${distro_bootpart}] ...
echo [boot.cmd] [booti] ...
booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
fi
echo [boot.cmd] run boot.cmd scripts failed ...;
# Recompile with:
# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
|
以上修改的意思是:
第3-5行,判断sata_boot变量是否为1,如果为1,则支持从msata启动,如果为0则恢复默认启动方式从eMMC/SD启动。
第7行,devnum是启动介质的设备号,先记录原来的devnum,如果没有扫描到msata设备还需要更改回原来的值。
第8行,扫描sata设备。
第11-15行,判断是否是3588或者3576,如果是则设置devnum为1,否则设置为0
第17-21行,如果扫描到sata设备则设置启动类型为scsi,设备号为0,文件系统分区为/dev/sda3
第23-25行,判断msata硬盘boot分区是否存在rk-kernel.dtb,如果不存在则说明msata固态中没有镜像,引导进入烧录模式,可将镜像直接烧录到msata固态。
第44行:引用rootfspart的变量设置根文件系统挂载分区。
修改完成boot.cmd和保存退出,然后执行以下命令生成boot.scr
1 | sudo mkimage -C none -A arm -T script -d /mnt/boot.cmd /mnt/boot.scr
|
由于uboot启动读取的内核设备树是boot.img的 rk-kernel.dtb
,默认是通用设备树(没有开启sata接口),系统第一次启动后会软连接到dtb目录下实际的设备树。
因此,需要将前面编译设备树源码生成的dtb替换 rk-kernel.dtb
和dtb目录下实际的设备树,从而启用sata接口,以下以LubanCat-1为例:
1 2 3 4 5 6 7 8 9 10 | #前面已经将boot.img挂载到/mnt
#替换rk-kernel.dtb,根据实际路径和板卡实际设备树而定
sudo cp -f ~/LubanCat_Linux_rk356x_SDK/kernel/arch/arm64/boot/dts/rockchip/rk3566-lubancat-1.dtb /mnt/rk-kernel.dtb
#替换dtb目录下实际的设备树,根据实际路径和板卡实际设备树而定
sudo cp -f ~/LubanCat_Linux_rk356x_SDK/kernel/arch/arm64/boot/dts/rockchip/rk3566-lubancat-1.dtb /mnt/dtb/
#替换完成后卸载/mnt即可
sudo umount /mnt/
|
8.2.1.3.2.3. 修改rootfs.img¶
由于rk356x系列的4.19内核对应的通用镜像默认没有支持msata系统初始化,因此需要进行修改,系统初始化文件位于rootfs.img的 /etc/init.d/boot_init.sh
。
1 2 3 4 5 6 7 8 | #进入解包输出目录
cd Linux_Pack_Firmware/rockdev/output/
#挂载rootfs.img
sudo mount rootfs.img /mnt
#修改boot_init.sh
sudo vi /mnt/etc/init.d/boot_init.sh
|
修改内容如下:
1 2 | #Boot_Part="${Root_Part::-2}"p2
Boot_Part="${Root_Part::-1}"2
|
修改完成如下图所示:

修改完成后卸载rootfs.img
1 2 | #卸载前面挂载rootfs.img
sudo umount /mnt
|
8.2.1.3.3. 打包镜像¶
替换uboot.img、修改boot.img和rootfs.img后即可打包成支持固态启动镜像包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #进入输出目录
cd Linux_Pack_Firmware/rockdev/output
#打包镜像,根据实际芯片名称而定
#rk356x打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3568 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
#rk3576打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3576 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
#rk3588/rk3588s打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3588 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
|
打包后在output当前目录生成 update_tmp.img
和 update.img
镜像文件,其中 update.img
就是最终打包生成的支持引导msata固态启动的镜像。
8.2.2. 烧录镜像¶
制作完成支持引导msata固态启动的 update.img
镜像后,可将 update.img
烧录至eMMC/SD以及msata固态。
8.2.2.1. 烧录镜像到eMMC/SD¶
因为需要eMMC/SD作为引导,因此需要先将镜像烧录到eMMC/SD,如何烧录系统到eMMC/SD参考以下文档:
8.2.2.2. 烧录镜像到msata固态¶
将镜像烧录到eMMC或SD卡后,再接入msata固态硬盘,启动时会扫描sata设备并判断sata设备中是否存在镜像,如果sata设备中的boot分区不存在rk-kernel.dtb,则判断为不存在镜像,会引导进入烧录模式。
当msata硬盘不存在镜像时,usb烧录口接入usb线会识别到 LOADER
设备,如下图所示:

选择 升级固件
界面,固件选择前面生成的 update.img
,最后点击烧录即可,如下图所示:

烧录完成后,会自动重启,系统启动成功后,执行以下命令查看是否成功从msata固态启动:
1 2 | #查看系统挂载
lsblk
|
引导成功效果如下图所示,其中/dev/sda2为msata固态的boot分区,/dev/sda3为msata固态的rootfs分区。

8.2.2.3. 重新烧录镜像到msata固态¶
msata硬盘带镜像时不会进入烧录模式,如果需要重新烧录msata硬盘,此时需要删除判断文件或者手动引导至烧录模式。
8.2.2.3.1. 通过删除判断文件方式¶
因为启动会判断sata固态中boot分区是否存在rk-kernel.dtb,如果不存在rk-kernel.dtb,则会引导进入烧录模式。
因此,如果需要重新烧录msata硬盘,可删除rk-kernel.dtb,msata启动系统后执行以下命令删除:
1 2 3 4 5 | #删除判断文件
sudo rm /boot/rk-kernel.dtb
#重启
sudo reboot
|
USB烧录口连接电脑,识别到 LOADER
设备后即可重新烧录镜像到msata固态。
8.2.2.3.2. 通过手动引导方式¶
在接入msata硬盘后,板卡Debug接口接串口模块,然后板卡上电,在上电过程中快速按下 ctrl + c
进入uboot命令行模式,在uboot命令行模式输入以下命令:
1 2 3 4 5 | #扫描设备
scsi scan
#进入烧录模式
rockusb 0 scsi 0
|
如下图所示,USB烧录口连接电脑,识别到 LOADER
设备后即可重新烧录镜像到msata固态。

8.3. 引导系统从M.2固态启动¶
对于使用rk3566、rk3576、rk3588s主控芯片的鲁班猫系列板卡,没有M.2接口,无法使用M.2固态硬盘,但是有MINI PCIE接口,而MINI PCIE接口信号可复用为sata信号,可接msata固态硬盘。
对于使用rk3568、rk3588主控芯片的鲁班猫系列板卡,有M.2接口,因此不考虑使用msata固态,而使用PCIE协议的M.2固态。
目前已支持从M.2固态启动的板卡:
LubanCat-2
LubanCat-2IO
LubanCat-5
LubanCat-5IO
注意
其中LubanCat-RK3588系列M.2固态启动系统不适用本文档,请参考 资料网盘/3-Linux镜像/LubanCat-rk3588/Ubuntu系统镜像/通用系统镜像-适用于所有板卡/Ubuntu22.04/m2固态启动
说明进行操作。
提示
如果某鲁班猫板卡不在以上列表,但希望添加支持从M.2固态启动系统,请联系淘宝技术支持进行反馈。
8.3.1. 制作固态启动镜像包¶
8.3.1.1. 重新编译uboot¶
由于默认配置文件是没有支持PCIE相关配置的,因此发布的通用镜像默认不能在uboot阶段初始化M.2固态硬盘。 如果需要支持初始化M.2固态硬盘需要使用对应的PCIE配置文件重新编译uboot。
注意
编译uboot源码需要借助SDK源码,请根据前面构建系统镜像章节获取对应板卡的SDK源码。
8.3.1.1.1. 获取uboot源码¶
野火uboot源码地址: https://github.com/LubanCat/u-boot/tree/main
支持PCIE启动的分支为 main 分支,sdk源码中的uboot源码不一定使用该分支,因此需要替换uboot源码。
1 2 3 4 5 | #进入sdk源码根目录,重命名原uboot源码
mv u-boot u-boot-old
#获取main分支的uboot源码
git clone --depth=1 -b main https://github.com/LubanCat/u-boot.git
|
板卡配置文件位于uboot源码/configs目录下,对应的配置文件如下:
rk3568系列:lubancat-rk3568-pcie_defconfig
8.3.1.1.2. 编译uboot源码¶
1 2 3 4 5 6 7 8 9 | #进入uboot源码根目录
cd u-boot
#清除旧编译输出
make clean
#根据板卡配置文件名称进行编译,配置文件名称为xxx_defconfig,则编译为./make.sh xxx
#以rk3568系列为例
./make.sh lubancat-rk3568-pcie
|
编译成功后在uboot源码根目录生成名为 uboot.img
的文件,该文件就是我们需要的支持PCIE的uboot镜像文件。

8.3.1.2. 解包发布镜像并重新打包¶
为了方便我们不重新编译镜像,而是使用野火发布的通用镜像进行解包,解包后替换并修改一些组件,再重新打包成完整镜像,从而得到支持固态启动镜像包。
8.3.1.2.1. 解包镜像¶
注意
解包镜像需要在Linux环境使用Linux_Pack_Firmware根据进行解包,不要在windows解包。
访问资料网盘/6-开发软件/,获取Linux_Pack_Firmware_v2.29.zip
将Linux_Pack_Firmware_v2.29.zip解压到Linux PC或虚拟机中。
1 2 | #解压
unzip Linux_Pack_Firmware_v2.29.zip
|
访问资料网盘获取需要的系统镜像,传到Linux_Pack_Firmware/rockdev目录下。
以LubanCat-2的Debian xfce镜像为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #进入工具目录
cd Linux_Pack_Firmware/rockdev/
#解压镜像,根据实际压缩包名称而定
7z x lubancat-rk3568-debian10-xfce-20250303_update.7z
#重命名镜像为update.img,根据实际镜像名称而定
mv lubancat-rk3568-debian10-xfce-20250303_update.img update.img
#解包镜像
./unpack.sh
#解包镜像的到output目录
#查看output目录
ls output
#信息输出如下
boot.img MiniLoaderAll.bin package-file parameter.txt rootfs.img uboot.img
|
8.3.1.2.2. 替换和修改镜像组件¶
8.3.1.2.2.1. 替换uboot.img¶
将前面编译uboot源码生成的uboot.img替换解包生成uboot.img
1 2 | #替换uboot.img,根据自己的实际路径确定
cp -f ~/LubanCat_Linux_rk356x_SDK/u-boot/uboot.img ~/Linux_Pack_Firmware/rockdev/output/
|
8.3.1.2.2.2. 修改boot.img¶
由于通用镜像默认没有支持引导启动PCIE配置,因此需要进行修改,引导配置位于boot.img中的boot.scr, 又因为boot.scr是由boot.cmd生成的,所以我们要修改的是boot.img中的boot.cmd,然后生成boot.scr。
1 2 3 4 5 6 7 8 | #进入解包输出目录
cd Linux_Pack_Firmware/rockdev/output/
#挂载boot.img
sudo mount boot.img /mnt
#修改boot.cmd
sudo vi /mnt/boot.cmd
|
将boot.cmd的内容替换为以下内容,与原文件差异内容为以下高亮部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | echo [boot.cmd] run boot.cmd scripts ...;
pcie_boot=1
if test "$pcie_boot" = "1"; then
pci enum
nvme scan
nvme device 0
if test $? -eq 0; then
setenv devtype nvme
setenv devnum 0
setenv rootfspart /dev/nvme0n1p3
if test ! -e ${devtype} ${devnum}:${distro_bootpart} /rk-kernel.dtb; then
rockusb 0 nvme 0
fi
else
setenv rootfspart /dev/mmcblk${devnum}p3
fi
else
setenv rootfspart /dev/mmcblk${devnum}p3
fi
if test -e ${devtype} ${devnum}:${distro_bootpart} /uEnv/uEnv.txt; then
echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt ...;
load ${devtype} ${devnum}:${distro_bootpart} ${env_addr_r} /uEnv/uEnv.txt;
echo [boot.cmd] Importing environment from ${devtype} ...
env import -t ${env_addr_r} 0x8000
setenv bootargs ${bootargs} root=${rootfspart} boot_part=${distro_bootpart} ${cmdline}
printenv bootargs
echo [boot.cmd] load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r} ...
load ${devtype} ${devnum}:${distro_bootpart} ${ramdisk_addr_r} /initrd-${uname_r}
echo [boot.cmd] loading ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r} ...
load ${devtype} ${devnum}:${distro_bootpart} ${kernel_addr_r} /Image-${uname_r}
echo [boot.cmd] loading default rk-kernel.dtb
load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} /rk-kernel.dtb
fdt addr ${fdt_addr_r}
fdt set /chosen bootargs
echo [boot.cmd] dtoverlay from /uEnv/uEnv.txt
setenv dev_bootpart ${devnum}:${distro_bootpart}
dtfile ${fdt_addr_r} ${fdt_over_addr} /uEnv/uEnv.txt ${env_addr_r}
echo [boot.cmd] [${devtype} ${devnum}:${distro_bootpart}] ...
echo [boot.cmd] [booti] ...
booti ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
fi
echo [boot.cmd] run boot.cmd scripts failed ...;
# Recompile with:
# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
|
以上修改的意思是:
第3-5行,判断pcie_boot变量是否为1,如果为1,则支持从pcie启动,如果为0则恢复默认启动方式从eMMC/SD启动。
第6-8行,扫描pcie设备。
第10-13行,如果扫描到pcie设备则设置启动类型为nvme,设备号为0,文件系统分区为/dev/nvme0n1p3
第15-17行,判断pcie硬盘boot分区是否存在rk-kernel.dtb,如果不存在则说明pcie固态中没有镜像,引导进入烧录模式,可将镜像直接烧录到pcie固态。
修改完成boot.cmd和保存退出,然后执行以下命令生成boot.scr
1 | sudo mkimage -C none -A arm -T script -d /mnt/boot.cmd /mnt/boot.scr
|
由于uboot启动读取的内核设备树是boot.img的 rk-kernel.dtb
,默认是通用设备树(可能没有开启PCIE接口),系统第一次启动后会软连接到dtb目录下实际的设备树。
因此,需要将dtb目录下实际的设备树替换 rk-kernel.dtb
从而使第一次启动时启用PCIE接口,以下以rk3568-lubancat-2-v3为例:
1 2 3 4 5 6 7 | #前面已经将boot.img挂载到/mnt
#替换rk-kernel.dtb,根据板卡实际设备树而定
sudo cp -f /mnt/dtb/rk3568-lubancat-2-v3.dtb /mnt/rk-kernel.dtb
#替换完成后卸载/mnt即可
sudo umount /mnt/
|
8.3.1.2.2.3. 修改rootfs.img¶
由于通用镜像默认没有支持pcie系统初始化,因此需要进行修改,系统初始化文件位于rootfs.img的 /etc/init.d/boot_init.sh
。
1 2 3 4 5 6 7 8 | #进入解包输出目录
cd Linux_Pack_Firmware/rockdev/output/
#挂载rootfs.img
sudo mount rootfs.img /mnt
#修改boot_init.sh
sudo vi /mnt/etc/init.d/boot_init.sh
|
修改内容如下:
1 2 | #Boot_Part="${Root_Part::-2}"p2
Boot_Part="${Root_Part::-1}"2
|
修改完成如下图所示:

修改完成后卸载rootfs.img
1 2 | #卸载前面挂载rootfs.img
sudo umount /mnt
|
8.3.1.2.3. 打包镜像¶
替换uboot.img、修改boot.img和rootfs.img后即可打包成支持固态启动镜像包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #进入输出目录
cd Linux_Pack_Firmware/rockdev/output
#打包镜像,根据实际芯片名称而定
#rk356x打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3568 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
#rk3576打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3576 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
#rk3588/rk3588s打包执行
../afptool -pack ./ update_tmp.img || pause
../rkImageMaker -RK3588 MiniLoaderAll.bin update_tmp.img update.img -os_type:androidos || pause
|
打包后在output当前目录生成 update_tmp.img
和 update.img
镜像文件,其中 update.img
就是最终打包生成的支持引导M.2固态启动的镜像。
8.3.2. 烧录镜像¶
制作完成支持引导M.2固态启动的 update.img
镜像后,可将 update.img
烧录至eMMC/SD以及M.2固态。
8.3.2.1. 烧录镜像到eMMC/SD¶
因为需要eMMC/SD作为引导,因此需要先将镜像烧录到eMMC/SD,如何烧录系统到eMMC/SD参考以下文档:
8.3.2.2. 烧录镜像到M.2固态¶
将镜像烧录到eMMC或SD卡后,再接入M.2固态硬盘,启动时会扫描pcie设备并判断pcie设备中是否存在镜像,如果pcie设备中的boot分区不存在rk-kernel.dtb,则判断为不存在镜像,会引导进入烧录模式。
当M.2硬盘不存在镜像时,usb烧录口接入usb线会识别到 LOADER
设备,如下图所示:

选择 升级固件
界面,固件选择前面生成的 update.img
,最后点击烧录即可,如下图所示:

烧录完成后,会自动重启,系统启动成功后,执行以下命令查看是否成功从M.2固态启动:
1 2 | #查看系统挂载
lsblk
|
引导成功效果如下图所示,其中/dev/nvme0n1p2为M.2固态的boot分区,/dev/nvme0n1p3为M.2固态的rootfs分区。

8.3.2.3. 重新烧录镜像到M.2¶
M.2硬盘带镜像时不会进入烧录模式,如果需要重新烧录M.2硬盘,此时需要删除判断文件或者手动引导至烧录模式。
8.3.2.3.1. 通过删除判断文件方式¶
因为启动会判断M.2固态中boot分区是否存在rk-kernel.dtb,如果不存在rk-kernel.dtb,则会引导进入烧录模式。
因此,如果需要重新烧录M.2硬盘,可删除rk-kernel.dtb,M.2启动系统后执行以下命令删除:
1 2 3 4 5 | #删除判断文件
sudo rm /boot/rk-kernel.dtb
#重启
sudo reboot
|
USB烧录口连接电脑,识别到 LOADER
设备后即可重新烧录镜像到M.2固态。
8.3.2.3.2. 通过手动引导方式¶
在接入M.2硬盘后,板卡Debug接口接串口模块,然后板卡上电,在上电过程中快速按下 ctrl + c
进入uboot命令行模式,在uboot命令行模式输入以下命令:
1 2 3 4 5 6 | #扫描设备
pci enum
nvme scan
#进入烧录模式
rockusb 0 nvme 0
|
USB烧录口连接电脑,识别到 LOADER
设备后即可重新烧录镜像到M.2固态。