1676 lines
52 KiB
C
Executable File
1676 lines
52 KiB
C
Executable File
/*
|
||
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,
|
||
®Val);
|
||
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,
|
||
®155F);
|
||
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,
|
||
®1559);
|
||
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,
|
||
®155A);
|
||
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,
|
||
®1554);
|
||
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
|
||
|
||
|