Post Go back to editing

Issue with Serializer Lane Crossbar Configuration – ADRV9009 JESD Initialization Stuck at CGS

Category: Software
Product Number: ADRV9009
Software Version: vivado 2018.3, sdk2018.3

Hello,

We are facing an issue related to the serializer lane crossbar configuration in the ADRV9009.

System Description:

  • We are using a custom ADRV9009 board.

  • The SERDIN pins from the ADRV9009 are routed to the FPGA without any lane swap on the PCB.

  • Framer A is used for RX data.

  • Framer B is used for ORx data.

  • We are using the SDK and RTL provided from the ADI GitHub repository as reference.

Configuration Details:

Since there is no physical lane swap, we attempted to enable manual lane crossbar configuration in talise_config.c with the following settings:

Framer A (RX)

  • Lanes enabled: 0x03

  • Serializer lane crossbar: 0xF4

Framer B (ORx)

  • Lanes enabled: 0xC0

  • Serializer lane crossbar: 0x4F

With this configuration, JESD initialization gets stuck in the CGS state.

However,

When we disable manual lane crossbar configuration (keeping the same lane enable settings), initialization completes successfully.

Upon checking talise_jesd204.c, we observed that when manual crossbar is disabled, the driver automatically assigns:

  • Framer A crossbar value: 0xDC

  • Framer B crossbar value: 0x73

These values are internally derived based on the enabled lanes.

Our Confusion:

We are unclear about:

  1. How the lane mapping and crossbar values are derived internally when manual configuration is disabled.

  2. Why manual crossbar values (0xF4 / 0x4F) cause CGS failure while auto-assigned values (0xDC / 0x73) work correctly.

  3. What the correct mapping methodology should be when there is no PCB-level lane swap.

Could you please help clarify:

  • The correct relationship between lanes enabled mask and serializer lane crossbar value?

  • How to properly calculate/program the crossbar when manual configuration is required?

  • Why this CGS failure is being observed in our case?

Thank you for your support.

  • Hello ,

    please find the profile files used . we want to understand the  lane mapping with manualxbar  usage .

    also by seeing the profile and using information that no lane swap was performed that is serdes pins from device and fpga are same then please mention the values for lanecross bar for rx and tx and orx.

    /**
     * \file adrv9009/profiles/tx_bw100_ir122p88_rx_bw100_or122p88_orx_bw100_or122p88_dc122p88/talise_config.c
     * \brief Contains Talise configuration settings for the Talise API
     *
     * 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.
     *
     * The top level structure taliseDevice_t talDevice uses keyword
     * extern to allow the application layer main() to have visibility
     * to these settings.
     *
     * This file may not be fully complete for the end user application and
     * may need to updated for AGC, GPIO, and DAC full scale settings.
     * To create a full initialisation routine, the user should also refer to the
     * Iron Python initialisation routine generated by the GUI, and also the Talise User Guide.
     *
     */
    
    #include "talise_types.h"
    #include "talise_config.h"
    #include "talise_error.h"
    #include "talise_agc.h"
    #ifdef ADI_ZYNQ_PLATFORM
    #include "zynq_platform.h"
    #endif
    
    int16_t txFirCoefs[40] = {6,-50,15,132,-64,-273,167,483,-329,-800,574,1286,-951,-2111,1433,3512,-1944,-6006,3234,17514,17514,3234,-6006,-1944,3512,1433,-2111,-951, 1286, 574,-800,-329,483,167,-273,-64,132,15,-50, 6};
    
    int16_t rxFirCoefs[48] = {-7,-23,32, 51, -69,-113,143, 208,-257,-362, 436,590,-701,-925,1100,1424,-1746,-2348,2552,3709,-4378,-7342,9330,31458,31458,9330,-7342,-4378,3709,2552,-2348,-1746,1424,1100,-925,-701,590,436,-362,-257,208,143,-113,-69,51,32,-23,-7};
    
    int16_t obsrxFirCoefs[48] = {-8,-20,31,45,-67,-100,137,186,-246,-324,415,530,-664,-832,1039,1281,-1651,-2125,2410,3339,-4172,-6546,9552,30554,30554,9552,-6546,-4172,3339,2410,-2125,-1651,1281,1039,-832,-664,530,415,-324,-246,186,137,-100,-67,45,31,-20,-8};
    
    #ifdef ADI_ZYNQ_PLATFORM /** < Insert Customer Platform HAL State Container here>*/
    /*
     * Platform Layer SPI settings - this structure is specific to ADI's platform layer code.
     * User should replace with their own structure or settings for their hardware
     */
    zynqSpiSettings_t spiDev1 = {
    	.chipSelectIndex = 1,
    	.writeBitPolarity = 0,
    	.longInstructionWord = 1,
    	.CPHA = 0,
    	.CPOL = 0,
    	.mode = 0,
    	.spiClkFreq_Hz = 25000000
    };
    
    /*
     * Platform Layer settings - this structure is specific to ADI's platform layer code.
     * User should replace with their own structure or settings for their hardware
     * The structure is held in taliseDevice_t below as a void pointer, allowing
     * the customer to pass any information for their specific hardware down to the
     * hardware layer code.
     */
    zynqAdiDev_t talDevHalInfo = {
    	.devIndex = 1,
    	.spiSettings = &spiDev1,
    	.spiErrCode = 0,
    	.timerErrCode = 0,
    	.gpioErrCode = 0,
    	.logLevel = ADIHAL_LOG_ALL
    };
    #endif
    /**
     *  TalDevice a structure used by the Talise API to hold the platform hardware
     *  structure information, as well as an internal Talise API state container
     *  (devStateInfo) of runtime information used by the API.
     **/
    taliseDevice_t talDevice = {
    #ifdef ADI_ZYNQ_PLATFORM
    	/* Void pointer of users platform HAL settings to pass to HAL layer calls
    	 * Talise API does not use the devHalInfo member */
    	.devHalInfo = &talDevHalInfo,
    #else
    	.devHalInfo = NULL,     /* < Insert Customer Platform HAL State Container here>*/
    #endif
    	/* devStateInfo is maintained internal to the Talise API, just create the memory */
    	.devStateInfo = {0}
    
    };
    
    taliseInit_t talInit = {
    	/* SPI settings */
    	.spiSettings =
    	{
    		.MSBFirst            = 1,  /* 1 = MSBFirst, 0 = LSBFirst */
    		.enSpiStreaming      = 0,  /* Not implemented in ADIs platform layer. SW feature to improve SPI throughput */
    		.autoIncAddrUp       = 1,  /* Not implemented in ADIs platform layer. For SPI Streaming, set address increment direction. 1= next addr = addr+1, 0:addr=addr-1 */
    		.fourWireMode        = 1,  /* 1: Use 4-wire SPI, 0: 3-wire SPI (SDIO pin is bidirectional). NOTE: ADI's FPGA platform always uses 4-wire mode */
    		.cmosPadDrvStrength  = TAL_CMOSPAD_DRV_2X /* Drive strength of CMOS pads when used as outputs (SDIO, SDO, GP_INTERRUPT, GPIO 1, GPIO 0) */
    	},
    
    	/* Rx settings */
    	.rx =
    	{
    		.rxProfile =
    		{
    			.rxFir =
    			{
    				.gain_dB = -6,                /* filter gain */
    				.numFirCoefs = 48,            /* number of coefficients in the FIR filter */
    				.coefs = &rxFirCoefs[0]
    			},
    			.rxFirDecimation = 2,            /* Rx FIR decimation (1,2,4) */
    			.rxDec5Decimation = 5,  //4,          /* Decimation of Dec5 or Dec4 filter (5,4) */
    			.rhb1Decimation = 1,            /* RX Half band 1 decimation (1 or 2) */
    			.rxOutputRate_kHz = 184320,            /* Rx IQ data rate in kHz */
    			.rfBandwidth_Hz = 150000000,    /* The Rx RF passband bandwidth for the profile */
    			.rxBbf3dBCorner_kHz = 150000,    /* Rx BBF 3dB corner in kHz */
    			.rxAdcProfile = {227,149,181,90,1280,699,1300,59,1302,32,855,27,48,46,32,194,0,0,0,0,49, 0,7,6,42,0,7,6,42,0,25,27,0,0,25,27, 0,0,165,44,31,905},            /* pointer to custom ADC profile */
    			.rxDdcMode = TAL_RXDDC_BYPASS,   /* Rx DDC mode */
    			.rxNcoShifterCfg =
    			{
    				.bandAInputBandWidth_kHz = 0,
    				.bandAInputCenterFreq_kHz = 0,
    				.bandANco1Freq_kHz = 0,
    				.bandANco2Freq_kHz = 0,
    				.bandBInputBandWidth_kHz = 0,
    				.bandBInputCenterFreq_kHz = 0,
    				.bandBNco1Freq_kHz = 0,
    				.bandBNco2Freq_kHz = 0
    			}
    		},
    		.framerSel = TAL_FRAMER_A,            /* Rx JESD204b framer configuration */
    		.rxGainCtrl =
    		{
    			.gainMode = TAL_MGC,            /* taliserxGainMode_t gainMode */
    			.rx1GainIndex = 255,            /* uint8_t rx1GainIndex */
    			.rx2GainIndex = 255,            /* uint8_t rx2GainIndex */
    			.rx1MaxGainIndex = 255,            /* uint8_t rx1MaxGainIndex */
    			.rx1MinGainIndex = 195,            /* uint8_t rx1MinGainIndex */
    			.rx2MaxGainIndex = 255,            /* uint8_t rx2MaxGainIndex */
    			.rx2MinGainIndex = 195            /* uint8_t rx2MinGainIndex */
    		},
    		.rxChannels = TAL_RX1RX2,                /* The desired Rx Channels to enable during initialization */
    	},
    
    
    	/* Tx settings */
    	.tx =
    	{
    		.txProfile =
    		{
    			.dacDiv = 1,                        /* The divider used to generate the DAC clock */
    			.txFir =
    			{
    				.gain_dB = -6,                        /* filter gain */
    				.numFirCoefs = 40,                    /* number of coefficients in the FIR filter */
    				.coefs = &txFirCoefs[0]
    			},
    			.txFirInterpolation = 2,                    /* The Tx digital FIR filter interpolation (1,2,4) */
    			.thb1Interpolation = 1,                    /* Tx Halfband1 filter interpolation (1,2) */
    			.thb2Interpolation = 1,                    /* Tx Halfband2 filter interpolation (1,2)*/
    			.thb3Interpolation = 1,                    /* Tx Halfband3 filter interpolation (1,2)*/
    			.txInt5Interpolation = 5,                    /* Tx Int5 filter interpolation (1,5) */
    			.txInputRate_kHz = 184320,                    /* Primary Signal BW */
    			.primarySigBandwidth_Hz = 100000000,    /* The Rx RF passband bandwidth for the profile */
    			.rfBandwidth_Hz = 150000000,            /* The Tx RF passband bandwidth for the profile */
    			.txDac3dBCorner_kHz = 187000,                /* The DAC filter 3dB corner in kHz */
    			.txBbf3dBCorner_kHz = 75000,                /* The BBF 3dB corner in kHz */
    			.loopBackAdcProfile = {265, 146, 181, 90, 1280, 366, 1257, 27, 1258, 17, 718, 39, 48, 46, 27, 161, 0, 0, 0, 0, 40, 0, 7, 6, 42, 0, 7, 6, 42, 0, 25, 27, 0, 0, 25, 27, 0, 0, 165, 44, 31, 905}
    		},
    		.deframerSel = TAL_DEFRAMER_A,                    /* Talise JESD204b deframer config for the Tx data path */
    		.txChannels = TAL_TX1TX2,                            /* The desired Tx channels to enable during initialization */
    		.txAttenStepSize = TAL_TXATTEN_0P05_DB,            /* Tx Attenuation step size */
    		.tx1Atten_mdB = 0,                            /* Initial Tx1 Attenuation */
    		.tx2Atten_mdB = 0,                            /* Initial Tx2 Attenuation */
    		.disTxDataIfPllUnlock = TAL_TXDIS_TX_RAMP_DOWN_TO_ZERO    /* Options to disable the transmit data when the RFPLL unlocks. */
    	},
    
    
    	/* ObsRx settings */
    	.obsRx =
    	{
    		.orxProfile =
    		{
    			.rxFir =
    			{
    				.gain_dB = -6,                /* filter gain */
    				.numFirCoefs = 48,            /* number of coefficients in the FIR filter */
    				.coefs = &obsrxFirCoefs[0]
    			},
    			.rxFirDecimation = 2,            /* Rx FIR decimation (1,2,4) */
    			.rxDec5Decimation = 5,            /* Decimation of Dec5 or Dec4 filter (5,4) */
    			.rhb1Decimation = 1,            /* RX Half band 1 decimation (1 or 2) */
    			.orxOutputRate_kHz = 184320,            /* Rx IQ data rate in kHz */
    			.rfBandwidth_Hz = 150000000,    /* The Rx RF passband bandwidth for the profile */
    			.rxBbf3dBCorner_kHz = 225000,    /* Rx BBF 3dB corner in kHz */
    			.orxLowPassAdcProfile = {  227,149, 181, 90, 1280, 699,1300,59, 1302,32, 855,27,48,46,32,194,0,0,0,0,49, 0, 7,6,42,0,7,6,42,0,25,27,0,0, 25,27,0, 0,165,44,31,905},
    			.orxBandPassAdcProfile = {  227,149, 181, 90, 1280, 699,1300,59, 1302,32, 855,27,48,46,32,194,0,0,0,0,49, 0, 7,6,42,0,7,6,42,0,25,27,0,0, 25,27,0, 0,165,44,31,905},
    			.orxDdcMode = TAL_ORXDDC_DISABLED,   /* ORx DDC mode */
    			.orxMergeFilter  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
    		},
    		.orxGainCtrl =
    		{
    			.gainMode = TAL_MGC,
    			.orx1GainIndex = 255,
    			.orx2GainIndex = 255,
    			.orx1MaxGainIndex = 255,
    			.orx1MinGainIndex = 195,
    			.orx2MaxGainIndex = 255,
    			.orx2MinGainIndex = 195
    		},
    		.framerSel = TAL_FRAMER_B,                /* ObsRx JESD204b framer configuration */
    		.obsRxChannelsEnable = TAL_ORX1ORX2,        /* The desired ObsRx Channels to enable during initialization */
    		.obsRxLoSource = TAL_OBSLO_RF_PLL                /* The ORx mixers can use the TX_PLL */
    	},
    
    	/* Digital Clock Settings */
    	.clocks =
    	{
    		.deviceClock_kHz = 184320,   //184320, // 92160,            /* CLKPLL and device reference clock frequency in kHz */
    		.clkPllVcoFreq_kHz = 7372800,        /* CLKPLL VCO frequency in kHz */
    		.clkPllHsDiv = TAL_HSDIV_2,            /* CLKPLL high speed clock divider */
    		.rfPllUseExternalLo = 0,                /* 1= Use external LO for RF PLL, 0 = use internal LO generation for RF PLL */
    		.rfPllPhaseSyncMode = TAL_RFPLLMCS_INIT_AND_CONTTRACK                /* RFPLL MCS (Phase sync) mode */
    	},
    //Tx Profile IQrate and filter settings are not possible with current CLKPLL frequency
    	/* JESD204B settings */
    	.jesd204Settings =
    	{
    		/* Framer A settings */
    		.framerA =
    		{
    			.bankId = 1,                    /* JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15) */
    			.deviceId = 0,                    /* JESD204B Configuration Device ID - link identification number. (Valid 0..255) */
    			.lane0Id = 0,                    /* JESD204B Configuration starting Lane ID.  If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31) */
    			.M = 4,                            /* number of ADCs (0, 2, or 4) - 2 ADCs per receive chain */
    			.K = 32,                        /* number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes) */
    			.F = 4,                            /* F (number of bytes per frame) */
    			.Np = 16,                            /* Np (converter sample resolution) */
    			.scramble = 1,                    /* scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled. */
    			.externalSysref = 1,            /* 0=use internal SYSREF, 1= use external SYSREF */
    			.serializerLanesEnabled = 0x03,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
    			.serializerLaneCrossbar = 0xE4,    /* serializerLaneCrossbar */
    			.lmfcOffset = 31,                /* lmfcOffset - LMFC offset value for deterministic latency setting */
    			.newSysrefOnRelink = 0,            /* newSysrefOnRelink */
    			.syncbInSelect = 0,                /* syncbInSelect; */
    			.overSample = 0,                    /* 1=overSample, 0=bitRepeat */
    			.syncbInLvdsMode = 1,
    			.syncbInLvdsPnInvert = 0,
    			.enableManualLaneXbar = 0 /* 0=auto, 1=manual */
    		},
    		/* Framer B settings */
    		.framerB =
    		{
    			.bankId = 0,                    /* JESD204B Configuration Bank ID -extension to Device ID (Valid 0..15) */
    			.deviceId = 0,                    /* JESD204B Configuration Device ID - link identification number. (Valid 0..255) */
    			.lane0Id = 0,                    /* JESD204B Configuration starting Lane ID.  If more than one lane used, each lane will increment from the Lane0 ID. (Valid 0..31) */
    			.M = 2,                            /* number of ADCs (0, 2, or 4) - 2 ADCs per receive chain */
    			.K = 32,                        /* number of frames in a multiframe (default=32), F*K must be a multiple of 4. (F=2*M/numberOfLanes) */
    			.F = 2,                            /* F (number of bytes per frame) */
    			.Np = 16,                            /* Np (converter sample resolution) */
    			.scramble = 1,                    /* scrambling off if framerScramble= 0, if framerScramble>0 scramble is enabled. */
    			.externalSysref = 1,            /* 0=use internal SYSREF, 1= use external SYSREF */
    			.serializerLanesEnabled = 0x0C,    /* serializerLanesEnabled - bit per lane, [0] = Lane0 enabled, [1] = Lane1 enabled */
    			.serializerLaneCrossbar = 0xE4,    /* serializerLaneCrossbar */
    			.lmfcOffset = 31,                /* lmfcOffset - LMFC offset value for deterministic latency setting */
    			.newSysrefOnRelink = 0,            /* newSysrefOnRelink */
    			.syncbInSelect = 1,                /* syncbInSelect; */
    			.overSample = 0,                    /* 1=overSample, 0=bitRepeat */
    			.syncbInLvdsMode = 1,
    			.syncbInLvdsPnInvert = 0,
    			.enableManualLaneXbar = 0 /* 0=auto, 1=manual */
    		},
    		/* Deframer A settings */
    		.deframerA =
    		{
    			.bankId = 0,                    /* bankId extension to Device ID (Valid 0..15) */
    			.deviceId = 0,                    /* deviceId  link identification number. (Valid 0..255) */
    			.lane0Id = 0,                    /* lane0Id Lane0 ID. (Valid 0..31) */
    			.M = 4,                            /* M  number of DACss (0, 2, or 4) - 2 DACs per transmit chain */
    			.K = 32,                        /* K  #frames in a multiframe (default=32), F*K=multiple of 4. (F=2*M/numberOfLanes) */
    			.scramble = 1,                    /* scramble  scrambling off if scramble= 0 */
    			.externalSysref = 1,            /* externalSysref  0= use internal SYSREF, 1= external SYSREF */
    			.deserializerLanesEnabled = 0x0F,    /* deserializerLanesEnabled  bit per lane, [0] = Lane0 enabled */
    			.deserializerLaneCrossbar = 0xE4,    /* deserializerLaneCrossbar */
    			.lmfcOffset = 17,                /* lmfcOffset	 LMFC offset value to adjust deterministic latency */
    			.newSysrefOnRelink = 0,            /* newSysrefOnRelink */
    			.syncbOutSelect = 0,                /* SYNCBOUT0/1 select */
    			.Np = 16,                /* Np (converter sample resolution) */
    			.syncbOutLvdsMode = 1,
    			.syncbOutLvdsPnInvert = 0,
    			.syncbOutCmosSlewRate = 0,
    			.syncbOutCmosDriveLevel = 0,
    			.enableManualLaneXbar = 0 /* 0=auto, 1=manual */
    		},
    		/* Deframer B settings */
    		.deframerB =
    		{
    			.bankId = 0,                    /* bankId extension to Device ID (Valid 0..15) */
    			.deviceId = 0,                    /* deviceId  link identification number. (Valid 0..255) */
    			.lane0Id = 0,                    /* lane0Id Lane0 ID. (Valid 0..31) */
    			.M = 0,                            /* M  number of DACss (0, 2, or 4) - 2 DACs per transmit chain */
    			.K = 32,                        /* K  #frames in a multiframe (default=32), F*K=multiple of 4. (F=2*M/numberOfLanes) */
    			.scramble = 1,                    /* scramble  scrambling off if scramble= 0 */
    			.externalSysref = 1,            /* externalSysref  0= use internal SYSREF, 1= external SYSREF */
    			.deserializerLanesEnabled = 0x00,    /* deserializerLanesEnabled  bit per lane, [0] = Lane0 enabled */
    			.deserializerLaneCrossbar = 0xE4,    /* deserializerLaneCrossbar */
    			.lmfcOffset = 0,                /* lmfcOffset	 LMFC offset value to adjust deterministic latency */
    			.newSysrefOnRelink = 0,            /* newSysrefOnRelink */
    			.syncbOutSelect = 1,                /* SYNCBOUT0/1 select */
    			.Np = 16,                /* Np (converter sample resolution) */
    			.syncbOutLvdsMode = 1,
    			.syncbOutLvdsPnInvert = 0,
    			.syncbOutCmosSlewRate = 0,
    			.syncbOutCmosDriveLevel = 0,
    			.enableManualLaneXbar = 0 /* 0=auto, 1=manual */
    		},
    		.serAmplitude = 15,                    /* Serializer amplitude setting. Default = 15. Range is 0..15 */
    		.serPreEmphasis = 1,                /* Serializer pre-emphasis setting. Default = 1 Range is 0..4 */
    		.serInvertLanePolarity = 0,            /* Serializer Lane PN inversion select. Default = 0. Where, bit[0] = 1 will invert lane [0], bit[1] = 1 will invert lane 1, etc. */
    		.desInvertLanePolarity = 0,            /* Deserializer Lane PN inversion select.  bit[0] = 1 Invert PN of Lane 0, bit[1] = Invert PN of Lane 1, etc */
    		.desEqSetting = 1,                    /* Deserializer Equalizer setting. Applied to all deserializer lanes. Range is 0..4 */
    		.sysrefLvdsMode = 1,                /* Use LVDS inputs on Talise for SYSREF */
    		.sysrefLvdsPnInvert = 0              /*0= Do not PN invert SYSREF */
    	}
    };
    
    //Only needs to be called if user wants to setup AGC parameters
    static taliseAgcCfg_t rxAgcCtrl = {
    	4,
    	255,
    	195,
    	255,
    	195,
    	30720,  /* AGC gain update time in us (125us-250us - based on IQ data rate - set for 125us @ 184.32 Mhz) */
    	10,
    	10,
    	16,
    	0,
    	1,
    	0,
    	0,
    	0,
    	1,
    	31,
    	246,
    	4,
    	1,          /*!<1- bit field to enable the multiple time constants in AGC loop for fast attack and fast recovery to max gain. */
    	/* agcPower */
    	{
    		1,      /*!<1-bit field, enables the Rx power measurement block. */
    		1,      /*!<1-bit field, allows using Rx PFIR for power measurement. */
    		0,      /*!<1-bit field, allows to use the output of the second digital offset block in the Rx datapath for power measurement. */
    		9,      /*!<AGC power measurement detect lower 0 threshold. Default = -12dBFS == 5, 7-bit register value where max = 0x7F, min = 0x00 */
    		2,      /*!<AGC power measurement detect lower 1 threshold. Default = (offset) 4dB == 0, 4-bit register value where  max = 0xF, min = 0x00 */
    		4,      /*!<AGC power measurement detect lower 0 recovery gain step. Default = 2dB - based on gain table step  size, 5-bit register value where max = 0x1F, min = 0x00 */
    		4,      /*!<AGC power measurement detect lower 1 recovery gain step. Default = 4dB - based on gain table step size, 5-bit register value where max = 0x1F, min = 0x00 */
    		5,      /*!< power measurement duration used by the decimated power block. Default = 0x05, 5-bit register value where max = 0x1F, min = 0x00 */
    		5,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
    		1,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
    		5,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
    		1,      /*!<Allows power detection of data for a specific slice of the gain update counter. 16-bit register value (currently not used) */
    		2,      /*!<Default value should be 2*/
    		0,
    		0
    	},
    	/* agcPeak */
    	{
    		205,        /*!<1st update interval for the multiple time constant in AGC loop mode, Default:205. */
    		2,          /*!<sets the 2nd update interval for the multiple time constant in AGC loop mode. Calculated as a multiple of  agcUnderRangeLowInterval  , Default: 4 */
    		4,          /*!<sets the 3rd update interval for the multiple time constant in AGC loop mode. Calculated as a multiple of agcUnderRangeMidInterval and agcUnderRangeLowInterval, Default: 4 */
    		39,         /*!<AGC APD high threshold. Default=0x1F, 6-bit register value where max=0x3F, min =0x00 */
    		49,         /*!<AGC APD peak detect high threshold. default = 0x1F, 6-bit register value where max = 0x3F, min = 0x00.  Set to 3dB below apdHighThresh */
    		23,         /*!<AGC APD peak detect low threshold. default = 3dB below high threshold, 6-bit register value where max =0x3F, min = 0x00 */
    		19,         /*!<AGC APD peak detect low threshold. default = 3dB below high threshold, 6-bit register value where max = 0x3F, min = 0x00 . Set to 3dB below apdLowThresh  */
    		6,          /*!<AGC APD peak detect upper threshold count. Default = 0x06 8-bit register value where max = 0xFF, min = 0x20  */
    		3,          /*!<AGC APD peak detect lower threshold count. Default = 0x03, 8-bit register value where max = 0xFF, min = 0x00  */
    		4,          /*!<AGC APD peak detect attack gain step. Default = 2dB step - based on gain table step size, 5-bit register  value, where max = 0x1F, min = 0x00  */
    		2,          /*!<AGC APD gain index step size. Recommended to be same as hb2GainStepRecovery. Default = 0x00, 5-bit register value where max = 0x1F, min = 0x00  */
    		1,          /*!<1-bit field, enables or disables the HB2 overload detector.  */
    		1,          /*!<3-bit field. Sets the window of clock cycles (at the HB2 output rate) to meet the overload count. */
    		1,          /*!<4-bit field. Sets the number of actual overloads required to trigger the overload signal.  */
    		181,        /*!<AGC decimator output high threshold. Default = 0xB5, 8-bit register value where max = 0xFF, min = 0x00 */
    		45,         /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
    		90,         /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
    		128,        /*!<AGC decimator output low threshold. Default = 0x80, 8-bit register value where max = 0xFF, min = 0x00 */
    		6,          /*!<AGC HB2 output upper threshold count. Default = 0x06, 8-bit register value where max = 0xFF, min =  0x20 */
    		3,          /*!<AGC HB2 output lower threshold count. Default = 0x03, 8-bit register value where max = 0xFF, min = 0x00 */
    		2,          /*!<AGC decimator gain index step size. Default = 0x00, 5-bit register value where max = 0x1F, min = 0x00 */
    		4,          /*!<AGC HB2 gain index step size, when the HB2 Low Overrange interval 0 triggers a programmable number  of times. Default = 0x08, 5-bit register value where max = 0x1F, min = 0x00 */
    		8,          /*!<AGC HB2 gain index step size, when the HB2 Low Overrange interval 1 triggers a programmable number of times. Default = 0x04, 5-bit register value where max = 0x1F, min = 0x00 */
    		4,          /*!<AGC decimator output attack gain step. Default = 2dB step - based on gain table step size, 5-bit register value, where max = 0x1F, min = 0x00 */
    		1,
    		0,
    		0
    	}
    };
    
    /* AD9528 data structure initialization file */
    #include <stdint.h>
    #include "common.h"
    #include "t_ad9528.h"
    
    static ad9528pll1Settings_t clockPll1Settings = {
    	30720000,
    	1,
    	3,
    	0,
    	1,
    	0,
    	122880000,
    	2,
    	4
    };
    
    static ad9528pll2Settings_t clockPll2Settings = {
    	3,
    	30
    };
    
    static ad9528outputSettings_t clockOutputSettings = {
    	53237,
    	{0,0,0,2,0,0,0,0,0,0,0,0,2,0},
    	{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    	{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    	{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    	{10,10,10,10,10,10,10,10,10,10,10,10,10,10},
    	{122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000, 122880000}
    };
    
    static ad9528sysrefSettings_t clockSysrefSettings = {
    	0,
    	2,
    	0,
    	0,
    	0,
    	0,
    	512
    };
    
    static ad9528spiSettings_t clockSpiSettings = {
    	2, //chip select Index
    	0, //Write bit polarity
    	1, //16bit instruction word
    	1, //MSB first
    	0, //Clock phase
    	0, //Clock polarity
    	0, //uint8_t enSpiStreaming;
    	1, //uint8_t autoIncAddrUp;
    	1  //uint8_t fourWireMode;
    };
    
    /**
     * \file adrv9009/profiles/tx_bw100_ir122p88_rx_bw100_or122p88_orx_bw100_or122p88_dc122p88/talise_config.h
     * \brief Talise configuration external declarations
     *
     * \brief Contains structure definitions for tal_config.c
     *
     * 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.
     *
     * The top level structure taliseDevice_t talDevice uses keyword
     * extern to allow the application layer main() to have visibility
     * to these settings.
     */
    
    #ifndef TAL_INIT_H_
    #define TAL_INIT_H_
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    extern taliseDevice_t talDevice;
    extern taliseInit_t talInit;
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

  • The correct relationship between lanes enabled mask and serializer lane crossbar value?

    Can you please confirm if you are following the lane enabled value and cross bar as per your requirement? Refer to page 41 UG for more details

    Why this CGS failure is being observed in our case?

    Are you seeing JESD stuck in CGS phase only when you are enabling the manual lane crossbar configuration?

  • hello 

    yes we are using manual lane crossbar as per the the requirement and actual mapping in out custom hw. yes we are strucking in cgs when manual lanecrossbar is enabled

  • We have not seen customers reporting this issue with manual crossbar configuration .

    Can you please refer to page 41 for more details in UG about the  lane enabled value and cross bar configuration the and see if we are missing something.

    Is there any specific requirement that you want to use manual crossbar configuration because the automatic configuration works perfectly fine without any issues? 

  • hello ,

    the requirement is that in evaluation setup there is a crossbar mapping performed in the design logical lanes and physical lanes of serdes. but in our custom board and design,  there is no cross mapping performed. logical lanes are mapped to corresponding physical lanes. but in design that is sdk if we disable manual cross bar then there inside it takes default lane mapping as per lanes enabled. but out case was different , so we want to use manual cross bar mapping. 

    we are using serdes lane 0 and 1 for framer A rx path and lanes 2 and 3 for framer B orx. so for framer A we are setting lanes enabled as 0x03 with  crossbar mapping value of 0x04 , for framer b lanes enabled is 0x0c and cross bar mapping is 0x40. we also tried with using 0x11 for unused lanes that means framer a cross bar value is 0xf4 and framer b is 0x4f. for both the cases we are seeing link is strucking in cgs state when manual cross bar is enabled.


  • Can you please try with serializer lane crossbar as 0xE4 for framer A ,framer B and Deframer A and see if it works?