天天看點

NXP iMX8 SCFW和Boot Container Image編譯

By Toradex秦海

1). 簡介

NXP iMX8系列ARM處理器是NXP目前性能最強勁确也是架構最複雜的ARM處理器,和之前的ARMv7系列處理器比如iMX6系列不同,在iMX8系列晶片中NXP加入了SCU子產品來管理晶片的啟動和關鍵外設初始化(如PMIC、時鐘等),iMX8QM處理器的簡單框圖如下:

NXP iMX8 SCFW和Boot Container Image編譯

SCU(System Control Unit)的框圖放大如下,其中包含一個基于Cortex-M4核心的SCU CM4 Complex子產品,其運作的固件就是SCFW,還有一基于Cortex-M0核心的SECO子產品,運作SECO固件,負責安全認證相關的工作。

NXP iMX8 SCFW和Boot Container Image編譯

本文就簡單介紹下iMX8處理器的啟動流程,然後結合來自于Toradex Apalis iMX8 的ARM嵌入式平台,示範一下包含了SCFW以及SECO固件等的boot container image的編譯流程。

2). 準備

a). Apalis iMX8QM 4GB WB IT ARM核心版配合Ioxra 載闆,連接配接調試序列槽UART1(載闆X22)到開發主機友善調試。

3). NXP iMX8 啟動流程

a). NXP iMX8啟動流程圖如下所示,首先SCU boot rom代碼加載啟動,然後通過晶片的SCU boot mode相關管腳配置,來選擇進入那種啟動模式,一般要麼是正常啟動,要麼是進入恢複模式,然後通過SDP模式啟動。正常啟動流程到最後,加載運作Boot container image來繼續下一階段啟動。

NXP iMX8 SCFW和Boot Container Image編譯

b). Boot container image 包含如下内容

./ SCFW - 運作與SCU M4核心的firmware,用于啟動管理和外設初始化等任務,可以進行定制修改。

./ SECO FW - SECO firmware,NXP隻提供binary檔案,負責啟動過程中的一些security認證。

./ Optional Coretex-M4 firmware, 由上面章節一的iMX8晶片框圖可以看到iMX8支援2x Cortex-M4 核心,那麼運作與這些M4核心的固件可以一起內建到boot container image裡面去,如果不需要或者可以後續通過U-boot加載,是以可選添加。

./ Optional Cortex-A image,運作于Cortex-A核心啟動相關的image,主要包含ATF(ARM Trusted Firmware)和U-boot image。

NXP iMX8 SCFW和Boot Container Image編譯

c). Boot container image 加載流程如下圖,最後當U-boot運作後,就由U-boot控制進行正常的Linux Kernel和Rootfs加載流程了。

NXP iMX8 SCFW和Boot Container Image編譯

4). Boot Container Image編譯組裝

a). 本文以下編譯流程都是基于目前Toradex 最新Linux BSP V5.3版本操作,其他版本基本流程都是一緻的,版本差異可以參考這裡說明修改适配

b). 首先擷取 SECO firmware

----------------------------------

$ cd ~/workdir

$ wget -c https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/imx-seco-3.8.1.bin

$ chmod u+x imx-seco-3.8.1.bin

$ ./imx-seco-3.8.1.bin

$ ls imx-seco-3.8.1/firmware/seco/

commit-id.txt  mx8dxla1-ahab-container.img  mx8qxb0-ahab-container.img  SECO_FW_release_note.pdf

mx8dxla0-ahab-container.img  mx8qmb0-ahab-container.img   mx8qxc0-ahab-container.img

----------------------------------

可以看到SECO firmware binary已經在 imx-seco-3.8.1/firmware/seco/ 目錄下,針對不同的iMX8晶片選擇不同的檔案,本文測試使用的iMX8QM處理器對應的是 mx8qmb0-ahab-container.img 這個檔案。

c). 然後編譯 SCFW

./從NXP官網下載下傳 SCFW porting kit(需要有效的NXP賬号登入),目前适用版本為 SCFW Porting Kit 1.7.3

NXP iMX8 SCFW和Boot Container Image編譯

./ 解壓到 build-scfw 目錄

----------------------------------

### create build-scfw folder for building

$ cd ~/workdir

$ mkdir build-scfw

$ cd build-scfw

### extract package

$ tar xf imx-scfw-porting-kit-1.7.3.tar.gz

$ cd packages/

$ chmod +x imx-scfw-porting-kit-1.7.3.bin

$ ./imx-scfw-porting-kit-1.7.3.bin

### deploy source code, corresponding to iMX8QM

$ cd imx-scfw-porting-kit-1.7.3/src/

$ tar xf scfw_export_mx8qm_b0.tar.gz

$ ls scfw_export_mx8qm_b0

bin  build_mx8qm_b0  COPYING  Makefile  makefiles  MANIFEST  platform  SCR-imx-scfw-porting-kit.txt

----------------------------------

./ 檢視目前SCFW版本号/Commit

----------------------------------

$ cd ~/workdir/build-scfw/packages/imx-scfw-porting-kit-1.7.3/

$ $ cat VERSION

NXP i.MX System Controller Firmware

--------------------------------------------

Git repo:      ssh://bitbucket.sw.nxp.com/imxpriv/imx-sc-firmware.git

Branch name:   imx_scfw_2020q4

Build version: 5222

Commit ID:     bc122ee1

Build date:    May 27 2021

Build time:    16:27:17

----------------------------------

./ 将Toradex Apalis iMX8QM針對其核心闆的相關修改部署到上述下載下傳NXP imx8qm SCFW 源代碼中

----------------------------------

$ cd build-scfw/packages/imx-scfw-porting-kit-1.7.3/src

$ git clone https://github.com/toradex/i.MX-System-Controller-Firmware.git

$ cp -r i.MX-System-Controller-Firmware/src/scfw_export_mx8qm_b0

    ......

    PARTITION_NAME(SC_PT, "SCU");

    PARTITION_NAME(SECO_PT, "SECO");

    PARTITION_NAME(pt_boot, "BOOT");

    ......

        if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE)

        {

            sc_rm_mr_t mr;

            static const sc_rsrc_t rsrc_list[7U] =

            {

                SC_R_SYSTEM,

                SC_R_IRQSTR_M4_0,

                SC_R_MU_5B,

                SC_R_MU_7A,

                SC_R_MU_8B,

                SC_R_GPT_4,

                SC_R_SECO_MU_4

            };

......

----------------------------------

./ 修改好源代碼後,配置toolchain準備進行編譯

----------------------------------

### 使用GCC ARM 針對 Coretex-M核心的GNU-RM 最新版本即可,下載下傳位址如下,目前針對Linux X86_64平台的最新版本為gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads

$ cd ~/workdir

$ mkdir toolchain

$ cd toolchain

### 解壓下載下傳的toolchain壓縮包

$ tar xvf gcc-arm-none-eabi-10-2020-q4-major-x86_64-linux.tar.bz2

$ ls gcc-arm-none-eabi-10-2020-q4-major

arm-none-eabi  bin  lib  share

### export 編譯環境變量

$ export ARCH=arm

$ export CROSS_COMPILE=~/workdir/toolchain/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-

$ export PATH=$PATH:~/workdir/toolchain/gcc-arm-none-eabi-10-2020-q4-major/bin

### 測試toolchain

$ arm-none-eabi-gcc --version

arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10-2020-q4-major) 10.2.1 20201103 (release)

Copyright (C) 2020 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

./ SCFW編譯

----------------------------------

$ cd ~/workdir/build-scfw/packages/imx-scfw-porting-kit-1.7.3/src/scfw_export_mx8qm_b0

$ make clean;make SOC=MX8QM B=apalis D=0 DL=0 R=b0 U=0 V=0 qm

Generating platform/board/mx8qm_apalis/dcd/imx8_ramid1_dcd_1.6GHz.h

......

Linking build_mx8qm_b0/scfw_tcm.elf ....

Objcopy build_mx8qm_b0/scfw_tcm.bin ....

done.

### 關于編譯的相關選項含義,可以通過help檢視,比如D配置debug選項,U配置SCU調試UART

$ make help

Usage: make TARGET OPTIONS

Targets:

help           : display help text

clean          : remove all build files

  dxl             : build for i.MX8DXL die, output in build_mx8dxl

  qm             : build for i.MX8QM die, output in build_mx8qm

  ......

Options:

V=0            : quite output (default)

V=1            : verbose output

D=0            : configure for no debug

D=1            : configure for debug (default)

DL=<level>     : configure debug level (0-5)

B=<board>      : configure board (default=val)

U=<uart>       : configure debug UART (default=0)

DDR_CON=<file> : specify DDR config file

R=<srev>       : silicon revision (default=A0)

M=0            : no debug monitor (default)

M=1            : include debug monitor

LTO=0          : build without link-time optimization (default)

LTO=1          : build with link-time optimization

T=<test>       : run tests rather than boot next core

----------------------------------

./ 編譯好生成的SCFW固件位于如下位置,後面打包Boot Container Image會需要

----------------------------------

$ ls build_mx8qm_b0/scfw_tcm.bin

----------------------------------

當然,如果你無需修改Toradex SCFW的預設配置,也可以從下面github上面直接下載下傳Toradex編譯好的SCFW binary固件檔案mx8qm-apalis-scfw-tcm.bin後重命名為scfw_tcm.bin

----------------------------------

$ wget https://github.com/toradex/i.MX-System-Controller-Firmware/blob/master/src/scfw_export_mx8qm_b0/build_mx8qm_b0/mx8qm-apalis-scfw-tcm.bin

$ mv mx8qm-apalis-scfw-tcm.bin scfw_tcm.bin

----------------------------------

d). 編譯ATF

./ 擷取ATF源代碼

-------------------------------

$ cd ~/workdir

$ git clone git://git.toradex.com/imx-atf.git -b toradex_imx_5.4.70_2.3.0

-------------------------------

./ 參考這裡說明配置編譯toolchain,因為ATF運作與Cortex-A核心,是以和上面SCFW不同,需要使用GCC ARM針對Coretx-A核心的GNU-A toolchain,為了和Ycoto編譯版本Dunfell對應,這裡使用了9.2 aarch64 64bit版本。另外,請注意因為使用編譯器和上述SCFW編譯不同,是以要開一個新的Terminal視窗進行配合和後續編譯。

-------------------------------

$ cd ~/workdir/toolchain/

### 解壓下載下傳的toolchain壓縮包

$ tar xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz

$ ls gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu

9.2-2019.12-x86_64-aarch64-none-linux-gnu-manifest.txt  bin      lib    libexec

aarch64-none-linux-gnu                                  include  lib64  share

### export 編譯環境變量

$ export ARCH=arm

$ export CROSS_COMPILE=aarch64-none-linux-gnu-

$ export PATH=$PATH:~/workdir/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin

### 測試toolchain

$ aarch64-none-linux-gnu-gcc --version

aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025

Copyright © 2019 Free Software Foundation, Inc.

......

-------------------------------

./ 編譯ATF

-------------------------------

$ cd ~/workdir/imx-atf

$ make PLAT=imx8qm bl31

  CC      plat/imx/imx8qm/imx8qm_bl31_setup.c

......

  LD      build/imx8qm/release/bl31/bl31.elf

  BIN     build/imx8qm/release/bl31.bin

Built build/imx8qm/release/bl31.bin successfully

  OD      build/imx8qm/release/bl31/bl31.dump

### 編譯出 bl31.bin 再後續組裝Boot Container Image中會需要

$ ls build/imx8qm/release/bl31.bin

build/imx8qm/release/bl31.bin

-------------------------------

e). U-boot編譯

./ 參考這裡說明進行U-boot源代碼下載下傳以及編譯,這個就是比較正常的bootloader修改編譯過程了,針對iMX8/iMX8X平台,如果隻是需要修改U-boot(SCFW不做修改)的話也需要參考本文流程重新組裝Boot Container Image檔案後再進行部署。

./ 下載下傳對應BSP版本U-boot源代碼

-------------------------------

$ cd ~/workdir

$ git clone -b toradex_imx_v2020.04_5.4.70_2.3.0 git://git.toradex.cn/u-boot-toradex.git

-------------------------------

./ 編譯toolchain及上一章節編譯ATF同樣toolchain配置,這裡不再贅述。

./ 編譯,生成u-boot.bin用于後續Boot Container Image組裝

-------------------------------

$ cd ~/workdir/u-boot-toradex

$ make apalis-imx8_defconfig

$ make -j$(nproc) 2>&1 | tee build.log

$ ls u-boot.bin

u-boot.bin

-------------------------------

f). Boot Container Image組裝

./ 首先下載下傳 imx-mkimage 工具

-------------------------------

$ cd ~/workdir/

$ git clone -b imx_5.4.70_2.3.0 https://source.codeaurora.org/external/imx/imx-mkimage/

-------------------------------

./ 将上述章節準備好的SECO、SCFW、ATF、U-boot binary檔案複制到imx-mkimage對應目錄

-------------------------------

$ cd ~/workdir/imx-mkimage/

$ cp ~/workdir/imx-seco-3.8.1/firmware/seco/mx8qmb0-ahab-container.img iMX8QM

$ cp ~/workdir/build-scfw/../build_mx8qm_b0/scfw_tcm.bin iMX8QM

$ cp ~/workdir/imx-atf/build/imx8qm/release/bl31.bin iMX8QM

$ cp ~/workdir/u-boot-toradex/u-boot.bin iMX8QM

-------------------------------

./ 組裝Boot Container Image,最終生成 flash.bin 檔案

-------------------------------

$ make SOC=iMX8QM flash_b0

$ ls iMX8QM/flash.bin

iMX8QM/flash.bin

-------------------------------

5). 部署測試

a). 從這裡下載下傳Toradex Ycoto Linux BSP Multimedia Image Quarterly 5.2.0+build.7版本,預設image通過Toradex Easy Installer安裝後啟動通過調試序列槽可以看到目前的SCFW Commit ID

-------------------------------

U-Boot 2020.04-5.2.0-devel+git.76fd4496a40b (Apr 07 2021 - 07:35:42 +0000)

CPU:   NXP i.MX8QM RevB A53 at 1200 MHz

DRAM:  4 GiB

MMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2

Loading Environment from MMC... OK

In:    serial

Out:   serial

Err:   serial

Model: Toradex Apalis iMX8 QuadMax 4GB Wi-Fi / BT IT V1.1B, Serial# 06738378

 BuildInfo:

  - SCFW 0d54291f, SECO-FW d63fdb21, IMX-MKIMAGE 8947fea3, ATF 7f1187b

  - U-Boot 2020.04-5.2.0-devel+git.76fd4496a40b

-------------------------------

b). 用上述章節4生成的 flash.bin檔案替換掉剛才下載下傳的BSP 5.2.0 image壓縮包裡面的imx-boot檔案

-------------------------------

$ cd ~/workdir/

$ tar xvf Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.2.0+build.7.tar

$ cd Apalis-iMX8_Reference-Multimedia-Image-Tezi_5.2.0+build.7/

$ rm imx-boot

$ cp imx-mkimage/iMX8QM/flash.bin imx-boot

-------------------------------

c). 将上述修改後的image重新通過Toradex Easy Installer更新到Apalis iMX8子產品後,啟動檢視SCFW Commit ID是否和之前SCFW編譯章節檢視到的Commit一緻,如一緻說明編譯部署成功。

-------------------------------

U-Boot 2020.04-06904-g7f3416a28c (Jul 05 2021 - 15:43:42 +0800)

CPU:   NXP i.MX8QM RevB A53 at 1200 MHz

DRAM:  4 GiB

MMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2

Loading Environment from MMC... OK

In:    serial

Out:   serial

Err:   serial

Model: Toradex Apalis iMX8 QuadMax 4GB Wi-Fi / BT IT V1.1B, Serial# 06738378

 BuildInfo:

  - SCFW bc122ee1, SECO-FW d63fdb21, IMX-MKIMAGE 8947fea3, ATF

  - U-Boot 2020.04-06904-g7f3416a28c

-------------------------------

6). 總結

本文基于NXP iMX8嵌入式平台簡單介紹了NXP iMX8/iMX8X新一代iMX處理器的啟動流程,以及SCFW、ATF、U-boot的編譯和Boot Container Image的組裝供參考,而NXP另外一個iMX8M Mini/Plus系列是不包含SCU的,但是還是需要一個包含DDR timing、ATF、SPL、U-boot等的Boot Container Image,詳細編譯可以參考這裡說明。

參考文獻

https://www.nxp.com.cn/docs/en/application-note/AN13275.pdf

https://developer.toradex.com/knowledge-base/build-custom-imx-88x-system-controller-firmware-scfw

https://developer.toradex.cn/knowledge-base/build-u-boot-and-linux-kernel-from-source-code