This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA3: Radar SDK: 3T4R data format in radar_capture_process demo

Part Number: TDA3
Other Parts Discussed in Thread: AWR1243

Hi expert,

Customer has question on radar processor sdk radar_capture_process demo: 

When using 3T4R on AWR1243+TDA3x, what is the data format and buffer address in TDA3x? Is there any document to describe the details?

Thank you.

Allen

  • Hi Allen,

    For an example configuration as below:

    1. Number of ADC Samples per chirp = 512

    2. Number of chirps per dwell = 128

    3. Number of Rx Antenna = 4

    4. Number of Tx Antenna = 1

    5. Bytes per ADC sample = 4 (Complex Number, I followed by Q)

    Samples are arranged in memory as follows:

    Chirp 0 : Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Chirp 1 : Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Chirp 2 : Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    ......

    Chirp 128: Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Some more details from the AWR12 side is available in  http://www.ti.com/lit/an/swra555/swra555.pdf

    From more details on how the data is consumed on TDA side, you can refer to Section 4.1.2 Buffer Examples in PROCESSOR_SDK_RADAR_XX_XX_XX_XX\ti_components\algorithms\eve_sw_XX_XX_XX_XX\apps\docs\EVE_Applets_UserGuide.pdf

    Thanks and Regards,

    Piyali

  • Also for 3 TX the format becomes:
    Chirp 0 : TX1Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 0 : TX2Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 0 : TX3Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Chirp 1 : TX1Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 1 : TX2Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 1 : TX3Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Chirp 2 : TX1Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX1Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 2 : TX2Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX2Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]
    Chirp 2 : TX3Rx1 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx2 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3RX3 [Sample 1; Sample 2; Sample 3; ..... Sample 512] TX3Rx4 [Sample 1; Sample 2; Sample 3; ..... Sample 512]

    Thanks and Regards,
    Piyali
  • Hi Piyali,

    Thanks for your answers. We can get the correct data now. But we have some questions on the chirp parameter in the received data.
    For example, if we use 512 samples, 128 chirps per frame. For each TX antenna, data length is 512*128*4*4+4*4*128=0x100800, total length is 0x100800*3.
    In each chirp data there is a header contains chirp parameter,the parameter pattern is like( LE ,interleaved mode),
    Chirp 0 : TX1Rx1 [00 00 00 00] TX1Rx2 [01 00 00 00] TX1RX3 [02 00 00 00] TX1Rx4 [03 00 00 00]

    We can see when using 3T4R, the parameter pattern in header is
    chirp0 TX1RX1[00 00 00 00]
    chirp0 TX1RX2[01 00 00 00]
    chirp0 TX1RX3[02 00 00 00]
    chirp0 TX1RX4[03 00 00 00]
    chirp1 TX1RX1[00 00 02 00]
    chirp1 TX1RX2[01 00 02 00]
    chirp1 TX1RX3[02 00 02 00]
    chirp1 TX1RX4[03 00 02 00]
    ......
    chirp128 TX1RX1[00 00 FE 00]
    chirp128 TX1RX2[01 00 FE 00]
    chirp128 TX1RX3[02 00 FE 00]
    chirp128 TX1RX4[03 00 FE 00]

    The questions are
    1. Is there any parameter in header to indicate TX number? Or we can only get different TX data by offset?
    2. In 3T4R case, the counter for chirp number is always even number that means plus 2 each chirp, but in 1T4R case, it plus 1 each chirp. Why is it different from these two cases?

    Thank you
    Allen
  • Hi Allen,

    The CP Data will capture the chirp number and not the Tx number. Details are highlighted in the snapshot from the AWR Interface control document.

    I have seen the chirp numbers incrementing by one in multi Tx case as well. Will it be possible to review the chirp configuration and frame configuration you are using?

    Thanks and Regards,

    Piyali

  • Hi Piyali,

    Attached is code for chirp and frame configuration, could you please help to compare with your multi-antenna configuration? 

    Or could you please share your code with us? 

    Thank you

    /******************************************************************************
    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();
    }
    

  • Hi Allen,

    Thanks for sharing the configuration. I will have a look at it and let you know.

    Regards,

    Piyali

  • Hi Allen,

    I tried this configuration at my end and I am not seeing the increment by 2. I am placing a breakpoint at the input of the FFT stage to check the input ADC buffers at the following addresses and see the following values:

    Address Value
    inBufAddr + 257*4*0 + 514*4*4*0 (1st Rx, 1st Tx) 0x00000000
    inBufAddr + 257*4*1 + 514*4*4*0 (2nd Rx, 1st Tx) 0x00000001
    inBufAddr + 257*4*1 + 514*4*4*1 (2nd Rx, 2nd Tx) 0x00010001
    inBufAddr + 257*4*3 + 514*4*4*2 (4th Rx and 3rd Tx) 0x00020003

    Can you please re-check at your end if in case you see the same behavior?

    Thanks and Regards,

    Piyali

  • Hi Piyali,

    Thanks. Customer will try this configuration again and feedback later.

    Regards,
    Allen