Files
kunlun/ftm/mp/mp_mode.c
2024-09-28 14:24:04 +08:00

194 lines
5.8 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 "hal_rx.h"
#include "tx_entry.h"
#include "iot_config.h"
#include "iot_io_api.h"
#include "iot_config_api.h"
#include "phy_chn.h"
#include "phy_phase.h"
#include "phy_txrx_pwr.h"
#include "iot_pt_func.h"
#include "mp_mode.h"
#include "phy_tools.h"
#include "plc_protocol.h"
#include "plc_mpdu_header.h"
#include "iot_cli.h"
#include "iot_pt_rf_func.h"
#include "iot_gpio_api.h"
#include "iot_board_api.h"
#include "iot_cal_data.h"
#include "iot_crc.h"
#if IOT_CLI_IC_TOOL_EN
#include "cli_ic_tool.h"
#include "cli_rf_ic_tool.h"
#endif
uint8_t mp_pt_golden_nid_config()
{
uint8_t gold_nid = 0;
uint8_t gold_nid_gpio_0 = 0, gold_nid_gpio_0_val = 0;
uint8_t gold_nid_gpio_1 = 0, gold_nid_gpio_1_val = 0;
uint8_t gold_nid_gpio_2 = 0, gold_nid_gpio_2_val = 0;
uint8_t gold_nid_gpio_3 = 0, gold_nid_gpio_3_val = 0;
uint8_t gold_nid_gpio_4 = 0, gold_nid_gpio_4_val = 0;
gold_nid_gpio_0 = iot_board_get_gpio(GPIO_PLC_EVENT);
iot_gpio_open_as_input(gold_nid_gpio_0);
gold_nid_gpio_0_val = iot_gpio_value_get(gold_nid_gpio_0);
gold_nid_gpio_1 = iot_board_get_gpio(GPIO_GOLDEN_SET);
iot_gpio_open_as_input(gold_nid_gpio_1);
gold_nid_gpio_1_val = iot_gpio_value_get(gold_nid_gpio_1);
gold_nid_gpio_2 = iot_board_get_gpio(GPIO_GOLDEN_RXD0);
iot_gpio_open_as_input(gold_nid_gpio_2);
gold_nid_gpio_2_val = iot_gpio_value_get(gold_nid_gpio_2);
gold_nid_gpio_3 = iot_board_get_gpio(GPIO_STA_OUT);
iot_gpio_open_as_input(gold_nid_gpio_3);
gold_nid_gpio_3_val = iot_gpio_value_get(gold_nid_gpio_3);
gold_nid_gpio_4 = iot_board_get_gpio(GPIO_GOLDEN_TXD0);
iot_gpio_open_as_input(gold_nid_gpio_4);
gold_nid_gpio_4_val = iot_gpio_value_get(gold_nid_gpio_4);
iot_printf("Golden Nid GPIO Status(txd0/staout/rxd0/set/event): "
"%d/%d/%d/%d/%d.\n", gold_nid_gpio_4_val,
gold_nid_gpio_3_val, gold_nid_gpio_2_val,
gold_nid_gpio_1_val, gold_nid_gpio_0_val);
gold_nid = (gold_nid_gpio_0_val |
(gold_nid_gpio_1_val << 1) |
(gold_nid_gpio_2_val << 2) |
(gold_nid_gpio_3_val << 3) |
(gold_nid_gpio_4_val << 4));
return gold_nid;
}
void iot_init_mp_mode_entry()
{
#if IOT_MP_MODE_DIRECT_ENABLE
g_phy_cpu_share_ctxt.pt_mode_entry = 1;
rx_common_init(IOT_PLC_PHY_MP_BAND);
mp_pt_golden_unit_rx();
#endif
#if IOT_MP_TX_MODE_ENABLE
rx_common_init(IOT_PLC_PHY_MP_BAND);
tx_common_init(IOT_PLC_PHY_MP_BAND);
mac_tx_handle(PHY_PHASE_OVR_A, \
PLC_PROTO_TYPE_SG, FC_DELIM_SOF, \
PT_TX_NO_BREAK_NUM, false);
#endif
#if (IOT_FLASH_SIZE >= 2 && IOT_MP_RX_MODE_ENABLE)
rx_common_init(IOT_PLC_PHY_MP_BAND);
mac_rx_single_mode(false);
#endif
#if IOT_MP_AUTO_TONE_TX
iot_printf("\nthis is auto tone tx mode entering...\n");
phy_auto_tone_tx_start(&g_phy_ctxt.indep.tx_tone);
#endif
#if IOT_MP_RF_MODE_DIRECT_ENABLE
mp_rf_golden_unit_main(MP_RF_GOLDEN_DEF_OPTION,
MP_RF_GOLDEN_DEF_CHANNEL);
#endif
#if IOT_CLI_IC_TOOL_EN
register_ic_tool_recv_cb(iot_ic_tool_op);
register_ic_rf_tool_recv_cb(iot_ic_rf_tool_op);
#endif
}
#if (IOT_CLI_IC_TOOL_EN && HPLC_RF_DEV_SUPPORT)
/*
static mp_rf_gu_tx_tone_pwr_info_t g_rf_tone_pwr_info[] = {
{11, 0x7d, 23, 420}, {-13, 0x7b, 9, 300}, {-40, 0x3f, 8, 280}};
*/
static mp_rf_gu_cali_t *g_rf_gu_cali = NULL;
uint8_t mp_pt_rf_gu_cali_load(mp_rf_gu_cali_t **cali_data)
{
iot_cal_data_cfg_t *calcfg;
uint32_t size, ret = ERR_OK;
uint16_t crc16 = 0;
uint8_t* pbuf;
if (g_rf_gu_cali == NULL) {
ret = iot_cal_data_get_cfg(&calcfg);
pbuf = calcfg->gu_cali.data;
size = sizeof(calcfg->gu_cali.data);
BUILD_BUG_ON(sizeof(mp_rf_gu_cali_t) <= size);
if (ret == ERR_OK) {
/* validate crc16 */
crc16 = iot_getcrc16(pbuf, size, IOT_CRC16_TYPE_BT);
if (crc16 != calcfg->gu_cali.crc) {
os_mem_set(pbuf, 0, size);
}
g_rf_gu_cali = (mp_rf_gu_cali_t *)pbuf;
*cali_data = g_rf_gu_cali;
} else {
os_mem_set(pbuf, 0, size);
}
} else {
*cali_data = g_rf_gu_cali;
}
return ret;
}
uint8_t mp_pt_rf_gu_cali_commit()
{
iot_cal_data_cfg_t *calcfg;
uint32_t size, ret;
uint16_t crc16 = 0;
uint8_t* pbuf;
if (g_rf_gu_cali == NULL) {
IOT_ASSERT(0);
}
iot_cal_data_get_cfg(&calcfg);
pbuf = (uint8_t*)&calcfg->gu_cali.data;
size = sizeof(calcfg->gu_cali.data);
/* validate crc16 */
crc16 = iot_getcrc16(pbuf, size, IOT_CRC16_TYPE_BT);
calcfg->gu_cali.crc = crc16;
ret = iot_cal_data_set_cfg(calcfg);
return ret;
}
#else
uint8_t mp_pt_rf_gu_cali_load(mp_rf_gu_cali_t **cali_data)
{
(void)cali_data;
return ERR_INVAL;
}
uint8_t mp_pt_rf_gu_cali_commit()
{
return ERR_INVAL;
}
#endif