#
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/image.mk

T_VERSION_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/version.config
T_BUILDTIME_CONFIG := $(KERNEL_BUILD_DIR)/.build_time
T_FWLIST_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/firmware.config
T_BUILDROOT_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/buildroot.config
T_PLUGIN_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/plugin.config
T_FACTORYINFO_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/factoryinfo.config
JFFS2_BLOCKSIZE = 64k 128k 256k

# get product infomation for generating firmware

IMG_EP:=`readelf -h $(KDIR)/vmlinux.elf | grep Entry | sed -n 's/[ \t]*Entry.*0x/0x/p'`
IMG_LA:=0x80010000

define imgname
$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(patsubst jffs2-%,jffs2,$(patsubst squashfs-%,squashfs,$(1)))
endef

define rootfs_align
$(patsubst %-256k,0x40000,$(patsubst %-128k,0x20000,$(patsubst %-64k,0x10000,$(patsubst squashfs-%,0x4,$(1)))))
endef

define sysupname
$(call imgname,$(1),$(2))-sysupgrade.bin
endef

define factoryname
$(call imgname,$(1),$(2))-factory.bin
endef

COMMA:=,

define mkcmdline
$(if $(1),board=$(1) )$(if $(2),console=$(2)$(COMMA)$(3))
endef

SINGLE_PROFILES:=

define SingleProfile
  define Image/Build/Profile/$(PROFILE)
	$$(call Image/Build/Template/$(2)/$$(1),$(1),$(PROFILE),$$(call mkcmdline,$(IMG_BOARD),$(IMG_CONSOLE),$(IMG_BAUDRATE)),$(IMG_SIZE),$(IMG_LA),$(IMG_EP),$(3),$(4))
  endef
  SINGLE_PROFILES += $(PROFILE)
endef

define MultiProfile
  define Image/Build/Profile/$(1)
	$(foreach p,$(2),
		$$(call Image/Build/Profile/$p,$$(1))
	)
  endef
endef

KDIR_TMP:=$(KDIR)/tmp
VMLINUX:=$(BIN_DIR)/$(IMG_PREFIX)-vmlinux
UIMAGE:=$(BIN_DIR)/$(IMG_PREFIX)-uImage
fs_squash:=squashfs-only
fs_64k:=64k
fs_64kraw:=64kraw
fs_128k:=128k
fs_256k:=256k
ifeq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)
	fs_squash:=initramfs
	fs_64k:=initramfs
	fs_64kraw:=initramfs
	fs_128k:=initramfs
	fs_256k:=initramfs
	VMLINUX:=$(BIN_DIR)/$(IMG_PREFIX)-vmlinux-initramfs
	UIMAGE:=$(BIN_DIR)/$(IMG_PREFIX)-uImage-initramfs
endif

ifeq ($(CONFIG_USE_RSA_2048),y)
	MKSLPFW_RSA_2048:=-A
endif

ifeq ($(CONFIG_NO_UP_UBOOT),y)
	MKSLPFW_NO_UP_UBOOT:=-N
endif

define CompressLzma
  $(STAGING_DIR_HOST)/bin/lzma e $(1) -lc1 -lp2 -pb2 $(3) $(2)
endef

define PatchKernelLzma
	cp $(KDIR)/vmlinux $(KDIR_TMP)/vmlinux-$(1)
	$(call CompressLzma,$(KDIR_TMP)/vmlinux-$(1),$(KDIR_TMP)/vmlinux-$(1).bin.lzma)
	$(STAGING_DIR_HOST)/bin/padjffs2 $(KDIR_TMP)/vmlinux-$(1).bin.lzma 64
endef

define PatchKernelGzip
	cp $(KDIR)/vmlinux $(KDIR_TMP)/vmlinux-$(1)
	$(STAGING_DIR_HOST)/bin/patch-cmdline $(KDIR_TMP)/vmlinux-$(1) "$(strip $(2))"
	gzip -9 -c $(KDIR_TMP)/vmlinux-$(1) > $(KDIR_TMP)/vmlinux-$(1).bin.gz
endef


define MkuImage
	mkimage -A mips -O linux -T kernel -a $(IMG_LA) -C $(1) $(2) \
		-e $(IMG_EP) -n 'mips Ingenic Linux-$(LINUX_VERSION)' \
		-d $(3) $(4)
endef

define MkuImageLzma
	$(call PatchKernelLzma,$(1),$(2),$(3))
	$(call MkuImage,lzma,,$(KDIR_TMP)/vmlinux-$(1).bin.lzma,$(KDIR_TMP)/vmlinux-$(1).uImage)
endef

define MkuImageLzma/initramfs
	$(call PatchKernelLzma,$(1),$(2))
	$(call MkuImage,lzma,,$(KDIR_TMP)/vmlinux-$(1).bin.lzma,$(call imgname,initramfs,$(1))-uImage.bin)
endef

define MkuImageGzip
	$(call PatchKernelGzip,$(1),$(2))
	$(call MkuImage,gzip,,$(KDIR_TMP)/vmlinux-$(1).bin.gz,$(KDIR_TMP)/vmlinux-$(1).uImage)
endef

define MkuImageGzip/initramfs
	$(call PatchKernelGzip,$(1),$(2))
	$(call MkuImage,gzip,,$(KDIR_TMP)/vmlinux-$(1).bin.gz,$(call imgname,initramfs,$(1))-uImage.bin)
endef

define MkuImageOKLI
	$(call MkuImage,lzma,-M 0x4f4b4c49,$(KDIR)/vmlinux.bin.lzma,$(KDIR_TMP)/vmlinux-$(1).okli)
endef

define CatFiles
	if [ `stat -c%s "$(1)"` -gt $(2) ]; then \
		echo "Warning: $(1) is too big"; \
	else if [ `stat -c%s $(3)` -gt $(4) ]; then \
		echo "Warning: $(3) is too big"; \
	else \
		( dd if=$(1) bs=$(2) conv=sync; dd if=$(3) ) > $(5); \
	fi; fi
endef

define Sysupgrade/KR
	$(call CatFiles,$(2),$(3),$(KDIR)/root.$(1),$(4),$(call sysupname,$(1),$(5)))
endef

define Sysupgrade/KRuImage
	$(call CatFiles,$(KDIR_TMP)/vmlinux-$(2).uImage,$(3),$(KDIR)/root.$(1),$(4),$(call sysupname,$(1),$(2)))
endef

define Sysupgrade/RKuImage
	$(call CatFiles,$(KDIR)/root.$(1),$(4),$(KDIR_TMP)/vmlinux-$(2).uImage,$(3),$(call sysupname,$(1),$(2)))
endef

define Image/CopyKernelModule
	mkdir -p $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/files/lib/modules/$(LINUX_VERSION)/
	-cp $(KDIR)/linux-$(LINUX_VERSION)/drivers/mmc/core/mmc_core.ko $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/files/lib/modules/$(LINUX_VERSION)/
	-cp $(KDIR)/linux-$(LINUX_VERSION)/drivers/mmc/host/jzmmc_v12.ko $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/files/lib/modules/$(LINUX_VERSION)/
	-cp $(KDIR)/linux-$(LINUX_VERSION)/drivers/mmc/card/mmc_block.ko $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/files/lib/modules/$(LINUX_VERSION)/
endef

define Image/BuildKernel

ifeq ($(CONFIG_T23x_MMC_INSMOD_MANUAL),y)
	$(call Image/CopyKernelModule)
endif
ifeq ($(CONFIG_T31x_MMC_INSMOD_MANUAL),y)
	$(call Image/CopyKernelModule)
endif
	cp $(KDIR)/vmlinux.elf $(VMLINUX).elf
	cp $(KDIR)/vmlinux $(VMLINUX).bin
	dd if=$(KDIR)/vmlinux.bin.lzma of=$(VMLINUX).lzma bs=65536 conv=sync
	dd if=$(KDIR)/vmlinux.bin.gz of=$(VMLINUX).gz bs=65536 conv=sync
	$(call MkuImage,gzip,,$(KDIR)/vmlinux.bin.gz,$(UIMAGE)-gzip.bin)
	$(call MkuImage,lzma,,$(KDIR)/vmlinux.bin.lzma,$(UIMAGE)-lzma.bin)
	-mkdir -p $(KDIR_TMP)
	$(call Image/Build/Initramfs)
endef

MKSLPFW_FLAGS =

ifeq ($(CONFIG_EXT_FW_UPGRADE),y)
	T_EXT_FW_CONFIG := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)/ext_fw.config
	PR_CONFIG_PATH := $(T_PRODUCT_CONFIG_DIR)/$(PROFILE)
	MKSLPFW_FLAGS := -c $(PR_CONFIG_PATH) \
			 -g $(T_EXT_FW_CONFIG)
endif

ifeq ($(CONFIG_USER_DATA_PARTITION),y)
	MKSLPFW_FLAGS += -j $(KDIR)/user_record_jffs2.img
endif

define Image/Build/SLPLzma
    $(call PatchKernelLzma,$(2),$(3))
ifeq ($(CONFIG_ISP_IN_FLASH),y)
	-mkdir $(BIN_DIR)/isp_config
endif
	touch $(KDIR)/usr_conf_data

ifeq ($(CONFIG_DBG_FW),y)

ifeq ($(CONFIG_USES_JFFS2),y)
	mkdir -p $(KDIR)/jffs2_files
	touch $(KDIR)/jffs2_files/jffs2

	if [ ! ${IMG_JFFS2_LEN} ]; then\
		echo IMG_JFFS2_LEN is not defined;\
		exit 1;\
	fi

	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 --pad=${IMG_JFFS2_LEN} -s 0x1000 -e 0x10000 -d $(KDIR)/jffs2_files -o $(KDIR)/jffs2.img
ifeq ($(CONFIG_USER_DATA_PARTITION),y)
	echo Now not support to enable both CONFIG_USES_JFFS2 and CONFIG_USER_DATA_PARTITION!!!
	exit 1
endif

else

#For user data partition, we use JFFS2 file system in Nor Flash. The size of this partition is defined by IMG_USER_RECORD_PARTITION_LEN.
ifneq ($(CONFIG_USER_DATA_PARTITION),)
	mkdir -p $(KDIR)/user_record_files
	touch $(KDIR)/user_record_files/jffs2

	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 --pad=${IMG_USER_RECORD_PARTITION_LEN} -s 0x1000 -e 0x10000 -d $(KDIR)/user_record_files -o $(KDIR)/user_record_jffs2.img
endif

endif
endif #CONFIG_DBG_FW

ifeq ($(CONFIG_USES_JFFS2),y)
	mkdir -p $(KDIR)/jffs2_files
	touch $(KDIR)/jffs2_files/jffs2

	if [ ! ${IMG_JFFS2_LEN} ]; then\
		echo IMG_JFFS2_LEN is not defined;\
		exit 1;\
	fi

	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 --pad=${IMG_JFFS2_LEN} -s 0x1000 -e 0x10000 -d $(KDIR)/jffs2_files -o $(KDIR)/jffs2.img
ifeq ($(CONFIG_USER_DATA_PARTITION),y)
	echo Now not support to enable both CONFIG_USES_JFFS2 and CONFIG_USER_DATA_PARTITION!!!
	exit 1
endif


else

#For user data partition, we use JFFS2 file system in Nor Flash. The size of this partition is defined by IMG_USER_RECORD_PARTITION_LEN.
ifneq ($(CONFIG_USER_DATA_PARTITION),)
	mkdir -p $(KDIR)/user_record_files
	touch $(KDIR)/user_record_files/jffs2

	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 --pad=${IMG_USER_RECORD_PARTITION_LEN} -s 0x1000 -e 0x10000 -d $(KDIR)/user_record_files -o $(KDIR)/user_record_jffs2.img
endif

endif

	-rm -f $(T_BUILDTIME_CONFIG)
endef

define Image/Build/Template/initramfs/initramfs
	$(call Image/Build/$(1)/initramfs,initramfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-128k
	$(call Image/Build/$(1),jffs2-128k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/all/jffs2-256k
	$(call Image/Build/$(1),jffs2-256k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/squashfs-only/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64k/squashfs
	$(call Image/Build/$(1),squashfs-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64k/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef


define Image/Build/Template/64kraw/squashfs
	$(call Image/Build/$(1),squashfs-raw,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/64kraw/jffs2-64k
	$(call Image/Build/$(1),jffs2-64k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/128k/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/128k/jffs2-128k
	$(call Image/Build/$(1),jffs2-128k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/256k/squashfs
	$(call Image/Build/$(1),squashfs,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

define Image/Build/Template/256k/jffs2-256k
	$(call Image/Build/$(1),jffs2-256k,$(2),$(3),$(4),$(5),$(6),$(7),$(8))
endef

$(eval $(call SingleProfile,SLPLzma,$(fs_64kraw)))

ifneq ($(CONFIG_TP_TAPO_SPMINIOS),)
define Image/Build/squashfs
	cp $(KDIR)/rootfs.squashfs $(KDIR)/root.squashfs-raw
	cp $(KDIR)/service.squashfs $(KDIR)/service.squashfs-raw
	$(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
endef
else
define Image/Build/squashfs
	cp $(KDIR)/root.squashfs $(KDIR)/root.squashfs-raw
	cp $(KDIR)/root.squashfs $(KDIR)/root.squashfs-64k
	$(STAGING_DIR_HOST)/bin/padjffs2 $(KDIR)/root.squashfs-64k 64
	cp $(KDIR)/root.squashfs-64k $(BIN_DIR)/$(IMG_PREFIX)-root.squashfs-64k
	$(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
endef
endif

define Image/Build/Initramfs
	$(call Image/Build/Profile/$(PROFILE),initramfs)
endef

define Image/Prepare
	gzip -9 -c $(KDIR)/vmlinux > $(KDIR)/vmlinux.bin.gz
	$(call CompressLzma,$(KDIR)/vmlinux,$(KDIR)/vmlinux.bin.lzma)
endef

ifneq ($(CONFIG_TP_TAPO_SPMINIOS),)
define Image/Build
	$(call Image/Build/$(1))
	dd if=$(KDIR)/rootfs.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-rootfs.$(1) bs=128k conv=sync
	dd if=$(KDIR)/service.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-service.$(1) bs=128k conv=sync
	$(call Image/Build/Profile/$(PROFILE),$(1))
endef
else
define Image/Build
	$(call Image/Build/$(1))
	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-root.$(1) bs=128k conv=sync
	$(call Image/Build/Profile/$(PROFILE),$(1))
endef
endif

$(eval $(call BuildImage))
