4.7 uboot开发 - 自定义分区以及启动方案
- ss928 出厂默认的启动方式以及 emmc 默认的分区,不符合需求,考虑自己做一个分区方案以及启动方案。
分区方案
-
分区表如下:
分区 文件系统 分区说明 fastboot - 存放 bootloader ubootenv - 存储 uboot 环境变量 kernel - 存放 kernel 镜像文件 kernel_recovery - 存放 kernel recovery 镜像文件 kernel_repo ext4 存放各种各样的 kernel 镜像文件 rootfs_recovery ext4 用于恢复的文件系统 rootfs ext4 主文件系统 -
对应的 xml 分区表文件如下:
<?xml version="1.0" encoding="GB2312" ?> <Partition_Info ProgrammerFile=""> <Part Sel="1" PartitionName="fastboot" FlashType="emmc" FileSystem="none" Start="0" Length="512K" SelectFile=""/> <Part Sel="1" PartitionName="ubootenv" FlashType="emmc" FileSystem="none" Start="512K" Length="512K" SelectFile=""/> <Part Sel="1" PartitionName="kernel" FlashType="emmc" FileSystem="none" Start="1M" Length="32M" SelectFile=""/> <Part Sel="1" PartitionName="kernel_recovery" FlashType="emmc" FileSystem="none" Start="33M" Length="32M" SelectFile=""/> <Part Sel="1" PartitionName="kernel_repo" FlashType="emmc" FileSystem="ext3/4" Start="65M" Length="256M" SelectFile=""/> <Part Sel="1" PartitionName="rootfs_recovery" FlashType="emmc" FileSystem="ext3/4" Start="321M" Length="1536M" SelectFile=""/> <Part Sel="1" PartitionName="rootfs" FlashType="emmc" FileSystem="ext3/4" Start="1857M" Length="-" SelectFile=""/> </Partition_Info>
-
对应的分区参数如下:
- blkdevparts=mmcblk0:512K(fastboot),512K(ubootenv),32M(kernel),32M(kernel_recovery),256M(kernel_repo),1536M(rootfs_recovery),-(rootfs)
启动方案
-
启动流程图如下:
修改源码
-
文件
include/configs/ss928v100.h
将CONFIG_BOOTCOMMAND
修改为以下内容:#define CONFIG_BOOTCOMMAND \"if test ${boot_recovery} = 1; then " \"echo boot from EMMC (recovery);" \"setenv kernel_blk 0x10800;" \"setenv rootfs_part /dev/mmcblk0p6;" \"elif test ${boot_recovery} = 0; then " \"echo boot from EMMC (system);" \"setenv kernel_blk 0x800;" \"setenv rootfs_part /dev/mmcblk0p7;" \"fi;" \"run boot_mmc;"
-
简要说明:启动时通过判断变量
boot_recovery
的值,来决定需要加载的内核镜像以及挂载的文件系统。如果有条件的话,通过硬件来判断更好。 -
将
CONFIG_EXTRA_ENV_SETTINGS
修改为以下内容:#define CONFIG_EXTRA_ENV_SETTINGS \"boot_recovery=0\0" \"boot_quiet=quiet\0" \"bootarg1=mem=3840M console=ttyAMA0,115200 clk_ignore_unused lpj=240000 rw rootwait rootfstype=ext4 " \"blkdevparts=mmcblk0:512K(fastboot),512K(ubootenv),32M(kernel),32M(kernel_recovery)," \"256M(kernel_repo),1536M(rootfs_recovery),-(rootfs)\0" \"boot_mmc=setenv bootargs ${bootarg1} recovery=${boot_recovery} ${boot_quiet} root=${rootfs_part};" \"mmc read 0 0x50000000 ${kernel_blk} 0x10000; bootm 0x50000000;\0"
-
简要说明:
bootarg1
变量存放不会被修改的内核启动参数,boot_mmc
为真正执行的启动命令,先完善传递给内核的启动参数,然后从相应的地址读取内核镜像并加载内核。