685 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			685 lines
		
	
	
		
			21 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 "rf_hw_tonemap.h"
 | ||
|  | #include "phy_rf_chn.h"
 | ||
|  | #include "iot_errno.h"
 | ||
|  | #include "plc_utils.h"
 | ||
|  | #include "iot_io.h"
 | ||
|  | #include "iot_utils_api.h"
 | ||
|  | 
 | ||
|  | #if HPLC_RF_DEV_SUPPORT
 | ||
|  | 
 | ||
|  | #define RF_MCS_RA_TBL_GET(_TBL, _IDX, _ITEM)    (_TBL[_IDX]._ITEM)
 | ||
|  | #define RF_MCS_RA_TBL_SZ()                      IOT_ARRAY_CNT(g_rf_mcs_ra_tbl)
 | ||
|  | #define RF_MCS_RA_PHR(_IDX)                     \
 | ||
|  |     RF_MCS_RA_TBL_GET(g_rf_mcs_ra_tbl, _IDX, phr_mcs) | ||
|  | #define RF_MCS_RA_PSDU(_IDX)                    \
 | ||
|  |     RF_MCS_RA_TBL_GET(g_rf_mcs_ra_tbl, _IDX, psdu_mcs) | ||
|  | #define RF_MCS_RA_ENA(_OPT, _IDX)               \
 | ||
|  |     (!!(RF_MCS_RA_TBL_GET(g_rf_mcs_ra_tbl, _IDX, ena_opt_bm) \ | ||
|  |     & (1 << ((_OPT) - 1)))) | ||
|  | 
 | ||
|  | typedef struct _rf_mcs_rate_tbl { | ||
|  |     uint8_t phr_mcs; | ||
|  |     uint8_t psdu_mcs; | ||
|  |     /* option enable bitmap. bit0:option1, bit1:option2 ... */ | ||
|  |     uint8_t ena_opt_bm; | ||
|  | } rf_mcs_rate_tbl_t; | ||
|  | 
 | ||
|  | /* phr fl, unit us */ | ||
|  | static uint32_t g_stf_ltf_fl = 0; | ||
|  | /* phr fl, unit us */ | ||
|  | static uint32_t g_sig_fl = 0; | ||
|  | /* phr fl, unit us */ | ||
|  | static uint32_t g_phr_fl[MCS_ID_MAX] = { 0 }; | ||
|  | /* psdu fl, unit us */ | ||
|  | static uint32_t g_psdu_fl[MCS_ID_MAX][BLOCK_SIZE_MAX] = { 0 }; | ||
|  | /* psdu fl, unit ntb */ | ||
|  | static uint32_t g_psdu_fl_ntb[MCS_ID_MAX][BLOCK_SIZE_MAX] = { 0 }; | ||
|  | /* tx sack mcs */ | ||
|  | static uint32_t g_tx_sack_mcs = 0; | ||
|  | 
 | ||
|  | /* stf + ltf + sig fl, unit ntb */ | ||
|  | static uint32_t g_stf_ltf_sig_ntb[PHY_RF_OPTION_MAX] = { 0 }; | ||
|  | 
 | ||
|  | static const rf_option_info_entry_t rf_option_tonemap[] = { | ||
|  |     {PHY_RF_OPTION1_1M, 1, 96}, | ||
|  |     {PHY_RF_OPTION2_500K, 2, 48}, | ||
|  |     {PHY_RF_OPTION3_200K, 2, 18}, | ||
|  | }; | ||
|  | 
 | ||
|  | static const rf_tonemap_table_entry rf_phr_tonemap_table[] = { | ||
|  |     /* robo_cnt,   modulation,    resv0, coding_rate_idx */ | ||
|  |     {ROBO_COPY_6, MODULATION_BPSK, 0, CODING_RATE_1_2},  // phrmcs 0
 | ||
|  |     {ROBO_COPY_4, MODULATION_BPSK, 0, CODING_RATE_1_2},  // phrmcs 1
 | ||
|  |     {ROBO_COPY_3, MODULATION_BPSK, 0, CODING_RATE_1_2},  // phrmcs 2
 | ||
|  |     {ROBO_COPY_2, MODULATION_BPSK, 0, CODING_RATE_1_2},  // phrmcs 3
 | ||
|  |     {ROBO_COPY_2, MODULATION_QPSK, 0, CODING_RATE_1_2},  // phrmcs 4
 | ||
|  |     {ROBO_COPY_1, MODULATION_QPSK, 0, CODING_RATE_1_2},  // phrmcs 5
 | ||
|  |     {ROBO_COPY_1, MODULATION_QPSK, 0, CODING_RATE_4_5},  // phrmcs 6
 | ||
|  | }; | ||
|  | 
 | ||
|  | static const rf_tonemap_table_entry rf_psdu_tonemap_table[] = { | ||
|  |     /* robo_cnt,   modulation,    resv0, coding_rate_idx */ | ||
|  |     {ROBO_COPY_4, MODULATION_BPSK,  0, CODING_RATE_1_2},   // psdumcs 0
 | ||
|  |     {ROBO_COPY_2, MODULATION_BPSK,  0, CODING_RATE_1_2},   // psdumcs 1
 | ||
|  |     {ROBO_COPY_2, MODULATION_QPSK,  0, CODING_RATE_1_2},   // psdumcs 2
 | ||
|  |     {ROBO_COPY_1, MODULATION_QPSK,  0, CODING_RATE_1_2},   // psdumcs 3
 | ||
|  |     {ROBO_COPY_1, MODULATION_QPSK,  0, CODING_RATE_4_5},   // psdumcs 4
 | ||
|  |     {ROBO_COPY_1, MODULATION_16QAM, 0, CODING_RATE_1_2},   // psdumcs 5
 | ||
|  |     {ROBO_COPY_1, MODULATION_16QAM, 0, CODING_RATE_4_5},   // psdumcs 6
 | ||
|  | }; | ||
|  | 
 | ||
|  | static const robo_inter_table_entry rf_option1_2_robo_inter_table[] = { | ||
|  |     {ROBO_COPY_1,  INTER_1}, // id 0
 | ||
|  |     {ROBO_COPY_2,  INTER_4}, // id 1
 | ||
|  |     {ROBO_COPY_3,  INTER_6}, // id 2
 | ||
|  |     {ROBO_COPY_4,  INTER_4}, // id 3
 | ||
|  |     {ROBO_COPY_6,  INTER_6}, // id 4
 | ||
|  | }; | ||
|  | 
 | ||
|  | static const robo_inter_table_entry rf_option3_robo_inter_table[] = { | ||
|  |     {ROBO_COPY_1,  INTER_1}, // id 0
 | ||
|  |     {ROBO_COPY_2,  INTER_2}, // id 1
 | ||
|  |     {ROBO_COPY_3,  INTER_6}, // id 2
 | ||
|  |     {ROBO_COPY_4,  INTER_4}, // id 3
 | ||
|  |     {ROBO_COPY_6,  INTER_6}, // id 4
 | ||
|  | }; | ||
|  | 
 | ||
|  | /* NOTE: option3 phrmcs need start with 2 for rf certification test */ | ||
|  | /* NOTE: option3 pldmcs need start with 1 for rf certification test */ | ||
|  | static const rf_mcs_rate_tbl_t g_rf_mcs_ra_tbl[] = { | ||
|  | /*      phr_mcs,  psdu_mcs, option enable bitmap         */ | ||
|  | /*00*/  { 0,        0,      0x03 }, /* snr: -6.78, -5.02 */ | ||
|  | /*01*/  { 0,        1,      0x03 }, /* snr: -6.78, -2.01 */ | ||
|  | /*02*/  { 1,        0,      0x03 }, /* snr: -5.02, -5.02 */ | ||
|  | /*03*/  { 2,        1,      0x07 }, /* snr: -3.77, -2.01 */ | ||
|  | /*04*/  { 2,        2,      0x07 }, /* snr: -3.77,  0.99 */ | ||
|  | /*05*/  { 3,        1,      0x07 }, /* snr: -2.01, -2.01 */ | ||
|  | /*06*/  { 4,        2,      0x07 }, /* snr:  0.99,  0.99 */ | ||
|  | /*07*/  { 5,        3,      0x07 }, /* snr:  4,     4 */ | ||
|  | /*08*/  { 6,        4,      0x07 }, /* snr:  6.50,  6.50 */ | ||
|  | /*09*/  { 6,        5,      0x07 }, /* snr:  6.50,  10 */ | ||
|  | /*10*/  { 6,        6,      0x07 }, /* snr:  6.50,  12.50 */ | ||
|  | }; | ||
|  | 
 | ||
|  | static const rf_mcs_table_t g_rf_bcn_fix_mcs_tlb[][BLOCK_SIZE_MAX] = { | ||
|  |     /* option 1 */ | ||
|  |     { | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  0    ,   1 },    // bcn 16byte  snr:  -6.78      -2.01    4.46
 | ||
|  |         {  0    ,   1 },    // bcn 40byte  snr:  -6.78      -2.01    5.69
 | ||
|  |         {  0    ,   1 },    // bcn 72byte  snr:  -6.78      -2.01    7.23
 | ||
|  |         {  0    ,   1 },    // bcn 136byte snr:  -6.78      -2.01    10.61
 | ||
|  |         {  0    ,   1 },    // bcn 264byte snr:  -6.78      -2.01    17.06
 | ||
|  |         {  0    ,   1 },    // bcn 520byte snr:  -6.78      -2.01    30.27
 | ||
|  |     }, | ||
|  |     /* option 2 */ | ||
|  |     { | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  0    ,   1 },    // bcn 16byte  snr:  -6.78      -2.01    7.84
 | ||
|  |         {  0    ,   1 },    // bcn 40byte  snr:  -6.78      -2.01    10.30
 | ||
|  |         {  0    ,   1 },    // bcn 72byte  snr:  -6.78      -2.01    13.52
 | ||
|  |         {  0    ,   1 },    // bcn 136byte snr:  -6.78      -2.01    20.13
 | ||
|  |         {  0    ,   1 },    // bcn 264byte snr:  -6.78      -2.01    33.19
 | ||
|  |         {  0    ,   2 },    // bcn 520byte snr:  -6.78      0.99     32.88
 | ||
|  |     }, | ||
|  |     /* option 3 */ | ||
|  |     { | ||
|  |     /* NOTE: option3 phrmcs need start with 2 for rf certification test */ | ||
|  |     /* NOTE: option3 pldmcs need start with 1 for rf certification test */ | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  2    ,   2 },    // bcn 16byte  snr:  -3.77      0.99     10.15
 | ||
|  |         {  2    ,   2 },    // bcn 40byte  snr:  -3.77      0.99     13.38
 | ||
|  |         {  2    ,   2 },    // bcn 72byte  snr:  -3.77      0.99     17.68
 | ||
|  |         {  2    ,   2 },    // bcn 136byte snr:  -3.77      0.99     26.43
 | ||
|  |         {  3    ,   2 },    // bcn 264byte snr:  -2.01      0.99     41.76
 | ||
|  |         {  3    ,   3 },    // bcn 520byte snr:  -2.01      4        41.33
 | ||
|  |     }, | ||
|  | }; | ||
|  | 
 | ||
|  | static const rf_mcs_table_t g_rf_sof_fix_mcs_tlb[][BLOCK_SIZE_MAX] = { | ||
|  |     /* option 1 */ | ||
|  |     { | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  0    ,   1 },    // sof 16byte  snr:  -6.78      -2.01    4.46
 | ||
|  |         {  0    ,   1 },    // sof 40byte  snr:  -6.78      -2.01    5.69
 | ||
|  |         {  0    ,   1 },    // sof 72byte  snr:  -6.78      -2.01    7.23
 | ||
|  |         {  0    ,   1 },    // sof 136byte snr:  -6.78      -2.01    10.61
 | ||
|  |         {  0    ,   1 },    // sof 264byte snr:  -6.78      -2.01    17.06
 | ||
|  |         {  0    ,   1 },    // sof 520byte snr:  -6.78      -2.01    30.27
 | ||
|  |     }, | ||
|  |     /* option 2 */ | ||
|  |     { | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  0    ,   1 },    // sof 16byte  snr:  -6.78      -2.01    7.84
 | ||
|  |         {  0    ,   1 },    // sof 40byte  snr:  -6.78      -2.01    10.30
 | ||
|  |         {  0    ,   1 },    // sof 72byte  snr:  -6.78      -2.01    13.52
 | ||
|  |         {  0    ,   1 },    // sof 136byte snr:  -6.78      -2.01    20.13
 | ||
|  |         {  0    ,   1 },    // sof 264byte snr:  -6.78      -2.01    33.19
 | ||
|  |         {  0    ,   2 },    // sof 520byte snr:  -6.78      0.99     32.88
 | ||
|  |     }, | ||
|  |     /* option 3 */ | ||
|  |     { | ||
|  |     /* NOTE: option3 phrmcs need start with 2 for rf certification test */ | ||
|  |     /* NOTE: option3 pldmcs need start with 1 for rf certification test */ | ||
|  |     /*  phr_mcs ,  psdu_mcs ******************* phr_mcs ,  psdu_mcs  fl/ms    */ | ||
|  |         {  2    ,   2 },    // sof 16byte  snr:  -3.77      0.99    10.15
 | ||
|  |         {  2    ,   2 },    // sof 40byte  snr:  -3.77      0.99    13.38
 | ||
|  |         {  2    ,   2 },    // sof 72byte  snr:  -3.77      0.99    17.68
 | ||
|  |         {  2    ,   2 },    // sof 136byte snr:  -3.77      0.99    26.43
 | ||
|  |         {  2    ,   2 },    // sof 264byte snr:  -3.77      0.99    43.94
 | ||
|  |         {  2    ,   3 },    // sof 520byte snr:  -3.77      4       43.48
 | ||
|  |     }, | ||
|  | }; | ||
|  | 
 | ||
|  | /* get fix mcs */ | ||
|  | #define PHY_RF_GET_BCN_FIX_MCS(option, idx) (&g_rf_bcn_fix_mcs_tlb[option][idx])
 | ||
|  | #define PHY_RF_GET_SOF_FIX_MCS(option, idx) (&g_rf_sof_fix_mcs_tlb[option][idx])
 | ||
|  | 
 | ||
|  | /* get phr param by phr mcs */ | ||
|  | #define PHY_RF_GET_PHR_MCS_PARAM(phr_mcs) (&rf_phr_tonemap_table[phr_mcs])
 | ||
|  | 
 | ||
|  | /* get psdu param by psdu mcs */ | ||
|  | #define PHY_RF_GET_PSDU_MCS_PARAM(psdu_mcs) (&rf_psdu_tonemap_table[psdu_mcs])
 | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_robo_inter(uint32_t option, uint32_t robo_cnt, | ||
|  |     uint32_t *robo_inter) | ||
|  | { | ||
|  |     uint32_t i, ret = ERR_OK; | ||
|  |     if (option == PHY_RF_OPTION1_1M || option == PHY_RF_OPTION2_500K) { | ||
|  |         for (i = 0; i < sizeof(rf_option1_2_robo_inter_table); i++) { | ||
|  |             if(rf_option1_2_robo_inter_table[i].robo_cpy == robo_cnt) { | ||
|  |                 *robo_inter = rf_option1_2_robo_inter_table[i].inter_num; | ||
|  |                 break; | ||
|  |             } | ||
|  |         } | ||
|  |         if (sizeof(rf_option1_2_robo_inter_table) == i) { | ||
|  |             IOT_ASSERT(0); | ||
|  |             ret = ERR_FAIL; | ||
|  |         } else { | ||
|  |             ret = ERR_OK; | ||
|  |         } | ||
|  |     } else if (option == PHY_RF_OPTION3_200K) { | ||
|  |         for (i = 0; i < sizeof(rf_option3_robo_inter_table); i++) { | ||
|  |             if(rf_option3_robo_inter_table[i].robo_cpy == robo_cnt) { | ||
|  |                 *robo_inter = rf_option3_robo_inter_table[i].inter_num; | ||
|  |                 break; | ||
|  |             } | ||
|  |         } | ||
|  |         if (sizeof(rf_option3_robo_inter_table) == i) { | ||
|  |             IOT_ASSERT(0); | ||
|  |             ret = ERR_FAIL; | ||
|  |         } else { | ||
|  |             ret = ERR_OK; | ||
|  |         } | ||
|  |     } else { | ||
|  |         IOT_ASSERT(0); | ||
|  |     } | ||
|  | 
 | ||
|  |     return ret; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_vld_tone_num(uint32_t option) | ||
|  | { | ||
|  |     uint32_t i; | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX); | ||
|  |     for (i = 0; i < sizeof(rf_option_tonemap); i++) { | ||
|  |         if (rf_option_tonemap[i].option == option) { | ||
|  |             return rf_option_tonemap[i].vld_tone_num; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (sizeof(rf_option_tonemap) == i) { | ||
|  |         IOT_ASSERT(0); | ||
|  |     } | ||
|  | 
 | ||
|  |     return ERR_FAIL; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_sig_num(uint32_t option) | ||
|  | { | ||
|  |     uint32_t i; | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX); | ||
|  |     for (i = 0; i < sizeof(rf_option_tonemap); i++) { | ||
|  |         if (rf_option_tonemap[i].option == option) { | ||
|  |             return rf_option_tonemap[i].sig_symbol_num; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (sizeof(rf_option_tonemap) == i) { | ||
|  |         IOT_ASSERT(0); | ||
|  |     } | ||
|  | 
 | ||
|  |     return ERR_FAIL; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_phr_sym(uint32_t option, uint32_t phr_mcs) | ||
|  | { | ||
|  |     uint32_t pbsz = RF_PHR_LEN; | ||
|  |     uint32_t robo_inter = 0; | ||
|  |     float coding_rate = 0; | ||
|  |     uint32_t vld_tone_num = 0; | ||
|  |     uint32_t sym_ppb; | ||
|  |     const rf_tonemap_table_entry *phr_param = PHY_RF_GET_PHR_MCS_PARAM(phr_mcs); | ||
|  | 
 | ||
|  |     phy_rf_get_robo_inter(option, phr_param->robo_cnt, &robo_inter); | ||
|  | 
 | ||
|  |     if(phr_param->coding_rate_idx == CODING_RATE_1_2){ | ||
|  |         coding_rate = 0.5; | ||
|  |     } else if(phr_param->coding_rate_idx == CODING_RATE_4_5){ | ||
|  |         coding_rate = (float)(4.0/5.0); | ||
|  |     } else { | ||
|  |         IOT_ASSERT(0); | ||
|  |     } | ||
|  | 
 | ||
|  |     /* get vaild tone */ | ||
|  |     vld_tone_num = phy_rf_get_vld_tone_num(option); | ||
|  | 
 | ||
|  |     sym_ppb = (uint32_t)OFDM_SYMBOL_PER_PB(pbsz, | ||
|  |             phr_param->robo_cnt, | ||
|  |             coding_rate, | ||
|  |             phr_param->modulation, | ||
|  |             vld_tone_num, | ||
|  |             robo_inter); | ||
|  | 
 | ||
|  |     return sym_ppb; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_psdu_sym(uint32_t option, uint32_t psdu_mcs, | ||
|  |     uint32_t pb_idx) | ||
|  | { | ||
|  |     uint32_t pbsz; | ||
|  |     uint32_t robo_inter = 0; | ||
|  |     float coding_rate = 0; | ||
|  |     uint32_t vld_tone_num = 0; | ||
|  |     uint32_t sym_ppb; | ||
|  |     const rf_tonemap_table_entry *psdu_param = PHY_RF_GET_PSDU_MCS_PARAM(psdu_mcs); | ||
|  | 
 | ||
|  |     phy_rf_get_robo_inter(option, psdu_param->robo_cnt, &robo_inter); | ||
|  | 
 | ||
|  |     if(psdu_param->coding_rate_idx == CODING_RATE_1_2){ | ||
|  |         coding_rate = 0.5; | ||
|  |     } else if(psdu_param->coding_rate_idx == CODING_RATE_4_5){ | ||
|  |         coding_rate = (float)(4.0/5.0); | ||
|  |     } else { | ||
|  |         IOT_ASSERT(0); | ||
|  |     } | ||
|  |     pbsz = phy_rf_get_pbsz((uint8_t)pb_idx); | ||
|  |     /* get vaild tone */ | ||
|  |     vld_tone_num = phy_rf_get_vld_tone_num(option); | ||
|  | 
 | ||
|  |     sym_ppb = (uint32_t)OFDM_SYMBOL_PER_PB(pbsz, | ||
|  |             psdu_param->robo_cnt, | ||
|  |             coding_rate, | ||
|  |             psdu_param->modulation, | ||
|  |             vld_tone_num, | ||
|  |             robo_inter); | ||
|  | 
 | ||
|  |     return sym_ppb; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_stf_ltf_frame_len(uint32_t option) | ||
|  | { | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX); | ||
|  |     if (option == PHY_RF_OPTION1_1M || option == PHY_RF_OPTION2_500K) { | ||
|  |         return STF_LTF_OPTION1_2_LEN; | ||
|  |     } else if (option == PHY_RF_OPTION3_200K) { | ||
|  |         return STF_LTF_OPTION3_LEN; | ||
|  |     } | ||
|  | 
 | ||
|  |     return ERR_FAIL; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_sig_frame_len(uint32_t option) | ||
|  | { | ||
|  |     uint32_t sig_num; | ||
|  |     uint32_t sig_fl = 0; | ||
|  | 
 | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX); | ||
|  | 
 | ||
|  |     sig_num = phy_rf_get_sig_num(option); | ||
|  | 
 | ||
|  |     sig_fl = sig_num * PER_SIG_LEN; | ||
|  | 
 | ||
|  |     return sig_fl; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_phr_frame_len(uint32_t option, uint32_t phr_mcs) | ||
|  | { | ||
|  |     uint32_t sym_num = 0; | ||
|  |     uint32_t phr_len = 0; | ||
|  | 
 | ||
|  |     sym_num = phy_rf_get_phr_sym(option, phr_mcs); | ||
|  |     phr_len = sym_num * PER_SIG_LEN; | ||
|  | 
 | ||
|  |     /* unit us */ | ||
|  |     return phr_len; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_psdu_frame_len(uint32_t option, uint32_t psdu_mcs, | ||
|  |     uint32_t pb_idx) | ||
|  | { | ||
|  |     uint32_t sym_num = 0; | ||
|  |     uint32_t psdu_len = 0; | ||
|  | 
 | ||
|  |     sym_num = phy_rf_get_psdu_sym(option, psdu_mcs, pb_idx); | ||
|  |     psdu_len = sym_num * PSDU_SYMBOL_LEN; | ||
|  | 
 | ||
|  |     /* unit ntb */ | ||
|  |     return psdu_len; | ||
|  | } | ||
|  | 
 | ||
|  | static uint32_t phy_rf_get_tx_sack_phr_mcs(uint32_t option) | ||
|  | { | ||
|  |     uint32_t phr_mcs = MCS_ID_0; | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX); | ||
|  |     /* NOTE: option3 phrmcs need start with 2 for rf certification test */ | ||
|  |     if (PHY_RF_OPTION3_200K == option) { | ||
|  |         phr_mcs = MCS_ID_2; | ||
|  |     } | ||
|  |     return phr_mcs; | ||
|  | } | ||
|  | 
 | ||
|  | static void phy_rf_stf_ltf_sig_fl_init() | ||
|  | { | ||
|  |     uint32_t option = 0; | ||
|  |     for (option = PHY_RF_OPTION1_1M; option < PHY_RF_OPTION_MAX; option++) { | ||
|  |         g_stf_ltf_sig_ntb[option] = phy_rf_get_stf_ltf_frame_len(option) + | ||
|  |             phy_rf_get_sig_frame_len(option); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t fl_debug() | ||
|  | { | ||
|  |     uint32_t stf_ltf_fl = 0; | ||
|  |     uint32_t sig_fl = 0; | ||
|  |     uint32_t fl = 0; | ||
|  |     uint32_t option = 0, phr_mcs, phr_sym, psdu_mcs, psdu_sym, pb_idx; | ||
|  |     uint32_t phr_fl, psdu_fl; | ||
|  |     for (option = PHY_RF_OPTION1_1M; option < PHY_RF_OPTION_MAX; option++) { | ||
|  |         stf_ltf_fl = phy_rf_get_stf_ltf_frame_len(option); | ||
|  |         sig_fl = phy_rf_get_sig_frame_len(option); | ||
|  |         for (pb_idx = BLOCK_SIZE_0; pb_idx < BLOCK_SIZE_MAX; pb_idx++) { | ||
|  |             for (phr_mcs = MCS_ID_0; phr_mcs < MCS_ID_MAX; phr_mcs++) { | ||
|  |                 phr_sym = phy_rf_get_phr_sym(option, phr_mcs); | ||
|  |                 for (psdu_mcs = MCS_ID_0; psdu_mcs < MCS_ID_MAX; psdu_mcs++) { | ||
|  |                     psdu_sym = phy_rf_get_psdu_sym(option, psdu_mcs, pb_idx); | ||
|  |                     phr_fl = phy_rf_get_phr_frame_len(option, phr_mcs); | ||
|  |                     psdu_fl = phy_rf_get_psdu_frame_len(option, | ||
|  |                         psdu_mcs, pb_idx); | ||
|  |                     fl = (stf_ltf_fl + sig_fl + phr_fl + psdu_fl) / 25; | ||
|  |                     iot_printf("option:%d, phr_mcs:%d, psdu_mcs:%d, pb_idx:%d, " | ||
|  |                         "phr_sym:%d, psdu_sym:%d, phr_fl:%d, psdu_fl:%d, fl:%d\n", | ||
|  |                         option, phr_mcs, psdu_mcs, pb_idx, phr_sym, psdu_sym, | ||
|  |                         phr_fl, psdu_fl, fl); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_fl_init(uint32_t option) | ||
|  | { | ||
|  |     float tmp = 0; | ||
|  |     /* stf ltf init */ | ||
|  |     tmp = (float)phy_rf_get_stf_ltf_frame_len(option) / 25; | ||
|  |     g_stf_ltf_fl = iot_float_ceil(tmp); | ||
|  |     /* sig init */ | ||
|  |     tmp = (float)phy_rf_get_sig_frame_len(option) / 25; | ||
|  |     g_sig_fl = iot_float_ceil(tmp); | ||
|  |     /* phy header init */ | ||
|  |     for (uint32_t phr_mcs = 0; phr_mcs < MCS_ID_MAX; phr_mcs++) { | ||
|  |         tmp = (float)phy_rf_get_phr_frame_len(option, phr_mcs) / 25; | ||
|  |         g_phr_fl[phr_mcs] = iot_float_ceil(tmp); | ||
|  |     } | ||
|  | 
 | ||
|  |     /* psdu init */ | ||
|  |     for (uint32_t psdu_mcs = 0; psdu_mcs < MCS_ID_MAX; psdu_mcs++) { | ||
|  |         for (uint32_t pbidx = BLOCK_SIZE_0; pbidx < BLOCK_SIZE_MAX; pbidx++) { | ||
|  |             g_psdu_fl_ntb[psdu_mcs][pbidx] = phy_rf_get_psdu_frame_len(option, | ||
|  |                 psdu_mcs, pbidx); | ||
|  |             tmp = (float)g_psdu_fl_ntb[psdu_mcs][pbidx] / 25; | ||
|  |             g_psdu_fl[psdu_mcs][pbidx] = iot_float_ceil(tmp); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* init stf ltf sig fl, uint ntb */ | ||
|  |     phy_rf_stf_ltf_sig_fl_init(); | ||
|  | 
 | ||
|  |     /* init tx sack mcs */ | ||
|  |     g_tx_sack_mcs = phy_rf_get_tx_sack_phr_mcs(option); | ||
|  | 
 | ||
|  |     /* fl debug */ | ||
|  |     //fl_debug();
 | ||
|  | 
 | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_stf_ltf_fl() | ||
|  | { | ||
|  |     return g_stf_ltf_fl; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_sig_fl() | ||
|  | { | ||
|  |     return g_sig_fl; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_phr_fl(uint32_t phr_mcs) | ||
|  | { | ||
|  |     IOT_ASSERT(phr_mcs < MCS_ID_MAX); | ||
|  |     return g_phr_fl[phr_mcs]; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_psdu_fl(uint32_t psdu_mcs, uint32_t pb_idx) | ||
|  | { | ||
|  |     IOT_ASSERT(psdu_mcs < MCS_ID_MAX && pb_idx < BLOCK_SIZE_MAX); | ||
|  |     return g_psdu_fl[psdu_mcs][pb_idx]; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_psdu_fl_ntb(uint32_t psdu_mcs, uint32_t pb_idx) | ||
|  | { | ||
|  |     IOT_ASSERT(psdu_mcs < MCS_ID_MAX && pb_idx < BLOCK_SIZE_MAX); | ||
|  |     return g_psdu_fl_ntb[psdu_mcs][pb_idx]; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_stf_ltf_sig_fl(uint32_t option) | ||
|  | { | ||
|  |     return g_stf_ltf_sig_ntb[option]; | ||
|  | } | ||
|  | 
 | ||
|  | const rf_mcs_table_t *phy_rf_get_bcn_fix_mcs(uint32_t option, | ||
|  |     uint32_t pb_sz_idx) | ||
|  | { | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX && pb_sz_idx < BLOCK_SIZE_MAX); | ||
|  |     return PHY_RF_GET_BCN_FIX_MCS((option - 1), pb_sz_idx); | ||
|  | } | ||
|  | 
 | ||
|  | const rf_mcs_table_t *phy_rf_get_sof_fix_mcs(uint32_t option, | ||
|  |     uint32_t pb_sz_idx) | ||
|  | { | ||
|  |     IOT_ASSERT(option < PHY_RF_OPTION_MAX && pb_sz_idx < BLOCK_SIZE_MAX); | ||
|  |     return PHY_RF_GET_SOF_FIX_MCS((option - 1), pb_sz_idx); | ||
|  | } | ||
|  | 
 | ||
|  | void phy_rf_get_ra_idx_range(uint8_t option, uint8_t *start, uint8_t *end) | ||
|  | { | ||
|  |     if (RF_OPTION_3 == option) { | ||
|  |         *start = 3; | ||
|  |     } else { | ||
|  |         *start = 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     *end = RF_MCS_RA_TBL_SZ(); | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_ra_idx_mcs(uint8_t option, uint8_t idx, uint8_t *phr_mcs, | ||
|  |     uint8_t *psdu_mcs) | ||
|  | { | ||
|  |     if (RF_MCS_RA_ENA(option, idx)) { | ||
|  |         *phr_mcs = RF_MCS_RA_PHR(idx); | ||
|  |         *psdu_mcs = RF_MCS_RA_PSDU(idx); | ||
|  |         return ERR_OK; | ||
|  |     } else { | ||
|  |         return ERR_NOSUPP; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_tx_sack_mcs() | ||
|  | { | ||
|  |     return g_tx_sack_mcs; | ||
|  | } | ||
|  | 
 | ||
|  | #else /* !HPLC_RF_DEV_SUPPORT */
 | ||
|  | 
 | ||
|  | uint32_t phy_rf_fl_init(uint32_t option) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     return ERR_OK; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_stf_ltf_fl() | ||
|  | { | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_sig_fl() | ||
|  | { | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_phr_fl(uint32_t phr_mcs) | ||
|  | { | ||
|  |     (void)phr_mcs; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_psdu_fl(uint32_t psdu_mcs, uint32_t pb_idx) | ||
|  | { | ||
|  |     (void)psdu_mcs; | ||
|  |     (void)pb_idx; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_psdu_fl_ntb(uint32_t psdu_mcs, uint32_t pb_idx) | ||
|  | { | ||
|  |     (void)psdu_mcs; | ||
|  |     (void)pb_idx; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_stf_ltf_sig_fl(uint32_t option) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     return 0; | ||
|  | } | ||
|  | 
 | ||
|  | const rf_mcs_table_t *phy_rf_get_bcn_fix_mcs(uint32_t option, | ||
|  |     uint32_t pb_sz_idx) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     (void)pb_sz_idx; | ||
|  |     return NULL; | ||
|  | } | ||
|  | 
 | ||
|  | const rf_mcs_table_t *phy_rf_get_sof_fix_mcs(uint32_t option, | ||
|  |     uint32_t pb_sz_idx) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     (void)pb_sz_idx; | ||
|  |     return NULL; | ||
|  | } | ||
|  | 
 | ||
|  | void phy_rf_get_ra_idx_range(uint8_t option, uint8_t *start, uint8_t *end) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     (void)start; | ||
|  |     (void)end; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_ra_idx_mcs(uint8_t option, uint8_t idx, uint8_t *phr_mcs, | ||
|  |     uint8_t *psdu_mcs) | ||
|  | { | ||
|  |     (void)option; | ||
|  |     (void)idx; | ||
|  |     (void)phr_mcs; | ||
|  |     (void)psdu_mcs; | ||
|  |     return ERR_NOSUPP; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_g_tx_sack_mcs() | ||
|  | { | ||
|  |     return MCS_ID_MAX; | ||
|  | } | ||
|  | 
 | ||
|  | #endif /* HPLC_RF_DEV_SUPPORT */
 | ||
|  | 
 | ||
|  | uint8_t phy_rf_get_blkz(uint32_t pbsz) | ||
|  | { | ||
|  |     uint8_t blkz = BLOCK_SIZE_MAX; | ||
|  |     switch (pbsz) { | ||
|  |     case PB_SIZE_16: | ||
|  |         blkz = BLOCK_SIZE_0; | ||
|  |         break; | ||
|  |     case PB_SIZE_40: | ||
|  |         blkz = BLOCK_SIZE_1; | ||
|  |         break; | ||
|  |     case PB_SIZE_72: | ||
|  |         blkz = BLOCK_SIZE_2; | ||
|  |         break; | ||
|  |     case PB_SIZE_136: | ||
|  |         blkz = BLOCK_SIZE_3; | ||
|  |         break; | ||
|  |     case PB_SIZE_264: | ||
|  |         blkz = BLOCK_SIZE_4; | ||
|  |         break; | ||
|  |     case PB_SIZE_520: | ||
|  |         blkz = BLOCK_SIZE_5; | ||
|  |         break; | ||
|  |     default: | ||
|  |         IOT_ASSERT(0); | ||
|  |         break; | ||
|  |     } | ||
|  |     return blkz; | ||
|  | } | ||
|  | 
 | ||
|  | uint32_t phy_rf_get_pbsz(uint8_t blkz) | ||
|  | { | ||
|  |     switch (blkz) { | ||
|  |     case BLOCK_SIZE_0: | ||
|  |         return PB_SIZE_16; | ||
|  |     case BLOCK_SIZE_1: | ||
|  |         return PB_SIZE_40; | ||
|  |     case BLOCK_SIZE_2: | ||
|  |         return PB_SIZE_72; | ||
|  |     case BLOCK_SIZE_3: | ||
|  |         return PB_SIZE_136; | ||
|  |     case BLOCK_SIZE_4: | ||
|  |         return PB_SIZE_264; | ||
|  |     case BLOCK_SIZE_5: | ||
|  |         return PB_SIZE_520; | ||
|  |     default: | ||
|  |         IOT_ASSERT(0); | ||
|  |         break; | ||
|  |     } | ||
|  |     return PB_SIZE_INV; | ||
|  | } | ||
|  | 
 |