680 lines
20 KiB
C
680 lines
20 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 "hw_phy_init.h"
|
|
#include "hw_tonemask.h"
|
|
#include "phy_ana.h"
|
|
#include "plc_fr.h"
|
|
#if HW_PLATFORM > HW_PLATFORM_SIMU
|
|
#include "dbg_io.h"
|
|
#endif
|
|
#include "plc_utils.h"
|
|
#include "phy_bb.h"
|
|
#include "hw_desc.h"
|
|
#include "hw_gain_table.h"
|
|
#include "mac_sys_reg.h"
|
|
#include "hw_reg_api.h"
|
|
#include "phy_reg.h"
|
|
#include "iot_io_api.h"
|
|
#include "plc_protocol.h"
|
|
#include "gpio_mtx.h"
|
|
#include "phy_cal.h"
|
|
#include "phy_dfe_reg.h"
|
|
#include "iot_errno_api.h"
|
|
#include "iot_share_task.h"
|
|
#include "hw_phy_api.h"
|
|
#include "phy_isr.h"
|
|
#include "phy_nf.h"
|
|
#include "phy_pm.h"
|
|
#include "phy_status.h"
|
|
#include "phy_overstress.h"
|
|
#include "phy_cfg.h"
|
|
#include "phy_mix.h"
|
|
#include "phy_txrx_pwr.h"
|
|
#include "iot_config.h"
|
|
#include "phy_phase.h"
|
|
#include "clk.h"
|
|
#include "phy_chn.h"
|
|
#include "phy_data_ckb.h"
|
|
#include "iot_cli.h"
|
|
#include "iot_system.h"
|
|
#include "phy_geode_gpio.h"
|
|
#include "phy_temperature.h"
|
|
#include "iot_clock.h"
|
|
#include "os_utils.h"
|
|
#include "iot_gpio_api.h"
|
|
#include "iot_board_api.h"
|
|
|
|
/* load band table by default */
|
|
void phy_tone_band_init(uint32_t mac_typ)
|
|
{
|
|
/* multi band from default tbl */
|
|
phy_rate_band_set(0, HW_FULL_BAND,
|
|
all_mask_band_table_r0_full.fc_sym_num,
|
|
all_mask_band_table_r0_full.start_tone,
|
|
all_mask_band_table_r0_full.end_tone);
|
|
phy_rate_band_set(0, HW_LOW_BAND,
|
|
all_mask_band_table_r0_low.fc_sym_num,
|
|
all_mask_band_table_r0_low.start_tone,
|
|
all_mask_band_table_r0_low.end_tone);
|
|
phy_rate_band_set(0, HW_HIGH_BAND,
|
|
all_mask_band_table_r0_high.fc_sym_num,
|
|
all_mask_band_table_r0_high.start_tone,
|
|
all_mask_band_table_r0_high.end_tone);
|
|
phy_rate_band_set(1, HW_FULL_BAND,
|
|
all_mask_band_table_r1_full.fc_sym_num,
|
|
all_mask_band_table_r1_full.start_tone,
|
|
all_mask_band_table_r1_full.end_tone);
|
|
phy_rate_band_set(1, HW_LOW_BAND,
|
|
all_mask_band_table_r1_low.fc_sym_num,
|
|
all_mask_band_table_r1_low.start_tone,
|
|
all_mask_band_table_r1_low.end_tone);
|
|
phy_rate_band_set(1, HW_HIGH_BAND,
|
|
all_mask_band_table_r1_high.fc_sym_num,
|
|
all_mask_band_table_r1_high.start_tone,
|
|
all_mask_band_table_r1_high.end_tone);
|
|
|
|
phy_vld_tone_num_set(0, HW_FULL_BAND,
|
|
all_mask_band_table_r0_full.valid_tone_number);
|
|
phy_vld_tone_num_set(0, HW_LOW_BAND,
|
|
all_mask_band_table_r0_low.valid_tone_number);
|
|
phy_vld_tone_num_set(0, HW_HIGH_BAND,
|
|
all_mask_band_table_r0_high.valid_tone_number);
|
|
phy_vld_tone_num_set(1, HW_FULL_BAND,
|
|
all_mask_band_table_r1_full.valid_tone_number);
|
|
phy_vld_tone_num_set(1, HW_LOW_BAND,
|
|
all_mask_band_table_r1_low.valid_tone_number);
|
|
phy_vld_tone_num_set(1, HW_HIGH_BAND,
|
|
all_mask_band_table_r1_high.valid_tone_number);
|
|
|
|
if(mac_typ == PLC_PROTO_TYPE_SG)
|
|
{
|
|
/* short band for mix mode*/
|
|
phy_short_band_set(1, 80, 743);
|
|
phy_short_vld_tone_num_set(664);
|
|
}
|
|
}
|
|
|
|
/* config start/end/valid tone and fc num */
|
|
void phy_band_init(uint32_t mac_typ, uint32_t band_id)
|
|
{
|
|
phy_tone_band_init(mac_typ);
|
|
(void)band_id;
|
|
}
|
|
|
|
/* keep sync the old version, maybe delete later */
|
|
void phy_band_tbl_load(plc_band_table_t *table)
|
|
{
|
|
#if HW_PLATFORM != HW_PLATFORM_SIMU
|
|
if (!table) {
|
|
return;
|
|
}
|
|
/* write the band table into reg */
|
|
RGF_MAC_WRITE_REG(CFG_BAND_PTR_ADDR, (uint32_t)table);
|
|
#else
|
|
(void)table;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
uint32_t phy_start_end_tone_get(
|
|
uint32_t mac_proto,
|
|
uint32_t range_id,
|
|
uint32_t band_id,
|
|
plc_tone_mask_id mask_id,
|
|
uint16_t *band_start_tone,
|
|
uint16_t *band_end_tone,
|
|
uint8_t *fc_sym)
|
|
{
|
|
uint32_t ret = ERR_OK;
|
|
uint16_t valid_tone_num = 0;
|
|
|
|
/* get band info */
|
|
ret = phy_band_info_get_by_id(
|
|
mac_proto,
|
|
range_id,
|
|
band_id,
|
|
&valid_tone_num,
|
|
fc_sym,
|
|
band_start_tone,
|
|
band_end_tone);
|
|
|
|
/* check tone mask id */
|
|
if (range_id == IOT_SUPPORT_PROTO_GP_BAND) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_GP && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
} else if (range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND) {
|
|
if (band_id == IOT_SUPPORT_TONE_80_490) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_SG0 && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
} else if (band_id == IOT_SUPPORT_TONE_100_230) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_SG1 && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
} else if (band_id == IOT_SUPPORT_TONE_32_120) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_SG2 && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
} else if (band_id == IOT_SUPPORT_TONE_72_120) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_SG3 && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
} else if (band_id == IOT_SUPPORT_TONE_200_1000) {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_CUS && mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
}
|
|
} else {
|
|
/* check mask id for each band id */
|
|
if (mask_id != TONE_MASK_ID_SG0 && mask_id != TONE_MASK_ID_SG1 &&
|
|
mask_id != TONE_MASK_ID_NULL) {
|
|
ret = ERR_FAIL;
|
|
}
|
|
}
|
|
|
|
/* check valid */
|
|
if(ret != ERR_OK) {
|
|
*band_start_tone = 0;
|
|
*band_end_tone = 0;
|
|
iot_printf("%s: tome mask id not exit, use default!\n", __FUNCTION__);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t phy_band_tbl_init(const plc_tonemask_table *tone_msk_ptr,
|
|
uint32_t band_start_tone, uint32_t band_end_tone, uint32_t fc_sym)
|
|
{
|
|
if (band_start_tone == 0 || band_end_tone == 0) {
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r0_full, HW_FULL_BAND,
|
|
tone_msk_ptr, all_mask_band_table_r0_full.fc_sym_num,
|
|
all_mask_band_table_r0_full.start_tone,
|
|
all_mask_band_table_r0_full.end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r0_low, HW_LOW_BAND, tone_msk_ptr,
|
|
all_mask_band_table_r0_low.fc_sym_num,
|
|
all_mask_band_table_r0_low.start_tone,
|
|
all_mask_band_table_r0_low.end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r0_high, HW_HIGH_BAND,
|
|
tone_msk_ptr, all_mask_band_table_r0_high.fc_sym_num,
|
|
all_mask_band_table_r0_high.start_tone,
|
|
all_mask_band_table_r0_high.end_tone);
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r1_full, HW_FULL_BAND,
|
|
tone_msk_ptr, all_mask_band_table_r1_full.fc_sym_num,
|
|
all_mask_band_table_r1_full.start_tone,
|
|
all_mask_band_table_r1_full.end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r1_low, HW_LOW_BAND, tone_msk_ptr,
|
|
all_mask_band_table_r1_low.fc_sym_num,
|
|
all_mask_band_table_r1_low.start_tone,
|
|
all_mask_band_table_r1_low.end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r1_high, HW_HIGH_BAND,
|
|
tone_msk_ptr, all_mask_band_table_r1_high.fc_sym_num,
|
|
all_mask_band_table_r1_high.start_tone,
|
|
all_mask_band_table_r1_high.end_tone);
|
|
} else {
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r0_full, HW_FULL_BAND,
|
|
tone_msk_ptr, fc_sym, band_start_tone, band_end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r0_low, HW_LOW_BAND, tone_msk_ptr,
|
|
fc_sym, band_start_tone, band_end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r0_high, HW_HIGH_BAND,
|
|
tone_msk_ptr, fc_sym, band_start_tone, band_end_tone);
|
|
/* full band */
|
|
init_band_table(&all_mask_band_table_r1_full, HW_FULL_BAND,
|
|
tone_msk_ptr, fc_sym, band_start_tone, band_end_tone);
|
|
/* low band */
|
|
init_band_table(&all_mask_band_table_r1_low, HW_LOW_BAND, tone_msk_ptr,
|
|
fc_sym, band_start_tone, band_end_tone);
|
|
/* high band */
|
|
init_band_table(&all_mask_band_table_r1_high, HW_HIGH_BAND,
|
|
tone_msk_ptr, fc_sym, band_start_tone, band_end_tone);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* load range table to band table */
|
|
void phy_multi_band_tbl_update(uint32_t range_id, uint32_t band_id)
|
|
{
|
|
const plc_phy_band_table_t *band_tab;
|
|
/* SR config */
|
|
if (range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND) {
|
|
phy_get_plc_nsg_band_tab_info(&band_tab);
|
|
#if SUPPORT_SOUTHERN_POWER_GRID
|
|
if (IOT_SUPPORT_TONE_MULTI_BAND021 == band_id) {
|
|
all_mask_band_table_r0_full = band_tab[2].band_info;
|
|
all_mask_band_table_r0_low = band_tab[2].band_info;
|
|
all_mask_band_table_r0_high = band_tab[1].band_info;
|
|
} else {
|
|
/* must specail multiband */
|
|
IOT_ASSERT(0);
|
|
}
|
|
#elif SUPPORT_SMART_GRID
|
|
if (IOT_SUPPORT_TONE_MULTI_BAND021 == band_id) {
|
|
all_mask_band_table_r0_full = band_tab[0].band_info;
|
|
all_mask_band_table_r0_low = band_tab[2].band_info;
|
|
all_mask_band_table_r0_high = band_tab[1].band_info;
|
|
} else {
|
|
/* must specail multiband */
|
|
IOT_ASSERT(0);
|
|
}
|
|
#endif
|
|
} else if (range_id == IOT_SUPPORT_PROTO_GP_BAND) {
|
|
phy_get_plc_gp_band_tab_info(&band_tab);
|
|
// TODO: maybe use SUPPORT_GREEN_PHY manage the code
|
|
all_mask_band_table_r0_full = band_tab[0].band_info;
|
|
all_mask_band_table_r0_low = band_tab[1].band_info;
|
|
/* gp only has 2 bands used, to prevent array index out of bounds */
|
|
all_mask_band_table_r0_high = band_tab[1].band_info;
|
|
|
|
} else {
|
|
(void)band_id;
|
|
IOT_ASSERT(0);
|
|
}
|
|
}
|
|
|
|
void phy_band_info_update(uint32_t mac_proto,
|
|
uint32_t range_id,
|
|
uint32_t band_id,
|
|
plc_tone_mask_id mask_id)
|
|
{
|
|
uint16_t band_start_tone = 0;
|
|
uint16_t band_end_tone = 0;
|
|
uint8_t fc_sym = 0;
|
|
const plc_tonemask_table *tone_msk_ptr = NULL;
|
|
|
|
/* update glb config */
|
|
phy_proto_type_set(mac_proto);
|
|
phy_band_id_set(band_id);
|
|
phy_mask_id_set(mask_id);
|
|
|
|
/* get tone */
|
|
if(band_id >= IOT_SUPPORT_TONE_MULTI_BAND021) {
|
|
/* update all band */
|
|
phy_multi_band_tbl_update(range_id, band_id);
|
|
} else {
|
|
phy_start_end_tone_get(
|
|
mac_proto,
|
|
range_id,
|
|
band_id,
|
|
mask_id,
|
|
&band_start_tone,
|
|
&band_end_tone,
|
|
&fc_sym);
|
|
}
|
|
|
|
/* mask id */
|
|
tone_msk_ptr = phy_tone_mask_ptr_get(mask_id);
|
|
|
|
/* phy band init */
|
|
phy_band_tbl_init(tone_msk_ptr, band_start_tone, band_end_tone, fc_sym);
|
|
|
|
/* band reg init */
|
|
phy_band_init(mac_proto, band_id);
|
|
|
|
/* new sg support */
|
|
if (mac_proto == PLC_PROTO_TYPE_SG) {
|
|
/* TODO Note:
|
|
standard smart grid must < 512 and set flag en
|
|
iot can use any band and donnot care flag or not
|
|
*/
|
|
if (all_mask_band_table_r0_full.end_tone > 512) {
|
|
phy_new_sg_en(false);
|
|
} else {
|
|
phy_new_sg_en(true);
|
|
}
|
|
}
|
|
|
|
#if PLC_MAC_RX_DEBUG_LOG
|
|
/* print the band table inited */
|
|
print_band_table(&all_mask_band_table_r0_full);
|
|
print_band_table(&all_mask_band_table_r0_low);
|
|
print_band_table(&all_mask_band_table_r0_high);
|
|
print_band_table(&all_mask_band_table_r1_full);
|
|
print_band_table(&all_mask_band_table_r1_low);
|
|
print_band_table(&all_mask_band_table_r1_high);
|
|
#endif
|
|
|
|
#if PLC_MEM_ALLOC_STAT
|
|
iot_printf("band table = %d bytes, tone mask table = %d bytes\n",
|
|
sizeof(all_mask_band_table_r0_full), sizeof(all_mask_tone_mask_table));
|
|
#endif
|
|
|
|
/* becareful the seq of these table load */
|
|
phy_band_tbl_load(&all_mask_band_table_r0_full);
|
|
phy_tone_mask_amp_phase_tab_load(&all_mask_amp_phase_table, mask_id,
|
|
mac_proto);
|
|
phy_gain_tab_load(all_mask_gain_table);
|
|
|
|
/* update tobe config */
|
|
phy_proto_type_to_set(mac_proto);
|
|
phy_band_id_to_set(band_id);
|
|
phy_mask_id_to_set(mask_id);
|
|
|
|
/* update tone detect range */
|
|
phy_update_tone_det_range();
|
|
|
|
/* band rate tbl range init */
|
|
phy_ra_tbl_band_range_init();
|
|
|
|
/* band filter select cfg */
|
|
#if (PLC_SUPPORT_BAND_FILTER_SELECT && IOT_DTEST_ONLY_SUPPORT == 0)
|
|
if (mac_proto == PLC_PROTO_TYPE_SG || mac_proto == PLC_PROTO_TYPE_SPG) {
|
|
phy_init_band_filter_gpio();
|
|
phy_cfg_band_filter_gpio((uint8_t)band_id);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
/* phy initialize */
|
|
void phy_init(uint32_t mac_proto, uint32_t band_id, plc_tone_mask_id mask_id,
|
|
bool_t bbai_en)
|
|
{
|
|
uint32_t range_id = IOT_PLC_PHY_BAND_RANGE_DFT;
|
|
|
|
/* check env */
|
|
phy_env_pre_check(mac_proto, band_id, mask_id);
|
|
|
|
/* delay for boot-hang */
|
|
os_delay(CHIP_HANG_DELAY);
|
|
|
|
/* reset phy */
|
|
phy_reset(PHY_RST_REASON_COLD);
|
|
|
|
/* enable phy reg clk */
|
|
phy_eb(true);
|
|
|
|
/* update phy band */
|
|
phy_band_info_update(mac_proto, range_id, band_id, mask_id);
|
|
|
|
/* load pib cfg*/
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
phy_load_pib_cfg();
|
|
#endif
|
|
|
|
#if HW_PLATFORM == HW_PLATFORM_FPGA
|
|
/* ana init */
|
|
phy_ana_init(band_id);
|
|
|
|
#elif HW_PLATFORM == HW_PLATFORM_SILICON
|
|
/* calibration form pib */
|
|
phy_load_cal_cfg();
|
|
|
|
/* CPU switch to 25M */
|
|
clk_core_freq_slip_25m_set();
|
|
|
|
/* analog initial */
|
|
phy_ana_init(band_id);
|
|
/* gpio mapping */
|
|
geode_gpio_init();
|
|
#if IOT_DTEST_ONLY_SUPPORT == 0
|
|
/* phy low power start */
|
|
phy_pm_start();
|
|
#endif
|
|
|
|
/* CPU switch to 150M */
|
|
clk_core_freq_slip_150m_set();
|
|
#endif
|
|
|
|
/* map plc protocol phase to hw phase */
|
|
phy_set_phase_overwrite(true,
|
|
HW_DESC_PHASE_ALL,
|
|
HW_DESC_PHASE_A,
|
|
HW_DESC_PHASE_B,
|
|
HW_DESC_PHASE_C);
|
|
|
|
/* config software version to register */
|
|
PHY_DFE_WRITE_REG(CFG_BB_DFE_SPARE2_ADDR,PHY_SW_VER);
|
|
|
|
/* init phy register */
|
|
phy_param_init(PHY_PROTO_TYPE_GET());
|
|
|
|
/* delay for boot-hang */
|
|
os_delay(CHIP_HANG_DELAY);
|
|
|
|
#if IOT_DTEST_ONLY_SUPPORT == 0
|
|
if (phy_get_fw_mode() != MP_MODE) {
|
|
/* WAR:bugid 244, enable phy isr for sack tx */
|
|
if (PHY_PROTO_TYPE_GET() != PLC_PROTO_TYPE_GP) {
|
|
phy_isr_init();
|
|
phy_isr_start();
|
|
|
|
phy_isr_start_cpu1();
|
|
}
|
|
}
|
|
|
|
/* update fl for mac */
|
|
phy_symppb_flppb_init(mac_proto);
|
|
|
|
/* sts cnt log */
|
|
register_regular_log(phy_get_status_printf);
|
|
|
|
/* delay for boot-hang */
|
|
os_delay(CHIP_HANG_DELAY);
|
|
|
|
/* channel pre-estimate */
|
|
/*high_perf_en is 0 when first power on*/
|
|
if (bbai_en == true) {
|
|
g_phy_cpu_share_ctxt.high_perf_en = 0;
|
|
phy_chn_est_pre_detect();
|
|
}
|
|
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
/* init timer */
|
|
phy_nf_timer_start();
|
|
#endif
|
|
#endif
|
|
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
if (range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND) {
|
|
/* support diff featue base on platform */
|
|
phy_spcl_feat_init();
|
|
}
|
|
#endif
|
|
|
|
/*record phy init cnt*/
|
|
phy_set_init_cnt();
|
|
|
|
/* init multiband special optimization */
|
|
if (band_id == IOT_SUPPORT_TONE_MULTI_BAND021) {
|
|
phy_multi_band_opt_ena(band_id);
|
|
}
|
|
/* war for bug
|
|
* sometime cco start, failure to receive package.
|
|
* add phy_reset to work around.
|
|
*/
|
|
phy_reset(PHY_RST_REASON_WARM);
|
|
|
|
/* init phy temperature */
|
|
phy_temperature_adc_init();
|
|
|
|
#if PHY_HW_SPIKE_OPTIMIZATION
|
|
if (IOT_SUPPORT_TONE_32_120 == band_id) {
|
|
phy_rxfd_pkt_det_thd_set(8, 16);
|
|
}
|
|
#endif
|
|
|
|
/* delay for boot-hang */
|
|
os_delay(CHIP_HANG_DELAY);
|
|
|
|
return;
|
|
}
|
|
|
|
/* phy re-init */
|
|
void phy_reinit(uint32_t mac_proto, uint32_t band_id, plc_tone_mask_id mask_id,
|
|
bool_t bbai_en)
|
|
{
|
|
uint32_t range_id = IOT_PLC_PHY_BAND_RANGE_DFT;
|
|
|
|
/* check env */
|
|
phy_env_pre_check(mac_proto, band_id, mask_id);
|
|
|
|
/* TODO: check if need disable clock */
|
|
/* reset phy */
|
|
phy_reset(PHY_RST_REASON_WARM);
|
|
|
|
/* update phy band */
|
|
phy_band_info_update(mac_proto, range_id, band_id, mask_id);
|
|
|
|
/* load pib cfg*/
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
phy_load_pib_cfg();
|
|
#endif
|
|
|
|
#if HW_PLATFORM == HW_PLATFORM_SILICON
|
|
/* calibration from pib */
|
|
phy_load_cal_cfg();
|
|
|
|
phy_ana_init(band_id);
|
|
#endif
|
|
|
|
/* init phy register */
|
|
phy_param_init(mac_proto);
|
|
|
|
#if IOT_DTEST_ONLY_SUPPORT == 0
|
|
phy_symppb_flppb_init(mac_proto);
|
|
|
|
if (bbai_en == true) {
|
|
/* channel pre-estimate */
|
|
phy_chn_est_pre_detect();
|
|
}
|
|
#endif
|
|
|
|
#if HW_PLATFORM >= HW_PLATFORM_FPGA
|
|
if (range_id == IOT_SUPPORT_PROTO_SG_NSG_BAND) {
|
|
/* support diff featue base on platform */
|
|
phy_spcl_feat_init();
|
|
}
|
|
#endif
|
|
|
|
/*record phy reinit cnt*/
|
|
phy_set_reinit_cnt();
|
|
|
|
#if PHY_HW_SPIKE_OPTIMIZATION
|
|
if (IOT_SUPPORT_TONE_32_120 == band_id) {
|
|
phy_rxfd_pkt_det_thd_set(8, 16);
|
|
}
|
|
#endif
|
|
|
|
return;
|
|
}
|
|
|
|
void phy_new_cfg_apply()
|
|
{
|
|
/* apply new phy mode */
|
|
phy_reinit(g_phy_ctxt.indep.chn.phy_proto_tobe,
|
|
g_phy_ctxt.indep.chn.band_id_tobe,
|
|
g_phy_ctxt.indep.chn.mask_id_tobe,
|
|
true);
|
|
|
|
/* clr fc ok find flag */
|
|
#if IOT_DTEST_ONLY_SUPPORT == 0
|
|
g_phy_cpu_share_ctxt.pm_status.fc_ok_found = 0;
|
|
#endif
|
|
}
|
|
|
|
void phy_trx_phase_switch_gpio_init()
|
|
{
|
|
uint8_t txrx_switch_a = iot_board_get_gpio(GPIO_TXRX_SWITCH_A);
|
|
uint8_t txrx_switch_b = iot_board_get_gpio(GPIO_TXRX_SWITCH_B);
|
|
uint8_t txrx_switch_c = iot_board_get_gpio(GPIO_TXRX_SWITCH_C);
|
|
if (txrx_switch_a == GPIO_NO_VALID || txrx_switch_b == GPIO_NO_VALID ||
|
|
txrx_switch_c == GPIO_NO_VALID) {
|
|
g_phy_cpu_share_ctxt.trx_phase_switch_en = 0;
|
|
iot_printf("%s not_support trx switch gpio phase config\n",
|
|
__FUNCTION__);
|
|
return;
|
|
}
|
|
|
|
g_phy_cpu_share_ctxt.trx_phase_switch_en = 1;
|
|
g_phy_cpu_share_ctxt.trx_switch_phase = PLC_PHASE_A;
|
|
|
|
/* default enable phase a */
|
|
iot_gpio_open_as_output(txrx_switch_a);
|
|
iot_gpio_value_set(txrx_switch_a, 1);
|
|
|
|
iot_gpio_open_as_output(txrx_switch_b);
|
|
iot_gpio_value_set(txrx_switch_b, 0);
|
|
|
|
iot_gpio_open_as_output(txrx_switch_c);
|
|
iot_gpio_value_set(txrx_switch_c, 0);
|
|
}
|
|
|
|
uint32_t phy_set_trx_switch_gpio_phase(uint8_t phase)
|
|
{
|
|
if (!g_phy_cpu_share_ctxt.trx_phase_switch_en) {
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
if (phase > PLC_PHASE_CNT) {
|
|
return ERR_FAIL;
|
|
}
|
|
|
|
g_phy_cpu_share_ctxt.trx_switch_phase = phase;
|
|
|
|
uint8_t txrx_switch_a = iot_board_get_gpio(GPIO_TXRX_SWITCH_A);
|
|
uint8_t txrx_switch_b = iot_board_get_gpio(GPIO_TXRX_SWITCH_B);
|
|
uint8_t txrx_switch_c = iot_board_get_gpio(GPIO_TXRX_SWITCH_C);
|
|
|
|
if (PLC_PHASE_A == phase) {
|
|
/* phase A */
|
|
iot_gpio_value_set(txrx_switch_a, 1);
|
|
iot_gpio_value_set(txrx_switch_b, 0);
|
|
iot_gpio_value_set(txrx_switch_c, 0);
|
|
} else if (PLC_PHASE_B == phase) {
|
|
/* phase B */
|
|
iot_gpio_value_set(txrx_switch_a, 0);
|
|
iot_gpio_value_set(txrx_switch_b, 1);
|
|
iot_gpio_value_set(txrx_switch_c, 0);
|
|
} else if (PLC_PHASE_C == phase) {
|
|
/* phase C */
|
|
iot_gpio_value_set(txrx_switch_a, 0);
|
|
iot_gpio_value_set(txrx_switch_b, 0);
|
|
iot_gpio_value_set(txrx_switch_c, 1);
|
|
} else {
|
|
/* phase ALL */
|
|
iot_gpio_value_set(txrx_switch_a, 1);
|
|
iot_gpio_value_set(txrx_switch_b, 1);
|
|
iot_gpio_value_set(txrx_switch_c, 1);
|
|
}
|
|
|
|
return ERR_OK;
|
|
}
|
|
|
|
uint8_t phy_get_trx_switch_gpio_phase()
|
|
{
|
|
if (!g_phy_cpu_share_ctxt.trx_phase_switch_en) {
|
|
return PLC_PHASE_A;
|
|
}
|
|
|
|
return (uint8_t)g_phy_cpu_share_ctxt.trx_switch_phase;
|
|
}
|
|
|