/******************************************************************************
Copyright (c) [2012 - 2017] Texas Instruments Incorporated

All rights reserved not granted herein.

Limited License.

 Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
 license under copyrights and patents it now or hereafter owns or controls to
 make,  have made, use, import, offer to sell and sell ("Utilize") this software
 subject to the terms herein.  With respect to the foregoing patent license,
 such license is granted  solely to the extent that any such patent is necessary
 to Utilize the software alone.  The patent license shall not apply to any
 combinations which include this software, other than combinations with devices
 manufactured by or for TI ("TI Devices").  No hardware patent is licensed
 hereunder.

 Redistributions must preserve existing copyright notices and reproduce this
 license (including the above copyright notice and the disclaimer and
 (if applicable) source code license limitations below) in the documentation
 and/or other materials provided with the distribution

 Redistribution and use in binary form, without modification, are permitted
 provided that the following conditions are met:

 * No reverse engineering, decompilation, or disassembly of this software
   is permitted with respect to any software provided in binary form.

 * Any redistribution and use are licensed by TI for use only with TI Devices.

 * Nothing shall obligate TI to provide you with source code for the software
   licensed and provided to you in object code.

 If software source code is provided to you, modification and redistribution of
 the source code are permitted provided that the following conditions are met:

 * Any redistribution and use of the source code, including any resulting
   derivative works, are licensed by TI for use only with TI Devices.

 * Any redistribution and use of any object code compiled from the source code
   and any resulting derivative works, are licensed by TI for use only with TI
   Devices.

 Neither the name of Texas Instruments Incorporated nor the names of its
 suppliers may be used to endorse or promote products derived from this software
 without specific prior written permission.

 DISCLAIMER.

 THIS SOFTWARE IS PROVIDED BY TI AND TIS LICENSORS "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 TI AND TIS LICENSORS 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.
******************************************************************************/


/*******************************************************************************
 *  INCLUDE FILES
 *******************************************************************************
 */
#include <include/common/chains_radar.h>
#include <ti/drv/vps/include/devices/bsp_ar12xx.h>
#include <src/rtos/utils_common/include/utils_mcspi.h>
#include <src/rtos/utils_common/include/utils_uart.h>
#include <src/rtos/utils_common/include/utils_dma.h>
#include <ti/drv/vps/examples/utility/bsputils_ub960.h>

/* ========================================================================== */
/*                           Macros & Typedefs                                */
/* ========================================================================== */
#define CHAINS_RADAR_NUM_RX_ANTENNA (4U)
//#define CHAINS_RADAR_NUM_RX_ANTENNA (1U)		
/* Note: Binary Phase Modulation is enabled when Number of Tx Antenna is 3 */
//#define CHAINS_RADAR_NUM_TX_ANTENNA (2U)
#define CHAINS_RADAR_NUM_TX_ANTENNA (3U)		

/** \brief Number of antennas Rx times tx*/
#define CHAINS_RADAR_NUM_ANTENNA (CHAINS_RADAR_NUM_RX_ANTENNA * \
                                    CHAINS_RADAR_NUM_TX_ANTENNA)

/** \brief MCSPI Instance Number used to communicate with the radar sensor */
#define CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST0 (0U)
#define CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST1 (1U)

/* Uncomment below to enable synthetic input from the AR12x sensor. Kindly note
 * Test source is not available when CHAINS_RADAR_NUM_TX_ANTENNA > 1 */
/* #define ENABLE_TEST_SOURCE */
//#define ENABLE_TEST_SOURCE		//Modified by HW  20170818

/** \brief Radar Sensor Height */
#define AR1243_RADAR_HEIGHT   (128U)

/** \brief Radar Sensor width */
#define AR1243_PROFILE1_RADAR_WIDTH   (256U)

/** \brief Radar Sensor width */
#define AR1243_PROFILE2_RADAR_WIDTH   (512U)

/** \brief Name of the configuration used */
#define CHAINS_AR1243_CONFIG_NAME "CHAINS_CAPT_FFT_DISP"

/** \brief CSI Data Rate for data transfer from AR12xx
 *         Valid Values are
 *         150 (for 150 Mbps)
 *         300 (for 300 Mbps)
 *         400 (for 400 Mbps)
 *         450 (for 450 Mbps)
 *         600 (for 600 Mbps)
 */
#define CHAINS_AR1243_CSI_DATA_RATE (300U)

#if (CHAINS_AR1243_CSI_DATA_RATE == (150U))
    /** \brief CSI Data rate value set in the AR12 parameters */
    #define CHAINS_AR1243_CSI_DATA_RATE_VALUE (6)       /* 150 Mbps */
    /** \brief CSI High speed clock set in the AR12 parameters */
    #define CHAINS_AR1243_DDR_HSI_CLK         (0xB)     /* 150 Mbps */
    /** \brief ISS CSI clock paramter set */
    #define CHAINS_AR1243_ISS_CSI_CLK         (75U)     /* 150 Mbps */
#elif (CHAINS_AR1243_CSI_DATA_RATE == (300U))
    /** \brief CSI Data rate value set in the AR12 parameters */
    #define CHAINS_AR1243_CSI_DATA_RATE_VALUE (4)       /* 300 Mbps */
    /** \brief CSI High speed clock set in the AR12 parameters */
    #define CHAINS_AR1243_DDR_HSI_CLK         (0xA)     /* 300 Mbps */
    /** \brief ISS CSI clock paramter set */
    #define CHAINS_AR1243_ISS_CSI_CLK         (150U)    /* 300 Mbps */
#elif (CHAINS_AR1243_CSI_DATA_RATE == (400U))
    /** \brief CSI Data rate value set in the AR12 parameters */
    #define CHAINS_AR1243_CSI_DATA_RATE_VALUE (3)       /* 400 Mbps */
    /** \brief CSI High speed clock set in the AR12 parameters */
    #define CHAINS_AR1243_DDR_HSI_CLK         (0x1)     /* 400 Mbps */
    /** \brief ISS CSI clock paramter set */
    #define CHAINS_AR1243_ISS_CSI_CLK         (200U)    /* 400 Mbps */
#elif (CHAINS_AR1243_CSI_DATA_RATE == (450U))
    /** \brief CSI Data rate value set in the AR12 parameters */
    #define CHAINS_AR1243_CSI_DATA_RATE_VALUE (2)       /* 450 Mbps */
    /** \brief CSI High speed clock set in the AR12 parameters */
    #define CHAINS_AR1243_DDR_HSI_CLK         (0x5)     /* 450 Mbps */
    /** \brief ISS CSI clock paramter set */
    #define CHAINS_AR1243_ISS_CSI_CLK         (225U)    /* 450 Mbps */
#elif (CHAINS_AR1243_CSI_DATA_RATE == (600U))
    /** \brief CSI Data rate value set in the AR12 parameters */
    #define CHAINS_AR1243_CSI_DATA_RATE_VALUE (1)       /* 600 Mbps */
    /** \brief CSI High speed clock set in the AR12 parameters */
    #define CHAINS_AR1243_DDR_HSI_CLK         (0x9)     /* 600 Mbps */
    /** \brief ISS CSI clock paramter set */
    #define CHAINS_AR1243_ISS_CSI_CLK         (300U)    /* 600 Mbps */
#else
    #warn "CHAINS_AR1243: No valid data rate specified!!"
#endif

/**
 * On the TDA3x EVM and the ALPS board the CSI data lane positions are
 * as below:
 *
 *        TDA                              AR
 *   ----------------                 ------------------
 *   csi2_0_dx/y0   |-----------------| dx/dy0
 *   csi2_0_dx/y1   |-----------------| dx/dy2 ** Note
 *   csi2_0_dx/y2   |-----------------| dx/dy1 ** Note
 *   csi2_0_dx/y3   |-----------------| dx/dy3
 *   csi2_0_dx/y4   |-----------------| dx/dy4
 *   ----------------                 ------------------
 */
/** \brief AR CSI clock lane position */
#define CHAINS_AR1243_CSI_CLOCKLANE_POS        (3U)
/** \brief AR CSI first data lane position */
#define CHAINS_AR1243_CSI_DATA1LANE_POS        (1U)
/** \brief AR CSI second data lane position */
#define CHAINS_AR1243_CSI_DATA2LANE_POS        (2U)
/** \brief AR CSI third data lane position */
#define CHAINS_AR1243_CSI_DATA3LANE_POS        (4U)
/** \brief AR CSI fourth data lane position */
#define CHAINS_AR1243_CSI_DATA4LANE_POS        (5U)

//#ifdef BOARD_TYPE_TDA3XX_RVP
#if 1			//Modified by HW 20170818
/** \brief TDA CSI clock lane position */
#define CHAINS_AR1243_TDA_CSI_CLOCKLANE_POS    (1U)
/** \brief TDA CSI first data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA1LANE_POS    (2U)
/** \brief TDA CSI second data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA2LANE_POS    (3U)
/** \brief TDA CSI third data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA3LANE_POS    (4U)
/** \brief TDA CSI fourth data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA4LANE_POS    (5U)
#else
/** \brief TDA CSI clock lane position */
#define CHAINS_AR1243_TDA_CSI_CLOCKLANE_POS    (2U)
/** \brief TDA CSI first data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA1LANE_POS    (1U)
/** \brief TDA CSI second data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA2LANE_POS    (3U)
/** \brief TDA CSI third data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA3LANE_POS    (4U)
/** \brief TDA CSI fourth data lane position */
#define CHAINS_AR1243_TDA_CSI_DATA4LANE_POS    (5U)
#endif

/** \brief ADC Data Format for AR12
 *         Valid Values are
 *         12  (for 12 bit ADC)
 *         14  (for 14 bit ADC)
 *         16  (for 16 bit ADC)
 */
#define CHAINS_AR1243_ADC_DATA_FORMAT (16U)
//#define CHAINS_AR1243_ADC_DATA_FORMAT (14U)		//Modified by HW  20170901

#if (CHAINS_AR1243_ADC_DATA_FORMAT == (12U))
    /** \brief AR12 data format value set in the configuration */
    #define CHAINS_AR1243_DATA_FORMAT_CONFIG (RL_ADC_DATA_12_BIT)       /* 12 bit */
    /** \brief CSI data format configuration */
    #define CHAINS_AR1243_CSI_CAPTURE_DATA_FORMAT  (SYSTEM_CSI2_RAW12)  /* 12 bit */
#elif (CHAINS_AR1243_ADC_DATA_FORMAT == (14U))
    /** \brief AR12 data format value set in the configuration */
    #define CHAINS_AR1243_DATA_FORMAT_CONFIG (RL_ADC_DATA_14_BIT)       /* 14 bit */
    /** \brief CSI data format configuration */
    #define CHAINS_AR1243_CSI_CAPTURE_DATA_FORMAT  (SYSTEM_CSI2_RAW14)  /* 14 bit */
#elif (CHAINS_AR1243_ADC_DATA_FORMAT == (16U))
    /** \brief AR12 data format value set in the configuration */
    #define CHAINS_AR1243_DATA_FORMAT_CONFIG (RL_ADC_DATA_16_BIT)       /* 16 bit */
    /** \brief CSI data format configuration */
    #define CHAINS_AR1243_CSI_CAPTURE_DATA_FORMAT  (SYSTEM_CSI2_RAW8)  /* 16 bit */
#else
    #warn "CHAINS_AR1243: No valid ADC data format specified!!"
#endif

/** \brief Advanced Frame Configurations */
#define CHAINS_AR1243_NUM_SUBFRAMES    (2U)
#define CHAINS_AR1243_NUM_BURSTS       (1U)
#define CHAINS_AR1243_NUM_BURST_LOOPS  (1U)

/** \brief Macros for time calculation */
#define CHAINS_AR1243_TIME_MS_TO_5NS(x) ((x * 1000000)/5)
#define CHAINS_AR1243_TIME_US_TO_10NS(x) (x * 100)

#define CHAINS_AR1243_TIME_5NS_TO_MS(x) ((x * 5)/1000000)

#define CHAINS_AR1243_FREQ_CONST (3.6 * 1000000000.0/67108864.0)

/** \brief Macro for Frequency Calculation. Input 'x' is in GHz */
#define CHAINS_AR1243_FREQ_GHZ_CONV(x) ((rlUInt32_t)(((float)x * 1000000000.0 + CHAINS_AR1243_FREQ_CONST)/CHAINS_AR1243_FREQ_CONST))

#define CHAINS_AR1243_FREQ_SLOPE_CONST (CHAINS_AR1243_FREQ_CONST * 900.0/1000.0)

/** \brief Macro for frequency slope conversion. Input 'x' is in MHz/us */
#define CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(x) ((rlInt16_t)((x * 1000.0 + CHAINS_AR1243_FREQ_SLOPE_CONST)/CHAINS_AR1243_FREQ_SLOPE_CONST))

/** \brief Compile time assert for the array size not correct */
#define COMPILE_TIME_ASSERT(expr) \
    extern UInt8 check_parameter_size[2]; \
    extern UInt8 check_parameter_size[expr? 1: 2]

/* ========================================================================== */
/*                           Globals                                          */
/* ========================================================================== */

static Bsp_Ar12xxInitParams gAr12xx_initParams;

/* When Advanced frame configuration is set this is ignored */
static rlFrameCfg_t   gAr1243FrmArgs =
{
    .chirpStartIdx = (rlUInt16_t) 0,
    .chirpEndIdx   = (rlUInt16_t) CHAINS_RADAR_NUM_TX_ANTENNA - (rlUInt16_t)1,
    .numLoops      = (rlUInt16_t) AR1243_RADAR_HEIGHT,
    .numFrames     = (rlUInt16_t) 0,
    /* profileCfgArgs[1].numAdcSamples * 2 - 512 * 2*/
//    .numAdcSamples     = (rlUInt16_t) AR1243_PROFILE1_RADAR_WIDTH * (rlUInt16_t)2,
    .numAdcSamples     = (rlUInt16_t) AR1243_PROFILE1_RADAR_WIDTH * (rlUInt16_t)2,		
	.framePeriodicity  = (rlUInt32_t) CHAINS_AR1243_TIME_MS_TO_5NS(150U), /* 33 ms / 30 FPS, 20 ms / 50fps */
    .triggerSelect     = (rlUInt16_t) RL_FRAMESTRT_API_TRIGGER,
    .reserved          = (rlUInt32_t) 0,
    .reserved2         = (rlUInt32_t) 0,
    .frameTriggerDelay = (rlUInt32_t) 0
};

static rlProfileCfg_t gAr1243ProfileArgs[] = {
    {
        .profileId             = (rlUInt16_t) 0,
        .startFreqConst        = (rlUInt32_t) CHAINS_AR1243_FREQ_GHZ_CONV(77),
        .idleTimeConst         = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(7U),
        .adcStartTimeConst     = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(6U),
        .rampEndTime           = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(60U),
        .txOutPowerBackoffCode = (rlUInt32_t) 0,
//        .txOutPowerBackoffCode = (rlUInt32_t) 0x001e1e1e,
        .txPhaseShifter        = (rlUInt32_t) 0,
        .freqSlopeConst        = (rlInt16_t) CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(25),
        .txStartTime           = (rlInt16_t) CHAINS_AR1243_TIME_US_TO_10NS(1U),
        .numAdcSamples         = (rlUInt16_t) AR1243_PROFILE1_RADAR_WIDTH,
        .digOutSampleRate      = (rlUInt16_t) 16000, /* Kilo Samples per second */
        .hpfCornerFreq1        = (rlUInt8_t) RL_RX_HPF1_175_KHz,
        .hpfCornerFreq2        = (rlUInt8_t) RL_RX_HPF2_350_KHz,
        .reserved              = (rlUInt16_t) 0,
        .rxGain = (rlUInt16_t) 38
    },
    {
        .profileId             = (rlUInt16_t) 1,
        .startFreqConst        = (rlUInt32_t) CHAINS_AR1243_FREQ_GHZ_CONV(77),
        .idleTimeConst         = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(7U),
        .adcStartTimeConst     = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(6U),
        .rampEndTime           = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(60U),
        .txOutPowerBackoffCode = (rlUInt32_t) 0,
//        .txOutPowerBackoffCode = (rlUInt32_t) 0x001e1e1e,
        .txPhaseShifter        = (rlUInt32_t) 0,
//        .freqSlopeConst        = (rlInt16_t) CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(59.616),
        .freqSlopeConst        = (rlInt16_t) CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(25),
        .txStartTime           = (rlInt16_t) CHAINS_AR1243_TIME_US_TO_10NS(1U),
        .numAdcSamples         = (rlUInt16_t) AR1243_PROFILE2_RADAR_WIDTH,
        .digOutSampleRate      = (rlUInt16_t) 16000, /* Kilo Samples per second */
        .hpfCornerFreq1        = (rlUInt8_t) RL_RX_HPF1_175_KHz,
        .hpfCornerFreq2        = (rlUInt8_t) RL_RX_HPF2_350_KHz,
        .reserved              = (rlUInt16_t) 0,
        .rxGain = (rlUInt16_t) 38
    },
//    {
//        .profileId             = (rlUInt16_t) 1,
//        .startFreqConst        = (rlUInt32_t) CHAINS_AR1243_FREQ_GHZ_CONV(77),
//        .idleTimeConst         = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(7U),
//        .adcStartTimeConst     = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(2U),
//        .rampEndTime           = (rlUInt32_t) CHAINS_AR1243_TIME_US_TO_10NS(62U),
////        .txOutPowerBackoffCode = (rlUInt32_t) 0,
//        .txOutPowerBackoffCode = (rlUInt32_t) 0x001e1e1e,
//        .txPhaseShifter        = (rlUInt32_t) 0,
//        .freqSlopeConst        = (rlInt16_t) CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(62.4),
//        .txStartTime           = (rlInt16_t) CHAINS_AR1243_TIME_US_TO_10NS(1U),
//        .numAdcSamples         = (rlUInt16_t) AR1243_PROFILE1_RADAR_WIDTH,
//        .digOutSampleRate      = (rlUInt16_t) 2150, /* Kilo Samples per second */
//        .hpfCornerFreq1        = (rlUInt8_t) RL_RX_HPF1_175_KHz,
//        .hpfCornerFreq2        = (rlUInt8_t) RL_RX_HPF2_350_KHz,
//        .reserved              = (rlUInt16_t) 0,
//        .rxGain = (rlUInt16_t) 38
//    }
};

static rlChirpCfg_t   gAr1243ChirpCfgArgs[] =
{
    {
        .chirpStartIdx   = (rlUInt16_t) 0x0,
        .chirpEndIdx     = (rlUInt16_t) 0x0,
        .profileId       = (rlUInt16_t) 0x0, /* First profile */
//		.profileId       = (rlUInt16_t) 0x1, 
        .startFreqVar    = (rlUInt32_t) 0x0,
        .freqSlopeVar    = (rlInt16_t) 0x0,
        .idleTimeVar     = (rlUInt16_t) 0x0,
        .adcStartTimeVar = (rlUInt16_t) 0x0,
        #if (CHAINS_RADAR_NUM_TX_ANTENNA > 2)
        .txEnable        = (rlUInt16_t) 0x1, /* TX1 + TX3 */
        #else
        .txEnable        = (rlUInt16_t) 0x4, /* TX1 */
        #endif
        .reserved        = (rlUInt16_t) 0x0
    },
#if (CHAINS_RADAR_NUM_TX_ANTENNA > 1)
    {
        .chirpStartIdx   = (rlUInt16_t) 0x1,
        .chirpEndIdx     = (rlUInt16_t) 0x1,
        .profileId       = (rlUInt16_t) 0x0, /* First profile */
        .startFreqVar    = (rlUInt32_t) 0x0,
        .freqSlopeVar    = (rlInt16_t) 0x0,
        .idleTimeVar     = (rlUInt16_t) 0x0,
        .adcStartTimeVar = (rlUInt16_t) 0x0,
        #if (CHAINS_RADAR_NUM_TX_ANTENNA > 2)
        .txEnable        = (rlUInt16_t) 0x2, /* TX1 - TX3 */
        #else
        .txEnable        = (rlUInt16_t) 0x2, /* TX2 */
        #endif
        .reserved        = (rlUInt16_t) 0x0
    },
#endif
#if (CHAINS_RADAR_NUM_TX_ANTENNA > 2)
    {
        .chirpStartIdx   = (rlUInt16_t) 0x2,
        .chirpEndIdx     = (rlUInt16_t) 0x2,
        .profileId       = (rlUInt16_t) 0x0, /* First profile */
        .startFreqVar    = (rlUInt32_t) 0x0,
        .freqSlopeVar    = (rlInt16_t) 0x0,
        .idleTimeVar     = (rlUInt16_t) 0x0,
        .adcStartTimeVar = (rlUInt16_t) 0x0,
        .txEnable        = (rlUInt16_t) 0x4, /* TX2 */
        .reserved        = (rlUInt16_t) 0x0
    },
#endif
};

static rlBpmChirpCfg_t   gAr1243BpmChirpCfgArgs[] =
{
    {
        .chirpStartIdx = (rlUInt16_t) 0x0,
        .chirpEndIdx   = (rlUInt16_t) 0x0,
        .constBpmVal   = (rlUInt16_t) 0x0,
        .reserved      = (rlUInt16_t) 0x0
    },
    {
        .chirpStartIdx = (rlUInt16_t) 0x1,
        .chirpEndIdx   = (rlUInt16_t) 0x1,
        .constBpmVal   = (rlUInt16_t) 0x20, /* TX3 Phase is 180 degrees in On phase */
        .reserved      = (rlUInt16_t) 0x0
    },
    {
        .chirpStartIdx = (rlUInt16_t) 0x2,
        .chirpEndIdx   = (rlUInt16_t) 0x2,
        .constBpmVal   = (rlUInt16_t) 0x0,
        .reserved      = (rlUInt16_t) 0x0
    },
    {
        .chirpStartIdx = (rlUInt16_t) 0x3,
        .chirpEndIdx   = (rlUInt16_t) 0x3,
        .constBpmVal   = (rlUInt16_t) 0x0,
        .reserved      = (rlUInt16_t) 0x0
    },
    {
        .chirpStartIdx = (rlUInt16_t) 0x4,
        .chirpEndIdx   = (rlUInt16_t) 0x4,
        .constBpmVal   = (rlUInt16_t) 0x20, /* TX3 Phase is 180 degrees in On phase */
        .reserved      = (rlUInt16_t) 0x0
    },
    {
        .chirpStartIdx = (rlUInt16_t) 0x5,
        .chirpEndIdx   = (rlUInt16_t) 0x5,
        .constBpmVal   = (rlUInt16_t) 0x0,
        .reserved      = (rlUInt16_t) 0x0
    }
};

/**< \brief Sensor configuration for the AR1243 Radar Sensor  */
Bsp_Ar12xxConfigObj   gAr12xx_config =
{
    .rfChanCfgArgs            = {
        .rxChannelEn = (rlUInt16_t) (1<<CHAINS_RADAR_NUM_RX_ANTENNA) - 1,
        .txChannelEn = (rlUInt16_t) (1<<CHAINS_RADAR_NUM_TX_ANTENNA) - 1,
        .cascading   = (rlUInt16_t) 0x0,
        .bReserved   = (rlUInt16_t) 0x0
    },
    .adcOutCfgArgs            = {
        .fmt                  = {
            .bitFormat        =
            {
                .b2AdcBits    = CHAINS_AR1243_DATA_FORMAT_CONFIG,
                .b14Reserved1 = (rlUInt32_t) 0x0,
                .b2AdcOutFmt  = RL_ADC_FORMAT_COMPLEX_1X,
                .b14Reserved2 = (rlUInt32_t) 0x0
            }
        },
        .reserved      = (rlUInt16_t) 0x0
    },
    .dataFmtCfgArgs           = {
        .rxChannelEn  = (rlUInt16_t) (1<<CHAINS_RADAR_NUM_RX_ANTENNA) - 1,
        .adcBits      = (rlUInt16_t) CHAINS_AR1243_DATA_FORMAT_CONFIG,
        .adcFmt       = (rlUInt16_t) RL_ADC_FORMAT_COMPLEX_1X,
        .iqSwapSel    = (rlUInt8_t) RL_DEV_I_FIRST,
        .chInterleave = (rlUInt8_t) RL_DEV_CH_NON_INTERLEAVED,
        .reserved     = (rlUInt32_t) 0x0
    },
    .rfLpModeCfgArgs          = {
        .anaChannelCfg = (rlUInt16_t) RL_RXANA_COMPLEX,
        .lpAdcMode     = (rlUInt16_t) RL_ADC_MODE_REGULAR
    },
    .chirpCfgArgs      = gAr1243ChirpCfgArgs,
    .numChirpCfgArgs   = sizeof(gAr1243ChirpCfgArgs)/sizeof(rlChirpCfg_t),
    .profileCfgArgs    = gAr1243ProfileArgs,
    .numProfileCfgArgs = sizeof(gAr1243ProfileArgs)/sizeof(rlProfileCfg_t),
    .frameCfgArgs      = &gAr1243FrmArgs,
    .numFrameCfgArgs   = sizeof(gAr1243FrmArgs)/sizeof(rlFrameCfg_t),
    .dataPathCfgArgs   = {
        .intfSel         = (rlUInt8_t) 0,
        .transferFmtPkt0 = (rlUInt8_t) 6, /**< Data out Format, \n
                                      b5:0 Packet 0 content selection\n
                                      000001 - ADC_DATA_ONLY \n
                                      000110 - CP_ADC_DATA \n
                                      001001 - ADC_CP_DATA \n
                                      110110 - CP_ADC_CQ_DATA
                                      b7:6 Packet 0 virtual channel number (valid only for CSI2)\n
                                      00 Virtual channel number 0 (Default)\n
                                      01 Virtual channel number 1\n
                                      02 Virtual channel number 2\n
                                      03 Virtual channel number 3 \n*/
        .transferFmtPkt1 = (rlUInt8_t) 0,/**< Data out Format, \n
                                      b5:0 Packet 0 content selection\n
                                      000000 - Suppress Packet 1 \n
                                      001110 - CP_CQ_DATA \n
                                      001011 - CQ_CP_DATA \n
                                      b7:6 Packet 1 virtual channel number (valid only for CSI2)\n
                                      00 Virtual channel number 0 (Default)\n
                                      01 Virtual channel number 1\n
                                      02 Virtual channel number 2\n
                                      03 Virtual channel number 3\n*/
        .reserved        = (rlUInt8_t) 0,
        .reserved1       = (rlUInt32_t) 0
    },
    .dataPathClkCfgArgs           = {
        .laneClkCfg = (rlUInt8_t) 1,
        .dataRate   = (rlUInt8_t) CHAINS_AR1243_CSI_DATA_RATE_VALUE,
        .reserved   = (rlUInt16_t) 0
    },
    .hsiClkgs                 = {
        .hsiClk   = (rlUInt16_t) CHAINS_AR1243_DDR_HSI_CLK,
        .reserved = (rlUInt16_t) 0x0
    },
    .laneEnCfgArgs            = {
        .laneEn   = (rlUInt16_t)
            #if CHAINS_AR1243_CSI_DATA1LANE_POS
                ((rlUInt16_t) 0x1) |
            #endif
            #if CHAINS_AR1243_CSI_DATA2LANE_POS
                ((rlUInt16_t) 0x2) |
            #endif
            #if CHAINS_AR1243_CSI_DATA3LANE_POS
                ((rlUInt16_t) 0x4) |
            #endif
            #if CHAINS_AR1243_CSI_DATA4LANE_POS
                ((rlUInt16_t) 0x8) |
            #endif
                ((rlUInt16_t) 0x0),
        .reserved = (rlUInt16_t) 0x0
    },
    .bpmCommnCfgArgs = {
        .mode.b2SrcSel    = 0,
        .mode.b1Reserved1  = 0,
        .mode.b13Reserved2 = 0,

        .kSel.b1BpmKStart  = 0,
        .kSel.b1BpmKEnd    = 0,
        .kSel.b14Reserved1 = 0,

        .kCnt                = (rlUInt16_t) 0x0,
        .reserved            = (rlUInt16_t) 0x0,
        .kCounterStartOffset = (rlUInt32_t) 0x0,
        .kCounterEndOffset   = (rlUInt32_t) 0x0
    },
    .bpmChirpCfgArgs = gAr1243BpmChirpCfgArgs,
    .numBpmChirpCfgArgs = sizeof(gAr1243BpmChirpCfgArgs)/sizeof(rlBpmChirpCfg_t),
    .csiConfigArgs = {
        .lanePosPolSel = ((CHAINS_AR1243_CSI_CLOCKLANE_POS << 16U) | /* Polarity Always */
                         (CHAINS_AR1243_CSI_DATA4LANE_POS << 12U) | /* assumed to be 0 */
                         (CHAINS_AR1243_CSI_DATA3LANE_POS << 8U) |
                         (CHAINS_AR1243_CSI_DATA2LANE_POS << 4U) |
                         (CHAINS_AR1243_CSI_DATA1LANE_POS)),
        .reserved1 = (rlUInt32_t) 0U,
    },
    .advFrameCfgArgs = {
        .frameSeq = {
            .numOfSubFrames = (rlUInt8_t) CHAINS_AR1243_NUM_SUBFRAMES,
            .forceProfile   = (rlUInt8_t) 1,
            .reserved = (rlUInt16_t) 0,
            .subFrameCfg = {
                {
                    .forceProfileIdx     = (rlUInt16_t) 0,
                    .chirpStartIdx       = (rlUInt16_t) 0,
                    .numOfChirps         = (rlUInt16_t) CHAINS_RADAR_NUM_TX_ANTENNA,
                    .numLoops            = (rlUInt16_t) AR1243_RADAR_HEIGHT,
                    .burstPeriodicity    = (rlUInt32_t) CHAINS_AR1243_TIME_MS_TO_5NS(33U),
                    /* burstPeriodicity >=
                     * (numLoops)* (numOfChirps) * chirpTime + InterBurstBlankTime,
                     * where InterBurstBlankTime is primarily for sensor
                     * calibration / monitoring, thermal control, and some minimum
                     * time needed for triggering next burst.
                     * NOTE: Across bursts, if the value numOfChirps, is not a
                     * constant, then the actual available blank time can vary and
                     * needs to be accounted for 1 LSB = 5 ns
                     */
                    .chirpStartIdxOffset = (rlUInt16_t) 0,
                    .numOfBurst          = (rlUInt16_t) CHAINS_AR1243_NUM_BURSTS,
                    .numOfBurstLoops     = (rlUInt16_t) CHAINS_AR1243_NUM_BURST_LOOPS,
                    .reserved1           = (rlUInt16_t) 0,
                    .subFramePeriodicity = (rlUInt32_t) CHAINS_AR1243_TIME_MS_TO_5NS(66U),
                    .reserved2           = (rlUInt32_t) 0,
                    .reserved3           = (rlUInt32_t) 0
                },
                {
                    .forceProfileIdx     = (rlUInt16_t) 1,
                    .chirpStartIdx       = (rlUInt16_t) 0,
                    .numOfChirps         = (rlUInt16_t) CHAINS_RADAR_NUM_TX_ANTENNA,
                    .numLoops            = (rlUInt16_t) AR1243_RADAR_HEIGHT,
                    .burstPeriodicity    = (rlUInt32_t) CHAINS_AR1243_TIME_MS_TO_5NS(33U),
                    .chirpStartIdxOffset = (rlUInt16_t) 0,
                    .numOfBurst          = (rlUInt16_t) CHAINS_AR1243_NUM_BURSTS,
                    .numOfBurstLoops     = (rlUInt16_t) CHAINS_AR1243_NUM_BURST_LOOPS,
                    .reserved1           = (rlUInt16_t) 0,
                    .subFramePeriodicity = (rlUInt32_t) CHAINS_AR1243_TIME_MS_TO_5NS(66U),
                    .reserved2           = (rlUInt32_t) 0,
                    .reserved3           = (rlUInt32_t) 0
                },
                {
                    .forceProfileIdx     = (rlUInt16_t) 0,
                    .chirpStartIdx       = (rlUInt16_t) 0,
                    .numOfChirps         = (rlUInt16_t) 0,
                    .numLoops            = (rlUInt16_t) 0,
                    .burstPeriodicity    = (rlUInt32_t) 0,
                    .chirpStartIdxOffset = (rlUInt16_t) 0,
                    .numOfBurst          = (rlUInt16_t) 0,
                    .numOfBurstLoops     = (rlUInt16_t) 0,
                    .reserved1           = (rlUInt16_t) 0,
                    .subFramePeriodicity = (rlUInt32_t) 0,
                    .reserved2           = (rlUInt32_t) 0,
                    .reserved3           = (rlUInt32_t) 0
                },
                {
                    .forceProfileIdx     = (rlUInt16_t) 0,
                    .chirpStartIdx       = (rlUInt16_t) 0,
                    .numOfChirps         = (rlUInt16_t) 0,
                    .numLoops            = (rlUInt16_t) 0,
                    .burstPeriodicity    = (rlUInt32_t) 0,
                    .chirpStartIdxOffset = (rlUInt16_t) 0,
                    .numOfBurst          = (rlUInt16_t) 0,
                    .numOfBurstLoops     = (rlUInt16_t) 0,
                    .reserved1           = (rlUInt16_t) 0,
                    .subFramePeriodicity = (rlUInt32_t) 0,
                    .reserved2           = (rlUInt32_t) 0,
                    .reserved3           = (rlUInt32_t) 0
                }
            },
            .numFrames      = (rlUInt16_t) 0,
            .triggerSelect  = (rlUInt16_t) RL_FRAMESTRT_API_TRIGGER,
            .frameTrigDelay = (rlUInt32_t) 0,
            .reserved1      = (rlUInt32_t) 0,
            .reserved2      = (rlUInt32_t) 0
        },
        .frameData = {
            .numSubFrames = (rlUInt8_t) CHAINS_AR1243_NUM_SUBFRAMES,
            .reserved1    = (rlUInt8_t) 0,
            .reserved2    = (rlUInt16_t) 0,
            .subframeDataCfg = {
                {
                    .totalChirps =
                        (rlUInt32_t) CHAINS_RADAR_NUM_TX_ANTENNA * AR1243_RADAR_HEIGHT * CHAINS_AR1243_NUM_BURSTS,
                    /* Number of Chirps in Sub-Frame =
                     *                     numOfChirps * numLoops * numOfBurst
                     */
                    .numAdcSamples = (rlUInt16_t) AR1243_PROFILE1_RADAR_WIDTH * (rlUInt16_t) 2,
                    .numChirpsInDataPacket = (rlUInt8_t) 1,
                    /* In AR12xx: Program this as 1 */
                    .reserved1 = (rlUInt8_t) 0,
                },
                {
                    .totalChirps =
                        (rlUInt32_t) CHAINS_RADAR_NUM_TX_ANTENNA * AR1243_RADAR_HEIGHT * CHAINS_AR1243_NUM_BURSTS,
                    .numAdcSamples = (rlUInt16_t) AR1243_PROFILE2_RADAR_WIDTH * (rlUInt16_t) 2,
                    .numChirpsInDataPacket = (rlUInt8_t) 1,
                    .reserved1 = (rlUInt8_t) 0,
                },
                {
                    .totalChirps = (rlUInt32_t) 0,
                    .numAdcSamples = (rlUInt16_t) 0,
                    .numChirpsInDataPacket = (rlUInt8_t) 1,
                    .reserved1 = (rlUInt8_t) 0,
                },
                {
                    .totalChirps = (rlUInt32_t) 0,
                    .numAdcSamples = (rlUInt16_t) 0,
                    .numChirpsInDataPacket = (rlUInt8_t) 1,
                    .reserved1 = (rlUInt8_t) 0,
                }
            }
        }
    }
};

static DEV_Struct uartAr12FlashDevObj;

char gChains_ar12xxRunTimeMenu[] = {
    "\r\n "
    "\r\n ==========================="
    "\r\n Select Frame Configuration"
    "\r\n ==========================="
    "\r\n "
    "\r\n 1: Normal Frame "
    "\r\n 2: Advanced Frame "
    "\r\n "
    "\r\n Enter Choice: "
    "\r\n "
};

static UInt32 gChainsCommon_ar12xxFrameType = 0U;

static Void ChainsCommon_ar12xxInit();
static Void ChainsCommon_ar12xxDeInit();
static Void ChainsCommon_CalcResolution(UInt32 profileId, float *range, float *velocity);

/**
 *******************************************************************************
 *
 * \brief   Function to print run time menu of the frame configuration selection
 *
 * \param   None
 * /return  char   User Input choice.
 *
 *******************************************************************************
*/
char ChainsCommon_ar12xxRunTimeMenu()
{
    Vps_printf(gChains_ar12xxRunTimeMenu);
    return Chains_readChar();
}

/**
 *******************************************************************************
 *
 * \brief   Function to enable the dummy input of objects from AR12xx
 *
 * \param   None
 * /return  retVal   SYSTEM_LINK_STATUS_SOK if the test source is set correctly.
 *
 *******************************************************************************
*/
Int32 ChainsCommon_ar12xxEnableTestSource(Void)
{
#if (CHAINS_RADAR_NUM_TX_ANTENNA == 1)
    Bsp_Ar12xxTestSource tsArgs = {0};
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;

    tsArgs.testObj[0].posX = 0;

    tsArgs.testObj[0].posY = 500;
    tsArgs.testObj[0].posZ = 0;

    tsArgs.testObj[0].velX = 0;
    tsArgs.testObj[0].velY = 0;
    tsArgs.testObj[0].velZ = 0;

    tsArgs.testObj[0].posXMin = -32700;
    tsArgs.testObj[0].posYMin = 0;
    tsArgs.testObj[0].posZMin = -32700;

    tsArgs.testObj[0].posXMax = 32700;
    tsArgs.testObj[0].posYMax = 32700;
    tsArgs.testObj[0].posZMax = 32700;

    tsArgs.testObj[0].sigLvl = 150;

    tsArgs.testObj[1].posX = 0;
    tsArgs.testObj[1].posY = 32700;
    tsArgs.testObj[1].posZ = 0;

    tsArgs.testObj[1].velX = 0;
    tsArgs.testObj[1].velY = 0;
    tsArgs.testObj[1].velZ = 0;

    tsArgs.testObj[1].posXMin = -32700;
    tsArgs.testObj[1].posYMin = 0;
    tsArgs.testObj[1].posZMin = -32700;

    tsArgs.testObj[1].posXMax = 32700;
    tsArgs.testObj[1].posYMax = 32700;
    tsArgs.testObj[1].posZMax = 32700;

    tsArgs.testObj[1].sigLvl = 948;

    tsArgs.rxAntPos[0].antPosX = 0;
    tsArgs.rxAntPos[0].antPosZ = 0;
    tsArgs.rxAntPos[1].antPosX = 32;
    tsArgs.rxAntPos[1].antPosZ = 0;
    tsArgs.rxAntPos[2].antPosX = 64;
    tsArgs.rxAntPos[2].antPosZ = 0;
    tsArgs.rxAntPos[3].antPosX = 96;
    tsArgs.rxAntPos[3].antPosZ = 0;

    tsArgs.txAntPos[0].antPosX = 0;
    tsArgs.txAntPos[0].antPosZ = 0;
    tsArgs.txAntPos[1].antPosX = 0;
    tsArgs.txAntPos[1].antPosZ = 0;
    tsArgs.txAntPos[2].antPosX = 0;
    tsArgs.txAntPos[2].antPosZ = 0;

    retVal = Bsp_ar12xxEnableDummySource(&tsArgs);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    return retVal;
#else
    return SYSTEM_LINK_STATUS_SOK;
#endif

}

/**
 *******************************************************************************
 *
 * \brief   Function to Initialize and configure the AR12 sensor.
 *
 * \param   pCfgOut Configuration parameters populated by the AR12 parameters.
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxConfig(ChainsCommon_Ar12xxConfigOut *pCfgOut)
{
    Int32 retVal;
    UInt32 i;
    char ch;
    Bsp_BoardId boardId;
    UInt32 done = FALSE;

    Vps_printf(" CHAINS: Init AR12xx ... \n\r");
    ChainsCommon_ar12xxInit();
    boardId = Bsp_boardGetId();
    if (boardId == BSP_BOARD_TDA3XX_AR12XX_ALPS)
    {
        /* For the ALPS board assume the AR12 Flash is already programmed
         * with firmware. Hence not downloading firmware again through SPI.
         * If the firmware has to be downloaded through SPI, make the input to
         * this API as 1 and ensure the AR12 Flash is erased.
         */
        retVal = Bsp_ar12xxBoot(0U);
    }
    else if ((boardId == BSP_BOARD_TDA3XX_RVP_ALPHA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_BETA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_A))
    {
        retVal = Bsp_ar12xxBoot(0U);
    }
    else
    {
        /* For the TDA3xx EVM + DIB + VAB + Booster Pack setup always load the
         * firmware via SPI.
         */
        retVal = Bsp_ar12xxBoot(1U);
    }
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    retVal = Bsp_ar12xxGetWidthHeight(&pCfgOut->csi2OutWidth, &pCfgOut->csi2OutHeight);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    Vps_printf(" CHAINS: Config AR12xx ... \n\r");
    /* Check for certain size limitations. This will show up as compile time
     * issues.
     */
    COMPILE_TIME_ASSERT(sizeof(gAr1243ChirpCfgArgs)/sizeof(rlChirpCfg_t) > 512);
    COMPILE_TIME_ASSERT(
        sizeof(gAr1243ProfileArgs)/sizeof(rlProfileCfg_t) >
        CHAINS_AR1243_MAX_PROFILES);
    while (!done)
    {
        //ch = ChainsCommon_ar12xxRunTimeMenu();
    	ch = '1';			//Modified by HW  20170818
        if (ch == '2')
        {
            Vps_printf(" CHAINS: Configuring the parameters for Advanced Frame \n\r");
            retVal = Bsp_ar12xxConfigParams(BSP_AR12XX_CONFIG_ADV_FRAME_ALL, 0U);
            pCfgOut->numProfiles = sizeof(gAr1243ProfileArgs)/sizeof(rlProfileCfg_t);
            gChainsCommon_ar12xxFrameType = 2U;
            done = TRUE;
        }
        else if (ch == '1')
        {
            Vps_printf(" CHAINS: Configuring the parameters for Normal Frame \n\r");
            retVal = Bsp_ar12xxConfigParams(BSP_AR12XX_CONFIG_ALL, 0U);
            pCfgOut->numProfiles = 1U;
            gChainsCommon_ar12xxFrameType = 1U;
            done = TRUE;
        }
        else
        {
            Vps_printf(" CHAINS: Unsupported option '%c'. Please try again\n", ch);
        }
    }
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

#if defined(ENABLE_TEST_SOURCE)
    Vps_printf(" CHAINS: Enabling test source ...\n\r");
    ChainsCommon_ar12xxEnableTestSource();
#endif
    for (i = 0; i < pCfgOut->numProfiles; i++)
    {
        pCfgOut->radarWidth[i] = gAr1243ProfileArgs[i].numAdcSamples;
        pCfgOut->radarHeight[i] = AR1243_RADAR_HEIGHT;
        if (gAr12xx_config.dataPathCfgArgs.transferFmtPkt0 == (rlUInt8_t) 6)
        {
            pCfgOut->inBufAddrOffset = 4U;
            pCfgOut->offsetBwAntennas [i] = pCfgOut->radarWidth[i] * sizeof(UInt32) + 4U;
        }
        else if (gAr12xx_config.dataPathCfgArgs.transferFmtPkt0 == (rlUInt8_t) 9)
        {
            pCfgOut->inBufAddrOffset = 0U;
            pCfgOut->offsetBwAntennas [i] = pCfgOut->radarWidth[i] * sizeof(UInt32) + 4U;
        }
        else
        {
            pCfgOut->inBufAddrOffset = 0U;
            pCfgOut->offsetBwAntennas [i] = pCfgOut->radarWidth[i] * sizeof(UInt32);
        }
    }
    pCfgOut->numTxAntenna = CHAINS_RADAR_NUM_TX_ANTENNA;
    pCfgOut->numRxAntenna = CHAINS_RADAR_NUM_RX_ANTENNA;

    for (i = 0; i < pCfgOut->numProfiles; i++)
    {
        ChainsCommon_CalcResolution(i, &pCfgOut->rangeRes[i], &pCfgOut->velocityRes[i]);
    }

    pCfgOut->numValidBits = CHAINS_AR1243_ADC_DATA_FORMAT;

    Vps_printf(" CHAINS: Init AR12xx ... DONE !!!\n\r");
}
/**
 *******************************************************************************
 *
 * \brief   Function to Start the AR12 sensor
 *
 * \param   None
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxStart(void)
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;

    Vps_printf(" CHAINS: AR12xx Starting Radar Sensor ...\n\r");
    retVal = Bsp_ar12xxStartRadar();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    Vps_printf(" CHAINS: AR12xx Starting Radar Sensor ... DONE !!!\n\r");
}

Void ChainsCommon_ar12xxStop()
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;

    Vps_printf(" CHAINS: AR12xx Stopping Radar Sensor ...\n\r");

    retVal = Bsp_ar12xxStopRadar();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    Task_sleep(100);
    ChainsCommon_ar12xxDeInit();
    Vps_printf(" CHAINS: AR12xx Stopping Radar Sensor ... DONE !!!\n\r");
}

/**
 *******************************************************************************
 *
 * \brief   Function to Set up the ISS capture parameters
 *
 * \param   pPrm     ISS Capture params
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxSetIssCaptureParams(IssCaptureLink_CreateParams *pPrm)
{
    Int32 retVal;
    UInt32 outWidth, outHeight;
    UInt32 idx;

    retVal = Bsp_ar12xxGetWidthHeight(&outWidth, &outHeight);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    memset(pPrm, 0, sizeof(IssCaptureLink_CreateParams));
    /* Set CSI2 Capture params */
    pPrm->videoIfMode = SYSTEM_VIFM_SCH_CSI2;
    pPrm->videoIfWidth = SYSTEM_VIFW_4LANES;
    pPrm->bufCaptMode = SYSTEM_CAPT_BCM_LAST_FRM_REPEAT;
    pPrm->allocBufferForRawDump = 0U;
    pPrm->numCh = 1U;

    pPrm->outParams[0U].dataFormat = SYSTEM_DF_BAYER_BGGR;
    pPrm->outParams[0U].inCsi2DataFormat = CHAINS_AR1243_CSI_CAPTURE_DATA_FORMAT;
    pPrm->outParams[0U].inCsi2VirtualChanNum = 0U;
//    pPrm->outParams[0U].numOutBuf = 3U;
    pPrm->outParams[0U].numOutBuf = 4U;		//Modified by HW 20170822

    if (pPrm->outParams[0U].inCsi2DataFormat == SYSTEM_CSI2_RAW8)
    {
        pPrm->outParams[0U].width = outWidth * 2U;
    }
    else
    {
        pPrm->outParams[0U].width = outWidth;
    }
    pPrm->outParams[0U].height = outHeight;

    pPrm->outParams[0U].maxWidth = pPrm->outParams[0U].width;
    pPrm->outParams[0U].maxHeight = pPrm->outParams[0U].height;

    for(idx = 0U; idx < ISSCAPT_LINK_MAX_CMPLXIO_INST; idx++)
    {
        pPrm->csi2Params[idx].isCmplxIoCfgValid = FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.clockLane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.clockLane.position = CHAINS_AR1243_TDA_CSI_CLOCKLANE_POS;
        pPrm->csi2Params[idx].cmplxIoCfg.data1Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data1Lane.position = CHAINS_AR1243_TDA_CSI_DATA1LANE_POS;
        pPrm->csi2Params[idx].cmplxIoCfg.data2Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data2Lane.position = CHAINS_AR1243_TDA_CSI_DATA2LANE_POS;
        pPrm->csi2Params[idx].cmplxIoCfg.data3Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data3Lane.position = CHAINS_AR1243_TDA_CSI_DATA3LANE_POS;
        pPrm->csi2Params[idx].cmplxIoCfg.data4Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data4Lane.position = CHAINS_AR1243_TDA_CSI_DATA4LANE_POS;
        pPrm->csi2Params[idx].csi2PhyClk                    = CHAINS_AR1243_ISS_CSI_CLK;
    }
    pPrm->csi2Params[0].isCmplxIoCfgValid = TRUE;
}
/**
 *******************************************************************************
 *
 * \brief   Function to flash and erase AR12 QSPI flash via UART communication
 *          interface to the AR12 ROM
 *
 * \param   None
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxFirmwareFlash(void)
{
    char ch;
    Bool done = FALSE;
    Int32 retVal = BSP_SOK;
    static UInt32 eraseDone = 0U;

    char gChainsCommon_ar12xxFlashMenu[] = {
        "\r\n "
        "\r\n AR12XX Flash Programming Menu"
        "\r\n -----------------------------"
        "\r\n "
        "\r\n 1: Erase AR12xx Flash."
        "\r\n "
        "\r\n 2: Flash AR12xx Firmware."
        "\r\n "
        "\r\n x: Exit"
        "\r\n "
        "\r\n Enter Choice: "
        "\r\n "
    };

    ChainsCommon_ar12xxInit();

    while(!done)
    {
        Vps_printf(gChainsCommon_ar12xxFlashMenu);

        ch = Chains_readChar();
        Vps_printf(" \r\n");

        switch(ch)
        {
            case '1':
                /* Only erase the flash such that the flash is empty */
                if (eraseDone == 0U)
                {
                    Vps_printf(" CHAINS: Started erasing the AR12 flash memory....\n\r");
                    retVal = Bsp_ar12xxEraseFirmware();
                    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
                    eraseDone = 1U;
                    Vps_printf(" CHAINS: Erasing AR12 flash memory completed.\n\r");
                }
                else
                {
                    Vps_printf(" CHAINS: Erasing AR12 flash memory already done.\n\r");
                }
                break;
            case '2':
                /* Flash the MSS, BSS and Config sections of the firmware.
                 */
                if (eraseDone == 0U)
                {
                    Vps_printf(" CHAINS: Started erasing the AR12 flash memory....\n\r");
                    retVal = Bsp_ar12xxEraseFirmware();
                    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
                    Vps_printf(" CHAINS: Erasing AR12 flash memory completed.\n\r");
                }
                Vps_printf(" CHAINS: Started flashing the AR12 firmware....\n\r");
                retVal = Bsp_ar12xxFlashFirmware();
                UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
                eraseDone = 0U;
                Vps_printf(" CHAINS: Finished flashing the AR12 firmware.\n\r");
                break;
            case 'x':
            case 'X':
                done = TRUE;
                break;

            default:
                Vps_printf(" Unsupported option '%c'. Please try again\n", ch);
                break;
        }
    }
    ChainsCommon_ar12xxDeInit();
}

/**
 *******************************************************************************
 *
 * \brief   Function to check if the profile, chirp and frame configurations
 *          are okay
 *
 * \param   None
 *
 * \return  retval SYSTEM_LINK_STATUS_SOK if the parameters are matching the
 *                 programmed values.
 *
 *******************************************************************************
*/
Int32 ChainsCommon_ar12xxCheckParameters(void)
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;
    rlProfileCfg_t retProfConfig;
    rlChirpCfg_t   retChirpConfig;
    rlFrameCfg_t   retFrameConfig;

    UInt32 i = 0;
    /* Check for the profile configurations */
    for (i = 0; i < gAr12xx_config.numProfileCfgArgs; i++)
    {
        retVal = Bsp_ar12xxGetConfiguredParam(BSP_AR12XX_CONFIG_PROFILE_PARAM,
                                               i,
                                               &retProfConfig);
        if ((0 == memcmp(&retProfConfig,
                        &gAr12xx_config.profileCfgArgs[i],
                        sizeof(rlProfileCfg_t))) && (retVal == SYSTEM_LINK_STATUS_SOK))
        {
            retVal = SYSTEM_LINK_STATUS_SOK;
        }
        else if (retVal == BSP_EUNSUPPORTED_CMD)
        {
            /* Do nothing as an ES1.0 AR device has been detected */
            retVal = SYSTEM_LINK_STATUS_SOK;
            break;
        }
        else
        {
            retVal = SYSTEM_LINK_STATUS_EFAIL;
            Vps_printf(" CHAINS: Profile Config Param Id %d did not match!!\n", i);
        }
    }
    if (retVal == SYSTEM_LINK_STATUS_SOK)
    {
        /* Check for the chirp configurations */
        for (i = 0U; i < gAr12xx_config.numChirpCfgArgs; i++)
        {
            retVal = Bsp_ar12xxGetConfiguredParam(BSP_AR12XX_CONFIG_CHIRP_PARAM,
                                               i,
                                               &retChirpConfig);
            if ((0 == memcmp(&retChirpConfig,
                            &gAr12xx_config.chirpCfgArgs[i],
                            sizeof(rlChirpCfg_t))) && (retVal == SYSTEM_LINK_STATUS_SOK))
            {
                retVal = SYSTEM_LINK_STATUS_SOK;
            }
            else if (retVal == BSP_EUNSUPPORTED_CMD)
            {
                /* Do nothing as an ES1.0 AR device has been detected */
                retVal = SYSTEM_LINK_STATUS_SOK;
                break;
            }
            else
            {
                retVal = SYSTEM_LINK_STATUS_EFAIL;
                Vps_printf(" CHAINS: Chirp Config Param Id %d did not match!!\n", i);
            }
        }
    }
    if (retVal == SYSTEM_LINK_STATUS_SOK)
    {
        /* Check for the frame configurations */
        for (i = 0U; i < 1U; i++)
        {
            retVal += Bsp_ar12xxGetConfiguredParam(BSP_AR12XX_CONFIG_FRAME_PARAM,
                                               i,
                                               &retFrameConfig);
            if ((0 == memcmp(&retFrameConfig,
                            &gAr12xx_config.frameCfgArgs[i],
                            sizeof(rlFrameCfg_t))) && (retVal == SYSTEM_LINK_STATUS_SOK))
            {
                retVal += SYSTEM_LINK_STATUS_SOK;
            }
            else if (retVal == BSP_EUNSUPPORTED_CMD)
            {
                /* Do nothing as an ES1.0 AR device has been detected */
                retVal = SYSTEM_LINK_STATUS_SOK;
                break;
            }
            else
            {
                retVal = SYSTEM_LINK_STATUS_EFAIL;
                Vps_printf(" CHAINS: Frame Config Param did not match!!\n");
            }
        }
    }

    if (retVal == SYSTEM_LINK_STATUS_SOK)
    {
        Vps_printf(" CHAINS: Parameters have matched with programmed!!\n");
    }

    return retVal;
}

/**
 *******************************************************************************
 *
 * \brief   Function to change the profile parameters at run time
 *
 * \param   algId       Algorithm Link ID for the FFT Heat Map
 * \param   pAr12xxCfg  Pointer to the configuration structure.
 *
 * \return  retval SYSTEM_LINK_STATUS_SOK if the parameter change has happened.
 *
 *******************************************************************************
*/
Int32 ChainsCommon_ar12xxChangeParameters(UInt32 algId, ChainsCommon_Ar12xxConfigOut *pCfgOut)
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;
    Vps_printf(" CHAINS: AR12xx Stopping Radar Sensor ...\n\r");
    retVal = Bsp_ar12xxStopRadar();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    Vps_printf(" CHAINS: AR12xx Radar Stopped ...\n\r");
    /* This sleep is required else the Radar re-start fails. Fixed in 0.8 DFP
     * with async event for stop frame. Worst case delay assumed with buffer.
     */
    if (gChainsCommon_ar12xxFrameType == 1U)
    {
        /* Normal Frame */
        BspOsal_sleep(2 * CHAINS_AR1243_TIME_5NS_TO_MS(gAr1243FrmArgs.framePeriodicity));
    }
    else
    {
        /* Advanced Frame */
        BspOsal_sleep(2 * CHAINS_AR1243_TIME_5NS_TO_MS(
            gAr12xx_config.advFrameCfgArgs.frameSeq.subFrameCfg[0].subFramePeriodicity +
            gAr12xx_config.advFrameCfgArgs.frameSeq.subFrameCfg[1].subFramePeriodicity +
            gAr12xx_config.advFrameCfgArgs.frameSeq.subFrameCfg[2].subFramePeriodicity +
            gAr12xx_config.advFrameCfgArgs.frameSeq.subFrameCfg[3].subFramePeriodicity));
    }
    /* Change the parameters as required. */
    if (gAr1243ProfileArgs[0].freqSlopeConst == CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(62.4))
    {
        gAr1243ProfileArgs[0].freqSlopeConst = CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(32.4);
    }
    else
    {
        gAr1243ProfileArgs[0].freqSlopeConst = CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(62.4);
    }
    ChainsCommon_CalcResolution(0, &pCfgOut->rangeRes[0], &pCfgOut->velocityRes[0]);
    Vps_printf(" CHAINS: Reconfiguring Parameters ...\n\r");
    retVal = Bsp_ar12xxConfigParams(BSP_AR12XX_CONFIG_PROFILE_PARAM, 0U);
    Vps_printf(" CHAINS: Reconfigured Parameters ...\n\r");

    ChainsCommon_ar12xxSetFFTHeatMapProfile(algId, pCfgOut, 0);


    Vps_printf(" CHAINS: AR12xx Re-starting Radar Sensor ...\n\r");
    retVal = Bsp_ar12xxStartRadar();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    Vps_printf(" CHAINS: AR12xx Radar Started ...\n\r");
    return retVal;
}

static Void ChainsCommon_ar12xxInit(void)
{
    char customName[BSP_AR12XX_MAX_SENSOR_NAME_LENGTH] = CHAINS_AR1243_CONFIG_NAME;
    Int32 retVal = BSP_SOK;
    Bsp_BoardId boardId;

    /* Get the initial default parameters for the radar link configuration */
    Bsp_ar12xxInitParams_init (&gAr12xx_initParams);

    boardId = Bsp_boardGetId();
    if (boardId == BSP_BOARD_TDA3XX_AR12XX_ALPS)
    {
        Bsp_Ar12xxGpioInputParams  inGpioParamsDef =
        {(UInt8) 3, (UInt8) 15, (UInt16) 51};     /* GPIO4, Pin 15, CPU Intr 51 */
        Bsp_Ar12xxGpioOutputParams outGpioParamsDef[BSP_AR12XX_GPIO_OUTPUT_COUNT]
        = {
        /* GPIO2, PIN 7 BSP_AR12XX_GPIO_OUTPUT_NRESET */
        {(UInt8) 1,    (UInt8) 7},
        /* GPIO2, PIN 6: BSP_AR12XX_GPIO_OUTPUT_WARM_RESET */
        {(UInt8) 1, (UInt8) 6},
        /* Not Used: BSP_AR12XX_GPIO_OUTPUT_NERRORIN */
        {(UInt8) 0xFF, (UInt8) 5 },
        /* GPIO1, PIN 5: BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_TDO */
        {(UInt8) 0, (UInt8) 5},
        /* GPIO1 PIN 4:  BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_SYNCOUT */
        {(UInt8) 0, (UInt8) 4},
        /* GPIO1 PIN 6:  BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_PMICOUT */
        {(UInt8) 0, (UInt8) 6}
        };
        memcpy(&gAr12xx_initParams.inGpioParams[0], &inGpioParamsDef,
               sizeof (inGpioParamsDef));
        memcpy(&gAr12xx_initParams.outGpioParams[0], outGpioParamsDef,
               sizeof (outGpioParamsDef));

        /* Use McSPI 2 */
        gAr12xx_initParams.mcSpiDevInst = 1U;
        Utils_mcspiInit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST1);
    }
    else if ((boardId == BSP_BOARD_TDA3XX_RVP_ALPHA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_BETA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_A))
    {
        Bsp_Ar12xxGpioInputParams  inGpioParamsDef =
        {(UInt8) 3, (UInt8) 15, (UInt16) 51};     /* GPIO4, Pin 15, CPU Intr 51 */
        Bsp_Ar12xxGpioOutputParams outGpioParamsDef[BSP_AR12XX_GPIO_OUTPUT_COUNT]
        = {
        /* GPIO2, PIN 7 BSP_AR12XX_GPIO_OUTPUT_NRESET */
        {(UInt8) 1,    (UInt8) 7},
        /* Not Used: BSP_AR12XX_GPIO_OUTPUT_WARM_RESET */
        {(UInt8) 0xFF, (UInt8) 17},
        /* Not Used: BSP_AR12XX_GPIO_OUTPUT_NERRORIN */
        {(UInt8) 0xFF, (UInt8) 5 },
        /* GPIO2, PIN 14: BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_TDO */
        {(UInt8) 1, (UInt8) 14},
        /* GPIO2, PIN 13:  BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_SYNCOUT */
        {(UInt8) 1, (UInt8) 13},
        /* GPIO2, PIN 12:  BSP_AR12XX_GPIO_OUTPUT_SOP_MODE_SEL_PMICOUT */
        {(UInt8) 1, (UInt8) 12}
        };
        memcpy(&gAr12xx_initParams.inGpioParams[0], &inGpioParamsDef,
               sizeof (inGpioParamsDef));
        memcpy(&gAr12xx_initParams.outGpioParams[0], outGpioParamsDef,
               sizeof (outGpioParamsDef));

        /* Use McSPI 2 */
        gAr12xx_initParams.mcSpiDevInst = 1U;
        Utils_mcspiInit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST1);
    }
    else
    {
        Utils_mcspiInit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST0);
    }

    Utils_uartCreateDevice(gAr12xx_initParams.uartDevInst, &uartAr12FlashDevObj);

    retVal = Bsp_ar12xxRegisterConfig(customName, &gAr12xx_config);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    strcpy(gAr12xx_initParams.radarConfigName, customName);

    /* Set the EDMA Handle */
    gAr12xx_initParams.edmaHandle = Utils_dmaGetEdma3Hndl(UTILS_DMA_SYSTEM_EDMA_INST_ID);

    retVal = Bsp_ar12xxInit(&gAr12xx_initParams);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    /* This is an optional step if the only a single AR1243 configuration is used.
     * If there are more than one configurations used then one can use the following API to
     * switch between configurations after performing Bsp_ar12xxInit.
     */
    retVal = Bsp_ar12xxSwitchConfig(customName);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
}

static Void ChainsCommon_ar12xxDeInit()
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;
    char customName[BSP_AR12XX_MAX_SENSOR_NAME_LENGTH] = CHAINS_AR1243_CONFIG_NAME;
    Bsp_BoardId boardId;

    Vps_printf(" CHAINS: AR12xx De-initing Radar Sensor ...\n\r");
    retVal = Bsp_ar12xxDeInit();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    retVal = Bsp_ar12xxUnRegisterConfig(customName);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    Vps_printf(" CHAINS: AR12xx De-initing McSPI ...\n\r");

    boardId = Bsp_boardGetId();
    if (boardId == BSP_BOARD_TDA3XX_AR12XX_ALPS)
    {
        Utils_mcspiDeinit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST1);
    }
    else if ((boardId == BSP_BOARD_TDA3XX_RVP_ALPHA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_BETA)
            || (boardId == BSP_BOARD_TDA3XX_RVP_A))
    {
        Utils_mcspiDeinit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST1);
    }
    else
    {
        Utils_mcspiDeinit(CHAINS_SINGLE_RAD_SENSOR_MCSPI_INST0);
    }
    Utils_uartDeleteDevice(&uartAr12FlashDevObj);
    /* Re-initializing to have same usecase behavior every time we restart */
    gAr1243ProfileArgs[0].freqSlopeConst = CHAINS_AR1243_FREQ_MHZ_PER_MICRO_S_SLOPE_CONV(62.4);
}

static Void ChainsCommon_CalcResolution(UInt32 profileId, float *range, float *velocity)
{
    float sampling_rate, slope, speedOfLight;
    float startFreq, chirpRepetitionTime;

    /* Range resolution is derived using the formula:
     * deltaR =       speed of light
     *          --------------------------- (in meters)
     *          (2 x Radar Chirp Bandwidth)
     * Radar Chirp Bandwidth = Chirp Slope * Number of samples per chirp
     *                         -----------------------------------------
     *                                     Sampling Rate
     */
    sampling_rate = gAr1243ProfileArgs[profileId].digOutSampleRate * 100.0;
    slope = gAr1243ProfileArgs[profileId].freqSlopeConst * 48.0;
    speedOfLight = 3.0;
    *range = (sampling_rate * speedOfLight)/
                    (2.0 * slope * (float)gAr1243ProfileArgs[profileId].numAdcSamples);

    /* Velocity Resolution is derived using the formula:
    *                         1                    speed of light
    * deltaV = ----------------------------- x ------------------------ (in m/s)
    *          Doppler Dimention x Chirp Time    2 x Starting Frequency
    */
    startFreq = gAr1243ProfileArgs[profileId].startFreqConst * 54.0;
    chirpRepetitionTime = (gAr1243ProfileArgs[profileId].rampEndTime
                    + gAr1243ProfileArgs[profileId].idleTimeConst)
                    * 10.0/1000000000;
    *velocity = (speedOfLight * 100000000.0)/
                            (AR1243_RADAR_HEIGHT * 2.0 * chirpRepetitionTime * startFreq);
}

/**
 *******************************************************************************
 *
 * \brief   Function to Initialize and configure the AR12 sensor.
 *
 * \param   pCfgOut Configuration parameters populated by the AR12 parameters.
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxFpdConfig(ChainsCommon_Ar12xxConfigOut *pCfgOut)
{
    Int32 retVal;

    Vps_printf(" CHAINS: Init AR12xx ... \n\r");
    ChainsCommon_ar12xxInit();
    pCfgOut->numProfiles = 1U;
    gChainsCommon_ar12xxFrameType = 1U;
    gAr12xx_config.dataPathCfgArgs.transferFmtPkt0 = 1;

    retVal = Bsp_ar12xxGetWidthHeight(&pCfgOut->csi2OutWidth, &pCfgOut->csi2OutHeight);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    pCfgOut->radarWidth[0] = gAr1243ProfileArgs[1].numAdcSamples;
    pCfgOut->radarHeight[0] = AR1243_RADAR_HEIGHT;
    pCfgOut->inBufAddrOffset = 0U;
    pCfgOut->offsetBwAntennas [0] = pCfgOut->radarWidth[0] * sizeof(UInt32);
    pCfgOut->numTxAntenna = CHAINS_RADAR_NUM_TX_ANTENNA;
    pCfgOut->numRxAntenna = CHAINS_RADAR_NUM_RX_ANTENNA;

    ChainsCommon_CalcResolution(1, &pCfgOut->rangeRes[0], &pCfgOut->velocityRes[0]);

    pCfgOut->numValidBits = CHAINS_AR1243_ADC_DATA_FORMAT;

    Vps_printf(" CHAINS: Init AR12xx ... DONE !!!\n\r");
}

/**
 *******************************************************************************
 *
 * \brief   Function to Set up the ISS capture parameters
 *
 * \param   pPrm     ISS Capture params
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxFpdSetIssCaptureParams(IssCaptureLink_CreateParams *pPrm)
{
    Int32 retVal;
    UInt32 outWidth, outHeight;
    UInt32 idx;

    retVal = Bsp_ar12xxGetWidthHeight(&outWidth, &outHeight);
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);

    memset(pPrm, 0, sizeof(IssCaptureLink_CreateParams));
    /* Set CSI2 Capture params */
    pPrm->videoIfMode = SYSTEM_VIFM_SCH_CSI2;
    pPrm->videoIfWidth = SYSTEM_VIFW_4LANES;
    pPrm->bufCaptMode = SYSTEM_CAPT_BCM_LAST_FRM_REPEAT;
    pPrm->allocBufferForRawDump = 0U;
    pPrm->numCh = 1U;

    pPrm->outParams[0U].dataFormat = SYSTEM_DF_BAYER_BGGR;
    pPrm->outParams[0U].inCsi2DataFormat = CHAINS_AR1243_CSI_CAPTURE_DATA_FORMAT;
    pPrm->outParams[0U].inCsi2VirtualChanNum = 0U;
    pPrm->outParams[0U].numOutBuf = 3;

    if (pPrm->outParams[0U].inCsi2DataFormat == SYSTEM_CSI2_RAW8)
    {
        pPrm->outParams[0U].width = outWidth * 2U;
    }
    else
    {
        pPrm->outParams[0U].width = outWidth;
    }
    pPrm->outParams[0U].height = outHeight;

    pPrm->outParams[0U].maxWidth = pPrm->outParams[0U].width;
    pPrm->outParams[0U].maxHeight = pPrm->outParams[0U].height;

    for(idx = 0U; idx < ISSCAPT_LINK_MAX_CMPLXIO_INST; idx++)
    {
        pPrm->csi2Params[idx].isCmplxIoCfgValid = FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.clockLane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.clockLane.position = 1U;
        pPrm->csi2Params[idx].cmplxIoCfg.data1Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data1Lane.position = 2U;
        pPrm->csi2Params[idx].cmplxIoCfg.data2Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data2Lane.position = 3U;
        pPrm->csi2Params[idx].cmplxIoCfg.data3Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data3Lane.position = 4U;
        pPrm->csi2Params[idx].cmplxIoCfg.data4Lane.pol      = (UInt32) FALSE;
        pPrm->csi2Params[idx].cmplxIoCfg.data4Lane.position = 5U;
        pPrm->csi2Params[idx].csi2PhyClk                    = 800U;
    }
    pPrm->csi2Params[0].isCmplxIoCfgValid = TRUE;
}

/**
 *******************************************************************************
 *
 * \brief   Function to Start the Deserializer
 *
 * \param   None
 *
 * \return  None
 *
 *******************************************************************************
*/
Void ChainsCommon_ar12xxFpdStart(void)
{
    Int32 retVal = SYSTEM_LINK_STATUS_SOK;

    Vps_printf(" CHAINS: AR12xx Starting Deserializer ...\n\r");
    retVal = BspUtils_fpdInitAR12xx();
    UTILS_assert(SYSTEM_LINK_STATUS_SOK == retVal);
    Vps_printf(" CHAINS: AR12xx Starting Deserializer ... DONE !!!\n\r");
}

Void ChainsCommon_ar12xxFpdStop(void)
{
    Vps_printf(" CHAINS: AR12xx De-initing Deserializer ...\n\r");
    BspUtils_fpdDeInitAR12xx();
    Vps_printf(" CHAINS: AR12xx De-initing Deserializer ... DONE !\n\r");
        ChainsCommon_ar12xxDeInit();
}
