496 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			496 lines
		
	
	
		
			13 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 "phy_rf_init.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_board_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_errno_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_oem_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_system.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cal_data.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rf_chn.h"
							 | 
						||
| 
								 | 
							
								#include "ahb.h"
							 | 
						||
| 
								 | 
							
								#include "gpio_mtx.h"
							 | 
						||
| 
								 | 
							
								#include "plc_const.h"
							 | 
						||
| 
								 | 
							
								#include "phy_txrx_pwr.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "iot_efuse.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (HPLC_RF_DEV_SUPPORT && (HW_PLATFORM != HW_PLATFORM_SIMU))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "rfplc_reg_base.h"
							 | 
						||
| 
								 | 
							
								#include "wphy_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_sys_reg.h"
							 | 
						||
| 
								 | 
							
								#include "wphy_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rf_isr.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rf_common_hw.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rf_chn.h"
							 | 
						||
| 
								 | 
							
								#include "rf_hw_tonemap.h"
							 | 
						||
| 
								 | 
							
								#include "gpio_mtx.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint32_t phy_rf_wait_bbcpu_ready()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#define WAIT_READY_TIMEOUT  37500000  // 1.5S * 1000 * 25
							 | 
						||
| 
								 | 
							
								    uint32_t start_ntb, cur_ntb, time_span;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait bbcpu ready */
							 | 
						||
| 
								 | 
							
								    start_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        cur_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								        time_span = cur_ntb - start_ntb;
							 | 
						||
| 
								 | 
							
								    } while (!mac_rf_get_bbcpu_sts() && time_span < WAIT_READY_TIMEOUT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!mac_rf_get_bbcpu_sts()) {
							 | 
						||
| 
								 | 
							
								        iot_printf("bbcpu init fail!\n");
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        return 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_load_cal_cfg(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    uint8_t  i;
							 | 
						||
| 
								 | 
							
								    uint8_t  bw_sel_en;
							 | 
						||
| 
								 | 
							
								    uint16_t  special_tx_lvdos = 300;
							 | 
						||
| 
								 | 
							
								    uint16_t  special_tx_scale = 0x80;
							 | 
						||
| 
								 | 
							
								    uint16_t bw_sel;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_rf_ver_phy_txiqm_t *cal_iqm;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_rf_phy_txf_t *cal_txf;
							 | 
						||
| 
								 | 
							
								    uint8_t tx_i_mag, tx_q_mag, tx_i_phase, tx_q_phase;
							 | 
						||
| 
								 | 
							
								    int8_t tx_i_dc, tx_q_dc;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_rf_phy_txiqm_cali(&cal_iqm);
							 | 
						||
| 
								 | 
							
								    mac_rf_set_tx_special_ldovs(special_tx_lvdos);
							 | 
						||
| 
								 | 
							
								    mac_rf_set_tx_special_scale(special_tx_scale);
							 | 
						||
| 
								 | 
							
								    if (ret == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_dc_cali((uint8_t)cal_iqm->tx_i_dc,
							 | 
						||
| 
								 | 
							
								            (uint8_t)cal_iqm->tx_q_dc);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqm_cali(cal_iqm->tx_i_mag, cal_iqm->tx_q_mag);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqp_cali(cal_iqm->tx_i_phase, cal_iqm->tx_q_phase);
							 | 
						||
| 
								 | 
							
								        if (phy_rf_check_rf_version(cal_iqm->rf_ver)) {
							 | 
						||
| 
								 | 
							
								            mac_rf_set_rf_ver(cal_iqm->rf_ver);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        iot_printf("%s ok, src:flash, tx_i_dc:%d, tx_q_dc:%d, tx_i_mag:%lu, "
							 | 
						||
| 
								 | 
							
								            "tx_q_mag:%lu, tx_i_phase:%lu, tx_q_phase: %lu, rf_ver:%d\n",
							 | 
						||
| 
								 | 
							
								            __FUNCTION__, cal_iqm->tx_i_dc, cal_iqm->tx_q_dc, cal_iqm->tx_i_mag,
							 | 
						||
| 
								 | 
							
								            cal_iqm->tx_q_mag, cal_iqm->tx_i_phase, cal_iqm->tx_q_phase,
							 | 
						||
| 
								 | 
							
								            cal_iqm->rf_ver);
							 | 
						||
| 
								 | 
							
								        goto next_1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    ret = iot_efuse_get_rf_tx_iqm_dc_calib_info(&tx_i_mag, &tx_q_mag,
							 | 
						||
| 
								 | 
							
								        &tx_i_phase, &tx_q_phase, &tx_i_dc, &tx_q_dc);
							 | 
						||
| 
								 | 
							
								    if (ret == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_dc_cali((uint8_t)tx_i_dc, (uint8_t)tx_q_dc);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqm_cali(tx_i_mag, tx_q_mag);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqp_cali(tx_i_phase, tx_q_phase);
							 | 
						||
| 
								 | 
							
								        iot_printf("%s ok src:efuse, tx_i_dc:%d, tx_q_dc:%d, tx_i_mag:%lu, "
							 | 
						||
| 
								 | 
							
								            "tx_q_mag:%lu, tx_i_phase:%lu, tx_q_phase: %lu, rf_ver:%d\n",
							 | 
						||
| 
								 | 
							
								            __FUNCTION__, tx_i_dc, tx_q_dc, tx_i_mag, tx_q_mag,
							 | 
						||
| 
								 | 
							
								            tx_i_phase, tx_q_phase, RF_VER_3);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_dc_cali(0, 0);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqm_cali(0, 0);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_iqp_cali(0, 0);
							 | 
						||
| 
								 | 
							
								        iot_printf("%s tx iqm fail...\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								next_1:
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_rf_phy_txf_cali(&cal_txf);
							 | 
						||
| 
								 | 
							
								    if (ret == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        for (i = RF_OPTION_1; i <= RF_OPTION_MAX; i++) {
							 | 
						||
| 
								 | 
							
								            if (cal_txf->valid_mask & (1 << (i - 1))) {
							 | 
						||
| 
								 | 
							
								                bw_sel_en = 1;
							 | 
						||
| 
								 | 
							
								                bw_sel = cal_txf->bw_sel_value[i - 1];
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                bw_sel_en = 0;
							 | 
						||
| 
								 | 
							
								                bw_sel = 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            mac_rf_set_tx_filter_cali(i, bw_sel_en, bw_sel);
							 | 
						||
| 
								 | 
							
								            iot_printf("%s ok, option %lu, en %lu, bw_sel %lu\n",
							 | 
						||
| 
								 | 
							
								                __FUNCTION__, i, bw_sel_en, bw_sel);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_filter_cali(RF_OPTION_1, 0, 0);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_filter_cali(RF_OPTION_2, 0, 0);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_tx_filter_cali(RF_OPTION_3, 0, 0);
							 | 
						||
| 
								 | 
							
								        iot_printf("%s tx txf fail...\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* set user type */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_user_type(iot_oem_get_user_type());
							 | 
						||
| 
								 | 
							
								    /* apply oem ppm to rf */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_wphy_ppm(-phy_get_cal_ppm_in_pib() << PLC_NTB_PPM_SHIFT);
							 | 
						||
| 
								 | 
							
								    if (iot_oem_get_module_type() != MODULE_TYPE_CCO) {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_sta_sel(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* TODO:
							 | 
						||
| 
								 | 
							
								     * load rx iqm calibration data from efuse */
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* indicate if the first init rf phy or not */
							 | 
						||
| 
								 | 
							
								static uint8_t phy_rf_first_init = 1;
							 | 
						||
| 
								 | 
							
								/* record phy rf start ntb */
							 | 
						||
| 
								 | 
							
								static uint32_t phy_rf_start_ntb;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_wait_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#define SET_OPTION_TIMEOUT  25000000  // 1S * 1000 * 25
							 | 
						||
| 
								 | 
							
								    uint32_t cur_ntb, time_span;
							 | 
						||
| 
								 | 
							
								    /* wait set option complete */
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        cur_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								        time_span = cur_ntb - phy_rf_start_ntb;
							 | 
						||
| 
								 | 
							
								    } while (mac_rf_get_option_sts() && time_span < SET_OPTION_TIMEOUT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (mac_rf_get_option_sts()) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s, set option fail\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_in_check(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t chip_id;
							 | 
						||
| 
								 | 
							
								    chip_id = iot_efuse_get_chip_id();
							 | 
						||
| 
								 | 
							
								    switch (chip_id) {
							 | 
						||
| 
								 | 
							
								    case CHIP_ID_HZ3201_RF_V1A:
							 | 
						||
| 
								 | 
							
								    case CHIP_ID_HZ3211_RF_V1A:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_rf_in(1);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_rf_in(0);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_init(uint32_t proto, uint32_t option, uint32_t channel,
							 | 
						||
| 
								 | 
							
								    uint32_t sync_init, uint32_t auto_rxdc, uint32_t auto_txdc)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(option < PHY_RF_OPTION_MAX && proto <= PLC_PROTO_TYPE_RAWDATA);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint32_t cert_flag = 0, cert_mode = 0, flag16com = 0, rf_ver = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t rx_cali_flag = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t rx_dc_i = 0, rx_dc_q = 0, tx_dc_i, tx_dc_q;
							 | 
						||
| 
								 | 
							
								    int8_t tx_power = RF_TX_PWR_INVALID;
							 | 
						||
| 
								 | 
							
								    uint8_t rf_in = 0;
							 | 
						||
| 
								 | 
							
								    /* if not the first time to init rf phy */
							 | 
						||
| 
								 | 
							
								    if (!phy_rf_first_init) {
							 | 
						||
| 
								 | 
							
								        /* restore cert config */
							 | 
						||
| 
								 | 
							
								        cert_flag = mac_rf_get_cert_flag();
							 | 
						||
| 
								 | 
							
								        cert_mode = mac_rf_get_cert_mode();
							 | 
						||
| 
								 | 
							
								        flag16com = mac_rf_get_cert_16qam_flag();
							 | 
						||
| 
								 | 
							
								        rf_in = mac_rf_is_rf_in();
							 | 
						||
| 
								 | 
							
								        if (mac_rf_get_target_tx_power(&tx_power)) {
							 | 
						||
| 
								 | 
							
								            /* if not init tx power, set default power */
							 | 
						||
| 
								 | 
							
								            phy_rf_get_power(NULL, NULL, &tx_power, NULL);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        rf_ver = mac_rf_get_rf_ver();
							 | 
						||
| 
								 | 
							
								        /* restore rx dc configration */
							 | 
						||
| 
								 | 
							
								        rx_cali_flag = mac_rf_get_rx_dc_loopback_clibr_flag();
							 | 
						||
| 
								 | 
							
								        mac_rf_get_auto_rxdc_iq_value(&rx_dc_i, &rx_dc_q);
							 | 
						||
| 
								 | 
							
								        mac_rf_get_tx_dc_cali(&tx_dc_i, &tx_dc_q);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* ahb init and reset */
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_reg_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_enable();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_reg_enable();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_reset();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_reg_reset();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_reg_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_ana_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_enable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_reg_enable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_ana_enable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_reset();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_reg_reset();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_ana_reset();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable wmac */
							 | 
						||
| 
								 | 
							
								    mac_rf_use_wmac_enable(HPLC_RF_WMAC_ENABLE);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (IOT_DTEST_ONLY_SUPPORT != 1)
							 | 
						||
| 
								 | 
							
								    /* get rf spi */
							 | 
						||
| 
								 | 
							
								    uint8_t clk = iot_board_get_gpio(GPIO_SPI_RF_CLK);
							 | 
						||
| 
								 | 
							
								    uint8_t cs = iot_board_get_gpio(GPIO_SPI_RF_CS);
							 | 
						||
| 
								 | 
							
								    uint8_t miso = iot_board_get_gpio(GPIO_SPI_RF_MISO);
							 | 
						||
| 
								 | 
							
								    uint8_t mosi = iot_board_get_gpio(GPIO_SPI_RF_MOSI);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    /* rf mac dtest */
							 | 
						||
| 
								 | 
							
								#if HW_PLATFORM == HW_PLATFORM_FPGA
							 | 
						||
| 
								 | 
							
								    uint8_t clk = 9;
							 | 
						||
| 
								 | 
							
								    uint8_t cs = 12;
							 | 
						||
| 
								 | 
							
								    uint8_t miso = 11;
							 | 
						||
| 
								 | 
							
								    uint8_t mosi = 10;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    uint8_t clk = 12;
							 | 
						||
| 
								 | 
							
								    uint8_t cs = 9;
							 | 
						||
| 
								 | 
							
								    uint8_t miso = 10;
							 | 
						||
| 
								 | 
							
								    uint8_t mosi = 11;
							 | 
						||
| 
								 | 
							
								    for (uint32_t wphy_gpio = 42; wphy_gpio < 60; wphy_gpio++) {
							 | 
						||
| 
								 | 
							
								        gpio_pin_select(wphy_gpio, 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    /* init rf spi gpio */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_spi_gpio(clk, cs, mosi, miso);
							 | 
						||
| 
								 | 
							
								    /* load rf calibration config */
							 | 
						||
| 
								 | 
							
								    phy_rf_load_cal_cfg();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!phy_rf_first_init) {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_rf_ver(rf_ver);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_rf_in(rf_in);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        phy_rf_in_check();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* config band select */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_band_sel(phy_rf_get_band_sel());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* bbcpu start */
							 | 
						||
| 
								 | 
							
								    extern int bb_cpu_start();
							 | 
						||
| 
								 | 
							
								    bb_cpu_start();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!phy_rf_wait_bbcpu_ready()) {
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (HPLC_RF_SUPPORT_AUTO_CALIBR_TX_DC) {
							 | 
						||
| 
								 | 
							
								        if (!auto_txdc && !phy_rf_first_init) {
							 | 
						||
| 
								 | 
							
								            mac_rf_set_tx_dc_loopback_clibr_en(0);
							 | 
						||
| 
								 | 
							
								            mac_rf_set_tx_dc_cali(tx_dc_i, tx_dc_q);
							 | 
						||
| 
								 | 
							
								        } else if (auto_txdc) {
							 | 
						||
| 
								 | 
							
								            mac_rf_set_tx_dc_loopback_clibr_en(1);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* recover record value */
							 | 
						||
| 
								 | 
							
								    if (phy_rf_first_init) {
							 | 
						||
| 
								 | 
							
								        /* is first time to init rf */
							 | 
						||
| 
								 | 
							
								        phy_rf_set_init_power();
							 | 
						||
| 
								 | 
							
								        phy_rf_first_init = 0;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        /* recover cert config */
							 | 
						||
| 
								 | 
							
								        mac_rf_set_cert_flag(cert_flag);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_cert_mode(cert_mode);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_cert_16qam_flag(flag16com);
							 | 
						||
| 
								 | 
							
								        mac_rf_set_target_tx_power(tx_power);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* auto clibration enable or not */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_rx_dc_loopback_clibr_en(HPLC_RF_SUPPORT_AUTO_CALIBR_RX_DC);
							 | 
						||
| 
								 | 
							
								    if (rx_cali_flag) {
							 | 
						||
| 
								 | 
							
								        if (auto_rxdc) {
							 | 
						||
| 
								 | 
							
								            mac_rf_set_rx_dc_loopback_clibr_flag(0);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            mac_rf_set_rx_dc_loopback_clibr_flag(1);
							 | 
						||
| 
								 | 
							
								            mac_rf_set_auto_rxdc_iq_value(rx_dc_i, rx_dc_q);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } else if (!auto_rxdc) {
							 | 
						||
| 
								 | 
							
								        mac_rf_set_rx_dc_loopback_clibr_en(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* fl init */
							 | 
						||
| 
								 | 
							
								    phy_rf_fl_init(option);
							 | 
						||
| 
								 | 
							
								    /* first set channel */
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(channel < phy_rf_get_channel_id_max(option));
							 | 
						||
| 
								 | 
							
								    /* set proto */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_proto(proto);
							 | 
						||
| 
								 | 
							
								    /* set channel */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_tobe_channel_id(channel);
							 | 
						||
| 
								 | 
							
								    /* set option */
							 | 
						||
| 
								 | 
							
								    mac_rf_set_option(option);
							 | 
						||
| 
								 | 
							
								    mac_rf_set_sw_irq_to_bbcpu(RF_MAC_SW_ISR_BB_INIT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_rf_start_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (sync_init) {
							 | 
						||
| 
								 | 
							
								        phy_rf_wait_init();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_deinit(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* bbcpu stop */
							 | 
						||
| 
								 | 
							
								    extern int bb_cpu_stop();
							 | 
						||
| 
								 | 
							
								    bb_cpu_stop();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* ahb init and reset */
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfmac_reg_disable();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_phy_reg_disable();
							 | 
						||
| 
								 | 
							
								    ahb_rfplc_ana_disable();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t phy_rf_is_run(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    extern uint8_t bb_cpu_is_run();
							 | 
						||
| 
								 | 
							
								    return bb_cpu_is_run();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_channel(uint8_t channel)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#define SET_CHANNEL_TIMEOUT  25000000  // 1S * 1000 * 25
							 | 
						||
| 
								 | 
							
								    uint32_t start_ntb, cur_ntb, time_span;
							 | 
						||
| 
								 | 
							
								    uint32_t option = mac_rf_get_option();
							 | 
						||
| 
								 | 
							
								    uint32_t channel_max = phy_rf_get_channel_id_max(option);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(channel < channel_max);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_rf_set_tobe_channel_id(channel);
							 | 
						||
| 
								 | 
							
								    mac_rf_set_sw_irq_to_bbcpu(RF_MAC_SW_ISR_SET_CHANNEL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* wait set channel complete */
							 | 
						||
| 
								 | 
							
								    start_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        cur_ntb = RGF_MAC_READ_REG(CFG_RD_LOCAL_TMR_ADDR);
							 | 
						||
| 
								 | 
							
								        time_span = cur_ntb - start_ntb;
							 | 
						||
| 
								 | 
							
								    } while (mac_rf_get_channel_sts() && time_span < SET_CHANNEL_TIMEOUT);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (mac_rf_get_channel_sts()) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s, set channel fail\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_reset()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // TODO: SOC supply register to hard reset phy.
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_new_cfg_apply()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* rf phy init, plc cpu and bbcpu async init, rf rxdc enable */
							 | 
						||
| 
								 | 
							
								    phy_rf_init(phy_proto_type_get(), mac_rf_get_option(),
							 | 
						||
| 
								 | 
							
								        mac_rf_get_tobe_set_channel_id(), 1, 0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* rf isr init */
							 | 
						||
| 
								 | 
							
								    mac_rf_isr_init(mac_rf_get_dsr_callback());
							 | 
						||
| 
								 | 
							
								    /* init rf pdev */
							 | 
						||
| 
								 | 
							
								    extern uint32_t mac_rf_pdev_init(pdevid_t pdev_id);
							 | 
						||
| 
								 | 
							
								    mac_rf_pdev_init(RF_PDEV_ID);
							 | 
						||
| 
								 | 
							
								    /* start isr */
							 | 
						||
| 
								 | 
							
								    mac_rf_isr_start();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_record_dbg_cnt()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* recover dbg cnt */
							 | 
						||
| 
								 | 
							
								    mac_rf_record_dbg_cnt();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_recover_dbg_cnt()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* recover dbg cnt */
							 | 
						||
| 
								 | 
							
								    mac_rf_recover_dbg_cnt();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_ps_idle(uint32_t ps_on)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    mac_rf_set_bb_ps_idle(ps_on);
							 | 
						||
| 
								 | 
							
								    mac_rf_set_sw_irq_to_bbcpu(RF_MAC_SW_ISR_SET_PS_IDLE);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_init_power()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t power = RF_TX_PWR_INVALID;
							 | 
						||
| 
								 | 
							
								    int8_t def_pwr, full_pwr;
							 | 
						||
| 
								 | 
							
								    phy_rf_get_power(NULL, NULL, &def_pwr, &full_pwr);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!phy_get_pwr_ctl_en()) {
							 | 
						||
| 
								 | 
							
								        /* LP */
							 | 
						||
| 
								 | 
							
								        power = def_pwr;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        /* FULL POWER */
							 | 
						||
| 
								 | 
							
								        power = full_pwr;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_rf_set_target_tx_power(power);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* (HPLC_RF_DEV_SUPPORT && (HW_PLATFORM != HW_PLATFORM_SIMU)) */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_wait_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_init(uint32_t proto, uint32_t option, uint32_t channel,
							 | 
						||
| 
								 | 
							
								    uint32_t sync_init, uint32_t auto_rxdc, uint32_t auto_txdc)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)proto;
							 | 
						||
| 
								 | 
							
								    (void)option;
							 | 
						||
| 
								 | 
							
								    (void)channel;
							 | 
						||
| 
								 | 
							
								    (void)sync_init;
							 | 
						||
| 
								 | 
							
								    (void)auto_rxdc;
							 | 
						||
| 
								 | 
							
								    (void)auto_txdc;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_deinit()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_channel(uint8_t channel)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)channel;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_reset()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_new_cfg_apply()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_recover_dbg_cnt()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_record_dbg_cnt()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_load_cal_cfg(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_ps_idle(uint32_t ps_on)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)ps_on;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_set_init_power()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_in_check(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* (HPLC_RF_DEV_SUPPORT && (HW_PLATFORM != HW_PLATFORM_SIMU)) */
							 |