first
This commit is contained in:
456
cpu/br28/aec_tool.c
Normal file
456
cpu/br28/aec_tool.c
Normal file
@ -0,0 +1,456 @@
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "app_config.h"
|
||||
#include "app_online_cfg.h"
|
||||
#include "online_db_deal.h"
|
||||
#include "math.h"
|
||||
#include "config/config_target.h"
|
||||
#include "config/config_interface.h"
|
||||
#include "aec_user.h"
|
||||
|
||||
extern int aec_cfg_online_init();
|
||||
extern int aec_cfg_online_update(int root_cmd, void *cfg);
|
||||
extern int get_aec_config(u8 *buf, int version);
|
||||
|
||||
#if TCFG_AEC_TOOL_ONLINE_ENABLE
|
||||
|
||||
/* #define LOG_TAG_CONST AEC_TOOL */
|
||||
#define LOG_TAG "[AEC-TOOL]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
#define LOG_DUMP_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
const u8 audio_sdk_name[16] = "AC701N";
|
||||
/* const u8 audio_aec_ver[4] = {1, 7, 1, 1}; */
|
||||
const u8 audio_aec_ver[4] = {1, 7, 1, 2};
|
||||
|
||||
#define audio_eq_password "000"
|
||||
#define password_en 0
|
||||
|
||||
enum {
|
||||
AEC_ONLINE_CMD_GETVER = 0x5,
|
||||
AEC_ONLINE_CMD_GET_SOFT_SECTION,//br22专用
|
||||
AEC_ONLINE_CMD_GET_SECTION_NUM = 0x7,//工具查询 小机需要的eq段数
|
||||
AEC_ONLINE_CMD_GLOBAL_GAIN_SUPPORT_FLOAT = 0x8,
|
||||
|
||||
|
||||
AEC_ONLINE_CMD_PASSWORD = 0x9,
|
||||
AEC_ONLINE_CMD_VERIFY_PASSWORD = 0xA,
|
||||
AEC_ONLINE_CMD_FILE_SIZE = 0xB,
|
||||
AEC_ONLINE_CMD_FILE = 0xC,
|
||||
AEC_ONLINE_CMD_GET_SECTION_NUM_NEW = 0xD,//该命令新加与 0x7功能一样
|
||||
AEC_ONLINE_CMD_CHANGE_MODE = 0xE,//切模式
|
||||
|
||||
AEC_ONLINE_CMD_MODE_COUNT = 0x100,//模式个数a 1
|
||||
AEC_ONLINE_CMD_MODE_NAME = 0x101,//模式的名字a eq
|
||||
AEC_ONLINE_CMD_MODE_GROUP_COUNT = 0x102,//模式下组的个数,4个字节 1
|
||||
AEC_ONLINE_CMD_MODE_GROUP_RANGE = 0x103,//模式下组的id内容 0x11
|
||||
AEC_ONLINE_CMD_EQ_GROUP_COUNT = 0x104,//eq组的id个数 1
|
||||
AEC_ONLINE_CMD_EQ_GROUP_RANGE = 0x105,//eq组的id内容 0x11
|
||||
AEC_ONLINE_CMD_MODE_SEQ_NUMBER = 0x106,//mode的编号 magic num
|
||||
|
||||
|
||||
AEC_ONLINE_CMD_MAX,//最后一个
|
||||
};
|
||||
|
||||
typedef struct _aec_tool_cfg {
|
||||
u8 mode_index; //模式序号
|
||||
u8 *mode_name; //模式名
|
||||
u32 mode_seq; //模式的seq,用于识别离线文件功能类型
|
||||
u8 fun_num; //模式下有多少种功能
|
||||
u16 fun_type[6]; //模式下拥有哪些功能
|
||||
} aec_tool_cfg;
|
||||
|
||||
typedef struct _aec_parm {
|
||||
u8 app: 1; //是否手机app在线调试
|
||||
u8 online_en: 1;
|
||||
aec_tool_cfg *aec_tool_tab;
|
||||
} aec_adjust_parm;
|
||||
|
||||
typedef struct {
|
||||
u32 aec_updata;
|
||||
spinlock_t lock;
|
||||
|
||||
u8 app: 1;
|
||||
u8 online_en: 1;
|
||||
u8 password_ok: 1;
|
||||
u8 parse_seq;
|
||||
aec_tool_cfg *aec_tool_tab;
|
||||
} AEC_CFG;
|
||||
|
||||
static AEC_CFG *p_aec_cfg = NULL;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 在线调试,应答接口
|
||||
@param *packet
|
||||
@param
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void ci_send_packet_new(AEC_CFG *aec_cfg, u32 id, u8 *packet, int size)
|
||||
{
|
||||
ASSERT(aec_cfg);
|
||||
if (aec_cfg->app) {
|
||||
if (AEC_CONFIG_ID == id) {
|
||||
app_online_db_ack(aec_cfg->parse_seq, packet, size);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#if TCFG_ONLINE_ENABLE
|
||||
ci_send_packet(id, packet, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
*aec 在线调试,系数解析函数
|
||||
* */
|
||||
static s32 aec_online_update(AEC_CFG *aec_cfg, void *_packet)
|
||||
{
|
||||
typedef struct {
|
||||
int cmd; ///<AEC_ONLINE_CMD
|
||||
int data[45]; ///<data
|
||||
} AEC_ONLINE_PACKET;
|
||||
|
||||
AEC_ONLINE_PACKET *packet = _packet;
|
||||
int ret = -1;
|
||||
|
||||
log_d("aec_cmd:0x%x ", packet->cmd);
|
||||
spin_lock(&aec_cfg->lock);
|
||||
ret = aec_cfg_online_update(packet->cmd, packet->data);
|
||||
spin_unlock(&aec_cfg->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* 打开工具时,相关的命令通讯
|
||||
* */
|
||||
static int aec_online_nor_cmd(AEC_CFG *aec_cfg, void *_packet)
|
||||
{
|
||||
typedef struct {
|
||||
int cmd; ///<AEC_ONLINE_CMD
|
||||
int data[45]; ///<data
|
||||
} AEC_ONLINE_PACKET;
|
||||
|
||||
AEC_ONLINE_PACKET *packet = _packet;
|
||||
|
||||
aec_tool_cfg *aec_tool_tab = aec_cfg->aec_tool_tab;
|
||||
u32 id = AEC_CONFIG_ID;
|
||||
if (packet->cmd == AEC_ONLINE_CMD_GETVER) {
|
||||
struct eq_ver_info {
|
||||
char sdkname[16];
|
||||
u8 eqver[4];
|
||||
};
|
||||
struct eq_ver_info eq_ver_info = {0};
|
||||
memcpy(eq_ver_info.sdkname, audio_sdk_name, sizeof(audio_sdk_name));
|
||||
memcpy(eq_ver_info.eqver, audio_aec_ver, sizeof(audio_aec_ver));
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&eq_ver_info, sizeof(struct eq_ver_info));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_GET_SECTION_NUM || (packet->cmd == AEC_ONLINE_CMD_GET_SECTION_NUM_NEW)) {
|
||||
struct _cmd {
|
||||
int id;
|
||||
int groupId;
|
||||
};
|
||||
struct _cmd cmd = {0};
|
||||
|
||||
memcpy(&cmd, packet->data, sizeof(struct _cmd));
|
||||
uint8_t hw_section = 0;
|
||||
log_d("hw_section %d cmd.id:%x\n", hw_section, cmd.id);
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&hw_section, sizeof(uint8_t));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_GLOBAL_GAIN_SUPPORT_FLOAT) {
|
||||
uint8_t support_float = 1;
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&support_float, sizeof(uint8_t));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_PASSWORD) {
|
||||
uint8_t password = 0;
|
||||
if (password_en) {
|
||||
password = 1;
|
||||
}
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&password, sizeof(uint8_t));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_VERIFY_PASSWORD) {
|
||||
//check password
|
||||
int len = 0;
|
||||
char pass[64];
|
||||
typedef struct password {
|
||||
int len;
|
||||
char pass[45];
|
||||
} PASSWORD;
|
||||
|
||||
PASSWORD ps = {0};
|
||||
spin_lock(&aec_cfg->lock);
|
||||
memcpy(&ps, packet->data, sizeof(PASSWORD));
|
||||
memcpy(&ps, packet->data, sizeof(int) + ps.len);
|
||||
spin_unlock(&aec_cfg->lock);
|
||||
|
||||
uint8_t password_ok = 0;
|
||||
if (!strcmp(ps.pass, audio_eq_password)) {
|
||||
password_ok = 1;
|
||||
} else {
|
||||
log_error("password verify failxx \n");
|
||||
}
|
||||
aec_cfg->password_ok = password_ok;
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&password_ok, sizeof(uint8_t));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_FILE_SIZE) {
|
||||
y_printf("get aec file_size");
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
u32 cfg_file_size = sizeof(AEC_DMS_CONFIG);
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
u32 cfg_file_size = sizeof(DMS_FLEXIBLE_CONFIG);
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#else/*SINGLE MIC*/
|
||||
u32 cfg_file_size = sizeof(AEC_CONFIG);
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&cfg_file_size, sizeof(u32));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_FILE) {
|
||||
y_printf("get aec file");
|
||||
put_buf(packet, 64);
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
AEC_DMS_CONFIG cfg_file;
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
DMS_FLEXIBLE_CONFIG cfg_file;
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#else/*SINGLE MIC*/
|
||||
AEC_CONFIG cfg_file;
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
int version = 0;
|
||||
memcpy(&version, packet->data, 4);
|
||||
printf("version %x", version);
|
||||
int cfg_file_len = get_aec_config(&cfg_file, version);
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&cfg_file, cfg_file_len);
|
||||
return 0;//-EINVAL;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_MODE_COUNT) {
|
||||
//模式个数
|
||||
int mode_cnt = 1;//aec_cfg->mode_num;
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&mode_cnt, sizeof(int));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_MODE_NAME) {
|
||||
//utf8编码得名字
|
||||
struct cmd {
|
||||
int id;
|
||||
int modeId;
|
||||
};
|
||||
struct cmd cmd;
|
||||
memcpy(&cmd, packet, sizeof(struct cmd));
|
||||
|
||||
u8 tmp[32] = {0};
|
||||
u8 name_len = strlen(aec_tool_tab[cmd.modeId].mode_name);
|
||||
memcpy(tmp, aec_tool_tab[cmd.modeId].mode_name, name_len);
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)tmp, name_len);
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_MODE_GROUP_COUNT) {
|
||||
struct cmd {
|
||||
int id;
|
||||
int modeId;
|
||||
};
|
||||
struct cmd cmd;
|
||||
memcpy(&cmd, packet, sizeof(struct cmd));
|
||||
int groups_num = aec_tool_tab[cmd.modeId].fun_num;
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&groups_num, sizeof(int));
|
||||
return 0;
|
||||
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_MODE_GROUP_RANGE) { //摸下是组的id
|
||||
struct cmd {
|
||||
int id;
|
||||
int modeId;
|
||||
int offset;
|
||||
int count;
|
||||
};
|
||||
struct cmd cmd;
|
||||
memcpy(&cmd, packet, sizeof(struct cmd));
|
||||
|
||||
u16 *group_tmp = aec_tool_tab[cmd.modeId].fun_type;//groups[cmd.modeId];
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&group_tmp[cmd.offset], cmd.count * sizeof(u16));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_EQ_GROUP_COUNT) {
|
||||
u32 eq_group_num = 0;
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&eq_group_num, sizeof(u32));
|
||||
return 0;
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_EQ_GROUP_RANGE) {
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_CHANGE_MODE) {
|
||||
} else if (packet->cmd == AEC_ONLINE_CMD_MODE_SEQ_NUMBER) {
|
||||
struct cmd {
|
||||
int id;
|
||||
int modeId;
|
||||
};
|
||||
struct cmd cmd;
|
||||
memcpy(&cmd, packet, sizeof(struct cmd));
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)&aec_tool_tab[cmd.modeId].mode_seq, sizeof(u32));
|
||||
|
||||
return 0;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
/*
|
||||
*注册到协议端的,数据回调接口
|
||||
* */
|
||||
static void aec_online_callback(uint8_t *packet, uint16_t size)
|
||||
{
|
||||
s32 res = 0;
|
||||
AEC_CFG *aec_cfg = p_aec_cfg;
|
||||
if (!aec_cfg) {
|
||||
return ;
|
||||
}
|
||||
//u8 *tmp_packet = malloc(size);
|
||||
//memcpy(tmp_packet, packet, size);
|
||||
u8 *tmp_packet = packet;
|
||||
ASSERT(((int)tmp_packet & 0x3) == 0, "buf %x size %d\n", tmp_packet, size);
|
||||
res = aec_online_update(aec_cfg, (void *)tmp_packet);
|
||||
|
||||
u32 id = AEC_CONFIG_ID;
|
||||
|
||||
if (res == 0) {
|
||||
log_d("Ack");
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)"OK", 2);
|
||||
} else {
|
||||
res = aec_online_nor_cmd(aec_cfg, (void *)tmp_packet);
|
||||
if (res == 0) {
|
||||
//free(tmp_packet);
|
||||
return ;
|
||||
}
|
||||
log_d("Nack");
|
||||
ci_send_packet_new(aec_cfg, id, (u8 *)"ER", 2);
|
||||
}
|
||||
//free(tmp_packet);
|
||||
}
|
||||
|
||||
|
||||
|
||||
REGISTER_CONFIG_TARGET(aec_config_target) = {
|
||||
.id = AEC_CONFIG_ID,
|
||||
.callback = aec_online_callback,
|
||||
};
|
||||
|
||||
//AEC在线调试不进power down
|
||||
static u8 aec_online_idle_query(void)
|
||||
{
|
||||
AEC_CFG *cfg = p_aec_cfg;
|
||||
if (!cfg) {
|
||||
return 1;
|
||||
}
|
||||
if (cfg->online_en) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
REGISTER_LP_TARGET(aec_online_lp_target) = {
|
||||
.name = "aec_online",
|
||||
.is_idle = aec_online_idle_query,
|
||||
};
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 手机app 在线调时,数据解析的回调
|
||||
@param *packet
|
||||
@param
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int aec_app_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size)
|
||||
{
|
||||
AEC_CFG *aec_cfg = p_aec_cfg;
|
||||
ASSERT(aec_cfg);
|
||||
if (aec_cfg->online_en) {
|
||||
aec_cfg->parse_seq = ext_data[1];
|
||||
aec_online_callback(packet, size);
|
||||
} else {
|
||||
printf("AEC_ONLINE,not enable!\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *aec_cfg_open(aec_adjust_parm *parm)
|
||||
{
|
||||
AEC_CFG *aec_cfg = NULL;
|
||||
if (aec_cfg == NULL) {
|
||||
aec_cfg = zalloc(sizeof(AEC_CFG));
|
||||
ASSERT(aec_cfg);
|
||||
}
|
||||
|
||||
aec_cfg->aec_tool_tab = parm->aec_tool_tab;
|
||||
aec_cfg->app = parm->app;
|
||||
aec_cfg->online_en = parm->online_en;
|
||||
|
||||
spin_lock_init(&aec_cfg->lock);
|
||||
p_aec_cfg = aec_cfg;
|
||||
return aec_cfg;
|
||||
|
||||
}
|
||||
|
||||
void aec_cfg_close(AEC_CFG *aec_cfg)
|
||||
{
|
||||
if (!aec_cfg) {
|
||||
return ;
|
||||
}
|
||||
|
||||
free(aec_cfg);
|
||||
aec_cfg = NULL;
|
||||
}
|
||||
|
||||
aec_tool_cfg aec_tool_tab[] = {
|
||||
{0, (u8 *)"AEC tool", AEC_CONFIG_ID, 1, {0x3000, 0x3100, 0x3200, 0x3300, 0x3400, 0x3500}},
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 设置CVP算法类型
|
||||
@param cvp_mode 配置的算法类型
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void cvp_mode_set(u16 cvp_mode)
|
||||
{
|
||||
printf("cvp_mode_set:0x%x\n", cvp_mode);
|
||||
aec_tool_tab[0].fun_type[0] = cvp_mode;
|
||||
}
|
||||
|
||||
int aec_cfg_init(void)
|
||||
{
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
cvp_mode_set(0x3100);
|
||||
#else/*CVP_DNS_MODE*/
|
||||
cvp_mode_set(0x3300);
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
cvp_mode_set(0x3400);
|
||||
#else/*CVP_DNS_MODE*/
|
||||
cvp_mode_set(0x3500);
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#else/*SINGLE MIC*/
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
cvp_mode_set(0x3000);
|
||||
#else/*CVP_DNS_MODE*/
|
||||
cvp_mode_set(0x3200);
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
aec_adjust_parm parm = {0};
|
||||
parm.online_en = 1;
|
||||
#if APP_ONLINE_DEBUG
|
||||
parm.app = 1;
|
||||
#endif
|
||||
parm.aec_tool_tab = aec_tool_tab;
|
||||
AEC_CFG *aec_cfg = aec_cfg_open(&parm);
|
||||
if (aec_cfg->app) {
|
||||
app_online_db_register_handle(DB_PKT_TYPE_AEC, aec_app_online_parse);
|
||||
}
|
||||
aec_cfg_online_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
__initcall(aec_cfg_init);
|
||||
#endif
|
||||
Reference in New Issue
Block a user