ISA ?= rv64imafdc ABI ?= lp64d TARGET_BOARD := U74 BOARD_FLAGS := HWBOARD ?= visionfive srcdir := $(dir $(realpath $(lastword $(MAKEFILE_LIST)))) srcdir := $(srcdir:/=) confdir := $(srcdir)/conf wrkdir := $(CURDIR)/work buildroot_srcdir := $(srcdir)/buildroot buildroot_initramfs_wrkdir := $(wrkdir)/buildroot_initramfs # TODO: make RISCV be able to be set to alternate toolchain path RISCV ?= $(buildroot_initramfs_wrkdir)/host RVPATH ?= $(RISCV)/bin:/usr/sbin:/sbin:$(PATH) target ?= riscv64-buildroot-linux-gnu CROSS_COMPILE ?= $(RISCV)/bin/$(target)- buildroot_initramfs_tar := $(buildroot_initramfs_wrkdir)/images/rootfs.tar buildroot_initramfs_config := $(confdir)/buildroot_initramfs_config buildroot_initramfs_sysroot_stamp := $(wrkdir)/.buildroot_initramfs_sysroot buildroot_initramfs_sysroot := $(wrkdir)/buildroot_initramfs_sysroot buildroot_rootfs_wrkdir := $(wrkdir)/buildroot_rootfs buildroot_rootfs_ext := $(buildroot_rootfs_wrkdir)/images/rootfs.ext4 buildroot_rootfs_config := $(confdir)/buildroot_rootfs_config linux_srcdir := $(srcdir)/linux linux_wrkdir := $(wrkdir)/linux linux_defconfig := $(confdir)/visionfive_defconfig vmlinux := $(linux_wrkdir)/vmlinux vmlinux_stripped := $(linux_wrkdir)/vmlinux-stripped vmlinux_bin := $(wrkdir)/vmlinux.bin module_install_path:=$(wrkdir)/module_install_path ifeq ($(TARGET_BOARD),U74) export TARGET_BOARD BOARD_FLAGS += -DTARGET_BOARD_U74 bbl_link_addr :=0x80700000 its_file=$(confdir)/$(HWBOARD)-uboot-fit-image.its else bbl_link_addr :=0x80000000 its_file=$(confdir)/nvdla-uboot-fit-image.its endif flash_image := $(wrkdir)/hifive-unleashed-a00-YYYY-MM-DD.gpt vfat_image := $(wrkdir)/hifive-unleashed-vfat.part #ext_image := $(wrkdir) # TODO initramfs := $(wrkdir)/initramfs.cpio.gz sbi_srcdir := $(srcdir)/opensbi sbi_wrkdir := $(wrkdir)/opensbi #sbi_bin := $(wrkdir)/opensbi/platform/starfive/vic7100/firmware/fw_payload.bin sbi_bin := $(wrkdir)/opensbi/platform/generic/firmware/fw_payload.bin fit := $(wrkdir)/image.fit fesvr_srcdir := $(srcdir)/riscv-fesvr fesvr_wrkdir := $(wrkdir)/riscv-fesvr libfesvr := $(fesvr_wrkdir)/prefix/lib/libfesvr.so spike_srcdir := $(srcdir)/riscv-isa-sim spike_wrkdir := $(wrkdir)/riscv-isa-sim spike := $(spike_wrkdir)/prefix/bin/spike qemu_srcdir := $(srcdir)/riscv-qemu qemu_wrkdir := $(wrkdir)/riscv-qemu qemu := $(qemu_wrkdir)/prefix/bin/qemu-system-riscv64 uboot_srcdir := $(srcdir)/HiFive_U-Boot uboot_wrkdir := $(wrkdir)/HiFive_U-Boot uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb uboot := $(uboot_wrkdir)/u-boot.bin uboot_config := HiFive-U540_regression_defconfig ifeq ($(TARGET_BOARD),U74) ifeq ($(HWBOARD), starlight) uboot_config := starfive_jh7100_starlight_smode_defconfig uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb else ifeq ($(HWBOARD), starlight-a1) uboot_config := starfive_jh7100_starlight_smode_defconfig uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight-a1.dtb else ifeq ($(HWBOARD), visionfive) uboot_config := starfive_jh7100_visionfive_smode_defconfig uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-visionfive.dtb endif else uboot_config := HiFive-U540_nvdla_iofpga_defconfig endif uboot_defconfig := $(uboot_srcdir)/configs/$(uboot_config) rootfs := $(wrkdir)/rootfs.bin target_gcc ?= $(CROSS_COMPILE)gcc .PHONY: all nvdla-demo check_arg nvdla-demo: check_arg $(fit) $(vfat_image) @echo "To completely erase, reformat, and program a disk sdX, run:" @echo " make DISK=/dev/sdX format-nvdla-disk" @echo " ... you will need gdisk and e2fsprogs installed" @echo " Please note this will not currently format the SDcard ext4 partition" @echo " This can be done manually if needed" @echo all: check_arg $(fit) $(flash_image) @echo @echo "This image has been generated for an ISA of $(ISA) and an ABI of $(ABI)" @echo "Find the image in work/image.fit, which should be copied to an MSDOS boot partition 1" @echo @echo "To completely erase, reformat, and program a disk sdX, run:" @echo " make DISK=/dev/sdX format-boot-loader" @echo " ... you will need gdisk and e2fsprogs installed" @echo " Please note this will not currently format the SDcard ext4 partition" @echo " This can be done manually if needed" @echo check_arg: ifeq ( , $(filter $(HWBOARD), starlight starlight-a1 visionfive)) $(error board $(HWBOARD) is not supported, BOARD=[starlight | starlight-a1 | visionfive(deflault)]) endif # TODO: depracated for now #ifneq ($(RISCV),$(buildroot_initramfs_wrkdir)/host) #$(target_gcc): # $(error The RISCV environment variable was set, but is not pointing at a toolchain install tree) #else #$(target_gcc): $(buildroot_initramfs_tar) #endif .PHONY: visionfive starlight starlight-a1 visionfive: HWBOARD := visionfive visionfive: uboot_config := starfive_jh7100_visionfive_smode_defconfig visionfive: uboot_dtb_file := $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-visionfive.dtb visionfive: nvdla-demo starlight: HWBOARD := starlight starlight: uboot_config = starfive_jh7100_starlight_smode_defconfig starlight: uboot_dtb_file = $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight.dtb starlight: nvdla-demo starlight-a1: HWBOARD := starlight-a1 starlight-a1: uboot_config = starfive_jh7100_starlight_smode_defconfig starlight-a1: uboot_dtb_file = $(wrkdir)/HiFive_U-Boot/arch/riscv/dts/jh7100-beaglev-starlight-a1.dtb starlight-a1: nvdla-demo $(buildroot_initramfs_wrkdir)/.config: $(buildroot_srcdir) rm -rf $(dir $@) mkdir -p $(dir $@) cp $(buildroot_initramfs_config) $@ $(MAKE) -C $< RISCV=$(RISCV) O=$(buildroot_initramfs_wrkdir) olddefconfig # buildroot_initramfs provides gcc $(buildroot_initramfs_tar): $(buildroot_srcdir) $(buildroot_initramfs_wrkdir)/.config $(buildroot_initramfs_config) $(MAKE) -C $< RISCV=$(RISCV) O=$(buildroot_initramfs_wrkdir) .PHONY: buildroot_initramfs-menuconfig buildroot_initramfs-menuconfig: $(buildroot_initramfs_wrkdir)/.config $(buildroot_srcdir) $(MAKE) -C $(dir $<) O=$(buildroot_initramfs_wrkdir) menuconfig $(MAKE) -C $(dir $<) O=$(buildroot_initramfs_wrkdir) savedefconfig cp $(dir $<)defconfig conf/buildroot_initramfs_config # use buildroot_initramfs toolchain # TODO: fix path and conf/buildroot_rootfs_config $(buildroot_rootfs_wrkdir)/.config: $(buildroot_srcdir) $(buildroot_initramfs_tar) # rm -rf $(dir $@) mkdir -p $(dir $@) cp $(buildroot_rootfs_config) $@ $(MAKE) -C $< RISCV=$(RISCV) PATH=$(RVPATH) O=$(buildroot_rootfs_wrkdir) olddefconfig $(buildroot_rootfs_ext): $(buildroot_srcdir) $(buildroot_rootfs_wrkdir)/.config $(target_gcc) $(buildroot_rootfs_config) $(MAKE) -C $< RISCV=$(RISCV) PATH=$(RVPATH) O=$(buildroot_rootfs_wrkdir) cp -r $(module_install_path)/lib/modules $(buildroot_rootfs_wrkdir)/target/lib/ .PHONY: buildroot_rootfs buildroot_rootfs: $(buildroot_rootfs_ext) cp $< $@ .PHONY: buildroot_rootfs-menuconfig buildroot_rootfs-menuconfig: $(buildroot_rootfs_wrkdir)/.config $(buildroot_srcdir) $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) menuconfig $(MAKE) -C $(dir $<) O=$(buildroot_rootfs_wrkdir) savedefconfig cp $(dir $<)defconfig conf/buildroot_rootfs_config $(buildroot_initramfs_sysroot_stamp): $(buildroot_initramfs_tar) -rm -rf $(buildroot_initramfs_sysroot) mkdir -p $(buildroot_initramfs_sysroot) tar -xpf $< -C $(buildroot_initramfs_sysroot) --exclude ./dev --exclude ./usr/share/locale touch $@ $(linux_wrkdir)/.config: $(linux_defconfig) $(linux_srcdir) mkdir -p $(dir $@) cp -p $< $@ $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig ifeq (,$(filter rv%c,$(ISA))) sed 's/^.*CONFIG_RISCV_ISA_C.*$$/CONFIG_RISCV_ISA_C=n/' -i $@ $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig endif ifeq ($(ISA),$(filter rv32%,$(ISA))) sed 's/^.*CONFIG_ARCH_RV32I.*$$/CONFIG_ARCH_RV32I=y/' -i $@ sed 's/^.*CONFIG_ARCH_RV64I.*$$/CONFIG_ARCH_RV64I=n/' -i $@ $(MAKE) -C $(linux_srcdir) O=$(linux_wrkdir) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) olddefconfig endif $(uboot_wrkdir)/.config: $(uboot_defconfig) mkdir -p $(dir $@) cp -p $< $@ $(vmlinux): $(linux_srcdir) $(linux_wrkdir)/.config $(target_gcc) $(buildroot_initramfs_sysroot) $(MAKE) -C $< O=$(linux_wrkdir) \ ARCH=riscv \ CROSS_COMPILE=$(CROSS_COMPILE) \ PATH=$(RVPATH) \ vmlinux \ all \ modules $(MAKE) -C $< O=$(linux_wrkdir) \ ARCH=riscv \ CROSS_COMPILE=$(CROSS_COMPILE) \ PATH=$(RVPATH) \ INSTALL_MOD_PATH=$(module_install_path) \ modules_install # vpu building depend on the $(vmlinux), $(vmlinux) depend on $(buildroot_initramfs_sysroot) # so vpubuild should be built seperately vpubuild: $(vmlinux) wave511-build wave521-build codaj12-build omxil-build gstomx-build vpudriver-build wave511-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511-dirclean $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511-rebuild wave521-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521-dirclean $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521-rebuild codaj12-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12-dirclean $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12-rebuild omxil-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-omx-il-dirclean $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-omx-il-rebuild gstomx-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-gst-omx-dirclean $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) sf-gst-omx-rebuild vpudriver-build: $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave511driver $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) wave521driver $(MAKE) -C $(buildroot_initramfs_wrkdir) O=$(buildroot_initramfs_wrkdir) codaj12driver vpubuild_rootfs: $(vmlinux) wave511-build-rootfs wave521-build-rootfs codaj12-build-rootfs omxil-build-rootfs gstomx-build-rootfs vpudriver-build-rootfs wave511-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511-dirclean $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511-rebuild wave521-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521-dirclean $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521-rebuild codaj12-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12-dirclean $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12-rebuild omxil-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-omx-il-dirclean $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-omx-il-rebuild gstomx-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-gst-omx-dirclean $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) sf-gst-omx-rebuild vpudriver-build-rootfs: $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave511driver $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) wave521driver $(MAKE) -C $(buildroot_rootfs_wrkdir) O=$(buildroot_rootfs_wrkdir) codaj12driver .PHONY: initrd initrd: $(initramfs) initramfs_cpio := $(wrkdir)/initramfs.cpio $(initramfs).d: $(buildroot_initramfs_sysroot) $(buildroot_initramfs_tar) touch $@ $(initramfs): $(buildroot_initramfs_sysroot) $(vmlinux) $(buildroot_initramfs_tar) cp -r $(module_install_path)/lib/modules $(buildroot_initramfs_sysroot)/lib/ cd $(linux_wrkdir) && \ $(linux_srcdir)/usr/gen_initramfs.sh \ -l $(initramfs).d \ -o $(initramfs_cpio) -u $(shell id -u) -g $(shell id -g) \ $(confdir)/initramfs.txt \ $(buildroot_initramfs_sysroot) @(cat $(initramfs_cpio) | gzip -n -9 -f - > $@) || (rm -f $@; echo "Error: Fail to compress $(initramfs_cpio)"; exit 1) @rm -f $(initramfs_cpio) $(vmlinux_stripped): $(vmlinux) PATH=$(RVPATH) $(target)-strip -o $@ $< $(vmlinux_bin): $(vmlinux) PATH=$(RVPATH) $(target)-objcopy -O binary $< $@ .PHONY: linux-menuconfig linux-menuconfig: $(linux_wrkdir)/.config $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) menuconfig $(MAKE) -C $(linux_srcdir) O=$(dir $<) ARCH=riscv CROSS_COMPILE=$(CROSS_COMPILE) savedefconfig cp $(dir $<)defconfig $(linux_defconfig) sbi: $(uboot) $(vmlinux) rm -rf $(sbi_wrkdir) mkdir -p $(sbi_wrkdir) cd $(sbi_wrkdir) && O=$(sbi_wrkdir) CFLAGS="-mabi=$(ABI) -march=$(ISA)" ${MAKE} -C $(sbi_srcdir) CROSS_COMPILE=$(CROSS_COMPILE) \ PLATFORM=generic FW_PAYLOAD_PATH=$(uboot) FW_FDT_PATH=$(uboot_dtb_file) $(fit): sbi $(vmlinux_bin) $(uboot) $(its_file) $(initramfs) $(uboot_wrkdir)/tools/mkimage -f $(its_file) -A riscv -O linux -T flat_dt $@ @if [ -f fsz.sh ]; then ./fsz.sh $(sbi_bin); fi $(libfesvr): $(fesvr_srcdir) rm -rf $(fesvr_wrkdir) mkdir -p $(fesvr_wrkdir) mkdir -p $(dir $@) cd $(fesvr_wrkdir) && $