295 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
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 "iot_config.h"
 | 
						|
#include "os_types.h"
 | 
						|
#include "hw_reg_api.h"
 | 
						|
#include "hw_phy_api.h"
 | 
						|
#include "phy_chn.h"
 | 
						|
#include "phy_bb.h"
 | 
						|
#include "iot_io.h"
 | 
						|
#include "hw_tonemask.h"
 | 
						|
 | 
						|
void phy_proto_type_set(uint32_t phy_proto)
 | 
						|
{
 | 
						|
    /* phy dtest mode, cpu1 is not enable*/
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    g_phy_cpu_share_ctxt.phy_proto = phy_proto;
 | 
						|
#else
 | 
						|
    g_phy_ctxt.indep.chn.phy_proto = phy_proto;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
uint32_t IRAM_ATTR phy_proto_type_get()
 | 
						|
{
 | 
						|
    /* phy dtest mode, cpu1 is not enable*/
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    return g_phy_cpu_share_ctxt.phy_proto;
 | 
						|
#else
 | 
						|
    return g_phy_ctxt.indep.chn.phy_proto;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_proto_type_to_set(uint32_t phy_proto)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.chn.phy_proto_tobe = phy_proto;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_proto_type_to_get()
 | 
						|
{
 | 
						|
    return g_phy_ctxt.indep.chn.phy_proto_tobe;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_proto_type_is_i1901(void)
 | 
						|
{
 | 
						|
    return (SUPPORT_SMART_GRID && SUPPORT_IEEE_1901);
 | 
						|
}
 | 
						|
 | 
						|
void phy_band_id_set(uint32_t band_id)
 | 
						|
{
 | 
						|
    /* phy dtest mode, cpu1 is not enable*/
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    g_phy_cpu_share_ctxt.band_id = band_id;
 | 
						|
#else
 | 
						|
    g_phy_ctxt.indep.chn.band_id = band_id;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_band_id_get()
 | 
						|
{
 | 
						|
    /* phy dtest mode, cpu1 is not enable*/
 | 
						|
#if IOT_DTEST_ONLY_SUPPORT == 0
 | 
						|
    return g_phy_cpu_share_ctxt.band_id;
 | 
						|
#else
 | 
						|
    return g_phy_ctxt.indep.chn.band_id;
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void phy_band_id_to_set(uint32_t band_id)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.chn.band_id_tobe = (uint16_t)band_id;
 | 
						|
    return;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t sg_tonemask_to_hw_tonemask(uint32_t sw_tonemask)
 | 
						|
{
 | 
						|
    if (sw_tonemask > MAX_HW_BAND) {
 | 
						|
        //TODO:handle other tonemask;
 | 
						|
        IOT_ASSERT(0);
 | 
						|
        return 0;
 | 
						|
    } else {
 | 
						|
        return sw_tonemask + 1;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_support_band_table_get(uint32_t proto, void **band_tbl)
 | 
						|
{
 | 
						|
    uint32_t band_cnt;
 | 
						|
 | 
						|
    switch (proto) {
 | 
						|
#if SUPPORT_SMART_GRID
 | 
						|
    case PLC_PROTO_TYPE_SG:
 | 
						|
        if (IOT_PLC_PHY_BAND_RANGE_DFT == IOT_SUPPORT_PROTO_SG_NSG_BAND) {
 | 
						|
            band_cnt = phy_get_plc_nsg_band_tab_info(
 | 
						|
                (const plc_phy_band_table_t **)band_tbl);
 | 
						|
        } else {
 | 
						|
            band_cnt = 0;
 | 
						|
            *band_tbl = NULL;
 | 
						|
            iot_printf("support_band_get range %d error\n",
 | 
						|
                IOT_PLC_PHY_BAND_RANGE_DFT);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
#endif
 | 
						|
 | 
						|
#if SUPPORT_SOUTHERN_POWER_GRID
 | 
						|
    case PLC_PROTO_TYPE_SPG:
 | 
						|
        band_cnt = phy_get_plc_nsg_band_tab_info(
 | 
						|
            (const plc_phy_band_table_t **)band_tbl);
 | 
						|
        break;
 | 
						|
#endif
 | 
						|
 | 
						|
#if SUPPORT_GREEN_PHY
 | 
						|
    case PLC_PROTO_TYPE_GP:
 | 
						|
        band_cnt = phy_get_plc_gp_band_tab_info(
 | 
						|
            (const plc_phy_band_table_t **)band_tbl);
 | 
						|
        break;
 | 
						|
#endif
 | 
						|
    default:
 | 
						|
        band_cnt = 0;
 | 
						|
        *band_tbl = NULL;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    return band_cnt;
 | 
						|
}
 | 
						|
 | 
						|
uint8_t phy_band_to_tonemask_id_get(uint8_t band_id)
 | 
						|
{
 | 
						|
    uint8_t mask_id;
 | 
						|
    switch (band_id) {
 | 
						|
    case IOT_SUPPORT_TONE_TIDE:
 | 
						|
        mask_id = TONE_MASK_ID_TIDE;
 | 
						|
        break;
 | 
						|
 | 
						|
    case IOT_SUPPORT_TONE_80_490_CE :
 | 
						|
    case IOT_SUPPORT_TONE_231_490_CE:
 | 
						|
    case IOT_SUPPORT_TONE_100_230_CE:
 | 
						|
        mask_id =  TONE_MASK_ID_CE;
 | 
						|
        break;
 | 
						|
 | 
						|
    default:
 | 
						|
        mask_id =  TONE_MASK_ID_NULL;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
 | 
						|
    return mask_id;
 | 
						|
}
 | 
						|
 | 
						|
void phy_mask_id_set(plc_tone_mask_id mask_id)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.chn.mask_id = mask_id;
 | 
						|
}
 | 
						|
 | 
						|
void phy_mask_id_to_set(plc_tone_mask_id mask_id)
 | 
						|
{
 | 
						|
    g_phy_ctxt.indep.chn.mask_id_tobe = mask_id;
 | 
						|
}
 | 
						|
 | 
						|
plc_tone_mask_id phy_mask_id_get()
 | 
						|
{
 | 
						|
    return g_phy_ctxt.indep.chn.mask_id;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_ra_tbl_band_range_init()
 | 
						|
{
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
uint32_t phy_ra_tbl_band_range_get(uint32_t proto_band_id,
 | 
						|
    uint32_t* start_idx, uint32_t* ed_idx)
 | 
						|
{
 | 
						|
    /* fix band = 0 for unified band handle in rate table */
 | 
						|
    (void)proto_band_id;
 | 
						|
    *start_idx = 0;
 | 
						|
    *ed_idx = phy_get_rt_sz();
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
void phy_multi_band_opt_ena(uint32_t proto_band_id)
 | 
						|
{
 | 
						|
    if (IOT_SUPPORT_TONE_MULTI_BAND021 == proto_band_id) {
 | 
						|
        /* enable spur mask 100-120 for pkt detect*/
 | 
						|
        phy_spur_mask_set(110, 20);
 | 
						|
        /* increase pkt detect threshold for decrease warnning */
 | 
						|
        phy_rxfd_pkt_det_thd_set(32,32);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void phy_multi_band_opt_dis(uint32_t proto_band_id)
 | 
						|
{
 | 
						|
    if (IOT_SUPPORT_TONE_MULTI_BAND021 == proto_band_id) {
 | 
						|
        /* clear spur mask 100-120 for pkt detect*/
 | 
						|
        phy_spur_mask_clr(110, 20);
 | 
						|
        /* recover pkt detect threshold for decrease warnning */
 | 
						|
        phy_rxfd_pkt_det_thd_set(16, 32);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_hw_band_to_proto_band(uint32_t hw_band)
 | 
						|
{
 | 
						|
    uint32_t proto_band_id = phy_band_id_get();
 | 
						|
 | 
						|
    if (IOT_SUPPORT_TONE_MULTI_BAND021 == proto_band_id) {
 | 
						|
        uint32_t proto = PHY_PROTO_TYPE_GET();
 | 
						|
        if (PLC_PROTO_TYPE_SPG == proto) {
 | 
						|
            /* spg not have proto band0, full band -> proto band2 */
 | 
						|
            switch (hw_band) {
 | 
						|
            case HW_FULL_BAND:
 | 
						|
            case HW_LOW_BAND:
 | 
						|
                return IOT_SUPPORT_TONE_32_120;
 | 
						|
            case HW_HIGH_BAND:
 | 
						|
                return IOT_SUPPORT_TONE_100_230;
 | 
						|
            default:
 | 
						|
                IOT_ASSERT(0);
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            switch (hw_band) {
 | 
						|
            case HW_FULL_BAND:
 | 
						|
                return IOT_SUPPORT_TONE_80_490;
 | 
						|
            case HW_LOW_BAND:
 | 
						|
                return IOT_SUPPORT_TONE_32_120;
 | 
						|
            case HW_HIGH_BAND:
 | 
						|
                return IOT_SUPPORT_TONE_100_230;
 | 
						|
            default:
 | 
						|
                IOT_ASSERT(0);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return proto_band_id;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_proto_band_to_hw_band(uint32_t proto_single_band)
 | 
						|
{
 | 
						|
    uint32_t proto_band_id = phy_band_id_get();
 | 
						|
 | 
						|
    /* check valid */
 | 
						|
    IOT_ASSERT(proto_single_band < IOT_SUPPORT_TONE_MULTI_BAND021);
 | 
						|
 | 
						|
    if (IOT_SUPPORT_TONE_MULTI_BAND021 == proto_band_id) {
 | 
						|
        switch (proto_single_band)
 | 
						|
        {
 | 
						|
            case IOT_SUPPORT_TONE_80_490:
 | 
						|
                return HW_FULL_BAND;
 | 
						|
            case IOT_SUPPORT_TONE_100_230:
 | 
						|
                return HW_HIGH_BAND;
 | 
						|
            case IOT_SUPPORT_TONE_32_120:
 | 
						|
                return HW_LOW_BAND;
 | 
						|
            default:
 | 
						|
                /* TODO: default share last band id.
 | 
						|
                 * when fix phy_get_sym_per_pb() and phy_get_fl_per_pb()
 | 
						|
                 * source source, then need to IOT_ASSERT here.
 | 
						|
                 */
 | 
						|
                //IOT_ASSERT(0);
 | 
						|
                return HW_LOW_BAND;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return HW_FULL_BAND;
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_def_hw_band_id_get(void)
 | 
						|
{
 | 
						|
    uint32_t proto_band_id = phy_band_id_get();
 | 
						|
    if (proto_band_id < IOT_SUPPORT_TONE_MULTI_BAND021) {
 | 
						|
        return HW_FULL_BAND;
 | 
						|
    } else {
 | 
						|
        switch (proto_band_id) {
 | 
						|
        case IOT_SUPPORT_TONE_MULTI_BAND021:
 | 
						|
            //TODO: need check multi band default hw band.
 | 
						|
            /* default proto band 2 */
 | 
						|
            return HW_LOW_BAND;
 | 
						|
        default:
 | 
						|
            IOT_ASSERT(0);
 | 
						|
            return HW_LOW_BAND;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
uint32_t phy_proto_single_band_id_get(void)
 | 
						|
{
 | 
						|
    return phy_hw_band_to_proto_band(phy_def_hw_band_id_get());
 | 
						|
}
 |