Files
kunlun/plc/halphy/tone_map.c
2024-09-28 14:24:04 +08:00

884 lines
26 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 "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; i<sizeof(sg_robo_inter_table); i++)
{
if(sg_robo_inter_table[i].robo_cpy == robo_cnt) {
*robo_inter = sg_robo_inter_table[i].inter_num;
break;
}
}
if (sizeof(sg_robo_inter_table) == i) {
ret = ERR_NOT_EXIST;
}
else {
ret = ERR_OK;
}
return ret;
}
uint8_t phy_get_pss_id(uint32_t proto, uint32_t tmi, uint32_t ext_tmi)
{
(void)tmi;
(void)ext_tmi;
if (PLC_PROTO_TYPE_SG == proto) {
#if SUPPORT_IEEE_1901
/* TODO: add code base on parameter */
return 6;
#else
return 0;
#endif
} else {
return 0;
}
}
uint32_t phy_get_pss_sym(uint32_t proto, uint32_t sym, uint8_t pss)
{
if (PLC_PROTO_TYPE_SG == proto) {
#if SUPPORT_IEEE_1901
uint32_t pss_sym;
switch (pss) {
case 1: /* m = 2, n = 1 */
pss_sym = sym + (sym / 2);
break;
case 2: /* m = 4, n = 1 */
pss_sym = sym + (sym / 4);
break;
case 3: /* m = 8, n = 1 */
pss_sym= sym + (sym / 8);
break;
case 4: /* m = 16, n = 1 */
pss_sym= sym + (sym / 16);
break;
case 5: /* m = 4, n = 2 */
pss_sym= sym + ((sym / 4) * 2);
break;
case 6: /* m = 8, n = 2 */
pss_sym= sym + ((sym / 8) * 2);
break;
case 7: /* m = 16, n = 2 */
pss_sym= sym + ((sym / 16) * 2);
break;
case 8: /* m = 8, n = 4 */
pss_sym= sym + ((sym / 8) * 4);
break;
case 9: /* m = 16, n = 4 */
pss_sym= sym + ((sym / 16) * 4);
break;
case 0:
default:
pss_sym = sym;
break;
}
return pss_sym;
#else
(void)pss;
return sym;
#endif
} else {
return sym;
}
}
uint32_t phy_get_sym_per_pb(uint32_t proto, uint32_t hw_band_id,
uint32_t tmi, uint32_t ext_tmi, uint8_t pss)
{
uint32_t pbsz = 0;
uint32_t robo_inter = 0;
float coding_rate = 0;
uint32_t sym_ppb;
tonemap_table_entry *tmi_param =
phy_get_tmi_param(proto, tmi, ext_tmi);
IOT_ASSERT(hw_band_id <= MAX_HW_BAND - 1);
phy_get_pb_size(proto, tmi, ext_tmi, &pbsz);
phy_get_robo_inter(tmi_param->robo_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<ofdm_max; i++)
{
if(proto == PLC_PROTO_TYPE_SG)
{
#if SUPPORT_SMART_GRID
(i<SG_TMI_MAX)?(tmi = i):\
(tmi = SG_TMI_MAX, ext_tmi = i-SG_TMI_MAX);
#endif
}
else if(proto == PLC_PROTO_TYPE_SPG)
{
#if SUPPORT_SOUTHERN_POWER_GRID
(i<SPG_TMI_MAX)?(tmi = i):\
(tmi = SPG_TMI_MAX, ext_tmi = i-SPG_TMI_MAX);
#endif
}
else if(proto == PLC_PROTO_TYPE_GP)
{
#if SUPPORT_GREEN_PHY
tmi = i;
ext_tmi = 0;
#endif
}
g_symppb[hw_band][i] =
(uint16_t)phy_get_sym_per_pb(proto,
hw_band, tmi, ext_tmi,
phy_get_pss_id(proto, tmi, ext_tmi));
g_flppb[hw_band][i] = \
(uint16_t)phy_get_fl_per_pb(proto, \
hw_band, tmi, ext_tmi);
}
}
if (!g_phy_cpu_share_ctxt.sym_num_fix_dis) {
g_phy_cpu_share_ctxt.p_g_symppb = g_symppb;
}
return 0;
}
uint32_t phy_tmi_i1901_to_sg(uint32_t i1901_tmi, uint32_t i1901_tmi_ext,
uint32_t *sg_tmi, uint32_t *sg_tmi_ext)
{
#if (SUPPORT_SMART_GRID && SUPPORT_IEEE_1901)
uint32_t ret = ERR_OK;
if (!sg_tmi || !sg_tmi_ext) {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
if (i1901_tmi_ext == I1901_IS_EXT_TMI_MODE) {
*sg_tmi = SG_TMI_MAX;
if (i1901_tmi < 6) {
/* ieee1901 ext tmi(520PB) 0~5 to sg ext tmi 1~6*/
*sg_tmi_ext = i1901_tmi + 1;
} else if (i1901_tmi < I1901_EXT_TMI_MAX) {
/* ieee1901 ext tmi 6~10 to sg ext tmi 10~14 */
*sg_tmi_ext = i1901_tmi + 4;
} else {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
} else {
*sg_tmi_ext = 0;
/* ieee1901 not tmi 11, 12.(264PB) */
if (i1901_tmi < 11) {
*sg_tmi = i1901_tmi;
} else if (i1901_tmi < I1901_TMI_MAX) {
*sg_tmi = i1901_tmi + 2;
} else {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
}
return ret;
#else
(void)i1901_tmi;
(void)i1901_tmi_ext;
(void)sg_tmi;
(void)sg_tmi_ext;
return ERR_NOSUPP;
#endif
}
uint32_t phy_tmi_sg_to_i1901(uint32_t sg_tmi, uint32_t sg_tmi_ext,
uint32_t *i1901_tmi, uint32_t *i1901_tmi_ext)
{
#if (SUPPORT_SMART_GRID && SUPPORT_IEEE_1901)
uint32_t ret = ERR_OK;
if (!i1901_tmi || !i1901_tmi_ext) {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
if (sg_tmi == SG_TMI_MAX) {
*i1901_tmi_ext = I1901_IS_EXT_TMI_MODE;
if (sg_tmi_ext < 1) {
IOT_ASSERT(0);
ret = ERR_FAIL;
} else if (sg_tmi_ext < 7) {
/* sg ext tmi 1~6 to ieee1901 ext tmi(520PB) 0~5*/
*i1901_tmi = sg_tmi_ext - 1;
} else if (sg_tmi_ext < 10) {
IOT_ASSERT(0);
ret = ERR_FAIL;
} else if (sg_tmi_ext < SG_EXT_TMI_MAX) {
/* sg ext tmi 10~14 to ieee1901 ext tmi 6~10 */
*i1901_tmi = sg_tmi_ext - 4;
} else {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
} else {
/* ieee1901 not tmi 11, 12.(264PB) */
*i1901_tmi_ext = !I1901_IS_EXT_TMI_MODE;
if (sg_tmi < 11) {
*i1901_tmi = sg_tmi;
} else if (sg_tmi < 13) {
IOT_ASSERT(0);
ret = ERR_FAIL;
} else if (sg_tmi < SG_TMI_MAX) {
*i1901_tmi = sg_tmi - 2;
} else {
IOT_ASSERT(0);
ret = ERR_FAIL;
}
}
return ret;
#else
(void)sg_tmi;
(void)sg_tmi_ext;
(void)i1901_tmi;
(void)i1901_tmi_ext;
return ERR_NOSUPP;
#endif
}