Makefile 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. ISA ?= rv64imafdc
  2. ABI ?= lp64d
  3. TARGET_BOARD := U74
  4. BOARD_FLAGS :=
  5. HWBOARD ?= visionfive
  6. srcdir := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
  7. srcdir := $(srcdir:/=)
  8. confdir := $(srcdir)/conf
  9. wrkdir := $(CURDIR)/work
  10. buildroot_srcdir := $(srcdir)/buildroot
  11. buildroot_initramfs_wrkdir := $(wrkdir)/buildroot_initramfs
  12. # TODO: make RISCV be able to be set to alternate toolchain path
  13. RISCV ?= $(buildroot_initramfs_wrkdir)/host
  14. RVPATH ?= $(RISCV)/bin:/usr/sbin:/sbin:$(PATH)
  15. target ?= riscv64-buildroot-linux-gnu
  16. CROSS_COMPILE ?= $(RISCV)/bin/$(target)-
  17. buildroot_initramfs_tar := $(buildroot_initramfs_wrkdir)/images/rootfs.tar
  18. buildroot_initramfs_config := $(confdir)/buildroot_initramfs_config
  19. buildroot_initramfs_sysroot_stamp := $(wrkdir)/.buildroot_initramfs_sysroot
  20. buildroot_initramfs_sysroot := $(wrkdir)/buildroot_initramfs_sysroot
  21. buildroot_rootfs_wrkdir := $(wrkdir)/buildroot_rootfs
  22. buildroot_rootfs_ext := $(buildroot_rootfs_wrkdir)/images/rootfs.ext4
  23. buildroot_rootfs_config := $(confdir)/buildroot_rootfs_config
  24. linux_srcdir := $(srcdir)/linux
  25. linux_wrkdir := $(wrkdir)/linux
  26. linux_defconfig := $(confdir)/visionfive_defconfig
  27. vmlinux := $(linux_wrkdir)/vmlinux
  28. vmlinux_stripped := $(linux_wrkdir)/vmlinux-stripped
  29. vmlinux_bin := $(wrkdir)/vmlinux.bin
  30. module_install_path:=$(wrkdir)/module_install_path
  31. ifeq ($(TARGET_BOARD),U74)
  32. export TARGET_BOARD
  33. BOARD_FLAGS += -DTARGET_BOARD_U74
  34. bbl_link_addr :=0x80700000
  35. its_file=$(confdir)/$(HWBOARD)-uboot-fit-image.its
  36. else
  37. bbl_link_addr :=0x80000000
  38. its_file=$(confdir)/nvdla-uboot-fit-image.its
  39. endif
  40. flash_image := $(wrkdir)/hifive-unleashed-a00-YYYY-MM-DD.gpt
  41. vfat_image := $(wrkdir)/hifive-unleashed-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/starfive/vic7100/firmware/fw_payload.bin
  47. sbi_bin := $(wrkdir)/opensbi/platform/generic/firmware/fw_payload.bin
  48. fit := $(wrkdir)/image.fit
  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)/HiFive_U-Boot
  59. uboot_wrkdir := $(wrkdir)/HiFive_U-Boot
  60. uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb
  61. uboot := $(uboot_wrkdir)/u-boot.bin
  62. uboot_config := HiFive-U540_regression_defconfig
  63. ifeq ($(TARGET_BOARD),U74)
  64. ifeq ($(HWBOARD), starlight)
  65. uboot_config := starfive_jh7100_starlight_smode_defconfig
  66. uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb
  67. else ifeq ($(HWBOARD), starlight-a1)
  68. uboot_config := starfive_jh7100_starlight_smode_defconfig
  69. uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight-a1.dtb
  70. else ifeq ($(HWBOARD), visionfive)
  71. uboot_config := starfive_jh7100_visionfive_smode_defconfig
  72. uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-visionfive.dtb
  73. endif
  74. else
  75. uboot_config := HiFive-U540_nvdla_iofpga_defconfig
  76. endif
  77. uboot_defconfig := $(uboot_srcdir)/configs/$(uboot_config)
  78. rootfs := $(wrkdir)/rootfs.bin
  79. target_gcc ?= $(CROSS_COMPILE)gcc
  80. .PHONY: all nvdla-demo check_arg
  81. nvdla-demo: check_arg $(fit) $(vfat_image)
  82. @echo "To completely erase, reformat, and program a disk sdX, run:"
  83. @echo " make DISK=/dev/sdX format-nvdla-disk"
  84. @echo " ... you will need gdisk and e2fsprogs installed"
  85. @echo " Please note this will not currently format the SDcard ext4 partition"
  86. @echo " This can be done manually if needed"
  87. @echo
  88. all: check_arg $(fit) $(flash_image)
  89. @echo
  90. @echo "This image has been generated for an ISA of $(ISA) and an ABI of $(ABI)"
  91. @echo "Find the image in work/image.fit, which should be copied to an MSDOS boot partition 1"
  92. @echo
  93. @echo "To completely erase, reformat, and program a disk sdX, run:"
  94. @echo " make DISK=/dev/sdX format-boot-loader"
  95. @echo " ... you will need gdisk and e2fsprogs installed"
  96. @echo " Please note this will not currently format the SDcard ext4 partition"
  97. @echo " This can be done manually if needed"
  98. @echo
  99. check_arg:
  100. ifeq ( , $(filter $(HWBOARD), starlight starlight-a1 visionfive))
  101. $(error board $(HWBOARD) is not supported, BOARD=[starlight | starlight-a1 | visionfive(deflault)])
  102. endif
  103. # TODO: depracated for now
  104. #ifneq ($(RISCV),$(buildroot_initramfs_wrkdir)/host)
  105. #$(target_gcc):
  106. # $(error The RISCV environment variable was set, but is not pointing at a toolchain install tree)
  107. #else
  108. #$(target_gcc): $(buildroot_initramfs_tar)
  109. #endif
  110. .PHONY: visionfive starlight starlight-a1
  111. visionfive: HWBOARD := visionfive
  112. visionfive: uboot_config := starfive_jh7100_visionfive_smode_defconfig
  113. visionfive: uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-visionfive.dtb
  114. visionfive: nvdla-demo
  115. starlight: HWBOARD := starlight
  116. starlight: uboot_config = starfive_jh7100_starlight_smode_defconfig
  117. starlight: uboot_dtb_file = $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb
  118. starlight: nvdla-demo
  119. starlight-a1: HWBOARD := starlight-a1
  120. starlight-a1: uboot_config = starfive_jh7100_starlight_smode_defconfig
  121. starlight-a1: uboot_dtb_file = $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight-a1.dtb
  122. starlight-a1: nvdla-demo
  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 conf/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)
  144. $(MAKE) -C $< RISCV=$(RISCV) PATH=$(RVPATH) O=$(buildroot_rootfs_wrkdir)
  145. cp -r $(module_install_path)/lib/modules $(buildroot_rootfs_wrkdir)/target/lib/
  146. .PHONY: buildroot_rootfs
  147. buildroot_rootfs: $(buildroot_rootfs_ext)
  148. cp $< $@
  149. .PHONY: buildroot_rootfs-menuconfig
  150. buildroot_rootfs-menuconfig: $(buildroot_rootfs_wrkdir)/.config $(buildroot_srcdir)
  151. $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) menuconfig
  152. $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) savedefconfig
  153. cp $(dir $<)defconfig conf/buildroot_rootfs_config
  154. $(buildroot_initramfs_sysroot_stamp): $(buildroot_initramfs_tar)
  155. -rm -rf $(buildroot_initramfs_sysroot)
  156. mkdir -p $(buildroot_initramfs_sysroot)
  157. tar -xpf $< -C $(buildroot_initramfs_sysroot) --exclude ./dev --exclude ./usr/share/locale
  158. touch $@
  159. $(linux_wrkdir)/.config: $(linux_defconfig) $(linux_srcdir)
  160. mkdir -p $(dir $@)
  161. cp -p $< $@
  162. $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig
  163. ifeq (,$(filter rv%c,$(ISA)))
  164. sed 's/^.*CONFIG_RISCV_ISA_C.*$$/CONFIG_RISCV_ISA_C=n/' -i $@
  165. $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig
  166. endif
  167. ifeq ($(ISA),$(filter rv32%,$(ISA)))
  168. sed 's/^.*CONFIG_ARCH_RV32I.*$$/CONFIG_ARCH_RV32I=y/' -i $@
  169. sed 's/^.*CONFIG_ARCH_RV64I.*$$/CONFIG_ARCH_RV64I=n/' -i $@
  170. $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig
  171. endif
  172. $(uboot_wrkdir)/.config: $(uboot_defconfig)
  173. mkdir -p $(dir $@)
  174. cp -p $< $@
  175. $(vmlinux): $(linux_srcdir) $(linux_wrkdir)/.config $(target_gcc) $(buildroot_initramfs_sysroot)
  176. $(MAKE) -C $< O=$(linux_wrkdir) \
  177. ARCH=riscv \
  178. CROSS_COMPILE=$(CROSS_COMPILE) \
  179. PATH=$(RVPATH) \
  180. vmlinux \
  181. all \
  182. modules
  183. $(MAKE) -C $< O=$(linux_wrkdir) \
  184. ARCH=riscv \
  185. CROSS_COMPILE=$(CROSS_COMPILE) \
  186. PATH=$(RVPATH) \
  187. INSTALL_MOD_PATH=$(module_install_path) \
  188. modules_install
  189. # vpu building depend on the $(vmlinux), $(vmlinux) depend on $(buildroot_initramfs_sysroot)
  190. # so vpubuild should be built seperately
  191. vpubuild: $(vmlinux) wave511-build wave521-build codaj12-build omxil-build gstomx-build vpudriver-build
  192. wave511-build:
  193. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511-dirclean
  194. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511-rebuild
  195. wave521-build:
  196. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521-dirclean
  197. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521-rebuild
  198. codaj12-build:
  199. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12-dirclean
  200. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12-rebuild
  201. omxil-build:
  202. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-omx-il-dirclean
  203. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-omx-il-rebuild
  204. gstomx-build:
  205. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-gst-omx-dirclean
  206. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-gst-omx-rebuild
  207. vpudriver-build:
  208. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511driver
  209. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521driver
  210. $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12driver
  211. vpubuild_rootfs: $(vmlinux) wave511-build-rootfs wave521-build-rootfs codaj12-build-rootfs omxil-build-rootfs gstomx-build-rootfs vpudriver-build-rootfs
  212. wave511-build-rootfs:
  213. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511-dirclean
  214. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511-rebuild
  215. wave521-build-rootfs:
  216. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521-dirclean
  217. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521-rebuild
  218. codaj12-build-rootfs:
  219. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12-dirclean
  220. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12-rebuild
  221. omxil-build-rootfs:
  222. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-omx-il-dirclean
  223. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-omx-il-rebuild
  224. gstomx-build-rootfs:
  225. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-gst-omx-dirclean
  226. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-gst-omx-rebuild
  227. vpudriver-build-rootfs:
  228. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511driver
  229. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521driver
  230. $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12driver
  231. .PHONY: initrd
  232. initrd: $(initramfs)
  233. initramfs_cpio := $(wrkdir)/initramfs.cpio
  234. $(initramfs).d: $(buildroot_initramfs_sysroot) $(buildroot_initramfs_tar)
  235. touch $@
  236. $(initramfs): $(buildroot_initramfs_sysroot) $(vmlinux) $(buildroot_initramfs_tar)
  237. cp -r $(module_install_path)/lib/modules $(buildroot_initramfs_sysroot)/lib/
  238. cd $(linux_wrkdir) && \
  239. $(linux_srcdir)/usr/gen_initramfs.sh \
  240. -l $(initramfs).d \
  241. -o $(initramfs_cpio) -u $(shell id -u) -g $(shell id -g) \
  242. $(confdir)/initramfs.txt \
  243. $(buildroot_initramfs_sysroot)
  244. @(cat $(initramfs_cpio) | gzip -n -9 -f - > $@) || (rm -f $@; echo "Error: Fail to compress $(initramfs_cpio)"; exit 1)
  245. @rm -f $(initramfs_cpio)
  246. $(vmlinux_stripped): $(vmlinux)
  247. PATH=$(RVPATH) $(target)-strip -o $@ $<
  248. $(vmlinux_bin): $(vmlinux)
  249. PATH=$(RVPATH) $(target)-objcopy -O binary $< $@
  250. .PHONY: linux-menuconfig
  251. linux-menuconfig: $(linux_wrkdir)/.config
  252. $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) menuconfig
  253. $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) savedefconfig
  254. cp $(dir $<)defconfig $(linux_defconfig)
  255. sbi: $(uboot) $(vmlinux)
  256. rm -rf $(sbi_wrkdir)
  257. mkdir -p $(sbi_wrkdir)
  258. cd $(sbi_wrkdir) && O=$(sbi_wrkdir) CFLAGS="-mabi=$(ABI) -march=$(ISA)" ${MAKE} -C $(sbi_srcdir) CROSS_COMPILE=$(CROSS_COMPILE) \
  259. PLATFORM=generic FW_PAYLOAD_PATH=$(uboot) FW_FDT_PATH=$(uboot_dtb_file)
  260. $(fit): sbi $(vmlinux_bin) $(uboot) $(its_file) $(initramfs)
  261. $(uboot_wrkdir)/tools/mkimage -f $(its_file) -A riscv -O linux -T flat_dt $@
  262. @if [ -f fsz.sh ]; then ./fsz.sh $(sbi_bin); fi
  263. $(libfesvr): $(fesvr_srcdir)
  264. rm -rf $(fesvr_wrkdir)
  265. mkdir -p $(fesvr_wrkdir)
  266. mkdir -p $(dir $@)
  267. cd $(fesvr_wrkdir) && $</configure \
  268. --prefix=$(dir $(abspath $(dir $@)))
  269. $(MAKE) -C $(fesvr_wrkdir)
  270. $(MAKE) -C $(fesvr_wrkdir) install
  271. touch -c $@
  272. $(spike): $(spike_srcdir) $(libfesvr)
  273. rm -rf $(spike_wrkdir)
  274. mkdir -p $(spike_wrkdir)
  275. mkdir -p $(dir $@)
  276. cd $(spike_wrkdir) && PATH=$(RVPATH) $</configure \
  277. --prefix=$(dir $(abspath $(dir $@))) \
  278. --with-fesvr=$(dir $(abspath $(dir $(libfesvr))))
  279. $(MAKE) PATH=$(RVPATH) -C $(spike_wrkdir)
  280. $(MAKE) -C $(spike_wrkdir) install
  281. touch -c $@
  282. $(qemu): $(qemu_srcdir)
  283. rm -rf $(qemu_wrkdir)
  284. mkdir -p $(qemu_wrkdir)
  285. mkdir -p $(dir $@)
  286. which pkg-config
  287. # pkg-config from buildroot blows up qemu configure
  288. cd $(qemu_wrkdir) && $</configure \
  289. --prefix=$(dir $(abspath $(dir $@))) \
  290. --target-list=riscv64-softmmu
  291. $(MAKE) -C $(qemu_wrkdir)
  292. $(MAKE) -C $(qemu_wrkdir) install
  293. touch -c $@
  294. .PHONY: uboot-menuconfig
  295. uboot-menuconfig: $(uboot_wrkdir)/.config
  296. $(MAKE) -C $(uboot_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) menuconfig
  297. cp $(uboot_wrkdir)/.config $(uboot_defconfig)
  298. $(uboot): $(uboot_srcdir) $(target_gcc)
  299. rm -rf $(uboot_wrkdir)
  300. mkdir -p $(uboot_wrkdir)
  301. mkdir -p $(dir $@)
  302. $(MAKE) -C $(uboot_srcdir) O=$(uboot_wrkdir) CROSS_COMPILE=$(CROSS_COMPILE) $(uboot_config)
  303. $(MAKE) -C $(uboot_srcdir) O=$(uboot_wrkdir) CROSS_COMPILE=$(CROSS_COMPILE)
  304. $(rootfs): $(buildroot_rootfs_ext)
  305. cp $< $@
  306. $(buildroot_initramfs_sysroot): $(buildroot_initramfs_sysroot_stamp)
  307. .PHONY: buildroot_initramfs_sysroot vmlinux bbl fit
  308. buildroot_initramfs_sysroot: $(buildroot_initramfs_sysroot)
  309. vmlinux: $(vmlinux)
  310. fit: $(fit)
  311. .PHONY: clean
  312. clean:
  313. rm -rf work/HiFive_U-Boot
  314. rm -rf work/opensbi
  315. rm work/vmlinux.bin
  316. rm work/hifive-unleashed-vfat.part
  317. rm work/image.fit
  318. rm work/initramfs.cpio.gz
  319. rm work/linux/vmlinux
  320. ifeq ($(buildroot_rootfs_ext),$(wildcard $(buildroot_rootfs_ext)))
  321. rm work/buildroot_rootfs/images/rootfs.ext4
  322. endif
  323. ifeq ($(buildroot_initramfs_tar),$(wildcard $(buildroot_initramfs_tar)))
  324. rm work/buildroot_initramfs/images/rootfs.tar
  325. endif
  326. .PHONY: distclean
  327. distclean:
  328. rm -rf -- $(wrkdir) $(toolchain_dest)
  329. .PHONY: sim
  330. sim: $(spike) $(bbl_payload)
  331. $(spike) --isa=$(ISA) -p4 $(bbl_payload)
  332. .PHONY: qemu
  333. qemu: $(qemu) $(sbi) $(vmlinux) $(initramfs)
  334. $(qemu) -nographic -machine virt -bios $(bbl) -kernel $(vmlinux) -initrd $(initramfs) \
  335. -netdev user,id=net0 -device virtio-net-device,netdev=net0
  336. .PHONY: qemu-rootfs
  337. qemu-rootfs: $(qemu) $(bbl) $(vmlinux) $(initramfs) $(rootfs)
  338. $(qemu) -nographic -machine virt -bios $(bbl) -kernel $(vmlinux) -initrd $(initramfs) \
  339. -drive file=$(rootfs),format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
  340. -netdev user,id=net0 -device virtio-net-device,netdev=net0
  341. .PHONY: uboot
  342. uboot: $(uboot)
  343. # disk tools
  344. MKFS_VFAT ?= mkfs.vfat
  345. MKFS_EXT4 ?= mkfs.ext4
  346. PARTPROBE ?= partprobe
  347. SGDISK ?= sgdisk
  348. # Relevant partition type codes
  349. BBL = 2E54B353-1271-4842-806F-E436D6AF6985
  350. VFAT = EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
  351. LINUX = 0FC63DAF-8483-4772-8E79-3D69D8477DE4
  352. #FSBL = 5B193300-FC78-40CD-8002-E86C45580B47
  353. UBOOT = 5B193300-FC78-40CD-8002-E86C45580B47
  354. UBOOTENV = a09354ac-cd63-11e8-9aff-70b3d592f0fa
  355. UBOOTDTB = 070dd1a8-cd64-11e8-aa3d-70b3d592f0fa
  356. UBOOTFIT = 04ffcafa-cd65-11e8-b974-70b3d592f0fa
  357. flash.gpt: $(flash_image)
  358. ifeq ($(TARGET_BOARD),U74)
  359. VFAT_START=4096
  360. VFAT_END=471039
  361. VFAT_SIZE=466943
  362. UBOOT_START=471040
  363. UBOOT_END=473087
  364. UBOOT_SIZE=2047
  365. UENV_START=473088
  366. UENV_END=475135
  367. $(vfat_image): $(fit) $(confdir)/u74_uEnv.txt $(confdir)/uEnv.txt
  368. @if [ `du --apparent-size --block-size=512 $(uboot) | cut -f 1` -ge $(UBOOT_SIZE) ]; then \
  369. echo "Uboot is too large for partition!!\nReduce uboot or increase partition size"; \
  370. rm $(flash_image); exit 1; fi
  371. dd if=/dev/zero of=$(vfat_image) bs=512 count=$(VFAT_SIZE)
  372. $(MKFS_VFAT) $(vfat_image)
  373. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(fit) ::hifiveu.fit
  374. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/u74_uEnv.txt ::u74_uEnv.txt
  375. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/uEnv.txt ::uEnv.txt
  376. else
  377. VFAT_START=4096
  378. VFAT_END=269502
  379. VFAT_SIZE=263454
  380. UBOOT_START=2048
  381. UBOOT_END=4048
  382. UBOOT_SIZE=2000
  383. UENV_START=1024
  384. UENV_END=1099
  385. $(vfat_image): $(fit) $(confdir)/uEnv.txt
  386. @if [ `du --apparent-size --block-size=512 $(uboot) | cut -f 1` -ge $(UBOOT_SIZE) ]; then \
  387. echo "Uboot is too large for partition!!\nReduce uboot or increase partition size"; \
  388. rm $(flash_image); exit 1; fi
  389. dd if=/dev/zero of=$(vfat_image) bs=512 count=$(VFAT_SIZE)
  390. $(MKFS_VFAT) $(vfat_image)
  391. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(fit) ::hifiveu.fit
  392. PATH=$(RVPATH) MTOOLS_SKIP_CHECK=1 mcopy -i $(vfat_image) $(confdir)/uEnv.txt ::uEnv.txt
  393. endif
  394. $(flash_image): $(uboot) $(fit) $(vfat_image)
  395. dd if=/dev/zero of=$(flash_image) bs=1M count=32
  396. $(SGDISK) --clear -g \
  397. --new=1:$(VFAT_START):$(VFAT_END) --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  398. --new=2:$(UBOOT_START):$(UBOOT_END) --change-name=2:uboot --typecode=2:$(UBOOT) \
  399. --new=3:$(UENV_START):$(UENV_END) --change-name=3:uboot-env --typecode=3:$(UBOOTENV) \
  400. $(flash_image)
  401. dd conv=notrunc if=$(vfat_image) of=$(flash_image) bs=512 seek=$(VFAT_START)
  402. dd conv=notrunc if=$(uboot) of=$(flash_image) bs=512 seek=$(UBOOT_START) count=$(UBOOT_SIZE)
  403. DEMO_END=11718750
  404. #$(demo_image): $(uboot) $(fit) $(vfat_image) $(ext_image)
  405. # dd if=/dev/zero of=$(flash_image) bs=512 count=$(DEMO_END)
  406. # $(SGDISK) --clear -g \
  407. # --new=1:$(VFAT_START):$(VFAT_END) --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  408. # --new=3:$(UBOOT_START):$(UBOOT_END) --change-name=3:uboot --typecode=3:$(UBOOT) \
  409. # --new=2:264192:$(DEMO_END) --change-name=2:root --typecode=2:$(LINUX) \
  410. # --new=4:1024:1247 --change-name=4:uboot-env --typecode=4:$(UBOOTENV) \
  411. # $(flash_image)
  412. # dd conv=notrunc if=$(vfat_image) of=$(flash_image) bs=512 seek=$(VFAT_START)
  413. # dd conv=notrunc if=$(uboot) of=$(flash_image) bs=512 seek=$(UBOOT_START) count=$(UBOOT_SIZE)
  414. .PHONY: format-boot-loader
  415. format-boot-loader: $(bbl_bin) $(uboot) $(fit) $(vfat_image)
  416. @test -b $(DISK) || (echo "$(DISK): is not a block device"; exit 1)
  417. $(SGDISK) --clear -g \
  418. --new=1:$(VFAT_START):$(VFAT_END) --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  419. --new=2:$(UBOOT_START):$(UBOOT_END) --change-name=2:uboot --typecode=2:$(UBOOT) \
  420. --new=3:$(UENV_START):$(UENV_END) --change-name=3:uboot-env --typecode=3:$(UBOOTENV) \
  421. --new=4:274432:0 --change-name=4:root --typecode=4:$(LINUX) \
  422. $(DISK)
  423. -$(PARTPROBE)
  424. @sleep 1
  425. ifeq ($(DISK)p1,$(wildcard $(DISK)p1))
  426. @$(eval PART1 := $(DISK)p1)
  427. @$(eval PART2 := $(DISK)p2)
  428. @$(eval PART3 := $(DISK)p3)
  429. @$(eval PART4 := $(DISK)p4)
  430. else ifeq ($(DISK)s1,$(wildcard $(DISK)s1))
  431. @$(eval PART1 := $(DISK)s1)
  432. @$(eval PART2 := $(DISK)s2)
  433. @$(eval PART3 := $(DISK)s3)
  434. @$(eval PART4 := $(DISK)s4)
  435. else ifeq ($(DISK)1,$(wildcard $(DISK)1))
  436. @$(eval PART1 := $(DISK)1)
  437. @$(eval PART2 := $(DISK)2)
  438. @$(eval PART3 := $(DISK)3)
  439. @$(eval PART4 := $(DISK)4)
  440. else
  441. @echo Error: Could not find bootloader partition for $(DISK)
  442. @exit 1
  443. endif
  444. dd if=$(uboot) of=$(PART2) bs=4096
  445. dd if=$(vfat_image) of=$(PART1) bs=4096
  446. DEMO_IMAGE := sifive-debian-demo-mar7.tar.xz
  447. DEMO_URL := https://github.com/tmagik/freedom-u-sdk/releases/download/hifiveu-2.0-alpha.1/
  448. format-rootfs-image: format-boot-loader
  449. @echo "Done setting up basic initramfs boot. We will now try to install"
  450. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  451. @echo "you can safely cancel here"
  452. $(MKFS_EXT4) $(PART4)
  453. -mkdir -p tmp-mnt
  454. -mkdir -p tmp-rootfs
  455. -sudo mount $(PART4) tmp-mnt && \
  456. sudo mount -o loop $(buildroot_rootfs_ext) tmp-rootfs&& \
  457. sudo cp -fr tmp-rootfs/* tmp-mnt/
  458. sudo umount tmp-mnt
  459. sudo umount tmp-rootfs
  460. format-demo-image: format-boot-loader
  461. @echo "Done setting up basic initramfs boot. We will now try to install"
  462. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  463. @echo "you can safely cancel here"
  464. $(MKFS_EXT4) $(PART4)
  465. -mkdir tmp-mnt
  466. -sudo mount $(PART4) tmp-mnt && cd tmp-mnt && \
  467. sudo wget $(DEMO_URL)$(DEMO_IMAGE) && \
  468. sudo tar -xvpf $(DEMO_IMAGE)
  469. sudo umount tmp-mnt
  470. # default size: 16GB
  471. DISK_IMAGE_SIZE ?= 16
  472. ROOT_BEGIN=475136
  473. ROOT_CLUSTER_NUM=$(shell echo $$(($(DISK_IMAGE_SIZE)*1024*1024*1024/512)))
  474. ROOT_END=$(shell echo $$(($(ROOT_BEGIN)+$(ROOT_CLUSTER_NUM))))
  475. format-nvdla-disk: $(bbl_bin) $(uboot) $(fit) $(vfat_image)
  476. @test -b $(DISK) || (echo "$(DISK): is not a block device"; exit 1)
  477. sudo $(SGDISK) --clear -g \
  478. --new=1:$(VFAT_START):$(VFAT_END) --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  479. --new=2:$(UBOOT_START):$(UBOOT_END) --change-name=2:uboot --typecode=2:$(UBOOT) \
  480. --new=3:$(ROOT_BEGIN):0 --change-name=3:root --typecode=3:$(LINUX) \
  481. $(DISK)
  482. -$(PARTPROBE)
  483. @sleep 3
  484. ifeq ($(DISK)p1,$(wildcard $(DISK)p1))
  485. @$(eval PART1 := $(DISK)p1)
  486. @$(eval PART2 := $(DISK)p2)
  487. @$(eval PART3 := $(DISK)p3)
  488. else ifeq ($(DISK)s1,$(wildcard $(DISK)s1))
  489. @$(eval PART1 := $(DISK)s1)
  490. @$(eval PART2 := $(DISK)s2)
  491. @$(eval PART3 := $(DISK)s3)
  492. else ifeq ($(DISK)1,$(wildcard $(DISK)1))
  493. @$(eval PART1 := $(DISK)1)
  494. @$(eval PART2 := $(DISK)2)
  495. @$(eval PART3 := $(DISK)3)
  496. else
  497. @echo Error: Could not find bootloader partition for $(DISK)
  498. @exit 1
  499. endif
  500. sudo dd if=$(uboot) of=$(PART2) bs=4096
  501. sudo dd if=$(vfat_image) of=$(PART1) bs=4096
  502. #usb config
  503. format-usb-disk: sbi $(uboot) $(fit) $(vfat_image)
  504. @test -b $(DISK) || (echo "$(DISK): is not a block device"; exit 1)
  505. sudo $(SGDISK) --clear -g \
  506. --new=1:0:+256M --change-name=1:"Vfat Boot" --typecode=1:$(VFAT) \
  507. --new=2:0:+1G --change-name=2:uboot --typecode=2:$(UBOOT) -g\
  508. $(DISK)
  509. -$(PARTPROBE)
  510. @sleep 3
  511. ifeq ($(DISK)p1,$(wildcard $(DISK)p1))
  512. @$(eval PART1 := $(DISK)p1)
  513. @$(eval PART2 := $(DISK)p2)
  514. # @$(eval PART3 := $(DISK)p3)
  515. else ifeq ($(DISK)s1,$(wildcard $(DISK)s1))
  516. @$(eval PART1 := $(DISK)s1)
  517. @$(eval PART2 := $(DISK)s2)
  518. # @$(eval PART3 := $(DISK)s3)
  519. else ifeq ($(DISK)1,$(wildcard $(DISK)1))
  520. @$(eval PART1 := $(DISK)1)
  521. @$(eval PART2 := $(DISK)2)
  522. # @$(eval PART3 := $(DISK)3)
  523. else
  524. @echo Error: Could not find bootloader partition for $(DISK)
  525. @exit 1
  526. endif
  527. sudo dd if=$(uboot) of=$(PART2) bs=4096
  528. sudo dd if=$(vfat_image) of=$(PART1) bs=4096
  529. DEB_IMAGE := debian_nvdla_20190506.tar.xz
  530. DEB_URL := https://github.com/sifive/freedom-u-sdk/releases/download/nvdla-demo-0.1
  531. format-nvdla-rootfs: format-nvdla-disk
  532. @echo "Done setting up basic initramfs boot. We will now try to install"
  533. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  534. @echo "you can safely cancel here"
  535. sudo $(MKFS_EXT4) -F $(PART3)
  536. -mkdir -p tmp-mnt
  537. -mkdir -p tmp-rootfs
  538. -sudo mount $(PART3) tmp-mnt && \
  539. sudo mount -o loop $(buildroot_rootfs_ext) tmp-rootfs&& \
  540. sudo cp -fr tmp-rootfs/* tmp-mnt/
  541. sudo umount tmp-mnt
  542. sudo umount tmp-rootfs
  543. format-nvdla-root: format-nvdla-disk
  544. @echo "Done setting up basic initramfs boot. We will now try to install"
  545. @echo "a Debian snapshot to the Linux partition, which requires sudo"
  546. @echo "you can safely cancel here"
  547. @test -e $(wrkdir)/$(DEB_IMAGE) || (wget -P $(wrkdir) $(DEB_URL)/$(DEB_IMAGE))
  548. sudo $(MKFS_EXT4) $(PART3)
  549. -mkdir -p tmp-mnt
  550. -sudo mount $(PART3) tmp-mnt && \
  551. echo "please wait until checkpoint reaches 489k" && \
  552. sudo tar xpf $(wrkdir)/$(DEB_IMAGE) -C tmp-mnt --checkpoint=1000
  553. sudo umount tmp-mnt
  554. -include $(initramfs).d