Files
smod_atsc_app/atsc_app/adrv9009/adrv9009_config.c
T

1676 lines
52 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
extern :
void cfg_adrv_att(uint16 set_att);
void cfg_adrv_orx_manu_gain(uint8 orx_manu_gain_index);
void chang_freq(uint8 radio_ctl, int freq_changed);
*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include "../inc/type.h"
#include "../inc/lcd_task.h"
#include "../inc/i2c_drv.h"
#include "../inc/isys_config.h"
#include "adrv9009.h"
#include "ad9009_fun.h"
#include "talise_config.h"
#include "../talise/talise_hal.h"
#include "../talise/talise_arm_macros.h"
#include "../talise/talise_reg_addr_macros.h"
#include "adrv9009_config.h"
#include "talise_arm_binary.h"
#include "talise_stream_binary.h"
#include "jesd204b_config.h"
#include "../inc/adrv9009_ext.h"
//---------------------------------------------
extern pthread_mutex_t g_orx_gain_lock;
taliseDevice_t myTaliseDevice;
taliseDevice_t *p_myTaliseDevice = &myTaliseDevice;
taliseDevice_t *p_myTaliseDevice_shm;
taliseInit_t myTalInit;
taliseInit_t *p_myTalInit = &myTalInit;
ST_REG_STATUS reg_info;
extern unsigned int firmware_TaliseTDDArmFirmware_bin_len;
extern uint16 get_loop_fbw_value();
extern uint16 get_loop_fbw_stable();
extern void cfg_adrv_att(uint16 set_att);
extern volatile uint8 _g_adrv9009_spi_src;
void cfg_adrv_rx1_manu_gain(uint8 rx1_manu_gain_index); /* PR06-2 forward decl */
u32 jesd204b_fb0_rd(u32 addr);
extern S_ATSC_PARA atsc_para;
void fpga_write_axi0(uint32 addr, uint32 pdata, uint32 count);
int fpga_read_axi0(uint32 addr, uint32 *pdata, uint32 count);
static int adrv9009_chip_no(int which_9009)
{
return (which_9009 == ADRV9009_0) ? 1 : 2;
}
int adrv9009_set_tx_path_enable(uint8 enable)
{
uint32_t ret;
taliseRxORxChannels_t rx_orx = TAL_RXOFF_EN;
taliseTxChannels_t tx = TAL_TXOFF;
taliseTxChannels_t requested_tx = enable ? TAL_TX1 : TAL_TXOFF;
if(p_myTaliseDevice_shm == NULL)
{
printf("Err: ADRV9009 device is not ready, keep TX path off\n");
return ERROR;
}
ret = TALISE_setRxTxEnable(p_myTaliseDevice_shm,
TAL_ORX1_EN, requested_tx);
if(ret != TALACT_NO_ACTION)
{
printf("Err: TALISE_setRxTxEnable TX%s failed, ret=%u\n",
enable ? "ON" : "OFF", ret);
return ERROR;
}
ret = TALISE_getRxTxEnable(p_myTaliseDevice_shm, &rx_orx, &tx);
if((ret != TALACT_NO_ACTION) ||
(rx_orx != TAL_ORX1_EN) ||
(tx != requested_tx))
{
printf("Err: ADRV9009 TX%s readback failed, ret=%u rx_orx=0x%x tx=0x%x\n",
enable ? "ON" : "OFF", ret, rx_orx, tx);
return ERROR;
}
printf("ADRV9009 TX path %s, ORX1 enabled\n", enable ? "ON" : "OFF");
return OK;
}
static int adrv9009_scratch_check(int chip_no)
{
u32 wr = 0;
u32 rd = 0;
wr = 0xB6;
rd = 0;
ad9009_write_spi(chip_no, TALISE_ADDR_SCRATCH_PAD, &wr, 1);
usleep(1000);
ad9009_read_spi(chip_no, TALISE_ADDR_SCRATCH_PAD, &rd, 1);
if ((rd & 0xFF) != 0xB6) {
printf("[adrv9009_reset] scratch check fail: wr=0xB6 rd=0x%02x\n", rd & 0xFF);
return -1;
}
wr = 0x49;
rd = 0;
ad9009_write_spi(chip_no, TALISE_ADDR_SCRATCH_PAD, &wr, 1);
usleep(1000);
ad9009_read_spi(chip_no, TALISE_ADDR_SCRATCH_PAD, &rd, 1);
if ((rd & 0xFF) != 0x49) {
printf("[adrv9009_reset] scratch check fail: wr=0x49 rd=0x%02x\n", rd & 0xFF);
return -1;
}
return 0;
}
static int adrv9009_force_clean_reset(int chip_no)
{
int i;
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
for (i = 0; i < 3; i++) {
printf("[adrv9009_reset] force clean reset chip=%d try=%d\n", chip_no, i);
ad9009_reset(chip_no);
usleep(300 * 1000);
if (adrv9009_scratch_check(chip_no) == 0) {
printf("[adrv9009_reset] scratch check ok after reset\n");
return 0;
}
usleep(300 * 1000);
}
printf("[adrv9009_reset] force clean reset failed\n");
return -1;
}
int TALISE_Ext_LOL_Cal_1(int which_9009)
{
#if 1
uint8_t errorFlag = 0;
uint8_t errorCode = 0;
int i;
//uint32_t enableMask = 0xF3;
uint32_t initCalMask = 0x0200;
taliseErr_t mykError = TAL_ERR_OK;
//TALISE_runInitCals(p_myTaliseDevice_shm,initCalMask);
printf("[%s] come in TALISE_Ext_LOL_Cal_1! \r\n",which_9009==ADRV9009_0?"ADRV9009_0":"ADRV9009_1");
//swtich setting,tx connect to orx
if(which_9009==ADRV9009_0)
{
p_myTaliseDevice_shm = taliseDeviceInfo1.ptalDevice;
}
else
{
p_myTaliseDevice_shm = taliseDeviceInfo2.ptalDevice;
}
usr_printf_radiooff("TALISE_Ext_LOL_Cal_1");
TALISE_radioOff(p_myTaliseDevice_shm);
TALISE_setTxToOrxMapping(p_myTaliseDevice_shm,1,TAL_MAP_TX1_ORX,TAL_MAP_NONE);
for (i = 0; i < 3; i++)
{
mykError = (taliseErr_t)TALISE_runInitCals(p_myTaliseDevice_shm, initCalMask);
printf("cfg 9009 70,%d! \r\n",mykError);
mykError = (taliseErr_t)TALISE_waitInitCals(p_myTaliseDevice_shm, 60000, &errorFlag);
printf("cfg 9009 71,%d! \r\n",mykError);
if (errorFlag)
{
printf("FAIL: runInitCals time %d fail,errorFlag=0x%x! \r\n", i, errorFlag);
} else if (errorCode)
{
printf("FAIL: runInitCals time %d fail,errorCode=0x%x! \r\n", i, errorCode);
} else
{
break;
}
}
if (i >= 3)
{
TALISE_radioOn(p_myTaliseDevice_shm);
printf("[%s] FAIL: runInitCals beyond 3 times fail! \r\n",which_9009==ADRV9009_0?"ADRV9009_0":"ADRV9009_1");
return mykError;
}
/* enable tracking calibrations,���ʵ�����ȷ��enableMaskֵ */
//TALISE_enableTrackingCals(p_myTaliseDevice_shm, enableMask);
/* enable radio on */
TALISE_radioOn(p_myTaliseDevice_shm);
// TALISE_setObsRxPathSource(p_myTaliseDevice_shm, OBS_INTERNALCALS);
printf("[%s] TALISE_Ext_LOL_Cal_1 finish! \r\n", which_9009==ADRV9009_0?"ADRV9009_0":"ADRV9009_1");
return mykError;
#endif
}
int TALISE_Ext_LOL_Cal_2(int which_9009)
{
#if 1
uint8_t errorFlag = 0;
uint8_t errorCode = 0;
int i;
//uint32_t enableMask = 0xF3;
uint32_t initCalMask = 0x0200;
taliseErr_t mykError = TAL_ERR_OK;
//TALISE_runInitCals(p_myTaliseDevice_shm,initCalMask);
printf("come in TALISE_Ext_LOL_Cal_2! \r\n");
if(which_9009==ADRV9009_0)
{
p_myTaliseDevice_shm = taliseDeviceInfo1.ptalDevice;
}
else
{
p_myTaliseDevice_shm = taliseDeviceInfo2.ptalDevice;
}
//swtich setting,tx connect to orx
usr_printf_radiooff("TALISE_Ext_LOL_Cal_2");
TALISE_radioOff(p_myTaliseDevice_shm);
TALISE_setTxToOrxMapping(p_myTaliseDevice_shm,1,TAL_MAP_NONE,TAL_MAP_TX2_ORX);
//TALISE_setTxToOrxMapping(p_myTaliseDevice_shm,1,TAL_MAP_TX2_ORX,TAL_MAP_NONE);
for (i = 0; i < 3; i++)
{
mykError = (taliseErr_t)TALISE_runInitCals(p_myTaliseDevice_shm, initCalMask);
printf("cfg 9009 Ext_LOL_Cal 1,%d! \r\n",mykError);
mykError = (taliseErr_t)TALISE_waitInitCals(p_myTaliseDevice_shm, 60000, &errorFlag);
printf("cfg 9009 Ext_LOL_Cal 2,%d! \r\n",mykError);
if (errorFlag)
{
printf("FAIL: runInitCals time %d fail,errorFlag=0x%x! \r\n", i, errorFlag);
} else if (errorCode)
{
printf("FAIL: runInitCals time %d fail,errorCode=0x%x! \r\n", i, errorCode);
} else
{
break;
}
}
if (i >= 3)
{
TALISE_radioOn(p_myTaliseDevice_shm);
printf("FAIL: runInitCals beyond 3 times fail! \r\n");
return mykError;
}
/* enable tracking calibrations,���ʵ�����ȷ��enableMaskֵ */
//TALISE_enableTrackingCals(p_myTaliseDevice_shm, enableMask);
/* enable radio on */
TALISE_radioOn(p_myTaliseDevice_shm);
// TALISE_setObsRxPathSource(p_myTaliseDevice_shm, OBS_INTERNALCALS);
printf("TALISE_Ext_LOL_Cal_2 finish! \r\n");
return mykError;
#endif
}
int adrv9009_cfg(int which_9009)
{
#if 1
uint8_t pllLockStatus = 0;
uint8_t *pbuff_s = NULL;
uint32_t num_s = 0;
uint32_t nbytes_s = 4096;
uint32_t count = firmware_TaliseTDDArmFirmware_bin_len;
uint8_t *pbuff_f = NULL;
uint32_t num_f = 0;
uint32_t nbytes_f = 114688;
int file_hd_s = -1;
int file_hd_f = -1;
uint16_t loopBandwidth_kHz=get_loop_fbw_value(); //700;//loopBandwidth_kHz=700;// 500K-有效果
uint8_t stability =get_loop_fbw_stable();//15; //stability =15;
taliseArmGpioConfig_t armGpio = {
{TAL_GPIO_02,0,1},
{TAL_GPIO_03,0,1},
{TAL_GPIO_00,0,0},
{TAL_GPIO_00,0,0},
{TAL_GPIO_00,0,0}
};
uint32_t initCalMask = TAL_TX_BB_FILTER |
TAL_ADC_TUNER |
TAL_TIA_3DB_CORNER |
TAL_DC_OFFSET |
TAL_TX_ATTENUATION_DELAY |
TAL_RX_GAIN_DELAY |
TAL_FLASH_CAL |
TAL_PATH_DELAY |
TAL_TX_LO_LEAKAGE_INTERNAL |
TAL_TX_QEC_INIT |
TAL_LOOPBACK_RX_LO_DELAY |
TAL_LOOPBACK_RX_RX_QEC_INIT |
TAL_RX_LO_DELAY|
TAL_RX_QEC_INIT |
TAL_ADC_STITCHING|
TAL_ORX_LO_DELAY | //add 260518 ORx 专用初始化校准
TAL_ORX_QEC_INIT //add 260518 ORx 专用初始化校准
;
uint8_t errorFlag = 0;
taliseErr_t mykError = TAL_ERR_OK;
uint8_t i;
uint8_t multStatus;
int ret = 0;
uint32_t talAction = TALACT_NO_ACTION;
if(which_9009==ADRV9009_0){
printf("adrv9009_cfg(ADRV9009_0) start.\n");
p_myTaliseDevice_shm = taliseDeviceInfo1.ptalDevice;
memcpy(p_myTalInit, (taliseDeviceInfo1.ptalInit), sizeof(myTalInit));
}
else{
printf("adrv9009_cfg(ADRV9009_1) start.\n");
p_myTaliseDevice_shm = taliseDeviceInfo2.ptalDevice;
memcpy(p_myTalInit, (taliseDeviceInfo2.ptalInit), sizeof(myTalInit));
}
printf("\nTALISE_openHw\r\n");
talAction = TALISE_openHw(p_myTaliseDevice_shm);
if (talAction != TALACT_NO_ACTION){
printf("Err: openhw faile %d! \r\n", talAction);
}
/* cold reset dev */
printf("\nTALISE_resetDevice\r\n");
talAction=TALISE_resetDevice(p_myTaliseDevice_shm);
if (talAction != TALACT_NO_ACTION){
printf("Err: reset faile %d! \r\n", talAction);
}
printf(">> \ntalise init\n");
/* initialization dev */
for (i = 0; i < 3; i++)
{
printf("\nTALISE_initialize time=[%d]\r\n",i);
talAction = TALISE_initialize(p_myTaliseDevice_shm, &myTalInit);
printf("TALISE_initialize! \r\n");
if (talAction != TALACT_NO_ACTION){
printf("Err: initialize times %d error code is %d! (Next)\r\n\n", i, talAction);
TALISE_resetDevice(p_myTaliseDevice_shm);
sleep(1);
}
else /* init dev success */
{
/* CLKPLL lock status check */
pllLockStatus = 0;
printf("\n[ adrv9009_cfg ]->TALISE_getPllsLockStatus time=%d\r\n",i);
talAction = TALISE_getPllsLockStatus(p_myTaliseDevice_shm, &pllLockStatus);
//0x01-CLKPLL 0x03-CLKPLL+RFPLL 0x07-CLKPLL+RFPLL+AUXPLL
printf("checkPllsLockStatus is 0x%x ! \r\n", pllLockStatus);
if (pllLockStatus & 0x01) /* CLKPLL locked */
{
#if 0 //commented by @cc0423
printf("\n[ adrv9009_cfg ]->TALISE_enableMultichipSync enableMcs=1 time=%d\r\n",i);
talAction =TALISE_enableMultichipSync(p_myTaliseDevice_shm, 1, &multStatus);
if (talAction != TALACT_NO_ACTION){
printf("FAIL: enableMultichipSync 1 %d error code is %d! \r\n", i, talAction);
return talAction;
}
/*#if ENSYSREFS
//open sysref
addr = 0x0D<<2; //change to logic addr
data = 0x1100;
write_axireg(addr,&data);
#endif*/
printf("\n[ adrv9009_cfg ]->TALISE_enableMultichipSync enableMcs=0 time=%d\r\n",i);
talAction = TALISE_enableMultichipSync(p_myTaliseDevice_shm, 0, &multStatus);
if ((multStatus & 0x0B) != 0x0B){
printf("FAIL: enableMultichipSync 0 %d error code is %d! \r\n", i, talAction);
return talAction;
}
printf("SUCCESS: i =%d multStatus =0x%x ! \r\n",i,multStatus);
#else
//TALISE_serializerReset(p_myTaliseDevice_shm);
#endif
/*#if ENSYSREFS
addr = 0x0D<<2; //change to logic addr
data = 0x0000;
write_axireg(addr,&data);
#endif*/
printf("\nTALISE_initArm time=%d\r\n",i);
talAction = TALISE_initArm(p_myTaliseDevice_shm, &myTalInit);
printf("\nTALISE_loadStreamFromBinary time=%d\r\n",i);
talAction = TALISE_loadStreamFromBinary(p_myTaliseDevice_shm, (uint8_t *)&streamBinary[0]);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_loadStreamFromBinary %d! \r\n", talAction);
}
printf("\nTALISE_loadArmFromBinary time=%d\r\n",i);
talAction = TALISE_loadArmFromBinary(p_myTaliseDevice_shm, (uint8_t *)&armBinary[0], count);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_loadArmFromBinary %d! \r\n", talAction);
}
/* TALISE_verifyArmChecksum() will timeout after 200ms
* if ARM checksum is not computed
*/
printf("\nTALISE_verifyArmChecksum time=%d\r\n",i);
talAction = TALISE_verifyArmChecksum(p_myTaliseDevice_shm);
if (talAction != TAL_ERR_OK){
/*< user code- ARM did not load properly - check armBinary & clock/profile settings >*/
printf("Err: TALISE_verifyArmChecksum %d! (return -1)\r\n", talAction);
return -1;
}
if (talAction == TALACT_NO_ACTION){
printf("BREAK for loop\n");
break;
}
}
else{
printf("Err: CLKPLL times %d is 0x%x unlocked! \r\n", i, pllLockStatus);
}
}
}
if (i >= 3){
printf("Err: initialize beyond 3 times fail! (return)\n");
return talAction;
}
#if 0//for test
/* set RF freq and check lock */
for (i = 0; i < 3; i++)
{
printf("\n[ adrv9009_cfg ]->TALISE_setRfPllFrequency to %dMHz time=%d\r\n",i);
talAction = TALISE_setRfPllFrequency(p_myTaliseDevice_shm, TAL_RF_PLL, TX_FREQ_IN_HZ);
if (talAction != TALACT_NO_ACTION){
// < User: decide what to do based on Talise recovery action returned >
printf("Err: TALISE_setRfPllFrequency talAction=%d times=%d\r\n", talAction, i);
}
// delay 200ms
usleep(200*1000);
// CLKPLL lock status check
printf("\n[ adrv9009_cfg ]->TALISE_getPllsLockStatus time=%d\r\n",i);
talAction = TALISE_getPllsLockStatus(p_myTaliseDevice_shm, &pllLockStatus);
printf("PLL lockStatus=0x%x\n", pllLockStatus);
if (0x07 == (pllLockStatus & 0x07)){
printf("PLL locked\n");
break;
}
}
if (i >= 3){
printf("Err: setRfPllFrequency beyond 3 times fail,talAction=%d! (return )\r\n", talAction);
return talAction;
}
#endif
TALISE_setRfPllLoopFilter(p_myTaliseDevice_shm, loopBandwidth_kHz, stability);
printf("setRfPllLoopFilter lp_bw_khz=%d stable=%d\n",
loopBandwidth_kHz, stability
);
printf(">> \nset freq\n");
chang_freq(0, 1);
printf(">> \nrunInitCals\n");
#if 1
/* runInitCals */
for (i = 0; i < 3; i++) {
printf("\nTALISE_runInitCals time=%d\r\n",i);
talAction = TALISE_runInitCals(p_myTaliseDevice_shm, initCalMask);
if (talAction != TALACT_NO_ACTION){
printf("Err: TALISE_runInitCals talAction=%d! \r\n", talAction);
printf("cfg 9009 70,%d! \r\n", talAction);
}
printf("\nTALISE_waitInitCals time=%d\r\n",i);
talAction = TALISE_waitInitCals(p_myTaliseDevice_shm, 20000, &errorFlag);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_waitInitCals talAction=%d! errorFlag=0x%02x\r\n", talAction, errorFlag);
printf("cfg 9009 71,%d! \r\n", talAction);
}
uint32_t calsSincePowerUp=0;
uint32_t calsLastRun=0;
uint32_t calsMinimum=0;
uint8_t initErrCal =0;
uint8_t initErrCode=0;
TALISE_getInitCalStatus(p_myTaliseDevice_shm, &calsSincePowerUp, &calsLastRun, &calsMinimum, &initErrCal, &initErrCode);
printf("TALISE_getInitCalStatus :calsSincePowerUp=0x%02x, calsLastRun=0x%02x, calsMinimum=0x%02x, initErrCal=0x%02x, initErrCode=0x%02x\n",
calsSincePowerUp, calsLastRun, calsMinimum, initErrCal, initErrCode
);
if (talAction != TALACT_NO_ACTION){
printf("FAIL: runInitCals time %d fail,errorFlag=0x%x! \r\n", i, talAction);
}
else{
break;
}
}
if (i >= 3){
printf("Err: runInitCals beyond 3 times fail! (return )\r\n");
return talAction;
}
#endif
//-------------------------------------------------------------------------------------
printf("\n>> \nFor Framer A:\n");
/* Enable sysRef to mykonos jesd204b framer */
printf("\nTALISE_enableFramerLink disable\r\n");
talAction = TALISE_enableFramerLink(p_myTaliseDevice_shm, TAL_FRAMER_A, 0);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableFramerLink talAction=%d\r\n", talAction);
}
printf("\nTALISE_enableFramerLink enable\r\n");
talAction |= TALISE_enableFramerLink(p_myTaliseDevice_shm, TAL_FRAMER_A, 1);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableFramerLink talAction=%d\r\n", talAction);
}
printf("\nTALISE_enableSysrefToFramer \r\n");
talAction = TALISE_enableSysrefToFramer(p_myTaliseDevice_shm, TAL_FRAMER_A, 1);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableSysrefToFramer talAction=%d\r\n", talAction);
}
//-------------------------------------------------------------------------------------
printf("\n>> \nFor Deframer A:\n");
printf("\nTALISE_enableDeframerLink disable\r\n");
talAction = TALISE_enableDeframerLink(p_myTaliseDevice_shm, TAL_DEFRAMER_A, 0);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableDeframerLink talAction=%d\r\n", talAction);
}
printf("\nTALISE_enableDeframerLink enable\r\n");
talAction |= TALISE_enableDeframerLink(p_myTaliseDevice_shm, TAL_DEFRAMER_A, 1);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableDeframerLink talAction=%d\r\n", talAction);
}
printf("\nTALISE_enableSysrefToDeframer enable\r\n");
talAction = TALISE_enableSysrefToDeframer(p_myTaliseDevice_shm, TAL_DEFRAMER_A, 1);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_enableSysrefToDeframer talAction=%d\r\n", talAction);
}
//-------------------------------------------------------------------------------------
uint16_t deframerStatus = 0;
uint8_t framerStatus = 0;
printf("\n>> \nTALISE_readDeframerStatus \r\n");
talAction = TALISE_readDeframerStatus(p_myTaliseDevice_shm, TAL_DEFRAMER_A, &deframerStatus);
if (talAction != TALACT_NO_ACTION){
printf("Err: TALISE_readDeframerStatus talAction=%d\r\n", talAction);
}
printf("DeframerStatus,0x%x! \r\n",deframerStatus);
printf("\nTALISE_readFramerStatus \r\n");
talAction = TALISE_readFramerStatus(p_myTaliseDevice_shm, TAL_FRAMER_A, &framerStatus);
if (talAction != TALACT_NO_ACTION){
printf("Err: TALISE_readFramerStatus talAction=%d\r\n", talAction);
}
printf("framerStatus,0x%x! \r\n",framerStatus);
//-------------------------------------------------------------------------------------
#if ENSYSREFS
//open sysref
addr = 0x0D<<2; //change to logic addr
data = 0x1100;
write_axireg(addr,&data);
#endif
/*
uint32_t trackingCalMask = TAL_TRACK_NONE;
talAction = TALISE_enableTrackingCals(&talDevice, trackingCalMask);
if (talAction != TALACT_NO_ACTION){
}
talAction = TALISE_radioOn(&talDevice);
if (talAction != TALACT_NO_ACTION){
}
talAction = TALISE_shutdown(p_myTaliseDevice_shm);
if (talAction != TALACT_NO_ACTION){
}
printf("come in cfg 9009 9,%d! \r\n",talAction);
talAction = TALISE_closeHw(p_myTaliseDevice_shm);
if(talAction != TALACT_NO_ACTION){
}
*/
printf("\nTALISE_radioOn \r\n");
talAction = TALISE_radioOn(p_myTaliseDevice_shm);
if (talAction != TALACT_NO_ACTION){
/*** < User: decide what to do based on Talise recovery action returned > ***/
printf("Err: TALISE_radioOn talAction=%d\r\n", talAction);
}
#define _TETST_DISABLE_PINMOD (1)
#if _TETST_DISABLE_PINMOD
//PR06-2: 使能 RX1(o_rx/framerA 经外部 TX->RX1 电缆干净观测 TX 输出;ILA 改抓 o_rx)
printf("\nTALISE_setRadioCtlPinMode _TETST_DISABLE_PINMOD\r\n");
TALISE_setRadioCtlPinMode(p_myTaliseDevice_shm, 0, TAL_ORX1ORX2_PAIR_NONE_SEL);
#if 0//add for test
/* Keep TX1 off until FPGA/JESD/DPD/FAGC boot configuration is complete. */
adrv9009_set_tx_path_enable(0);
#else
TALISE_setRxTxEnable(p_myTaliseDevice_shm, TAL_ORX1_EN, TAL_TX1); /* PR06-2 ORx-only: 使能 ORx1 观测 TX */
#endif
/* PR06-2: 运行态设 TX1->ORX1 映射(cal时的不保持到运行态), ORx 才观测到 TX */
TALISE_setTxToOrxMapping(p_myTaliseDevice_shm, 1, TAL_MAP_TX1_ORX, TAL_MAP_NONE);
/* PR06-2: 走 SPI3(imx6仲裁)设 RX1 手动增益去饱和(profile的rx1GainIndex因SPI3归FPGA不生效) */
/* PR06-2: imx6 keeps control of RX1 gain — takes SPI3 (E_CTRL_SRC_MCU), writes an
initial gain, immediately releases to FPGA (E_CTRL_SRC_FPGA). The FPGA AGC then
servos from there, but imx6 can reclaim SPI3 anytime (cfg_adrv9009_spi_ctrl_source). */
/* PR06-2 ORx-only: 照参考工程(ATSC_260703) — imx6设初值后把SPI3交还FPGA常驻,
FPGA的ORx AGC(agc_spi_ctrl_gen 写 0x05D3 原始195..255)接管伺服去饱和。
注意: TALISE_setObsRxManualGain 走-128转换(195->67), 只作初值, 会被FPGA AGC覆盖。 */
/* PR06-2 ORx-only: 设初值后把SPI3交还FPGA常驻, FPGA的ORx AGC(读120M fb_idata)接管 */
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
TALISE_setObsRxManualGain(p_myTaliseDevice_shm, TAL_ORX1, 255); /* 初值(会被FPGA AGC覆盖) */
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA); /* 交还SPI3给FPGA: ORx AGC 接管 */
printf("[orx] SPI3 released to FPGA; FPGA ORx AGC (reads 120M fb_idata) takes over\n");
#else
printf("\nTALISE_setRadioCtlPinMode \r\n");
TALISE_setRadioCtlPinMode(p_myTaliseDevice_shm, TAL_TXRX_PIN_MODE|TAL_ORX_PIN_MODE, TAL_ORX1ORX2_PAIR_89_SEL);
#endif
printf("\nTALISE_setArmGpioPins \r\n");
TALISE_setArmGpioPins(p_myTaliseDevice_shm, &armGpio);
printf("\n[ adrv9009_cfg ] end. \r\n");
//[TALISE_getRfPllLoopFilter] lp_bw_khz=50 stable=3
TALISE_getRfPllLoopFilter(p_myTaliseDevice_shm, &loopBandwidth_kHz, &stability);
printf("[getRfPllLoopFilter] lp_bw_khz=%d stable=%d\n",
loopBandwidth_kHz, stability
);
#if 0
TALISE_radioOff(p_myTaliseDevice_shm);
TALISE_setRadioCtlPinMode(p_myTaliseDevice_shm, 0, TAL_ORX1ORX2_PAIR_NONE_SEL);
TALISE_setRxTxEnable(p_myTaliseDevice_shm, TAL_ORX1_EN, TAL_TX1);
TALISE_radioOn(p_myTaliseDevice_shm);
#endif
return talAction;
#endif
}
int Adrv9009_Ext_LOL_Cal_1(int which_9009) //for tx1 ext lol cal
{
fpga_write_axi0(0x17,0x0,1);
if(which_9009==ADRV9009_0)
{
fpga_write_axi0(0x18,0x02,1);
}
else
{
fpga_write_axi0(0x1a,0x02,1);
}
TALISE_Ext_LOL_Cal_1(which_9009);
fpga_write_axi0(0x17,0x0f,1);
}
int Adrv9009_Ext_LOL_Cal_2(int which_9009)//for tx2 ext lol cal
{
fpga_write_axi0(0x17,0x0,1);
if(which_9009==ADRV9009_0)
{
fpga_write_axi0(0x19,0x02,1);
}
else
{
fpga_write_axi0(0x1b,0x02,1);
}
TALISE_Ext_LOL_Cal_2(which_9009);
fpga_write_axi0(0x17,0x0f,1);
}
/*void read_fpga_version(char *pVer)
{
u32 u32data = 0;
if(pVer==NULL)
return ;
fpga_read(0x86, &u32data, 1);
int y = u32data>>16 & 0xFFFF;
int m = u32data>>8 & 0xFF;
int d = u32data>>0 & 0xFF;
fpga_read(0x87, &u32data, 1);
sprintf(pVer, "%d%d%d-%d", y, m, d, u32data&0xffff);
return;
}*/
#if 1
void cfr_clip_config(double set_clip_amp)
{
u16 d_clip_amp, d_clip_amp_sqr;
u32 v_conf;
d_clip_amp = set_clip_amp * 4096.0*0.95; // fixdt(0,16,12)
d_clip_amp_sqr = set_clip_amp * set_clip_amp *256.0; // fixdt(0,16,8);
v_conf = (d_clip_amp_sqr<<16) | d_clip_amp;
fpga_write_axi0(AXI_ADDR_CFR_CTRL1,v_conf,1);
}
static const int CRST_REFAD_TAB[][6] =
{
{1,2,2,3,1,3}, //0
{0,2,0,3,2,3}, //1
{1,3,0,1,3,4}, //2
{2,4,1,2,4,5}, //3
{3,4,5,4,4,4}, //4
{4,5,6,5,5,5}, //5
{5,6,7,6,6,6}, //6
{6,7,8,7,7,7}, //7
{7,8,9,8,8,8}, //8
{8,9,10,9,9,9}, //9
{9,10,11,10,10,10}, //10
{10,12,9,10,12,13}, //11
{11,13,10,11,13,14}, //12
{12,14,11,12,14,11}, //13
{13,12,12,11,13,11} //14
};
int dpd_powon()
{
/*
int i = 0;
fpga_write_axi0(AXI_ADDR_BW_MODE, DPD_SET_100M,1);
fpga_write_axi0(AXI_ADDR_CRST_TAP_MAP, 0x07f0 ,1); // 0x07f0: +-3; 0x7fff: +-7
for(i=0;i<15;i++) // set CRST REF AD
{
fpga_write_axi0(AXI_ADDR_CRST_ADREF_TAP0+i, DPD_SET_CRST_REFAD(CRST_REFAD_TAB[i]),1);
}
fpga_write_axi0(AXI_ADDR_DPD_FIXDLY, 0,1);
fpga_write_axi0(AXI_ADDR_AMP_SAT, DPD_MAX_TX_AMP_SAT, 1); //set maximum tx amp
fpga_write_axi0(AXI_ADDR_DPD_CTRL1, DPD_CTRL1_ALL_BYPS, 1);
fpga_write_axi0(AXI_ADDR_DPD_CTRL2, 0, 1);
fpga_write_axi0(AXI_ADDR_DPD_CTRL3, 0, 1);
cfr_clip_config(2.59); // 6.17 -> 8.5dB@0.01%
fpga_write_axi0(AXI_ADDR_CFR_CTRL2, 0x00, 1); // enable CFR
fpga_write_axi0(AXI_ADDR_SIG_SHIFT, DPD_SET_DGAIN(4096), 1); // fixdt(0,16,12)
fpga_write_axi0(AXI_ADDR_DPD_TEST,0x1000,1); // 1: slow update; 0: fast update
*/
}
void usr_Adrv9009_Ext_Lol_Cal(void)
{
printf("\n\n==>>>==Start. Adrv9009 Ext LOL Cal...\n");
//external LOL calibration -ad9009 TX1
Adrv9009_Ext_LOL_Cal_1(ADRV9009_0);
Adrv9009_Ext_LOL_Cal_1(ADRV9009_1);
fpga_write_axi0(0x18, 0x03, 1);//ADV9009_1 0RX RF_SWITCH ON
fpga_write_axi0(0x17, 0x0f, 1);//ADV9009_1 TX RF_SWITCH ON
printf("==<<<==Finish. Adrv9009 Ext LOL Cal\n");
}
void set_pa_output(u8 set_enable)
{
fpga_write_axi0(0x100, set_enable, 1);
printf("set pa output=%d\n", set_enable);
}
#define TEST_JESD204B_CFG 0
#define TIME_WAIT 5
#define DBG_DISABLE_SINGLE_AXI_WR (0)
//typedef unsigned char uint8_t;
//typedef unsigned short uint16_t;
void usr_check_state()
{
uint32_t talAction = TALACT_NO_ACTION;
uint8_t pllLockStatus = 0;
uint32_t radioStatus = 0;
printf("\n\n===============check state...==============\n\n");
//1.
talAction = TALISE_getPllsLockStatus(p_myTaliseDevice_shm, &pllLockStatus);
printf("ck1. PLLs lockStatus=0x%x(bit210) ret=%d LocK[CLK_PLL=%d RF_PLL=%d AUX_PLL=%d]\n", pllLockStatus, talAction,
pllLockStatus&0x1, (pllLockStatus>>1)&0x1, (pllLockStatus>>2)&0x1
);
//2.
talAction = TALISE_getRadioState(p_myTaliseDevice_shm, &radioStatus);
if (radioStatus == TALISE_ARM_RADIO_STATUS_POWERUP){
printf("ck2. radioState=0x%x powerup\n", radioStatus);
}
else if (radioStatus == TALISE_ARM_RADIO_STATUS_READY){
printf("ck2. radioState=0x%x rdy\n", radioStatus);
}
else if (radioStatus == TALISE_ARM_RADIO_STATUS_IDLE){
printf("ck2. radioState=0x%x idle\n", radioStatus);
}
else if (radioStatus == TALISE_ARM_RADIO_STATUS_RADIO_ON){
printf("ck2. radioState=0x%x radio on\n", radioStatus);
}
else if (radioStatus == TALISE_ARM_RADIO_STATUS_PROFILE_ERROR){
printf("ck2. radioState=0x%x profile_err\n", radioStatus);
}
else{
printf("ck2. radioState=0x%x reset_err\n", radioStatus);
}
//3.
uint32_t calsSincePowerUp=0;
uint32_t calsLastRun=0;
uint32_t calsMinimum=0;
uint8_t initErrCal =0;
uint8_t initErrCode=0;
TALISE_getInitCalStatus(p_myTaliseDevice_shm, &calsSincePowerUp, &calsLastRun, &calsMinimum, &initErrCal, &initErrCode);
printf("ck3. TALISE_getInitCalStatus :calsSincePowerUp=0x%02x, calsLastRun=0x%02x, calsMinimum=0x%02x, initErrCal=0x%02x, initErrCode=0x%02x\n",
calsSincePowerUp, calsLastRun, calsMinimum, initErrCal, initErrCode
);
//4.
taliseTxLolStatus_t result;
talAction = TALISE_getTxLolStatus(p_myTaliseDevice_shm, (taliseTxChannels_t)TAL_TX1, &result);
printf("ck4. TxLolStatus=0x%x ret=%d\n", result, talAction);
//5.
taliseTxQecStatus_t txQecStatus;
talAction = TALISE_getTxQecStatus(p_myTaliseDevice_shm, (taliseTxChannels_t)TAL_TX1, &txQecStatus);
printf("ck5. TxQecStatus=0x%x ret=%d\n", txQecStatus, talAction);
//6.
uint8_t framerStatus;
talAction = TALISE_readFramerStatus(p_myTaliseDevice_shm, (taliseFramerSel_t)TAL_FRAMER_A, &framerStatus);
printf("ck6. framerAStatus=0x%x ret=%d\n", framerStatus, talAction);
//7.
//uint8_t framerStatus;
talAction = TALISE_readFramerStatus(p_myTaliseDevice_shm, (taliseFramerSel_t)TAL_FRAMER_B, &framerStatus);
printf("ck7. framerBStatus=0x%x ret=%d\n", framerStatus, talAction);
//8.
uint16_t deframerStatus;
talAction = TALISE_readDeframerStatus(p_myTaliseDevice_shm, (taliseFramerSel_t)TAL_FRAMER_A, &deframerStatus);
printf("ck8. DeframerAStatus=0x%x ret=%d\n", deframerStatus, talAction);
//9.
//uint16_t deframerStatus;
talAction = TALISE_readDeframerStatus(p_myTaliseDevice_shm, (taliseFramerSel_t)TAL_FRAMER_B, &deframerStatus);
printf("ck9. DeframerBStatus=0x%x ret=%d\n", deframerStatus, talAction);
printf("\n\n===============check done...==============\n\n");
}
void adrv9009_init(void)
{
u32 readdat;
u32 datbuf[32];
int i = 0;
int ret;
uint32 tmp_data;
uint8 time_wait;
static uint8_t stc_spi_init = 0;
printf("\n\n\n=============================adrv9009 init start.=====>>>======================\n\n");
if(stc_spi_init==0){
stc_spi_init=1;
spi_9009_init();
}
#if 0
fpga_write_axi0(0xB1, 0x06, 1);
fpga_read_axi0(0xB1, &readdat, 1);
printf("boot rst_set wr_axi addr=0xB1 wdata=0x06 rdata=0x%x\n", readdat);
fpga_write_axi0(0xB1, 0x00, 1);
fpga_read_axi0(0xB1, &readdat, 1);
printf("boot rst_clr wr_axi addr=0xB1 wdata=0x00 rdata=0x%x\n", readdat);
#endif
set_pa_output(0);
#if 1//CH0
printf("\n\nch0 start...----------------------------------------------------------------------\n");
memset(datbuf, 0x0, sizeof(datbuf));
fpga_read_axi0(0x80, datbuf, 0x10);
for(i = 0; i < 0x10; i++) {
printf("fpga_read_axi0(0x%x)=0x%x.\n", 0x80+i, datbuf[i]);
}
jesd204b_tx0_cfg();
#if TEST_JESD204B_CFG
time_wait=TIME_WAIT;
jesd204b_rd_test();
while(time_wait--){
sleep(1);
printf("[1/3] waiting 204b tx0_cfg for continue %d\n", time_wait);///////////////////////////////////////////// 1
}
printf("\n\n");
#endif
readdat = 0;
ret = ad9009_read_spi(1, 0x100, &readdat, 1);
if(ret == OK) {
printf("ad9009_read_spi(1,0x%x)=0x%x.\n", 0x100, readdat);
} else {
printf("ERROR:ad9009_read_spi(1,0x%x) fail.\n",0x100);
}
ret = adrv9009_cfg(ADRV9009_0);
if(ret == 0) {
printf("adrv9009_cfg(ADRV9009_0) successful.\n\n");
} else {
printf("adrv9009_cfg(ADRV9009_0) fail.\n\n");
}
#if !DBG_DISABLE_SINGLE_AXI_WR
//------------------------------------------------------
fpga_write_axi0(0x13, 3, 1);
fpga_write_axi0(0x14, 3, 1);
#endif
jesd204b_fb0_cfg();
jesd204b_rx0_cfg();
/*reset gt*/
/*tx-bit0 rx-bit4 fb-bit8 */
fpga_write_axi0(0x78, 0x111, 1);
fpga_write_axi0(0x78, 0x0, 1);
//-----------------------------------------------------------------------
//cfg tx 9009*/
jesd204b_tx0_wr(0x04, 0x01);
#if TEST_JESD204B_CFG
time_wait=TIME_WAIT;
jesd204b_rd_test();
while(time_wait--){
sleep(1);
printf("[3/3] waiting 204b tx0_wr for continue %d\n", time_wait);///////////////////////////////////////////// 3
}
printf("\n\n");
#endif
//-----------------------------------------------------------------------
//cfg rx 9009
jesd204b_rx0_wr(0x04, 0x01);
//cfg fb 9009
//temp disable, wait for song to confirm 260514
// jesd204b_fb0_wr(0x04, 0x01);
memset(datbuf, 0x0, sizeof(datbuf));
//jesd204b rd sync b0-ad b1-fb b2-tx check =3
ret = fpga_read_axi0(0xb0, &datbuf[0], 3);
if(ret == OK) {
printf("\n\n\nfpga_read_axi0(0x%02x)=0x%x.\n", 0xb0, datbuf[0]);
printf("fpga_read_axi0(0x%02x)=0x%x.\n", 0xb1, datbuf[1]);
printf("fpga_read_axi0(0x%02x)=0x%x.\n\n\n", 0xb2, datbuf[2]);
}
else {
printf("ERROR:fpga_read_axi0(0x02%) fail.\n", 0xb0);
}
printf("ch0 finished.----------------------------------\n");
#endif//CH0
#if 1
#if !DBG_DISABLE_SINGLE_AXI_WR
fpga_write_axi0(0x16, 0x0f, 1);//ADV9009_1 RX RF_SWITCH ON
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x17, 0x0f, 1);//ADV9009_1 TX RF_SWITCH ON
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x18, 0x03, 1);//ADV9009_1 0RX RF_SWITCH ON
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x1a, 0x03, 1);//ADV9009_1 0RX3 RF_SWITCH ON
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x7a, 0x10, 1);//ORX loopback to TX change IQ
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x59, 0x10, 1);//ORX loopback to TX change IQ
fpga_read_axi0(0x16, &tmp_data, 1);
fpga_write_axi0(0x5a, 0x10, 1);//ORX loopback to TX change IQ
fpga_read_axi0(0x16, &tmp_data, 1);
//@h210810 (0x0a, 0x01, 1) => (0x0a, 0x03, 1)
//@h210811 (0x0a, 0x03, 1) => (0x0a, 0x02, 1)
fpga_write_axi0(0x0a, 0x02, 1); //ADV9009_1 0: cw; 1 : RX loopback to TX; 2 fb loopback to TX; 3 dtmb 03
printf("add 0x0a, data = 0x02\n");
fpga_write_axi0(0x0b, 0x00, 1);//ADV9009_2 RX loopback to TX
#endif
//Adrv9009_Ext_LOL_Cal_1(ADRV9009_0); //remove 250708
//------------------------------------------------------
//ad9009-tx1
// PR06-2 修复①: 注释掉运行态8dB TX衰减(同260702:974) → TX满功率, ORx内部环回观测+8dB
//usr_set_ad9009_TxAttenuation(D_SET_ATT, 1);
usr_get_ad9009_getTxAttenuation(1);
// uint16 adrv_att = 0;//8000;
// cfg_adrv_att(adrv_att);
fpga_read_axi0(AXI_ADDR_VERSION1, &readdat, 1);
printf("Current FPGA version is 0x%x \n", readdat&0xffff);
//initialize DPD
dpd_powon(); // PR06: 重新启用 DPD 自适应(配合FPGA DPDENABLE). 若降速DPD导致boot挂起可回退注释掉.
// turn on fpga tx signal
fpga_write_axi0(AXI_ADDR_FBROUTE, 0x10, 1);
//cleanup_platform();
printf("\n\n\n===========================adrv9009 init end.===============================<<<============\n\n");
//------------------------------------------------------
u32 cfg_cw=1;
cfg_cw = 1;
fpga_write_axi0(0x0001, (u32)cfg_cw, 1);
printf("SET CW %d\n", cfg_cw);
//set_pa_output(1);
jesd204b_tx0_wr(0x002c, 0);
jesd204b_fb0_wr(0x002c, 0);//add 260514
usr_check_state();
// PR06 fix(A) 对齐260702: 晚一次接收侧GT复位。早期唯一的GT复位(0x78=0x111)在framer B
// 被拉起(radioOn/setRxTxEnable)之前; Subclass-0需"framer先发→再复位对齐接收端GT"。
// 补一次 rx(bit4)+fb(bit8) 复位(保TX framer bit0=0), 让FPGA FB-RX GT对着已在发送的
// framer B重新comma对齐。(260702实测: 从fb_sync=0变0xBB=0x03。)
fpga_write_axi0(0x78, 0x110, 1);
usleep(2000);
fpga_write_axi0(0x78, 0x0, 1);
sleep(1);
readdat=0;
for(int j=0;j<20;j++){
fpga_read_axi0(0xBB, &readdat, 1);
printf("rd reg=0xBB data=0x%x\n", readdat);
}
if((readdat==0x07) || (readdat==0x03))
printf("ok, fb init state ok!\n\n");
else
printf("err, fb init state failed!\n\n");
//260514 add 0xB9 bit1: rfmon en / 0xB9 bit0: rxrf loop
fpga_write_axi0(0xB9, 0x2, 1);
printf("wr reg=0xB9 data=0x2\n\n");
//move to fpga_save_sys //cfg_adrv_orx_manu_gain(cttb_para.system_para.orx_manu_gain);
/*talRecoveryActions_t retVal;
retVal = (talRecoveryActions_t)TALISE_setObsRxManualGain(p_myTaliseDevice_shm, TAL_ORX1, 255);
if (retVal == OK){
printf("SUCCESS:ad9009 TAL_ORX1 setObsManualGain 255! \r\n");
} else{
printf("FAIL: ad9009 TAL_ORX1 setObsRxManualGain!errorcode =%d \r\n", ret);
}
retVal = (talRecoveryActions_t)TALISE_setObsRxManualGain(p_myTaliseDevice_shm, TAL_ORX2, 255);
if (retVal == OK){
printf("SUCCESS:ad9009 TAL_ORX2 setObsManualGain 255! \r\n");
} else{
printf("FAIL: ad9009 TAL_ORX2 setObsRxManualGain!errorcode =%d \r\n", ret);
}*/
#if 1 // for test and read (later can be removed)
//-----------------------------------------------------------------------
// test frame B start
/*
目标:让 ADRV9009 Framer B 本身输出确定性测试数据
测试前确认 JESD FB 链路正常
先读取:
fpga[0xBB]
FB0[0x38]
FB0[0x2C]
期望:
fpga[0xBB] bit1 = 1 // fb_sync
fpga[0xBB] bit0 = 1 // fb_tvalid
FB0[0x38] bit0 = 1 // in_sync
FB0[0x2C] bit[1:0] = 0 // subclass 0,不使用 SYSREF
DRV9009 Framer B test data:
由 ADRV9009 通过 JESD lane 发出测试数据。
用于验证 ADRV9009 Framer B -> FPGA JESD RX -> demap 这条完整接收链路。
Link.Talise.EnableFramerTestData(
Talise.FramerSelect.FramerB,
Talise.FramerDataSource.FtdAdcData,
Talise.FramerInjectPoint.FtdFramerInput
)
*/
//// Framer B test data (Task11-3)
{
u32 fb_mon, fb_sta;
u32 retVal;
fpga_read_axi0(0xBB, &fb_mon, 1);
fb_sta = jesd204b_fb0_rd(0x038);
printf("\n---- Framer B test mode ----\n");
printf("fpga[0xBB] = 0x%02x (bit1=sync=%d, bit0=tvalid=%d)\n",
fb_mon, (fb_mon >> 1) & 1, fb_mon & 1);
printf("FB0[0x38] = 0x%08x (bit0=in_sync=%d)\n",
fb_sta, fb_sta & 1);
if ((fb_mon & 0x03) != 0x03) {
printf("WARN: JESD FB link not fully ready, continue anyway\n");
}
#if 0 //Enable Framer Test -- Ramp only for test
retVal = TALISE_enableFramerTestData(p_myTaliseDevice_shm,
TAL_FRAMER_B,
TAL_FTD_RAMP,
TAL_FTD_FRAMERINPUT);
if (retVal == TALACT_NO_ACTION) {
printf("TEST: Framer B RAMP enabled, check fb_idata/qdata via ILA\n");
} else {
printf("FAIL: TALISE_enableFramerTestData err=0x%x\n", retVal);
}
#endif
// === check 1: TALISE_readFramerStatus ===
{
uint8_t framerStatus;
u32 statusRet = TALISE_readFramerStatus(p_myTaliseDevice_shm,
TAL_FRAMER_B, &framerStatus);
if (statusRet == TALACT_NO_ACTION) {
printf("RD: Framer B status = 0x%02x (bit[1:0]=sysref, bit[3:2]=sync, bit5=cfgSts3, bit6=cfgSts4)\n",
framerStatus);
} else {
printf("RD: TALISE_readFramerStatus err=0x%x\n", statusRet);
}
}
// === check 2: readback test data source register (0x1534+0x28=0x155C for Framer B) ===
{
uint8_t regVal;
adiHalErr_t halErr = talSpiReadByte(p_myTaliseDevice_shm->devHalInfo,
TALISE_ADDR_JESD_FRAMER_TEST_CFG_0 + TALISE_JESD_FRAMERB_OFFSET,
&regVal);
if (halErr == ADIHAL_OK) {
const char *srcName;
switch (regVal & 0x0F) {
case 0: srcName = "ADC_DATA(0)"; break;
case 1: srcName = "CHECKERBOARD"; break;
case 2: srcName = "TOGGLE"; break;
case 3: srcName = "PRBS31"; break;
case 4: srcName = "PRBS23"; break;
case 5: srcName = "PRBS15"; break;
case 6: srcName = "PRBS9"; break;
case 7: srcName = "PRBS7"; break;
case 8: srcName = "RAMP"; break;
default: srcName = "UNKNOWN"; break;
}
printf("RD: Framer B test cfg reg[0x%04X] = 0x%02x (dataSrc=%s, injPt=%d)\n",
TALISE_ADDR_JESD_FRAMER_TEST_CFG_0 + TALISE_JESD_FRAMERB_OFFSET,
regVal, srcName, (regVal >> 4) & 0x0F);
if ((regVal & 0x0F) != 8) {
printf("WARN: data source 0x%x != RAMP(0x8), test pattern NOT active!\n",
regVal & 0x0F);
}
} else {
printf("RD: spiRead Framer B test cfg reg failed, halErr=%d\n", halErr);
}
}
// === check 3: warn if later init overwrites this register ===
printf("NOTE: If ILA still shows only small ADC data, verify later init steps\n");
printf(" (TALISE_radioOn, initCals, or profile reload) do not overwrite\n");
printf(" the test data source register at 0x%04X.\n",
TALISE_ADDR_JESD_FRAMER_TEST_CFG_0 + TALISE_JESD_FRAMERB_OFFSET);
printf("---- Framer B test mode end ----\n\n");
}
//test_frameB end
//-----------------------------------------------------------------------
// === ORx config summary (for small I/Q debug) ===
{
uint8_t orxGain;
uint64_t pllFreq;
printf("\n---- ORx config summary ----\n");
printf("ORx FIR gain_dB = %d (from profile)\n",
p_myTalInit->obsRx.orxProfile.rxFir.gain_dB);
printf("ORx rxFirDecimation = %u, rxDec5Decimation = %u, rhb1Decimation = %u\n",
p_myTalInit->obsRx.orxProfile.rxFirDecimation,
p_myTalInit->obsRx.orxProfile.rxDec5Decimation,
p_myTalInit->obsRx.orxProfile.rhb1Decimation);
printf("obsRxChannelsEnable = 0x%x %s\n",
p_myTalInit->obsRx.obsRxChannelsEnable,
p_myTalInit->obsRx.obsRxChannelsEnable == TAL_ORX1 ? "(ORX1)" :
p_myTalInit->obsRx.obsRxChannelsEnable == TAL_ORX2 ? "(ORX2)" :
p_myTalInit->obsRx.obsRxChannelsEnable == (TAL_ORX1|TAL_ORX2) ? "(ORX1|ORX2)" : "(other)");
printf("ORx framerSel = %s\n",
p_myTalInit->obsRx.framerSel == TAL_FRAMER_B ? "FRAMER_B" :
p_myTalInit->obsRx.framerSel == TAL_FRAMER_A ? "FRAMER_A" : "other");
if (TALISE_getObsRxGain(p_myTaliseDevice_shm, TAL_ORX1, &orxGain) == TALACT_NO_ACTION)
printf("ORx1 gain index (readback from chip) = %u\n", orxGain);
else
printf("ORx1 gain readback FAILED\n");
if (TALISE_getRfPllFrequency(p_myTaliseDevice_shm, TAL_RF_PLL, &pllFreq) == TALACT_NO_ACTION)
printf("TX PLL freq = %llu Hz (ORx uses same PLL)\n", pllFreq);
else
printf("TX PLL freq readback FAILED\n");
printf("---- ORx config end ----\n\n");
}
printf("\n\n==================================================\n\n");
//------------------------------------------------------
#endif
/*
建议继续读这些:
0x155F // Framer B SYSREF/status cfg2
0x1559 // Framer B CFG3,bit0 是 configStatus3
0x155A // Framer B CFG4,bit0 是 invalid config status,C0 以后有效
0x1554 // Framer B ASYNC_PTR_DBG
判断:
0x1559 bit0 应为 0
0x155A bit0 应为 0
0x1554 如果周期性异常,可能指向 Framer B async FIFO / pointer 问题
*/
// === Framer B status debug registers ===
{
printf("\n\n==================================================\n\n");
uint8_t reg155F, reg1559, reg155A, reg1554;
// 0x155F: Framer B SYSREF/status cfg2
reg155F = 0;
talSpiReadByte(p_myTaliseDevice_shm->devHalInfo,
TALISE_ADDR_JESD_FRAMER_SYSREF_CFG2_0 + TALISE_JESD_FRAMERB_OFFSET,
&reg155F);
printf("RD: Framer B SYSREF/status cfg2 [0x155F] = 0x%02x\n", reg155F);
// 0x1559: Framer B CFG3, bit0 = configStatus3
reg1559 = 0;
talSpiReadByte(p_myTaliseDevice_shm->devHalInfo,
TALISE_ADDR_JESD_FRAMER_CFG3_0 + TALISE_JESD_FRAMERB_OFFSET,
&reg1559);
printf("RD: Framer B CFG3 [0x1559] = 0x%02x (configStatus3 bit0=%d)\n",
reg1559, reg1559 & 0x01);
if (reg1559 & 0x01)
printf("ERR: Framer B CFG3 bit0(configStatus3) expected 0!\n");
// 0x155A: Framer B CFG4, bit0 = invalid config status (valid after C0)
reg155A = 0;
talSpiReadByte(p_myTaliseDevice_shm->devHalInfo,
TALISE_ADDR_JESD_FRAMER_CFG4_0 + TALISE_JESD_FRAMERB_OFFSET,
&reg155A);
printf("RD: Framer B CFG4 [0x155A] = 0x%02x (invalidCfgSts bit0=%d)\n",
reg155A, reg155A & 0x01);
if (reg155A & 0x01)
printf("ERR: Framer B CFG4 bit0(invalid config status) expected 0!\n");
// 0x1554: Framer B ASYNC_PTR_DBG
reg1554 = 0;
talSpiReadByte(p_myTaliseDevice_shm->devHalInfo,
TALISE_ADDR_JESD_FRAMER_ASYNC_PTR_DBG_1,
&reg1554);
printf("RD: Framer B ASYNC_PTR_DBG [0x1554] = 0x%02x\n", reg1554);
printf("NOTE: if 0x1554 toggles periodically, may indicate Framer B async FIFO / pointer issue\n");
printf("\n\n==================================================\n\n");
}
/*
然后看 TALISE_getInitCalStatus() 的:
initErrCal
initErrCode
calsLastRun
*/
// === Init cal status check ===
{
printf("\n\n==================================================\n\n");
uint32_t calsSincePowerUp = 0;
uint32_t calsLastRun = 0;
uint32_t calsMinimum = 0;
uint8_t initErrCal = 0;
uint8_t initErrCode = 0;
uint32_t calRet = TALISE_getInitCalStatus(p_myTaliseDevice_shm,
&calsSincePowerUp, &calsLastRun, &calsMinimum, &initErrCal, &initErrCode);
printf("RD: TALISE_getInitCalStatus ret=0x%x, calsSincePowerUp=0x%x, calsLastRun=0x%x, calsMinimum=0x%x\n",
calRet, calsSincePowerUp, calsLastRun, calsMinimum);
printf("RD: initErrCal=%u, initErrCode=%u\n", initErrCal, initErrCode);
if (initErrCal != 0)
printf("WARN: initErrCal=%u, initErrCode=%u — init cal error detected!\n",initErrCal, initErrCode);
printf("\n\n==================================================\n\n");
}
#endif // for test and read
}
uint8_t swap_6bits_simple(uint8_t x) {
// 只关注低6位
x &= 0x3F;
// 提取各对位
uint8_t b0 = (x & 0x01); // bit0
uint8_t b1 = (x & 0x02); // bit1
uint8_t b2 = (x & 0x04); // bit2
uint8_t b3 = (x & 0x08); // bit3
uint8_t b4 = (x & 0x10); // bit4
uint8_t b5 = (x & 0x20); // bit5
// 重新组装:b0去bit5, b1去bit4...
return (b0 << 5) | (b1 << 3) | (b2 << 1) |
(b3 >> 1) | (b4 >> 3) | (b5 >> 5);
}
void cfg_fpga_agc_att(uint8 agc_att)
{
uint8 cfg_att = (~agc_att)&0x3f;
uint8 dat = swap_6bits_simple(cfg_att);
fpga_byte_write(0x01,0xBA,dat);
uint8 rd_att;
rd_att = fpga_byte_read(0x01,0xBA);
printf("cfg agc_att wr=%d rd=%d [%d] (%d / %f db)\n", dat, rd_att, dat, agc_att, -0.5*agc_att);
}
void cfg_adrv_att(uint16 set_att)
{
uint8 chg_src = 0;
if(_g_adrv9009_spi_src!=E_CTRL_SRC_MCU){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
chg_src = 1;
}
usr_set_ad9009_TxAttenuation(set_att, 1);
usr_get_ad9009_getTxAttenuation(1);
if(chg_src==1){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA);
}
}
void get_adrv9009_c0_orx_range(uint8 *pmin ,uint8 *pmax)
{
*pmin = 195;
*pmax = 255;
}
void cfg_adrv_orx_manu_gain(uint8 orx_manu_gain_index)
{
talRecoveryActions_t retVal;
uint8 min;
uint8 max;
uint8 chg_src = 0;
if(_g_adrv9009_spi_src!=E_CTRL_SRC_MCU){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
chg_src = 1;
}
get_adrv9009_c0_orx_range(&min, &max);
printf("cfg orx_manu_gain %d (%d ~ %d)\n", orx_manu_gain_index,min,max);
retVal = (talRecoveryActions_t)TALISE_setObsRxManualGain(p_myTaliseDevice_shm, TAL_ORX1, orx_manu_gain_index);
if (retVal == OK){
printf("SUCCESS:ad9009 TAL_ORX1 setObsManualGain %d! \r\n", orx_manu_gain_index);
} else{
printf("FAIL: ad9009 TAL_ORX1 setObsRxManualGain!errorcode =%d \r\n", retVal);
}
retVal = (talRecoveryActions_t)TALISE_setObsRxManualGain(p_myTaliseDevice_shm, TAL_ORX2, orx_manu_gain_index);
if (retVal == OK){
printf("SUCCESS:ad9009 TAL_ORX2 setObsManualGain %d! \r\n", orx_manu_gain_index);
} else{
printf("FAIL: ad9009 TAL_ORX2 setObsRxManualGain!errorcode =%d \r\n", retVal);
}
if(chg_src==1){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA);
}
}
/* PR06-2: RX1 手动增益走 SPI3(与 ORx 一样, imx6 仲裁 SPI3 控制权)。
profile 的 rx1GainIndex 不生效是因为 SPI3 归 FPGA; 必须 imx6 拿 MCU 控制权再设。 */
void cfg_adrv_rx1_manu_gain(uint8 rx1_manu_gain_index)
{
talRecoveryActions_t retVal;
uint8 chg_src = 0;
if(_g_adrv9009_spi_src!=E_CTRL_SRC_MCU){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU); /* imx6 拿 SPI3 控制权 */
chg_src = 1;
}
printf("cfg rx1_manu_gain %d\n", rx1_manu_gain_index);
retVal = (talRecoveryActions_t)TALISE_setRxManualGain(p_myTaliseDevice_shm, TAL_RX1, rx1_manu_gain_index);
if (retVal == OK){
printf("SUCCESS:ad9009 TAL_RX1 setRxManualGain %d! \r\n", rx1_manu_gain_index);
} else{
printf("FAIL: ad9009 TAL_RX1 setRxManualGain!errorcode =%d \r\n", retVal);
}
if(chg_src==1){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA); /* 释放 SPI3 回 FPGA */
}
}
/* PR06-2: read back where the FPGA RF-AGC has driven the RX1 gain index (0x0686).
imx6 takes SPI3 (MCU), reads, releases to FPGA. Used to check if AGC hit floor 195. */
extern int usr_get_ad9009_RxGain(uint8_t *prxGainIndex, uint8_t channel);
void cfg_adrv_rx1_read_gain(void)
{
uint8_t g = 0;
uint8 chg_src = 0;
if(_g_adrv9009_spi_src!=E_CTRL_SRC_MCU){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
chg_src = 1;
}
usr_get_ad9009_RxGain(&g, 1); /* channel 1 = TAL_RX1 */
printf("[rx1_agc] readback RX1 gain index = %d\n", g);
if(chg_src==1){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA);
}
}
static const uint16 s_loop_bw_value[3]={300,500,700};
static const uint8 s_loop_stable_value[3]={3,8,15};
uint16 get_loop_fbw_value()
{
/*if(atsc_para.rf_para.loop_fbw>2){
atsc_para.rf_para.loop_fbw = 2;
}*/
uint8 loop_fbw = 2;
return s_loop_bw_value[loop_fbw];
}
uint16 get_loop_fbw_stable()
{
/*if(atsc_para.rf_para.loop_fpara>2){
atsc_para.rf_para.loop_fpara = 2;
}*/
uint8 loop_fpara = 2;
return s_loop_stable_value[loop_fpara];
}
void chang_freq(uint8 radio_ctl, int freq_changed)
{
uint32_t talAction = TALACT_NO_ACTION;
uint8_t pllLockStatus = 0;
int i=0;
int ret;
uint8_t lock_sta = 0;
uint32 fFreqMHz ;
uint8 chg_src = 0;
if(_g_adrv9009_spi_src!=E_CTRL_SRC_MCU){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_MCU);
chg_src = 1;
}
fFreqMHz = txfreq_to_hz(atsc_para.rf_para.txfreq);
if(radio_ctl==1){
pthread_mutex_lock(&g_orx_gain_lock);
usr_printf_radiooff("chang_freq");
ret = TALISE_radioOff(p_myTaliseDevice_shm);
if (ret != TALACT_NO_ACTION){
pthread_mutex_unlock(&g_orx_gain_lock);
printf("chang_freq: TALISE_radioOff error!\n");
return ;
}
pthread_mutex_unlock(&g_orx_gain_lock);
}
for (i = 0; i < 3; i++)
{
//printf("\nTALISE_setRfPllFrequency to %dMHz time=%d\r\n", fFreqMHz, i);
pthread_mutex_lock(&g_orx_gain_lock);
talAction = TALISE_setRfPllFrequency(p_myTaliseDevice_shm, TAL_RF_PLL, fFreqMHz*1000000);//TX_FREQ_IN_HZ
pthread_mutex_unlock(&g_orx_gain_lock);
if (talAction == TALACT_NO_ACTION){
printf("\nchang_freq: set rf pll freq=%d succeed! cnt%d\r\n", fFreqMHz, i);
}
else{
printf("\nchang_freq: set rf pll freq=%d failed! (%d) cnt%d\n", fFreqMHz, talAction, i);
}
usleep(200*1000);
pthread_mutex_lock(&g_orx_gain_lock);
talAction = TALISE_getPllsLockStatus(p_myTaliseDevice_shm, &pllLockStatus);
pthread_mutex_unlock(&g_orx_gain_lock);
printf("PLL lockStatus=0x%x(bit210) ret=%d cnt%d\n", pllLockStatus, talAction, i);
if (0x07 == (pllLockStatus & 0x07)){
printf("PLL locked\n");
lock_sta = 1;
break;
}
}
if(radio_ctl==1){
pthread_mutex_lock(&g_orx_gain_lock);
ret = TALISE_radioOn(p_myTaliseDevice_shm);
if (ret != TALACT_NO_ACTION){
pthread_mutex_unlock(&g_orx_gain_lock);
printf("chang_freq: TALISE_radioOn error! ret=0x%x\n", ret);
}
pthread_mutex_unlock(&g_orx_gain_lock);
}
if (lock_sta==0){
printf("chang_freq: pll lock failed!\r\n\n");
}
else{
printf("chang_freq: pll lock succeed!\r\n\n");
}
if(chg_src==1){
cfg_adrv9009_spi_ctrl_source(E_CTRL_SRC_FPGA);
}
return ;
}
void chang_cw(int cw_changed)
{
//todo :
//just for temp build
}
void jesd204b_tx0_test(void)
{
//jesd204b_tx0_wr(0x04, 0x01);
//jesd204b_tx0_wr(0x81c,0x0);
/*fpga_write_axi0(0xB5,0x0,1);
fpga_write_axi0(0xB7,0x0,1);
fpga_write_axi0(0xB6,0x0,1);
fpga_write_axi0(0xB8,0x0,1);
jesd204b_tx0_wr(0x04,0x01);
jesd204b_tx0_wr(0x08,0x01);
jesd204b_tx0_wr(0x0c,0x0);
jesd204b_tx0_wr(0x10,0x01);
jesd204b_tx0_wr(0x14,0x03);
jesd204b_tx0_wr(0x18,0x0);
jesd204b_tx0_wr(0x20,0x01);
jesd204b_tx0_wr(0x24,0x1f);
jesd204b_tx0_wr(0x28,0xf);
jesd204b_tx0_wr(0x2c,0x01);
jesd204b_tx0_wr(0x80c,0x01000a55);
jesd204b_tx0_wr(0x810,0x000f0d03);
jesd204b_tx0_wr(0x814,0x0);
jesd204b_tx0_wr(0x818,0x0);
jesd204b_tx0_wr(0x81c,0x0);
uint8 time_wait=30;
while(time_wait--){
sleep(1);
printf("wait for jesd204b_tx0_test to continue %d...\n", time_wait);
}*/
}
#endif