194 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			194 lines
		
	
	
		
			6.5 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 "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "plc_beacon.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rf_chn.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* phy rf band info structure */
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    /* current band */
							 | 
						||
| 
								 | 
							
								    PHY_RF_BAND_T cur_band;
							 | 
						||
| 
								 | 
							
								    /* the maximum channel number corresponding to each option in the
							 | 
						||
| 
								 | 
							
								     * current band.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t ch_max[RF_OPTION_MAX + 1];
							 | 
						||
| 
								 | 
							
								    /* the default option for the current band */
							 | 
						||
| 
								 | 
							
								    uint8_t default_opt;
							 | 
						||
| 
								 | 
							
								    /* the default channel for the current band */
							 | 
						||
| 
								 | 
							
								    uint8_t default_ch;
							 | 
						||
| 
								 | 
							
								    /* rf tx power min value */
							 | 
						||
| 
								 | 
							
								    int8_t rf_tx_pwr_min;
							 | 
						||
| 
								 | 
							
								    /* rf tx power max value */
							 | 
						||
| 
								 | 
							
								    int8_t rf_tx_pwr_max;
							 | 
						||
| 
								 | 
							
								    /* rf tx power default value */
							 | 
						||
| 
								 | 
							
								    int8_t rf_tx_pwr_def;
							 | 
						||
| 
								 | 
							
								    /* rf tx full power value */
							 | 
						||
| 
								 | 
							
								    int8_t rf_tx_full_pwr;
							 | 
						||
| 
								 | 
							
								    /* flasg to mark if initialized */
							 | 
						||
| 
								 | 
							
								    uint8_t inited : 1,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* reserved for further use */
							 | 
						||
| 
								 | 
							
								            rsvd   : 7;
							 | 
						||
| 
								 | 
							
								} phy_rf_band_info_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static phy_rf_band_info_t g_phy_rf_band_info = { 0 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_band_info_init(PHY_RF_BAND_T band_sel)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (band_sel == PHY_RF_BAND_OVERSEAS) {
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION1_1M - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_OVERSEAS_OPT1_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION2_500K - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_OVERSEAS_OPT2_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION3_200K - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_OVERSEAS_OPT3_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.default_ch = 51;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.default_opt = RF_OPTION_2;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_min = RF_TX_PWR_MIN_DBM_OVERSEAS;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_max = RF_TX_PWR_MAX_DBM_OVERSEAS;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_def = RF_TX_PWR_DEF_DBM_OVERSEAS;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_full_pwr = RF_TX_FULL_PWR_DBM_OVERSEAS;
							 | 
						||
| 
								 | 
							
								    } else if (band_sel == PHY_RF_BAND_NSG) {
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION1_1M - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_NSG_OPT1_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION2_500K - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_NSG_OPT2_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.ch_max[PHY_RF_OPTION3_200K - 1] =
							 | 
						||
| 
								 | 
							
								            PHY_RF_BAND_NSG_OPT3_CH_ID_MAX;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.default_ch = RF_CHANNEL_ID_16;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.default_opt = RF_OPTION_2;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_min = RF_TX_PWR_MIN_DBM_NSG;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_max = RF_TX_PWR_MAX_DBM_NSG;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_pwr_def = RF_TX_PWR_DEF_DBM_NSG;
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.rf_tx_full_pwr = RF_TX_FULL_PWR_DBM_NSG;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    g_phy_rf_band_info.cur_band = band_sel;
							 | 
						||
| 
								 | 
							
								    g_phy_rf_band_info.inited = 1;
							 | 
						||
| 
								 | 
							
								    iot_printf("%s band_sel = %lu\n", __FUNCTION__,
							 | 
						||
| 
								 | 
							
								        g_phy_rf_band_info.cur_band);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PHY_RF_BAND_T phy_rf_get_band_sel()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.inited == 0) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return g_phy_rf_band_info.cur_band;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_get_power(int8_t *min, int8_t *max, int8_t *def, int8_t *full)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.inited == 0) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (min != NULL) {
							 | 
						||
| 
								 | 
							
								        *min = g_phy_rf_band_info.rf_tx_pwr_min;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (max != NULL) {
							 | 
						||
| 
								 | 
							
								        *max = g_phy_rf_band_info.rf_tx_pwr_max;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (def != NULL) {
							 | 
						||
| 
								 | 
							
								        *def = g_phy_rf_band_info.rf_tx_pwr_def;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (full != NULL) {
							 | 
						||
| 
								 | 
							
								        *full = g_phy_rf_band_info.rf_tx_full_pwr;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void phy_rf_get_default_cfg(uint8_t *opt, uint8_t *ch)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.inited == 0) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    *opt = g_phy_rf_band_info.default_opt;
							 | 
						||
| 
								 | 
							
								    *ch = g_phy_rf_band_info.default_ch;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_rf_get_channel_id_max(uint32_t option)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.inited == 0) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return g_phy_rf_band_info.ch_max[option - 1];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t phy_rf_get_channel_freq_by_id(uint32_t option, uint32_t channel_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t freq = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t spacing = 0;
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.inited == 0) {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (g_phy_rf_band_info.cur_band == PHY_RF_BAND_OVERSEAS) {
							 | 
						||
| 
								 | 
							
								        if (PHY_RF_OPTION1_1M == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION1_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            if (channel_id > 12) {
							 | 
						||
| 
								 | 
							
								                channel_id -= 12;
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT1_CH13_CF;
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT1_CH1_CF;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else if (PHY_RF_OPTION2_500K == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION2_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            if (channel_id > 25) {
							 | 
						||
| 
								 | 
							
								                channel_id -= 25;
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT2_CH26_CF;
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT2_CH1_CF;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else if (PHY_RF_OPTION3_200K == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION3_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            if (channel_id > 64) {
							 | 
						||
| 
								 | 
							
								                channel_id -= 64;
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT3_CH65_CF;
							 | 
						||
| 
								 | 
							
								            } else {
							 | 
						||
| 
								 | 
							
								                freq = PHY_RF_BAND_OVERSEAS_OPT3_CH1_CF;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } else if (g_phy_rf_band_info.cur_band  == PHY_RF_BAND_NSG) {
							 | 
						||
| 
								 | 
							
								        if (PHY_RF_OPTION1_1M == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION1_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            freq = PHY_RF_BAND_NSG_OPT1_CH1_CF;
							 | 
						||
| 
								 | 
							
								        } else if (PHY_RF_OPTION2_500K == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION2_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            freq = PHY_RF_BAND_NSG_OPT2_CH1_CF;
							 | 
						||
| 
								 | 
							
								        } else if (PHY_RF_OPTION3_200K == option) {
							 | 
						||
| 
								 | 
							
								            spacing = OPTION3_CHANNEL_SPACING;
							 | 
						||
| 
								 | 
							
								            freq = PHY_RF_BAND_NSG_OPT3_CH1_CF;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return (freq + (channel_id - 1) * spacing);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t phy_rf_check_rf_version(uint8_t ver)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    if (ver == RF_VER_1 || ver == RF_VER_2 || ver == RF_VER_3)
							 | 
						||
| 
								 | 
							
								        return 1;
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        return 0;
							 | 
						||
| 
								 | 
							
								}
							 |