390 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			390 lines
		
	
	
		
			12 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.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
#ifndef HW_TONEMAP_H
 | 
						|
#define HW_TONEMAP_H
 | 
						|
 | 
						|
#include "os_types.h"
 | 
						|
#include "iot_config.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/*expression:
 | 
						|
 *  carrier_num : band0, 411. band1, 131.
 | 
						|
 *  valid_carrier_num = floor(carrier_num/internum,1)*internum
 | 
						|
 *  symbol_num =
 | 
						|
 *         (pbsize * 8 * copy_num)/modulation_bits/turborate/valid_carrier_num
 | 
						|
 */
 | 
						|
#define OFDM_SYMBOL_PER_PB( \
 | 
						|
    PB_SIZE, ROBO, TurboRate, Modulation, valid_tone_num, InterNum) \
 | 
						|
    iot_ceil(((PB_SIZE) * 8 * (ROBO)), \
 | 
						|
        ((TurboRate) * (Modulation) * \
 | 
						|
        (((valid_tone_num/InterNum*InterNum)!=0)? \
 | 
						|
        (valid_tone_num/InterNum*InterNum):valid_tone_num)))
 | 
						|
 | 
						|
#define GI_MINI_ROBO        567
 | 
						|
#define GI_HS_ROBO          417
 | 
						|
#define GI_STD_ROBO         417
 | 
						|
#define GI_SG_ROBO_LONG     458
 | 
						|
#define GI_SG_ROBO_SHORT    264
 | 
						|
 | 
						|
#define FRAME_LENGTH_PER_PB_GP(OFDM_SYMBOL_PER_PB_VAL, GI) \
 | 
						|
    (((OFDM_SYMBOL_PER_PB_VAL) * 3072 \
 | 
						|
        + GI * ((OFDM_SYMBOL_PER_PB_VAL) - 2) \
 | 
						|
        + 2 * GI_MINI_ROBO) \
 | 
						|
    / (75))
 | 
						|
 | 
						|
/*expression:
 | 
						|
 *  fl = (symnum * 1024 + GI * (symnum - 2) + 2*458)/25
 | 
						|
 */
 | 
						|
#define FRAME_LENGTH_PER_PB_GW(OFDM_SYMBOL_PER_PB_VAL, GI) \
 | 
						|
    (((OFDM_SYMBOL_PER_PB_VAL) * 1024 \
 | 
						|
        + GI * ((OFDM_SYMBOL_PER_PB_VAL) - 2) \
 | 
						|
        + 2 * GI_SG_ROBO_LONG) \
 | 
						|
    / (25))
 | 
						|
 | 
						|
#define DELIMITER_LENGTH_AV(AV_FC_SYMBOL_num, HP101_num, Preamble_sample)  \
 | 
						|
    (((AV_FC_SYMBOL_num) * (3072 + 1374) + \
 | 
						|
        (HP101_num) * 2892 + (Preamble_sample)))
 | 
						|
 | 
						|
#define PREAMBLE_NUM       13
 | 
						|
 | 
						|
/*expression:
 | 
						|
 *  preamble = (preamble_num * 40.96 + (FC_num * (3072 + 1374) / 75))
 | 
						|
 */
 | 
						|
#define DELIMITER_LENGTH_SG(FC_num) \
 | 
						|
    (PREAMBLE_NUM * 40.96 + (FC_num * (3072 + 1374) / 75))
 | 
						|
 | 
						|
#define PB_SIZE_16  16
 | 
						|
#define PB_SIZE_40  40
 | 
						|
#define PB_SIZE_72  72
 | 
						|
#define PB_SIZE_136 136
 | 
						|
#define PB_SIZE_264 264
 | 
						|
#define PB_SIZE_520 520
 | 
						|
#define PB_SIZE_INV 0
 | 
						|
 | 
						|
#define ROBO_COPY_1 1
 | 
						|
#define ROBO_COPY_2 2
 | 
						|
#define ROBO_COPY_3 3
 | 
						|
#define ROBO_COPY_4 4
 | 
						|
#define ROBO_COPY_5 5
 | 
						|
#define ROBO_COPY_6 6
 | 
						|
#define ROBO_COPY_7 7
 | 
						|
#define ROBO_COPY_11 11
 | 
						|
 | 
						|
 | 
						|
/* Modulation has a relation to BPC
 | 
						|
 * Mapping for BPSK, QPSK, 8-QAM, 16-QAM,
 | 
						|
 * 64-QAM, 256-QAM, 1024-QAM, The Mapper
 | 
						|
 * takes 1, 2, 3, 4, 6, 8, or 10 bits
 | 
						|
 */
 | 
						|
#define MODULATION_BPSK 1
 | 
						|
#define MODULATION_QPSK 2
 | 
						|
#define MODULATION_8QAM 3
 | 
						|
#define MODULATION_16QAM 4
 | 
						|
 | 
						|
#define CODING_RATE_1_2   0
 | 
						|
#define CODING_RATE_16_18 1
 | 
						|
#define CODING_RATE_4_5   2
 | 
						|
 | 
						|
#define MAX_PB_NUM_1 1
 | 
						|
#define MAX_PB_NUM_2 2
 | 
						|
#define MAX_PB_NUM_3 3
 | 
						|
#define MAX_PB_NUM_4 4
 | 
						|
 | 
						|
#define SG_TMI_MAX 15
 | 
						|
#define SG_EXT_TMI_MAX 15 // start from 1, id:{0,7,8,9} is not used
 | 
						|
 | 
						|
#define SPG_TMI_MAX 13     // start from 0, id:{2,11,12} is not used
 | 
						|
#define SPG_EXT_TMI_MAX 15 // start from 1, id:{0,7,8,9} is not used
 | 
						|
 | 
						|
#define GP_TMI_MAX 3        // start from 0
 | 
						|
 | 
						|
#define I1901_TMI_MAX           13  //start from 0
 | 
						|
#define I1901_EXT_TMI_MAX       11  //start from 0
 | 
						|
#define I1901_IS_EXT_TMI_MODE   1
 | 
						|
 | 
						|
/* max tmi and max band in all proto */
 | 
						|
#define SG_OFDM_MAX                     (SG_TMI_MAX + SG_EXT_TMI_MAX)  //tmi + ext_tmi
 | 
						|
#define SPG_OFDM_MAX                    (SPG_TMI_MAX + SPG_EXT_TMI_MAX)
 | 
						|
#define GP_OPDM_MAX                     (GP_TMI_MAX)
 | 
						|
 | 
						|
#define INTER_1  1
 | 
						|
#define INTER_2  2
 | 
						|
#define INTER_4  4
 | 
						|
#define INTER_6  6
 | 
						|
#define INTER_8  8
 | 
						|
#define INTER_10 10
 | 
						|
#define INTER_11 11
 | 
						|
#define INTER_14 14
 | 
						|
 | 
						|
/* rate table related */
 | 
						|
#define INV_IDX                         0x1F  /* 5bit */
 | 
						|
#define INV_TMI                         INV_IDX
 | 
						|
#define INV_ETMI                        INV_TMI
 | 
						|
#define INV_KBPS                        0
 | 
						|
#define MAX_RATE_IDX                    0x1ff /* 9bits long */
 | 
						|
 | 
						|
#define TMI2IDX(tmi, etmi, maxtmi)      \
 | 
						|
    ((tmi>=0&&tmi<=(maxtmi))?((tmi<(maxtmi))?tmi:((maxtmi)+etmi)):INV_IDX)
 | 
						|
#define SGTMI2IDX(tmi, etmi)            TMI2IDX(tmi, etmi, SG_TMI_MAX)
 | 
						|
#define NWTMI2IDX(tmi, etmi)            TMI2IDX(tmi, etmi, SPG_TMI_MAX)
 | 
						|
#define I1901TMI2IDX(tmi, etmi)         SGTMI2IDX(tmi, etmi)
 | 
						|
 | 
						|
#define IDX2TMI(IDX,maxtmi)             \
 | 
						|
    ((IDX>=0&&IDX<=31)?((IDX<(maxtmi))?IDX:(maxtmi)):INV_TMI)
 | 
						|
#define SGIDX2TMI(IDX)                  IDX2TMI(IDX,SG_TMI_MAX)
 | 
						|
#define NWIDX2TMI(IDX)                  IDX2TMI(IDX,SPG_TMI_MAX)
 | 
						|
 | 
						|
#define IDX2ETMI(IDX,maxtmi)            \
 | 
						|
    ((IDX>=0&&IDX<=31)?((IDX<(maxtmi))?0:IDX-(maxtmi)):INV_ETMI)
 | 
						|
#define SGIDX2ETMI(IDX)                 IDX2ETMI(IDX,SG_TMI_MAX)
 | 
						|
#define NWIDX2ETMI(IDX)                 IDX2ETMI(IDX,SPG_TMI_MAX)
 | 
						|
 | 
						|
#define RAGET4(_TBL,IDX,_TBLITEM)       _TBL[IDX]._TBLITEM
 | 
						|
#define RAGET_THRE(IDX)                 RAGET4(g_ra_tbl,IDX,snr_thre)
 | 
						|
#define RAGET_PRID(_PRO,IDX)            \
 | 
						|
            ((_PRO == PLC_PROTO_TYPE_SG) ? (SUPPORT_IEEE_1901 ? \
 | 
						|
                RAGET4(g_ra_tbl, IDX, i1901_idx) : \
 | 
						|
                RAGET4(g_ra_tbl, IDX, sg_idx)): \
 | 
						|
            (_PRO == PLC_PROTO_TYPE_SPG) ? RAGET4(g_ra_tbl, IDX, nw_idx) : 0)
 | 
						|
#define RAGET_TP(IDX)                   RAGET4(g_ra_tbl,IDX,kbps)
 | 
						|
#define RAGET_ENA(IDX)                  RAGET4(g_ra_tbl,IDX,enabled)
 | 
						|
#define RAGET_BAND(IDX)                 RAGET4(g_ra_tbl,IDX,band_id)
 | 
						|
/*
 | 
						|
 * tonemap table entry
 | 
						|
 */
 | 
						|
typedef struct _tonemap_table_entry {
 | 
						|
    uint32_t pb_size : 10,
 | 
						|
        robo_cnt : 4,
 | 
						|
        modulation : 3,
 | 
						|
        coding_rate_idx : 1,
 | 
						|
        max_pb_num : 3;
 | 
						|
} tonemap_table_entry;
 | 
						|
 | 
						|
/* for SG/NW used only */
 | 
						|
typedef struct _robo_inter_table_entry {
 | 
						|
    uint32_t robo_cpy : 16,
 | 
						|
        inter_num : 16;
 | 
						|
} robo_inter_table_entry;
 | 
						|
 | 
						|
/*
 | 
						|
 * universal rate table start
 | 
						|
 */
 | 
						|
typedef struct _rate_tbl_entry {
 | 
						|
    uint32_t
 | 
						|
        sg_idx          : 5,
 | 
						|
        nw_idx          : 5,
 | 
						|
        i1901_idx       : 5,
 | 
						|
        kbps            : 17; /* 262Mbps max */
 | 
						|
    int8_t snr_thre; /* snr threshold required for this rate */
 | 
						|
    uint8_t
 | 
						|
        band_id         : 5, /* band id bitmap,band0 is 1,band1 is 2,... */
 | 
						|
        enabled         : 3;
 | 
						|
} rate_tbl_entry_t;
 | 
						|
 | 
						|
typedef struct _fix_rate_tbl_entry {
 | 
						|
    uint8_t bcn_136_idx;
 | 
						|
    uint8_t bcn_520_idx;
 | 
						|
    uint8_t sof_72_idx;
 | 
						|
    uint8_t sof_136_idx;
 | 
						|
    uint8_t sof_264_idx;
 | 
						|
    uint8_t sof_520_idx;
 | 
						|
    uint8_t sof_1040_idx;
 | 
						|
    uint8_t sof_1560_idx;
 | 
						|
    uint8_t sof_2080_idx;
 | 
						|
} fix_rate_tbl_entry_t;
 | 
						|
 | 
						|
typedef struct _rate_table {
 | 
						|
    rate_tbl_entry_t *tmi_pb_kbps;
 | 
						|
    uint32_t rate_num;
 | 
						|
} rate_table_t;
 | 
						|
 | 
						|
extern const rate_tbl_entry_t g_ra_tbl[];
 | 
						|
extern const fix_rate_tbl_entry_t g_fix_ra_tbl[];
 | 
						|
extern const fix_rate_tbl_entry_t g_fix_mid_ra_tbl[];
 | 
						|
extern const fix_rate_tbl_entry_t g_fix_high_ra_tbl[];
 | 
						|
 | 
						|
/*
 | 
						|
 * universal rate table end
 | 
						|
 */
 | 
						|
 | 
						|
/* get the pb_size - 72, 136, 264, 520
 | 
						|
 * if tmi = 15, then use ext_tmi
 | 
						|
 * @tmi (IN) - tmi in FC
 | 
						|
 * @ext_tmi (IN) - tmi in FC
 | 
						|
 * @pb_size (OUT) - output the pb_size
 | 
						|
 * return 0 if successful
 | 
						|
 */
 | 
						|
uint32_t phy_get_pb_size(uint32_t proto, uint32_t tmi, uint32_t ext_tmi, \
 | 
						|
    uint32_t *pb_size);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_get_pss_id       get phy pilot symbols index.
 | 
						|
 *@param proto                0:sg, 1:gp, 3:spg.
 | 
						|
 *@param tmi                  tmi in FC 0-14.
 | 
						|
 *@param ext_tmi              ext tmi in FC 1-6 10-14.
 | 
						|
 *@return                     pilot symbols index id.
 | 
						|
*/
 | 
						|
uint8_t phy_get_pss_id(uint32_t proto, uint32_t tmi, uint32_t ext_tmi);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_get_sym_per_pb   get sym num per pb.
 | 
						|
 *@param proto                0:sg, 1:gp, 3:spg.
 | 
						|
 *@param hw_band_id           band id 0-1-2.
 | 
						|
 *@param tmi                  tmi in FC 0-14.
 | 
						|
 *@param ext_tmi              ext tmi in FC 1-6 10-14.
 | 
						|
 *@param pss                  pilot symbols index id
 | 
						|
 *@return                     sym num per pb.
 | 
						|
*/
 | 
						|
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);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_get_fl_per_pb    get frame len us.
 | 
						|
 *@param proto                0:sg, 1:gp, 3:spg.
 | 
						|
 *@param hw_band_id           band id 0-1-2.
 | 
						|
 *@param tmi                  tmi in FC 0-14.
 | 
						|
 *@param ext_tmi              ext tmi in FC 1-6 10-14.
 | 
						|
 *@return                     frame len per pb.
 | 
						|
*/
 | 
						|
uint32_t phy_get_fl_per_pb(uint32_t proto, uint32_t hw_band_id, \
 | 
						|
    uint32_t tmi, uint32_t ext_tmi);
 | 
						|
 | 
						|
/* get modulation from TMI */
 | 
						|
uint32_t phy_get_pb_mod(uint32_t proto, uint32_t tmi, uint32_t ext_tmi, \
 | 
						|
    uint32_t *pb_mod);
 | 
						|
 | 
						|
/* get inter num for each robo cpy */
 | 
						|
uint32_t phy_get_robo_inter(uint32_t robo_cnt, uint32_t *robo_inter);
 | 
						|
 | 
						|
/**
 | 
						|
*@brief get max tmi idx for different proto
 | 
						|
*       currently, only SG and NW/PSG has
 | 
						|
*       tmi and ext tmi format, GP has
 | 
						|
*       only one table, so just return the table's
 | 
						|
*       size
 | 
						|
*
 | 
						|
*@param proto [plc protocol]
 | 
						|
*@exception [none]
 | 
						|
*@return [max tmi value or 0 if not supported proto]
 | 
						|
*/
 | 
						|
uint32_t phy_get_max_tmi(uint32_t proto);
 | 
						|
 | 
						|
/**
 | 
						|
*@brief get max estmi idx for different proto
 | 
						|
*       currently, only SG and NW/PSG has
 | 
						|
*       tmi and ext tmi format, GP has
 | 
						|
*       only one table, so just return the table's
 | 
						|
*       size
 | 
						|
*
 | 
						|
*@param proto [plc protocol]
 | 
						|
*@exception [none]
 | 
						|
*@return [max etmi value or 0 if not supported proto]
 | 
						|
*/
 | 
						|
uint32_t phy_get_max_etmi(uint32_t proto);
 | 
						|
 | 
						|
uint8_t phy_get_rt_sz();
 | 
						|
 | 
						|
/**
 | 
						|
*@brief get tmi ext tmi from idx for different proto
 | 
						|
*       currently, only SG and NW/PSG has
 | 
						|
*       tmi and ext tmi format, GP has
 | 
						|
*       only one table, so return tmi for it's index
 | 
						|
*
 | 
						|
*@param proto [plc protocol]
 | 
						|
*@param rid [rate tbl index]
 | 
						|
*@param tmi [tmi for return]
 | 
						|
*@param etmi [ext tmi for return]
 | 
						|
*@exception [none]
 | 
						|
*@return [max tmi value or 0 if not supported proto]
 | 
						|
*/
 | 
						|
uint32_t phy_get_tmi_by_rid(uint32_t proto, uint8_t rid, uint32_t *tmi, \
 | 
						|
    uint32_t *etmi);
 | 
						|
 | 
						|
uint32_t phy_get_rt_pbsz(uint32_t proto, uint8_t rid, uint32_t *pbsz);
 | 
						|
 | 
						|
/**
 | 
						|
*@brief phy_find_rid_by_tmi.   get rate id by tmi and ext_tmi
 | 
						|
*
 | 
						|
*@param proto [plc protocol]
 | 
						|
*@param band_id [proto_bandid]
 | 
						|
*@param rid [rate tbl index]
 | 
						|
*@param tmi [tmi for return]
 | 
						|
*@param etmi [ext tmi for return]
 | 
						|
*@exception [none]
 | 
						|
*@return [0 ok or 1 if not supported proto ]
 | 
						|
*/
 | 
						|
uint32_t phy_find_rid_by_tmi(uint32_t proto, uint32_t band_id,\
 | 
						|
        uint32_t *rid, uint32_t tmi, uint32_t etmi);
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_symppb_flppb_init   initial symppb and flppb.
 | 
						|
 *@param proto           proto: 0:sg
 | 
						|
 *@return             0: ok
 | 
						|
 */
 | 
						|
uint32_t phy_symppb_flppb_init(uint32_t proto);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_get_symppb_from_table       get symppb.
 | 
						|
 *@param hw_band_id           band id 0-1-2
 | 
						|
 *@param tmi                  tmi 0-14 ext_tmi 1-6 10-14
 | 
						|
 *@param etmi                 etmi 1-6 10-14
 | 
						|
 *@return             0: ok
 | 
						|
*/
 | 
						|
uint32_t phy_get_symppb_from_table(uint32_t hw_band_id, \
 | 
						|
    uint32_t tmi, uint32_t etmi);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_get_flppb_from_table        get flppb.
 | 
						|
 *@param hw_band_id           band id 0-1-2
 | 
						|
 *@param tmi                  tmi 0-14 ext_tmi 1-6 10-14
 | 
						|
 *@param etmi                 etmi 1-6 10-14
 | 
						|
 *@return             0: ok
 | 
						|
*/
 | 
						|
uint32_t phy_get_flppb_from_table(uint32_t hw_band_id, \
 | 
						|
    uint32_t tmi, uint32_t etmi);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_tmi_i1901_to_sg    convert tmi ieee1901 to sg
 | 
						|
 *@param i1901_tmi              ieee1901 tmi value, 0~12
 | 
						|
 *@param i1901_tmi_ext          ieee1901 tmi ext value, 0 or 1
 | 
						|
 *@param sg_tmi                 sg tmi value, 0~14
 | 
						|
 *@param sg_tmi_ext             sg tmi ext value, 1-6 10-14
 | 
						|
 *@return                       error code, see ERR_XXX
 | 
						|
*/
 | 
						|
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);
 | 
						|
 | 
						|
/**
 | 
						|
 *@brief phy_tmi_sg_to_i1901    convert tmi ieee1901 to sg
 | 
						|
 *@param sg_tmi                 sg tmi value, 0~14
 | 
						|
 *@param sg_tmi_ext             sg tmi ext value, 1-6 10-14
 | 
						|
 *@param i1901_tmi              ieee1901 tmi value, 0~12
 | 
						|
 *@param i1901_tmi_ext          ieee1901 tmi ext value, 0 or 1
 | 
						|
 *@return                       error code, see ERR_XXX
 | 
						|
*/
 | 
						|
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);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif // !HW_TONEMAP_H
 |