884 lines
26 KiB
C
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
|
|
}
|