838 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			838 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 "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "os_mem.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "iot_io_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_gpio_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cal_data.h"
							 | 
						||
| 
								 | 
							
								#include "cli_rf_ic_tool_def.h"
							 | 
						||
| 
								 | 
							
								#include "cli_rf_ic_tool.h"
							 | 
						||
| 
								 | 
							
								#include "cli_plc_ic_tool.h"
							 | 
						||
| 
								 | 
							
								#include "iot_ftm_msg.h"
							 | 
						||
| 
								 | 
							
								#include "iot_ftm_internal.h"
							 | 
						||
| 
								 | 
							
								#include "iot_cli_msg_id_definition.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if IOT_CLI_IC_TOOL_EN
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "rf_phy_tx.h"
							 | 
						||
| 
								 | 
							
								#include "rf_phy_rx.h"
							 | 
						||
| 
								 | 
							
								#include "phy_rf_chn.h"
							 | 
						||
| 
								 | 
							
								#include "bb_rf_cfg.h"
							 | 
						||
| 
								 | 
							
								#include "rf_spi_api.h"
							 | 
						||
| 
								 | 
							
								#include "iot_version_api.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ada_dump.h"
							 | 
						||
| 
								 | 
							
								#include "phy_data.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rf_common_hw.h"
							 | 
						||
| 
								 | 
							
								#include "bb_init.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								#include "mp_mode.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_option_chn_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t freq;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_option_chn *option_chn = (cli_rf_option_chn *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* phy tx common init interface */
							 | 
						||
| 
								 | 
							
								    rf_phy_tx_init(PHY_RF_BAND_NSG, option_chn->option);
							 | 
						||
| 
								 | 
							
								    freq =  phy_rf_get_channel_freq_by_id(option_chn->option, option_chn->chn);
							 | 
						||
| 
								 | 
							
								    iot_printf("option:%d freq:%d\n", option_chn->option, freq);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* phy rx common init interface */
							 | 
						||
| 
								 | 
							
								    rf_phy_rx_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* phy channel freq setting */
							 | 
						||
| 
								 | 
							
								    bb_rf_set_fchz(freq);
							 | 
						||
| 
								 | 
							
								    ack.result = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_OPTION_FIX, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_tx_tone_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_tx_tone_t *tx_tone = (cli_rf_tx_tone_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    switch (tx_tone->mode) {
							 | 
						||
| 
								 | 
							
								    case CLI_RF_TX_TONE_MODE_HW:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        rf_phy_tx_tone_hw(tx_tone->option, tx_tone->fchz, tx_tone->on_off,
							 | 
						||
| 
								 | 
							
								            tx_tone->tone0_num, tx_tone->tone1_num, tx_tone->att0,
							 | 
						||
| 
								 | 
							
								            tx_tone->att1);
							 | 
						||
| 
								 | 
							
								        ack.result = ERR_OK;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_TX_TONE_MODE_SW:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (tx_tone->on_off) {
							 | 
						||
| 
								 | 
							
								            rf_phy_tx_tone_raw_test(tx_tone->tone0_num, tx_tone->option,
							 | 
						||
| 
								 | 
							
								                tx_tone->fchz);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            rf_phy_tx_tone_raw_test_stop();
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								        ack.result = ERR_OK;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        ack.result = ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("rf tx tone mode:%lu on_off:%d option:%d fchz:%d"
							 | 
						||
| 
								 | 
							
								        " tone0_num:%d tone1_num:%d att0:%d att1:%d\n", tx_tone->mode,
							 | 
						||
| 
								 | 
							
								        tx_tone->on_off, tx_tone->option, tx_tone->fchz, tx_tone->tone0_num,
							 | 
						||
| 
								 | 
							
								        tx_tone->tone1_num, tx_tone->att0, tx_tone->att1);
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_TX_TONE,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_spi_write_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_rf_spi_write *spi_write = (cli_rf_spi_write *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    rf_spi_write(spi_write->addr, spi_write->value);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ack.result = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_SPI_WRITE, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_tx_cal_update_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_tx_cal_update_t *cli_cal =
							 | 
						||
| 
								 | 
							
								        (cli_rf_tx_cal_update_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    if (cli_cal->tx_iq_mag_update) {
							 | 
						||
| 
								 | 
							
								        bb_rf_set_tx_iq_mag(cli_cal->tx_i_mag, cli_cal->tx_q_mag);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (cli_cal->tx_iq_phase_update) {
							 | 
						||
| 
								 | 
							
								        bb_rf_set_tx_iq_phase(cli_cal->tx_i_phase, cli_cal->tx_q_phase);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (cli_cal->tx_iq_dc_update) {
							 | 
						||
| 
								 | 
							
								        bb_rf_set_tx_dc(cli_cal->tx_i_dc, cli_cal->tx_q_dc);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("%s update:[%lu, %lu, %lu], tx_i_mag:%lu, tx_q_mag:%lu,"
							 | 
						||
| 
								 | 
							
								        "tx_i_phase:%lu, tx_q_phase:%lu, tx_i_dc:%d, tx_q_dc:%d\n",
							 | 
						||
| 
								 | 
							
								        __FUNCTION__, cli_cal->tx_iq_mag_update, cli_cal->tx_iq_phase_update,
							 | 
						||
| 
								 | 
							
								        cli_cal->tx_iq_dc_update, cli_cal->tx_i_mag, cli_cal->tx_q_mag,
							 | 
						||
| 
								 | 
							
								        cli_cal->tx_i_phase, cli_cal->tx_q_phase,
							 | 
						||
| 
								 | 
							
								        cli_cal->tx_i_dc, cli_cal->tx_q_dc);
							 | 
						||
| 
								 | 
							
								    ack.result = 0;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_TX_CAL_UPDATE, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_rxiqm_cali(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_rf_rxiqm_cal_rsp_t ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_rxiqm_cal_req_t *req =
							 | 
						||
| 
								 | 
							
								        (cli_rf_rxiqm_cal_req_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    int16_t tone_idx;
							 | 
						||
| 
								 | 
							
								    uint8_t i_code, q_code;
							 | 
						||
| 
								 | 
							
								    uint32_t center_freq = 0;
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*req)) {
							 | 
						||
| 
								 | 
							
								        ack.result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    tone_idx = (int16_t)iot_float_round_int32(
							 | 
						||
| 
								 | 
							
								        req->tone_freq * 1024.0 / 12500000);
							 | 
						||
| 
								 | 
							
								    /* step 1: calibration rx iq mag */
							 | 
						||
| 
								 | 
							
								    rf_phy_rx_iq_mag_cali(4096, tone_idx, &i_code, &q_code);
							 | 
						||
| 
								 | 
							
								    ack.i_mag = i_code;
							 | 
						||
| 
								 | 
							
								    ack.q_mag = q_code;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* step 2: calibration rx iq phase */
							 | 
						||
| 
								 | 
							
								    center_freq = bb_rf_get_fchz();
							 | 
						||
| 
								 | 
							
								    bb_rf_set_fchz(center_freq + 2 * req->tone_freq);
							 | 
						||
| 
								 | 
							
								    rf_phy_rx_iq_phase_cali(4096, -tone_idx, &i_code, &q_code);
							 | 
						||
| 
								 | 
							
								    ack.i_phase = i_code;
							 | 
						||
| 
								 | 
							
								    ack.q_phase = q_code;
							 | 
						||
| 
								 | 
							
								    bb_rf_set_fchz(center_freq);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_RXIQM,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_state_cfg_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    ack.result = ERR_OK;
							 | 
						||
| 
								 | 
							
								    cli_rf_state_cfg_t *rf_state =
							 | 
						||
| 
								 | 
							
								        (cli_rf_state_cfg_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    switch (rf_state->type) {
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_POWER_DOWN:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        bb_rf_reset();
							 | 
						||
| 
								 | 
							
								        mac_rf_disable_pa(1);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_POWER_UP:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        mac_rf_disable_pa(0);
							 | 
						||
| 
								 | 
							
								        os_delay(10);
							 | 
						||
| 
								 | 
							
								        rf_phy_tx_init(PHY_RF_BAND_NSG, rf_state->option);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_PLL:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        bb_rf_reset();
							 | 
						||
| 
								 | 
							
								        bb_rf_pll_cfg();
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_STANDBY:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        bb_rf_reset();
							 | 
						||
| 
								 | 
							
								        bb_rf_standby_cfg();
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_RX:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        bb_rf_reset();
							 | 
						||
| 
								 | 
							
								        bb_rf_rx_cfg(rf_state->option,
							 | 
						||
| 
								 | 
							
								            phy_rf_get_channel_freq_by_id(rf_state->option,
							 | 
						||
| 
								 | 
							
								            rf_state->ch_id));
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case CLI_RF_STATE_CFG_TX:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        bb_rf_reset();
							 | 
						||
| 
								 | 
							
								        bb_rf_tx_cfg(rf_state->option,
							 | 
						||
| 
								 | 
							
								            phy_rf_get_channel_freq_by_id(rf_state->option,
							 | 
						||
| 
								 | 
							
								            rf_state->ch_id));
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ack.result = ERR_NOSUPP;
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_printf("%s rf_state:%lu, result:%lu\n", __FUNCTION__,
							 | 
						||
| 
								 | 
							
								        rf_state->type, ack.result);
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_STATE_CFG, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_spi_read_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint16_t value;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_rf_spi_read *spi_read = (cli_rf_spi_read *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    value = rf_spi_read(spi_read->addr);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ack.result = 0;
							 | 
						||
| 
								 | 
							
								    ack.reserved[0] = value & 0xff;
							 | 
						||
| 
								 | 
							
								    ack.reserved[1] = (value >> 8) & 0xff;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_SPI_READ, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_ada_dump_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    uint32_t dump_addr;
							 | 
						||
| 
								 | 
							
								    uint32_t buf_len;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_rf_ada_dump *ada_dump = (cli_rf_ada_dump *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    buf_len = phy_ada_dump_addr_get(&dump_addr);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(ada_dump->dump_len <= buf_len);
							 | 
						||
| 
								 | 
							
								    os_mem_set((uint32_t *)dump_addr, 0, ada_dump->dump_len);
							 | 
						||
| 
								 | 
							
								    rf_phy_ada_dump_entry(dump_addr, ada_dump->dump_len);
							 | 
						||
| 
								 | 
							
								    iot_printf("rf dump end\n");
							 | 
						||
| 
								 | 
							
								    ack.result = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_ADA_DUMP, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_rx_tone_power_get_handler(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_tone_power_info_t ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_tone_power_query_t *req =
							 | 
						||
| 
								 | 
							
								        (cli_rf_rx_tone_power_query_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    rf_phy_rx_tone_power_meas(16 * 1024, req->tone_idx, req->dc_idx,
							 | 
						||
| 
								 | 
							
								        req->img_idx, &ack.tone_pwr, &ack.dc_pwr, &ack.img_pwr);
							 | 
						||
| 
								 | 
							
								    ack.gain = bb_rf_get_cur_gain();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_RX_TONE_POWER_GET,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_rxiqm_data_r(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)buffer;
							 | 
						||
| 
								 | 
							
								    (void)len;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_rxiqm_t cal = { 0 };
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret != ERR_OK) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (iot_cal_data_check_mask(calcfg,
							 | 
						||
| 
								 | 
							
								        IOT_PHY_CFG_MASK_CALI_RF_RXIQM) != 0) {
							 | 
						||
| 
								 | 
							
								        cal.rx_i_mag = calcfg->halphy_cfg.rf_rxiqm.rx_i_mag;
							 | 
						||
| 
								 | 
							
								        cal.rx_q_mag = calcfg->halphy_cfg.rf_rxiqm.rx_q_mag;
							 | 
						||
| 
								 | 
							
								        cal.rx_i_phase = calcfg->halphy_cfg.rf_rxiqm.rx_i_phase;
							 | 
						||
| 
								 | 
							
								        cal.rx_q_phase = calcfg->halphy_cfg.rf_rxiqm.rx_q_phase;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_RXIQM_DATA_R,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&cal, sizeof(cal));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_rxiqm_data_w(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t result = ERR_OK;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_rxiqm_t *cal;
							 | 
						||
| 
								 | 
							
								    uint8_t *data = iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cal)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    cal = (cli_rf_cal_rxiqm_t*)data;
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret) {
							 | 
						||
| 
								 | 
							
								        /* update magic */
							 | 
						||
| 
								 | 
							
								        if (calcfg->halphy_cfg.magic != IOT_OEM_PHY_MAGIC_NUM) {
							 | 
						||
| 
								 | 
							
								            /* initialize */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.magic = IOT_OEM_PHY_MAGIC_NUM;
							 | 
						||
| 
								 | 
							
								            /* update mask */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.mask = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        /* update pt fw ver */
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.pt_fw_ver = iot_version_hex();
							 | 
						||
| 
								 | 
							
								        /* update mask */
							 | 
						||
| 
								 | 
							
								        iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_PT_VER);
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_major = 0;
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_minor = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_rxiqm.rx_i_mag = cal->rx_i_mag;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_rxiqm.rx_q_mag = cal->rx_q_mag;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_rxiqm.rx_i_phase = cal->rx_i_phase;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_rxiqm.rx_q_phase = cal->rx_q_phase;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_CALI_RF_RXIQM);
							 | 
						||
| 
								 | 
							
								    iot_cal_data_set_cfg(calcfg);
							 | 
						||
| 
								 | 
							
								    iot_printf("%s: rx_i_mag:%lu, rx_q_mag:%lu, rx_i_phase:%d, rx_q_phase:%d\n",
							 | 
						||
| 
								 | 
							
								         __FUNCTION__, cal->rx_i_mag, cal->rx_q_mag, cal->rx_i_phase,
							 | 
						||
| 
								 | 
							
								        cal->rx_q_phase);
							 | 
						||
| 
								 | 
							
								    goto out;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:
							 | 
						||
| 
								 | 
							
								    iot_printf("%s error, err_code %lu\n", __FUNCTION__, result);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    ack.result = result;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_RXIQM_DATA_W,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_txiqm_data_w(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t result = ERR_OK;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_txiqm_t *cal;
							 | 
						||
| 
								 | 
							
								    uint8_t *data = iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cal)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    cal = (cli_rf_cal_txiqm_t*)data;
							 | 
						||
| 
								 | 
							
								    if (!phy_rf_check_rf_version(cal->rf_ver)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret) {
							 | 
						||
| 
								 | 
							
								        /* update magic */
							 | 
						||
| 
								 | 
							
								        if (calcfg->halphy_cfg.magic != IOT_OEM_PHY_MAGIC_NUM) {
							 | 
						||
| 
								 | 
							
								            /* initialize */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.magic = IOT_OEM_PHY_MAGIC_NUM;
							 | 
						||
| 
								 | 
							
								            /* update mask */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.mask = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        /* update pt fw ver */
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.pt_fw_ver = iot_version_hex();
							 | 
						||
| 
								 | 
							
								        /* update mask */
							 | 
						||
| 
								 | 
							
								        iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_PT_VER);
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_major = 0;
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_minor = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_i_dc = cal->tx_i_dc;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_q_dc = cal->tx_q_dc;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_i_mag = cal->tx_i_mag;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_q_mag = cal->tx_q_mag;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_i_phase = cal->tx_i_phase;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.tx_q_phase = cal->tx_q_phase;
							 | 
						||
| 
								 | 
							
								    calcfg->halphy_cfg.rf_txiqm.rf_ver = cal->rf_ver;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_CALI_RF_TXIQM);
							 | 
						||
| 
								 | 
							
								    iot_cal_data_set_cfg(calcfg);
							 | 
						||
| 
								 | 
							
								    iot_printf("%s: tx_i_dc:%lu, tx_q_dc:%lu, tx_i_mag:%lu, tx_q_mag:%lu, "
							 | 
						||
| 
								 | 
							
								        "tx_i_phase:%d, tx_q_phase:%d, rf_ver:%d\n", __FUNCTION__, cal->tx_i_dc,
							 | 
						||
| 
								 | 
							
								        cal->tx_q_dc, cal->tx_i_mag, cal->tx_q_mag, cal->tx_i_phase,
							 | 
						||
| 
								 | 
							
								        cal->tx_q_phase, cal->rf_ver);
							 | 
						||
| 
								 | 
							
								    goto out;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:
							 | 
						||
| 
								 | 
							
								    iot_printf("%s error, err_code %lu\n", __FUNCTION__, result);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    ack.result = result;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_TXIQM_DATA_W,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_txiqm_data_r(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)buffer;
							 | 
						||
| 
								 | 
							
								    (void)len;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_txiqm_t cal = { 0 };
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret != ERR_OK) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (iot_cal_data_check_mask(calcfg,
							 | 
						||
| 
								 | 
							
								        IOT_PHY_CFG_MASK_CALI_RF_TXIQM) != 0) {
							 | 
						||
| 
								 | 
							
								        cal.tx_i_dc = calcfg->halphy_cfg.rf_txiqm.tx_i_dc;
							 | 
						||
| 
								 | 
							
								        cal.tx_q_dc = calcfg->halphy_cfg.rf_txiqm.tx_q_dc;
							 | 
						||
| 
								 | 
							
								        cal.tx_i_mag = calcfg->halphy_cfg.rf_txiqm.tx_i_mag;
							 | 
						||
| 
								 | 
							
								        cal.tx_q_mag = calcfg->halphy_cfg.rf_txiqm.tx_q_mag;
							 | 
						||
| 
								 | 
							
								        cal.tx_i_phase = calcfg->halphy_cfg.rf_txiqm.tx_i_phase;
							 | 
						||
| 
								 | 
							
								        cal.tx_q_phase = calcfg->halphy_cfg.rf_txiqm.tx_q_phase;
							 | 
						||
| 
								 | 
							
								        cal.rf_ver = calcfg->halphy_cfg.rf_txiqm.rf_ver;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_TXIQM_DATA_R,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&cal, sizeof(cal));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_txf_data_w(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t result = ERR_OK, i, mask;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_txf_t *cal;
							 | 
						||
| 
								 | 
							
								    uint8_t *data = iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cal)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret) {
							 | 
						||
| 
								 | 
							
								        /* update magic */
							 | 
						||
| 
								 | 
							
								        if (calcfg->halphy_cfg.magic != IOT_OEM_PHY_MAGIC_NUM) {
							 | 
						||
| 
								 | 
							
								            /* initialize */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.magic = IOT_OEM_PHY_MAGIC_NUM;
							 | 
						||
| 
								 | 
							
								            /* update mask */
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.mask = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        /* update pt fw ver */
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.pt_fw_ver = iot_version_hex();
							 | 
						||
| 
								 | 
							
								        /* update mask */
							 | 
						||
| 
								 | 
							
								        iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_PT_VER);
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_major = 0;
							 | 
						||
| 
								 | 
							
								        calcfg->halphy_cfg.hw_ver_minor = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    cal = (cli_rf_cal_txf_t*)data;
							 | 
						||
| 
								 | 
							
								    for (i = RF_OPTION_1; i <= RF_OPTION_MAX; i++) {
							 | 
						||
| 
								 | 
							
								        mask = 1 << (i - 1);
							 | 
						||
| 
								 | 
							
								        if (cal->valid_mask & mask) {
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.rf_txf.valid_mask |= mask;
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.rf_txf.bw_sel_value[i - 1]
							 | 
						||
| 
								 | 
							
								                = cal->bw_sel_value[i - 1];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.rf_txf.valid_mask &=~ mask;
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.rf_txf.bw_sel_value[i - 1] = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        iot_printf("%s: option:%lu, valid:%lu, bw_sel_value:%lu\n",
							 | 
						||
| 
								 | 
							
								            __FUNCTION__, i, !!(cal->valid_mask & mask),
							 | 
						||
| 
								 | 
							
								            calcfg->halphy_cfg.rf_txf.bw_sel_value[i - 1]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_cal_data_set_mask(calcfg, IOT_PHY_CFG_MASK_CALI_RF_TXF);
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_set_cfg(calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret != ERR_OK) {
							 | 
						||
| 
								 | 
							
								        /* TODO: sync to RF phy */
							 | 
						||
| 
								 | 
							
								        result = ERR_FAIL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    goto out;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:
							 | 
						||
| 
								 | 
							
								    iot_printf("%s error, err_code %lu\n", __FUNCTION__, result);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    ack.result = result;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_TXF_DATA_W,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_cal_txf_data_r(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)buffer;
							 | 
						||
| 
								 | 
							
								    (void)len;
							 | 
						||
| 
								 | 
							
								    uint8_t i, mask;
							 | 
						||
| 
								 | 
							
								    iot_cal_data_cfg_t *calcfg;
							 | 
						||
| 
								 | 
							
								    cli_rf_cal_txf_t cal = { 0 };
							 | 
						||
| 
								 | 
							
								    uint32_t ret;
							 | 
						||
| 
								 | 
							
								    ret = iot_cal_data_get_cfg(&calcfg);
							 | 
						||
| 
								 | 
							
								    if (ret != ERR_OK) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (iot_cal_data_check_mask(calcfg,
							 | 
						||
| 
								 | 
							
								        IOT_PHY_CFG_MASK_CALI_RF_TXF) == 0) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for (i = RF_OPTION_1; i <= RF_OPTION_MAX; i++) {
							 | 
						||
| 
								 | 
							
								        mask = 1 << (i - 1);
							 | 
						||
| 
								 | 
							
								        if (calcfg->halphy_cfg.rf_txf.valid_mask & mask) {
							 | 
						||
| 
								 | 
							
								            cal.valid_mask |= mask;
							 | 
						||
| 
								 | 
							
								            cal.bw_sel_value[i - 1] =
							 | 
						||
| 
								 | 
							
								                calcfg->halphy_cfg.rf_txf.bw_sel_value[i - 1];
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            cal.valid_mask &=~ mask;
							 | 
						||
| 
								 | 
							
								            cal.bw_sel_value[i - 1] = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    goto out;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_RF_CAL_TXF_DATA_R,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&cal, sizeof(cal));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static uint32_t fft_data_buf[TOTAL_TONE_MASK_NUM] = {0};
							 | 
						||
| 
								 | 
							
								void phy_rx_dump_fft_data(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t ret, data = 0;
							 | 
						||
| 
								 | 
							
								    cli_plc_fft_dump_req_t *para;
							 | 
						||
| 
								 | 
							
								    cli_plc_fft_dump_rsp_t result = {0};
							 | 
						||
| 
								 | 
							
								    int16_t i_value, q_value, i;
							 | 
						||
| 
								 | 
							
								    uint32_t energy = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    (void)len;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_reset(PHY_RST_REASON_WARM);
							 | 
						||
| 
								 | 
							
								    para = (cli_plc_fft_dump_req_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < para->avg_num; i++) {
							 | 
						||
| 
								 | 
							
								        ret = phy_rx_full_fft_dump(fft_data_buf);
							 | 
						||
| 
								 | 
							
								        if (ret != ERR_OK)
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        data = fft_data_buf[para->tone_idx];
							 | 
						||
| 
								 | 
							
								        i_value = (int16_t)(data & 0xffff);
							 | 
						||
| 
								 | 
							
								        q_value = (int16_t)((data >> 16) & 0xffff);
							 | 
						||
| 
								 | 
							
								        /* it is best to directly return the energy value because the energy
							 | 
						||
| 
								 | 
							
								         * value is scalar. Do not directly return the average of i/q,
							 | 
						||
| 
								 | 
							
								         * as adding vectors will cancel out.
							 | 
						||
| 
								 | 
							
								         */
							 | 
						||
| 
								 | 
							
								        energy += i_value * i_value + q_value * q_value;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (i > 0) {
							 | 
						||
| 
								 | 
							
								        energy /= i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    result.err_no = ret;
							 | 
						||
| 
								 | 
							
								    if (ret == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        result.len = TOTAL_TONE_MASK_NUM;
							 | 
						||
| 
								 | 
							
								        result.address = (uint32_t)fft_data_buf;
							 | 
						||
| 
								 | 
							
								        result.energy = energy;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_PLC_FFT_DUMP, (uint8_t *)&result, sizeof(result));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_cmmmon_gpio_set(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_gpio_set_t *gpio_set = (cli_gpio_set_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    cli_gpio_set_rsp_t result = { 0 };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_gpio_close(gpio_set->gpio);
							 | 
						||
| 
								 | 
							
								    result.result = iot_gpio_open_as_output(gpio_set->gpio);
							 | 
						||
| 
								 | 
							
								    if (result.result == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        iot_gpio_value_set(gpio_set->gpio, gpio_set->val);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    result.gpio_value = gpio_set->val;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM, CLI_MSGID_FTM_COMMON_GPIO_SET,
							 | 
						||
| 
								 | 
							
								        (uint8_t *)&result, sizeof(result));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_power_spectrum_meas_handle(iot_pkt_t *buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t rsp[sizeof(power_spectrum_meas_result_t) + sizeof(tone_desc_t) *
							 | 
						||
| 
								 | 
							
								        RF_PHY_POWER_MEAS_MAX_TONE_CNT];
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_cmd_t *cmd = (cli_rf_rx_cmd_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								    uint32_t freq_list[RF_PHY_POWER_MEAS_MAX_TONE_CNT];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_mem_cpy((uint8_t *)freq_list, &cmd->freq, sizeof(freq_list));
							 | 
						||
| 
								 | 
							
								    rf_phy_power_spectrum_meas(cmd->f0 , cmd->gain, freq_list, cmd->num,
							 | 
						||
| 
								 | 
							
								        (power_spectrum_meas_result_t *)rsp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_POWER_SPECTRUM_MEAS, (uint8_t *)rsp, sizeof(rsp));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_rx_gain_cali_w(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t result = ERR_OK;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    mp_rf_gu_cali_t *cal_data = NULL;
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_gain_cali_info_t *cmd =
							 | 
						||
| 
								 | 
							
								        (cli_rf_rx_gain_cali_info_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cmd)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    mp_pt_rf_gu_cali_load(&cal_data);
							 | 
						||
| 
								 | 
							
								    if (cal_data == NULL) {
							 | 
						||
| 
								 | 
							
								        result = ERR_NOT_READY;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (cmd->gain < PHY_RF_GAIN_MIN || (cmd->gain - PHY_RF_GAIN_MIN) >=
							 | 
						||
| 
								 | 
							
								        sizeof(cal_data->rx_gain_cal)) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cmd->gain -= PHY_RF_GAIN_MIN;
							 | 
						||
| 
								 | 
							
								    if (cmd->gain <= cal_data->valid_rx_gain_item_cnt) {
							 | 
						||
| 
								 | 
							
								        cal_data->rx_gain_cal[cmd->gain] = cmd->cal_data;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (cmd->gain == cal_data->valid_rx_gain_item_cnt)
							 | 
						||
| 
								 | 
							
								        cal_data->valid_rx_gain_item_cnt++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    result = mp_pt_rf_gu_cali_commit();
							 | 
						||
| 
								 | 
							
								    if (result == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:
							 | 
						||
| 
								 | 
							
								    iot_printf("%s error, err_code %lu\n", __FUNCTION__, result);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    ack.result = result;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_RX_GAIN_CALI_DATA_WRITE, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_rx_gain_cali_r(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_gain_cali_info_t cali_info = {0};
							 | 
						||
| 
								 | 
							
								    mp_rf_gu_cali_t *cali_data = NULL;
							 | 
						||
| 
								 | 
							
								    cli_rf_rx_gain_cali_read_t *cmd =
							 | 
						||
| 
								 | 
							
								        (cli_rf_rx_gain_cali_read_t*)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cmd)) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mp_pt_rf_gu_cali_load(&cali_data);
							 | 
						||
| 
								 | 
							
								    if (cali_data == NULL) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s not ready\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (cmd->gain >= PHY_RF_GAIN_MIN && (cmd->gain - PHY_RF_GAIN_MIN) <
							 | 
						||
| 
								 | 
							
								        cali_data->valid_rx_gain_item_cnt) {
							 | 
						||
| 
								 | 
							
								        cali_info.gain = cmd->gain;
							 | 
						||
| 
								 | 
							
								        cmd->gain -= PHY_RF_GAIN_MIN;
							 | 
						||
| 
								 | 
							
								        cali_info.cal_data = cali_data->rx_gain_cal[cmd->gain];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_RX_GAIN_CALI_DATA_READ, (uint8_t *)&cali_info,
							 | 
						||
| 
								 | 
							
								        sizeof(cali_info));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_tx_power_info_w(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t result = ERR_OK, i = 0;
							 | 
						||
| 
								 | 
							
								    cli_kl_cmd_ack ack = { 0 };
							 | 
						||
| 
								 | 
							
								    mp_rf_gu_cali_t *cali_data = NULL;
							 | 
						||
| 
								 | 
							
								    cli_rf_tx_power_info *cmd =
							 | 
						||
| 
								 | 
							
								        (cli_rf_tx_power_info *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cmd) || cmd->idx > IOT_MP_RF_GU_TX_POWER_INFO_CNT) {
							 | 
						||
| 
								 | 
							
								        result = ERR_INVAL;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    mp_pt_rf_gu_cali_load(&cali_data);
							 | 
						||
| 
								 | 
							
								    if (cali_data == NULL) {
							 | 
						||
| 
								 | 
							
								        result = ERR_NOT_READY;
							 | 
						||
| 
								 | 
							
								        goto error;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (i = 0; i < IOT_MP_RF_GU_TX_POWER_INFO_CNT; i++) {
							 | 
						||
| 
								 | 
							
								        if (cali_data->power_info[i].power == cmd->power) {
							 | 
						||
| 
								 | 
							
								            cali_data->power_info[i].power = -128;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    cali_data->power_info[cmd->idx].power = cmd->power;
							 | 
						||
| 
								 | 
							
								    cali_data->power_info[cmd->idx].rf_att = cmd->rf_att;
							 | 
						||
| 
								 | 
							
								    cali_data->power_info[cmd->idx].if_gain = cmd->if_gain;
							 | 
						||
| 
								 | 
							
								    cali_data->power_info[cmd->idx].ldovs = cmd->ldovs;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    result = mp_pt_rf_gu_cali_commit();
							 | 
						||
| 
								 | 
							
								    if (result == ERR_OK) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								error:
							 | 
						||
| 
								 | 
							
								    iot_printf("%s error, err_code %lu\n", __FUNCTION__, result);
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    ack.result = result;
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_TX_POWER_INFO_WRITE, (uint8_t *)&ack, sizeof(ack));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void cli_rf_phy_tx_power_info_r(iot_pkt_t *buffer, uint16_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    mp_rf_gu_cali_t *cali_data = NULL;
							 | 
						||
| 
								 | 
							
								    cli_rf_tx_power_info info = { 0 };
							 | 
						||
| 
								 | 
							
								    uint8_t size = sizeof(info);
							 | 
						||
| 
								 | 
							
								    cli_rf_tx_power_read_t *cmd =
							 | 
						||
| 
								 | 
							
								        (cli_rf_tx_power_read_t *)iot_pkt_data(buffer);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (len < sizeof(*cmd)) {
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mp_pt_rf_gu_cali_load(&cali_data);
							 | 
						||
| 
								 | 
							
								    if (cali_data == NULL) {
							 | 
						||
| 
								 | 
							
								        iot_printf("%s not ready\n", __FUNCTION__);
							 | 
						||
| 
								 | 
							
								        goto out;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (cmd->idx < IOT_MP_RF_GU_TX_POWER_INFO_CNT) {
							 | 
						||
| 
								 | 
							
								        info.power = cali_data->power_info[cmd->idx].power;
							 | 
						||
| 
								 | 
							
								        info.rf_att = cali_data->power_info[cmd->idx].rf_att;
							 | 
						||
| 
								 | 
							
								        info.if_gain = cali_data->power_info[cmd->idx].if_gain;
							 | 
						||
| 
								 | 
							
								        info.ldovs = cali_data->power_info[cmd->idx].ldovs;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								out:
							 | 
						||
| 
								 | 
							
								    cli_send_module_msg(CLI_MODULEID_FTM,
							 | 
						||
| 
								 | 
							
								        CLI_MSGID_FTM_RF_TX_POWER_INFO_READ, (uint8_t *)&info, size);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void iot_ic_rf_tool_op(int msgid, iot_pkt_t* buffer, uint32_t len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_printf("rf msgid:%d len:%d\n", msgid, len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    switch (msgid)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_OPTION_FIX:
							 | 
						||
| 
								 | 
							
								            cli_rf_option_chn_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_TX_TONE:
							 | 
						||
| 
								 | 
							
								            cli_rf_tx_tone_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_SPI_READ:
							 | 
						||
| 
								 | 
							
								            cli_rf_spi_read_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_SPI_WRITE:
							 | 
						||
| 
								 | 
							
								            cli_rf_spi_write_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_ADA_DUMP:
							 | 
						||
| 
								 | 
							
								            cli_rf_ada_dump_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_TXIQM_DATA_W:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_txiqm_data_w(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_TXIQM_DATA_R:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_txiqm_data_r(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_TXF_DATA_W:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_txf_data_w(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_TXF_DATA_R:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_txf_data_r(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_RX_TONE_POWER_GET:
							 | 
						||
| 
								 | 
							
								            cli_rf_rx_tone_power_get_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_POWER_SPECTRUM_MEAS:
							 | 
						||
| 
								 | 
							
								            cli_rf_power_spectrum_meas_handle(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_PLC_ADA_DUMP:
							 | 
						||
| 
								 | 
							
								            cli_plc_ada_dump_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_PLC_FFT_DUMP:
							 | 
						||
| 
								 | 
							
								            phy_rx_dump_fft_data(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_TX_CAL_UPDATE:
							 | 
						||
| 
								 | 
							
								            cli_rf_tx_cal_update_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_STATE_CFG:
							 | 
						||
| 
								 | 
							
								            cli_rf_state_cfg_handler(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_COMMON_GPIO_SET:
							 | 
						||
| 
								 | 
							
								            cli_cmmmon_gpio_set(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_RXIQM_DATA_W:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_rxiqm_data_w(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_RXIQM_DATA_R:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_cal_rxiqm_data_r(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_CAL_RXIQM:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_rxiqm_cali(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_RX_GAIN_CALI_DATA_WRITE:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_rx_gain_cali_w(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_RX_GAIN_CALI_DATA_READ:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_rx_gain_cali_r(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_TX_POWER_INFO_WRITE:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_tx_power_info_w(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        case CLI_MSGID_FTM_RF_TX_POWER_INFO_READ:
							 | 
						||
| 
								 | 
							
								            cli_rf_phy_tx_power_info_r(buffer, len);
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        default:
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif   /* IOT_CLI_IC_TOOL_EN */
							 |