Files
kunlun/plc/halphy/inc/hw_tonemap.h
2024-09-28 14:24:04 +08:00

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