热度 13
2021-7-5 17:04
3142 次阅读|
0 个评论
B y Toradex 秦海 1). 简介 NXP iMX8 系列 ARM 处理器是 NXP 目前性能最强劲确也是架构最复杂的 ARM 处理器,和之前的 ARMv7 系列处理器比如 iMX6 系列不同,在 iMX8 系列芯片中 NXP 加入了 SCU 模块来管理芯片的启动和关键外设初始化(如 PMIC 、时钟等), iMX8QM 处理器的简单框图如下: SCU(System Control Unit) 的框图放大如下,其中包含一个基于 Cortex-M4 内核的 SCU CM4 Complex 模块,其运行的固件就是 SCFW ,还有一基于 Cortex-M0 内核的 SECO 模块,运行 SECO 固件,负责安全认证相关的工作。 本文 就简单介绍下 iMX8 处理器的启动流程,然后结合 来自于 Toradex Apalis iMX 8 的 ARM 嵌入式平台, 演示一下包含了 SCFW 以及 SECO 固件等的 boot container image 的编译流程。 2). 准备 a). Apalis iMX8QM 4 GB WB IT ARM 核心版配合 Ioxra 载板 ,连接调试串口 UART1 (载板 X2 2 )到开发主机方便调试。 3). NXP iMX8 启动流程 a). NXP iMX8 启动流程图如下所示,首先 SCU boot rom 代码加载启动,然后通过芯片的 SCU boot mode 相关管脚配置,来选择进入那种启动模式,一般要么是正常启动,要么是进入恢复模式,然后通过 SDP 模式启动。正常启动流程到最后,加载运行 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 。 c ). Boot container image 加载流程如下图,最后当 U-boot 运行后,就由 U-boot 控制进行正常的 Linux Kernel 和 Rootfs 加载流程了。 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 ./ 解压到 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/* /scfw_export_mx8qm_b0/ ---------------------------------- . / 可选 - 根据需要修改 SCFW 源代码 ---------------------------------- ### 参考文档位于 ../imx-scfw-porting-kit-1.7.3/doc/ ,有 HDML 和 PDF 两种格式文档 $ ls pdf/ sc_fw_api_dxl_a0.pdf sc_fw_api.pdf sc_fw_api_qm_b0.pdf sc_fw_api_qx_b0.pdf sc_fw_rn.pdf # ## 针对 Toradex Apalis iMX8 ,核心修改文件位于 ### build-scfw/packages/imx-scfw-porting-kit-1.7.3/src/scfw_export_mx8qm_b0/platform/board/mx8qm_apalis $ ls board.bom board.c board.h dcd Makefile ### dcd 目录主要存放 ram timing 配置文件,主要修改部分在 board.c 这个文件,这个文件的内容和修改请参考上述 sc_fw_port.pdf 文档说明,包含了从底层 CPU/RAM/ 时钟 /PMIC 初始化到外部资源分配的各方面 ### 比如常用的 SOC 资源在 SCU 、 Cortex-A 、 Cortex-M 核心直接的分配,可以参考文档的第六章节,通过 board.c 文件的 board_system_config() 函数来进行配置,当然也有其他 run-time 的 API 函数可用 void board_system_config(sc_bool_t early, sc_rm_pt_t pt_boot) { sc_err_t err = SC_ERR_NONE; /* This function configures the system. It usually partitions resources according to the system design. It must be modified by customers. Partitions should then be specified using the mkimage -p option. */ /* Note the configuration here is for NXP test purposes */ ...... /* Name default partitions */ PARTITION_NAME(SC_PT, "SCU"); PARTITION_NAME(SECO_PT, "SECO"); PARTITION_NAME(pt_boot, "BOOT"); /* Configure initial resource allocation (note additional allocation and assignments can be made by the SCFW clients at run-time */ ...... /* Create M4 0 partition */ if (rm_is_resource_avail(SC_R_M4_0_PID0) != SC_FALSE) { sc_rm_mr_t mr; /* List of resources */ static const sc_rsrc_t rsrc_list = { 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= : configure debug level (0-5) B= : configure board (default=val) U= : configure debug UART (default=0) DDR_CON= : specify DDR config file R= : 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= : 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 ~/workdi r/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.c n /u-boot-toradex.git ------------------------------- ./ 编译 toolchain 及上一章节编译 ATF 同样 toolchain 配置,这里不再赘述。 ./ 编译,生成 u-boot.bin 用于后续 Boot Container Image 组装 ------------------------------- $ cd ~/workdir/u-boot-toradex $ make apalis-imx8_defconfig $ &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 iMX 8 嵌入式平台 简单介绍了 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