日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

imx8mq - bootloader编译过程

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 imx8mq - bootloader编译过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 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.Linux或make --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.bin0x8000固定大小
lpddr4_pmu_train_1d_dmem.bin0x4000固定大小
lpddr4_pmu_train_2d_imem.bin0x8000固定大小
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的內存映象為:
mapsizecontent
0000_0000 0000_03700x370FIT
0000_0370 0000_30000x2C900
0000_3000 0009_31400x90140u-boot-nodtb.bin
0009_3140 0009_F7D80xC698bl31.bin
0009_F7D8 000A_691D0x7145fsl-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的內存映象為:

mapsizecontent
0000_0000 0001_97580x19758signed_hdmi_imx8m.bin
0001_A000 0001_A0300x30image ivt header
0001_A030 0004_09B40x26984u-boot-spl-ddr.bin
0004_0A00 0004_2A000x2000CSF:0
0005_7C00 000F_E5200x?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编译过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。