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
							 | 
						||
| 
								 | 
							
								}
							 |