Makefile 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. # rt-loader make file
  2. # (c) 2025 Markus Stockhausen
  3. #
  4. # This is the make file for the rt-loader (aka runtime or realtek loader). It tries to
  5. # avoid copying files around where possible. Therefore it is controlled by the following
  6. # input parameters
  7. #
  8. # KERNEL_IMG_IN: The filename of an LZMA compressed kernel. If given the loader
  9. # and the kernel will be concatenated (piggy back loading).
  10. # FLASH_ADDR: The kernel address in the ROM. If given, the loeader will be
  11. # created standalone and search a LZMA compressed uImage on the
  12. # target device starting from this address.
  13. # KERNEL_IMG_OUT: The filename of the kernel image with the rt-loader prepended.
  14. # If not given it will be created as image.bin into the BUILD_DIR.
  15. # BUILD_DIR: The temporary build dir. If not given it will be set to "build".
  16. #
  17. # To add it into the OpenWrt toolchain just create the following new build commands
  18. #
  19. # define Build/rt-compress
  20. # $(STAGING_DIR_HOST)/bin/xz --format=lzma -9 --stdout "$@" > "[email protected]"
  21. # mv "[email protected]" "$@"
  22. # endef
  23. #
  24. # define Build/rt-loader-piggy-back
  25. # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
  26. # KERNEL_IMG_IN="$@" KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
  27. # mv "[email protected]" "$@"
  28. # endef
  29. #
  30. # define Build/rt-loader-standalone
  31. # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
  32. # FLASH_ADDR=$(FLASH_ADDR) KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
  33. # mv "[email protected]" "$@"
  34. # endef
  35. #
  36. # Finally use them in new kernel build recipes. E.g. as all-in-one self extracting uImage.
  37. #
  38. # define Device/uimage-rt-loader
  39. # KERNEL/rt-loader := kernel-bin | append-dtb | rt-compress | rt-loader-piggy-back
  40. # KERNEL := $$(KERNEL/rt-loader) | uImage none
  41. # KERNEL_INITRAMFS := $$(KERNEL/rt-loader) | uImage none
  42. # endef
  43. #
  44. # Or as direct startable standlone version plus a kernel uImage
  45. #
  46. # define Device/rt-loader-uimage
  47. # FLASH_ADDR := 0xb4000000
  48. # KERNEL/rt-loader := rt-loader-standalone
  49. # KERNEL := kernel-bin | append-dtb | rt-compress | uImage lzma
  50. # endef
  51. FLASH_ADDR_NONE := 0x0
  52. FLASH_ADDR ?= $(FLASH_ADDR_NONE)
  53. CC := $(CROSS_COMPILE)gcc
  54. LD := $(CROSS_COMPILE)ld
  55. OBJCOPY := $(CROSS_COMPILE)objcopy
  56. OBJDUMP := $(CROSS_COMPILE)objdump
  57. CFLAGS = -fpic -mabicalls -O2 -fno-builtin-printf -Iinclude
  58. CFLAGS += -DFLASH_ADDR=$(FLASH_ADDR)
  59. ASFLAGS = -fpic -msoft-float -Iinclude
  60. LDFLAGS = -static -nostdlib -T linker/linker.ld --no-warn-mismatch
  61. O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
  62. SOURCES = src/startup.S src/main.c src/board.c src/memory.c src/unlzma.c
  63. BUILD_DIR ?= build
  64. IMAGE_OBJ := $(BUILD_DIR)/image.o
  65. IMAGE_ELF := $(BUILD_DIR)/image.elf
  66. KERNEL_IMG_NONE := $(BUILD_DIR)/empty_kernel.bin
  67. KERNEL_IMG_IN ?= $(KERNEL_IMG_NONE)
  68. KERNEL_IMG_OUT ?= $(BUILD_DIR)/image.bin
  69. OBJECTS_C = $(filter %.c,$(SOURCES))
  70. OBJECTS_S = $(filter %.S,$(SOURCES))
  71. OBJECTS := $(OBJECTS_S:.S=.o) $(OBJECTS_C:.c=.o)
  72. OBJECTS := $(patsubst %.o, $(BUILD_DIR)/%.o, $(OBJECTS)) $(IMAGE_OBJ)
  73. ifneq ($(MAKECMDGOALS),clean)
  74. ifeq ($(KERNEL_IMG_IN)$(FLASH_ADDR),$(KERNEL_IMG_NONE)$(FLASH_ADDR_NONE))
  75. $(error Set either KERNEL_IMG_IN or FLASH_ADDR)
  76. else ifneq ($(FLASH_ADDR),$(FLASH_ADDR_NONE))
  77. $(info Create standalone rt-loader, loading uimage from address $(FLASH_ADDR))
  78. else
  79. $(info Create piggy backed rt-loader, loading appended kernel binary "$(KERNEL_IMG_IN)")
  80. endif
  81. endif
  82. all: $(KERNEL_IMG_OUT)
  83. install:
  84. $(BUILD_DIR)/%.o : %.c
  85. @mkdir -p $(dir $@)
  86. $(CC) $(CFLAGS) -c -o $@ $<
  87. $(BUILD_DIR)/%.o : %.S
  88. @mkdir -p $(dir $@)
  89. $(CC) $(ASFLAGS) -c -o $@ $<
  90. $(IMAGE_OBJ): $(KERNEL_IMG_IN)
  91. $(OBJCOPY) -I binary -O $(O_FORMAT) --rename-section .data=.kernel $< $@
  92. $(IMAGE_ELF): $(OBJECTS)
  93. $(LD) $(LDFLAGS) -o $@ $(OBJECTS)
  94. $(KERNEL_IMG_OUT): $(IMAGE_ELF)
  95. $(OBJCOPY) -O binary $< $@
  96. $(KERNEL_IMG_IN):
  97. @mkdir -p $(dir $@)
  98. @echo "DUMMY-KERNEL-IMAGE" > $@
  99. clean:
  100. rm -rf $(BUILD_DIR)/