Makefile 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 loader will be
  11. # created standalone and search a LZMA compressed uImage on the
  12. # target device starting from this address.
  13. # KERNEL_ADDR: The to-be-used kernel load address to which rt-loader will load
  14. # the kernel and execute it. If not given, rt-loader will use its
  15. # initial run address for this (which is the uImage load address
  16. # when using U-boot images) For non-uImage, this uses an arbitrary
  17. # load address which is independent of rt-loader's initial run
  18. # address.
  19. # KERNEL_IMG_OUT: The filename of the kernel image with the rt-loader prepended.
  20. # If not given it will be created as image.bin into the BUILD_DIR.
  21. # BUILD_DIR: The temporary build dir. If not given it will be set to "build".
  22. #
  23. # To add it into the OpenWrt toolchain just create the following new build commands
  24. #
  25. # define Build/rt-compress
  26. # $(STAGING_DIR_HOST)/bin/xz --format=lzma -9 --stdout "$@" > "[email protected]"
  27. # mv "[email protected]" "$@"
  28. # endef
  29. #
  30. # define Build/rt-loader-piggy-back
  31. # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
  32. # KERNEL_IMG_IN="$@" KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
  33. # mv "[email protected]" "$@"
  34. # endef
  35. #
  36. # define Build/rt-loader-non-uImage
  37. # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
  38. # KERNEL_ADDR="$(KERNEL_LOADADDR)" KERNEL_IMG_IN="$@" \
  39. # KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
  40. # mv "[email protected]" "$@"
  41. #
  42. # define Build/rt-loader-standalone
  43. # $(MAKE) all clean -C rt-loader CROSS_COMPILE="$(TARGET_CROSS)" \
  44. # FLASH_ADDR=$(FLASH_ADDR) KERNEL_IMG_OUT="[email protected]" BUILD_DIR="[email protected]"
  45. # mv "[email protected]" "$@"
  46. # endef
  47. #
  48. # Finally use them in new kernel build recipes. E.g. as all-in-one self extracting uImage.
  49. #
  50. # define Device/uimage-rt-loader
  51. # KERNEL/rt-loader := kernel-bin | append-dtb | rt-compress | rt-loader-piggy-back
  52. # KERNEL := $$(KERNEL/rt-loader) | uImage none
  53. # KERNEL_INITRAMFS := $$(KERNEL/rt-loader) | uImage none
  54. # endef
  55. #
  56. # Or as direct startable standlone version plus a kernel uImage
  57. #
  58. # define Device/rt-loader-uimage
  59. # FLASH_ADDR := 0xb4000000
  60. # KERNEL/rt-loader := rt-loader-standalone
  61. # KERNEL := kernel-bin | append-dtb | rt-compress | uImage lzma
  62. # endef
  63. #
  64. FLASH_ADDR_NONE := 0x0
  65. FLASH_ADDR ?= $(FLASH_ADDR_NONE)
  66. KERNEL_ADDR_NONE := 0x0
  67. KERNEL_ADDR ?= $(KERNEL_ADDR_NONE)
  68. CC := $(CROSS_COMPILE)gcc
  69. LD := $(CROSS_COMPILE)ld
  70. OBJCOPY := $(CROSS_COMPILE)objcopy
  71. OBJDUMP := $(CROSS_COMPILE)objdump
  72. CFLAGS = -fpic -mabicalls -O2 -fno-builtin-printf -Iinclude
  73. CFLAGS += -DFLASH_ADDR=$(FLASH_ADDR)
  74. CFLAGS += -DKERNEL_ADDR=$(KERNEL_ADDR)
  75. ASFLAGS = -fpic -msoft-float -Iinclude
  76. LDFLAGS = -static -nostdlib -T linker/linker.ld --no-warn-mismatch
  77. O_FORMAT = $(shell $(OBJDUMP) -i | head -2 | grep elf32)
  78. SOURCES = src/startup.S src/main.c src/board.c src/memory.c src/unlzma.c
  79. BUILD_DIR ?= build
  80. IMAGE_OBJ := $(BUILD_DIR)/image.o
  81. IMAGE_ELF := $(BUILD_DIR)/image.elf
  82. KERNEL_IMG_NONE := $(BUILD_DIR)/empty_kernel.bin
  83. KERNEL_IMG_IN ?= $(KERNEL_IMG_NONE)
  84. KERNEL_IMG_OUT ?= $(BUILD_DIR)/image.bin
  85. OBJECTS_C = $(filter %.c,$(SOURCES))
  86. OBJECTS_S = $(filter %.S,$(SOURCES))
  87. OBJECTS := $(OBJECTS_S:.S=.o) $(OBJECTS_C:.c=.o)
  88. OBJECTS := $(patsubst %.o, $(BUILD_DIR)/%.o, $(OBJECTS)) $(IMAGE_OBJ)
  89. ifneq ($(MAKECMDGOALS),clean)
  90. ifeq ($(KERNEL_IMG_IN)$(FLASH_ADDR),$(KERNEL_IMG_NONE)$(FLASH_ADDR_NONE))
  91. $(error Set either KERNEL_IMG_IN or FLASH_ADDR)
  92. else ifneq ($(FLASH_ADDR),$(FLASH_ADDR_NONE))
  93. $(info Create standalone rt-loader, loading uimage from address $(FLASH_ADDR))
  94. else
  95. $(info Create piggy backed rt-loader, loading appended kernel binary "$(KERNEL_IMG_IN)")
  96. endif
  97. endif
  98. all: $(KERNEL_IMG_OUT)
  99. install:
  100. $(BUILD_DIR)/%.o : %.c
  101. @mkdir -p $(dir $@)
  102. $(CC) $(CFLAGS) -c -o $@ $<
  103. $(BUILD_DIR)/%.o : %.S
  104. @mkdir -p $(dir $@)
  105. $(CC) $(ASFLAGS) -c -o $@ $<
  106. $(IMAGE_OBJ): $(KERNEL_IMG_IN)
  107. $(OBJCOPY) -I binary -O $(O_FORMAT) --rename-section .data=.kernel $< $@
  108. $(IMAGE_ELF): $(OBJECTS)
  109. $(LD) $(LDFLAGS) -o $@ $(OBJECTS)
  110. $(KERNEL_IMG_OUT): $(IMAGE_ELF)
  111. $(OBJCOPY) -O binary $< $@
  112. $(KERNEL_IMG_IN):
  113. @mkdir -p $(dir $@)
  114. @echo "DUMMY-KERNEL-IMAGE" > $@
  115. clean:
  116. rm -rf $(BUILD_DIR)/