Makefile 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. ISA ?= rv64imafdc_zicsr_zifencei_zba_zbb
  2. ABI ?= lp64d
  3. #TARGET_BOARD is JH7110 or NULL
  4. SOC := JH7110
  5. BOARD_FLAGS :=
  6. HWBOARD ?= visionfive2
  7. HWBOARD_FLAG ?= HWBOARD_VISIONFIVE2
  8. srcdir := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
  9. srcdir := $(srcdir:/=)
  10. confdir := $(srcdir)/conf
  11. wrkdir := $(CURDIR)/work
  12. buildroot_srcdir := $(srcdir)/buildroot
  13. buildroot_initramfs_wrkdir := $(wrkdir)/buildroot_initramfs
  14. # TODO: make RISCV be able to be set to alternate toolchain path
  15. RISCV ?= $(buildroot_initramfs_wrkdir)/host
  16. RVPATH := $(RISCV)/bin:$(PATH)
  17. target := riscv64-buildroot-linux-gnu
  18. CROSS_COMPILE := $(RISCV)/bin/$(target)-
  19. buildroot_initramfs_tar := $(buildroot_initramfs_wrkdir)/images/rootfs.tar
  20. buildroot_initramfs_config := $(confdir)/buildroot_initramfs_config
  21. buildroot_initramfs_sysroot_stamp := $(wrkdir)/.buildroot_initramfs_sysroot
  22. buildroot_initramfs_sysroot := $(wrkdir)/buildroot_initramfs_sysroot
  23. buildroot_rootfs_wrkdir := $(wrkdir)/buildroot_rootfs
  24. buildroot_rootfs_ext := $(buildroot_rootfs_wrkdir)/images/rootfs.ext4
  25. buildroot_rootfs_config := $(confdir)/buildroot_rootfs_config
  26. linux_srcdir := $(srcdir)/linux
  27. linux_wrkdir := $(wrkdir)/linux
  28. ifeq ($(HWBOARD), evb)
  29. linux_defconfig := $(linux_srcdir)/arch/riscv/configs/starfive_jh7110_defconfig
  30. else
  31. linux_defconfig := $(linux_srcdir)/arch/riscv/configs/starfive_visionfive2_defconfig
  32. endif
  33. vmlinux := $(linux_wrkdir)/vmlinux
  34. vmlinux_stripped := $(linux_wrkdir)/vmlinux-stripped
  35. vmlinux_bin := $(wrkdir)/vmlinux.bin
  36. module_install_path:=$(wrkdir)/module_install_path
  37. perf_tool_srcdir := $(linux_srcdir)/tools/perf
  38. perf_tool_wrkdir := $(linux_wrkdir)/tools/perf
  39. its_file=$(confdir)/$(HWBOARD)-fit-image.its
  40. uboot_its_file=$(confdir)/$(HWBOARD)-uboot-fit-image.its
  41. vfat_image := $(wrkdir)/starfive-$(HWBOARD)-vfat.part
  42. #ext_image := $(wrkdir) # TODO
  43. initramfs := $(wrkdir)/initramfs.cpio.gz
  44. sbi_srcdir := $(srcdir)/opensbi
  45. sbi_wrkdir := $(wrkdir)/opensbi
  46. sbi_bin := $(wrkdir)/opensbi/platform/generic/firmware/fw_payload.bin
  47. fit := $(wrkdir)/image.fit
  48. uboot_fit := $(wrkdir)/$(HWBOARD)_fw_payload.img
  49. fesvr_srcdir := $(srcdir)/riscv-fesvr
  50. fesvr_wrkdir := $(wrkdir)/riscv-fesvr
  51. libfesvr := $(fesvr_wrkdir)/prefix/lib/libfesvr.so
  52. spike_srcdir := $(srcdir)/riscv-isa-sim
  53. spike_wrkdir := $(wrkdir)/riscv-isa-sim
  54. spike := $(spike_wrkdir)/prefix/bin/spike
  55. qemu_srcdir := $(srcdir)/riscv-qemu
  56. qemu_wrkdir := $(wrkdir)/riscv-qemu
  57. qemu := $(qemu_wrkdir)/prefix/bin/qemu-system-riscv64
  58. uboot_srcdir := $(srcdir)/u-boot
  59. uboot_wrkdir := $(wrkdir)/u-boot
  60. rt_thread_wrkdir := $(srcdir)/rtthread/bsp/starfive/jh7110
  61. uboot_dtb_file := $(wrkdir)/u-boot/arch/riscv/dts/starfive_$(HWBOARD).dtb
  62. uboot := $(uboot_wrkdir)/u-boot.bin
  63. uboot_rt := $(wrkdir)/u-boot-rtthread.bin
  64. spl_tool_srcdir := $(srcdir)/soft_3rdpart/spl_tool
  65. spl_tool_wrkdir := $(wrkdir)/spl_tool
  66. spl_bin_normal_out := u-boot-spl.bin.normal.out
  67. uboot_config := starfive_$(HWBOARD)_defconfig
  68. uboot_defconfig := $(uboot_srcdir)/configs/$(uboot_config)
  69. rootfs := $(wrkdir)/rootfs.bin
  70. target_gcc := $(CROSS_COMPILE)gcc
  71. version := $(wrkdir)/version
  72. .PHONY: all check_arg
  73. all: check_arg $(fit) $(vfat_image) $(uboot_fit) $(spl_bin_normal_out)
  74. @echo
  75. @echo "This image has been generated for an ISA of $(ISA) and an ABI of $(ABI)"
  76. @echo "Find the image in work/image.fit, which should be copied to an MSDOS boot partition 1"
  77. @echo
  78. @echo "To completely erase, reformat, and program a disk sdX, run:"
  79. @echo " make DISK=/dev/sdX format-boot-loader"
  80. @echo " ... you will need gdisk and e2fsprogs installed"
  81. @echo " Please note this will not currently format the SDcard ext4 partition"
  82. @echo " This can be done manually if needed"
  83. @echo
  84. check_arg:
  85. ifeq ( , $(filter $(HWBOARD), visionfive2 evb fpga))
  86. $(error board $(HWBOARD) is not supported, BOARD=[visionfive2 | evb | fpga(deflault)])
  87. endif
  88. # TODO: depracated for now
  89. #ifneq ($(RISCV),$(buildroot_initramfs_wrkdir)/host)
  90. #$(target_gcc):
  91. # $(error The RISCV environment variable was set, but is not pointing at a toolchain install tree)
  92. #else
  93. #$(target_gcc): $(buildroot_initramfs_tar)
  94. #endif
  95. .PHONY: visionfive2 evb fpga
  96. visionfive2: HWBOARD := visionfive2
  97. visionfive2: HWBOARD_FLAG := HWBOARD_VISIONFIVE2
  98. visionfive2: uboot_config := starfive_$(HWBOARD)_defconfig
  99. visionfive2: uboot_dtb_file := $(wrkdir)/u-boot/arch/riscv/dts/starfive_$(HWBOARD).dtb
  100. visionfive2: linux_defconfig := $(linux_srcdir)/arch/riscv/configs/starfive_visionfive2_defconfig
  101. visionfive2: uboot_fit := $(wrkdir)/$(HWBOARD)_fw_payload.img
  102. visionfive2: vfat_image := $(wrkdir)/starfive-$(HWBOARD)-vfat.part
  103. visionfive2: its_file=$(confdir)/$(HWBOARD)-fit-image.its
  104. visionfive2: uboot_its_file=$(confdir)/$(HWBOARD)-uboot-fit-image.its
  105. visionfive2: all
  106. evb: HWBOARD := evb
  107. evb: HWBOARD_FLAG := HWBOARD_EVB
  108. evb: uboot_config := starfive_$(HWBOARD)_defconfig
  109. evb: uboot_dtb_file := $(wrkdir)/u-boot/arch/riscv/dts/starfive_$(HWBOARD).dtb
  110. evb: linux_defconfig := $(linux_srcdir)/arch/riscv/configs/starfive_jh7110_defconfig
  111. evb: uboot_fit := $(wrkdir)/$(HWBOARD)_fw_payload.img
  112. evb: vfat_image := $(wrkdir)/starfive-$(HWBOARD)-vfat.part
  113. evb: its_file=$(confdir)/$(HWBOARD)-fit-image.its
  114. evb: uboot_its_file=$(confdir)/$(HWBOARD)-uboot-fit-image.its
  115. evb: all
  116. fpga: HWBOARD := fpga
  117. fpga: all
  118. fpga: HWBOARD_FLAG := HWBOARD_FPGA
  119. $(version):
  120. cd $(linux_srcdir) && \
  121. sh $(confdir)/version > $(version)
  122. chmod 777 $(version)
  123. $(buildroot_initramfs_wrkdir)/.config: $(buildroot_srcdir)
  124. # rm -rf $(dir $@)
  125. mkdir -p $(dir $@)
  126. cp $(buildroot_initramfs_config) $@
  127. $(MAKE) -C $< RISCV=$(RISCV) O=$(buildroot_initramfs_wrkdir) olddefconfig
  128. # buildroot_initramfs provides gcc
  129. $(buildroot_initramfs_tar): $(buildroot_srcdir) $(buildroot_initramfs_wrkdir)/.config $(buildroot_initramfs_config)
  130. $(MAKE) -C $< RISCV=$(RISCV) O=$(buildroot_initramfs_wrkdir)
  131. .PHONY: buildroot_initramfs-menuconfig
  132. buildroot_initramfs-menuconfig: $(buildroot_initramfs_wrkdir)/.config $(buildroot_srcdir)
  133. $(MAKE) -C $(dir $<) O=$(buildroot_initramfs_wrkdir) menuconfig
  134. $(MAKE) -C $(dir $<) O=$(buildroot_initramfs_wrkdir) savedefconfig
  135. cp $(dir $<)defconfig $(buildroot_initramfs_config)
  136. # use buildroot_initramfs toolchain
  137. # TODO: fix path and conf/buildroot_rootfs_config
  138. $(buildroot_rootfs_wrkdir)/.config: $(buildroot_srcdir) $(buildroot_initramfs_tar)
  139. # rm -rf $(dir $@)
  140. mkdir -p $(dir $@)
  141. cp $(buildroot_rootfs_config) $@
  142. $(MAKE) -C $< RISCV=$(RISCV) PATH=$(RVPATH) O=$(buildroot_rootfs_wrkdir) olddefconfig
  143. $(buildroot_rootfs_ext): $(buildroot_srcdir) $(buildroot_rootfs_wrkdir)/.config $(target_gcc) $(buildroot_rootfs_config) $(version)
  144. mkdir -p $(buildroot_rootfs_wrkdir)/target/lib
  145. cp -r $(module_install_path)/lib/modules $(buildroot_rootfs_wrkdir)/target/lib/
  146. mkdir -p $(buildroot_rootfs_wrkdir)/target/usr/bin
  147. cp $(perf_tool_wrkdir)/perf $(buildroot_rootfs_wrkdir)/target/usr/bin/
  148. cp $(version) $(buildroot_rootfs_wrkdir)/target/usr/bin/version
  149. $(MAKE) -C $< RISCV=$(RISCV) PATH=$(RVPATH) O=$(buildroot_rootfs_wrkdir)
  150. .PHONY: buildroot_rootfs
  151. buildroot_rootfs: $(buildroot_rootfs_ext)
  152. .PHONY: buildroot_rootfs-menuconfig
  153. buildroot_rootfs-menuconfig: $(buildroot_rootfs_wrkdir)/.config $(buildroot_srcdir)
  154. $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) menuconfig
  155. $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) savedefconfig
  156. cp $(dir $<)defconfig conf/buildroot_rootfs_config
  157. $(buildroot_initramfs_sysroot_stamp): $(buildroot_initramfs_tar)
  158. mkdir -p $(buildroot_initramfs_sysroot)
  159. tar -xpf $< -C $(buildroot_initramfs_sysroot) --exclude ./dev --exclude ./usr/share/locale
  160. touch $@
  161. $(linux_wrkdir)/.config: $(linux_defconfig) $(linux_srcdir)
  162. mkdir -p $(dir $@)
  163. cp -p $< $@
  164. $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=riscv olddefconfig
  165. $(uboot_wrkdir)/.config: $(uboot_defconfig)
  166. mkdir -p $(dir $@)
  167. cp -p $< $@
  168. $(MAKE) -C $(uboot_srcdir) O=$(uboot_wrkdir) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=riscv olddefconfig
  169. $(vmlinux): $(linux_srcdir) $(linux_wrkdir)/.config $(target_gcc)
  170. $(MAKE) -C $< O=$(linux_wrkdir) \
  171. ARCH=riscv \
  172. CROSS_COMPILE=$(CROSS_COMPILE) \
  173. PATH=$(RVPATH) \
  174. vmlinux \
  175. all \
  176. modules
  177. $(MAKE) -C $< O=$(linux_wrkdir) \
  178. ARCH=riscv \
  179. CROSS_COMPILE=$(CROSS_COMPILE) \
  180. PATH=$(RVPATH) \
  181. INSTALL_MOD_PATH=$(module_install_path) \
  182. modules_install
  183. vpudriver-build: $(vmlinux)
  184. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) \
  185. INSTALL_MOD_PATH=$(module_install_path) wave511driver
  186. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) \
  187. INSTALL_MOD_PATH=$(module_install_path) wave420ldriver
  188. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) \
  189. INSTALL_MOD_PATH=$(module_install_path) codaj12driver
  190. $(perf_tool_wrkdir)/perf: $(linux_srcdir) $(vmlinux)
  191. mkdir -p $(perf_tool_wrkdir)
  192. $(MAKE) -C $(perf_tool_srcdir) O=$(perf_tool_wrkdir)/ \
  193. ARCH=riscv \
  194. CROSS_COMPILE=$(CROSS_COMPILE) \
  195. WERROR=0 NO_GTK2=1 NO_LIBPERL=1 \
  196. NO_LIBBIONIC=1
  197. .PHONY: perf
  198. perf: $(perf_tool_wrkdir)/perf
  199. .PHONY: initrd
  200. initrd: $(initramfs)
  201. $(initramfs).d: $(buildroot_initramfs_sysroot)
  202. $(linux_srcdir)/usr/gen_initramfs_list.sh -l $(confdir)/initramfs.txt $(buildroot_initramfs_sysroot) > $@
  203. $(initramfs): $(buildroot_initramfs_sysroot) $(vmlinux) vpudriver-build $(version) $(perf_tool_wrkdir)/perf
  204. cp -r $(module_install_path)/lib/modules $(buildroot_initramfs_sysroot)/lib/
  205. cp $(perf_tool_wrkdir)/perf $(buildroot_initramfs_sysroot)/usr/bin/
  206. cp $(version) $(buildroot_initramfs_sysroot)/usr/bin/version && \
  207. cd $(linux_wrkdir) && \
  208. $(linux_srcdir)/usr/gen_initramfs_list.sh \
  209. -o $@ -u $(shell id -u) -g $(shell id -g) \
  210. $(confdir)/initramfs.txt \
  211. $(buildroot_initramfs_sysroot)
  212. $(vmlinux_stripped): $(vmlinux)
  213. PATH=$(RVPATH) $(target)-strip -o $@ $<
  214. $(vmlinux_bin): $(vmlinux)
  215. PATH=$(RVPATH) $(target)-objcopy -O binary $< $@
  216. .PHONY: linux-menuconfig
  217. linux-menuconfig: $(linux_wrkdir)/.config
  218. $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) menuconfig
  219. $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) savedefconfig
  220. cp $(dir $<)defconfig $(linux_defconfig)
  221. # Note: opensbi generic platform default FW_TEXT_START is 0x80000000
  222. # For JH7110, need to specify the FW_TEXT_START to 0x40000000
  223. # Otherwise, the fw_payload.bin downloading via jtag will not run.
  224. # not affect the evb_fw_payload.img for its file has FW_TEXT_START
  225. $(sbi_bin): $(uboot) $(vmlinux)
  226. rm -rf $(sbi_wrkdir)
  227. mkdir -p $(sbi_wrkdir)
  228. cd $(sbi_wrkdir) && O=$(sbi_wrkdir) CFLAGS="-mabi=$(ABI) -march=$(ISA)" ${MAKE} -C $(sbi_srcdir) CROSS_COMPILE=$(CROSS_COMPILE) \
  229. PLATFORM=generic FW_PAYLOAD_PATH=$(uboot_rt) FW_FDT_PATH=$(uboot_dtb_file) FW_TEXT_START=0x40000000
  230. $(fit): $(sbi_bin) $(vmlinux_bin) $(uboot) $(its_file) ${initramfs}
  231. $(uboot_wrkdir)/tools/mkimage -f $(its_file) -A riscv -O linux -T flat_dt $@
  232. @if [ -f fsz.sh ]; then ./fsz.sh $(sbi_bin); fi
  233. $(libfesvr): $(fesvr_srcdir)
  234. rm -rf $(fesvr_wrkdir)
  235. mkdir -p $(fesvr_wrkdir)
  236. mkdir -p $(dir $@)
  237. cd $(fesvr_wrkdir) && $</configure \
  238. --prefix=$(dir $(abspath $(dir $@)))
  239. $(MAKE) -C $(fesvr_wrkdir)
  240. $(MAKE) -C $(fesvr_wrkdir) install
  241. touch -c $@
  242. $(spike): $(spike_srcdir) $(libfesvr)
  243. rm -rf $(spike_wrkdir)
  244. mkdir -p $(spike_wrkdir)
  245. mkdir -p $(dir $@)
  246. cd $(spike_wrkdir) && PATH=$(RVPATH) $</configure \
  247. --prefix=$(dir $(abspath $(dir $@))) \
  248. --with-fesvr=$(dir $(abspath $(dir $(libfesvr))))
  249. $(MAKE) PATH=$(RVPATH) -C $(spike_wrkdir)
  250. $(MAKE) -C $(spike_wrkdir) install
  251. touch -c $@
  252. $(qemu): $(qemu_srcdir)
  253. rm -rf $(qemu_wrkdir)
  254. mkdir -p $(qemu_wrkdir)
  255. mkdir -p $(dir $@)
  256. which pkg-config
  257. # pkg-config from buildroot blows up qemu configure
  258. cd $(qemu_wrkdir) && $</configure \
  259. --prefix=$(dir $(abspath $(dir $@))) \
  260. --target-list=riscv64-softmmu
  261. $(MAKE) -C $(qemu_wrkdir)
  262. $(MAKE) -C $(qemu_wrkdir) install
  263. touch -c $@
  264. .PHONY: uboot-menuconfig
  265. uboot-menuconfig: $(uboot_wrkdir)/.config
  266. $(MAKE) -C $(uboot_srcdir) O=$(dir $<) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=riscv menuconfig
  267. $(MAKE) -C $(uboot_srcdir) O=$(dir $<) CROSS_COMPILE=$(CROSS_COMPILE) ARCH=riscv savedefconfig
  268. cp $(dir $<)defconfig $(uboot_defconfig)
  269. $(uboot): $(uboot_srcdir) $(target_gcc)
  270. rm -rf $(uboot_wrkdir)
  271. mkdir -p $(uboot_wrkdir)
  272. mkdir -p $(dir $@)
  273. $(MAKE) -C $(uboot_srcdir) O=$(uboot_wrkdir) $(uboot_config)
  274. $(MAKE) -C $(uboot_srcdir) O=$(uboot_wrkdir) CROSS_COMPILE=$(CROSS_COMPILE)
  275. cd $(rt_thread_wrkdir) && scons -c && scons
  276. cd -
  277. cp $(rt_thread_wrkdir)/rtthread.bin $(wrkdir)
  278. cp $(uboot) $(wrkdir)/tmp.bin
  279. truncate $(wrkdir)/tmp.bin -c -s 2048K
  280. cat $(wrkdir)/rtthread.bin >> $(wrkdir)/tmp.bin
  281. cp $(wrkdir)/tmp.bin $(uboot_rt)
  282. $(spl_tool_wrkdir)/spl_tool: $(spl_tool_srcdir)
  283. rm -rf $(spl_tool_wrkdir)
  284. cp -ar $< $(spl_tool_wrkdir)
  285. $(MAKE) -C $(spl_tool_wrkdir)
  286. .PHONY: spl_tool
  287. spl_tool: $(spl_tool_wrkdir)/spl_tool
  288. $(spl_bin_normal_out): $(uboot) $(spl_tool_wrkdir)/spl_tool
  289. $(spl_tool_wrkdir)/spl_tool -c -f $(uboot_wrkdir)/spl/u-boot-spl.bin
  290. cp $(uboot_wrkdir)/spl/$(spl_bin_normal_out) $(wrkdir)
  291. $(uboot_fit): $(sbi_bin) $(uboot_its_file) $(uboot)
  292. $(uboot_wrkdir)/tools/mkimage -f $(uboot_its_file) -A riscv -O u-boot -T firmware $(uboot_fit)
  293. $(rootfs): $(buildroot_rootfs_ext)
  294. cp $< $@
  295. $(buildroot_initramfs_sysroot): $(buildroot_initramfs_sysroot_stamp)
  296. .PHONY: buildroot_initramfs_sysroot vmlinux fit uboot_fit
  297. buildroot_initramfs_sysroot: $(buildroot_initramfs_sysroot)
  298. vmlinux: $(vmlinux)
  299. fit: $(fit)
  300. uboot_fit: $(uboot_fit)
  301. .PHONY: clean
  302. clean:
  303. rm -rf work/u-boot
  304. rm -rf work/opensbi
  305. rm -f work/*-vfat.part
  306. rm -f work/image.fit
  307. rm -f work/*_fw_payload.img
  308. rm -f work/initramfs.cpio.gz
  309. rm -f work/linux/vmlinux*
  310. rm -f work/u-boot-spl.bin.normal.out
  311. rm -f work/version
  312. rm -rf $(spl_tool_wrkdir)
  313. rm -rf $(perf_tool_wrkdir)
  314. .PHONY: distclean
  315. distclean:
  316. rm -rf -- $(wrkdir) $(toolchain_dest)
  317. .PHONY: sim
  318. sim: $(spike) $(sbi_bin)
  319. $(spike) --isa=$(ISA) -p4 $(sbi_bin)
  320. .PHONY: qemu
  321. qemu: $(qemu) $(sbi_bin) $(vmlinux) $(initramfs)
  322. $(qemu) -nographic -machine virt -bios $(sbi_bin) -kernel $(vmlinux) -initrd $(initramfs) \
  323. -netdev user,id=net0 -device virtio-net-device,netdev=net0
  324. .PHONY: qemu-rootfs
  325. qemu-rootfs: $(qemu) $(sbi_bin) $(vmlinux) $(initramfs) $(rootfs)
  326. $(qemu) -nographic -machine virt -bios $(sbi_bin) -kernel $(vmlinux) -initrd $(initramfs) \
  327. -drive file=$(rootfs),format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
  328. -netdev user,id=net0 -device virtio-net-device,netdev=net0
  329. .PHONY: uboot
  330. uboot: $(uboot)
  331. # Relevant partition type codes with GUID
  332. SPL = 2E54B353-1271-4842-806F-E436D6AF6985
  333. VFAT = EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
  334. LINUX = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
  335. UBOOT = 5B193300-FC78-40CD-8002-E86C45580B47
  336. UBOOTENV = a09354ac-cd63-11e8-9aff-70b3d592f0fa
  337. UBOOTDTB = 070dd1a8-cd64-11e8-aa3d-70b3d592f0fa
  338. UBOOTFIT = 04ffcafa-cd65-11e8-b974-70b3d592f0fa
  339. # Note: The following are the sector number used to partition
  340. # The default sector size is 512 Bytes
  341. # The partition start should be align on 2048-sector boundaries
  342. # expand the vfat size to 300+M for the vpu/jpu or other debug
  343. SPL_START = 4096
  344. SPL_END = 8191
  345. UBOOT_START = 8192
  346. UBOOT_END = 16383
  347. UBOOT_SIZE = $(shell expr $(UBOOT_END) - $(UBOOT_START) + 1)
  348. VFAT_START = 16384
  349. VFAT_END = 614399
  350. VFAT_SIZE = $(shell expr $(VFAT_END) - $(VFAT_START) + 1)
  351. ROOT_START = 614400
  352. $(vfat_image): $(fit) $(confdir)/jh7110_uEnv.txt $(confdir)/vf2_uEnv.txt $(confdir)/vf2_nvme_uEnv.txt
  353. @if [ `du --apparent-size --block-size=512 $(uboot) | cut -f 1` -ge $(UBOOT_SIZE) ]; then \
  354. echo "Uboot is too large for partition!!\nReduce uboot or increase partition size"; \
  355. exit 1; fi
  356. dd if=/dev/zero of=$(vfat_image) bs=512 count=$(VFAT_SIZE)
  357. /sbin/mkfs.vfat $(vfat_image)
  358. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(fit) ::starfiveu.fit
  359. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/jh7110_uEnv.txt ::jh7110_uEnv.txt
  360. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/vf2_uEnv.txt ::vf2_uEnv.txt
  361. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/vf2_nvme_uEnv.txt ::vf2_nvme_uEnv.txt
  362. .PHONY: format-boot-loader
  363. format-boot-loader: $(sbi_bin) $(uboot) $(fit) $(vfat_image) $(spl_bin_normal_out)
  364. @test -b $(DISK) || (echo "$(DISK): is not a block device"; exit 1)
  365. sudo /sbin/sgdisk --clear \
  366. --new=1:$(SPL_START):$(SPL_END) --change-name=1:"spl" --typecode=1:$(SPL) \
  367. --new=2:$(UBOOT_START):$(UBOOT_END) --change-name=2:"uboot" --typecode=2:$(UBOOT) \
  368. --new=3:$(VFAT_START):$(VFAT_END) --change-name=3:"image" --typecode=3:$(VFAT) \
  369. --new=4:$(ROOT_START):0 --change-name=4:"root" --typecode=4:$(LINUX) \
  370. $(DISK)
  371. -/sbin/partprobe
  372. @sleep 1
  373. ifeq ($(DISK)p1,$(wildcard $(DISK)p1))
  374. @$(eval PART1 := $(DISK)p1)
  375. @$(eval PART2 := $(DISK)p2)
  376. @$(eval PART3 := $(DISK)p3)
  377. @$(eval PART4 := $(DISK)p4)
  378. else ifeq ($(DISK)s1,$(wildcard $(DISK)s1))
  379. @$(eval PART1 := $(DISK)s1)
  380. @$(eval PART2 := $(DISK)s2)
  381. @$(eval PART3 := $(DISK)s3)
  382. @$(eval PART4 := $(DISK)s4)
  383. else ifeq ($(DISK)1,$(wildcard $(DISK)1))
  384. @$(eval PART1 := $(DISK)1)
  385. @$(eval PART2 := $(DISK)2)
  386. @$(eval PART3 := $(DISK)3)
  387. @$(eval PART4 := $(DISK)4)
  388. else
  389. @echo Error: Could not find bootloader partition for $(DISK)
  390. @exit 1
  391. endif
  392. sudo dd if=$(spl_bin_normal_out) of=$(PART1) bs=4096
  393. sudo dd if=$(uboot_fit) of=$(PART2) bs=4096
  394. sudo dd if=$(vfat_image) of=$(PART3) bs=4096
  395. sync; sleep 1;
  396. #starfive image
  397. format-rootfs-image: format-boot-loader
  398. @echo "Done setting up basic initramfs boot. We will now try to install"
  399. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  400. @echo "you can safely cancel here"
  401. sudo /sbin/mke2fs -t ext4 $(PART4)
  402. -mkdir -p tmp-mnt
  403. -mkdir -p tmp-rootfs
  404. -sudo mount $(PART4) tmp-mnt && \
  405. sudo mount -o loop $(buildroot_rootfs_ext) tmp-rootfs&& \
  406. sudo cp -fr tmp-rootfs/* tmp-mnt/
  407. sync; sleep 1;
  408. sudo umount tmp-mnt
  409. sudo umount tmp-rootfs
  410. rmdir tmp-mnt
  411. rmdir tmp-rootfs
  412. .PHONY: sdimg img
  413. sdimg: $(buildroot_rootfs_ext)
  414. @./genimage.sh
  415. img: sdimg $(spl_tool_wrkdir)/spl_tool
  416. $(spl_tool_wrkdir)/spl_tool -i -f $(wrkdir)/sdcard.img
  417. #usb config
  418. format-usb-disk: $(sbi_bin) $(uboot) $(fit) $(vfat_image)
  419. @test -b $(DISK) || (echo "$(DISK): is not a block device"; exit 1)
  420. /sbin/sgdisk --clear \
  421. --new=1:0:+256M --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  422. --new=2:0:+1G --change-name=2:uboot --typecode=2:$(UBOOT) -g\
  423. $(DISK)
  424. -/sbin/partprobe
  425. @sleep 1
  426. ifeq ($(DISK)p1,$(wildcard $(DISK)p1))
  427. @$(eval PART1 := $(DISK)p1)
  428. @$(eval PART2 := $(DISK)p2)
  429. else ifeq ($(DISK)s1,$(wildcard $(DISK)s1))
  430. @$(eval PART1 := $(DISK)s1)
  431. @$(eval PART2 := $(DISK)s2)
  432. else ifeq ($(DISK)1,$(wildcard $(DISK)1))
  433. @$(eval PART1 := $(DISK)1)
  434. @$(eval PART2 := $(DISK)2)
  435. else
  436. @echo Error: Could not find bootloader partition for $(DISK)
  437. @exit 1
  438. endif
  439. dd if=$(uboot) of=$(PART2) bs=4096
  440. dd if=$(vfat_image) of=$(PART1) bs=4096
  441. DEB_IMAGE := debian_nvdla_20190506.tar.xz
  442. DEB_URL := https://github.com/sifive/freedom-u-sdk/releases/download/nvdla-demo-0.1
  443. DEMO_IMAGE := sifive-debian-demo-mar7.tar.xz
  444. DEMO_URL := https://github.com/tmagik/freedom-u-sdk/releases/download/hifiveu-2.0-alpha.1/
  445. #nvdla image
  446. format-nvdla-image: format-boot-loader
  447. @echo "Done setting up basic initramfs boot. We will now try to install"
  448. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  449. @echo "you can safely cancel here"
  450. @test -e $(wrkdir)/$(DEB_IMAGE) || (wget -P $(wrkdir) $(DEB_URL)/$(DEB_IMAGE))
  451. /sbin/mke2fs -t ext4 $(PART4)
  452. -mkdir -p tmp-mnt
  453. -mount $(PART4) tmp-mnt && \
  454. echo "please wait until checkpoint reaches 489k" && \
  455. tar Jxf $(wrkdir)/$(DEB_IMAGE) -C tmp-mnt --checkpoint=1000
  456. umount tmp-mnt
  457. #demo image
  458. format-demo-image: format-boot-loader
  459. @echo "Done setting up basic initramfs boot. We will now try to install"
  460. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  461. @echo "you can safely cancel here"
  462. /sbin/mke2fs -t ext4 $(PART4)
  463. -mkdir tmp-mnt
  464. -sudo mount $(PART4) tmp-mnt && cd tmp-mnt && \
  465. sudo wget $(DEMO_URL)$(DEMO_IMAGE) && \
  466. sudo tar -Jxvf $(DEMO_IMAGE)
  467. sudo umount tmp-mnt
  468. -include $(initramfs).d