##########################################################################################
#	prepare param
##########################################################################################
export OSDRV_DIR=$(shell pwd)

ifeq ($(OSDRV_DIR)/../open_source/, $(wildcard $(OSDRV_DIR)/../open_source/))
OPEN_SOURCE=$(OSDRV_DIR)/../open_source/
else ifeq ($(OSDRV_DIR)/../../open_source/, $(wildcard $(OSDRV_DIR)/../../open_source/))
OPEN_SOURCE=$(OSDRV_DIR)/../../open_source/
else
$(warning "---------------------------------------------------------------------")
$(warning "   Cannot found the open_source Contents!!       ")
$(warning "---------------------------------------------------------------------")
$(error )
endif

export CHIP?=ss524v100
export ARCH=arm
ARCH_TYPE = $(ARCH)
export OSDRV_CROSS?=arm-mix410-linux
export CROSS_COMPILE=$(OSDRV_CROSS)-
export OSDRV_CROSS_CFLAGS
export BUILD :=all
export BUILD_J
BOOT_MEDIA?=spi

ifneq ($(BOOT_MEDIA),spi)
ifneq ($(BOOT_MEDIA),emmc)
$(error you must set valid BOOT_MEDIA:spi or emmc!)
endif
endif

ifeq ($(BUILD_J), )
BUILD_J:=20
endif

ifneq ($(CHIP),ss524v100)
ifneq ($(CHIP),ss522v100)
ifneq ($(CHIP),ss615v100)
$(error you must set valid CHIP:ss524v100 or ss522v100 or ss615v100 !)
endif
endif
endif

ifeq ($(CHIP), ss524v100)
TARGET_XLSM ?= SS524V100-DMEB_4L_FLYBY-DDR4_2664M_2GB_16bitx2.xlsm
endif

ifeq ($(CHIP), ss522v100)
TARGET_XLSM ?= SS522V100-DMEB_2L-DDR4_2664M_1GB_16bit.xlsm
endif

ifeq ($(CHIP), ss615v100)
TARGET_XLSM ?= SS615V100-DMEB_4L_FLYBY-DDR4_2664M_2GB_16bitx2.xlsm
endif

ifeq ($(OSDRV_CROSS),arm-mix410-linux)
LIB_TYPE:=glibc
BUSYBOX_CFG:=config_v400_a7_softfp_neon
TOOLCHAIN_DIR:=arm-mix410-linux
TOOLCHAINI_VERSION:=
RUNTIME_LIB:=runtime_glibc
CROSS_SPECIFIED:=y
else
$(error This chip do not supprot $(OSDRV_CROSS) toolchain !)
endif

BUSYBOX_VER:=busybox-1.31.1
BUSYBOX_DIR := $(OPEN_SOURCE)/busybox
TOOLCHAIN_RUNTIME_LIB_C:=lib.tgz

TOOLCHAIN_RUNTIME_LIB:=a7_softfp_neon-vfpv4
OSDRV_CROSS_CFLAGS:=-mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -w

UBOOT_VER:=u-boot-2020.01
UBOOT_DIR:=$(OPEN_SOURCE)/u-boot
UBOOT_TAR:=$(UBOOT_VER).tar.bz2

UBOOT:=u-boot-$(CHIP).bin
UBOOT_REG_BIN:=$(CHIP)_reg_info.bin
ifeq ($(BOOT_MEDIA),emmc)
export UBOOT_CONFIG:=$(CHIP)_$(BOOT_MEDIA)_config
else
export UBOOT_CONFIG:=$(CHIP)_config
endif

SECURE_BOOT:=secureboot_release
SECURE_BOOT_TAR:=$(SECURE_BOOT).tgz

KERNEL_VER:=linux-4.19.y
KERNEL_DIR:=$(OPEN_SOURCE)/linux
KERNEL_TAR:=$(KERNEL_VER).tgz

UIMAGE:=uImage_$(CHIP)
ifeq ($(BOOT_MEDIA),emmc)
export KERNEL_CFG:=$(CHIP)_$(BOOT_MEDIA)_defconfig
else
export KERNEL_CFG:=$(CHIP)_defconfig
endif

ifeq ($(BOOT_MEDIA), emmc)
EMMC_FLAG = emmc_
endif
export PUB_IMAGE:=$(CHIP)_$(EMMC_FLAG)image_$(LIB_TYPE)

EXT4_TOOL:=make_ext4fs
EXT4_IMAGE_BIN:=rootfs_$(CHIP)_96M.ext4
export PUB_BOARD:=board_$(LIB_TYPE)
export PUB_ROOTFS:=rootfs_$(LIB_TYPE)

JFFS2_IMAGE_BIN_64K:=rootfs_$(CHIP)_64k.jffs2
JFFS2_IMAGE_BIN_128K:=rootfs_$(CHIP)_128k.jffs2
JFFS2_IMAGE_BIN_256K:=rootfs_$(CHIP)_256k.jffs2

CRAMFS_VER:= util-linux-2.35.1
CRAMFS_DIR:=$(OPEN_SOURCE)/util-linux
CRAMFS_TAR:=$(CRAMFS_VER).tar.gz

XZ_DIR:= $(OPEN_SOURCE)/xz

LZMA_DIR:=$(OPEN_SOURCE)/lzma

EUDEV_VER:= eudev-3.2.9
EUDEV_DIR:=$(OPEN_SOURCE)/eudev
EUDEV_TAR:=$(EUDEV_VER).tar.gz

MTD_DIR:=$(OPEN_SOURCE)/mtd-utils/
MTD_VER:= mtd-utils-2.1.1
MTD_TAR:=$(MTD_VER).tar.bz2

ZLIB_VER:= zlib-1.2.11
ZLIB_DIR:= $(OPEN_SOURCE)/zlib
ZLIB_TAR:=$(ZLIB_VER).tar.gz

SQUASHFS_VER:= squashfs4.4
SQUASHFS_DIR:=$(OPEN_SOURCE)/squashfs
SQUASHFS_TAR:=$(SQUASHFS_VER).tar.gz

EMMC_ROOTFS_SIZE ?= 96
E2FSPROGS_DIR:=$(OPEN_SOURCE)/e2fsprogs/
EXT4_TOOL:=mkfs.ext4
EXT4_IMAGE_BIN:=rootfs_$(CHIP)_$(EMMC_ROOTFS_SIZE)M.ext4
COUNT_SIZE := $(shell echo $$(( $(EMMC_ROOTFS_SIZE) * 1024 * 2 )))

REGBING_PACKAGE_VER:=regbin-v1.0.2

TOOLCHAIN_FILE:= $(shell which $(OSDRV_CROSS)-gcc )
TOOLCHAIN_DIR:=$(shell dirname $(shell dirname $(TOOLCHAIN_FILE)))
#ifneq ($(OSDRV_CROSS),arm-mix410-linux)
#RUNTIMELIB_DIR=$(shell dirname $(TOOLCHAIN_DIR))/$(RUNTIME_LIB)
#else
RUNTIMELIB_DIR=$(shell dirname $(TOOLCHAIN_DIR))/$(OSDRV_CROSS)/$(RUNTIME_LIB)
#endif
##########################################################################################
#	set task
##########################################################################################
ifeq ($(CROSS_SPECIFIED),y)
all: secureboot kernel rootfs_build
notools: boot kernel notools_prepare rootfs_notools_build

clean: boot_clean secureboot_clean kernel_clean \
       busybox_clean pctools_clean boardtools_clean rootfs_clean secure_libs_clean

distclean:clean pub_clean
endif

a:=$(shell $(OSDRV_CROSS)-gcc --version)
b:=$(findstring $(TOOLCHAINI_VERSION),$(a))
c:= $(word 2, $(a))
##########################################################################################
#task [0]	prepare
##########################################################################################
prepare:
	mkdir $(OSDRV_DIR)/pub/$(PUB_IMAGE) -p
	mkdir $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -p
	mkdir $(OSDRV_DIR)/pub/bin/pc -p

##########################################################################################
#	prepare regbin tools
##########################################################################################
check_regbin:
REGBING_PACKAGE = $(shell find $(OSDRV_DIR)/tools/pc/uboot_tools/ \
					-name "$(REGBING_PACKAGE_VER).tgz")
#$(warning $(REGBING_PACKAGE))

ifeq ($(REGBING_PACKAGE), )
$(warning "---------------------------------------------------------------------")
$(warning "     Cannot found the $(REGBING_PACKAGE_VER).tgz package !!                 ")
$(warning "---------------------------------------------------------------------")
$(error )
endif

##########################################################################################
#	regbin_prepare
##########################################################################################
regbin_prepare:
	@echo "---------task [0]    regbin_prepare"
	rm $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER) -rf
	tar xzf $(REGBING_PACKAGE) -C $(OSDRV_DIR)/tools/pc/uboot_tools
	chmod 777 $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER)/regbin
	cp $(OSDRV_DIR)/tools/pc/uboot_tools/$(TARGET_XLSM) $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER)
	pushd $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER);./regbin $(TARGET_XLSM) $(UBOOT_REG_BIN);popd
	mv $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER)/$(UBOOT_REG_BIN) $(OSDRV_DIR)/tools/pc/uboot_tools
	rm $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER) -rf

##########################################################################################
notools_prepare:
	pushd $(OSDRV_DIR)/pub;tar xzf $(PUB_ROOTFS).tgz;popd
##########################################################################################
#task [1]	build uboot
##########################################################################################
boot: prepare regbin_prepare
	@echo "---------task [1]	build boot"
	make -C $(UBOOT_DIR) CHIP=$(CHIP) BOOT_MEDIA=$(BOOT_MEDIA) LIB_TYPE=$(LIB_TYPE) \
			ARCH_TYPE=$(ARCH_TYPE) all

boot_clean:
	rm $(UBOOT_DIR)/$(UBOOT_VER) -rf

##########################################################################################
#task [1.1]	build secureboot
##########################################################################################
secureboot:boot
	@echo -e "---------task [1.1]	build secure boot"
ifneq ($(OSDRV_DIR)/components/$(SECURE_BOOT), $(wildcard $(OSDRV_DIR)/components/$(SECURE_BOOT)))
	pushd $(OSDRV_DIR)/components;tar xzf $(SECURE_BOOT_TAR) -C .;popd
endif
	pushd $(OSDRV_DIR)/components/$(SECURE_BOOT); \
		cp $(UBOOT_DIR)/$(UBOOT_VER)/u-boot-$(CHIP).bin u-boot-original.bin; \
		make CHIP=$(CHIP) ddrinit; \
	popd

secureboot_clean:
	rm $(OSDRV_DIR)/components/$(SECURE_BOOT) -rf

##########################################################################################
#task [2]	build kernel
##########################################################################################
kernel: prepare
	@echo "---------task [2] build kernel"
	make -C $(KERNEL_DIR) CHIP=$(CHIP) BOOT_MEDIA=$(BOOT_MEDIA) LIB_TYPE=$(LIB_TYPE) \
		ARCH_TYPE=$(ARCH_TYPE) all
	cp $(KERNEL_DIR)/$(KERNEL_VER)/arch/arm/boot/uImage $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(UIMAGE)

kernel_clean:
	rm $(KERNEL_DIR)/$(KERNEL_VER) -rf
	rm $(KERNEL_DIR)/$(KERNEL_TAR) -rf

##########################################################################################
#task [3] build secure libs
##########################################################################################
secure_libs:
	@echo -e $(GREEN)"---------task [3] build secure libs"  $(DONE)
	pushd $(OSDRV_DIR)/components;tar xzf secure_c.tgz -C .;popd
	pushd $(OSDRV_DIR)/components/secure_c; \
	make clean;make lib CROSS_COMPILE= ;cp libsecurec.a lib/libsecurec-pc.a; \
	make clean;make lib CROSS_COMPILE=$(OSDRV_CROSS)-;cp libsecurec.a lib/libsecurec-board.a; \
	popd

secure_libs_clean:
	@rm -rf $(OSDRV_DIR)/components/secure_c
##########################################################################################
#task [4]	prepare rootfs
##########################################################################################
rootfs_prepare: prepare
	@echo "---------task [4] prepare rootfs "
ifeq ($(OSDRV_DIR)/pub/$(PUB_ROOTFS), $(wildcard $(OSDRV_DIR)/pub/$(PUB_ROOTFS)))
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS); chmod +w usr/bin; chmod +w usr/sbin; chmod +w sbin; popd
	rm $(OSDRV_DIR)/pub/$(PUB_ROOTFS)* -rf
endif
	tar xzf $(OSDRV_DIR)/rootfs_scripts/rootfs.tgz -C $(OSDRV_DIR)/pub
	mv $(OSDRV_DIR)/pub/rootfs $(OSDRV_DIR)/pub/$(PUB_ROOTFS)
	tar xzf $(RUNTIMELIB_DIR)/$(TOOLCHAIN_RUNTIME_LIB)/$(TOOLCHAIN_RUNTIME_LIB_C) -C $(OSDRV_DIR)/pub/$(PUB_ROOTFS)
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS);$(CROSS_COMPILE)strip -d ./lib/*;popd

##########################################################################################
#task [5]	build busybox
##########################################################################################
busybox: prepare
	@echo "---------task [5] build busybox "
	make -C $(BUSYBOX_DIR) CHIP=$(CHIP) BOOT_MEDIA=$(BOOT_MEDIA) LIB_TYPE=$(LIB_TYPE) \
				ARCH_TYPE=$(ARCH_TYPE) BUSYBOX_CFG=$(BUSYBOX_CFG) all

busybox_clean:
	make -C $(BUSYBOX_DIR) clean

##########################################################################################
#task [6]	build pc tools
##########################################################################################
pctools: prepare secure_libs
	@echo "---------task [6] build tools which run on pc"
	make -C $(ZLIB_DIR) zlib_pc
	make -C $(MTD_DIR) mtd_pc
	make -C $(LZMA_DIR)

	cp $(MTD_DIR)/out/pc/mkfs.jffs2 $(OSDRV_DIR)/pub/bin/pc
	cp $(MTD_DIR)/out/pc/mkfs.ubifs $(OSDRV_DIR)/pub/bin/pc
	cp $(MTD_DIR)/out/pc/ubinize $(OSDRV_DIR)/pub/bin/pc

	make -C $(CRAMFS_DIR)
	cp $(CRAMFS_DIR)/out/pc/sbin/mkfs.cramfs $(OSDRV_DIR)/pub/bin/pc
	make -C $(XZ_DIR)
	make -C $(SQUASHFS_DIR)
	cp $(SQUASHFS_DIR)/out/pc/mksquashfs $(OSDRV_DIR)/pub/bin/pc
	cp $(LZMA_DIR)/bin/lzma $(OSDRV_DIR)/pub/bin/pc

	make -C $(E2FSPROGS_DIR) e2fsprogs_pc
	cp $(E2FSPROGS_DIR)/out/pc/sbin/$(EXT4_TOOL) $(OSDRV_DIR)/pub/bin/pc
	cp $(OSDRV_DIR)/components/secure_c/lib/libsecurec-pc.a $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100
	cp $(OSDRV_DIR)/components/secure_c/include/*.h $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100
	make -C $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100
	cp $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100/nand_product $(OSDRV_DIR)/pub/bin/pc

pctools_clean:
	make -C $(ZLIB_DIR) distclean
	make -C $(MTD_DIR) distclean
	make -C $(SQUASHFS_DIR) distclean
	make -C $(CRAMFS_DIR) distclean
	make -C $(XZ_DIR) distclean
	make -C $(LZMA_DIR) distclean
	make -C $(E2FSPROGS_DIR) distclean
	rm $(OSDRV_DIR)/tools/pc/uboot_tools/$(REGBING_PACKAGE_VER) -rf
	make -C $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100 clean
	rm $(OSDRV_DIR)/tools/pc/nand_production/fmc_nand_ecc_product_v100/*securec* -rf

##########################################################################################
#task [7]	build board tools
##########################################################################################
boardtools: rootfs_prepare secure_libs
	@echo "---------task [7] build tools which run on board "
	cp $(OSDRV_DIR)/components/secure_c/lib/libsecurec-board.a $(OSDRV_DIR)/tools/board/reg-tools-1.0.0/source/common
	cp $(OSDRV_DIR)/components/secure_c/include/*.h $(OSDRV_DIR)/tools/board/reg-tools-1.0.0/source/common
	make -C $(OSDRV_DIR)/tools/board/reg-tools-1.0.0

	make -C $(ZLIB_DIR) OSDRV_CROSS=$(OSDRV_CROSS) zlib_board
	make -C $(EUDEV_DIR) OSDRV_CROSS=$(OSDRV_CROSS) -j1
	cp -af $(EUDEV_DIR)/rootfs/. $(OSDRV_DIR)/pub/$(PUB_ROOTFS)/

	make -C $(MTD_DIR) OSDRV_CROSS=$(OSDRV_CROSS) mtd_board
	cp $(MTD_DIR)/out/board/bin/* $(OSDRV_DIR)/pub/bin/$(PUB_BOARD)

	make -C $(E2FSPROGS_DIR) OSDRV_CROSS=$(OSDRV_CROSS) e2fsprogs_board
	cp $(E2FSPROGS_DIR)/out/board/sbin/mkfs.ext2 $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -rf;
	cp $(E2FSPROGS_DIR)/out/board/sbin/mkfs.ext3 $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -rf;
	cp $(E2FSPROGS_DIR)/out/board/sbin/mkfs.ext4 $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -rf;
	cp $(E2FSPROGS_DIR)/out/board/sbin/mke2fs $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -rf;

boardtools_clean:
	make -C $(OSDRV_DIR)/tools/board/reg-tools-1.0.0 clean
	make -C $(EUDEV_DIR) clean
	make -C $(ZLIB_DIR) clean
	make -C $(MTD_DIR) distclean
	make -C $(E2FSPROGS_DIR) distclean
	rm $(OSDRV_DIR)/tools/board/reg-tools-1.0.0/source/common/*securec* -rf

##########################################################################################
#task [8]	build rootfs
##########################################################################################
define rootfs_fun
    	@echo "---------task [8] build rootfs"
	rm $(OSDRV_DIR)/pub/$(PUB_ROOTFS)/dev/* -rf
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS);ln -s sbin/init init;popd
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS); chmod go-x * -R;chmod go-w * -R;chmod go-r * -R; popd
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS); chmod -w usr/bin -R; chmod -w usr/sbin -R; chmod -w sbin -R; popd

	pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_ROOTFS) -l -e 0x40000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_256K);popd
	pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_ROOTFS) -l -e 0x20000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_128K);popd
	pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_ROOTFS) -l -e 0x10000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_64K);popd

	cp $(OSDRV_DIR)/tools/pc/ubi_sh/mkubiimg.sh $(OSDRV_DIR)/pub/$(PUB_IMAGE)
	chmod +x $(OSDRV_DIR)/pub/$(PUB_IMAGE)/mkubiimg.sh
	# build the pagesize = 2k, blocksize = 128k, part_size = 32M #
	pushd $(OSDRV_DIR)/pub/$(PUB_IMAGE);./mkubiimg.sh $(CHIP) 2k 128k $(OSDRV_DIR)/pub/$(PUB_ROOTFS) 32M $(OSDRV_DIR)/pub/bin/pc;popd
	# build the pagesize = 4k, blocksize = 256k, part_size = 50M #
	pushd $(OSDRV_DIR)/pub/$(PUB_IMAGE);./mkubiimg.sh $(CHIP) 4k 256k $(OSDRV_DIR)/pub/$(PUB_ROOTFS) 50M $(OSDRV_DIR)/pub/bin/pc;popd
	rm $(OSDRV_DIR)/pub/$(PUB_IMAGE)/mkubiimg.sh

	dd if=/dev/zero of=$(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(EXT4_IMAGE_BIN) bs=512 count=$(COUNT_SIZE)
	$(OSDRV_DIR)/pub/bin/pc/$(EXT4_TOOL) $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(EXT4_IMAGE_BIN)
	pushd $(E2FSPROGS_DIR)/out/pc/contrib; ./populate-extfs.sh $(OSDRV_DIR)/pub/$(PUB_ROOTFS) $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(EXT4_IMAGE_BIN);popd

	find $(OSDRV_DIR)/pub/$(PUB_ROOTFS)/ -name '*svn' | xargs rm -rf
	pushd $(OSDRV_DIR)/pub;tar czf $(PUB_ROOTFS).tgz $(PUB_ROOTFS);popd
	@echo "---------finish osdrv work"
endef

rootfs_build: boardtools busybox pctools
	cp -af $(BUSYBOX_DIR)/$(BUSYBOX_VER)/_install/* $(OSDRV_DIR)/pub/$(PUB_ROOTFS)
	$(call rootfs_fun)

rootfs_notools_build:
	$(call rootfs_fun)


rootfs_clean:
ifeq ($(OSDRV_DIR)/pub/$(PUB_ROOTFS), $(wildcard $(OSDRV_DIR)/pub/$(PUB_ROOTFS)))
	pushd $(OSDRV_DIR)/pub/$(PUB_ROOTFS); chmod +w usr/bin -R; chmod +w usr/sbin -R; chmod +w sbin -R; popd
endif
	rm $(OSDRV_DIR)/pub/$(PUB_ROOTFS)/ -rf

##########################################################################################
#task [9]	clean pub
##########################################################################################
pub_clean:
	rm $(OSDRV_DIR)/pub/* -rf

