################################################################################

SHELL             := /bin/bash
PWD                = $(shell pwd)
HW_CROSS_COMPILE   = $(CROSS_COMPILE)
BOOT_TOPDIR       ?= $(PWD)/../../../../../
BOOT_OUTDIR       ?= $(BOOT_TOPDIR)

include $(BOOT_OUTDIR)/include/autoconf.mk
include $(BOOT_OUTDIR)/include/config/auto.conf

GZIP              ?= $(if $(wildcard $(BOOT_TOPDIR)/../../../tools/utils/bin/gzip), $(BOOT_TOPDIR)/../../../tools/utils/bin/gzip, $(BOOT_TOPDIR)/tools/gzip)
SOC               := xmorca
SRCDIR            := $(PWD)

################################################################################
CC       := $(HW_CROSS_COMPILE)gcc
AR       := $(HW_CROSS_COMPILE)ar
LD       := $(HW_CROSS_COMPILE)ld
OBJCOPY  := $(HW_CROSS_COMPILE)objcopy


################################################################################
.PHONY: all $(BOOT).bin
BOOT     := u-boot
TEXTBASE := $(CONFIG_SYS_TEXT_BASE_ORI)

CFLAGS   :=-Os -fno-builtin -ffreestanding \
	-D__KERNEL__ -DTEXT_BASE=$(TEXTBASE) \
	-I$(BOOT_TOPDIR)/include \
	-I$(BOOT_OUTDIR)/include \
	-I$(BOOT_TOPDIR)/arch/arm/include \
	-I$(BOOT_TOPDIR)/lib/hw_dec \
	-fno-pic -ffunction-sections \
	-fdata-sections -fno-common -ffixed-r9    \
	-fno-common -pipe -march=armv7-a \
	-Wall -Wstrict-prototypes -fno-stack-protector \
	-D__LINUX_ARM_ARCH__=7 -D__ARM__ \
	-DCONFIG_MMC\
	$(MKFLAGS) -fno-strict-aliasing \
	$(EXTRA_CFLAGS) \


UBOOT_Z_LDS := u-boot.lds

################################################################################

START := start.o
COBJS := uart.o \
	startup.o \
	image_data.o \
	reset.o \
	exceptions.o \
	time.o \
	tail.o

SSRC  := \
	lotus/hw_dec/hw_decompress.c \
	lotus/hw_dec/hw_decompress_$(SOC).c \
	lotus/hw_dec/hw_decompress_v1.c \
	lotus/hw_dec/hw_decompress_v1.h \

SRC := $(notdir $(SSRC))

REG := $(wildcard *.reg .reg)
IMAGE_DATA_Z := image_data.gzip

CFLAGS += -DCONFIG_BOOTREG_DEFAULT=\"$(BOOT_OUTDIR)/.reg\"
CFLAGS += -DCONFIG_AUXIMAGE=\"$(SRCDIR)/auxcode$(if $(CONFIG_LOTUS_FPGA),_fpga,).bin\"
CFLAGS += -DCONFIG_AUXCODE_2048_ENABLE=y

CFLAGS += -DCONFIG_MCU_FW_IMAGE=\"$(if $(wildcard $(BOOT_OUTDIR)/qs_mcu.bin),$(BOOT_OUTDIR)/qs_mcu.bin,$(SRCDIR)/qs_mcu.bin)\"

################################################################################
.PHONY: all $(BOOT).bin
all: $(BOOT).bin
ifeq ($(CONFIG_BOOT_CONSOLE_OPTIONAL),y)
$(BOOT).bin: $(BOOT).tmp
	$(Q)cp $(CONFIG_BOOTSTRAP_IMAGE) bootstrap.bin
	$(Q)BOOTSTRAP_SIZE=$$(stat -c%s bootstrap.bin); \
		printf "%08x" $$BOOTSTRAP_SIZE | tac -rs .. | xxd -r -p > middleware.bin; \
		dd if=/dev/zero bs=16 count=1 >> middleware.bin 2>/dev/null; \
		printf "%08x" 0xdeadbeef | tac -rs .. | xxd -r -p >> middleware.bin
	$(Q)cat $(BOOT).tmp middleware.bin bootstrap.bin > $(BOOT).bin
	$(Q)rm -f middleware.bin bootstrap.bin
	$(Q)chmod 754 $(BOOT).bin
	$(Q)cp -fv $@ $(BOOT_OUTDIR)/u-boot-$(SOC).bin
	$(Q)echo "$(BOOT).bin is Ready."
else
$(BOOT).bin: $(BOOT).tmp
	$(Q)cat $(BOOT).tmp > $(BOOT).bin
	$(Q)chmod 754 $(BOOT).bin
	$(Q)cp -fv $@ $(BOOT_OUTDIR)/u-boot-$(SOC).bin
	$(Q)echo $(BOOT).bin is Ready.
endif

$(BOOT).tmp: $(BOOT).elf
	$(OBJCOPY) -O srec $< $(BOOT).srec
	$(OBJCOPY) -j .text -O binary $< $(BOOT).text
	$(OBJCOPY) --gap-fill=0xff -O binary $< $@

$(BOOT).elf: $(IMAGE_DATA_Z) $(SRC) $(START) $(COBJS) $(UBOOT_Z_LDS)
	$(LD) -Bstatic -T $(UBOOT_Z_LDS) -Ttext $(TEXTBASE) $(START) \
		$(COBJS) -Map $(BOOT).map -o $@
	$(OBJDUMP) -d  $@ > $@.asm

.PHONY: regfile
regfile:
	@if [ "$(words $(REG))" = "0" ]; then ( \
		echo '***' Need '.reg' or '*.reg' file in directory $(PWD); \
		exit 1; \
	) fi
	@if [ "$(words $(REG))" != "1" ]; then ( \
		echo '***' Found multi '.reg' or '*.reg' file in directory $(PWD); \
		echo '***' Files: $(notdir $(REG)); \
		exit 1; \
	) fi

################################################################################
$(START): start.S regfile
	$(CC) -D__ASSEMBLY__ $(CFLAGS) -o $@ $< -c

# -1 : --fast      -9 : --best
$(IMAGE_DATA_Z): $(BINIMAGE)
ifneq ($(CONFIG_LOTUS_GZIP_BOOT),)
	$(GZIP) -fNqc -7 $< > $@
else
	cp $<  $@
endif

%.o: %.c
	$(CC) $(CFLAGS) -Wall -Wstrict-prototypes \
		-fno-stack-protector -o $@ $< -c

%.o: %.S
	$(CC) -D__ASSEMBLY__ $(CFLAGS) -o $@ $< -c

image_data.o: image_data.S $(IMAGE_DATA_Z)
	$(CC) -D__ASSEMBLY__ $(CFLAGS) -o $@ $< -c

#############################################################################

$(SRC):
	ln -sf $(BOOT_TOPDIR)/$(filter %/$@,$(SSRC)) $@
################################################################################
TMPS := $(COBJS) $(START) $(SRC) \
	$(BOOT).map $(BOOT).elf $(BOOT).elf.asm $(BOOT).srec $(BOOT).bin $(BOOT).text $(BOOT).tmp \
	$(IMAGE_DATA_Z)

cmd_rm_files = @echo 'RM $(1)';$(shell [[ -n "$(1)" && "$(1)" != "*" ]] && rm -f $(1))

.PHONY: clean distclean

distclean: clean
clean:
	$(call cmd_rm_files, $(REG))
	$(call cmd_rm_files, $(TMPS))
	$(call cmd_rm_files, $(SRC))

################################################################################
.PHONY: clean
FORCE:
################################################################################
