1531 lines
51 KiB
C
1531 lines
51 KiB
C
|
|
#include "init.h"
|
|||
|
|
#include "app_config.h"
|
|||
|
|
#include "system/includes.h"
|
|||
|
|
#include "btstack/avctp_user.h"
|
|||
|
|
#include "include/earphone.h"
|
|||
|
|
|
|||
|
|
#if TCFG_ANC_BOX_ENABLE
|
|||
|
|
|
|||
|
|
#ifdef SUPPORT_MS_EXTENSIONS
|
|||
|
|
#pragma bss_seg(".anc_box_bss")
|
|||
|
|
#pragma data_seg(".anc_box_data")
|
|||
|
|
#pragma const_seg(".anc_box_const")
|
|||
|
|
#pragma code_seg(".anc_box_code")
|
|||
|
|
#endif/*SUPPORT_MS_EXTENSIONS*/
|
|||
|
|
|
|||
|
|
#include "audio_anc.h"
|
|||
|
|
#include "asm/charge.h"
|
|||
|
|
#include "asm/chargestore.h"
|
|||
|
|
#include "user_cfg.h"
|
|||
|
|
#include "device/vm.h"
|
|||
|
|
#include "app_action.h"
|
|||
|
|
#include "app_main.h"
|
|||
|
|
#include "app_ancbox.h"
|
|||
|
|
#include "app_power_manage.h"
|
|||
|
|
#include "app_chargestore.h"
|
|||
|
|
#include "anc_btspp.h"
|
|||
|
|
#include "user_cfg.h"
|
|||
|
|
#include "audio_config.h"
|
|||
|
|
#include "audio_codec_clock.h"
|
|||
|
|
|
|||
|
|
#if AUDIO_ENC_MPT_SELF_ENABLE
|
|||
|
|
#include "audio_enc_mpt_self.h"
|
|||
|
|
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
|||
|
|
|
|||
|
|
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
|||
|
|
#include "audio_cvp_dut.h"
|
|||
|
|
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
|||
|
|
|
|||
|
|
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
|
|||
|
|
#include "icsd_adt_app.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#if AUDIO_SPK_EQ_CONFIG
|
|||
|
|
#include "audio_dec_eff.h"
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#define LOG_TAG_CONST APP_ANCBOX
|
|||
|
|
#define LOG_TAG "[APP_ANCBOX]"
|
|||
|
|
#define LOG_ERROR_ENABLE
|
|||
|
|
#define LOG_DEBUG_ENABLE
|
|||
|
|
#define LOG_INFO_ENABLE
|
|||
|
|
/* #define LOG_DUMP_ENABLE */
|
|||
|
|
#define LOG_CLI_ENABLE
|
|||
|
|
#include "debug.h"
|
|||
|
|
|
|||
|
|
#define ANC_VERSION 1//有必要时才更新该值(例如结构体数据改了)
|
|||
|
|
|
|||
|
|
enum {
|
|||
|
|
FILE_ID_COEFF = 0, //系数文件ID号
|
|||
|
|
FILE_ID_MIC_SPK = 1, //mic spk文件ID号
|
|||
|
|
FILE_ID_GAIN = 2, //GAIN数据
|
|||
|
|
FILE_ID_ADAPTIVE = 3, //自适应模式文件ID
|
|||
|
|
FILE_ID_ADAPTIVE_REF = 4, //自适应模式金机曲线ID
|
|||
|
|
//FILE_ID_SPKEQ = 5, //EQ数据
|
|||
|
|
FILE_ID_SZ_FFT = 6, //SZ频响数据
|
|||
|
|
FILE_ID_MIC_FFT = 7, //MIC声学频响数据
|
|||
|
|
FILE_ID_COEFF_FGQ = 8, //新系数文件-FGQ ID号
|
|||
|
|
FILE_ID_COEFF_FGQ_PART = 9, //新部分系数文件-FGQ ID号
|
|||
|
|
FILE_ID_SPKEQ_DATA_L = 10, //SPK_EQ数据左耳
|
|||
|
|
FILE_ID_SPKEQ_DATA_R = 11, //SPK_EQ数据右耳
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct _ear_parm {
|
|||
|
|
u8 ts; //训练步进
|
|||
|
|
u8 mode; //训练模式(普通/快速)
|
|||
|
|
u16 emmtv; //误差mic下限阈值
|
|||
|
|
u16 rmmtv; //参考mic下限阈值
|
|||
|
|
u8 sdt; //静音检测时间
|
|||
|
|
u8 ntt; //噪声训练时间
|
|||
|
|
u8 emstt; //误差mic静音训练时间
|
|||
|
|
u8 rmstt; //参考mic静音训练时间
|
|||
|
|
u8 c1tto; //系数一次校准超时时间
|
|||
|
|
u8 c2tto; //系数二次校准超时时间
|
|||
|
|
u8 gen; //增益配置使能位
|
|||
|
|
u8 gdac; //dac增益
|
|||
|
|
s8 grmic; //参考mic增益
|
|||
|
|
s8 gemic; //误差mic增益
|
|||
|
|
s16 ganc; //降噪增益
|
|||
|
|
s16 gpass; //通透增益
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct _ancbox_info {
|
|||
|
|
u8 ancbox_status;//anc测试盒在线状态
|
|||
|
|
u8 err_flag;
|
|||
|
|
u8 status;
|
|||
|
|
u8 test_flag;
|
|||
|
|
u8 baud_counter;
|
|||
|
|
u8 sz_nadap_pow;
|
|||
|
|
u8 sz_adap_pow;
|
|||
|
|
u8 sz_mute_pow;
|
|||
|
|
u8 fz_nadap_pow;
|
|||
|
|
u8 fz_adap_pow;
|
|||
|
|
u8 fz_mute_pow;
|
|||
|
|
u8 wz_nadap_pow;
|
|||
|
|
u8 wz_adap_pow;
|
|||
|
|
u8 train_step_succ;
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
u8 pair_flag;
|
|||
|
|
#endif
|
|||
|
|
u8 audio_enc_mpt_fre_ch;
|
|||
|
|
u8 fft_file_busy; //MIC_FFT SZ_FFT run状态获取: 1 正在run, 0 已停止
|
|||
|
|
anc_train_para_t *para;
|
|||
|
|
u8 *coeff;
|
|||
|
|
u32 coeff_ptr;
|
|||
|
|
u8 idle_flag;
|
|||
|
|
int anc_timer;
|
|||
|
|
int baud_timer;
|
|||
|
|
u8 *file_hdl;
|
|||
|
|
u32 file_id;
|
|||
|
|
u32 file_len;
|
|||
|
|
u32 coeff_len;
|
|||
|
|
u32 data_offset;
|
|||
|
|
u32 data_len;
|
|||
|
|
u8 *data_ptr;
|
|||
|
|
u32 type_id;
|
|||
|
|
u32 type_value;
|
|||
|
|
anc_gain_t gain;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#define DEFAULT_BAUDRATE 9600
|
|||
|
|
enum {
|
|||
|
|
CMD_ANC_STATUS = 0x00, //获取状态
|
|||
|
|
CMD_ANC_SET_START = 0x01, //ANC训练开始
|
|||
|
|
CMD_ANC_MUTE_TRAIN = 0x02, //静音训练
|
|||
|
|
CMD_ANC_SIN_TRAIN = 0x03, //找步进训练
|
|||
|
|
CMD_ANC_NOISE_TRAIN = 0x04, //噪声训练
|
|||
|
|
CMD_ANC_TEST_ANC_ON = 0x05, //ANC ON
|
|||
|
|
CMD_ANC_TEST_ANC_OFF = 0x06, //ANC OFF
|
|||
|
|
CMD_ANC_SET_STOP = 0x07, //停止训练
|
|||
|
|
CMD_ANC_SET_PARM = 0x08, //设置参数
|
|||
|
|
CMD_ANC_SYS_RESET = 0x09, //复位系统
|
|||
|
|
CMD_ANC_SET_RUN_MODE = 0x0A, //设置ANC运行模式
|
|||
|
|
CMD_ANC_TEST_PASS = 0x0B, //设置为通透
|
|||
|
|
CMD_ANC_CHANGE_BAUD = 0x0C, //切换波特率
|
|||
|
|
CMD_ANC_DEVELOPER_MODE = 0x0D, //开发者模式
|
|||
|
|
CMD_ANC_ADAP = 0x0E, //开关自适应
|
|||
|
|
CMD_ANC_WZ_BREAK = 0x0F, //退出噪声训练
|
|||
|
|
CMD_ANC_SET_TS = 0x10, //单独设置步进
|
|||
|
|
CMD_ANC_TRAIN_STEP = 0x11, //设置训练步进
|
|||
|
|
CMD_ANC_GET_TRAIN_STEP = 0x12, //获取训练步进
|
|||
|
|
CMD_ANC_GET_MUTE_TRAIN_POW = 0x13,//获取静音训练的收敛数据
|
|||
|
|
CMD_ANC_GET_NOISE_TRAIN_POW = 0x14,//获取噪声训练的收敛数据
|
|||
|
|
CMD_ANC_GET_TRAIN_POW = 0x15, //用于手动训练时实时读取收敛值
|
|||
|
|
CMD_ANC_SET_ID = 0x16, //根据ID设置参数
|
|||
|
|
CMD_ANC_GET_ID = 0x17, //根据ID读取参数
|
|||
|
|
CMD_ANC_TEST_BYPASS = 0x18, //设置bypass模式
|
|||
|
|
CMD_ANC_CHANGE_MODE = 0x19, //切换ANC模式 = 0x01, FF/FB/HB
|
|||
|
|
CMD_ANC_GET_COEFF_SIZE = 0x1A, //获取系数大小
|
|||
|
|
CMD_ANC_MUTE_TRAIN_ONLY = 0x1B,//单独进行静音训练
|
|||
|
|
CMD_ANC_GET_VERSION = 0x1C, //获取芯片版本号
|
|||
|
|
CMD_ANC_TRANS_TRAIN = 0x1D, //单独进行通透训练
|
|||
|
|
CMD_ANC_CREATE_SPK_MIC = 0x1E, //触发生成SPK MIC数据
|
|||
|
|
CMD_ANC_GET_ANC_CH = 0x1F, //获取耳机的通道 = 0x01,左声道/右声道/双声道
|
|||
|
|
CMD_ANC_PAIR_KEY = 0x20, //和耳机进行密码验证 = 0x01,匹配才能读系数
|
|||
|
|
CMD_ANC_PAIR_SUCC = 0x21, //绕过配对过程
|
|||
|
|
CMD_ANC_GET_MAX_ORDER = 0x22, //获取ANC最大滤波器阶数
|
|||
|
|
CMD_ANC_GET_HEARAID_EN = 0x23, //
|
|||
|
|
//透传指令START
|
|||
|
|
CMD_ANC_SZ_FFT_START = 0x51, //SZ_FFT计算开始
|
|||
|
|
CMD_ANC_SZ_FFT_STOP = 0x52, //SZ_FFT计算停止
|
|||
|
|
CMD_ANC_MIC_FFT_START = 0x53, //MIC_FFT计算停止
|
|||
|
|
CMD_ANC_MIC_FFT_STOP = 0x54, //MIC_FFT计算停止
|
|||
|
|
CMD_MUTL_SCENE_SET = 0X55, //ANC多场景设置
|
|||
|
|
CMD_FFT_FILE_BUSY_GET = 0X56, //FFT flie busy状态获取
|
|||
|
|
//透传指令END
|
|||
|
|
|
|||
|
|
CMD_ANC_GET_MAC = 0x80, //获取MAC地址
|
|||
|
|
CMD_ANC_TOOLS_SYNC, //同步信号,同CMD_ANC_STATUS一样意思
|
|||
|
|
CMD_ANC_SET_LINKKEY, //设置linkkey
|
|||
|
|
CMD_ANC_SW_TO_BT, //切到蓝牙模式
|
|||
|
|
CMD_ANC_READ_COEFF, //开始读取系数
|
|||
|
|
CMD_ANC_READ_COEFF_CONTINUE,//连续读取系数
|
|||
|
|
CMD_ANC_WRITE_COEFF, //开始写系数
|
|||
|
|
CMD_ANC_WRITE_COEFF_CONTINUE,//连续写系数
|
|||
|
|
CMD_ANC_GET_RESULT, //获取训练结果
|
|||
|
|
CMD_ANC_SET_GAIN, //设置gain
|
|||
|
|
CMD_ANC_GET_GAIN, //读取gain
|
|||
|
|
CMD_ANC_READ_FILE_START,//根据ID号读文件开始
|
|||
|
|
CMD_ANC_READ_FILE_DATA, //根据ID号读文件数据
|
|||
|
|
CMD_ANC_WRITE_FILE_START,//根据ID号写文件开始
|
|||
|
|
CMD_ANC_WRITE_FILE_DATA,//跟据ID号写文件数据
|
|||
|
|
CMD_ANC_WRITE_FILE_END, //根据ID号写文件结束
|
|||
|
|
|
|||
|
|
CMD_ANC_EQ_DATA = 0x90, //eq数据传输
|
|||
|
|
|
|||
|
|
//透传指令START
|
|||
|
|
CMD_ANC_SET_MUSIC_VOL, //设置音量
|
|||
|
|
CMD_ANC_NEW_EQ_DATA, //eq调试新指令
|
|||
|
|
|
|||
|
|
CMD_ANC_CVP_DUT_DATA = 0xA0, //CVP_DUT数据传输
|
|||
|
|
//透传指令END
|
|||
|
|
|
|||
|
|
CMD_ANC_FAIL = 0xFE,
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#define ANC_POW_SIZE 15
|
|||
|
|
static u8 anc_pow[ANC_POW_SIZE];
|
|||
|
|
static u8 eq_buffer[32];
|
|||
|
|
static u8 eq_len;
|
|||
|
|
static int cvp_dut_len;
|
|||
|
|
static u8 *cvp_dut_buffer;
|
|||
|
|
static struct _ancbox_info ancbox_info;
|
|||
|
|
#define __this (&ancbox_info)
|
|||
|
|
extern void sys_auto_shut_down_disable(void);
|
|||
|
|
extern void sys_auto_shut_down_enable(void);
|
|||
|
|
extern void bt_update_mac_addr(u8 *addr);
|
|||
|
|
extern void set_temp_link_key(u8 *linkkey);
|
|||
|
|
extern void chargestore_set_baudrate(u32 baudrate);
|
|||
|
|
extern void anc_cfg_btspp_update(u8 id, int data);
|
|||
|
|
extern int anc_cfg_btspp_read(u8 id, int *data);
|
|||
|
|
extern int anc_mode_change_tool(u8 dat);
|
|||
|
|
|
|||
|
|
static void ancbox_callback(u8 mode, u8 command)
|
|||
|
|
{
|
|||
|
|
log_info("ancbox_callback: %d, %d\n", mode, command);
|
|||
|
|
if (mode & 0x80) {//train step
|
|||
|
|
__this->err_flag = ANC_EXEC_SUCC;
|
|||
|
|
__this->train_step_succ = 1;
|
|||
|
|
} else {
|
|||
|
|
__this->err_flag = command;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (__this->status == CMD_ANC_CREATE_SPK_MIC) {
|
|||
|
|
__this->status = CMD_ANC_SET_STOP;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void ancbox_pow_callback(anc_ack_msg_t *msg, u8 step)
|
|||
|
|
{
|
|||
|
|
switch (step) {
|
|||
|
|
case ANC_TRAIN_SZ:
|
|||
|
|
__this->sz_nadap_pow = anc_powdat_analysis(msg->pow);
|
|||
|
|
__this->sz_adap_pow = anc_powdat_analysis(msg->temp_pow);
|
|||
|
|
__this->sz_mute_pow = anc_powdat_analysis(msg->mute_pow);
|
|||
|
|
break;
|
|||
|
|
case ANC_TRAIN_FZ:
|
|||
|
|
__this->fz_nadap_pow = anc_powdat_analysis(msg->pow);
|
|||
|
|
__this->fz_adap_pow = anc_powdat_analysis(msg->temp_pow);
|
|||
|
|
__this->fz_mute_pow = anc_powdat_analysis(msg->mute_pow);
|
|||
|
|
break;
|
|||
|
|
case ANC_TRAIN_WZ:
|
|||
|
|
__this->wz_nadap_pow = anc_powdat_analysis(msg->pow);
|
|||
|
|
__this->wz_adap_pow = anc_powdat_analysis(msg->temp_pow);
|
|||
|
|
if (msg->status == ANC_WZ_ADAP_STATUS) {
|
|||
|
|
for (u8 i = 0; i < (ANC_POW_SIZE - 1); i++) {
|
|||
|
|
anc_pow[i] = anc_pow[i + 1];
|
|||
|
|
}
|
|||
|
|
anc_pow[ANC_POW_SIZE - 1] = anc_powdat_analysis(msg->temp_pow);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_event_to_user(u8 event, u32 value)
|
|||
|
|
{
|
|||
|
|
struct sys_event e;
|
|||
|
|
e.type = SYS_DEVICE_EVENT;
|
|||
|
|
e.arg = (void *)DEVICE_EVENT_FROM_ANC;
|
|||
|
|
e.u.ancbox.event = event;
|
|||
|
|
e.u.ancbox.value = value;
|
|||
|
|
sys_event_notify(&e);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_cmd_timeout_deal(void *priv)
|
|||
|
|
{
|
|||
|
|
log_info("mabe takeup! sys reset!\n");
|
|||
|
|
cpu_reset();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_cmd_timeout_init(void)
|
|||
|
|
{
|
|||
|
|
if (__this->anc_timer == 0) {
|
|||
|
|
#if ANC_MIC_DMA_EXPORT
|
|||
|
|
__this->anc_timer = sys_timeout_add(NULL, anc_cmd_timeout_deal, 5000);
|
|||
|
|
#else
|
|||
|
|
__this->anc_timer = sys_timeout_add(NULL, anc_cmd_timeout_deal, 1000);
|
|||
|
|
#endif
|
|||
|
|
} else {
|
|||
|
|
sys_timer_modify(__this->anc_timer, 1000);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_cmd_timeout_del(void)
|
|||
|
|
{
|
|||
|
|
if (__this->anc_timer) {
|
|||
|
|
sys_timeout_del(__this->anc_timer);
|
|||
|
|
__this->anc_timer = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_baud_timer_deal(void *priv)
|
|||
|
|
{
|
|||
|
|
__this->baud_counter++;
|
|||
|
|
if (__this->baud_counter > 20) {
|
|||
|
|
sys_timer_del(__this->baud_timer);
|
|||
|
|
__this->baud_timer = 0;
|
|||
|
|
__this->baud_counter = 0;
|
|||
|
|
log_info("timer out, set baud 9600!\n");
|
|||
|
|
chargestore_set_baudrate(DEFAULT_BAUDRATE);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_wz_timeout_deal(void *priv)
|
|||
|
|
{
|
|||
|
|
anc_train_api_set(ANC_TEST_WZ_BREAK, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_read_file_start(u8 *cmd, u32 id)
|
|||
|
|
{
|
|||
|
|
u32 data_len;
|
|||
|
|
int *anc_debug_hdl;
|
|||
|
|
__this->file_id = id;
|
|||
|
|
switch (__this->file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
if (!__this->pair_flag) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
__this->file_len = anc_coeff_size_get(ANC_CFG_READ);
|
|||
|
|
#else
|
|||
|
|
__this->file_len = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
__this->file_hdl = (u8 *)anc_coeff_read();
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
if (__this->file_hdl) {//判断耳机有没有系数
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_MIC_SPK:
|
|||
|
|
//这里判断是否有数据
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
anc_debug_hdl = (u8 *)anc_debug_ctr(0);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
if (anc_debug_hdl) {
|
|||
|
|
__this->file_hdl = (u8 *)(anc_debug_hdl + 1); //数据指针
|
|||
|
|
__this->file_len = anc_debug_hdl[0];
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_GAIN:
|
|||
|
|
anc_cfg_online_deal(ANC_CFG_READ, &__this->gain);
|
|||
|
|
__this->file_len = sizeof(anc_gain_t);
|
|||
|
|
__this->file_hdl = (u8 *)&__this->gain;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
break;
|
|||
|
|
#if TCFG_ANC_SELF_DUT_GET_SZ
|
|||
|
|
case FILE_ID_SZ_FFT:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
__this->file_len = audio_anc_sz_fft_outbuf_get((&__this->file_hdl));
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#endif/*TCFG_ANC_SELF_DUT_GET_SZ*/
|
|||
|
|
|
|||
|
|
#if AUDIO_ENC_MPT_SELF_ENABLE
|
|||
|
|
case FILE_ID_MIC_FFT:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
__this->file_len = audio_enc_mpt_fre_response_file_get((&__this->file_hdl));
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
|||
|
|
#if AUDIO_SPK_EQ_CONFIG
|
|||
|
|
case FILE_ID_SPKEQ_DATA_L:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
__this->file_len = spk_eq_read_seg_l((&__this->file_hdl));
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_SPKEQ_DATA_R:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_START;
|
|||
|
|
__this->file_len = spk_eq_read_seg_r((&__this->file_hdl));
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->file_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_read_file_data(u8 *cmd, u32 offset, u32 data_len)
|
|||
|
|
{
|
|||
|
|
u32 read_len;
|
|||
|
|
switch (__this->file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
if (!__this->pair_flag) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#if AUDIO_SPK_EQ_CONFIG
|
|||
|
|
case FILE_ID_SPKEQ_DATA_L:
|
|||
|
|
case FILE_ID_SPKEQ_DATA_R:
|
|||
|
|
#endif/*AUDIO_SPK_EQ_CONFIG*/
|
|||
|
|
case FILE_ID_GAIN:
|
|||
|
|
if (__this->file_hdl == NULL) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_DATA;
|
|||
|
|
memcpy(&cmd[2], __this->file_hdl + offset, data_len);
|
|||
|
|
chargestore_api_write(cmd, data_len + 2);
|
|||
|
|
if (__this->file_len == offset + data_len) {
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_MIC_SPK:
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_DATA;
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], __this->file_hdl + offset, data_len);
|
|||
|
|
chargestore_api_write(cmd, data_len + 2);
|
|||
|
|
if (__this->file_len == offset + data_len) {
|
|||
|
|
__this->file_hdl = (u8 *)anc_debug_ctr(1);
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
break;
|
|||
|
|
#if TCFG_ANC_SELF_DUT_GET_SZ
|
|||
|
|
case FILE_ID_SZ_FFT:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_DATA;
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], __this->file_hdl + offset, data_len);
|
|||
|
|
chargestore_api_write(cmd, data_len + 2);
|
|||
|
|
if (__this->file_len == offset + data_len) {
|
|||
|
|
audio_anc_sz_fft_outbuf_release();
|
|||
|
|
audio_codec_clock_del(ANC_DUT_SZ_FFT_MODE);
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#endif/*TCFG_ANC_SELF_DUT_GET_SZ*/
|
|||
|
|
#if AUDIO_ENC_MPT_SELF_ENABLE
|
|||
|
|
case FILE_ID_MIC_FFT:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_FILE_DATA;
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
memcpy(&cmd[2], __this->file_hdl + offset, data_len);
|
|||
|
|
chargestore_api_write(cmd, data_len + 2);
|
|||
|
|
if (__this->file_len == offset + data_len) {
|
|||
|
|
audio_enc_mpt_fre_response_release();
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_write_file_start(u8 *cmd, u32 id, u32 data_len)
|
|||
|
|
{
|
|||
|
|
__this->file_id = id;
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
free(__this->file_hdl);
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
}
|
|||
|
|
if (__this->data_ptr) {
|
|||
|
|
free(__this->data_ptr);
|
|||
|
|
__this->data_ptr = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (__this->file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
case FILE_ID_COEFF_FGQ_PART:
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
anc_coeff_size_set(ANC_CFG_WRITE, data_len); //设置长度写anc_coeff.bin
|
|||
|
|
__this->file_len = data_len;
|
|||
|
|
#else
|
|||
|
|
__this->file_len = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
__this->file_hdl = (u8 *)malloc(__this->file_len);
|
|||
|
|
__this->data_ptr = (u8 *)malloc(32);
|
|||
|
|
if ((__this->file_len != data_len) || (__this->file_hdl == NULL) || (__this->data_ptr == NULL)) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
log_info("anc coeff size err, %d != %d\n", data_len, __this->file_len);
|
|||
|
|
if (__this->file_hdl) {
|
|||
|
|
free(__this->file_hdl);
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
}
|
|||
|
|
if (__this->data_ptr) {
|
|||
|
|
free(__this->data_ptr);
|
|||
|
|
__this->data_ptr = NULL;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_FILE_START;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_GAIN:
|
|||
|
|
__this->file_len = sizeof(anc_gain_t);
|
|||
|
|
__this->file_hdl = (u8 *)&__this->gain;
|
|||
|
|
__this->data_ptr = (u8 *)malloc(32);
|
|||
|
|
if ((__this->file_len != data_len) || (__this->data_ptr == NULL)) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
log_info("anc gain size err, %d != %d\n", data_len, __this->file_len);
|
|||
|
|
if (__this->data_ptr) {
|
|||
|
|
free(__this->data_ptr);
|
|||
|
|
__this->data_ptr = NULL;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_FILE_START;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static void anc_write_file_data(u8 *cmd, u32 offset, u8 *data, u32 data_len)
|
|||
|
|
{
|
|||
|
|
switch (__this->file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
case FILE_ID_COEFF_FGQ_PART:
|
|||
|
|
case FILE_ID_GAIN:
|
|||
|
|
if (__this->file_hdl == NULL || ((offset + data_len) > __this->file_len)) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
memcpy(__this->file_hdl + offset, data, data_len);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_FILE_DATA;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static int app_anc_write_file_end(u32 file_id)
|
|||
|
|
{
|
|||
|
|
int ret;
|
|||
|
|
switch (file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
ret = anc_coeff_write((int *)__this->file_hdl, __this->file_len);
|
|||
|
|
break;
|
|||
|
|
#if ANC_MULT_ORDER_ENABLE
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
ret = audio_anc_mult_coeff_write(ANC_MULT_COEFF_FILL_ALL, (int *)__this->file_hdl, __this->file_len);
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_COEFF_FGQ_PART:
|
|||
|
|
ret = audio_anc_mult_coeff_write(ANC_MULT_COEFF_FILL_PART, (int *)__this->file_hdl, __this->file_len);
|
|||
|
|
break;
|
|||
|
|
#endif/*ANC_MULT_ORDER_ENABLE*/
|
|||
|
|
}
|
|||
|
|
free(__this->file_hdl);
|
|||
|
|
free(__this->data_ptr);
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
__this->data_ptr = NULL;
|
|||
|
|
return ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
static void anc_write_file_end(u8 *cmd)
|
|||
|
|
{
|
|||
|
|
switch (__this->file_id) {
|
|||
|
|
case FILE_ID_COEFF:
|
|||
|
|
case FILE_ID_COEFF_FGQ:
|
|||
|
|
case FILE_ID_COEFF_FGQ_PART:
|
|||
|
|
if (__this->file_hdl == NULL) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
if (app_anc_write_file_end(__this->file_id)) {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
} else {
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_FILE_END;
|
|||
|
|
}
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case FILE_ID_GAIN:
|
|||
|
|
if (__this->file_hdl == NULL) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
anc_cfg_online_deal(ANC_CFG_WRITE, &__this->gain);
|
|||
|
|
free(__this->data_ptr);
|
|||
|
|
__this->file_hdl = NULL;
|
|||
|
|
__this->data_ptr = NULL;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_FILE_END;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
static void anc_ack_pair_key(u8 *key)
|
|||
|
|
{
|
|||
|
|
u8 cmd[2];
|
|||
|
|
if (strcmp(ANCTOOL_PAIR_KEY, (const char *)key) == 0) {
|
|||
|
|
__this->pair_flag = 1;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_PAIR_KEY;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
__this->pair_flag = 0;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
static void anc_ack_spk_eq(u8 seq, u8 *packet, u8 len)
|
|||
|
|
{
|
|||
|
|
u8 cmd[32];
|
|||
|
|
if (len > 30) {
|
|||
|
|
log_error("anc_ack_spk_eq packet len err! %d\n", len);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_NEW_EQ_DATA;
|
|||
|
|
memcpy(cmd + 2, packet, len);
|
|||
|
|
chargestore_api_write(cmd, len + 2);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int app_ancbox_event_handler(struct ancbox_event *anc_dev)
|
|||
|
|
{
|
|||
|
|
u8 cmd[32], mac_addr[6];
|
|||
|
|
u32 data_len;
|
|||
|
|
u32 anc_coeff_total_size;
|
|||
|
|
int ret;
|
|||
|
|
struct application *app = get_current_app();
|
|||
|
|
|
|||
|
|
if (!get_total_connect_dev()) { //已经连接手机
|
|||
|
|
void sys_auto_shut_down_disable(void);
|
|||
|
|
void sys_auto_shut_down_enable(void);
|
|||
|
|
sys_auto_shut_down_disable();
|
|||
|
|
sys_auto_shut_down_enable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (anc_dev->event) {
|
|||
|
|
case CMD_ANC_MUTE_TRAIN_ONLY://独立的训练模式
|
|||
|
|
log_info("event_CMD_ANC_MUTE_TRAIN_ONLY\n");
|
|||
|
|
if (__this->status != CMD_ANC_MUTE_TRAIN_ONLY) {
|
|||
|
|
__this->status = CMD_ANC_MUTE_TRAIN_ONLY;
|
|||
|
|
__this->err_flag = 0;
|
|||
|
|
sys_auto_shut_down_disable();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
anc_train_api_set(ANC_MUTE_TARIN, 1, __this->para);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case CMD_ANC_TRANS_TRAIN://独立的训练模式
|
|||
|
|
log_info("event_CMD_ANC_TRANS_TRAIN\n");
|
|||
|
|
if (__this->status != CMD_ANC_TRANS_TRAIN) {
|
|||
|
|
__this->status = CMD_ANC_TRANS_TRAIN;
|
|||
|
|
__this->err_flag = 0;
|
|||
|
|
sys_auto_shut_down_disable();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
anc_train_api_set(ANC_TRANS_MUTE_TARIN, 1, __this->para);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case CMD_ANC_CREATE_SPK_MIC:
|
|||
|
|
log_info("event_CMD_ANC_CREATE_SPK_MIC: %d\n", anc_dev->value);
|
|||
|
|
if (__this->status != CMD_ANC_CREATE_SPK_MIC) {
|
|||
|
|
__this->status = CMD_ANC_CREATE_SPK_MIC;
|
|||
|
|
__this->err_flag = 0;
|
|||
|
|
anc_train_api_set(ANC_MUTE_TARIN, anc_dev->value, __this->para);
|
|||
|
|
sys_auto_shut_down_disable();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case CMD_ANC_SET_START:
|
|||
|
|
log_info("event_CMD_ANC_SET_STAR\n");
|
|||
|
|
__this->test_flag = 1;
|
|||
|
|
__this->status = CMD_ANC_SET_START;
|
|||
|
|
__this->err_flag = 0;
|
|||
|
|
sys_auto_shut_down_disable();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
memset(anc_pow, 0, ANC_POW_SIZE);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_MUTE_TRAIN:
|
|||
|
|
log_info("event_CMD_ANC_MUTE_TRAIN\n");
|
|||
|
|
if (__this->status != CMD_ANC_MUTE_TRAIN) {
|
|||
|
|
__this->status = CMD_ANC_MUTE_TRAIN;
|
|||
|
|
anc_train_api_set(ANC_MUTE_TARIN, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SIN_TRAIN:
|
|||
|
|
log_info("event_CMD_ANC_SIN_TRAIN\n");
|
|||
|
|
if (__this->status != CMD_ANC_SIN_TRAIN) {
|
|||
|
|
__this->status = CMD_ANC_SIN_TRAIN;
|
|||
|
|
anc_train_api_set(ANC_TRAIN_STEP_1, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_NOISE_TRAIN:
|
|||
|
|
log_info("event_CMD_ANC_TRAIN_SPK_ON\n");
|
|||
|
|
if (__this->status != CMD_ANC_NOISE_TRAIN) {
|
|||
|
|
__this->status = CMD_ANC_NOISE_TRAIN;
|
|||
|
|
anc_train_api_set(ANC_NOISE_TARIN, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_TEST_ANC_ON:
|
|||
|
|
log_info("event_CMD_ANC_TEST_ANC_ON\n");
|
|||
|
|
if (__this->test_flag == 1) {
|
|||
|
|
__this->status = CMD_ANC_TEST_ANC_ON;
|
|||
|
|
anc_train_api_set(ANC_MODE_ON, 0, __this->para);
|
|||
|
|
} else {
|
|||
|
|
log_info("switch to ancon!\n");
|
|||
|
|
anc_api_set_fade_en(0);
|
|||
|
|
anc_mode_switch(ANC_ON, 0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_TEST_ANC_OFF:
|
|||
|
|
log_info("event_CMD_ANC_TEST_ANC_OFF\n");
|
|||
|
|
if (__this->test_flag == 1) {
|
|||
|
|
__this->status = CMD_ANC_TEST_ANC_OFF;
|
|||
|
|
anc_train_api_set(ANC_MODE_OFF, 0, __this->para);
|
|||
|
|
} else {
|
|||
|
|
log_info("switch to ancoff!\n");
|
|||
|
|
anc_api_set_fade_en(0);
|
|||
|
|
anc_mode_switch(ANC_OFF, 0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_TEST_PASS:
|
|||
|
|
log_info("event_CMD_ANC_TEST_PASS\n");
|
|||
|
|
if (__this->test_flag == 1) {
|
|||
|
|
__this->status = CMD_ANC_TEST_PASS;
|
|||
|
|
anc_train_api_set(ANC_PASS_MODE_ON, 0, __this->para);
|
|||
|
|
} else {
|
|||
|
|
log_info("switch to pass!\n");
|
|||
|
|
anc_api_set_fade_en(0);
|
|||
|
|
anc_mode_switch(ANC_TRANSPARENCY, 0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SET_STOP:
|
|||
|
|
log_info("event_CMD_ANC_SET_STOP\n");
|
|||
|
|
__this->status = CMD_ANC_SET_STOP;
|
|||
|
|
__this->err_flag = 0;
|
|||
|
|
if (__this->test_flag) {
|
|||
|
|
__this->test_flag = 0;
|
|||
|
|
anc_train_api_set(ANC_TRAIN_EXIT, 0, __this->para);
|
|||
|
|
sys_auto_shut_down_enable();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SYS_RESET:
|
|||
|
|
log_info("event_CMD_ANC_SYS_RESET\n");
|
|||
|
|
os_time_dly(3);
|
|||
|
|
cpu_reset();
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SET_RUN_MODE:
|
|||
|
|
log_info("event_CMD_ANC_SET_RUN_MODE = %d\n", anc_dev->value);
|
|||
|
|
anc_api_set_fade_en(0);
|
|||
|
|
if (anc_dev->value == 0) {
|
|||
|
|
anc_mode_switch(ANC_OFF, 0);
|
|||
|
|
} else if (anc_dev->value == 1) {
|
|||
|
|
anc_mode_switch(ANC_ON, 0);
|
|||
|
|
} else {
|
|||
|
|
anc_mode_switch(ANC_TRANSPARENCY, 0);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_TEST_BYPASS:
|
|||
|
|
log_info("event_CMD_ANC_TEST_BYPASS\n");
|
|||
|
|
anc_mode_switch(ANC_BYPASS, 0);
|
|||
|
|
//bypass,此处调用底层接口根据anc_dev->value需要切换到那个mic的bypass
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_CHANGE_MODE:
|
|||
|
|
log_info("event_CMD_ANC_CHANGE_MODE = %d\n", anc_dev->value);
|
|||
|
|
anc_mode_change_tool(anc_dev->value);
|
|||
|
|
//切换FF/FB,此处调用底层接口根据anc_dev->value需要切换到FF/FB
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_STATUS:
|
|||
|
|
case CMD_ANC_TOOLS_SYNC:
|
|||
|
|
putchar('S');
|
|||
|
|
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
|
|||
|
|
/*关闭所有模块*/
|
|||
|
|
if (audio_icsd_adt_is_running()) {
|
|||
|
|
audio_icsd_adt_close_all();
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#if TCFG_AUDIO_ANC_EAR_ADAPTIVE_EN
|
|||
|
|
//自适应还原为默认参数
|
|||
|
|
if (audio_anc_coeff_mode_get() == ANC_COEFF_MODE_ADAPTIVE) {
|
|||
|
|
audio_anc_coeff_adaptive_set(ANC_COEFF_MODE_NORMAL, 0, 0);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
#if TCFG_CHARGESTORE_PORT == LDOIN_BIND_IO
|
|||
|
|
if (app && strcmp(app->name, APP_NAME_IDLE)) {
|
|||
|
|
os_time_dly(1);
|
|||
|
|
log_info("not idle app, reset sys!\n");
|
|||
|
|
cpu_reset();
|
|||
|
|
} else {
|
|||
|
|
__this->idle_flag = 1;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
anc_cmd_timeout_init();
|
|||
|
|
if (__this->para == NULL) {
|
|||
|
|
__this->para = anc_api_get_train_param();
|
|||
|
|
anc_api_set_callback(ancbox_callback, ancbox_pow_callback);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SET_LINKKEY:
|
|||
|
|
log_info("CMD_ANC_SET_LINKKEY\n");
|
|||
|
|
if (app && strcmp(app->name, APP_NAME_BT)) {
|
|||
|
|
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
|||
|
|
app_var.play_poweron_tone = 0;
|
|||
|
|
task_switch_to_bt();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SW_TO_BT:
|
|||
|
|
log_info("CMD_ANC_SW_TO_BT\n");
|
|||
|
|
bt_get_vm_mac_addr(mac_addr);
|
|||
|
|
bt_update_mac_addr(mac_addr);
|
|||
|
|
if (app && strcmp(app->name, APP_NAME_BT)) {
|
|||
|
|
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
|||
|
|
app_var.play_poweron_tone = 0;
|
|||
|
|
task_switch_to_bt();
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
} else {
|
|||
|
|
#if TCFG_CHARGESTORE_PORT != LDOIN_BIND_IO
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
//关闭回连
|
|||
|
|
EARPHONE_STATE_SET_PAGE_SCAN_ENABLE();
|
|||
|
|
user_send_cmd_prepare(USER_CTRL_WRITE_SCAN_ENABLE, 0, NULL);
|
|||
|
|
user_send_cmd_prepare(USER_CTRL_WRITE_CONN_ENABLE, 0, NULL);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_COEFF://read start
|
|||
|
|
log_info("CMD_ANC_READ_COEFF\n");
|
|||
|
|
__this->coeff = (u8 *)anc_coeff_read();
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_READ_COEFF;
|
|||
|
|
if (__this->coeff == NULL) {
|
|||
|
|
data_len = 0;
|
|||
|
|
} else {
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get(ANC_CFG_READ);
|
|||
|
|
#else
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
data_len = anc_coeff_total_size;
|
|||
|
|
}
|
|||
|
|
__this->coeff_ptr = 0;
|
|||
|
|
memcpy(&cmd[2], (u8 *)&data_len, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_COEFF://write start
|
|||
|
|
log_info("CMD_ANC_WRITE_COEFF\n");
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_COEFF;
|
|||
|
|
__this->coeff_ptr = 0;
|
|||
|
|
if (__this->coeff == NULL) {
|
|||
|
|
__this->coeff = (u8 *)malloc(__this->coeff_len);
|
|||
|
|
if (__this->coeff == NULL) {
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_COEFF_CONTINUE:
|
|||
|
|
log_info("CMD_ANC_WRITE_COEFF_CONTINUE\n");
|
|||
|
|
if (__this->coeff) {
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
anc_coeff_write((int *)__this->coeff, __this->coeff_len);
|
|||
|
|
free(__this->coeff);
|
|||
|
|
__this->coeff = NULL;
|
|||
|
|
__this->coeff_ptr = 0;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_WRITE_COEFF_CONTINUE;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
log_info("CMD_ANC_WRITE_COEFF_CONTINUE--------end\n");
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_FILE_START:
|
|||
|
|
anc_read_file_start(cmd, __this->file_id);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_FILE_DATA:
|
|||
|
|
anc_read_file_data(cmd, __this->data_offset, __this->data_len);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_START:
|
|||
|
|
anc_write_file_start(cmd, __this->file_id, __this->file_len);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_DATA:
|
|||
|
|
anc_write_file_data(cmd, __this->data_offset, __this->data_ptr, __this->data_len);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_END:
|
|||
|
|
anc_write_file_end(cmd);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SET_GAIN:
|
|||
|
|
log_info("CMD_ANC_SET_GAIN\n");
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
anc_cfg_online_deal(ANC_CFG_WRITE, &__this->gain);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_SET_GAIN;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_GAIN:
|
|||
|
|
log_info("CMD_ANC_GET_GAIN\n");
|
|||
|
|
anc_cfg_online_deal(ANC_CFG_READ, &__this->gain);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_GET_GAIN;
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->gain, sizeof(anc_gain_t));
|
|||
|
|
chargestore_api_write(cmd, 2 + sizeof(anc_gain_t));
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_CHANGE_BAUD:
|
|||
|
|
log_info("CMD_ANC_CHANGE_BAUD: %d\n", anc_dev->value);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_CHANGE_BAUD;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
chargestore_api_wait_complete();
|
|||
|
|
chargestore_set_baudrate(anc_dev->value);
|
|||
|
|
if (__this->baud_timer) {
|
|||
|
|
sys_timeout_del(__this->baud_timer);
|
|||
|
|
__this->baud_timer = 0;
|
|||
|
|
}
|
|||
|
|
if (anc_dev->value != DEFAULT_BAUDRATE) {
|
|||
|
|
__this->baud_timer = sys_timer_add(NULL, anc_baud_timer_deal, 100);
|
|||
|
|
__this->baud_counter = 0;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WZ_BREAK:
|
|||
|
|
log_info("CMD_ANC_WZ_BREAK: %d s\n", anc_dev->value);
|
|||
|
|
sys_timeout_add(NULL, anc_wz_timeout_deal, anc_dev->value * 1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SET_ID:
|
|||
|
|
log_info("CMD_ANC_SET_ID: %d ,%d\n", __this->type_id, __this->type_value);
|
|||
|
|
anc_cmd_timeout_del();
|
|||
|
|
anc_cfg_btspp_update((u8)__this->type_id, (int)__this->type_value);
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_SET_ID;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_ID:
|
|||
|
|
log_info("CMD_ANC_GET_ID: %d\n", __this->type_id);
|
|||
|
|
if (anc_cfg_btspp_read((u8)__this->type_id, (int *)&__this->type_value) == 0) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_GET_ID;
|
|||
|
|
memcpy(&cmd[2], (u8 *)&__this->type_value, 4);
|
|||
|
|
chargestore_api_write(cmd, 6);
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
#if AUDIO_SPK_EQ_CONFIG
|
|||
|
|
case CMD_ANC_EQ_DATA:
|
|||
|
|
log_info("CMD_ANC_EQ_DATA\n");
|
|||
|
|
log_info_hexdump(eq_buffer, eq_len);
|
|||
|
|
ret = spk_eq_spp_rx_packet(eq_buffer, eq_len);
|
|||
|
|
if (ret == -1) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_EQ_DATA;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_NEW_EQ_DATA:
|
|||
|
|
log_info("CMD_ANC_EQ_DATA\n");
|
|||
|
|
log_info_hexdump(eq_buffer, eq_len);
|
|||
|
|
spk_eq_set_send_data_handler(anc_ack_spk_eq);
|
|||
|
|
spk_eq_app_online_parse(eq_buffer, eq_len, NULL, 0);
|
|||
|
|
spk_eq_set_send_data_handler(NULL);
|
|||
|
|
break;
|
|||
|
|
#endif
|
|||
|
|
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
|||
|
|
case CMD_ANC_CVP_DUT_DATA:
|
|||
|
|
log_info("CMD_ANC_CVP_DUT_DATA\n");
|
|||
|
|
log_info_hexdump(cvp_dut_buffer, cvp_dut_len);
|
|||
|
|
ret = cvp_dut_new_rx_packet(cvp_dut_buffer, cvp_dut_len);
|
|||
|
|
if (ret) {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
} else {
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_CVP_DUT_DATA;
|
|||
|
|
chargestore_api_write(cmd, 2);
|
|||
|
|
}
|
|||
|
|
free(cvp_dut_buffer);
|
|||
|
|
break;
|
|||
|
|
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
|||
|
|
case CMD_ANC_SET_MUSIC_VOL:
|
|||
|
|
log_info("CMD_ANC_SET_MUSIC_VOL: %d\n", anc_dev->value);
|
|||
|
|
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, (anc_dev->value * get_max_sys_vol()) / 0x64, 0);
|
|||
|
|
break;
|
|||
|
|
#if TCFG_ANC_SELF_DUT_GET_SZ
|
|||
|
|
case CMD_ANC_SZ_FFT_STOP:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_SZ_FFT_STOP;
|
|||
|
|
audio_anc_sz_fft_stop(NULL); //SZ_FFT 停止计算
|
|||
|
|
anc_train_close(); //关闭ANC,模式设置为ANC_OFF
|
|||
|
|
__this->fft_file_busy = 0;
|
|||
|
|
/* chargestore_api_write(cmd, 2); */
|
|||
|
|
break;
|
|||
|
|
#endif/*TCFG_ANC_SELF_DUT_GET_SZ*/
|
|||
|
|
|
|||
|
|
#if AUDIO_ENC_MPT_SELF_ENABLE
|
|||
|
|
case CMD_ANC_MIC_FFT_START:
|
|||
|
|
__this->fft_file_busy = 1;
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_MIC_FFT_START;
|
|||
|
|
chargestore_api_write(cmd, 2); //先回复,再执行
|
|||
|
|
audio_enc_mpt_fre_response_open(__this->audio_enc_mpt_fre_ch);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_MIC_FFT_STOP:
|
|||
|
|
cmd[0] = CMD_ANC_MODULE;
|
|||
|
|
cmd[1] = CMD_ANC_MIC_FFT_STOP;
|
|||
|
|
audio_enc_mpt_fre_response_close();
|
|||
|
|
__this->fft_file_busy = 0;
|
|||
|
|
break;
|
|||
|
|
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static int app_ancbox_module_deal(u8 *buf, u8 len)
|
|||
|
|
{
|
|||
|
|
if (buf[0] != CMD_ANC_MODULE) {
|
|||
|
|
//不是ANC测试指令
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u8 cmd, i, j;
|
|||
|
|
u8 sendbuf[32];
|
|||
|
|
u32 read_len;
|
|||
|
|
u32 baudrate;
|
|||
|
|
u32 anc_coeff_total_size;
|
|||
|
|
u32 value;
|
|||
|
|
struct _ear_parm parm;
|
|||
|
|
sendbuf[0] = CMD_ANC_MODULE;
|
|||
|
|
sendbuf[1] = buf[1];
|
|||
|
|
__this->ancbox_status = 1;
|
|||
|
|
__this->baud_counter = 0;
|
|||
|
|
anc_online_busy_set(1);
|
|||
|
|
|
|||
|
|
if (buf[1] != 129) {
|
|||
|
|
printf("cmd = 0x%x\n", buf[1]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
cmd = buf[1];
|
|||
|
|
switch (buf[1]) {
|
|||
|
|
case CMD_ANC_SET_PARM:
|
|||
|
|
memcpy((u8 *)&parm, &buf[2], sizeof(struct _ear_parm));
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
if (parm.mode == 0) {
|
|||
|
|
anc_train_api_set(ANC_CHANGE_COMMAND, ANC_TRAIN_NOMA_MODE, __this->para);
|
|||
|
|
} else {
|
|||
|
|
anc_train_api_set(ANC_CHANGE_COMMAND, parm.mode, __this->para);
|
|||
|
|
}
|
|||
|
|
anc_train_api_set(ANC_SZ_LOW_THR_SET, parm.emmtv, __this->para);
|
|||
|
|
anc_train_api_set(ANC_FZ_LOW_THR_SET, parm.rmmtv, __this->para);
|
|||
|
|
anc_train_api_set(ANC_NONADAP_TIME_SET, parm.sdt, __this->para);
|
|||
|
|
anc_train_api_set(ANC_SZ_ADAP_TIME_SET, parm.emstt, __this->para);
|
|||
|
|
anc_train_api_set(ANC_FZ_ADAP_TIME_SET, parm.rmstt, __this->para);
|
|||
|
|
anc_train_api_set(ANC_WZ_TRAIN_TIME_SET, parm.ntt, __this->para);
|
|||
|
|
anc_train_api_set(ANC_TRAIN_STEP_SET, parm.ts, __this->para);
|
|||
|
|
if (parm.gen) {
|
|||
|
|
#if (ANC_CHIP_VERSION != ANC_VERSION_BR36) && (ANC_CHIP_VERSION != ANC_VERSION_BR28)
|
|||
|
|
anc_param_fill(ANC_CFG_READ, &__this->gain);
|
|||
|
|
__this->gain.dac_gain = (u8)parm.gdac;
|
|||
|
|
__this->gain.ref_mic_gain = (u8)parm.grmic;
|
|||
|
|
__this->gain.err_mic_gain = (u8)parm.gemic;
|
|||
|
|
__this->gain.anc_gain = (int)parm.ganc;
|
|||
|
|
__this->gain.transparency_gain = (int)parm.gpass;
|
|||
|
|
anc_param_fill(ANC_CFG_WRITE, &__this->gain);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_SET_START:
|
|||
|
|
case CMD_ANC_SET_STOP:
|
|||
|
|
case CMD_ANC_MUTE_TRAIN:
|
|||
|
|
case CMD_ANC_MUTE_TRAIN_ONLY:
|
|||
|
|
case CMD_ANC_SIN_TRAIN:
|
|||
|
|
case CMD_ANC_NOISE_TRAIN:
|
|||
|
|
case CMD_ANC_TEST_ANC_ON:
|
|||
|
|
case CMD_ANC_TEST_ANC_OFF:
|
|||
|
|
case CMD_ANC_TEST_PASS:
|
|||
|
|
case CMD_ANC_SYS_RESET:
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_TRANS_TRAIN:
|
|||
|
|
if (len > 2) {
|
|||
|
|
memcpy((u8 *)&value, &buf[2], 4);
|
|||
|
|
anc_api_set_trans_aim_pow(value);
|
|||
|
|
}
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
case CMD_ANC_SET_RUN_MODE:
|
|||
|
|
case CMD_ANC_TEST_BYPASS:
|
|||
|
|
case CMD_ANC_CHANGE_MODE:
|
|||
|
|
case CMD_ANC_CREATE_SPK_MIC:
|
|||
|
|
anc_event_to_user(cmd, (u32)buf[2]);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_STATUS:
|
|||
|
|
case CMD_ANC_TOOLS_SYNC:
|
|||
|
|
//在idle
|
|||
|
|
#if TCFG_CHARGESTORE_PORT == LDOIN_BIND_IO
|
|||
|
|
if (__this->idle_flag == 0) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
} else
|
|||
|
|
#endif
|
|||
|
|
{
|
|||
|
|
sendbuf[2] = ANC_VERSION;//版本
|
|||
|
|
sendbuf[3] = ANC_TRAIN_MODE;//结构
|
|||
|
|
#if ANC_MULT_ORDER_ENABLE
|
|||
|
|
sendbuf[4] = ANC_CHIP_VERSION | 0XA0; //芯片版本
|
|||
|
|
#else
|
|||
|
|
sendbuf[4] = ANC_CHIP_VERSION;
|
|||
|
|
#endif
|
|||
|
|
chargestore_api_write(sendbuf, 5);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_MAC:
|
|||
|
|
bt_get_vm_mac_addr(&sendbuf[2]);
|
|||
|
|
chargestore_api_write(sendbuf, 8);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_SET_LINKKEY:
|
|||
|
|
bt_update_mac_addr(&buf[2]);
|
|||
|
|
set_temp_link_key(&buf[8]);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_SW_TO_BT:
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_COEFF://read start
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
if (!__this->pair_flag) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_COEFF_CONTINUE:
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
if (!__this->pair_flag) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
if (__this->coeff == NULL) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
} else {
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get(ANC_CFG_READ);
|
|||
|
|
#else
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
read_len = anc_coeff_total_size - __this->coeff_ptr;
|
|||
|
|
if (read_len > 30) {
|
|||
|
|
read_len = 30;
|
|||
|
|
}
|
|||
|
|
memcpy(&sendbuf[2], __this->coeff + __this->coeff_ptr, read_len);
|
|||
|
|
chargestore_api_write(sendbuf, read_len + 2);
|
|||
|
|
__this->coeff_ptr += read_len;
|
|||
|
|
if (anc_coeff_total_size == __this->coeff_ptr) {
|
|||
|
|
__this->coeff = NULL;
|
|||
|
|
__this->coeff_ptr = 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//读操作不需要推消息处理
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_WRITE_COEFF://write start
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
memcpy((u8 *)&read_len, buf + 2, 4);
|
|||
|
|
__this->coeff_len = read_len;
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
anc_coeff_size_set(ANC_CFG_WRITE, read_len);
|
|||
|
|
anc_coeff_total_size = read_len;
|
|||
|
|
#else
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
if (read_len != anc_coeff_total_size) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
log_info("anc coeff size err, %d != %d\n", read_len, anc_coeff_total_size);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_COEFF_CONTINUE:
|
|||
|
|
memcpy(__this->coeff + __this->coeff_ptr, buf + 2, len - 2);
|
|||
|
|
__this->coeff_ptr += (len - 2);
|
|||
|
|
if (__this->coeff_ptr < __this->coeff_len) {
|
|||
|
|
//未写完成时不推消息
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_FILE_START:
|
|||
|
|
memcpy((u8 *)&__this->file_id, buf + 2, 4);
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_READ_FILE_DATA:
|
|||
|
|
memcpy((u8 *)&__this->data_offset, buf + 2, 4);
|
|||
|
|
memcpy((u8 *)&__this->data_len, buf + 6, 4);
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_START:
|
|||
|
|
memcpy((u8 *)&__this->file_id, buf + 2, 4);
|
|||
|
|
memcpy((u8 *)&__this->file_len, buf + 6, 4);
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_DATA:
|
|||
|
|
memcpy((u8 *)&__this->data_offset, buf + 2, 4);
|
|||
|
|
memcpy(__this->data_ptr, buf + 6, len - 6);
|
|||
|
|
__this->data_len = len - 6;
|
|||
|
|
printf("write file data, offset:%d, datalen: %d\n", __this->data_offset, __this->data_len);
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_WRITE_FILE_END:
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_RESULT:
|
|||
|
|
sendbuf[2] = __this->err_flag;
|
|||
|
|
sendbuf[3] = anc_api_get_train_step();
|
|||
|
|
chargestore_api_write(sendbuf, 4);
|
|||
|
|
return 1;//不需要app处理
|
|||
|
|
case CMD_ANC_SET_GAIN:
|
|||
|
|
if ((len - 2) != sizeof(anc_gain_t)) {
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
} else {
|
|||
|
|
memcpy((u8 *)&__this->gain, &buf[2], sizeof(anc_gain_t));
|
|||
|
|
chargestore_api_set_timeout(1000);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_GAIN:
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_CHANGE_BAUD:
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
memcpy((u8 *)&baudrate, &buf[2], 4);
|
|||
|
|
anc_event_to_user(cmd, baudrate);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_DEVELOPER_MODE:
|
|||
|
|
anc_train_api_set(ANC_DEVELOPER_MODE, (u32)buf[2], __this->para);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_ADAP:
|
|||
|
|
if (buf[2] == 0) {
|
|||
|
|
anc_train_api_set(ANC_TEST_NADAP, 0, __this->para);
|
|||
|
|
} else {
|
|||
|
|
anc_train_api_set(ANC_TEST_ADAP, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_WZ_BREAK:
|
|||
|
|
anc_event_to_user(cmd, (u32)buf[2]);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_SET_TS:
|
|||
|
|
anc_train_api_set(ANC_TRAIN_STEP_SET, (u32)buf[2], __this->para);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_TRAIN_STEP:
|
|||
|
|
__this->train_step_succ = 0;
|
|||
|
|
anc_train_api_set(ANC_TRAIN_STEP_1, 0, __this->para);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_TRAIN_STEP:
|
|||
|
|
sendbuf[2] = 0;
|
|||
|
|
if (__this->train_step_succ) {
|
|||
|
|
sendbuf[2] = anc_api_get_train_step();
|
|||
|
|
} else {
|
|||
|
|
anc_train_api_set(ANC_TRAIN_STEP_CONNUTE, 0, __this->para);
|
|||
|
|
}
|
|||
|
|
chargestore_api_write(sendbuf, 3);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_MUTE_TRAIN_POW:
|
|||
|
|
sendbuf[2] = __this->sz_nadap_pow;
|
|||
|
|
sendbuf[3] = __this->sz_adap_pow;
|
|||
|
|
sendbuf[4] = __this->sz_mute_pow;
|
|||
|
|
sendbuf[5] = __this->fz_nadap_pow;
|
|||
|
|
sendbuf[6] = __this->fz_adap_pow;
|
|||
|
|
sendbuf[7] = __this->fz_mute_pow;
|
|||
|
|
chargestore_api_write(sendbuf, 8);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_NOISE_TRAIN_POW:
|
|||
|
|
sendbuf[2] = __this->wz_nadap_pow;
|
|||
|
|
sendbuf[3] = __this->wz_adap_pow;
|
|||
|
|
chargestore_api_write(sendbuf, 4);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_TRAIN_POW:
|
|||
|
|
for (i = (ANC_POW_SIZE / 3), j = 2; i < (ANC_POW_SIZE * 2 / 3); i++, j++) {
|
|||
|
|
sendbuf[j] = anc_pow[i];
|
|||
|
|
}
|
|||
|
|
chargestore_api_write(sendbuf, j);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_SET_ID:
|
|||
|
|
memcpy((u8 *)&__this->type_id, &buf[2], 4);
|
|||
|
|
memcpy((u8 *)&__this->type_value, &buf[6], 4);
|
|||
|
|
chargestore_api_set_timeout(250);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_ID:
|
|||
|
|
memcpy((u8 *)&__this->type_id, &buf[2], 4);
|
|||
|
|
chargestore_api_set_timeout(250);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_GET_COEFF_SIZE:
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get(ANC_CFG_READ);
|
|||
|
|
#else
|
|||
|
|
anc_coeff_total_size = anc_coeff_size_get();
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
read_len = anc_coeff_total_size;
|
|||
|
|
memcpy(&sendbuf[2], (u8 *)&read_len, 4);
|
|||
|
|
chargestore_api_write(sendbuf, 6);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_VERSION:
|
|||
|
|
#if ANC_MULT_ORDER_ENABLE
|
|||
|
|
sendbuf[2] = ANC_CHIP_VERSION | 0XA0;
|
|||
|
|
#else
|
|||
|
|
sendbuf[2] = ANC_CHIP_VERSION;
|
|||
|
|
#endif
|
|||
|
|
chargestore_api_write(sendbuf, 3);
|
|||
|
|
return 1;
|
|||
|
|
#if (ANC_CHIP_VERSION == ANC_VERSION_BR36) || (ANC_CHIP_VERSION == ANC_VERSION_BR28)
|
|||
|
|
case CMD_ANC_GET_ANC_CH:
|
|||
|
|
sendbuf[2] = ANC_CH;
|
|||
|
|
chargestore_api_write(sendbuf, 3);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_GET_MAX_ORDER:
|
|||
|
|
#if ANC_CHIP_VERSION == ANC_VERSION_BR28
|
|||
|
|
sendbuf[2] = 20;
|
|||
|
|
#else
|
|||
|
|
sendbuf[2] = ANC_MAX_ORDER;
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR28*/
|
|||
|
|
chargestore_api_write(sendbuf, 3);
|
|||
|
|
return 1;
|
|||
|
|
#endif/*ANC_CHIP_VERSION == ANC_VERSION_BR36*/
|
|||
|
|
#if ANCTOOL_NEED_PAIR_KEY
|
|||
|
|
case CMD_ANC_PAIR_KEY:
|
|||
|
|
buf[len] = '\0';
|
|||
|
|
log_info("CMD_ANC_PAIR_KEY: %s\n", (buf + 2));
|
|||
|
|
anc_ack_pair_key(buf + 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_PAIR_SUCC:
|
|||
|
|
__this->pair_flag = 1;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
case CMD_ANC_EQ_DATA:
|
|||
|
|
eq_len = len - 2;
|
|||
|
|
memcpy(eq_buffer, buf + 2, eq_len);
|
|||
|
|
chargestore_api_set_timeout(100);
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_NEW_EQ_DATA:
|
|||
|
|
eq_len = len - 2;
|
|||
|
|
memcpy(eq_buffer, buf + 2, eq_len);
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
break;
|
|||
|
|
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
|||
|
|
case CMD_ANC_CVP_DUT_DATA:
|
|||
|
|
cvp_dut_len = len - 2;
|
|||
|
|
cvp_dut_buffer = malloc(cvp_dut_len);
|
|||
|
|
memcpy(cvp_dut_buffer, buf + 2, cvp_dut_len);
|
|||
|
|
chargestore_api_set_timeout(50);
|
|||
|
|
break;
|
|||
|
|
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
|||
|
|
|
|||
|
|
#if TCFG_ANC_SELF_DUT_GET_SZ
|
|||
|
|
case CMD_ANC_SZ_FFT_START:
|
|||
|
|
__this->fft_file_busy = 1;
|
|||
|
|
void audio_anc_post_msg_sz_fft_open(u8 sel);
|
|||
|
|
audio_anc_post_msg_sz_fft_open(buf[2]);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
case CMD_ANC_SZ_FFT_STOP:
|
|||
|
|
chargestore_api_set_timeout(50); //透传命令固定50*2 ms验证
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
/* chargestore_api_write(sendbuf, 2); */
|
|||
|
|
/* return 1; */
|
|||
|
|
#endif/*TCFG_ANC_SELF_DUT_GET_SZ*/
|
|||
|
|
|
|||
|
|
case CMD_ANC_SET_MUSIC_VOL:
|
|||
|
|
anc_event_to_user(cmd, (u32)buf[2]);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
|
|||
|
|
#if AUDIO_ENC_MPT_SELF_ENABLE
|
|||
|
|
case CMD_ANC_MIC_FFT_START:
|
|||
|
|
__this->audio_enc_mpt_fre_ch = buf[2];
|
|||
|
|
chargestore_api_set_timeout(50); //透传命令固定50*2 ms验证
|
|||
|
|
break;
|
|||
|
|
case CMD_ANC_MIC_FFT_STOP:
|
|||
|
|
chargestore_api_set_timeout(50); //透传命令固定50*2 ms验证
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
break;
|
|||
|
|
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
|||
|
|
|
|||
|
|
#if ANC_MULT_ORDER_ENABLE
|
|||
|
|
case CMD_MUTL_SCENE_SET:
|
|||
|
|
audio_anc_mult_scene_set(buf[2], 1);
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
#endif/*ANC_MULT_ORDER_ENABLE*/
|
|||
|
|
case CMD_FFT_FILE_BUSY_GET:
|
|||
|
|
sendbuf[2] = __this->fft_file_busy;
|
|||
|
|
chargestore_api_write(sendbuf, 3);
|
|||
|
|
return 1;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
sendbuf[1] = CMD_ANC_FAIL;
|
|||
|
|
chargestore_api_write(sendbuf, 2);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
anc_event_to_user(cmd, 0);
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u8 ancbox_get_status(void)
|
|||
|
|
{
|
|||
|
|
return __this->ancbox_status;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void ancbox_clear_status(void)
|
|||
|
|
{
|
|||
|
|
__this->ancbox_status = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CHARGESTORE_HANDLE_REG(ancbox, app_ancbox_module_deal);
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|