# ===========================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Copyright (c) 2012-2016, Marvell International Ltd.
#
# Alternatively, this software may be distributed under the terms of the GNU
# General Public License Version 2, and any use shall comply with the terms and
# conditions of the GPL.  A copy of the GPL is available at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
# IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
# ARE EXPRESSLY DISCLAIMED.  The GPL license provides additional details about
# this warranty disclaimer.
# ================================================================================


# Makefile for scantask as linux kernel module. 
# Builds for both 6120 and 6170.
# davep 17-Jul-2012
#
# Split code into two trees: oem and common. Build is out of oem tree.
# davep 29-Aug-2012
#

# relative paths
COMMON_SCAN=../../../common/scan
YOCTO_SCAN_INCLUDES = =/usr/include/kernel/scan
BUILDROOT=../../..

# list of things to build
obj-m := kscantask.o kscanman.o qsort.o scansb.o

# configure the scan build
ARCH=arm 
HOSTCC="/usr/bin/gcc" 
CROSS_COMPILE="arm-marvell-linux-gnueabi-"
GRANITE2=1

#SCAN_MECH ?= MECH_NULL
SCAN_MECH ?= MARVELL_GRANUM2

ifndef SYSROOT
    ifdef YOCTO_ROOT
        SYSROOT = $YOCTO_ROOT/poky/build/tmp/sysroots/granite2
    else
        $(warning You may need to define YOCTO_ROOT to build successfully)
    endif
endif

DROS_PATH ?= =/usr/include/kernel/dros
DMA_ALLOC_PATH_KERNEL ?= =/usr/include/kernel/dmaalloc

# Add fakescan, an interface to interact with scanman as if we were scanning
# real data.
SCAN_FAKESCAN=1

# Uncomment to enable the scanalyzer
#SCANALYZER=1

# uncomment to include my test code
SCAN_TEST_CODE=1

# uncomment to make icefile available for testing
HAVE_SCAN_ICEFILE_SUPPORT=1

# Define SCAN_HIQ to include host-side scan image quality (siqfile) support.
# A siqfile contains settings to manipulate the various settings, tables, etc,
# in the scan path (e.g., PIE LUTs). (HIQ == "Host Image Quality")
SCAN_HIQ=1

# start building the file list
kscantask-y := 
kscanman-y :=

ccflags-y := -I$(src)/$(COMMON_SCAN)/include\
             -I$(src)/$(COMMON_SCAN)/src\
             -I$(src)/$(COMMON_SCAN)/lsp/kernel/include\
             -I$(DROS_PATH)\
             -I$(DMA_ALLOC_PATH_KERNEL)

ifdef EXTERNAL_SCAN_PATH
    ccflags-y += -I$(EXTERNAL_SCAN_PATH)/drivers/cisx          \
                 -I$(EXTERNAL_SCAN_PATH)/drivers/pic           \
                 -I$(EXTERNAL_SCAN_PATH)/drivers/icetest       \
                 -I$(EXTERNAL_SCAN_PATH)/drivers/scanblk       \
                 -I$(EXTERNAL_SCAN_PATH)/drivers/afe           \
                 -I$(EXTERNAL_SCAN_PATH)/drivers/pie           
else
    ccflags-y += -I$(YOCTO_SCAN_INCLUDES)
endif



SRC = scan.c scanif.c pic.c safeint.c icetest.c picdma_descrip.c \
                scands.c strtable.c ostools.c\
		cisx.c ddma.c icedma.c picpcdma_descrip.c scantools.c scancmdq.c \
		scanmech.c scandbg.c scanimg.c pie.c piedma.c piemsdma.c strippr.c\
		safetylock.c scanpipe.c scanlib.c fwmargin.c \
		icefilter.c pipecut.c scancap.c chipgap.c adfpath.c adfgapper.c \
		scanvars.c fraction.c scanlog.c scanmargin.c \
                scantask.c taskqueue.c cmdline.c pic_common.c scanlib_msg.c\
                notaheap.c piemux.c stripdma.c pipemap.c scos_kernel.c \
                picchipgap.c scansen-common.c

CAL=cal_common.c cal_digital_correction.c cal_gardenia.c \
    cal_analog_H.c calcaplist.c findcalstrip.c
SRC+=$(CAL)

SRC += scanpower-stub.c

# test code 
ifdef SCAN_TEST_CODE
    SRC += icetesttest.c pictest_common.c pictest_3bdr.c picdma_descrip_test.c \
	    cisxtest.c scantest.c scanlibtest.c scanvarstest.c stripdmatest.c
    CFLAGS_MODULE+=-DHAVE_SCAN_TEST_CODE
endif

ifdef SCAN_HIQ
    SRC += lex.yy.c siqnames.c siqdata.c scanvarsiq.c
    CFLAGS_MODULE += -DHAVE_SCANHIQ_SUPPORT
endif

HAVE_NETWORK=1
ifdef HAVE_NETWORK
    CFLAGS_MODULE += -DHAVE_NETWORK
    KERNEL_SRC += scannet.c pipenet.c siqnet.c
endif

# davep 12-Sep-2012 ; we have a command line now!
CFLAGS_MODULE+=-DHAVE_DBG_CALLBACK_CMDS
SRC+=scos_cmd_proc.c

ifdef SCAN_FAKESCAN
    SRC += fakescan.c
    CFLAGS_MODULE+=-DHAVE_FAKESCAN_SUPPORT
endif

# optional utility code
ifdef SCANALYZER
    SRC += scanalyzer.c
    CFLAGS_MODULE += -DHAVE_SCANALYZER_SUPPORT
    # scanalyzer.c wants HAVE_CMD
    CFLAGS_MODULE += -DHAVE_CMD
endif


ifdef GRANITE2
    HAZ_ASIC=1
#    SRC += picmarg.c picbm.c scanif_mcfg.c scanif_led_2sen.c piedma2005.c
    SRC += picmarg.c scanif_mcfg.c scanif_led_2sen.c piedma_descrip.c

    ccflags-y += -I$(src)/../../../asic/G2/include/ \
                 -I$(src)/$(COMMON_SCAN)/src/asic/granite2 

    # tell scan code we are little endian
    CFLAGS_MODULE+=-DASP_ON_LITTLE_ENDIAN
endif

#$(error $(SRC))

ifndef HAZ_ASIC
    $(error no can haz ASIC?)
endif


SCANMECH_SRC=

# This make file defines the scan mech
ifeq ($(SCAN_MECH), MECH_NULL)
    CFLAGS_MODULE+=-DNULL_MECH_DRIVER
    CFLAGS_MODULE+=-DHAVE_SCANSEN_STUB
    SRC += scanmech_null.c 
    SRC += adfsensor_stub.c
    SCANMECH_SRC += scanplat_generic.c
    SCANMECH_SRC += scansen-generic.c
    KNOWN_SCAN_MECH=1

    scansb-y += scanplat_sb_generic.o
endif

ifeq ($(SCAN_MECH), MARVELL_GRANUM2)
    STEPPER_MTR_DRV_PATH ?= =/usr/include/kernel/stepper
    ccflags-y += -I$(STEPPER_MTR_DRV_PATH)

    CFLAGS_MODULE+=-DSCAN_MECH_GRANUM2

    # Mech driver files
    SCANMECH_SRC += adfsensor_granum2.c
    SCANMECH_SRC += scanmech_granum2.c 

    SCANMECH_SRC += scanplat_granum2.c
    SCANMECH_SRC += scansen-granum2.c
    KNOWN_SCAN_MECH=1

    scansb-y += scanplat_sb_granum2.o
    scansb-y += $(COMMON_SCAN)/lsp/kernel/src/lassert.o

    obj-y += ../afe/wm8213/
    ccflags-y += -I$(src)/../afe/wm8213/
endif

ifndef KNOWN_SCAN_MECH
    $(error $(SCAN_MECH) You need some kind of known scan mech)
endif

SCANTASK_KERNEL_SRC=scantask_linux.c scanmem_linux.c list.c mem_linux.c\
    str_linux.c lassert.c test_stubs.c str_linux.c\
    cpu_linux.c scannet.c pipenet.c icetest_linux.c hw_linux.c float_linux.c\
    stubs_linux.c

ifdef HAVE_SCAN_ICEFILE_SUPPORT
    CFLAGS_MODULE += -DHAVE_SCAN_ICEFILE_SUPPORT
    SCANTASK_KERNEL_SRC += icefileapp_linux.c
endif

# convert all weird paths to something kbuild can find
kscantask-y += $(SRC:%.c=$(COMMON_SCAN)/src/%.o)
kscantask-y += $(SCANTASK_KERNEL_SRC:%.c=$(COMMON_SCAN)/lsp/kernel/src/%.o)
kscantask-y += libfloat.a
kscantask-y += $(SCANMECH_SRC:%.c=%.o)

# linux specific code 
SCANMAN_KERNEL_SRC=scanman_linux.c mem_linux.c str_linux.c stubs_linux.c lassert.c 

kscanman-y += $(SCANMAN_KERNEL_SRC:%.c=$(COMMON_SCAN)/lsp/kernel/src/%.o)
kscanman-y += $(COMMON_SCAN)/src/scanlog.o
kscanman-y += $(COMMON_SCAN)/src/notaheap.o
kscanman-y += $(COMMON_SCAN)/src/scos_kernel.o

ifdef HAVE_SCAN_ICEFILE_SUPPORT
obj-m += icefile.o

ICEFILE_KERNEL_SRC=icefile_linux.c
ICEFILE_SRC = scanlog.c scos_kernel.c

icefile-y := $(ICEFILE_KERNEL_SRC:%.c=$(COMMON_SCAN)/lsp/kernel/src/%.o)
icefile-y += $(ICEFILE_SRC:%.c=$(COMMON_SCAN)/src/%.o)
endif


HAVE_PIC_CTRL_SUPPORT = 1
ifdef HAVE_PIC_CTRL_SUPPORT
obj-m += pic_ctrl.o
PIC_CTRL_KERNEL_SRC = pic_linux.c
pic_ctrl-y:= $(PIC_CTRL_KERNEL_SRC:%.c=$(COMMON_SCAN)/lsp/kernel/src/%.o)
endif

#$(error $(kscantask-y))

# Quicksort. Required by calibration.
qsort-y := $(COMMON_SCAN)/lsp/kernel/src/qsort.o

CFLAGS_MODULE += -DDEBUG
CFLAGS_MODULE += -DHAVE_SCANLEDEXP_CAL

# Use external values for PRNU/DSNU rather than internal cal algorithm
CFLAGS_MODULE += -DPD_USE_EXTERNAL_VALS

# block agMessage.h from being included in core scan code (firewall)
CFLAGS_MODULE += -D__AGMESSAGE_H__

$(obj)/libfloat.a:
	make -C $(src)/$(COMMON_SCAN)/lsp/kernel/libfloat CROSS_COMPILE=$(CROSS_COMPILE) clean all
	cp $(src)/$(COMMON_SCAN)/lsp/kernel/libfloat/libfloat.a $(src)/.

mkdist:
	@python mkdist.py $(kscantask-y:.o=.c) $(kscanman-y:.o=.c) $(qsort-y:.o=.c) $(scansb-y:.o=.c)
ifdef HAVE_SCAN_ICEFILE_SUPPORT
	@python mkdist.py $(icefile-y:.o=.c)
endif


