EMMC 双Boot系统操作说明


1. 编译配置

编译uboot、kernel和自动烧录镜像及脚本的配置如下。


1.1. 编译u-boot

make infinity6e_emmc_defconfig

make clean

make j32

生成u-boot.xz.img.bin,把IPLX.bin与该镜像合并成BOOT_PART.bin,就是自动化烧录包boot文件夹里面的BOOT_PART.bin。

cat IPLX.bin u-boot.xz.img.bin > BOOT_PART.bin

1.2. 编译kernel

make infinity6e_emmc_defconfig

make clean

make j32

1.3. 编译自动化烧录镜像及脚本

./setup_config.sh configs/ipc/i6e/emmc.glibc-ext4fs.013a.256.bga

make image-nocheck -j32

注意:

自动化脚本会根据配置文件(参考“自动烧录脚本配置说明”章节)来生成恢复出厂系统的环境变量(GPIO引脚及电平),有可能板子的默认的电平刚好与这个环境变量一致,所以要么设置正确的配置文件,要么把生成的自动化烧录脚本的环境变量注释掉(scripts/set_config的setenv reckeysetenv recargs两行)。


2. 空板升级

板子先跳线到从USB启动,上电,接上USB,正常的话电脑的设备管理器会多出一个USB设备。

双击USBDownloadTool.exe,点击Upgrade Firmware即可实现自动升级eMMC。

升级过程会有如下信息:

完成断电后跳线到eMMC启动,重新上电。


3. uboot下的eMMC命令操作


3.1. eMMC命令说明

以下指令专门用于操作UDA分区自定义分区表:

  • emmc create

    格式:emmc create [name] [size]

    说明:创建分区,name表示分区名称,size代表大小(Bytes)

    示例:创建名为p1的分区,大小为10M

    emmc create p1 0xA00000
    
  • emmc part

    说明:显示分区,格式如下:分区名 分区号 大小\@偏移 (占用空间),大小和偏移的单位为block占用空间单位为Mbytes

    示例:

  • emmc remove

    格式:emmc remove [name]

    说明:删除指定名称的分区

    示例:删除p1分区删除p1分区

    emmc remove p1
    
  • emmc rmgpt

    格式:emmc rmgpt

    说明:删除UDA的所有分区,从分区表去除分区信息,不会擦除UDA分区

  • emmc read.p

    格式:emmc read.p [addr][partition_name][size]

    说明:把分区数据读到内存,addr为内存地址,partition_nam为分区名称,size为拷贝的数据大小(Bytes)

    示例:把p1起始处的0x1000Bytes数据拷贝到内存0x21000000

    emmc read.p 0x21000000 p1 0x1000
    
  • emmc write.p

    格式:emmc write.p [addr][partition_name][size]

    说明:把分区数据读到内存,addr为内存地址,partition_nam为分区名称,size为拷贝的数据大小(Bytes)

    示例:把p1起始处的0x1000Bytes数据拷贝到内存0x21000000

    emmc read.p 0x21000000 p1 0x1000
    
  • emmc write.p.continue

    格式:emmc write.p.continue [addr] [partition_name] [offset] [size]

    说明:把内存数据写到分区的偏移地址处,offset为分区偏移地址(block单位),size为拷贝数据大小(Bytes)

    示例:把分割的三个文件(分别为10M,20M,30M)连续地拷贝到分区p1

    emmc write.p.continue 0x21000000 p1 0x0 0xA00000
    //拷贝0x1400000Bytes数据到p1的block 0x0起始地址
    
    emmc write.p.continue 0x21000000 p1 0x5000 0x1400000 //0x5000=0xA00000/512
    
    emmc write.p.continue 0x21000000 p1 0xF000 0xA00000
    //0xF000=0x5000+0x1400000/512
    
  • emmc read.p.continue

    格式:emmc read.p.continue [addr] [partition_name] [offset] [size]

    说明:把分区偏移offset处的数据拷贝到内存

  • emmc erase.p

    格式:emmc erase.p [name]

    说明:格式化指定分区

    示例:格式化p1分区的数据,格式化后分区数据都为0

    emmc erase.p p1
    
  • emmc erase

    格式:emmc erase

    说明:擦除当前整个分区,例如当前在UDA分区,则擦除整个UDA分区,慎用!


3.2. mmc命令说明

eMMC 的每一个硬件分区的存储空间都是独立编址的,即访问地址为 0 - partition size。具体的数据读写操作实际访问哪一个硬件分区,是由 eMMC 的 Extended CSD register 的 PARTITION_CONFIG Field 中 的 Bit[2:0]: PARTITION_ACCESS 决定的,用户可以通过配置 PARTITION_ACCESS 来切换硬件分区的访问。也就是说,用户在访问特定的分区前,需要先发送命令,配置 PARTITION_ACCESS,然后再发送相关的数据访问请求。更多数据读写相关的细节,请参考 2.3总线协议章节。下面截取相关寄存器定义:

  • mmc dev

    格式:mmc dev [dev] [part]

    说明:切换物理分区dev:mmc设备编号,第一个为0

    part:

    0表示不访问引导分区

    1表示访问引导分区1(boot0)

    2表示访问引导分区2(boot1)

    示例:切换到引导分区1

    mmc dev 0 1
    
  • mmc bootbus

    格式:mmc bootbus [dev] [boot_bus_width] [reset_boot_bus_width] [boot_mode]

    说明:设置总线位宽

    dev:mmc设备编号

    boot_bus_width:总线宽度,1-4bit

    reset_boot_bus_width:

    boot_mode:

    示例:设置总线位宽为4

    mmc bootbus 0 1 0 0
    
  • mmc partconf

    格式:mmc partconf [dev ] [boot_ack ] [boot_partition ] [partition_access]

    说明:设置启动分区

    dev:mmc设备编号

    boot_ack:是否应答

    boot_partition:用户选择发送到主机的引导数据

    partition_access:用户选择要访问的分区

    示例:设置从引导分区1为启动分区

    mmc partconf 0 1 1 1
    
  • mmc read

    格式:mmc read [addr] [blk] [cnt]

    说明:从指定块偏移地址读取数据

    addr:读取到内存地址

    blk:块偏移地址(单位block)

    cnt:多少块

    示例:把eMMC的0x0地址共0x200块数据写到内存0x21000000处

    mmc read 0x21000000 0x0 0x200
    
  • mmc write

    格式:mmc write [addr] [blk] [cnt]

    说明:把内存数据写到指定块偏移地址

    addr:读取到内存地址

    blk:块偏移地址(单位block)

    cnt:多少块

    示例:把内存0x21000000的数据写到块地址0x0,0x200个块数据

    mmc write 0x21000000 0x0 0x200
    

注意:

  1. 尝试用mmc read write去访问eMMC的UDA分区,读写会破坏分区表,如果要支持,需要修改相应代码。

  2. 切换到boot区后需要再执行下mmc partconf设置,否则会导致无法从boot区启动。


4. 双系统操作示例


4.1. 用户分区参考

1M(boot)

1M(paramsa)

1M(paramsb)

1M(fact)

300M(recovery)

10M(kernela)

10M(kernelb)

200M(rootfsa)

200M(rootfsb)

300M(usera.ext4)

300M(userb.ext4)

2099M(data.ext4)

1M(cal)


4.2. 分区设计

name boo0 boot1 RPMB table env Recovery partition
kernel rootfs user
offset /blk 0x0 0x0 / 0x0 0x 278 (632) 0x320 (800) 0x5320 0x37320 0x96320 (615200)
size /blk 0x1000 0x1000 / 0x40 0x8 0x5000 0x32000 0x5F000 remain
size /MB 2 2 / / / 10 100 190 remain
partition
tag p1 p2 p3 p4 p5 p6 p7
name kernela kernelb rootfsa rootfsb usera userb data
size/blk 0x5000 0x5000 0x64000 0x64000 0x96000 0x96000 0x419800
size/MB 10 10 200 200 300 300 2099

下面的一组操作针对空片,完成创建分区、写入boot、recovery、system及环境变量数据,这些操作构成estar的自动烧录脚本。


4.3. 设置环境变量

环境变量 参数 说明
bootcmd 正常启动的参数
bootargs 正常启动的参数
bootcmdbp 备份系统的启动参数
bootargsbp 备份系统的启动参数
reckey pin=AA,level=BB 检测恢复出厂系统的按键,pin后面的AA表示gpio引脚编号,level后面的BB表示有效电平
recargs kernel=blkoffset,byteSize,parta,partb; rootfs= blkoffset, byteSize,parta,partb; user= blkoffset, byteSize,parta,partb; kernel,rootfs、user后面的blkoffset、blksize分别代表这部分数据UDA的偏移位置及大小,parta和partb为要拷贝到对应SystemA和SystemB的分区名称

下面为具体的环境变量设置:

setenv bootcmd ' emmc read.p 0x21000000 kernela 0x400000;bootm 0x21000000;

setenv bootargs ' console=ttyS0,115200 root=/dev/mmcblk0p3 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

setenv bootcmdbp ' emmc read.p 0x21000000 kernelb 0x400000;bootm 0x21000000;

setenv bootargsbp ' console=ttyS0,115200 root=/dev/mmcblk0p4 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

setenv reckey ' pin=10,level=0

setenv recargs ' kernel=0x320,0x400000,kernela,kernelb;rootfs=0x5320,0x1400000,rootfsa,rootfsb;user=0x37320,0x1400000,usera,userb

注意:

bootargs和bootargsbp里面需要指定挂载文件系统的分区号,这里不能使用分区名称而应该按照分区分配的设备名称,例如挂载roofsa分区文件系统,root=/dev/mmcblk0p3;挂载rootfsb分区文件系统,root=/dev/mmcblk0p4。


4.4. 删除所有分区

emmc rmgpt

//emmc erase也可以,只不过这个操作会擦除所有UDA数据(包括表头和环境变量)


4.5. 创建分区

emmc create kernela 0xA00000

emmc create kernelb 0xA00000

emmc create rootfsa 0xC800000

emmc create rootfsb 0xC800000

emmc create usera 0x12C00000

emmc create userb 0x12C00000

emmc create data 0x83300000

显示创建的分区:

注意:

创建分区并不会格式化分区为ext4,需要写入ext4格式文件,或者在linux下通过mkfs.ext4工具自行格式化才能正常挂载。


4.6. 写入boot0分区数据

mmc dev 0 1

mmc bootbus 0 1 0 0

tftp 0x21000000 boot/BOOT_PART.bin

mmc write 0x21000000 0x0 0x200

mmc partconf 0 1 1 0 #升级之后从boot0启动


4.7. 写入recovery分区数据

recovery区分为kernel、rootfs和user三部分,由于recovery分区终端用户不可见,因此不能通过emmc指定分区的方式读写,只能使用mmc指令:

tftp 0x21000000 kernel

mmc erase 0x320 0x5000

mmc write 0x21000000 0x320 0x2000

tftp 0x21000000 rootfs.ext4

mmc erase 0x5320 0x32000

mmc write 0x21000000 0x5320 0xA000

4.8. 大文件分割下载和升级

写到user区的customer_aX文件是一个ext4文件通过分割指令

split -b 20971520 customer.ext4 customer_ //把约50M的文件分割为等份20M(最后一个可能达不到),生成的文件分别名为customer_aa,customer_ab,customer_ac

tftp 0x21000000 customer_aa

mmc write 0x21000000 0x37320 0xA000

tftp 0x21000000 customer_ab

mmc write 0x21000000 0x41320 0xA000

tftp 0x21000000 customer_ac

mmc write 0x21000000 0x4B320 0xA000


4.9. 写入System分区数据

  • SystemA

    tftp 0x21000000 kernel
    
    emmc erase.p kernela
    
    emmc write.p 0x21000000 kernela 0x400000
    
    tftp 0x21000000 rootfs.ext4
    
    emmc erase.p rootfsa
    
    emmc write.p 0x21000000 rootfsa 0x1400000
    
    tftp 0x21000000 miservice.ext4
    
    emmc erase.p usera
    
    emmc write.p 0x21000000 usera 0x1400000
    
  • SystemB

    tftp 0x21000000 kernel
    
    emmc erase.p kernelb
    
    emmc write.p 0x21000000 kernelb 0x400000
    
    tftp 0x21000000 rootfs.ext4
    
    emmc erase.p rootfsb
    
    emmc write.p 0x21000000 rootfsb 0x1400000
    
    tftp 0x21000000 miservice.ext4
    
    emmc erase.p userb
    
    emmc write.p 0x21000000 userb 0x1400000
    

    大文件分割下载和升级,以升级SystemA为例,下载到user区的文件为50M,按20M分割

    tftp 0x21000000 customer_aa
    
    emmc write.p.continue 0x21000000 usera 0x0 0x1400000
    
    tftp 0x21000000 customer_ab
    
    emmc write.p.continue 0x21000000 usera 0xA000 0x1400000
    
    tftp 0x21000000 customer_ac
    
    emmc write.p.continue 0x21000000 usera 0x14000 0xA00000
    

4.10. 扩展ext4文件系统大小

注意: 以下操作如果使用estar升级包,已经包含这些功能,不需要再手动修改。

通过emmc create命令只创建分区不进行格式化,如果烧录了ext4镜像小于分区大小,那么在linux下挂载后能够看到的分区大小也只有ext4镜像大小(mmcblk0p5,22M)。

resize2fs工具支持根据实际分区扩展ext4文件系统,如下所示,扩展后mmcblk0p5分区大小为实际分配的300M。

由于兼容性问题,resize2fs工具支持mke2fs和mkfs.ext4工具生成的ext4文件镜像,不支持make_ext4fs工具生成的文件镜像。

可以在rcS文件最后面添加如下代码,在开机时只进行一次resize操作

以下操作针对于boot或者system升级


4.11. uboot下升级boot分区

当前为boot0分区启动,要升级boot分区,需要把boot数据写入到boot1,确认返回成功后再切换boot1启动。

mmc dev 0 2

mmc bootbus 0 1 0 0

mmc partconf 0 1 1 2 #仍然设置boot0启动,设置boot1可读写

tftp 0x21000000 boot/BOOT_PART.bin

mmc erase 0x0 0x200

mmc write 0x21000000 0x0 0x200

mmc partconf 0 1 2 0 #升级成功之后设置从boot1启动

4.12. uboot下升级system

当前为SystemA,要升级System,需要把数据先写到另外一个分区SystemB,确认写入成功后把bootcmd和bootcmdbp的内容互换,把bootargs和bootargsbp的内容互换。

tftp 0x21000000 kernel

emmc erase.p kernelb

emmc write.p 0x21000000 kernelb 0x400000

tftp 0x21000000 rootfs.ext4

emmc erase.p rootfsb

emmc write.p 0x21000000 rootfsb 0x1400000

tftp 0x21000000 miservice.ext4

emmc erase.p userb

emmc write.p 0x21000000 userb 0x1400000

setenv bootcmd ' emmc read.p 0x21000000 kernelb 0x400000;bootm 0x21000000;

setenv bootargs ' console=ttyS0,115200 root=/dev/mmcblk0p4 rootwait
rootfstype=ext4 rw init=/linuxrc cma=64M

setenv bootcmdbp ' emmc read.p 0x21000000 kernela 0x400000;bootm 0x21000000;

setenv bootargsbp ' console=ttyS0,115200 root=/dev/mmcblk0p3 rootwait
rootfstype=ext4 rw init=/linuxrc cma=64M

4.13. linux修改环境变量

在系统下也可以通过读写System所在的分区来更新系统,再通过以下方法更改环境变量切换默认的启动系统。

./fw_setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait
rootfstype=ext4 rw init=/linuxrc cma=64M'

./fw_setenv bootcmd ' emmc read.p 0x21000000 kernel 0x400000;bootm 0x21000000;
'

5. 自动烧录脚本配置说明

\project\image\configs\i6e\emmc.ext4fs.partition.config

用户可以配置的主要变量说明如下。


5.1. 下载

TFTPDOWNLOADADDR:通过TFTP下载镜像到内存的起始地址

SPLIT_EACH_FILE_SIZE:对于大文件,需要分割才能下载,这里指定文件超过多大进行分割


5.2. 环境变量

ENV_CFG:这个是写到kernel的环境变量配置,用于在kernel下读取环境变量


5.3. 镜像

IMAGE_LIST:生成的镜像列表,默认为“iplx_uboot kernel rootfs miservice customer”,其中“iplx_uboot kernel rootfs”是必需的。

rootfs$(PATSIZE):指定要生成的rootfs的镜像大小

miservice$(PATSIZE):指定要生成的miservice文件镜像大小

miservice$(MOUNTPT):指定miservice文件的挂载点

customer$(PATSIZE):指定customer文件的镜像大小

customer$(MOUNTPT):指定customer文件的挂载点


5.4. 恢复出厂

RECOVERY_KERNEL_OFFSET:指定存放kernel recovery镜像的区域在emmc的存储偏移地址(block单位)

RECOVERY_KERNEL_SIZE:指定存放kernel recovery镜像的区域的大小(block单位)

RECOVERY_ROOTFS_OFFSET:指定存放rootfs recovery镜像的区域在emmc的存储偏移地址(block单位)

RECOVERY_ROOTFS_SIZE:指定存放rootfs recovery镜像的区域的大小(block单位)

RECOVERY_USER_OFFSET:指定存放user recovery镜像的区域在emmc的存储偏移地址(block单位)

RECOVERY_USER_SIZE:指定存放user recovery镜像的区域的大小(block单位)

RECOVERY_KEY_PIN:指定recovery系统时的按键GPIO的编号

RECOVERY_KEY_LEVEL:指定recovery系统时的按键GPIO的有效电平


5.5. 用户分区

KERNEL_A_PAT_NAME:指定用户SystemA kernel分区的名称

$(KERNEL_A_PAT_NAME)SIZE:指定用户SystemA kernel分区的大小(Bytes单位)

KERNEL_B_PAT_NAME:指定用户SystemB kernel分区的名称

$(KERNEL_B_PAT_NAME)SIZE:指定用户SystemB kernel分区的大小(Bytes单位)

ROOTFS_A_PAT_NAME:指定用户SystemA kernel分区的名称

$(ROOTFS_A_PAT_NAME)SIZE:指定用户SystemA kernel分区的大小(Bytes单位)

ROOTFS_A_PAT_BOOTENV:指定SystemA rootfs的环境变量

ROOTFS_B_PAT_NAME:指定用户SystemB kernel分区的名称

$(ROOTFS_B_PAT_NAME)SIZE:指定用户SystemB kernel分区的大小(Bytes单位)

ROOTFS_B_PAT_BOOTENV:指定SystemB rootfs的环境变量

USER_A_PAT_NAME: 指定SystemA user分区名称

$(USER_B_PAT_NAME)SIZE:指定SystemB user分区的大小(Bytes单位)

USER_B_PAT_NAME: 指定SystemB user分区名称

$(USER_B_PAT_NAME)SIZE:指定SystemB user分区的大小(Bytes单位)

DATA_PAT_NAME:指定data分区名称

$(DATA_PAT_NAME)SIZE:指定data分区大小(Bytes单位)

USER_PART_LIST:用户分区排列顺序

USER_PART_LIST :=

$(KERNEL_A_PAT_NAME)

$(KERNEL_B_PAT_NAME)

$(ROOTFS_A_PAT_NAME)

$(ROOTFS_B_PAT_NAME)

$(USER_A_PAT_NAME)

$(USER_B_PAT_NAME)

$(DATA_PAT_NAME)

如何用户需要增加分区可以参考上面的格式增加分区选项并修改rootfs相应的环境变量,例如在最前面增加分区PARM:

PARM_PAT_NAME=parm

$( PARM_PAT_NAME)SIZE=0x100000

USER_PART_LIST更新如下:

USER_PART_LIST :=

$(PARM_PAT_NAME)

$(KERNEL_A_PAT_NAME)

$(KERNEL_B_PAT_NAME)

$(ROOTFS_A_PAT_NAME)

$(ROOTFS_B_PAT_NAME)

$(USER_A_PAT_NAME)

$(USER_B_PAT_NAME)

$(DATA_PAT_NAME)

变更环境变量:

原来:

ROOTFS_A_PAT_BOOTENV := console=ttyS0,115200 root=/dev/mmcblk0p3 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

ROOTFS_B_PAT_BOOTENV := console=ttyS0,115200 root=/dev/mmcblk0p4 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

更新为:

ROOTFS_A_PAT_BOOTENV := console=ttyS0,115200 root=/dev/mmcblk0p4 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

ROOTFS_B_PAT_BOOTENV := console=ttyS0,115200 root=/dev/mmcblk0p5 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M


5.6. 指定扩展大小的ext4分区

EXT4_RESIZE_PAT_LIST:指定哪些存放ext4镜像的分区,如果镜像比分区小,要把烧录的镜像扩展到整个分区,使得在系统下能够看到实际指定的分区大小。

如下指定分区p5、p6、p7需要扩展:

EXT4_RESIZE_PAT_LIST := /dev/mmcblk0p5 /dev/mmcblk0p6 /dev/mmcblk0p7


6. 母片镜像制作

使用emmcnize工具制作母片镜像,该工具为PC端工具,用于把kernel、rootfs、文件系统、用户数据、环境变量等镜像合并成一个可以直接通过烧录器烧录到空片的镜像。


6.1. UDA分区详情

part part name offset/bytes size/bytes offset/blk size/blk
- table 0x0 0x4F000 0x0 0x278
- env 0x4F000 0x15000 0x278 0xA8
- recovery kernel 0x64000 0xA00000 0x320 0x5000
- recovery rootfs 0xA64000 0x6400000 0x5320 0x32000
- recovery user 0x6E64000 0xBE00000 0x37320 0x5F000
mmcblk0p1 kernela 0x12C64000 * 0x96320 *
mmcblk0p2 kernelb * * * *
mmcblk0p3 rootfsa * * * *
mmcblk0p4 rootfsb * * * *
mmcblk0p5 usera * * * *
mmcblk0p6 userb * * * *
mmcblk0p7 data * * * *
…… …… * * * *

注意:标识为“-”的device part表示用户在linux下不可见,也无法直接操作,需要在uboot下面才能读写,它们的part name不需要指定,仅此处用于标识;表示“*”表示这部分偏移和大小可以根据需求设置,其它定义好的偏移和大小不能变更,若需要变更则需要更改BOOT_PART.bin。


6.2. 环境变量镜像

把需要设置的环境变量按照uboot printenv命令打印出来的格式写入到一个txt文件,例如env.txt。

baudrate=115200

bootargs=console=ttyS0,115200 root=/dev/mmcblk0p3 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

bootargsbp=console=ttyS0,115200 root=/dev/mmcblk0p4 rootwait rootfstype=ext4 rw init=/linuxrc cma=64M

bootcmd=emmc read.p 0x21000000 kernela 0x1C6184;bootm 0x21000000;

bootcmdbp=emmc read.p 0x21000000 kernelb 0x1C6184;bootm 0x21000000;

bootdelay=0

ethact=sstar_emac

ethaddr=00:30:1b:ba:02:db

fileaddr=23b2f070

filesize=25d

gatewayip=172.19.32.254

ipaddr=172.19.32.200

netmask=255.255.255.0

recargs=kernel=0x320,0x1C6184,kernela,kernelb;rootfs=0x5320,0x1400000,rootfsa,rootfsb;user=0x37320,0x1400000,usera,userb

serverip=172.19.32.88

stderr=serial

stdin=serial

stdout=serial

uboot编译后在tool目录下有一个mkenvimage工具,命令参数如下:

执行./mkenvimage -s 0x1000 -o env.bin env.txt 生成环境变量镜像


6.3. UDA分区配置文件

emmcnize工具通过读取ini配置文件来建立分区表和打包镜像。配置文件格式如下:

[env]

image=env.bin

vol_id=0

vol_size=0x15000

vol_name=""

[recovery-kernel]

image=kernel

vol_id=0

vol_size=0xA00000

vol_name=""

[recovery-rootfs]

image=rootfs.ext4

vol_id=0

vol_size=0x6400000

vol_name=""

[recovery-user]

image=user.ext4

vol_id=0

vol_size=0xBE00000

vol_name=""

[kernela-volume]

image=kernel

vol_id=1

vol_size=0xA00000

vol_name=kernela

[kernelb-volume]

image=kernel

vol_id=2

vol_size=0xA00000

vol_name=kernelb

[rootfsa-volume]

image=rootfs.ext4

vol_id=3

vol_size=0x1400000

vol_name=rootfsa

[rootfsb-volume]

image=rootfs.ext4

vol_id=4

vol_size=0x1400000

vol_name=rootfsb

[usera-volume]

image=user.ext4

vol_id=5

vol_size=0x1400000

vol_name=usera

[userb-volume]

image=user.ext4

vol_id=6

vol_size=0x1400000

vol_name=userb

……

image=XX,定义分区镜像名,必须与已有镜像名相同。

vol_id=X,定义分区id,目前用于标识而已。

vol_size=XX,定义分区大小(Bytes单位),必须不小于对应镜像大小。

vol_name=XX,定义分区名,uboot下通过emmc part看到的分区名。

其中[env]、[recovery-kernel]、[recovery-rootfs]、[recovery-user]这几个section是必须的,它们的项目除了image指定的镜像文件名可以更改,其它保持不变,与上述eMMC UDA分区表对应。

其余[XXX-volume] section是真正的用户分区,它们的image、vol_size、vol_name都可以根据实际分区情况进行更改。vol_id从1开始编号,最大支持64个分区。


6.4. 打包母片镜像

把需要打包的镜像(env.bin、kernel、rootfs.ext4、data.ext4等)及UDA分区配置文件(emmcbin.ini)与emmcnize工具放在同一个目录下,指定配置文件作为输入,指定输出文件,格式:./emmcnize < input ini file> < output image file>,例如:

./emmcnize part.ini image.bin

其中part.ini为分区配置文件,image.bin为输出的完整镜像。

正常情况下,完成操作会打印如下所述的“done”信息:

若配置文件指定了某个文件,但是没有放入指定镜像文件,那么会提示空文件,不影响完整镜像的生成,但是生成的镜像不会包含需要部分镜像可能导致无法启动,需要注意。