653 lines
23 KiB
C
653 lines
23 KiB
C
/*
|
||
****************************************************************************
|
||
* Audio CVP DUT
|
||
*
|
||
*
|
||
****************************************************************************
|
||
*/
|
||
#include "audio_cvp_dut.h"
|
||
#include "online_db_deal.h"
|
||
#include "system/includes.h"
|
||
#include "app_config.h"
|
||
#include "audio_adc.h"
|
||
#include "anc.h"
|
||
#include "aec_user.h"
|
||
#include "app_main.h"
|
||
#include "user_cfg_id.h"
|
||
#include "audio_config.h"
|
||
#include "math.h"
|
||
|
||
#if 0
|
||
#define cvp_dut_log printf
|
||
#define cvp_dut_put_float put_float
|
||
#else
|
||
#define cvp_dut_log(...)
|
||
#define cvp_dut_put_float(...)
|
||
#endif
|
||
|
||
#define CVP_DUT_BIG_ENDDIAN 1 //大端数据输出
|
||
#define CVP_DUT_LITTLE_ENDDIAN 2 //小端数据输出
|
||
#define CVP_DUT_OUTPUT_WAY CVP_DUT_LITTLE_ENDDIAN
|
||
|
||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||
static cvp_dut_t *cvp_dut_hdl = NULL;
|
||
static int cvp_dut_app_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size);
|
||
int cvp_dut_new_rx_packet(u8 *dat, u8 len);
|
||
int cvp_dut_spp_rx_packet(u8 *dat, u8 len);
|
||
|
||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||
extern void audio_aec_output_sel(u8 sel, u8 agc);
|
||
#endif/*TCFG_AUDIO_TRIPLE_MIC_ENABLE*/
|
||
|
||
extern void put_float(double fv);
|
||
extern void sys_enter_soft_poweroff(void *priv);
|
||
extern int audio_aec_toggle_set(u8 toggle);
|
||
|
||
/*未经过算法处理,主要用于分析ANC MIC的频响*/
|
||
int cvp_dut_bypass_mic_ch_sel(u8 mic_num)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
switch (mic_num) {
|
||
case A_MIC0:
|
||
cvp_dut_hdl->mic_ch_sel = AUDIO_ADC_MIC_0;
|
||
break;
|
||
case A_MIC1:
|
||
cvp_dut_hdl->mic_ch_sel = AUDIO_ADC_MIC_1;
|
||
break;
|
||
case A_MIC2:
|
||
cvp_dut_hdl->mic_ch_sel = AUDIO_ADC_MIC_2;
|
||
break;
|
||
case A_MIC3:
|
||
cvp_dut_hdl->mic_ch_sel = AUDIO_ADC_MIC_3;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
u8 cvp_dut_mic_ch_get(void)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
return cvp_dut_hdl->mic_ch_sel;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
u8 cvp_dut_mode_get(void)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
return cvp_dut_hdl->mode;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
void cvp_dut_mode_set(u8 mode)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
cvp_dut_hdl->mode = mode;
|
||
}
|
||
}
|
||
|
||
int cvp_dut_event_deal(u8 *dat)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
switch (dat[3]) {
|
||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||
//双麦ENC DUT 事件处理
|
||
case CVP_DUT_DMS_MASTER_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_MASTER, 0);
|
||
break;
|
||
case CVP_DUT_DMS_SLAVE_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_SLAVE_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_SLAVE, 0);
|
||
break;
|
||
case CVP_DUT_DMS_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_DEFAULT, 1);
|
||
break;
|
||
#elif TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||
case CVP_DUT_3MIC_MASTER_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(1, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_SLAVE_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_SLAVE_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(2, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_FB_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(3, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(0, 0);
|
||
break;
|
||
#else
|
||
//单麦SMS/DNS DUT 事件处理
|
||
case CVP_DUT_DMS_MASTER_MIC:
|
||
cvp_dut_log("CMD:SMS/CVP_DUT_DMS_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(0);
|
||
break;
|
||
case CVP_DUT_DMS_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:SMS/CVP_DUT_DMS_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(1);
|
||
break;
|
||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||
|
||
#if TCFG_AUDIO_ANC_ENABLE
|
||
case CVP_DUT_FF_MIC: //TWS_FF_MIC测试 或者 头戴式FF_L_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_FF_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH & ANC_L_CH) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCL_FF_MIC);
|
||
} else {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FF_MIC);
|
||
}
|
||
break;
|
||
case CVP_DUT_FB_MIC: //TWS_FB_MIC测试 或者 头戴式FB_L_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH & ANC_L_CH) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCL_FB_MIC);
|
||
} else {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FB_MIC);
|
||
}
|
||
break;
|
||
case CVP_DUT_HEAD_PHONE_R_FF_MIC: //头戴式FF_R_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_HEAD_PHONE_R_FF_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH == (ANC_L_CH | ANC_R_CH)) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FF_MIC);
|
||
}
|
||
break;
|
||
case CVP_DUT_HEAD_PHONE_R_FB_MIC: //头戴式FB_R_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_HEAD_PHONE_R_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH == (ANC_L_CH | ANC_R_CH)) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FB_MIC);
|
||
}
|
||
break;
|
||
case CVP_DUT_MODE_ALGORITHM_SET: //CVP恢复正常模式
|
||
cvp_dut_log("CMD:CVP_DUT_RESUME\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
break;
|
||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||
|
||
//JL自研算法指令API
|
||
#if !TCFG_CVP_DEVELOP_ENABLE
|
||
case CVP_DUT_NS_OPEN:
|
||
cvp_dut_log("CMD:CVP_DUT_NS_OPEN\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_cvp_ioctl(CVP_NS_SWITCH, 1, NULL); //降噪关
|
||
break;
|
||
case CVP_DUT_NS_CLOSE:
|
||
cvp_dut_log("CMD:CVP_DUT_NS_CLOSE\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_cvp_ioctl(CVP_NS_SWITCH, 0, NULL); //降噪开
|
||
break;
|
||
#endif/*TCFG_CVP_DEVELOP_ENABLE*/
|
||
|
||
case CVP_DUT_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(1);
|
||
break;
|
||
case CVP_DUT_CLOSE_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_CLOSE_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(0);
|
||
break;
|
||
case CVP_DUT_POWEROFF:
|
||
cvp_dut_log("CMD:CVP_DUT_POWEROFF\n");
|
||
sys_enter_soft_poweroff(NULL);
|
||
break;
|
||
default:
|
||
cvp_dut_log("CMD:UNKNOW CMD!!!\n");
|
||
return CVP_DUT_ACK_ERR_UNKNOW;
|
||
}
|
||
return CVP_DUT_ACK_SUCCESS;
|
||
}
|
||
return CVP_DUT_ACK_ERR_UNKNOW;
|
||
}
|
||
|
||
void cvp_dut_init(void)
|
||
{
|
||
cvp_dut_log("tx dat");
|
||
if (cvp_dut_hdl == NULL) {
|
||
cvp_dut_hdl = zalloc(sizeof(cvp_dut_t));
|
||
}
|
||
//开机默认设置成算法模式
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
app_online_db_register_handle(DB_PKT_TYPE_DMS, cvp_dut_app_online_parse);
|
||
}
|
||
|
||
void cvp_dut_unit(void)
|
||
{
|
||
free(cvp_dut_hdl);
|
||
cvp_dut_hdl = NULL;
|
||
}
|
||
|
||
int cvp_dut_spp_tx_packet(u8 command)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
cvp_dut_hdl->tx_buf.magic = CVP_DUT_SPP_MAGIC;
|
||
cvp_dut_hdl->tx_buf.dat[0] = 0;
|
||
cvp_dut_hdl->tx_buf.dat[1] = 0;
|
||
cvp_dut_hdl->tx_buf.dat[2] = 0;
|
||
cvp_dut_hdl->tx_buf.dat[3] = command;
|
||
cvp_dut_log("tx dat");
|
||
#if CVP_DUT_OUTPUT_WAY == CVP_DUT_LITTLE_ENDDIAN // 小端格式
|
||
cvp_dut_hdl->tx_buf.crc = CRC16((&cvp_dut_hdl->tx_buf.dat), CVP_DUT_PACK_NUM - 4);
|
||
put_buf((u8 *)&cvp_dut_hdl->tx_buf.magic, CVP_DUT_PACK_NUM);
|
||
app_online_db_send(DB_PKT_TYPE_DMS, (u8 *)&cvp_dut_hdl->tx_buf.magic, CVP_DUT_PACK_NUM);
|
||
#else
|
||
u16 crc_temp;
|
||
int i;
|
||
u8 dat[CVP_DUT_PACK_NUM];
|
||
u8 dat_temp;
|
||
memcpy(dat, &(cvp_dut_hdl->tx_buf), CVP_DUT_PACK_NUM);
|
||
crc_temp = CRC16(dat + 4, 6);
|
||
printf("crc0x%x,0x%x", crc_temp, cvp_dut_hdl->tx_buf.crc);
|
||
for (i = 0; i < 6; i += 2) { //小端数据转大端
|
||
dat_temp = dat[i];
|
||
dat[i] = dat[i + 1];
|
||
dat[i + 1] = dat_temp;
|
||
}
|
||
crc_temp = CRC16(dat + 4, CVP_DUT_PACK_NUM - 4);
|
||
dat[2] = crc_temp >> 8;
|
||
dat[3] = crc_temp & 0xff;
|
||
put_buf(dat, CVP_DUT_PACK_NUM);
|
||
app_online_db_send(DB_PKT_TYPE_DMS, dat, CVP_DUT_PACK_NUM);
|
||
#endif
|
||
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
static int cvp_dut_app_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
cvp_dut_hdl->parse_seq = ext_data[1];
|
||
int ret = cvp_dut_spp_rx_packet(packet, size);
|
||
if (ret) {
|
||
cvp_dut_new_rx_packet(packet, size);
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
int cvp_dut_spp_rx_packet(u8 *dat, u8 len)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
u8 dat_temp;
|
||
u16 crc = 0;
|
||
int ret = 0;
|
||
u8 dat_packet[CVP_DUT_PACK_NUM];
|
||
if (len > CVP_DUT_PACK_NUM) {
|
||
return 1;
|
||
}
|
||
/* cvp_dut_log("rx dat,%d\n", CVP_DUT_PACK_NUM); */
|
||
put_buf(dat, len);
|
||
memcpy(dat_packet, dat, len);
|
||
crc = CRC16(dat + 4, len - 4);
|
||
#if CVP_DUT_OUTPUT_WAY == CVP_DUT_BIG_ENDDIAN // 大端格式
|
||
for (int i = 0; i < 6; i += 2) { // 大端数据转小端
|
||
dat_temp = dat_packet[i];
|
||
dat_packet[i] = dat_packet[i + 1];
|
||
dat_packet[i + 1] = dat_temp;
|
||
}
|
||
#endif
|
||
cvp_dut_log("rx dat_packet");
|
||
memcpy(&(cvp_dut_hdl->rx_buf), dat_packet, 4);
|
||
if (cvp_dut_hdl->rx_buf.magic == CVP_DUT_SPP_MAGIC) {
|
||
cvp_dut_log("crc %x,cvp_dut_hdl->rx_buf.crc %x\n", crc, cvp_dut_hdl->rx_buf.crc);
|
||
if (cvp_dut_hdl->rx_buf.crc == crc || cvp_dut_hdl->rx_buf.crc == 0x1) {
|
||
memcpy(&(cvp_dut_hdl->rx_buf), dat_packet, len);
|
||
ret = cvp_dut_event_deal(cvp_dut_hdl->rx_buf.dat);
|
||
cvp_dut_spp_tx_packet(ret); //反馈收到命令
|
||
return 0;
|
||
}
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
/***************************************************************************
|
||
CVP SPP产测 NEW STRUCT
|
||
***************************************************************************/
|
||
|
||
struct cvp_dut_packet_t {
|
||
u8 cmd; //命令
|
||
u16 len; //参数长度
|
||
u8 dat[0]; //参数
|
||
} __attribute__((packed));
|
||
|
||
struct cvp_dut_head_t {
|
||
u16 magic; //标识符
|
||
u16 crc; //CRC, 从packet开始计算
|
||
struct cvp_dut_packet_t packet;
|
||
} __attribute__((packed));
|
||
|
||
/*
|
||
CVP 命令处理函数
|
||
param: struct cvp_dut_head_t 类型的数据
|
||
return 执行结果
|
||
*/
|
||
int cvp_dut_new_event_deal(void *packet)
|
||
{
|
||
struct cvp_dut_packet_t *hdl = (struct cvp_dut_packet_t *)packet;
|
||
u16 len = hdl->len;
|
||
int wlen = 0;
|
||
int ret = -1;
|
||
u8 last_mode, reset_flag;
|
||
cvp_dut_log("CVP_DUT CMD:0X%x,LEN:%d\n", hdl->cmd, len);
|
||
put_buf((u8 *)packet, hdl->len + sizeof(struct cvp_dut_packet_t));
|
||
if (cvp_dut_hdl) {
|
||
reset_flag = 0;
|
||
last_mode = cvp_dut_hdl->mode;
|
||
switch (hdl->cmd) {
|
||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||
//双麦ENC DUT 事件处理
|
||
case CVP_DUT_DMS_MASTER_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_MASTER, 0);
|
||
break;
|
||
case CVP_DUT_DMS_SLAVE_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_SLAVE_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_SLAVE, 0);
|
||
break;
|
||
case CVP_DUT_DMS_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_DMS_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(DMS_OUTPUT_SEL_DEFAULT, 1);
|
||
break;
|
||
#elif TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||
case CVP_DUT_3MIC_MASTER_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(1, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_SLAVE_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_SLAVE_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(2, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_FB_MIC:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(3, 0);
|
||
break;
|
||
case CVP_DUT_3MIC_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_3MIC_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_output_sel(0, 0);
|
||
break;
|
||
#else
|
||
//单麦SMS/DNS DUT 事件处理
|
||
case CVP_DUT_DMS_MASTER_MIC:
|
||
cvp_dut_log("CMD:SMS/CVP_DUT_DMS_MASTER_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(0);
|
||
break;
|
||
case CVP_DUT_DMS_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:SMS/CVP_DUT_DMS_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(1);
|
||
break;
|
||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||
|
||
#if TCFG_AUDIO_ANC_ENABLE
|
||
case CVP_DUT_FF_MIC: //TWS_FF_MIC测试 或者 头戴式FF_L_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_FF_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH & ANC_L_CH) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCL_FF_MIC);
|
||
} else {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FF_MIC);
|
||
}
|
||
reset_flag = 1;
|
||
break;
|
||
case CVP_DUT_FB_MIC: //TWS_FB_MIC测试 或者 头戴式FB_L_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH & ANC_L_CH) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCL_FB_MIC);
|
||
} else {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FB_MIC);
|
||
}
|
||
reset_flag = 1;
|
||
break;
|
||
case CVP_DUT_HEAD_PHONE_R_FF_MIC: //头戴式FF_R_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_HEAD_PHONE_R_FF_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH == (ANC_L_CH | ANC_R_CH)) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FF_MIC);
|
||
}
|
||
reset_flag = 1;
|
||
break;
|
||
case CVP_DUT_HEAD_PHONE_R_FB_MIC: //头戴式FB_R_MIC测试
|
||
cvp_dut_log("CMD:CVP_DUT_HEAD_PHONE_R_FB_MIC\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_BYPASS;
|
||
if (ANC_CH == (ANC_L_CH | ANC_R_CH)) {
|
||
cvp_dut_bypass_mic_ch_sel(ANCR_FB_MIC);
|
||
}
|
||
reset_flag = 1;
|
||
break;
|
||
case CVP_DUT_MODE_ALGORITHM_SET: //CVP恢复正常模式
|
||
cvp_dut_log("CMD:CVP_DUT_RESUME\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
break;
|
||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||
|
||
//JL自研算法指令API
|
||
#if !TCFG_CVP_DEVELOP_ENABLE
|
||
case CVP_DUT_NS_OPEN:
|
||
cvp_dut_log("CMD:CVP_DUT_NS_OPEN\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_cvp_ioctl(CVP_NS_SWITCH, 1, NULL); //降噪关
|
||
break;
|
||
case CVP_DUT_NS_CLOSE:
|
||
cvp_dut_log("CMD:CVP_DUT_NS_CLOSE\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_cvp_ioctl(CVP_NS_SWITCH, 0, NULL); //降噪开
|
||
break;
|
||
#endif/*TCFG_CVP_DEVELOP_ENABLE*/
|
||
|
||
case CVP_DUT_OPEN_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_OPEN_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(1);
|
||
break;
|
||
case CVP_DUT_CLOSE_ALGORITHM:
|
||
cvp_dut_log("CMD:CVP_DUT_CLOSE_ALGORITHM\n");
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_aec_toggle_set(0);
|
||
break;
|
||
case CVP_DUT_POWEROFF:
|
||
cvp_dut_log("CMD:CVP_DUT_POWEROFF\n");
|
||
sys_enter_soft_poweroff(NULL);
|
||
break;
|
||
|
||
/*enc麦克风校准补偿*/
|
||
#if TCFG_AUDIO_MIC_ARRAY_TRIM_ENABLE
|
||
case CVP_ENC_MIC_DIFF_CMP_SET: //主MIC - 副MIC
|
||
cvp_dut_log("CMD:CVP_ENC_MIC_DIFF_CMP_SET\n");
|
||
float diff;
|
||
memcpy((u8 *)&diff, hdl->dat, len);
|
||
cvp_dut_log("diff:");
|
||
cvp_dut_put_float(diff);
|
||
float dms_mic_diff = log10(app_var.enc_degradation) * 20;
|
||
app_var.audio_mic_array_diff_cmp = pow(10, (diff + dms_mic_diff) / 20);
|
||
wlen = syscfg_write(CFG_MIC_ARRAY_DIFF_CMP_VALUE, (u8 *)(&app_var.audio_mic_array_diff_cmp), sizeof(app_var.audio_mic_array_diff_cmp));
|
||
if (wlen != sizeof(app_var.audio_mic_array_diff_cmp)) {
|
||
printf("mic array diff cap vm write fail !!!");
|
||
ret = CVP_DUT_ACK_VM_WRITE_ERR;
|
||
}
|
||
cvp_dut_log("mic_array_diff_cmp:");
|
||
cvp_dut_put_float(app_var.audio_mic_array_diff_cmp);
|
||
break;
|
||
case CVP_ENC_MIC_DIFF_CMP_EN:
|
||
cvp_dut_log("CMD:CVP_ENC_MIC_DIFF_CMP_EN\n");
|
||
u8 en;
|
||
memcpy(&en, hdl->dat, len);
|
||
app_var.audio_mic_array_trim_en = en;
|
||
wlen = syscfg_write(CFG_MIC_ARRAY_TRIM_EN, (u8 *)(&app_var.audio_mic_array_trim_en), sizeof(app_var.audio_mic_array_trim_en));
|
||
if (wlen != sizeof(app_var.audio_mic_array_trim_en)) {
|
||
cvp_dut_log("mic array trim en vm write fail !!!");
|
||
ret = CVP_DUT_ACK_VM_WRITE_ERR;
|
||
}
|
||
cvp_dut_log("mic array trim en: %d\n", app_var.audio_mic_array_trim_en);
|
||
break;
|
||
case CVP_ENC_MIC_DIFF_CMP_CLEAN:
|
||
cvp_dut_log("CMD:CVP_ENC_MIC_DIFF_CMP_CLEAN\n");
|
||
app_var.audio_mic_array_diff_cmp = 1.0f;
|
||
app_var.audio_mic_cmp.talk = 1.0f;
|
||
app_var.audio_mic_cmp.ff = 1.0f;
|
||
app_var.audio_mic_cmp.fb = 1.0f;
|
||
|
||
wlen = syscfg_write(CFG_MIC_ARRAY_DIFF_CMP_VALUE, (u8 *)(&app_var.audio_mic_array_diff_cmp), sizeof(app_var.audio_mic_array_diff_cmp));
|
||
if (wlen != sizeof(app_var.audio_mic_array_diff_cmp)) {
|
||
cvp_dut_log("mic array diff cap vm write fail !!!");
|
||
ret = CVP_DUT_ACK_VM_WRITE_ERR;
|
||
}
|
||
wlen = syscfg_write(CFG_MIC_TARGET_DIFF_CMP, (u8 *)(&app_var.audio_mic_cmp), sizeof(audio_mic_cmp_t));
|
||
if (wlen != sizeof(audio_mic_cmp_t)) {
|
||
printf("mic array diff cap vm write fail !!!");
|
||
ret = CVP_DUT_ACK_VM_WRITE_ERR;
|
||
}
|
||
cvp_dut_log("CMD:CVP_ENC_MIC_DIFF_CMP_CLEAN\n");
|
||
break;
|
||
case CVP_ENC_TARGET_MIC_DIFF_SET:
|
||
cvp_dut_log("CMD:CVP_ENC_TARGET_MIC_DIFF_SET\n");
|
||
float talk_diff, ff_diff, fb_diff;
|
||
memcpy((u8 *)&talk_diff, hdl->dat, 4);
|
||
memcpy((u8 *)&ff_diff, hdl->dat + 4, 4);
|
||
memcpy((u8 *)&fb_diff, hdl->dat + 8, 4);
|
||
cvp_dut_log("talk_diff:");
|
||
cvp_dut_put_float(talk_diff);
|
||
cvp_dut_log("ff_diff:");
|
||
cvp_dut_put_float(ff_diff);
|
||
cvp_dut_log("fb_diff:");
|
||
cvp_dut_put_float(fb_diff);
|
||
app_var.audio_mic_cmp.talk = pow(10, (talk_diff) / 20);
|
||
app_var.audio_mic_cmp.ff = pow(10, (ff_diff) / 20);
|
||
app_var.audio_mic_cmp.fb = pow(10, (fb_diff) / 20);
|
||
wlen = syscfg_write(CFG_MIC_TARGET_DIFF_CMP, (u8 *)(&app_var.audio_mic_cmp), sizeof(audio_mic_cmp_t));
|
||
if (wlen != sizeof(audio_mic_cmp_t)) {
|
||
printf("mic array diff cap vm write fail !!!");
|
||
ret = CVP_DUT_ACK_VM_WRITE_ERR;
|
||
}
|
||
break;
|
||
#endif /*TCFG_AUDIO_MIC_ARRAY_TRIM_ENABLE*/
|
||
|
||
/*通话算法模块开关*/
|
||
case CVP_DUT_CVP_IOCTL:
|
||
cvp_dut_log("CMD:CVP_DUT_CVP_IOCTL\n");
|
||
u8 ioctl_cmd = hdl->dat[0];
|
||
u8 toggle = hdl->dat[1];
|
||
cvp_dut_log(" io ctl cmd %d, toggle %d", ioctl_cmd, toggle);
|
||
cvp_dut_hdl->mode = CVP_DUT_MODE_ALGORITHM;
|
||
audio_cvp_ioctl(ioctl_cmd, toggle, NULL);
|
||
break;
|
||
case CVP_DUT_DEC_DUT_SET:
|
||
cvp_dut_log("CVP_DUT_DEC_DUT_SET: %d\n", hdl->dat[0]);
|
||
cvp_dut_hdl->dec_dut_enable = hdl->dat[0];
|
||
a2dp_dec_dut_enable(cvp_dut_hdl->dec_dut_enable);
|
||
break;
|
||
default:
|
||
cvp_dut_log("CMD:UNKNOW CMD!!!\n");
|
||
ret = CVP_DUT_ACK_ERR_UNKNOW;
|
||
}
|
||
if (last_mode != cvp_dut_hdl->mode) {
|
||
reset_flag = 1; //模式被修改,则复位通话
|
||
}
|
||
if (reset_flag) {
|
||
if (bt_phone_dec_is_running()) {
|
||
esco_enc_reset();
|
||
}
|
||
}
|
||
ret = (ret == -1) ? CVP_DUT_ACK_SUCCESS : ret;
|
||
}
|
||
return ret;
|
||
}
|
||
|
||
//len = 参数数据长度(不包括cmd)
|
||
int cvp_dut_new_tx_packet(u8 cmd, u8 *data, int len)
|
||
{
|
||
if (cvp_dut_hdl) {
|
||
int packet_len = sizeof(struct cvp_dut_head_t) + len;
|
||
struct cvp_dut_head_t *head = (struct cvp_dut_head_t *)malloc(packet_len);
|
||
head->magic = CVP_DUT_NEW_SPP_MAGIC;
|
||
head->packet.cmd = cmd;
|
||
head->packet.len = len;
|
||
head->crc = CRC16(&head->packet, packet_len - 4);
|
||
if (len) {
|
||
memcpy(head->packet.dat, data, len);
|
||
}
|
||
cvp_dut_log("tx new_dat_packet %d\n", packet_len);
|
||
//put_buf((u8 *)head, packet_len);
|
||
app_online_db_send(DB_PKT_TYPE_DMS, (u8 *)head, packet_len);
|
||
free(head);
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int cvp_dut_new_rx_packet(u8 *dat, u8 len)
|
||
{
|
||
u16 crc = 0;
|
||
int ret = 0;
|
||
struct cvp_dut_head_t *head = (struct cvp_dut_head_t *)dat;
|
||
if (cvp_dut_hdl) {
|
||
cvp_dut_log("rx new_dat_packet");
|
||
//put_buf(dat, len);
|
||
crc = CRC16(&head->packet, len - 4);
|
||
if (head->magic == CVP_DUT_NEW_SPP_MAGIC) {
|
||
if (head->crc == crc || head->crc == 0x1) {
|
||
ret = cvp_dut_new_event_deal(&head->packet);
|
||
cvp_dut_new_tx_packet(ret, NULL, 0); //反馈收到命令
|
||
if (ret == CVP_DUT_ACK_SUCCESS) {
|
||
return 0;
|
||
}
|
||
} else {
|
||
cvp_dut_log("ERR head->crc %x != %x\n", head->crc, crc);
|
||
cvp_dut_new_tx_packet(CVP_DUT_ACK_CRC_ERR, NULL, 0); //反馈收到命令
|
||
}
|
||
}
|
||
}
|
||
return 1;
|
||
}
|
||
|
||
/*
|
||
DEC产测状态获取
|
||
param: music_decide 1 需判断播歌状态; 0 不需判断
|
||
*/
|
||
u8 audio_dec_dut_en_get(u8 music_decide)
|
||
{
|
||
if (!cvp_dut_hdl) {
|
||
return 0;
|
||
}
|
||
if (music_decide && !bt_media_is_running()) {
|
||
//当前非播歌状态
|
||
return 0;
|
||
}
|
||
return cvp_dut_hdl->dec_dut_enable;
|
||
}
|
||
|
||
#endif /*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||
|