Files
smod_atsc_app/atsc_app/talise/talise_radioctrl.c
T

2471 lines
107 KiB
C
Executable File

/**
* \file talise_radioctrl.c
* \brief Contains functions to support Talise radio control and pin control
* functions
*
* Talise API version: 3.5.0.2
*
* Copyright 2015-2017 Analog Devices Inc.
* Released under the AD9378-AD9379 API license, for more information see the "LICENSE.txt" file in this zip file.
*/
#include <stdio.h>
#include "talise_cals.h"
#include "talise_radioctrl.h"
#include "talise_gpio.h"
#include "talise_reg_addr_macros.h"
#include "talise_arm_macros.h"
#include "talise_hal.h"
#include "talise_user.h"
#include "talise_error.h"
#include "talise_arm.h"
#include "talise.h"
uint32_t TALISE_loadStreamFromBinary(taliseDevice_t *device, uint8_t *binary)
{
adiHalErr_t halError = ADIHAL_OK;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint32_t streamBinBaseAddr = 0;
uint32_t streamBaseAddr = 0;
uint8_t numberStreams = 0;
uint32_t imageSize = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_loadStreamFromBinary()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
/* populating variables from binary array */
streamBinBaseAddr = (((uint32_t)binary[3]) << 24) | (((uint32_t)binary[2]) << 16) | (((uint32_t)binary[1]) << 8) | (uint32_t)(binary[0]);
streamBaseAddr = (((uint32_t)binary[7]) << 24) | (((uint32_t)binary[6]) << 16) | (((uint32_t)binary[5]) << 8) | (uint32_t)(binary[4]);
numberStreams = binary[8];
imageSize = (((uint32_t)binary[11]) << 8) | (uint32_t)(binary[10]);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
/* resetting the stream processor */
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_STREAM_CONTROL, 0x01, 0x01, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] TALISE_writeArmMem, here wait too long , imagesize =0x1000(4K)\n", __FUNCTION__, __LINE__);
/* writing stream instruction and data pointers to memory */
retVal = (talRecoveryActions_t)TALISE_writeArmMem(device, streamBinBaseAddr, binary, imageSize);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
/* writing lower 16 bits of stream base address */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_BASE_BYTE0, (uint8_t)streamBaseAddr);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_BASE_BYTE1, (uint8_t)(streamBaseAddr >> 8));
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] writing lower byte of number of streams \n", __FUNCTION__, __LINE__);
/* writing lower byte of number of streams */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_LAST_STREAM_NUM, numberStreams);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
/* clearing stream reset bit */
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_STREAM_CONTROL, 0x00, 0x01, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
/* setting up the stream processor and clearing the debug registers */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG0, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG1, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG2, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG3, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG4, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG5, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG6, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
printf("[%s,%d] \n", __FUNCTION__, __LINE__);
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_STREAM_PROC_DEBUG_REG7, 0x00);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
device->devStateInfo.devState = (taliseStates_t)(device->devStateInfo.devState | TAL_STATE_STREAMLOADED);
return (uint32_t)retVal;
}
uint32_t TALISE_setArmGpioPins(taliseDevice_t *device, taliseArmGpioConfig_t *armGpio)
{
uint8_t i = 0;
uint8_t cmdStatusByte = 0;
uint8_t signalId[8] = {
TALISE_ARM_ORX1_TX_SEL0_SIGNALID,
TALISE_ARM_ORX1_TX_SEL1_SIGNALID,
TALISE_ARM_ORX2_TX_SEL0_SIGNALID,
TALISE_ARM_ORX2_TX_SEL1_SIGNALID,
TALISE_ARM_TXCAL_ENA_SIGNALID,
TALISE_ARM_CAL_UPDATE0_SIGNALID,
TALISE_ARM_CAL_UPDATE1_SIGNALID,
TALISE_ARM_CAL_UPDATE2_SIGNALID
};
uint8_t armGetGpioStatus = 0;
uint8_t gpioStatus[2] = {0};
uint8_t gpioCheck = 0;
taliseGpioPinSel_t gpioPinSel = TAL_GPIO_00;
uint8_t gpioEnable = 0;
uint8_t gpioConfig[3] = {0};
uint32_t gpioOe = 0;
uint32_t gpioUsedMask = 0;
uint32_t gpioFreeMask = 0;
uint32_t usedGpiopins = 0;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setArmGpioPins()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
if (armGpio == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SET_ARMGPIO_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Free all current GPIO's */
gpioStatus[0] = TALISE_ARM_OBJECTID_GPIO_CTRL;
for(i = 0; i < sizeof(signalId); i++)
{
gpioStatus[1] = signalId[i];
/* Get current GPIO pin assigned to this signal_id */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &gpioStatus[0], sizeof(gpioStatus));
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, SETARMGPIO_TIMEOUT_US, SETARMGPIO_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, gpioStatus[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armGetGpioStatus, 1, 0);
IF_ERR_RETURN_U32(retVal);
if (armGetGpioStatus < 19)
{
gpioFreeMask |= (1 << (armGetGpioStatus & 0x0F));
}
}
usedGpiopins = device->devStateInfo.usedGpiopins & ~gpioFreeMask;
/* Update all used GPIO's */
for(i = 0; i < sizeof(signalId); i++)
{
switch(signalId[i])
{
case TALISE_ARM_ORX1_TX_SEL0_SIGNALID:
gpioPinSel = armGpio->orx1TxSel0Pin.gpioPinSel;
gpioEnable = armGpio->orx1TxSel0Pin.enable;
gpioCheck = 1;
break;
case TALISE_ARM_ORX1_TX_SEL1_SIGNALID:
gpioPinSel = armGpio->orx1TxSel1Pin.gpioPinSel;
gpioEnable = armGpio->orx1TxSel1Pin.enable;
gpioCheck = 1;
break;
case TALISE_ARM_ORX2_TX_SEL0_SIGNALID:
gpioPinSel = armGpio->orx2TxSel0Pin.gpioPinSel;
gpioEnable = armGpio->orx2TxSel0Pin.enable;
gpioCheck = 1;
break;
case TALISE_ARM_ORX2_TX_SEL1_SIGNALID:
gpioPinSel = armGpio->orx2TxSel1Pin.gpioPinSel;
gpioEnable = armGpio->orx2TxSel1Pin.enable;
gpioCheck = 1;
break;
case TALISE_ARM_TXCAL_ENA_SIGNALID:
gpioPinSel = armGpio->enTxTrackingCals.gpioPinSel;
gpioEnable = armGpio->enTxTrackingCals.enable;
gpioCheck = 1;
break;
case TALISE_ARM_CAL_UPDATE0_SIGNALID:
gpioCheck = 0;
break;
case TALISE_ARM_CAL_UPDATE1_SIGNALID:
gpioCheck = 0;
break;
case TALISE_ARM_CAL_UPDATE2_SIGNALID:
gpioCheck = 0;
break;
default:
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SET_ARMGPIO_PINS_INV_SIGNALID, retVal, TALACT_ERR_CHECK_PARAM);
}
}
if ( gpioCheck > 0)
{
/* Use GPIO if pin enabled for ARM */
if (gpioEnable)
{
if (gpioPinSel > TAL_GPIO_15)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SET_ARMGPIO_PINS_INV_GPIOPIN, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Error if GPIO is already assigned to some other function */
if ((usedGpiopins & (1 << (uint8_t)gpioPinSel)) != 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SET_ARMGPIO_PINS_GPIO_IN_USE, retVal, TALACT_ERR_CHECK_PARAM);
}
usedGpiopins |= (1 << (uint8_t)gpioPinSel); /* GPIO pins used by all GPIO functions */
gpioUsedMask |= (1 << (uint8_t)gpioPinSel); /* GPIO pins used by this function */
}
}
}
/* Write ARM set command to setup which ARM signals are using which GPIO pins */
/* Setup input pins for ORX_MODE[2:0] and ORX_MODE_Trigger if orx is in pin mode */
for(i = 0; i < sizeof(signalId); i++)
{
gpioConfig[0] = TALISE_ARM_OBJECTID_GPIO_CTRL;
gpioConfig[1] = signalId[i];
switch(signalId[i])
{
case TALISE_ARM_ORX1_TX_SEL0_SIGNALID:
gpioConfig[2] = (uint8_t)(armGpio->orx1TxSel0Pin.gpioPinSel |
(((armGpio->orx1TxSel0Pin.polarity > 0) ? 1 : 0) << 5) |
(((armGpio->orx1TxSel0Pin.enable > 0) ? 1 : 0) << 7));
break;
case TALISE_ARM_ORX1_TX_SEL1_SIGNALID:
gpioConfig[2] = (uint8_t)(armGpio->orx1TxSel1Pin.gpioPinSel |
(((armGpio->orx1TxSel1Pin.polarity > 0) ? 1 : 0) << 5) |
(((armGpio->orx1TxSel1Pin.enable > 0) ? 1 : 0) << 7));
break;
case TALISE_ARM_ORX2_TX_SEL0_SIGNALID:
gpioConfig[2] = (uint8_t)(armGpio->orx2TxSel0Pin.gpioPinSel |
(((armGpio->orx2TxSel0Pin.polarity > 0) ? 1 : 0) << 5) |
(((armGpio->orx2TxSel0Pin.enable > 0) ? 1 : 0) << 7));
break;
case TALISE_ARM_ORX2_TX_SEL1_SIGNALID:
gpioConfig[2] = (uint8_t)(armGpio->orx2TxSel1Pin.gpioPinSel |
(((armGpio->orx2TxSel1Pin.polarity > 0) ? 1 : 0) << 5) |
(((armGpio->orx2TxSel1Pin.enable > 0) ? 1 : 0) << 7));
break;
case TALISE_ARM_TXCAL_ENA_SIGNALID:
gpioConfig[2] = (uint8_t)(armGpio->enTxTrackingCals.gpioPinSel |
(((armGpio->enTxTrackingCals.polarity > 0) ? 1 : 0) << 5) |
(((armGpio->enTxTrackingCals.enable > 0) ? 1 : 0) << 7));
break;
case TALISE_ARM_CAL_UPDATE0_SIGNALID: gpioConfig[2] = 0; break;
case TALISE_ARM_CAL_UPDATE1_SIGNALID: gpioConfig[2] = 0; break;
case TALISE_ARM_CAL_UPDATE2_SIGNALID: gpioConfig[2] = 0; break;
default:
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SET_ARMGPIO_PINS_INV_SIGNALID, retVal, TALACT_ERR_CHECK_PARAM);
}
}
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &gpioConfig[0], sizeof(gpioConfig));
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETARMGPIO_TIMEOUT_US, SETARMGPIO_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, gpioConfig[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
}
/* Set Talise GPIO OE direction for pins used by ARM */
/* Currently ARM has no outputs, so gpioOe = 0 */
retVal = (talRecoveryActions_t)TALISE_setGpioOe(device, gpioOe, gpioUsedMask);
IF_ERR_RETURN_U32(retVal);
/* Update used and freed GPIO's */
device->devStateInfo.usedGpiopins = usedGpiopins;
return (uint32_t)retVal;
}
uint32_t TALISE_setRadioCtlPinMode(taliseDevice_t *device, uint8_t pinOptionsMask, taliseRadioCtlCfg2_t orxEnGpioPinSel)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
static const uint8_t radioCtlCfg1BitMask = 0x77;
static const uint8_t radioCtlCfg2BitMask = 0x03;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setRadioCtlPinMode()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* checking for valid bit mask settings */
if (((pinOptionsMask & ~radioCtlCfg1BitMask) > 0) ||
((((uint8_t)orxEnGpioPinSel) & ~radioCtlCfg2BitMask) > 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_INV_RADIO_CTL_MASK_PARM, retVal, TALACT_ERR_CHECK_PARAM);
}
else
{
/* Disable ability for partial stream processor power down from Rx to
* ORx or ORx to Rx until stream processor is updated to support it
*/
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_RADIO_CONTROL_CONFIG1, pinOptionsMask);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Set which GPIO pins are used by the stream processor to control ORx enable[1:0] */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_RADIO_CONTROL_CONFIG2, ((uint8_t)orxEnGpioPinSel));
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
return (uint32_t)retVal;
}
uint32_t TALISE_getRadioCtlPinMode(taliseDevice_t *device, uint8_t *pinOptionsMask, taliseRadioCtlCfg2_t *orxEnGpioPinSel)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t readData = 0;
static const uint8_t radioCtlCfg1BitMask = 0x77;
static const uint8_t orxEnGpioPinSelFieldMask = 0x03;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getRadioCtlPinMode()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* checking for NULL pointers in function parameters */
if ((pinOptionsMask == NULL) ||
(orxEnGpioPinSel == NULL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_GETPINMODE_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_RADIO_CONTROL_CONFIG1, pinOptionsMask, radioCtlCfg1BitMask, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Read which GPIO pins are used by the stream processor to control ORx enable[1:0] */
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_RADIO_CONTROL_CONFIG2, &readData, orxEnGpioPinSelFieldMask, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*orxEnGpioPinSel = (taliseRadioCtlCfg2_t)readData;
return (uint32_t)retVal;
}
uint32_t TALISE_setOrxLoCfg(taliseDevice_t *device, const taliseOrxLoCfg_t *orxLoCfg)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t enableRelock = 0;
uint8_t gpio3StreamMaskValue = 0;
uint8_t gpio3StreamMaskReadValue = 0;
uint8_t gpioSel = 0;
uint8_t gpioSelReadVal = 0;
uint8_t byteOffset = 0;
uint32_t radioStatus = 0;
uint32_t usedGpioPins = 0;
uint32_t freeGpioPins = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setOrxLoCfg()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* Perform input paramter NULL and range checks */
if (orxLoCfg == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETORXLOCFG_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
if (orxLoCfg->gpioSelect == TAL_GPIO_INVALID)
{
gpio3StreamMaskValue = 1;
gpioSel = 0;
}
else if ((orxLoCfg->gpioSelect >= TAL_GPIO_00) && (orxLoCfg->gpioSelect <= TAL_GPIO_15))
{
gpio3StreamMaskValue = 0;
gpioSel = (uint8_t)orxLoCfg->gpioSelect;
}
else
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETORXLOCFG_INVALIDPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* If this feature already enabled for any GPIO pin, free the pin */
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_STREAM_CONTROL, &gpio3StreamMaskReadValue, 0x80, 7);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_STREAM_GPIO_TRIGGER_PIN_SELECT_BYTE1, &gpioSelReadVal, 0xF0, 4);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
if (gpio3StreamMaskReadValue == 1)
{
/* TAL_GPIO_INVALID */
/* No GPIO pins to free */
}
else
{
freeGpioPins = (uint32_t)(1 << gpioSelReadVal);
}
/* Verify GPIO is not already used */
if ((orxLoCfg->gpioSelect >= TAL_GPIO_00) && (orxLoCfg->gpioSelect <= TAL_GPIO_15))
{
usedGpioPins = (uint32_t)(1 << gpioSel);
/* Check if pin selected is already being used by another feature */
if ((device->devStateInfo.usedGpiopins & (usedGpioPins & ~freeGpioPins)) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETORXLOCFG_GPIOUSED, retVal, TALACT_ERR_CHECK_PARAM);
}
}
/* Verify ARM in radio Off state */
retVal = (talRecoveryActions_t)TALISE_getRadioState(device, &radioStatus);
IF_ERR_RETURN_U32(retVal);
if (((radioStatus & 0x07) != TALISE_ARM_RADIO_STATUS_IDLE) &&
((radioStatus & 0x07) != TALISE_ARM_RADIO_STATUS_READY))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETORXLOCFG_INVALID_ARMSTATE, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Disable/enable Auto Relocking AuxPLL in ARM */
/* Invert value before writing to ARM memory */
enableRelock = (orxLoCfg->disableAuxPllRelocking == 0) ? 1 : 0;
byteOffset = 0x1C;
retVal = (talRecoveryActions_t)TALISE_writeArmConfig(device, TALISE_ARM_OBJECTID_SYTEM_INFO,
byteOffset, &enableRelock, 1);
IF_ERR_RETURN_U32(retVal);
/* Set Stream GPIO3 pin select and enable the GPIO pin to be able to create
* an interrupt to trigger the stream */
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_STREAM_CONTROL, gpio3StreamMaskValue, 0x80, 7);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_STREAM_GPIO_TRIGGER_PIN_SELECT_BYTE1, gpioSel, 0xF0, 4);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Update used GPIO pins in device data structure */
device->devStateInfo.usedGpiopins &= ~freeGpioPins;
device->devStateInfo.usedGpiopins |= usedGpioPins;
return (uint32_t)retVal;
}
uint32_t TALISE_getOrxLoCfg(taliseDevice_t *device, taliseOrxLoCfg_t *orxLoCfg)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint32_t radioStatus = 0;
uint16_t byteOffset = 0;
uint8_t enableRelock = 0;
uint8_t gpio3StreamMaskValue = 0;
uint8_t gpioSel = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getOrxLoCfg()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* Perform input paramter NULL and range checks */
if (orxLoCfg == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETORXLOCFG_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Verify ARM in radio Off state */
retVal = (talRecoveryActions_t)TALISE_getRadioState(device, &radioStatus);
IF_ERR_RETURN_U32(retVal);
if (((radioStatus & 0x07) != TALISE_ARM_RADIO_STATUS_IDLE) &&
((radioStatus & 0x07) != TALISE_ARM_RADIO_STATUS_READY))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETORXLOCFG_INVALID_ARMSTATE, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Read back if ARM is auto relocking AuxPll */
byteOffset = 0x1C;
retVal = (talRecoveryActions_t)TALISE_readArmConfig(device, TALISE_ARM_OBJECTID_SYTEM_INFO, byteOffset, &enableRelock, 1);
IF_ERR_RETURN_U32(retVal);
/* Invert relock value */
orxLoCfg->disableAuxPllRelocking = (enableRelock == 1) ? 0 : 1;
/* Read back stream GPIO3 pin setup */
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_STREAM_CONTROL, &gpio3StreamMaskValue, 0x80, 7);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_STREAM_GPIO_TRIGGER_PIN_SELECT_BYTE1, &gpioSel, 0xF0, 4);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
if (gpio3StreamMaskValue == 1)
{
orxLoCfg->gpioSelect = TAL_GPIO_INVALID;
}
else
{
orxLoCfg->gpioSelect = (taliseGpioPinSel_t)gpioSel;
}
return (uint32_t)retVal;
}
uint32_t TALISE_radioOn(taliseDevice_t *device)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint8_t cmdStatusByte = 0;
/* send ARM opcode to turn radio on */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_RADIOON_OPCODE, 0, 0);
IF_ERR_RETURN_U32(retVal);
/* wait for command to complete */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_RADIOON_OPCODE, &cmdStatusByte, RADIOON_TIMEOUT_US, RADIOON_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_RADIOON_OPCODE, 0, cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
device->devStateInfo.devState = (taliseStates_t)(device->devStateInfo.devState | TAL_STATE_RADIOON);
printf(" radio_on\n");
return (uint32_t)retVal;
}
uint32_t TALISE_radioOff(taliseDevice_t *device)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint8_t cmdStatusByte = 0;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_ABORT_OPCODE, 0, 0);
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_ABORT_OPCODE, &cmdStatusByte, RADIOOFF_TIMEOUT_US, RADIOOFF_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_ABORT_OPCODE, 0, cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
device->devStateInfo.devState = (taliseStates_t)(device->devStateInfo.devState & ~TAL_STATE_RADIOON);
printf(" radio_off\n");
return (uint32_t)retVal;
}
uint32_t TALISE_getRadioState(taliseDevice_t *device, uint32_t *radioStatus)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t status = 0;
/* execute only if radioStatus pointer is valid */
if (radioStatus != NULL)
{
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_ARM_CMD_STATUS_8, &status);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*radioStatus = (uint32_t)status;
}
else
{
/* invalid radioStatus pointer */
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETRADIOSTATE_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
return (uint32_t)retVal;
}
uint32_t TALISE_setRxTxEnable(taliseDevice_t *device, taliseRxORxChannels_t rxOrxChannel, taliseTxChannels_t txChannel)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t chEnable = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setRxTxEnable()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* Only allow valid Rx / ORx cases, return error else */
switch (rxOrxChannel)
{
case TAL_RXOFF_EN: /* Fall through to next case */
case TAL_RX1_EN: /* Fall through to next case */
case TAL_RX2_EN: /* Fall through to next case */
case TAL_RX1RX2_EN: /* Fall through to next case */
case TAL_ORX1_EN: /* Fall through to next case */
case TAL_ORX2_EN: /* Fall through to next case */
case TAL_ORX1ORX2_EN: break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_BBIC_INV_CHN, retVal, TALACT_ERR_CHECK_PARAM);
}
switch (txChannel)
{
case TAL_TXOFF: /* Fall through to next case */
case TAL_TX1: /* Fall through to next case */
case TAL_TX2: /* Fall through to next case */
case TAL_TX1TX2: break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_BBIC_INV_CHN, retVal, TALACT_ERR_CHECK_PARAM);
}
chEnable = (uint8_t)((txChannel << 6) | rxOrxChannel);
/* Check that channels were initialized */
if ((chEnable & device->devStateInfo.initializedChannels) != chEnable)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SETRXTXENABLE_INVCHANNEL, retVal, TALACT_ERR_CHECK_PARAM);
}
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_BBIC_ENABLES, chEnable);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
return (uint32_t)retVal;
}
uint32_t TALISE_getRxTxEnable(taliseDevice_t *device, taliseRxORxChannels_t *rxOrxChannel, taliseTxChannels_t *txChannel)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t chEnable = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getRxTxEnable()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
if ((txChannel == NULL) ||
(rxOrxChannel == NULL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_GETRXTXENABLE_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_BBIC_ENABLES, &chEnable);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*txChannel = (taliseTxChannels_t)((chEnable >> 6) & 0x03);
*rxOrxChannel = (taliseRxORxChannels_t)(chEnable & 0x0F);
return (uint32_t)retVal;
}
uint32_t TALISE_setTxToOrxMapping(taliseDevice_t *device, uint8_t txCalEnable, taliseTxToOrxMapping_t oRx1Map, taliseTxToOrxMapping_t oRx2Map)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t extData[2] = {0};
uint8_t cmdStatusByte = 0x0;
static const uint8_t ENABLE_TXCALS = 0x10;
extData[0] = TALISE_ARM_OBJECTID_ORX_TXCAL_CTRL;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setTxToOrxMapping()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/* cmdByte assignment from oRx1Map */
switch (oRx1Map)
{
case TAL_MAP_NONE:
extData[1] = TAL_MAP_NONE;
break;
case TAL_MAP_TX1_ORX:
extData[1] = TAL_MAP_TX1_ORX;
break;
case TAL_MAP_TX2_ORX:
extData[1] = TAL_MAP_TX2_ORX;
break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SETTXTOORXMAP_INV_ORX1_MAP, retVal, TALACT_ERR_CHECK_PARAM);
}
/* cmdByte assignment from oRx2Map */
switch (oRx2Map)
{
case TAL_MAP_NONE:
extData[1] &= ~0x0C; /* clear bits [3:2] */
break;
case TAL_MAP_TX1_ORX:
extData[1] |= (TAL_MAP_TX1_ORX << 2);
break;
case TAL_MAP_TX2_ORX:
extData[1] |= (TAL_MAP_TX2_ORX << 2);
break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM, TAL_ERR_SETTXTOORXMAP_INV_ORX2_MAP, retVal, TALACT_ERR_CHECK_PARAM);
}
/* adding the txCalEnable bit */
if (txCalEnable > 0)
{
extData[1] |= ENABLE_TXCALS;
}
else
{
extData[1] &= ~ENABLE_TXCALS;
}
/* write new setting to the command register */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &extData[0], 2);
IF_ERR_RETURN_U32(retVal);
/* check for completion */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETTXTOORXMAP_TIMEOUT_US, SETTXTOORXMAP_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, extData[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/* If higher priority retVal has no error, allow possible lower priority warning to be returned */
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_setRfPllFrequency(taliseDevice_t *device, taliseRfPllName_t pllName, uint64_t rfPllLoFrequency_Hz)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t armData[8] = {0};
uint8_t extData[2] = {0};
uint8_t cmdStatusByte = 0;
uint8_t gpStatus = 0;
uint8_t areCalsRunning = 0;
uint8_t errorFlag = 0;
int64_t txFreqValid = 0;
int64_t rxFreqValid = 0;
int64_t orxFreqValid = 0;
/* return error if init cals are in progress */
retVal = (talRecoveryActions_t)TALISE_checkInitCalComplete(device, &areCalsRunning, &errorFlag);
IF_ERR_RETURN_U32(retVal);
if ((areCalsRunning == 1) || (device->devStateInfo.swTest == 1))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL,
TAL_ERR_SETRFPLL_INITCALS_INPROGRESS, retVal, TALACT_ERR_BBIC_LOG_ERROR);
}
/*if Tx profile valid, (rfpllFrequency - TxProfileRFBW/2) > 0 */
txFreqValid = (int64_t)rfPllLoFrequency_Hz - (int64_t)(device->devStateInfo.txBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & TX_PROFILE_VALID) > 0) && (txFreqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_RFPLLFREQ_TX_OUT_OF_RANGE, retVal, TALACT_ERR_CHECK_PARAM);
}
/*If Rx profile valid, (rfpllFrequency - RxProfileRFBW/2) > 0 */
rxFreqValid = (int64_t)rfPllLoFrequency_Hz - (int64_t)(device->devStateInfo.rxBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & RX_PROFILE_VALID) > 0) && (rxFreqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_RFPLLFREQ_RX_OUT_OF_RANGE, retVal, TALACT_ERR_CHECK_PARAM);
}
/*If ORx profile valid, (rfpllFrequency - OrxProfileRFBW/2) > 0 */
orxFreqValid = (int64_t)rfPllLoFrequency_Hz - (int64_t)(device->devStateInfo.orxBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & ORX_PROFILE_VALID) > 0) && (orxFreqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_RFPLLFREQ_ORX_OUT_OF_RANGE, retVal, TALACT_ERR_CHECK_PARAM);
}
/* loading byte array with parsed bytes from rfPllLoFrequency_Hz word */
armData [0] = (uint8_t)(rfPllLoFrequency_Hz & 0xFF);
armData [1] = (uint8_t)((rfPllLoFrequency_Hz >> 8) & 0xFF);
armData [2] = (uint8_t)((rfPllLoFrequency_Hz >> 16) & 0xFF);
armData [3] = (uint8_t)((rfPllLoFrequency_Hz >> 24) & 0xFF);
armData [4] = (uint8_t)((rfPllLoFrequency_Hz >> 32) & 0xFF);
armData [5] = (uint8_t)((rfPllLoFrequency_Hz >> 40) & 0xFF);
armData [6] = (uint8_t)((rfPllLoFrequency_Hz >> 48) & 0xFF);
armData [7] = (uint8_t)((rfPllLoFrequency_Hz >> 56) & 0xFF);
/* write 64-bit frequency value to ARM memory */
retVal = (talRecoveryActions_t)TALISE_writeArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armData[0], 8);
IF_ERR_RETURN_U32(retVal);
/* setting the object ID for RF PLL LO frequency setting */
extData[0] = TALISE_ARM_OBJECTID_RFPLL_LO_FREQUENCY;
/* selecting the PLL of interest */
switch (pllName)
{
case TAL_RF_PLL:
extData[1] = 0x00;
break;
case TAL_AUX_PLL:
extData[1] = 0x01;
break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETRFPLL_INV_PLLNAME, retVal, TALACT_ERR_CHECK_PARAM);
}
/* save the GP Interrutpt mask */
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_GP_INTERRUPT_MASK_1, &gpStatus);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Mask GP interrupt for the PLL being set - only write if mask not already set */
if ((pllName == TAL_AUX_PLL) &&
((gpStatus & (uint8_t)TAL_GP_MASK_AUX_SYNTH_UNLOCK) == 0))
{
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_GP_INTERRUPT_MASK_1, (gpStatus | (uint8_t)TAL_GP_MASK_AUX_SYNTH_UNLOCK));
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
else if ((pllName == TAL_RF_PLL) &&
((gpStatus & (uint8_t)TAL_GP_MASK_RF_SYNTH_UNLOCK) == 0))
{
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_GP_INTERRUPT_MASK_1, (gpStatus | (uint8_t)TAL_GP_MASK_RF_SYNTH_UNLOCK));
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
/* executing the SET command */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &extData[0], 2);
IF_ERR_RETURN_U32(retVal);
/* waiting for command to complete */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETRFPLL_TIMEOUT_US, SETRFPLL_INTERVAL_US);
/* if PLL GP interrupt was changed, then restore original GP interrupt mask */
if (((pllName == TAL_AUX_PLL) &&
((gpStatus & (uint8_t)TAL_GP_MASK_AUX_SYNTH_UNLOCK) == 0)) ||
((pllName == TAL_RF_PLL) &&
((gpStatus & (uint8_t)TAL_GP_MASK_RF_SYNTH_UNLOCK) == 0)))
{
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_GP_INTERRUPT_MASK_1, gpStatus);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
/* check previous TALISE_waitArmCmdStatus for ARM errors */
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, extData[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
return (uint32_t)retVal;
}
uint32_t TALISE_getRfPllFrequency(taliseDevice_t *device, taliseRfPllName_t pllName, uint64_t *rfPllLoFrequency_Hz)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t armData[8] = {0};
uint8_t extData[2] = {0};
uint8_t cmdStatusByte = 0;
uint8_t getClkPllFrequency = 0;
uint32_t clkPllIntWord = 0;
uint32_t clkPllFracWord = 0;
uint8_t clkPllRefClkDiv = 0;
uint8_t devClkDivideRatio = 0;
uint8_t hsDivTimes10 = 0;
uint8_t hsDivReg = 0;
uint8_t clkPllIntWord7_0 = 0;
uint8_t clkPllIntWord10_8 = 0;
uint8_t clkPllFracWord7_0 = 0;
uint8_t clkPllFracWord15_8 = 0;
uint8_t clkPllFracWord22_16 = 0;
uint64_t refclk_Hz = 0;
static const uint32_t modDiv2 = 1044480;
static const uint8_t vcoDiv = 2;
static const uint8_t hsDigClkDiv2 = 2;
static const uint16_t kHzToHz = 1000;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getRfPllFrequency()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* first extended data byte is the object ID */
extData[0] = TALISE_ARM_OBJECTID_RFPLL_LO_FREQUENCY;
/* PLL select with error check */
switch (pllName)
{
case TAL_CLK_PLL:
getClkPllFrequency = 1;
break;
case TAL_RF_PLL:
extData[1] = 0x00;
break;
case TAL_AUX_PLL:
extData[1] = 0x01;
break;
default:
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETRFPLL_INV_PLLNAME, retVal, TALACT_ERR_CHECK_PARAM);
}
/* rfPllLoFrequency_Hz null pointer check */
if (rfPllLoFrequency_Hz == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETRFPLL_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* calculate CLK PLL frequency */
else if (getClkPllFrequency == 1)
{
/* read in integer and fractional PLL data into variables */
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLOCK_CONTROL_2, &hsDivReg, 0x07, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLOCK_CONTROL_5, &devClkDivideRatio, 0x30, 4);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLOCK_CONTROL_2, &clkPllRefClkDiv, 0x70, 4);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_DIVIDER_INT_BYTE0, &clkPllIntWord7_0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_DIVIDER_INT_BYTE1, &clkPllIntWord10_8, 0x07, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_DIVIDER_FRAC_BYTE0, &clkPllFracWord7_0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_DIVIDER_FRAC_BYTE1, &clkPllFracWord15_8);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_DIVIDER_FRAC_BYTE2, &clkPllFracWord22_16, 0x7F, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* forming CLK PLL integer and fractional words */
clkPllIntWord = ((uint32_t)(clkPllIntWord10_8) << 8) | (uint32_t)(clkPllIntWord7_0);
clkPllFracWord = ((uint32_t)(clkPllFracWord22_16) << 16) | ((uint32_t)(clkPllFracWord15_8) << 8) | (uint32_t)(clkPllFracWord7_0);
/* determine CLK PLL reference clock divider */
switch (devClkDivideRatio)
{
case 0:
/* times 1 */
refclk_Hz = ((uint64_t)device->devStateInfo.clocks.deviceClock_kHz * kHzToHz);
break;
case 1:
/* div 2 */
refclk_Hz = (((uint64_t)device->devStateInfo.clocks.deviceClock_kHz * kHzToHz) >> 1);
break;
case 2:
/* div 4 */
refclk_Hz = (((uint64_t)device->devStateInfo.clocks.deviceClock_kHz * kHzToHz) >> 2);
break;
default:
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL,
TAL_ERR_GET_PLLFREQ_INV_REFCLKDIV, retVal, TALACT_ERR_CHECK_PARAM);
}
}
switch (clkPllRefClkDiv)
{
case 0:
/* times 1 */
/* refclk_Hz = (refclk_Hz); */ /* No need to assign to same value */
break;
case 1:
/* div 2 */
refclk_Hz = (refclk_Hz >> 1);
break;
case 2:
/* div 4 */
refclk_Hz = (refclk_Hz >> 2);
break;
case 3:
/* times 2 */
refclk_Hz = (refclk_Hz << 1);
break;
default:
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL,
TAL_ERR_GET_PLLFREQ_INV_REFCLKDIV, retVal, TALACT_ERR_CHECK_PARAM);
}
}
/* HS divider scalar assignment */
switch (hsDivReg)
{
case TAL_HSDIV_2:
hsDivTimes10 = 20;
break;
case TAL_HSDIV_2P5:
hsDivTimes10 = 25;
break;
case TAL_HSDIV_3:
hsDivTimes10 = 30;
break;
case TAL_HSDIV_4:
hsDivTimes10 = 40;
break;
case TAL_HSDIV_5:
hsDivTimes10 = 50;
break;
default:
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL,
TAL_ERR_GET_PLLFREQ_INV_HSDIV, retVal, TALACT_ERR_CHECK_PARAM);
}
}
/* calculate PLL clock frequency - round to nearest Hz for fractional word (fractional modulus = 2088960) */
*rfPllLoFrequency_Hz = (((refclk_Hz * clkPllIntWord) + (((refclk_Hz * clkPllFracWord / modDiv2) + 1) >> 1)) * vcoDiv * hsDivTimes10 / 10) * hsDigClkDiv2;
}
/* else get RF PLL LO frequency from ARM memory */
else
{
/* send get opcode to ARM */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &extData[0], 2);
IF_ERR_RETURN_U32(retVal);
/* wait for command to complete */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, GETRFPLL_TIMEOUT_US, GETRFPLL_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, extData[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/* read 64-bit frequency from ARM memory */
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armData[0], 8, 0);
IF_ERR_RETURN_U32(retVal);
/* form RF PLL LO frequency word for read-back */
*rfPllLoFrequency_Hz = ((uint64_t)(armData[0])) |
((uint64_t)(armData[1]) << 8) |
((uint64_t)(armData[2]) << 16) |
((uint64_t)(armData[3]) << 24) |
((uint64_t)(armData[4]) << 32) |
((uint64_t)(armData[5]) << 40) |
((uint64_t)(armData[6]) << 48) |
((uint64_t)(armData[7]) << 56);
}
return (uint32_t)retVal;
}
uint32_t TALISE_getPllsLockStatus(taliseDevice_t *device, uint8_t *pllLockStatus)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t readData = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getPllsLockStatus()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* null pointer check */
if (pllLockStatus == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_CHECKPLLLOCK_NULL_PARM, retVal, TALACT_ERR_CHECK_PARAM);
}
else
{
/* clear the pointer contents */
*pllLockStatus = 0;
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_CLK_SYNTH_VCO_BAND_BYTE1, &readData, 0x01, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*pllLockStatus = readData;
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_RF_SYNTH_VCO_BAND_BYTE1, &readData, 0x01, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*pllLockStatus = *pllLockStatus | (readData << 1);
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_AUX_SYNTH_VCO_BAND_BYTE1, &readData, 0x01, 0);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*pllLockStatus = *pllLockStatus | (readData << 2);
}
return (uint32_t)retVal;
}
uint32_t TALISE_setRfPllLoopFilter(taliseDevice_t *device, uint16_t loopBandwidth_kHz, uint8_t stability)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setRfPllLoopFilter()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
retVal = (talRecoveryActions_t)TALISE_setPllLoopFilter(device, TAL_RF_PLL, loopBandwidth_kHz, stability);
IF_ERR_RETURN_U32(retVal);
/* If higher priority retVal has no error, allow possible lower priority warning to be returned */
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getRfPllLoopFilter(taliseDevice_t *device, uint16_t *loopBandwidth_kHz, uint8_t *stability)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getRfPllLoopFilter()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
retVal = (talRecoveryActions_t)TALISE_getPllLoopFilter(device, TAL_RF_PLL, loopBandwidth_kHz, stability);
IF_ERR_RETURN_U32(retVal);
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_setPllLoopFilter(taliseDevice_t *device, taliseRfPllName_t pllName, uint16_t loopBandwidth_kHz, uint8_t stability)
{
static const uint8_t AUXPLL_BIT = 0x80;
static const uint8_t RFPLL_BIT = 0x00;
uint8_t extData[4] = {0};
uint8_t cmdStatusByte = 0;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t auxPllSel = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setPllLoopFilter()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/* Range check for loopBandwidth - Should be between 50kHz and 750kHz */
if ((loopBandwidth_kHz < 50) ||
(loopBandwidth_kHz > 750))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETRFPLL_LOOPFILTER_INV_LOOPBANDWIDTH, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Range check for stability - Should be between 3 and 15 */
if ((stability < 3) ||
(stability > 15))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETRFPLL_LOOPFILTER_INV_STABILITY, retVal, TALACT_ERR_CHECK_PARAM);
}
if ((pllName != TAL_RF_PLL) &&
(pllName != TAL_AUX_PLL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETRFPLL_LOOPFILTER_INV_PLLSEL, retVal, TALACT_ERR_CHECK_PARAM);
}
auxPllSel = (pllName == TAL_AUX_PLL) ? AUXPLL_BIT : RFPLL_BIT;
/* Generate payload for SET command */
extData[0] = TALISE_ARM_OBJECTID_RFPLL_LOOP_FREQ;
extData[1] = auxPllSel | (stability & 0x0F);
extData[2] = (uint8_t)(loopBandwidth_kHz);
extData[3] = (uint8_t)(loopBandwidth_kHz >> 8);
/* executing the SET command */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &extData[0], 4);
IF_ERR_RETURN_U32(retVal);
/* waiting for command to complete */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETRFPLL_LOOP_FREQ_TIMEOUT_US, SETRFPLL_LOOP_FREQ_INTERVAL_US);
/* performing command status check */
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, extData[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/* If higher priority retVal has no error, allow possible lower priority warning to be returned */
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getPllLoopFilter(taliseDevice_t *device, taliseRfPllName_t pllName, uint16_t *loopBandwidth_kHz, uint8_t *stability)
{
static const uint8_t AUXPLL_BIT = 0x80;
static const uint8_t RFPLL_BIT = 0x00;
static const uint8_t STABILITY_BITMASK = 0x0F;
uint8_t extData[2] = {TALISE_ARM_OBJECTID_RFPLL_LOOP_FREQ, 0};
uint8_t armData[3] = {0};
uint8_t cmdStatusByte = 0;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t auxPllSel = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getPllLoopFilter()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
if ((pllName != TAL_RF_PLL) &&
(pllName != TAL_AUX_PLL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETRFPLL_LOOPFILTER_INV_PLLSEL, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Check for NULL */
if ((loopBandwidth_kHz == NULL) ||
(stability == NULL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETRFPLL_LOOPFILTER_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
auxPllSel = (pllName == TAL_AUX_PLL) ? AUXPLL_BIT : RFPLL_BIT;
extData[1] = auxPllSel;
/* executing the GET command */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &extData[0], sizeof(extData));
IF_ERR_RETURN_U32(retVal);
/* waiting for command to complete */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, GETRFPLL_LOOP_FREQ_TIMEOUT_US, GETRFPLL_LOOP_FREQ_INTERVAL_US);
/* performing command status check */
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, extData[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/* Read from ARM memory */
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armData[0], 3, 0);
IF_ERR_RETURN_U32(retVal);
/* Assign to variables */
*stability = (armData[2] & STABILITY_BITMASK);
*loopBandwidth_kHz = (((uint16_t)armData[1]) << 8) | ((uint16_t)armData[0]);
return (uint32_t)retVal;
}
uint32_t TALISE_setOrxLoSource(taliseDevice_t *device, taliseObsRxLoSource_t orxLoSource)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t streamId = 0;
uint8_t armCommandBusy = 0;
uint32_t timeout_us = RUNSTREAMCMD_TIMEOUT_US;
uint32_t waitInterval_us = RUNSTREAMCMD_INTERVAL_US;
uint32_t eventCheck = 0;
uint32_t numEventChecks = 0;
const uint8_t GPIO3_RISING_STREAMID = 25;
const uint8_t GPIO3_FALLING_STREAMID = 29;
const uint8_t ARMCMD_RUN_STREAM = 0x1F;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setOrxLoSource()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
if (orxLoSource == TAL_OBSLO_RF_PLL)
{
streamId = GPIO3_FALLING_STREAMID;
}
else if (orxLoSource == TAL_OBSLO_AUX_PLL)
{
streamId = GPIO3_RISING_STREAMID;
}
else
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETORXLOSRC_INVALIDPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* setting a timeout for ARM mailbox busy bit to be clear (can't send an arm mailbox command until mailbox is ready) */
waitInterval_us = (waitInterval_us > timeout_us) ? timeout_us : waitInterval_us;
numEventChecks = (waitInterval_us == 0) ? 1 : (timeout_us / waitInterval_us);
/* timeout event loop to permit non-blocking of thread */
for (eventCheck = 0; eventCheck <= numEventChecks; eventCheck++)
{
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_ARM_COMMAND, &armCommandBusy, 0x80, 7);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
if (armCommandBusy > 0)
{
halError = ADIHAL_wait_us(device->devHalInfo, waitInterval_us);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_WAIT, halError, retVal, TALACT_ERR_CHECK_TIMER);
}
else
{
break;
}
}
/* if busy bit remains set after timeout event loop function is exited, otherwise command is sent after extended bytes */
if (armCommandBusy > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL, TAL_ERR_SETORXLOSRC_TIMEDOUT_ARMMAILBOXBUSY, retVal, TALACT_ERR_RESET_ARM);
}
else
{
/* Write stream ID to run */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_ARM_EXT_CMD_BYTE_1, streamId);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Run stream */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_ARM_COMMAND, ARMCMD_RUN_STREAM);
retVal = talApiErrHandler(device,TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
return (uint32_t)retVal;
}
uint32_t TALISE_getOrxLoSource(taliseDevice_t *device, taliseObsRxLoSource_t *orx1LoSource, taliseObsRxLoSource_t *orx2LoSource)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t orxLoSourceBitfieldValue = 0;
const uint8_t ORXLOSRC_BITMASK = 0x0C;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getOrxLoSource()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* Check for NULL */
if ((orx1LoSource == NULL) ||
(orx2LoSource == NULL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETORXLOSRC_NULLPARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_LO_MUX_CONFIG, &orxLoSourceBitfieldValue, ORXLOSRC_BITMASK, 2);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*orx1LoSource = (taliseObsRxLoSource_t)(orxLoSourceBitfieldValue & 0x01);
*orx2LoSource = (taliseObsRxLoSource_t)((orxLoSourceBitfieldValue >> 1) & 0x01);
return (uint32_t)retVal;
}
static uint32_t talSetFhmGpio(taliseDevice_t *device, taliseGpioPinSel_t fhmGpioPin)
{
static const uint8_t GPIO_STATUS_CMD_SIZE_BYTES = 2;
static const uint8_t GPIO_CONFIG_CMD_SIZE_BYTES = 3;
static const uint8_t SIGNALID_RF_PLL_FREQ_HOP = 0x09;
static const uint8_t GPIO_CONFIG_POLARITY = 0;
static const uint8_t GPIO_CONFIG_DISABLE = 0;
static const uint8_t GPIO_CONFIG_ENABLE = 0x80;
static const uint8_t ARM_AUTO_INCREMENT = 0;
static const uint8_t ARM_GPIO_READ_NUM_BYTES = 1;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint8_t cmdStatusByte = 0;
uint8_t armGetGpioStatus = 0;
uint32_t usedGpioPins = 0;
uint32_t gpioFreeMask = 0;
uint32_t gpioUsedMask = 0;
uint8_t gpioStatus[GPIO_STATUS_CMD_SIZE_BYTES];
uint8_t gpioConfig[GPIO_CONFIG_CMD_SIZE_BYTES];
/*Initialize gpioStatus array C-99 style*/
gpioStatus[0] = TALISE_ARM_OBJECTID_GPIO_CTRL;
gpioStatus[1] = SIGNALID_RF_PLL_FREQ_HOP;
/*Initialize gpioConfig array C-99 style*/
gpioConfig[0] = TALISE_ARM_OBJECTID_GPIO_CTRL;
gpioConfig[1] = SIGNALID_RF_PLL_FREQ_HOP;
gpioConfig[2] = 0;
/* Get current GPIO pin assigned to RF_PLL_FREQ_HOP signal_id */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &gpioStatus[0], sizeof(gpioStatus));
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, SETARMGPIO_TIMEOUT_US, SETARMGPIO_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, gpioStatus[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armGetGpioStatus, ARM_GPIO_READ_NUM_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
if (armGetGpioStatus <= (uint8_t)TAL_GPIO_15)
{
gpioFreeMask = (1 << (armGetGpioStatus & 0x0F));
}
usedGpioPins = device->devStateInfo.usedGpiopins & ~gpioFreeMask;
if(fhmGpioPin <= TAL_GPIO_15)
{
gpioUsedMask = (1 << fhmGpioPin);
gpioConfig[2] = ((uint8_t)fhmGpioPin | GPIO_CONFIG_POLARITY | GPIO_CONFIG_ENABLE);
}
else if(fhmGpioPin == TAL_GPIO_INVALID)
{
gpioUsedMask = 0;
gpioConfig[2] = ((uint8_t)TAL_GPIO_INVALID | GPIO_CONFIG_POLARITY | GPIO_CONFIG_DISABLE);
}
/*Check if GPIO pin is already in use*/
if ((usedGpioPins & gpioUsedMask) != 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_FHMGPIOPIN_IN_USE, retVal, TALACT_ERR_CHECK_PARAM);
}
usedGpioPins |= gpioUsedMask;
/*Send FHM GPIO config to ARM*/
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &gpioConfig[0], sizeof(gpioConfig));
IF_ERR_RETURN_U32(retVal);
/* execute Set FHM GPIO config command */
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETARMGPIO_TIMEOUT_US, SETARMGPIO_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, gpioConfig[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/* Set GPIO input enables */
/* - Set OE for all freed GPIO's to 0 (input) */
/* - Set OE for all used GPIO's to 0 (input) */
retVal = (talRecoveryActions_t)TALISE_setGpioOe(device, 0, (gpioUsedMask | gpioFreeMask));
IF_ERR_RETURN(retVal);
device->devStateInfo.usedGpiopins = usedGpioPins;
return (uint32_t)retVal;
}
static uint32_t talGetFhmGpio(taliseDevice_t *device, taliseGpioPinSel_t *fhmGpioPin)
{
static const uint8_t GPIO_STATUS_CMD_SIZE_BYTES = 2;
static const uint8_t SIGNALID_RF_PLL_FREQ_HOP = 0x09;
static const uint8_t ARM_AUTO_INCREMENT = 0;
static const uint8_t ARM_GPIO_READ_NUM_BYTES = 1;
static const uint8_t GPIO_PINSEL_MASK = 0x1F;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint8_t cmdStatusByte = 0;
uint8_t armGetGpioStatus = 0;
uint8_t gpioStatus[GPIO_STATUS_CMD_SIZE_BYTES];
/*Initialize gpioStatus array C-99 style*/
gpioStatus[0] = TALISE_ARM_OBJECTID_GPIO_CTRL;
gpioStatus[1] = SIGNALID_RF_PLL_FREQ_HOP;
/* Get current GPIO pin assigned to RF_PLL_FREQ_HOP signal_id */
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &gpioStatus[0], sizeof(gpioStatus));
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, SETARMGPIO_TIMEOUT_US, SETARMGPIO_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, gpioStatus[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armGetGpioStatus, ARM_GPIO_READ_NUM_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
*fhmGpioPin = (taliseGpioPinSel_t)(armGetGpioStatus & GPIO_PINSEL_MASK);
return (uint32_t)retVal;
}
uint32_t TALISE_setFhmConfig(taliseDevice_t *device, taliseFhmConfig_t *fhmConfig)
{
static const int64_t MHZ_TO_HZ_CONVERSION_FACTOR = 1000000;
static const uint8_t ARM_CFG_BUF_SIZE = 8;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
int64_t freqValid = 0;
uint8_t byteOffset = 0;
uint8_t armConfigBuf[8] = {0};
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setFhmConfig()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Check for NULL*/
if(fhmConfig == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Check that Frequency Hop Trigger GPIO pin is valid*/
if((fhmConfig->fhmGpioPin > TAL_GPIO_15) &&
(fhmConfig->fhmGpioPin != TAL_GPIO_INVALID))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_INV_FHMGPIOPIN, retVal, TALACT_ERR_CHECK_PARAM);
}
if(fhmConfig->fhmMinFreq_MHz >= fhmConfig->fhmMaxFreq_MHz)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_INV_FHMCONFIG_FHM_MAX_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Check that minimum hopping range frequency is at least greater than or equal to DC + Bandwidth/2*/
/*If Rx profile valid, (fhmMinFreq - RxProfileRFBW/2) > 0 */
freqValid = ((int64_t)fhmConfig->fhmMinFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR) - (int64_t)(device->devStateInfo.rxBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & RX_PROFILE_VALID) > 0) && (freqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_INV_FHMCONFIG_FHM_MIN_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*If Tx profile valid, (fhmMinFreq - TxProfileRFBW/2) > 0 */
freqValid = ((int64_t)fhmConfig->fhmMinFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR) - (int64_t)(device->devStateInfo.txBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & TX_PROFILE_VALID) > 0) && (freqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_INV_FHMCONFIG_FHM_MIN_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*If ORx profile valid, (fhmMinFreq - OrxProfileRFBW/2) > 0 */
freqValid = ((int64_t)fhmConfig->fhmMinFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR) - (int64_t)(device->devStateInfo.orxBandwidth_Hz >> 1);
if(((device->devStateInfo.profilesValid & ORX_PROFILE_VALID) > 0) && (freqValid <= 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMCONFIG_INV_FHMCONFIG_FHM_MIN_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Set FHM GPIO pin*/
retVal = (talRecoveryActions_t)talSetFhmGpio(device, fhmConfig->fhmGpioPin);
IF_ERR_RETURN_U32(retVal);
/*Set the FHM frequency range configuration if a valid GPIO pin is selected*/
armConfigBuf[0] = (uint8_t)(fhmConfig->fhmMinFreq_MHz & 0xFF);
armConfigBuf[1] = (uint8_t)((fhmConfig->fhmMinFreq_MHz >> 8) & 0xFF);
armConfigBuf[2] = (uint8_t)((fhmConfig->fhmMinFreq_MHz >> 16) & 0xFF);
armConfigBuf[3] = (uint8_t)((fhmConfig->fhmMinFreq_MHz >> 24) & 0xFF);
armConfigBuf[4] = (uint8_t)(fhmConfig->fhmMaxFreq_MHz & 0xFF);
armConfigBuf[5] = (uint8_t)((fhmConfig->fhmMaxFreq_MHz >> 8) & 0xFF);
armConfigBuf[6] = (uint8_t)((fhmConfig->fhmMaxFreq_MHz >> 16) & 0xFF);
armConfigBuf[7] = (uint8_t)((fhmConfig->fhmMaxFreq_MHz >> 24) & 0xFF);
byteOffset = 0x20;
retVal = (talRecoveryActions_t)TALISE_writeArmConfig(device, TALISE_ARM_OBJECTID_SYTEM_INFO,
byteOffset, &armConfigBuf[0], ARM_CFG_BUF_SIZE);
IF_ERR_RETURN_U32(retVal);
/*Update device data structure with frequency hopping range*/
device->devStateInfo.talFhmFreqRange.fhmMaxFreq_MHz = fhmConfig->fhmMaxFreq_MHz;
device->devStateInfo.talFhmFreqRange.fhmMinFreq_MHz = fhmConfig->fhmMinFreq_MHz;
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getFhmConfig(taliseDevice_t *device, taliseFhmConfig_t *fhmConfig)
{
static const uint8_t ARM_CFG_BUF_SIZE = 8;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t armCfgBuf[8] = {0};
uint8_t byteOffset = 0;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getFhmConfig()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Check for NULL*/
if(fhmConfig == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETFHMCONFIG_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
retVal = (talRecoveryActions_t)talGetFhmGpio(device, &fhmConfig->fhmGpioPin);
IF_ERR_RETURN_U32(retVal);
byteOffset = 0x20;
retVal = (talRecoveryActions_t)TALISE_readArmConfig(device, TALISE_ARM_OBJECTID_SYTEM_INFO,
byteOffset, &armCfgBuf[0], ARM_CFG_BUF_SIZE);
IF_ERR_RETURN_U32(retVal);
fhmConfig->fhmMinFreq_MHz = ((uint32_t)armCfgBuf[0] |
((uint32_t)armCfgBuf[1] << 8) |
((uint32_t)armCfgBuf[2] << 16) |
((uint32_t)armCfgBuf[3] << 24));
fhmConfig->fhmMaxFreq_MHz = ((uint32_t)armCfgBuf[4] |
((uint32_t)armCfgBuf[5] << 8) |
((uint32_t)armCfgBuf[6] << 16) |
((uint32_t)armCfgBuf[7] << 24));
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
static uint32_t talSetFhmRfPllFreq(taliseDevice_t *device, uint64_t nextRfPllFreq_Hz)
{
static const uint8_t FHM_NEXT_RF_PLL_FREQ_BYTES = 8;
static const uint64_t BYTE0_MASK = 0x00000000000000FF;
static const uint64_t BYTE1_MASK = 0x000000000000FF00;
static const uint64_t BYTE2_MASK = 0x0000000000FF0000;
static const uint64_t BYTE3_MASK = 0x00000000FF000000;
static const uint64_t BYTE4_MASK = 0x000000FF00000000;
static const uint64_t BYTE5_MASK = 0x0000FF0000000000;
static const uint64_t BYTE6_MASK = 0x00FF000000000000;
static const uint64_t BYTE7_MASK = 0xFF00000000000000;
static const uint8_t BYTE1_SHIFT = 8;
static const uint8_t BYTE2_SHIFT = 16;
static const uint8_t BYTE3_SHIFT = 24;
static const uint8_t BYTE4_SHIFT = 32;
static const uint8_t BYTE5_SHIFT = 40;
static const uint8_t BYTE6_SHIFT = 48;
static const uint8_t BYTE7_SHIFT = 56;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
uint8_t fhmNextRfPllFreqConfigArr[FHM_NEXT_RF_PLL_FREQ_BYTES];
/*FHM Frequency Range needs to be written to ARM mailbox in the form {fhmMinFreq_MHz, fhmMaxFreq_MHz}*/
fhmNextRfPllFreqConfigArr[0] = (uint8_t)(nextRfPllFreq_Hz & BYTE0_MASK);
fhmNextRfPllFreqConfigArr[1] = (uint8_t)((nextRfPllFreq_Hz & BYTE1_MASK) >> BYTE1_SHIFT);
fhmNextRfPllFreqConfigArr[2] = (uint8_t)((nextRfPllFreq_Hz & BYTE2_MASK) >> BYTE2_SHIFT);
fhmNextRfPllFreqConfigArr[3] = (uint8_t)((nextRfPllFreq_Hz & BYTE3_MASK) >> BYTE3_SHIFT);
fhmNextRfPllFreqConfigArr[4] = (uint8_t)((nextRfPllFreq_Hz & BYTE4_MASK) >> BYTE4_SHIFT);
fhmNextRfPllFreqConfigArr[5] = (uint8_t)((nextRfPllFreq_Hz & BYTE5_MASK) >> BYTE5_SHIFT);
fhmNextRfPllFreqConfigArr[6] = (uint8_t)((nextRfPllFreq_Hz & BYTE6_MASK) >> BYTE6_SHIFT);
fhmNextRfPllFreqConfigArr[7] = (uint8_t)((nextRfPllFreq_Hz & BYTE7_MASK) >> BYTE7_SHIFT);
/* Write 64 bit next FHM hop frequency to ARM Freq Hop mailbox*/
retVal = (talRecoveryActions_t)TALISE_writeArmMem(device, TALISE_ADDR_ARM_HOP_FREQ_MEM_ADDR, &fhmNextRfPllFreqConfigArr[0], FHM_NEXT_RF_PLL_FREQ_BYTES);
IF_ERR_RETURN_U32(retVal);
return (uint32_t)retVal;
}
uint32_t TALISE_setFhmMode(taliseDevice_t *device, taliseFhmMode_t *fhmMode)
{
static const uint64_t MHZ_TO_HZ_CONVERSION_FACTOR = 1000000;
static const uint32_t ARM_FHM_MODE_CMD_NUM_BYTES = 3;
static const uint8_t FHM_ENABLE = 1;
static const uint8_t FHM_DISABLE = 0;
static const uint8_t FHM_ENABLE_MCS_SYNC = 1;
static const uint8_t FHM_DISABLE_MCS_SYNC = 0;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t cmdStatusByte = 0;
uint8_t armFhmModeCfgCmd[3] = { 0 };
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setFhmMode()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Check for NULL*/
if(fhmMode == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMMODE_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
if(fhmMode->fhmEnable > 0)
{
/*Check if requested FHM init frequency on enable is valid*/
if((fhmMode->fhmInitFrequency_Hz > ((uint64_t)device->devStateInfo.talFhmFreqRange.fhmMaxFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR)) ||
(fhmMode->fhmInitFrequency_Hz < ((uint64_t)device->devStateInfo.talFhmFreqRange.fhmMinFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR)))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMMODE_INV_FHM_INIT_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Check if requested FHM mode is valid*/
if((fhmMode->fhmTriggerMode != TAL_FHM_GPIO_MODE) &&
(fhmMode->fhmTriggerMode != TAL_FHM_NON_GPIO_MODE))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMMODE_INV_FHM_TRIGGER_MODE, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Write initial FHM hop frequency to ARM mailbox*/
retVal = (talRecoveryActions_t)talSetFhmRfPllFreq(device, fhmMode->fhmInitFrequency_Hz);
IF_ERR_RETURN_U32(retVal);
/*Send FHM Enable command to ARM. The command comprises of the following
Byte0 - Fast Freq Hop Obj ID
Byte1 - FHM Enable
Byte2 - Enable MCS Synchronization*/
armFhmModeCfgCmd[0] = (uint8_t)TALISE_ARM_OBJECTID_FAST_FREQ_HOP_MODE;
armFhmModeCfgCmd[1] = FHM_ENABLE;
armFhmModeCfgCmd[2] = ( fhmMode->enableMcsSync > 0 ) ? FHM_ENABLE_MCS_SYNC : FHM_DISABLE_MCS_SYNC;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &armFhmModeCfgCmd[0], ARM_FHM_MODE_CMD_NUM_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETFREQHOP_MODE_TIMEOUT_US, SETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, armFhmModeCfgCmd[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/*Store the trigger mode, init FHM frequency and MCS Synch flag in the device data structure*/
device->devStateInfo.talFhmInitHopFreq_Hz = fhmMode->fhmInitFrequency_Hz;
device->devStateInfo.talFhmTriggerMode = fhmMode->fhmTriggerMode;
device->devStateInfo.talFhmMcsSync = ( fhmMode->enableMcsSync > 0 ) ? FHM_ENABLE_MCS_SYNC : FHM_DISABLE_MCS_SYNC;
}
else if(fhmMode->fhmEnable == 0)
{
if((fhmMode->fhmExitMode != TAL_FHM_QUICK_EXIT) &&
(fhmMode->fhmExitMode != TAL_FHM_FULL_EXIT))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMMODE_INV_FHM_EXIT_MODE, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Send FHM Enable command to ARM. The command comprises of the following
Byte0 - Fast Freq Hop Obj ID
Byte1 - FHM Disable
Byte2 - FHM Exit Mode*/
armFhmModeCfgCmd[0] = (uint8_t)TALISE_ARM_OBJECTID_FAST_FREQ_HOP_MODE;
armFhmModeCfgCmd[1] = FHM_DISABLE;
armFhmModeCfgCmd[2] = (uint8_t)fhmMode->fhmExitMode;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &armFhmModeCfgCmd[0], ARM_FHM_MODE_CMD_NUM_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETFREQHOP_MODE_TIMEOUT_US, SETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, armFhmModeCfgCmd[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
device->devStateInfo.talFhmInitHopFreq_Hz = 0;
device->devStateInfo.talFhmTriggerMode = TAL_FHM_INVALID_TRIGGER_MODE;
device->devStateInfo.talFhmMcsSync = FHM_DISABLE_MCS_SYNC;
}
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getFhmMode(taliseDevice_t *device, taliseFhmMode_t *fhmMode)
{
static const uint8_t ARM_FHM_MODE_READ_CMD_NUM_BYTES = 1;
static const uint32_t FHM_ENABLE_STATUS_OFFSET = 8;
static const uint32_t FHM_EXIT_MODE_STATUS_OFFSET = 9;
static const uint8_t ARM_AUTO_INCREMENT = 0;
static const uint8_t ARM_MAILBOX_READ_NUM_BYTES = 1;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t cmdStatusByte = 0;
uint8_t fhmExitMode = 0;
uint8_t armGetFhmModeCmdArr[ARM_FHM_MODE_READ_CMD_NUM_BYTES];
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getFhmMode()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Check for NULL*/
if(fhmMode == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETFHMMODE_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Send ARM command to read FHM mode*/
armGetFhmModeCmdArr[0] = TALISE_ARM_OBJECTID_FAST_FREQ_HOP_MODE;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &armGetFhmModeCmdArr[0], ARM_FHM_MODE_READ_CMD_NUM_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, GETFREQHOP_MODE_TIMEOUT_US, GETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, armGetFhmModeCmdArr[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/*Read FHM enable status and FHM exit mode status from the mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_ENABLE_STATUS_OFFSET), &fhmMode->fhmEnable, ARM_MAILBOX_READ_NUM_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_EXIT_MODE_STATUS_OFFSET), &fhmExitMode, ARM_MAILBOX_READ_NUM_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
/*Read FHM init frequency, FHM trigger mode, MCS sync flag from the device data structure*/
fhmMode->fhmExitMode = (taliseFhmExitMode_t)fhmExitMode;
fhmMode->fhmInitFrequency_Hz = device->devStateInfo.talFhmInitHopFreq_Hz;
fhmMode->fhmTriggerMode = device->devStateInfo.talFhmTriggerMode;
fhmMode->enableMcsSync = device->devStateInfo.talFhmMcsSync;
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_setFhmHop(taliseDevice_t *device, uint64_t nextRfPllFrequency_Hz)
{
static const uint8_t ARM_FHM_HOP_SET_CMD_BYTES = 1;
static const uint64_t MHZ_TO_HZ_CONVERSION_FACTOR = 1000000;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t cmdStatusByte = 0;
uint8_t armSetFhmHopCmdArr[ARM_FHM_HOP_SET_CMD_BYTES];
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setFhmHop()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Check if requested FHM init frequency on enable is valid*/
if((nextRfPllFrequency_Hz > ((uint64_t)device->devStateInfo.talFhmFreqRange.fhmMaxFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR)) ||
(nextRfPllFrequency_Hz < ((uint64_t)device->devStateInfo.talFhmFreqRange.fhmMinFreq_MHz * MHZ_TO_HZ_CONVERSION_FACTOR)))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETFHMHOP_INV_FHM_FREQ, retVal, TALACT_ERR_CHECK_PARAM);
}
/*Write the next Rf Pll freq to ARM mailbox*/
retVal = (talRecoveryActions_t)talSetFhmRfPllFreq(device, nextRfPllFrequency_Hz);
IF_ERR_RETURN_U32(retVal);
/*If the FHM trigger mode is non-GPIO, send an ARM command to hop frequency*/
if(device->devStateInfo.talFhmTriggerMode == TAL_FHM_NON_GPIO_MODE)
{
/*Send ARM command to set FHM Hop*/
armSetFhmHopCmdArr[0] = TALISE_ARM_OBJECTID_FREQ_HOP; /*No payload for set FHM hop cmd*/
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_SET_OPCODE, &armSetFhmHopCmdArr[0], ARM_FHM_HOP_SET_CMD_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_SET_OPCODE, &cmdStatusByte, SETFREQHOP_MODE_TIMEOUT_US, SETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_SET_OPCODE, armSetFhmHopCmdArr[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
}
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getFhmRfPllFrequency(taliseDevice_t *device, uint64_t *fhmRfPllFrequency_Hz)
{
static const uint8_t ARM_FHM_MODE_READ_CMD_NUM_BYTES = 1;
static const uint8_t ARM_FHM_MODE_FREQ_NUM_BYTES = 8;
static const uint8_t ARM_AUTO_INCREMENT = 0;
static const uint8_t BYTE1_SHIFT = 8;
static const uint8_t BYTE2_SHIFT = 16;
static const uint8_t BYTE3_SHIFT = 24;
static const uint8_t BYTE4_SHIFT = 32;
static const uint8_t BYTE5_SHIFT = 40;
static const uint8_t BYTE6_SHIFT = 48;
static const uint8_t BYTE7_SHIFT = 56;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t cmdStatusByte = 0;
uint8_t armGetFhmModeCmdArr[1] = { 0 };
uint8_t armGetFhmRfPllFreqArr[8] = { 0 };
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getFhmRfPllFrequency()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Send ARM command to read FHM mode*/
armGetFhmModeCmdArr[0] = TALISE_ARM_OBJECTID_FAST_FREQ_HOP_MODE;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &armGetFhmModeCmdArr[0], ARM_FHM_MODE_READ_CMD_NUM_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, GETFREQHOP_MODE_TIMEOUT_US, GETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, armGetFhmModeCmdArr[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/*Read FHM enable status and FHM exit mode status from the mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, TALISE_ADDR_ARM_START_DATA_ADDR, &armGetFhmRfPllFreqArr[0], ARM_FHM_MODE_FREQ_NUM_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
/*Update pointer memory with FHM Rf Pll freq read back*/
*fhmRfPllFrequency_Hz = ((uint64_t)armGetFhmRfPllFreqArr[0] |
((uint64_t)armGetFhmRfPllFreqArr[1] << BYTE1_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[2] << BYTE2_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[3] << BYTE3_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[4] << BYTE4_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[5] << BYTE5_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[6] << BYTE6_SHIFT) |
((uint64_t)armGetFhmRfPllFreqArr[7] << BYTE7_SHIFT));
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_getFhmStatus(taliseDevice_t *device, taliseFhmStatus_t *fhmStatus)
{
static const uint8_t ARM_FHM_STS_READ_CMD_NUM_BYTES = 1;
static const uint8_t ARM_FHM_STS_TWO_BYTES = 2;
static const uint8_t ARM_FHM_STS_FOUR_BYTES = 4;
static const uint8_t ARM_FHM_STS_EIGHT_BYTES = 8;
static const uint8_t ARM_AUTO_INCREMENT = 0;
static const uint32_t FHM_STS_CMD_ERROR_OFFSET = 16;
static const uint32_t FHM_STS_HOP_ERROR_OFFSET = 18;
static const uint32_t FHM_STS_NUM_HOPS_OFFSET = 20;
static const uint32_t FHM_STS_NUM_ERROR_EVENTS_OFFSET = 24;
static const uint32_t FHM_STS_FREQ_ERROR_EVENT_OFFSET = 32;
static const uint32_t FHM_STS_NUM_HOPS_OUTSIDE_SR_OFFSET = 40;
static const uint32_t FHM_STS_HOP_FREQ_OUTSIDE_SR_FREQ_OFFSET = 48;
static const uint32_t FHM_STS_NUM_INVALID_HOP_FREQ_OFFSET = 56;
static const uint32_t FHM_STS_LAST_INVALID_FREQ_OFFSET = 64;
static const uint32_t FHM_STS_COMP_PLL_ERROR_OFFSET = 72;
static const uint32_t FHM_STS_COMP_PLL_ERROR_FREQ_OFFSET = 80;
static const uint32_t FHM_STS_RF_PLL_LOCK_FAILED_OFFSET = 88;
static const uint32_t FHM_STS_RF_PLL_LOCK_FAILED_FREQ_OFFSET = 96;
static const uint8_t BYTE1_SHIFT = 8;
static const uint8_t BYTE2_SHIFT = 16;
static const uint8_t BYTE3_SHIFT = 24;
static const uint8_t BYTE4_SHIFT = 32;
static const uint8_t BYTE5_SHIFT = 40;
static const uint8_t BYTE6_SHIFT = 48;
static const uint8_t BYTE7_SHIFT = 56;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
talRecoveryActions_t retValWarn = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t cmdStatusByte = 0;
uint8_t armGetFhmModeCmdArr[ARM_FHM_STS_READ_CMD_NUM_BYTES];
uint8_t armFhmStsData[8] = { 0 };
/*Check for NULL*/
if(fhmStatus == NULL)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETFHMSTS_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getFhmStatus()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
retValWarn = retVal;
/*Send ARM command to read FHM mode*/
armGetFhmModeCmdArr[0] = TALISE_ARM_OBJECTID_FAST_FREQ_HOP_MODE;
retVal = (talRecoveryActions_t)TALISE_sendArmCommand(device, TALISE_ARM_GET_OPCODE, &armGetFhmModeCmdArr[0], ARM_FHM_STS_READ_CMD_NUM_BYTES);
IF_ERR_RETURN_U32(retVal);
/*Verify that command executed successfully*/
retVal = (talRecoveryActions_t)TALISE_waitArmCmdStatus(device, TALISE_ARM_GET_OPCODE, &cmdStatusByte, GETFREQHOP_MODE_TIMEOUT_US, GETFREQHOP_MODE_INTERVAL_US);
if((cmdStatusByte >> 1) > 0)
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_ARM_CMD_ERR,
ARMCMD_ERRCODE(TALISE_ARM_GET_OPCODE, armGetFhmModeCmdArr[0], cmdStatusByte), retVal, TALACT_ERR_RESET_ARM);
}
else
{
IF_ERR_RETURN_U32(retVal);
}
/*Read FHM CMD error status from the mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_CMD_ERROR_OFFSET), &armFhmStsData[0], ARM_FHM_STS_TWO_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
/*Update FHM CMD error status pointer memory*/
fhmStatus->currentFhmCmdErrorStatus = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT));
/*Read FHM hop error status from the mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_HOP_ERROR_OFFSET), &armFhmStsData[0], ARM_FHM_STS_TWO_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
/*Update FHM hop error status pointer memory*/
fhmStatus->currentFhmHopErrorStatus = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT));
/*Read Total no. of hops in mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_NUM_HOPS_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->numFhmHops = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read no. of error events from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_NUM_ERROR_EVENTS_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->numFhmNoErrorEvents = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read the last frequency for which error occurred*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_FREQ_ERROR_EVENT_OFFSET), &armFhmStsData[0], ARM_FHM_STS_EIGHT_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->lastFhmNoErrorFreq_Hz = ((uint64_t)armFhmStsData[0] |
((uint64_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint64_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint64_t)armFhmStsData[3] << BYTE3_SHIFT) |
((uint64_t)armFhmStsData[4] << BYTE4_SHIFT) |
((uint64_t)armFhmStsData[5] << BYTE5_SHIFT) |
((uint64_t)armFhmStsData[6] << BYTE6_SHIFT) |
((uint64_t)armFhmStsData[7] << BYTE7_SHIFT));
/*Read no. of hops outside scan range from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_NUM_HOPS_OUTSIDE_SR_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->numFhmHopsOutsideScanRange = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read the last hop frequency outside scan range*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_HOP_FREQ_OUTSIDE_SR_FREQ_OFFSET), &armFhmStsData[0], ARM_FHM_STS_EIGHT_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->lastFreqOutsideScanRange_Hz = ((uint64_t)armFhmStsData[0] |
((uint64_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint64_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint64_t)armFhmStsData[3] << BYTE3_SHIFT) |
((uint64_t)armFhmStsData[4] << BYTE4_SHIFT) |
((uint64_t)armFhmStsData[5] << BYTE5_SHIFT) |
((uint64_t)armFhmStsData[6] << BYTE6_SHIFT) |
((uint64_t)armFhmStsData[7] << BYTE7_SHIFT));
/*Read no. of invalid hop frequencies from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_NUM_INVALID_HOP_FREQ_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->numInvalidFhmHopFrequencies = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read the last invalid hop frequency from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_LAST_INVALID_FREQ_OFFSET), &armFhmStsData[0], ARM_FHM_STS_EIGHT_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->lastInvalidHopFreq_Hz = ((uint64_t)armFhmStsData[0] |
((uint64_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint64_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint64_t)armFhmStsData[3] << BYTE3_SHIFT) |
((uint64_t)armFhmStsData[4] << BYTE4_SHIFT) |
((uint64_t)armFhmStsData[5] << BYTE5_SHIFT) |
((uint64_t)armFhmStsData[6] << BYTE6_SHIFT) |
((uint64_t)armFhmStsData[7] << BYTE7_SHIFT));
/*Read PLL LO computation error status from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_COMP_PLL_ERROR_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->compPllError = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read the last frequency for which PLL LO comp error occurred from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_COMP_PLL_ERROR_FREQ_OFFSET), &armFhmStsData[0], ARM_FHM_STS_EIGHT_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->compPllErrorFreq_Hz = ((uint64_t)armFhmStsData[0] |
((uint64_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint64_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint64_t)armFhmStsData[3] << BYTE3_SHIFT) |
((uint64_t)armFhmStsData[4] << BYTE4_SHIFT) |
((uint64_t)armFhmStsData[5] << BYTE5_SHIFT) |
((uint64_t)armFhmStsData[6] << BYTE6_SHIFT) |
((uint64_t)armFhmStsData[7] << BYTE7_SHIFT));
/*Read RF PLL Lock failed status from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_RF_PLL_LOCK_FAILED_OFFSET), &armFhmStsData[0], ARM_FHM_STS_FOUR_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->rfPllLockFailed = ((uint32_t)armFhmStsData[0] |
((uint32_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint32_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint32_t)armFhmStsData[3] << BYTE3_SHIFT));
/*Read the last frequency for which RF PLL lock failed from mailbox*/
retVal = (talRecoveryActions_t)TALISE_readArmMem(device, (TALISE_ADDR_ARM_START_DATA_ADDR + FHM_STS_RF_PLL_LOCK_FAILED_FREQ_OFFSET), &armFhmStsData[0], ARM_FHM_STS_EIGHT_BYTES, ARM_AUTO_INCREMENT);
IF_ERR_RETURN_U32(retVal);
fhmStatus->rfPllLockFailedFreq_Hz = ((uint64_t)armFhmStsData[0] |
((uint64_t)armFhmStsData[1] << BYTE1_SHIFT) |
((uint64_t)armFhmStsData[2] << BYTE2_SHIFT) |
((uint64_t)armFhmStsData[3] << BYTE3_SHIFT) |
((uint64_t)armFhmStsData[4] << BYTE4_SHIFT) |
((uint64_t)armFhmStsData[5] << BYTE5_SHIFT) |
((uint64_t)armFhmStsData[6] << BYTE6_SHIFT) |
((uint64_t)armFhmStsData[7] << BYTE7_SHIFT));
if (retVal == TALACT_NO_ACTION)
{
retVal = retValWarn;
}
return (uint32_t)retVal;
}
uint32_t TALISE_setExtLoOutCfg(taliseDevice_t *device, uint8_t enableExtLoOutput, taliseExtLoDiv_t extLoOutDivide)
{
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t extLoOutPowerDown = 0;
static const uint8_t BIT6_BITMASK = 0x40;
static const uint8_t BIT6_TO_5_BITMASK = 0x60;
static const uint8_t ENABLE_EXTLO_OUT_BUFFER = 0x00;
static const uint8_t DISABLE_EXTLO_IN_BUFFER = 0x20;
static const uint8_t DISABLE_EXTLO_OUT_BUFFER = 0x40;
static const uint8_t AC_TERMINATION = 0x40;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_setExtLoOutCfg()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
/* Verify LO input mode is not enabled */
if ((enableExtLoOutput > 0) &&
(device->devStateInfo.clocks.rfPllUseExternalLo > 0))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_API_FAIL,
TAL_ERR_SETEXTLOOUT_LO_IN_ENABLED, retVal, TALACT_ERR_CHECK_PARAM);
}
if ((extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV2) &&
(extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV4) &&
(extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV8) &&
(extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV16) &&
(extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV32) &&
(extLoOutDivide != TAL_EXTLO_RFPLLVCO_DIV64))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_SETEXTLOOUT_INV_DIV_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Enable Ext LO output buffer */
if (enableExtLoOutput > 0)
{
/* Power up Ext LO output buffer by clearing bit [6] */
/* Ext LO input buffer must be disabled when enabling Ext LO out buffer (bit[5] = 1) */
extLoOutPowerDown = ENABLE_EXTLO_OUT_BUFFER | DISABLE_EXTLO_IN_BUFFER;
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_RF_SYNTHESIZER_POWER_DOWN, extLoOutPowerDown, BIT6_TO_5_BITMASK, 0);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
else /* Disable Ext LO Out buffer */
{
extLoOutPowerDown = DISABLE_EXTLO_OUT_BUFFER;
/* Disable Ext LO output buffer [6] = 1, do not touch Ext LO Input buffer */
halError = talSpiWriteField(device->devHalInfo, TALISE_ADDR_RF_SYNTHESIZER_POWER_DOWN, extLoOutPowerDown, BIT6_BITMASK, 0);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
}
/* Enable AC termination at External LO out driver outputs (Set bit[6], all other bits are unused) */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_EXTLOGEN_CONTROL_1, AC_TERMINATION);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
/* Set Ext LO output divider */
halError = talSpiWriteByte(device->devHalInfo, TALISE_ADDR_EXTLO_DIVMODE, (uint8_t)(extLoOutDivide));
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
return (uint32_t)retVal;
}
uint32_t TALISE_getExtLoOutCfg(taliseDevice_t *device, uint8_t *enableExtLoOutput, taliseExtLoDiv_t *extLoOutDivide)
{
static const uint8_t EXT_DIV_BITMASK = 0x0F;
talRecoveryActions_t retVal = TALACT_NO_ACTION;
adiHalErr_t halError = ADIHAL_OK;
uint8_t extLoOutPowerDown = 0;
uint8_t extDivReadback = 0;
uint8_t BIT6_BITMASK = 0x40;
uint8_t BIT6_SHIFT = 6;
#if TALISE_VERBOSE
halError = talWriteToLog(device->devHalInfo, ADIHAL_LOG_MSG, TAL_ERR_OK, "TALISE_getExtLoOutCfg()\n");
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_LOG, halError, retVal, TALACT_WARN_RESET_LOG);
#endif
if ((enableExtLoOutput == NULL) ||
(extLoOutDivide == NULL))
{
return (uint32_t)talApiErrHandler(device, TAL_ERRHDL_INVALID_PARAM,
TAL_ERR_GETEXTLOOUT_NULL_PARAM, retVal, TALACT_ERR_CHECK_PARAM);
}
/* Read Enable/Disable for external LO output */
halError = talSpiReadField(device->devHalInfo, TALISE_ADDR_RF_SYNTHESIZER_POWER_DOWN, &extLoOutPowerDown, BIT6_BITMASK, BIT6_SHIFT);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*enableExtLoOutput = (extLoOutPowerDown == 0) ? 1 : 0; /* Invert power down bit to return enable parameter */
/* Get Ext LO output divider */
halError = talSpiReadByte(device->devHalInfo, TALISE_ADDR_EXTLO_DIVMODE, &extDivReadback);
retVal = talApiErrHandler(device, TAL_ERRHDL_HAL_SPI, halError, retVal, TALACT_ERR_RESET_SPI);
IF_ERR_RETURN_U32(retVal);
*extLoOutDivide = (taliseExtLoDiv_t)(extDivReadback & EXT_DIV_BITMASK);
return (uint32_t)retVal;
}