## CPU Architecture selection via $ARCH # check for math library ifeq ($(SPMATH),1) # SP Math MATH_OBJS:=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_int.o else ifeq ($(SPMATHALL),1) # SP Math all CFLAGS+=-DWOLFSSL_SP_MATH_ALL MATH_OBJS:=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_int.o else # Fastmath CFLAGS+=-DUSE_FAST_MATH MATH_OBJS:=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/integer.o $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/tfm.o endif endif # Default flash offset ARCH_FLASH_OFFSET?=0x0 # Default SPI driver name SPI_TARGET=$(TARGET) # Default UART driver name UART_TARGET=$(TARGET) # Include some modules by default WOLFCRYPT_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sha256.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/hash.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/memory.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/wc_port.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/wolfmath.o ifeq ($(ARCH),x86_64) CFLAGS+=-DARCH_x86_64 -DFAST_MEMCPY ifeq ($(FORCE_32BIT),1) NO_ASM=1 CFLAGS+=-DFORCE_32BIT endif ifeq ($(SPMATH),1) ifeq ($(NO_ASM),1) ifeq ($(FORCE_32BIT),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o CFLAGS+=-DWOLFSSL_SP_DIV_WORD_HALF else MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c64.o endif else MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_x86_64.o MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_x86_64_asm.o WOLFCRYPT_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/cpuid.o endif endif ifeq ($(TARGET),x86_64_efi) OBJS+=src/boot_x86_64.o ifeq ($(DEBUG),1) CFLAGS+=-DWOLFBOOT_DEBUG_EFI=1 endif endif endif ## ARM Cortex-A ifeq ($(ARCH),AARCH64) ifeq ($(TARGET),aarch64_efi) # UEFI app: Linux GNU toolchain (freestanding EFI ABI), not aarch64-none-elf- CROSS_COMPILE?=aarch64-linux-gnu- else CROSS_COMPILE?=aarch64-none-elf- endif CFLAGS+=-DARCH_AARCH64 -DFAST_MEMCPY ifeq ($(TARGET),aarch64_efi) # UEFI app: gnu-efi CRT0 is the entry; do_boot is in boot_aarch64_efi.o. # Skip the bare-metal reset (boot_aarch64_start.S) and EL2/GIC glue. OBJS+=src/boot_aarch64_efi.o else OBJS+=src/boot_aarch64.o src/boot_aarch64_start.o endif ifeq ($(TARGET),zynq) ARCH_FLAGS=-march=armv8-a+crypto CFLAGS+=$(ARCH_FLAGS) -DCORTEX_A53 CFLAGS+=-DNO_QNX # Support detection and skip of U-Boot legacy header */ CFLAGS+=-DWOLFBOOT_UBOOT_LEGACY CFLAGS+=-DWOLFBOOT_DUALBOOT # FPGA bitstream-from-FIT is supported via the PMU firmware # (PM_FPGA_LOAD). Enable with FPGA_BITSTREAM=1 (opt-in). ifeq ($(HW_SHA3),1) # Use HAL for hash (see zynqmp.c) HASH_HAL=1 CFLAGS+=-DWOLFBOOT_ZYNQMP_CSU endif ifeq ($(ZYNQMP_FSBL),1) # wolfBoot fully replaces the Xilinx FSBL: the BootROM authenticates and # loads wolfBoot into OCM at EL3, and wolfBoot runs psu_init() to bring up # the PLLs/DDR/MIO/clocks before loading the downstream images. wolfBoot # therefore links and runs entirely from OCM (DDR is not up at entry). # # The board-specific psu_init_gpl.c / psu_init_gpl.h (generated from the # XSA, Xilinx copyright) are supplied at build time from # ZYNQMP_PSU_INIT_DIR and are NOT part of the wolfBoot tree. The # hal/zynqmp/ shim headers (xil_io.h, sleep.h) let that unmodified file # compile. Set EL3_SECURE=1 in the target .config. ZYNQMP_PSU_INIT_DIR?=hal/board/zynqmp CFLAGS+=-DWOLFBOOT_ZYNQMP_FSBL CFLAGS+=-Ihal/zynqmp -I$(ZYNQMP_PSU_INIT_DIR) LSCRIPT_IN=hal/zynqmp_ocm.ld OBJS+=hal/zynqmp_psu_shim.o OBJS+=hal/zynqmp_atf.o OBJS+=$(ZYNQMP_PSU_INIT_DIR)/psu_init_gpl.o # Load the PMU configuration object (EEMI permission table) into PMU # firmware so the APU can control the SoC nodes. Like psu_init_gpl.c the # pm_cfg_obj.c is design-specific and supplied from ZYNQMP_PSU_INIT_DIR. ifeq ($(ZYNQMP_PM_CFG),1) CFLAGS+=-DWOLFBOOT_ZYNQMP_PM_CFG OBJS+=$(ZYNQMP_PSU_INIT_DIR)/pm_cfg_obj.o endif # Run the PS-GTR serdes init (USB3/SATA/PCIe/DP PHY lanes). Required if the # kernel drives a PS-GTR peripheral (e.g. USB3 dwc3, whose probe hangs on # an unclocked PHY). Skipped by default since QSPI/SD/RGMII boot needs no # serdes; the shim runs the full calibrated sequence when enabled. ifeq ($(ZYNQMP_PSU_INIT_SERDES),1) CFLAGS+=-DZYNQMP_PSU_INIT_SERDES endif # FSBL security features (eFuse read, PUF, AES-CSU). At EL3 these access # the CSU/eFuse controllers directly (pmu_mmio is direct MMIO in FSBL # mode). Read-only eFuse dump today; PUF/AES land incrementally. ifeq ($(ZYNQMP_SEC),1) CFLAGS+=-DWOLFBOOT_ZYNQMP_FSBL_SEC endif # PUF register+regenerate self-test at boot (bring-up only; registers the # PUF every boot). Opt-in, needs ZYNQMP_SEC=1. ifeq ($(ZYNQMP_PUF_SELFTEST),1) CFLAGS+=-DWOLFBOOT_ZYNQMP_PUF_SELFTEST endif # AES-CSU known-answer self-test at boot (KUP key; eFuse-safe). Opt-in. ifeq ($(ZYNQMP_AES_SELFTEST),1) CFLAGS+=-DWOLFBOOT_ZYNQMP_AES_SELFTEST endif endif endif ifeq ($(TARGET),versal) # AMD Versal ACAP (VMK180) - Dual Cortex-A72 ARCH_FLAGS=-mcpu=cortex-a72+crypto -march=armv8-a+crypto -mtune=cortex-a72 CFLAGS+=$(ARCH_FLAGS) -DCORTEX_A72 CFLAGS+=-DWOLFBOOT_DUALBOOT # Support detection and skip of U-Boot legacy header CFLAGS+=-DWOLFBOOT_UBOOT_LEGACY # NOTE: FPGA_BITSTREAM is stubbed on Versal (PL config is a PDI loaded # by the PLM via XilLoader Load-PDI IPI - not yet implemented). Leave # FPGA_BITSTREAM off until that path lands. # PLM owns RVBAR on Versal in JTAG boot; skip RVBAR writes CFLAGS+=-DSKIP_RVBAR=1 # Disable SDMA for multi-block transfers - use PIO instead. # The Versal Arasan SDHCI controller does not restart SDMA after # boundary crossings via SRS22/SRS23 writes (Cadence-specific behavior). CFLAGS_EXTRA+=-DSDHCI_SDMA_DISABLED endif ifeq ($(TARGET),nxp_ls1028a) ARCH_FLAGS=-mcpu=cortex-a72+crypto -march=armv8-a+crypto -mtune=cortex-a72 CFLAGS+=$(ARCH_FLAGS) -DCORTEX_A72 # ZynqMP RVBAR (0xFD5C0040) does not exist on LS1028A -- the store faults # pre-UART. Its reset vector comes from the boot ROM (DCFG BOOTLOCPTR). CFLAGS+=-DSKIP_RVBAR=1 # MMU on (boot_aarch64_start.S LS1028A table): DDR Normal cacheable -- required # for coherency with the ENETC coherent DMA (SICAR=0x27276767); CCSR/BAR Device. CFLAGS +=-ffunction-sections -fdata-sections LDFLAGS+=-Wl,--gc-sections ifeq ($(DEBUG_UART),0) CFLAGS+=-fno-builtin-printf endif SPI_TARGET=nxp endif ifeq ($(TARGET),tegra234) # NVIDIA Jetson Orin (Tegra234, Cortex-A78AE): bare-metal wolfBoot as the # BL33 firmware stage. The UEFI-application alternative is the aarch64_efi # target. See hal/tegra234.c. # -mstrict-align: wolfBoot runs with the MMU off, where every access is # Device-nGnRnE and an unaligned access takes an alignment fault. Without # it the compiler is free to emit unaligned accesses for struct copies. ARCH_FLAGS=-mcpu=cortex-a78+crypto -march=armv8.2-a+crypto -mstrict-align CFLAGS+=$(ARCH_FLAGS) -DCORTEX_A78 # wolfBoot links and runs at the BL33 (cpubl) load address; must agree with # ORIGIN in hal/tegra234.ld or the RAM-boot overlap guard misjudges where # wolfBoot lives. WOLFBOOT_ORIGIN=0x272000000 # Bring-up: dump the state the prior stage handed wolfBoot (entry EL, # SCTLR/MMU/cache bits, handoff x0/DTB pointer). Read-only; opt out for a # quiet build. ifeq ($(TEGRA234_HANDOFF_DUMP),1) CFLAGS+=-DTEGRA234_HANDOFF_DUMP endif # SDMMC1 bring-up probe. Separate from the dump above because it MUTATES # SoC state the booted OS inherits: it enables the SDMMC1 clock, deasserts # its reset, and drives the SD power-rail GPIO. Off unless asked for. ifeq ($(TEGRA234_SDMMC_PROBE),1) CFLAGS+=-DTEGRA234_SDMMC_PROBE endif # MMU/WOLFBOOT_FDT/DUALBOOT + fdt.o come from the shared AARCH64 block. # tegra234 stays MMU-off at runtime (1:1 physical); those flags only pull # in the FDT/DTS codepath. EL2_HYPERVISOR+BOOT_EL1 add the EL2->EL1 drop # with the DTB in x0 (config/examples/tegra234-linux.config). ifeq ($(EL2_HYPERVISOR),1) CFLAGS+=-DEL2_HYPERVISOR=1 endif # BOOT_EL1 itself is emitted by options.mk; nothing to add here. endif # Default ARM ASM setting for unrecognized AARCH64 targets ifeq ($(filter zynq versal nxp_ls1028a,$(TARGET)),) NO_ARM_ASM?=1 endif ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_arm64.o endif ifneq ($(NO_ARM_ASM),1) ARCH_FLAGS=-mstrict-align CFLAGS+=$(ARCH_FLAGS) -DWOLFSSL_ARMASM -DWOLFSSL_ARMASM_INLINE -DWC_HASH_DATA_ALIGNMENT=8 -DWOLFSSL_AARCH64_PRIVILEGE_MODE WOLFCRYPT_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/cpuid.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-sha512-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-sha3-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-aes-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-sha256-asm_c.o endif endif ## ARM Cortex-M ifeq ($(ARCH),ARM) CROSS_COMPILE?=arm-none-eabi- CFLAGS+=-DARCH_ARM CFLAGS+=-mthumb -mlittle-endian LDFLAGS+=-mthumb -mlittle-endian ifeq ($(USE_GCC),1) ifeq ($(findstring clang,$(notdir $(CC))),) CFLAGS+=-mthumb-interwork LDFLAGS+=-mthumb-interwork endif endif ## Target specific configuration ifeq ($(TARGET),samr21) CORTEX_M0=1 endif ifeq ($(TARGET),imx_rt) CORTEX_M7=1 endif ifeq ($(TARGET),stm32l0) CORTEX_M0=1 SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32c0) CORTEX_M0=1 ARCH_FLASH_OFFSET=0x08000000 endif ifeq ($(TARGET),stm32g0) CORTEX_M0=1 ARCH_FLASH_OFFSET=0x08000000 endif ifeq ($(TARGET),stm32g4) ARCH_FLASH_OFFSET=0x08000000 endif ifeq ($(TARGET),stm32f1) CORTEX_M3=1 NO_ARM_ASM=1 ARCH_FLASH_OFFSET=0x08000000 endif ifeq ($(TARGET),stm32f4) ARCH_FLASH_OFFSET=0x08000000 SPI_TARGET=stm32 endif ifeq ($(TARGET),max32666) ARCH_FLASH_OFFSET=0x10000000 ifeq ($(MAX32666_FTHR2),1) CFLAGS+=-DMAX32666_FTHR2 endif # MAX3266X TPU hardware SHA256 acceleration (requires MSDK_DIR) ifeq ($(MAX3266X_TPU),1) NO_ARM_ASM=1 CFLAGS+=-DMAX3266X_SHA -DFAST_MEMCPY CFLAGS+=-ffunction-sections -fdata-sections CFLAGS+=-DTARGET=MAX32665 -DTARGET_REV=0x4131 ifeq ($(MAX3266X_OLD),1) # Older Maxim SDK tree (flat MAX32665PeriphDriver layout) CFLAGS+=-DWOLFSSL_MAX3266X_OLD MAX3266X_CFLAGS:= \ -I$(MSDK_DIR)/Libraries/MAX32665PeriphDriver/Include/ \ -I$(MSDK_DIR)/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ \ -I$(MSDK_DIR)/Libraries/CMSIS/Include/ CFLAGS+=$(MAX3266X_CFLAGS) OBJS+=$(MSDK_DIR)/Libraries/MAX32665PeriphDriver/Source/mxc_sys.o \ $(MSDK_DIR)/Libraries/MAX32665PeriphDriver/Source/mxc_delay.o else CFLAGS+=-DWOLFSSL_MAX3266X MAX3266X_CFLAGS:= \ -I$(MSDK_DIR)/Libraries/PeriphDrivers/Include/MAX32665/ \ -I$(MSDK_DIR)/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ \ -I$(MSDK_DIR)/Libraries/PeriphDrivers/Source/TPU/ \ -I$(MSDK_DIR)/Libraries/PeriphDrivers/Source/SYS/ \ -I$(MSDK_DIR)/Libraries/CMSIS/Include/ CFLAGS+=$(MAX3266X_CFLAGS) OBJS+=$(MSDK_DIR)/Libraries/PeriphDrivers/Source/TPU/tpu_me14.o \ $(MSDK_DIR)/Libraries/PeriphDrivers/Source/TPU/tpu_reva.o \ $(MSDK_DIR)/Libraries/PeriphDrivers/Source/SYS/sys_me14.o \ $(MSDK_DIR)/Libraries/PeriphDrivers/Source/SYS/mxc_delay.o endif WOLFCRYPT_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/maxim/max3266x.o endif endif ifeq ($(TARGET),pic32cz) ARCH_FLASH_OFFSET=0x08000000 CORTEX_M7=1 OBJS+=hal/pic32c.o ifeq ($(WOLFHSM_CLIENT),1) WOLFHSM_MICROCHIP_PIC32CZ ?= .. CFLAGS+=-I$(WOLFHSM_MICROCHIP_PIC32CZ) \ -DWOLFHSM_CFG_NO_SYS_TIME \ -DWOLFHSM_CFG_TRANSPORT_MEM \ -DWOLFHSM_CFG_CLIENT_ID=WOLFBOOT_WOLFHSM_CLIENT_ID \ -DPIC32CZ_CFG_SHARED_MEM_PHYS_BASE=0x20100000U \ -DPIC32CZ_CFG_SHARED_MEM_REQ_SIZE=4096 \ -DPIC32CZ_CFG_SHARED_MEM_RESP_SIZE=4096 \ '-DPIC32CZ_CFG_SHARED_MEM_TOTAL_SIZE=(PIC32CZ_CFG_SHARED_MEM_REQ_SIZE+PIC32CZ_CFG_SHARED_MEM_RESP_SIZE)' OBJS+=$(WOLFHSM_MICROCHIP_PIC32CZ)/port/mailbox.o \ $(WOLFHSM_MICROCHIP_PIC32CZ)/port/client/czhsm_client.o \ $(WOLFHSM_MICROCHIP_PIC32CZ)/port/client/fwmetadata.o \ $(WOLFBOOT_LIB_WOLFHSM)/src/wh_transport_mem.o # HSM server firmware. Optional: set HSM_FW_BIN to have wolfBoot load/boot # the HSM core from it at boot; leave it unset when the firmware is already # resident and wolfBoot must not touch it. ifneq ($(HSM_FW_BIN),) ifeq ($(wildcard $(HSM_FW_BIN)),) $(error HSM_FW_BIN=$(HSM_FW_BIN) not found: build the wolfHSM server \ firmware before wolfBoot) endif HSM_FW_ADDR?=0x0c1c0000 HSM_FW_SIZE:=$(shell stat -c %s $(HSM_FW_BIN)) CFLAGS+=-DHSM_FW_ADDR=$(HSM_FW_ADDR) -DHSM_FW_SIZE=$(HSM_FW_SIZE) endif # Signing pubkey header. Optional: set HSM_PUBKEY_HEADER to have the HAL # push the key into the HSM at boot; leave it unset when pre-provisioned. ifneq ($(HSM_PUBKEY_HEADER),) CFLAGS+=-DHSM_PUBKEY_HEADER='"$(HSM_PUBKEY_HEADER)"' endif endif endif ifeq ($(TARGET),pic32ck) ARCH_FLASH_OFFSET=0x08000000 CORTEX_M33=1 OBJS+=hal/pic32c.o endif ifeq ($(TARGET),stm32l4) SPI_TARGET=stm32 ARCH_FLASH_OFFSET=0x08000000 OBJS+=$(STM32CUBE)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.o OBJS+=$(STM32CUBE)/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.o CFLAGS+=-DSTM32L4A6xx -DUSE_HAL_DRIVER -Isrc -Ihal \ -I$(STM32CUBE)/Drivers/STM32L4xx_HAL_Driver/Inc/ \ -I$(STM32CUBE)/Drivers/BSP/STM32L4xx_Nucleo_144/ \ -I$(STM32CUBE)/Drivers/CMSIS/Device/ST/STM32L4xx/Include/ \ -I$(STM32CUBE)/Drivers/CMSIS/Include/ endif ifeq ($(TARGET),stm32f7) CORTEX_M7=1 ARCH_FLASH_OFFSET=0x08000000 SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32h7) CORTEX_M7=1 ARCH_FLASH_OFFSET=0x08000000 SPI_TARGET=stm32 endif # Defaults for linker script placeholders (overridden when WOLFHAL=1) WOLFHAL_FLASH_EXCLUDE_TEXT?=*(.text*) WOLFHAL_FLASH_EXCLUDE_RODATA?=*(.rodata*) WOLFHAL_FLASH_RAM_SECTIONS?= ifeq ($(TARGET),stm32wb) ARCH_FLASH_OFFSET=0x08000000 SPI_TARGET=stm32 ifneq ($(PKA),0) PKA_EXTRA_OBJS+= $(STM32CUBE)/Drivers/STM32WBxx_HAL_Driver/Src/stm32wbxx_hal_pka.o $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/st/stm32.o PKA_EXTRA_CFLAGS+=-DWOLFSSL_STM32WB -DWOLFSSL_STM32_PKA -DWOLFSSL_STM32_CUBEMX -DNO_STM32_HASH -DSTM32WB55xx PKA_EXTRA_CFLAGS+=-Isrc -Ihal \ -I$(STM32CUBE)/Drivers/STM32WBxx_HAL_Driver/Inc \ -I$(STM32CUBE)/Drivers/BSP/P-NUCLEO-WB55.Nucleo/ \ -I$(STM32CUBE)/Drivers/CMSIS/Device/ST/STM32WBxx/Include \ -I$(STM32CUBE)/Drivers/STM32WBxx_HAL_Driver/Inc \ -I$(STM32CUBE)/Drivers/CMSIS/Include endif endif ifeq ($(TARGET),stm32wba) CORTEX_M33=1 ARCH_FLASH_OFFSET=0x08000000 SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32l5) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x08000000 ifeq ($(TZEN),1) WOLFBOOT_ORIGIN=0x0C000000 else WOLFBOOT_ORIGIN=0x08000000 LSCRIPT_IN=hal/$(TARGET)-ns.ld endif endif ifeq ($(TARGET),stm32u5) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x08000000 ifeq ($(TZEN),1) WOLFBOOT_ORIGIN=0x0C000000 else WOLFBOOT_ORIGIN=0x08000000 LSCRIPT_IN=hal/$(TARGET)-ns.ld endif SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32u3) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x08000000 WOLFBOOT_ORIGIN=0x08000000 LSCRIPT_IN=hal/$(TARGET).ld SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32c5) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x08000000 WOLFBOOT_ORIGIN=0x08000000 LSCRIPT_IN=hal/$(TARGET).ld SPI_TARGET=stm32 endif ifeq ($(TARGET),stm32h5) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x08000000 ifeq ($(TZEN),1) WOLFBOOT_ORIGIN=0x0C000000 else WOLFBOOT_ORIGIN=0x08000000 LSCRIPT_IN=hal/$(TARGET)-ns.ld endif SPI_TARGET=stm32 ifneq ($(DEBUG),0) CFLAGS+=-DPKCS11_SMALL endif endif ifeq ($(TARGET),stm32n6) CORTEX_M55=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x70000000 # Boot ROM copies FSBL from NOR to AXISRAM2 at 0x34180400. # The signing -la flag in the flash script must match. WOLFBOOT_ORIGIN=0x34180400 EXT_FLASH=1 PART_UPDATE_EXT=1 PART_SWAP_EXT=1 endif ifeq ($(TARGET),rp2350) CORTEX_M33=1 CFLAGS+=-Ihal ARCH_FLASH_OFFSET=0x10000000 WOLFBOOT_ORIGIN=0x10000000 ifeq ($(TZEN),1) LSCRIPT_IN=hal/$(TARGET).ld else LSCRIPT_IN=hal/$(TARGET)-ns.ld endif SPI_TARGET=raspberrypi_pico CFLAGS+=-DPICO_SDK_PATH=$(PICO_SDK_PATH) CFLAGS+=-I$(PICO_SDK_PATH)/src/common/pico_stdlib_headers/include endif ifeq ($(TARGET),rtl8735b) # RealTek RTL8735B SoC (Cortex-M33), e.g. the AmebaPro2 EVB. wolfBoot is # staged into SRAM by the RealTek bootloader and copies the verified app # from external SPI NOR into DDR before jumping (src/update_ram.c RAMBOOT). CORTEX_M33=1 CFLAGS+=-Ihal # ASDK 10.3.0 toolchain (system arm-none-eabi-gcc clashes on newlib/lwip). CROSS_COMPILE:=$(ASDK_PATH)/arm-none-eabi- # Match the RealTek SDK FPU/ABI (-mfpu=fpv5-sp-d16 -mfloat-abi=softfp) so # linking the SDK libraries is consistent; wolfBoot enables the FPU at # hal_init before any SDK code runs. CFLAGS+=-mfpu=fpv5-sp-d16 -mfloat-abi=softfp LDFLAGS+=-mfpu=fpv5-sp-d16 -mfloat-abi=softfp UPDATE_OBJS:=src/update_ram.o CFLAGS+=-DWOLFBOOT_DUALBOOT CFLAGS+=-ffunction-sections -fdata-sections LDFLAGS+=-Wl,--gc-sections # Flash/UART/cache backend: "sdk" (default, RealTek SDK drivers) or "bare" # (smaller, no SDK dependency -- not yet implemented). See hal/rtl8735b.c. HAL_BACKEND?=sdk ifeq ($(HAL_BACKEND),sdk) CFLAGS+=-DHAL_BACKEND_SDK # The SDK backend folds the RealTek SDK driver chain into hal/rtl8735b.o. # Its objects.h pulls the SDK's "hal.h" (defines flash_t, # hal_audio_adapter_t, ...); wolfBoot also ships "hal.h". hal/rtl8735b.c # does not include wolfBoot's hal.h, and the SDK dirs are passed with # -iquote (searched before the global -I for quoted includes) so the SDK # objects.h "hal.h" resolves to the SDK one for THIS object only. sdk-shim # supplies a stub cmsis_os.h so the chain does not pull CMSIS-OS/FreeRTOS # (wolfBoot never calls it). The CONFIG_* defines mirror the bare-metal # bootloader build; -mcmse satisfies the SDK cache header (SCB_NS). The # rest of wolfBoot stays plain M33. HAL_SDK_IQUOTE=-iquote $(WOLFBOOT_ROOT)/hal/rtl8735b/sdk-shim \ -iquote $(AMEBA_SDK)/component/mbed/hal_ext \ -iquote $(AMEBA_SDK)/component/mbed/hal \ -iquote $(AMEBA_SDK)/component/mbed/api \ -iquote $(AMEBA_SDK)/component/mbed/targets/hal/rtl8735b \ -iquote $(AMEBA_SDK)/component/soc/8735b/fwlib/rtl8735b/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/fwlib/rtl8735b/lib/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/cmsis/rtl8735b/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/cmsis/rtl8735b/lib/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/cmsis/cmsis-core/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/app/rtl_printf/include \ -iquote $(AMEBA_SDK)/component/soc/8735b/app/stdio_port \ -iquote $(AMEBA_SDK)/component/soc/8735b/misc/utilities/include \ -iquote $(AMEBA_SDK)/component/os/os_dep/include # The same dirs as plain -I too, so angle-bracket includes (e.g. some # CMSIS-Core headers) resolve; -iquote only covers quoted includes. HAL_SDK_INC=$(patsubst -iquote,-I,$(HAL_SDK_IQUOTE)) HAL_SDK_DEFS=-DCONFIG_PLATFORM_8735B -DCONFIG_RTL8735B_PLATFORM=1 \ -DCONFIG_BUILD_RAM=1 hal/rtl8735b.o: CFLAGS += $(HAL_SDK_IQUOTE) $(HAL_SDK_INC) $(HAL_SDK_DEFS) -mcmse # Final link also needs the SDK fwlib + ROM symbol table; point at the # prebuilt SDK lib/objects and ROM symbol linker file during bring-up: # make TARGET=rtl8735b LIBS+=... LDFLAGS_EXTRA="-T" else CFLAGS+=-DHAL_BACKEND_BARE endif endif ifeq ($(TARGET),sama5d3) CORTEX_A5=1 UPDATE_OBJS:=src/update_ram.o CFLAGS+=-DWOLFBOOT_DUALBOOT -DEXT_FLASH -DNAND_FLASH -fno-builtin -ffreestanding CFLAGS+=-DWOLFBOOT_USE_STDLIBC endif ifeq ($(TARGET),zynq7000) # AMD/Xilinx Zynq-7000 (Cortex-A9, ARMv7-A) - ZC702 Evaluation Kit. # Loaded by Xilinx FSBL into DDR; see hal/zynq7000.{c,h,ld}. CORTEX_A9=1 UPDATE_OBJS:=src/update_ram.o CFLAGS+=-DWOLFBOOT_DUALBOOT -fno-builtin -ffreestanding # Do NOT define WOLFBOOT_USE_STDLIBC: newlib's memcpy uses unaligned # LDRs which fault on ARMv7-A whenever the active mapping treats memory # as Strongly-Ordered (typically MMU off, but also some boot-stage # configurations). wolfBoot's startup keeps FSBL's MMU + flat 1:1 # mapping enabled to avoid that, but we still link against the # aligned-safe memcpy in src/string.c so unaligned loads can never # surprise us regardless of MMU state. # Enable the legacy 64-byte uImage header strip unconditionally to # match sibling Xilinx targets (zynqmp, versal). update_ram.c # validates magic + ih_hcrc (header CRC32) + ih_size before # stripping, so a non-uImage payload whose first 4 bytes happen to # match UBOOT_IMG_HDR_MAGIC cannot be silently treated as a uImage # -- the additional CRC32 + size checks drop the joint false- # positive probability from ~2^-32 to ~2^-64, matching what U-Boot's # own mkimage/bootm does. CFLAGS+=-DWOLFBOOT_UBOOT_LEGACY # FPGA bitstream-from-FIT is supported via the DevC/PCAP DMA engine # (full bitstream). Enable with FPGA_BITSTREAM=1 (opt-in). endif ifeq ($(TARGET),va416x0) CFLAGS+=-I$(WOLFBOOT_ROOT)/hal/vorago/ \ -I$(VORAGO_SDK_DIR)/common/drivers/hdr/ \ -I$(VORAGO_SDK_DIR)/common/mcu/hdr/ \ -I$(VORAGO_SDK_DIR)/common/utils/hdr/ SDK_OBJS=$(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_spi.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_clkgen.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_ioconfig.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_irqrouter.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_uart.o \ $(VORAGO_SDK_DIR)/common/drivers/src/va416xx_hal_timer.o \ $(VORAGO_SDK_DIR)/common/mcu/src/system_va416xx.o ifeq ($(USE_HAL_SPI_FRAM),1) SDK_OBJS+=$(VORAGO_SDK_DIR)/common/utils/src/spi_fram.o CFLAGS+=-DUSE_HAL_SPI_FRAM endif OBJS+=$(SDK_OBJS) endif ## Cortex CPU ifeq ($(CORTEX_A5),1) FPU=-mfpu=vfp4-d16 CFLAGS+=-mcpu=cortex-a5 -mtune=cortex-a5 -static -z noexecstack \ -mno-unaligned-access LDLAGS+=-mcpu=cortex-a5 -mtune=cortex-a5 -mtune=cortex-a5 -static \ -z noexecstack -Ttext 0x300000 # Cortex-A uses boot_arm32.o OBJS+=src/boot_arm32.o src/boot_arm32_start.o ifeq ($(NO_ASM),1) MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o else MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_arm32.o ifneq ($(NO_ARM_ASM),1) OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-32-sha256-asm.o OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.o CFLAGS+=-DWOLFSSL_SP_ARM32_ASM -DWOLFSSL_ARMASM -DWOLFSSL_ARMASM_NO_HW_CRYPTO \ -DWOLFSSL_ARM_ARCH=7 -DWOLFSSL_ARMASM_INLINE -DWOLFSSL_ARMASM_NO_NEON endif endif else ifeq ($(CORTEX_A9),1) # Cortex-A9 (ARMv7-A, 32-bit) - Zynq-7000. # Build in ARM state (-marm); reset vector lands in ARM mode after FSBL. # Note: do not filter out -mthumb from CFLAGS/LDFLAGS - that converts the # variables to simple-expansion flavor and breaks lazy $(LSCRIPT) expansion # in test-app/Makefile. -marm appended later wins over -mthumb anyway. FPU=-mfpu=vfp3-d16 CFLAGS+=-mcpu=cortex-a9 -mtune=cortex-a9 -marm -mno-unaligned-access LDFLAGS+=-mcpu=cortex-a9 -mtune=cortex-a9 -marm -static \ -Wl,-z,noexecstack # Cortex-A9 uses the same generic ARMv7-A startup as Cortex-A5 # (src/boot_arm32_start.S handles VBAR, per-mode stacks, cache # invalidate, async-abort enable for any ARMv7-A target). OBJS+=src/boot_arm32.o src/boot_arm32_start.o # Linux/U-Boot payload: enable MMU + FDT codepaths in update_ram.c so DTBs # can be loaded from a separate signed PART_DTS_BOOT partition. The MMU # itself stays inherited from FSBL's flat 1:1 mapping; wolfBoot does not # manage page tables on Cortex-A9. ifeq ($(MMU),1) CFLAGS+=-DMMU -DWOLFBOOT_FDT OBJS+=src/fdt.o endif # CRC32 helpers in src/gpt.c are reused by update_ram.c's uImage header # validator (WOLFBOOT_UBOOT_LEGACY), so link gpt.o for every Cortex-A9 # build, not just the disk-boot variant below. OBJS+=src/gpt.o # SD card / eMMC boot: swap the update_ram loader for update_disk + GPT. # The SDHCI HAL hooks live in hal/zynq7000.c and translate the generic # Cadence-layout driver to the Arasan SDHCI v2.0 controller. ifneq ($(filter 1,$(DISK_SDCARD) $(DISK_EMMC)),) CFLAGS+=-DWOLFBOOT_UPDATE_DISK -DMAX_DISKS=1 UPDATE_OBJS:=src/update_disk.o OBJS += src/disk.o endif ifeq ($(NO_ASM),1) MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o else MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_arm32.o ifneq ($(NO_ARM_ASM),1) OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-32-sha256-asm.o OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.o CFLAGS+=-DWOLFSSL_SP_ARM32_ASM -DWOLFSSL_ARMASM -DWOLFSSL_ARMASM_NO_HW_CRYPTO \ -DWOLFSSL_ARM_ARCH=7 -DWOLFSSL_ARMASM_INLINE -DWOLFSSL_ARMASM_NO_NEON endif endif else # All others use boot_arm.o OBJS+=src/boot_arm.o ifneq ($(NO_ARM_ASM),1) CORTEXM_ARM_EXTRA_OBJS= \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-aes-asm.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-aes-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha256-asm.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha256-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha512-asm.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha512-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha3-asm.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-sha3-asm_c.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-chacha-asm.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/arm/thumb2-chacha-asm_c.o CORTEXM_ARM_EXTRA_CFLAGS+=-DWOLFSSL_ARMASM -DWOLFSSL_ARMASM_NO_HW_CRYPTO \ -DWOLFSSL_ARMASM_NO_NEON -DWOLFSSL_ARMASM_THUMB2 endif ifeq ($(CORTEX_M55),1) CORTEX_M33=1 CFLAGS+=-mcpu=cortex-m55 -DCORTEX_M55 LDFLAGS+=-mcpu=cortex-m55 endif ifeq ($(CORTEX_M33),1) CFLAGS+=-DCORTEX_M33 ifneq ($(CORTEX_M55),1) CFLAGS+=-mcpu=cortex-m33 LDFLAGS+=-mcpu=cortex-m33 endif ifeq ($(TZEN),1) ifneq (,$(findstring stm32,$(TARGET))) ifneq ($(TARGET),stm32n6) OBJS+=hal/stm32_tz.o endif endif CFLAGS+=-mcmse SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wolfboot_tz_nsc.o ifeq ($(WOLFCRYPT_TZ),1) CORTEXM_ARM_EXTRA_OBJS= CORTEXM_ARM_EXTRA_CFLAGS= SECURE_OBJS+=./src/wc_callable.o WOLFCRYPT_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/random.o CFLAGS+=-DWOLFCRYPT_SECURE_MODE endif endif # TZEN=1 ifeq ($(SPMATH),1) ifeq ($(NO_ASM),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o else CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_cortexm.o CFLAGS+=$(CORTEXM_ARM_EXTRA_CFLAGS) -DWOLFSSL_ARM_ARCH=8 OBJS+=$(CORTEXM_ARM_EXTRA_OBJS) endif endif else ifeq ($(CORTEX_M7),1) CFLAGS+=-mcpu=cortex-m7 LDFLAGS+=-mcpu=cortex-m7 ifeq ($(SPMATH),1) ifeq ($(NO_ASM),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o else CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_cortexm.o CFLAGS+=$(CORTEXM_ARM_EXTRA_CFLAGS) -DWOLFSSL_ARM_ARCH=7 OBJS+=$(CORTEXM_ARM_EXTRA_OBJS) endif endif else ifeq ($(CORTEX_M0),1) CFLAGS+=-mcpu=cortex-m0 LDFLAGS+=-mcpu=cortex-m0 ifeq ($(SPMATH),1) ifeq ($(NO_ASM),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o else CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_THUMB_ASM MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_armthumb.o # No ARMASM support available for ARMv6-M. endif endif else ifeq ($(CORTEX_M3),1) CFLAGS+=-mcpu=cortex-m3 LDFLAGS+=-mcpu=cortex-m3 ifeq ($(NO_ASM),1) ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif else ifeq ($(SPMATH),1) CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -DWOLFSSL_SP_NO_UMAAL MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_cortexm.o CFLAGS+=$(CORTEXM_ARM_EXTRA_CFLAGS) -DWOLFSSL_ARM_ARCH=7 OBJS+=$(CORTEXM_ARM_EXTRA_OBJS) endif endif else # default Cortex M4 CFLAGS+=-mcpu=cortex-m4 LDFLAGS+=-mcpu=cortex-m4 ifeq ($(NO_ASM),1) ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif else CFLAGS+=-fomit-frame-pointer # required with debug builds only ifeq ($(SPMATH),1) CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_cortexm.o CFLAGS+=$(CORTEXM_ARM_EXTRA_CFLAGS) -DWOLFSSL_ARM_ARCH=7 OBJS+=$(CORTEXM_ARM_EXTRA_OBJS) endif endif endif endif endif endif endif endif endif ifeq ($(WOLFHAL),1) WOLFHAL_ROOT?=$(WOLFBOOT_ROOT)/lib/wolfHAL CFLAGS+=-I$(WOLFHAL_ROOT) -Ihal/boards/$(BOARD) endif ## Renesas RX ifeq ($(ARCH),RENESAS_RX) RX_GCC_PATH?=~/toolchains/gcc_8.3.0.202311_rx_elf CROSS_COMPILE?=$(RX_GCC_PATH)/bin/rx-elf- ## Toolchain setup ifeq ($(USE_GCC),0) CC=$(CROSS_COMPILE)gcc # Must use LD directly (gcc link calls LD with sysroot and is not supported) LD=$(CROSS_COMPILE)ld AS=$(CROSS_COMPILE)gcc AR=$(CROSS_COMPILE)ar OBJCOPY?=$(CROSS_COMPILE)objcopy SIZE=$(CROSS_COMPILE)size # Override flags USE_GCC_HEADLESS=0 LD_START_GROUP=--start-group LD_END_GROUP=--end-group CFLAGS+=-Wall -Wextra -ffreestanding -Wno-unused -nostartfiles -fno-common CFLAGS+=-ffunction-sections -fdata-sections CFLAGS+=-B$(dir $(CROSS_COMPILE)) LDFLAGS+=-gc-sections -Map=wolfboot.map LDFLAGS+=-T $(LSCRIPT) endif # Renesas specific files OBJS+=src/boot_renesas.o src/boot_renesas_start.o hal/renesas-rx.o ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif # RX parts support big or little endian data depending on MDE register CFLAGS+=-fomit-frame-pointer -nofpu ifeq ($(BIG_ENDIAN),1) CFLAGS+=-mbig-endian-data ifeq ($(USE_GCC),1) LDFLAGS+=-Wl,--oformat=elf32-rx-be CFLAGS+=-misa=v2 else LDFLAGS+=--oformat=elf32-rx-be endif else CFLAGS+=-mlittle-endian-data ifeq ($(USE_GCC),1) LDFLAGS+=-Wl,--oformat=elf32-rx-le CFLAGS+=-misa=v2 else LDFLAGS+=--oformat=elf32-rx-le endif endif # ld is invoked directly, so add libgcc for the selected multilib (GNU RX # stores it per-endianness/-nofpu under lib/gcc/..., not in ../lib). ifeq ($(USE_GCC),0) LIBS+=$(shell $(CC) $(CFLAGS) -print-libgcc-file-name) endif ifeq ($(PKA),1) CFLAGS+=-DWOLFBOOT_RENESAS_TSIP CFLAGS+=-DWOLFBOOT_DEVID_PUBKEY=7890 CFLAGS+=-DWOLFBOOT_DEVID_CRYPT=7891 # GCC RX 14.2 -Werror=enum-conversion trips on the wolfSSL TSIP port; add # the relaxation only if the compiler knows the warning (RX 8.3 does not). CFLAGS+=$(shell echo '' | $(CC) -xc -fsyntax-only \ -Wno-error=enum-conversion - >/dev/null 2>&1 && echo -Wno-error=enum-conversion) RX_DRIVER_PATH?=./lib OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/cryptocb.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/Renesas/renesas_common.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/Renesas/renesas_tsip_util.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/Renesas/renesas_tsip_aes.o # RX TSIP uses pre-compiled .a library by default ifneq ($(RX_TSIP_SRC),1) ifeq ($(TARGET),rx65n) ifeq ($(BIG_ENDIAN),1) LIBS+=$(RX_DRIVER_PATH)/r_tsip_rx/lib/gcc/libr_tsip_rx65n_big.a else LIBS+=$(RX_DRIVER_PATH)/r_tsip_rx/lib/gcc/libr_tsip_rx65n_little.a endif endif ifeq ($(TARGET),rx72n) ifeq ($(BIG_ENDIAN),1) LIBS+=$(RX_DRIVER_PATH)/r_tsip_rx/lib/gcc/libr_tsip_rx72m_rx72n_rx66n_big.a else LIBS+=$(RX_DRIVER_PATH)/r_tsip_rx/lib/gcc/libr_tsip_rx72m_rx72n_rx66n_little.a endif endif else CFLAGS+=-DRX_TSIP_SRC ifeq ($(TARGET),rx65n) RX_TSIP_SRC_PATH?=$(RX_DRIVER_PATH)/r_tsip_rx/src/targets/rx65n endif ifeq ($(TARGET),rx72n) RX_TSIP_SRC_PATH?=$(RX_DRIVER_PATH)/r_tsip_rx/src/targets/rx72m_rx72n_rx66n endif # Use RX_TSIP_SRC if building TSIP sources directly OBJS+=$(RX_TSIP_SRC_PATH)/r_tsip_rx.o \ $(RX_TSIP_SRC_PATH)/r_tsip_rx_private.o \ $(RX_TSIP_SRC_PATH)/r_tsip_aes_rx.o \ $(RX_TSIP_SRC_PATH)/r_tsip_hash_rx.o \ $(RX_TSIP_SRC_PATH)/r_tsip_ecc_rx.o \ $(RX_TSIP_SRC_PATH)/ip/s_flash.o \ $(patsubst %.c,%.o,$(wildcard $(RX_TSIP_SRC_PATH)/ip/r_tsip_rx_p*.c)) \ $(patsubst %.c,%.o,$(wildcard $(RX_TSIP_SRC_PATH)/ip/r_tsip_rx_subprc*.c)) \ $(patsubst %.c,%.o,$(wildcard $(RX_TSIP_SRC_PATH)/ip/r_tsip_rx_function*.c)) # Ignore sign compare warnings in TSIP RX driver CFLAGS+=-Wno-error=sign-compare endif OBJS+=$(RX_DRIVER_PATH)/r_bsp/mcu/all/r_bsp_cpu.o \ $(RX_DRIVER_PATH)/r_bsp/mcu/all/r_bsp_interrupts.o \ $(RX_DRIVER_PATH)/r_bsp/mcu/all/r_rx_intrinsic_functions.o ifeq ($(TARGET),rx65n) OBJS+=$(RX_DRIVER_PATH)/r_bsp/mcu/rx65n/mcu_interrupts.o endif ifeq ($(TARGET),rx72n) OBJS+=$(RX_DRIVER_PATH)/r_bsp/mcu/rx72n/mcu_interrupts.o endif CFLAGS+=-Ihal -I$(WOLFBOOT_LIB_WOLFSSL) \ -I$(RX_DRIVER_PATH)/r_bsp \ -I$(RX_DRIVER_PATH)/r_config \ -I$(RX_DRIVER_PATH)/r_tsip_rx \ -I$(RX_DRIVER_PATH)/r_tsip_rx/src endif endif ## RISCV (32-bit) ifeq ($(ARCH),RISCV) CROSS_COMPILE?=riscv32-unknown-elf- # GCC 12+ separated _zicsr (CSR instructions) and _zifencei (fence.i) # from the base "I" extension, requiring them to be listed explicitly in # the -march string. Detect with compile-only tests (-c). # # IMPORTANT: these extensions are added to CFLAGS only (compilation). # They must NOT appear in LDFLAGS because GCC 15 decomposes the ISA # string (m→zmmul, a→zaamo+zalrsc, c→zca) producing an expanded # -march that has no matching multilib, causing a fatal error at # link time. The base march is multilib-safe for all GCC versions. RISCV32_ZICSR := $(shell echo "void _start(void){}" | \ $(CROSS_COMPILE)gcc -march=rv32imac_zicsr -mabi=ilp32 -c -x c - -o /dev/null 2>/dev/null && echo _zicsr) RISCV32_ZIFENCEI := $(shell echo "void _start(void){}" | \ $(CROSS_COMPILE)gcc -march=rv32imac_zifencei -mabi=ilp32 -c -x c - -o /dev/null 2>/dev/null && echo _zifencei) CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -nostartfiles -DARCH_RISCV # Compilation: extended march so assembler accepts CSR/fence.i CFLAGS+=-march=rv32imac$(RISCV32_ZICSR)$(RISCV32_ZIFENCEI) -mabi=ilp32 -mcmodel=medany # Linking: base march (no extension suffixes) for multilib lookup LDFLAGS+=-march=rv32imac -mabi=ilp32 -mcmodel=medany MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o # Prune unused functions and data CFLAGS +=-ffunction-sections -fdata-sections LDFLAGS+=-Wl,--gc-sections # Unified RISC-V boot code (32/64-bit via __riscv_xlen) OBJS+=src/boot_riscv_start.o src/boot_riscv.o src/vector_riscv.o ARCH_FLASH_OFFSET=0x20010000 endif ## RISCV64 (64-bit) ifeq ($(ARCH),RISCV64) CROSS_COMPILE?=riscv64-unknown-elf- # M-mode vs S-mode configuration ifeq ($(RISCV_MMODE),1) # Machine Mode: Running directly from eNVM/L2 SRAM CFLAGS+=-DWOLFBOOT_RISCV_MMODE -DWOLFBOOT_DUALBOOT # Minimal SBI runtime: services S-mode ecalls / timer / IPI when booting # an S-mode OS (Linux). Only built when WOLFBOOT_MMODE_SMODE_BOOT is set # (the file is an empty translation unit otherwise -- see src/riscv_sbi.c). ifneq (,$(findstring WOLFBOOT_MMODE_SMODE_BOOT,$(CFLAGS_EXTRA) $(CFLAGS))) OBJS+=src/riscv_sbi.o endif # Use M-mode specific linker script LSCRIPT_IN:=hal/$(TARGET)-m.ld # MPFS DDR init pulls LIBERO_SETTING_* values from a Libero/HSS-generated # fpga_design_config.h. Setting LIBERO_FPGA_CONFIG_DIR enables DDR init # and adds the directory to the include search path. ifneq ($(LIBERO_FPGA_CONFIG_DIR),) CFLAGS+=-DMPFS_DDR_INIT -I$(LIBERO_FPGA_CONFIG_DIR) # Generic Cadence DDR controller driver + the MPFS PHY/PLL/training # platform (split out of hal/mpfs250.c). OBJS+=src/ddr_cadence.o OBJS+=hal/mpfs250_ddr.o # FIT/FDT boot: the E51 M-mode DDR boot loads a signed Yocto fitImage # (kernel + dtb) from SD and hands the dtb to S-mode Linux, so enable # the FIT parser (fit_find_images/fit_load_image in src/fdt.c). The # U54 S-mode build enables this in the RISCV_MMODE=0 branch below; the # E51 M-mode DDR build needs it here too (it is not full MMU, so the # do_boot dtb hand-off is gated on MMU || WOLFBOOT_FDT). CFLAGS+=-DWOLFBOOT_FDT OBJS+=src/fdt.o endif else # Supervisor Mode: Running under HSS CFLAGS+=-DWOLFBOOT_DUALBOOT ifeq ($(MPFS_L2LIM),1) # L2-LIM mode: wolfBoot in on-chip SRAM, loaded by HSS (no DDR) LSCRIPT_IN:=hal/$(TARGET)-hss.ld else # DDR mode (default): full MMU and FDT support CFLAGS+=-DMMU endif endif # If SD card or eMMC is enabled use update_disk loader with GPT support ifneq ($(filter 1,$(DISK_SDCARD) $(DISK_EMMC)),) CFLAGS+=-DWOLFBOOT_UPDATE_DISK -DMAX_DISKS=1 UPDATE_OBJS:=src/update_disk.o OBJS += src/gpt.o OBJS += src/disk.o else # Use RAM-based update path for non-memory-mapped flash (SC SPI) # Images are loaded into RAM before execution UPDATE_OBJS?=src/update_ram.o endif # GCC 12+ extension detection (see RISCV 32-bit section above). # Extensions go in CFLAGS only; LDFLAGS uses the base march to avoid # GCC 15 multilib lookup failures from ISA string decomposition. RISCV64_ZICSR := $(shell echo "void _start(void){}" | \ $(CROSS_COMPILE)gcc -march=rv64imafd_zicsr -mabi=lp64d -c -x c - -o /dev/null 2>/dev/null && echo _zicsr) RISCV64_ZIFENCEI := $(shell echo "void _start(void){}" | \ $(CROSS_COMPILE)gcc -march=rv64imafd_zifencei -mabi=lp64d -c -x c - -o /dev/null 2>/dev/null && echo _zifencei) ifeq ($(RISCV_MMODE),1) # E51 core: rv64imac (no FPU, no crypto extensions) CFLAGS+=-march=rv64imac$(RISCV64_ZICSR)$(RISCV64_ZIFENCEI) -mabi=lp64 -mcmodel=medany LDFLAGS+=-march=rv64imac -mabi=lp64 -mcmodel=medany else # U54 cores: rv64gc (with FPU) CFLAGS+=-march=rv64imafd$(RISCV64_ZICSR)$(RISCV64_ZIFENCEI) -mabi=lp64d -mcmodel=medany LDFLAGS+=-march=rv64imafd -mabi=lp64d -mcmodel=medany # FDT support for DDR S-mode (not needed for L2-LIM bare-metal boot) ifneq ($(MPFS_L2LIM),1) CFLAGS+=-DWOLFBOOT_FDT OBJS+=src/fdt.o endif endif CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -nostartfiles -DARCH_RISCV -DARCH_RISCV64 # Prune unused functions and data CFLAGS +=-ffunction-sections -fdata-sections LDFLAGS+=-Wl,--gc-sections # Unified RISC-V boot code (32/64-bit via __riscv_xlen) OBJS+=src/boot_riscv_start.o src/boot_riscv.o src/vector_riscv.o ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c64.o endif ifneq ($(NO_ASM),1) CFLAGS+=-DWOLFSSL_RISCV_ASM WOLFCRYPT_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/riscv/riscv-64-sha256.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/riscv/riscv-64-sha512.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/riscv/riscv-64-sha3.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/riscv/riscv-64-aes.o endif endif # powerpc ifeq ($(ARCH),PPC) CROSS_COMPILE?=powerpc-linux-gnu- LDFLAGS+=-Wl,--build-id=none # Produce a fully-resolved static ELF (no dynamic relocations). # Required for JTAG probes that load ELFs but don't process relocations. CFLAGS+=-fno-pic -fno-pie LDFLAGS+=-no-pie CFLAGS+=-DARCH_PPC -DFAST_MEMCPY -ffreestanding -fno-tree-loop-distribute-patterns ifeq ($(DEBUG_UART),0) CFLAGS+=-fno-builtin-printf endif # Target-specific CPU flags ifeq ($(TARGET),nxp_t2080) CFLAGS+=-mcpu=e6500 -mno-altivec -mbss-plt else ifneq ($(filter nxp_t1024 nxp_t1040,$(TARGET)),) CFLAGS+=-mcpu=e5500 endif # Prune unused functions and data CFLAGS+=-ffunction-sections -fdata-sections LDFLAGS+=-Wl,--gc-sections OBJS+=src/boot_ppc_start.o src/boot_ppc.o # CRC32 helpers in src/gpt.c are reused by update_ram.c's uImage header # validator (WOLFBOOT_UBOOT_LEGACY -> uboot_legacy_header_valid). OBJS+=src/gpt.o ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif ifneq ($(NO_ASM),1) # Use the SHA256/SHA512 and SP math assembly accelerations. # (wolfSSL PR 10767 added the SHA-512 PPC32 asm transform referenced by # sha512.c; --gc-sections prunes it when sha512.o is not linked, e.g. ED25519.) CFLAGS+=-DWOLFSSL_SP_PPC CFLAGS+=-DWOLFSSL_PPC32_ASM -DWOLFSSL_PPC32_ASM_INLINE #CFLAGS+=-DWOLFSSL_PPC32_ASM_SMALL MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/ppc32/ppc32-sha256-asm_c.o # Add the SHA-512 PPC32 asm object only if its source is present (wildcard): # PR 10767 provides it; older checkouts fall back to C sha512. MATH_OBJS+=$(patsubst %.c,%.o,$(wildcard $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/ppc32/ppc32-sha512-asm_c.c)) endif endif ifeq ($(TARGET),kinetis) CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=\ -DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 -DNVM_FLASH_WRITEONCE=1 OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o ifeq ($(MCUXSDK),1) CFLAGS+=\ -I$(MCUXPRESSO)/drivers/flash \ -I$(MCUXPRESSO)/drivers/sysmpu \ -I$(MCUXPRESSO)/drivers/ltc \ -I$(MCUXPRESSO)/drivers/port \ -I$(MCUXPRESSO)/drivers/gpio OBJS+=\ $(MCUXPRESSO)/drivers/flash/fsl_ftfx_flash.o \ $(MCUXPRESSO)/drivers/flash/fsl_ftfx_cache.o \ $(MCUXPRESSO)/drivers/flash/fsl_ftfx_controller.o else OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_ftfx_flash.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_ftfx_cache.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_ftfx_controller.o endif ## The following lines can be used to enable HW acceleration ifeq ($(MCUXPRESSO_CPU),MK82FN256VLL15) ifeq ($(PKA),1) PKA_EXTRA_CFLAGS+=-DFREESCALE_USE_LTC PKA_EXTRA_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/nxp/ksdk_port.o ifeq ($(MCUXSDK),1) PKA_EXTRA_OBJS+=$(MCUXPRESSO)/drivers/ltc/fsl_ltc.o else PKA_EXTRA_OBJS+=$(MCUXPRESSO_DRIVERS)/drivers/fsl_ltc.o endif endif endif endif ifeq ($(TARGET),kinetis_kl26) CORTEX_M0=1 CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=\ -DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 -DNVM_FLASH_WRITEONCE=1 CFLAGS+=-Wno-old-style-declaration OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_flash.o ifneq (,$(filter 1,$(DEBUG_UART) $(UART_FLASH))) OBJS+=$(MCUXPRESSO_DRIVERS)/drivers/fsl_lpsci.o endif endif ifeq ($(TARGET),mcxa) CORTEX_M33=1 CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO_DRIVERS)/drivers/common \ -I$(MCUXPRESSO_DRIVERS)/drivers/romapi \ -I$(MCUXPRESSO_DRIVERS)/../periph \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include \ -I$(MCUXPRESSO)/drivers/flash \ -I$(MCUXPRESSO)/drivers/mcx_spc \ -I$(MCUXPRESSO)/drivers/sysmpu \ -I$(MCUXPRESSO)/drivers/ltc \ -I$(MCUXPRESSO)/drivers/port \ -I$(MCUXPRESSO)/drivers/gpio CFLAGS+=-DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 CFLAGS+=-DWOLFSSL_SP_NO_UMAAL CFLAGS+=-Wno-old-style-declaration CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33 -U__ARM_FEATURE_DSP LDFLAGS+=-mcpu=cortex-m33 OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO)/drivers/mcx_spc/fsl_spc.o \ $(MCUXPRESSO_PROJECT_TEMPLATE)/clock_config.o endif ifeq ($(TARGET),mcxw) CORTEX_M33=1 ifneq ($(TZEN),1) LSCRIPT_IN=hal/$(TARGET)-ns.ld endif CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO_DRIVERS)/drivers/romapi \ -I$(MCUXPRESSO_DRIVERS)/../periph2 \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/flash_k4 \ -I$(MCUXPRESSO)/drivers/ccm32k \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include \ -I$(MCUXPRESSO)/drivers/flash \ -I$(MCUXPRESSO)/drivers/spc \ -I$(MCUXPRESSO)/drivers/sysmpu \ -I$(MCUXPRESSO)/drivers/ltc \ -I$(MCUXPRESSO)/drivers/port \ -I$(MCUXPRESSO)/drivers/gpio CFLAGS+=-DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 CFLAGS+=-DWOLFSSL_SP_NO_UMAAL CFLAGS+=-Wno-old-style-declaration CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33 -U__ARM_FEATURE_DSP LDFLAGS+=-mcpu=cortex-m33 OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO)/drivers/spc/fsl_spc.o \ $(MCUXPRESSO_PROJECT_TEMPLATE)/clock_config.o \ $(MCUXPRESSO)/drivers/ccm32k/fsl_ccm32k.o \ $(MCUXPRESSO_DRIVERS)/drivers/romapi/fsl_romapi.o endif ifeq ($(TARGET),mcxn) CORTEX_M33=1 ifneq ($(TZEN),1) LSCRIPT_IN=hal/$(TARGET)-ns.ld endif CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO_DRIVERS)/drivers/romapi/flash \ -I$(MCUXPRESSO_DRIVERS)/../periph \ -I$(MCUXPRESSO) \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/gpio \ -I$(MCUXPRESSO)/drivers/port \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO)/drivers/lpflexcomm \ -I$(MCUXPRESSO)/drivers/lpuart \ -I$(MCUXPRESSO_PROJECT_TEMPLATE) \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=-DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 CFLAGS+=-Wno-old-style-declaration CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33 -U__ARM_FEATURE_DSP LDFLAGS+=-mcpu=cortex-m33 OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO_PROJECT_TEMPLATE)/clock_config.o \ $(MCUXPRESSO_DRIVERS)/drivers/romapi/flash/src/fsl_flash.o ifeq ($(DEBUG_UART),1) OBJS+=\ $(MCUXPRESSO)/drivers/lpflexcomm/fsl_lpflexcomm.o \ $(MCUXPRESSO)/drivers/lpuart/fsl_lpuart.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_reset.o endif # Link ELS PKC only when -DWOLFBOOT_DICE_HW is emitted (WOLFCRYPT_TZ_PSA=1 in options.mk). ifeq ($(WOLFCRYPT_TZ_PSA),1) ifeq ($(WOLFBOOT_DICE_HW),1) ELS_PKC=$(MCUXPRESSO)/components/els_pkc CFLAGS+=\ -I$(ELS_PKC)/includes \ -I$(ELS_PKC)/src/comps/mcuxClEls/inc \ -I$(ELS_PKC)/src/platforms/mcxn \ -I$(ELS_PKC)/src/platforms/mcxn/inc OBJS+=\ $(ELS_PKC)/src/comps/mcuxClEls/src/mcuxClEls_Common.o \ $(ELS_PKC)/src/comps/mcuxClEls/src/mcuxClEls_Kdf.o \ $(ELS_PKC)/src/comps/mcuxClEls/src/mcuxClEls_KeyManagement.o \ $(ELS_PKC)/src/comps/mcuxClEls/src/mcuxClEls_Ecc.o endif endif endif ifeq ($(TARGET),nrf5340) ifneq ($(TZEN), 1) LSCRIPT_IN=hal/$(TARGET)-ns.ld endif endif ifeq ($(TARGET),nrf54l) ifneq ($(TZEN), 1) LSCRIPT_IN=hal/$(TARGET)-ns.ld endif endif ifeq ($(TARGET),nrf5340_net) # Net core doesn't support DSP and FP CFLAGS+=-mcpu=cortex-m33+nodsp+nofp LDFLAGS+=-mcpu=cortex-m33+nodsp+nofp endif ifeq ($(TARGET),imx_rt) CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/cache/armv7-m7 \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO)/drivers/flexspi \ -I$(MCUXPRESSO)/drivers/lpuart \ -I$(MCUXPRESSO)/drivers/igpio \ -I$(MCUXPRESSO)/components/uart \ -I$(MCUXPRESSO)/components/flash/nor \ -I$(MCUXPRESSO)/components/flash/nor/flexspi \ -I$(MCUXPRESSO)/components/serial_manager \ -I$(MCUXPRESSO_DRIVERS)/project_template \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=\ -DCPU_$(MCUXPRESSO_CPU) \ -DDEBUG_CONSOLE_ASSERT_DISABLE=1 \ -DXIP_EXTERNAL_FLASH=1 -DDEBUG_CONSOLE_ASSERT_DISABLE=1 -DPRINTF_ADVANCED_ENABLE=1 \ -DSCANF_ADVANCED_ENABLE=1 -DSERIAL_PORT_TYPE_UART=1 -DNDEBUG=1 ifeq ($(MCUXSDK),1) CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS)/../periph \ -I$(MCUXPRESSO)/components/debug_console \ -I$(MCUXPRESSO)/components/debug_console/config \ -I$(MCUXPRESSO)/components/lists \ -I$(MCUXPRESSO)/components/str CFLAGS+=-DDCB=CoreDebug -DDCB_DEMCR_TRCENA_Msk=CoreDebug_DEMCR_TRCENA_Msk OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO)/drivers/flexspi/fsl_flexspi.o \ $(MCUXPRESSO)/drivers/cache/armv7-m7/fsl_cache.o ifeq ($(DEBUG_UART),1) OBJS+= $(MCUXPRESSO)/drivers/lpuart/fsl_lpuart.o endif else CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS)/utilities/str \ -I$(MCUXPRESSO_DRIVERS)/utilities/debug_console OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_flexspi.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_cache.o ifeq ($(DEBUG_UART),1) OBJS+= $(MCUXPRESSO_DRIVERS)/drivers/fsl_lpuart.o endif endif ifeq ($(TARGET_IMX_HAB),1) LSCRIPT_IN:=hal/$(TARGET)_hab.ld else LSCRIPT_IN:=hal/$(TARGET).ld endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1064DVL6A) ARCH_FLASH_OFFSET=0x70000000 ifeq ($(MCUXSDK),1) CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1064/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1064 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1064/project_template else CFLAGS+=-I$(MCUXPRESSO)/boards/evkmimxrt1064/xip/ endif endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1062DVL6A) ARCH_FLASH_OFFSET=0x60000000 ifeq ($(MCUXSDK),1) # Use evkbmimxrt1060 because evkmimxrt1060 is not supported by the SDK CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/project_template CFLAGS+=-I$(MCUXPRESSO)/devices/RT/RT1050/MIMXRT1052 else CFLAGS+=-I$(MCUXPRESSO)/boards/evkmimxrt1060/xip/ endif endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1062DVL6B) ARCH_FLASH_OFFSET=0x60000000 ifeq ($(MCUXSDK),1) CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/project_template CFLAGS+=-I$(MCUXPRESSO)/devices/RT/RT1050/MIMXRT1052 else CFLAGS+=-I$(MCUXPRESSO)/boards/evkbmimxrt1060/xip/ endif endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1061CVJ5B) ARCH_FLASH_OFFSET=0x60000000 ifeq ($(MCUXSDK),1) # Use evkbmimxrt1060 because evkmimxrt1060 is not supported by the SDK CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbmimxrt1060/project_template CFLAGS+=-I$(MCUXPRESSO)/devices/RT/RT1050/MIMXRT1052 else CFLAGS+=-I$(MCUXPRESSO)/boards/evkmimxrt1060/xip/ endif endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1052DVJ6B) ARCH_FLASH_OFFSET=0x60000000 ifeq ($(MCUXSDK),1) CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbimxrt1050/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbimxrt1050 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkbimxrt1050/project_template else CFLAGS+=-I$(MCUXPRESSO)/boards/evkbimxrt1050/xip/ endif endif ifeq ($(MCUXPRESSO_CPU),MIMXRT1042XJM5B) ARCH_FLASH_OFFSET=0x60000000 ifeq ($(MCUXSDK),1) CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1040/xip/ CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1040 CFLAGS+=-I$(MCUXPRESSO)/examples/_boards/evkmimxrt1040/project_template CFLAGS+=-I$(MCUXPRESSO)/devices/RT/RT1050/MIMXRT1052 else CFLAGS+=-I$(MCUXPRESSO)/boards/evkmimxrt1040/xip/ endif endif ifeq ($(PKA),1) ifeq ($(MCUXSDK),1) PKA_EXTRA_OBJS+= $(MCUXPRESSO)/drivers/dcp/fsl_dcp.o else PKA_EXTRA_OBJS+= $(MCUXPRESSO_DRIVERS)/drivers/fsl_dcp.o endif PKA_EXTRA_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/nxp/dcp_port.o PKA_EXTRA_CFLAGS+=\ -DWOLFSSL_IMXRT_DCP \ -I$(MCUXPRESSO)/drivers/cache/armv7-m7 \ -I$(MCUXPRESSO)/drivers/dcp endif endif # ARM Big Endian ifeq ($(ARCH),ARM_BE) OBJS+=src/boot_arm.o ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif endif ifneq ($(filter nxp_t1024 nxp_t1040,$(TARGET)),) # Power PC big endian (e5500 core, T1024 2-core / T1040 4-core) ARCH_FLAGS=-mhard-float -mcpu=e5500 CFLAGS+=$(ARCH_FLAGS) BIG_ENDIAN=1 CFLAGS+=-DMMU -DWOLFBOOT_FDT -DWOLFBOOT_DUALBOOT CFLAGS+=-pipe # use pipes instead of temp files CFLAGS+=-feliminate-unused-debug-types LDFLAGS+=$(ARCH_FLAGS) LDFLAGS+=-Wl,--hash-style=both # generate both sysv and gnu symbol hash table LDFLAGS+=-Wl,--as-needed # remove weak functions not used OBJS+=src/boot_ppc_mp.o # support for spin table OBJS+=src/fdt.o OBJS+=src/pci.o CFLAGS+=-DWOLFBOOT_USE_PCI UPDATE_OBJS:=src/update_ram.o SPI_TARGET=nxp OPTIMIZATION_LEVEL=0 # using default -Os causes issues with alignment endif ifeq ($(TARGET),nxp_t2080) # Power PC big endian ARCH_FLAGS=-mhard-float -mcpu=e6500 CFLAGS+=$(ARCH_FLAGS) BIG_ENDIAN=1 CFLAGS+=-DMMU -DWOLFBOOT_FDT -DWOLFBOOT_DUALBOOT # Support U-Boot legacy uImage header: strip 64-byte header before jumping # to the OS image (e.g. uVxWorks, uImage Linux kernel). CFLAGS+=-DWOLFBOOT_UBOOT_LEGACY # 64-bit OS support (VxWorks 7, Linux 64-bit): transitions LAW/TLB to # 36-bit physical addressing before jumping to the OS. Equivalent to # CW U-Boot "ossel ostype2". Set OS_64BIT=1 in .config to enable. ifeq ($(OS_64BIT),1) CFLAGS+=-DENABLE_OS64BIT endif ifneq ($(WOLFBOOT_BOOTARGS),) CFLAGS+=-DWOLFBOOT_BOOTARGS='"$(WOLFBOOT_BOOTARGS)"' endif CFLAGS+=-pipe # use pipes instead of temp files CFLAGS+=-feliminate-unused-debug-types LDFLAGS+=$(ARCH_FLAGS) LDFLAGS+=-Wl,--hash-style=both # generate both sysv and gnu symbol hash table LDFLAGS+=-Wl,--as-needed # remove weak functions not used OBJS+=src/boot_ppc_mp.o # support for spin table OBJS+=src/fdt.o OBJS+=src/pci.o CFLAGS+=-DWOLFBOOT_USE_PCI UPDATE_OBJS:=src/update_ram.o endif ifeq ($(TARGET),nxp_p1021) # Power PC big endian ARCH_FLAGS=-m32 -mhard-float -mcpu=e500mc ARCH_FLAGS+=-fno-builtin -ffreestanding -nostartfiles CFLAGS+=$(ARCH_FLAGS) BIG_ENDIAN=1 CFLAGS+=-DWOLFBOOT_DUALBOOT CFLAGS+=-pipe # use pipes instead of temp files LDFLAGS+=$(ARCH_FLAGS) LDFLAGS+=-Wl,--as-needed # remove weak functions not used OBJS+=src/boot_ppc_mp.o # support for spin table UPDATE_OBJS:=src/update_ram.o # Use PPC stdlib for memcpy, etc. #CFLAGS+=-DWOLFBOOT_USE_STDLIBC SPI_TARGET=nxp endif ifeq ($(TARGET),ti_hercules) # HALCoGen Source and Include? CORTEX_R5=1 CFLAGS+=-D"CORTEX_R5" -D"NVM_FLASH_WRITEONCE" -D"FLASHBUFFER_SIZE=32" BIG_ENDIAN=1 STACK_USAGE=0 USE_GCC=0 USE_GCC_HEADLESS=0 ifeq ($(CCS_ROOT),) $(error "CCS_ROOT must be defined to root of tools") endif CROSS_COMPILE?=$(CCS_ROOT)/bin/ CC=$(CROSS_COMPILE)armcl LD=$(CROSS_COMPILE)armcl AS=$(CROSS_COMPILE)armasm AR=$(CROSS_COMPILE)armcl -ar OBJCOPY=$(CROSS_COMPILE)armobjcopy SIZE=$(CROSS_COMPILE)armsize OUTPUT_FLAG=--output_file F021_DIR?=c:\\ti\\Hercules\\F021\ Flash\ API\\02.01.01 ARCH_FLAGS=-mv7R5 --code_state=32 --float_support=VFPv3D16 --enum_type=packed --abi=eabi -I"$(CCS_ROOT)/include" -I"$(F021_DIR)/include" CFLAGS+=$(ARCH_FLAGS) LDFLAGS+=$(ARCH_FLAGS) -i"$(CCS_ROOT)/lib" -i"$(F021_DIR)" -z --be32 --map_file=wolfboot.map --reread_libs --diag_wrap=off --display_error_number --warn_sections --heap_size=0 --stack_size=0x800 --ram_model LD_START_GROUP= #--start-group LD_END_GROUP= -llibc.a -l"$(F021_DIR)/F021_API_CortexR4_BE_L2FMC_V3D16.lib" OPTIMIZATION_LEVEL=2 endif ifeq ($(TARGET),lpc) ifeq ($(MCUXSDK),1) # Some targets in the SDK use drivers from a different target MCUXPRESSO_DRIVERS_SHARED?=$(MCUXPRESSO_DRIVERS) ifneq (,$(filter LPC54628%,$(MCUXPRESSO_CPU))) MCUXPRESSO_DRIVERS_SHARED=$(MCUXPRESSO)/devices/LPC/LPC54000/LPC54628 else ifneq (,$(filter LPC54605% LPC54606% LPC54607% LPC54608% LPC54616% LPC54618%,$(MCUXPRESSO_CPU))) MCUXPRESSO_DRIVERS_SHARED=$(MCUXPRESSO)/devices/LPC/LPC54000/LPC54608 else ifneq (,$(filter LPC54018M% LPC54S018M%,$(MCUXPRESSO_CPU))) MCUXPRESSO_DRIVERS_SHARED=$(MCUXPRESSO)/devices/LPC/LPC54000/LPC54S018M else ifneq (,$(filter LPC54005% LPC54016% LPC54018% LPC54S005% LPC54S016% LPC54S018%,$(MCUXPRESSO_CPU))) MCUXPRESSO_DRIVERS_SHARED=$(MCUXPRESSO)/devices/LPC/LPC54000/LPC54S018 endif CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS_SHARED)/drivers \ -I$(MCUXPRESSO_DRIVERS)/../periph \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO)/drivers/flashiap \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=\ -DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 CFLAGS+=-DDCB=CoreDebug -DDCB_DEMCR_TRCENA_Msk=CoreDebug_DEMCR_TRCENA_Msk OBJS+=\ $(MCUXPRESSO_DRIVERS_SHARED)/drivers/fsl_clock.o \ $(MCUXPRESSO_DRIVERS_SHARED)/drivers/fsl_power.o \ $(MCUXPRESSO_DRIVERS_SHARED)/drivers/fsl_reset.o CFLAGS+=\ -I$(MCUXPRESSO)/drivers/flashiap \ -I$(MCUXPRESSO)/drivers/flexcomm OBJS+=\ $(MCUXPRESSO)/drivers/common/fsl_common.o \ $(MCUXPRESSO)/drivers/common/fsl_common_arm.o \ $(MCUXPRESSO)/drivers/flashiap/fsl_flashiap.o \ $(MCUXPRESSO)/drivers/flexcomm/usart/fsl_usart.o \ $(MCUXPRESSO)/drivers/flexcomm/fsl_flexcomm.o else CFLAGS+=\ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=\ -DCPU_$(MCUXPRESSO_CPU) -DDEBUG_CONSOLE_ASSERT_DISABLE=1 OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_power.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_reset.o LIBS+=\ $(MCUXPRESSO_DRIVERS)/mcuxpresso/libpower_softabi.a OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_common.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_flashiap.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_usart.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_flexcomm.o endif endif ifeq ($(TARGET),nxp_lpc54s0xx) ARCH_FLASH_OFFSET=0x10000000 LDFLAGS+=-Wl,--no-warn-rwx-segments # Bare-metal HAL — no NXP SDK dependencies endif ifeq ($(TARGET),lpc55s69) ifneq ($(TZEN),1) LSCRIPT_IN=hal/$(TARGET)-ns.ld endif CFLAGS+=\ -I$(MCUXPRESSO_PROJECT_TEMPLATE) \ -I$(MCUXPRESSO_DRIVERS) \ -I$(MCUXPRESSO_DRIVERS)/drivers \ -I$(MCUXPRESSO_DRIVERS)/../periph \ -I$(MCUXPRESSO)/drivers \ -I$(MCUXPRESSO)/drivers/casper \ -I$(MCUXPRESSO)/drivers/common \ -I$(MCUXPRESSO)/drivers/flexcomm \ -I$(MCUXPRESSO)/drivers/flexcomm/usart \ -I$(MCUXPRESSO)/drivers/hashcrypt \ -I$(MCUXPRESSO)/drivers/iap1 \ -I$(MCUXPRESSO)/drivers/lpc_gpio \ -I$(MCUXPRESSO)/drivers/lpc_iocon \ -I$(MCUXPRESSO)/drivers/rng_1 \ -I$(MCUXPRESSO_CMSIS)/Include \ -I$(MCUXPRESSO_CMSIS)/Core/Include CFLAGS+=-DWOLFSSL_NXP_RNG_1 CFLAGS+=-DCPU_$(MCUXPRESSO_CPU) CFLAGS+=-DFSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL=1 CFLAGS+=-DFSL_SDK_DISABLE_DRIVER_RESET_CONTROL=1 CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33 -U__ARM_FEATURE_DSP LDFLAGS+=-mcpu=cortex-m33 -Wl,--no-warn-rwx-segments OBJS+=\ $(MCUXPRESSO_PROJECT_TEMPLATE)/clock_config.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_clock.o \ $(MCUXPRESSO_DRIVERS)/drivers/fsl_power.o \ $(MCUXPRESSO)/drivers/common/fsl_common_arm.o \ $(MCUXPRESSO)/drivers/iap1/fsl_iap.o \ $(MCUXPRESSO)/drivers/lpc_gpio/fsl_gpio.o \ $(MCUXPRESSO)/drivers/rng_1/fsl_rng.o ifeq ($(DEBUG_UART),1) OBJS+=\ $(MCUXPRESSO_DRIVERS)/drivers/fsl_reset.o \ $(MCUXPRESSO)/drivers/flexcomm/fsl_flexcomm.o \ $(MCUXPRESSO)/drivers/flexcomm/usart/fsl_usart.o endif ifeq ($(PKA),1) CFLAGS+=-DWOLFSSL_NXP_LPC55S6X OBJS+=\ $(MCUXPRESSO)/drivers/casper/fsl_casper.o \ $(MCUXPRESSO)/drivers/hashcrypt/fsl_hashcrypt.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/nxp/casper_port.o \ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/nxp/hashcrypt_port.o endif endif ifeq ($(TARGET),psoc6) CORTEX_M0=1 OBJS+=\ $(CYPRESS_PDL)/drivers/source/cy_flash.o \ $(CYPRESS_PDL)/drivers/source/cy_ipc_pipe.o \ $(CYPRESS_PDL)/drivers/source/cy_ipc_sema.o \ $(CYPRESS_PDL)/drivers/source/cy_ipc_drv.o \ $(CYPRESS_PDL)/drivers/source/cy_device.o \ $(CYPRESS_PDL)/drivers/source/cy_sysclk.o \ $(CYPRESS_PDL)/drivers/source/cy_sysint.o \ $(CYPRESS_PDL)/drivers/source/cy_syslib.o \ $(CYPRESS_PDL)/drivers/source/cy_ble_clk.o \ $(CYPRESS_PDL)/drivers/source/cy_wdt.o \ $(CYPRESS_PDL)/drivers/source/TOOLCHAIN_GCC_ARM/cy_syslib_gcc.o \ $(CYPRESS_PDL)/devices/templates/COMPONENT_MTB/COMPONENT_CM0P/system_psoc6_cm0plus.o PSOC6_CRYPTO_OBJS=\ $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/port/cypress/psoc6_crypto.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_vu.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_ecc_domain_params.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_ecc_nist_p.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_ecc_ecdsa.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_sha_v2.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_sha_v1.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_mem_v2.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_mem_v1.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_hw.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto_core_hw_v1.o \ $(CYPRESS_PDL)/drivers/source/cy_crypto.o CFLAGS+=\ -I$(CYPRESS_PDL)/devices/include \ -I$(CYPRESS_PDL)/drivers/include \ -I$(CYPRESS_PDL)/cmsis/include \ -I$(CYPRESS_TARGET_LIB) \ -I$(CYPRESS_CORE_LIB)/include \ -I$(CYPRESS_PDL)/devices/include/ip \ -I$(CYPRESS_PDL)/devices/templates/COMPONENT_MTB \ -DCY8C624ABZI_D44 ARCH_FLASH_OFFSET=0x10000000 ifneq ($(PSOC6_CRYPTO),0) CFLAGS+=-DWOLFSSL_PSOC6_CRYPTO OBJS+=$(PSOC6_CRYPTO_OBJS) endif endif ifeq ($(USE_CLANG),1) ifneq ($(ARCH),ARM) $(error USE_CLANG=1 is currently supported only for ARCH=ARM) endif CLANG?=clang CLANG_GCC_NAME?=$(CROSS_COMPILE)gcc CLANG_TARGET?=arm-none-eabi CLANG_DRIVER:=$(CLANG) --target=$(CLANG_TARGET) -ccc-gcc-name $(CLANG_GCC_NAME) CLANG_LIBC_A?=$(shell $(CLANG_GCC_NAME) -print-file-name=libc.a) CLANG_NEWLIB_INCLUDE?=$(abspath $(dir $(CLANG_LIBC_A))/../include) CC=$(CLANG_DRIVER) LD=$(CLANG_DRIVER) -fuse-ld=lld AS=$(CLANG_DRIVER) AR=llvm-ar OBJCOPY?=llvm-objcopy SIZE=llvm-size CFLAGS+=-isystem $(CLANG_NEWLIB_INCLUDE) CFLAGS+=-DWOLFSSL_NO_ATOMIC -DWOLFSSL_NO_ATOMICS # newlib's is unusable under clang for arm-none-eabi (references # int_leastN_t before they are declared); skip it so wc_port.h falls back to # the __atomic_thread_fence compiler builtin CFLAGS+=-DNO_STDATOMIC_H CFLAGS+=-Wno-unknown-attributes -Wno-error=unknown-attributes CFLAGS+=-fno-unwind-tables -fno-asynchronous-unwind-tables LDFLAGS+=-nostdlib endif ifeq ($(USE_ARMCLANG),1) ifneq ($(ARCH),ARM) $(error USE_ARMCLANG=1 is currently supported only for ARCH=ARM) endif ARMCLANG_PATH?= CC=$(ARMCLANG_PATH)armclang --target=arm-arm-none-eabi AS=$(CC) LD=$(ARMCLANG_PATH)armlink AR=$(ARMCLANG_PATH)armar FROMELF?=$(ARMCLANG_PATH)fromelf SIZE=$(FROMELF) -z OBJCOPY=FROMELF="$(FROMELF)" $(WOLFBOOT_ROOT)/tools/armclang/objcopy.sh CFLAGS+=-mfloat-abi=soft CFLAGS+=-fno-unwind-tables -fno-asynchronous-unwind-tables CFLAGS+=-Wno-unknown-attributes -Wno-error=unknown-attributes # Map scatter files region names to GNU ld symbols used by wolfBoot code CFLAGS+=-D'_start_text=Image$$$$ER_VECTORS$$$$Base' CFLAGS+=-D'_stored_data=Load$$$$RW_RAM$$$$Base' CFLAGS+=-D'_start_data=Image$$$$RW_RAM$$$$Base' CFLAGS+=-D'_end_data=Image$$$$RW_RAM$$$$Limit' CFLAGS+=-D'_start_bss=Image$$$$RW_RAM$$$$ZI$$$$Base' CFLAGS+=-D'_end_bss=Image$$$$RW_RAM$$$$ZI$$$$Limit' # Base armlink options shared by both images: # - the unreferenced vector table needs an explicit --keep or unused # section elimination removes it # - RW data compression must be off: wolfBoot copies .data to RAM itself, # word by word, and would copy the compressed image # - Suppress L6314W (no section matches pattern) is suppressed: the scatter # files list sections that are only present in some configurations (e.g. # .ramcode) # - --no_startup: wolfBoot has its own reset handler. ARMCLANG_LDFLAGS=--cpu=Cortex-M33 --fpu=SoftVFP --entry=isr_reset \ --keep="*(.isr_vector)" --datacompressor=off --remove \ --no_startup --info=sizes,totals,unused --diag_suppress=6314 endif ifeq ($(USE_GCC),1) ## Toolchain setup CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)gcc AS=$(CROSS_COMPILE)gcc AR=$(CROSS_COMPILE)ar OBJCOPY?=$(CROSS_COMPILE)objcopy SIZE=$(CROSS_COMPILE)size endif OUTPUT_FLAG?=-o ifeq ($(filter $(TARGET),x86_fsp_qemu kontron_vx3060_s2),$(TARGET)) FSP=1 CFLAGS+=-ffunction-sections -fdata-sections -ffreestanding -nostdlib -static # some std libc have headers that bring in extra symbols used in # FORTIFY_SOURCE realated checks. Use -U_FORTIFY_SOURCE to avoid that. CFLAGS+=-U_FORTIFY_SOURCE ifeq ($(TARGET), kontron_vx3060_s2) FSP_TGL=1 CFLAGS+=-DWOLFBOOT_TGL=1 endif endif ifeq ($(TARGET),x86_fsp_qemu) OBJS+=src/x86/qemu_fsp.o endif # x86-64 FSP targets ifeq ("${FSP}", "1") CFLAGS+=-DWOLFBOOT_FSP=1 USE_GCC_HEADLESS=0 LD_START_GROUP = LD_END_GROUP = LD := ld # load to address in RAM after wolfBoot (aligned to 16 bytes) CFLAGS+=-DWOLFBOOT_NO_LOAD_ADDRESS ifeq ($(filter-out $(STAGE1),1),) # building stage1 ifeq ($(FSP_TGL), 1) LSCRIPT_IN = ../hal/x86_fsp_tgl_stage1.ld else LSCRIPT_IN = ../hal/$(TARGET)_stage1.ld endif # using ../wolfboot.map as stage1 is built from stage1 sub-directory LDFLAGS = --defsym main=0x`nm ../wolfboot.elf | grep -w main | awk '{print $$1}'` \ --defsym wb_start_bss=0x`nm ../wolfboot.elf | grep -w _start_bss | awk '{print $$1}'` \ --defsym wb_end_bss=0x`nm ../wolfboot.elf | grep -w _end_bss | awk '{print $$1}'` \ --defsym _stage2_params=0x`nm ../wolfboot.elf | grep -w _stage2_params | awk '{print $$1}'` LDFLAGS += --gc-sections --entry=reset_vector -T $(LSCRIPT) -m elf_i386 -Map=loader_stage1.map OBJS += src/boot_x86_fsp.o OBJS += src/boot_x86_fsp_start.o OBJS += src/fsp_m.o OBJS += src/fsp_t.o OBJS += src/wolfboot_raw.o OBJS += src/x86/common.o OBJS += src/x86/hob.o OBJS += src/pci.o CFLAGS+=-DWOLFBOOT_USE_PCI OBJS += hal/x86_uart.o OBJS += src/string.o OBJS += src/stage2_params.o OBJS += src/x86/fsp.o ifeq ($(filter-out $(STAGE1_AUTH),1),) OBJS += src/libwolfboot.o OBJS += src/image.o OBJS += src/keystore.o OBJS += src/sig_wolfboot_raw.o ifeq ($(TARGET), kontron_vx3060_s2) OBJS += hal/kontron_vx3060_s2_loader.o endif OBJS += $(WOLFCRYPT_OBJS) CFLAGS+=-DSTAGE1_AUTH endif CFLAGS += -fno-stack-protector -m32 -fno-PIC -fno-pie -mno-mmx -mno-sse -DDEBUG_UART CFLAGS += -DFSP_M_BASE=$(FSP_M_BASE) ifeq ($(FSP_TGL), 1) OBJS+=src/x86/tgl_fsp.o OBJS+=src/ucode0.o CFLAGS += -DUCODE0_ADDRESS=$(UCODE0_BASE) endif ifeq ($(TARGET),x86_fsp_qemu) OBJS += hal/x86_fsp_qemu_loader.o endif else # building wolfBoot ifeq ($(FSP_TGL), 1) LSCRIPT_IN = hal/x86_fsp_tgl.ld.in else LSCRIPT_IN = hal/$(TARGET).ld.in endif LDFLAGS = --gc-sections --entry=main -T $(LSCRIPT) -Map=wolfboot.map CFLAGS += -fno-stack-protector -fno-PIC -fno-pie -mno-mmx -mno-sse -Os -DDEBUG_UART CFLAGS += -DFSP_M_BASE=$(FSP_M_BASE) OBJS += hal/x86_fsp_tgl.o OBJS += hal/x86_uart.o OBJS += src/boot_x86_fsp_payload.o OBJS += src/x86/common.o OBJS += src/x86/hob.o OBJS += src/pci.o CFLAGS+=-DWOLFBOOT_USE_PCI OBJS += src/x86/ahci.o OBJS += src/x86/ata.o OBJS += src/gpt.o OBJS += src/disk.o OBJS += src/x86/mptable.o OBJS += src/stage2_params.o OBJS += src/x86/exceptions.o OBJS += src/x86/gdt.o OBJS += src/x86/fsp.o OBJS += src/x86/fsp_s.o UPDATE_OBJS := src/update_disk.o CFLAGS+=-DWOLFBOOT_UPDATE_DISK ifeq ($(64BIT),1) LDFLAGS += -m elf_x86_64 --oformat elf64-x86-64 CFLAGS += -m64 else CFLAGS += -m32 LDFLAGS += -m elf_i386 --oformat elf32-i386 endif ifeq ($(FSP_TGL), 1) OBJS+=src/x86/tgl_fsp.o endif endif ifeq ($(64BIT),1) OBJS += src/x86/paging.o endif endif ifneq ($(CROSS_COMPILE_PATH),) # optional path for cross compiler includes CFLAGS+=-I$(CROSS_COMPILE_PATH)/usr/include --sysroot=$(CROSS_COMPILE_PATH) LDFLAGS+=-L$(CROSS_COMPILE_PATH)/usr/lib --sysroot=$(CROSS_COMPILE_PATH) endif ifeq ($(TARGET),x86_64_efi) USE_GCC_HEADLESS=0 GNU_EFI_LIB_PATH?=/usr/lib GNU_EFI_CRT0=$(GNU_EFI_LIB_PATH)/crt0-efi-x86_64.o GNU_EFI_LSCRIPT=$(GNU_EFI_LIB_PATH)/elf_x86_64_efi.lds CFLAGS += -fpic -ffreestanding -fno-stack-protector -fno-stack-check \ -fshort-wchar -mno-red-zone -maccumulate-outgoing-args CFLAGS += -I/usr/include/efi -I/usr/include/efi/x86_64 \ -DTARGET_X86_64_EFI -DWOLFBOOT_DUALBOOT # avoid using of fixed LOAD_ADDRESS, uefi target uses dynamic location CFLAGS += -DWOLFBOOT_NO_LOAD_ADDRESS LDFLAGS = -shared -Bsymbolic -L/usr/lib -T$(GNU_EFI_LSCRIPT) LD_START_GROUP = $(GNU_EFI_CRT0) LD_END_GROUP = -lgnuefi -lefi LD = ld UPDATE_OBJS:=src/update_ram.o endif ifeq ($(TARGET),aarch64_efi) # Generic AArch64 UEFI application (validated on NVIDIA Jetson Orin Nano). # Build gnu-efi for aarch64 first: ./tools/scripts/build-gnu-efi-aarch64.sh # (override the install path with GNU_EFI_PATH=... if needed). USE_GCC_HEADLESS=0 GNU_EFI_PATH?=tools/gnu-efi-aarch64 GNU_EFI_LIB_PATH?=$(GNU_EFI_PATH)/lib GNU_EFI_INC_PATH?=$(GNU_EFI_PATH)/include GNU_EFI_CRT0=$(GNU_EFI_LIB_PATH)/crt0-efi-aarch64.o GNU_EFI_LSCRIPT=$(GNU_EFI_LIB_PATH)/elf_aarch64_efi.lds CFLAGS += -fpic -ffreestanding -fno-stack-protector -fno-stack-check \ -fshort-wchar -mstrict-align CFLAGS += -I$(GNU_EFI_INC_PATH) -I$(GNU_EFI_INC_PATH)/efi \ -I$(GNU_EFI_INC_PATH)/efi/aarch64 \ -DTARGET_aarch64_efi -DWOLFBOOT_DUALBOOT # avoid using of fixed LOAD_ADDRESS, uefi target uses dynamic location CFLAGS += -DWOLFBOOT_NO_LOAD_ADDRESS # AArch64 PE/COFF output format for objcopy (see the wolfboot.efi rule). # This binutils exposes it as pei-aarch64-little (not efi-app-aarch64). EFI_OBJCOPY_TARGET=pei-aarch64-little # --allow-multiple-definition: gnu-efi's libefi init.o (pulled in for # InitializeLib) also defines memset/memcpy; wolfBoot's src/string.o comes # first in link order and wins. LDFLAGS = -shared -Bsymbolic --allow-multiple-definition \ -L$(GNU_EFI_LIB_PATH) -T$(GNU_EFI_LSCRIPT) LD_START_GROUP = $(GNU_EFI_CRT0) LD_END_GROUP = -lgnuefi -lefi LD = $(CROSS_COMPILE)ld UPDATE_OBJS:=src/update_ram.o endif ifeq ($(ARCH),sim) USE_GCC_HEADLESS=0 LD = gcc ifneq ($(TARGET),library) ifneq ($(TARGET),library_fs) UPDATE_OBJS:=src/update_flash.o endif endif ifeq ($(TARGET),library_fs) UPDATE_OBJS += hal/filesystem.o endif LD_START_GROUP= LD_END_GROUP= BOOT_IMG=test-app/image.elf CFLAGS+=-DARCH_SIM ifneq ($(ELF_FLASH_SCATTER),1) CFLAGS+=-DWOLFBOOT_USE_STDLIBC endif ifeq ($(FORCE_32BIT),1) CFLAGS+=-m32 LDFLAGS+=-m32 endif ifeq ($(SPMATH),1) ifeq ($(FORCE_32BIT),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o CFLAGS+=-DWOLFSSL_SP_DIV_WORD_HALF else ifeq ($(shell uname -m),aarch64) CFLAGS += -DARCH_AARCH64 -DFAST_MEMCPY MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_arm64.o else MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o CFLAGS+=-DWOLFSSL_SP_DIV_WORD_HALF endif endif ifeq ($(WOLFHSM_CLIENT),1) WOLFHSM_OBJS += $(WOLFBOOT_LIB_WOLFHSM)/port/posix/posix_transport_tcp.o endif ifeq ($(WOLFHSM_SERVER),1) WOLFHSM_OBJS += $(WOLFBOOT_LIB_WOLFHSM)/port/posix/posix_flash_file.o \ $(WOLFBOOT_LIB_WOLFHSM)/src/wh_transport_mem.o endif # wolfHSM NVM image generation support for simulator # User must provide NVM_CONFIG for their specific setup ifneq ($(filter 1,$(WOLFHSM_CLIENT) $(WOLFHSM_SERVER)),) WH_NVM_BIN ?= whNvmImage.bin WH_NVM_HEX ?= whNvmImage.hex WH_NVM_PART_SIZE ?= 16384 # must match partition size in hal/sim.c WH_NVM_BASE_ADDRESS ?= 0x0 CFLAGS += -DWOLFHSM_CFG_NO_SYS_TIME endif endif # Infineon AURIX Tricore ifeq ($(ARCH), AURIX_TC3) # TC3xx specific ifeq ($(TARGET), aurix_tc3xx) USE_GCC?=1 CFLAGS += -I$(TC3_DIR) -Ihal CFLAGS += -Werror CFLAGS += -Wall -Wdiv-by-zero -Warray-bounds -Wformat -Wformat-security \ -Wignored-qualifiers -Wno-implicit-function-declaration \ -Wno-type-limits -Wno-unused-variable -Wno-unused-parameter \ -Wno-missing-braces -fno-common -pipe \ -ffunction-sections -fdata-sections -fmessage-length=0 \ -std=gnu99 -DPART_BOOT_EXT -DPART_UPDATE_EXT -DPART_SWAP_EXT \ -DHAVE_TC3XX -DWOLFBOOT_LOADER_MAIN # Set TC3_CFG_DFLASH_SINGLE_ENDED=1 for devices with DFLASH provisioned in single # ended mode (default expects complement sensing) ifeq ($(TC3_CFG_DFLASH_SINGLE_ENDED),1) CFLAGS += -DTC3_CFG_DFLASH_SINGLE_ENDED endif # Makefile shennanigans for "if (WOLFHSM_CLIENT==1 || WOLFHSM_SERVER==1)" ifneq ($(filter 1,$(WOLFHSM_CLIENT) $(WOLFHSM_SERVER)),) # Common wolfHSM port files CFLAGS += -I$(WOLFHSM_INFINEON_TC3XX)/port -DWOLFHSM_CFG_DMA \ -DWOLFHSM_CFG_NO_SYS_TIME OBJS += $(WOLFHSM_INFINEON_TC3XX)/port/tchsm_common.o \ $(WOLFHSM_INFINEON_TC3XX)/port/tchsm_hsmhost.o # General wolfHSM files OBJS += $(WOLFBOOT_LIB_WOLFHSM)/src/wh_transport_mem.o # NVM image generation variables WH_NVM_BIN ?= whNvmImage.bin WH_NVM_HEX ?= whNvmImage.hex # NVM partition is half of DFLASH1; bank size depends on sensing mode ifeq ($(TC3_CFG_DFLASH_SINGLE_ENDED),1) WH_NVM_PART_SIZE ?= 0x10000 else WH_NVM_PART_SIZE ?= 0x8000 endif # Default to base of HSM DFLASH1 WH_NVM_BASE_ADDRESS ?= 0xAFC00000 # Select config file based on certificate chain verification # Use ?= to allow user override via command line (e.g., for offline cert chain) ifneq ($(CERT_CHAIN_VERIFY),) NVM_CONFIG ?= tools/scripts/tc3xx/wolfBoot-wolfHSM-dummy-certchain.nvminit else NVM_CONFIG ?= tools/scripts/tc3xx/wolfBoot-wolfHSM-keys.nvminit endif endif # Set BOOT_IMG to the ELF file instead of default bin when ELF_FLASH_SCATTER is enabled ifeq ($(ELF_FLASH_SCATTER),1) BOOT_IMG=test-app/image.elf endif ifeq ($(AURIX_TC3_HSM),1) ARCH_FLASH_OFFSET?=0x80028000 # HSM compiler flags, build options, source code, etc ifeq ($(USE_GCC),1) # Just arm-none-eabi-gcc for now CROSS_COMPILE?=arm-none-eabi- else endif # Compiler flags ifeq ($(NO_ASM),1) ifeq ($(SPMATH),1) MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o endif else ifeq ($(SPMATH),1) CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -DWOLFSSL_SP_NO_UMAAL MATH_OBJS += $(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_cortexm.o CFLAGS+=$(CORTEXM_ARM_EXTRA_CFLAGS) -DWOLFSSL_ARM_ARCH=7 endif endif CFLAGS += -march=armv7-m -mcpu=cortex-m3 -mthumb -mlittle-endian \ -fno-builtin -DWOLFBOOT_AURIX_TC3XX_HSM # Temporary fix masking wolfCrypt unused function warning with RSA_LOW_MEM CFLAGS += -Wno-unused-function LDFLAGS += -march=armv7-m -mcpu=cortex-m3 -mthumb -mlittle-endian -g \ --specs=nano.specs -Wl,--gc-sections -static -Wl,--cref -Wl,-n \ -ffunction-sections -fdata-sections \ -nostartfiles \ -Wl,-Map="wolfboot.map" \ -Wl,-L$(TC3_DIR)/tc3 LSCRIPT_IN=hal/$(TARGET)_hsm.ld # wolfHSM port server-specific files ifeq ($(WOLFHSM_SERVER),1) USE_GCC_HEADLESS=0 CFLAGS += -I$(WOLFHSM_INFINEON_TC3XX)/port/server OBJS += $(WOLFHSM_INFINEON_TC3XX)/port/server/port_halflash_df1.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/io.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/sysmem.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_hh_hsm.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_utils.o\ $(WOLFHSM_INFINEON_TC3XX)/port/server/ccb_hsm.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_hash.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_aes.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_cmac.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_pk.o \ $(WOLFHSM_INFINEON_TC3XX)/port/server/tchsm_trng.o endif # HSM BSP specific object files OBJS += $(TC3_DIR)/src/tc3_clock.o \ $(TC3_DIR)/src/tc3_flash.o \ $(TC3_DIR)/src/tc3_gpio.o \ $(TC3_DIR)/src/tc3_uart.o \ $(TC3_DIR)/src/tc3.o \ $(TC3_DIR)/src/tc3arm.o \ $(TC3_DIR)/src/tc3arm_crt.o \ $(TC3_DIR)/../tc3arm_bootloader/tc3arm_bootloader.o else # Tricore compiler settings ARCH_FLASH_OFFSET?=0x800A0000 ifeq ($(USE_GCC),1) HT_ROOT?=/opt/hightec/gnutri_v4.9.4.1-11fcedf-lin64 CROSS_COMPILE?=$(HT_ROOT)/bin/tricore- else HT_ROOT?=~/HighTec/toolchains/tricore/v9.1.2 CROSS_COMPILE?=$(HT_ROOT)/bin CC=$(CROSS_COMPILE)/clang LD=$(CROSS_COMPILE)/clang AS=$(CROSS_COMPILE)/clang AR=$(CROSS_COMPILE)/llvm-ar OBJCOPY=tricore-objcopy SIZE=$(CROSS_COMPILE)/llvm-size endif # No asm for you! MATH_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/sp_c32.o # Arch settings for tricore ifeq ($(USE_GCC),1) CFLAGS+= -fshort-double -mtc162 -fstrict-volatile-bitfields -fno-builtin \ -fno-strict-aliasing else CFLAGS+= --target=tricore -march=tc162 endif DEBUG_AFLAGS= -Wa,--gdwarf-2 # Linker flags ifeq ($(USE_GCC),1) LDFLAGS+= -fshort-double -mtc162 -nostartfiles -Wl,--extmap="a" else LDFLAGS+= --target=tricore -march=tc162 -Wl,--entry=tc3tc_start endif LDFLAGS+= -Wl,--gc-sections -Wl,--cref -Wl,-n \ -ffunction-sections -fdata-sections \ -Wl,-Map="wolfboot.map" \ -Wl,-L$(TC3_DIR)/tc3 # Tricore BSP layer (replace with only tricore specific stuff) OBJS += $(TC3_DIR)/src/tc3_clock.o \ $(TC3_DIR)/src/tc3_flash.o \ $(TC3_DIR)/src/tc3_gpio.o \ $(TC3_DIR)/src/tc3_uart.o \ $(TC3_DIR)/src/tc3.o \ $(TC3_DIR)/src/tc3tc_isr.o \ $(TC3_DIR)/src/tc3tc_traps.o \ $(TC3_DIR)/src/tc3tc.o \ $(TC3_DIR)/src/tc3tc_crt.o \ $(TC3_DIR)/../tc3tc_bootloader/tc3tc_bootloader.o ifeq ($(WOLFHSM_CLIENT),1) CFLAGS += -I$(WOLFHSM_INFINEON_TC3XX)/port/client OBJS += $(WOLFHSM_INFINEON_TC3XX)/port/client/hsm_ipc.o \ $(WOLFHSM_INFINEON_TC3XX)/port/client/io.o \ $(WOLFHSM_INFINEON_TC3XX)/port/client/tchsm_hh_host.o endif endif # !AURIX_TC3_HSM endif # TC4xx specific ifeq ($(TARGET), aurix_tc4xx) # Coming soon ;-) endif endif CFLAGS+=-DARCH_FLASH_OFFSET=$(ARCH_FLASH_OFFSET) BOOT_IMG?=test-app/image.bin # When ELF loading is enabled, sign the ELF file (not the flat binary) ifeq ($(ELF),1) BOOT_IMG=test-app/image.elf endif ## Update mechanism ifeq ($(ARCH),AARCH64) ifeq ($(TARGET),aarch64_efi) # UEFI app: UEFI owns MMU/FDT, so skip the -DMMU/-DWOLFBOOT_FDT DTS path and # fdt.o/gpt.o (like x86_64_efi). update_ram.o is set in the block above. # DEBUG=1: route wolfBoot_printf to the UEFI console (gnu-efi Print). ifeq ($(DEBUG),1) CFLAGS += -DWOLFBOOT_DEBUG_EFI=1 # Drop -Werror only here: WOLFBOOT_DEBUG_EFI pulls gnu-efi headers into every # TU and efidebug.h redefines the -DDEBUG object macro (added by DEBUG=1) as # a function macro. That cpp macro-redefinition warning has no -W name, so it # can't be scoped with -Wno-error=; our own sources stay warning-clean. CFLAGS := $(filter-out -Werror,$(CFLAGS)) endif else CFLAGS+=-DMMU -DWOLFBOOT_FDT -DWOLFBOOT_DUALBOOT OBJS+=src/fdt.o # src/gpt.c provides the CRC32 helpers reused by update_ram.c's uImage # header validator under WOLFBOOT_UBOOT_LEGACY (zynq, versal). Also # needed for the disk variant. Targets without WOLFBOOT_UBOOT_LEGACY or # disk support (e.g. nxp_ls1028a) GC the unused code via --gc-sections. OBJS+=src/gpt.o ifneq ($(filter 1,$(DISK_SDCARD) $(DISK_EMMC)),) # Disk-based boot (SD card or eMMC) CFLAGS+=-DWOLFBOOT_UPDATE_DISK ifeq ($(MAX_DISKS),) MAX_DISKS=1 endif CFLAGS+=-DMAX_DISKS=$(MAX_DISKS) UPDATE_OBJS:=src/update_disk.o OBJS+=src/disk.o else # RAM-based boot from external flash (default) UPDATE_OBJS:=src/update_ram.o endif endif else ifeq ($(DUALBANK_SWAP),1) CFLAGS+=-DWOLFBOOT_DUALBOOT UPDATE_OBJS:=src/update_flash_hwswap.o endif endif ## For library target disable partitions ifeq ($(TARGET),library) WOLFBOOT_NO_PARTITIONS=1 NO_LOADER=1 endif ifeq ($(TARGET),library_fs) EXT_FLASH=1 # Force all partitions to be marked as external NO_XIP=1 NO_SWAP_EXT= NO_LOADER=1 USE_GCC_HEADLESS=0 CFLAGS+=-DWOLFBOOT_USE_STDLIBC endif ## Set default update object ifneq ($(WOLFBOOT_NO_PARTITIONS),1) ifeq ($(UPDATE_OBJS),) UPDATE_OBJS:=./src/update_flash.o endif endif ## wolfBoot origin ifeq ($(WOLFBOOT_ORIGIN),) WOLFBOOT_ORIGIN=$(ARCH_FLASH_OFFSET) endif CFLAGS+=-DWOLFBOOT_ORIGIN=$(WOLFBOOT_ORIGIN) CFLAGS+=-DBOOTLOADER_PARTITION_SIZE=$(BOOTLOADER_PARTITION_SIZE) ## Debug WOLFCRYPT_OBJS+=$(WOLFBOOT_LIB_WOLFSSL)/wolfcrypt/src/logging.o # Debug UART ifeq ($(DEBUG_UART),1) CFLAGS+=-DDEBUG_UART # If this target has a UART driver, add it to the OBJS. When WOLFHAL=1, # the wolfHAL board.mk pulls in its own UART driver and hal/wolfhal.c # provides uart_write; the legacy driver would collide on uart_write. ifneq ($(WOLFHAL),1) ifneq (,$(wildcard hal/uart/uart_drv_$(TARGET).c)) OBJS+=hal/uart/uart_drv_$(TARGET).o endif endif endif # UART QSPI programmer (PolarFire SoC MPFS): receive binary over UART and # write it directly to QSPI flash. Requires EXT_FLASH=1 and DEBUG_UART=1. # Use tools/scripts/mpfs_qspi_prog.py on the host side. ifeq ($(UART_QSPI_PROGRAM),1) CFLAGS+=-DUART_QSPI_PROGRAM endif ifeq ($(NXP_CUSTOM_DCD),1) CFLAGS+=-DNXP_CUSTOM_DCD OBJS+=$(NXP_CUSTOM_DCD_OBJS) endif ifeq ($(BIG_ENDIAN),1) CFLAGS+=-D"BIG_ENDIAN_ORDER" endif CFLAGS+=-DWOLFBOOT_ARCH_$(ARCH) CFLAGS+=-DTARGET_$(TARGET)