# -----------------------------------------------------------------------------
# Copyright (c) 2006
# Siemens Home and Office Communication Devices GmbH & Co. KG (SHC)
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# Author: Joerg Rensing
# Makefile include to generate a developer tree for the open-source parts
# of the project.
# -----------------------------------------------------------------------------

export

OS_NAME := $(shell uname -s | tr '[A-Z]' '[a-z]' )

TOPDIR := $(shell /bin/pwd)

VPATH := $(TOPDIR)

BUILD_VENDOR := y

# -----------------------------------------------------------------------------
CC	= $(CROSS_COMPILE)gcc
CPP     = $(CROSS_COMPILE)$(CC) -E
CXX	= $(CROSS_COMPILE)g++
HOSTCC	= $(CROSS_COMPILE)gcc
AR	= $(CROSS_COMPILE)ar
ASM	= $(CROSS_COMPILE)gcc -x assembler-with-cpp
AS	= $(CROSS_COMPILE)as
NM	= $(CROSS_COMPILE)nm
OBJCOPY	= $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
LD	= $(CROSS_COMPILE)ld
RANLIB	= $(CROSS_COMPILE)ranlib
STRIP	= $(CROSS_COMPILE)strip

AWK	= awk
PERL    = perl
DOXYGEN = doxygen

INSTALL = install
RM      = rm
RM_F    = rm -f
LN      = ln
MKDIR   = mkdir -p
CD	= cd
CP      = cp
MD5SUM  = md5sum
TOUCH   = touch
MV	= mv
SPLIT	= split
CAT	= cat
SED	= sed


# -----------------------------------------------------------------------------
CROSS_COMPILE    = arm-bb-elf-
GCC_VER          = 4.1.0

CFLAGS              =  -gdwarf-2  -g3  -fomit-frame-pointer -Wall -Wno-switch -Wno-missing-braces -Winline -Wcast-align -Wmissing-noreturn  -fno-show-column -Os -fno-gcse -fno-gcse-lm -fno-defer-pop -falign-functions=4  --param max-inline-insns-single=350  -fno-tree-pre -fno-keep-static-consts -ffreestanding -fshort-enums -mno-sched-prolog -fno-strict-aliasing -fsigned-char  -freg-struct-return -mcpu=arm7tdmi  -msoft-float  
AFLAGS              =  -g -fomit-frame-pointer -Wall -fno-show-column -Os -fno-gcse -fno-gcse-lm -fno-defer-pop -falign-functions=4  --param max-inline-insns-single=350  -fno-tree-pre -fno-keep-static-consts -ffreestanding -fshort-enums -mno-sched-prolog -fno-strict-aliasing -fsigned-char  -freg-struct-return -mcpu=arm7tdmi  -msoft-float  
ACPS_FLAGS_ARM      = -mlong-calls 
ACPS_FLAGS_ARM_IW   = -mthumb-interwork -mlong-calls 
ACPS_FLAGS_THUMB    = -mthumb -mlong-calls 
ACPS_FLAGS_THUMB_IW = -mthumb -mthumb-interwork -mlong-calls 
ACPS_FLAGS_DEFAULT  = -mthumb -mlong-calls 
DEFS                = -DMACH_CHAGALL_BS=1 -DARCH_arm=1 -DOS_none=1 -DCONFIG_BOARD_CHAGALL_BS=B1_AMSTERDAM -DVERSION_MAJOR=0 -DVERSION_MINOR=0 -DVERSION_MICRO=1 -DVERSION_SPECIAL="" -DDATE="`date +%y-%m-%d_%H:%M`"  -D__arm -DHW -DEMU -DNODUM_dr_iic_interrupt -DNODUM_p_dr_key_interrupt -DGP_TARGET=1 -DBMP=0x0200 -DNODUM_p_dsp_fsihandler -DNODUM_p_bm17_LoadTBuf -DNODUM_p_bm17_GetRBuf -DNODUM_p_bm16_XCUHandlerRFCUInt -DNODUM_p_bm14_SlotHandlerSafe -DNODUM_p_bm16_XCUHandlerRCUInt -DNODUM_p_bm18_Next -DNODUM_p_bm14_SlotHandler -DNODUM_p_mac_RcuIRQHandler -DNODUM_p_mac_TcuIRQHandler -DNODUM_p_mac_McuIRQ0Handler -DNODUM_p_mac_McuIRQ1Handler -DNODUM_p_dr_timer0_interrupt -DNODUM_p_dr_timer1_interrupt -DNODUM_p_dfac_Interrupt -DNODUM_p_spi_Interrupt -DNODUM_p_gpio_Interrupt -DNODUM_p_dsp_tmu0handler -DNODUM_p_dsp_tmu1handler -DNODUM_p_svm_Interrupt -DTARGET -DDAFLAGS=0x00000000 -DDAXSLL_IRQS_S=0x0080C000 -DDAXSLL_IRQS_R=SYS0_ICU_INT_IIC_IRQ -DSVM_PWR_FAIL=0 -DDAFEATURES=0x2282008 -DDAAFEATURES=0x200 -DDSP_MSG_CB_FEATURE -DDSPA_FW_VERSION=DSPA_FW_BB_F -DTEST_AUDIOC_G729 -DDA_MAX_TOG=9 -DDSI_USE_DRT_CODEC=3 -DDSP_MAX_B_FIELD_BUF_HANDLER=4 -DDA_FLD_MEMTYPE_ARMROM=DSP_FLX_MEMTYPE_ARM -DWORKAROUND_DAIF -DARM7 -DVegaBB -DOM6116 -D__linux__ -DDECT_BS -DHW_BOARD=1 -DCONFIG_TXT_IO_PORT_JTAG=1 -D_STANDALONE_=1
INCLUDES            = -I . -I $(VPATH) -I  $(TOPDIR)/open/src -I  $(TOPDIR)/open/src/config -I  $(TOPDIR)/open/src/include -I  $(TOPDIR)/open/src/global -I  $(TOPDIR)/open/src/philips/common -I  $(TOPDIR)/open/src/philips/dsp -I  $(TOPDIR)/open/src/philips/dsp/fgt -I  $(TOPDIR)/open/src/philips/bmp -I  $(TOPDIR)/open/src/ip_stack/libosip/include -I  $(TOPDIR)/open/src/ip_stack/libosip/src/osipparser2 

LDFLAGS      =  --no-warn-mismatch --accept-unknown-input-arch -nostdlib  --relax -O1 --gc-sections  -Tlinkmap.ld -Bstatic
LDSEARCHDIRS =  -L/usr/local/arm-bb-tools/lib/gcc/arm-bb-elf/4.1.0/thumb/interwork -L/usr/local/arm-bb-tools/arm-bb-elf/lib/thumb/interwork -L$(TOPDIR)/vendor/lib -L$(TOPDIR)/open/lib

OBJCOPY_STRIP_FLAGS = -S 
OBJCOPY_XFLAGS1     = -j .text -j .data
OBJCOPY_XFLAGS2     = -j .xtext -j .xdata
OBJCOPY_PAD_FLAGS1  = 
OBJCOPY_PAD_FLAGS2  = 

# -----------------------------------------------------------------------------
TARGET_NAME  = chagall_bs_amsterdam

SUBDIRS      = $(TOPDIR)/open/src/ip_stack/libosip

BOOT_OBJS    = 
BOOT_LIBS    = $(TOPDIR)/vendor/lib/boot.a $(TOPDIR)/vendor/lib/main_libc-adapt.a
SYM_LIBS     = $(TOPDIR)/vendor/lib/dectbmpv200.sym2elf.o
VENDOR_LIBS  = $(TOPDIR)/vendor/lib/libcds77dsp.weak.a $(TOPDIR)/vendor/lib/main.a $(TOPDIR)/vendor/lib/philips.a $(TOPDIR)/vendor/lib/sc_ft.a $(TOPDIR)/vendor/lib/sc_hw_driver_adc.a $(TOPDIR)/vendor/lib/sc_hw_driver_dsp.a $(TOPDIR)/vendor/lib/sc_hw_driver_io.a $(TOPDIR)/vendor/lib/sc_hw_driver_port.a $(TOPDIR)/vendor/lib/sc_lib.a $(TOPDIR)/vendor/lib/sc_middleware_cradle.a $(TOPDIR)/vendor/lib/sc_middleware_busses_extbus.a $(TOPDIR)/vendor/lib/sc_middleware_busses_i2c_api.a $(TOPDIR)/vendor/lib/sc_middleware_busses_v24.a $(TOPDIR)/vendor/lib/sc_middleware_lan.a $(TOPDIR)/vendor/lib/sc_middleware_dsp_rc.a $(TOPDIR)/vendor/lib/sc_middleware_line.a $(TOPDIR)/vendor/lib/sc_middleware_messages_prc.a $(TOPDIR)/vendor/lib/sc_middleware_nvm_pers.a $(TOPDIR)/vendor/lib/sc_middleware_service_patchman.a $(TOPDIR)/vendor/lib/sc_middleware_service_service_func.a $(TOPDIR)/vendor/lib/sc_middleware_service_tstsup.a $(TOPDIR)/vendor/lib/sc_middleware_system.a $(TOPDIR)/vendor/lib/sc_middleware_user_io_led.a $(TOPDIR)/vendor/lib/sc_middleware_user_io_dispdrv.a $(TOPDIR)/vendor/lib/sc_middleware_user_io_keyscan.a $(TOPDIR)/vendor/lib/sc_monitor.a $(TOPDIR)/vendor/lib/sc_uhr.a $(TOPDIR)/vendor/lib/app.a $(TOPDIR)/vendor/lib/app_audio.a $(TOPDIR)/vendor/lib/app_ip.a $(TOPDIR)/vendor/lib/pform_bs_bep.a $(TOPDIR)/vendor/lib/dect_b.a $(TOPDIR)/vendor/lib/clip.a $(TOPDIR)/vendor/lib/dummy.a $(TOPDIR)/vendor/lib/global.a $(TOPDIR)/vendor/lib/lib.a $(TOPDIR)/vendor/lib/lv.a $(TOPDIR)/vendor/lib/os.a $(TOPDIR)/vendor/lib/os_prozesse.a $(TOPDIR)/vendor/lib/pform_bs.a $(TOPDIR)/vendor/lib/general_version.a $(TOPDIR)/vendor/lib/sms.a $(TOPDIR)/vendor/lib/swte.a $(TOPDIR)/vendor/lib/sys_cnf.a $(TOPDIR)/vendor/lib/toos.a $(TOPDIR)/vendor/lib/topos_v2.a $(TOPDIR)/vendor/lib/tracer.a $(TOPDIR)/vendor/lib/pform_bs_v_stacks.a $(TOPDIR)/vendor/lib/tool.a $(TOPDIR)/vendor/lib/app_bs_menu.a $(TOPDIR)/vendor/lib/app_bs_al.a $(TOPDIR)/vendor/lib/app_bs_display.a $(TOPDIR)/vendor/lib/app_bs_sec.a $(TOPDIR)/vendor/lib/app_bs_cryptaes.a $(TOPDIR)/vendor/lib/v_srds.a $(TOPDIR)/vendor/lib/v_srds_bafe_app.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_bof.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_bof_connect.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_bof_edit.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_bof_idle.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_ctrl.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_ctrl_editctrl.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_daten.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_iwu.a $(TOPDIR)/vendor/lib/v_srds_bafe_app_key.a $(TOPDIR)/vendor/lib/app_display.a $(TOPDIR)/vendor/lib/ip_stack_http.a $(TOPDIR)/vendor/lib/ip_stack_rtp.a $(TOPDIR)/vendor/lib/ip_stack_sdp.a $(TOPDIR)/vendor/lib/ip_stack_sip.a $(TOPDIR)/vendor/lib/ip_stack_socket.a $(TOPDIR)/vendor/lib/ip_stack_stun.a $(TOPDIR)/vendor/lib/ip_stack_osipadap.a
ifeq ($(BUILD_VENDOR), y)
OPEN_LIBS    = $(TOPDIR)/vendor/lib/ip_stack_libosip.a
else
OPEN_LIBS    = $(TOPDIR)/open/src/ip_stack/libosip/ip_stack_libosip.a
endif
GLOBAL_LIBS  =  -lgcc -lc  

# -----------------------------------------------------------------------------
TARGET_IMGE_PAD_END_ADDR_001	:= 0x000C0000
TARGET_IMGE_PAD_END_ADDR_002	:= 0x0007FFFE # 0x00080000 - 2 bytes for crc
CRC_TOOL			:= $(TOPDIR)/vendor/bin/tools/build/gnu/i386_$(OS_NAME)/giga_crc16
DOWNLOAD_IMAGE_NAME		:= chagall_bs_download_image

# -----------------------------------------------------------------------------
TARGET_NAME.elf : link

# -----------------------------------------------------------------------------
.PHONY: all
all : $(TARGETS)

# -----------------------------------------------------------------------------
TARGET_NAME.elf : $(DOWNLOAD_IMAGE_NAME).bin

# -----------------------------------------------------------------------------
$(OPEN_LIBS) :
	@echo "***"
	@echo "build subdirs..."
	@echo "$@ : $^"
	@echo "***"
	$(foreach d, $(SUBDIRS), \
	$(MAKE) all -C $(d); \
	)

# -----------------------------------------------------------------------------
$(DOWNLOAD_IMAGE_NAME).bin : link
	@echo "***"
	@echo "doing download_image_bind..."
	@echo "$@ : $^"
	@echo "***"

	$(Q)$(OBJCOPY) --set-start 0x0 --pad-to $(TARGET_IMGE_PAD_END_ADDR_001) --gap-fill 0xFF -I binary -O binary $(TARGET_NAME).001.bin $(TARGET_NAME).001.rel
	$(Q)$(OBJCOPY) --set-start 0x0 --pad-to $(TARGET_IMGE_PAD_END_ADDR_002) --gap-fill 0xFF -I binary -O binary $(TARGET_NAME).002.bin $(TARGET_NAME).002.rel

#	# --- concat all...
	$(Q)$(CAT) $(TARGET_NAME).001.rel $(TARGET_NAME).002.rel > $(DOWNLOAD_IMAGE_NAME).rel
#	# --- append checksum...
	$(Q)$(CRC_TOOL) < $(DOWNLOAD_IMAGE_NAME).rel > $(DOWNLOAD_IMAGE_NAME).bin

#	# --- remove tmps...
	$(Q)$(RM_F) \
		$(TARGET_NAME).001.bin \
		$(TARGET_NAME).002.bin \
		$(TARGET_NAME).001.rel \
		$(TARGET_NAME).002.rel \
		$(DOWNLOAD_IMAGE_NAME).rel

	@echo "--------------------------------"
	@echo "ok! download_image_bind ready..."
	@echo "--------------------------------"

# -----------------------------------------------------------------------------
.PHONY : link
link : $(BOOT_OBJS) $(BOOT_LIBS) $(SYM_LIBS) $(VENDOR_LIBS) $(OPEN_LIBS) linkmap.ld
	@echo "***"
	@echo "linking ..."
	@echo "$@ : $^"
	@echo "***"
	rm -f	*.elf \
		*.bin \
		*.nm \
		*.objdump \
		*.map
# # Link via ld...
	$(LD) -v $(LDFLAGS) $(LDSEARCHDIRS) \
		$(BOOT_OBJS) \
		--whole-archive \
		$(BOOT_LIBS) \
		--just-symbols=$(SYM_LIBS) \
		--no-whole-archive \
		--start-group \
		$(VENDOR_LIBS) \
		$(OPEN_LIBS) \
		$(GLOBAL_LIBS) \
		--end-group \
		--cref -Map $(TARGET_NAME).map \
		-o $(TARGET_NAME).elf

#	# ----------------------------------------------------------------------------------------------
	$(OBJCOPY) -O binary $(OBJCOPY_XFLAGS1) $(OBJCOPY_STRIP_FLAGS) $(OBJCOPY_PAD_FLAGS1) $(TARGET_NAME).elf $(TARGET_NAME).001.bin
	$(OBJCOPY) -O binary $(OBJCOPY_XFLAGS2) $(OBJCOPY_STRIP_FLAGS) $(OBJCOPY_PAD_FLAGS2) $(TARGET_NAME).elf $(TARGET_NAME).002.bin

#	# ----------------------------------------------------------------------------------------------
	-$(NM) -v -l -S $(TARGET_NAME).elf > $(TARGET_NAME).nm
	$(OBJDUMP) -t $(TARGET_NAME).elf | sort > $(TARGET_NAME).objdump

	@echo "-----------------------"
	@echo "ok! link ready..."
	@echo "-----------------------"

# -----------------------------------------------------------------------------
clean :
	@echo "***"
	@echo "clean..."
	@echo "$@ : $^"
	@echo "***"
	$(foreach d, $(SUBDIRS), \
	$(MAKE) clean -C $(d); \
	)

	$(Q)$(RM_F)	*.o \
		*.elf \
		*.bin \
		*.gdb \
		$(TARGET_NAME) \
		*.nm \
		*.objdump \
		*.map

# EOF

