2-EMMC启动及各分区文件生成过程

EMMC的使用比nand flash还是复杂一些,有其特有的分区和电器性能

1、启动过程介绍

跟普通nand或spi flash不同,uboot前面还有好几级

在vendor某些厂商的设计中,ATF并不是BOOTROM加载后的第一个启动镜像,可能是这样的:
BOOTROM—>PL—>ATF—>optee—>uboot…, 在PL阶段就已经将ATF/optee/uboot镜像的load到内存了.

image.png

ATF(ARM Trusted firmware)完成启动流程:https://blog.csdn.net/u014426028/article/details/117949006?spm=1001.2014.3001.5501

ATF(ARM Trusted firmware):https://blog.csdn.net/shuaifengyun/category_6919265.html

MTK系统启动流程:https://www.likecs.com/show-203730440.html

Bpi-r64 quick start (boot from eMMC):https://forum.banana-pi.org/t/bpi-r64-quick-start-boot-from-emmc/9809

2、BL1(ROM)启动检测

从启动流程可以看到BL1属于固化在芯片内部ROM里面的一小段代码,我们修改不到。

其作用比较简单,主要有
a.初始化ISRAM和EMMC
b.当系统全擦后 ,也会配置USB,用来仿真USB端口下载镜像。
c.从EMMC中加载preloader到ISRAM中执行。

比如MT7622支持EMMC、SD卡、SPI Nor/Nand Flash

在《MT7622A_Datasheet.pdf》里面的strapping Options章节,有定义启动顺序

Bit[1]:NREB和Bit[0]:NWEB两个引脚

  • 00:SPI-NOR -> eMMC -> SDXC
  • 01:SPI-NAND -> eMMC -> SDXC
  • 10:SLC-NAND -> eMMC -> SDXC
  • 11:SDXC -> eMMC -> SLC-NAND

BL1启动后,根据引脚的设备,会依次从上面的选项启动,哪个初始化成功就用哪个启动。

3、BL2(preloader)生成过程

BL2的代码属于ATF的一部分arm-trusted-firmware-mediatek-2021-05-08-d2c75b21,ATF的package编译后会生产bl2.bin

Built /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-mt7622-emmc-1ddr/arm-trusted-firmware-mediatek-2021-05-08-d2c75b21/build/mt7622/release/bl2.bin successfully

Image Type:   MediaTek BootROM Loadable Image
Boot Media:   eMMC
Load Address: 002010

...
install -m0644 /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-mt7622-emmc-1ddr/arm-trusted-firmware-mediatek-2021-05-08-d2c75b21/build/mt7622/release/bl2.img /home/router/19.07/staging_dir/target-aarch64_cortex-a53_musl/image/mt7622-emmc-1ddr-bl2.img

也就是上面启动流程的第二级,正常我们也把这个叫成preloader。

cat /home/router/19.07/staging_dir/target-aarch64_cortex-a53_musl/image/mt7622-emmc-1ddr-bl2.img >> /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-ZH-A0501-EMMC-squashfs-emmc-1ddr-preloader.bin

cp /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-ZH-A0501-EMMC-squashfs-emmc-1ddr-preloader.bin /home/router/19.07/bin/targets/mediatek/mt7622/openwrt-mediatek-mt7622-ZH-A0501-EMMC-squashfs-emmc-1ddr-preloader.bin

4、BL31+uboot(fip)生成过程

之后就是BL31,它也是属于ATF的一部分,编译生产bl31.bin。

Built /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-mt7622-emmc-1ddr/arm-trusted-firmware-mediatek-2021-05-08-d2c75b21/build/mt7622/release/bl31.bin successfully

install -m0644 /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/arm-trusted-firmware-mediatek-mt7622-emmc-1ddr/arm-trusted-firmware-mediatek-2021-05-08-d2c75b21/build/mt7622/release/bl31.bin /home/linye/sdb/zihome/ZMAX2/ZH-A0502/zrouter/19.07/staging_dir/target-aarch64_cortex-a53_musl/image/mt7622-emmc-1ddr-bl31.bin

正常会将bl31.bin和u-boot.bin合并成一个u-boot.fip文件

使用fiptool工具合并:

/home/router/19.07/staging_dir/host/bin/fiptool create --soc-fw /home/router/19.07/staging_dir/target-aarch64_cortex-a53_musl/image/mt7622-emmc-1ddr-bl31.bin --nt-fw /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/uboot-mediatek/ZH-A0501/u-boot.bin /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/uboot-mediatek/ZH-A0501/u-boot.fip

install -m0644 /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/uboot-mediatek/ZH-A0501/u-boot.fip /home/router/19.07/bin/targets/mediatek/mt7622/ZH-A0501-u-boot.fip

uboot之后就是正常的内核引导了。

5、EMMC启动设置和分区分配

EMMC本身有几个物理分区,跟人为的mtd功能分区不一样。

image.png

EMMC的启动逻辑是可以设置的,设置从哪个物理分区启动,正常有两种做法:

  • 方法1:设置从boot1启动,即boot1里面烧录BL2(preloader);之后再跳转到UDA分区启动BL31->uboot。
  • 方法2:设备从UDA启动,即把BL2(preloader)和BL31->uboot之类的信息都烧录到UDA分区,boot1分区不烧录东西。

至于设备从哪个分区启动,可以查看EMMC寄存器说明:

image.png

我们只需要设置PARTITION_CONFIG中的BOOT_PARTITION_ENABLE字段

  • 方法1:使能boot1,将BOOT_PARTITION_ENABLE设置为1
  • 方法2:使能UDA,将BOOT_PARTITION_ENABLE设置为7

烧录配置->文件选择:boot1选择preloader文件

image.png

烧录配置->寄存器选择:配置PARTITION_CONFIG寄存器为0x48

image.png

6、GPT生成过程

上面提到如果是以boot1启动的方法启动,那UDA分区就不需要preloader,只需要u-boot.fip就可以。

但是实际上除了u-boot.fip外,EMMC其实还需要一个在UDA的头部加一个软件分区配置文件,目前主流的软件分区技术有 MBR(Master Boot Record)和 GPT(GUID Partition Table)两种。

这两种分区技术的基本原理类似,如下图所示:


image.png

前面的Partition Table也就是上面说的GPT/MBR,里面记录了下面的SW Partitions每个分区的大小。

如何生成GPT文件?firmware-utils工具包里面提供了ptgen工具,可以生成。

命令行使用如下:

Usage: ./ptgen [-v] [-n] [-g] -h <heads> -s <sectors> -o <outputfile> [-a 0..4] [-l <align kB>] [-G <guid>] [[-t <type>] [-r] [-N <name>] -p <size>[@<start>]...

如下脚本:

  • sdmmc使用的就是方法2,所有属于都在UDA分区,bl2+fip+env+firmware
  • emmc使用的就是方法1,bl2属于boot1分区,这边不用生成,UDA分区内容为fip+env+firmware+firmware2
define Build/mt7622-gpt
    cp $@ $@.tmp 2>/dev/null || true
    ptgen -g -o $@.tmp -a 1 -l 1024 \
        -t 0xef -N fip      -r  -p 2M@2M \
        -t 0x83 -N ubootenv -r  -p 1M@4M \
        -t 0x2e -N firmware     -p 48M@6M \
        -t 0x2e -N firmware2    -p 48M@54M \
        -t 0x83 -N zbootconfig  -p 512k@102M \
    cat $@.tmp >> $@
    rm $@.tmp
endef

生成gpt过程如下:

ptgen -g -o /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-ZH-A0501-EMMC-squashfs-emmc.gpt.tmp -a 1 -l 1024  -t 0xef -N fip      -r  -p 2M@2M -t 0x83    -N ubootenv -r  -p 1M@4M   -t 0x2e -N firmware      -p 48M@6M -t 0x2e -N firmware2  -p 48M@54M -t 0x83 -N zbootconfig   -p 512k@102M 
part 2048 2048
part 4096 1024
part 6144 49152
part 55296 49152
part 104448 512
2097152
2097152
4194304
1048576
6291456
50331648
56623104
50331648
106954752
524288
cat /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-EMMC-squashfs-emmc.gpt.tmp >> /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-EMMC-squashfs-emmc.gpt
rm /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-EMMC-squashfs-emmc.gpt.tmp
cp /home/router/19.07/build_dir/target-aarch64_cortex-a53_musl/linux-mediatek_mt7622/tmp/openwrt-mediatek-mt7622-EMMC-squashfs-emmc.gpt /home/router/19.07/bin/targets/mediatek/mt7622/openwrt-mediatek-mt7622-ZH-A0501-EMMC-squashfs-emmc.gpt

7、最终固件

经过上面的分析可以得到最终会有两个文件需要烧录

  • 由ATF中的BL2生成的preloader文件,烧录到boot1分区
  • 由AGPT+LB31+uboot+uboot-env+firmware生成的固件,烧录到uda分区
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341

推荐阅读更多精彩内容