/**************************************************************************** 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 "hw_tonemap.h" #include "iot_errno.h" #include "hw_tonemask.h" #include "plc_utils.h" #include "hw_desc.h" #include "plc_protocol.h" #include "iot_io.h" #include "phy_chn.h" /* NOTE: for spg, tmi7 is not useable, spec has a mistake for this. */ const rate_tbl_entry_t g_ra_tbl[] = { /* SG_IDX NW_IDX IEEE1901_IDX _IDX KBPS SNR_THRE BAND ENA*/ /* SG band 0 start */ /*00*/{ SGTMI2IDX(3,0), NWTMI2IDX(3,0), I1901TMI2IDX(3,0), 146, -9, 0, 1 }, /*01*/{ SGTMI2IDX(14,0), INV_IDX, I1901TMI2IDX(14,0), 120, -5, 0, 1 }, /*02*/{ SGTMI2IDX(4,0), NWTMI2IDX(4,0), I1901TMI2IDX(4,0), 173, -5, 0, 1 }, /*03*/{ SGTMI2IDX(12,0), INV_IDX, INV_IDX, 240, -5, 0, 1 }, /*04*/{ SGTMI2IDX(7,0), INV_IDX, INV_IDX, 361, -5, 0, 1 }, /*05*/{ SGTMI2IDX(13,0), INV_IDX, I1901TMI2IDX(13,0), 156, 1, 0, 1 }, /*06*/{ SGTMI2IDX(6,0), NWTMI2IDX(6,0), I1901TMI2IDX(6,0), 207, 1, 0, 1 }, /*07*/{ SGTMI2IDX(11,0), INV_IDX, INV_IDX, 374, 1, 0, 1 }, /*08*/{ SGTMI2IDX(9,0), NWTMI2IDX(9,0), I1901TMI2IDX(9,0), 536, 1, 0, 1 }, /*09*/{ SGTMI2IDX(2,0), INV_IDX, I1901TMI2IDX(2,0), 219, 7, 0, 1 }, /*10*/{ SGTMI2IDX(0,0), NWTMI2IDX(0,0), I1901TMI2IDX(0,0), 676, 10, 0, 1 }, /*11*/{ SGTMI2IDX(15,11), NWTMI2IDX(13,11), I1901TMI2IDX(15,11), 240, 13, 0, 1 }, /*12*/{ SGTMI2IDX(1,0), NWTMI2IDX(1,0), I1901TMI2IDX(1,0), 814, 13, 0, 1 }, /*13*/{ SGTMI2IDX(15,13), NWTMI2IDX(13,13), I1901TMI2IDX(15,13), 249, 19, 0, 0 }, /*14*/{ SGTMI2IDX(15,6), NWTMI2IDX(13,6), I1901TMI2IDX(15,6), 906, 19, 0, 0 }, /*15*/{ SGTMI2IDX(15,12), NWTMI2IDX(13,12), I1901TMI2IDX(15,12), 249, 25, 0, 0 }, /* SG band 0 end */ }; #if SUPPORT_SMART_GRID const fix_rate_tbl_entry_t g_fix_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 2, 3, 8, 10, 12, 12 }, /* band 0 end */ }; const fix_rate_tbl_entry_t g_fix_mid_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 6, 11, 10, 10, 10, 10 }, /* band 0 end */ }; const fix_rate_tbl_entry_t g_fix_high_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 9, 11, 12, 12, 12, 12 }, /* band 0 end */ }; #else const fix_rate_tbl_entry_t g_fix_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 2, 8, 8, 12, 12, 12 }, /* band 0 end */ }; const fix_rate_tbl_entry_t g_fix_mid_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 2, 8, 8, 12, 12, 12 }, /* band 0 end */ }; const fix_rate_tbl_entry_t g_fix_high_ra_tbl[] = { /* bcn136 bcn520 len72 len136 len264 len520 len1040 len1560 len2080 */ /* band 0 start */ { 2, 8, 1, 2, 8, 8, 12, 12, 12 }, /* band 0 end */ }; #endif #if SUPPORT_SMART_GRID /* band 0 */ tonemap_table_entry sg_tonemap_table[] = { { PB_SIZE_520, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 0 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 1 { PB_SIZE_136, ROBO_COPY_5 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 2 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 3 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 4 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 5 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 6 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 7 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 8 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 9 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 10 { PB_SIZE_264, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 11 { PB_SIZE_264, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 12 { PB_SIZE_72, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 13 { PB_SIZE_72, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 14 }; tonemap_table_entry sg_ext_tonemap_table[] = { { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 0 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_16_18, MAX_PB_NUM_4 }, // id 1 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_16_18, MAX_PB_NUM_4 }, // id 2 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 3 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 4 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 5 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 6 { PB_SIZE_INV, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 7 { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 8 { PB_SIZE_INV, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 9 { PB_SIZE_136, ROBO_COPY_5 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 10 { PB_SIZE_136, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 11 { PB_SIZE_136, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 12 { PB_SIZE_136, ROBO_COPY_1 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 13 { PB_SIZE_136, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 14 }; #endif #if SUPPORT_SOUTHERN_POWER_GRID /* southern power grid */ tonemap_table_entry spg_tonemap_table[] = { { PB_SIZE_520, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 0 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 1 { PB_SIZE_INV, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 2 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 3 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 4 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 5 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 6 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 7 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 8 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 9 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 10 { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 11 { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_1 }, // id 12 }; tonemap_table_entry spg_ext_tonemap_table[] = { { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 0 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_16_18, MAX_PB_NUM_4 }, // id 1 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_16_18, MAX_PB_NUM_4 }, // id 2 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 3 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 4 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 5 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 6 { PB_SIZE_INV, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 7 { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 8 { PB_SIZE_INV, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 9 { PB_SIZE_136, ROBO_COPY_5 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 10 { PB_SIZE_136, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 11 { PB_SIZE_136, ROBO_COPY_2 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 12 { PB_SIZE_136, ROBO_COPY_1 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 13 { PB_SIZE_136, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 14 }; #endif #if SUPPORT_GREEN_PHY tonemap_table_entry gp_tonemap_table[] = { { PB_SIZE_520, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 0 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 1 { PB_SIZE_136, ROBO_COPY_5 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 2 { PB_SIZE_INV, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_4 }, // id 3 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_16QAM, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 4 { PB_SIZE_520, ROBO_COPY_1 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 5 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 6 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 7 { PB_SIZE_136, ROBO_COPY_5 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 8 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 9 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 10 { PB_SIZE_136, ROBO_COPY_11 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 11 { PB_SIZE_136, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 12 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 13 { PB_SIZE_520, ROBO_COPY_4 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 14 { PB_SIZE_520, ROBO_COPY_7 , MODULATION_QPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 15 { PB_SIZE_520, ROBO_COPY_2 , MODULATION_BPSK, \ CODING_RATE_1_2, MAX_PB_NUM_3 }, // id 16 }; #endif robo_inter_table_entry sg_robo_inter_table[] = { { ROBO_COPY_1, INTER_1 }, // id 0 { ROBO_COPY_2, INTER_8 }, // id 1 { ROBO_COPY_4, INTER_8 }, // id 2 { ROBO_COPY_5, INTER_10 }, // id 3 { ROBO_COPY_7, INTER_14 }, // id 4 { ROBO_COPY_11, INTER_11 }, // id 5 }; /* symppb value */ static uint16_t g_symppb[MAX_HW_BAND][SG_OFDM_MAX] = { 0 }; /* flppb value */ static uint16_t g_flppb[MAX_HW_BAND][SG_OFDM_MAX] = { 0 }; uint8_t phy_get_rt_sz() { return sizeof(g_ra_tbl) / sizeof(g_ra_tbl[0]); } uint32_t phy_get_tmi_by_rid(uint32_t proto, uint8_t rid, uint32_t *tmi, \ uint32_t *etmi) { uint8_t prid = (uint8_t)RAGET_PRID(proto, rid); uint32_t maxtmi = phy_get_max_tmi(proto); if (maxtmi == 0) { IOT_ASSERT(0); } /* for some rid, could be invalid tmi * just return it */ *tmi = (uint8_t)IDX2TMI(prid, maxtmi); *etmi = (uint8_t)IDX2ETMI(prid, maxtmi); return ERR_OK; } uint32_t phy_find_rid_by_tmi(uint32_t proto, uint32_t band_id,\ uint32_t *rid, uint32_t tmi, uint32_t etmi) { uint32_t tmp_tmi = 0, tmp_etmi = 0; uint32_t rid_min, rid_max; uint32_t i; uint32_t maxtmi = phy_get_max_tmi(proto); phy_ra_tbl_band_range_get(band_id, &rid_min, &rid_max); for (i = rid_min; i < rid_max; i++) { phy_get_tmi_by_rid(proto, (uint8_t)i, &tmp_tmi, &tmp_etmi); if(((tmi < maxtmi) &&(tmi == tmp_tmi)) || ((tmi == maxtmi) && (tmi == tmp_tmi) && (etmi == tmp_etmi))) { *rid = i; return ERR_OK; } } return ERR_INVAL; } uint32_t phy_get_rt_pbsz(uint32_t proto, uint8_t rid, uint32_t *pbsz) { uint32_t tmi, etmi; uint32_t tmp_pbsz; /* get tmi and etmi */ phy_get_tmi_by_rid(proto, rid, &tmi, &etmi); uint32_t ret = \ phy_get_pb_size(proto, tmi, etmi, &tmp_pbsz); if (ERR_OK == ret) { *pbsz = tmp_pbsz; return ret; } else { IOT_ASSERT(0); return ERR_INVAL; } } uint32_t phy_get_max_tmi(uint32_t proto) { switch (proto) { #if SUPPORT_SMART_GRID case PLC_PROTO_TYPE_SG: return SG_TMI_MAX; #endif #if SUPPORT_SOUTHERN_POWER_GRID case PLC_PROTO_TYPE_SPG: return SPG_TMI_MAX; #endif #if SUPPORT_GREEN_PHY case PLC_PROTO_TYPE_GP: return sizeof(gp_tonemap_table) / sizeof(gp_tonemap_table[0]); #endif default: return 0; } } uint32_t phy_get_max_etmi(uint32_t proto) { switch (proto) { #if SUPPORT_SMART_GRID case PLC_PROTO_TYPE_SG: return SG_EXT_TMI_MAX; #endif #if SUPPORT_SOUTHERN_POWER_GRID case PLC_PROTO_TYPE_SPG: return SPG_EXT_TMI_MAX; #endif #if SUPPORT_GREEN_PHY case PLC_PROTO_TYPE_GP: return sizeof(gp_tonemap_table) / sizeof(gp_tonemap_table[0]); #endif default: return 0; } } tonemap_table_entry *phy_get_tmi_param(uint32_t proto, uint32_t tmi, uint32_t ext_tmi) { tonemap_table_entry *tmp = NULL; if (PLC_PROTO_TYPE_SG == proto) { #if SUPPORT_SMART_GRID if (tmi == SG_TMI_MAX) { if (ext_tmi < SG_EXT_TMI_MAX) { return &sg_ext_tonemap_table[ext_tmi]; } } else { if (tmi < SG_TMI_MAX) { return &sg_tonemap_table[tmi]; } } #else IOT_ASSERT(0); #endif } else if (PLC_PROTO_TYPE_SPG == proto) { #if SUPPORT_SOUTHERN_POWER_GRID /* when tmi==13,then select ext-tmi */ if (tmi == SPG_TMI_MAX) { if (ext_tmi < SPG_EXT_TMI_MAX) { return &spg_ext_tonemap_table[ext_tmi]; } } else { if (tmi < SPG_TMI_MAX) { return &spg_tonemap_table[tmi]; } } #else IOT_ASSERT(0); #endif } else if (PLC_PROTO_TYPE_GP == proto) { #if SUPPORT_GREEN_PHY if (tmi < sizeof(gp_tonemap_table) / sizeof(gp_tonemap_table[0])) { return &gp_tonemap_table[tmi]; } else { IOT_ASSERT(0); } #else IOT_ASSERT(0); #endif } else { // unsupport proto IOT_ASSERT(0); } return tmp; } uint32_t phy_get_pb_mod(uint32_t proto, uint32_t tmi, uint32_t ext_tmi, \ uint32_t *pb_mod) { tonemap_table_entry *tmi_param = \ phy_get_tmi_param(proto, tmi, ext_tmi); if (tmi_param) { switch (tmi_param->modulation) { case MODULATION_BPSK: *pb_mod = HW_DESC_TX_PB_MOD_BPSK; break; case MODULATION_QPSK: *pb_mod = HW_DESC_TX_PB_MOD_QPSK; break; case MODULATION_16QAM: *pb_mod = HW_DESC_TX_PB_MOD_16QAM; break; default: IOT_ASSERT(0); } } else { /* return error */ return ERR_INVAL; } return ERR_OK; } uint32_t phy_get_pb_size(uint32_t proto, uint32_t tmi, uint32_t ext_tmi, uint32_t *pb_size) { tonemap_table_entry *tmi_param = \ phy_get_tmi_param(proto, tmi, ext_tmi); if (tmi_param) { *pb_size = tmi_param->pb_size; if (*pb_size == PB_SIZE_INV) { return ERR_NOT_EXIST; } } else { /* return error */ return ERR_INVAL; } return ERR_OK; } uint32_t phy_get_robo_inter(uint32_t robo_cnt, uint32_t *robo_inter) { uint32_t i, ret = ERR_OK; for(i=0; irobo_cnt, &robo_inter); if(tmi_param->coding_rate_idx == CODING_RATE_1_2){ coding_rate = 0.5; } else if(tmi_param->coding_rate_idx == CODING_RATE_16_18){ coding_rate = (float)(16.0/18.0); } else{ IOT_ASSERT(0); return 0; } if(proto == PLC_PROTO_TYPE_GP || proto == PLC_PROTO_TYPE_SPG){ sym_ppb = (uint32_t)OFDM_SYMBOL_PER_PB(pbsz, tmi_param->robo_cnt, coding_rate, tmi_param->modulation, g_plc_band_tbl_r0[hw_band_id]->valid_tone_number, tmi_param->robo_cnt); } else if(proto == PLC_PROTO_TYPE_SG){ sym_ppb = (uint32_t)OFDM_SYMBOL_PER_PB(pbsz, tmi_param->robo_cnt, coding_rate, tmi_param->modulation, g_plc_band_tbl_r0[hw_band_id]->valid_tone_number, robo_inter); #if SUPPORT_IEEE_1901 sym_ppb = phy_get_pss_sym(proto, sym_ppb, pss); #else (void)pss; #endif } else{ /* unknown proto */ iot_printf("%s:unknown proto\n", __FUNCTION__); IOT_ASSERT(0); return 0; } if (proto == PLC_PROTO_TYPE_SPG || proto == PLC_PROTO_TYPE_SG) { #if SUPPORT_IEEE_1901 if (sym_ppb > MAC_MPDU_PL_SYMBOL_NUM_I1901) { return 0; } #else if (sym_ppb > MAC_MPDU_PL_SYMBOL_NUM_SG_SPG) { return 0; } #endif } return sym_ppb; } uint32_t phy_get_fl_per_pb(uint32_t proto, uint32_t hw_band_id, uint32_t tmi, uint32_t ext_tmi) { uint32_t sym_ppb = 0; uint32_t GI = GI_MINI_ROBO; IOT_ASSERT(hw_band_id <= MAX_HW_BAND - 1); sym_ppb = phy_get_sym_per_pb(proto, hw_band_id, tmi, ext_tmi, phy_get_pss_id(proto, tmi, ext_tmi)); /* GI */ if (proto == PLC_PROTO_TYPE_GP) { switch (tmi) { case 0: GI = GI_STD_ROBO; break; case 1: GI = GI_HS_ROBO; break; case 2: GI = GI_MINI_ROBO; break; default: GI = GI_MINI_ROBO; } return (uint32_t)FRAME_LENGTH_PER_PB_GP(sym_ppb, GI); } else if (proto == PLC_PROTO_TYPE_SPG || proto == PLC_PROTO_TYPE_SG) { GI = GI_SG_ROBO_SHORT; return (uint32_t)FRAME_LENGTH_PER_PB_GW(sym_ppb, GI); } else { IOT_ASSERT(0); } return 0; } uint32_t phy_get_symppb_from_table(uint32_t hw_band_id, uint32_t tmi,\ uint32_t etmi) { IOT_ASSERT((hw_band_id < MAX_HW_BAND) && ((tmi + etmi) < SG_OFDM_MAX)); return g_symppb[hw_band_id][tmi + etmi]; } uint32_t phy_get_flppb_from_table(uint32_t hw_band_id, uint32_t tmi,\ uint32_t etmi) { IOT_ASSERT((hw_band_id < MAX_HW_BAND) && ((tmi + etmi) < SG_OFDM_MAX)); return g_flppb[hw_band_id][tmi + etmi]; } //TODO: will only be called inside the phy_init() function. uint32_t phy_symppb_flppb_init(uint32_t proto) { uint32_t tmi = 0, ext_tmi = 0; uint32_t hw_band, i; uint32_t ofdm_max =0; if(proto == PLC_PROTO_TYPE_SG) { #if SUPPORT_SMART_GRID ofdm_max = SG_OFDM_MAX; #endif } else if(proto == PLC_PROTO_TYPE_SPG) { #if SUPPORT_SOUTHERN_POWER_GRID ofdm_max = SPG_OFDM_MAX; #endif } else if(proto == PLC_PROTO_TYPE_GP) { #if SUPPORT_GREEN_PHY ofdm_max = GP_OPDM_MAX; #endif } else { iot_printf("now, is not support this proto: %d\n", proto); IOT_ASSERT(0); } for(hw_band = 0; hw_band < MAX_HW_BAND; hw_band++) { /* calulete sym num and frame len*/ for(i=0; i