/*
 * Copyright (c) 2015, Freescale Semiconductor, Inc.
 * Copyright 2016-2017 NXP
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * o Redistributions of source code must retain the above copyright notice, this list
 *   of conditions and the following disclaimer.
 *
 * o Redistributions in binary form must reproduce the above copyright notice, this
 *   list of conditions and the following disclaimer in the documentation and/or
 *   other materials provided with the distribution.
 *
 * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
 *   contributors may be used to endorse or promote products derived from this
 *   software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 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 <stdlib.h>
#include <stdint.h>
#include "fsl_device_registers.h"
#include "fsl_common.h"
#include "fsl_xcvr.h"
#include "fsl_xcvr_trim.h"
#include <math.h>
#include "ifr_radio.h"

/*******************************************************************************
 * Definitions
 ******************************************************************************/
#define channelMapTableSize (128U)
#define gPllDenom_c         0x02000000U /* Denominator is a constant value */
#define ABS(x) ((x) > 0 ? (x) : -(x))

#ifndef TRUE
#define TRUE                        (true)
#endif

#ifndef FALSE
#define FALSE                       (false)
#endif
#define RF_OSCILLATOR_STAYS_ON     (false) /* Control whether RF_OSC can be left on all the time. */
#define RF_OSCILLATOR_READY        ((RSIM->CONTROL & RSIM_CONTROL_RF_OSC_READY_MASK) != 0x0U)

#ifndef EXTERNAL_CLOCK_GEN
#define EXTERNAL_CLOCK_GEN   0
#endif

#define ANT_A   1
#define ANT_B   0

#ifndef XCVR_COEX_RF_ACTIVE_PIN
#define XCVR_COEX_RF_ACTIVE_PIN ANT_B
#endif /* XCVR_COEX_RF_ACTIVE_PIN */

typedef struct xcvr_pllChannel_tag
{
    unsigned int integer;
    unsigned int numerator;
} xcvr_pllChannel_t;

/*******************************************************************************
 * Prototypes
 ******************************************************************************/
void XcvrPanic(XCVR_PANIC_ID_T panic_id, uint32_t panic_address);
void rf_osc_startup(void);
void rf_osc_shutdown(void);
extern double trunc (double);
extern double round (double);

/*******************************************************************************
 * Variables
 ******************************************************************************/
static panic_fptr s_PanicFunctionPtr = NULL;
const xcvr_pllChannel_t mapTable [channelMapTableSize] =
{
    {0x00000025, 0x07C00000}, /* 0 */
    {0x00000025, 0x07C80000}, /* 1 */
    {0x00000025, 0x07D00000}, /* 2 */
    {0x00000025, 0x07D80000}, /* 3 */
    {0x00000025, 0x07E00000}, /* 4 */
    {0x00000025, 0x07E80000}, /* 5 */
    {0x00000025, 0x07F00000}, /* 6 */
    {0x00000025, 0x07F80000}, /* 7 */
    {0x00000025, 0x00000000}, /* 8 */
    {0x00000025, 0x00080000}, /* 9 */
    {0x00000025, 0x00100000}, /* 10 */
    {0x00000025, 0x00180000}, /* 11 */
    {0x00000025, 0x00200000}, /* 12 */
    {0x00000025, 0x00280000}, /* 13 */
    {0x00000025, 0x00300000}, /* 14 */
    {0x00000025, 0x00380000}, /* 15 */
    {0x00000025, 0x00400000}, /* 16 */
    {0x00000025, 0x00480000}, /* 17 */
    {0x00000025, 0x00500000}, /* 18 */
    {0x00000025, 0x00580000}, /* 19 */
    {0x00000025, 0x00600000}, /* 20 */
    {0x00000025, 0x00680000}, /* 21 */
    {0x00000025, 0x00700000}, /* 22 */
    {0x00000025, 0x00780000}, /* 23 */
    {0x00000025, 0x00800000}, /* 24 */
    {0x00000025, 0x00880000}, /* 25 */
    {0x00000025, 0x00900000}, /* 26 */
    {0x00000025, 0x00980000}, /* 27 */
    {0x00000025, 0x00A00000}, /* 28 */
    {0x00000025, 0x00A80000}, /* 29 */
    {0x00000025, 0x00B00000}, /* 30 */
    {0x00000025, 0x00B80000}, /* 31 */
    {0x00000025, 0x00C00000}, /* 32 */
    {0x00000025, 0x00C80000}, /* 33 */
    {0x00000025, 0x00D00000}, /* 34 */
    {0x00000025, 0x00D80000}, /* 35 */
    {0x00000025, 0x00E00000}, /* 36 */
    {0x00000025, 0x00E80000}, /* 37 */
    {0x00000025, 0x00F00000}, /* 38 */
    {0x00000025, 0x00F80000}, /* 39 */
    {0x00000025, 0x01000000}, /* 40 */
    {0x00000026, 0x07080000}, /* 41 */
    {0x00000026, 0x07100000}, /* 42 */
    {0x00000026, 0x07180000}, /* 43 */
    {0x00000026, 0x07200000}, /* 44 */
    {0x00000026, 0x07280000}, /* 45 */
    {0x00000026, 0x07300000}, /* 46 */
    {0x00000026, 0x07380000}, /* 47 */
    {0x00000026, 0x07400000}, /* 48 */
    {0x00000026, 0x07480000}, /* 49 */
    {0x00000026, 0x07500000}, /* 50 */
    {0x00000026, 0x07580000}, /* 51 */
    {0x00000026, 0x07600000}, /* 52 */
    {0x00000026, 0x07680000}, /* 53 */
    {0x00000026, 0x07700000}, /* 54 */
    {0x00000026, 0x07780000}, /* 55 */
    {0x00000026, 0x07800000}, /* 56 */
    {0x00000026, 0x07880000}, /* 57 */
    {0x00000026, 0x07900000}, /* 58 */
    {0x00000026, 0x07980000}, /* 59 */
    {0x00000026, 0x07A00000}, /* 60 */
    {0x00000026, 0x07A80000}, /* 61 */
    {0x00000026, 0x07B00000}, /* 62 */
    {0x00000026, 0x07B80000}, /* 63 */
    {0x00000026, 0x07C00000}, /* 64 */
    {0x00000026, 0x07C80000}, /* 65 */
    {0x00000026, 0x07D00000}, /* 66 */
    {0x00000026, 0x07D80000}, /* 67 */
    {0x00000026, 0x07E00000}, /* 68 */
    {0x00000026, 0x07E80000}, /* 69 */
    {0x00000026, 0x07F00000}, /* 70 */
    {0x00000026, 0x07F80000}, /* 71 */
    {0x00000026, 0x00000000}, /* 72 */
    {0x00000026, 0x00080000}, /* 73 */
    {0x00000026, 0x00100000}, /* 74 */
    {0x00000026, 0x00180000}, /* 75 */
    {0x00000026, 0x00200000}, /* 76 */
    {0x00000026, 0x00280000}, /* 77 */
    {0x00000026, 0x00300000}, /* 78 */
    {0x00000026, 0x00380000}, /* 79 */
    {0x00000026, 0x00400000}, /* 80 */
    {0x00000026, 0x00480000}, /* 81 */
    {0x00000026, 0x00500000}, /* 82 */
    {0x00000026, 0x00580000}, /* 83 */
    {0x00000026, 0x00600000}, /* 84 */
    {0x00000026, 0x00680000}, /* 85 */
    {0x00000026, 0x00700000}, /* 86 */
    {0x00000026, 0x00780000}, /* 87 */
    {0x00000026, 0x00800000}, /* 88 */
    {0x00000026, 0x00880000}, /* 89 */
    {0x00000026, 0x00900000}, /* 90 */
    {0x00000026, 0x00980000}, /* 91 */
    {0x00000026, 0x00A00000}, /* 92 */
    {0x00000026, 0x00A80000}, /* 93 */
    {0x00000026, 0x00B00000}, /* 94 */
    {0x00000026, 0x00B80000}, /* 95 */
    {0x00000026, 0x00C00000}, /* 96 */
    {0x00000026, 0x00C80000}, /* 97 */
    {0x00000026, 0x00D00000}, /* 98 */
    {0x00000026, 0x00D80000}, /* 99 */
    {0x00000026, 0x00E00000}, /* 100 */
    {0x00000026, 0x00E80000}, /* 101 */
    {0x00000026, 0x00F00000}, /* 102 */
    {0x00000026, 0x00F80000}, /* 103 */
    {0x00000026, 0x01000000}, /* 104 */
    {0x00000027, 0x07080000}, /* 105 */
    {0x00000027, 0x07100000}, /* 106 */
    {0x00000027, 0x07180000}, /* 107 */
    {0x00000027, 0x07200000}, /* 108 */
    {0x00000027, 0x07280000}, /* 109 */
    {0x00000027, 0x07300000}, /* 110 */
    {0x00000027, 0x07380000}, /* 111 */
    {0x00000027, 0x07400000}, /* 112 */
    {0x00000027, 0x07480000}, /* 113 */
    {0x00000027, 0x07500000}, /* 114 */
    {0x00000027, 0x07580000}, /* 115 */
    {0x00000027, 0x07600000}, /* 116 */
    {0x00000027, 0x07680000}, /* 117 */
    {0x00000027, 0x07700000}, /* 118 */
    {0x00000027, 0x07780000}, /* 119 */
    {0x00000027, 0x07800000}, /* 120 */
    {0x00000027, 0x07880000}, /* 121 */
    {0x00000027, 0x07900000}, /* 122 */
    {0x00000027, 0x07980000}, /* 123 */
    {0x00000027, 0x07A00000}, /* 124 */
    {0x00000027, 0x07A80000}, /* 125 */
    {0x00000027, 0x07B00000}, /* 126 */
    {0x00000027, 0x07B80000}  /* 127 */
};

/* Registers for timing of TX & RX */
#if RADIO_IS_GEN_3P0
uint16_t tx_rx_on_delay = TX_RX_ON_DELinit;
uint16_t tx_rx_synth_delay = TX_RX_SYNTH_init;
#else
#if RF_OSC_26MHZ == 1
uint16_t tx_rx_on_delay = TX_RX_ON_DELAY_VAL_26MHZ;
#else
uint16_t tx_rx_on_delay = TX_RX_ON_DELAY_VAL;
#endif /* RF_OSC_26MHZ == 1 */
uint16_t tx_rx_synth_delay = TX_RX_SYNTH_DELAY_VAL;
#endif /* RADIO_IS_GEN_3P0 */

/* NOTE: These arrays MUST be ordered in the same order as the radio_mode_t enumeration. */
#if RADIO_IS_GEN_3P0
const xcvr_mode_datarate_config_t * mode_configs_dr_2mbps[NUM_RADIO_MODES] =
{
    (xcvr_mode_datarate_config_t *)NULL, /* 2Mbps rate not supported for this mode */
    (xcvr_mode_datarate_config_t *)NULL, /* 2Mbps rate not supported for this mode */
    (xcvr_mode_datarate_config_t *)NULL, /* 2Mbps rate not supported for this mode */
    &xcvr_GFSK_BT_0p5_h_0p5_2mbps_config,
    &xcvr_GFSK_BT_0p5_h_0p32_2mbps_config,
    (xcvr_mode_datarate_config_t *)NULL, /* 2Mbps rate not supported for this mode */
    (xcvr_mode_datarate_config_t *)NULL, /* 2Mbps rate not supported for this mode */
    &xcvr_GFSK_BT_0p3_h_0p5_2mbps_config,
    &xcvr_GFSK_BT_0p7_h_0p5_2mbps_config,
    &xcvr_MSK_2mbps_config,
};
#endif /* RADIO_IS_GEN_3P0 */

const xcvr_mode_datarate_config_t * mode_configs_dr_1mbps[NUM_RADIO_MODES] =
{
    &xcvr_BLE_1mbps_config,
#if RADIO_IS_GEN_2P1
    NULL,
    NULL,
#else
    &xcvr_ZIGBEE_500kbps_config, /* 802.15.4 only supports one configuration */
    &xcvr_ANT_1mbps_config,
#endif /* RADIO_IS_GEN_2P1 */
    &xcvr_GFSK_BT_0p5_h_0p5_1mbps_config,
    &xcvr_GFSK_BT_0p5_h_0p32_1mbps_config,
    &xcvr_GFSK_BT_0p5_h_0p7_1mbps_config,
    &xcvr_GFSK_BT_0p5_h_1p0_1mbps_config,
    &xcvr_GFSK_BT_0p3_h_0p5_1mbps_config,
    &xcvr_GFSK_BT_0p7_h_0p5_1mbps_config,
    &xcvr_MSK_1mbps_config,
};

const xcvr_mode_datarate_config_t * mode_configs_dr_500kbps[NUM_RADIO_MODES] =
{
    &xcvr_BLE_1mbps_config, /* Invalid option */
#if RADIO_IS_GEN_2P1
    NULL,
    NULL,
#else
    &xcvr_ZIGBEE_500kbps_config, /* 802.15.4 setting */
    &xcvr_ANT_1mbps_config, /* Invalid option */
#endif /* RADIO_IS_GEN_2P1 */
    &xcvr_GFSK_BT_0p5_h_0p5_500kbps_config,
    &xcvr_GFSK_BT_0p5_h_0p32_500kbps_config,
    &xcvr_GFSK_BT_0p5_h_0p7_500kbps_config,
    &xcvr_GFSK_BT_0p5_h_1p0_500kbps_config,
    &xcvr_GFSK_BT_0p3_h_0p5_500kbps_config,
    &xcvr_GFSK_BT_0p7_h_0p5_500kbps_config,
    &xcvr_MSK_500kbps_config,
};
const xcvr_mode_datarate_config_t * mode_configs_dr_250kbps[NUM_RADIO_MODES] =
{
    &xcvr_BLE_1mbps_config, /* Invalid option */
#if RADIO_IS_GEN_2P1
    NULL,
    NULL,
#else
    &xcvr_ZIGBEE_500kbps_config, /* 802.15.4 only supports one configuration */
    &xcvr_ANT_1mbps_config, /* Invalid option */
#endif /* RADIO_IS_GEN_2P1 */
    &xcvr_GFSK_BT_0p5_h_0p5_250kbps_config,
    &xcvr_GFSK_BT_0p5_h_0p32_250kbps_config,
    &xcvr_GFSK_BT_0p5_h_0p7_250kbps_config,
    &xcvr_GFSK_BT_0p5_h_1p0_250kbps_config,
    &xcvr_GFSK_BT_0p3_h_0p5_250kbps_config,
    &xcvr_GFSK_BT_0p7_h_0p5_250kbps_config,
    &xcvr_MSK_250kbps_config,
};

static xcvr_currConfig_t current_xcvr_config;

void rf_osc_startup(void)
{
    if (!RF_OSCILLATOR_READY)
    {
        RSIM->CONTROL |= RSIM_CONTROL_RF_OSC_EN_MASK;
    }
    while (!RF_OSCILLATOR_READY)
    {
        /* Wait for RF_OSC_READY to be asserted before continuing */
    }
}

void rf_osc_shutdown(void)
{
    if (!RF_OSCILLATOR_STAYS_ON)
    {
        RSIM->CONTROL &= ~RSIM_CONTROL_RF_OSC_EN_MASK;
    }
}
    
/*******************************************************************************
 * Code
 ******************************************************************************/
xcvrStatus_t XCVR_Init(radio_mode_t radio_mode, data_rate_t data_rate)
{
    const xcvr_mode_datarate_config_t * mode_datarate_config;
    const xcvr_datarate_config_t * datarate_config ;
    const xcvr_mode_config_t * radio_mode_cfg;
    const xcvr_common_config_t * radio_common_config;

    xcvrStatus_t status;

    IFR_SW_TRIM_TBL_ENTRY_T sw_trim_tbl[] =
    {
        {TRIM_STATUS, 0, FALSE}, /*< Fetch the trim status word if available.*/
        {TRIM_VERSION, 0, FALSE} /*< Fetch the trim version number if available.*/
    };
    const uint8_t NUM_TRIM_TBL_ENTRIES = sizeof(sw_trim_tbl)/sizeof(IFR_SW_TRIM_TBL_ENTRY_T);

#ifndef SIMULATION

#if (EXTERNAL_CLOCK_GEN)
    RSIM->RF_OSC_CTRL |= RSIM_RF_OSC_CTRL_RF_OSC_BYPASS_EN_MASK; /* Only when external clock is being used */
#endif /* EXTERNAL_CLOCK_GEN */

#if RADIO_IS_GEN_2P0
    RSIM->RF_OSC_CTRL &= ~RSIM_RF_OSC_CTRL_RADIO_EXT_OSC_OVRD_MASK; /* Set EXT_OSC_OVRD value to zero */
    RSIM->RF_OSC_CTRL |= RSIM_RF_OSC_CTRL_RADIO_EXT_OSC_OVRD_EN_MASK; /* Enable over-ride with zero value */   
#endif /* RADIO_IS_GEN_2P0 */

    /* Check that this is the proper radio version */
    {
        uint8_t radio_id = ((RSIM->MISC & RSIM_MISC_RADIO_VERSION_MASK)>>RSIM_MISC_RADIO_VERSION_SHIFT);

        if (
#if RADIO_IS_GEN_3P0
            (radio_id != 0x5) /* KW3 Gen3 */
#elif RADIO_IS_GEN_2P1
            (radio_id != 0x5) /* KW35 Gen2.1 */
#else
            (radio_id != 0x3) &&  /* KW41/31/21 v1 */
            (radio_id != 0xB) /* KW41/31/21 v1.1 */
#endif /* RADIO_IS_GEN_3P0 */
            )
        {
            XcvrPanic(WRONG_RADIO_ID_DETECTED, (uint32_t)&XCVR_Init);
        }
    }

#if RADIO_IS_GEN_3P0
    /* Assert Radio Run Request and wait for ack from SPM. */
    RSIM->POWER |= RSIM_POWER_RSIM_RUN_REQUEST_MASK;
    while ((RSIM->POWER & RSIM_POWER_SPM_RUN_ACK_STAT_MASK) == 0)
    {
    }
    RSIM->CONTROL |= RSIM_CONTROL_RSIM_CGC_XCVR_EN_MASK; 
    rf_osc_startup(); /* Start RF_OSC to allow radio registers access */
#else
    SIM->SCGC5 |= SIM_SCGC5_PHYDIG_MASK;

    /* Load IFR trim values */
    handle_ifr(&sw_trim_tbl[0], NUM_TRIM_TBL_ENTRIES);
#endif /* RADIO_IS_GEN_3P0 */

#endif /* ifndef SIMULATION */

    /* Perform the desired XCVR initialization and configuration */
    status = XCVR_GetDefaultConfig(radio_mode, data_rate, 
                                   (const xcvr_common_config_t **)&radio_common_config, 
                                   (const xcvr_mode_config_t **)&radio_mode_cfg, 
                                   (const xcvr_mode_datarate_config_t **)&mode_datarate_config, 
                                   (const xcvr_datarate_config_t **)&datarate_config);
								  
    if (status == gXcvrSuccess_c)
    {
        status = XCVR_Configure((const xcvr_common_config_t *)radio_common_config, 
                                (const xcvr_mode_config_t *)radio_mode_cfg, 
                                (const xcvr_mode_datarate_config_t *)mode_datarate_config, 
                                (const xcvr_datarate_config_t *)datarate_config, 25, XCVR_FIRST_INIT);
        current_xcvr_config.radio_mode = radio_mode;
        current_xcvr_config.data_rate = data_rate;
    }

    return status;
}

void XCVR_Deinit(void)
{
#if RADIO_IS_GEN_3P0
    rf_osc_shutdown();
    RSIM->POWER |= RSIM_POWER_RSIM_STOP_MODE_MASK; /* Set radio stop mode to RVLLS */
    RSIM->POWER &= ~RSIM_POWER_RSIM_RUN_REQUEST_MASK; /* Clear RUN request */
#else

#endif /* RADIO_IS_GEN_3P0 */
}

xcvrStatus_t XCVR_GetDefaultConfig(radio_mode_t radio_mode, 
                                   data_rate_t data_rate, 
                                   const xcvr_common_config_t ** com_config, 
                                   const xcvr_mode_config_t ** mode_config, 
                                   const xcvr_mode_datarate_config_t ** mode_datarate_config, 
                                   const xcvr_datarate_config_t ** datarate_config)
{
    xcvrStatus_t status = gXcvrSuccess_c;
    /* Common configuration pointer */
    *com_config = (const xcvr_common_config_t *)&xcvr_common_config;

    /* Mode dependent configuration pointer */
    switch (radio_mode)
    {
#if !RADIO_IS_GEN_2P1
        case ZIGBEE_MODE:
            *mode_config = ( const xcvr_mode_config_t *)&zgbe_mode_config; /* Zigbee configuration */
            break;
        case ANT_MODE:
            *mode_config = ( const xcvr_mode_config_t *)&ant_mode_config; /* ANT configuration */
            break;
#endif /* !RADIO_IS_GEN_2P1 */
        case BLE_MODE:
            *mode_config = ( const xcvr_mode_config_t *)&ble_mode_config; /* BLE configuration */
            break;
        case GFSK_BT_0p5_h_0p5:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p5_h_0p5_mode_config; /* GFSK_BT_0p5_h_0p5 configuration */
            break;
        case GFSK_BT_0p5_h_0p32:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p5_h_0p32_mode_config; /* GFSK_BT_0p5_h_0p32 configuration */
            break;
        case GFSK_BT_0p5_h_0p7:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p5_h_0p7_mode_config; /* GFSK_BT_0p5_h_0p7 configuration */
            break;
        case GFSK_BT_0p5_h_1p0:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p5_h_1p0_mode_config; /* GFSK_BT_0p5_h_1p0 configuration */
            break;
        case GFSK_BT_0p3_h_0p5:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p3_h_0p5_mode_config; /* GFSK_BT_0p3_h_0p5 configuration */
            break;
        case GFSK_BT_0p7_h_0p5:
            *mode_config = ( const xcvr_mode_config_t *)&gfsk_bt_0p7_h_0p5_mode_config; /* GFSK_BT_0p7_h_0p5 configuration */
            break;
        case MSK:
            *mode_config = ( const xcvr_mode_config_t *)&msk_mode_config; /* MSK configuration */
            break;
        default:    
            status = gXcvrInvalidParameters_c;
            break;
    }

    /* Data rate dependent and modeXdatarate dependent configuration pointers */
    if (status == gXcvrSuccess_c) /* Only attempt this pointer assignment process if prior switch() statement completed successfully */
    {
        switch (data_rate)
        {
#if RADIO_IS_GEN_3P0
            case DR_2MBPS:
                if ((radio_mode == GFSK_BT_0p5_h_0p7) || (radio_mode == GFSK_BT_0p5_h_1p0) || (radio_mode == ZIGBEE_MODE) || (radio_mode == BLE_MODE) || (radio_mode == ANT_MODE))
                {
                    status = gXcvrInvalidParameters_c;
                }
                else
                {
                    *datarate_config = (const xcvr_datarate_config_t *)&xcvr_2mbps_config; /* 2Mbps datarate configurations */
                    *mode_datarate_config = (const xcvr_mode_datarate_config_t *)mode_configs_dr_2mbps[radio_mode];
                }
                break;
#endif /* RADIO_IS_GEN_3P0 */
            case DR_1MBPS:
                *datarate_config = (const xcvr_datarate_config_t *)&xcvr_1mbps_config; /* 1Mbps datarate configurations */
                *mode_datarate_config = (const xcvr_mode_datarate_config_t *)mode_configs_dr_1mbps[radio_mode];
                break;
            case DR_500KBPS:
                if (radio_mode == ZIGBEE_MODE)
                {
                    /* See fsl_xcvr_zgbe_config.c for settings */
#if !RADIO_IS_GEN_2P1
                    *datarate_config = (const xcvr_datarate_config_t *)&xcvr_802_15_4_500kbps_config; /* 500Kbps datarate configurations */
#endif /* !RADIO_IS_GEN_2P1 */
                }
                else
                {
                    *datarate_config = (const xcvr_datarate_config_t *)&xcvr_500kbps_config; /* 500Kbps datarate configurations */
                }
                *mode_datarate_config = (const xcvr_mode_datarate_config_t *)mode_configs_dr_500kbps[radio_mode];
                break;
            case DR_250KBPS:
                *datarate_config = (const xcvr_datarate_config_t *)&xcvr_250kbps_config; /* 250Kbps datarate configurations */
                *mode_datarate_config = (const xcvr_mode_datarate_config_t *)mode_configs_dr_250kbps[radio_mode];
                break;
            default:
                status = gXcvrInvalidParameters_c;
                break;
        }
    }

    return status;
}

xcvrStatus_t XCVR_Configure(const xcvr_common_config_t *com_config, 
                            const xcvr_mode_config_t *mode_config, 
                            const xcvr_mode_datarate_config_t *mode_datarate_config, 
                            const xcvr_datarate_config_t *datarate_config, 
                            int16_t tempDegC, 
                            XCVR_INIT_MODE_CHG_T first_init)
{
    xcvrStatus_t config_status = gXcvrSuccess_c;
    uint32_t temp; 

    /* Turn on the module clocks before doing anything */
#if RADIO_IS_GEN_3P0
    RSIM->CONTROL |= mode_config->scgc5_clock_ena_bits; /* Same bit storage is used but RSIM bit assignments are applied */
#else
    SIM->SCGC5 |= mode_config->scgc5_clock_ena_bits;
#endif /* RADIO_IS_GEN_3P0 */

    /*******************************************************************************/
    /* XCVR_ANA configs */
    /*******************************************************************************/

    /* Configure PLL Loop Filter */
    if (first_init)
    {
        XCVR_ANA->SY_CTRL_1 &= ~com_config->ana_sy_ctrl1.mask;
        XCVR_ANA->SY_CTRL_1 |= com_config->ana_sy_ctrl1.init;
    }

    /* Configure VCO KVM */
    XCVR_ANA->SY_CTRL_2 &= ~mode_datarate_config->ana_sy_ctrl2.mask;
    XCVR_ANA->SY_CTRL_2 |= mode_datarate_config->ana_sy_ctrl2.init;

    /* Configure analog filter bandwidth */
    XCVR_ANA->RX_BBA &= ~mode_datarate_config->ana_rx_bba.mask;
    XCVR_ANA->RX_BBA |= mode_datarate_config->ana_rx_bba.init;
    XCVR_ANA->RX_TZA &= ~mode_datarate_config->ana_rx_tza.mask;
    XCVR_ANA->RX_TZA |= mode_datarate_config->ana_rx_tza.init;

#if RADIO_IS_GEN_2P0
    if (first_init)
    {
        temp = XCVR_ANA->TX_DAC_PA;
        temp &= ~XCVR_ANALOG_TX_DAC_PA_TX_PA_BUMP_VBIAS_MASK;
        temp |= XCVR_ANALOG_TX_DAC_PA_TX_PA_BUMP_VBIAS(4);
        XCVR_ANA->TX_DAC_PA = temp;

        temp = XCVR_ANA->BB_LDO_2;
        temp &= ~XCVR_ANALOG_BB_LDO_2_BB_LDO_VCOLO_TRIM_MASK;
        temp |= XCVR_ANALOG_BB_LDO_2_BB_LDO_VCOLO_TRIM(0);
        XCVR_ANA->BB_LDO_2 = temp;

        temp = XCVR_ANA->RX_LNA;
        temp &= ~XCVR_ANALOG_RX_LNA_RX_LNA_BUMP_MASK;
        temp |= XCVR_ANALOG_RX_LNA_RX_LNA_BUMP(1);
        XCVR_ANA->RX_LNA = temp;

        temp = XCVR_ANA->BB_LDO_1;
        temp &= ~XCVR_ANALOG_BB_LDO_1_BB_LDO_FDBK_TRIM_MASK;
        temp |= XCVR_ANALOG_BB_LDO_1_BB_LDO_FDBK_TRIM(1);
        XCVR_ANA->BB_LDO_1 = temp;
    }
#endif /* RADIO_IS_GEN_2P0 */

    /*******************************************************************************/
    /* XCVR_MISC configs */
    /*******************************************************************************/
    temp = XCVR_MISC->XCVR_CTRL;
    temp &= ~(mode_config->xcvr_ctrl.mask | XCVR_CTRL_XCVR_CTRL_REF_CLK_FREQ_MASK);
    temp |= mode_config->xcvr_ctrl.init;
	
#if RF_OSC_26MHZ == 1
    {
        temp |= XCVR_CTRL_XCVR_CTRL_REF_CLK_FREQ(1);
    }
#endif /* RF_OSC_26MHZ == 1 */

    XCVR_MISC->XCVR_CTRL = temp;

#if RADIO_IS_GEN_2P1
    XCVR_MISC->FAD_CTRL &= ~XCVR_CTRL_FAD_CTRL_FAD_NOT_GPIO_MASK;
#endif /* RADIO_IS_GEN_2P1 */

    /*******************************************************************************/
    /* XCVR_PHY configs */
    /*******************************************************************************/
#if RADIO_IS_GEN_3P0
    XCVR_PHY->PHY_FSK_PD_CFG0 = mode_config->phy_fsk_pd_cfg0;
    XCVR_PHY->PHY_FSK_PD_CFG1 = mode_config->phy_fsk_pd_cfg1;
    XCVR_PHY->PHY_FSK_CFG = mode_config->phy_fsk_cfg;
    XCVR_PHY->PHY_FSK_MISC = mode_config->phy_fsk_misc | mode_datarate_config->phy_fsk_misc_mode_datarate;
    XCVR_PHY->FSK_FAD_CTRL = mode_config->phy_fad_ctrl;
#else
    XCVR_PHY->PHY_PRE_REF0 = mode_config->phy_pre_ref0_init;
    XCVR_PHY->PRE_REF1 = mode_config->phy_pre_ref1_init;
    XCVR_PHY->PRE_REF2 = mode_config->phy_pre_ref2_init;
    XCVR_PHY->CFG1 = mode_config->phy_cfg1_init;
    XCVR_PHY->CFG2 = mode_datarate_config->phy_cfg2_init;
    XCVR_PHY->EL_CFG = mode_config->phy_el_cfg_init | datarate_config->phy_el_cfg_init; /* EL_WIN_SIZE and EL_INTERVAL are datarate dependent, */
#endif /* RADIO_IS_GEN_3P0 */

    /*******************************************************************************/
    /* XCVR_PLL_DIG configs */
    /*******************************************************************************/
    if (first_init)
    {
        XCVR_PLL_DIG->HPM_BUMP = com_config->pll_hpm_bump;
        XCVR_PLL_DIG->MOD_CTRL = com_config->pll_mod_ctrl;
        XCVR_PLL_DIG->CHAN_MAP = com_config->pll_chan_map;
        XCVR_PLL_DIG->LOCK_DETECT = com_config->pll_lock_detect;
        XCVR_PLL_DIG->HPM_CTRL = com_config->pll_hpm_ctrl;
#if !RADIO_IS_GEN_2P1
        XCVR_PLL_DIG->HPMCAL_CTRL = com_config->pll_hpmcal_ctrl;
#endif /* !RADIO_IS_GEN_2P1 */
        XCVR_PLL_DIG->HPM_SDM_RES = com_config->pll_hpm_sdm_res;
        XCVR_PLL_DIG->LPM_CTRL = com_config->pll_lpm_ctrl;
        XCVR_PLL_DIG->LPM_SDM_CTRL1 = com_config->pll_lpm_sdm_ctrl1;
        XCVR_PLL_DIG->DELAY_MATCH = com_config->pll_delay_match;
        XCVR_PLL_DIG->CTUNE_CTRL = com_config->pll_ctune_ctrl;
    }

    /*******************************************************************************/
    /* XCVR_RX_DIG configs */
    /*******************************************************************************/

    /* Configure RF Aux PLL for proper operation based on external clock frequency */
    if (first_init)
    {
        temp = XCVR_ANA->RX_AUXPLL;
        temp &= ~XCVR_ANALOG_RX_AUXPLL_VCO_DAC_REF_ADJUST_MASK;
#if RF_OSC_26MHZ == 1
        {
            temp |= XCVR_ANALOG_RX_AUXPLL_VCO_DAC_REF_ADJUST(4);
        }
#else
        {
            temp |= XCVR_ANALOG_RX_AUXPLL_VCO_DAC_REF_ADJUST(7);
        }
#endif /* RF_OSC_26MHZ == 1 */
        XCVR_ANA->RX_AUXPLL = temp;
    }
    
    /* Configure RX_DIG_CTRL */
#if RF_OSC_26MHZ == 1
    {
        temp = com_config->rx_dig_ctrl_init | /* Common portion of RX_DIG_CTRL init */
               mode_config->rx_dig_ctrl_init_26mhz | /* Mode  specific portion of RX_DIG_CTRL init */
               datarate_config->rx_dig_ctrl_init_26mhz | /* Datarate specific portion of RX_DIG_CTRL init */
               XCVR_RX_DIG_RX_DIG_CTRL_RX_SRC_EN_MASK; /* Always enable the sample rate converter for 26MHz */
    }
#else
    {
        temp = com_config->rx_dig_ctrl_init | /* Common portion of RX_DIG_CTRL init */
               mode_config->rx_dig_ctrl_init_32mhz | /* Mode specific portion of RX_DIG_CTRL init */
               datarate_config->rx_dig_ctrl_init_32mhz | /* Datarate specific portion of RX_DIG_CTRL init */
               0; /* Always disable the sample rate converter for 32MHz */
    }
#endif /* RF_OSC_26MHZ == 1 */

    temp |= com_config->rx_dig_ctrl_init;  /* Common portion of RX_DIG_CTRL init */
    XCVR_RX_DIG->RX_DIG_CTRL = temp;

    /* DCOC_CAL_IIR */
#if RF_OSC_26MHZ == 1
    {
        XCVR_RX_DIG->DCOC_CAL_IIR = datarate_config->dcoc_cal_iir_init_26mhz;
    }
#else
    {
        XCVR_RX_DIG->DCOC_CAL_IIR = datarate_config->dcoc_cal_iir_init_32mhz;
    }
#endif /* RF_OSC_26MHZ == 1 */

    /* DC_RESID_CTRL */
#if RF_OSC_26MHZ == 1
    {
        XCVR_RX_DIG->DC_RESID_CTRL = com_config->dc_resid_ctrl_init | datarate_config->dc_resid_ctrl_26mhz;
    }
#else
    {
        XCVR_RX_DIG->DC_RESID_CTRL = com_config->dc_resid_ctrl_init | datarate_config->dc_resid_ctrl_32mhz;
    }
#endif /* RF_OSC_26MHZ == 1 */

    /* DCOC_CTRL_0  & _1 */
#if RF_OSC_26MHZ == 1
    {
        XCVR_RX_DIG->DCOC_CTRL_0 = com_config->dcoc_ctrl_0_init_26mhz | datarate_config->dcoc_ctrl_0_init_26mhz; /* Combine common and datarate specific settings */
        XCVR_RX_DIG->DCOC_CTRL_1 = com_config->dcoc_ctrl_1_init | datarate_config->dcoc_ctrl_1_init_26mhz; /* Combine common and datarate specific settings */
#if RADIO_IS_GEN_3P0
        XCVR_RX_DIG->DCOC_CTRL_2 = datarate_config->dcoc_ctrl_2_init_26mhz;
#endif /* RADIO_IS_GEN_3P0 */

    }
#else
    {
        XCVR_RX_DIG->DCOC_CTRL_0 = com_config->dcoc_ctrl_0_init_32mhz | datarate_config->dcoc_ctrl_0_init_32mhz; /* Combine common and datarate specific settings */
        XCVR_RX_DIG->DCOC_CTRL_1 = com_config->dcoc_ctrl_1_init | datarate_config->dcoc_ctrl_1_init_32mhz; /* Combine common and datarate specific settings */
#if RADIO_IS_GEN_3P0
        XCVR_RX_DIG->DCOC_CTRL_2 = datarate_config->dcoc_ctrl_2_init_32mhz;
#endif /* RADIO_IS_GEN_3P0 */
    }
#endif /* RF_OSC_26MHZ == 1 */
    if (first_init)
    {
        /* DCOC_CAL_GAIN */
        XCVR_RX_DIG->DCOC_CAL_GAIN = com_config->dcoc_cal_gain_init;

        /* DCOC_CAL_RCP */
        XCVR_RX_DIG->DCOC_CAL_RCP = com_config->dcoc_cal_rcp_init;
        XCVR_RX_DIG->LNA_GAIN_VAL_3_0 = com_config->lna_gain_val_3_0;
        XCVR_RX_DIG->LNA_GAIN_VAL_7_4 = com_config->lna_gain_val_7_4;
        XCVR_RX_DIG->LNA_GAIN_VAL_8 = com_config->lna_gain_val_8;
        XCVR_RX_DIG->BBA_RES_TUNE_VAL_7_0 = com_config->bba_res_tune_val_7_0;
        XCVR_RX_DIG->BBA_RES_TUNE_VAL_10_8 = com_config->bba_res_tune_val_10_8;

        /* LNA_GAIN_LIN_VAL */
        XCVR_RX_DIG->LNA_GAIN_LIN_VAL_2_0 = com_config->lna_gain_lin_val_2_0_init;
        XCVR_RX_DIG->LNA_GAIN_LIN_VAL_5_3 = com_config->lna_gain_lin_val_5_3_init;
        XCVR_RX_DIG->LNA_GAIN_LIN_VAL_8_6 = com_config->lna_gain_lin_val_8_6_init;
        XCVR_RX_DIG->LNA_GAIN_LIN_VAL_9 = com_config->lna_gain_lin_val_9_init;

        /* BBA_RES_TUNE_LIN_VAL */
        XCVR_RX_DIG->BBA_RES_TUNE_LIN_VAL_3_0 = com_config->bba_res_tune_lin_val_3_0_init;
        XCVR_RX_DIG->BBA_RES_TUNE_LIN_VAL_7_4 = com_config->bba_res_tune_lin_val_7_4_init;
        XCVR_RX_DIG->BBA_RES_TUNE_LIN_VAL_10_8 = com_config->bba_res_tune_lin_val_10_8_init;

        /* BBA_STEP */
        XCVR_RX_DIG->DCOC_BBA_STEP = com_config->dcoc_bba_step_init;

        /* DCOC_TZA_STEP */
        XCVR_RX_DIG->DCOC_TZA_STEP_0 = com_config->dcoc_tza_step_00_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_1 = com_config->dcoc_tza_step_01_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_2 = com_config->dcoc_tza_step_02_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_3 = com_config->dcoc_tza_step_03_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_4 = com_config->dcoc_tza_step_04_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_5 = com_config->dcoc_tza_step_05_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_6 = com_config->dcoc_tza_step_06_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_7 = com_config->dcoc_tza_step_07_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_8 = com_config->dcoc_tza_step_08_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_9 = com_config->dcoc_tza_step_09_init;
        XCVR_RX_DIG->DCOC_TZA_STEP_10 = com_config->dcoc_tza_step_10_init;

#if (RADIO_IS_GEN_3P0 || RADIO_IS_GEN_2P1)
        /* DCOC_CAL_FAIL and DCOC_CAL_PASS */
        XCVR_RX_DIG->DCOC_CAL_FAIL_TH = com_config->dcoc_cal_fail_th_init;
        XCVR_RX_DIG->DCOC_CAL_PASS_TH = com_config->dcoc_cal_pass_th_init;
#endif /* (RADIO_IS_GEN_3P0 || RADIO_IS_GEN_2P1) */
    }

    /* AGC_CTRL_0 .. _3 */
    XCVR_RX_DIG->AGC_CTRL_0 = com_config->agc_ctrl_0_init | mode_config->agc_ctrl_0_init;

#if RF_OSC_26MHZ == 1
    {
        XCVR_RX_DIG->AGC_CTRL_1 = com_config->agc_ctrl_1_init_26mhz | datarate_config->agc_ctrl_1_init_26mhz; /* Combine common and datarate specific settings */
        XCVR_RX_DIG->AGC_CTRL_2 = mode_datarate_config->agc_ctrl_2_init_26mhz;
    }
#else
    {
        XCVR_RX_DIG->AGC_CTRL_1 = com_config->agc_ctrl_1_init_32mhz | datarate_config->agc_ctrl_1_init_32mhz; /* Combine common and datarate specific settings */
        XCVR_RX_DIG->AGC_CTRL_2 = mode_datarate_config->agc_ctrl_2_init_32mhz;
    }
#endif /* RF_OSC_26MHZ == 1 */

    if (first_init)
    {
        XCVR_RX_DIG->AGC_CTRL_3 = com_config->agc_ctrl_3_init;

        /* AGC_GAIN_TBL_** */
        XCVR_RX_DIG->AGC_GAIN_TBL_03_00 = com_config->agc_gain_tbl_03_00_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_07_04 = com_config->agc_gain_tbl_07_04_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_11_08 = com_config->agc_gain_tbl_11_08_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_15_12 = com_config->agc_gain_tbl_15_12_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_19_16 = com_config->agc_gain_tbl_19_16_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_23_20 = com_config->agc_gain_tbl_23_20_init;
        XCVR_RX_DIG->AGC_GAIN_TBL_26_24 = com_config->agc_gain_tbl_26_24_init;

        /* RSSI_CTRL_0 */
        XCVR_RX_DIG->RSSI_CTRL_0 = com_config->rssi_ctrl_0_init;

#if RADIO_IS_GEN_3P0
        XCVR_RX_DIG->RSSI_CTRL_1 = com_config->rssi_ctrl_1_init;
#endif /* RADIO_IS_GEN_3P0 */

        /* CCA_ED_LQI_0 and _1 */
        XCVR_RX_DIG->CCA_ED_LQI_CTRL_0 = com_config->cca_ed_lqi_ctrl_0_init;
        XCVR_RX_DIG->CCA_ED_LQI_CTRL_1 = com_config->cca_ed_lqi_ctrl_1_init;
    }

    /* Channel filter coefficients */
#if RF_OSC_26MHZ == 1
    {
        XCVR_RX_DIG->RX_CHF_COEF_0 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_0;
        XCVR_RX_DIG->RX_CHF_COEF_1 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_1;
        XCVR_RX_DIG->RX_CHF_COEF_2 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_2;
        XCVR_RX_DIG->RX_CHF_COEF_3 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_3;
        XCVR_RX_DIG->RX_CHF_COEF_4 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_4;
        XCVR_RX_DIG->RX_CHF_COEF_5 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_5;
        XCVR_RX_DIG->RX_CHF_COEF_6 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_6;
        XCVR_RX_DIG->RX_CHF_COEF_7 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_7;
        XCVR_RX_DIG->RX_CHF_COEF_8 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_8;
        XCVR_RX_DIG->RX_CHF_COEF_9 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_9;
        XCVR_RX_DIG->RX_CHF_COEF_10 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_10;
        XCVR_RX_DIG->RX_CHF_COEF_11 = mode_datarate_config->rx_chf_coeffs_26mhz.rx_chf_coef_11;
    }
#else
    {
        XCVR_RX_DIG->RX_CHF_COEF_0 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_0;
        XCVR_RX_DIG->RX_CHF_COEF_1 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_1;
        XCVR_RX_DIG->RX_CHF_COEF_2 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_2;
        XCVR_RX_DIG->RX_CHF_COEF_3 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_3;
        XCVR_RX_DIG->RX_CHF_COEF_4 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_4;
        XCVR_RX_DIG->RX_CHF_COEF_5 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_5;
        XCVR_RX_DIG->RX_CHF_COEF_6 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_6;
        XCVR_RX_DIG->RX_CHF_COEF_7 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_7;
        XCVR_RX_DIG->RX_CHF_COEF_8 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_8;
        XCVR_RX_DIG->RX_CHF_COEF_9 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_9;
        XCVR_RX_DIG->RX_CHF_COEF_10 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_10;
        XCVR_RX_DIG->RX_CHF_COEF_11 = mode_datarate_config->rx_chf_coeffs_32mhz.rx_chf_coef_11;
    }
#endif /* RF_OSC_26MHZ == 1 */

    XCVR_RX_DIG->RX_RCCAL_CTRL0 = mode_datarate_config->rx_rccal_ctrl_0;
    XCVR_RX_DIG->RX_RCCAL_CTRL1 = mode_datarate_config->rx_rccal_ctrl_1;

    /*******************************************************************************/
    /* XCVR_TSM configs */
    /*******************************************************************************/
    XCVR_TSM->CTRL = com_config->tsm_ctrl;

#if RADIO_IS_GEN_2P0
    if ((mode_config->radio_mode != ZIGBEE_MODE) && (mode_config->radio_mode != BLE_MODE))
    {
        XCVR_TSM->CTRL &= ~XCVR_TSM_CTRL_DATA_PADDING_EN_MASK;
    }
#endif /* RADIO_IS_GEN_2P0 */

    if (first_init)
    {
#if !RADIO_IS_GEN_2P1
        XCVR_MISC->LPPS_CTRL = com_config->lpps_ctrl_init; /* Register is in XCVR_MISC but grouped with TSM for intialization */
#endif /* !RADIO_IS_GEN_2P1 */

        XCVR_TSM->OVRD2 = com_config->tsm_ovrd2_init;
        /* TSM registers and timings - dependent upon clock frequency */
#if RF_OSC_26MHZ == 1
        {
            XCVR_TSM->END_OF_SEQ = com_config->end_of_seq_init_26mhz;
            XCVR_TSM->FAST_CTRL2 = com_config->tsm_fast_ctrl2_init_26mhz;
            XCVR_TSM->RECYCLE_COUNT = com_config->recycle_count_init_26mhz;
            XCVR_TSM->TIMING14 = com_config->tsm_timing_14_init_26mhz;
            XCVR_TSM->TIMING16 = com_config->tsm_timing_16_init_26mhz;
            XCVR_TSM->TIMING25 = com_config->tsm_timing_25_init_26mhz;
            XCVR_TSM->TIMING27 = com_config->tsm_timing_27_init_26mhz;
            XCVR_TSM->TIMING28 = com_config->tsm_timing_28_init_26mhz;
            XCVR_TSM->TIMING29 = com_config->tsm_timing_29_init_26mhz;
            XCVR_TSM->TIMING30 = com_config->tsm_timing_30_init_26mhz;
            XCVR_TSM->TIMING31 = com_config->tsm_timing_31_init_26mhz;
            XCVR_TSM->TIMING32 = com_config->tsm_timing_32_init_26mhz;
            XCVR_TSM->TIMING33 = com_config->tsm_timing_33_init_26mhz;
            XCVR_TSM->TIMING36 = com_config->tsm_timing_36_init_26mhz;
            XCVR_TSM->TIMING37 = com_config->tsm_timing_37_init_26mhz;
            XCVR_TSM->TIMING39 = com_config->tsm_timing_39_init_26mhz;
            XCVR_TSM->TIMING40 = com_config->tsm_timing_40_init_26mhz;
            XCVR_TSM->TIMING41 = com_config->tsm_timing_41_init_26mhz;
            XCVR_TSM->TIMING52 = com_config->tsm_timing_52_init_26mhz;
            XCVR_TSM->TIMING54 = com_config->tsm_timing_54_init_26mhz;
            XCVR_TSM->TIMING55 = com_config->tsm_timing_55_init_26mhz;
            XCVR_TSM->TIMING56 = com_config->tsm_timing_56_init_26mhz;
        }
#else
        {
            XCVR_TSM->END_OF_SEQ = com_config->end_of_seq_init_32mhz;
            XCVR_TSM->FAST_CTRL2 = com_config->tsm_fast_ctrl2_init_32mhz;
            XCVR_TSM->RECYCLE_COUNT = com_config->recycle_count_init_32mhz;
            XCVR_TSM->TIMING14 = com_config->tsm_timing_14_init_32mhz;
            XCVR_TSM->TIMING16 = com_config->tsm_timing_16_init_32mhz;
            XCVR_TSM->TIMING25 = com_config->tsm_timing_25_init_32mhz;
            XCVR_TSM->TIMING27 = com_config->tsm_timing_27_init_32mhz;
            XCVR_TSM->TIMING28 = com_config->tsm_timing_28_init_32mhz;
            XCVR_TSM->TIMING29 = com_config->tsm_timing_29_init_32mhz;
            XCVR_TSM->TIMING30 = com_config->tsm_timing_30_init_32mhz;
            XCVR_TSM->TIMING31 = com_config->tsm_timing_31_init_32mhz;
            XCVR_TSM->TIMING32 = com_config->tsm_timing_32_init_32mhz;
            XCVR_TSM->TIMING33 = com_config->tsm_timing_33_init_32mhz;
            XCVR_TSM->TIMING36 = com_config->tsm_timing_36_init_32mhz;
            XCVR_TSM->TIMING37 = com_config->tsm_timing_37_init_32mhz;
            XCVR_TSM->TIMING39 = com_config->tsm_timing_39_init_32mhz;
            XCVR_TSM->TIMING40 = com_config->tsm_timing_40_init_32mhz;
            XCVR_TSM->TIMING41 = com_config->tsm_timing_41_init_32mhz;
            XCVR_TSM->TIMING52 = com_config->tsm_timing_52_init_32mhz;
            XCVR_TSM->TIMING54 = com_config->tsm_timing_54_init_32mhz;
            XCVR_TSM->TIMING55 = com_config->tsm_timing_55_init_32mhz;
            XCVR_TSM->TIMING56 = com_config->tsm_timing_56_init_32mhz;
        }
#endif /* RF_OSC_26MHZ == 1 */

        /* TSM timings independent of clock frequency */
        XCVR_TSM->TIMING00 = com_config->tsm_timing_00_init;
        XCVR_TSM->TIMING01 = com_config->tsm_timing_01_init;
        XCVR_TSM->TIMING02 = com_config->tsm_timing_02_init;
        XCVR_TSM->TIMING03 = com_config->tsm_timing_03_init;
        XCVR_TSM->TIMING04 = com_config->tsm_timing_04_init;
        XCVR_TSM->TIMING05 = com_config->tsm_timing_05_init;
        XCVR_TSM->TIMING06 = com_config->tsm_timing_06_init;
        XCVR_TSM->TIMING07 = com_config->tsm_timing_07_init;
        XCVR_TSM->TIMING08 = com_config->tsm_timing_08_init;
        XCVR_TSM->TIMING09 = com_config->tsm_timing_09_init;
        XCVR_TSM->TIMING10 = com_config->tsm_timing_10_init;
        XCVR_TSM->TIMING11 = com_config->tsm_timing_11_init;
        XCVR_TSM->TIMING12 = com_config->tsm_timing_12_init;
        XCVR_TSM->TIMING13 = com_config->tsm_timing_13_init;
        XCVR_TSM->TIMING15 = com_config->tsm_timing_15_init;
        XCVR_TSM->TIMING17 = com_config->tsm_timing_17_init;
        XCVR_TSM->TIMING18 = com_config->tsm_timing_18_init;
        XCVR_TSM->TIMING19 = com_config->tsm_timing_19_init;
        XCVR_TSM->TIMING20 = com_config->tsm_timing_20_init;
        XCVR_TSM->TIMING21 = com_config->tsm_timing_21_init;
        XCVR_TSM->TIMING22 = com_config->tsm_timing_22_init;
        XCVR_TSM->TIMING23 = com_config->tsm_timing_23_init;
        XCVR_TSM->TIMING24 = com_config->tsm_timing_24_init;
        XCVR_TSM->TIMING26 = com_config->tsm_timing_26_init;
        XCVR_TSM->TIMING34 = com_config->tsm_timing_34_init;
        XCVR_TSM->TIMING35 = com_config->tsm_timing_35_init;
        XCVR_TSM->TIMING38 = com_config->tsm_timing_38_init;
        XCVR_TSM->TIMING51 = com_config->tsm_timing_51_init;
        XCVR_TSM->TIMING53 = com_config->tsm_timing_53_init;
        XCVR_TSM->TIMING57 = com_config->tsm_timing_57_init;
        XCVR_TSM->TIMING58 = com_config->tsm_timing_58_init;
		
#if RF_OSC_26MHZ == 1
        {
            XCVR_TSM->END_OF_SEQ = XCVR_TSM_END_OF_SEQ_END_OF_TX_WU(END_OF_TX_WU) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_TX_WD(END_OF_TX_WD) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_RX_WU(END_OF_RX_WU_26MHZ) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_RX_WD(END_OF_RX_WD_26MHZ);
        }
#else
        {
            XCVR_TSM->END_OF_SEQ = XCVR_TSM_END_OF_SEQ_END_OF_TX_WU(END_OF_TX_WU) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_TX_WD(END_OF_TX_WD) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_RX_WU(END_OF_RX_WU) |
                                   XCVR_TSM_END_OF_SEQ_END_OF_RX_WD(END_OF_RX_WD);
        }
#endif /* RF_OSC_26MHZ == 1 */

        XCVR_TSM->PA_RAMP_TBL0 = com_config->pa_ramp_tbl_0_init;
        XCVR_TSM->PA_RAMP_TBL1 = com_config->pa_ramp_tbl_1_init;
		
#if RADIO_IS_GEN_3P0
        XCVR_TSM->PA_RAMP_TBL2 = com_config->pa_ramp_tbl_2_init;
        XCVR_TSM->PA_RAMP_TBL3 = com_config->pa_ramp_tbl_3_init;

        /* Apply PA_RAMP_TIME == 4usec adjustments to TX_WD signals */
#if (PA_RAMP_TIME == 4)
        XCVR_TSM->TIMING00 += B1(2); /* (bb_ldo_hf_en) */
        XCVR_TSM->TIMING01 += B1(2); /* (bb_ldo_adcdac_en) */
        XCVR_TSM->TIMING03 += B1(2); /* (bb_ldo_pd_en) */
        XCVR_TSM->TIMING04 += B1(2); /* (bb_ldo_fdbk_en) */
        XCVR_TSM->TIMING05 += B1(2); /* (bb_ldo_vcolo_en) */
        XCVR_TSM->TIMING06 += B1(2); /* (bb_ldo_vtref_en) */
        XCVR_TSM->TIMING10 += B1(2); /* (bb_xtal_pll_ref_clk_en) */
        XCVR_TSM->TIMING11 += B1(2); /* (bb_xtal_dac_ref_clk_en) */
        XCVR_TSM->TIMING15 += B1(2); /* (sy_vco_en) */
        XCVR_TSM->TIMING17 += B1(2); /* (sy_lo_tx_buf_en) */
        XCVR_TSM->TIMING18 += B1(2); /* (sy_divn_en) */
        XCVR_TSM->TIMING20 += B1(2); /*  (sy_pd_en) */
        XCVR_TSM->TIMING21 += B1(2); /* (sy_lo_divn_en) */
        XCVR_TSM->TIMING23 += B1(2); /* (sy_lo_tx_en) */
        XCVR_TSM->TIMING26 += B1(2); /* (tx_pa_en) */ 
        XCVR_TSM->TIMING34 += B1(2); /* (pll_dig_en) */
        XCVR_TSM->TIMING35 += B1(2); /* (tx_dig_en) */
        XCVR_TSM->TIMING38 += B1(2); /* (sigma_delta_en) */
        XCVR_TSM->TIMING58 += B1(2)  /* (tx_hpm_dac_en) */
        temp = XCVR_TSM->TIMING14;
        temp &= 0xFFFF0000; 
        temp |= B0(END_OF_TX_WU - 4) | B1(END_OF_TX_WU + 1); /* (sy_pd_cycle_slip_ld_ft_en) */
        XCVR_TSM->TIMING14 = temp;
#endif /* (PA_RAMP_TIME == 4) */
#endif /* RADIO_IS_GEN_3P0 */
    }
    
#if RADIO_IS_GEN_3P0
    if (mode_config->radio_mode == ZIGBEE_MODE)
    {
        temp = XCVR_TSM->TIMING35;
        temp &= ~(B0(0xFF));
        if (DATA_PADDING_EN == 1)
        {
            temp |= B0(END_OF_TX_WU - 2 - 8); /* Adjust for data padding time */
        }
        else
        {
            temp |= B0(END_OF_TX_WU - 2); /* No data padding adjustment */
        }
        XCVR_TSM->TIMING35 = temp;
    }
#else

    if ((mode_datarate_config->radio_mode == MSK) && ((mode_datarate_config->data_rate == DR_500KBPS) || (mode_datarate_config->data_rate == DR_250KBPS)))
    {
        /* Apply a specific value of TX_DIG_EN which assumes no DATA PADDING */
        XCVR_TSM->TIMING35 = com_config->tsm_timing_35_init | B0(TX_DIG_EN_ASSERT_MSK500); /* LSbyte is mode specific */
    }
    else
    {
        XCVR_TSM->TIMING35 = com_config->tsm_timing_35_init | mode_config->tsm_timing_35_init; /* LSbyte is mode specific, other bytes are common */
    }
#endif /* RADIO_IS_GEN_3P0 */
    
    /*******************************************************************************/
    /* XCVR_TX_DIG configs */
    /*******************************************************************************/
#if RF_OSC_26MHZ == 1
    {
        XCVR_TX_DIG->FSK_SCALE = mode_datarate_config->tx_fsk_scale_26mhz; /* Applies only to 802.15.4 & MSK but won't harm other protocols */
        XCVR_TX_DIG->GFSK_COEFF1 = mode_config->tx_gfsk_coeff1_26mhz;
        XCVR_TX_DIG->GFSK_COEFF2 = mode_config->tx_gfsk_coeff2_26mhz;
    }
#else
    {
        XCVR_TX_DIG->FSK_SCALE = mode_datarate_config->tx_fsk_scale_32mhz; /* Applies only to 802.15.4 & MSK but won't harm other protocols */
        XCVR_TX_DIG->GFSK_COEFF1 = mode_config->tx_gfsk_coeff1_32mhz;
        XCVR_TX_DIG->GFSK_COEFF2 = mode_config->tx_gfsk_coeff2_32mhz;
    }
#endif /* RF_OSC_26MHZ == 1 */

    if (first_init)
    {
        XCVR_TX_DIG->CTRL = com_config->tx_ctrl;
        XCVR_TX_DIG->DATA_PADDING = com_config->tx_data_padding;
        XCVR_TX_DIG->DFT_PATTERN = com_config->tx_dft_pattern;
		
#if !RADIO_IS_GEN_2P1
        XCVR_TX_DIG->RF_DFT_BIST_1 = com_config->rf_dft_bist_1;
        XCVR_TX_DIG->RF_DFT_BIST_2 = com_config->rf_dft_bist_2;
#endif /* !RADIO_IS_GEN_2P1 */
    }

    XCVR_TX_DIG->GFSK_CTRL = mode_config->tx_gfsk_ctrl;

#ifndef SIMULATION
#if (TRIM_BBA_DCOC_DAC_AT_INIT)
    /* PortC 17 for function observability */
    PORTC->PCR[17] &= ~PORT_PCR_MUX_MASK;
    PORTC->PCR[17] |= PORT_PCR_MUX(1); /* PTC17 to alt 1 - GPIO */
    GPIOC->PDDR |= (1<<17); /* Set PC17 GPIO to output direction */
    GPIOC->PCOR = (1<<17); /* Set PC17 GPIO to LOW */
    if (first_init)
    {
        uint32_t end_of_rx_wu = 0;
        XCVR_ForceRxWu();
        /* Wait for TSM to reach the end of warmup (unless you want to capture some samples during DCOC cal phase) */
        temp = XCVR_TSM->END_OF_SEQ;
        end_of_rx_wu = (temp & XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_MASK) >> XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_SHIFT;
        while ((( XCVR_MISC->XCVR_STATUS & XCVR_CTRL_XCVR_STATUS_TSM_COUNT_MASK) >> XCVR_CTRL_XCVR_STATUS_TSM_COUNT_SHIFT ) != end_of_rx_wu) {};
        GPIOC->PSOR = (1 << 17); /* Set PC17 GPIO to HIGH */
//        if (!rx_bba_dcoc_dac_trim_shortIQ())
        if (!rx_bba_dcoc_dac_trim_DCest())
        {
            config_status = gXcvrTrimFailure_c;
        }
        GPIOC->PCOR = (1 << 17); /* Set PC17 GPIO to LOW */
        XCVR_ForceRxWd();
        GPIOC->PSOR = (1 << 17); /* Set PC17 GPIO to HIGH */
        DCOC_DAC_INIT_Cal(1);
        GPIOC->PCOR = (1 << 17); /* Set PC17 GPIO to LOW */
    }
#endif /* TRIM_BBA_DCOC_DAC_AT_INIT */
#endif /* ifndef SIMULATION */
    return config_status;
}

void XCVR_Reset(void)
{
#if RADIO_IS_GEN_3P0
#else
    RSIM->CONTROL |= RSIM_CONTROL_RADIO_RESET_BIT_MASK; /* Assert radio software reset */
    RSIM->CONTROL &= ~RSIM_CONTROL_RADIO_RESET_BIT_MASK; /* De-assert radio software reset */
    RSIM->CONTROL &= ~RSIM_CONTROL_RADIO_RESET_BIT_MASK; /* De-assert radio software reset a second time per RADIO_RESET bit description */
#endif /* RADIO_IS_GEN_3P0 */
}

xcvrStatus_t XCVR_ChangeMode (radio_mode_t new_radio_mode, data_rate_t new_data_rate) /* Change from one radio mode to another */
{
    xcvrStatus_t status;
    const xcvr_mode_datarate_config_t * mode_datarate_config;
    const xcvr_datarate_config_t * datarate_config ;
    const xcvr_mode_config_t * radio_mode_cfg;
    const xcvr_common_config_t * radio_common_config;

    status = XCVR_GetDefaultConfig(new_radio_mode, new_data_rate, (void *)&radio_common_config, (void *)&radio_mode_cfg, (void *)&mode_datarate_config, (void *)&datarate_config );
    
    if (status == gXcvrSuccess_c)
    {
        status = XCVR_Configure((const xcvr_common_config_t *)radio_common_config, 
                                (const xcvr_mode_config_t *)radio_mode_cfg, 
                                (const xcvr_mode_datarate_config_t *)mode_datarate_config, 
                                (const xcvr_datarate_config_t *)datarate_config, 25, XCVR_MODE_CHANGE);
        current_xcvr_config.radio_mode = new_radio_mode;
        current_xcvr_config.data_rate = new_data_rate;
    }

    return status;
}

void XCVR_EnaNBRSSIMeas( uint8_t IIRnbEnable )
{
    if (IIRnbEnable)
    {
        XCVR_RX_DIG->RSSI_CTRL_0 |= XCVR_RX_DIG_RSSI_CTRL_0_RSSI_IIR_CW_WEIGHT_MASK;
    }
    else
    {
        XCVR_RX_DIG->RSSI_CTRL_0 &= ~XCVR_RX_DIG_RSSI_CTRL_0_RSSI_IIR_CW_WEIGHT_MASK;
    }
}

xcvrStatus_t XCVR_OverrideFrequency ( uint32_t freq, uint32_t refOsc )
{
    double integer_used_in_Hz, 
           integer_used_in_LSB, 
           numerator_fraction, 
           numerator_in_Hz, 
           numerator_in_LSB, 
           numerator_unrounded,
           real_int_and_fraction, 
           real_fraction, 
           requested_freq_in_LSB,
           sdm_lsb;
    uint32_t temp;
    static uint32_t integer_truncated,
                    integer_to_use;
    static int32_t numerator_rounded;

    /* Configure for Coarse Tune */
    uint32_t coarse_tune_target = freq / 1000000;

    temp = XCVR_PLL_DIG->CTUNE_CTRL;
    temp &= ~XCVR_PLL_DIG_CTUNE_CTRL_CTUNE_TARGET_MANUAL_MASK;
    temp |= XCVR_PLL_DIG_CTUNE_CTRL_CTUNE_TARGET_MANUAL(coarse_tune_target);
    XCVR_PLL_DIG->CTUNE_CTRL = temp;

    /* Calculate the Low Port values */
    sdm_lsb = refOsc / 131072.0;

    real_int_and_fraction = freq / (refOsc * 2.0);

    integer_truncated = (uint32_t) trunc(real_int_and_fraction);

    real_fraction = real_int_and_fraction - integer_truncated;

    if (real_fraction > 0.5) 
    {
        integer_to_use = integer_truncated + 1;
    } 
    else                     
    {
        integer_to_use = integer_truncated;
    }

    numerator_fraction = real_int_and_fraction - integer_to_use;

    integer_used_in_Hz  = integer_to_use * refOsc * 2;
    integer_used_in_LSB = integer_used_in_Hz / sdm_lsb;

    numerator_in_Hz  = numerator_fraction * refOsc * 2;
    numerator_in_LSB = numerator_in_Hz    / sdm_lsb;

    requested_freq_in_LSB = integer_used_in_LSB + numerator_in_LSB;

    numerator_unrounded = (requested_freq_in_LSB - integer_used_in_LSB) * 256;

    numerator_rounded = (int32_t)round(numerator_unrounded);

    /* Write the Low Port Integer and Numerator */
    temp = XCVR_PLL_DIG->LPM_SDM_CTRL1;
    temp &= ~XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_MASK;
    temp |= (XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG(integer_to_use) | 
             XCVR_PLL_DIG_LPM_SDM_CTRL1_SDM_MAP_DISABLE_MASK);
    XCVR_PLL_DIG->LPM_SDM_CTRL1 = temp;

    XCVR_PLL_DIG->LPM_SDM_CTRL2 = numerator_rounded;

    return gXcvrSuccess_c;
}

void XCVR_RegisterPanicCb ( panic_fptr fptr ) /* Allow upper layers to provide PANIC callback */
{
    s_PanicFunctionPtr = fptr;
}

void XcvrPanic(XCVR_PANIC_ID_T panic_id, uint32_t panic_address)
{
    if ( s_PanicFunctionPtr != NULL)
    {
        s_PanicFunctionPtr(panic_id, panic_address, 0, 0);
    }
    else
    {
        uint8_t dummy;

        while(1)
        {
            dummy = dummy;
        }
    }
}

healthStatus_t XCVR_HealthCheck ( void ) /* Allow upper layers to poll the radio health */
{
    return (healthStatus_t)NO_ERRORS;
}

void XCVR_FadLppsControl(FAD_LPPS_CTRL_T control)
{

}

/* Helper function to map radio mode to LL usage */
link_layer_t map_mode_to_ll(radio_mode_t mode)
{
    link_layer_t llret;
    switch (mode)
    {
        case BLE_MODE:
            llret = BLE_LL;
            break;
        case ZIGBEE_MODE:
            llret = ZIGBEE_LL;
            break;
        case ANT_MODE:
            llret = ANT_LL;
            break;
        case GFSK_BT_0p5_h_0p5:
        case GFSK_BT_0p5_h_0p32:
        case GFSK_BT_0p5_h_0p7:
        case GFSK_BT_0p5_h_1p0:
        case GFSK_BT_0p3_h_0p5:
        case GFSK_BT_0p7_h_0p5:
        case MSK: 
            llret = GENFSK_LL;
            break;
        default:
            llret = UNASSIGNED_LL;
            break;
    }
    return llret;
}

#if RADIO_IS_GEN_3P0
void XCVR_SetBSM_NTW_Address(uint32_t bsm_ntw_address)
{
    XCVR_PHY->NTW_ADR_BSM = bsm_ntw_address;
}

uint32_t XCVR_GetBSM_NTW_Address(void)
{
    return XCVR_PHY->NTW_ADR_BSM;
}
#endif /* RADIO_IS_GEN_3P0 */

/* Setup IRQ mapping to LL interrupt outputs in XCVR_CTRL */
xcvrStatus_t XCVR_SetIRQMapping(radio_mode_t irq0_mapping, radio_mode_t irq1_mapping)
{
    link_layer_t int0 = map_mode_to_ll(irq0_mapping);
    link_layer_t int1 = map_mode_to_ll(irq1_mapping);
    xcvrStatus_t statusret;
    /* Make sure the two LL's requested aren't the same */
    if (int0 == int1)
    {
        statusret = gXcvrInvalidParameters_c;
    }
    else
    {
        uint32_t temp;
        temp = XCVR_MISC->XCVR_CTRL;
        temp &= ~(XCVR_CTRL_XCVR_CTRL_RADIO0_IRQ_SEL_MASK | XCVR_CTRL_XCVR_CTRL_RADIO1_IRQ_SEL_MASK);
        temp |= (XCVR_CTRL_XCVR_CTRL_RADIO0_IRQ_SEL(int0) | XCVR_CTRL_XCVR_CTRL_RADIO1_IRQ_SEL(int1));
        XCVR_MISC->XCVR_CTRL = temp;
        statusret = gXcvrSuccess_c;
    }
    return statusret;
}

/* Get current state of IRQ mapping for either  radio INT0 or INT1 */
link_layer_t XCVR_GetIRQMapping(uint8_t int_num)
{
    if (int_num == 0)
    {
        return (link_layer_t)((XCVR_MISC->XCVR_CTRL & XCVR_CTRL_XCVR_CTRL_RADIO0_IRQ_SEL_MASK)>>XCVR_CTRL_XCVR_CTRL_RADIO0_IRQ_SEL_SHIFT);
    }
    else
    {
        return (link_layer_t)((XCVR_MISC->XCVR_CTRL & XCVR_CTRL_XCVR_CTRL_RADIO1_IRQ_SEL_MASK)>>XCVR_CTRL_XCVR_CTRL_RADIO1_IRQ_SEL_SHIFT);
    }
}

/* Get current state of radio mode and data rate */
xcvrStatus_t XCVR_GetCurrentConfig(xcvr_currConfig_t * curr_config)
{
    xcvrStatus_t status = gXcvrInvalidParameters_c;
    if (curr_config != NULL)
    {
        curr_config->radio_mode = current_xcvr_config.radio_mode;
        curr_config->data_rate = current_xcvr_config.data_rate;
        status = gXcvrSuccess_c;
    }
    return status;
}

/* Customer level trim functions */
xcvrStatus_t XCVR_SetXtalTrim(uint8_t xtalTrim)
{
    xcvrStatus_t status = gXcvrInvalidParameters_c;

    if ((xtalTrim & 0x80) == 0)
    {
        uint32_t temp;
        temp = RSIM->ANA_TRIM;
        temp &= ~RSIM_ANA_TRIM_BB_XTAL_TRIM_MASK;
        RSIM->ANA_TRIM = temp | RSIM_ANA_TRIM_BB_XTAL_TRIM(xtalTrim);
        status = gXcvrSuccess_c;
    }
    return status;
}

uint8_t  XCVR_GetXtalTrim(void)
{
    uint8_t temp_xtal;
    temp_xtal = ((RSIM->ANA_TRIM & RSIM_ANA_TRIM_BB_XTAL_TRIM_MASK)>>RSIM_ANA_TRIM_BB_XTAL_TRIM_SHIFT);
    return temp_xtal;
}

/* RSSI adjustment */
xcvrStatus_t XCVR_SetRssiAdjustment(int8_t adj)
{
    XCVR_RX_DIG->RSSI_CTRL_0 &= ~XCVR_RX_DIG_RSSI_CTRL_0_RSSI_ADJ_MASK;
    XCVR_RX_DIG->RSSI_CTRL_0 |= XCVR_RX_DIG_RSSI_CTRL_0_RSSI_ADJ(adj);
    return gXcvrSuccess_c;
}

int8_t  XCVR_GetRssiAdjustment(void)
{
    int8_t adj;
    adj = (XCVR_RX_DIG->RSSI_CTRL_0 & XCVR_RX_DIG_RSSI_CTRL_0_RSSI_ADJ_MASK) >> XCVR_RX_DIG_RSSI_CTRL_0_RSSI_ADJ_SHIFT;
    return adj;
}

/* Radio debug functions */
xcvrStatus_t XCVR_OverrideChannel(uint8_t channel, uint8_t useMappedChannel)
{
    uint32_t temp;

    if (channel == 0xFF)
    {
        /* Clear all of the overrides and restore to LL channel control */
        temp = XCVR_PLL_DIG->CHAN_MAP;
        temp &= ~(XCVR_PLL_DIG_CHAN_MAP_CHANNEL_NUM_MASK | XCVR_PLL_DIG_CHAN_MAP_BOC_MASK 
#if !RADIO_IS_GEN_2P1
                 | XCVR_PLL_DIG_CHAN_MAP_ZOC_MASK
#endif /* !RADIO_IS_GEN_2P1 */
#if RADIO_IS_GEN_3P0
                 | XCVR_PLL_DIG_CHAN_MAP_HOP_TBL_CFG_OVRD_EN_MASK
#endif /* RADIO_IS_GEN_3P0 */
                 );

      XCVR_PLL_DIG->CHAN_MAP = temp; 

      /* Stop using the manual frequency setting */
      XCVR_PLL_DIG->LPM_SDM_CTRL1 &= ~XCVR_PLL_DIG_LPM_SDM_CTRL1_SDM_MAP_DISABLE_MASK;

      return gXcvrSuccess_c;
    }

    if (channel >= 128)
    {
        return gXcvrInvalidParameters_c;
    }

    if (useMappedChannel)
    {
        temp = (XCVR_MISC->XCVR_CTRL & XCVR_CTRL_XCVR_CTRL_PROTOCOL_MASK)>>XCVR_CTRL_XCVR_CTRL_PROTOCOL_SHIFT; /* Extract PROTOCOL bitfield */

        switch (temp)
        {
#if !RADIO_IS_GEN_2P1
            case 0x3: /* ANT protocol */
                ANT->CHANNEL_NUM = channel;
                break;
#endif /* !RADIO_IS_GEN_2P1 */
            case 0x8: /* GENFSK protocol */
            case 0x9: /* MSK protocol */
                GENFSK->CHANNEL_NUM = channel;
                break;
            default: /* All other protocols */
                temp = XCVR_PLL_DIG->CHAN_MAP;
                temp &= ~(XCVR_PLL_DIG_CHAN_MAP_CHANNEL_NUM_MASK
#if RADIO_IS_GEN_3P0
                         | XCVR_PLL_DIG_CHAN_MAP_HOP_TBL_CFG_OVRD_EN_MASK
#endif /* RADIO_IS_GEN_3P0 */
                         );
                temp |= (XCVR_PLL_DIG_CHAN_MAP_CHANNEL_NUM(channel) | XCVR_PLL_DIG_CHAN_MAP_BOC_MASK
#if !RADIO_IS_GEN_2P1
                        | XCVR_PLL_DIG_CHAN_MAP_ZOC_MASK
#endif /* !RADIO_IS_GEN_2P1 */
                        );
                XCVR_PLL_DIG->CHAN_MAP = temp; 
                break;
        }
    }
    else
    {
        XCVR_PLL_DIG->CHAN_MAP |= (XCVR_PLL_DIG_CHAN_MAP_BOC_MASK
#if !RADIO_IS_GEN_2P1
                                  | XCVR_PLL_DIG_CHAN_MAP_ZOC_MASK
#endif /* !RADIO_IS_GEN_2P1 */
                                  ); 

        XCVR_PLL_DIG->LPM_SDM_CTRL3 = XCVR_PLL_DIG_LPM_SDM_CTRL3_LPM_DENOM(gPllDenom_c);
        XCVR_PLL_DIG->LPM_SDM_CTRL2 = XCVR_PLL_DIG_LPM_SDM_CTRL2_LPM_NUM(mapTable[channel].numerator);

        temp = XCVR_PLL_DIG->LPM_SDM_CTRL1;
        temp &= ~XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_MASK;
        temp |= XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG(mapTable[channel].integer);
        XCVR_PLL_DIG->LPM_SDM_CTRL1 = temp;

        /* Stop using the LL channel map and use the manual frequency setting */
        XCVR_PLL_DIG->LPM_SDM_CTRL1 |= XCVR_PLL_DIG_LPM_SDM_CTRL1_SDM_MAP_DISABLE_MASK;
    }

    return gXcvrSuccess_c;
}

uint32_t XCVR_GetFreq ( void )
{
    uint32_t pll_int;
    uint32_t pll_num_unsigned;
    int32_t pll_num;
    uint32_t pll_denom;
    float freq_float;

    if (XCVR_PLL_DIG->LPM_SDM_CTRL1 & XCVR_PLL_DIG_LPM_SDM_CTRL1_SDM_MAP_DISABLE_MASK) /* Not using mapped channels */
    {
        pll_int = (XCVR_PLL_DIG->LPM_SDM_CTRL1 & XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_MASK) >>
                   XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_SHIFT;

        pll_num_unsigned = XCVR_PLL_DIG->LPM_SDM_CTRL2;
        pll_denom = XCVR_PLL_DIG->LPM_SDM_CTRL3;
    }
    else
    {
        /* Using mapped channels so need to read from the _SELECTED fields to get the values being used */
        pll_int = (XCVR_PLL_DIG->LPM_SDM_CTRL1 & XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_SELECTED_MASK) >>
                   XCVR_PLL_DIG_LPM_SDM_CTRL1_LPM_INTG_SELECTED_SHIFT;

        pll_num_unsigned = XCVR_PLL_DIG->LPM_SDM_RES1;
        pll_denom = XCVR_PLL_DIG->LPM_SDM_RES2;
    }

    uint32_t freq = 0;

#if RF_OSC_26MHZ == 1
    uint32_t ref_clk = 26U;
#else
    uint32_t ref_clk = 32U;
#endif /* RF_OSC_26MHZ == 1 */

    /* Check if sign bit is asserted */
    if (pll_num_unsigned & 0x04000000U)
    {
        /* Sign extend the numerator */
        pll_num = (~pll_num_unsigned + 1) & 0x03FFFFFFU; 

        /* Calculate the frequency in MHz */
        freq_float = (ref_clk * 2 * (pll_int - ((float)pll_num / pll_denom))); 
    }
    else
    {
        /* Calculate the frequency in MHz */
        pll_num = pll_num_unsigned;
        freq_float = (ref_clk * 2 * (pll_int + ((float)pll_num / (float)pll_denom))); 
    }

    freq = (uint32_t)freq_float;

    return freq;
}

void XCVR_ForceRxWu(void)
{
    XCVR_TSM->CTRL |= XCVR_TSM_CTRL_FORCE_RX_EN_MASK;
}

void XCVR_ForceRxWd(void)
{
    XCVR_TSM->CTRL &= ~XCVR_TSM_CTRL_FORCE_RX_EN_MASK;
}

void XCVR_ForceTxWu(void)
{
    XCVR_TSM->CTRL |= XCVR_TSM_CTRL_FORCE_TX_EN_MASK;
}

void XCVR_ForceTxWd(void)
{
    XCVR_TSM->CTRL &= ~XCVR_TSM_CTRL_FORCE_TX_EN_MASK;
}

xcvrStatus_t XCVR_DftTxCW(uint16_t rf_channel_freq, uint8_t protocol)
{
    uint32_t temp;
    if ((protocol != 6) && (protocol != 7))
    {
        return gXcvrInvalidParameters_c; /* Failure */
    }

    if ((rf_channel_freq < 2360) || (rf_channel_freq >2487))
    {
        return gXcvrInvalidParameters_c; /* failure */
    }

    /* Set the DFT Mode */
    temp  = XCVR_TX_DIG->CTRL;
    temp &= ~XCVR_TX_DIG_CTRL_RADIO_DFT_MODE_MASK;
    temp |= XCVR_TX_DIG_CTRL_RADIO_DFT_MODE(1);
    XCVR_TX_DIG->CTRL = temp;

    /* Choose Protocol 6 or 7 if using the Channel Number register */
    temp  = XCVR_MISC->XCVR_CTRL;
    temp &= ~XCVR_CTRL_XCVR_CTRL_PROTOCOL_MASK;
    temp |= XCVR_CTRL_XCVR_CTRL_PROTOCOL(protocol);
    XCVR_MISC->XCVR_CTRL = temp;

    /* Select the RF Channel, using the Channel Number register */
    XCVR_OverrideChannel(rf_channel_freq-2360,1);

    /* Warm-up the Radio */
    XCVR_ForceTxWu();

    return gXcvrSuccess_c; /* Success */
}

xcvrStatus_t XCVR_DftTxPatternReg(uint16_t channel_num, radio_mode_t radio_mode, data_rate_t data_rate, uint32_t tx_pattern)
{
    uint32_t temp;
    uint8_t dft_mode = 0;
    uint8_t dft_clk_sel = 0;
    xcvrStatus_t status = gXcvrSuccess_c;
    
    XCVR_ChangeMode(radio_mode, data_rate);
    
    /* Select the RF Channel, using the Channel Number register */
    XCVR_OverrideChannel(channel_num, 1);

    switch (radio_mode)
    {
        case ZIGBEE_MODE:
            dft_mode = 6; /* OQPSK configuration */
            break;
        case ANT_MODE:
        case BLE_MODE:
        case GFSK_BT_0p5_h_0p5:
        case GFSK_BT_0p5_h_0p32:
        case GFSK_BT_0p5_h_0p7:
        case GFSK_BT_0p5_h_1p0:
        case GFSK_BT_0p3_h_0p5:
        case GFSK_BT_0p7_h_0p5:
            dft_mode = 2; /* GFSK configuration */
            break;
        case MSK:
            dft_mode = 4; /* MSK configuration */
            break;
        default:
            status = gXcvrInvalidParameters_c;
            break;
    }

    if (status == gXcvrSuccess_c) /* Only attempt this pointer assignment process if prior switch() statement completed successfully */
    {
        switch (data_rate)
        {
            case DR_1MBPS:
                dft_clk_sel = 4;
                break;
            case DR_500KBPS:
                dft_clk_sel = 3;
                break;
            case DR_250KBPS:
                dft_clk_sel = 2;
                break;
            default:
                status = gXcvrInvalidParameters_c;
                break;
        }
    }

    temp = XCVR_TX_DIG->CTRL;
    temp &= ~(XCVR_TX_DIG_CTRL_RADIO_DFT_MODE_MASK | XCVR_TX_DIG_CTRL_DFT_CLK_SEL_MASK | XCVR_TX_DIG_CTRL_TX_DFT_EN_MASK | XCVR_TX_DIG_CTRL_LFSR_EN_MASK);
    temp |= XCVR_TX_DIG_CTRL_RADIO_DFT_MODE(dft_mode) |
            XCVR_TX_DIG_CTRL_DFT_CLK_SEL(dft_clk_sel) |
            XCVR_TX_DIG_CTRL_TX_DFT_EN(1) |
            XCVR_TX_DIG_CTRL_LFSR_EN(0);
    XCVR_TX_DIG->CTRL = temp;

    XCVR_TX_DIG->DFT_PATTERN = tx_pattern;

    if (status == gXcvrSuccess_c)
    {
        /* Warm-up the Radio */
        XCVR_ForceTxWu();
    }

    return status;
}

xcvrStatus_t XCVR_DftTxLfsrReg(uint16_t channel_num, radio_mode_t radio_mode, data_rate_t data_rate, uint8_t lfsr_length)
{
    uint32_t temp;
    uint8_t dft_mode = 0;
    uint8_t dft_clk_sel = 0;
    xcvrStatus_t status = gXcvrSuccess_c;
    uint8_t bitrate_setting = 0xFF;

    if (lfsr_length > 5)
    {
        return gXcvrInvalidParameters_c;
    }
    
    XCVR_ChangeMode(radio_mode, data_rate);
    
    /* Select the RF Channel, using the Channel Number register */
    XCVR_OverrideChannel(channel_num, 1);

    switch (radio_mode)
    {
        case ZIGBEE_MODE:
            dft_mode = 7; /* OQPSK configuration */
            break;
        case ANT_MODE:
        case BLE_MODE:
        case GFSK_BT_0p5_h_0p5:
        case GFSK_BT_0p5_h_0p32:
        case GFSK_BT_0p5_h_0p7:
        case GFSK_BT_0p5_h_1p0:
        case GFSK_BT_0p3_h_0p5:
        case GFSK_BT_0p7_h_0p5:
            dft_mode = 3; /* GFSK configuration */
            bitrate_setting = data_rate;
            break;
        case MSK:
            dft_mode = 5; /* MSK configuration */
            break;

        default:
            status = gXcvrInvalidParameters_c;
            break;
    }

    if (status == gXcvrSuccess_c)
    {
        switch (data_rate)
        {
            case DR_1MBPS:
                dft_clk_sel = 4;
                break;
            case DR_500KBPS:
                dft_clk_sel = 3;
                break;
            case DR_250KBPS:
                dft_clk_sel = 2;
                break;
            default:
                status = gXcvrInvalidParameters_c;
                break;
        }
    }

    if (bitrate_setting < 4)
    {
        GENFSK->BITRATE = bitrate_setting;
    }

    temp = XCVR_TX_DIG->CTRL;
    temp &= ~(XCVR_TX_DIG_CTRL_RADIO_DFT_MODE_MASK |
              XCVR_TX_DIG_CTRL_LFSR_LENGTH_MASK |
              XCVR_TX_DIG_CTRL_DFT_CLK_SEL_MASK |
              XCVR_TX_DIG_CTRL_TX_DFT_EN_MASK |
              XCVR_TX_DIG_CTRL_LFSR_EN_MASK);
    temp |= XCVR_TX_DIG_CTRL_RADIO_DFT_MODE(dft_mode) |
            XCVR_TX_DIG_CTRL_LFSR_LENGTH(lfsr_length) |
            XCVR_TX_DIG_CTRL_DFT_CLK_SEL(dft_clk_sel) |
            XCVR_TX_DIG_CTRL_TX_DFT_EN(0) |
            XCVR_TX_DIG_CTRL_LFSR_EN(1);
    XCVR_TX_DIG->CTRL = temp;

    if (status == gXcvrSuccess_c)
    {
        /* Warm-up the Radio */
        XCVR_ForceTxWu();
    }

    return status;
}

void XCVR_DftTxOff(void)
{
    XCVR_ForceTxWd();
    XCVR_MISC->XCVR_CTRL |= XCVR_CTRL_XCVR_CTRL_TGT_PWR_SRC_MASK; /* Use PA_POWER in LL registers */
    /* Clear the RF Channel over-ride */
    XCVR_OverrideChannel(0xFF,1);
    XCVR_TX_DIG->CTRL &= ~(XCVR_TX_DIG_CTRL_RADIO_DFT_MODE_MASK | /* Clear DFT_MODE */
                           XCVR_TX_DIG_CTRL_DFT_CLK_SEL_MASK | /* Clear DFT_CLK_SEL */
                           XCVR_TX_DIG_CTRL_TX_DFT_EN_MASK | /* Clear DFT_EN */
                           XCVR_TX_DIG_CTRL_LFSR_EN_MASK);/* Clear LFSR_EN */
}

xcvrStatus_t XCVR_ForcePAPower(uint8_t pa_power)
{
    if (pa_power > 0x3F)
    {
        return gXcvrInvalidParameters_c; /* Failure */
    }
    
    if (pa_power != 1)
    {
        pa_power = pa_power & 0xFEU; /* Ensure LSbit is cleared */
    }
    
    XCVR_MISC->XCVR_CTRL &= ~XCVR_CTRL_XCVR_CTRL_TGT_PWR_SRC_MASK; /* Use PA_POWER in TSM registers */
    XCVR_TSM->PA_POWER = pa_power;

    return gXcvrSuccess_c; /* Success */
}

xcvrStatus_t XCVR_CoexistenceInit(void)
{
#if gMWS_UseCoexistence_d  
    uint32_t temp = 0x00U;
    uint32_t end_of_tx_wu = 0x00U;
    uint32_t end_of_rx_wu = 0x00U;
    
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
#if (XCVR_COEX_RF_ACTIVE_PIN == ANT_A)
    uint32_t tsm_timing47 = 0x00U;
#else /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_B) */
    uint32_t tsm_timing48 = 0x00U;
#endif /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_A) */
    uint32_t tsm_timing50 = 0x00U;    
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
    
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
    // RF_ACTIVE = ANT_B (PTC1, gpio1_trig_en)
    uint32_t tsm_timing48 = 0x00U;
    // RF_PRIORITY = ANT_A (PTC4, gpio0_trig_en)
    uint32_t tsm_timing47 = 0x00U;    
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */
    
    uint16_t tsm_timing43_rx = 0x00;
    uint16_t tsm_timing43_tx = 0x00;    

    /* Select GPIO mode for FAD pins */
    temp = XCVR_MISC->FAD_CTRL;
    temp &= ~(XCVR_CTRL_FAD_CTRL_FAD_NOT_GPIO_MASK);
    XCVR_MISC->FAD_CTRL = temp;

    /* Read the END_OF_TX_WU and END_OF_RX_WU for XCVR */
    end_of_tx_wu = (XCVR_TSM->END_OF_SEQ & XCVR_TSM_END_OF_SEQ_END_OF_TX_WU_MASK) >>
                    XCVR_TSM_END_OF_SEQ_END_OF_TX_WU_SHIFT;
    end_of_rx_wu = (XCVR_TSM->END_OF_SEQ & XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_MASK) >>
                    XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_SHIFT;
    
/*****************
 *  TX SEQUENCE  *
 *****************/    

    if (end_of_tx_wu < gMWS_CoexRfActiveAssertTime_d)
    {
        temp = end_of_tx_wu;
    }
    else
    {
        temp = gMWS_CoexRfActiveAssertTime_d;
    }
    
    /* Save the TX RF_ACTIVE start time. */
    tsm_timing43_tx = end_of_tx_wu - temp; 

#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)    
    /* Set RF_ACTIVE pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any TX sequence. */
#if (XCVR_COEX_RF_ACTIVE_PIN == ANT_A)
    tsm_timing47 = (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_SHIFT) & 
                                                        XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK);
#else
    tsm_timing48 = (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_SHIFT) & 
                                                        XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_MASK);    
#endif /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_A) */

    /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any TX sequence. */
    tsm_timing50 = (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_SHIFT) & 
                                                        XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_MASK);
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */

#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
    /* Set RF_ACTIVE pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any TX sequence. */
    tsm_timing48 = (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_SHIFT) & 
                                                        XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_MASK);

    /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any TX sequence. */
    tsm_timing47 = (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_SHIFT) & 
                                                        XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK);        
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */  
    
/*****************
 *  RX SEQUENCE  *
 *****************/

    if (end_of_rx_wu < gMWS_CoexRfActiveAssertTime_d)
    {
        temp = end_of_rx_wu;
    }
    else
    {
        temp = gMWS_CoexRfActiveAssertTime_d;
    }

    /* Save the RX RF_ACTIVE start time. */
    tsm_timing43_rx = end_of_rx_wu - temp; 

#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)    
    /* Set RF_ACTIVE pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence. */
#if (XCVR_COEX_RF_ACTIVE_PIN == ANT_A)
    tsm_timing47 |= (((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_SHIFT) & 
                                                         XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK);
#else
    tsm_timing48 |= (((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_SHIFT) & 
                                                         XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_MASK);
#endif /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_A) */

    /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence and clear it gMWS_CoexPrioSignalTime_d uS before RX start. */
    tsm_timing50 |= ((((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_SHIFT) & 
                                                          XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_MASK) |
                     (((uint32_t)(end_of_rx_wu - gMWS_CoexPrioSignalTime_d) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_SHIFT) & 
                                                                             XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_MASK));

#if (XCVR_COEX_RF_ACTIVE_PIN == ANT_A)
    temp = XCVR_TSM->TIMING47;
    temp &= ~(XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK | XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK);
    temp |= tsm_timing47;
    XCVR_TSM->TIMING47 = temp;
#else
    temp = XCVR_TSM->TIMING48;
    temp &= ~(XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_MASK | XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_MASK);
    temp |= tsm_timing48;
    XCVR_TSM->TIMING48 = temp;    
#endif /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_A) */

    temp = XCVR_TSM->TIMING50;
    temp &= ~(XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_MASK | 
              XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_MASK |
              XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_MASK);
    temp |= tsm_timing50;
    XCVR_TSM->TIMING50 = temp;

#if (XCVR_COEX_RF_ACTIVE_PIN == ANT_A)
    GPIOC->PDDR |= 0x18;
    PORTC->PCR[4] = (PORTC->PCR[4] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);
    PORTC->PCR[3] = (PORTC->PCR[3] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);
#else
    GPIOC->PDDR |= 0x0A;
    PORTC->PCR[1] = (PORTC->PCR[1] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);
    PORTC->PCR[3] = (PORTC->PCR[3] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);
#endif /* (XCVR_COEX_RF_ACTIVE_PIN == ANT_A) */
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
    
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)    
    /* Set RF_ACTIVE pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence. */
    tsm_timing48 |= (((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_SHIFT) & 
                                                         XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_MASK);
    
    /* Set PRIORITY pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence and clear it gMWS_CoexPrioSignalTime_d uS before RX start. */
    tsm_timing47 |= (((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_SHIFT) & 
                                                          XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK);
    
    /* RF_ACTIVE */
    temp = XCVR_TSM->TIMING48;
    temp &= ~(XCVR_TSM_TIMING48_GPIO1_TRIG_EN_TX_HI_MASK | XCVR_TSM_TIMING48_GPIO1_TRIG_EN_RX_HI_MASK);
    temp |= tsm_timing48;
    XCVR_TSM->TIMING48 = temp;
    
    /* RF_PRIORITY */
    temp = XCVR_TSM->TIMING47;
    temp &= ~(XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK | XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK);
    temp |= tsm_timing47;
    XCVR_TSM->TIMING47 = temp;
    
    /* Overwrite pins settings */
    GPIOC->PDDR |= 0x12;
    PORTC->PCR[4] = (PORTC->PCR[4] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);
    PORTC->PCR[1] = (PORTC->PCR[1] & ~PORT_PCR_MUX_MASK) | PORT_PCR_MUX(2);    
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */

    tsm_timing43_tx += gMWS_CoexConfirmWaitTime_d;

    if (tsm_timing43_tx > end_of_tx_wu - 1)
    {
        tsm_timing43_tx = end_of_tx_wu - 1;
    }

    tsm_timing43_rx += gMWS_CoexConfirmWaitTime_d;
    
    if (tsm_timing43_rx > end_of_rx_wu - 1)
    {
        tsm_timing43_rx = end_of_rx_wu - 1;
    }

    XCVR_TSM->TIMING43 = ((((uint32_t)(tsm_timing43_tx) << XCVR_TSM_TIMING43_TSM_SPARE0_EN_TX_HI_SHIFT) & XCVR_TSM_TIMING43_TSM_SPARE0_EN_TX_HI_MASK) |
                          (((uint32_t)(tsm_timing43_tx + 2) << XCVR_TSM_TIMING43_TSM_SPARE0_EN_TX_LO_SHIFT) & XCVR_TSM_TIMING43_TSM_SPARE0_EN_TX_LO_MASK) | 
                          (((uint32_t)(tsm_timing43_rx) << XCVR_TSM_TIMING43_TSM_SPARE0_EN_RX_HI_SHIFT) & XCVR_TSM_TIMING43_TSM_SPARE0_EN_RX_HI_MASK) |
                          (((uint32_t)(tsm_timing43_rx + 2) << XCVR_TSM_TIMING43_TSM_SPARE0_EN_RX_LO_SHIFT) & XCVR_TSM_TIMING43_TSM_SPARE0_EN_RX_LO_MASK));

    BTLE_RF->MISC_CTRL = 0x02;

    XCVR_TSM->CTRL |= XCVR_TSM_CTRL_TSM_IRQ0_EN_MASK;

    /* Save the updated registers values. */
    XCVR_CoexistenceSaveRestoreTimings(1);    
#endif /* gMWS_UseCoexistence_d */ 

    return gXcvrSuccess_c;
}

xcvrStatus_t XCVR_CoexistenceSetPriority(XCVR_COEX_PRIORITY_T rxPriority, XCVR_COEX_PRIORITY_T txPriority)
{
#if gMWS_UseCoexistence_d
    uint32_t temp = 0x00U;
    uint32_t end_of_tx_wu = 0x00U;
    uint32_t end_of_rx_wu = 0x00U;
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
    uint32_t tsm_timing50 = 0x00U;
#endif    
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
    uint32_t tsm_timing47 = 0x00U;
#endif    

    /* Read the END_OF_TX_WU and END_OF_RX_WU for XCVR */
    end_of_tx_wu = (XCVR_TSM->END_OF_SEQ & XCVR_TSM_END_OF_SEQ_END_OF_TX_WU_MASK) >>
                    XCVR_TSM_END_OF_SEQ_END_OF_TX_WU_SHIFT;
    end_of_rx_wu = (XCVR_TSM->END_OF_SEQ & XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_MASK) >>
                    XCVR_TSM_END_OF_SEQ_END_OF_RX_WU_SHIFT;    

/*****************
 *      RX       *
 *****************/
    
    if (XCVR_COEX_HIGH_PRIO == rxPriority)
    {
        if (end_of_rx_wu < gMWS_CoexRfActiveAssertTime_d)
        {
            temp = end_of_rx_wu;
        }
        else
        {
            temp = gMWS_CoexRfActiveAssertTime_d;
        }

#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
        /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence and clear it gMWS_CoexPrioSignalTime_d uS before RX start for high priority RX. */
        tsm_timing50 = ((((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_SHIFT) & 
                                                             XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_MASK) |
                        (((uint32_t)(end_of_rx_wu - gMWS_CoexPrioSignalTime_d) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_SHIFT) & 
                                                                                  XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_MASK));
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
     /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any RX sequence */
        tsm_timing47 = (((uint32_t)(end_of_rx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_SHIFT) & 
                                                            XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK);   
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */
    }
    else
    {
        /* Low priority RX */
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
        tsm_timing50 = (((0xFFU << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_SHIFT) & 
                                   XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_MASK) |
                        ((0xFFU << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_SHIFT) & 
                                   XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_MASK));
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)        
        tsm_timing47 = (((0xFFU << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_SHIFT) & 
                                   XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK) |
                        ((0xFFU << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_LO_SHIFT) & 
                                   XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_LO_MASK));
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */
    }

/*****************
 *      TX       *
 *****************/
    if (XCVR_COEX_HIGH_PRIO == txPriority)
    {
        if (end_of_tx_wu < gMWS_CoexRfActiveAssertTime_d)
        {
            temp = end_of_tx_wu;
        }
        else
        {
            temp = gMWS_CoexRfActiveAssertTime_d;
        }

        /* Set STATUS pin HIGH gMWS_CoexRfActiveAssertTime_d uS prior to any TX sequence for HIGH priority TX. */
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
        tsm_timing50 |= (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_SHIFT) & 
                                                             XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_MASK);
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)        
        tsm_timing47 |= (((uint32_t)(end_of_tx_wu - temp) << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_SHIFT) & 
                                                             XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK);
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */                
    }
    else
    {        
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
        /* Set STATUS pin HIGH at END_OF_TX_WU prior to any TX sequence for LOW priority TX. */
        tsm_timing50 |= (((uint32_t)(end_of_tx_wu) << XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_SHIFT) & 
                                                      XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_MASK);
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
        /* Set STATUS pin LOW at END_OF_TX_WU prior to any TX sequence for LOW priority TX. */                
        tsm_timing47 = (((0xFFU << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_SHIFT) & 
                                   XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK) |
                        ((0xFFU << XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_LO_SHIFT) & 
                                   XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_LO_MASK));
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */
    }

#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)
    temp = XCVR_TSM->TIMING50;
    temp &= ~(XCVR_TSM_TIMING50_GPIO3_TRIG_EN_TX_HI_MASK |
              XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_HI_MASK |
              XCVR_TSM_TIMING50_GPIO3_TRIG_EN_RX_LO_MASK);
    temp |= tsm_timing50;
    XCVR_TSM->TIMING50 = temp;
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d) */
#if (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d)
    temp = XCVR_TSM->TIMING47;
    temp &= ~(XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_HI_MASK |
              XCVR_TSM_TIMING47_GPIO0_TRIG_EN_TX_LO_MASK |
              XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_HI_MASK |
              XCVR_TSM_TIMING47_GPIO0_TRIG_EN_RX_LO_MASK);
    temp |= tsm_timing47;
    XCVR_TSM->TIMING47 = temp;    
#endif /* (gMWS_Coex_Model_d == gMWS_Coex_Prio_Only_d) */
    
    /* Save the updated registers values. */
    XCVR_CoexistenceSaveRestoreTimings(1);
#endif /* gMWS_UseCoexistence_d */

    return gXcvrSuccess_c;
}

xcvrStatus_t XCVR_CoexistenceSaveRestoreTimings(uint8_t saveTimings)
{
#if gMWS_UseCoexistence_d
    static uint32_t tsm_ovrd0_saved = 0x00;
    static uint32_t tsm_ovrd1_saved = 0x00;
    static uint32_t tsm_ovrd2_saved = 0x00;
    static uint32_t tsm_ovrd3_saved = 0x00;
    static uint32_t tsm_timing47_saved = 0x00;
    static uint32_t tsm_timing48_saved = 0x00;
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)    
    static uint32_t tsm_timing49_saved = 0x00;
    static uint32_t tsm_timing50_saved = 0x00;
#endif    

    if (saveTimings == 0)
    {
        /* Restore registers values. */
        XCVR_TSM->OVRD0 = tsm_ovrd0_saved; 
        XCVR_TSM->OVRD1 = tsm_ovrd1_saved;
        XCVR_TSM->OVRD2 = tsm_ovrd2_saved;
        XCVR_TSM->OVRD3 = tsm_ovrd3_saved;

        XCVR_TSM->TIMING47 = tsm_timing47_saved;
        XCVR_TSM->TIMING48 = tsm_timing48_saved;
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)        
        XCVR_TSM->TIMING49 = tsm_timing49_saved;
        XCVR_TSM->TIMING50 = tsm_timing50_saved;
#endif        
    }
    else
    {
        /* Save registers values. */
        tsm_ovrd0_saved = XCVR_TSM->OVRD0;
        tsm_ovrd1_saved = XCVR_TSM->OVRD1;
        tsm_ovrd2_saved = XCVR_TSM->OVRD2;
        tsm_ovrd3_saved = XCVR_TSM->OVRD3;
        tsm_timing47_saved = XCVR_TSM->TIMING47;
        tsm_timing48_saved = XCVR_TSM->TIMING48;
#if (gMWS_Coex_Model_d == gMWS_Coex_Status_Prio_d)        
        tsm_timing49_saved = XCVR_TSM->TIMING49;
        tsm_timing50_saved = XCVR_TSM->TIMING50;
#endif        
    }
#endif /* gMWS_UseCoexistence_d */

    return gXcvrSuccess_c;
}

