Makefile 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # 'make' builds everything
  2. # 'make clean' deletes everything except source files and Makefile
  3. #
  4. # You need to set NAME, PART and PROC for your project.
  5. # NAME is the base name for most of the generated files.
  6. # solves problem with awk while building linux kernel
  7. # solution taken from http://www.googoolia.com/wp/2015/04/21/awk-symbol-lookup-error-awk-undefined-symbol-mpfr_z_sub/
  8. LD_LIBRARY_PATH =
  9. NAME = led_blinker
  10. PART = xc7z010clg400-1
  11. PROC = ps7_cortexa9_0
  12. FILES = $(wildcard cores/*.v)
  13. CORES = $(FILES:.v=)
  14. VIVADO = vivado -nolog -nojournal -mode batch
  15. XSCT = xsct
  16. RM = rm -rf
  17. INITRAMFS_TAG = 3.22
  18. LINUX_TAG = 6.12
  19. DTREE_TAG = xilinx_v2025.1
  20. INITRAMFS_DIR = tmp/initramfs-$(INITRAMFS_TAG)
  21. LINUX_DIR = tmp/linux-$(LINUX_TAG)
  22. DTREE_DIR = tmp/device-tree-xlnx-$(DTREE_TAG)
  23. LINUX_TAR = tmp/linux-$(LINUX_TAG).tar.xz
  24. DTREE_TAR = tmp/device-tree-xlnx-$(DTREE_TAG).tar.gz
  25. INITRAMFS_URL = https://dl-cdn.alpinelinux.org/alpine/v$(INITRAMFS_TAG)/releases/armv7/netboot/initramfs-lts
  26. LINUX_URL = https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-$(LINUX_TAG).52.tar.xz
  27. DTREE_URL = https://github.com/Xilinx/device-tree-xlnx/archive/$(DTREE_TAG).tar.gz
  28. SSBL_URL = https://github.com/pavel-demin/ssbl/releases/latest/download/ssbl.elf
  29. RTL8188_TAR = tmp/rtl8188eu-main.tar.gz
  30. RTL8188_URL = https://github.com/pavel-demin/rtl8188eu/archive/main.tar.gz
  31. .PRECIOUS: tmp/cores/% tmp/%.xpr tmp/%.xsa tmp/%.bit tmp/%.fsbl/executable.elf tmp/%.tree/system-top.dts
  32. all: tmp/$(NAME).bit boot.bin boot-rootfs.bin
  33. cores: $(addprefix tmp/, $(CORES))
  34. xpr: tmp/$(NAME).xpr
  35. bit: tmp/$(NAME).bit
  36. $(LINUX_TAR):
  37. mkdir -p $(@D)
  38. curl -L $(LINUX_URL) -o $@
  39. $(DTREE_TAR):
  40. mkdir -p $(@D)
  41. curl -L $(DTREE_URL) -o $@
  42. $(RTL8188_TAR):
  43. mkdir -p $(@D)
  44. curl -L $(RTL8188_URL) -o $@
  45. $(INITRAMFS_DIR):
  46. mkdir -p $@
  47. curl -L $(INITRAMFS_URL) | gunzip | cpio -id --directory=$@
  48. patch -d $@ -p 0 < patches/initramfs.patch
  49. rm -rf $@/etc/modprobe.d $@/lib/firmware $@/lib/modules $@/var
  50. $(LINUX_DIR): $(LINUX_TAR) $(RTL8188_TAR)
  51. mkdir -p $@
  52. tar -Jxf $< --strip-components=1 --directory=$@
  53. mkdir -p $@/drivers/net/wireless/realtek/rtl8188eu
  54. tar -zxf $(RTL8188_TAR) --strip-components=1 --directory=$@/drivers/net/wireless/realtek/rtl8188eu
  55. patch -d tmp -p 0 < patches/linux-$(LINUX_TAG).patch
  56. cp patches/cma.c $@/drivers/char
  57. cp patches/xilinx_devcfg.c $@/drivers/char
  58. cp patches/xilinx_zynq_defconfig $@/arch/arm/configs
  59. $(DTREE_DIR): $(DTREE_TAR)
  60. mkdir -p $@
  61. tar -zxf $< --strip-components=1 --directory=$@
  62. tmp/ssbl.elf:
  63. mkdir -p $(@D)
  64. curl -L $(SSBL_URL) -o $@
  65. zImage.bin: $(LINUX_DIR)
  66. make -C $< mrproper
  67. make -C $< ARCH=arm -j $(shell nproc 2> /dev/null || echo 1) \
  68. CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x8000 \
  69. xilinx_zynq_defconfig zImage modules
  70. cp $</arch/arm/boot/zImage $@
  71. initrd.bin: $(INITRAMFS_DIR)
  72. cd $< && find . | sort | cpio -o -H newc | gzip -9 -n > ../../$@
  73. truncate -s 4M $@
  74. boot.bin: tmp/$(NAME).fsbl/executable.elf tmp/ssbl.elf initrd.dtb zImage.bin initrd.bin
  75. echo "img:{[bootloader] tmp/$(NAME).fsbl/executable.elf tmp/ssbl.elf [load=0x2000000] initrd.dtb [load=0x2008000] zImage.bin [load=0x3000000] initrd.bin}" > tmp/boot.bif
  76. bootgen -image tmp/boot.bif -w -o $@
  77. boot-rootfs.bin: tmp/$(NAME).fsbl/executable.elf tmp/ssbl.elf rootfs.dtb zImage.bin
  78. echo "img:{[bootloader] tmp/$(NAME).fsbl/executable.elf tmp/ssbl.elf [load=0x2000000] rootfs.dtb [load=0x2008000] zImage.bin}" > tmp/boot-rootfs.bif
  79. bootgen -image tmp/boot-rootfs.bif -w -o $@
  80. initrd.dtb: tmp/$(NAME).tree/system-top.dts
  81. dtc -I dts -O dtb -o $@ -i tmp/$(NAME).tree -i dts dts/initrd.dts
  82. rootfs.dtb: tmp/$(NAME).tree/system-top.dts
  83. dtc -I dts -O dtb -o $@ -i tmp/$(NAME).tree -i dts dts/rootfs.dts
  84. tmp/cores/%: cores/%.v
  85. mkdir -p $(@D)
  86. $(VIVADO) -source scripts/core.tcl -tclargs $* $(PART)
  87. tmp/%.xpr: projects/% $(addprefix tmp/, $(CORES))
  88. mkdir -p $(@D)
  89. $(VIVADO) -source scripts/project.tcl -tclargs $* $(PART)
  90. tmp/%.xsa: tmp/%.xpr
  91. mkdir -p $(@D)
  92. $(VIVADO) -source scripts/hwdef.tcl -tclargs $*
  93. tmp/%.bit: tmp/%.xpr
  94. mkdir -p $(@D)
  95. $(VIVADO) -source scripts/bitstream.tcl -tclargs $*
  96. tmp/%.fsbl/executable.elf: tmp/%.xsa
  97. mkdir -p $(@D)
  98. $(XSCT) scripts/fsbl.tcl $* $(PROC)
  99. cp patches/red_pitaya_fsbl_hooks.c $(@D)
  100. patch $(@D)/fsbl_hooks.c patches/fsbl.patch
  101. make -C $(@D)
  102. tmp/%.tree/system-top.dts: tmp/%.xsa $(DTREE_DIR)
  103. mkdir -p $(@D)
  104. $(XSCT) scripts/devicetree.tcl $* $(PROC) $(DTREE_DIR)
  105. sed -i 's|#include|/include/|' $@
  106. clean:
  107. $(RM) zImage.bin initrd.bin boot.bin boot-rootfs.bin initrd.dtb rootfs.dtb tmp
  108. $(RM) .Xil usage_statistics_webtalk.html usage_statistics_webtalk.xml
  109. $(RM) vivado*.jou vivado*.log
  110. $(RM) webtalk*.jou webtalk*.log