众所周知,Android系统是比较复杂的,在这里我们简析一下Android 系统中的UBOOT是怎么编译的。软件版本我们以Android p 9.0.0_2.3.x auto 版本
Software:Android p 9.0.0_2.3.x auto
Hardware:imx8qm/imx8qxp mek
在这里我们主要看两个文件,下面我们细细讲来。
1.BoardConfig.mk
文件路径如下:
android-auto-p\android_build\device\fsl\imx8q\mek_8q
这个文件中包括板级的设置,例如蓝牙,wifi等相关的配置。
另外还包括UBOOT的config选择,DTS以及kernel config 的选择,AVB key 的位置等信息。
详细代码如下所示:
#
# Product-specific compile-time definitions.
#
IMX_DEVICE_PATH := device/fsl/imx8q/mek_8q
include device/fsl/imx8q/BoardConfigCommon.mk
ifeq ($(PREBUILT_FSL_IMX_CODEC),true)
-include $(FSL_CODEC_PATH)/fsl-codec/fsl-codec.mk
-include $(FSL_RESTRICTED_CODEC_PATH)/fsl-restricted-codec/imx_dsp_aacp_dec/imx_dsp_aacp_dec.mk
-include $(FSL_RESTRICTED_CODEC_PATH)/fsl-restricted-codec/imx_dsp_codec/imx_dsp_codec.mk
-include $(FSL_RESTRICTED_CODEC_PATH)/fsl-restricted-codec/imx_dsp/imx_dsp.mk
endif
BUILD_TARGET_FS ?= ext4
TARGET_USERIMAGES_USE_EXT4 := true
ifeq ($(PRODUCT_IMX_CAR),true)
TARGET_RECOVERY_FSTAB = $(IMX_DEVICE_PATH)/fstab.freescale.car
else
TARGET_RECOVERY_FSTAB = $(IMX_DEVICE_PATH)/fstab.freescale
endif # PRODUCT_IMX_CAR
# Support gpt
ifeq ($(PRODUCT_IMX_CAR),true)
BOARD_BPT_INPUT_FILES += device/fsl/common/partition/device-partitions-13GB-ab-dual-bootloader.bpt
ADDITION_BPT_PARTITION = partition-table-7GB:device/fsl/common/partition/device-partitions-7GB-ab-dual-bootloader.bpt \
partition-table-28GB:device/fsl/common/partition/device-partitions-28GB-ab-dual-bootloader.bpt
else
BOARD_BPT_INPUT_FILES += device/fsl/common/partition/device-partitions-13GB-ab.bpt
ADDITION_BPT_PARTITION = partition-table-7GB:device/fsl/common/partition/device-partitions-7GB-ab.bpt \
partition-table-28GB:device/fsl/common/partition/device-partitions-28GB-ab.bpt
endif
# Vendor Interface Manifest
ifeq ($(PRODUCT_IMX_CAR),true)
DEVICE_MANIFEST_FILE := $(IMX_DEVICE_PATH)/manifest_car.xml
else
DEVICE_MANIFEST_FILE := $(IMX_DEVICE_PATH)/manifest.xml
endif
# Vendor compatibility matrix
DEVICE_MATRIX_FILE := $(IMX_DEVICE_PATH)/compatibility_matrix.xml
TARGET_BOOTLOADER_BOARD_NAME := MEK
PRODUCT_MODEL := MEK-MX8Q
TARGET_BOOTLOADER_POSTFIX := bin
USE_OPENGL_RENDERER := true
TARGET_CPU_SMP := true
BOARD_WLAN_DEVICE := qcwcn
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
BOARD_HOSTAPD_DRIVER := NL80211
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
WIFI_HIDL_FEATURE_DUAL_INTERFACE := true
BOARD_VENDOR_KERNEL_MODULES += \
$(KERNEL_OUT)/drivers/net/wireless/qcacld-2.0/wlan.ko
ifeq ($(PRODUCT_IMX_CAR_M4),true)
BOARD_VENDOR_KERNEL_MODULES += \
$(KERNEL_OUT)/drivers/extcon/extcon-ptn5150.ko \
$(KERNEL_OUT)/drivers/hid/usbhid/usbhid.ko \
$(KERNEL_OUT)/drivers/staging/typec/tcpci.ko \
$(KERNEL_OUT)/drivers/staging/typec/tcpm.ko \
$(KERNEL_OUT)/drivers/usb/cdns3/cdns3.ko \
$(KERNEL_OUT)/drivers/usb/chipidea/ci_hdrc.ko \
$(KERNEL_OUT)/drivers/usb/chipidea/ci_hdrc_imx.ko \
$(KERNEL_OUT)/drivers/usb/chipidea/usbmisc_imx.ko \
$(KERNEL_OUT)/drivers/usb/core/usbcore.ko \
$(KERNEL_OUT)/drivers/usb/host/xhci-hcd.ko \
$(KERNEL_OUT)/drivers/usb/host/ehci-hcd.ko \
$(KERNEL_OUT)/drivers/usb/storage/usb-storage.ko \
$(KERNEL_OUT)/drivers/usb/typec/typec.ko \
$(KERNEL_OUT)/drivers/scsi/sd_mod.ko \
$(KERNEL_OUT)/drivers/bluetooth/mx8_bt_rfkill.ko \
$(KERNEL_OUT)/drivers/hid/hid-multitouch.ko \
$(KERNEL_OUT)/drivers/gpu/drm/bridge/it6263.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_prg.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_dprc.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_pc.ko \
$(KERNEL_OUT)/drivers/gpu/imx/dpu-blit/imx-dpu-blit.ko \
$(KERNEL_OUT)/drivers/gpu/drm/imx/dpu/imx-dpu-render.ko \
$(KERNEL_OUT)/drivers/gpu/imx/dpu/imx-dpu-core.ko \
$(KERNEL_OUT)/drivers/gpu/drm/imx/dpu/imx-dpu-crtc.ko \
$(KERNEL_OUT)/drivers/media/platform/imx8/max9286_gmsl.ko \
$(KERNEL_OUT)/drivers/media/platform/imx8/mxc-mipi-csi2.ko \
$(KERNEL_OUT)/drivers/media/platform/imx8/mxc-media-dev.ko \
$(KERNEL_OUT)/drivers/media/platform/imx8/mxc-capture.ko \
BOARD_RECOVERY_KERNEL_MODULES += \
$(KERNEL_OUT)/drivers/gpu/drm/bridge/it6263.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_prg.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_dprc.ko \
$(KERNEL_OUT)/drivers/gpu/imx/imx8_pc.ko \
$(KERNEL_OUT)/drivers/gpu/imx/dpu-blit/imx-dpu-blit.ko \
$(KERNEL_OUT)/drivers/gpu/drm/imx/dpu/imx-dpu-render.ko \
$(KERNEL_OUT)/drivers/gpu/imx/dpu/imx-dpu-core.ko \
$(KERNEL_OUT)/drivers/gpu/drm/imx/dpu/imx-dpu-crtc.ko
endif
# Qcom 1CQ(QCA6174) BT
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(IMX_DEVICE_PATH)/bluetooth
BOARD_HAVE_BLUETOOTH_QCOM := true
BOARD_HAS_QCA_BT_ROME := true
BOARD_HAVE_BLUETOOTH_BLUEZ := false
QCOM_BT_USE_SIBS := true
ifeq ($(QCOM_BT_USE_SIBS), true)
WCNSS_FILTER_USES_SIBS := true
endif
# sensor configs
BOARD_USE_SENSOR_FUSION := true
BOARD_USE_SENSOR_PEDOMETER := false
ifeq ($(PRODUCT_IMX_CAR),true)
BOARD_USE_LEGACY_SENSOR := false
else
BOARD_USE_LEGACY_SENSOR :=true
endif
# for recovery service
TARGET_SELECT_KEY := 28
# we don't support sparse image.
TARGET_USERIMAGES_SPARSE_EXT_DISABLED := false
UBOOT_POST_PROCESS := true
# camera hal v3
IMX_CAMERA_HAL_V3 := true
BOARD_HAVE_USB_CAMERA := true
# whether to accelerate camera service with openCL
# it will make camera service load the opencl lib in vendor
# and break the full treble rule
# OPENCL_2D_IN_CAMERA := true
USE_ION_ALLOCATOR := true
USE_GPU_ALLOCATOR := false
# define frame buffer count
NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
ifeq ($(PRODUCT_IMX_CAR),true)
KERNEL_NAME := Image.lz4
else
KERNEL_NAME := Image
endif
BOARD_KERNEL_CMDLINE := init=/init androidboot.hardware=freescale androidboot.fbTileSupport=enable cma=800M@0x960M-0xe00M androidboot.primary_display=imx-drm firmware_class.path=/vendor/firmware transparent_hugepage=never loop.max_part=7
# Default wificountrycode
BOARD_KERNEL_CMDLINE += androidboot.wificountrycode=CN
ifeq ($(PRODUCT_IMX_CAR),true)
BOARD_KERNEL_CMDLINE += galcore.contiguousSize=33554432 video=HDMI-A-2:d
else
BOARD_KERNEL_CMDLINE += androidboot.console=ttyLP0
endif
ifeq ($(TARGET_USERIMAGES_USE_UBIFS),true)
ifeq ($(TARGET_USERIMAGES_USE_EXT4),true)
$(error "TARGET_USERIMAGES_USE_UBIFS and TARGET_USERIMAGES_USE_EXT4 config open in same time, please only choose one target file system image")
endif
endif
BOARD_PREBUILT_DTBOIMAGE := out/target/product/mek_8q/dtbo-imx8qm.img
ifeq ($(OTA_TARGET),8qxp)
BOARD_PREBUILT_DTBOIMAGE := out/target/product/mek_8q/dtbo-imx8qxp.img
endif
ifeq ($(PRODUCT_IMX_CAR),true)
AB_OTA_PARTITIONS += bootloader
BOARD_OTA_BOOTLOADERIMAGE := out/target/product/mek_8q/bootloader-imx8qm.img
ifeq ($(OTA_TARGET),8qxp)
BOARD_OTA_BOOTLOADERIMAGE := out/target/product/mek_8q/bootloader-imx8qxp.img
endif
ifeq ($(PRODUCT_IMX_CAR_M4),true)
# imx8qm auto android
TARGET_BOARD_DTS_CONFIG := imx8qm:fsl-imx8qm-mek-car.dtb
# imx8qm auto android virtualization
TARGET_BOARD_DTS_CONFIG += imx8qm-xen:fsl-imx8qm-mek-domu-car.dtb
# imx8qxp auto android
TARGET_BOARD_DTS_CONFIG += imx8qxp:fsl-imx8qxp-mek-car.dtb
# u-boot target for imx8qm_mek auto android
TARGET_BOOTLOADER_CONFIG := imx8qm:imx8qm_mek_androidauto_trusty_defconfig
# u-boot target for imx8qxp_mek auto android
TARGET_BOOTLOADER_CONFIG += imx8qxp:imx8qxp_mek_androidauto_trusty_defconfig
TARGET_BOOTLOADER_CONFIG += imx8qxp-c0:imx8qxp_mek_androidauto_trusty_defconfig
else
# imx8qm auto android without m4 image
TARGET_BOARD_DTS_CONFIG := imx8qm:fsl-imx8qm-mek-car2.dtb
# imx8qxp auto android without m4 image
TARGET_BOARD_DTS_CONFIG += imx8qxp:fsl-imx8qxp-mek-car2.dtb
# u-boot target for imx8qm_mek auto android
TARGET_BOOTLOADER_CONFIG := imx8qm:imx8qm_mek_androidauto2_trusty_defconfig
# u-boot target for imx8qxp_mek auto android
TARGET_BOOTLOADER_CONFIG += imx8qxp:imx8qxp_mek_androidauto2_trusty_defconfig
TARGET_BOOTLOADER_CONFIG += imx8qxp-c0:imx8qxp_mek_androidauto2_trusty_defconfig
endif #PRODUCT_IMX_CAR_M4
# u-boot target for imx8qm_mek auto android virtualization
TARGET_BOOTLOADER_CONFIG += imx8qm-xen:imx8qm_mek_androidauto_xen_dual_defconfig
# u-boot target for imx8qm_mek linux which has virtualization enabled
TARGET_BOOTLOADER_CONFIG += imx8qm-xen-dom0:imx8qm_mek_spl_defconfig
else
# imx8qm standard android; MIPI-HDMI display
TARGET_BOARD_DTS_CONFIG := imx8qm:fsl-imx8qm-mek-ov5640.dtb
# imx8qm standard android; MIPI panel display
TARGET_BOARD_DTS_CONFIG += imx8qm-mipi-panel:fsl-imx8qm-mek-dsi-rm67191.dtb
# imx8qm standard android; HDMI display
TARGET_BOARD_DTS_CONFIG += imx8qm-hdmi:fsl-imx8qm-mek-hdmi.dtb
# imx8qxp standard android; MIPI-HDMI display
TARGET_BOARD_DTS_CONFIG += imx8qxp:fsl-imx8qxp-mek-ov5640.dtb
# u-boot target for imx8qm_mek standard android
TARGET_BOOTLOADER_CONFIG := imx8qm:imx8qm_mek_android_defconfig
# u-boot target for imx8qm_mek standard android with trusty support
TARGET_BOOTLOADER_CONFIG += imx8qm-trusty:imx8qm_mek_android_trusty_defconfig
# u-boot target for imx8qxp_mek standard android
TARGET_BOOTLOADER_CONFIG += imx8qxp:imx8qxp_mek_android_defconfig
TARGET_BOOTLOADER_CONFIG += imx8qxp-c0:imx8qxp_mek_android_defconfig
# u-boot target for imx8qxp_mek standard android
TARGET_BOOTLOADER_CONFIG += imx8qxp-trusty:imx8qxp_mek_android_trusty_defconfig
TARGET_BOOTLOADER_CONFIG += imx8qxp-trusty-c0:imx8qxp_mek_android_trusty_defconfig
endif #PRODUCT_IMX_CAR
# u-boot target used by uuu for imx8qm_mek
TARGET_BOOTLOADER_CONFIG += imx8qm-mek-uuu:imx8qm_mek_android_uuu_defconfig
# u-boot target used by uuu for imx8qxp_mek
TARGET_BOOTLOADER_CONFIG += imx8qxp-mek-uuu:imx8qxp_mek_android_uuu_defconfig
TARGET_BOOTLOADER_CONFIG += imx8qxp-mek-c0-uuu:imx8qxp_mek_android_uuu_defconfig
ifeq ($(PRODUCT_IMX_CAR),true)
ifeq ($(PRODUCT_IMX_CAR_M4),true)
TARGET_KERNEL_DEFCONFIG := android_car_defconfig
else
TARGET_KERNEL_DEFCONFIG := android_car2_defconfig
endif # PRODUCT_IMX_CAR_M4
include $(IMX_DEVICE_PATH)/build_id_car.mk
else
TARGET_KERNEL_DEFCONFIG := android_defconfig
include $(IMX_DEVICE_PATH)/build_id.mk
endif # PRODUCT_IMX_CAR
# TARGET_KERNEL_ADDITION_DEFCONF := android_addition_defconfig
BOARD_SEPOLICY_DIRS := \
device/fsl/imx8q/sepolicy \
$(IMX_DEVICE_PATH)/sepolicy
ifeq ($(PRODUCT_IMX_CAR),true)
BOARD_SEPOLICY_DIRS += \
packages/services/Car/car_product/sepolicy \
packages/services/Car/evs/sepolicy \
device/fsl/imx8q/sepolicy_car \
$(IMX_DEVICE_PATH)/sepolicy_car \
device/generic/car/common/sepolicy
endif
ifeq ($(PRODUCT_IMX_CAR),true)
TARGET_BOARD_RECOVERY_FORMAT_SKIP := true
TARGET_BOARD_RECOVERY_SBIN_SKIP := true
endif
BOARD_AVB_ENABLE := true
BOARD_AVB_ALGORITHM := SHA256_RSA4096
# The testkey_rsa4096.pem is copied from external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_KEY_PATH := device/fsl/common/security/testkey_rsa4096.pem
TARGET_USES_MKE2FS := true
TARGET_BOARD_KERNEL_HEADERS := device/fsl/common/kernel-headers
ifeq ($(PRODUCT_IMX_CAR),true)
BOARD_HAVE_IMX_EVS := true
endif
# define board type
BOARD_TYPE := MEK
下面我们看一下我们的bootloader文件之怎么编译出来的。
1.第一种把bootloader编译为两个文件,一个是spl 文件,另外一个是TEE,
ATF和uboot的合成。
2.第二种是将所有的文件编译到一个文件里面
第一种,笔者认为是为了方便a/b分区。把boot loader分为两部分。spl部分不轻易修改。而TEE,ATF,UBOOT合成一个新的image,这个image可以分为a,b两部分,可以进行OTA升级操作。下面我们看一下AndroidUboot.mk文件,这个是怎么编译出来的。
2.AndroidUboot.mk
文件位置:
android-auto-p\android_build\device\fsl\imx8q\mek_8q
代码如下:
# uboot.imx in android combine scfw.bin and uboot.bin
MAKE += SHELL=/bin/bash
ATF_TOOLCHAIN_ABS := $(realpath prebuilts/gcc/$(HOST_PREBUILT_TAG)/aarch64/aarch64-linux-android-4.9/bin)
ATF_CROSS_COMPILE := $(ATF_TOOLCHAIN_ABS)/aarch64-linux-androidkernel-
MCU_SDK_IMX8QM_DEMO_PATH := $(IMX_MCU_SDK_PATH)/mcu-sdk-auto/SDK_MEK-MIMX8QM/boards/mekmimx8qm/demo_apps/rear_view_camera/cm4_core1/armgcc
MCU_SDK_IMX8QM_CMAKE_FILE := ../../../../../../tools/cmake_toolchain_files/armgcc.cmake
MCU_SDK_IMX8QX_DEMO_PATH := $(IMX_MCU_SDK_PATH)/mcu-sdk-auto/SDK_MEK-MIMX8QX/boards/mekmimx8qx/demo_apps/rear_view_camera/armgcc
MCU_SDK_IMX8QX_CMAKE_FILE := ../../../../../tools/cmake_toolchain_files/armgcc.cmake
UBOOT_M4_OUT := $(TARGET_OUT_INTERMEDIATES)/MCU_OBJ
UBOOT_M4_BUILD_TYPE := ddr_release
define build_M4_image
mkdir -p $(UBOOT_M4_OUT)/$2; \
cmake -DCMAKE_TOOLCHAIN_FILE="$4" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=$3 -S $1 -B $(UBOOT_M4_OUT)/$2 1>/dev/null || exit 1; \
$(MAKE) -C $(UBOOT_M4_OUT)/$2 1>/dev/null || exit 1
endef
ifeq ($(PRODUCT_IMX_CAR_M4_BUILD),true)
ifeq ($(ARMGCC_DIR),)
$(error please install arm-none-eabi-gcc toolchain and set the installed path to ARMGCC_DIR)
endif
$(UBOOT_M4_OUT):
rm -rf $@
mkdir -p $@
UBOOT_M4_BIN: $(UBOOT_M4_OUT)
$(hide) echo "Building M4 image for UBoot ..."
cmake_version=$(shell cmake --version | head -n 1 | tr " " "\n" | tail -n 1); \
req_version="3.13.0"; \
if [ "$(shell echo "$$cmake_version $$req_version" | tr " " "\n" | sort -V | head -n 1)" != "$$req_version" ]; then \
echo "please upgrade cmake version to 3.13.0 or newer"; \
exit 1; \
fi; \
$(call build_M4_image,$(MCU_SDK_IMX8QM_DEMO_PATH),MIMX8QM,$(UBOOT_M4_BUILD_TYPE),$(MCU_SDK_IMX8QM_CMAKE_FILE)); \
$(call build_M4_image,$(MCU_SDK_IMX8QX_DEMO_PATH),MIMX8QX,$(UBOOT_M4_BUILD_TYPE),$(MCU_SDK_IMX8QX_CMAKE_FILE))
else
UBOOT_M4_BIN:
endif # PRODUCT_IMX_CAR_M4_BUILD
define build_imx_uboot
if [ `echo $(2) | cut -d '-' -f1` == "imx8qm" ] && [ `echo $(2) | cut -d '-' -f2` != "xen" ]; then \
MKIMAGE_PLATFORM=`echo iMX8QM`; \
SCFW_PLATFORM=`echo 8qm`; \
ATF_PLATFORM=`echo imx8qm`; \
REV=`echo B0`; \
if [ `echo $(2) | rev | cut -d '-' -f1` == "uuu" ]; then \
FLASH_TARGET=`echo flash_b0`; \
else \
FLASH_TARGET=`echo flash_linux_m4`; \
fi; \
cp $(FSL_PROPRIETARY_PATH)/imx-seco/firmware/seco/mx8qm*ahab-container.img $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/; \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/mcu-sdk/imx8q/imx8qm_m4_0_default.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_image.bin; \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/mcu-sdk/imx8q/imx8qm_m4_1_default.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_1_image.bin; \
if [ "$(PRODUCT_IMX_CAR)" == "true" ] && [ `echo $(2) | rev | cut -d '-' -f1` != "uuu" ]; then \
if [ "$(PRODUCT_IMX_CAR_M4)" == "true" ] ; then \
FLASH_TARGET=`echo flash_all_spl_container_ddr_car`; \
if [ -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_1_image.bin ]; then \
rm -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_1_image.bin; \
fi; \
cp $(UBOOT_M4_OUT)/MIMX8QM/$(UBOOT_M4_BUILD_TYPE)/m4_image.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_1_image.bin; \
fi; \
if [ -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmitxfw.bin ]; then \
rm -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmitxfw.bin; \
fi; \
if [ -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmirxfw.bin ]; then \
rm -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmirxfw.bin; \
fi; \
else \
cp $(FSL_PROPRIETARY_PATH)/linux-firmware-imx/firmware/hdmi/cadence/hdmitxfw.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmitxfw.bin; \
cp $(FSL_PROPRIETARY_PATH)/linux-firmware-imx/firmware/hdmi/cadence/hdmirxfw.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/hdmirxfw.bin; \
fi; \
elif [ "$(strip $(2))" == "imx8qm-xen-dom0" ]; then \
MKIMAGE_PLATFORM=`echo iMX8QM`; \
SCFW_PLATFORM=`echo 8qm`; \
ATF_PLATFORM=`echo imx8qm`; \
REV=`echo B0`; \
cp $(FSL_PROPRIETARY_PATH)/imx-seco/firmware/seco/mx8qm*ahab-container.img $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/; \
FLASH_TARGET=`echo flash_b0_spl_container_m4_1`; \
cp $(UBOOT_M4_OUT)/MIMX8QM/$(UBOOT_M4_BUILD_TYPE)/m4_image.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_1_image.bin; \
elif [ "$(strip $(2))" == "imx8qm-xen" ]; then \
MKIMAGE_PLATFORM=`echo iMX8QM`; \
FLASH_TARGET=`echo flash_b0_xen_uboot`; \
REV=`echo B0`; \
elif [ `echo $(2) | cut -d '-' -f1` == "imx8qxp" ]; then \
MKIMAGE_PLATFORM=`echo iMX8QX`; \
SCFW_PLATFORM=`echo 8qx`; \
ATF_PLATFORM=`echo imx8qx`; \
if [ `echo $(2) | cut -d '-' -f2` == "c0" ] || [ `echo $(2) | cut -d '-' -f3` == "c0" ]; then \
REV=`echo C0`; \
else \
REV=`echo B0`; \
fi; \
if [ `echo $(2) | rev | cut -d '-' -f1` == "uuu" ]; then \
FLASH_TARGET=`echo flash`; \
else \
FLASH_TARGET=`echo flash_linux_m4`; \
fi; \
cp $(FSL_PROPRIETARY_PATH)/imx-seco/firmware/seco/mx8qx*ahab-container.img $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/; \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/mcu-sdk/imx8q/imx8qx_m4_default.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_image.bin; \
if [ "$(PRODUCT_IMX_CAR)" == "true" ] && [ `echo $(2) | rev | cut -d '-' -f1` != "uuu" ]; then \
if [ "$(PRODUCT_IMX_CAR_M4)" == "true" ] ; then \
FLASH_TARGET=`echo flash_all_spl_container_ddr_car`; \
if [ -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_image.bin ]; then \
rm -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_image.bin; \
fi; \
cp $(UBOOT_M4_OUT)/MIMX8QX/$(UBOOT_M4_BUILD_TYPE)/rear_view_camera.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/m4_image.bin; \
fi; \
fi; \
fi; \
if [ "$(PRODUCT_IMX_CAR_M4)" == "true" ]; then \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/uboot-firmware/imx8q_car/mx$$SCFW_PLATFORM-scfw-tcm.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/scfw_tcm.bin; \
else \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/uboot-firmware/imx8q/mx$$SCFW_PLATFORM-scfw-tcm.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/scfw_tcm.bin; \
fi; \
if [ "$(PRODUCT_IMX_CAR)" == "true" -a `echo $(2) | rev | cut -d '-' -f1` != "uuu" -o `echo $(2) | cut -d '-' -f2` == "trusty" ]; then \
cp $(FSL_PROPRIETARY_PATH)/fsl-proprietary/uboot-firmware/imx8q_car/tee-imx$$SCFW_PLATFORM.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/tee.bin; \
else \
if [ -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/tee.bin ]; then \
rm -f $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/tee.bin; \
fi; \
fi; \
if [ "$(strip $(2))" != "imx8qm-xen" ]; then \
$(MAKE) -C $(IMX_PATH)/arm-trusted-firmware/ PLAT=$$ATF_PLATFORM clean; \
if [ "$(PRODUCT_IMX_CAR)" == "true" -a "$(strip $(2))" != "imx8qm-xen-dom0" -a `echo $(2) | rev | cut -d '-' -f1` != "uuu" -o `echo $(2) | cut -d '-' -f2` == "trusty" ]; then \
$(MAKE) -C $(IMX_PATH)/arm-trusted-firmware/ CROSS_COMPILE="$(ATF_CROSS_COMPILE)" PLAT=$$ATF_PLATFORM bl31 SPD=trusty -B 1>/dev/null || exit 1; \
else \
$(MAKE) -C $(IMX_PATH)/arm-trusted-firmware/ CROSS_COMPILE="$(ATF_CROSS_COMPILE)" PLAT=$$ATF_PLATFORM bl31 -B 1>/dev/null || exit 1; \
fi; \
cp $(IMX_PATH)/arm-trusted-firmware/build/$$ATF_PLATFORM/release/bl31.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/bl31.bin; \
cp $(UBOOT_OUT)/u-boot.$(strip $(1)) $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot.bin; \
if [ `echo $(2) | rev | cut -d '-' -f1` != "uuu" ]; then \
cp $(UBOOT_OUT)/spl/u-boot-spl.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-spl.bin; \
fi; \
cp $(UBOOT_OUT)/tools/mkimage $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/mkimage_uboot; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ clean; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ SOC=$$MKIMAGE_PLATFORM REV=$$REV $$FLASH_TARGET || exit 1; \
if [ "$(PRODUCT_IMX_CAR)" != "true" ] || [ `echo $(2) | rev | cut -d '-' -f1` == "uuu" ] || [ "$(strip $(2))" == "imx8qm-xen-dom0" ]; then \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/flash.bin $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
else \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/boot-spl-container.img $(PRODUCT_OUT)/spl-$(strip $(2)).bin; \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-atf-container.img $(PRODUCT_OUT)/bootloader-$(strip $(2)).img; \
rm $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
fi; \
else \
cp $(UBOOT_OUT)/u-boot.$(strip $(1)) $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot.bin; \
cp $(UBOOT_OUT)/spl/u-boot-spl.bin $(PRODUCT_OUT)/spl-$(strip $(2)).bin; \
cp $(UBOOT_OUT)/tools/mkimage $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/mkimage_uboot; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ clean; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ SOC=$$MKIMAGE_PLATFORM $$FLASH_TARGET 1>/dev/null || exit 1; \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-xen-container.img $(PRODUCT_OUT)/bootloader-$(strip $(2)).img; \
rm $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
fi;
endef
我们以imx8qm AUTO 版本为例。如果编译的是UUU的uboot,所选的target是flash,否则是flash_linux_m4。flash这个编译出的uboot是专门利用UUU工具烧写镜像文件所需要的。
继续往下看,如果设置了PRODUCT_IMX_CAR以及PRODUCT_IMX_CAR_M4,target变为flash_all_spl_container_ddr_car,我们看flash_linux_m4这个是在什么地方编译的呢,这个是在imx-mkimage目录下。
文件目录:
android-auto-p-2.3.3\android_build\vendor\nxp-opensource\imx-mkimage\iMX8QM
我们详细查看soc.mak
u-boot-hash.bin: u-boot.bin
./$(MKIMG) -commit > head.hash
@cat u-boot.bin head.hash > u-boot-hash.bin
u-boot-atf.bin: u-boot-hash.bin bl31.bin
@cp bl31.bin u-boot-atf.bin
@dd if=u-boot-hash.bin of=u-boot-atf.bin bs=1K seek=128
@if [ -f "hdmitxfw.bin" ] && [ -f "hdmirxfw.bin" ]; then \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmitxfw.bin hdmitxfw-pad.bin; \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmirxfw.bin hdmirxfw-pad.bin; \
cat u-boot-atf.bin hdmitxfw-pad.bin hdmirxfw-pad.bin > u-boot-atf-hdmi.bin; \
cp u-boot-atf-hdmi.bin u-boot-atf.bin; \
fi
u-boot-atf.itb: u-boot-hash.bin bl31.bin
@if [ -f "hdmitxfw.bin" ] && [ -f "hdmirxfw.bin" ]; then \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmitxfw.bin hdmitxfw-pad.bin; \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmirxfw.bin hdmirxfw-pad.bin; \
cat u-boot-hash.bin hdmitxfw-pad.bin hdmirxfw-pad.bin > u-boot-hash.bin.temp; \
mv u-boot-hash.bin.temp u-boot-hash.bin; \
fi
./$(PAD_IMAGE) bl31.bin
./$(PAD_IMAGE) u-boot-hash.bin
./mkimage_fit_atf.sh > u-boot.its;
./mkimage_uboot -E -p 0x3000 -f u-boot.its u-boot-atf.itb;
@rm -f u-boot.its
u-boot-atf-container.img: bl31.bin u-boot-hash.bin
@if [ -f "hdmitxfw.bin" ] && [ -f "hdmirxfw.bin" ]; then \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmitxfw.bin hdmitxfw-pad.bin; \
objcopy -I binary -O binary --pad-to 0x20000 --gap-fill=0x0 hdmirxfw.bin hdmirxfw-pad.bin; \
cat u-boot-hash.bin hdmitxfw-pad.bin hdmirxfw-pad.bin > u-boot-hash.bin.temp; \
mv u-boot-hash.bin.temp u-boot-hash.bin; \
fi
if [ -f "tee.bin" ]; then \
if [ $(shell echo $(ROLLBACK_INDEX_IN_CONTAINER)) ]; then \
./$(MKIMG) -soc QM -sw_version $(ROLLBACK_INDEX_IN_CONTAINER) -rev B0 -c -ap bl31.bin a53 0x80000000 -ap u-boot-hash.bin a53 0x80020000 -ap tee.bin a53 0xFE000000 -out u-boot-atf-container.img; \
else \
./$(MKIMG) -soc QM -rev B0 -c -ap bl31.bin a53 0x80000000 -ap u-boot-hash.bin a53 0x80020000 -ap tee.bin a53 0xFE000000 -out u-boot-atf-container.img; \
fi; \
else \
./$(MKIMG) -soc QM -rev B0 -c -ap bl31.bin a53 0x80000000 -ap u-boot-hash.bin a53 0x80020000 -out u-boot-atf-container.img; \
fi
...........................................
flash_linux_m4: $(MKIMG) $(AHAB_IMG) scfw_tcm.bin u-boot-spl.bin m4_image.bin m4_1_image.bin u-boot-atf-container.img
./$(MKIMG) -soc QM -rev B0 -dcd skip -append $(AHAB_IMG) -c -flags 0x00200000 -scfw scfw_tcm.bin -ap u-boot-spl.bin a53 0x00100000 -p3 -m4 m4_image.bin 0 0x34FE0000 -p4 -m4 m4_1_image.bin 1 0x38FE0000 -out flash.bin
cp flash.bin boot-spl-container.img
@flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \
pad_cnt=$$(((flashbin_size + 0x400 - 1) / 0x400)); \
echo "append u-boot-atf-container.img at $$pad_cnt KB"; \
dd if=u-boot-atf-container.img of=flash.bin bs=1K seek=$$pad_cnt;
再回到AndroidUboot.mk文件,
if [ `echo $(2) | rev | cut -d '-' -f1` != "uuu" ]; then \
cp $(UBOOT_OUT)/spl/u-boot-spl.bin $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-spl.bin; \
fi; \
cp $(UBOOT_OUT)/tools/mkimage $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/mkimage_uboot; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ clean; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ SOC=$$MKIMAGE_PLATFORM REV=$$REV $$FLASH_TARGET || exit 1; \
if [ "$(PRODUCT_IMX_CAR)" != "true" ] || [ `echo $(2) | rev | cut -d '-' -f1` == "uuu" ] || [ "$(strip $(2))" == "imx8qm-xen-dom0" ]; then \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/flash.bin $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
else \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/boot-spl-container.img $(PRODUCT_OUT)/spl-$(strip $(2)).bin; \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-atf-container.img $(PRODUCT_OUT)/bootloader-$(strip $(2)).img; \
rm $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
fi; \
else \
cp $(UBOOT_OUT)/u-boot.$(strip $(1)) $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot.bin; \
cp $(UBOOT_OUT)/spl/u-boot-spl.bin $(PRODUCT_OUT)/spl-$(strip $(2)).bin; \
cp $(UBOOT_OUT)/tools/mkimage $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/mkimage_uboot; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ clean; \
$(MAKE) -C $(IMX_MKIMAGE_PATH)/imx-mkimage/ SOC=$$MKIMAGE_PLATFORM $$FLASH_TARGET 1>/dev/null || exit 1; \
cp $(IMX_MKIMAGE_PATH)/imx-mkimage/$$MKIMAGE_PLATFORM/u-boot-xen-container.img $(PRODUCT_OUT)/bootloader-$(strip $(2)).img; \
rm $(PRODUCT_OUT)/u-boot-$(strip $(2)).imx; \
fi;
这部分讲的就是生成最后的bootloader 相关的image的方法。