# 
# Copyright (C) 2006-2011 OpenWrt.org
#
# 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
include $(INCLUDE_DIR)/zyxel-zy_feature_bits.mk

CONFIG_BRCM_CFE_BOOT_FROM_NAND=y
ifeq ($(CONFIG_BRCM_CFE_BOOT_FROM_NAND),y)
-include $(BCM_BUILD_DIR)/make.common
endif
SQUASHFS_BLOCKSIZE = 64k
SQUASHFSOPT = -b 64k

####export "ARCH_ENDIAN" for BCM SDK 416L01RC1 hosttool "bcmImageMaker" compatible with old version tool##############
ifeq ($(CONFIG_BIG_ENDIAN),y)
export ARCH_ENDIAN=big
SUMTOOLOPT=-b
TOOL_ENDIAN=
else
export ARCH_ENDIAN=little
SUMTOOLOPT=-l
TOOL_ENDIAN=-e little
endif

ifeq ($(CONFIG_FILL_IN_PARTITION_INFO_INTO_NVRAM),y)
export FLASH_TOTAL_SIZE=$(CONFIG_TARGET_NAND_FLASH_TOTAL_SIZE)
else
export FLASH_TOTAL_SIZE=0
endif

FLASHBLK_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_FLASHBLK_SIZE))
JFFS2_BLOCKSIZE:=$(FLASHBLK_SIZE)k
SUMTOOL_BLOCKSIZE:=$(FLASHBLK_SIZE)KiB

UBIFS_BLOCKSIZE:=$(FLASHBLK_SIZE)k
UBIFS_MAX_LEB_COUNT:=688

#depend on blocksize to set page size
ifeq ("$(FLASHBLK_SIZE)","128")
UBIFS_PAGESIZE=2048
endif
ifeq ("$(FLASHBLK_SIZE)","256")
UBIFS_PAGESIZE=4096
endif
ifeq ("$(FLASHBLK_SIZE)","512")
UBIFS_PAGESIZE=4096
endif
ifeq ("$(FLASHBLK_SIZE)","1024")
UBIFS_PAGESIZE=8192
endif
#caclulate LEB eraseblock size, transfer block to bytes - 2 page header(EC & VID)
UBIFS_LEB_BLOCKSIZE_BYTES=`expr $(FLASHBLK_SIZE) \* 1024 - 2 \* $(UBIFS_PAGESIZE)`

# Get bootloader image size in kB.
ifneq ($(call qstrip,$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BTRM_BOOT_ONLY))),)
# Broadcom new mechanism, bootloader(bootrom+cferom) will occupy more than one block
BOOTLOADER_IMAGE_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BTRM_NAND_BOOT_PARTITION_SIZE))
UNSECUREHDR="--unsecurehdr"
else
# default bootloader will occupy only one block.
BOOTLOADER_IMAGE_SIZE=$(FLASHBLK_SIZE)
UNSECUREHDR=""
endif

DDRTYPE=""
#CONFIG_BRCMSDK502L06_BRCM_CHIP="63158"
ifneq ($(findstring _$(call qstrip,$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_CHIP)))_,_63158_47622_),)
# --ddrtype DDR3 --unsecurehdr ;  
#CONFIG_BRCMSDK502L06_BUILD_CFE_DDR4 
ifneq ($(call qstrip,$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BUILD_CFE_DDR4))),)
DDRTYPE="--ddrtype DDR4 "
else
DDRTYPE="--ddrtype DDR3 "
endif
endif

# __zy_bsp__ >>>
ZYBSP_BCM_SDK_VER_CHK := $(findstring $(CONFIG_BRCM_SDK_VERSION),"502L04" "502L05" "502L06" "502L07")
ifneq ($(ZYBSP_BCM_SDK_VER_CHK),)
ZYBSP_BCM_SDK_VER=502L0X
CONFIG_BRCM963xx_SDK_VER_502L0X=y
endif
# __zy_bsp__ <<<

ifneq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_416L04) $(CONFIG_BRCM963xx_SDK_VER_416L05) $(CONFIG_BRCM963xx_SDK_VER_502L0X)),)
ifneq ($(call qstrip,$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BUILD_NOR_KERNEL_LZ4))),)
KERNEL_COMPRESSION=lz4
KERNEL_FILE_TYPE=lz4
else
KERNEL_COMPRESSION=lzma
KERNEL_FILE_TYPE=lz
endif
else
KERNEL_COMPRESSION=lzma
KERNEL_FILE_TYPE=lz
endif

#HOSTTOOLS_DIR=$(BCM_BUILD_DIR)/hostTools
HOSTTOOLS_DIR=$(STAGING_DIR_HOST)/bin/$(shell echo $(CONFIG_BRCM_SDK_VERSION))

# Get MRD information, used for hosttool; do $(shell echo xxxx) twice because need to remove quotes
export BRCM_VOICE_BOARD_ID=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_VOICE_BOARD_ID))
export VENDORNAME=$(call qstrip,$(CONFIG_MRD_VENDOR_NAME))
export PRODUCTNAME=$(call qstrip,$(CONFIG_MRD_PRODUCT_NAME))
export SERIALNUMBER=$(call qstrip,$(CONFIG_MRD_SERIAL_NO))
export FIRMWARE_VERSION=$(call qstrip,$(CONFIG_ZYXEL_FIRMWARE_VERSION))
ifneq ($(CONFIG_ZYXEL_FIRMWARE_VERSION_EXT),"")
export FIRMWARE_VERSION_EX=$(call qstrip,$(CONFIG_ZYXEL_FIRMWARE_VERSION_EXT))
else
export FIRMWARE_VERSION_EX=$(call qstrip,$(CONFIG_ZYXEL_FIRMWARE_VERSION))
endif
export ZYXEL_MODEL_ID=$(call qstrip,$(CONFIG_MRD_MODEL_ID))
export MAINFEATUREBIT=$(call qstrip,$(CONFIG_MRD_MAIN_FEATURE_BIT))
export DEBUGBIT=$(call qstrip,$(CONFIG_MRD_DEBUG_BIT))
export COUNTRYCODE=$(call qstrip,$(CONFIG_MRD_COUNTRY_CODE))
export NVRAM_MEMORY_CONFIG=$(call qstrip,$(CONFIG_BCM63138_NVRAM_MEMORY_CONFIG))
export NVRAM_MC_MEMORY_ALLOCATION=$(call qstrip,$(CONFIG_BCM63138_NVRAM_MC_MEMORY_ALLOCATION))
export NVRAM_TM_MEMORY_ALLOCATION=$(call qstrip,$(CONFIG_BCM63138_NVRAM_TM_MEMORY_ALLOCATION))
export NVRAM_DHD0_MEMORY_ALLOCATION=$(call qstrip,$(CONFIG_BCM63138_NVRAM_DHD0_MEMORY_ALLOCATION))
export NVRAM_DHD1_MEMORY_ALLOCATION=$(call qstrip,$(CONFIG_BCM63138_NVRAM_DHD1_MEMORY_ALLOCATION))
export NVRAM_DHD2_MEMORY_ALLOCATION=$(call qstrip,$(CONFIG_BCM63138_NVRAM_DHD2_MEMORY_ALLOCATION))
export BRCM_MISC1_PARTITION_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_MISC1_PARTITION_SIZE))
export BRCM_MISC2_PARTITION_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_MISC2_PARTITION_SIZE))
export BRCM_MISC3_PARTITION_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_MISC3_PARTITION_SIZE))
export BRCM_MISC4_PARTITION_SIZE=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_MISC4_PARTITION_SIZE))
export BRCM_GPON_SERIAL_NUMBER=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_GPON_SERIAL_NUMBER))
export BRCM_GPON_PASSWORD=$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_GPON_PASSWORD))
# bcmImageMaker need this parameter
export BIN_DIR
# __zy_bsp__ >>>
# Due to BRCM_AUXFS_PERCENT will be filter out by non-NOR flash (BRCM_FLASH_BUILD_NOR) at 502L05,
# we export it here for NAND flash.
ifeq ("$($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_BRCM_AUXFS_PERCENT))","")
BRCM_AUXFS_PERCENT=0
endif
# __zy_bsp__ <<<

# Get common options
ZYXEL_RAS_FORMAT=$($(shell echo CONFIG_BRCMSDK${CONFIG_BRCM_SDK_VERSION}_ZYXEL_RSA_FORMAT))

# For zytool generate multi zld.bin
ZYXEL_ZYTOOL_SCRIPT_DIR=$(TOPDIR)/target/linux/brcm963xx/$(SUBTARGET)

# For ubifs bootfs
TARGET_UBI_BOOTFS=$(BUILD_DIR)/bootfs

define Image/Build/multi_zld
	##doing zytool shell script
	if [ -e $(ZYXEL_ZYTOOL_SCRIPT_DIR)/zytool_multi_zld.sh ]; then \
	if [ -e $(HOSTTOOLS_DIR)/zytool ]; then \
	$(ZYXEL_ZYTOOL_SCRIPT_DIR)/zytool_multi_zld.sh $(HOSTTOOLS_DIR) $(1) $(BRCM_CHIP) $(ARCH_ENDIAN); \
	elif [ ! -e $(HOSTTOOLS_DIR)/zytool ]; then \
	echo "Please clean and rebuild host tools !!"; \
	exit -1; \
	fi \
	elif [ ! -e $(ZYXEL_ZYTOOL_SCRIPT_DIR)/zytool_multi_zld.sh ]; then \
	echo; \
	fi
endef


define Image/Build/merge_firmware
	echo;echo "!!! Package firmware for release !!!";echo
	mkdir -p $(BIN_DIR)/zyxel/
ifneq ($(call qstrip, $(CONFIG_BRCM963xx_SDK_VER_502L0X)), )
	###create fcs image dir for pureUbi and JFFS2withUBI
	mkdir -p $(BIN_DIR)/zyxel_pureUbi/
	mkdir -p $(BIN_DIR)/zyxel_ubi/
endif
	# [BuildMergeFirmware]Generate the tagged image with BCM proprietary tool "bcmImageMaker/bcmImageBuilder"
ifeq ($(ZYXEL_RAS_FORMAT), y)
	##doing ZyXEL image formate
	$(call Image/mkfs/jffs2/sub/original,$(JFFS2_BLOCKSIZE))
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --rootfs $(KERNEL_BUILD_DIR)/root.jffs2-$(JFFS2_BLOCKSIZE) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.jffs2-$(JFFS2_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR))

ifneq ($(call qstrip, $(CONFIG_BRCM963xx_SDK_VER_502L0X)), )
###START pureUBI, JFFS2withUBI
	$(call Image/mkfs/ubifs/sub/original,$(UBIFS_BLOCKSIZE))
	#pureUBI
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --rootfs $(KERNEL_BUILD_DIR)/root.pureubi-$(UBIFS_BLOCKSIZE) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-pureubi-$(UBIFS_BLOCKSIZE)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-pureubi-$(UBIFS_BLOCKSIZE).bin --ubionlyimage $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR))
	
	#JFFS2 bootfs + UBI rootfs
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker  --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin  --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --ubifs --bootfs $(KERNEL_BUILD_DIR)/bootfs$(FLASHBLK_SIZE)kb.img --rootfs $(KERNEL_BUILD_DIR)/root.ubifs-$(UBIFS_BLOCKSIZE) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-ubifs-$(UBIFS_BLOCKSIZE)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-ubifs-$(UBIFS_BLOCKSIZE).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR))
###END pureUBI, JFFS2withUBI 
endif

else
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --rootfs $(KERNEL_BUILD_DIR)/root.jffs2-$(JFFS2_BLOCKSIZE) --image $(BIN_DIR)/zyxel/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR))
endif
	cp $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE).bin.w $(BIN_DIR)/zyxel/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(BOARDNAME)-jffs2-$(JFFS2_BLOCKSIZE)-cfe.bin.w of=$(BIN_DIR)/zyxel/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
ifneq ($(call qstrip, $(CONFIG_BRCM963xx_SDK_VER_502L0X)), )
	### START pureUbi, JFFS2withUBI
	cp $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-pureubi-$(UBIFS_BLOCKSIZE).bin.w $(BIN_DIR)/zyxel_pureUbi/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(BOARDNAME)-pureubi-$(UBIFS_BLOCKSIZE)-cfe.bin.w of=$(BIN_DIR)/zyxel_pureUbi/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
	cp $(BIN_DIR)/openwrt-nand-$(BOARDNAME)-ubifs-$(UBIFS_BLOCKSIZE).bin.w $(BIN_DIR)/zyxel_ubi/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(BOARDNAME)-ubifs-$(UBIFS_BLOCKSIZE)-cfe.bin.w of=$(BIN_DIR)/zyxel_ubi/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
	###END pureUbi, JFFS2withUBI
endif
ifneq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_416L05) $(CONFIG_BRCM963xx_SDK_VER_502L0X)), )
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel)
endif
ifneq ($(call qstrip, $(CONFIG_BRCM963xx_SDK_VER_502L0X)), )
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel_pureUbi)
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel_ubi)
endif
endef

define Image/Build/CFE
	$(if $(findstring jffs2, $(1)), \
	mkdir -p $(BIN_DIR)/zyxel/;)
	$(if $(findstring pureubi, $(1)), \
	mkdir -p $(BIN_DIR)/zyxel_pureUbi/;)
	$(if $(findstring ubifs, $(1)), \
	mkdir -p $(BIN_DIR)/zyxel_ubi/;)
	$(if $(findstring squbi, $(1)), \
	mkdir -p $(BIN_DIR)/zyxel_squbi/;)
	# [BuildCFE]Generate the tagged image with BCM proprietary tool "bcmImageMaker/bcmImageBuilder"
ifeq ($(CONFIG_BRCM_CFE_BOOT_FROM_NAND),y)
ifeq ($(ZYXEL_RAS_FORMAT), y)
	##doing ZyXEL image formate(including CFE)

	#pureUBI
	$(if $(findstring pureubi, $(1)), \
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --rootfs $(KERNEL_BUILD_DIR)/root.$(1) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin --ubionlyimage $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR));)

	#squbi
	$(if $(findstring squbi, $(1)), \
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --rootfs $(KERNEL_BUILD_DIR)/root.$(1) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.squbi-$(UBIFS_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin --ubionlyimage $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR));)

	
	#JFFS2 bootfs + UBI rootfs
	$(if $(findstring ubifs, $(1)), \
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker  --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin  --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --ubifs --bootfs $(KERNEL_BUILD_DIR)/bootfs$(FLASHBLK_SIZE)kb.img --rootfs $(KERNEL_BUILD_DIR)/root.$(1) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR));)

	#JFFS2
	$(if $(findstring jffs2, $(1)), \
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --flashtotalsize $(FLASH_TOTAL_SIZE) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --kernelimg $(KERNEL_BUILD_DIR)/vmlinux.lz --rootfs $(KERNEL_BUILD_DIR)/root.$(1) --fake_rootfs $(KERNEL_BUILD_DIR)/fake_root.jffs2-$(JFFS2_BLOCKSIZE) --image $(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR));)

else
#####else($(ZYXEL_RAS_FORMAT), y)
	$(HOSTTOOLS_DIR)/scripts/bcmImageMaker --cferom $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)rom.bin --blocksize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --bootofs $(FLASH_BOOT_OFS) --bootsize $(shell expr 1024 \* $(FLASHBLK_SIZE)) --rootfs $(KERNEL_BUILD_DIR)/root.$(1) --image $(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin --fsonly $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin $(call qstrip,$(DDRTYPE)) $(call qstrip,$(UNSECUREHDR))
#END ($(ZYXEL_RAS_FORMAT), y)
endif
	$(if $(findstring jffs2, $(1)), \
	cp $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin.w $(BIN_DIR)/zyxel/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin.w of=$(BIN_DIR)/zyxel/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel);)
	$(if $(findstring pureubi, $(1)), \
	cp $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin.w $(BIN_DIR)/zyxel_pureUbi/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin.w of=$(BIN_DIR)/zyxel_pureUbi/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel_pureUbi);)
	$(if $(findstring squbi, $(1)), \
	cp $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin.w $(BIN_DIR)/zyxel_squbi/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin.w of=$(BIN_DIR)/zyxel_squbi/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)
	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel_pureUbi);)
	$(if $(findstring ubifs, $(1)), \
	cp $(BIN_DIR)/openwrt-nand-$(4)-$(1).bin.w $(BIN_DIR)/zyxel_ubi/ras.bin
	dd if=$(BIN_DIR)/openwrt-nand-$(4)-$(1)-cfe.bin.w of=$(BIN_DIR)/zyxel_ubi/zld.bin bs=1k count=$(BOOTLOADER_IMAGE_SIZE)

	$(call Image/Build/multi_zld, $(BIN_DIR)/zyxel_ubi);)

else
	$(HOSTTOOLS_DIR)/bcmImageBuilder --output $(BIN_DIR)/openwrt-$(4)-$(1).bin --chip $(3) --board $(2) --blocksize $(SQUASHFS_BLOCKSIZE) --image-version 4143GW2801456 --cfefile $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP).bin --rootfsfile $(BIN_DIR)/$(IMG_PREFIX)-root.$(1) --kernelfile $(KDIR)/vmlinux.lz
	cp $(BIN_DIR)/openwrt-$(4)-$(1).bin $(BIN_DIR)/zyxel/ras.bin
	cp $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP).bin $(BIN_DIR)/zyxel/zld.bin
	$(HOSTTOOLS_DIR)/bcmImageBuilder --output $(BIN_DIR)/openwrt-$(4)-$(1)-cfe.bin --chip $(3) --board $(2) --blocksize $(SQUASHFS_BLOCKSIZE) --image-version 4143GW2801456 --cfefile $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP).bin --rootfsfile $(KERNEL_BUILD_DIR)/root.$(1) --kernelfile $(KDIR)/vmlinux.lz --include-cfe
endif
endef

define Build/Clean
endef

define Image/mkfs/jffs2/sub/fake
	# Prepare a fake rootfs without default config and cferam.000(JFFS2 fake)
	rm -rf $(TARGET_DIR)_fake
	cp -afp $(TARGET_DIR) $(TARGET_DIR)_fake
	rm -f $(TARGET_DIR)_fake/etc/sysconfig.tar.gz $(TARGET_DIR)_fake/cferam.000
	rm -f $(TARGET_DIR)_fake/etc/zcfg_schema.tar.gz
	rm -f $(TARGET_DIR)_fake/etc/zcfg_defaultStr.bin
	rm -f $(TARGET_DIR)_fake/etc/zcfg_objName.bin
	rm -f $(TARGET_DIR)_fake/etc/zcfg_paramName.bin
	rm -rf $(TARGET_DIR)_fake/usr/lib/opkg

ifneq ($(call qstrip,$(CONFIG_KERNEL_JFFS2_SUMMARY)),y)
	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/fake_root.jffs2-$(1) -d $(TARGET_DIR)_fake -N $(BUILD_DIR)/nocomprlist -v 2>&1 1>/dev/null | awk '/^.+$$$$/'
else
	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/tmp_root.jffs2-$(1) -d $(TARGET_DIR)_fake -N $(BUILD_DIR)/nocomprlist -v 2>&1 1>/dev/null | awk '/^.+$$$$/' 
	$(STAGING_DIR_HOST)/bin/sumtool $(SUMTOOLOPT) -p -i $(KDIR)/tmp_root.jffs2-$(1) -o $(KDIR)/fake_root.jffs2-$(1) -e $(SUMTOOL_BLOCKSIZE) -n
	rm $(KDIR)/tmp_root.jffs2-$(1)
endif

endef

define Image/mkfs/jffs2/fcs_RD0_checksum
	$(call Image/mkfs/jffs2/sub/fake,$(JFFS2_BLOCKSIZE))
endef

define Image/mkfs/jffs2/sub/original

ifeq ("$(call qstrip,$(ZYXEL_RAS_FORMAT))","y")
	$(HOSTTOOLS_DIR)/zyfwinfo -f $(TARGET_DIR)/cferam.000 -s -k $(KERNEL_BUILD_DIR)/vmlinux.lz -r $(KDIR)/fake_root.jffs2-$(1) $(TOOL_ENDIAN)
endif
	touch -a -m -t 197001010000.00 $(TARGET_DIR)/cferam.000
	# FIXME: removing this line will cause strange behaviour in the foreach loop below
ifneq ($(call qstrip,$(CONFIG_KERNEL_JFFS2_SUMMARY)),y)
	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/root.jffs2-$(1) -d $(TARGET_DIR) -N $(BUILD_DIR)/nocomprlist -v 2>&1 1>/dev/null | awk '/^.+$$$$/'
else
	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/tmp_root.jffs2-$(1) -d $(TARGET_DIR) -N $(BUILD_DIR)/nocomprlist -v 2>&1 1>/dev/null | awk '/^.+$$$$/'
	$(STAGING_DIR_HOST)/bin/sumtool $(SUMTOOLOPT) -p -i $(KDIR)/tmp_root.jffs2-$(1) -o $(KDIR)/root.jffs2-$(1) -e $(SUMTOOL_BLOCKSIZE) -n
	rm $(KDIR)/tmp_root.jffs2-$(1)
endif

endef

define Image/mkfs/jffs2/sub
	# Add nocomprlist for compress whole rootfs but those two image cferam.000 and vmlinux.lz
	echo -e "/cferam.000" > $(BUILD_DIR)/nocomprlist
	if [ -e $(TARGET_DIR)/.ethWanAsLan ]; then \
		echo -e "/.ethWanAsLan" >> $(BUILD_DIR)/nocomprlist; \
	fi
	echo -e "/vmlinux.lz" >> $(BUILD_DIR)/nocomprlist
	if [ -e $(TARGET_DIR)/$(BRCM_DTB) ]; then \
		echo -e "/$(BRCM_DTB)" >> $(BUILD_DIR)/nocomprlist; \
	fi

	$(call Image/mkfs/jffs2/sub/original,$(1))

	$(call Image/Build,jffs2-$(1))
	# no need to remove it
	#rm -rf $(BUILD_DIR)/nocomprlist
endef

ifneq ($(CONFIG_TARGET_ROOTFS_SQUASHFS),)
define Image/mkfs/squashfs
	@mkdir -p $(TARGET_DIR)/overlay
	$(STAGING_DIR_HOST)/bin/mksquashfs4 $(TARGET_DIR) $(KDIR)/root.squashfs -nopad -noappend -root-owned -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) -processors $(if $(CONFIG_PKG_BUILD_JOBS),$(CONFIG_PKG_BUILD_JOBS),1)
	dd if=$(KDIR)/root.squashfs of=$(BIN_DIR)/$(IMG_PREFIX)-root.squashfs bs=$(SQUASHFS_BLOCKSIZE) conv=sync
	$(call Image/Build,squashfs)
endef
endif

ifneq ($(CONFIG_TARGET_ROOTFS_UBIFS),)
define Image/mkfs/ubifs/sub/fake
	# Prepare a fake rootfs without default config and cferam.000(UBI fake)
	rm -rf $(TARGET_DIR)_fake
	cp -afp $(TARGET_DIR) $(TARGET_DIR)_fake
	rm -f $(TARGET_DIR)_fake/etc/sysconfig.tar.gz $(TARGET_DIR)_fake/cferam.000
	rm -f $(TARGET_DIR)_fake/etc/zcfg_schema.tar.gz
	rm -f $(TARGET_DIR)_fake/etc/zcfg_defaultStr.bin
	rm -f $(TARGET_DIR)_fake/etc/zcfg_objName.bin
	rm -f $(TARGET_DIR)_fake/etc/zcfg_paramName.bin
	rm -rf $(TARGET_DIR)_fake/usr/lib/opkg

	#reduce ubi ras.bin size
	rm -f $(TARGET_DIR)_fake/vmlinux.$(KERNEL_FILE_TYPE)

	$(STAGING_DIR_HOST)/bin/mkfs.ubifs $(UBIFS_OPTS) -c $(UBIFS_MAX_LEB_COUNT) -m $(UBIFS_PAGESIZE) -e $(UBIFS_LEB_BLOCKSIZE_BYTES) -o $(KDIR)/fake_root.ubifs-$(1) -r $(TARGET_DIR)_fake
	## add squbi
	echo -e "[ubifs]"                 > $(KDIR)/squbi.ini
	echo -e "mode=ubi"               >> $$(KDIR)/squbi.ini
	echo -e "image=$(KDIR)/squashfs_fake.img" >> $(KDIR)/squbi.ini
	echo -e "vol_id=0"               >> $(KDIR)/squbi.ini
	echo -e "vol_type=static"        >> $(KDIR)/squbi.ini
	echo -e "vol_name=rootfs_squashfs"  >> $(KDIR)/squbi.ini
	
	fakeroot $(STAGING_DIR_HOST)/bin/mksquashfs4 $(TARGET_DIR)_fake $(KDIR)/squashfs_fake.img -noappend -all-root -comp xz
    
	#restore vmlinux.lz for JFFS2 use
	cp $(KDIR)/vmlinux.$(KERNEL_FILE_TYPE) $(TARGET_DIR)_fake
# END Image/mkfs/ubifs/sub/fake
endef

define Image/mkfs/ubifs/fcs_RD0_checksum
	$(call Image/mkfs/ubifs/sub/fake,$(UBIFS_BLOCKSIZE))
endef

define Image/mkfs/ubifs/sub/original
# for make fcs use
ifeq ("$(call qstrip,$(ZYXEL_RAS_FORMAT))","y")
	$(HOSTTOOLS_DIR)/zyfwinfo -f $(TARGET_DIR)/cferam.000 -s -k $(KERNEL_BUILD_DIR)/vmlinux.lz -r $(KDIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) $(TOOL_ENDIAN)
endif
	touch -a -m -t 197001010000.00 $(TARGET_DIR)/cferam.000

	#zyfwinfo will update FirmwareVersion string in cferam.000, so update it to bootfs for filestruct_full.bin use
	cp $(TARGET_DIR)/cferam.000 $(TARGET_UBI_BOOTFS)
ifeq ($(CONFIG_ALTIBOX_CUSTOMIZATION),y)
	fakeroot ./buildUBI_dynamic -u $(KDIR)/ubinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/rootfs.ubifs
else
	fakeroot ./buildUBI -u $(KDIR)/ubinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/rootfs.ubifs
endif
	#for pureUbi rootfs
	fakeroot $(STAGING_DIR_HOST)/bin/ubinize -v -o $(KDIR)/root.pureubi-$(UBIFS_BLOCKSIZE) -m $(UBIFS_PAGESIZE) -p $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) $(KDIR)/ubinize.cfg
	
	#for JFFS2withUBI rootfs
	# JFFS2withUBI save cferam in bootfs
	fakeroot $(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -p -n -e $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) -r $(TARGET_UBI_BOOTFS) -o $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img -N $(BUILD_DIR)/nocomprlist
	fakeroot $(STAGING_DIR_HOST)/bin/sumtool $(SUMTOOLOPT) -p -i $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img -o $(KDIR)/bootfs$(FLASHBLK_SIZE)kb.img -e $(SUMTOOL_BLOCKSIZE) -n
	rm -f $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img
	
#END define Image/mkfs/ubifs/sub/original
endef

define Image/mkfs/ubifs

ifeq ("$(call qstrip,$(ZYXEL_RAS_FORMAT))","y")
	$(HOSTTOOLS_DIR)/zyfwinfo -f $(TARGET_DIR)/cferam.000 -s -k $(KERNEL_BUILD_DIR)/vmlinux.lz -r $(KDIR)/fake_root.ubifs-$(UBIFS_BLOCKSIZE) $(TOOL_ENDIAN)
endif
	touch -a -m -t 197001010000.00 $(TARGET_DIR)/cferam.000

	# START====Create boot file system dir
	rm -rf $(TARGET_UBI_BOOTFS)
	mkdir $(TARGET_UBI_BOOTFS)
	chmod 777 $(TARGET_UBI_BOOTFS)
	cp $(TARGET_DIR)/cferam.000 $(TARGET_UBI_BOOTFS)
	cp $(TARGET_DIR)/$(BRCM_DTB) $(TARGET_UBI_BOOTFS)
	cp $(KERNEL_BUILD_DIR)/vmlinux.lz $(TARGET_UBI_BOOTFS)

	mkdir -p $(TARGET_UBI_BOOTFS)/etc
	cp $(TARGET_DIR)/etc/image_version $(TARGET_UBI_BOOTFS)/etc

	echo -n "@(#) $$$$"imageversion:" " > $(TARGET_UBI_BOOTFS)/etc/image_ident
	cat $(TARGET_DIR)/etc/image_version | tr -d "\n" >> $(TARGET_UBI_BOOTFS)/etc/image_ident
	echo " $$$$" >> $(TARGET_UBI_BOOTFS)/etc/image_ident

	echo -n "@(#) $$$$"imageversion:" " >> $(TARGET_UBI_BOOTFS)/etc/image_ident
	cat $(TARGET_DIR)/etc/image_version | tr -d "\n" >> $(TARGET_UBI_BOOTFS)/etc/image_ident
	echo " $$$$" >> $(TARGET_UBI_BOOTFS)/etc/image_ident
	# END====Create boot file system dir

    #reduce ubi ras.bin size
	rm -f $(TARGET_DIR)/vmlinux.$(KERNEL_FILE_TYPE)
	rm -f $(TARGET_DIR)/cferam.000

	fakeroot $(STAGING_DIR_HOST)/bin/mkfs.ubifs $(UBIFS_OPTS) -c $(UBIFS_MAX_LEB_COUNT) -m $(UBIFS_PAGESIZE) -e $(UBIFS_LEB_BLOCKSIZE_BYTES) -o $(KDIR)/rootfs.ubifs -r $(TARGET_DIR)


ifeq ($(CONFIG_ALTIBOX_CUSTOMIZATION),y)
	fakeroot ./buildUBI_dynamic -u $(KDIR)/ubinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/rootfs.ubifs
else
	fakeroot ./buildUBI -u $(KDIR)/ubinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/rootfs.ubifs
endif
	fakeroot $(STAGING_DIR_HOST)/bin/ubinize -v -o $(KDIR)/root.pureubi-$(UBIFS_BLOCKSIZE) -m $(UBIFS_PAGESIZE) -p $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) $(KDIR)/ubinize.cfg
	
	$(call Image/Build,pureubi-$(UBIFS_BLOCKSIZE))
	echo;echo "squbi part";echo
	fakeroot ./buildUBI -u $(KDIR)/fake_squbinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/squashfs_fake.img -s 1
	fakeroot $(STAGING_DIR_HOST)/bin/ubinize -v -o $(KDIR)/fake_root.squbi-$(UBIFS_BLOCKSIZE) -m $(UBIFS_PAGESIZE) -p $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) $(KDIR)/fake_squbinize.cfg
	
	echo -e "[ubifs]"                 > $(KDIR)/squbi.ini
	echo -e "mode=ubi"               >> $$(KDIR)/squbi.ini
	echo -e "image=$(KDIR)/squashfs.img" >> $(KDIR)/squbi.ini
	echo -e "vol_id=0"               >> $(KDIR)/squbi.ini
	echo -e "vol_type=static"        >> $(KDIR)/squbi.ini
	echo -e "vol_name=rootfs_squashfs"  >> $(KDIR)/squbi.ini
	
	fakeroot $(STAGING_DIR_HOST)/bin/mksquashfs4 $(TARGET_DIR) $(KDIR)/squashfs.img -noappend -all-root -comp xz
	fakeroot ./buildUBI -u $(KDIR)/squbinize.cfg -m $(KDIR)/metadata.bin -f $(KDIR)/filestruct_full.bin -t $(TARGET_UBI_BOOTFS) -y $(KDIR)/squashfs.img -s 1
	fakeroot $(STAGING_DIR_HOST)/bin/ubinize -v -o $(KDIR)/root.squbi-$(UBIFS_BLOCKSIZE) -m $(UBIFS_PAGESIZE) -p $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) $(KDIR)/squbinize.cfg
	$(call Image/Build,squbi-$(UBIFS_BLOCKSIZE))
	
	#restore vmlinux.lz, cferam.000 for JFFS2 use
	cp $(TARGET_UBI_BOOTFS)/vmlinux.$(KERNEL_FILE_TYPE) $(TARGET_DIR)
	cp $(TARGET_UBI_BOOTFS)/cferam.000 $(TARGET_DIR)
#### JFFS2 BootFS/UBI RootFS Start
#prepare config file for JFFS+UBI image
	echo -e "[ubifs]"                 > $(KDIR)/bootfsJFFS2_rootfsUbi.ini	
	echo -e "mode=ubi"               >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
	echo -e "image= $(KDIR)/rootfs.ubifs" >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
	echo -e "vol_id=0"               >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
	echo -e "vol_type=static"       >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
	echo -e "vol_name=rootfs_ubifs"  >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
#	echo -e "vol_flags=autoresize"   >> $(KDIR)/bootfsJFFS2_rootfsUbi.ini
	fakeroot $(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(JFFS2OPTS) -p -n -e $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) -r $(TARGET_UBI_BOOTFS) -o $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img -N $(BUILD_DIR)/nocomprlist
	fakeroot $(STAGING_DIR_HOST)/bin/sumtool $(SUMTOOLOPT) -p -i $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img -o $(KDIR)/bootfs$(FLASHBLK_SIZE)kb.img -e $(SUMTOOL_BLOCKSIZE) -n
	rm -f $(KDIR)/ibootfs$(FLASHBLK_SIZE)kb.img

	fakeroot $(STAGING_DIR_HOST)/bin/ubinize -v -o $(KDIR)/root.ubifs-$(UBIFS_BLOCKSIZE) -m $(UBIFS_PAGESIZE) -p $(patsubst %k,%KiB,$(UBIFS_BLOCKSIZE)) $(KDIR)/bootfsJFFS2_rootfsUbi.ini
#### JFFS2 BootFS/UBI RootFS End

	$(call Image/Build,ubifs-$(UBIFS_BLOCKSIZE))
# END define Image/mkfs/ubifs
endef


# END ifneq ($(CONFIG_TARGET_ROOTFS_UBIFS),)
endif

define Image/mkfs/prepare
	#workaround: copy all *.ko to rootfs/lib/modules/xxx/; the correct way is modify package/kernel/modules/netfilter.mk, but it should care dependence.
	cp `find $(LINUX_DIR)/ -name "*.ko"` $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	#cp `find $(BROADCOM_SDK_DIR)/bcmdrivers/ -name "*.ko"` $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	#prevent duplicate binary, "wl/impl61/main/src/*/linux/prebuilt/*.ko", let cp command fail.
	cp `find $(BROADCOM_SDK_DIR)/bcmdrivers/ -path "*/prebuilt" -prune -o -name "*.ko" -print` $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	#In SDK 502L04, some kernel module locate at "bcm963xx\rdp\" directory.
	#In SDK 502L07, "bcm963xx/rdp/" will not contain kernel module.
	if [ -d $(BROADCOM_SDK_DIR)/rdp ]; then \
		for f in `find $(BROADCOM_SDK_DIR)/rdp -name *.ko`; \
		do \
			cp $$$$f $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/; \
		done \
	fi
	#./depmod.pl -F $(KDIR)/linux-$(LINUX_VERSION)/System.map -b $(TARGET_DIR)/lib/modules/
	#due to depmod can't generate file at read-only file system, so modify the path that generate file
#ifneq ($($(shell echo CONFIG_BRCMSDK$(CONFIG_BRCM_SDK_VERSION)_ZYXEL)),)
ifneq ($(CONFIG_PACKAGE_zcfg),)
	mkdir -p $(TARGET_DIR)/var/
	touch $(TARGET_DIR)/var/modules.dep
	touch $(TARGET_DIR)/var/modules.symbols
	touch $(TARGET_DIR)/var/modules.alias
	ln -fs /var/modules.dep $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	ln -fs /var/modules.symbols $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	ln -fs /var/modules.alias $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
endif
	$(RSTRIP) $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/
	#do not rsyne modules due to conflict directory name on kernel---ChihYuan Yang
	rsync -av --exclude 'modules' $(BCM_BUILD_DIR)/targets/$(BCM_PROFILE)/fs.install/  $(TARGET_DIR)/

ifeq ($(CONFIG_PACKAGE_base-files), )
ifneq ($(CONFIG_PACKAGE_zcfg),)
ifeq ($(CONFIG_BRCM_SDK_VERSION), "416L02A")
	$(CP) $(TOPDIR)/target/linux/brcm963xx/base-files/* $(TARGET_DIR)/
else
	$(CP) $(TOPDIR)/target/linux/brcm963xx/base-files-$(CONFIG_BRCM_SDK_VERSION)/* $(TARGET_DIR)/
	if [ -d $(TOPDIR)/target/linux/brcm963xx/$(SUBTARGET)/base-files-$(CONFIG_BRCM_SDK_VERSION) ]; then \
		$(CP) $(TOPDIR)/target/linux/brcm963xx//$(SUBTARGET)/base-files-$(CONFIG_BRCM_SDK_VERSION)/* $(TARGET_DIR)/; \
	fi
endif	
else
	# not select zcfg means want to have Broadcom like firmware.
ifeq ("$(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_502L0X))","y")
	$(CP) $(TOPDIR)/target/linux/brcm963xx/base-files-bsp-502Lx/* $(TARGET_DIR)/
ifeq ($(CONFIG_BRCM_SDK_VERSION), "502L07")
	$(CP) $(TARGET_DIR)/etc/make_static_devnodes_502L07.sh $(TARGET_DIR)/etc/make_static_devnodes.sh
	rm $(TARGET_DIR)/etc/make_static_devnodes_502L07.sh
endif
else
	$(CP) $(TOPDIR)/target/linux/brcm963xx/base-files-bsp/* $(TARGET_DIR)/
endif
endif
	rm `find $(TARGET_DIR)/ -name ".gitkeep"`
ifeq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_416L04) $(CONFIG_BRCM963xx_SDK_VER_416L05) $(CONFIG_BRCM963xx_SDK_VER_502L0X)),)
	ln -sf /lib/public/libcms_boardctl.so $(TARGET_DIR)/lib/libcms_boardctl.so
	ln -sf /lib/public/libcms_msg.so $(TARGET_DIR)/lib/libcms_msg.so
	ln -sf /lib/public/libcms_util.so $(TARGET_DIR)/lib/libcms_util.so
endif
endif
	#Need to strip the rootfs to reduce the image size.
	#Don`t strip $(BCM_BUILD_DIR)/targets/$(BCM_PROFILE)/fs.install when you using "sstrip"
	#It may cause compile error when you compile the second time.
	$(RSTRIP) $(TARGET_DIR)/
	
ifneq ($(CONFIG_DSL_SUPPORT),)
	mkdir -p $(TARGET_DIR)/etc/adsl;cp -av $(BROADCOM_SDK_DIR)/bcmdrivers/broadcom/char/adsl/bcm9$(BRCM_CHIP)/*.bin  $(TARGET_DIR)/etc/adsl
endif
ifeq ($(CONFIG_BRCM_CFE_BOOT_FROM_NAND),y)
	cp $(KDIR)/vmlinux.$(KERNEL_FILE_TYPE) $(TARGET_DIR)
	cp $(BIN_DIR)/brcm-cfe/cfe$(BRCM_CHIP)ram.bin $(TARGET_DIR)/cferam.000
	touch -a -m -t 197001010000.00 $(TARGET_DIR)/cferam.000
endif

ifneq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_502L0X)),)
	# Copy the *.dtb file from SDK into rootfs and make sure the timestamp will not changed.
	rsync -av $(DTB_FILE) $(TARGET_DIR)/
	touch -a -m -t 197001010000.00 $(TARGET_DIR)/$(BRCM_DTB)
endif

	$(call Image/mkfs/prepare/default)
ifneq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_416L04) $(CONFIG_BRCM963xx_SDK_VER_416L05) $(CONFIG_BRCM963xx_SDK_VER_502L0X)),)
	#in 416L04,416L05, check if we need to do below action?
	#find $INSTALL_DIR -type f -perm /u=x,g=x,o=x -print |xargs -L1 $EXECSTACK -c 2> /dev/null
endif

endef

define Image/Prepare
	# Using BCM proprietary tool "cmplzma" to compress vmlinux
ifneq ($(call qstrip,$(CONFIG_BRCM963xx_SDK_VER_416L04) $(CONFIG_BRCM963xx_SDK_VER_416L05) $(CONFIG_BRCM963xx_SDK_VER_502L0X)),)
	$(HOSTTOOLS_DIR)/cmplzma -k -2 -$(KERNEL_COMPRESSION) $(KDIR)/vmlinux.elf $(KDIR)/vmlinux $(KDIR)/vmlinux.$(KERNEL_FILE_TYPE)
else
	$(HOSTTOOLS_DIR)/cmplzma -k -2 $(KDIR)/vmlinux.elf $(KDIR)/vmlinux $(KDIR)/vmlinux.$(KERNEL_FILE_TYPE)
endif

endef

define Image/Build
	$(call Image/Build/CFE,$(1),$(BCM_BOARD_NAME),$(BRCM_CHIP),$(BOARDNAME))
endef

$(eval $(call BuildImage))
