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;
 | 
						|
}
 | 
						|
 |