Files
kunlun/plc/halphy/phy_rf_chn.c
2024-09-28 14:24:04 +08:00

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