doubao_chat/apps/common/config/user_cfg.c

565 lines
20 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_config.h"
#include "fs/fs.h"
#include "system/includes.h"
#include "syscfg/syscfg_id.h"
#include "asm/crc16.h"
#include "asm/sfc_norflash_api.h"
#include "server/audio_dev.h"
#if defined CONFIG_BT_ENABLE || defined CONFIG_WIFI_ENABLE
#include "wifi/wifi_connect.h"
#endif
#ifdef CONFIG_RF_TEST_ENABLE
#include "device/gpio.h"
#include "device/uart.h"
#endif
#ifdef PRODUCT_TEST_ENABLE
#include "product_main.h"
#endif
#define LOG_TAG_CONST USER_CFG
#define LOG_TAG "[USER_CFG]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_DUMP_ENABLE
#define LOG_CLI_ENABLE
#include "debug.h"
//======================================================================================//
// BTIF配置项表 //
// 参数1: 配置项名字 //
// 参数2: 配置项需要多少个byte存储 //
// 说明: 配置项ID注册到该表后该配置项将读写于BTIF区域, 其它没有注册到该表 //
// 的配置项则默认读写于VM区域. //
//======================================================================================//
const struct btif_item btif_table[] = {
// item_id len //
{CFG_BT_MAC_ADDR, 6 },
{CFG_BLE_MAC_ADDR, 6 },
{CFG_BT_FRE_OFFSET, 6 }, //测试盒矫正频偏值
{CFG_WIFI_FRE_OFFSET, 6 }, //测试盒矫正频偏值
#ifdef PRODUCT_TEST_ENABLE
{CFG_PRODUCT_UUID_INDEX, PRODUCT_UUID_SIZE}, //产品UUID代码
{CFG_PRODUCT_SN_INDEX, PRODUCT_SN_SIZE}, //产品SN代码
{CFG_PRODUCT_LICENSE_INDEX, PRODUCT_LICENSE_INFO_SIZE}, //产品LICENSE相关信息
{CFG_PRODUCT_RTC_INDEX, PRODUCT_RTC_INFO_SIZE}, //产品RTC初始时间
{CFG_PRODUCT_RES_INDEX, PRODUCT_RES_SIZE},
{CFG_PRODUCT_USER_INDEX, PRODUCT_USER_DATA_SIZE},
{CFG_PRODUCT_CFG_INDEX, PRODUCT_CFG_SIZE},
#endif
{0, 0 }, //reserved cfg
};
int btif_item_rewrite_en(u16 id, u16 len)
{
int ret;
switch (id) {
#ifdef PRODUCT_TEST_ENABLE
case CFG_BT_MAC_ADDR:
case CFG_BLE_MAC_ADDR:
case CFG_PRODUCT_UUID_INDEX:
case CFG_PRODUCT_SN_INDEX:
case CFG_PRODUCT_LICENSE_INDEX:
case CFG_PRODUCT_RTC_INDEX:
case CFG_PRODUCT_RES_INDEX:
case CFG_PRODUCT_USER_INDEX:
case CFG_PRODUCT_CFG_INDEX:
ret = 1;
break;
#endif
//需要重复写入的id,在此处添加相应case即可
default:
ret = 0;
break;
}
return ret;
}
//============================= VM 区域空间最大值 ======================================//
//以下宏在app_cfg中配置:
const int vm_max_page_align_size_config = VM_MAX_PAGE_ALIGN_SIZE_CONFIG; //page对齐vm管理空间最大值配置
const int vm_max_sector_align_size_config = VM_MAX_SECTOR_ALIGN_SIZE_CONFIG; //sector对齐vm管理空间最大值配置
const int VM_DEFRAG_SIZE = 60; //VM 碎片整理。百分比
////======================================================================================//
extern int bytecmp(unsigned char *p, unsigned char ch, unsigned int num);
#ifdef CONFIG_BT_ENABLE
#define LOCAL_NAME_LEN 32 /*BD_NAME_LEN_MAX*/
static char edr_name[LOCAL_NAME_LEN];
static char ble_name[LOCAL_NAME_LEN];
static char pincode[5] = "0000";
const u8 *bt_get_mac_addr(void)
{
static u8 mac_addr[6];
const u8 bc_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
if (syscfg_read(CFG_BT_MAC_ADDR, mac_addr, 6) == 6 && memcmp(mac_addr, bc_mac, 6)) {
return mac_addr;
}
#if defined CONFIG_WIFI_ENABLE && !defined CONFIG_RF_TEST_ENABLE
wifi_get_mac(mac_addr);
if (bytecmp(mac_addr, 0, 6)) {
return mac_addr;
} else
#endif
{
u8 flash_uid[16];
memcpy(flash_uid, get_norflash_uuid(), 16);
do {
u32 crc32 = rand32()^CRC32(flash_uid, sizeof(flash_uid));
u16 crc16 = rand32()^CRC16(flash_uid, sizeof(flash_uid));
memcpy(mac_addr, &crc32, sizeof(crc32));
memcpy(&mac_addr[4], &crc16, sizeof(crc16));
} while (!bytecmp(mac_addr, 0, 6));
//此处用户可自行修改为本地生成mac地址的算法
mac_addr[0] &= ~((1 << 0) | (1 << 1));
syscfg_write(CFG_BT_MAC_ADDR, mac_addr, 6);
return mac_addr;
}
}
const char *bt_get_local_name(void)
{
#ifndef CONFIG_RF_TEST_ENABLE
const u8 *mac_addr;
mac_addr = bt_get_mac_addr();
sprintf(edr_name, "JL-AC79XX-%02X%02X", mac_addr[4], mac_addr[5]);
#endif
return edr_name;
}
const char *bt_get_pin_code(void)
{
return pincode;
}
#if TCFG_BT_SNIFF_ENABLE
typedef struct __LRC_CONFIG {
u16 lrc_ws_inc;
u16 lrc_ws_init;
u16 btosc_ws_inc;
u16 btosc_ws_init;
u8 lrc_change_mode;
} _GNU_PACKED_ LRC_CONFIG;
struct lp_ws_t {
u16 lrc_ws_inc;
u16 lrc_ws_init;
u16 bt_osc_ws_inc;
u16 bt_osc_ws_init;
u8 osc_change_mode;
};
static struct lp_ws_t default_lp_winsize = {
.lrc_ws_inc = 480,
.lrc_ws_init = 400,
.bt_osc_ws_inc = 480,
.bt_osc_ws_init = 140,
.osc_change_mode = 2,
};
#endif
#endif
#ifdef CONFIG_AEC_ENC_ENABLE
typedef struct __AEC_CONFIG {
u8 mic_again; //DAC增益,default:31(0~31)
u8 dac_again; //MIC增益,default:20(0~31)
u8 aec_mode; //AEC模式,AEC_EN:BIT(0) NLP_EN:BIT(1) NS_EN:BIT(2) AGC_EN:BIT(4) DNS_EN:BIT(5)
u8 ul_eq_en; //上行EQ使能,default:enable(disable(0), enable(1))
/*AGC*/
float ndt_fade_in; //单端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float ndt_fade_out; //单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float dt_fade_in; //双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
float dt_fade_out; //双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
float ndt_max_gain; //单端讲话放大上限,default: 12.f(0 ~ 24 dB)
float ndt_min_gain; //单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float ndt_speech_thr; //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
float dt_max_gain; //双端讲话放大上限,default: 12.f(0 ~ 24 dB)
float dt_min_gain; //双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
float dt_speech_thr; //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
/*AEC*/
float aec_dt_aggress; //原音回音追踪等级, default: 1.0f(1 ~ 5)
float aec_refengthr; //进入回音消除参考值, default: -70.0f(-90 ~ -60 dB)
/*NLP*/
float nlp_aggress_factor;//回音前级动态压制,越小越强,default: -3.0f(-1 ~ -5)
float nlp_min_suppress; //回音后级静态压制,越大越强,default: 4.f(0 ~ 10)
/*ANS*/
float ans_aggress; //噪声前级动态压制,越大越强default: 1.25f(1 ~ 2)
float ans_suppress; //噪声后级静态压制,越小越强default: 0.04f(0 ~ 1)
/*DNS*/
float dns_gain_floor; //增益最小值控制, 越小降噪越强, default: 0.1f(0 ~ 1.0)
float dns_over_drive; //降噪强度, 越大降噪越强, default: 1.0f(0 ~ 6.0)
} _GNU_PACKED_ AEC_CONFIG;
void get_cfg_file_aec_config(struct aec_s_attr *aec_param)
{
AEC_CONFIG aec_config = {
.mic_again = 3,
.dac_again = 22,
#ifdef CONFIG_DNS_ENC_ENABLE
.aec_mode = BIT(0) | BIT(1) | BIT(2) | BIT(5),
#else
.aec_mode = BIT(0) | BIT(1) | BIT(2),
#endif
.ul_eq_en = 0,
/*AGC*/
.ndt_fade_in = 1.3f,
.ndt_fade_out = 0.9f,
.dt_fade_in = 1.3f,
.dt_fade_out = 0.9f,
.ndt_max_gain = 12.f,
.ndt_min_gain = 0.f,
.ndt_speech_thr = -50.f,
.dt_max_gain = 12.f,
.dt_min_gain = 0.f,
.dt_speech_thr = -40.f,
.echo_present_thr = -70.f,
/*AEC*/
.aec_dt_aggress = 1.f,
.aec_refengthr = -70.f,
/*ES*/
.nlp_aggress_factor = -3.f,
.nlp_min_suppress = 4.f,
/*ANS*/
.ans_aggress = 1.25f,
.ans_suppress = 0.04f,
/*DNS*/
.dns_gain_floor = 0.1f,
.dns_over_drive = 1.0f,
};
//-----------------------------CFG_AEC_ID------------------------------------//
int ret = syscfg_read(CFG_AEC_ID, &aec_config, sizeof(AEC_CONFIG));
if (ret > 0) {
log_info("aec config mode:%d, DNS_gain_floor:%f, dns_over_drive:%f\n", aec_config.aec_mode, aec_config.dns_gain_floor, aec_config.dns_over_drive);
}
aec_param->EnableBit = aec_config.aec_mode;
#ifndef CONFIG_DNS_ENC_ENABLE
aec_param->EnableBit &= ~BIT(5);
#endif
aec_param->AGC_NDT_fade_in_step = aec_config.ndt_fade_in;
aec_param->AGC_NDT_fade_out_step = aec_config.ndt_fade_out;
aec_param->AGC_DT_fade_in_step = aec_config.dt_fade_in;
aec_param->AGC_DT_fade_out_step = aec_config.dt_fade_out;
aec_param->AGC_NDT_max_gain = aec_config.ndt_max_gain;
aec_param->AGC_NDT_min_gain = aec_config.ndt_min_gain;
aec_param->AGC_NDT_speech_thr = aec_config.ndt_speech_thr;
aec_param->AGC_DT_max_gain = aec_config.dt_max_gain;
aec_param->AGC_DT_min_gain = aec_config.dt_min_gain;
aec_param->AGC_DT_speech_thr = aec_config.dt_speech_thr;
aec_param->AGC_echo_present_thr = aec_config.echo_present_thr;
aec_param->AEC_DT_AggressiveFactor = aec_config.aec_dt_aggress;
aec_param->AEC_RefEngThr = aec_config.aec_refengthr;
aec_param->ES_AggressFactor = aec_config.nlp_aggress_factor;
aec_param->ES_MinSuppress = aec_config.nlp_min_suppress;
aec_param->ANS_AggressFactor = aec_config.ans_aggress;
aec_param->ANS_MinSuppress = aec_config.ans_suppress;
aec_param->DNS_gain_floor = aec_config.dns_gain_floor;
aec_param->DNS_over_drive = aec_config.dns_over_drive;
aec_param->DNS_loudness = 1.0f;
aec_param->AGC_echo_look_ahead = 100;
aec_param->AGC_echo_hold = 400;
aec_param->ES_Unconverge_OverDrive = aec_param->ES_MinSuppress;
}
#endif
#ifdef CONFIG_NET_ENABLE
typedef struct __RF_PARAM_CONFIG {
u8 xosc_l;
u8 xosc_r;
u8 pa_trim_data[7];
u8 mcs_dgain[20];
u8 analog_gain;
u8 force_update_vm;
} _GNU_PACKED_ RF_PARAM_CONFIG;
static RF_PARAM_CONFIG rf_param_config;
#ifdef CONFIG_RF_TEST_ENABLE
int init_net_device_mac_addr(char *macaddr, char ap_mode)
{
memcpy(macaddr, bt_get_mac_addr(), 6);
return 0;
}
#endif
#if defined CONFIG_RF_TEST_ENABLE || defined CONFIG_READ_RF_PARAM_FROM_CFGTOOL_ENABLE
u8 get_rf_analog_gain(void)
{
return rf_param_config.analog_gain;
}
int get_power_config_from_cfg_tools_enalbe(void)
{
return 1;
}
#endif
#endif
typedef struct __POWER_CONFIG {
float vddiom_vol;
float vddiow_vol;
float vdc14_vol;
float sysvdd_vol;
} _GNU_PACKED_ POWER_CONFIG;
void cfg_file_parse(void)
{
u8 tmp[65] = {0};
int ret = 0;
/*************************************************************************/
/* CFG READ IN cfg_tools.bin */
/*************************************************************************/
#ifdef CONFIG_RF_TEST_ENABLE
//-----------------------------CFG_WIFI_TEST_CFG_ID--------------------------------------//
ret = syscfg_read(CFG_WIFI_TEST_CFG_ID, tmp, 5);
if (ret > 0) {
tmp[ret] = 0;
if (tmp[1] == 'P' && tmp[2] >= 'A' && tmp[2] <= 'H'
&& (tmp[3] == '0' || tmp[3] == '1')
&& tmp[4] >= '0' && tmp[4] <= '9') {
extern struct uart_platform_data uart2_data;
uart2_data.tx_pin = (tmp[2] - 'A') * 16 + (tmp[3] - '0') * 10 + (tmp[4] - '0');
extern int uart_init(const struct uart_platform_data * data);
uart_init(&uart2_data);
os_time_dly(5);
}
log_info("wifi test mode:%d, debug io:%s\n", tmp[0], tmp + 1);
}
#endif
#ifdef CONFIG_BT_ENABLE
//-----------------------------CFG_BT_NAME--------------------------------------//
ret = syscfg_read(CFG_BT_NAME, tmp, LOCAL_NAME_LEN);
if (ret < 0) {
log_info("read edr name err\n");
} else if (ret >= LOCAL_NAME_LEN) {
memset(edr_name, 0x00, LOCAL_NAME_LEN);
memcpy(edr_name, tmp, LOCAL_NAME_LEN);
edr_name[LOCAL_NAME_LEN - 1] = 0;
} else {
memset(edr_name, 0x00, LOCAL_NAME_LEN);
memcpy(edr_name, tmp, ret);
}
log_info("edr name config:%s\n", edr_name);
//-----------------------------CFG_BLE_NAME--------------------------------------//
ret = syscfg_read(CFG_BLE_NAME, tmp, LOCAL_NAME_LEN);
if (ret < 0) {
log_info("read ble name err\n");
} else if (ret >= LOCAL_NAME_LEN) {
memset(ble_name, 0x00, LOCAL_NAME_LEN);
memcpy(ble_name, tmp, LOCAL_NAME_LEN);
ble_name[LOCAL_NAME_LEN - 1] = 0;
} else {
memset(ble_name, 0x00, LOCAL_NAME_LEN);
memcpy(ble_name, tmp, ret);
}
log_info("ble name config:%s\n", ble_name);
//-----------------------------CFG_BT_MAC_ADDR--------------------------------------//
ret = syscfg_read(CFG_BT_MAC_ADDR, tmp, 6);
if (ret < 0) {
log_info("read edr mac addr err\n");
} else {
log_info("edr mac addr config\n");
put_buf(tmp, 6);
}
//-----------------------------CFG_BLE_MAC_ADDR--------------------------------------//
ret = syscfg_read(CFG_BLE_MAC_ADDR, tmp, 6);
if (ret < 0) {
log_info("read ble mac addr err\n");
} else {
log_info("ble mac addr config\n");
put_buf(tmp, 6);
}
u8 bt_power = 8;
u8 ble_power = 6;
//-----------------------------CFG_BT_RF_POWER_ID----------------------------//
ret = syscfg_read(CFG_BT_RF_POWER_ID, &bt_power, 1);
if (ret < 0) {
log_error("read edr rf power err\n");
bt_power = 8;
}
//-----------------------------CFG_BLE_RF_POWER_ID----------------------------//
ret = syscfg_read(CFG_BLE_RF_POWER_ID, &ble_power, 1);
if (ret < 0) {
log_error("read ble rf power err\n");
ble_power = 6;
}
//-------------若存在BT/BLE功率校准值(RF_FCC校准所得),则使用校准值-----------//
#ifdef RF_FCC_TEST_ENABLE
if (rf_fcc_adj_res_read("edr", &bt_power)) {
log_info("\n --- [RF_FCC_ADJ]bt_power %d ---- \n", bt_power);
} else {
log_info("\n --- [RF_FCC_ADJ]bt_power NULL ---- \n");
}
if (rf_fcc_adj_res_read("ble", &ble_power)) {
log_info("\n --- [RF_FCC_ADJ]ble_power %d ---- \n", ble_power);
} else {
log_info("\n --- [RF_FCC_ADJ]ble_power NULL ---- \n");
}
#endif
extern void bt_max_pwr_set(u8 pwr, u8 pg_pwr, u8 iq_pwr, u8 ble_pwr);
bt_max_pwr_set(bt_power, 6, 6, ble_power); //0-11 设置蓝牙发射功率
log_info("rf bt_power:%d, ble_power:%d\n", bt_power, ble_power);
//-----------------------------CFG_TWS_PAIR_CODE_ID----------------------------//
u16 pin = 0;
ret = syscfg_read(CFG_TWS_PAIR_CODE_ID, &pin, sizeof(pin));
if (ret < 0) {
log_error("read pincode err\n");
pin = 0;
} else {
snprintf(pincode, sizeof(pincode), "%04X", pin);
log_info("pincode : %s\n", pincode);
}
#if TCFG_BT_SNIFF_ENABLE
extern void lp_winsize_init(struct lp_ws_t *lp);
LRC_CONFIG lrc_cfg = {0};
ret = syscfg_read(CFG_LRC_ID, &lrc_cfg, sizeof(LRC_CONFIG));
if (ret > 0) {
log_info("lrc cfg\n");
/* log_info_hexdump(&lrc_cfg, sizeof(LRC_CONFIG)); */
default_lp_winsize.lrc_ws_inc = lrc_cfg.lrc_ws_inc;
default_lp_winsize.lrc_ws_init = lrc_cfg.lrc_ws_init;
default_lp_winsize.bt_osc_ws_inc = lrc_cfg.btosc_ws_inc;
default_lp_winsize.bt_osc_ws_init = lrc_cfg.btosc_ws_init;
default_lp_winsize.osc_change_mode = lrc_cfg.lrc_change_mode;
}
lp_winsize_init(&default_lp_winsize);
#endif
#endif
#ifdef CONFIG_NET_ENABLE
//-----------------------------CFG_WIFI_SSID_ID--------------------------------------//
ret = syscfg_read(CFG_WIFI_SSID_ID, tmp, 32);
if (ret < 0) {
log_info("read wifi ssid err\n");
} else {
tmp[ret - 1] = 0;
log_info("wifi ssid config:%s\n", tmp);
}
//-----------------------------CFG_WIFI_PWD_ID--------------------------------------//
ret = syscfg_read(CFG_WIFI_PWD_ID, tmp, 64);
if (ret <= 0) {
log_info("read wifi pwd err\n");
} else {
tmp[ret - 1] = 0;
log_info("wifi pwd config:%s\n", tmp);
}
//-----------------------------CFG_WIFI_RF_CFG_ID--------------------------------------//
ret = syscfg_read(CFG_WIFI_RF_CFG_ID, &rf_param_config, sizeof(rf_param_config));
if (ret < 0) {
log_info("read wifi rf cfg err\n");
} else {
put_buf((u8 *)&rf_param_config, sizeof(rf_param_config));
}
#endif
#if 0
/* g_printf("auto low power config:\n"); */
log_info("auto low power config:\n");
AUTO_LOWPOWER_V_CONFIG auto_lowpower;
ret = syscfg_read(CFG_LOWPOWER_V_ID, &auto_lowpower, sizeof(AUTO_LOWPOWER_V_CONFIG));
if (ret > 0) {
app_var.warning_tone_v = auto_lowpower.warning_tone_v;
app_var.poweroff_tone_v = auto_lowpower.poweroff_tone_v;
}
log_info("warning_tone_v:%d poweroff_tone_v:%d\n", app_var.warning_tone_v, app_var.poweroff_tone_v);
#endif
u8 auto_off_time;
ret = syscfg_read(CFG_AUTO_OFF_TIME_ID, &auto_off_time, sizeof(auto_off_time));
if (ret > 0) {
log_info("auto_off_time:%d\n", auto_off_time);
}
//-----------------------------CFG_WIFI_POWER_CFG_ID--------------------------------------//
POWER_CONFIG power_config = {0};
ret = syscfg_read(CFG_WIFI_POWER_CFG_ID, &power_config, sizeof(power_config));
if (ret < 0) {
log_info("read wifi power config err\n");
} else {
log_info("vddiom:%.2fV, vddiow:%.2fV, vdd14:%.2fV, sysvdd:%.2fV\n",
power_config.vddiom_vol, power_config.vddiow_vol, power_config.vdc14_vol, power_config.sysvdd_vol);
}
}
#if defined CONFIG_BT_ENABLE || defined CONFIG_WIFI_ENABLE
__attribute__((weak)) void wifi_get_xosc(u8 *xosc)
{
#if defined CONFIG_RF_TEST_ENABLE || defined CONFIG_READ_RF_PARAM_FROM_CFGTOOL_ENABLE
xosc[0] = rf_param_config.xosc_l;
xosc[1] = rf_param_config.xosc_r;
#else
xosc[0] = wifi_calibration_param.xosc_l;
xosc[1] = wifi_calibration_param.xosc_r;
#endif
if (syscfg_read(VM_XOSC_INDEX, xosc, 2) != 2) {
syscfg_write(VM_XOSC_INDEX, xosc, 2);
}
}
__attribute__((weak)) void wifi_get_mcs_dgain(u8 *mcs_dgain)
{
#if defined CONFIG_RF_TEST_ENABLE || defined CONFIG_READ_RF_PARAM_FROM_CFGTOOL_ENABLE
memcpy(mcs_dgain, rf_param_config.mcs_dgain, sizeof(rf_param_config.mcs_dgain));
#else
memcpy(mcs_dgain, wifi_calibration_param.mcs_dgain, sizeof(wifi_calibration_param.mcs_dgain));
#endif
if (syscfg_read(VM_WIFI_PA_MCS_DGAIN, mcs_dgain, sizeof(wifi_calibration_param.mcs_dgain)) != sizeof(wifi_calibration_param.mcs_dgain)) {
syscfg_write(VM_WIFI_PA_MCS_DGAIN, mcs_dgain, sizeof(wifi_calibration_param.mcs_dgain));
}
}
__attribute__((weak)) int wifi_get_pa_trim_data(u8 *pa_data)
{
#if defined CONFIG_RF_TEST_ENABLE || defined CONFIG_READ_RF_PARAM_FROM_CFGTOOL_ENABLE
memcpy(pa_data, rf_param_config.pa_trim_data, sizeof(rf_param_config.pa_trim_data));
#else
memcpy(pa_data, wifi_calibration_param.pa_trim_data, sizeof(wifi_calibration_param.pa_trim_data));
#endif
if (syscfg_read(VM_WIFI_PA_DATA, pa_data, sizeof(wifi_calibration_param.pa_trim_data)) != sizeof(wifi_calibration_param.pa_trim_data)) {
syscfg_write(VM_WIFI_PA_DATA, pa_data, sizeof(wifi_calibration_param.pa_trim_data));
}
return 1;//不使用自动tune
}
#endif