The Freescale MXS SoCs have a multi staged boot process which needs different images composed out of different binaries. The ROM executes a so called bootstream which contains multiple executables. The first one is executed in SRAM and the purpose of this binary is to setup the internal PMIC and the SDRAM. The second image is usually the bootloader itself. In case of barebox the bootstream is composed out of the self extracting barebox image (pblx) and the prepare stage for setting up the SDRAM. The bootstream image itself is useful for USB boot, but for booting from SD cards or NAND a BCB header has to be prepended to the image. In case of SD boot the image has the .mxssd file extension in barebox. Since the bootstream images are encrypted they are not suitable for 2nd stage execution. For this purpose the 2nd stage images are generated. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
125 lines
4.7 KiB
Makefile
125 lines
4.7 KiB
Makefile
#
|
|
# barebox image generation Makefile
|
|
#
|
|
# This Makefile generates multiple images from a common barebox image
|
|
# and different pbl (pre bootloader) images. Optionally the result is
|
|
# encapsulated in SoC (or SoC boot type) specific image formats.
|
|
#
|
|
# The basic idea here is that we generate a single barebox main binary. This
|
|
# is compressed and prepended with a self extractor, generated as barebox.x.
|
|
# barebox.x is then prepended with different board specific pbls. The pbls
|
|
# are generally named after their entrypoints. So a pcm038 specific pbl will
|
|
# generate the following files:
|
|
#
|
|
# start_imx27_pcm038.pbl - The ELF file, linked with the entrypoint start_imx27_pcm038
|
|
# start_imx27_pcm038.pblb - The raw binary of the above.
|
|
# start_imx27_pcm038.pblx - The pblb appended with barebox.x
|
|
# start_imx27_pcm038.pbl.map - The linker map file
|
|
# start_imx27_pcm038.pbl.s - the disassembled ELF, generated with:
|
|
# make images/start_imx27_pcm038.pbl.s
|
|
#
|
|
# Example Makefile snippets for the i.MX51 babbage board (for readability in opposite
|
|
# order):
|
|
#
|
|
## image-$(CONFIG_MACH_FREESCALE_MX51_PDK) += barebox-imx51-babbage.img
|
|
#
|
|
# For CONFIG_MACH_FREESCALE_MX51_PDK build barebox-imx51-babbage.img
|
|
#
|
|
## FILE_barebox-imx51-babbage.img = start_imx51_babbage.pblx.imximg
|
|
#
|
|
# barebox-imx51-babbage.img should be generated (copied) from
|
|
# start_imx51_babbage.pblx.imximg. This copy process is only done so that we
|
|
# can generate images with a sane name. So what we really need for this
|
|
# board is a i.MX specific image, a .imximg
|
|
#
|
|
## CFG_start_imx51_babbage.pblx.imximg = $(board)/freescale-mx51-pdk/flash-header.imxcfg
|
|
#
|
|
# The .imximg can be generated from a .pblx using a rule specified in Makefile.imx.
|
|
# The configfile needed for this image is specified with CFG_<filename> = <configfile>
|
|
#
|
|
## pblx-$(CONFIG_MACH_FREESCALE_MX51_PDK) += start_imx51_babbage
|
|
#
|
|
# For this image we need a pblx (self extracting barebox binary) with
|
|
# start_imx51_babbage as entrypoint. start_imx51_babbage will be used
|
|
# both as entrypoint and as filename
|
|
#
|
|
|
|
quiet_cmd_objcopy_bin = OBJCOPYB $@
|
|
cmd_objcopy_bin = $(OBJCOPY) -O binary $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
|
|
|
|
pbl-lds := $(obj)/pbl.lds
|
|
extra-y += $(pbl-lds)
|
|
|
|
$(pbl-lds): $(obj)/../arch/$(ARCH)/lib/pbl.lds.S FORCE
|
|
$(call if_changed_dep,cpp_lds_S)
|
|
|
|
quiet_cmd_elf__ ?= LD $@
|
|
cmd_elf__ ?= $(LD) $(LDFLAGS) -static --gc-sections -pie \
|
|
-e $(2) -Map $@.map $(LDFLAGS_$(@F)) -o $@ \
|
|
-T $(pbl-lds) \
|
|
--start-group $(barebox-pbl-common) --end-group
|
|
|
|
PBL_CPPFLAGS += -fdata-sections -ffunction-sections
|
|
|
|
$(obj)/%.pbl: $(pbl-lds) $(barebox-pbl-common) FORCE
|
|
$(call if_changed,elf__,$(*F))
|
|
|
|
$(obj)/%.pblb: $(obj)/%.pbl FORCE
|
|
$(call if_changed,objcopy_bin,$(*F))
|
|
|
|
quiet_cmd_pblx ?= PBLX $@
|
|
cmd_pblx ?= cat $(obj)/$(patsubst %.pblx,%.pblb,$(2)) > $@; \
|
|
$(call size_append, $(obj)/barebox.z) >> $@; \
|
|
cat $(obj)/barebox.z >> $@; \
|
|
$(objtree)/scripts/fix_size -f $@
|
|
|
|
$(obj)/%.pblx: $(obj)/%.pblb $(obj)/barebox.z FORCE
|
|
$(call if_changed,pblx,$(@F))
|
|
|
|
$(obj)/%.s: $(obj)/% FORCE
|
|
$(call if_changed,disasm)
|
|
|
|
suffix_$(CONFIG_IMAGE_COMPRESSION_GZIP) = gzip
|
|
suffix_$(CONFIG_IMAGE_COMPRESSION_LZO) = lzo
|
|
suffix_$(CONFIG_IMAGE_COMPRESSION_LZ4) = lz4
|
|
suffix_$(CONFIG_IMAGE_COMPRESSION_XZKERN) = xzkern
|
|
suffix_$(CONFIG_IMAGE_COMPRESSION_NONE) = shipped
|
|
|
|
# barebox.z - compressed barebox binary
|
|
# ----------------------------------------------------------------
|
|
$(obj)/barebox.z: $(obj)/../barebox.bin FORCE
|
|
$(call if_changed,$(suffix_y))
|
|
|
|
# %.img - create a copy from another file
|
|
# ----------------------------------------------------------------
|
|
.SECONDEXPANSION:
|
|
$(obj)/%.img: $(obj)/$$(FILE_$$(@F))
|
|
$(Q)if [ -z $(FILE_$(@F)) ]; then echo "FILE_$(@F) empty!"; false; fi
|
|
$(call if_changed,shipped)
|
|
|
|
include $(srctree)/images/Makefile.am33xx
|
|
include $(srctree)/images/Makefile.imx
|
|
include $(srctree)/images/Makefile.mvebu
|
|
include $(srctree)/images/Makefile.rockchip
|
|
include $(srctree)/images/Makefile.socfpga
|
|
include $(srctree)/images/Makefile.tegra
|
|
include $(srctree)/images/Makefile.mxs
|
|
|
|
targets += $(image-y) pbl.lds barebox.x barebox.z
|
|
targets += $(patsubst %,%.pblx,$(pblx-y))
|
|
targets += $(patsubst %,%.pblb,$(pblx-y))
|
|
targets += $(patsubst %,%.pbl,$(pblx-y))
|
|
targets += $(patsubst %,%.s,$(pblx-y))
|
|
targets += $(foreach m, $(image-y), $(FILE_$(m)))
|
|
|
|
SECONDARY: $(addprefix $(obj)/,$(targets))
|
|
|
|
images: $(addprefix $(obj)/, $(image-y)) FORCE
|
|
@echo "images built:"
|
|
@for i in $(image-y); do echo $$i; done
|
|
|
|
clean-files := *.pbl *.pblb *.pblx *.map start_*.imximg *.img barebox.z start_*.kwbimg \
|
|
start_*.kwbuartimg *.socfpgaimg *.mlo *.t20img *.t20img.cfg *.t30img \
|
|
*.t30img.cfg *.t124img *.t124img.cfg *.mlospi *.mlo *.mxsbs *.mxssd
|
|
clean-files += pbl.lds
|