Rockchip Uboot 自定义分区以及启动
- RK uboot 提供了默认的文件系统分区以及启动命令。但其包含的功能过多,因此考虑精简一下,实现一个简单易用的版本。
精简版本
-
能正常引导系统启动,能提供可进入备份文件系统以及用户文件系统的机制即可。
-
以 rv1126 为例,parameter.txt 如下:
FIRMWARE_VER: 8.1 MACHINE_MODEL: RV1126 MACHINE_ID: 007 MANUFACTURER: RV1126 MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 0xffffffff CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x1f80@0x64(miniloader),0x400@0x1fc0(ubootenv),0x2000@0x4000(uboot),0x10000@0x6000(boot),0x100000@0x16000(recovery),-@0x116000(rootfs:grow) uuid:miniloader=85603d09-b7b9-408d-81f4-d13f0ba644fd uuid:ubootenv=4dabbbe2-c20d-42a5-88df-af53b87dc23b uuid:uboot=553f00e8-9c96-4bdc-bf96-948911ba83c5 uuid:boot=09dbe94d-f053-49bf-91f1-7d59b67f5912 uuid:recovery=08fbfe69-86f7-48f3-b263-299652d1d767 uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
-
分区以及分区说明如下:
分区 分区说明 miniloader uboot 前级loader ubootenv 存储 uboot 环境变量 uboot uboot 镜像文件 boot kernel 镜像文件 recovery 备份文件系统 rootfs 用户文件系统
更改启动命令
-
修改文件
include/configs/rv1126_common.h
,将RKIMG_BOOTCOMMAND
更改为:#define RKIMG_BOOTCOMMAND \ "if test ${devnum} = 1; then " \ "if test ${boot_recovery} = 1; then " \ "echo boot from SDCART (recovery);" \ "setenv part_uuid ${sd_recovery_uuid};" \ "elif test ${boot_recovery} = 0; then " \ "echo boot from SDCART (system);" \ "setenv part_uuid ${sd_rootfs_uuid};" \ "fi;" \ "run boot_fat;" \ "elif test ${devnum} = 0; then " \ "if test ${boot_recovery} = 1; then " \ "echo boot from EMMC (recovery);" \ "setenv part_uuid ${mmc_recovery_uuid};" \ "elif test ${boot_recovery} = 0; then " \ "echo boot from EMMC (system);" \ "setenv part_uuid ${mmc_rootfs_uuid};" \ "fi;" \ "run boot_fat;" \ "fi;"
-
简要说明:启动时会先读取 devnum 的值,如果 devnum 的值为 0,则表示从 mmc 启动,为 1 则表示从 sd 卡启动,然后读取 boot_recovery 的值,如果其为 1,则设置 part_uuid 的值为备份文件系统的 uuid,否则设置其为用户文件系统的 uuid,然后运行 boot_fat 命令启动内核。
-
boot_fat 命令如下:
#define CONFIG_EXTRA_ENV_SETTINGS \ ENV_MEM_LAYOUT_SETTINGS \ "sd_recovery_uuid=e3bdc195-fe43-45d7-bf7b-64229576ef1d\0" \ "sd_rootfs_uuid=aa51a91d-003c-4b31-b127-f4d58c92cefe\0" \ "mmc_recovery_uuid=08fbfe69-86f7-48f3-b263-299652d1d767\0" \ "mmc_rootfs_uuid=614e0000-0000-4b53-8000-1d28000054a9\0" \ "boot_recovery=0\0" \ "load_kernel=fatload ${devtype} ${devnum}:${bootpart} ${kernel_addr_r} ${kernel_img}\0" \ "load_fdt=fatload ${devtype} ${devnum}:${bootpart} ${fdt_addr_r} ${fdt_img}\0" \ "bootargs1=earlycon=uart8250,mmio32,0xff570000,115200n8 console=ttyFIQ0,1500000n8\0" \ "bootfat=setenv bootargs ${bootarg1} rootwait root=PARTUUID=${part_uuid} rw rootfstype=ext4;" \ "setenv kernel_img rv1126.zImage;" \ "setenv fdt_img rv1126.dtb;" \ "setenv bootpart 3;" \ "run load_kernel;" \ "run load_fdt;" \ "bootz ${kernel_addr_r} - ${fdt_addr_r}\0" \ ROCKCHIP_DEVICE_SETTINGS \ RKIMG_DET_BOOTDEV \ BOOTENV
-
简要说明:首先设置 bootargs 变量,填充该变量的 part_uuid 字段,该变量会作为命令行参数传递给内核,然后使用 fatload 命令从文件系统的第3个分区加载内核和设备树至内存中,最后使用 bootz 命令启动内核。
-
如果需要从备份文件系统启动,则只需要在内核启动完成后,使用 fw_setenv 命令设置 boot_recovery 的值为 1 即可。