Files
kunlun/plc/halphy/hw3/plc/phy_ana.c
2024-09-28 14:24:04 +08:00

952 lines
21 KiB
C

/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#include "ada_reg.h"
#include "phy_ana.h"
#include "ahb.h"
#include "hw_reg_api.h"
#include "phy_bb.h"
#include "phy_chn.h"
#include "phy_rxtd_reg.h"
#include "phy_rx_fd_reg.h"
#include "phy_dfe_reg.h"
#include "iot_io.h"
#include "hw_phy_api.h"
#include "phy_reg.h"
#include "phy_ana_reg.h"
#include "phy_agc.h"
#include "phy_ana.h"
#include "phy_ana_hw.h"
#include "phy_cal.h"
#if HW_PLATFORM > HW_PLATFORM_FPGA
#include "granite_reg.h"
#endif
extern uint32_t all_mask_gain_table[];
/* ada reg clk enable */
void enable_ada(uint32_t enable)
{
(void)enable;
return;
}
/* ada rst */
void warm_rst_ada()
{
return;
}
/* ada power on enable */
void phy_ada_enable(uint32_t enable)
{
(void)enable;
return;
}
void phy_ada_clk_ratio_cfg(uint8_t data) {
(void)data;
}
/***************************************DAC******************************************/
/* dac buf size conf */
void phy_dac_buf_size_cfg(uint32_t size)
{
(void)size;
return;
}
/* dac mux conf, 0-DA_B come from phy and DA_A come from tone, 1 reverse */
void phy_dac_mux_cfg(DA_B_PATH_CFG path)
{
(void)path;
return;
}
/* dac clk inv en conf */
void phy_dac_clk_inv_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* dac enable conf */
void phy_dac_en_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* dac mux conf */
void phy_dac_tone_mode_en_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* dac tone num conf */
void phy_dac_tone_num_cfg(uint32_t tone_num)
{
(void)tone_num;
return;
}
/***************************************ADC******************************************/
/* adc enable conf */
void phy_adc_en_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* adc mode conf */
void phy_adc_mode_cfg(ADC_MODE_CFG mode)
{
(void)mode;
return;
}
/* adc buf size conf */
void phy_adc_buf_size_cfg(uint32_t buf_size)
{
(void)buf_size;
return;
}
/* adc sample size conf */
void phy_adc_sample_size_cfg(uint32_t sample_size)
{
(void)sample_size;
return;
}
/* adc threshhold conf */
void phy_adc_thrd_cfg(uint32_t thrd)
{
(void)thrd;
return;
}
/* adc clk inv conf */
void phy_adc_clk_inv_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* adc dmsb inv conf */
void phy_adc_dmsb_inv_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* adc sample done status */
bool_t phy_adc_is_sample_done()
{
return 1;
}
/* adc trig en */
void phy_adc_trig_en_cfg(uint32_t enable)
{
(void)enable;
return;
}
/* adc trig addr */
uint32_t phy_adc_trig_addr_get()
{
uint32_t trig_offset = 0;
return trig_offset;
}
/* get ada power */
uint32_t phy_ada_get_power_on()
{
// TODO: need add.
return 0;
}
/*************************************************************************************/
/* DAC cfg */
void phy_ada_tx_cfg(DaTxPara_t *tp)
{
/*clk enable*/
enable_ada(true);
//warm_rst_ada();
/* DAC buf size */
phy_dac_buf_size_cfg(tp->buf_size);
/* DAC mux */
phy_dac_mux_cfg(tp->path);
/* DAC clk inv */
phy_dac_clk_inv_cfg(tp->inv_en);
/* dac mux conf */
phy_dac_tone_mode_en_cfg(tp->tone_mode_en);
/* dac tone num conf */
phy_dac_tone_num_cfg(tp->tone_num);
/* DAC en */
phy_dac_en_cfg(false);//mode from phy
}
/* ADC cfg */
void phy_ada_rx_cfg(DaRxPara_t *rp)
{
/*clk enable*/
enable_ada(true);
/* adc mode select */
phy_adc_mode_cfg(rp->mode);
/* ADC buf size conf */
phy_adc_buf_size_cfg(rp->buf_size);
/* ADC sample size conf */
phy_adc_sample_size_cfg(rp->sample_size);
/* ADC threshhold conf */
phy_adc_thrd_cfg(rp->thrd);
/* ADC clk inv conf */
phy_adc_clk_inv_cfg(rp->clk_inv_en);
/* ADC dmsb inv conf */
phy_adc_dmsb_inv_cfg(rp->dmsb_inv_en);
/* ADC en */
//phy_adc_en_cfg(true);
/* valid data from bit[0:9] */
phy_agc_adc_data_set(1,4);
}
void phy_ana_tx_set(bool_t tx_en, bool_t dac_en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
if (phy_tx_dac_en_flag_get()) {
// sw_tx_dac_en always enable
dac_en = 1;
}
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_TX_EN, tmp, tx_en);
REG_FIELD_SET(SW_TX_DAC_EN, tmp, dac_en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)tx_en;
(void)dac_en;
#endif
}
void phy_ana_rx_set(bool_t rx_en, bool_t adc_en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_RX_FE_EN, tmp, rx_en);
REG_FIELD_SET(SW_ADC_EN, tmp, adc_en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)rx_en;
(void)adc_en;
#endif
}
void phy_ana_sadc_enable(bool_t enable)//KL2 sadc in soc.
{
}
/* bb ana tx/rx */
void phy_ana_dfe_init(void)
{
uint32_t tmp = 0;
tmp = PHY_DFE_READ_REG(CFG_BB_ANA_TX_START_CFG_ADDR);
REG_FIELD_SET(SW_TX_START_CFG_DATA, tmp, 0x107);
PHY_DFE_WRITE_REG(CFG_BB_ANA_TX_START_CFG_ADDR, tmp);
tmp = PHY_DFE_READ_REG(CFG_BB_ANA_TX_END_CFG_ADDR);
REG_FIELD_SET(SW_TX_END_CFG_DATA, tmp, 0x107);
PHY_DFE_WRITE_REG(CFG_BB_ANA_TX_END_CFG_ADDR, tmp);
tmp = PHY_DFE_READ_REG(CFG_BB_ANA_RX_START_CFG_ADDR);
REG_FIELD_SET(SW_RX_START_CFG_DATA, tmp, 0x2f8);
PHY_DFE_WRITE_REG(CFG_BB_ANA_RX_START_CFG_ADDR, tmp);
tmp = PHY_DFE_READ_REG(CFG_BB_ANA_RX_END_CFG_ADDR);
REG_FIELD_SET(SW_RX_END_CFG_DATA, tmp, 0x2f8);
PHY_DFE_WRITE_REG(CFG_BB_ANA_RX_END_CFG_ADDR, tmp);
}
void phy_ana_set_filter_init(uint32_t band_id)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
(void)band_id;
uint32_t wdata = 0;
uint32_t tmp = 0;
uint32_t end_tone = 0;
uint32_t start_tone = 0;
/* get start tone */
tmp = PHY_READ_REG(CFG_BB_R0_B0_TONE_ADDR);
start_tone = REG_FIELD_GET(SW_RATE0_BAND0_START_TONE, tmp);
tmp = PHY_READ_REG(CFG_BB_R1_B0_TONE_ADDR);
if (start_tone > REG_FIELD_GET(SW_RATE0_BAND0_START_TONE, tmp)) {
start_tone = REG_FIELD_GET(SW_RATE0_BAND0_START_TONE, tmp);
}
if (start_tone <= 32) {
wdata = 3; /* 500k */
} else if (start_tone <= 80){
wdata = 2; /* 1m */
} else if (start_tone <= 100){
wdata = 1; /* 2m */
} else {
wdata = 0; /* 4m */
}
phy_ana_rx_fe_selc_hpf(wdata);
iot_printf("%s high pass filter set value: %d.\n", __FUNCTION__, wdata);
/* get end tone */
tmp = PHY_READ_REG(CFG_BB_R0_B0_TONE_ADDR);
end_tone = REG_FIELD_GET(SW_RATE0_BAND0_END_TONE, tmp);
tmp = PHY_READ_REG(CFG_BB_R1_B0_TONE_ADDR);
if (end_tone < REG_FIELD_GET(SW_RATE0_BAND0_END_TONE, tmp)) {
end_tone = REG_FIELD_GET(SW_RATE0_BAND0_END_TONE, tmp);
}
/* TODO: set mutiband filter */
if (end_tone <= 120) {
wdata = 42;
} else if (end_tone <= 230) {
wdata = g_phy_ctxt.dep.band_8m_cap_set > 0 ?
g_phy_ctxt.dep.band_8m_cap_set : 68;
} else if (end_tone <= 370) {
wdata = 89; /* rx safe with 12M */
} else if (end_tone <= 500) {
wdata = g_phy_ctxt.dep.band_15m_cap_set > 0
? g_phy_ctxt.dep.band_15m_cap_set : 97;
} else if (end_tone <= 743) {
wdata = g_phy_ctxt.dep.band_20m_cap_set > 0 ?
g_phy_ctxt.dep.band_20m_cap_set : 106;
} else if (end_tone <= 1000) {
wdata = 110;
} else {
wdata = 115;
}
phy_ana_rx_fe_selc_pgf_bq(wdata);
iot_printf("%s bandwidth filter set value: %d.\n", \
__FUNCTION__, wdata);
#else
(void)band_id;
#endif
}
void phy_sadc_pt_init()//KL2: sadc in soc
{
/* not support for kunlun2 */
}
void phy_ana_i2c_write(uint32_t reg_id, uint32_t wdata, uint32_t mask)
{
(void)reg_id;
(void)wdata;
(void)mask;
}
void phy_ana_i2c_read(uint32_t reg_id, uint32_t *rdata, uint8_t *rodata)
{
(void)reg_id;
(void)rdata;
(void)rodata;
}
void phy_ana_tx_comp_set(bool_t tx_en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TX_CFG_0_ADDR);
REG_FIELD_SET(SW_TX_COMPEN, tmp, tx_en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TX_CFG_0_ADDR, tmp);
#else
(void)tx_en;
#endif
}
uint32_t phy_ana_tx_pgacomp_read()
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TX_CFG_0_ADDR);
return REG_FIELD_GET(SW_TX_PGACOMP, tmp);
#else
return 0;
#endif
}
void phy_ana_tx_gpga_set(uint32_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TX_GAIN_ADDR);
REG_FIELD_SET(SW_TX_GPGA, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_pgfloop_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_CFG_0_ADDR);
REG_FIELD_SET(SW_RX_FE_PGFLOOPEN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_CFG_0_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_RX_FE_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_gpga_offset(uint32_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_PGAOFFSET, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_gpga(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_GPGA, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_bq_qvalue(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_BQ_QVALUE, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_gbq(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_GBQ, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_gpgf_offset(uint32_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_PGFOFFSET, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_gpgf(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_GPGF, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_hpfenord2_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_HPFENORD2, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_byphpf_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_FE_BYPHPF, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_pwdpgf_offset_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_CFG_0_ADDR);
REG_FIELD_SET(SW_RX_FE_PWDPGFOFFSET, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_CFG_0_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_pwdpga_offset_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_CFG_0_ADDR);
REG_FIELD_SET(SW_RX_FE_PWDPGAOFFSET, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_CFG_0_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_glna(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_GAIN_ADDR);
REG_FIELD_SET(SW_RX_GLNA, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_GAIN_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_pga_gain_set(uint32_t val)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TX_GAIN_ADDR);
REG_FIELD_SET(SW_TX_GPGA, tmp, val);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TX_GAIN_ADDR, tmp);
#else
(void)val;
#endif
}
uint32_t phy_ana_pga_gain_get(void)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
return (uint32_t)REG_FIELD_GET(SW_TX_GPGA,
PHY_ANA_READ_REG(CFG_BB_ANA_TX_GAIN_ADDR));
#else
return 3;
#endif
}
void phy_ana_tx_en(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
uint8_t sw_tx_dac_en;
if (phy_tx_dac_en_flag_get()) {
// sw_tx_dac_en always enable
sw_tx_dac_en = 1;
} else {
sw_tx_dac_en = en;
}
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_TX_EN, tmp, en);
REG_FIELD_SET(SW_TX_DAC_EN, tmp, sw_tx_dac_en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_en(bool_t en)
{
#if HW_PLATFORM == HW_PLATFORM_SILICON
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_RX_FE_EN, tmp, en);
REG_FIELD_SET(SW_ADC_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_enlic_en(uint8_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp =0 ;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ENLIC_RX, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ENLIC_TX, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_dbg_print()
{
#if HW_PLATFORM == HW_PLATFORM_SILICON
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TX_CFG_0_ADDR);
iot_printf("Analog rx0:0x%x, ", tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_CFG_0_ADDR);
iot_printf("tx6:0x%x, ", tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
iot_printf("top10:0x%x\n", tmp);
#endif
}
void phy_ana_top_tx_en(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_TX_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_rx_en(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_RX_FE_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_adc_en(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ADC_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_dac_en(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
if (phy_tx_dac_en_flag_get()) {
// sw_tx_dac_en always enable
en = 1;
}
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_TX_DAC_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_enlic_rx_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ENLIC_RX, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_enlic_tx_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ENLIC_TX, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_top_reset_n_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ADC_RESET_N, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_rx_fe_selc_hpf(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RX_CFG_0_ADDR);
REG_FIELD_SET(SW_RX_FE_SELC_HPF, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RX_CFG_0_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_rx_fe_selc_pgf_bq(uint8_t data)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_CFG0_ADDR);
/* fixed pgf filter value 109 (26.58MHz) */
REG_FIELD_SET(SW_RX_FE_PGF_SELC, tmp, 115);
REG_FIELD_SET(SW_RX_FE_BQ_SELC1, tmp, data);
REG_FIELD_SET(SW_RX_FE_BQ_SELC2, tmp, data);
PHY_ANA_WRITE_REG(CFG_BB_ANA_CFG0_ADDR, tmp);
#else
(void)data;
#endif
}
void phy_ana_adc_set(bool_t en)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_ADDR);
REG_FIELD_SET(SW_ADC_EN, tmp, en);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_ADDR, tmp);
#else
(void)en;
#endif
}
void phy_ana_bias_ic0_cfg(uint32_t value)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_BIAS_IC0_ADDR);
REG_FIELD_SET(SW_BG_IC25U_ADJ_BIT0, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_BIAS_IC0_ADDR, tmp);
#else
(void)value;
#endif
}
void phy_ana_bias_ic1_cfg(uint32_t value)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_BIAS_IC1_ADDR);
REG_FIELD_SET(SW_BG_IC25U_ADJ_BIT1, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_BIAS_IC1_ADDR, tmp);
#else
(void)value;
#endif
}
void phy_ana_bias_ir0_cfg(uint32_t value)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_BIAS_IR0_ADDR);
REG_FIELD_SET(SW_BG_IR25U_ADJ_BIT0, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_BIAS_IR0_ADDR, tmp);
#else
(void)value;
#endif
}
void phy_ana_bias_ir1_cfg(uint32_t value)
{
#if HW_PLATFORM > HW_PLATFORM_FPGA
uint32_t tmp = 0;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_BIAS_IR1_ADDR);
REG_FIELD_SET(SW_BG_IR25U_ADJ_BIT1, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_BIAS_IR1_ADDR, tmp);
#else
(void)value;
#endif
}
void phy_ana_hw_en_bitmap(uint32_t value)
{
uint32_t tmp;
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TOP_HWEN_ADDR);
REG_FIELD_SET(SW_TOP_HW_EN, tmp, value);
if (phy_tx_dac_en_flag_get()) {
// sw_tx_dac_en always sw ctrl
REG_FIELD_SET(SW_TX_DAC_EN_HW_EN, tmp, 0);
}
PHY_ANA_WRITE_REG(CFG_BB_ANA_TOP_HWEN_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_RXGAIN_HWEN_ADDR);
REG_FIELD_SET(SW_RXGAIN_HW_EN, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_RXGAIN_HWEN_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_TXGAIN_HWEN_ADDR);
REG_FIELD_SET(SW_TXGAIN_HW_EN, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_TXGAIN_HWEN_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_EXT0_HWEN_ADDR);
REG_FIELD_SET(SW_EXT0_HW_EN, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_EXT0_HWEN_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_EXT1_HWEN_ADDR);
REG_FIELD_SET(SW_EXT1_HW_EN, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_EXT1_HWEN_ADDR, tmp);
tmp = PHY_ANA_READ_REG(CFG_BB_ANA_EXT2_HWEN_ADDR);
REG_FIELD_SET(SW_EXT2_HW_EN, tmp, value);
PHY_ANA_WRITE_REG(CFG_BB_ANA_EXT2_HWEN_ADDR, tmp);
}
void phy_ana_filter_set(uint8_t val)
{
/* TODO: update as soon as possible */
}
/* get the gain table */
void phy_pgf_bq_pga_gain_get(uint16_t gain_idx, \
volatile uint8_t *pgf, \
volatile uint8_t *bq, \
volatile uint8_t *pga, \
volatile uint8_t *lna, \
volatile uint8_t *byphpf, \
volatile uint8_t *enord2, \
volatile uint8_t *bq_qvalue)
{
#if HW_PLATFORM >= HW_PLATFORM_FPGA
uint32_t tmp = 0;
IOT_ASSERT(gain_idx < 170);
tmp = all_mask_gain_table[gain_idx];
*pgf = REG_FIELD_GET(SW_RX_FE_GPGF, tmp);
*bq = REG_FIELD_GET(SW_RX_FE_GBQ, tmp );
*pga = REG_FIELD_GET(SW_RX_FE_GPGA, tmp);
*lna = REG_FIELD_GET(SW_RX_GLNA , tmp);
*byphpf = REG_FIELD_GET(SW_RX_FE_BYPHPF, tmp);
*enord2 = REG_FIELD_GET(SW_RX_FE_HPFENORD2, tmp);
*bq_qvalue = REG_FIELD_GET(SW_RX_BQ_QVALUE, tmp);
#else
(void)gain_idx;
(void)pgf;
(void)bq;
(void)pga;
(void)lna;
(void)byphpf;
(void)enord2;
(void)bq_qvalue;
#endif
}