| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # rt-loader make file
- # (c) 2025 Markus Stockhausen
- #
- # This is the make file for the rt-loader (aka runtime or realtek loader). It tries to
- # avoid copying files around where possible. Therefore it is controlled by the following
- # input parameters
- #
- # KERNEL_IMG_IN: The filename of an LZMA compressed kernel. If given the loader
- # and the kernel will be concatenated (piggy back loading).
- # FLASH_ADDR: The kernel address in the ROM. If given, the loader will be
- # created standalone and search a LZMA compressed uImage on the
- # target device starting from this address.
- # KERNEL_ADDR: The to-be-used kernel load address to which rt-loader will load
- # the kernel and execute it. If not given, rt-loader will use its
- # initial run address for this (which is the uImage load address
- # when using U-boot images) For non-uImage, this uses an arbitrary
- # load address which is independent of rt-loader's initial run
- # address.
- # KERNEL_IMG_OUT: The filename of the kernel image with the rt-loader prepended.
- # If not given it will be created as image.bin into the BUILD_DIR.
- # BUILD_DIR: The temporary build dir. If not given it will be set to "build".
- #
- # To add it into the OpenWrt toolchain just create the following new build commands
- #
- # define Build/rt-compress
- # $(STAGING_DIR_HOST)/bin/xz --format=lzma -9 --stdout "$@" > "[email protected]"
- # mv "[email protected]" "$@"
- # endef
- #
- # define Build/rt-loader-piggy-back
- # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
- # KERNEL_IMG_IN="$@" KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
- # mv "[email protected]" "$@"
- # endef
- #
- # define Build/rt-loader-non-uImage
- # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
- # KERNEL_ADDR="$(KERNEL_LOADADDR)" KERNEL_IMG_IN="$@" \
- # KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
- # mv "[email protected]" "$@"
- #
- # define Build/rt-loader-standalone
- # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
- # FLASH_ADDR=$(FLASH_ADDR) KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
- # mv "[email protected]" "$@"
- # endef
- #
- # Finally use them in new kernel build recipes. E.g. as all-in-one self extracting uImage.
- #
- # define Device/uimage-rt-loader
- # KERNEL/rt-loader := kernel-bin | append-dtb | rt-compress | rt-loader-piggy-back
- # KERNEL := $$(KERNEL/rt-loader) | uImage none
- # KERNEL_INITRAMFS := $$(KERNEL/rt-loader) | uImage none
- # endef
- #
- # Or as direct startable standlone version plus a kernel uImage
- #
- # define Device/rt-loader-uimage
- # FLASH_ADDR := 0xb4000000
- # KERNEL/rt-loader := rt-loader-standalone
- # KERNEL := kernel-bin | append-dtb | rt-compress | uImage lzma
- # endef
- #
- FLASH_ADDR_NONE := 0x0
- FLASH_ADDR ?= $(FLASH_ADDR_NONE)
- KERNEL_ADDR_NONE := 0x0
- KERNEL_ADDR ?= $(KERNEL_ADDR_NONE)
- CC := $(CROSS_COMPILE)gcc
- LD := $(CROSS_COMPILE)ld
- OBJCOPY := $(CROSS_COMPILE)objcopy
- OBJDUMP := $(CROSS_COMPILE)objdump
- CFLAGS = -fpic -mabicalls -O2 -fno-builtin-printf -Iinclude
- CFLAGS += -DFLASH_ADDR=$(FLASH_ADDR)
- CFLAGS += -DKERNEL_ADDR=$(KERNEL_ADDR)
- ASFLAGS = -fpic -msoft-float -Iinclude
- LDFLAGS = -static -nostdlib -T linker/linker.ld --no-warn-mismatch
- O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
- SOURCES = src/startup.S src/main.c src/board.c src/memory.c src/unlzma.c
- BUILD_DIR ?= build
- IMAGE_OBJ := $(BUILD_DIR)/image.o
- IMAGE_ELF := $(BUILD_DIR)/image.elf
- KERNEL_IMG_NONE := $(BUILD_DIR)/empty_kernel.bin
- KERNEL_IMG_IN ?= $(KERNEL_IMG_NONE)
- KERNEL_IMG_OUT ?= $(BUILD_DIR)/image.bin
- OBJECTS_C = $(filter %.c,$(SOURCES))
- OBJECTS_S = $(filter %.S,$(SOURCES))
- OBJECTS := $(OBJECTS_S:.S=.o) $(OBJECTS_C:.c=.o)
- OBJECTS := $(patsubst %.o, $(BUILD_DIR)/%.o, $(OBJECTS)) $(IMAGE_OBJ)
- ifneq ($(MAKECMDGOALS),clean)
- ifeq ($(KERNEL_IMG_IN)$(FLASH_ADDR),$(KERNEL_IMG_NONE)$(FLASH_ADDR_NONE))
- $(error Set either KERNEL_IMG_IN or FLASH_ADDR)
- else ifneq ($(FLASH_ADDR),$(FLASH_ADDR_NONE))
- $(info Create standalone rt-loader, loading uimage from address $(FLASH_ADDR))
- else
- $(info Create piggy backed rt-loader, loading appended kernel binary "$(KERNEL_IMG_IN)")
- endif
- endif
- all: $(KERNEL_IMG_OUT)
- install:
- $(BUILD_DIR)/%.o : %.c
- @mkdir -p $(dir $@)
- $(CC) $(CFLAGS) -c -o $@ $<
- $(BUILD_DIR)/%.o : %.S
- @mkdir -p $(dir $@)
- $(CC) $(ASFLAGS) -c -o $@ $<
- $(IMAGE_OBJ): $(KERNEL_IMG_IN)
- $(OBJCOPY) -I binary -O $(O_FORMAT) --rename-section .data=.kernel $< $@
- $(IMAGE_ELF): $(OBJECTS)
- $(LD) $(LDFLAGS) -o $@ $(OBJECTS)
- $(KERNEL_IMG_OUT): $(IMAGE_ELF)
- $(OBJCOPY) -O binary $< $@
- $(KERNEL_IMG_IN):
- @mkdir -p $(dir $@)
- @echo "DUMMY-KERNEL-IMAGE" > $@
- clean:
- rm -rf $(BUILD_DIR)/
|