一. bootloader源码准备和编译

先准备以下几个压缩包,可以独立下载压缩包,也可以通过yocto工程获取

l@l:/work/imx8mq-sdk/bootloader$ ll
总用量 18480
drwxr-xr-x  4 l l     4096 6月   7  2018 firmware-imx-7.4/
-rwxrwxrwx  1 l l  2613383 5月  10 09:55 firmware-imx-7.4.tar.bz2*
drwxr-xr-x 24 l l     4096 5月  24 23:17 imx8m-uboot-imx-2017.03-r0/
-rwxrwxrwx  1 l l 13974645 5月  10 09:55 imx8m-uboot-imx-2017.03-r0.tar.bz2*
drwxr-xr-x 19 l l     4096 5月  18 12:22 imx-atf-1.4.1/
-rwxrwxrwx  1 l l  2212964 5月  10 09:55 imx-atf-1.4.1.tar.bz2*
drwxrwxr-x  7 l l     4096 5月  24 23:17 imx-mkimage/
-rwxrwxrwx  1 l l    82828 5月  10 09:55 imx-mkimage.tar.bz2*
-rwxrwxr-x  1 l l      682 5月  18 14:06 remake.sh*

1. firmware-imx-7.4

firmware-imx-7.4是一些初始化的bin格式文件,由spl或者uboot调用,用以初始化ddr和hdmi

l@l:/work/imx8mq-sdk/bootloader/firmware-imx-7.4/firmware$ ls ddr/synopsys/lpddr4_pmu_train_* hdmi/cadence/signed_hdmi_imx8m.bin -l
-rw-r--r-- 1 l l   1668 6月   7  2018 ddr/synopsys/lpddr4_pmu_train_1d_dmem.bin
-rw-r--r-- 1 l l  32244 6月   7  2018 ddr/synopsys/lpddr4_pmu_train_1d_imem.bin
-rw-r--r-- 1 l l   1380 6月   7  2018 ddr/synopsys/lpddr4_pmu_train_2d_dmem.bin
-rw-r--r-- 1 l l  23232 6月   7  2018 ddr/synopsys/lpddr4_pmu_train_2d_imem.bin
-rw-r--r-- 1 l l 105304 6月   7  2018 hdmi/cadence/signed_hdmi_imx8m.bin

2. atf

atf: ARM Trusted Firmware;进行一些cortex-A8相关的初始化。提供源码,需要自己重新编译。

编译脚本:

#!/bin/bash
source /opt/fsl-imx-x11/4.9.51-mx8-beta/environment-setup-aarch64-poky-linux
cd imx-atf-1.4.1
make PLAT=imx8mq bl31 -j4

3. imx8m-uboot-imx-2017.03-r0

此部分包括u-boot-spl.bin 和 u-boot-nodtb.bin
编译脚本:

cd imx8m-uboot-imx-2017.03-r0/
source /opt/fsl-imx-x11/4.9.51-mx8-beta/environment-setup-aarch64-poky-linux
make mrproper
make imx8mq_evk_defconfig
unset LDFLAGS
make -j4
cp u-boot-nodtb.bin spl/u-boot-spl.bin arch/arm/dts/fsl-imx8mq-evk.dtb ../imx-mkimage/iMX8M/
cp tools/mkimage ../imx-mkimage/iMX8M/mkimage_uboot

4. 修改imx-mkimage编译脚本

独立编译,没有git版本控制信息。所以屏蔽git相关信息

# 顶层Makefile
35 buildinfo:
36  @echo -n '#define MKIMAGE_COMMIT 0x12345678' > src/build_info.h
37# @git rev-parse --short=8 HEAD >> src/build_info.h
38  @echo ' ' >> src/build_info.h

5. 整个bootloader编译脚本

直接输出bootloader的编译镜像文件flash.bin文件。

#!/bin/bash
cd imx8m-uboot-imx-2017.03-r0/
source /opt/fsl-imx-x11/4.9.51-mx8-beta/environment-setup-aarch64-poky-linux
make mrproper
make imx8mq_evk_defconfig
unset LDFLAGS
make -j4
cp u-boot-nodtb.bin spl/u-boot-spl.bin arch/arm/dts/fsl-imx8mq-evk.dtb ../imx-mkimage/iMX8M/
cp tools/mkimage ../imx-mkimage/iMX8M/mkimage_uboot
cd ../imx-atf-1.4.1/
make PLAT=imx8mq bl31 -j4
cp build/imx8mq/release/bl31.bin ../imx-mkimage/iMX8M/
cd ../firmware-imx-7.4/
cp firmware/ddr/synopsys/lpddr4_pmu_train_* ../imx-mkimage/iMX8M/
cp firmware/hdmi/cadence/signed_hdmi_imx8m.bin ../imx-mkimage/iMX8M/
cd ../imx-mkimage/
make SOC=iMX8M flash_hdmi_spl_uboot
cp iMX8M/flash.bin ../

二. imx-mkimage编译过程分析

flash.bin文件由imx-mkimage工具生成,在编译前,先把所需文件拷贝到对应SOC文件夹下

## 已删除原有文件,下面为需要准备的文件
l@l:/work/imx8mq-sdk/bootloader/imx-mkimage$ ls iMX8M/ -l
总用量 2992
-rwxrwxr-x 1 l l   50840 5月  24 23:17 bl31.bin
-rw-rw-r-- 1 l l   28997 5月  24 23:17 fsl-imx8mq-evk.dtb
-rw-r--r-- 1 l l    1668 5月  24 23:17 lpddr4_pmu_train_1d_dmem.bin
-rw-r--r-- 1 l l   32244 5月  24 23:17 lpddr4_pmu_train_1d_imem.bin
-rw-r--r-- 1 l l    1380 5月  24 23:17 lpddr4_pmu_train_2d_dmem.bin
-rw-r--r-- 1 l l   23232 5月  24 23:17 lpddr4_pmu_train_2d_imem.bin
-rwxrwxr-x 1 l l  168496 5月  24 23:17 mkimage_uboot
-rw-r--r-- 1 l l  105304 5月  24 23:17 signed_hdmi_imx8m.bin
-rwxrwxr-x 1 l l  590072 5月  24 23:17 u-boot-nodtb.bin
-rwxrwxr-x 1 l l   72632 5月  24 23:17 u-boot-spl.bin

1、分析flash.bin编译流程的顶层Makefile

执行

make SOC=iMX8M flash_hdmi_spl_uboot

传入目标为:flash_hdmi_spl_uboot
在Makefile中找不到flash_hdmi_spl_uboot,所以使用DEFAULT目标:

.DEFAULT:@$(MAKE) -s --no-print-directory bin@$(MAKE) --no-print-directory -C $(SOC) -f soc.mak $@

其中:@$(MAKE) -s --no-print-directory bin

  • @$(MAKE)${MAKE}就是预设的 make 这个命令的名称(或者路径)。
  • -s --no-print-directory:就是静默编译,不输出编译信息。
  • bin:Makefile中,通过下面分析,顶层的mkimage_imx8工具是由src/build_info.h,src/imx8qm.c src/imx8qx.c src/mkimage_imx8.c编译生成的
bin: $(MKIMG)
MKIMG = $(PWD)/mkimage_imx8
SRCS = src/imx8qm.c  src/imx8qx.c  src/mkimage_imx8.c
$(MKIMG): buildinfo $(SRCS)@echo "Compiling mkimage_imx8"$(CC) $(CFLAGS) $(SRCS) -o $(MKIMG) -I src

接下来,@$(MAKE) --no-print-directory -C $(SOC) -f soc.mak $@

  • -C $(SOC):指定下层Makefile,指定完之后调用下层的Makefile文件。
  • -f soc.mak:从soc.mak读入Makefile。也即,使用soc.mak的make规则
    Makefile的文件名 默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好 不要用 “GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“ makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。
    当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,
    如果要指定特定的Makefile,你可以使用make的“- f”和“–file”参数
    如:make -f Make.Linuxmake --file Make.AIX

$(SOC)@$(MAKE)动作

执行`@$(MAKE) --no-print-directory -C iMX8M -f soc.mak flash_hdmi_spl_uboot`

进入iMX8M子目录,make目标flash_hdmi_spl_uboot

解析soc.mak:

flash_hdmi_spl_uboot: flash_evk
flash_evk: $(MKIMG) signed_hdmi_imx8m.bin u-boot-spl-ddr.bin u-boot.itb./mkimage_imx8 -fit -signed_hdmi signed_hdmi_imx8m.bin -loader u-boot-spl-ddr.bin 0x7E1000 -second_loader u-boot.itb 0x40200000 0x60000 -out $(OUTIMG)

上面的几个依赖,还有$(MKIMG)、u-boot-spl-ddr.bin 和 u-boot.itb 没有

第一个依赖:$(MKIMG)

编译$(MKIMG)工具,该工具用于生成最终的flash.bin文件;

$(MKIMG): mkimage_imx8.c@echo "Compiling mkimage_imx8"$(CC) $(CFLAGS) mkimage_imx8.c -o $(MKIMG) -lz
  • $(CC):gcc命令
  • $(CFLAGS)-O2 -Wall -std=c99 -static
  • $(MKIMG)MKIMAGE = mkimage_imx8
  • -lz:连接libz库

第二个依赖:u-boot-spl-ddr.bin

u-boot-spl-ddr.bin: u-boot-spl.bin lpddr4_pmu_train_1d_imem.bin lpddr4_pmu_train_1d_dmem.bin lpddr4_pmu_train_2d_imem.bin lpddr4_pmu_train_2d_dmem.bin@objcopy -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 lpddr4_pmu_train_1d_imem.bin lpddr4_pmu_train_1d_imem_pad.bin@objcopy -I binary -O binary --pad-to 0x4000 --gap-fill=0x0 lpddr4_pmu_train_1d_dmem.bin lpddr4_pmu_train_1d_dmem_pad.bin@objcopy -I binary -O binary --pad-to 0x8000 --gap-fill=0x0 lpddr4_pmu_train_2d_imem.bin lpddr4_pmu_train_2d_imem_pad.bin@cat lpddr4_pmu_train_1d_imem_pad.bin lpddr4_pmu_train_1d_dmem_pad.bin > lpddr4_pmu_train_1d_fw.bin@cat lpddr4_pmu_train_2d_imem_pad.bin lpddr4_pmu_train_2d_dmem.bin > lpddr4_pmu_train_2d_fw.bin@cat u-boot-spl.bin lpddr4_pmu_train_1d_fw.bin lpddr4_pmu_train_2d_fw.bin > u-boot-spl-ddr.bin@rm -f lpddr4_pmu_train_1d_fw.bin lpddr4_pmu_train_2d_fw.bin lpddr4_pmu_train_1d_imem_pad.bin lpddr4_pmu_train_1d_dmem_pad.bin lpddr4_pmu_train_2d_imem_pad.bin

依赖全都有了,直接执行下面指令

  • objcopy·:将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换。
  • -I binary -O binary:指定输入输出格式,binary为二进制格式
  • --pad-to 0x8000 --gap-fill=0x0:从bin文件末开始,用--gap-fill=0x0,一直填充到--pad-to 0x8000,作用就是把bin文件设定为0x8000 = 32KB大小

所以,生成的u-boot-spl-ddr.bin二进制文件image map就是

文件 大小
u-boot-spl.bin 实际大小
lpddr4_pmu_train_1d_imem.bin 0x8000固定大小
lpddr4_pmu_train_1d_dmem.bin 0x4000固定大小
lpddr4_pmu_train_2d_imem.bin 0x8000固定大小
lpddr4_pmu_train_2d_dmem.bin 实际大小

第三个依赖:u-boot.itb

u-boot.itb: $(dtbs)./mkimage_fit_atf.sh $(dtbs) > u-boot.its./mkimage_uboot -E -p 0x3000 -f u-boot.its u-boot.itb@rm -f u-boot.its
  • $(dtbs): fsl-imx8mq-evk.dtb
  • ./mkimage_fit_atf.sh $(dtbs) > u-boot.its:输出的 u-boot.its参考下面TAG-u-boot.its,该文件被mkimage_uboot使用,mkimage_uboot来源于uboot/tools/mkimage
  • -f :指定FIT(flattenned image tree)的文件名
  • ./mkimage_uboot -E -p 0x3000 -f u-boot.its u-boot.itb:的作用就是把u-boot.its设备树格式的文本编译成设备树,然后放在u-boot.itb的开始位置,然后用0x0填充到0x3000字节。接着,根据传入设备树描述信息,开始填充u-boot.itb
    最后,u-boot.itb的内存映象为:
map size content
0000_0000 0000_0370 0x370 FIT
0000_0370 0000_3000 0x2C90 0
0000_3000 0009_3140 0x90140 u-boot-nodtb.bin
0009_3140 0009_F7D8 0xC698 bl31.bin
0009_F7D8 000A_691D 0x7145 fsl-imx8mq-evk.dtb

通过mkimage_imx8生成flash.bin

执行mkimage_imx8,从iMX8M/mkimage_imx8.c的main函数开始分析

./mkimage_imx8 -fit -signed_hdmi signed_hdmi_imx8m.bin -loader u-boot-spl-ddr.bin 0x7E1000 -second_loader u-boot.itb 0x40200000 0x60000 -out $(OUTIMG)

最后,flash.bin的内存映象为:

map size content
0000_0000 0001_9758 0x19758 signed_hdmi_imx8m.bin
0001_A000 0001_A030 0x30 image ivt header
0001_A030 0004_09B4 0x26984 u-boot-spl-ddr.bin
0004_0A00 0004_2A00 0x2000 CSF:0
0005_7C00 000F_E520 0x‭A6920‬ u-boot.itb
TAG-u-boot.its:
/dts-v1/;/ {description = "Configuration to load ATF before U-Boot";images {uboot@1 {description = "U-Boot (64-bit)";data = /incbin/("u-boot-nodtb.bin");type = "standalone";arch = "arm64";compression = "none";load = <0x40200000>;};atf@1 {description = "ARM Trusted Firmware";data = /incbin/("bl31.bin");type = "firmware";arch = "arm64";compression = "none";load = <0x00910000>;entry = <0x00910000>;};fdt@1 {description = "fsl-imx8mq-evk";data = /incbin/("fsl-imx8mq-evk.dtb");type = "flat_dt";compression = "none";};};configurations {default = "config@1";config@1 {description = "fsl-imx8mq-evk";firmware = "uboot@1";loadables = "atf@1";fdt = "fdt@1";};};
};
END-TAG
TAG-u-boot.itb:
l@l:/work/imx8mq-sdk/uboot/imx-mkimage/iMX8M$ mkimage -l u-boot.itb
FIT description: Configuration to load ATF before U-Boot
Created:         Sun May 19 00:52:57 2019Image 0 (uboot@1)Description:  U-Boot (64-bit)Created:      Sun May 19 00:52:57 2019Type:         Standalone ProgramCompression:  uncompressedData Size:    unavailableArchitecture: AArch64Load Address: 0x40200000Entry Point:  0xffffffffImage 1 (atf@1)Description:  ARM Trusted FirmwareCreated:      Sun May 19 00:52:57 2019Type:         FirmwareCompression:  uncompressedData Size:    unavailableArchitecture: AArch64Load Address: 0x00910000Image 2 (fdt@1)Description:  fsl-imx8mq-evkCreated:      Sun May 19 00:52:57 2019Type:         Flat Device TreeCompression:  uncompressedData Size:    unavailableArchitecture: Unknown ArchitectureDefault Configuration: 'config@1'Configuration 0 (config@1)Description:  fsl-imx8mq-evkKernel:       unavailableFDT:          fdt@1Loadables:    atf@1
END-TAG

imx8mq - bootloader编译过程相关推荐

  1. 博通Broadcom SDK源码学习与开发2——Bootloader功能和编译过程

    声明:原创作品,严禁用于商业目的. 本系列文章将全面剖析以Bcm33xxx芯片开发Cablemodem产品的SDK源码为例,从编译系统到各个功能模块进行分析与探讨. 文章目录 0.写在前篇 0.写在前 ...

  2. MDK 的编译过程及文件类型全解

    出处:MDK 的编译过程及文件类型全解 MDK 的编译过程及文件类型全解 ------(在arm9的开发中,这些东西都是我们自己搞定的,但是在windows上,IDE帮我们做好了,了解这些对深入开发是 ...

  3. 6选择内核启动项_Linux 2.6内核编译过程

    内核编译过程 Linux 2.6内核从配置,到编译,再到安装的命令非常简单,只要按顺序执行下面几个命令就可完成: 1.内核配置:make menuconfig 2.内核编译:make 3.安装模块:m ...

  4. 第48章 MDK的编译过程及文件类型全解

    Frm: http://www.cnblogs.com/firege/p/5806134.html 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教 ...

  5. 第48章 MDK的编译过程及文件类型全解—零死角玩转STM32-F429系列

    第48章     MDK的编译过程及文件类型全解 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ...

  6. 香橙派iot板子编译过程_编译过程并不神奇

    编译过程并不神奇 工具 Atmel Studio 过程的简单描述 这篇文章尽可能地说清楚从编译程序到把代码烧到板子里,然后开始上电后运行程序.很多细节是根据Arduino来写的,因为Arduino没有 ...

  7. PX4IO的编译过程、代码构架以及与PX4FMU的通讯分析

    看到很多教程中讲到PX4飞控的协处理器的作用,包括各类遥控器信号的输入.PWM信号输出.以及与FMU的通讯.但是究竟如何实现的,最近几天自己看代码总算搞懂了,在这里分享一下. 一,代码的组成和编译过程 ...

  8. MDK的编译过程及文件类型全解——(一)

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 本文转载自:第48章 MDK的编译过程及文件类型全解-零死角玩转STM32 ...

  9. 记录一次python3.7反编译过程

    记录一次python3.7反编译过程 1.将exe文件转换成pyc文件 2.修复pyc文件 3.如何得到magic number 4.添加magic number 5.反编译pyc文件 找到了一个py ...

  10. Compiler编译过程

    Compiler编译过程 1.原理 编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做"本地"编译器.另外,编译器也可以生成 ...

最新文章

  1. 主席树 ---- 2021 ICPC 昆明 M.Stone Games [主席树 + 暴力]
  2. 探索JAVA并发 - 线程池详解
  3. python数据库特殊字符转义_Python处理mysql特殊字符的问题
  4. c#随机数生成编号_使用C#生成随机密码(纯数字或字母)和随机卡号(数字与字母组合)...
  5. Arch Linux 没有声音:Intel sound card snd_hda_intel not working 解决方法
  6. bzoj4639 博士的选取器
  7. BugkuCTF-Reverse题mobile1(gctf)
  8. 关于xcode6打包以及上线前企业部署测试的说明 --转自张诚教授微博
  9. 量子艺术、魔法成像、水生政治、性方程式……这些AI“衍生”科目都是啥?...
  10. 20165318 预备作业3 Linux安装及学习
  11. linux crontab 每5分钟执行一次_第十一章:走进Linux世界——源码包管理and任务计划。...
  12. 博客转移到cnblogs
  13. 九大内置对象及四个域对象的总结
  14. spring动态代理的实现方式
  15. 概率论与数理统计——总结
  16. 工作环境配置及putty工具常见设置
  17. 近景摄影测量空间后方交会python
  18. iPhone 计算机 桌面,变身iOS?让Windows 10的桌面和苹果一样美
  19. BLDC无刷电机驱动板,foc驱动板,有霍尔接口,反电动势接口,三相电流采集接口
  20. HTML Purifier --非常好用的XSS过滤器

热门文章

  1. SEO实战密码阅读笔记
  2. BXP无盘中启用bootp服务的设置详解(转)
  3. (转)几个开源的视频编解码器介绍
  4. 十字链表c语言实验报告,矩阵加法(基于十字链表)及C语言代码实现
  5. named-config with name ‘c3p0-config.xml‘ does not exist. Using default-config
  6. Java内存模型是什么
  7. 原生js实现点击“上一张”、“下一张”按钮切换图片
  8. 安卓苹果均兼容的移动版CAD看图软件——迅捷CAD看图
  9. cad手机看图 android,CAD手机看图
  10. “易图购”数码商城App设计与实现