feat: Add rfid feature and .gitignore file
This commit is contained in:
1356
apps/earphone/aec/br28/audio_aec.c
Normal file
1356
apps/earphone/aec/br28/audio_aec.c
Normal file
File diff suppressed because it is too large
Load Diff
239
apps/earphone/aec/br28/audio_aec_debug.c
Normal file
239
apps/earphone/aec/br28/audio_aec_debug.c
Normal file
@ -0,0 +1,239 @@
|
||||
#define ModuleEnable_Max 6
|
||||
static const char *ModuleEnable_Name[ModuleEnable_Max] = {
|
||||
"AEC", "NLP", "ANS", "ENC", "AGC", "WNC"
|
||||
};
|
||||
|
||||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
void aec_param_dump(struct tms_attr *param)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_ENABLE
|
||||
printf("===========dump dms param==================\n");
|
||||
printf("EnableBit:%x\n", param->EnableBit);
|
||||
for (u8 i = 0; i < ModuleEnable_Max; i++) {
|
||||
if (param->EnableBit & BIT(i)) {
|
||||
printf("%s ON", ModuleEnable_Name[i]);
|
||||
} else {
|
||||
printf("%s OFF", ModuleEnable_Name[i]);
|
||||
}
|
||||
}
|
||||
printf("ul_eq_en:%x\n", param->ul_eq_en);
|
||||
extern void put_float(double fv);
|
||||
printf("******************* AGC ********************");
|
||||
printf("agc_type : %d", param->agc_type);
|
||||
if (param->agc_type == AGC_EXTERNAL) {
|
||||
puts("AGC_NDT_fade_in_step:");
|
||||
put_float(param->AGC_NDT_fade_in_step);
|
||||
puts("AGC_NDT_fade_out_step:");
|
||||
put_float(param->AGC_NDT_fade_out_step);
|
||||
puts("AGC_DT_fade_in_step:");
|
||||
put_float(param->AGC_DT_fade_in_step);
|
||||
puts("AGC_DT_fade_out_step:");
|
||||
put_float(param->AGC_DT_fade_out_step);
|
||||
puts("AGC_NDT_max_gain:");
|
||||
put_float(param->AGC_NDT_max_gain);
|
||||
puts("AGC_NDT_min_gain:");
|
||||
put_float(param->AGC_NDT_min_gain);
|
||||
puts("AGC_NDT_speech_thr:");
|
||||
put_float(param->AGC_NDT_speech_thr);
|
||||
puts("AGC_DT_max_gain:");
|
||||
put_float(param->AGC_DT_max_gain);
|
||||
puts("AGC_DT_min_gain:");
|
||||
put_float(param->AGC_DT_min_gain);
|
||||
puts("AGC_DT_speech_thr:");
|
||||
put_float(param->AGC_DT_speech_thr);
|
||||
puts("AGC_echo_present_thr:");
|
||||
put_float(param->AGC_echo_present_thr);
|
||||
} else {
|
||||
printf("min_mag_db_level : %d", param->min_mag_db_level);
|
||||
printf("max_mag_db_level : %d", param->max_mag_db_level);
|
||||
printf("addition_mag_db_level : %d", param->addition_mag_db_level);
|
||||
printf("clip_mag_db_level : %d", param->clip_mag_db_level);
|
||||
printf("floor_mag_db_level : %d", param->floor_mag_db_level);
|
||||
}
|
||||
|
||||
printf("******************* AEC ********************");
|
||||
puts("aec_process_maxfrequency:");
|
||||
put_float(param->aec_process_maxfrequency);
|
||||
puts("aec_process_minfrequency:");
|
||||
put_float(param->aec_process_minfrequency);
|
||||
puts("aec_af_length:");
|
||||
put_float(param->af_length);
|
||||
|
||||
printf("******************* NLP ********************");
|
||||
puts("nlp_process_maxfrequency");
|
||||
put_float(param->nlp_process_maxfrequency);
|
||||
puts("nlp_process_minfrequency:");
|
||||
put_float(param->nlp_process_minfrequency);
|
||||
puts("nlp_overdrive:");
|
||||
put_float(param->overdrive);
|
||||
|
||||
printf("******************* DNS ********************");
|
||||
puts("DNS_AggressFactor:");
|
||||
put_float(param->aggressfactor);
|
||||
puts("DNS_MinSuppress:");
|
||||
put_float(param->minsuppress);
|
||||
puts("DNC_init_noise_lvl:");
|
||||
put_float(param->init_noise_lvl);
|
||||
puts("DNS_highGain:");
|
||||
put_float(param->DNS_highGain);
|
||||
puts("DNS_rbRate:");
|
||||
put_float(param->DNS_rbRate);
|
||||
printf("enhance_flag:%d", param->enhance_flag);
|
||||
|
||||
printf("******************* ENC ********************");
|
||||
printf("Tri_CutTh:%d", param->Tri_CutTh);
|
||||
puts("Tri_SnrThreshold0:");
|
||||
put_float(param->Tri_SnrThreshold0);
|
||||
puts("Tri_SnrThreshold1:");
|
||||
put_float(param->Tri_SnrThreshold1);
|
||||
puts("Tri_FbCompenDb:");
|
||||
put_float(param->Tri_FbCompenDb);
|
||||
printf("Tri_TfEqSel:%d", param->Tri_TfEqSel);
|
||||
printf("enc_process_maxfreq:%d", param->enc_process_maxfreq);
|
||||
printf("enc_process_minfreq:%d", param->enc_process_minfreq);
|
||||
printf("sir_maxfreq:%d", param->sir_maxfreq);
|
||||
puts("mic_distance:");
|
||||
put_float(param->mic_distance);
|
||||
puts("target_signal_degradation:");
|
||||
put_float(param->target_signal_degradation);
|
||||
puts("enc_aggressfactor:");
|
||||
put_float(param->enc_aggressfactor);
|
||||
puts("enc_minsuppress:");
|
||||
put_float(param->enc_minsuppress);
|
||||
puts("Tri_CompenDb:");
|
||||
put_float(param->Tri_CompenDb);
|
||||
printf("Tri_Bf_Enhance:%d", param->Tri_Bf_Enhance);
|
||||
|
||||
|
||||
printf("******************* WNC ********************");
|
||||
puts("wn_msc_th:");
|
||||
put_float(param->wn_msc_th);
|
||||
puts("ms_th:");
|
||||
put_float(param->ms_th);
|
||||
puts("wn_gain_offset:");
|
||||
put_float(param->wn_gain_offset);
|
||||
|
||||
printf("===============End==================\n");
|
||||
#endif/*CONFIG_DEBUG_ENABLE*/
|
||||
}
|
||||
#elif TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
void aec_param_dump(struct dms_attr *param)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_ENABLE
|
||||
printf("===========dump dms param==================\n");
|
||||
printf("EnableBit:%x\n", param->EnableBit);
|
||||
for (u8 i = 0; i < ModuleEnable_Max; i++) {
|
||||
if (param->EnableBit & BIT(i)) {
|
||||
printf("%s ON", ModuleEnable_Name[i]);
|
||||
} else {
|
||||
printf("%s OFF", ModuleEnable_Name[i]);
|
||||
}
|
||||
}
|
||||
printf("ul_eq_en:%x\n", param->ul_eq_en);
|
||||
extern void put_float(double fv);
|
||||
puts("AGC_NDT_fade_in_step:");
|
||||
put_float(param->AGC_NDT_fade_in_step);
|
||||
puts("AGC_NDT_fade_out_step:");
|
||||
put_float(param->AGC_NDT_fade_out_step);
|
||||
puts("AGC_DT_fade_in_step:");
|
||||
put_float(param->AGC_DT_fade_in_step);
|
||||
puts("AGC_DT_fade_out_step:");
|
||||
put_float(param->AGC_DT_fade_out_step);
|
||||
puts("AGC_NDT_max_gain:");
|
||||
put_float(param->AGC_NDT_max_gain);
|
||||
puts("AGC_NDT_min_gain:");
|
||||
put_float(param->AGC_NDT_min_gain);
|
||||
puts("AGC_NDT_speech_thr:");
|
||||
put_float(param->AGC_NDT_speech_thr);
|
||||
puts("AGC_DT_max_gain:");
|
||||
put_float(param->AGC_DT_max_gain);
|
||||
puts("AGC_DT_min_gain:");
|
||||
put_float(param->AGC_DT_min_gain);
|
||||
puts("AGC_DT_speech_thr:");
|
||||
put_float(param->AGC_DT_speech_thr);
|
||||
puts("AGC_echo_present_thr:");
|
||||
put_float(param->AGC_echo_present_thr);
|
||||
|
||||
puts("aec_process_maxfrequency:");
|
||||
put_float(param->aec_process_maxfrequency);
|
||||
puts("aec_process_minfrequency:");
|
||||
put_float(param->aec_process_minfrequency);
|
||||
puts("aec_af_length:");
|
||||
put_float(param->af_length);
|
||||
|
||||
puts("nlp_process_maxfrequency");
|
||||
put_float(param->nlp_process_maxfrequency);
|
||||
puts("nlp_process_minfrequency:");
|
||||
put_float(param->nlp_process_minfrequency);
|
||||
puts("nlp_overdrive:");
|
||||
put_float(param->overdrive);
|
||||
|
||||
puts("ANS_AggressFactor:");
|
||||
put_float(param->aggressfactor);
|
||||
puts("ANS_MinSuppress:");
|
||||
put_float(param->minsuppress);
|
||||
puts("ANC_init_noise_lvl:");
|
||||
put_float(param->init_noise_lvl);
|
||||
|
||||
printf("enc_process_maxfreq:%d", param->enc_process_maxfreq);
|
||||
printf("enc_process_minfreq:%d", param->enc_process_minfreq);
|
||||
printf("sir_maxfreq:%d", param->sir_maxfreq);
|
||||
puts("mic_distance:");
|
||||
put_float(param->mic_distance);
|
||||
puts("target_signal_degradation:");
|
||||
put_float(param->target_signal_degradation);
|
||||
puts("enc_aggressfactor:");
|
||||
put_float(param->enc_aggressfactor);
|
||||
puts("enc_minsuppress:");
|
||||
put_float(param->enc_minsuppress);
|
||||
|
||||
puts("GloabalMinSuppress:"), put_float(param->global_minsuppress);
|
||||
printf("===============End==================\n");
|
||||
#endif/*CONFIG_DEBUG_ENABLE*/
|
||||
}
|
||||
#else
|
||||
void aec_param_dump(struct aec_s_attr *param)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_ENABLE
|
||||
printf("===========dump sms param==================\n");
|
||||
printf("toggle:%d\n", param->toggle);
|
||||
printf("EnableBit:%x\n", param->EnableBit);
|
||||
printf("ul_eq_en:%x\n", param->ul_eq_en);
|
||||
extern void put_float(double fv);
|
||||
puts("AGC_NDT_fade_in_step:");
|
||||
put_float(param->AGC_NDT_fade_in_step);
|
||||
puts("AGC_NDT_fade_out_step:");
|
||||
put_float(param->AGC_NDT_fade_out_step);
|
||||
puts("AGC_DT_fade_in_step:");
|
||||
put_float(param->AGC_DT_fade_in_step);
|
||||
puts("AGC_DT_fade_out_step:");
|
||||
put_float(param->AGC_DT_fade_out_step);
|
||||
puts("AGC_NDT_max_gain:");
|
||||
put_float(param->AGC_NDT_max_gain);
|
||||
puts("AGC_NDT_min_gain:");
|
||||
put_float(param->AGC_NDT_min_gain);
|
||||
puts("AGC_NDT_speech_thr:");
|
||||
put_float(param->AGC_NDT_speech_thr);
|
||||
puts("AGC_DT_max_gain:");
|
||||
put_float(param->AGC_DT_max_gain);
|
||||
puts("AGC_DT_min_gain:");
|
||||
put_float(param->AGC_DT_min_gain);
|
||||
puts("AGC_DT_speech_thr:");
|
||||
put_float(param->AGC_DT_speech_thr);
|
||||
puts("AGC_echo_present_thr:");
|
||||
put_float(param->AGC_echo_present_thr);
|
||||
puts("AEC_DT_AggressiveFactor:");
|
||||
put_float(param->AEC_DT_AggressiveFactor);
|
||||
puts("AEC_RefEngThr:");
|
||||
put_float(param->AEC_RefEngThr);
|
||||
puts("ES_AggressFactor:");
|
||||
put_float(param->ES_AggressFactor);
|
||||
puts("ES_MinSuppress:");
|
||||
put_float(param->ES_MinSuppress);
|
||||
puts("ANS_AggressFactor:");
|
||||
put_float(param->ANS_AggressFactor);
|
||||
puts("ANS_MinSuppress:");
|
||||
put_float(param->ANS_MinSuppress);
|
||||
#endif/*CONFIG_DEBUG_ENABLE*/
|
||||
}
|
||||
#endif/*CONFIG_DEBUG_ENABLE*/
|
||||
632
apps/earphone/aec/br28/audio_aec_demo.c
Normal file
632
apps/earphone/aec/br28/audio_aec_demo.c
Normal file
@ -0,0 +1,632 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* AUDIO AEC DEMO
|
||||
* File : audio_aec_demo.c
|
||||
* By : GZR
|
||||
* Notes : 1.可用内存
|
||||
* (1)aec_hdl_mem: 静态变量
|
||||
* (2)free_ram: 动态内存(mem_stats:physics memory size xxxx bytes)
|
||||
* 2.demo默认将输入数据copy到输出,相关处理只需在运算函数
|
||||
* audio_aec_run()实现即可
|
||||
* 3.双mic ENC开发,只需打开对应板级以下配置即可:
|
||||
* #define TCFG_AUDIO_DUAL_MIC_ENABLE ENABLE_THIS_MOUDLE
|
||||
* 4.建议算法开发者使用宏定义将自己的代码模块包起来
|
||||
* 5.算法处理完的数据,如有需要,可以增加EQ处理:AEC_UL_EQ_EN
|
||||
* 6.开发阶段,默认使用芯片最高主频160MHz,可以通过修改AEC_CLK来修改
|
||||
运行频率。
|
||||
***************************************************************************
|
||||
*/
|
||||
#include "aec_user.h"
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "application/eq_config.h"
|
||||
#include "circular_buf.h"
|
||||
#include "overlay_code.h"
|
||||
#include "audio_config.h"
|
||||
#include "debug.h"
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
#include "audio_cvp_dut.h"
|
||||
#endif // TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
|
||||
#if defined(TCFG_CVP_DEVELOP_ENABLE) && (TCFG_CVP_DEVELOP_ENABLE == CVP_CFG_USER_DEFINED)
|
||||
|
||||
#define AEC_CLK (160 * 1000000L) /*模块运行时钟(MaxFre:160MHz)*/
|
||||
#define AEC_FRAME_POINTS 256 /*AEC处理帧长,跟mic采样长度关联*/
|
||||
#define AEC_FRAME_SIZE (AEC_FRAME_POINTS << 1)
|
||||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
#define AEC_MIC_NUM 3 /*3 mic*/
|
||||
#elif TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#define AEC_MIC_NUM 2 /*双mic*/
|
||||
#else
|
||||
#define AEC_MIC_NUM 1 /*单mic*/
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
|
||||
/*上行数据eq*/
|
||||
#define AEC_UL_EQ_EN 0
|
||||
|
||||
#define AEC_USER_MALLOC_ENABLE 1 /*是否使用动态内存*/
|
||||
|
||||
#ifdef AUDIO_PCM_DEBUG
|
||||
/*AEC串口数据导出*/
|
||||
const u8 CONST_AEC_EXPORT = 1;
|
||||
#else
|
||||
const u8 CONST_AEC_EXPORT = 0;
|
||||
#endif/*AUDIO_PCM_DEBUG*/
|
||||
|
||||
extern int audio_dac_read_reset(void);
|
||||
extern int audio_dac_read(s16 points_offset, void *data, int len, u8 read_channel);
|
||||
extern void esco_enc_resume(void);
|
||||
extern int aec_uart_init();
|
||||
extern int aec_uart_open(u8 nch, u16 single_size);
|
||||
extern int aec_uart_fill(u8 ch, void *buf, u16 size);
|
||||
extern void aec_uart_write(void);
|
||||
extern int aec_uart_close(void);
|
||||
|
||||
/*AEC输入buf复用mic_adc采样buf*/
|
||||
#define MIC_BULK_MAX 3
|
||||
struct mic_bulk {
|
||||
struct list_head entry;
|
||||
s16 *addr;
|
||||
u16 len;
|
||||
u16 used;
|
||||
};
|
||||
|
||||
struct audio_aec_hdl {
|
||||
volatile u8 start; //aec模块状态
|
||||
volatile u8 busy;
|
||||
u8 output_sel; //数据输出通道选择
|
||||
u8 output_buf[1000]; //aec数据输出缓存
|
||||
cbuffer_t output_cbuf;
|
||||
s16 *mic; /*主mic数据地址*/
|
||||
s16 *mic_ref; /*参考mic数据地址*/
|
||||
s16 *mic_ref_1; /*参考mic数据地址*/
|
||||
s16 spk_ref[AEC_FRAME_POINTS]; /*扬声器参考数据*/
|
||||
s16 out[AEC_FRAME_POINTS]; /*运算输出地址*/
|
||||
OS_SEM sem;
|
||||
/*数据复用相关数据结构*/
|
||||
struct mic_bulk in_bulk[MIC_BULK_MAX];
|
||||
struct mic_bulk inref_bulk[MIC_BULK_MAX];
|
||||
struct mic_bulk inref_1_bulk[MIC_BULK_MAX];
|
||||
struct list_head in_head;
|
||||
struct list_head inref_head;
|
||||
struct list_head inref_1_head;
|
||||
#if AEC_UL_EQ_EN
|
||||
struct audio_eq *ul_eq;
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
int (*output_handle)(s16 *dat, u16 len);
|
||||
};
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
struct audio_aec_hdl *aec_hdl = NULL;
|
||||
#else
|
||||
struct audio_aec_hdl aec_handle;
|
||||
struct audio_aec_hdl *aec_hdl = &aec_handle;
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Read
|
||||
* Description: 读取aec模块的输出数据
|
||||
* Arguments : buf 读取数据存放地址
|
||||
* len 读取数据长度
|
||||
* Return : 数据读取长度
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_output_read(s16 *buf, u16 len)
|
||||
{
|
||||
//printf("rlen:%d-%d\n",len,aec_hdl.output_cbuf.data_len);
|
||||
local_irq_disable();
|
||||
if (!aec_hdl || !aec_hdl->start) {
|
||||
printf("audio_aec close now");
|
||||
local_irq_enable();
|
||||
return -EINVAL;
|
||||
}
|
||||
u16 rlen = cbuf_read(&aec_hdl->output_cbuf, buf, len);
|
||||
if (rlen == 0) {
|
||||
//putchar('N');
|
||||
}
|
||||
local_irq_enable();
|
||||
return rlen;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Handle
|
||||
* Description: AEC模块数据输出回调
|
||||
* Arguments : data 输出数据地址
|
||||
* len 输出数据长度
|
||||
* Return : 数据输出消耗长度
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
static int audio_aec_output(s16 *data, u16 len)
|
||||
{
|
||||
u16 wlen = 0;
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
wlen = cbuf_write(&aec_hdl->output_cbuf, data, len);
|
||||
//printf("wlen:%d-%d\n",len,aec_hdl.output_cbuf.data_len);
|
||||
if (wlen != len) {
|
||||
printf("aec_out_full:%d,%d\n", len, wlen);
|
||||
}
|
||||
esco_enc_resume();
|
||||
}
|
||||
return wlen;
|
||||
}
|
||||
|
||||
/*
|
||||
*跟踪系统内存使用情况:physics memory size xxxx bytes
|
||||
*正常的系统运行过程,应该至少有3k bytes的剩余空间给到系统调度开销
|
||||
*/
|
||||
static void sys_memory_trace(void)
|
||||
{
|
||||
static int cnt = 0;
|
||||
if (cnt++ > 200) {
|
||||
cnt = 0;
|
||||
mem_stats();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC RUN
|
||||
* Description: AEC数据处理核心
|
||||
* Arguments : in 主mic数据
|
||||
* inref 参考mic数据(双mic降噪有用)
|
||||
* inref1 参考mic数据(3 mic降噪有用)
|
||||
* ref speaker参考数据
|
||||
* out 数据输出
|
||||
* Return : 数据运算输出长度
|
||||
* Note(s) : 在这里实现AEC_core
|
||||
*********************************************************************
|
||||
*/
|
||||
static int audio_aec_run(s16 *in, s16 *inref, s16 *inref1, s16 *ref, s16 *out, u16 points)
|
||||
{
|
||||
int out_size = 0;
|
||||
putchar('.');
|
||||
memcpy(out, in, (points << 1));
|
||||
//memcpy(out, inref, (points << 1));
|
||||
out_size = points << 1;
|
||||
#if AEC_UL_EQ_EN
|
||||
if (aec_hdl->ul_eq) {
|
||||
audio_eq_run(aec_hdl->ul_eq, out, out_size);
|
||||
}
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
switch (aec_hdl->output_sel) {
|
||||
case CVP_3MIC_OUTPUT_SEL_MASTER:
|
||||
memcpy(out, in, (points << 1));
|
||||
break;
|
||||
case CVP_3MIC_OUTPUT_SEL_SLAVE:
|
||||
memcpy(out, inref, (points << 1));
|
||||
break;
|
||||
case CVP_3MIC_OUTPUT_SEL_FBMIC:
|
||||
memcpy(out, inref1, (points << 1));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
|
||||
sys_memory_trace();
|
||||
return out_size;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Task
|
||||
* Description: AEC任务
|
||||
* Arguments : priv 私用参数
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
static void audio_aec_task(void *priv)
|
||||
{
|
||||
printf("==Audio AEC Task==\n");
|
||||
struct mic_bulk *bulk = NULL;
|
||||
struct mic_bulk *bulk_ref = NULL;
|
||||
struct mic_bulk *bulk_ref_1 = NULL;
|
||||
u8 pend = 1;
|
||||
while (1) {
|
||||
if (pend) {
|
||||
os_sem_pend(&aec_hdl->sem, 0);
|
||||
}
|
||||
pend = 1;
|
||||
if (aec_hdl->start) {
|
||||
if (!list_empty(&aec_hdl->in_head)) {
|
||||
aec_hdl->busy = 1;
|
||||
local_irq_disable();
|
||||
/*1.获取主mic数据*/
|
||||
bulk = list_first_entry(&aec_hdl->in_head, struct mic_bulk, entry);
|
||||
list_del(&bulk->entry);
|
||||
aec_hdl->mic = bulk->addr;
|
||||
#if (AEC_MIC_NUM > 1)
|
||||
/*2.获取参考mic数据*/
|
||||
bulk_ref = list_first_entry(&aec_hdl->inref_head, struct mic_bulk, entry);
|
||||
list_del(&bulk_ref->entry);
|
||||
aec_hdl->mic_ref = bulk_ref->addr;
|
||||
#endif/*Dual_Microphone*/
|
||||
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
/*获取参考mic1数据*/
|
||||
bulk_ref_1 = list_first_entry(&aec_hdl->inref_1_head, struct mic_bulk, entry);
|
||||
list_del(&bulk_ref_1->entry);
|
||||
aec_hdl->mic_ref_1 = bulk_ref_1->addr;
|
||||
#endif/*3_Microphone*/
|
||||
|
||||
local_irq_enable();
|
||||
/*3.获取speaker参考数据*/
|
||||
audio_dac_read(60, aec_hdl->spk_ref, AEC_FRAME_SIZE, 1);
|
||||
|
||||
/*4.算法处理*/
|
||||
int out_len = audio_aec_run(aec_hdl->mic, aec_hdl->mic_ref, aec_hdl->mic_ref_1, aec_hdl->spk_ref, aec_hdl->out, AEC_FRAME_POINTS);
|
||||
|
||||
/*5.结果输出*/
|
||||
if (aec_hdl->output_handle) {
|
||||
aec_hdl->output_handle(aec_hdl->out, out_len);
|
||||
}
|
||||
|
||||
/*6.数据导出*/
|
||||
if (CONST_AEC_EXPORT) {
|
||||
aec_uart_fill(0, aec_hdl->mic, 512); //主mic数据
|
||||
aec_uart_fill(1, aec_hdl->mic_ref, 512); //副mic数据
|
||||
aec_uart_fill(2, aec_hdl->spk_ref, 512); //扬声器数据
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
aec_uart_fill(2, aec_hdl->mic_ref_1, 512); //扬声器数据
|
||||
aec_uart_fill(3, aec_hdl->spk_ref, 512); //扬声器数据
|
||||
aec_uart_fill(4, aec_hdl->out, out_len); //算法运算结果
|
||||
#endif /*3_Microphone*/
|
||||
aec_uart_write();
|
||||
}
|
||||
bulk->used = 0;
|
||||
#if (AEC_MIC_NUM > 1)
|
||||
bulk_ref->used = 0;
|
||||
#endif/*Dual_Microphone*/
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
bulk_ref_1->used = 0;
|
||||
#endif /*3_Microphone*/
|
||||
aec_hdl->busy = 0;
|
||||
pend = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Open
|
||||
* Description: 初始化AEC模块
|
||||
* Arguments : sr 采样率(8000/16000)
|
||||
* enablebit 使能模块(AEC/NLP/AGC/ANS...)
|
||||
* out_hdl 自定义回调函数,NULL则用默认的回调
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : 该接口是对audio_aec_init的扩展,支持自定义使能模块以及
|
||||
* 数据输出回调函数
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_open(u16 sample_rate, s16 enablebit, int (*out_hdl)(s16 *data, u16 len))
|
||||
{
|
||||
printf("audio_aec_open,sr = %d\n", sample_rate);
|
||||
mem_stats();
|
||||
if (aec_hdl) {
|
||||
printf("audio aec is already open!\n");
|
||||
return -1;
|
||||
}
|
||||
overlay_load_code(OVERLAY_AEC);
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
aec_hdl = zalloc(sizeof(struct audio_aec_hdl));
|
||||
if (aec_hdl == NULL) {
|
||||
printf("aec_hdl malloc failed");
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
aec_hdl->output_sel = CVP_3MIC_OUTPUT_SEL_DEFAULT;
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
aec_hdl->output_handle = audio_aec_output;
|
||||
|
||||
printf("aec_hdl size:%d\n", sizeof(struct audio_aec_hdl));
|
||||
clk_set("sys", AEC_CLK);
|
||||
INIT_LIST_HEAD(&aec_hdl->in_head);
|
||||
INIT_LIST_HEAD(&aec_hdl->inref_head);
|
||||
INIT_LIST_HEAD(&aec_hdl->inref_1_head);
|
||||
cbuf_init(&aec_hdl->output_cbuf, aec_hdl->output_buf, sizeof(aec_hdl->output_buf));
|
||||
if (CONST_AEC_EXPORT) {
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
aec_uart_open(5, 512);
|
||||
#elif (AEC_MIC_NUM > 1)
|
||||
aec_uart_open(3, 512);
|
||||
#endif /*AEC_MIC_NUM*/
|
||||
}
|
||||
|
||||
if (out_hdl) {
|
||||
aec_hdl->output_handle = out_hdl;
|
||||
}
|
||||
|
||||
#if AEC_UL_EQ_EN
|
||||
struct audio_eq_param ul_eq_param = {0};
|
||||
ul_eq_param.sr = sample_rate;
|
||||
ul_eq_param.channels = 1;
|
||||
ul_eq_param.online_en = 1;
|
||||
ul_eq_param.mode_en = 0;
|
||||
ul_eq_param.remain_en = 0;
|
||||
ul_eq_param.max_nsection = EQ_SECTION_MAX;
|
||||
ul_eq_param.cb = aec_ul_eq_filter;
|
||||
ul_eq_param.eq_name = aec_eq_mode;
|
||||
aec_hdl->ul_eq = audio_dec_eq_open(&ul_eq_param);
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
os_sem_create(&aec_hdl->sem, 0);
|
||||
task_create(audio_aec_task, NULL, "aec");
|
||||
audio_dac_read_reset();
|
||||
aec_hdl->start = 1;
|
||||
|
||||
mem_stats();
|
||||
#ifdef MUX_RX_BULK_TEST_DEMO
|
||||
mux_rx_bulk_test = zalloc_mux_rx_bulk(MUX_RX_BULK_MAX);
|
||||
if (mux_rx_bulk_test) {
|
||||
printf("mux_rx_bulk_test:0x%x\n", mux_rx_bulk_test);
|
||||
free_mux_rx_bulk(mux_rx_bulk_test);
|
||||
mux_rx_bulk_test = NULL;
|
||||
}
|
||||
#endif/*MUX_RX_BULK_TEST_DEMO*/
|
||||
|
||||
printf("audio_aec_open succ\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Open
|
||||
* Description: 初始化AEC模块
|
||||
* Arguments : sr 采样率(8000/16000)
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_init(u16 sample_rate)
|
||||
{
|
||||
return audio_aec_open(sample_rate, -1, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Reboot
|
||||
* Description: AEC模块复位接口
|
||||
* Arguments : reduce 复位/恢复标志
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_reboot(u8 reduce)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Close
|
||||
* Description: 关闭AEC模块
|
||||
* Arguments : None.
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_close(void)
|
||||
{
|
||||
printf("audio_aec_close:%x", (u32)aec_hdl);
|
||||
if (aec_hdl) {
|
||||
aec_hdl->start = 0;
|
||||
while (aec_hdl->busy) {
|
||||
os_time_dly(2);
|
||||
}
|
||||
task_kill("aec");
|
||||
if (CONST_AEC_EXPORT) {
|
||||
aec_uart_close();
|
||||
}
|
||||
|
||||
#if AEC_UL_EQ_EN
|
||||
if (aec_hdl->ul_eq) {
|
||||
audio_dec_eq_close(aec_hdl->ul_eq);
|
||||
aec_hdl->ul_eq = NULL;
|
||||
}
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
|
||||
local_irq_disable();
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
free(aec_hdl);
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
aec_hdl = NULL;
|
||||
local_irq_enable();
|
||||
printf("audio_aec_close succ\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Status
|
||||
* Description: AEC模块当前状态
|
||||
* Arguments : None.
|
||||
* Return : 0 关闭 其他 打开
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
u8 audio_aec_status(void)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
return aec_hdl->start;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input
|
||||
* Description: AEC源数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 输入一帧数据,唤醒一次运行任务处理数据,默认帧长256点
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->in_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
if (cvp_dut_mode_get() == CVP_DUT_MODE_BYPASS) {
|
||||
audio_aec_output(buf, len);
|
||||
return;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->in_bulk[i].addr = buf;
|
||||
aec_hdl->in_bulk[i].used = 0x55;
|
||||
aec_hdl->in_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->in_bulk[i].entry, &aec_hdl->in_head);
|
||||
} else {
|
||||
printf(">>>aec_in_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->in_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
os_sem_set(&aec_hdl->sem, 0);
|
||||
os_sem_post(&aec_hdl->sem);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input Reference
|
||||
* Description: AEC源参考数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 双mic ENC的参考mic数据输入,单mic的无须调用该接口
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf_ref(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->inref_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->inref_bulk[i].addr = buf;
|
||||
aec_hdl->inref_bulk[i].used = 0x55;
|
||||
aec_hdl->inref_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->inref_bulk[i].entry, &aec_hdl->inref_head);
|
||||
} else {
|
||||
printf(">>>aec_inref_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->inref_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input Reference
|
||||
* Description: AEC源参考数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 双mic ENC的参考mic数据输入,单mic的无须调用该接口
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf_ref_1(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->inref_1_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->inref_1_bulk[i].addr = buf;
|
||||
aec_hdl->inref_1_bulk[i].used = 0x55;
|
||||
aec_hdl->inref_1_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->inref_1_bulk[i].entry, &aec_hdl->inref_1_head);
|
||||
} else {
|
||||
printf(">>>aec_inref_1_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->inref_1_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Reference
|
||||
* Description: AEC模块参考数据输入
|
||||
* Arguments : buf 输入参考数据地址
|
||||
* len 输入参考数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 声卡设备是DAC,默认不用外部提供参考数据
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_refbuf(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Sel
|
||||
* Description: AEC输出数据选择
|
||||
* Arguments : sel 选择输出/算法输出/talk/ff/fb原始数据
|
||||
* agc NULL
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_output_sel(CVP_OUTPUT_ENUM sel, u8 agc)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
aec_hdl->output_sel = sel;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Toggle Set
|
||||
* Description: AEC模块算法开关使能
|
||||
* Arguments : toggle 0 关闭算法 1 打开算法
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_toggle_set(u8 toggle)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
aec_hdl->output_sel = (toggle) ? 0 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif /*TCFG_CVP_DEVELOP_ENABLE*/
|
||||
1622
apps/earphone/aec/br28/audio_aec_dms.c
Normal file
1622
apps/earphone/aec/br28/audio_aec_dms.c
Normal file
File diff suppressed because it is too large
Load Diff
672
apps/earphone/aec/br28/audio_aec_online.c
Normal file
672
apps/earphone/aec/br28/audio_aec_online.c
Normal file
@ -0,0 +1,672 @@
|
||||
#include "audio_aec_online.h"
|
||||
#include "app_online_cfg.h"
|
||||
#include "config/config_target.h"
|
||||
#include "system/includes.h"
|
||||
#include "online_db_deal.h"
|
||||
#include "timer.h"
|
||||
#include "aec_user.h"
|
||||
#include "audio_adc.h"
|
||||
|
||||
#if 1
|
||||
extern void put_float(double fv);
|
||||
#define AEC_ONLINE_LOG y_printf
|
||||
#define AEC_ONLINE_FLOG put_float
|
||||
#else
|
||||
#define AEC_ONLINE_LOG(...)
|
||||
#define AEC_ONLINE_FLOG(...)
|
||||
#endif
|
||||
|
||||
#if TCFG_AEC_TOOL_ONLINE_ENABLE
|
||||
extern int esco_enc_mic_gain_set(u8 gain);
|
||||
extern int esco_enc_mic1_gain_set(u8 gain);
|
||||
extern int esco_enc_mic2_gain_set(u8 gain);
|
||||
extern int esco_enc_mic3_gain_set(u8 gain);
|
||||
extern int esco_dec_dac_gain_set(u8 gain);
|
||||
enum {
|
||||
AEC_UPDATE_CLOSE,
|
||||
AEC_UPDATE_INIT,
|
||||
AEC_UPDATE_ONLINE,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
u8 update;
|
||||
u8 reserved;
|
||||
u16 timer;
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
AEC_DMS_CONFIG cfg;
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
DMS_FLEXIBLE_CONFIG cfg;
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#else/*SINGLE MIC*/
|
||||
AEC_CONFIG cfg;
|
||||
u8 agc_en;
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
} aec_update_t;
|
||||
aec_update_t *aec_update = NULL;
|
||||
|
||||
static void aec_update_timer_deal(void *priv)
|
||||
{
|
||||
AEC_ONLINE_LOG("aec_update_timer_deal");
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
aec_dms_cfg_update(&aec_update->cfg);
|
||||
#else
|
||||
aec_cfg_update(&aec_update->cfg);
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
sys_timer_del(aec_update->timer);
|
||||
aec_update->timer = 0;
|
||||
}
|
||||
|
||||
int aec_cfg_online_update(int root_cmd, void *packet)
|
||||
{
|
||||
if ((root_cmd != 0x3000) && (root_cmd != 0x3100) &&
|
||||
(root_cmd != 0x3200) && (root_cmd != 0x3300) &&
|
||||
(root_cmd != 0x3400) && (root_cmd != 0x3500)) {
|
||||
return -1;
|
||||
}
|
||||
if (aec_update->update == AEC_UPDATE_CLOSE) {
|
||||
return 0;
|
||||
}
|
||||
u8 update = 1;
|
||||
aec_online_t *cfg = packet;
|
||||
int id = cfg->id;
|
||||
//AEC_ONLINE_LOG("AEC_TYPE[0x30xx:SMS 0x31xx:DMS]:%x",root_cmd);
|
||||
//AEC_ONLINE_LOG("aec_cfg_id:%x,val:%d", cfg->id, (int)cfg->val_int);
|
||||
//AEC_ONLINE_FLOG(cfg->val_float);
|
||||
if (id >= ENC_Process_MaxFreq) {
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
AEC_ONLINE_LOG("ENC cfg update\n");
|
||||
switch (id) {
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
case ENC_Process_MaxFreq:
|
||||
AEC_ONLINE_LOG("ENC_Process_MaxFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.enc_process_maxfreq = cfg->val_int;
|
||||
break;
|
||||
case ENC_Process_MinFreq:
|
||||
AEC_ONLINE_LOG("ENC_Process_MinFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.enc_process_minfreq = cfg->val_int;
|
||||
break;
|
||||
case ENC_SIR_MaxFreq:
|
||||
AEC_ONLINE_LOG("ENC_SIR_MaxFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.sir_maxfreq = cfg->val_int;
|
||||
break;
|
||||
case ENC_MIC_Distance:
|
||||
AEC_ONLINE_LOG("ENC_MIC_Distance:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.mic_distance = cfg->val_float;
|
||||
break;
|
||||
case ENC_Target_Signal_Degradation:
|
||||
AEC_ONLINE_LOG("ENC_Target_Signal_Degradation:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.target_signal_degradation = cfg->val_float;
|
||||
break;
|
||||
case ENC_AggressFactor:
|
||||
AEC_ONLINE_LOG("ENC_AggressFactor:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_aggressfactor = cfg->val_float;
|
||||
break;
|
||||
case ENC_MinSuppress:
|
||||
AEC_ONLINE_LOG("ENC_MinSuppress:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_minsuppress = cfg->val_float;
|
||||
break;
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
case ENC_Suppress_Pre:
|
||||
AEC_ONLINE_LOG("ENC_Suppress_Pre:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_suppress_pre = cfg->val_float;
|
||||
break;
|
||||
case ENC_Suppress_Post:
|
||||
AEC_ONLINE_LOG("ENC_Suppress_Post:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_suppress_post = cfg->val_float;
|
||||
break;
|
||||
case ENC_MinSuppress:
|
||||
AEC_ONLINE_LOG("ENC_MinSuppress:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_minsuppress = cfg->val_float;
|
||||
break;
|
||||
case ENC_Disconverge_Thr:
|
||||
AEC_ONLINE_LOG("ENC_Disconverge_Thr:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.enc_disconverge_erle_thr = cfg->val_float;
|
||||
break;
|
||||
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
default:
|
||||
AEC_ONLINE_LOG("enc param default:%x\n", id, cfg->val_int);
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
break;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
} else if (id >= AGC_NDT_FADE_IN) {
|
||||
AEC_ONLINE_LOG("AGC cfg update\n");
|
||||
switch (id) {
|
||||
case AGC_NDT_FADE_IN:
|
||||
AEC_ONLINE_LOG("AGC_NDT_FADE_IN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ndt_fade_in = cfg->val_float;
|
||||
break;
|
||||
case AGC_NDT_FADE_OUT:
|
||||
AEC_ONLINE_LOG("AGC_NDT_FADE_OUT:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ndt_fade_out = cfg->val_float;
|
||||
break;
|
||||
case AGC_DT_FADE_IN:
|
||||
AEC_ONLINE_LOG("AGC_DT_FADE_IN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.dt_fade_in = cfg->val_float;
|
||||
break;
|
||||
case AGC_DT_FADE_OUT:
|
||||
AEC_ONLINE_LOG("AGC_DT_FADE_OUT:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.dt_fade_out = cfg->val_float;
|
||||
break;
|
||||
case AGC_NDT_MAX_GAIN:
|
||||
AEC_ONLINE_LOG("AGC_NDT_MAX_GAIN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ndt_max_gain = cfg->val_float;
|
||||
break;
|
||||
case AGC_NDT_MIN_GAIN:
|
||||
AEC_ONLINE_LOG("AGC_NDT_MIN_GAIN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ndt_min_gain = cfg->val_float;
|
||||
break;
|
||||
case AGC_NDT_SPEECH_THR:
|
||||
AEC_ONLINE_LOG("AGC_NDT_SPEECH_THR:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ndt_speech_thr = cfg->val_float;
|
||||
break;
|
||||
case AGC_DT_MAX_GAIN:
|
||||
AEC_ONLINE_LOG("AGC_DT_MAX_GAIN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.dt_max_gain = cfg->val_float;
|
||||
break;
|
||||
case AGC_DT_MIN_GAIN:
|
||||
AEC_ONLINE_LOG("AGC_DT_MIN_GAIN:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.dt_min_gain = cfg->val_float;
|
||||
break;
|
||||
case AGC_DT_SPEECH_THR:
|
||||
AEC_ONLINE_LOG("AGC_DT_SPEECH_THR:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.dt_speech_thr = cfg->val_float;
|
||||
break;
|
||||
case AGC_ECHO_PRESENT_THR:
|
||||
AEC_ONLINE_LOG("AGC_ECHO_PRESENT_THR:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.echo_present_thr = cfg->val_float;
|
||||
break;
|
||||
}
|
||||
} else if (id >= ANS_AggressFactor) {
|
||||
AEC_ONLINE_LOG("ANS cfg update\n");
|
||||
switch (id) {
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
case ANS_AggressFactor:
|
||||
AEC_ONLINE_LOG("ANS_AggressFactor:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.aggressfactor = cfg->val_float;
|
||||
break;
|
||||
case ANS_MinSuppress:
|
||||
AEC_ONLINE_LOG("ANS_MinSuppress:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.minsuppress = cfg->val_float;
|
||||
break;
|
||||
case ANS_MicNoiseLevel:
|
||||
AEC_ONLINE_LOG("ANS_MicNoiseLevel:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.init_noise_lvl = cfg->val_float;
|
||||
break;
|
||||
#else
|
||||
case ANS_AGGRESS:
|
||||
AEC_ONLINE_LOG("ANS_AGGRESS:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ans_aggress = cfg->val_float;
|
||||
break;
|
||||
case ANS_SUPPRESS:
|
||||
AEC_ONLINE_LOG("ANS_SUPPRESS:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ans_suppress = cfg->val_float;
|
||||
break;
|
||||
case DNS_GainFloor:
|
||||
AEC_ONLINE_LOG("DNS_GainFloor:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ans_suppress = cfg->val_float;
|
||||
break;
|
||||
case DNS_OverDrive:
|
||||
AEC_ONLINE_LOG("DNS_OverDrive:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.ans_aggress = cfg->val_float;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
} else if (id >= NLP_ProcessMaxFreq) {
|
||||
AEC_ONLINE_LOG("NLP cfg update\n");
|
||||
switch (id) {
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
case NLP_ProcessMaxFreq:
|
||||
AEC_ONLINE_LOG("NLP_ProcessMaxFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.nlp_process_maxfrequency = cfg->val_int;
|
||||
break;
|
||||
case NLP_ProcessMinFreq:
|
||||
AEC_ONLINE_LOG("NLP_ProcessMinFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.nlp_process_minfrequency = cfg->val_int;
|
||||
break;
|
||||
case NLP_OverDrive:
|
||||
AEC_ONLINE_LOG("NLP_OverDrive:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.overdrive = cfg->val_float;
|
||||
break;
|
||||
#else/*SINGLE MIC*/
|
||||
case NLP_AGGRESS_FACTOR:
|
||||
AEC_ONLINE_LOG("NLP_AGGRESS_FACTOR:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.es_aggress_factor = cfg->val_float;
|
||||
break;
|
||||
case NLP_MIN_SUPPRESS:
|
||||
AEC_ONLINE_LOG("NLP_MIN_SUPPRESS:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.es_min_suppress = cfg->val_float;
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
}
|
||||
} else if (id >= AEC_ProcessMaxFreq) {
|
||||
switch (id) {
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
case AEC_ProcessMaxFreq:
|
||||
AEC_ONLINE_LOG("AEC_ProcessMaxFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.aec_process_maxfrequency = cfg->val_int;
|
||||
break;
|
||||
case AEC_ProcessMinFreq:
|
||||
AEC_ONLINE_LOG("AEC_ProcessMinFreq:%d\n", cfg->val_int);
|
||||
aec_update->cfg.aec_process_minfrequency = cfg->val_int;
|
||||
break;
|
||||
case AEC_AF_Lenght:
|
||||
AEC_ONLINE_LOG("AEC_AF_Lenght:%d\n", cfg->val_int);
|
||||
aec_update->cfg.af_length = cfg->val_int;
|
||||
break;
|
||||
#else/*SINGLE MIC*/
|
||||
case AEC_DT_AGGRESS:
|
||||
AEC_ONLINE_LOG("AEC_DT_AGGRESS:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.aec_dt_aggress = cfg->val_float;
|
||||
case AEC_REFENGTHR:
|
||||
AEC_ONLINE_LOG("AEC_REFENGTHR:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.aec_refengthr = cfg->val_float;
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
}
|
||||
} else {
|
||||
AEC_ONLINE_LOG("General cfg update\n");
|
||||
switch (id) {
|
||||
case GENERAL_DAC:
|
||||
AEC_ONLINE_LOG("DAC_Gain:%d\n", cfg->val_int);
|
||||
aec_update->cfg.dac_again = cfg->val_int;
|
||||
esco_dec_dac_gain_set(cfg->val_int);
|
||||
update = 0;
|
||||
break;
|
||||
case GENERAL_MIC:
|
||||
AEC_ONLINE_LOG("Mic_Gain:%d\n", cfg->val_int);
|
||||
aec_update->cfg.mic_again = cfg->val_int;
|
||||
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0)
|
||||
esco_enc_mic_gain_set(cfg->val_int);
|
||||
#endif/*TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0*/
|
||||
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1)
|
||||
esco_enc_mic1_gain_set(cfg->val_int);
|
||||
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1)*/
|
||||
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2)
|
||||
esco_enc_mic2_gain_set(cfg->val_int);
|
||||
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2)*/
|
||||
#if (TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3)
|
||||
esco_enc_mic3_gain_set(cfg->val_int);
|
||||
#endif/*(TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3)*/
|
||||
update = 0;
|
||||
break;
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE)
|
||||
case GENERAL_MIC_1:
|
||||
AEC_ONLINE_LOG("Mic1_Gain:%d\n", cfg->val_int);
|
||||
aec_update->cfg.mic1_again = cfg->val_int;
|
||||
esco_enc_mic1_gain_set(cfg->val_int);
|
||||
update = 0;
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
case GENERAL_ModuleEnable:
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
AEC_ONLINE_LOG("DMS EnableBit:%x", cfg->val_int);
|
||||
aec_update->cfg.enable_module = cfg->val_int;
|
||||
#else
|
||||
AEC_ONLINE_LOG("SMS EnableBit:%x", cfg->val_int);
|
||||
aec_update->cfg.aec_mode = cfg->val_int;
|
||||
|
||||
/*使用新配置工具后,兼容app在线调试*/
|
||||
if (aec_update->cfg.aec_mode == 2) {
|
||||
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
|
||||
aec_update->cfg.aec_mode |= AEC_MODE_ADVANCE;
|
||||
} else if (aec_update->cfg.aec_mode == 1) {
|
||||
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
|
||||
aec_update->cfg.aec_mode |= AEC_MODE_REDUCE;
|
||||
} else {
|
||||
aec_update->cfg.aec_mode &= ~AEC_MODE_ADVANCE;
|
||||
}
|
||||
if (aec_update->cfg.aec_mode) {
|
||||
aec_update->cfg.aec_mode |= AGC_EN;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
break;
|
||||
case GENERAL_PC_ModuleEnable:
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
AEC_ONLINE_LOG("DMS EnableBit:%x", cfg->val_int);
|
||||
aec_update->cfg.enable_module = cfg->val_int;
|
||||
#else
|
||||
AEC_ONLINE_LOG("SMS EnableBit:%x", cfg->val_int);
|
||||
aec_update->cfg.aec_mode = cfg->val_int;
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
break;
|
||||
case GENERAL_UL_EQ:
|
||||
AEC_ONLINE_LOG("UL_EQ_EN:%d\n", cfg->val_int);
|
||||
aec_update->cfg.ul_eq_en = cfg->val_int;
|
||||
break;
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
case GENERAL_Global_MinSuppress:
|
||||
AEC_ONLINE_LOG("GlobalMinSuppress:");
|
||||
AEC_ONLINE_FLOG(cfg->val_float);
|
||||
aec_update->cfg.global_minsuppress = cfg->val_float;
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
}
|
||||
}
|
||||
aec_update->update = AEC_UPDATE_ONLINE;
|
||||
if (update && audio_aec_status()) {
|
||||
if (aec_update->timer) {
|
||||
sys_timer_modify(aec_update->timer, 500);
|
||||
} else {
|
||||
aec_update->timer = sys_timer_add(NULL, aec_update_timer_deal, 500);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int aec_cfg_online_init()
|
||||
{
|
||||
int ret = 0;
|
||||
aec_update = zalloc(sizeof(aec_update_t));
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
ret = syscfg_read(CFG_DMS_ID, &aec_update->cfg, sizeof(AEC_DMS_CONFIG));
|
||||
#else/*CVP_DNS_MODE*/
|
||||
ret = syscfg_read(CFG_DMS_DNS_ID, &aec_update->cfg, sizeof(AEC_DMS_CONFIG));
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
if (ret == sizeof(AEC_DMS_CONFIG)) {
|
||||
aec_update->update = AEC_UPDATE_INIT;
|
||||
}
|
||||
#else/*TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE*/
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
ret = syscfg_read(CFG_DMS_FLEXIBLE_ID, &aec_update->cfg, sizeof(DMS_FLEXIBLE_CONFIG));
|
||||
#else/*CVP_DNS_MODE*/
|
||||
ret = syscfg_read(CFG_DMS_DNS_FLEXIBLE_ID, &aec_update->cfg, sizeof(DMS_FLEXIBLE_CONFIG));
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
if (ret == sizeof(DMS_FLEXIBLE_CONFIG)) {
|
||||
aec_update->update = AEC_UPDATE_INIT;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
#else/*SINGLE MIC*/
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
|
||||
ret = syscfg_read(CFG_AEC_ID, &aec_update->cfg, sizeof(AEC_CONFIG));
|
||||
#else/*CVP_DNS_MODE*/
|
||||
ret = syscfg_read(CFG_SMS_DNS_ID, &aec_update->cfg, sizeof(AEC_CONFIG));
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
if (ret == sizeof(AEC_CONFIG)) {
|
||||
aec_update->update = AEC_UPDATE_INIT;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*return 1:有在线更新数据*/
|
||||
/*return 0:没有在线更新数据*/
|
||||
int aec_cfg_online_update_fill(void *cfg, u16 len)
|
||||
{
|
||||
if (aec_update && aec_update->update) {
|
||||
memcpy(cfg, &aec_update->cfg, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int aec_cfg_online_exit()
|
||||
{
|
||||
if (aec_update) {
|
||||
free(aec_update);
|
||||
aec_update = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_aec_config(u8 *buf, int version)
|
||||
{
|
||||
#if 1/*每次获取update的配置*/
|
||||
if (aec_update) {
|
||||
printf("cfg_size:%d\n", sizeof(aec_update->cfg));
|
||||
memcpy(buf, &aec_update->cfg, sizeof(aec_update->cfg));
|
||||
|
||||
#if (TCFG_AUDIO_DUAL_MIC_ENABLE == 0)
|
||||
AEC_CONFIG *cfg = (AEC_CONFIG *)buf;
|
||||
/*单麦aec_mode: app(旧)和pc端(兼容) */
|
||||
if (version == 0x01) {
|
||||
printf("APP version %d", version);
|
||||
if (aec_update->cfg.aec_mode & AGC_EN) {
|
||||
aec_update->agc_en = 1;
|
||||
} else {
|
||||
aec_update->agc_en = 0;
|
||||
}
|
||||
if ((aec_update->cfg.aec_mode & AEC_MODE_ADVANCE) == AEC_MODE_ADVANCE) {
|
||||
cfg->aec_mode = 2;
|
||||
} else if ((aec_update->cfg.aec_mode & AEC_MODE_ADVANCE) == AEC_MODE_REDUCE) {
|
||||
cfg->aec_mode = 1;
|
||||
} else {
|
||||
cfg->aec_mode = 0;
|
||||
}
|
||||
} else if (version == 0x02) {
|
||||
printf("PC version %d", version);
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
|
||||
return sizeof(aec_update->cfg);
|
||||
}
|
||||
return 0;
|
||||
#else/*每次获取原始配置*/
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
AEC_DMS_CONFIG cfg;
|
||||
int ret = syscfg_read(CFG_DMS_ID, &cfg, sizeof(AEC_DMS_CONFIG));
|
||||
if (ret == sizeof(AEC_DMS_CONFIG)) {
|
||||
memcpy(buf, &cfg, sizeof(AEC_DMS_CONFIG));
|
||||
return sizeof(AEC_DMS_CONFIG);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
AEC_CONFIG cfg;
|
||||
int ret = syscfg_read(CFG_AEC_ID, &cfg, sizeof(AEC_CONFIG));
|
||||
if (ret == sizeof(AEC_CONFIG)) {
|
||||
memcpy(buf, &cfg, sizeof(AEC_CONFIG));
|
||||
return sizeof(AEC_CONFIG);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
#endif
|
||||
}
|
||||
#endif /*TCFG_AEC_TOOL_ONLINE_ENABLE*/
|
||||
|
||||
/*
|
||||
***********************************************************************
|
||||
* 导出通话过程的数据
|
||||
*
|
||||
*
|
||||
***********************************************************************
|
||||
*/
|
||||
#if (TCFG_AUDIO_DATA_EXPORT_ENABLE == AUDIO_DATA_EXPORT_USE_SPP)
|
||||
enum {
|
||||
AEC_RECORD_COUNT = 0x200,
|
||||
AEC_RECORD_START,
|
||||
AEC_RECORD_STOP,
|
||||
ONLINE_OP_QUERY_RECORD_PACKAGE_LENGTH,
|
||||
};
|
||||
|
||||
enum {
|
||||
AEC_ST_INIT,
|
||||
AEC_ST_START,
|
||||
AEC_ST_STOP,
|
||||
};
|
||||
|
||||
#define AEC_RECORD_CH 2
|
||||
#define AEC_RECORD_MTU 200
|
||||
#define RECORD_CH0_LENGTH 644
|
||||
#define RECORD_CH1_LENGTH 644
|
||||
#define RECORD_CH2_LENGTH 644
|
||||
|
||||
typedef struct {
|
||||
u8 state;
|
||||
u8 ch; /*export data ch num*/
|
||||
u16 send_timer;
|
||||
u8 packet[256];
|
||||
} aec_record_t;
|
||||
aec_record_t *aec_rec = NULL;
|
||||
|
||||
typedef struct {
|
||||
int cmd;
|
||||
int data;
|
||||
} rec_cmd_t;
|
||||
|
||||
extern int audio_capture_start(void);
|
||||
extern void audio_capture_stop(void);
|
||||
static int aec_online_parse(u8 *packet, u8 size, u8 *ext_data, u16 ext_size)
|
||||
{
|
||||
int res_data = 0;
|
||||
rec_cmd_t rec_cmd;
|
||||
int err = 0;
|
||||
u8 parse_seq = ext_data[1];
|
||||
//AEC_ONLINE_LOG("aec_spp_rx,seq:%d,size:%d\n", parse_seq, size);
|
||||
//put_buf(packet, size);
|
||||
memcpy(&rec_cmd, packet, sizeof(rec_cmd_t));
|
||||
switch (rec_cmd.cmd) {
|
||||
case AEC_RECORD_COUNT:
|
||||
res_data = aec_rec->ch;
|
||||
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4);
|
||||
AEC_ONLINE_LOG("query record_ch num:%d\n", res_data);
|
||||
break;
|
||||
case AEC_RECORD_START:
|
||||
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
|
||||
aec_rec->state = AEC_ST_START;
|
||||
audio_capture_start();
|
||||
AEC_ONLINE_LOG("record_start\n");
|
||||
break;
|
||||
case AEC_RECORD_STOP:
|
||||
AEC_ONLINE_LOG("record_stop\n");
|
||||
audio_capture_stop();
|
||||
aec_rec->state = AEC_ST_STOP;
|
||||
app_online_db_ack(parse_seq, (u8 *)&res_data, 1); //该命令随便ack一个byte即可
|
||||
break;
|
||||
case ONLINE_OP_QUERY_RECORD_PACKAGE_LENGTH:
|
||||
if (rec_cmd.data == 0) {
|
||||
res_data = RECORD_CH0_LENGTH;
|
||||
} else if (rec_cmd.data == 1) {
|
||||
res_data = RECORD_CH1_LENGTH;
|
||||
} else {
|
||||
res_data = RECORD_CH2_LENGTH;
|
||||
}
|
||||
AEC_ONLINE_LOG("query record ch%d packet length:%d\n", rec_cmd.data, res_data);
|
||||
err = app_online_db_ack(parse_seq, (u8 *)&res_data, 4); //回复对应的通道数据长度
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void aec_export_timer(void *priv)
|
||||
{
|
||||
int err = 0;
|
||||
if (aec_rec->state) {
|
||||
putchar('.');
|
||||
#if 1
|
||||
static u8 data = 0;
|
||||
memset(aec_rec->packet, data, 128);
|
||||
data++;
|
||||
#endif
|
||||
err = app_online_db_send(DB_PKT_TYPE_DAT_CH0, aec_rec->packet, AEC_RECORD_MTU);
|
||||
if (err) {
|
||||
printf("w0_err:%d", err);
|
||||
}
|
||||
err = app_online_db_send(DB_PKT_TYPE_DAT_CH1, aec_rec->packet, AEC_RECORD_MTU);
|
||||
if (err) {
|
||||
printf("w1_err:%d", err);
|
||||
}
|
||||
} else {
|
||||
//putchar('S');
|
||||
}
|
||||
}
|
||||
|
||||
int spp_data_export(u8 ch, u8 *buf, u16 len)
|
||||
{
|
||||
u8 data_ch;
|
||||
if (aec_rec->state == AEC_ST_START) {
|
||||
putchar('.');
|
||||
if (ch == 0) {
|
||||
data_ch = DB_PKT_TYPE_DAT_CH0;
|
||||
} else if (ch == 1) {
|
||||
data_ch = DB_PKT_TYPE_DAT_CH1;
|
||||
} else {
|
||||
data_ch = DB_PKT_TYPE_DAT_CH2;
|
||||
}
|
||||
int err = app_online_db_send_more(data_ch, buf, len);
|
||||
if (err) {
|
||||
r_printf("tx_err:%d", err);
|
||||
//return -1;
|
||||
}
|
||||
return len;
|
||||
} else {
|
||||
//putchar('x');
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int aec_data_export_init(u8 ch)
|
||||
{
|
||||
aec_rec = zalloc(sizeof(aec_record_t));
|
||||
//aec_rec->send_timer = sys_timer_add(NULL, aec_export_timer, 16);
|
||||
aec_rec->ch = ch;
|
||||
app_online_db_register_handle(DB_PKT_TYPE_EXPORT, aec_online_parse);
|
||||
//app_online_db_register_handle(DB_PKT_TYPE_MIC_DUT, mic_dut_online_parse);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int aec_data_export_exit()
|
||||
{
|
||||
if (aec_rec) {
|
||||
if (aec_rec->send_timer) {
|
||||
sys_timer_del(aec_rec->send_timer);
|
||||
aec_rec->send_timer = 0;
|
||||
}
|
||||
free(aec_rec);
|
||||
aec_rec = NULL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif /*TCFG_AUDIO_DATA_EXPORT_ENABLE*/
|
||||
|
||||
#if 0
|
||||
static u8 aec_online_idle_query(void)
|
||||
{
|
||||
//return ((aec_rec == NULL) ? 1 : 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
REGISTER_LP_TARGET(aec_online_lp_target) = {
|
||||
.name = "aec_online",
|
||||
.is_idle = aec_online_idle_query,
|
||||
};
|
||||
#endif
|
||||
118
apps/earphone/aec/br28/audio_aec_online.h
Normal file
118
apps/earphone/aec/br28/audio_aec_online.h
Normal file
@ -0,0 +1,118 @@
|
||||
#ifndef _AUDIO_AEC_ONLINE_H_
|
||||
#define _AUDIO_AEC_ONLINE_H_
|
||||
|
||||
#include "generic/typedef.h"
|
||||
|
||||
/*
|
||||
*0x30xx:单mic降噪ANS
|
||||
*0x31xx:双mic降噪ANS
|
||||
*0x32xx:单mic降噪DNS
|
||||
*0x33xx:双mic降噪DNS
|
||||
*0x34xx:双mic话务耳机ANS
|
||||
*0x35xx:双mic话务耳机DNS
|
||||
*如果有版本更新,通过更新后两位来区分,比如:0x3001
|
||||
*/
|
||||
#define AEC_CFG_SMS 0x3000
|
||||
#define AEC_CFG_DMS 0x3100
|
||||
#define AEC_CFG_SMS_DNS 0x3200
|
||||
#define AEC_CFG_DMS_DNS 0x3300
|
||||
#define AEC_CFG_DMS_FLEXIBLE 0x3400
|
||||
#define AEC_CFG_DMS_FLEXIBLE_DNS 0x3500
|
||||
|
||||
//GENERAL_CONFIG:0x0000~0x0FFF
|
||||
enum {
|
||||
GENERAL_DAC = 0x0000,
|
||||
GENERAL_MIC,
|
||||
/*app端在线调试的enablebit;*/
|
||||
GENERAL_ModuleEnable,
|
||||
GENERAL_UL_EQ,
|
||||
GENERAL_Global_MinSuppress,
|
||||
|
||||
GENERAL_MIC_1,
|
||||
|
||||
/*pc端在线调试的enablebit;*/
|
||||
GENERAL_PC_ModuleEnable,
|
||||
};
|
||||
|
||||
//AEC_CONFIG:0x1000~0x2FFF
|
||||
enum {
|
||||
//dms
|
||||
AEC_ProcessMaxFreq = 0x1000,
|
||||
AEC_ProcessMinFreq,
|
||||
AEC_AF_Lenght,
|
||||
//sms
|
||||
AEC_DT_AGGRESS = 0x2000,
|
||||
AEC_REFENGTHR,
|
||||
};
|
||||
|
||||
//NLP_CONFIG:0x3000~0x4FFF
|
||||
enum {
|
||||
//dms
|
||||
NLP_ProcessMaxFreq = 0x3000,
|
||||
NLP_ProcessMinFreq,
|
||||
NLP_OverDrive,
|
||||
//sms
|
||||
NLP_AGGRESS_FACTOR = 0x4000,
|
||||
NLP_MIN_SUPPRESS,
|
||||
};
|
||||
|
||||
//ANS_CONFIG:0x5000~0x6FFF
|
||||
enum {
|
||||
//dms
|
||||
ANS_AggressFactor = 0x5000,
|
||||
ANS_MinSuppress,
|
||||
ANS_MicNoiseLevel,
|
||||
//sms
|
||||
ANS_AGGRESS = 0x6000,
|
||||
ANS_SUPPRESS,
|
||||
//DNS
|
||||
DNS_GainFloor = 0x6100,
|
||||
DNS_OverDrive,
|
||||
};
|
||||
|
||||
//AGC_CONFIG(common):0x7000~0x7FFF
|
||||
enum {
|
||||
AGC_NDT_FADE_IN = 0x7000,
|
||||
AGC_NDT_FADE_OUT,
|
||||
AGC_DT_FADE_IN,
|
||||
AGC_DT_FADE_OUT,
|
||||
AGC_NDT_MAX_GAIN,
|
||||
AGC_NDT_MIN_GAIN,
|
||||
AGC_NDT_SPEECH_THR,
|
||||
AGC_DT_MAX_GAIN,
|
||||
AGC_DT_MIN_GAIN,
|
||||
AGC_DT_SPEECH_THR,
|
||||
AGC_ECHO_PRESENT_THR,
|
||||
};
|
||||
|
||||
//ENC_CONFIG(only dms):0x8000~0x8FFF
|
||||
enum {
|
||||
ENC_Process_MaxFreq = 0x8000,
|
||||
ENC_Process_MinFreq,
|
||||
ENC_SIR_MaxFreq,
|
||||
ENC_MIC_Distance,
|
||||
ENC_Target_Signal_Degradation,
|
||||
ENC_AggressFactor,
|
||||
|
||||
ENC_MinSuppress,
|
||||
|
||||
ENC_Suppress_Pre,
|
||||
ENC_Suppress_Post,
|
||||
ENC_Disconverge_Thr,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int id; //参数id号
|
||||
union {//参数值(整形或者浮点)
|
||||
float val_float;
|
||||
int val_int;
|
||||
};
|
||||
} aec_online_t;
|
||||
|
||||
int aec_cfg_online_init();
|
||||
int aec_cfg_online_exit();
|
||||
int aec_cfg_online_update(int root_cmd, void *cfg);
|
||||
int aec_cfg_online_update_fill(void *cfg, u16 len);
|
||||
int get_aec_config(u8 *buf, int version);
|
||||
|
||||
#endif/*_AUDIO_AEC_ONLINE_H_*/
|
||||
1330
apps/earphone/aec/br28/audio_cvp_3mic.c
Normal file
1330
apps/earphone/aec/br28/audio_cvp_3mic.c
Normal file
File diff suppressed because it is too large
Load Diff
710
apps/earphone/aec/br28/audio_cvp_ais_3mic.c
Normal file
710
apps/earphone/aec/br28/audio_cvp_ais_3mic.c
Normal file
@ -0,0 +1,710 @@
|
||||
/*
|
||||
***************************************************************************
|
||||
* AISPEECH 3-Mic NR
|
||||
* Brief : 思必驰3mic通话降噪
|
||||
* By : GZR
|
||||
* Notes : 1.可用内存
|
||||
* (1)aec_hdl_mem: 静态变量
|
||||
* (2)free_ram: 动态内存(mem_stats:physics memory size xxxx bytes)
|
||||
* 2.demo默认将输入数据copy到输出,相关处理只需在运算函数
|
||||
* audio_aec_run()实现即可
|
||||
* 3.双mic ENC开发,只需打开对应板级以下配置即可:
|
||||
* #define TCFG_AUDIO_DUAL_MIC_ENABLE ENABLE_THIS_MOUDLE
|
||||
* 4.建议算法开发者使用宏定义将自己的代码模块包起来
|
||||
* 5.算法处理完的数据,如有需要,可以增加EQ处理:AEC_UL_EQ_EN
|
||||
* 6.开发阶段,默认使用芯片最高主频160MHz,可以通过修改AEC_CLK来修改
|
||||
运行频率。
|
||||
***************************************************************************
|
||||
*/
|
||||
#include "aec_user.h"
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "application/eq_config.h"
|
||||
#include "circular_buf.h"
|
||||
#include "overlay_code.h"
|
||||
#include "audio_config.h"
|
||||
#include "debug.h"
|
||||
#include "audio_gain_process.h"
|
||||
#ifdef CONFIG_BOARD_AISPEECH_NR
|
||||
#include "aispeech_enc.h"
|
||||
#endif /*CONFIG_BOARD_AISPEECH_NR*/
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
#include "audio_cvp_dut.h"
|
||||
#endif // TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
|
||||
#if defined(TCFG_CVP_DEVELOP_ENABLE) && (TCFG_CVP_DEVELOP_ENABLE == CVP_CFG_AIS_3MIC)
|
||||
|
||||
#define AEC_CLK (160 * 1000000L) /*模块运行时钟(MaxFre:160MHz)*/
|
||||
#define AEC_FRAME_POINTS 256 /*AEC处理帧长,跟mic采样长度关联*/
|
||||
#define AEC_FRAME_SIZE (AEC_FRAME_POINTS << 1)
|
||||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
#define AEC_MIC_NUM 3 /*3 mic*/
|
||||
#elif TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#define AEC_MIC_NUM 2 /*双mic*/
|
||||
#else
|
||||
#define AEC_MIC_NUM 1 /*单mic*/
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
|
||||
/*上行数据eq*/
|
||||
#define AEC_UL_EQ_EN 0
|
||||
|
||||
#define AEC_USER_MALLOC_ENABLE 1 /*是否使用动态内存*/
|
||||
|
||||
/*数据输出开头丢掉的数据包数*/
|
||||
#define CVP_OUT_DUMP_PACKET 15
|
||||
|
||||
#ifdef AUDIO_PCM_DEBUG
|
||||
/*AEC串口数据导出*/
|
||||
const u8 CONST_AEC_EXPORT = 1;
|
||||
#else
|
||||
const u8 CONST_AEC_EXPORT = 0;
|
||||
#endif/*AUDIO_PCM_DEBUG*/
|
||||
|
||||
//*********************************************************************************//
|
||||
// 预处理配置(Pre-process Config) //
|
||||
//*********************************************************************************//
|
||||
/*预增益配置*/
|
||||
#define CVP_PRE_GAIN_ENABLE 0 //算法处理前预加数字增益放大使能
|
||||
#define CVP_PRE_GAIN 6.f //算法前处理数字增益(Gain = 10^(dB_diff/20))
|
||||
|
||||
extern float usb_audio_mic_get_dig_gain(void);
|
||||
extern int audio_dac_read_reset(void);
|
||||
extern int audio_dac_read(s16 points_offset, void *data, int len, u8 read_channel);
|
||||
extern void esco_enc_resume(void);
|
||||
extern int aec_uart_init();
|
||||
extern int aec_uart_open(u8 nch, u16 single_size);
|
||||
extern int aec_uart_fill(u8 ch, void *buf, u16 size);
|
||||
extern void aec_uart_write(void);
|
||||
extern int aec_uart_close(void);
|
||||
|
||||
/*AEC输入buf复用mic_adc采样buf*/
|
||||
#define MIC_BULK_MAX 3
|
||||
struct mic_bulk {
|
||||
struct list_head entry;
|
||||
s16 *addr;
|
||||
u16 len;
|
||||
u16 used;
|
||||
};
|
||||
|
||||
struct audio_aec_hdl {
|
||||
volatile u8 start; //aec模块状态
|
||||
u8 output_fade_in; //aec输出淡入使能
|
||||
u8 output_fade_in_gain; //aec输出淡入增益
|
||||
u8 output_sel; //数据输出通道选择
|
||||
u16 dump_packet; //前面如果有杂音,丢掉几包
|
||||
volatile u8 busy;
|
||||
u8 output_buf[1000]; //aec数据输出缓存
|
||||
cbuffer_t output_cbuf;
|
||||
s16 *mic; /*主mic数据地址*/
|
||||
s16 *mic_ref; /*参考mic数据地址*/
|
||||
s16 *mic_ref_1; /*参考mic数据地址*/
|
||||
s16 spk_ref[AEC_FRAME_POINTS]; /*扬声器参考数据*/
|
||||
s16 out[AEC_FRAME_POINTS]; /*运算输出地址*/
|
||||
OS_SEM sem;
|
||||
/*数据复用相关数据结构*/
|
||||
struct mic_bulk in_bulk[MIC_BULK_MAX];
|
||||
struct mic_bulk inref_bulk[MIC_BULK_MAX];
|
||||
struct mic_bulk inref_1_bulk[MIC_BULK_MAX];
|
||||
struct list_head in_head;
|
||||
struct list_head inref_head;
|
||||
struct list_head inref_1_head;
|
||||
#if AEC_UL_EQ_EN
|
||||
struct audio_eq *ul_eq;
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
int (*output_handle)(s16 *dat, u16 len);
|
||||
s16 *free_ram; /*当前可用内存*/
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
struct audio_aec_hdl *aec_hdl = NULL;
|
||||
#else
|
||||
struct audio_aec_hdl aec_handle;
|
||||
struct audio_aec_hdl *aec_hdl = &aec_handle;
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Read
|
||||
* Description: 读取aec模块的输出数据
|
||||
* Arguments : buf 读取数据存放地址
|
||||
* len 读取数据长度
|
||||
* Return : 数据读取长度
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_output_read(s16 *buf, u16 len)
|
||||
{
|
||||
//printf("rlen:%d-%d\n",len,aec_hdl.output_cbuf.data_len);
|
||||
local_irq_disable();
|
||||
if (!aec_hdl || !aec_hdl->start) {
|
||||
printf("audio_aec close now");
|
||||
local_irq_enable();
|
||||
return -EINVAL;
|
||||
}
|
||||
u16 rlen = cbuf_read(&aec_hdl->output_cbuf, buf, len);
|
||||
if (rlen == 0) {
|
||||
//putchar('N');
|
||||
}
|
||||
local_irq_enable();
|
||||
return rlen;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Handle
|
||||
* Description: AEC模块数据输出回调
|
||||
* Arguments : data 输出数据地址
|
||||
* len 输出数据长度
|
||||
* Return : 数据输出消耗长度
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
static int audio_aec_output(s16 *data, u16 len)
|
||||
{
|
||||
u16 wlen = 0;
|
||||
float dig_gain;
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
if (aec_hdl->dump_packet) {
|
||||
aec_hdl->dump_packet--;
|
||||
memset(data, 0, len);
|
||||
} else {
|
||||
if (aec_hdl->output_fade_in) {
|
||||
s32 tmp_data;
|
||||
//printf("fade:%d\n",aec_hdl->output_fade_in_gain);
|
||||
for (int i = 0; i < len / 2; i++) {
|
||||
tmp_data = data[i];
|
||||
data[i] = tmp_data * aec_hdl->output_fade_in_gain >> 7;
|
||||
}
|
||||
aec_hdl->output_fade_in_gain += 12;
|
||||
if (aec_hdl->output_fade_in_gain >= 128) {
|
||||
aec_hdl->output_fade_in = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wlen = cbuf_write(&aec_hdl->output_cbuf, data, len);
|
||||
//printf("wlen:%d-%d\n",len,aec_hdl.output_cbuf.data_len);
|
||||
if (wlen != len) {
|
||||
printf("aec_out_full:%d,%d\n", len, wlen);
|
||||
}
|
||||
esco_enc_resume();
|
||||
}
|
||||
return wlen;
|
||||
}
|
||||
|
||||
/*
|
||||
*跟踪系统内存使用情况:physics memory size xxxx bytes
|
||||
*正常的系统运行过程,应该至少有3k bytes的剩余空间给到系统调度开销
|
||||
*/
|
||||
static void sys_memory_trace(void)
|
||||
{
|
||||
static int cnt = 0;
|
||||
if (cnt++ > 200) {
|
||||
cnt = 0;
|
||||
mem_stats();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC RUN
|
||||
* Description: AEC数据处理核心
|
||||
* Arguments : in 主mic数据
|
||||
* inref 参考mic数据(双mic降噪有用)
|
||||
* ref speaker参考数据
|
||||
* out 数据输出
|
||||
* Return : 数据运算输出长度
|
||||
* Note(s) : 在这里实现AEC_core
|
||||
*********************************************************************
|
||||
*/
|
||||
static int audio_aec_run(s16 *in, s16 *inref, s16 *inref1, s16 *ref, s16 *out, u16 points)
|
||||
{
|
||||
int out_size = 0;
|
||||
putchar('.');
|
||||
|
||||
#if CVP_PRE_GAIN_ENABLE
|
||||
GainProcess_16Bit(in, in, CVP_PRE_GAIN, 1, 1, 1, points);
|
||||
GainProcess_16Bit(inref, inref, CVP_PRE_GAIN, 1, 1, 1, points);
|
||||
// GainProcess_16Bit_test(inref1, inref1, 0.f, 1, 1, 1, points);
|
||||
#endif/*CVP_PRE_GAIN_ENABLE*/
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_NR
|
||||
out_size = Aispeech_NR_run(in, inref, inref1, ref, out, points);
|
||||
#else
|
||||
memcpy(out, in, (points << 1));
|
||||
//memcpy(out, inref, (points << 1));
|
||||
out_size = points << 1;
|
||||
#endif /*CONFIG_BOARD_AISPEECH_NR*/
|
||||
|
||||
#if AEC_UL_EQ_EN
|
||||
if (aec_hdl->ul_eq) {
|
||||
audio_eq_run(aec_hdl->ul_eq, out, out_size);
|
||||
}
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
switch (aec_hdl->output_sel) {
|
||||
case CVP_3MIC_OUTPUT_SEL_MASTER:
|
||||
memcpy(out, in, (points << 1));
|
||||
break;
|
||||
case CVP_3MIC_OUTPUT_SEL_SLAVE:
|
||||
memcpy(out, inref, (points << 1));
|
||||
break;
|
||||
case CVP_3MIC_OUTPUT_SEL_FBMIC:
|
||||
memcpy(out, inref1, (points << 1));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
sys_memory_trace();
|
||||
return out_size;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Task
|
||||
* Description: AEC任务
|
||||
* Arguments : priv 私用参数
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
static void audio_aec_task(void *priv)
|
||||
{
|
||||
printf("==Audio AEC Task==\n");
|
||||
struct mic_bulk *bulk = NULL;
|
||||
struct mic_bulk *bulk_ref = NULL;
|
||||
struct mic_bulk *bulk_ref_1 = NULL;
|
||||
u8 pend = 1;
|
||||
while (1) {
|
||||
if (pend) {
|
||||
os_sem_pend(&aec_hdl->sem, 0);
|
||||
}
|
||||
pend = 1;
|
||||
if (aec_hdl->start) {
|
||||
if (!list_empty(&aec_hdl->in_head)) {
|
||||
aec_hdl->busy = 1;
|
||||
local_irq_disable();
|
||||
/*1.获取主mic数据*/
|
||||
bulk = list_first_entry(&aec_hdl->in_head, struct mic_bulk, entry);
|
||||
list_del(&bulk->entry);
|
||||
aec_hdl->mic = bulk->addr;
|
||||
#if (AEC_MIC_NUM > 1)
|
||||
/*2.获取参考mic数据*/
|
||||
bulk_ref = list_first_entry(&aec_hdl->inref_head, struct mic_bulk, entry);
|
||||
list_del(&bulk_ref->entry);
|
||||
aec_hdl->mic_ref = bulk_ref->addr;
|
||||
#endif/*Dual_Microphone*/
|
||||
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
/*获取参考mic1数据*/
|
||||
bulk_ref_1 = list_first_entry(&aec_hdl->inref_1_head, struct mic_bulk, entry);
|
||||
list_del(&bulk_ref_1->entry);
|
||||
aec_hdl->mic_ref_1 = bulk_ref_1->addr;
|
||||
#endif/*3_Microphone*/
|
||||
|
||||
local_irq_enable();
|
||||
/*3.获取speaker参考数据*/
|
||||
audio_dac_read(60, aec_hdl->spk_ref, AEC_FRAME_SIZE, 1);
|
||||
|
||||
/*4.算法处理*/
|
||||
int out_len = audio_aec_run(aec_hdl->mic, aec_hdl->mic_ref, aec_hdl->mic_ref_1, aec_hdl->spk_ref, aec_hdl->out, AEC_FRAME_POINTS);
|
||||
|
||||
/*5.结果输出*/
|
||||
if (aec_hdl->output_handle) {
|
||||
aec_hdl->output_handle(aec_hdl->out, out_len);
|
||||
}
|
||||
|
||||
/*6.数据导出*/
|
||||
if (CONST_AEC_EXPORT) {
|
||||
aec_uart_fill(0, aec_hdl->mic, 512); //主mic数据
|
||||
aec_uart_fill(1, aec_hdl->mic_ref, 512); //副mic数据
|
||||
aec_uart_fill(2, aec_hdl->spk_ref, 512); //扬声器数据
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
aec_uart_fill(2, aec_hdl->mic_ref_1, 512); //扬声器数据
|
||||
aec_uart_fill(3, aec_hdl->spk_ref, 512); //扬声器数据
|
||||
aec_uart_fill(4, aec_hdl->out, out_len); //算法运算结果
|
||||
#endif /*3_Microphone*/
|
||||
aec_uart_write();
|
||||
}
|
||||
bulk->used = 0;
|
||||
#if (AEC_MIC_NUM > 1)
|
||||
bulk_ref->used = 0;
|
||||
#endif/*Dual_Microphone*/
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
bulk_ref_1->used = 0;
|
||||
#endif /*3_Microphone*/
|
||||
aec_hdl->busy = 0;
|
||||
pend = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Open
|
||||
* Description: 初始化AEC模块
|
||||
* Arguments : sr 采样率(8000/16000)
|
||||
* enablebit 使能模块(AEC/NLP/AGC/ANS...)
|
||||
* out_hdl 自定义回调函数,NULL则用默认的回调
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : 该接口是对audio_aec_init的扩展,支持自定义使能模块以及
|
||||
* 数据输出回调函数
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_open(u16 sample_rate, s16 enablebit, int (*out_hdl)(s16 *data, u16 len))
|
||||
{
|
||||
printf("audio_aec_open,sr = %d\n", sample_rate);
|
||||
mem_stats();
|
||||
if (aec_hdl) {
|
||||
printf("audio aec is already open!\n");
|
||||
return -1;
|
||||
}
|
||||
overlay_load_code(OVERLAY_AEC);
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
aec_hdl = zalloc(sizeof(struct audio_aec_hdl));
|
||||
if (aec_hdl == NULL) {
|
||||
printf("aec_hdl malloc failed");
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
|
||||
aec_hdl->dump_packet = CVP_OUT_DUMP_PACKET;
|
||||
aec_hdl->output_fade_in = 1;
|
||||
aec_hdl->output_fade_in_gain = 0;
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
aec_hdl->output_sel = CVP_3MIC_OUTPUT_SEL_DEFAULT;
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
aec_hdl->output_handle = audio_aec_output;
|
||||
|
||||
printf("aec_hdl size:%d\n", sizeof(struct audio_aec_hdl));
|
||||
clk_set("sys", AEC_CLK);
|
||||
INIT_LIST_HEAD(&aec_hdl->in_head);
|
||||
INIT_LIST_HEAD(&aec_hdl->inref_head);
|
||||
INIT_LIST_HEAD(&aec_hdl->inref_1_head);
|
||||
cbuf_init(&aec_hdl->output_cbuf, aec_hdl->output_buf, sizeof(aec_hdl->output_buf));
|
||||
if (CONST_AEC_EXPORT) {
|
||||
#if (AEC_MIC_NUM > 2)
|
||||
aec_uart_open(5, 512);
|
||||
#elif (AEC_MIC_NUM > 1)
|
||||
aec_uart_open(3, 512);
|
||||
#endif /*AEC_MIC_NUM*/
|
||||
}
|
||||
|
||||
if (out_hdl) {
|
||||
aec_hdl->output_handle = out_hdl;
|
||||
}
|
||||
|
||||
#if AEC_UL_EQ_EN
|
||||
struct audio_eq_param ul_eq_param = {0};
|
||||
ul_eq_param.sr = sample_rate;
|
||||
ul_eq_param.channels = 1;
|
||||
ul_eq_param.online_en = 1;
|
||||
ul_eq_param.mode_en = 0;
|
||||
ul_eq_param.remain_en = 0;
|
||||
ul_eq_param.max_nsection = EQ_SECTION_MAX;
|
||||
ul_eq_param.cb = aec_ul_eq_filter;
|
||||
ul_eq_param.eq_name = aec_eq_mode;
|
||||
aec_hdl->ul_eq = audio_dec_eq_open(&ul_eq_param);
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
os_sem_create(&aec_hdl->sem, 0);
|
||||
task_create(audio_aec_task, NULL, "aec");
|
||||
audio_dac_read_reset();
|
||||
aec_hdl->start = 1;
|
||||
|
||||
mem_stats();
|
||||
#ifdef MUX_RX_BULK_TEST_DEMO
|
||||
mux_rx_bulk_test = zalloc_mux_rx_bulk(MUX_RX_BULK_MAX);
|
||||
if (mux_rx_bulk_test) {
|
||||
printf("mux_rx_bulk_test:0x%x\n", mux_rx_bulk_test);
|
||||
free_mux_rx_bulk(mux_rx_bulk_test);
|
||||
mux_rx_bulk_test = NULL;
|
||||
}
|
||||
#endif/*MUX_RX_BULK_TEST_DEMO*/
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_NR
|
||||
u32 memPoolLen = Aispeech_NR_getmemsize(sample_rate);
|
||||
printf("ais memPoolLen=%d\r\n", memPoolLen);
|
||||
extern char *SEVC_API_Version();
|
||||
printf("--------------version %s ---\r\n", SEVC_API_Version());
|
||||
|
||||
aec_hdl->free_ram = malloc(memPoolLen);
|
||||
|
||||
char *pcMemPool = (char *)aec_hdl->free_ram;
|
||||
if (NULL == pcMemPool) {
|
||||
printf("ais calloc fail \r\n");
|
||||
return -1;
|
||||
}
|
||||
printf("ais pcMemPool malloc ok\r\n");
|
||||
Aispeech_NR_init(pcMemPool, memPoolLen, sample_rate);
|
||||
#endif /*CONFIG_BOARD_AISPEECH_NR*/
|
||||
|
||||
printf("audio_aec_open succ\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Init
|
||||
* Description: 初始化AEC模块
|
||||
* Arguments : sample_rate 采样率(8000/16000)
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_init(u16 sample_rate)
|
||||
{
|
||||
return audio_aec_open(sample_rate, -1, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Reboot
|
||||
* Description: AEC模块复位接口
|
||||
* Arguments : reduce 复位/恢复标志
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_reboot(u8 reduce)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Close
|
||||
* Description: 关闭AEC模块
|
||||
* Arguments : None.
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_close(void)
|
||||
{
|
||||
printf("audio_aec_close:%x", (u32)aec_hdl);
|
||||
if (aec_hdl) {
|
||||
aec_hdl->start = 0;
|
||||
while (aec_hdl->busy) {
|
||||
os_time_dly(2);
|
||||
}
|
||||
task_kill("aec");
|
||||
if (CONST_AEC_EXPORT) {
|
||||
aec_uart_close();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_NR
|
||||
Aispeech_NR_deinit();
|
||||
if (aec_hdl->free_ram) {
|
||||
free(aec_hdl->free_ram);
|
||||
}
|
||||
#endif /*CONFIG_BOARD_AISPEECH_NR*/
|
||||
|
||||
#if AEC_UL_EQ_EN
|
||||
if (aec_hdl->ul_eq) {
|
||||
audio_dec_eq_close(aec_hdl->ul_eq);
|
||||
aec_hdl->ul_eq = NULL;
|
||||
}
|
||||
#endif/*AEC_UL_EQ_EN*/
|
||||
|
||||
local_irq_disable();
|
||||
#if AEC_USER_MALLOC_ENABLE
|
||||
free(aec_hdl);
|
||||
#endif /*AEC_USER_MALLOC_ENABLE*/
|
||||
aec_hdl = NULL;
|
||||
local_irq_enable();
|
||||
printf("audio_aec_close succ\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Status
|
||||
* Description: AEC模块当前状态
|
||||
* Arguments : None.
|
||||
* Return : 0 关闭 其他 打开
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
u8 audio_aec_status(void)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
return aec_hdl->start;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input
|
||||
* Description: AEC源数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 输入一帧数据,唤醒一次运行任务处理数据,默认帧长256点
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->in_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if TCFG_AUDIO_CVP_DUT_ENABLE
|
||||
if (cvp_dut_mode_get() == CVP_DUT_MODE_BYPASS) {
|
||||
audio_aec_output(buf, len);
|
||||
return;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_CVP_DUT_ENABLE*/
|
||||
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->in_bulk[i].addr = buf;
|
||||
aec_hdl->in_bulk[i].used = 0x55;
|
||||
aec_hdl->in_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->in_bulk[i].entry, &aec_hdl->in_head);
|
||||
} else {
|
||||
printf(">>>aec_in_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->in_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
os_sem_set(&aec_hdl->sem, 0);
|
||||
os_sem_post(&aec_hdl->sem);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input Reference
|
||||
* Description: AEC源参考数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 双mic ENC的参考mic数据输入,单mic的无须调用该接口
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf_ref(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->inref_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->inref_bulk[i].addr = buf;
|
||||
aec_hdl->inref_bulk[i].used = 0x55;
|
||||
aec_hdl->inref_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->inref_bulk[i].entry, &aec_hdl->inref_head);
|
||||
} else {
|
||||
printf(">>>aec_inref_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->inref_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Input Reference
|
||||
* Description: AEC源参考数据输入
|
||||
* Arguments : buf 输入源数据地址
|
||||
* len 输入源数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 双mic ENC的参考mic数据输入,单mic的无须调用该接口
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_inbuf_ref_1(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
int i = 0;
|
||||
for (i = 0; i < MIC_BULK_MAX; i++) {
|
||||
if (aec_hdl->inref_1_bulk[i].used == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i < MIC_BULK_MAX) {
|
||||
aec_hdl->inref_1_bulk[i].addr = buf;
|
||||
aec_hdl->inref_1_bulk[i].used = 0x55;
|
||||
aec_hdl->inref_1_bulk[i].len = len;
|
||||
list_add_tail(&aec_hdl->inref_1_bulk[i].entry, &aec_hdl->inref_1_head);
|
||||
} else {
|
||||
printf(">>>aec_inref_1_full\n");
|
||||
/*align reset*/
|
||||
struct mic_bulk *bulk;
|
||||
list_for_each_entry(bulk, &aec_hdl->inref_1_head, entry) {
|
||||
bulk->used = 0;
|
||||
__list_del_entry(&bulk->entry);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Reference
|
||||
* Description: AEC模块参考数据输入
|
||||
* Arguments : buf 输入参考数据地址
|
||||
* len 输入参考数据长度
|
||||
* Return : None.
|
||||
* Note(s) : 声卡设备是DAC,默认不用外部提供参考数据
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_refbuf(s16 *buf, u16 len)
|
||||
{
|
||||
if (aec_hdl && aec_hdl->start) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Sel
|
||||
* Description: AEC输出数据选择
|
||||
* Arguments : sel 选择输出/算法输出/talk/ff/fb原始数据
|
||||
* agc NULL
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_output_sel(CVP_OUTPUT_ENUM sel, u8 agc)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
aec_hdl->output_sel = sel;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Toggle Set
|
||||
* Description: AEC模块算法开关使能
|
||||
* Arguments : toggle 0 关闭算法 1 打开算法
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_toggle_set(u8 toggle)
|
||||
{
|
||||
if (aec_hdl) {
|
||||
aec_hdl->output_sel = (toggle) ? 0 : 1;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /*TCFG_CVP_DEVELOP_ENABLE*/
|
||||
1530
apps/earphone/app_ancbox.c
Normal file
1530
apps/earphone/app_ancbox.c
Normal file
File diff suppressed because it is too large
Load Diff
1023
apps/earphone/app_anctool.c
Normal file
1023
apps/earphone/app_anctool.c
Normal file
File diff suppressed because it is too large
Load Diff
459
apps/earphone/app_main.c
Normal file
459
apps/earphone/app_main.c
Normal file
@ -0,0 +1,459 @@
|
||||
#include "system/includes.h"
|
||||
/*#include "btcontroller_config.h"*/
|
||||
#include "btstack/btstack_task.h"
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
#include "asm/pwm_led.h"
|
||||
#include "tone_player.h"
|
||||
#include "ui_manage.h"
|
||||
#include "gpio.h"
|
||||
#include "app_main.h"
|
||||
#include "asm/charge.h"
|
||||
#include "update.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "audio_config.h"
|
||||
#include "app_charge.h"
|
||||
#include "bt_profile_cfg.h"
|
||||
#include "dev_manager/dev_manager.h"
|
||||
#include "update_loader_download.h"
|
||||
|
||||
#ifndef CONFIG_MEDIA_NEW_ENABLE
|
||||
#ifndef CONFIG_MEDIA_DEVELOP_ENABLE
|
||||
#include "audio_dec_server.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif
|
||||
|
||||
#define LOG_TAG_CONST APP
|
||||
#define LOG_TAG "[APP]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
|
||||
u8 user_at_cmd_send_support = 1;
|
||||
#endif
|
||||
|
||||
/*任务列表 */
|
||||
const struct task_info task_info_table[] = {
|
||||
{"app_core", 1, 0, 768, 256 },
|
||||
{"sys_event", 7, 0, 256, 0 },
|
||||
{"systimer", 7, 0, 128, 0 },
|
||||
{"btctrler", 4, 0, 512, 384 },
|
||||
{"btencry", 1, 0, 512, 128 },
|
||||
{"tws", 5, 0, 512, 128 },
|
||||
#if (BT_FOR_APP_EN)
|
||||
{"btstack", 3, 0, 1024, 256 },
|
||||
#else
|
||||
{"btstack", 3, 0, 768, 256 },
|
||||
#endif
|
||||
// {"audio_dec", 5, 0, 800, 128 },
|
||||
// {"aud_effect", 5, 1, 800, 128 },
|
||||
/*
|
||||
*为了防止dac buf太大,通话一开始一直解码,
|
||||
*导致编码输入数据需要很大的缓存,这里提高编码的优先级
|
||||
*/
|
||||
// {"audio_enc", 6, 0, 768, 128 },
|
||||
// {"aec", 2, 1, 768, 128 },
|
||||
#if TCFG_AUDIO_HEARING_AID_ENABLE
|
||||
{"HearingAid", 6, 0, 768, 128 },
|
||||
#endif/*TCFG_AUDIO_HEARING_AID_ENABLE*/
|
||||
#ifdef CONFIG_BOARD_AISPEECH_NR
|
||||
{"aispeech_enc", 2, 1, 512, 128 },
|
||||
#endif /*CONFIG_BOARD_AISPEECH_NR*/
|
||||
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
|
||||
{"asr", 1, 0, 768, 128 },
|
||||
{"audio_asr_export_task", 1, 0, 512, 128 },
|
||||
#endif/*CONFIG_BOARD_AISPEECH_VAD_ASR*/
|
||||
#ifndef CONFIG_256K_FLASH
|
||||
{"aec_dbg", 3, 0, 128, 128 },
|
||||
|
||||
#if AUDIO_ENC_MPT_SELF_ENABLE
|
||||
{"enc_mpt_self", 3, 0, 512, 128 },
|
||||
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
||||
{"update", 1, 0, 256, 0 },
|
||||
{"tws_ota", 2, 0, 256, 0 },
|
||||
{"tws_ota_msg", 2, 0, 256, 128 },
|
||||
{"dw_update", 2, 0, 256, 128 },
|
||||
{"rcsp_task", 2, 0, 640, 128 },
|
||||
// {"aud_capture", 4, 0, 512, 256 },
|
||||
// {"data_export", 5, 0, 512, 256 },
|
||||
// {"anc", 3, 1, 512, 128 },
|
||||
#endif
|
||||
|
||||
#if TCFG_GX8002_NPU_ENABLE
|
||||
{"gx8002", 2, 0, 256, 64 },
|
||||
#endif /* #if TCFG_GX8002_NPU_ENABLE */
|
||||
#if TCFG_GX8002_ENC_ENABLE
|
||||
{"gx8002_enc", 2, 0, 128, 64 },
|
||||
#endif /* #if TCFG_GX8002_ENC_ENABLE */
|
||||
|
||||
|
||||
#if TCFG_KWS_VOICE_RECOGNITION_ENABLE
|
||||
{"kws", 2, 0, 256, 64 },
|
||||
#endif /* #if TCFG_KWS_VOICE_RECOGNITION_ENABLE */
|
||||
// {"usb_msd", 1, 0, 512, 128 },
|
||||
#if !TCFG_USB_MIC_CVP_ENABLE
|
||||
// {"usbmic_write", 2, 0, 256, 128 },
|
||||
#endif
|
||||
#if AI_APP_PROTOCOL
|
||||
{"app_proto", 2, 0, 768, 64 },
|
||||
#endif
|
||||
#if (TCFG_SPI_LCD_ENABLE||TCFG_SIMPLE_LCD_ENABLE)
|
||||
{"ui", 2, 0, 768, 256 },
|
||||
#else
|
||||
// {"ui", 3, 0, 384 - 64, 128 },
|
||||
#endif
|
||||
#if (TCFG_DEV_MANAGER_ENABLE)
|
||||
{"dev_mg", 3, 0, 512, 512 },
|
||||
#endif
|
||||
// {"audio_vad", 1, 1, 512, 128 },
|
||||
#if TCFG_KEY_TONE_EN
|
||||
{"key_tone", 5, 0, 256, 32 },
|
||||
#endif
|
||||
#if (TCFG_WIRELESS_MIC_ENABLE)
|
||||
{"wl_mic_enc", 2, 0, 768, 128 },
|
||||
#endif
|
||||
#if (TUYA_DEMO_EN)
|
||||
{"user_deal", 7, 0, 512, 512 },//定义线程 tuya任务调度
|
||||
{"dw_update", 2, 0, 256, 128 },
|
||||
#endif
|
||||
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
|
||||
{"imu_trim", 1, 0, 256, 128 },
|
||||
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
|
||||
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
|
||||
{"speak_to_chat", 2, 0, 256, 128 },
|
||||
{"icsd_adt", 2, 0, 512, 128 },
|
||||
{"icsd_src", 2, 1, 512, 128 },
|
||||
#endif /*TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/
|
||||
{"pmu_task", 6, 0, 256, 128 },
|
||||
// {"WindDetect", 2, 0, 256, 128 },
|
||||
{0, 0},
|
||||
};
|
||||
|
||||
|
||||
APP_VAR app_var;
|
||||
|
||||
/*
|
||||
* 2ms timer中断回调函数
|
||||
*/
|
||||
void timer_2ms_handler()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void app_var_init(void)
|
||||
{
|
||||
memset((u8 *)&bt_user_priv_var, 0, sizeof(BT_USER_PRIV_VAR));
|
||||
app_var.play_poweron_tone = 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void app_earphone_play_voice_file(const char *name);
|
||||
|
||||
void clr_wdt(void);
|
||||
|
||||
void check_power_on_key(void)
|
||||
{
|
||||
u32 delay_10ms_cnt = 0;
|
||||
|
||||
#if 0 //PC_MODE_DETECTION
|
||||
gpio_set_pull_up(IO_PORTP_00, 0);
|
||||
gpio_set_pull_down(IO_PORTP_00, 1);
|
||||
gpio_set_direction(IO_PORTP_00, 1);
|
||||
gpio_set_die(IO_PORTP_00, 1);
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
clr_wdt();
|
||||
os_time_dly(1);
|
||||
|
||||
extern u8 get_power_on_status(void);
|
||||
if (get_power_on_status()) {
|
||||
log_info("+");
|
||||
delay_10ms_cnt++;
|
||||
if (delay_10ms_cnt > 70) {
|
||||
/* extern void set_key_poweron_flag(u8 flag); */
|
||||
/* set_key_poweron_flag(1); */
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
log_info("-");
|
||||
delay_10ms_cnt = 0;
|
||||
log_info("enter softpoweroff\n");
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extern int cpu_reset_by_soft();
|
||||
extern int audio_dec_init();
|
||||
extern int audio_enc_init();
|
||||
|
||||
|
||||
|
||||
__attribute__((weak))
|
||||
u8 get_charge_online_flag(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*充电拔出,CPU软件复位, 不检测按键,直接开机*/
|
||||
static void app_poweron_check(int update)
|
||||
{
|
||||
#if (CONFIG_BT_MODE == BT_NORMAL)
|
||||
if (!update && cpu_reset_by_soft()) {
|
||||
app_var.play_poweron_tone = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
#if TCFG_CHARGE_OFF_POWERON_NE
|
||||
if (is_ldo5v_wakeup()) {
|
||||
app_var.play_poweron_tone = 0;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
//#ifdef CONFIG_RELEASE_ENABLE
|
||||
#if TCFG_POWER_ON_NEED_KEY
|
||||
check_power_on_key();
|
||||
#endif
|
||||
//#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
extern u32 timer_get_ms(void);
|
||||
|
||||
void app_main()
|
||||
{
|
||||
|
||||
void xtell_app_main();
|
||||
xtell_app_main();
|
||||
#if 0
|
||||
int update = 0;
|
||||
u32 addr = 0, size = 0;
|
||||
struct intent it;
|
||||
|
||||
#if (defined(CONFIG_MEDIA_NEW_ENABLE) || (defined(CONFIG_MEDIA_DEVELOP_ENABLE)))
|
||||
/*解码器*/
|
||||
audio_enc_init();
|
||||
audio_dec_init();
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef BT_DUT_INTERFERE
|
||||
void audio_demo(void);
|
||||
audio_demo();
|
||||
#endif/*BT_DUT_INTERFERE*/
|
||||
#ifdef BT_DUT_ADC_INTERFERE
|
||||
void audio_adc_mic_dut_open(void);
|
||||
audio_adc_mic_dut_open();
|
||||
#endif/*BT_DUT_ADC_INTERFERE*/
|
||||
|
||||
if (!UPDATE_SUPPORT_DEV_IS_NULL()) {
|
||||
update = update_result_deal();
|
||||
}
|
||||
|
||||
app_var_init();
|
||||
|
||||
#if TCFG_MC_BIAS_AUTO_ADJUST
|
||||
mc_trim_init(update);
|
||||
#endif/*TCFG_MC_BIAS_AUTO_ADJUST*/
|
||||
|
||||
if (get_charge_online_flag()) {
|
||||
|
||||
#if(TCFG_SYS_LVD_EN == 1)
|
||||
vbat_check_init();
|
||||
#endif
|
||||
|
||||
init_intent(&it);
|
||||
it.name = "idle";
|
||||
it.action = ACTION_IDLE_MAIN;
|
||||
start_app(&it);
|
||||
} else {
|
||||
check_power_on_voltage();
|
||||
|
||||
app_poweron_check(update);
|
||||
|
||||
ui_manage_init();
|
||||
ui_update_status(STATUS_POWERON);
|
||||
|
||||
#if TCFG_WIRELESS_MIC_ENABLE
|
||||
extern void wireless_mic_main_run(void);
|
||||
wireless_mic_main_run();
|
||||
#endif
|
||||
|
||||
#if TCFG_ENTER_PC_MODE
|
||||
init_intent(&it);
|
||||
it.name = "pc";
|
||||
it.action = ACTION_PC_MAIN;
|
||||
start_app(&it);
|
||||
#else
|
||||
init_intent(&it);
|
||||
it.name = "earphone";
|
||||
it.action = ACTION_EARPHONE_MAIN;
|
||||
start_app(&it);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
set_charge_event_flag(1);
|
||||
#endif
|
||||
|
||||
|
||||
log_info("app_main\n");
|
||||
app_var.start_time = timer_get_ms();
|
||||
|
||||
void xtell_main(void);
|
||||
xtell_main();
|
||||
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int __attribute__((weak)) eSystemConfirmStopStatus(void)
|
||||
{
|
||||
/* 系统进入在未来时间里,无任务超时唤醒,可根据用户选择系统停止,或者系统定时唤醒(100ms),或自己指定唤醒时间 */
|
||||
//1:Endless Sleep
|
||||
//0:100 ms wakeup
|
||||
//other: x ms wakeup
|
||||
if (get_charge_full_flag()) {
|
||||
/* log_i("Endless Sleep"); */
|
||||
power_set_soft_poweroff();
|
||||
return 1;
|
||||
} else {
|
||||
/* log_i("100 ms wakeup"); */
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((used)) int *__errno()
|
||||
{
|
||||
static int err;
|
||||
return &err;
|
||||
}
|
||||
|
||||
enum {
|
||||
KEY_USER_DEAL_POST = 0,
|
||||
KEY_USER_DEAL_POST_MSG,
|
||||
KEY_USER_DEAL_POST_EVENT,
|
||||
KEY_USER_DEAL_POST_2,
|
||||
};
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "system/event.h"
|
||||
|
||||
///自定义事件推送的线程
|
||||
|
||||
#define Q_USER_DEAL 0xAABBCC ///自定义队列类型
|
||||
#define Q_USER_DATA_SIZE 10///理论Queue受任务声明struct task_info.qsize限制,但不宜过大,建议<=6
|
||||
|
||||
void user_deal_send_ver(void)
|
||||
{
|
||||
//os_taskq_post("user_deal", 1,KEY_USER_DEAL_POST);
|
||||
os_taskq_post_msg("user_deal", 1, KEY_USER_DEAL_POST_MSG);
|
||||
//os_taskq_post_event("user_deal",1, KEY_USER_DEAL_POST_EVENT);
|
||||
}
|
||||
|
||||
void user_deal_rand_set(u32 rand)
|
||||
{
|
||||
os_taskq_post("user_deal", 2, KEY_USER_DEAL_POST_2, rand);
|
||||
}
|
||||
|
||||
void user_deal_send_array(int *msg, int argc)
|
||||
{
|
||||
if (argc > Q_USER_DATA_SIZE) {
|
||||
return;
|
||||
}
|
||||
os_taskq_post_type("user_deal", Q_USER_DEAL, argc, msg);
|
||||
}
|
||||
void user_deal_send_msg(void)
|
||||
{
|
||||
os_taskq_post_event("user_deal", 1, KEY_USER_DEAL_POST_EVENT);
|
||||
}
|
||||
|
||||
void user_deal_send_test(void)///模拟测试函数,可按键触发调用,自行看打印
|
||||
{
|
||||
user_deal_send_ver();
|
||||
user_deal_rand_set(0x11223344);
|
||||
static u32 data[Q_USER_DATA_SIZE] = {0x11223344, 0x55667788, 0x11223344, 0x55667788, 0x11223344,
|
||||
0xff223344, 0x556677ee, 0x11223344, 0x556677dd, 0x112233ff,
|
||||
};
|
||||
user_deal_send_array(data, sizeof(data) / sizeof(int));
|
||||
}
|
||||
|
||||
static void user_deal_task_handle(void *p)
|
||||
{
|
||||
int msg[Q_USER_DATA_SIZE + 1] = {0, 0, 0, 0, 0, 0, 0, 0, 00, 0};
|
||||
int res = 0;
|
||||
while (1) {
|
||||
res = os_taskq_pend("taskq", msg, ARRAY_SIZE(msg));
|
||||
if (res != OS_TASKQ) {
|
||||
continue;
|
||||
}
|
||||
r_printf("user_deal_task_handle:0x%x", msg[0]);
|
||||
put_buf(msg, (Q_USER_DATA_SIZE + 1) * 4);
|
||||
if (msg[0] == Q_MSG) {
|
||||
printf("use os_taskq_post_msg");
|
||||
switch (msg[1]) {
|
||||
case KEY_USER_DEAL_POST_MSG:
|
||||
printf("KEY_USER_DEAL_POST_MSG");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (msg[0] == Q_EVENT) {
|
||||
printf("use os_taskq_post_event");
|
||||
switch (msg[1]) {
|
||||
case KEY_USER_DEAL_POST_EVENT:
|
||||
printf("KEY_USER_DEAL_POST_EVENT");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (msg[0] == Q_CALLBACK) {
|
||||
} else if (msg[0] == Q_USER) {
|
||||
printf("use os_taskq_post");
|
||||
switch (msg[1]) {
|
||||
case KEY_USER_DEAL_POST:
|
||||
printf("KEY_USER_DEAL_POST");
|
||||
break;
|
||||
case KEY_USER_DEAL_POST_2:
|
||||
printf("KEY_USER_DEAL_POST_2:0x%x", msg[2]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else if (msg[0] == Q_USER_DEAL) {
|
||||
printf("use os_taskq_post_type");
|
||||
printf("0x%x 0x%x 0x%x 0x%x 0x%x", msg[1], msg[2], msg[3], msg[4], msg[5]);
|
||||
printf("0x%x 0x%x 0x%x 0x%x 0x%x", msg[6], msg[7], msg[8], msg[9], msg[10]);
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
}
|
||||
|
||||
void user_deal_init(void)
|
||||
{
|
||||
task_create(user_deal_task_handle, NULL, "user_deal");
|
||||
}
|
||||
|
||||
void user_deal_exit(void)
|
||||
{
|
||||
task_kill("user_deal");
|
||||
}
|
||||
|
||||
95
apps/earphone/app_protocol_deal.c
Normal file
95
apps/earphone/app_protocol_deal.c
Normal file
@ -0,0 +1,95 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "app_protocol_api.h"
|
||||
#include "system/includes.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "tone_player.h"
|
||||
#include "bt_tws.h"
|
||||
#include "app_main.h"
|
||||
|
||||
#if AI_APP_PROTOCOL
|
||||
|
||||
#if 1
|
||||
#define APP_PROTOCOL_LOG printf
|
||||
#define APP_PROTOCOL_DUMP put_buf
|
||||
#else
|
||||
#define APP_PROTOCOL_LOG(...)
|
||||
#define APP_PROTOCOL_DUMP(...)
|
||||
#endif
|
||||
|
||||
static int sys_clk_before_rec;
|
||||
#define AUDIO_ENC_SYS_CLK_HZ 128 * 1000000L
|
||||
|
||||
extern void clk_set_en(u8 en);
|
||||
void mic_rec_clock_set(void)
|
||||
{
|
||||
sys_clk_before_rec = clk_get("sys");
|
||||
clk_set("sys", AUDIO_ENC_SYS_CLK_HZ);
|
||||
clk_set_en(0);
|
||||
}
|
||||
|
||||
void mic_rec_clock_recover(void)
|
||||
{
|
||||
clk_set_en(1);
|
||||
clk_set("sys", sys_clk_before_rec);
|
||||
}
|
||||
|
||||
static void tone_play_in_app_core(int index)
|
||||
{
|
||||
if (app_protocol_get_tone(index)) {
|
||||
tone_play_with_callback(app_protocol_get_tone(index), 1, app_speech_tone_play_end_callback, (void *)index);
|
||||
} else {
|
||||
app_speech_tone_play_end_callback((void *)index, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void app_protocol_tone_play(int index, int tws_sync)
|
||||
{
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
APP_PROTOCOL_LOG("shutdown don't play tone:%d\n", index);
|
||||
return;
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (tws_sync && get_bt_tws_connect_status()) {
|
||||
APP_PROTOCOL_LOG("tws_sync play index:%d\n", index);
|
||||
app_protocol_tws_sync_send(APP_PROTOCOL_SYNC_TONE, index);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
if (strcmp(os_current_task(), "app_core")) {
|
||||
APP_PROTOCOL_LOG("tone play in app core index:%d\n", index);
|
||||
app_protocol_post_app_core_callback((int)tone_play_in_app_core, (void *)index); //提示音放到app_core播放
|
||||
} else {
|
||||
APP_PROTOCOL_LOG("tone play index:%d\n", index);
|
||||
tone_play_in_app_core(index);
|
||||
}
|
||||
}
|
||||
|
||||
extern u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX];
|
||||
int app_protocol_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
int ret = false;
|
||||
u8 key_event;
|
||||
|
||||
struct key_event *key = &event->u.key;
|
||||
key_event = key_table[key->value][key->event];
|
||||
|
||||
switch (key_event) {
|
||||
#if APP_PROTOCOL_SPEECH_EN
|
||||
case KEY_SEND_SPEECH_START:
|
||||
APP_PROTOCOL_LOG("KEY_SEND_SPEECH_START \n");
|
||||
app_protocol_start_speech_by_key(event);
|
||||
break;
|
||||
case KEY_SEND_SPEECH_STOP:
|
||||
APP_PROTOCOL_LOG("KEY_SEND_SPEECH_STOP \n");
|
||||
app_protocol_stop_speech_by_key();
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
285
apps/earphone/app_task_switch.c
Normal file
285
apps/earphone/app_task_switch.c
Normal file
@ -0,0 +1,285 @@
|
||||
#include "system/includes.h"
|
||||
#include "app_config.h"
|
||||
#include "app_task.h"
|
||||
#include "app_music.h"
|
||||
#include "app_action.h"
|
||||
#include "earphone.h"
|
||||
#include "bt_background.h"
|
||||
|
||||
u8 app_curr_task = 0;
|
||||
u8 app_next_task = 0;
|
||||
u8 app_prev_task = 0;
|
||||
|
||||
extern int pc_app_check(void);
|
||||
|
||||
const u8 app_task_list[] = {
|
||||
APP_BT_TASK,
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
APP_MUSIC_TASK,
|
||||
#endif
|
||||
#if TCFG_PC_ENABLE
|
||||
APP_PC_TASK,
|
||||
#endif
|
||||
#if TCFG_APP_AUX_EN
|
||||
APP_AUX_TASK,
|
||||
#endif
|
||||
};
|
||||
|
||||
const u8 app_task_action_tab[] = {
|
||||
ACTION_EARPHONE_MAIN,
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
ACTION_MUSIC_MAIN,
|
||||
#endif
|
||||
#if TCFG_PC_ENABLE
|
||||
ACTION_PC_MAIN,
|
||||
#endif
|
||||
#if TCFG_APP_AUX_EN
|
||||
ACTION_AUX_MAIN,
|
||||
#endif
|
||||
};
|
||||
|
||||
const char *app_task_name_tab[] = {
|
||||
APP_NAME_BT,
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
APP_NAME_MUSIC,
|
||||
#endif
|
||||
#if TCFG_PC_ENABLE
|
||||
APP_NAME_PC,
|
||||
#endif
|
||||
#if TCFG_APP_AUX_EN
|
||||
APP_NAME_AUX,
|
||||
#endif
|
||||
};
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 模式进入检查
|
||||
@param app_task:目标模式
|
||||
@return TRUE可以进入, FALSE不可以进入
|
||||
@note 例如一些需要设备在线的任务(music),
|
||||
如果设备在线可以进入, 没有设备在线不进入可以在这里处理
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int app_task_switch_check(u8 app_task)
|
||||
{
|
||||
int ret = false;
|
||||
printf("app_task %x\n", app_task);
|
||||
switch (app_task) {
|
||||
case APP_BT_TASK:
|
||||
ret = true;
|
||||
break;
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
case APP_MUSIC_TASK:
|
||||
ret = music_app_check();
|
||||
break;
|
||||
#endif
|
||||
#if TCFG_PC_ENABLE
|
||||
case APP_PC_TASK:
|
||||
ret = pc_app_check();
|
||||
break;
|
||||
#endif
|
||||
#if TCFG_APP_AUX_EN
|
||||
case APP_AUX_TASK:
|
||||
ret = true;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief app_core_back_to_prev_app后检查
|
||||
@param void
|
||||
@return TRUE:当前模式对应的设备在线, FALSE:当前模式的设备不在线却进入了模式
|
||||
@note 用于app_core_back_to_prev_app后的检查
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int app_core_back_to_prev_app_over_check(void)
|
||||
{
|
||||
int ret = false;
|
||||
struct application *app = get_current_app();
|
||||
|
||||
if (app && app->state == APP_STA_START) {
|
||||
if (app->name == APP_NAME_BT) {
|
||||
} else if (app->name == APP_NAME_BT) {
|
||||
ret = true;
|
||||
} else if (app->name == APP_NAME_MUSIC) {
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
ret = music_app_check();
|
||||
#endif
|
||||
} else if (app->name == APP_NAME_PC) {
|
||||
#if TCFG_PC_ENABLE
|
||||
ret = pc_app_check();
|
||||
#endif
|
||||
} else if (app->name == APP_NAME_AUX) {
|
||||
#if TCFG_APP_AUX_EN
|
||||
ret = true;
|
||||
#endif
|
||||
} else {
|
||||
ret = false;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 模式退出检查
|
||||
@param curr_task:当前模式
|
||||
@return TRUE可以退出, FALSE不可以退出
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int app_task_switch_exit_check(u8 curr_task)
|
||||
{
|
||||
int ret = false;
|
||||
switch (curr_task) {
|
||||
case APP_BT_TASK:
|
||||
ret = bt_app_exit_check();
|
||||
break;
|
||||
default:
|
||||
ret = TRUE;
|
||||
break;
|
||||
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 切换到指定模式
|
||||
@param app_task:指定模式
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int app_task_switch_to(u8 app_task, int priv)
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
//相同模式不切
|
||||
if (app_curr_task == app_task) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//不在线不切
|
||||
if (!app_task_switch_check(app_task)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
//上一个模式不允许退出不切
|
||||
if (!app_task_switch_exit_check(app_curr_task)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
printf("cur --- %x \n", app_curr_task);
|
||||
printf("new +++ %x \n", app_task);
|
||||
|
||||
app_prev_task = app_curr_task;
|
||||
app_curr_task = app_task;
|
||||
|
||||
#if CONFIG_BT_BACKGROUND_ENABLE
|
||||
//bt_in_background()为0时,切到蓝牙模式需要初始化(关机插pc切模式的情况)
|
||||
if ((app_task == APP_BT_TASK) && bt_in_background()) {
|
||||
if (priv == ACTION_A2DP_START) {
|
||||
bt_switch_to_foreground(ACTION_A2DP_START, 1);
|
||||
} else if (priv == ACTION_DO_NOTHING) {
|
||||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||||
} else {
|
||||
bt_switch_to_foreground(ACTION_TONE_PLAY, 1);
|
||||
}
|
||||
return true; //切到蓝牙前台
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_BT_BACKGROUND_ENABLE
|
||||
if (app_prev_task != APP_BT_TASK)
|
||||
#endif
|
||||
{
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
|
||||
init_intent(&it);
|
||||
it.name = app_task_name_tab[app_task];
|
||||
it.action = app_task_action_tab[app_task];
|
||||
start_app(&it);
|
||||
return true;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 切换到下一个模式
|
||||
@param
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void app_task_switch_next(void)
|
||||
{
|
||||
int i = 0;
|
||||
int cur_index = 0;
|
||||
|
||||
for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
|
||||
if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = cur_index ;;) { //遍历一圈
|
||||
if (++i >= ARRAY_SIZE(app_task_list)) {
|
||||
i = 0;
|
||||
}
|
||||
if (i == cur_index) {
|
||||
return;
|
||||
}
|
||||
if (app_task_switch_to(app_task_list[i], NULL_VALUE)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 切换到上一个模式
|
||||
@param
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void app_task_switch_prev(void)
|
||||
{
|
||||
int i = 0;
|
||||
int cur_index = 0;
|
||||
|
||||
for (cur_index = 0; cur_index < ARRAY_SIZE(app_task_list); cur_index++) {
|
||||
if (app_curr_task == app_task_list[cur_index]) {//遍历当前索引
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = cur_index; ;) { //遍历一圈
|
||||
if (i-- == 0) {
|
||||
i = ARRAY_SIZE(app_task_list) - 1;
|
||||
}
|
||||
if (i == cur_index) {
|
||||
return;
|
||||
}
|
||||
if (app_task_switch_to(app_task_list[i], NULL_VALUE)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 获取当前模式
|
||||
@param
|
||||
@return 当前模式id
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
u8 app_get_curr_task(void)
|
||||
{
|
||||
return app_curr_task;
|
||||
}
|
||||
|
||||
|
||||
483
apps/earphone/app_testbox.c
Normal file
483
apps/earphone/app_testbox.c
Normal file
@ -0,0 +1,483 @@
|
||||
#include "init.h"
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "asm/chargestore.h"
|
||||
#include "user_cfg.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_testbox.h"
|
||||
#include "device/vm.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "app_action.h"
|
||||
#include "app_main.h"
|
||||
#include "app_charge.h"
|
||||
#include "classic/tws_api.h"
|
||||
#include "update.h"
|
||||
#include "bt_ble.h"
|
||||
#include "bt_tws.h"
|
||||
#include "app_action.h"
|
||||
#include "bt_common.h"
|
||||
#include "le_rcsp_adv_module.h"
|
||||
#include "asm/lp_touch_key_api.h"
|
||||
|
||||
#define LOG_TAG_CONST APP_TESTBOX
|
||||
#define LOG_TAG "[APP_TESTBOX]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
|
||||
//testbox sub cmd
|
||||
#define CMD_BOX_BT_NAME_INFO 0x01 //获取蓝牙名
|
||||
#define CMD_BOX_SDK_VERSION 0x02 //获取sdk版本信息
|
||||
#define CMD_BOX_BATTERY_VOL 0x03 //获取电量
|
||||
#define CMD_BOX_ENTER_DUT 0x04 //进入dut模式
|
||||
#define CMD_BOX_FAST_CONN 0x05 //进入快速链接
|
||||
#define CMD_BOX_VERIFY_CODE 0x06 //获取校验码
|
||||
#define CMD_BOX_ENTER_STORAGE_MODE 0x0a //进入仓储模式
|
||||
#define CMD_BOX_GLOBLE_CFG 0x0b //测试盒配置命令(测试盒收到CMD_BOX_TWS_CHANNEL_SEL命令后发送,需使能测试盒某些配置)
|
||||
#define CMD_BOX_CUSTOM_CODE 0xf0 //客户自定义命令处理
|
||||
|
||||
#define WRITE_LIT_U16(a,src) {*((u8*)(a)+1) = (u8)(src>>8); *((u8*)(a)+0) = (u8)(src&0xff); }
|
||||
#define WRITE_LIT_U32(a,src) {*((u8*)(a)+3) = (u8)((src)>>24); *((u8*)(a)+2) = (u8)(((src)>>16)&0xff);*((u8*)(a)+1) = (u8)(((src)>>8)&0xff);*((u8*)(a)+0) = (u8)((src)&0xff);}
|
||||
|
||||
#define READ_LIT_U32(a) (*((u8*)(a)) + (*((u8*)(a)+1)<<8) + (*((u8*)(a)+2)<<16) + (*((u8*)(a)+3)<<24))
|
||||
|
||||
enum {
|
||||
UPDATE_MASK_FLAG_INQUIRY_VBAT_LEVEL = 0,
|
||||
UPDATE_MASK_FLAG_INQUIRY_VERIFY_CODE,
|
||||
UPDATE_MASK_FLAG_INQUIRY_SDK_VERSION,
|
||||
};
|
||||
|
||||
static const u32 support_update_mask = BIT(UPDATE_MASK_FLAG_INQUIRY_VBAT_LEVEL) | \
|
||||
BIT(UPDATE_MASK_FLAG_INQUIRY_SDK_VERSION) | \
|
||||
BIT(UPDATE_MASK_FLAG_INQUIRY_VERIFY_CODE);
|
||||
|
||||
struct testbox_info {
|
||||
u8 bt_init_ok;//蓝牙协议栈初始化成功
|
||||
u8 testbox_status;//测试盒在线状态
|
||||
u8 connect_status;//通信成功
|
||||
u8 channel;//左右
|
||||
u8 event_hdl_flag;
|
||||
volatile u32 global_cfg; //全局配置信息,控制耳机在/离仓行为
|
||||
volatile u8 keep_tws_conn_flag; //保持tws连接标志
|
||||
u8 tws_paired_flag;
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
BOX_CFG_SOFTPWROFF_AFTER_PAIRED_BIT = 0, //测试盒配对完耳机关机
|
||||
BOX_CFG_TOUCH_TRIM_OUT_OF_BOX_BIT = 1, //离仓执行trim操作
|
||||
BOX_CFG_TRIM_START_TIME_BIT = 2, //离仓多久trim,unit:2s (n+1)*2,即(2~8s)
|
||||
|
||||
};
|
||||
|
||||
#define BOX_CFG_BITS_GET_FROM_MASK(mask,index,len) (((mask & BIT(index))>>index) & (0xffffffff>>(32-len)))
|
||||
static struct testbox_info info = {
|
||||
.global_cfg = BIT(BOX_CFG_SOFTPWROFF_AFTER_PAIRED_BIT),
|
||||
};
|
||||
#define __this (&info)
|
||||
|
||||
extern const char *bt_get_local_name();
|
||||
extern u16 get_vbat_value(void);
|
||||
extern void bt_fast_test_api(void);
|
||||
extern const int config_btctler_eir_version_info_len;
|
||||
extern const char *sdk_version_info_get(void);
|
||||
extern u8 *sdfile_get_burn_code(u8 *len);
|
||||
extern void bt_page_scan_for_test(u8 inquiry_en);
|
||||
extern u8 get_jl_chip_id(void);
|
||||
extern u8 get_jl_chip_id2(void);
|
||||
extern void set_temp_link_key(u8 *linkkey);
|
||||
static u8 ex_enter_dut_flag = 0;
|
||||
static u8 ex_enter_storage_mode_flag = 0;//1 仓储模式, 0 普通模式
|
||||
static u8 local_packet[36];
|
||||
|
||||
void testbox_set_bt_init_ok(u8 flag)
|
||||
{
|
||||
__this->bt_init_ok = flag;
|
||||
}
|
||||
|
||||
void testbox_set_testbox_tws_paired(u8 flag)
|
||||
{
|
||||
__this->tws_paired_flag = flag;
|
||||
}
|
||||
|
||||
u8 testbox_get_testbox_tws_paired(void)
|
||||
{
|
||||
return __this->tws_paired_flag;
|
||||
}
|
||||
|
||||
u8 testbox_get_touch_trim_en(u8 *sec)
|
||||
{
|
||||
if (sec) {
|
||||
u8 sec_bits = BOX_CFG_BITS_GET_FROM_MASK(__this->global_cfg, BOX_CFG_TRIM_START_TIME_BIT, 2);
|
||||
*sec = (sec_bits + 1) * 2;
|
||||
}
|
||||
|
||||
return BOX_CFG_BITS_GET_FROM_MASK(__this->global_cfg, BOX_CFG_TOUCH_TRIM_OUT_OF_BOX_BIT, 1);
|
||||
}
|
||||
|
||||
u8 testbox_get_softpwroff_after_paired(void)
|
||||
{
|
||||
return BOX_CFG_BITS_GET_FROM_MASK(__this->global_cfg, BOX_CFG_SOFTPWROFF_AFTER_PAIRED_BIT, 1);
|
||||
}
|
||||
|
||||
u8 testbox_get_ex_enter_storage_mode_flag(void)
|
||||
{
|
||||
return ex_enter_storage_mode_flag;
|
||||
}
|
||||
|
||||
u8 testbox_get_ex_enter_dut_flag(void)
|
||||
{
|
||||
return ex_enter_dut_flag;
|
||||
}
|
||||
|
||||
u8 testbox_get_connect_status(void)
|
||||
{
|
||||
return __this->connect_status;
|
||||
}
|
||||
|
||||
void testbox_clear_connect_status(void)
|
||||
{
|
||||
__this->connect_status = 0;
|
||||
}
|
||||
|
||||
u8 testbox_get_status(void)
|
||||
{
|
||||
return __this->testbox_status;
|
||||
}
|
||||
|
||||
void testbox_clear_status(void)
|
||||
{
|
||||
__this->testbox_status = 0;
|
||||
testbox_clear_connect_status();
|
||||
}
|
||||
|
||||
u8 testbox_get_keep_tws_conn_flag(void)
|
||||
{
|
||||
return __this->keep_tws_conn_flag;
|
||||
}
|
||||
|
||||
void testbox_event_to_user(u8 *packet, u32 type, u8 event, u8 size)
|
||||
{
|
||||
struct sys_event e;
|
||||
e.type = SYS_DEVICE_EVENT;
|
||||
if (packet != NULL) {
|
||||
if (size > sizeof(local_packet)) {
|
||||
return;
|
||||
}
|
||||
e.u.chargestore.packet = local_packet;
|
||||
memcpy(e.u.chargestore.packet, packet, size);
|
||||
}
|
||||
e.arg = (void *)type;
|
||||
e.u.chargestore.event = event;
|
||||
e.u.chargestore.size = size;
|
||||
sys_event_notify(&e);
|
||||
}
|
||||
|
||||
|
||||
|
||||
extern u32 link_task_idle_disable(void);
|
||||
static void app_testbox_sub_event_handle(u8 *data, u16 size)
|
||||
{
|
||||
u8 mac = 0;
|
||||
switch (data[0]) {
|
||||
case CMD_BOX_FAST_CONN:
|
||||
case CMD_BOX_ENTER_DUT:
|
||||
__this->event_hdl_flag = 0;
|
||||
struct application *app = get_current_app();
|
||||
if (app) {
|
||||
if (strcmp(app->name, APP_NAME_BT)) {
|
||||
if (!app_var.goto_poweroff_flag) {
|
||||
app_var.play_poweron_tone = 0;
|
||||
task_switch_to_bt();
|
||||
}
|
||||
} else {
|
||||
if ((!__this->connect_status) && __this->bt_init_ok) {
|
||||
log_info("\n\nbt_page_inquiry_scan_for_test\n\n");
|
||||
__this->connect_status = 1;
|
||||
extern void bredr_set_dut_enble(u8 en, u8 phone);
|
||||
log_info("bredr_dut_enbale\n");
|
||||
bredr_set_dut_enble(1, 1);
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
bt_page_scan_for_test(1);
|
||||
#endif
|
||||
link_task_idle_disable();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CMD_BOX_CUSTOM_CODE:
|
||||
__this->event_hdl_flag = 0;
|
||||
if (data[1] == 0x00) {
|
||||
bt_fast_test_api();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//事件执行函数,在任务调用
|
||||
int app_testbox_event_handler(struct testbox_event *testbox_dev)
|
||||
{
|
||||
struct application *app = get_current_app();
|
||||
switch (testbox_dev->event) {
|
||||
case CMD_BOX_MODULE:
|
||||
app_testbox_sub_event_handle(testbox_dev->packet, testbox_dev->size);
|
||||
break;
|
||||
case CMD_BOX_TWS_CHANNEL_SEL:
|
||||
__this->event_hdl_flag = 0;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
chargestore_set_tws_channel_info(__this->channel);
|
||||
#endif
|
||||
if (get_vbat_need_shutdown() == TRUE) {
|
||||
//电压过低,不进行测试
|
||||
break;
|
||||
}
|
||||
if (app) {
|
||||
if (strcmp(app->name, APP_NAME_BT)) {
|
||||
if (!app_var.goto_poweroff_flag) {
|
||||
app_var.play_poweron_tone = 0;
|
||||
task_switch_to_bt();
|
||||
}
|
||||
} else {
|
||||
if ((!__this->connect_status) && __this->bt_init_ok) {
|
||||
__this->connect_status = 1;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (0 == __this->keep_tws_conn_flag) {
|
||||
log_info("\n\nbt_page_scan_for_test\n\n");
|
||||
bt_page_scan_for_test(0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case CMD_BOX_TWS_REMOTE_ADDR:
|
||||
log_info("event_CMD_BOX_TWS_REMOTE_ADDR \n");
|
||||
chargestore_set_tws_remote_info(testbox_dev->packet, testbox_dev->size);
|
||||
break;
|
||||
#endif
|
||||
//不是测试盒事件,返回0,未处理
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const u8 own_private_linkkey[16] = {
|
||||
0x06, 0x77, 0x5f, 0x87, 0x91, 0x8d, 0xd4, 0x23,
|
||||
0x00, 0x5d, 0xf1, 0xd8, 0xcf, 0x0c, 0x14, 0x2b
|
||||
};
|
||||
|
||||
static void app_testbox_sub_cmd_handle(u8 *send_buf, u8 buf_len, u8 *buf, u8 len)
|
||||
{
|
||||
u8 temp_len;
|
||||
u8 send_len = 0;
|
||||
|
||||
send_buf[0] = buf[0];
|
||||
send_buf[1] = buf[1];
|
||||
|
||||
log_info("sub_cmd:%x\n", buf[1]);
|
||||
|
||||
switch (buf[1]) {
|
||||
case CMD_BOX_BT_NAME_INFO:
|
||||
temp_len = strlen(bt_get_local_name());
|
||||
if (temp_len < (buf_len - 2)) {
|
||||
memcpy(&send_buf[2], bt_get_local_name(), temp_len);
|
||||
send_len = temp_len + 2;
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
} else {
|
||||
log_error("bt name buf len err\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_BOX_BATTERY_VOL:
|
||||
send_buf[2] = get_vbat_value();
|
||||
send_buf[3] = get_vbat_value() >> 8;
|
||||
send_buf[4] = get_vbat_percent();
|
||||
send_len = sizeof(u16) + sizeof(u8) + 2; //vbat_value;u16,vabt_percent:u8,opcode:2 bytes
|
||||
log_info("bat_val:%d %d\n", get_vbat_value(), get_vbat_percent());
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
break;
|
||||
|
||||
case CMD_BOX_SDK_VERSION:
|
||||
if (config_btctler_eir_version_info_len) {
|
||||
temp_len = strlen(sdk_version_info_get());
|
||||
send_len = (temp_len > (buf_len - 2)) ? buf_len : temp_len + 2;
|
||||
log_info("version:%s ver_len:%x send_len:%x\n", sdk_version_info_get(), temp_len, send_len);
|
||||
memcpy(send_buf + 2, sdk_version_info_get(), temp_len);
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_BOX_FAST_CONN:
|
||||
log_info("enter fast dut\n");
|
||||
set_temp_link_key((u8 *)own_private_linkkey);
|
||||
bt_get_vm_mac_addr(&send_buf[2]);
|
||||
if (0 == __this->event_hdl_flag) {
|
||||
testbox_event_to_user(&buf[1], DEVICE_EVENT_TEST_BOX, buf[0], 1);
|
||||
__this->event_hdl_flag = 1;
|
||||
}
|
||||
if (__this->bt_init_ok) {
|
||||
ex_enter_dut_flag = 1;
|
||||
chargestore_api_write(send_buf, 8);
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_BOX_ENTER_DUT:
|
||||
log_info("enter dut\n");
|
||||
//__this->testbox_status = 1;
|
||||
ex_enter_dut_flag = 1;
|
||||
|
||||
if (0 == __this->event_hdl_flag) {
|
||||
testbox_event_to_user(&buf[1], DEVICE_EVENT_TEST_BOX, buf[0], 1);
|
||||
__this->event_hdl_flag = 1;
|
||||
}
|
||||
if (__this->bt_init_ok) {
|
||||
chargestore_api_write(send_buf, 2);
|
||||
}
|
||||
break;
|
||||
|
||||
case CMD_BOX_VERIFY_CODE:
|
||||
log_info("get_verify_code\n");
|
||||
u8 *p = sdfile_get_burn_code(&temp_len);
|
||||
send_len = (temp_len > (buf_len - 2)) ? buf_len : temp_len + 2;
|
||||
memcpy(send_buf + 2, p, temp_len);
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
break;
|
||||
|
||||
case CMD_BOX_CUSTOM_CODE:
|
||||
log_info("CMD_BOX_CUSTOM_CODE value=%x", buf[2]);
|
||||
if (buf[2] == 0) {//测试盒自定义命令,样机进入快速测试模式
|
||||
if (0 == __this->event_hdl_flag) {
|
||||
__this->event_hdl_flag = 1;
|
||||
testbox_event_to_user(&buf[1], DEVICE_EVENT_TEST_BOX, buf[0], 2);
|
||||
}
|
||||
}
|
||||
send_len = 0x3;
|
||||
#if (defined(TCFG_AUDIO_SPATIAL_EFFECT_ENABLE) && TCFG_AUDIO_SPATIAL_EFFECT_ENABLE)
|
||||
if (buf[2] == 1) {
|
||||
__this->testbox_status = 1;
|
||||
extern int testbox_imu_trim_run(u8 * send_buf);
|
||||
send_len = testbox_imu_trim_run(send_buf);
|
||||
put_buf(send_buf, 36);
|
||||
send_len += 2;
|
||||
}
|
||||
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
|
||||
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
if (buf[2] == 0x6a) {//测试盒自定义命令, 0x6a 用于触摸动态阈值算法的结果显示,请大家不要冲突
|
||||
send_buf[2] = 0x6a;
|
||||
send_buf[3] = 'c';
|
||||
send_buf[4] = 's';
|
||||
send_buf[5] = 'm';
|
||||
send_buf[6] = 'r';
|
||||
send_buf[7] = lp_touch_key_alog_range_display((u8 *)&send_buf[8]);
|
||||
send_len = 8 + send_buf[7];
|
||||
log_info("send_len = %d\n", send_len);
|
||||
}
|
||||
#endif
|
||||
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
break;
|
||||
|
||||
case CMD_BOX_ENTER_STORAGE_MODE:
|
||||
log_info("CMD_BOX_ENTER_STORAGE_MODE");
|
||||
ex_enter_storage_mode_flag = 1;
|
||||
chargestore_api_write(send_buf, 2);
|
||||
break;
|
||||
|
||||
case CMD_BOX_GLOBLE_CFG:
|
||||
log_info("CMD_BOX_GLOBLE_CFG:%d %x %x", len, READ_LIT_U32(buf + 2), READ_LIT_U32(buf + 6));
|
||||
__this->global_cfg = READ_LIT_U32(buf + 2);
|
||||
#if 0 //for test
|
||||
u8 sec;
|
||||
u32 trim_en = testbox_get_touch_trim_en(&sec);
|
||||
log_info("box_cfg:%x %x %x\n",
|
||||
testbox_get_softpwroff_after_paired(),
|
||||
trim_en, sec);
|
||||
#endif
|
||||
|
||||
chargestore_api_write(send_buf, 2);
|
||||
break;
|
||||
|
||||
default:
|
||||
send_buf[0] = CMD_UNDEFINE;
|
||||
send_len = 1;
|
||||
chargestore_api_write(send_buf, send_len);
|
||||
break;
|
||||
}
|
||||
|
||||
log_info_hexdump(send_buf, send_len);
|
||||
}
|
||||
|
||||
//数据执行函数,在串口中断调用
|
||||
static int app_testbox_data_handler(u8 *buf, u8 len)
|
||||
{
|
||||
u8 send_buf[36];
|
||||
send_buf[0] = buf[0];
|
||||
switch (buf[0]) {
|
||||
case CMD_BOX_MODULE:
|
||||
app_testbox_sub_cmd_handle(send_buf, sizeof(send_buf), buf, len);
|
||||
break;
|
||||
|
||||
case CMD_BOX_UPDATE:
|
||||
__this->testbox_status = 1;
|
||||
if (buf[13] == get_jl_chip_id() || buf[13] == get_jl_chip_id2()) {
|
||||
chargestore_set_update_ram();
|
||||
cpu_reset();
|
||||
} else if (buf[13] == 0xff) {
|
||||
send_buf[1] = 0xff;
|
||||
WRITE_LIT_U32(&send_buf[2], support_update_mask);
|
||||
chargestore_api_write(send_buf, 2 + sizeof(support_update_mask));
|
||||
log_info("rsp update_mask\n");
|
||||
} else {
|
||||
send_buf[1] = 0x01;//chip id err
|
||||
chargestore_api_write(send_buf, 2);
|
||||
}
|
||||
break;
|
||||
case CMD_BOX_TWS_CHANNEL_SEL:
|
||||
__this->testbox_status = 1;
|
||||
if (len == 3) {
|
||||
__this->keep_tws_conn_flag = buf[2];
|
||||
putchar('K');
|
||||
} else {
|
||||
__this->keep_tws_conn_flag = 0;
|
||||
}
|
||||
__this->channel = (buf[1] == TWS_CHANNEL_LEFT) ? 'L' : 'R';
|
||||
if (0 == __this->event_hdl_flag) {
|
||||
testbox_event_to_user(NULL, DEVICE_EVENT_TEST_BOX, CMD_BOX_TWS_CHANNEL_SEL, 0);
|
||||
__this->event_hdl_flag = 1;
|
||||
}
|
||||
if (__this->bt_init_ok) {
|
||||
len = chargestore_get_tws_remote_info(&send_buf[1]);
|
||||
chargestore_api_write(send_buf, len + 1);
|
||||
} else {
|
||||
send_buf[0] = CMD_UNDEFINE;
|
||||
chargestore_api_write(send_buf, 1);
|
||||
}
|
||||
break;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case CMD_BOX_TWS_REMOTE_ADDR:
|
||||
__this->testbox_status = 1;
|
||||
testbox_event_to_user((u8 *)&buf[1], DEVICE_EVENT_TEST_BOX, buf[0], len - 1);
|
||||
chargestore_api_set_timeout(100);
|
||||
break;
|
||||
#endif
|
||||
//不是测试盒命令,返回0,未处理
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
CHARGESTORE_HANDLE_REG(testbox, app_testbox_data_handler);
|
||||
|
||||
#endif
|
||||
|
||||
598
apps/earphone/audio_enc_mpt_cvp_ctr.c
Normal file
598
apps/earphone/audio_enc_mpt_cvp_ctr.c
Normal file
@ -0,0 +1,598 @@
|
||||
/*
|
||||
****************************************************************
|
||||
* Audio Enc Mass production test self CVP control
|
||||
* File : audio_enc_mpt_cvp_crl.c
|
||||
* note : 自研ENC产测 CVP通话算法/MIC 控制层
|
||||
****************************************************************
|
||||
*/
|
||||
#include "asm/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "system/includes.h"
|
||||
#include "aec_user.h"
|
||||
#include "app_main.h"
|
||||
#include "audio_config.h"
|
||||
#include "audio_enc.h"
|
||||
#include "audio_enc_mpt_self.h"
|
||||
#include "audio_anc.h"
|
||||
#include "overlay_code.h"
|
||||
|
||||
#if AUDIO_ENC_MPT_SELF_ENABLE
|
||||
|
||||
/* #define DUT_CVP_LOG_ENABLE */
|
||||
#ifdef DUT_CVP_LOG_ENABLE
|
||||
#define dut_cvp_log(x, ...) printf("[enc_mpt_cvp]" x " ", ## __VA_ARGS__)
|
||||
#else
|
||||
#define dut_cvp_log(...)
|
||||
#endif/*DUT_CVP_LOG_ENABLE*/
|
||||
|
||||
/*
|
||||
暂不支持开ANC模式测试
|
||||
1没有与ANC复用ADC BUFF
|
||||
2没有开动态MIC增益
|
||||
*/
|
||||
|
||||
|
||||
extern struct adc_platform_data adc_data;
|
||||
extern struct audio_dac_hdl dac_hdl;
|
||||
extern struct audio_adc_hdl adc_hdl;
|
||||
|
||||
#define MIC_BUF_NUM 3
|
||||
#define MIC_IRQ_POINTS 256
|
||||
|
||||
#define CVP_MIC_SR 16000 //采样率
|
||||
|
||||
#define CVP_MONITOR_DIS 0 //监听关闭
|
||||
#define CVP_MONITOR_PROBE 1 //监听处理前数据
|
||||
#define CVP_MONITOR_POST 2 //监听处理后数据
|
||||
//默认监听选择
|
||||
#define CVP_MONITOR_SEL CVP_MONITOR_DIS
|
||||
|
||||
typedef struct {
|
||||
u8 dump_cnt;
|
||||
u8 monitor;
|
||||
u8 mic_num; //当前MIC个数
|
||||
u16 mic_id[4];
|
||||
u16 dut_mic_ch;
|
||||
struct audio_adc_output_hdl adc_output;
|
||||
struct adc_mic_ch mic_ch;
|
||||
s16 *tmp_buf[3];
|
||||
s16 *mic_buf;
|
||||
} audio_cvp_t;
|
||||
static audio_cvp_t *cvp_hdl = NULL;
|
||||
|
||||
/* 写卡使能控制, 需注意一下几点
|
||||
1、需打开 AUDIO_PCM_DEBUG
|
||||
2、AEC原本的写卡流程需关闭
|
||||
3、测试流程需包含CVP_OUT测试, 因为写卡只能在线程写
|
||||
*/
|
||||
#define AUDIO_ENC_MPT_UART_DEBUG_EN 0
|
||||
#define AUDIO_ENC_MPT_UART_DEBUG_CH 3 //写卡通道数
|
||||
#define AUDIO_ENC_MPT_UART_DEBUG_LEN MIC_IRQ_POINTS * 2 //写卡长度
|
||||
|
||||
#ifdef AUDIO_PCM_DEBUG
|
||||
extern int aec_uart_init();
|
||||
extern int aec_uart_open(u8 nch, u16 single_size);
|
||||
extern int aec_uart_fill(u8 ch, void *buf, u16 size);
|
||||
extern void aec_uart_write(void);
|
||||
extern int aec_uart_close(void);
|
||||
#endif/*AUDIO_PCM_DEBUG*/
|
||||
|
||||
/*监听输出:默认输出到dac*/
|
||||
static int cvp_monitor_output(s16 *data, int len)
|
||||
{
|
||||
int wlen = audio_dac_write(&dac_hdl, data, len);
|
||||
if (wlen != len) {
|
||||
dut_cvp_log("monitor output full\n");
|
||||
}
|
||||
return wlen;
|
||||
}
|
||||
|
||||
/*监听使能*/
|
||||
static int cvp_monitor_en(u8 en, int sr)
|
||||
{
|
||||
dut_cvp_log("cvp_monitor_en:%d,sr:%d\n", en, sr);
|
||||
if (en) {
|
||||
app_audio_state_switch(APP_AUDIO_STATE_MUSIC, get_max_sys_vol());
|
||||
dut_cvp_log("cur_vol:%d,max_sys_vol:%d\n", app_audio_get_volume(APP_AUDIO_STATE_MUSIC), get_max_sys_vol());
|
||||
audio_dac_set_volume(&dac_hdl, app_audio_get_volume(APP_AUDIO_STATE_MUSIC));
|
||||
audio_dac_set_sample_rate(&dac_hdl, sr);
|
||||
audio_dac_start(&dac_hdl);
|
||||
} else {
|
||||
audio_dac_stop(&dac_hdl);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
测试前的预处理,
|
||||
如方案使用模拟开关复用ADC通道,可以在此切换模拟开关
|
||||
*/
|
||||
static void audio_enc_mpt_fre_pre(u16 mic_ch)
|
||||
{
|
||||
#if 0
|
||||
//测试算法或者TALK 主MIC
|
||||
if (mic_ch & (AUDIO_ENC_MPT_CVP_OUT | AUDIO_ENC_MPT_TALK_MIC)) {
|
||||
}
|
||||
//测试算法或者TALK 副MIC
|
||||
if (mic_ch & (AUDIO_ENC_MPT_CVP_OUT | AUDIO_ENC_MPT_SLAVE_MIC)) {
|
||||
}
|
||||
//测试算法或者TALK FBMIC
|
||||
if (mic_ch & (AUDIO_ENC_MPT_CVP_OUT | AUDIO_ENC_MPT_TALK_FB_MIC)) {
|
||||
}
|
||||
//测试TWS FFMIC or 头戴式LFF MIC
|
||||
if (mic_ch & AUDIO_ENC_MPT_FF_MIC) {
|
||||
}
|
||||
//测试TWS FBMIC or 头戴式LFB MIC
|
||||
if (mic_ch & AUDIO_ENC_MPT_FB_MIC) {
|
||||
}
|
||||
//测试头戴式RFF MIC
|
||||
if (mic_ch & AUDIO_ENC_MPT_RFF_MIC) {
|
||||
}
|
||||
//测试头戴式RFB MIC
|
||||
if (mic_ch & AUDIO_ENC_MPT_RFB_MIC) {
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*mic adc原始数据输出*/
|
||||
static void mic_output(void *priv, s16 *data, int len)
|
||||
{
|
||||
/* putchar('.'); */
|
||||
s16 *mic_data[cvp_hdl->mic_num];
|
||||
int i;
|
||||
u8 talk_id_cnt = 0xff;
|
||||
//ADC启动不稳定,实测开头大约有50ms 杂音数据, 这里丢弃掉16*8 = 128ms
|
||||
if (cvp_hdl->dump_cnt < 8) {
|
||||
cvp_hdl->dump_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
mic_data[0] = data;
|
||||
//printf("mic_data:%x,%x,%d\n",data,mic1_data_pos,len);
|
||||
if (cvp_hdl->mic_num == 2) {
|
||||
mic_data[1] = cvp_hdl->tmp_buf[0];
|
||||
for (u16 i = 0; i < (len >> 1); i++) {
|
||||
mic_data[0][i] = data[i * 2];
|
||||
mic_data[1][i] = data[i * 2 + 1];
|
||||
}
|
||||
mic_data[1] = data + (len / 2);
|
||||
memcpy(mic_data[1], cvp_hdl->tmp_buf[0], len);
|
||||
|
||||
} else if (cvp_hdl->mic_num == 3) {
|
||||
mic_data[1] = cvp_hdl->tmp_buf[0];
|
||||
mic_data[2] = cvp_hdl->tmp_buf[1];
|
||||
for (u16 i = 0; i < (len >> 1); i++) {
|
||||
mic_data[0][i] = data[i * 3];
|
||||
mic_data[1][i] = data[i * 3 + 1];
|
||||
mic_data[2][i] = data[i * 3 + 2];
|
||||
}
|
||||
} else if (cvp_hdl->mic_num == 4) {
|
||||
mic_data[1] = cvp_hdl->tmp_buf[0];
|
||||
mic_data[2] = cvp_hdl->tmp_buf[1];
|
||||
mic_data[3] = cvp_hdl->tmp_buf[2];
|
||||
for (u16 i = 0; i < (len >> 1); i++) {
|
||||
mic_data[0][i] = data[i * 4];
|
||||
mic_data[1][i] = data[i * 4 + 1];
|
||||
mic_data[2][i] = data[i * 4 + 2];
|
||||
mic_data[3][i] = data[i * 4 + 3];
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < cvp_hdl->mic_num; i++) {
|
||||
#if AUDIO_ENC_MPT_UART_DEBUG_EN && (defined AUDIO_PCM_DEBUG)
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
aec_uart_fill(i, mic_data[i], 512);
|
||||
}
|
||||
#endif/*AUDIO_ENC_MPT_UART_DEBUG_EN*/
|
||||
audio_enc_mpt_fre_response_inbuf(cvp_hdl->mic_id[i], mic_data[i], len);
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
if (cvp_hdl->mic_id[i] & AUDIO_ENC_MPT_TALK_FB_MIC) {
|
||||
audio_aec_inbuf_ref_1(mic_data[i], len);
|
||||
continue;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_TRIPLE_MIC_ENABLE*/
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE || TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
if (cvp_hdl->mic_id[i] & AUDIO_ENC_MPT_SLAVE_MIC) {
|
||||
audio_aec_inbuf_ref(mic_data[i], len);
|
||||
continue;
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE || TCFG_AUDIO_TRIPLE_MIC_ENABLE*/
|
||||
if (cvp_hdl->mic_id[i] & AUDIO_ENC_MPT_TALK_MIC) {
|
||||
talk_id_cnt = i;
|
||||
/* audio_aec_inbuf(mic_data[i], len); */
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//主麦数据输入触发AEC线程,最后处理
|
||||
if (talk_id_cnt != 0xff) { //表示有算法主麦输入
|
||||
audio_aec_inbuf(mic_data[talk_id_cnt], len);
|
||||
}
|
||||
|
||||
#if CVP_MONITOR_SEL != CVP_MONITOR_DIS
|
||||
if (cvp_hdl->monitor == CVP_MONITOR_PROBE) {
|
||||
static u8 num = 0;
|
||||
static int cnt = 0;
|
||||
if (++cnt > 300) {
|
||||
cnt = 0;
|
||||
if (++num == cvp_hdl->mic_num) {
|
||||
num = 0;
|
||||
}
|
||||
r_printf("num %d", num);
|
||||
}
|
||||
cvp_monitor_output(mic_data[num], len);
|
||||
}
|
||||
#endif/*CVP_MONITOR_SEL != CVP_MONITOR_DIS*/
|
||||
}
|
||||
|
||||
static u16 audio_enc_mpt_anc_mic_query(u8 mic_type, u16 mic_id, u8 *mic_en, u16 *mic_id_tmp, u8 *gain)
|
||||
{
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
u8 i;
|
||||
u8 mic_max = A_MIC3 + 1;
|
||||
for (i = A_MIC0; i < mic_max; i++) {
|
||||
if (mic_type == i) {
|
||||
if (!mic_en[i]) {
|
||||
//此MIC没有开过,则使用ANC的MIC增益
|
||||
gain[i] = audio_anc_mic_gain_get(i);
|
||||
}
|
||||
mic_en[i] = 1;
|
||||
mic_id_tmp[i] |= mic_id;
|
||||
dut_cvp_log("ANC mic%d: anc_id 0x%x, group_id 0x%x, en %x", mic_type, mic_id, mic_id_tmp[i], mic_en[i]);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
return 1;
|
||||
}
|
||||
/*根据mic通道值获取使用的第几个mic*/
|
||||
static u8 get_mic_num(u8 bit)
|
||||
{
|
||||
u8 i = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (bit & 0x1) {
|
||||
return i;
|
||||
}
|
||||
bit >>= 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const u16 call_mic_id[2] = {AUDIO_ENC_MPT_TALK_MIC, AUDIO_ENC_MPT_SLAVE_MIC};
|
||||
static int mic_open(u8 *mic_gain, int sr)
|
||||
{
|
||||
int i, j;
|
||||
u8 mic_en[4] = {0};
|
||||
u16 mic_id_tmp[4] = {0};
|
||||
|
||||
dut_cvp_log("mic open sr: %d,mic_gain:%d %d %d %d\n", sr, mic_gain[0], mic_gain[1], mic_gain[2], mic_gain[3]);
|
||||
|
||||
cvp_hdl->dump_cnt = 0;
|
||||
//1.测试CVP的输出 or 通话MIC相关 MIC输出
|
||||
if (cvp_hdl->dut_mic_ch & (AUDIO_ENC_MPT_CVP_OUT | AUDIO_ENC_MPT_TALK_MIC | \
|
||||
AUDIO_ENC_MPT_SLAVE_MIC | AUDIO_ENC_MPT_TALK_FB_MIC)) {
|
||||
#if TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_0
|
||||
mic_en[0] = 1;
|
||||
mic_id_tmp[0] = 1;
|
||||
#endif
|
||||
#if TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_1
|
||||
mic_en[1] = 1;
|
||||
mic_id_tmp[1] = 1;
|
||||
#endif
|
||||
#if TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_2
|
||||
mic_en[2] = 1;
|
||||
mic_id_tmp[2] = 1;
|
||||
#endif
|
||||
#if TCFG_AUDIO_ADC_MIC_CHA & AUDIO_ADC_MIC_3
|
||||
mic_en[3] = 1;
|
||||
mic_id_tmp[3] = 1;
|
||||
#endif
|
||||
|
||||
#if TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
//1.1 确定主副MIC-仅支持双麦定位,三麦目前还不支持
|
||||
#if (TCFG_AUDIO_DMS_MIC_MANAGE == DMS_MASTER_MIC0)
|
||||
u8 call_cnt = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (mic_id_tmp[i]) {
|
||||
mic_id_tmp[i] = call_mic_id[call_cnt++];
|
||||
}
|
||||
}
|
||||
#else
|
||||
u8 call_cnt = 1;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (mic_id_tmp[i]) {
|
||||
mic_id_tmp[i] = call_mic_id[call_cnt--];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#elif TCFG_AUDIO_TRIPLE_MIC_ENABLE //三麦通话
|
||||
//三麦通话目前需手动指定mic类型
|
||||
mic_id_tmp[get_mic_num(app_var.talk_mic_ch)] = AUDIO_ENC_MPT_TALK_MIC;
|
||||
mic_id_tmp[get_mic_num(app_var.talk_ref_mic_ch)] = AUDIO_ENC_MPT_SLAVE_MIC;
|
||||
mic_id_tmp[get_mic_num(app_var.talk_fb_mic_ch)] = AUDIO_ENC_MPT_TALK_FB_MIC;
|
||||
/* mic_id_tmp[3] = ; */
|
||||
|
||||
#else /*单麦通话*/
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (mic_id_tmp[i]) {
|
||||
mic_id_tmp[i] = AUDIO_ENC_MPT_TALK_MIC;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
|
||||
|
||||
|
||||
}
|
||||
//2.只测通话MIC,不测试算法输出
|
||||
if (!(cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT)) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
//清除非目标MIC的使能
|
||||
if (!(cvp_hdl->dut_mic_ch & mic_id_tmp[i])) {
|
||||
mic_id_tmp[i] = 0;
|
||||
mic_en[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//3.ANC MIC映射
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_FF_MIC) {
|
||||
#if TCFG_USER_TWS_ENABLE && (ANC_CH == ANC_R_CH)
|
||||
audio_enc_mpt_anc_mic_query(ANCR_FF_MIC, AUDIO_ENC_MPT_FF_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
#else
|
||||
audio_enc_mpt_anc_mic_query(ANCL_FF_MIC, AUDIO_ENC_MPT_FF_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
#endif/*TCFG_USER_TWS_ENABLE && (ANC_CH == ANC_R_CH)*/
|
||||
}
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_FB_MIC) {
|
||||
#if TCFG_USER_TWS_ENABLE && (ANC_CH == ANC_R_CH)
|
||||
audio_enc_mpt_anc_mic_query(ANCR_FB_MIC, AUDIO_ENC_MPT_FB_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
#else
|
||||
audio_enc_mpt_anc_mic_query(ANCL_FB_MIC, AUDIO_ENC_MPT_FB_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
#endif/*TCFG_USER_TWS_ENABLE && (ANC_CH == ANC_R_CH)*/
|
||||
}
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_RFF_MIC) {
|
||||
audio_enc_mpt_anc_mic_query(ANCR_FF_MIC, AUDIO_ENC_MPT_RFF_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
}
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_RFB_MIC) {
|
||||
audio_enc_mpt_anc_mic_query(ANCR_FB_MIC, AUDIO_ENC_MPT_RFB_MIC, mic_en, mic_id_tmp, mic_gain);
|
||||
}
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
|
||||
//4.重新排列数组, 兼容ADC_BUFF的缓存结构
|
||||
j = 0;
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (mic_id_tmp[i]) {
|
||||
cvp_hdl->mic_id[j++] = mic_id_tmp[i];
|
||||
}
|
||||
}
|
||||
|
||||
//5.ADC初始化
|
||||
audio_mic_pwr_ctl(MIC_PWR_ON);
|
||||
if (cvp_hdl) {
|
||||
if (mic_en[0]) {
|
||||
cvp_hdl->mic_num++;
|
||||
audio_adc_mic_open(&cvp_hdl->mic_ch, AUDIO_ADC_MIC_0, &adc_hdl);
|
||||
audio_adc_mic_set_gain(&cvp_hdl->mic_ch, mic_gain[0]);
|
||||
}
|
||||
if (mic_en[1]) {
|
||||
cvp_hdl->mic_num++;
|
||||
audio_adc_mic1_open(&cvp_hdl->mic_ch, AUDIO_ADC_MIC_1, &adc_hdl);
|
||||
audio_adc_mic1_set_gain(&cvp_hdl->mic_ch, mic_gain[1]);
|
||||
}
|
||||
if (mic_en[2]) {
|
||||
cvp_hdl->mic_num++;
|
||||
audio_adc_mic2_open(&cvp_hdl->mic_ch, AUDIO_ADC_MIC_2, &adc_hdl);
|
||||
audio_adc_mic2_set_gain(&cvp_hdl->mic_ch, mic_gain[2]);
|
||||
}
|
||||
if (mic_en[3]) {
|
||||
cvp_hdl->mic_num++;
|
||||
audio_adc_mic3_open(&cvp_hdl->mic_ch, AUDIO_ADC_MIC_3, &adc_hdl);
|
||||
audio_adc_mic3_set_gain(&cvp_hdl->mic_ch, mic_gain[3]);
|
||||
}
|
||||
|
||||
if (!cvp_hdl->mic_num) {
|
||||
dut_cvp_log("Error valid mic_num is zero!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
//5.1 ADC临时BUFF、ISR BUFF申请
|
||||
for (i = 1; i < cvp_hdl->mic_num; i++) {
|
||||
cvp_hdl->tmp_buf[i - 1] = malloc(MIC_IRQ_POINTS * sizeof(short));
|
||||
}
|
||||
cvp_hdl->mic_buf = malloc(cvp_hdl->mic_num * MIC_BUF_NUM * MIC_IRQ_POINTS * sizeof(short));
|
||||
|
||||
audio_adc_mic_set_sample_rate(&cvp_hdl->mic_ch, sr);
|
||||
audio_adc_mic_set_buffs(&cvp_hdl->mic_ch, cvp_hdl->mic_buf, MIC_IRQ_POINTS * 2, MIC_BUF_NUM);
|
||||
|
||||
cvp_hdl->adc_output.handler = mic_output;
|
||||
audio_adc_add_output_handler(&adc_hdl, &cvp_hdl->adc_output);
|
||||
audio_adc_mic_start(&cvp_hdl->mic_ch);
|
||||
}
|
||||
dut_cvp_log("mic_open succ mic_num %d\n", cvp_hdl->mic_num);
|
||||
for (i = 0; i < 4; i++) {
|
||||
dut_cvp_log("mic%d_id 0x%x, en %d, gain %d\n", i, cvp_hdl->mic_id[i], mic_en[i], mic_gain[i]);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mic_close(void)
|
||||
{
|
||||
if (cvp_hdl) {
|
||||
audio_adc_mic_close(&cvp_hdl->mic_ch);
|
||||
audio_adc_del_output_handler(&adc_hdl, &cvp_hdl->adc_output);
|
||||
for (int i = 1; i < cvp_hdl->mic_num; i++) {
|
||||
free(cvp_hdl->tmp_buf[i - 1]);
|
||||
}
|
||||
free(cvp_hdl->mic_buf);
|
||||
audio_mic_pwr_ctl(MIC_PWR_OFF);
|
||||
}
|
||||
}
|
||||
|
||||
/*清晰语音数据输出*/
|
||||
static int cvp_output_hdl(s16 *data, u16 len)
|
||||
{
|
||||
/* putchar('o'); */
|
||||
|
||||
audio_enc_mpt_fre_response_inbuf(AUDIO_ENC_MPT_CVP_OUT, data, len);
|
||||
#if AUDIO_ENC_MPT_UART_DEBUG_EN && (defined AUDIO_PCM_DEBUG)
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
aec_uart_fill(2, data, 512);
|
||||
aec_uart_write();
|
||||
}
|
||||
#endif/*AUDIO_ENC_MPT_UART_DEBUG_EN*/
|
||||
#if !AUDIO_ENC_MPT_FRERES_ASYNC
|
||||
audio_enc_mpt_fre_response_post_run(0);
|
||||
#endif/*AUDIO_ENC_MPT_FRERES_ASYNC*/
|
||||
|
||||
#if CVP_MONITOR_SEL != CVP_MONITOR_DIS
|
||||
if (cvp_hdl->monitor == CVP_MONITOR_POST) {
|
||||
cvp_monitor_output(data, len);
|
||||
}
|
||||
#endif/*CVP_MONITOR_SEL != CVP_MONITOR_DIS*/
|
||||
return len;
|
||||
}
|
||||
|
||||
int audio_enc_mpt_cvp_close(void)
|
||||
{
|
||||
if (cvp_hdl != NULL) {
|
||||
#if AUDIO_ENC_MPT_UART_DEBUG_EN && (defined AUDIO_PCM_DEBUG)
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
aec_uart_close();
|
||||
}
|
||||
#endif/*AUDIO_ENC_MPT_UART_DEBUG_EN*/
|
||||
#if CVP_MONITOR_SEL != CVP_MONITOR_DIS
|
||||
if (cvp_hdl->monitor) {
|
||||
cvp_monitor_en(0, CVP_MIC_SR);
|
||||
}
|
||||
#endif/* CVP_MONITOR_SEL != CVP_MONITOR_DIS*/
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
audio_aec_close();
|
||||
}
|
||||
//先关AEC再关MIC
|
||||
mic_close();
|
||||
free(cvp_hdl);
|
||||
cvp_hdl = NULL;
|
||||
dut_cvp_log("cvp_hdl close\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int audio_enc_mpt_cvp_open(u16 mic_ch)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 mic_gain[4];
|
||||
if (cvp_hdl) {
|
||||
//支持重入
|
||||
audio_enc_mpt_cvp_close();
|
||||
dut_cvp_log("dut_cvp start again\n");
|
||||
}
|
||||
#if AUDIO_ENC_MPT_UART_DEBUG_EN && (defined AUDIO_PCM_DEBUG)
|
||||
if (mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
aec_uart_open(AUDIO_ENC_MPT_UART_DEBUG_CH, AUDIO_ENC_MPT_UART_DEBUG_LEN);
|
||||
}
|
||||
#endif/*AUDIO_ENC_MPT_UART_DEBUG_EN*/
|
||||
dut_cvp_log("cvp_hdl open, mic_ch %x\n", mic_ch);
|
||||
cvp_hdl = zalloc(sizeof(audio_cvp_t));
|
||||
ASSERT(cvp_hdl);
|
||||
audio_enc_mpt_fre_pre(mic_ch);
|
||||
#if CVP_MONITOR_SEL != CVP_MONITOR_DIS
|
||||
cvp_hdl->monitor = CVP_MONITOR_SEL;
|
||||
if (cvp_hdl->monitor) {
|
||||
cvp_monitor_en(1, CVP_MIC_SR);
|
||||
}
|
||||
#endif/* CVP_MONITOR_SEL != CVP_MONITOR_DIS*/
|
||||
cvp_hdl->dut_mic_ch = mic_ch;
|
||||
mic_gain[0] = app_var.aec_mic_gain;
|
||||
mic_gain[1] = app_var.aec_mic1_gain;
|
||||
mic_gain[2] = app_var.aec_mic2_gain;
|
||||
mic_gain[3] = app_var.aec_mic3_gain;
|
||||
|
||||
if (cvp_hdl->dut_mic_ch & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
overlay_load_code(OVERLAY_AEC);
|
||||
audio_aec_open(CVP_MIC_SR, -1, cvp_output_hdl);
|
||||
#if 1//TCFG_AUDIO_CVP_NS_MODE == CVP_DNS_MODE
|
||||
//默认关闭DNS
|
||||
audio_cvp_ioctl(CVP_NS_SWITCH, 0, NULL); //降噪关
|
||||
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
|
||||
}
|
||||
ret = mic_open(mic_gain, CVP_MIC_SR);
|
||||
//由于产测对时钟设置不敏感,因此暂定128M
|
||||
if (clk_get("sys") < 128 * 1000000L) {
|
||||
clk_set("sys", 128 * 1000000L);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void audio_enc_mpt_fre_response_open(u16 mic_ch)
|
||||
{
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
//设置为ANC产测模式
|
||||
audio_anc_prodution_mode_set(1);
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
audio_enc_mpt_fre_response_start(mic_ch);
|
||||
if (audio_enc_mpt_cvp_open(mic_ch)) {
|
||||
audio_enc_mpt_fre_response_release();
|
||||
}
|
||||
}
|
||||
|
||||
void audio_enc_mpt_fre_response_close(void)
|
||||
{
|
||||
audio_enc_mpt_fre_response_stop();
|
||||
audio_enc_mpt_cvp_close();
|
||||
}
|
||||
|
||||
|
||||
static u8 audio_cvp_idle_query()
|
||||
{
|
||||
return (cvp_hdl == NULL) ? 1 : 0;
|
||||
}
|
||||
|
||||
REGISTER_LP_TARGET(audio_cvp_lp_target) = {
|
||||
.name = "audio_cvp",
|
||||
.is_idle = audio_cvp_idle_query,
|
||||
};
|
||||
|
||||
//测试func
|
||||
void audio_enc_mpt_cvp_key_test()
|
||||
{
|
||||
static u8 cnt = 0;
|
||||
u16 mic_ch = 0;
|
||||
dut_cvp_log("cnt %d\n", cnt);
|
||||
|
||||
mem_stats();
|
||||
switch (cnt) {
|
||||
case 0:
|
||||
app_var.aec_mic_gain = 15;
|
||||
app_var.aec_mic1_gain = 15;
|
||||
app_var.aec_mic2_gain = 15;
|
||||
app_var.aec_mic3_gain = 15;
|
||||
mic_ch |= AUDIO_ENC_MPT_CVP_OUT;
|
||||
mic_ch |= AUDIO_ENC_MPT_TALK_MIC;
|
||||
/* mic_ch |= AUDIO_ENC_MPT_SLAVE_MIC; */
|
||||
/* mic_ch |= AUDIO_ENC_MPT_TALK_FB_MIC; */
|
||||
/* mic_ch |= AUDIO_ENC_MPT_FF_MIC; */
|
||||
/* mic_ch |= AUDIO_ENC_MPT_FB_MIC; */
|
||||
/* mic_ch |= AUDIO_ENC_MPT_RFF_MIC; */
|
||||
/* mic_ch |= AUDIO_ENC_MPT_RFB_MIC; */
|
||||
audio_enc_mpt_fre_response_open(mic_ch);
|
||||
break;
|
||||
case 1:
|
||||
audio_enc_mpt_fre_response_close();
|
||||
break;
|
||||
case 2:
|
||||
u8 *buf;
|
||||
audio_enc_mpt_fre_response_file_get(&buf);
|
||||
break;
|
||||
case 3:
|
||||
audio_enc_mpt_fre_response_release();
|
||||
break;
|
||||
}
|
||||
cnt++;
|
||||
if (cnt > 3) {
|
||||
cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
||||
434
apps/earphone/audio_enc_mpt_self.c
Normal file
434
apps/earphone/audio_enc_mpt_self.c
Normal file
@ -0,0 +1,434 @@
|
||||
|
||||
/***********************************************************
|
||||
|
||||
* Audio Enc Mass production test self
|
||||
* File : audio_enc_mpt_self.c
|
||||
* note : 自研ENC产测 声学频响测试
|
||||
|
||||
************************************************************/
|
||||
|
||||
#include "hw_fft.h"
|
||||
#include "app_config.h"
|
||||
#include "audio_enc_mpt_self.h"
|
||||
#include "generic/list.h"
|
||||
#include "system/task.h"
|
||||
|
||||
#if 0
|
||||
#define encmpt_log(x, ...) printf("[enc_mpt]" x " ", ## __VA_ARGS__)
|
||||
#else
|
||||
#define encmpt_log(...)
|
||||
#endif/*log_en*/
|
||||
|
||||
#if AUDIO_ENC_MPT_SELF_ENABLE
|
||||
|
||||
void anc_HpEst_psd(s16 *input0, float *out0_sum, int len, int *cnt);
|
||||
void anc_HpEst_psd_out(float *out0_sum, int flen, int cnt);
|
||||
|
||||
//输出数据类型
|
||||
typedef float ENC_OUT_TYPE;
|
||||
/* typedef short ENC_OUT_TYPE; */
|
||||
|
||||
typedef struct {
|
||||
struct list_head entry;
|
||||
u16 id; //对应数据通道id
|
||||
u16 len; //长度
|
||||
int cnt; //计算次数
|
||||
s16 *in; //输入地址
|
||||
ENC_OUT_TYPE *out; //输出地址
|
||||
} enc_freres_bulk;
|
||||
|
||||
typedef struct {
|
||||
u16 version;
|
||||
u16 cnt;
|
||||
u8 dat[0]; //小心double访问非对齐异常
|
||||
} enc_freres_file_t;
|
||||
|
||||
typedef struct {
|
||||
u32 id;
|
||||
u32 offset;
|
||||
u32 len;
|
||||
} enc_freres_file_head_t;
|
||||
|
||||
typedef struct {
|
||||
volatile u8 state; //状态
|
||||
u8 run_busy;
|
||||
u8 inbuf_busy;
|
||||
u16 ch; //目标通道
|
||||
/* enc_freres_bulk bulk[5];//链表,最长支持5段 */
|
||||
enc_freres_bulk *bulk;//链表,动态申请不定长
|
||||
u8 *file_data; //输出文件
|
||||
int file_len; //输出文件长度
|
||||
int in_packet_len;
|
||||
struct list_head head;
|
||||
} audio_fre_respone_t;
|
||||
|
||||
static audio_fre_respone_t *hdl;
|
||||
|
||||
#if 0 //输入数据连续性验证
|
||||
u8 *data1;
|
||||
u8 *data2;
|
||||
u8 *data3;
|
||||
#define ENC_CHECK_LEN 8192
|
||||
static u8 ainit = 0;
|
||||
static u16 offset1 = 0;
|
||||
static u16 offset2 = 0;
|
||||
static u16 offset3 = 0;
|
||||
void audio_enc_mpt_inbuf_check(u16 id, s16 *buf, int len)
|
||||
{
|
||||
if (!ainit) {
|
||||
ainit = 1;
|
||||
data1 = zalloc(ENC_CHECK_LEN);
|
||||
data2 = zalloc(ENC_CHECK_LEN);
|
||||
data3 = zalloc(ENC_CHECK_LEN);
|
||||
}
|
||||
if (id & AUDIO_ENC_MPT_FF_MIC) {
|
||||
if ((offset1 + len) > ENC_CHECK_LEN) {
|
||||
offset1 = 0;
|
||||
}
|
||||
memcpy(data1 + offset1, (u8 *)buf, len);
|
||||
offset1 += len;
|
||||
}
|
||||
if (id & AUDIO_ENC_MPT_TALK_MIC) {
|
||||
if ((offset2 + len) > ENC_CHECK_LEN) {
|
||||
offset2 = 0;
|
||||
}
|
||||
memcpy(data2 + offset2, (u8 *)buf, len);
|
||||
offset2 += len;
|
||||
}
|
||||
if (id & AUDIO_ENC_MPT_CVP_OUT) {
|
||||
if ((offset3 + len) > ENC_CHECK_LEN) {
|
||||
offset3 = 0;
|
||||
}
|
||||
memcpy(data3 + offset3, (u8 *)buf, len);
|
||||
offset3 += len;
|
||||
}
|
||||
}
|
||||
|
||||
void audio_enc_mpt_inbuf_printf(void)
|
||||
{
|
||||
int i = 0;
|
||||
s16 *dat1 = (s16 *)data1;
|
||||
s16 *dat2 = (s16 *)data2;
|
||||
s16 *dat3 = (s16 *)data3;
|
||||
encmpt_log("ff");
|
||||
for (i = 0; i < ENC_CHECK_LEN / 2; i++) {
|
||||
printf("%d\n", dat1[i]);
|
||||
}
|
||||
|
||||
encmpt_log("TALK");
|
||||
for (i = 0; i < ENC_CHECK_LEN / 2; i++) {
|
||||
printf("%d\n", dat2[i]);
|
||||
}
|
||||
|
||||
encmpt_log("cvp");
|
||||
for (i = 0; i < ENC_CHECK_LEN / 2; i++) {
|
||||
printf("%d\n", dat3[i]);
|
||||
}
|
||||
}
|
||||
#endif/*默认关闭*/
|
||||
|
||||
//id = 0 计算链表所有满足长度的节点;
|
||||
static void audio_enc_mpt_fre_response_process(u16 id)
|
||||
{
|
||||
/* return; */
|
||||
enc_freres_bulk *bulk;
|
||||
if (hdl->state != ENC_FRE_RES_STATE_RUN) {
|
||||
return;
|
||||
}
|
||||
|
||||
hdl->run_busy = 1;
|
||||
list_for_each_entry(bulk, &hdl->head, entry) {
|
||||
//原始数据指针、目标输出指针、计算长度
|
||||
if ((!id) || id == bulk->id) {
|
||||
if (bulk->len >= hdl->in_packet_len) {
|
||||
anc_HpEst_psd(bulk->in, bulk->out, AUDIO_ENC_MPT_FRERES_POINT, &bulk->cnt);
|
||||
bulk->len -= (hdl->in_packet_len >> 1);
|
||||
/* encmpt_log("process id 0X%x len %d\n", bulk->id, bulk->len); */
|
||||
if (bulk->len) { //overlap
|
||||
memcpy(bulk->in, bulk->in + (hdl->in_packet_len >> 2), bulk->len);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
hdl->run_busy = 0;
|
||||
}
|
||||
|
||||
static void audio_enc_mpt_fre_resonpse_task(void *p)
|
||||
{
|
||||
int res;
|
||||
int msg[16];
|
||||
u32 pend_timeout = portMAX_DELAY;
|
||||
encmpt_log(">>>audio_fre_res_task<<<\n");
|
||||
while (1) {
|
||||
res = os_taskq_pend(NULL, msg, ARRAY_SIZE(msg));
|
||||
if (res == OS_TASKQ) {
|
||||
switch (msg[1]) {
|
||||
case ENC_FRE_RESPONE_MSG_RUN:
|
||||
audio_enc_mpt_fre_response_process((u16)msg[2]);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
encmpt_log("res:%d,%d", res, msg[1]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//初始化链表以及的通道内容
|
||||
static void audio_enc_mpt_fre_response_bulk_init(enc_freres_file_t *file, u8 cnt, u16 id)
|
||||
{
|
||||
u8 *data_home;
|
||||
enc_freres_file_head_t *file_head = file->dat;
|
||||
|
||||
/* if (cnt > 4) { */
|
||||
/* encmpt_log("ERR:Audio enc Fre bulk full!!!\n"); */
|
||||
/* return; */
|
||||
/* } */
|
||||
|
||||
data_home = file->dat + (file->cnt * 12);
|
||||
|
||||
//file初始化head
|
||||
file_head[cnt].id = id;
|
||||
//len(byte)
|
||||
file_head[cnt].len = AUDIO_ENC_MPT_FRERES_POINT / 2 * sizeof(ENC_OUT_TYPE);
|
||||
if (cnt) {
|
||||
file_head[cnt].offset = file_head[cnt - 1].len + file_head[cnt - 1].offset;
|
||||
} else {
|
||||
file_head[cnt].offset = 0;
|
||||
}
|
||||
|
||||
hdl->bulk[cnt].id = id;
|
||||
hdl->bulk[cnt].out = (ENC_OUT_TYPE *)(data_home + file_head[cnt].offset);
|
||||
hdl->bulk[cnt].in = (s16 *)malloc(AUDIO_ENC_MPT_FRERES_POINT * sizeof(short));
|
||||
encmpt_log("hdl %x file %x, out %x, data_home %x, inbuf_len %d\n", (int)hdl->file_data, (int)file, \
|
||||
(int)hdl->bulk[cnt].out, (int)data_home, AUDIO_ENC_MPT_FRERES_POINT * sizeof(short));
|
||||
//len(byte)
|
||||
hdl->bulk[cnt].len = 0;
|
||||
/* hdl->bulk[cnt].len = AUDIO_ENC_MPT_FRERES_POINT * sizeof(short); */
|
||||
list_add_tail(&hdl->bulk[cnt].entry, &hdl->head);
|
||||
}
|
||||
|
||||
//文件内存申请,结构初始化
|
||||
static enc_freres_file_t *audio_enc_mpt_fre_response_file_init(int cnt)
|
||||
{
|
||||
enc_freres_file_t *file;
|
||||
//4byte(vesion + cnt) + cnt * (12byte (id + offset + len) + outdata)
|
||||
//以目标file文件组成结构申请空间
|
||||
//data => 复数取平方和, 因此POINT/2
|
||||
hdl->file_len = 4 + cnt * (12 + AUDIO_ENC_MPT_FRERES_POINT / 2 * sizeof(ENC_OUT_TYPE));
|
||||
|
||||
#if 0
|
||||
//评估内存是否满足当前需求
|
||||
extern size_t xPortGetPhysiceMemorySize(void);
|
||||
int cur_mem_size = xPortGetPhysiceMemorySize();
|
||||
if (cur_mem_size < hdl->file_len + 2000) { //至少余量多2000byte 才可使用该功能
|
||||
printf("ERR!!!MIC_FFT debug_buf:%lu + 2000,free_mem:%d\n", hdl->file_len, cur_mem_size);
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
encmpt_log("file init len %d\n", hdl->file_len);
|
||||
hdl->file_data = zalloc(hdl->file_len);
|
||||
file = (enc_freres_file_t *) hdl->file_data;
|
||||
file->cnt = cnt;
|
||||
return file;
|
||||
}
|
||||
|
||||
//音频测试频响计算启动, ch 对应目标的通道
|
||||
void audio_enc_mpt_fre_response_start(u16 ch)
|
||||
{
|
||||
enc_freres_file_t *file;
|
||||
int cnt = 0;
|
||||
int shift_det = 0;
|
||||
u16 det_ch = ch;
|
||||
int det_cnt = 0;
|
||||
encmpt_log("%s, ch 0x%x\n", __func__, ch);
|
||||
if (!ch) {
|
||||
return;
|
||||
}
|
||||
if (hdl) {
|
||||
//支持重入
|
||||
hdl->state = ENC_FRE_RES_STATE_START;
|
||||
audio_enc_mpt_fre_response_release();
|
||||
encmpt_log("enc_fre start again\n");
|
||||
}
|
||||
#if AUDIO_ENC_MPT_FRERES_ASYNC
|
||||
task_create(audio_enc_mpt_fre_resonpse_task, NULL, "enc_mpt_self");
|
||||
#endif/*AUDIO_ENC_MPT_FRERES_ASYNC*/
|
||||
|
||||
hdl = zalloc(sizeof(audio_fre_respone_t));
|
||||
hdl->ch = ch;
|
||||
hdl->in_packet_len = AUDIO_ENC_MPT_FRERES_POINT * sizeof(short);
|
||||
|
||||
while (det_ch) {
|
||||
if (det_ch & BIT(0)) {
|
||||
det_cnt++;
|
||||
}
|
||||
det_ch >>= 1;
|
||||
}
|
||||
file = audio_enc_mpt_fre_response_file_init(det_cnt);
|
||||
if (!file) {
|
||||
free(hdl);
|
||||
return;
|
||||
}
|
||||
|
||||
//链表初始化
|
||||
INIT_LIST_HEAD(&hdl->head);
|
||||
|
||||
//申请链表空间
|
||||
hdl->bulk = zalloc(sizeof(enc_freres_bulk) * det_cnt);
|
||||
encmpt_log("det_cnt %d, list bulk size %d\n", det_cnt, sizeof(enc_freres_bulk) * det_cnt);
|
||||
|
||||
while (ch) {
|
||||
if (ch & BIT(0)) {
|
||||
audio_enc_mpt_fre_response_bulk_init(file, cnt, BIT(shift_det));
|
||||
encmpt_log("list init %x\n", BIT(shift_det));
|
||||
cnt++;
|
||||
}
|
||||
shift_det++;
|
||||
ch >>= 1;
|
||||
}
|
||||
hdl->state = ENC_FRE_RES_STATE_RUN;
|
||||
}
|
||||
|
||||
|
||||
//更新目标通道输入buf、len
|
||||
void audio_enc_mpt_fre_response_inbuf(u16 id, s16 *buf, int len)
|
||||
{
|
||||
//len(byte)
|
||||
if (!hdl) {
|
||||
goto __err1;
|
||||
/* return; */
|
||||
}
|
||||
if (hdl->state != ENC_FRE_RES_STATE_RUN) {
|
||||
goto __err1;
|
||||
/* return; */
|
||||
}
|
||||
enc_freres_bulk *bulk;
|
||||
hdl->inbuf_busy = 1;
|
||||
list_for_each_entry(bulk, &hdl->head, entry) {
|
||||
if (id & bulk->id) {
|
||||
/* bulk->id = id; */
|
||||
if ((bulk->len + len) <= hdl->in_packet_len) {
|
||||
/* encmpt_log("inbuf id 0X%x, len %d, %d\n", id, bulk->len, len); */
|
||||
memcpy(((u8 *)bulk->in) + bulk->len, (u8 *)buf, len);
|
||||
bulk->len += len;
|
||||
} else if (bulk->len < hdl->in_packet_len) {
|
||||
encmpt_log("id 0X%x, inbuf soon be full\n", id);
|
||||
memcpy(bulk->in + (bulk->len >> 1), buf, hdl->in_packet_len - bulk->len);
|
||||
bulk->len = hdl->in_packet_len;
|
||||
} else {
|
||||
encmpt_log("id 0X%x, inbuf full\n", id);
|
||||
}
|
||||
#if AUDIO_ENC_MPT_FRERES_ASYNC
|
||||
if (bulk->len >= hdl->in_packet_len) {
|
||||
audio_enc_mpt_fre_response_post_run(bulk->id);
|
||||
}
|
||||
#endif/*AUDIO_ENC_MPT_FRERES_ASYNC*/
|
||||
|
||||
}
|
||||
}
|
||||
hdl->inbuf_busy = 0;
|
||||
|
||||
return;
|
||||
__err1:
|
||||
/* encmpt_log("inbuf err\n"); */
|
||||
int i = 0;
|
||||
while (id) {
|
||||
if (id & BIT(0)) {
|
||||
putchar('0' + i);
|
||||
}
|
||||
id >>= 1;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
//音频测试频响计算运行
|
||||
void audio_enc_mpt_fre_response_post_run(u16 id)
|
||||
{
|
||||
if (!hdl) {
|
||||
return;
|
||||
}
|
||||
if (hdl->state != ENC_FRE_RES_STATE_RUN) {
|
||||
return;
|
||||
}
|
||||
#if AUDIO_ENC_MPT_FRERES_ASYNC
|
||||
os_taskq_post_msg("enc_mpt_self", 2, ENC_FRE_RESPONE_MSG_RUN, id);
|
||||
#else
|
||||
audio_enc_mpt_fre_response_process(0);
|
||||
#endif/*AUDIO_ENC_MPT_FRERES_ASYNC*/
|
||||
}
|
||||
|
||||
//音频测试频响计算停止
|
||||
void audio_enc_mpt_fre_response_stop(void)
|
||||
{
|
||||
if (!hdl) {
|
||||
return;
|
||||
}
|
||||
encmpt_log("%s \n", __func__);
|
||||
enc_freres_bulk *bulk;
|
||||
hdl->state = ENC_FRE_RES_STATE_STOP;
|
||||
while (hdl->inbuf_busy || hdl->run_busy) {
|
||||
os_time_dly(1);
|
||||
};
|
||||
list_for_each_entry(bulk, &hdl->head, entry) {
|
||||
if (bulk->cnt) {
|
||||
//数据只有实部,因此 point >> 1
|
||||
anc_HpEst_psd_out(bulk->out, AUDIO_ENC_MPT_FRERES_POINT >> 1, bulk->cnt);
|
||||
/* encmpt_log("cnt %d \n", bulk->cnt); */
|
||||
}
|
||||
}
|
||||
encmpt_log("%s ok\n", __func__);
|
||||
}
|
||||
|
||||
//工具获取数据文件
|
||||
int audio_enc_mpt_fre_response_file_get(u8 **buf)
|
||||
{
|
||||
if (!hdl) {
|
||||
return 0;
|
||||
}
|
||||
encmpt_log("%s, len %d\n", __func__, hdl->file_len);
|
||||
*buf = hdl->file_data;
|
||||
/* audio_enc_mpt_inbuf_printf(); */
|
||||
/* put_buf(hdl->file_data + 40, hdl->file_len - 40); */
|
||||
#if 0//debug
|
||||
enc_freres_bulk *bulk;
|
||||
int point = AUDIO_ENC_MPT_FRERES_POINT / 2;
|
||||
list_for_each_entry(bulk, &hdl->head, entry) {
|
||||
encmpt_log("bulk id 0X%x\n", bulk->id);
|
||||
for (int i = 0; i < point; i++) {
|
||||
printf("%d\n", (int)(bulk->out[i] * 10000));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return hdl->file_len;
|
||||
}
|
||||
|
||||
//数据获取结束,释放内存
|
||||
void audio_enc_mpt_fre_response_release(void)
|
||||
{
|
||||
if (!hdl) {
|
||||
return;
|
||||
}
|
||||
//mic_close
|
||||
encmpt_log("%s\n", __func__);
|
||||
while (hdl->inbuf_busy || hdl->run_busy) {
|
||||
os_time_dly(1);
|
||||
};
|
||||
#if AUDIO_ENC_MPT_FRERES_ASYNC
|
||||
task_kill("enc_mpt_self");
|
||||
#endif/*AUDIO_ENC_MPT_FRERES_ASYNC*/
|
||||
enc_freres_bulk *bulk;
|
||||
list_for_each_entry(bulk, &hdl->head, entry) {
|
||||
free(bulk->in);
|
||||
}
|
||||
free(hdl->file_data);
|
||||
free(hdl->bulk);
|
||||
free(hdl);
|
||||
hdl = NULL;
|
||||
encmpt_log("%s ok\n", __func__);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif/*AUDIO_ENC_MPT_SELF_ENABLE*/
|
||||
233
apps/earphone/ble_adv.c
Normal file
233
apps/earphone/ble_adv.c
Normal file
@ -0,0 +1,233 @@
|
||||
#include "app_config.h"
|
||||
|
||||
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
|
||||
#include "earphone.h"
|
||||
#include "app_main.h"
|
||||
#include "include/bt_ble.h"
|
||||
#include "bt_common.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "system/includes.h"
|
||||
#include "bt_tws.h"
|
||||
|
||||
#define LOG_TAG "[BLE-ADV]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
typedef struct {
|
||||
u8 miss_flag: 1;
|
||||
u8 exchange_bat: 2;
|
||||
u8 poweron_flag: 1;
|
||||
u8 reserver: 4;
|
||||
} icon_ctl_t;
|
||||
|
||||
static icon_ctl_t ble_icon_contrl;
|
||||
|
||||
|
||||
int adv_earphone_state_set_page_scan_enable()
|
||||
{
|
||||
#if (TCFG_USER_TWS_ENABLE == 0)
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
#elif (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("switch_icon_ctl11...\n");
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_get_connect_mac_addr()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_cancel_page_scan()
|
||||
{
|
||||
#if (TCFG_USER_TWS_ENABLE == 1)
|
||||
#if (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
if (ble_icon_contrl.miss_flag) {
|
||||
ble_icon_contrl.miss_flag = 0;
|
||||
puts("ble_icon_contrl.miss_flag...\n");
|
||||
} else {
|
||||
printf("switch_icon_ctl00...\n");
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_tws_init(int paired)
|
||||
{
|
||||
memset(&ble_icon_contrl, 0, sizeof(icon_ctl_t));
|
||||
ble_icon_contrl.poweron_flag = 1;
|
||||
|
||||
if (paired) {
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
bt_ble_set_control_en(1);
|
||||
} else {
|
||||
//slave close
|
||||
bt_ble_set_control_en(0);
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_tws_connected(int first_pair, u8 *comm_addr)
|
||||
{
|
||||
if (first_pair) {
|
||||
bt_ble_icon_set_comm_address(comm_addr);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_enter_soft_poweroff()
|
||||
{
|
||||
#if (!TCFG_CHARGESTORE_ENABLE)
|
||||
//非智能充电仓时,做停止广播操作
|
||||
if (bt_ble_icon_get_adv_state() != ADV_ST_NULL &&
|
||||
bt_ble_icon_get_adv_state() != ADV_ST_END) {
|
||||
bt_ble_icon_close(1);
|
||||
os_time_dly(50);//盒盖时间,根据效果调整时间
|
||||
}
|
||||
#endif
|
||||
bt_ble_exit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int ble_adv_hci_event_handler(struct bt_event *bt)
|
||||
{
|
||||
switch (bt->event) {
|
||||
case HCI_EVENT_CONNECTION_COMPLETE:
|
||||
switch (bt->value) {
|
||||
case ERROR_CODE_PIN_OR_KEY_MISSING:
|
||||
#if (CONFIG_NO_DISPLAY_BUTTON_ICON && TCFG_CHARGESTORE_ENABLE)
|
||||
//已取消配对了
|
||||
if (bt_ble_icon_get_adv_state() == ADV_ST_RECONN) {
|
||||
//切换广播
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ble_adv_bt_tws_event_handler(struct bt_event *bt)
|
||||
{
|
||||
int role = bt->args[0];
|
||||
int phone_link_connection = bt->args[1];
|
||||
int reason = bt->args[2];
|
||||
|
||||
switch (bt->event) {
|
||||
case TWS_EVENT_CONNECTED:
|
||||
bt_ble_icon_slave_en(1);
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
//master enable
|
||||
log_info("master do icon_open\n");
|
||||
bt_ble_set_control_en(1);
|
||||
|
||||
if (phone_link_connection) {
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
} else {
|
||||
#if (TCFG_CHARGESTORE_ENABLE && !CONFIG_NO_DISPLAY_BUTTON_ICON)
|
||||
bt_ble_icon_open(ICON_TYPE_RECONNECT);
|
||||
#else
|
||||
if (ble_icon_contrl.poweron_flag) { //上电标记
|
||||
if (bt_user_priv_var.auto_connection_counter > 0) {
|
||||
//有回连手机动作
|
||||
/* g_printf("ICON_TYPE_RECONNECT"); */
|
||||
/* bt_ble_icon_open(ICON_TYPE_RECONNECT); //没按键配对的话,等回连成功的时候才显示电量。如果在这里显示,手机取消配对后耳机开机,会显示出按键的界面*/
|
||||
} else {
|
||||
//没有回连,设可连接
|
||||
/* g_printf("ICON_TYPE_INQUIRY"); */
|
||||
bt_ble_icon_open(ICON_TYPE_INQUIRY);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
//slave disable
|
||||
bt_ble_set_control_en(0);
|
||||
}
|
||||
ble_icon_contrl.poweron_flag = 0;
|
||||
break;
|
||||
case TWS_EVENT_CONNECTION_TIMEOUT:
|
||||
/*
|
||||
* TWS连接超时
|
||||
*/
|
||||
bt_ble_icon_slave_en(0);
|
||||
break;
|
||||
case TWS_EVENT_PHONE_LINK_DETACH:
|
||||
/*
|
||||
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
|
||||
*/
|
||||
if (reason == 0x0b) {
|
||||
//CONNECTION ALREADY EXISTS
|
||||
ble_icon_contrl.miss_flag = 1;
|
||||
} else {
|
||||
ble_icon_contrl.miss_flag = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int adv_sys_event_handler_specific(struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_BT_EVENT:
|
||||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||||
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
|
||||
ble_adv_hci_event_handler(&event->u.bt);
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||||
ble_adv_bt_tws_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_init()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_sniff(u8 state)
|
||||
{
|
||||
bt_ble_icon_state_sniff(state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int adv_earphone_state_role_switch(u8 role)
|
||||
{
|
||||
bt_ble_icon_role_switch(role);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
66
apps/earphone/board/br28/app.ld
Normal file
66
apps/earphone/board/br28/app.ld
Normal file
@ -0,0 +1,66 @@
|
||||
#include "app_config.h"
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
.text : ALIGN(4)
|
||||
{
|
||||
gsensor_dev_begin = .;
|
||||
KEEP(*(.gsensor_dev))
|
||||
gsensor_dev_end = .;
|
||||
|
||||
fm_dev_begin = .;
|
||||
KEEP(*(.fm_dev))
|
||||
fm_dev_end = .;
|
||||
|
||||
fm_emitter_dev_begin = .;
|
||||
KEEP(*(.fm_emitter_dev))
|
||||
fm_emitter_dev_end = .;
|
||||
|
||||
storage_device_begin = .;
|
||||
KEEP(*(.storage_device))
|
||||
storage_device_end = .;
|
||||
|
||||
imusensor_dev_begin = .;
|
||||
KEEP(*(.imusensor_dev))
|
||||
imusensor_dev_end = .;
|
||||
|
||||
#if TCFG_APP_PC_EN
|
||||
aac_dec_code_begin = .;
|
||||
*(.bt_aac_dec_code)
|
||||
*(.bt_aac_dec_sparse_code)
|
||||
aac_dec_code_end = .;
|
||||
aac_dec_code_size = aac_dec_code_end - aac_dec_code_begin ;
|
||||
|
||||
. = ALIGN(4);
|
||||
bt_aac_dec_const_begin = .;
|
||||
*(.bt_aac_dec_const)
|
||||
*(.bt_aac_dec_sparse_const)
|
||||
bt_aac_dec_const_end = .;
|
||||
bt_aac_dec_const_size = bt_aac_dec_const_end - bt_aac_dec_const_begin ;
|
||||
|
||||
*(.bt_aac_dec_data)
|
||||
*(.bt_aac_dec_bss)
|
||||
|
||||
. = ALIGN(4);
|
||||
*(.aac_mem)
|
||||
*(.aac_ctrl_mem)
|
||||
/* . += 0x5fe8 ; */
|
||||
/* . += 0xef88 ; */
|
||||
#endif
|
||||
|
||||
. = ALIGN(32);
|
||||
}
|
||||
|
||||
.data ALIGN(32):
|
||||
{
|
||||
} > ram0
|
||||
|
||||
.bss ALIGN(32):
|
||||
{
|
||||
} > ram0
|
||||
|
||||
.data_code ALIGN(32):
|
||||
{
|
||||
} > ram0
|
||||
|
||||
}
|
||||
164
apps/earphone/board/br28/app_overlay.ld
Normal file
164
apps/earphone/board/br28/app_overlay.ld
Normal file
@ -0,0 +1,164 @@
|
||||
|
||||
OVERLAY : AT(0x200000) SUBALIGN(4)
|
||||
{
|
||||
.overlay_aec
|
||||
{
|
||||
aec_code_begin = . ;
|
||||
*(.text._*)
|
||||
*(.data._*)
|
||||
*(.aec_code)
|
||||
*(.aec_const)
|
||||
*(.res_code)
|
||||
*(.res_const)
|
||||
*(.ns_code)
|
||||
*(.ns_const)
|
||||
*(.bark_const)
|
||||
*(.fft_code)
|
||||
*(.fft_const)
|
||||
*(.agc_code)
|
||||
*(.dms_code)
|
||||
*(.dms_const)
|
||||
*(.dms_sparse_code)
|
||||
aec_code_end = . ;
|
||||
aec_code_size = aec_code_end - aec_code_begin ;
|
||||
|
||||
*(.msbc_enc)
|
||||
*(.cvsd_codec)
|
||||
*(.aec_bss)
|
||||
*(.aec_data)
|
||||
*(.res_data)
|
||||
*(.ns_data)
|
||||
*(.dns_common_data)
|
||||
*(.dns_param_data_single)
|
||||
*(.dns_param_data_dual)
|
||||
*(.jlsp_nlp_code)
|
||||
*(.jlsp_nlp_const)
|
||||
*(.jlsp_aec_code)
|
||||
*(.jlsp_aec_const)
|
||||
*(.jlsp_prep_code)
|
||||
*(.jlsp_prep_const)
|
||||
*(.jlsp_enc_code)
|
||||
*(.jlsp_enc_const)
|
||||
*(.jlsp_wn_code)
|
||||
*(.jlsp_wn_const)
|
||||
*(.jlsp_tri_code)
|
||||
*(.jlsp_tri_const)
|
||||
*(.jlsp_agc_code)
|
||||
*(.jlsp_agc_const)
|
||||
*(.res_bss)
|
||||
*(.ns_bss)
|
||||
*(.aec_mem)
|
||||
}
|
||||
.overlay_aac
|
||||
{
|
||||
#if !TCFG_APP_PC_EN
|
||||
aac_dec_code_begin = .;
|
||||
*(.bt_aac_dec_code)
|
||||
*(.bt_aac_dec_sparse_code)
|
||||
aac_dec_code_end = .;
|
||||
aac_dec_code_size = aac_dec_code_end - aac_dec_code_begin ;
|
||||
|
||||
. = ALIGN(4);
|
||||
bt_aac_dec_const_begin = .;
|
||||
*(.bt_aac_dec_const)
|
||||
*(.bt_aac_dec_sparse_const)
|
||||
bt_aac_dec_const_end = .;
|
||||
bt_aac_dec_const_size = bt_aac_dec_const_end - bt_aac_dec_const_begin ;
|
||||
|
||||
*(.bt_aac_dec_data)
|
||||
*(.bt_aac_dec_bss)
|
||||
|
||||
. = ALIGN(4);
|
||||
*(.aac_mem)
|
||||
*(.aac_ctrl_mem)
|
||||
/* . += 0x5fe8 ; */
|
||||
/* . += 0xef88 ; */
|
||||
#endif
|
||||
}
|
||||
/*
|
||||
.overlay_lc3
|
||||
{
|
||||
lc3_dec_code_begin = .;
|
||||
*(.lc3_dec_code)
|
||||
lc3_dec_code_end = .;
|
||||
lc3_dec_code_size = lc3_dec_code_end - lc3_dec_code_begin;
|
||||
|
||||
. = ALIGN(4);
|
||||
lc3_dec_const_begin = .;
|
||||
*(.lc3_dec_const)
|
||||
lc3_dec_const_end = .;
|
||||
lc3_dec_const_size = lc3_dec_const_end - lc3_dec_const_begin;
|
||||
*(.lc3_dec_data)
|
||||
*(.lc3_dec_bss)
|
||||
}
|
||||
*/
|
||||
|
||||
.overlay_mp3
|
||||
{
|
||||
*(.mp3_mem)
|
||||
*(.mp3_ctrl_mem)
|
||||
*(.mp3pick_mem)
|
||||
*(.mp3pick_ctrl_mem)
|
||||
*(.dec2tws_mem)
|
||||
}
|
||||
.overlay_wma
|
||||
{
|
||||
*(.wma_mem)
|
||||
*(.wma_ctrl_mem)
|
||||
*(.wmapick_mem)
|
||||
*(.wmapick_ctrl_mem)
|
||||
}
|
||||
.overlay_wav
|
||||
{
|
||||
*(.wav_mem)
|
||||
*(.wav_ctrl_mem)
|
||||
}
|
||||
.overlay_ape
|
||||
{
|
||||
*(.ape_mem)
|
||||
*(.ape_ctrl_mem)
|
||||
}
|
||||
.overlay_flac
|
||||
{
|
||||
*(.flac_mem)
|
||||
*(.flac_ctrl_mem)
|
||||
}
|
||||
.overlay_m4a
|
||||
{
|
||||
*(.m4a_mem)
|
||||
*(.m4a_ctrl_mem)
|
||||
}
|
||||
.overlay_amr
|
||||
{
|
||||
*(.amr_mem)
|
||||
*(.amr_ctrl_mem)
|
||||
}
|
||||
.overlay_dts
|
||||
{
|
||||
*(.dts_mem)
|
||||
*(.dts_ctrl_mem)
|
||||
}
|
||||
.overlay_fm
|
||||
{
|
||||
*(.fm_mem)
|
||||
}
|
||||
.overlay_pc
|
||||
{
|
||||
*(.usb_audio_play_dma)
|
||||
*(.usb_audio_rec_dma)
|
||||
*(.uac_rx)
|
||||
*(.mass_storage)
|
||||
|
||||
*(.usb_ep0)
|
||||
*(.usb_msd_dma)
|
||||
*(.usb_hid_dma)
|
||||
*(.usb_iso_dma)
|
||||
*(.usb_cdc_dma)
|
||||
*(.uac_var)
|
||||
*(.usb_config_var)
|
||||
*(.cdc_var)
|
||||
}
|
||||
|
||||
} > ram0
|
||||
|
||||
|
||||
27
apps/earphone/board/br28/board_config.h
Normal file
27
apps/earphone/board/br28/board_config.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef BOARD_CONFIG_H
|
||||
#define BOARD_CONFIG_H
|
||||
|
||||
|
||||
/*
|
||||
* 板级配置选择
|
||||
*/
|
||||
#define CONFIG_BOARD_JL701N_DEMO //编译正常 2025-4-29
|
||||
// #define CONFIG_BOARD_JL701N_BTEMITTER
|
||||
// #define CONFIG_BOARD_JL701N_ANC
|
||||
// #define CONFIG_BOARD_JL7016G_HYBRID
|
||||
// #define CONFIG_BOARD_JL7018F_DEMO //编译不过 2025-4-29
|
||||
|
||||
#include "media/audio_def.h"
|
||||
#include "board_jl701n_demo_cfg.h"
|
||||
#include "board_jl701n_btemitter_cfg.h"
|
||||
#include "board_jl701n_anc_cfg.h"
|
||||
#include "board_jl7016g_hybrid_cfg.h"
|
||||
#include "board_jl7018f_demo_cfg.h"
|
||||
|
||||
#define DUT_AUDIO_DAC_LDO_VOLT DACVDD_LDO_1_25V
|
||||
|
||||
#ifdef CONFIG_NEW_CFG_TOOL_ENABLE
|
||||
#define CONFIG_ENTRY_ADDRESS 0x6000100
|
||||
#endif
|
||||
|
||||
#endif
|
||||
1025
apps/earphone/board/br28/board_jl7016g_hybrid.c
Normal file
1025
apps/earphone/board/br28/board_jl7016g_hybrid.c
Normal file
File diff suppressed because it is too large
Load Diff
1111
apps/earphone/board/br28/board_jl7016g_hybrid_cfg.h
Normal file
1111
apps/earphone/board/br28/board_jl7016g_hybrid_cfg.h
Normal file
File diff suppressed because it is too large
Load Diff
123
apps/earphone/board/br28/board_jl7016g_hybrid_global_build_cfg.h
Normal file
123
apps/earphone/board/br28/board_jl7016g_hybrid_global_build_cfg.h
Normal file
@ -0,0 +1,123 @@
|
||||
#ifndef CONFIG_BOARD_JL7016G_HYBRID_POST_BUILD_CFG_H
|
||||
#define CONFIG_BOARD_JL7016G_HYBRID_POST_BUILD_CFG_H
|
||||
|
||||
/* 改文件只添加和isd_config.ini相关的配置,用以生成isd_config.ini */
|
||||
/* 其他不相关的配置请勿添加在改文件 */
|
||||
|
||||
#ifdef CONFIG_BOARD_JL7016G_HYBRID
|
||||
|
||||
/* Following Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
#define CONFIG_DOUBLE_BANK_ENABLE 0 //单双备份选择(若打开了改宏,FLASH结构变为双备份结构,适用于接入第三方协议的OTA, PS: JL-OTA同样支持双备份升级, 需要根据实际FLASH大小同时配置CONFIG_FLASH_SIZE)
|
||||
#define CONFIG_APP_OTA_ENABLE 0 //是否支持RCSP升级(JL-OTA)
|
||||
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0 //配置升级到loader的方式0为直接reset,1为跳转(适用于芯片电源由IO口KEEP住的方案,需要注意检查跳转前是否将使用DMA的硬件模块全部关闭)
|
||||
|
||||
#define CONFIG_IO_KEY_EN 0 //配置是否使用IO按键,配合RESET1
|
||||
#define CONFIG_UPDATE_WITH_MD5_CHECK_EN 0 //配置升级是否支持MD5校验
|
||||
|
||||
#define CONFIG_ANC_ENABLE 1 //配置是否支持ANC
|
||||
|
||||
//flash size vaule definition
|
||||
#define FLASH_SIZE_256K 0x40000
|
||||
#define FLASH_SIZE_512K 0x80000
|
||||
#define FLASH_SIZE_1M 0x100000
|
||||
#define FLASH_SIZE_2M 0x200000
|
||||
#define FLASH_SIZE_4M 0x400000
|
||||
|
||||
#define CONFIG_FLASH_SIZE FLASH_SIZE_1M //配置FLASH大小
|
||||
|
||||
|
||||
/* Above Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
/* Following Macros Only For Post Bulid Configuaration */
|
||||
|
||||
#define CONFIG_DB_UPDATE_DATA_GENERATE_EN 0 //是否生成db_data.bin(用于第三方协议接入使用)
|
||||
#define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 0 //ufw只生成1份4K对齐的代码
|
||||
|
||||
//config for supported chip version
|
||||
#ifdef CONFIG_BR30_C_VERSION
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION C
|
||||
#else
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION B,D,E,M,N,O,P
|
||||
#endif
|
||||
|
||||
//DON'T MODIFY THIS CONFIG EXCEPT SDK PUBLISHER
|
||||
#define CONFIG_CHIP_NAME AC701N //除了SDK发布者,请不要修改
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_PID AC701N //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_VID 0.01 //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
|
||||
//Project with bluetooth,it must use OSC as PLL_SOURCE;
|
||||
#define CONFIG_PLL_SOURCE_USING_LRC 0 //PLL时钟源选择 1:LRC 2:OSC
|
||||
|
||||
//config alignment size unit
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
#define ALIGN_UNIT_256B 1 //FLASH对齐方式选择,如果是256K的FLASH,选择256BYTE对齐方式
|
||||
#else
|
||||
#define ALIGN_UNIT_256B 0
|
||||
#endif
|
||||
|
||||
//partial platform check this config to select the uart IO for wired update
|
||||
#define CONFIG_UART_UPDATE_PIN PP00
|
||||
|
||||
//isd_download loader/uboot/update_loader debug io config
|
||||
//#define CONFIG_UBOOT_DEBUG_PIN PA05
|
||||
//#define CONFIG_UBOOT_DEBUG_BAUD_RATE 1000000
|
||||
|
||||
//config long-press reset io pin,time,trigger level
|
||||
#define CONFIG_RESET_PIN LDO //io pin
|
||||
#define CONFIG_RESET_TIME 04 //unit:second
|
||||
#define CONFIG_RESET_LEVEL 1 //tigger level(0/1)
|
||||
|
||||
#if CONFIG_IO_KEY_EN
|
||||
#define CONFIG_SUPPORT_RESET1
|
||||
#define CONFIG_RESET1_PIN PB01 //io pin
|
||||
#define CONFIG_RESET1_TIME 08 //unit:second
|
||||
#define CONFIG_RESET1_LEVEL 0 //tigger level(0/1)
|
||||
#endif
|
||||
|
||||
//reserved three custom cfg item for the future definition
|
||||
//#define CONFIG_CUSTOM_CFG1_TYPE POWER_PIN
|
||||
//#define CONFIG_CUSTOM_CFG1_VALUE PC01_1
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG2_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG2_VALUE
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG3_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG3_VALUE
|
||||
|
||||
|
||||
//#define CONFIG_VDDIO_LVD_LEVEL 4 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
|
||||
|
||||
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
|
||||
#define CONFIG_VM_LEAST_SIZE 8K
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_VM_OPT 1
|
||||
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_BTIF_OPT 1
|
||||
|
||||
//reserved two custom cfg area for the future definition
|
||||
//#define CONFIG_RESERVED_AREA1 EXIF1
|
||||
#ifdef CONFIG_RESERVED_AREA1
|
||||
#define CONFIG_RESERVED_AREA1_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA1_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA1_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
//#define CONFIG_RESERVED_AREA2 EXIF2
|
||||
#ifdef CONFIG_RESERVED_AREA2
|
||||
#define CONFIG_RESERVED_AREA2_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA2_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA2_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
/* Above Macros Only For Post Bulid Configuaration */
|
||||
#endif /* #ifdef CONFIG_BOARD_JL7016G_HYBRID */
|
||||
|
||||
#endif /* #ifndef CONFIG_BOARD_JL701N_ANC_POST_BUILD_CFG_H */
|
||||
|
||||
1038
apps/earphone/board/br28/board_jl7018f_demo.c
Normal file
1038
apps/earphone/board/br28/board_jl7018f_demo.c
Normal file
File diff suppressed because it is too large
Load Diff
1119
apps/earphone/board/br28/board_jl7018f_demo_cfg.h
Normal file
1119
apps/earphone/board/br28/board_jl7018f_demo_cfg.h
Normal file
File diff suppressed because it is too large
Load Diff
123
apps/earphone/board/br28/board_jl7018f_demo_global_build_cfg.h
Normal file
123
apps/earphone/board/br28/board_jl7018f_demo_global_build_cfg.h
Normal file
@ -0,0 +1,123 @@
|
||||
#ifndef CONFIG_BOARD_JL7018F_DEMO_POST_BUILD_CFG_H
|
||||
#define CONFIG_BOARD_JL7018F_DEMO_POST_BUILD_CFG_H
|
||||
|
||||
/* 改文件只添加和isd_config.ini相关的配置,用以生成isd_config.ini */
|
||||
/* 其他不相关的配置请勿添加在改文件 */
|
||||
|
||||
#ifdef CONFIG_BOARD_JL7018F_DEMO
|
||||
|
||||
/* Following Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
#define CONFIG_DOUBLE_BANK_ENABLE 0 //单双备份选择(若打开了改宏,FLASH结构变为双备份结构,适用于接入第三方协议的OTA, PS: JL-OTA同样支持双备份升级, 需要根据实际FLASH大小同时配置CONFIG_FLASH_SIZE)
|
||||
#define CONFIG_APP_OTA_ENABLE 0 //是否支持RCSP升级(JL-OTA)
|
||||
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0 //配置升级到loader的方式0为直接reset,1为跳转(适用于芯片电源由IO口KEEP住的方案,需要注意检查跳转前是否将使用DMA的硬件模块全部关闭)
|
||||
|
||||
#define CONFIG_IO_KEY_EN 0 //配置是否使用IO按键,配合RESET1
|
||||
#define CONFIG_UPDATE_WITH_MD5_CHECK_EN 0 //配置升级是否支持MD5校验
|
||||
|
||||
#define CONFIG_ANC_ENABLE 1 //配置是否支持ANC
|
||||
|
||||
//flash size vaule definition
|
||||
#define FLASH_SIZE_256K 0x40000
|
||||
#define FLASH_SIZE_512K 0x80000
|
||||
#define FLASH_SIZE_1M 0x100000
|
||||
#define FLASH_SIZE_2M 0x200000
|
||||
#define FLASH_SIZE_4M 0x400000
|
||||
|
||||
#define CONFIG_FLASH_SIZE FLASH_SIZE_1M //配置FLASH大小
|
||||
|
||||
|
||||
/* Above Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
/* Following Macros Only For Post Bulid Configuaration */
|
||||
|
||||
#define CONFIG_DB_UPDATE_DATA_GENERATE_EN 0 //是否生成db_data.bin(用于第三方协议接入使用)
|
||||
#define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 0 //ufw只生成1份4K对齐的代码
|
||||
|
||||
//config for supported chip version
|
||||
#ifdef CONFIG_BR30_C_VERSION
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION C
|
||||
#else
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION B,D,E,M,N,O,P
|
||||
#endif
|
||||
|
||||
//DON'T MODIFY THIS CONFIG EXCEPT SDK PUBLISHER
|
||||
#define CONFIG_CHIP_NAME AC701N //除了SDK发布者,请不要修改
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_PID AC701N //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_VID 0.01 //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
|
||||
//Project with bluetooth,it must use OSC as PLL_SOURCE;
|
||||
#define CONFIG_PLL_SOURCE_USING_LRC 0 //PLL时钟源选择 1:LRC 2:OSC
|
||||
|
||||
//config alignment size unit
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
#define ALIGN_UNIT_256B 1 //FLASH对齐方式选择,如果是256K的FLASH,选择256BYTE对齐方式
|
||||
#else
|
||||
#define ALIGN_UNIT_256B 0
|
||||
#endif
|
||||
|
||||
//partial platform check this config to select the uart IO for wired update
|
||||
#define CONFIG_UART_UPDATE_PIN PP00
|
||||
|
||||
//isd_download loader/uboot/update_loader debug io config
|
||||
//#define CONFIG_UBOOT_DEBUG_PIN PA05
|
||||
//#define CONFIG_UBOOT_DEBUG_BAUD_RATE 1000000
|
||||
|
||||
//config long-press reset io pin,time,trigger level
|
||||
#define CONFIG_RESET_PIN LDO //io pin
|
||||
#define CONFIG_RESET_TIME 04 //unit:second
|
||||
#define CONFIG_RESET_LEVEL 1 //tigger level(0/1)
|
||||
|
||||
#if CONFIG_IO_KEY_EN
|
||||
#define CONFIG_SUPPORT_RESET1
|
||||
#define CONFIG_RESET1_PIN PB01 //io pin
|
||||
#define CONFIG_RESET1_TIME 08 //unit:second
|
||||
#define CONFIG_RESET1_LEVEL 0 //tigger level(0/1)
|
||||
#endif
|
||||
|
||||
//reserved three custom cfg item for the future definition
|
||||
//#define CONFIG_CUSTOM_CFG1_TYPE POWER_PIN
|
||||
//#define CONFIG_CUSTOM_CFG1_VALUE PC01_1
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG2_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG2_VALUE
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG3_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG3_VALUE
|
||||
|
||||
|
||||
//#define CONFIG_VDDIO_LVD_LEVEL 4 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
|
||||
|
||||
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
|
||||
#define CONFIG_VM_LEAST_SIZE 8K
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_VM_OPT 1
|
||||
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_BTIF_OPT 1
|
||||
|
||||
//reserved two custom cfg area for the future definition
|
||||
//#define CONFIG_RESERVED_AREA1 EXIF1
|
||||
#ifdef CONFIG_RESERVED_AREA1
|
||||
#define CONFIG_RESERVED_AREA1_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA1_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA1_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
//#define CONFIG_RESERVED_AREA2 EXIF2
|
||||
#ifdef CONFIG_RESERVED_AREA2
|
||||
#define CONFIG_RESERVED_AREA2_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA2_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA2_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
/* Above Macros Only For Post Bulid Configuaration */
|
||||
#endif /* #ifdef CONFIG_BOARD_JL7018F_DEMO */
|
||||
|
||||
#endif /* #ifndef CONFIG_BOARD_JL7018F_DEMO_POST_BUILD_CFG_H */
|
||||
|
||||
992
apps/earphone/board/br28/board_jl701n_anc.c
Normal file
992
apps/earphone/board/br28/board_jl701n_anc.c
Normal file
@ -0,0 +1,992 @@
|
||||
#include "app_config.h"
|
||||
|
||||
#ifdef CONFIG_BOARD_JL701N_ANC
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "asm/sdmmc.h"
|
||||
#include "asm/chargestore.h"
|
||||
#include "asm/umidigi_chargestore.h"
|
||||
#include "asm/charge.h"
|
||||
#include "asm/pwm_led.h"
|
||||
#include "tone_player.h"
|
||||
#include "audio_config.h"
|
||||
#include "gSensor/gSensor_manage.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "asm/lp_touch_key_api.h"
|
||||
#include "user_cfg.h"
|
||||
#include "norflash_sfc.h"
|
||||
#include "asm/power/power_port.h"
|
||||
#include "app_umidigi_chargestore.h"
|
||||
#include "audio_link.h"
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
|
||||
#define LOG_TAG_CONST BOARD
|
||||
#define LOG_TAG "[BOARD]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
void board_power_init(void);
|
||||
|
||||
/*各个状态下默认的闪灯方式和提示音设置,如果USER_CFG中设置了USE_CONFIG_STATUS_SETTING为1,则会从配置文件读取对应的配置来填充改结构体*/
|
||||
STATUS_CONFIG status_config = {
|
||||
//灯状态设置
|
||||
.led = {
|
||||
.charge_start = PWM_LED1_ON,
|
||||
.charge_full = PWM_LED0_ON,
|
||||
.power_on = PWM_LED0_ON,
|
||||
.power_off = PWM_LED1_FLASH_THREE,
|
||||
.lowpower = PWM_LED1_SLOW_FLASH,
|
||||
.max_vol = PWM_LED_NULL,
|
||||
.phone_in = PWM_LED_NULL,
|
||||
.phone_out = PWM_LED_NULL,
|
||||
.phone_activ = PWM_LED_NULL,
|
||||
.bt_init_ok = PWM_LED0_LED1_SLOW_FLASH,
|
||||
.bt_connect_ok = PWM_LED0_ONE_FLASH_5S,
|
||||
.bt_disconnect = PWM_LED0_LED1_FAST_FLASH,
|
||||
.tws_connect_ok = PWM_LED0_LED1_FAST_FLASH,
|
||||
.tws_disconnect = PWM_LED0_LED1_SLOW_FLASH,
|
||||
},
|
||||
//提示音设置
|
||||
.tone = {
|
||||
.charge_start = IDEX_TONE_NONE,
|
||||
.charge_full = IDEX_TONE_NONE,
|
||||
.power_on = IDEX_TONE_POWER_ON,
|
||||
.power_off = IDEX_TONE_POWER_OFF,
|
||||
.lowpower = IDEX_TONE_LOW_POWER,
|
||||
.max_vol = IDEX_TONE_MAX_VOL,
|
||||
.phone_in = IDEX_TONE_NONE,
|
||||
.phone_out = IDEX_TONE_NONE,
|
||||
.phone_activ = IDEX_TONE_NONE,
|
||||
.bt_init_ok = IDEX_TONE_BT_MODE,
|
||||
.bt_connect_ok = IDEX_TONE_BT_CONN,
|
||||
.bt_disconnect = IDEX_TONE_BT_DISCONN,
|
||||
.tws_connect_ok = IDEX_TONE_TWS_CONN,
|
||||
.tws_disconnect = IDEX_TONE_TWS_DISCONN,
|
||||
}
|
||||
};
|
||||
|
||||
#define __this (&status_config)
|
||||
|
||||
/************************** KEY MSG****************************/
|
||||
/*各个按键的消息设置,如果USER_CFG中设置了USE_CONFIG_KEY_SETTING为1,则会从配置文件读取对应的配置来填充改结构体*/
|
||||
#if CLIENT_BOARD == CUSTOM10_CFG
|
||||
u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
// SHORT LONG HOLD UP DOUBLE TRIPLE
|
||||
{KEY_MUSIC_PP, KEY_NULL, KEY_NULL, KEY_NULL, KEY_ANC_SWITCH, KEY_NULL}, //KEY_0
|
||||
{KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_OPEN_SIRI, KEY_NULL}, //KEY_1
|
||||
{KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_HID_CONTROL, KEY_NULL}, //KEY_2
|
||||
};
|
||||
#else
|
||||
u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
// SHORT LONG HOLD UP DOUBLE TRIPLE
|
||||
{KEY_MUSIC_PP, KEY_ANC_SWITCH, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL}, //KEY_0
|
||||
{KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_OPEN_SIRI, KEY_NULL}, //KEY_1
|
||||
{KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_HID_CONTROL, KEY_NULL}, //KEY_2
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
// *INDENT-OFF*
|
||||
/************************** UART config****************************/
|
||||
#if TCFG_UART0_ENABLE
|
||||
UART0_PLATFORM_DATA_BEGIN(uart0_data)
|
||||
.tx_pin = TCFG_UART0_TX_PORT, //串口打印TX引脚选择
|
||||
.rx_pin = TCFG_UART0_RX_PORT, //串口打印RX引脚选择
|
||||
.baudrate = TCFG_UART0_BAUDRATE, //串口波特率
|
||||
|
||||
.flags = UART_DEBUG, //串口用来打印需要把改参数设置为UART_DEBUG
|
||||
UART0_PLATFORM_DATA_END()
|
||||
#endif //TCFG_UART0_ENABLE
|
||||
|
||||
/************************** CHARGE config****************************/
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
CHARGE_PLATFORM_DATA_BEGIN(charge_data)
|
||||
.charge_en = TCFG_CHARGE_ENABLE, //内置充电使能
|
||||
.charge_poweron_en = TCFG_CHARGE_POWERON_ENABLE, //是否支持充电开机
|
||||
.charge_full_V = TCFG_CHARGE_FULL_V, //充电截止电压
|
||||
.charge_full_mA = TCFG_CHARGE_FULL_MA, //充电截止电流
|
||||
.charge_mA = TCFG_CHARGE_MA, //恒流充电电流
|
||||
.charge_trickle_mA = TCFG_CHARGE_TRICKLE_MA, //涓流充电电流
|
||||
/*ldo5v拔出过滤值,过滤时间 = (filter*2 + 20)ms,ldoin<0.6V且时间大于过滤时间才认为拔出
|
||||
对于充满直接从5V掉到0V的充电仓,该值必须设置成0,对于充满由5V先掉到0V之后再升压到xV的
|
||||
充电仓,需要根据实际情况设置该值大小*/
|
||||
.ldo5v_off_filter = 100,
|
||||
.ldo5v_on_filter = 50,
|
||||
.ldo5v_keep_filter = 220,
|
||||
.ldo5v_pulldown_lvl = CHARGE_PULLDOWN_200K, //下拉电阻档位选择
|
||||
.ldo5v_pulldown_keep = 0,
|
||||
//1、对于自动升压充电舱,若充电舱需要更大的负载才能检测到插入时,请将该变量置1,并且根据需求配置下拉电阻档位
|
||||
//2、对于按键升压,并且是通过上拉电阻去提供维持电压的舱,请将该变量设置1,并且根据舱的上拉配置下拉需要的电阻挡位
|
||||
//3、对于常5V的舱,可将改变量设为0,省功耗
|
||||
//4、为LDOIN防止被误触发唤醒,可设置为200k下拉
|
||||
.ldo5v_pulldown_en = 1,
|
||||
CHARGE_PLATFORM_DATA_END()
|
||||
#endif//TCFG_CHARGE_ENABLE
|
||||
|
||||
/************************** chargestore config****************************/
|
||||
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
|
||||
CHARGESTORE_PLATFORM_DATA_BEGIN(chargestore_data)
|
||||
.io_port = TCFG_CHARGESTORE_PORT,
|
||||
CHARGESTORE_PLATFORM_DATA_END()
|
||||
#endif
|
||||
|
||||
/************************** DAC ****************************/
|
||||
#if TCFG_AUDIO_DAC_ENABLE
|
||||
struct dac_platform_data dac_data = {
|
||||
.mode = TCFG_AUDIO_DAC_MODE, //dac输出模式
|
||||
.ldo_id = TCFG_AUDIO_DAC_LDO_SEL, //保留位
|
||||
.pa_mute_port = TCFG_AUDIO_DAC_PA_PORT, //暂时无作用
|
||||
.vcmo_en = 0, //是否打开VCOMO
|
||||
.pa_mute_value = 1, //暂时无作用
|
||||
.output = TCFG_AUDIO_DAC_CONNECT_MODE, //DAC输出配置,和具体硬件连接有关,需根据硬件来设置
|
||||
.lpf_isel = 0xf,
|
||||
.sys_vol_type = SYS_VOL_TYPE, //系统音量选择:模拟音量/数字音量,调节时调节对应的音量
|
||||
.max_ana_vol = MAX_ANA_VOL, //模拟音量最大等级
|
||||
.max_dig_vol = MAX_DIG_VOL, //数字音量最大等级
|
||||
/* .dig_vol_tab = (s16 *)dig_vol_table, //数字音量表 */
|
||||
.vcm_cap_en = 1, //配1代表走外部通路,vcm上有电容时,可以提升电路抑制电源噪声能力,提高ADC的性能,配0相当于vcm上无电容,抑制电源噪声能力下降,ADC性能下降
|
||||
#if (SYS_VOL_TYPE == VOL_TYPE_AD)
|
||||
.digital_gain_limit = 16384,
|
||||
#endif // #if (SYS_VOL_TYPE == VOL_TYPE_AD)
|
||||
|
||||
.power_on_mode = 0,
|
||||
};
|
||||
#endif
|
||||
|
||||
/************************** ADC ****************************/
|
||||
#if TCFG_AUDIO_ADC_ENABLE
|
||||
#ifndef TCFG_AUDIO_MIC0_BIAS_EN
|
||||
#define TCFG_AUDIO_MIC0_BIAS_EN 0
|
||||
#endif/*TCFG_AUDIO_MIC0_BIAS_EN*/
|
||||
#ifndef TCFG_AUDIO_MIC1_BIAS_EN
|
||||
#define TCFG_AUDIO_MIC1_BIAS_EN 0
|
||||
#endif/*TCFG_AUDIO_MIC1_BIAS_EN*/
|
||||
#ifndef TCFG_AUDIO_MIC2_BIAS_EN
|
||||
#define TCFG_AUDIO_MIC2_BIAS_EN 0
|
||||
#endif/*TCFG_AUDIO_MIC2_BIAS_EN*/
|
||||
#ifndef TCFG_AUDIO_MIC3_BIAS_EN
|
||||
#define TCFG_AUDIO_MIC3_BIAS_EN 0
|
||||
#endif/*TCFG_AUDIO_MIC3_BIAS_EN*/
|
||||
#ifndef TCFG_AUDIO_MIC_LDO_EN
|
||||
#define TCFG_AUDIO_MIC_LDO_EN 0
|
||||
#endif/*TCFG_AUDIO_MIC_LDO_EN*/
|
||||
|
||||
struct adc_platform_data adc_data = {
|
||||
|
||||
/*MIC LDO电流档位设置:
|
||||
0:0.625ua 1:1.25ua 2:1.875ua 3:2.5ua*/
|
||||
.mic_ldo_isel = TCFG_AUDIO_ADC_LD0_SEL,
|
||||
|
||||
/*mic_mode 工作模式定义
|
||||
#define AUDIO_MIC_CAP_MODE 0 //单端隔直电容模式
|
||||
#define AUDIO_MIC_CAP_DIFF_MODE 1 //差分隔直电容模式
|
||||
#define AUDIO_MIC_CAPLESS_MODE 2 //单端省电容模式
|
||||
*/
|
||||
.mic_mode = TCFG_AUDIO_MIC_MODE,
|
||||
.mic1_mode = TCFG_AUDIO_MIC1_MODE,
|
||||
.mic2_mode = TCFG_AUDIO_MIC2_MODE,
|
||||
.mic3_mode = TCFG_AUDIO_MIC3_MODE,
|
||||
|
||||
.mic_bias_inside = TCFG_AUDIO_MIC0_BIAS_EN,
|
||||
.mic1_bias_inside = TCFG_AUDIO_MIC1_BIAS_EN,
|
||||
.mic2_bias_inside = TCFG_AUDIO_MIC2_BIAS_EN,
|
||||
.mic3_bias_inside = TCFG_AUDIO_MIC3_BIAS_EN,
|
||||
|
||||
/*MICLDO供电输出到PAD(PA0)控制使能*/
|
||||
.mic_ldo_pwr = TCFG_AUDIO_MIC_LDO_EN, // MIC LDO 输出到 PA0
|
||||
|
||||
/*MIC免电容方案需要设置,影响MIC的偏置电压
|
||||
0b0001~0b1001 : 0.5k ~ 4.5k step = 0.5k
|
||||
0b1010~0b1111 : 5k ~ 10k step = 1k */
|
||||
.mic_bias_res = 4,
|
||||
.mic1_bias_res = 4,
|
||||
.mic2_bias_res = 4,
|
||||
.mic3_bias_res = 4,
|
||||
/*MIC LDO电压档位设置,也会影响MIC的偏置电压
|
||||
3:2.0v 4:2.2v 5:2.4v 6:2.6v 7:2.8v */
|
||||
.mic_ldo_vsel = 5,
|
||||
//mic的去直流dcc寄存器配置值,可配0到15,数值越大,其高通转折点越低
|
||||
.mic_dcc = 8,
|
||||
/*ADC低功耗等级,越大功耗越低,对应影响THD和底噪, 范围 (0 - 2)*/
|
||||
.lowpower_lvl = 0,
|
||||
|
||||
};
|
||||
#endif
|
||||
|
||||
const struct vad_mic_platform_data vad_mic_data = {
|
||||
.mic_data = { //
|
||||
.mic_mode = TCFG_AUDIO_MIC_MODE,
|
||||
.mic_ldo_isel = 2,
|
||||
.mic_ldo_vsel = 5,
|
||||
.mic_ldo2PAD_en = 1,
|
||||
.mic_bias_en = 0,
|
||||
.mic_bias_res = 0,
|
||||
.mic_bias_inside = TCFG_AUDIO_MIC0_BIAS_EN,
|
||||
/* ADC偏置电阻配置*/
|
||||
.adc_rbs = 3,
|
||||
/* ADC输入电阻配置*/
|
||||
.adc_rin = 3,
|
||||
/*.adc_test = 1,*/
|
||||
},
|
||||
.power_data = {
|
||||
/*VADLDO电压档位:0~7*/
|
||||
.ldo_vs = 3,
|
||||
/*VADLDO误差运放电流档位:0~3*/
|
||||
#if TCFG_VAD_LOWPOWER_CLOCK == VAD_CLOCK_USE_PMU_STD12M
|
||||
.ldo_is = 1,
|
||||
#else
|
||||
.ldo_is = 2,
|
||||
#endif
|
||||
.clock = TCFG_VAD_LOWPOWER_CLOCK, /*VAD时钟选项*/
|
||||
.acm_select = 8,
|
||||
},
|
||||
};
|
||||
/* struct audio_pf_data audio_pf_d = { */
|
||||
/* #if TCFG_AUDIO_DAC_ENABLE */
|
||||
/* .adc_pf_data = &adc_data, */
|
||||
/* #endif */
|
||||
|
||||
/* #if TCFG_AUDIO_ADC_ENABLE */
|
||||
/* .dac_pf_data = &dac_data, */
|
||||
/* #endif */
|
||||
/* }; */
|
||||
|
||||
/* struct audio_platform_data audio_data = { */
|
||||
/* .private_data = (void *) &audio_pf_d, */
|
||||
/* }; */
|
||||
|
||||
|
||||
/************************** IO KEY ****************************/
|
||||
#if TCFG_IOKEY_ENABLE
|
||||
const struct iokey_port iokey_list[] = {
|
||||
|
||||
{
|
||||
.connect_way = TCFG_IOKEY_POWER_CONNECT_WAY, //IO按键的连接方式
|
||||
.key_type.one_io.port = TCFG_IOKEY_POWER_ONE_PORT, //IO按键对应的引脚
|
||||
.key_value = 0, //按键值
|
||||
},
|
||||
};
|
||||
const struct iokey_platform_data iokey_data = {
|
||||
.enable = TCFG_IOKEY_ENABLE, //是否使能IO按键
|
||||
.num = ARRAY_SIZE(iokey_list), //IO按键的个数
|
||||
.port = iokey_list, //IO按键参数表
|
||||
};
|
||||
|
||||
#if MULT_KEY_ENABLE
|
||||
//组合按键消息映射表
|
||||
//配置注意事项:单个按键按键值需要按照顺序编号,如power:0, prev:1, next:2
|
||||
//bit_value = BIT(0) | BIT(1) 指按键值为0和按键值为1的两个按键被同时按下,
|
||||
//remap_value = 3指当这两个按键被同时按下后重新映射的按键值;
|
||||
const struct key_remap iokey_remap_table[] = {
|
||||
{.bit_value = BIT(0) | BIT(1), .remap_value = 3},
|
||||
{.bit_value = BIT(0) | BIT(2), .remap_value = 4},
|
||||
{.bit_value = BIT(1) | BIT(2), .remap_value = 5},
|
||||
};
|
||||
|
||||
const struct key_remap_data iokey_remap_data = {
|
||||
.remap_num = ARRAY_SIZE(iokey_remap_table),
|
||||
.table = iokey_remap_table,
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*********************** LP TOUCH KEY ****************************/
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
const struct lp_touch_key_platform_data lp_touch_key_config = {
|
||||
/*触摸按键*/
|
||||
.ch[0].enable = TCFG_LP_TOUCH_KEY0_EN,
|
||||
.ch[0].wakeup_enable = TCFG_LP_TOUCH_KEY0_WAKEUP_EN,
|
||||
.ch[0].port = IO_PORTB_00,
|
||||
.ch[0].sensitivity = TCFG_LP_TOUCH_KEY0_SENSITIVITY,
|
||||
.ch[0].key_value = 0,
|
||||
|
||||
.ch[1].enable = TCFG_LP_TOUCH_KEY1_EN,
|
||||
.ch[1].wakeup_enable = TCFG_LP_TOUCH_KEY1_WAKEUP_EN,
|
||||
.ch[1].port = IO_PORTB_01,
|
||||
.ch[1].sensitivity = TCFG_LP_TOUCH_KEY1_SENSITIVITY,
|
||||
.ch[1].key_value = 0,
|
||||
|
||||
.ch[2].enable = TCFG_LP_TOUCH_KEY2_EN,
|
||||
.ch[2].wakeup_enable = TCFG_LP_TOUCH_KEY2_WAKEUP_EN,
|
||||
.ch[2].port = IO_PORTB_02,
|
||||
.ch[2].sensitivity = TCFG_LP_TOUCH_KEY2_SENSITIVITY,
|
||||
.ch[2].key_value = 1,
|
||||
|
||||
.ch[3].enable = TCFG_LP_TOUCH_KEY3_EN,
|
||||
.ch[3].wakeup_enable = TCFG_LP_TOUCH_KEY3_WAKEUP_EN,
|
||||
.ch[3].port = IO_PORTB_04,
|
||||
.ch[3].sensitivity = TCFG_LP_TOUCH_KEY3_SENSITIVITY,
|
||||
.ch[3].key_value = 2,
|
||||
|
||||
.ch[4].enable = TCFG_LP_TOUCH_KEY4_EN,
|
||||
.ch[4].wakeup_enable = TCFG_LP_TOUCH_KEY4_WAKEUP_EN,
|
||||
.ch[4].port = IO_PORTB_05,
|
||||
.ch[4].sensitivity = TCFG_LP_TOUCH_KEY4_SENSITIVITY,
|
||||
.ch[4].key_value = 3,
|
||||
|
||||
//把触摸按键之间的滑动也当做按键处理,有上滑,下滑,左滑,右滑
|
||||
.slide_mode_en = TCFG_LP_SLIDE_KEY_ENABLE,
|
||||
.slide_mode_key_value = 3,
|
||||
|
||||
//入耳检测相关的配置
|
||||
.eartch_en = TCFG_LP_EARTCH_KEY_ENABLE,
|
||||
.eartch_ch = TCFG_LP_EARTCH_KEY_CH,
|
||||
.eartch_ref_ch = TCFG_LP_EARTCH_KEY_REF_CH,
|
||||
.eartch_soft_inear_val = TCFG_LP_EARTCH_SOFT_INEAR_VAL,
|
||||
.eartch_soft_outear_val = TCFG_LP_EARTCH_SOFT_OUTEAR_VAL,
|
||||
};
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
|
||||
/************************** PLCNT TOUCH_KEY ****************************/
|
||||
#if TCFG_TOUCH_KEY_ENABLE
|
||||
const const struct touch_key_port touch_key_list[] = {
|
||||
{
|
||||
.press_delta = TCFG_TOUCH_KEY0_PRESS_DELTA,
|
||||
.port = TCFG_TOUCH_KEY0_PORT,
|
||||
.key_value = TCFG_TOUCH_KEY0_VALUE,
|
||||
},
|
||||
{
|
||||
.press_delta = TCFG_TOUCH_KEY1_PRESS_DELTA,
|
||||
.port = TCFG_TOUCH_KEY1_PORT,
|
||||
.key_value = TCFG_TOUCH_KEY1_VALUE,
|
||||
},
|
||||
};
|
||||
|
||||
const struct touch_key_platform_data touch_key_data = {
|
||||
.num = ARRAY_SIZE(touch_key_list),
|
||||
.port_list = touch_key_list,
|
||||
};
|
||||
#endif /* #if TCFG_TOUCH_KEY_ENABLE */
|
||||
|
||||
/************************** AD KEY ****************************/
|
||||
#if TCFG_ADKEY_ENABLE
|
||||
const struct adkey_platform_data adkey_data = {
|
||||
.enable = TCFG_ADKEY_ENABLE, //AD按键使能
|
||||
.adkey_pin = TCFG_ADKEY_PORT, //AD按键对应引脚
|
||||
.ad_channel = TCFG_ADKEY_AD_CHANNEL, //AD通道值
|
||||
.extern_up_en = TCFG_ADKEY_EXTERN_UP_ENABLE, //是否使用外接上拉电阻
|
||||
.ad_value = { //根据电阻算出来的电压值
|
||||
TCFG_ADKEY_VOLTAGE0,
|
||||
TCFG_ADKEY_VOLTAGE1,
|
||||
TCFG_ADKEY_VOLTAGE2,
|
||||
TCFG_ADKEY_VOLTAGE3,
|
||||
TCFG_ADKEY_VOLTAGE4,
|
||||
TCFG_ADKEY_VOLTAGE5,
|
||||
TCFG_ADKEY_VOLTAGE6,
|
||||
TCFG_ADKEY_VOLTAGE7,
|
||||
TCFG_ADKEY_VOLTAGE8,
|
||||
TCFG_ADKEY_VOLTAGE9,
|
||||
},
|
||||
.key_value = { //AD按键各个按键的键值
|
||||
TCFG_ADKEY_VALUE0,
|
||||
TCFG_ADKEY_VALUE1,
|
||||
TCFG_ADKEY_VALUE2,
|
||||
TCFG_ADKEY_VALUE3,
|
||||
TCFG_ADKEY_VALUE4,
|
||||
TCFG_ADKEY_VALUE5,
|
||||
TCFG_ADKEY_VALUE6,
|
||||
TCFG_ADKEY_VALUE7,
|
||||
TCFG_ADKEY_VALUE8,
|
||||
TCFG_ADKEY_VALUE9,
|
||||
},
|
||||
};
|
||||
#endif
|
||||
|
||||
/************************** RDEC_KEY ****************************/
|
||||
#if TCFG_RDEC_KEY_ENABLE
|
||||
const struct rdec_device rdeckey_list[] = {
|
||||
{
|
||||
.index = RDEC0 ,
|
||||
.sin_port0 = TCFG_RDEC0_ECODE1_PORT,
|
||||
.sin_port1 = TCFG_RDEC0_ECODE2_PORT,
|
||||
.key_value0 = TCFG_RDEC0_KEY0_VALUE | BIT(7),
|
||||
.key_value1 = TCFG_RDEC0_KEY1_VALUE | BIT(7),
|
||||
},
|
||||
|
||||
{
|
||||
.index = RDEC1 ,
|
||||
.sin_port0 = TCFG_RDEC1_ECODE1_PORT,
|
||||
.sin_port1 = TCFG_RDEC1_ECODE2_PORT,
|
||||
.key_value0 = TCFG_RDEC1_KEY0_VALUE | BIT(7),
|
||||
.key_value1 = TCFG_RDEC1_KEY1_VALUE | BIT(7),
|
||||
},
|
||||
|
||||
{
|
||||
.index = RDEC2 ,
|
||||
.sin_port0 = TCFG_RDEC2_ECODE1_PORT,
|
||||
.sin_port1 = TCFG_RDEC2_ECODE2_PORT,
|
||||
.key_value0 = TCFG_RDEC2_KEY0_VALUE | BIT(7),
|
||||
.key_value1 = TCFG_RDEC2_KEY1_VALUE | BIT(7),
|
||||
},
|
||||
|
||||
|
||||
};
|
||||
const struct rdec_platform_data rdec_key_data = {
|
||||
.enable = 1, //TCFG_RDEC_KEY_ENABLE, //是否使能RDEC按键
|
||||
.num = ARRAY_SIZE(rdeckey_list), //RDEC按键的个数
|
||||
.rdec = rdeckey_list, //RDEC按键参数表
|
||||
};
|
||||
#endif
|
||||
|
||||
/************************** IIS config ****************************/
|
||||
#if (TCFG_AUDIO_INPUT_IIS || TCFG_AUDIO_OUTPUT_IIS)
|
||||
ALINK_PARM alink0_platform_data = {
|
||||
.module = ALINK0,
|
||||
.mclk_io = TCFG_IIS_MCLK_IO,
|
||||
.sclk_io = TCFG_SCLK_IO,
|
||||
.lrclk_io = TCFG_LRCLK_IO,
|
||||
.ch_cfg[0].data_io = TCFG_DATA0_IO,
|
||||
.ch_cfg[1].data_io = TCFG_DATA1_IO,
|
||||
.ch_cfg[2].data_io = TCFG_DATA2_IO,
|
||||
.ch_cfg[3].data_io = TCFG_DATA3_IO,
|
||||
.mode = ALINK_MD_IIS,
|
||||
#if TCFG_IIS_MODE
|
||||
.role = ALINK_ROLE_SLAVE,
|
||||
#else
|
||||
.role = ALINK_ROLE_MASTER,
|
||||
#endif /*TCFG_IIS_MODE*/
|
||||
.clk_mode = ALINK_CLK_FALL_UPDATE_RAISE_SAMPLE,
|
||||
.bitwide = ALINK_LEN_16BIT,
|
||||
.sclk_per_frame = ALINK_FRAME_32SCLK,
|
||||
.dma_len = 4 * 1024,
|
||||
.sample_rate = TCFG_IIS_SR,
|
||||
.buf_mode = ALINK_BUF_CIRCLE,
|
||||
/*.iperiod = 64, //配置该项可以控制输入的延时*/
|
||||
};
|
||||
#endif
|
||||
|
||||
/************************** PWM_LED ****************************/
|
||||
#if TCFG_PWMLED_ENABLE
|
||||
LED_PLATFORM_DATA_BEGIN(pwm_led_data)
|
||||
.io_mode = TCFG_PWMLED_IOMODE, //推灯模式设置:支持单个IO推两个灯和两个IO推两个灯
|
||||
.io_cfg.one_io.pin = TCFG_PWMLED_PIN, //单个IO推两个灯的IO口配置
|
||||
LED_PLATFORM_DATA_END()
|
||||
#endif
|
||||
|
||||
const struct soft_iic_config soft_iic_cfg[] = {
|
||||
#if 0
|
||||
//iic0 data
|
||||
{
|
||||
.scl = TCFG_SW_I2C0_CLK_PORT, //IIC CLK脚
|
||||
.sda = TCFG_SW_I2C0_DAT_PORT, //IIC DAT脚
|
||||
.delay = TCFG_SW_I2C0_DELAY_CNT, //软件IIC延时参数,影响通讯时钟频率
|
||||
.io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1
|
||||
},
|
||||
#endif
|
||||
#if 0
|
||||
//iic1 data
|
||||
{
|
||||
.scl = IO_PORTA_05,
|
||||
.sda = IO_PORTA_06,
|
||||
.delay = 50,
|
||||
.io_pu = 1,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
const struct hw_iic_config hw_iic_cfg[] = {
|
||||
#if 0
|
||||
//iic0 data
|
||||
{
|
||||
/*硬件IIC端口下选择
|
||||
SCL SDA
|
||||
{IO_PORT_DP, IO_PORT_DM}, //group a
|
||||
{IO_PORTC_04, IO_PORTC_05}, //group b
|
||||
{IO_PORTC_02, IO_PORTC_03}, //group c
|
||||
{IO_PORTA_05, IO_PORTA_06}, //group d
|
||||
*/
|
||||
.port = TCFG_HW_I2C0_PORTS,
|
||||
.baudrate = TCFG_HW_I2C0_CLK, //IIC通讯波特率
|
||||
.hdrive = 0, //是否打开IO口强驱
|
||||
.io_filter = 1, //是否打开滤波器(去纹波)
|
||||
.io_pu = 1, //是否打开上拉电阻,如果外部电路没有焊接上拉电阻需要置1
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
#if TCFG_SD0_ENABLE
|
||||
SD0_PLATFORM_DATA_BEGIN(sd0_data)
|
||||
.port = {
|
||||
TCFG_SD0_PORT_CMD,
|
||||
TCFG_SD0_PORT_CLK,
|
||||
TCFG_SD0_PORT_DA0,
|
||||
TCFG_SD0_PORT_DA1,
|
||||
TCFG_SD0_PORT_DA2,
|
||||
TCFG_SD0_PORT_DA3,
|
||||
},
|
||||
.data_width = TCFG_SD0_DAT_MODE,
|
||||
.speed = TCFG_SD0_CLK,
|
||||
.detect_mode = TCFG_SD0_DET_MODE,
|
||||
.priority = 3,
|
||||
|
||||
#if (TCFG_SD0_DET_MODE == SD_IO_DECT)
|
||||
.detect_io = TCFG_SD0_DET_IO,
|
||||
.detect_io_level = TCFG_SD0_DET_IO_LEVEL,
|
||||
.detect_func = sdmmc_0_io_detect,
|
||||
.power = sd_set_power,
|
||||
/* .power = NULL, */
|
||||
#elif (TCFG_SD0_DET_MODE == SD_CLK_DECT)
|
||||
.detect_io_level = TCFG_SD0_DET_IO_LEVEL,
|
||||
.detect_func = sdmmc_0_clk_detect,
|
||||
.power = sd_set_power,
|
||||
/* .power = NULL, */
|
||||
#else
|
||||
.detect_func = sdmmc_cmd_detect,
|
||||
.power = NULL,
|
||||
#endif
|
||||
|
||||
SD0_PLATFORM_DATA_END()
|
||||
#endif /* #if TCFG_SD0_ENABLE */
|
||||
|
||||
REGISTER_DEVICES(device_table) = {
|
||||
/* { "audio", &audio_dev_ops, (void *) &audio_data }, */
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
{ "charge", &charge_dev_ops, (void *)&charge_data },
|
||||
#endif
|
||||
#if TCFG_SD0_ENABLE
|
||||
{ "sd0", &sd_dev_ops, (void *) &sd0_data},
|
||||
#endif
|
||||
};
|
||||
|
||||
/************************** power_param ****************************/
|
||||
const struct low_power_param power_param = {
|
||||
.config = TCFG_LOWPOWER_LOWPOWER_SEL, //低功耗使能,蓝牙&&系统空闲可进入低功耗
|
||||
.btosc_hz = TCFG_CLOCK_OSC_HZ, //蓝牙晶振频率
|
||||
.delay_us = TCFG_CLOCK_SYS_HZ / 1000000L, //提供给低功耗模块的延时(不需要需修改)
|
||||
.vddiom_lev = TCFG_LOWPOWER_VDDIOM_LEVEL, //vddiom等级
|
||||
.osc_type = TCFG_LOWPOWER_OSC_TYPE, //低功耗晶振类型,btosc/lrc
|
||||
#if (TCFG_LOWPOWER_RAM_SIZE)
|
||||
.mem_init_con = MEM_PWR_RAM_SET(TCFG_LOWPOWER_RAM_SIZE),
|
||||
#else
|
||||
.mem_init_con = 0,
|
||||
#endif
|
||||
#if (TCFG_LP_TOUCH_KEY_ENABLE && \
|
||||
(TCFG_LP_TOUCH_KEY0_WAKEUP_EN || \
|
||||
TCFG_LP_TOUCH_KEY1_WAKEUP_EN || \
|
||||
TCFG_LP_TOUCH_KEY2_WAKEUP_EN || \
|
||||
TCFG_LP_TOUCH_KEY3_WAKEUP_EN || \
|
||||
TCFG_LP_TOUCH_KEY4_WAKEUP_EN ))
|
||||
.lpctmu_en = 1,
|
||||
#else
|
||||
.lpctmu_en = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
/************************** wk_param ****************************/
|
||||
struct port_wakeup port0 = {
|
||||
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.filter = PORT_FLT_8ms,
|
||||
.iomap = TCFG_IOKEY_POWER_ONE_PORT, //唤醒口选择
|
||||
};
|
||||
|
||||
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
|
||||
struct port_wakeup port1 = {
|
||||
.pullup_down_enable = DISABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.filter = PORT_FLT_1ms,
|
||||
.iomap = TCFG_CHARGESTORE_PORT, //唤醒口选择
|
||||
};
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
struct port_wakeup charge_port = {
|
||||
.edge = RISING_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿
|
||||
.filter = PORT_FLT_16ms,
|
||||
.iomap = IO_CHGFL_DET, //唤醒口选择
|
||||
};
|
||||
|
||||
struct port_wakeup vbat_port = {
|
||||
.edge = BOTH_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿
|
||||
.filter = PORT_FLT_16ms,
|
||||
.iomap = IO_VBTCH_DET, //唤醒口选择
|
||||
};
|
||||
|
||||
struct port_wakeup ldoin_port = {
|
||||
.edge = BOTH_EDGE, //唤醒方式选择,可选:上升沿\下降沿\双边沿
|
||||
.filter = PORT_FLT_16ms,
|
||||
.iomap = IO_LDOIN_DET, //唤醒口选择
|
||||
};
|
||||
#endif
|
||||
|
||||
const struct wakeup_param wk_param = {
|
||||
#if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN))
|
||||
.port[1] = &port0,
|
||||
#endif
|
||||
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
|
||||
.port[2] = &port1,
|
||||
#endif
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
.aport[0] = &charge_port,
|
||||
.aport[1] = &vbat_port,
|
||||
.aport[2] = &ldoin_port,
|
||||
#endif
|
||||
};
|
||||
|
||||
void gSensor_wkupup_disable(void)
|
||||
{
|
||||
log_info("gSensor wkup disable\n");
|
||||
power_wakeup_index_enable(1, 0);
|
||||
}
|
||||
|
||||
void gSensor_wkupup_enable(void)
|
||||
{
|
||||
log_info("gSensor wkup enable\n");
|
||||
power_wakeup_index_enable(1, 1);
|
||||
}
|
||||
|
||||
void debug_uart_init(const struct uart_platform_data *data)
|
||||
{
|
||||
#if TCFG_UART0_ENABLE
|
||||
if (data) {
|
||||
uart_init(data);
|
||||
} else {
|
||||
uart_init(&uart0_data);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
STATUS *get_led_config(void)
|
||||
{
|
||||
return &(__this->led);
|
||||
}
|
||||
|
||||
STATUS *get_tone_config(void)
|
||||
{
|
||||
return &(__this->tone);
|
||||
}
|
||||
|
||||
u8 get_sys_default_vol(void)
|
||||
{
|
||||
return 21;
|
||||
}
|
||||
|
||||
u8 get_power_on_status(void)
|
||||
{
|
||||
#if TCFG_IOKEY_ENABLE
|
||||
struct iokey_port *power_io_list = NULL;
|
||||
power_io_list = iokey_data.port;
|
||||
|
||||
if (iokey_data.enable) {
|
||||
if (gpio_read(power_io_list->key_type.one_io.port) == power_io_list->connect_way){
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_ADKEY_ENABLE
|
||||
if (adkey_data.enable) {
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
return lp_touch_key_power_on_status();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void board_devices_init(void)
|
||||
{
|
||||
#if TCFG_PWMLED_ENABLE
|
||||
pwm_led_init(&pwm_led_data);
|
||||
#endif
|
||||
|
||||
#if (TCFG_IOKEY_ENABLE || TCFG_ADKEY_ENABLE || TCFG_RDEC_KEY_ENABLE || TCFG_TOUCH_KEY_ENABLE)
|
||||
key_driver_init();
|
||||
#endif
|
||||
|
||||
#if TCFG_UART_KEY_ENABLE
|
||||
extern int uart_key_init(void);
|
||||
uart_key_init();
|
||||
#endif /* #if TCFG_UART_KEY_ENABLE */
|
||||
|
||||
#if TCFG_LP_TOUCH_KEY_ENABLE
|
||||
lp_touch_key_init(&lp_touch_key_config);
|
||||
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
|
||||
|
||||
#if (!TCFG_CHARGE_ENABLE)
|
||||
CHARGE_EN(0);
|
||||
CHGGO_EN(0);
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
|
||||
chargestore_api_init(&chargestore_data);
|
||||
#endif
|
||||
}
|
||||
|
||||
//外置触摸电源控制 1:输出高 0:输出地
|
||||
static void pwr_set_external_touch(u8 high_low)
|
||||
{
|
||||
if(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT == NO_CONFIG_PORT){
|
||||
return;
|
||||
}
|
||||
gpio_set_pull_up(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT, 1);
|
||||
gpio_set_pull_down(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT, 0);
|
||||
gpio_set_direction(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT, 0);
|
||||
gpio_set_output_value(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT, high_low);
|
||||
}
|
||||
|
||||
#if CLIENT_BOARD == CUSTOM9_CFG
|
||||
#define TCFG_TALKING_FB_MIC_IO IO_PORTB_02
|
||||
/*
|
||||
0:MIC0 作为FB MIC,引脚输出低电平。
|
||||
1:MIC0 作为通话MIC,引脚输出高电平。
|
||||
*/
|
||||
void TALKING_FB_MIC_sel(u8 mic_type)
|
||||
{
|
||||
gpio_set_pull_up(TCFG_TALKING_FB_MIC_IO , 0);
|
||||
gpio_set_pull_down(TCFG_TALKING_FB_MIC_IO , 0);
|
||||
gpio_set_direction(TCFG_TALKING_FB_MIC_IO , 0);
|
||||
gpio_set_die(TCFG_TALKING_FB_MIC_IO , 1);
|
||||
switch (mic_type)
|
||||
{
|
||||
case 0:
|
||||
gpio_set_output_value(TCFG_TALKING_FB_MIC_IO , 0);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
gpio_set_output_value(TCFG_TALKING_FB_MIC_IO , 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static u8 dcda_en_state = 0;
|
||||
#define DCDC_EN_PORT IO_PORTC_02
|
||||
static void dcdc_en(u8 en)
|
||||
{
|
||||
if (dcda_en_state == en)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
dcda_en_state = en;
|
||||
|
||||
gpio_set_die(DCDC_EN_PORT, 0);
|
||||
gpio_set_direction(IO_PORTB_04, 0);
|
||||
gpio_set_pull_up(DCDC_EN_PORT, 0);
|
||||
gpio_set_pull_down(DCDC_EN_PORT, 0);
|
||||
|
||||
switch (en)
|
||||
{
|
||||
case 0:
|
||||
printf("external dcdc disable \n");
|
||||
gpio_direction_output(DCDC_EN_PORT, 0);
|
||||
break;
|
||||
case 1:
|
||||
printf("external dcdc enable \n");
|
||||
gpio_direction_output(DCDC_EN_PORT, 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void dcdc_init(void)
|
||||
{
|
||||
gpio_set_die(DCDC_EN_PORT, 0);
|
||||
gpio_set_direction(IO_PORTB_04, 0);
|
||||
gpio_set_pull_up(DCDC_EN_PORT, 0);
|
||||
gpio_set_pull_down(DCDC_EN_PORT, 0);
|
||||
gpio_direction_output(DCDC_EN_PORT, 0);
|
||||
dcda_en_state = 0;
|
||||
}
|
||||
|
||||
/*dcdc switch*/
|
||||
void audio_dac_power_state(u8 state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case DAC_ANALOG_OPEN_PREPARE:
|
||||
dcdc_en(1);
|
||||
break;
|
||||
case DAC_ANALOG_OPEN_FINISH:
|
||||
break;
|
||||
case DAC_ANALOG_CLOSE_PREPARE:
|
||||
break;
|
||||
case DAC_ANALOG_CLOSE_FINISH:
|
||||
dcdc_en(0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
extern void cfg_file_parse(u8 idx);
|
||||
void board_init()
|
||||
{
|
||||
|
||||
pwr_set_external_touch(1);
|
||||
board_power_init();
|
||||
//adc_vbg_init();
|
||||
adc_init();
|
||||
#if CLIENT_BOARD == CUSTOM9_CFG
|
||||
dcdc_init();
|
||||
TALKING_FB_MIC_sel(0);
|
||||
#endif
|
||||
cfg_file_parse(0);
|
||||
devices_init();
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
anc_init();
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
|
||||
board_devices_init();
|
||||
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
if(get_charge_online_flag())
|
||||
#else
|
||||
if (0)
|
||||
#endif
|
||||
{
|
||||
power_set_mode(PWR_LDO15);
|
||||
}else{
|
||||
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
|
||||
}
|
||||
|
||||
//针对硅mic要输出1给mic供电
|
||||
/* gpio_set_pull_up(IO_PORTA_04, 0); */
|
||||
/* gpio_set_pull_down(IO_PORTA_04, 0); */
|
||||
/* gpio_set_direction(IO_PORTA_04, 0); */
|
||||
/* gpio_set_output_value(IO_PORTA_04,1); */
|
||||
|
||||
#if TCFG_UART0_ENABLE
|
||||
if (uart0_data.rx_pin < IO_MAX_NUM) {
|
||||
gpio_set_die(uart0_data.rx_pin, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_SMART_VOICE_ENABLE
|
||||
int audio_smart_voice_detect_init(struct vad_mic_platform_data *mic_data);
|
||||
audio_smart_voice_detect_init((struct vad_mic_platform_data *)&vad_mic_data);
|
||||
#endif /* #if TCFG_SMART_VOICE_ENABLE */
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
|
||||
extern int audio_ais_platform_asr_init(struct vad_mic_platform_data *mic_data);
|
||||
audio_ais_platform_asr_init((struct vad_mic_platform_data *)&vad_mic_data);
|
||||
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
|
||||
|
||||
#ifdef AUDIO_PCM_DEBUG
|
||||
extern void uartSendInit();
|
||||
uartSendInit();
|
||||
#endif/*AUDIO_PCM_DEBUG*/
|
||||
}
|
||||
|
||||
/*进软关机之前默认将IO口都设置成高阻状态,需要保留原来状态的请修改该函数*/
|
||||
extern void dac_power_off(void);
|
||||
void board_set_soft_poweroff(void)
|
||||
{
|
||||
//power按键
|
||||
#if TCFG_IOKEY_ENABLE
|
||||
soff_gpio_protect(TCFG_IOKEY_POWER_ONE_PORT);
|
||||
#endif
|
||||
|
||||
soff_gpio_protect(TCFG_EXTERNAL_TOUCH_KEY_POWER_PORT);//软关机KEEP外置触摸供电
|
||||
|
||||
#if (!(TCFG_LP_TOUCH_KEY_ENABLE && TCFG_LP_TOUCH_KEY1_EN))
|
||||
//默认唤醒io
|
||||
soff_gpio_protect(IO_PORTB_01);
|
||||
#endif
|
||||
|
||||
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE || TCFG_UMIDIGI_BOX_ENABLE)
|
||||
power_wakeup_index_enable(2, 0);
|
||||
#endif
|
||||
|
||||
board_set_soft_poweroff_common(NULL);
|
||||
|
||||
dac_power_off();
|
||||
}
|
||||
|
||||
#define APP_IO_DEBUG_0(i,x) {JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT &= ~BIT(x);}
|
||||
#define APP_IO_DEBUG_1(i,x) {JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT |= BIT(x);}
|
||||
|
||||
void sleep_exit_callback(u32 usec)
|
||||
{
|
||||
sleep_exit_callback_common(NULL);
|
||||
|
||||
putchar('>');
|
||||
}
|
||||
void sleep_enter_callback(u8 step)
|
||||
{
|
||||
/* 此函数禁止添加打印 */
|
||||
if (step == 1) {
|
||||
putchar('<');
|
||||
} else {
|
||||
//外置触摸供电
|
||||
pwr_set_external_touch(1);
|
||||
|
||||
sleep_enter_callback_common(NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void port_wakeup_callback(u8 index, u8 gpio)
|
||||
{
|
||||
log_info("%s:%d,%d",__FUNCTION__,index,gpio);
|
||||
#if TCFG_UMIDIGI_BOX_ENABLE
|
||||
if (index == 2) {
|
||||
ldo_port_wakeup_to_cmessage();
|
||||
}
|
||||
#endif
|
||||
switch (index) {
|
||||
#if (TCFG_TEST_BOX_ENABLE || TCFG_CHARGESTORE_ENABLE || TCFG_ANC_BOX_ENABLE)
|
||||
case 2:
|
||||
extern void chargestore_ldo5v_fall_deal(void);
|
||||
chargestore_ldo5v_fall_deal();
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static void aport_wakeup_callback(u8 index, u8 gpio, u8 edge)
|
||||
{
|
||||
log_info("%s:%d,%d",__FUNCTION__,index,gpio);
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
switch (gpio) {
|
||||
case IO_CHGFL_DET://charge port
|
||||
charge_wakeup_isr();
|
||||
break;
|
||||
case IO_VBTCH_DET://vbat port
|
||||
case IO_LDOIN_DET://ldoin port
|
||||
ldoin_wakeup_isr();
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void board_power_init(void)
|
||||
{
|
||||
log_info("Power init : %s", __FILE__);
|
||||
|
||||
power_init(&power_param);
|
||||
|
||||
power_set_callback(TCFG_LOWPOWER_LOWPOWER_SEL, sleep_enter_callback, sleep_exit_callback, board_set_soft_poweroff);
|
||||
|
||||
#if TCFG_UMIDIGI_BOX_ENABLE
|
||||
gpio_set_die(TCFG_CHARGESTORE_PORT, 1);
|
||||
umidigi_chargestore_message_callback(app_umidigi_chargetore_message_deal);
|
||||
#endif
|
||||
|
||||
power_keep_dacvdd_en(0);
|
||||
|
||||
power_wakeup_init(&wk_param);
|
||||
|
||||
power_awakeup_set_callback(aport_wakeup_callback);
|
||||
power_wakeup_set_callback(port_wakeup_callback);
|
||||
}
|
||||
#endif /* #ifdef CONFIG_BOARD_JL701N_ANC */
|
||||
1382
apps/earphone/board/br28/board_jl701n_anc_cfg.h
Normal file
1382
apps/earphone/board/br28/board_jl701n_anc_cfg.h
Normal file
File diff suppressed because it is too large
Load Diff
123
apps/earphone/board/br28/board_jl701n_anc_global_build_cfg.h
Normal file
123
apps/earphone/board/br28/board_jl701n_anc_global_build_cfg.h
Normal file
@ -0,0 +1,123 @@
|
||||
#ifndef CONFIG_BOARD_JL701N_ANC_POST_BUILD_CFG_H
|
||||
#define CONFIG_BOARD_JL701N_ANC_POST_BUILD_CFG_H
|
||||
|
||||
/* 改文件只添加和isd_config.ini相关的配置,用以生成isd_config.ini */
|
||||
/* 其他不相关的配置请勿添加在改文件 */
|
||||
|
||||
#ifdef CONFIG_BOARD_JL701N_ANC
|
||||
|
||||
/* Following Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
#define CONFIG_DOUBLE_BANK_ENABLE 0 //单双备份选择(若打开了改宏,FLASH结构变为双备份结构,适用于接入第三方协议的OTA, PS: JL-OTA同样支持双备份升级, 需要根据实际FLASH大小同时配置CONFIG_FLASH_SIZE)
|
||||
#define CONFIG_APP_OTA_ENABLE 0 //是否支持RCSP升级(JL-OTA)
|
||||
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0 //配置升级到loader的方式0为直接reset,1为跳转(适用于芯片电源由IO口KEEP住的方案,需要注意检查跳转前是否将使用DMA的硬件模块全部关闭)
|
||||
|
||||
#define CONFIG_IO_KEY_EN 0 //配置是否使用IO按键,配合RESET1
|
||||
#define CONFIG_UPDATE_WITH_MD5_CHECK_EN 0 //配置升级是否支持MD5校验
|
||||
|
||||
#define CONFIG_ANC_ENABLE 1 //配置是否支持ANC
|
||||
|
||||
//flash size vaule definition
|
||||
#define FLASH_SIZE_256K 0x40000
|
||||
#define FLASH_SIZE_512K 0x80000
|
||||
#define FLASH_SIZE_1M 0x100000
|
||||
#define FLASH_SIZE_2M 0x200000
|
||||
#define FLASH_SIZE_4M 0x400000
|
||||
|
||||
#define CONFIG_FLASH_SIZE FLASH_SIZE_1M //配置FLASH大小
|
||||
|
||||
|
||||
/* Above Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
/* Following Macros Only For Post Bulid Configuaration */
|
||||
|
||||
#define CONFIG_DB_UPDATE_DATA_GENERATE_EN 0 //是否生成db_data.bin(用于第三方协议接入使用)
|
||||
#define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 0 //ufw只生成1份4K对齐的代码
|
||||
|
||||
//config for supported chip version
|
||||
#ifdef CONFIG_BR30_C_VERSION
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION C
|
||||
#else
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION B,D,E,M,N,O,P
|
||||
#endif
|
||||
|
||||
//DON'T MODIFY THIS CONFIG EXCEPT SDK PUBLISHER
|
||||
#define CONFIG_CHIP_NAME AC701N //除了SDK发布者,请不要修改
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_PID AC701N //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_VID 0.01 //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
|
||||
//Project with bluetooth,it must use OSC as PLL_SOURCE;
|
||||
#define CONFIG_PLL_SOURCE_USING_LRC 0 //PLL时钟源选择 1:LRC 2:OSC
|
||||
|
||||
//config alignment size unit
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
#define ALIGN_UNIT_256B 1 //FLASH对齐方式选择,如果是256K的FLASH,选择256BYTE对齐方式
|
||||
#else
|
||||
#define ALIGN_UNIT_256B 0
|
||||
#endif
|
||||
|
||||
//partial platform check this config to select the uart IO for wired update
|
||||
#define CONFIG_UART_UPDATE_PIN PP00
|
||||
|
||||
//isd_download loader/uboot/update_loader debug io config
|
||||
//#define CONFIG_UBOOT_DEBUG_PIN PA05
|
||||
//#define CONFIG_UBOOT_DEBUG_BAUD_RATE 1000000
|
||||
|
||||
//config long-press reset io pin,time,trigger level
|
||||
#define CONFIG_RESET_PIN LDO //io pin
|
||||
#define CONFIG_RESET_TIME 04 //unit:second
|
||||
#define CONFIG_RESET_LEVEL 1 //tigger level(0/1)
|
||||
|
||||
#if CONFIG_IO_KEY_EN
|
||||
#define CONFIG_SUPPORT_RESET1
|
||||
#define CONFIG_RESET1_PIN PB01 //io pin
|
||||
#define CONFIG_RESET1_TIME 08 //unit:second
|
||||
#define CONFIG_RESET1_LEVEL 0 //tigger level(0/1)
|
||||
#endif
|
||||
|
||||
//reserved three custom cfg item for the future definition
|
||||
//#define CONFIG_CUSTOM_CFG1_TYPE POWER_PIN
|
||||
//#define CONFIG_CUSTOM_CFG1_VALUE PC01_1
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG2_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG2_VALUE
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG3_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG3_VALUE
|
||||
|
||||
|
||||
//#define CONFIG_VDDIO_LVD_LEVEL 4 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
|
||||
|
||||
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
|
||||
#define CONFIG_VM_LEAST_SIZE 8K
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_VM_OPT 1
|
||||
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_BTIF_OPT 1
|
||||
|
||||
//reserved two custom cfg area for the future definition
|
||||
//#define CONFIG_RESERVED_AREA1 EXIF1
|
||||
#ifdef CONFIG_RESERVED_AREA1
|
||||
#define CONFIG_RESERVED_AREA1_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA1_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA1_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
//#define CONFIG_RESERVED_AREA2 EXIF2
|
||||
#ifdef CONFIG_RESERVED_AREA2
|
||||
#define CONFIG_RESERVED_AREA2_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA2_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA2_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
/* Above Macros Only For Post Bulid Configuaration */
|
||||
#endif /* #ifdef CONFIG_BOARD_JL701N_ANC */
|
||||
|
||||
#endif /* #ifndef CONFIG_BOARD_JL701N_ANC_POST_BUILD_CFG_H */
|
||||
|
||||
1042
apps/earphone/board/br28/board_jl701n_btemitter.c
Normal file
1042
apps/earphone/board/br28/board_jl701n_btemitter.c
Normal file
File diff suppressed because it is too large
Load Diff
1215
apps/earphone/board/br28/board_jl701n_btemitter_cfg.h
Normal file
1215
apps/earphone/board/br28/board_jl701n_btemitter_cfg.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,123 @@
|
||||
#ifndef CONFIG_BOARD_JL701N_BTEMITTER_BUILD_CFG_H
|
||||
#define CONFIG_BOARD_JL701N_BTEMITTER_BUILD_CFG_H
|
||||
|
||||
/* 改文件只添加和isd_config.ini相关的配置,用以生成isd_config.ini */
|
||||
/* 其他不相关的配置请勿添加在改文件 */
|
||||
|
||||
#ifdef CONFIG_BOARD_JL701N_BTEMITTER
|
||||
|
||||
/* Following Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
#define CONFIG_DOUBLE_BANK_ENABLE 0 //单双备份选择(若打开了改宏,FLASH结构变为双备份结构,适用于接入第三方协议的OTA, PS: JL-OTA同样支持双备份升级, 需要根据实际FLASH大小同时配置CONFIG_FLASH_SIZE)
|
||||
#define CONFIG_APP_OTA_ENABLE 0 //是否支持RCSP升级(JL-OTA)
|
||||
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0 //配置升级到loader的方式0为直接reset,1为跳转(适用于芯片电源由IO口KEEP住的方案,需要注意检查跳转前是否将使用DMA的硬件模块全部关闭)
|
||||
|
||||
#define CONFIG_IO_KEY_EN 0 //配置是否使用IO按键,配合RESET1
|
||||
#define CONFIG_UPDATE_WITH_MD5_CHECK_EN 0 //配置升级是否支持MD5校验
|
||||
|
||||
#define CONFIG_ANC_ENABLE 0 //配置是否支持ANC
|
||||
|
||||
//flash size vaule definition
|
||||
#define FLASH_SIZE_256K 0x40000
|
||||
#define FLASH_SIZE_512K 0x80000
|
||||
#define FLASH_SIZE_1M 0x100000
|
||||
#define FLASH_SIZE_2M 0x200000
|
||||
#define FLASH_SIZE_4M 0x400000
|
||||
|
||||
#define CONFIG_FLASH_SIZE FLASH_SIZE_1M //配置FLASH大小
|
||||
|
||||
|
||||
/* Above Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
/* Following Macros Only For Post Bulid Configuaration */
|
||||
|
||||
#define CONFIG_DB_UPDATE_DATA_GENERATE_EN 0 //是否生成db_data.bin(用于第三方协议接入使用)
|
||||
#define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 0 //ufw只生成1份4K对齐的代码
|
||||
|
||||
//config for supported chip version
|
||||
#ifdef CONFIG_BR30_C_VERSION
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION C
|
||||
#else
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION B,D,E,M,N,O,P
|
||||
#endif
|
||||
|
||||
//DON'T MODIFY THIS CONFIG EXCEPT SDK PUBLISHER
|
||||
#define CONFIG_CHIP_NAME AC701N //除了SDK发布者,请不要修改
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_PID AC701N //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_VID 0.01 //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
|
||||
//Project with bluetooth,it must use OSC as PLL_SOURCE;
|
||||
#define CONFIG_PLL_SOURCE_USING_LRC 0 //PLL时钟源选择 1:LRC 2:OSC
|
||||
|
||||
//config alignment size unit
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
#define ALIGN_UNIT_256B 1 //FLASH对齐方式选择,如果是256K的FLASH,选择256BYTE对齐方式
|
||||
#else
|
||||
#define ALIGN_UNIT_256B 0
|
||||
#endif
|
||||
|
||||
//partial platform check this config to select the uart IO for wired update
|
||||
#define CONFIG_UART_UPDATE_PIN PP00
|
||||
|
||||
//isd_download loader/uboot/update_loader debug io config
|
||||
//#define CONFIG_UBOOT_DEBUG_PIN PA05
|
||||
//#define CONFIG_UBOOT_DEBUG_BAUD_RATE 1000000
|
||||
|
||||
//config long-press reset io pin,time,trigger level
|
||||
#define CONFIG_RESET_PIN LDO //io pin
|
||||
#define CONFIG_RESET_TIME 04 //unit:second
|
||||
#define CONFIG_RESET_LEVEL 1 //tigger level(0/1)
|
||||
|
||||
#if CONFIG_IO_KEY_EN
|
||||
#define CONFIG_SUPPORT_RESET1
|
||||
#define CONFIG_RESET1_PIN PB01 //io pin
|
||||
#define CONFIG_RESET1_TIME 08 //unit:second
|
||||
#define CONFIG_RESET1_LEVEL 0 //tigger level(0/1)
|
||||
#endif
|
||||
|
||||
//reserved three custom cfg item for the future definition
|
||||
//#define CONFIG_CUSTOM_CFG1_TYPE POWER_PIN
|
||||
//#define CONFIG_CUSTOM_CFG1_VALUE PC01_1
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG2_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG2_VALUE
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG3_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG3_VALUE
|
||||
|
||||
|
||||
//#define CONFIG_VDDIO_LVD_LEVEL 4 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
|
||||
|
||||
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
|
||||
#define CONFIG_VM_LEAST_SIZE 8K
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_VM_OPT 1
|
||||
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_BTIF_OPT 1
|
||||
|
||||
//reserved two custom cfg area for the future definition
|
||||
//#define CONFIG_RESERVED_AREA1 EXIF1
|
||||
#ifdef CONFIG_RESERVED_AREA1
|
||||
#define CONFIG_RESERVED_AREA1_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA1_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA1_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
//#define CONFIG_RESERVED_AREA2 EXIF2
|
||||
#ifdef CONFIG_RESERVED_AREA2
|
||||
#define CONFIG_RESERVED_AREA2_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA2_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA2_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
/* Above Macros Only For Post Bulid Configuaration */
|
||||
#endif /* #ifdef CONFIG_BOARD_JL701N_BTEMITTER */
|
||||
|
||||
#endif /* #ifndef CONFIG_BOARD_JL701N_BTEMITTER_BUILD_CFG_H */
|
||||
|
||||
1089
apps/earphone/board/br28/board_jl701n_demo.c
Normal file
1089
apps/earphone/board/br28/board_jl701n_demo.c
Normal file
File diff suppressed because it is too large
Load Diff
1247
apps/earphone/board/br28/board_jl701n_demo_cfg.h
Normal file
1247
apps/earphone/board/br28/board_jl701n_demo_cfg.h
Normal file
File diff suppressed because it is too large
Load Diff
123
apps/earphone/board/br28/board_jl701n_demo_global_build_cfg.h
Normal file
123
apps/earphone/board/br28/board_jl701n_demo_global_build_cfg.h
Normal file
@ -0,0 +1,123 @@
|
||||
#ifndef CONFIG_BOARD_JL701N_DEMO_POST_BUILD_CFG_H
|
||||
#define CONFIG_BOARD_JL701N_DEMO_POST_BUILD_CFG_H
|
||||
|
||||
/* 改文件只添加和isd_config.ini相关的配置,用以生成isd_config.ini */
|
||||
/* 其他不相关的配置请勿添加在改文件 */
|
||||
|
||||
#ifdef CONFIG_BOARD_JL701N_DEMO
|
||||
|
||||
/* Following Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
#define CONFIG_DOUBLE_BANK_ENABLE 1 //单双备份选择(若打开了改宏,FLASH结构变为双备份结构,适用于接入第三方协议的OTA, PS: JL-OTA同样支持双备份升级, 需要根据实际FLASH大小同时配置CONFIG_FLASH_SIZE)
|
||||
#define CONFIG_APP_OTA_ENABLE 1 //是否支持RCSP升级(JL-OTA)
|
||||
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0 //配置升级到loader的方式0为直接reset,1为跳转(适用于芯片电源由IO口KEEP住的方案,需要注意检查跳转前是否将使用DMA的硬件模块全部关闭)
|
||||
|
||||
#define CONFIG_IO_KEY_EN 0 //配置是否使用IO按键,配合RESET1
|
||||
#define CONFIG_UPDATE_WITH_MD5_CHECK_EN 0 //配置升级是否支持MD5校验
|
||||
|
||||
#define CONFIG_ANC_ENABLE 0 //配置是否支持ANC
|
||||
|
||||
//flash size vaule definition
|
||||
#define FLASH_SIZE_256K 0x40000
|
||||
#define FLASH_SIZE_512K 0x80000
|
||||
#define FLASH_SIZE_1M 0x100000
|
||||
#define FLASH_SIZE_2M 0x200000
|
||||
#define FLASH_SIZE_4M 0x400000
|
||||
|
||||
#define CONFIG_FLASH_SIZE FLASH_SIZE_1M //配置FLASH大小
|
||||
|
||||
|
||||
/* Above Macros Affect Periods Of Both Code Compiling And Post-build */
|
||||
|
||||
/* Following Macros Only For Post Bulid Configuaration */
|
||||
|
||||
#define CONFIG_DB_UPDATE_DATA_GENERATE_EN 0 //是否生成db_data.bin(用于第三方协议接入使用)
|
||||
#define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 1 //ufw只生成1份4K对齐的代码
|
||||
|
||||
//config for supported chip version
|
||||
#ifdef CONFIG_BR30_C_VERSION
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION C
|
||||
#else
|
||||
#define CONFIG_SUPPORTED_CHIP_VERSION B,D,E,M,N,O,P
|
||||
#endif
|
||||
|
||||
//DON'T MODIFY THIS CONFIG EXCEPT SDK PUBLISHER
|
||||
#define CONFIG_CHIP_NAME AC701N //除了SDK发布者,请不要修改
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_PID AC701N //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
//it can be modified before first programming,but keep the same as the original version
|
||||
#define CONFIG_VID 0.01 //烧写或强制升级之前可以修改,之后升级要保持一致
|
||||
|
||||
//Project with bluetooth,it must use OSC as PLL_SOURCE;
|
||||
#define CONFIG_PLL_SOURCE_USING_LRC 0 //PLL时钟源选择 1:LRC 2:OSC
|
||||
|
||||
//config alignment size unit
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
#define ALIGN_UNIT_256B 1 //FLASH对齐方式选择,如果是256K的FLASH,选择256BYTE对齐方式
|
||||
#else
|
||||
#define ALIGN_UNIT_256B 0
|
||||
#endif
|
||||
|
||||
//partial platform check this config to select the uart IO for wired update
|
||||
#define CONFIG_UART_UPDATE_PIN PP00
|
||||
|
||||
//isd_download loader/uboot/update_loader debug io config
|
||||
//#define CONFIG_UBOOT_DEBUG_PIN PA05
|
||||
//#define CONFIG_UBOOT_DEBUG_BAUD_RATE 1000000
|
||||
|
||||
//config long-press reset io pin,time,trigger level
|
||||
#define CONFIG_RESET_PIN LDO //io pin
|
||||
#define CONFIG_RESET_TIME 04 //unit:second
|
||||
#define CONFIG_RESET_LEVEL 1 //tigger level(0/1)
|
||||
|
||||
#if CONFIG_IO_KEY_EN
|
||||
#define CONFIG_SUPPORT_RESET1
|
||||
#define CONFIG_RESET1_PIN PB01 //io pin
|
||||
#define CONFIG_RESET1_TIME 08 //unit:second
|
||||
#define CONFIG_RESET1_LEVEL 0 //tigger level(0/1)
|
||||
#endif
|
||||
|
||||
//reserved three custom cfg item for the future definition
|
||||
//#define CONFIG_CUSTOM_CFG1_TYPE POWER_PIN
|
||||
//#define CONFIG_CUSTOM_CFG1_VALUE PC01_1
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG2_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG2_VALUE
|
||||
|
||||
//#define CONFIG_CUSTOM_CFG3_TYPE
|
||||
//#define CONFIG_CUSTOM_CFG3_VALUE
|
||||
|
||||
|
||||
//#define CONFIG_VDDIO_LVD_LEVEL 4 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
|
||||
|
||||
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
|
||||
#define CONFIG_VM_LEAST_SIZE 8K
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_VM_OPT 1
|
||||
|
||||
//config whether erased this area when do a update,1-No Operation,0-Erase
|
||||
#define CONFIG_BTIF_OPT 1
|
||||
|
||||
//reserved two custom cfg area for the future definition
|
||||
//#define CONFIG_RESERVED_AREA1 EXIF1
|
||||
#ifdef CONFIG_RESERVED_AREA1
|
||||
#define CONFIG_RESERVED_AREA1_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA1_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA1_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
//#define CONFIG_RESERVED_AREA2 EXIF2
|
||||
#ifdef CONFIG_RESERVED_AREA2
|
||||
#define CONFIG_RESERVED_AREA2_ADDR AUTO
|
||||
#define CONFIG_RESERVED_AREA2_LEN 0x1000
|
||||
#define CONFIG_RESERVED_AREA2_OPT 1
|
||||
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
|
||||
#endif
|
||||
|
||||
/* Above Macros Only For Post Bulid Configuaration */
|
||||
#endif /* #ifdef CONFIG_BOARD_JL701N_DEMO */
|
||||
|
||||
#endif /* #ifndef CONFIG_BOARD_JL701N_DEMO_POST_BUILD_CFG_H */
|
||||
|
||||
417
apps/earphone/bt_auto_test.c
Normal file
417
apps/earphone/bt_auto_test.c
Normal file
@ -0,0 +1,417 @@
|
||||
#if 0
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "tone_player.h"
|
||||
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "btstack/btstack_task.h"
|
||||
#include "btstack/frame_queque.h"
|
||||
#include "user_cfg.h"
|
||||
#include "aec_user.h"
|
||||
#include "classic/hci_lmp.h"
|
||||
#include "bt_common.h"
|
||||
#include "pbg_user.h"
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif
|
||||
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
#include "include/bt_ble.h"
|
||||
#endif
|
||||
|
||||
#if TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE
|
||||
#include "app_chargestore.h"
|
||||
#endif
|
||||
|
||||
#include "asm/charge.h"
|
||||
#include "app_charge.h"
|
||||
#include "ui_manage.h"
|
||||
|
||||
#include "app_chargestore.h"
|
||||
#include "app_online_cfg.h"
|
||||
#include "app_main.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "gSensor/gSensor_manage.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "classic/tws_api.h"
|
||||
#include "asm/pwm_led.h"
|
||||
#include "vol_sync.h"
|
||||
|
||||
|
||||
#define CONFIG_SPP_PRINTF_DEBUG 0
|
||||
|
||||
#define CONFIG_A2DP_PLAY_PAUSE_TEST 0
|
||||
#define CONFIG_A2DP_PLAY_NUM 0
|
||||
#define CONFIG_POWEROFF_TEST 0
|
||||
#define CONFIG_LOW_LATENCY_TEST 0
|
||||
#define CONFIG_A2DP_AUTO_PLAY 1
|
||||
#define CONFIG_IN_OUT_CHARGESTORE_TEST 0
|
||||
#define CONFIG_TWS_SUPER_TIMEOUT_TEST 0
|
||||
|
||||
#define CONFIG_MODE_SWITCH_ENABLE 0
|
||||
#define CONFIG_ROLE_SWITCH_TEST 0
|
||||
|
||||
#define CONFIG_GMA_TEST 0
|
||||
|
||||
|
||||
|
||||
#if CONFIG_LOW_LATENCY_TEST
|
||||
|
||||
static void low_latency_switch_test(void *p)
|
||||
{
|
||||
struct sys_event evt;
|
||||
|
||||
r_printf("low_latency_test\n");
|
||||
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
evt.arg = (void *)DEVICE_EVENT_FROM_KEY;
|
||||
evt.type = SYS_KEY_EVENT;
|
||||
evt.u.key.value = KEY_POWER_START;
|
||||
evt.u.key.event = KEY_EVENT_TRIPLE_CLICK;
|
||||
|
||||
sys_event_notify(&evt);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if CONFIG_GMA_TEST
|
||||
static void gma_test(void *p)
|
||||
{
|
||||
struct sys_event evt;
|
||||
|
||||
r_printf("gma_test\n");
|
||||
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
evt.arg = (void *)DEVICE_EVENT_FROM_KEY;
|
||||
evt.type = SYS_KEY_EVENT;
|
||||
evt.u.key.value = KEY_POWER_START;
|
||||
evt.u.key.event = KEY_EVENT_LONG;
|
||||
|
||||
sys_event_notify(&evt);
|
||||
|
||||
int ms = 10000 + rand32() % 10 * 5000;
|
||||
sys_timeout_add(NULL, gma_test, ms);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if CONFIG_SPP_PRINTF_DEBUG
|
||||
static u32 spp_buf[1024 / 4];
|
||||
static cbuffer_t spp_buf_hdl;
|
||||
static u32 send_len = 0;
|
||||
static int spp_timer = 0;
|
||||
static char out[256];
|
||||
|
||||
int log_print_time_to_buf(char *time);
|
||||
|
||||
void spp_printf(const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
char *p = out;
|
||||
|
||||
if (spp_timer == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(args, format);
|
||||
|
||||
int len = log_print_time_to_buf(p);
|
||||
p += len;
|
||||
|
||||
len += print(&p, 0, format, args);
|
||||
if (cbuf_is_write_able(&spp_buf_hdl, len)) {
|
||||
cbuf_write(&spp_buf_hdl, out, len);
|
||||
} else {
|
||||
putchar('N');
|
||||
}
|
||||
}
|
||||
|
||||
void spp_send_data_timer(void *p)
|
||||
{
|
||||
u8 *ptr;
|
||||
|
||||
__send:
|
||||
if (send_len == 0) {
|
||||
ptr = cbuf_read_alloc(&spp_buf_hdl, &send_len);
|
||||
if (send_len) {
|
||||
if (send_len > 250) {
|
||||
send_len = 250;
|
||||
}
|
||||
user_send_cmd_prepare(USER_CTRL_SPP_SEND_DATA, send_len, ptr);
|
||||
}
|
||||
} else {
|
||||
if (0 == user_send_cmd_prepare(USER_CTRL_SPP_SEND_DATA, 0, NULL)) {
|
||||
cbuf_read_updata(&spp_buf_hdl, send_len);
|
||||
send_len = 0;
|
||||
goto __send;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void spp_data_handler(u8 packet_type, u16 ch, u8 *packet, u16 size)
|
||||
{
|
||||
switch (packet_type) {
|
||||
case 1:
|
||||
cbuf_init(&spp_buf_hdl, spp_buf, sizeof(spp_buf));
|
||||
spp_timer = sys_timer_add(NULL, spp_send_data_timer, 50);
|
||||
spp_printf("spp connect\n");
|
||||
break;
|
||||
case 2:
|
||||
printf("spp disconnect\n");
|
||||
if (spp_timer) {
|
||||
sys_timer_del(spp_timer);
|
||||
spp_timer = 0;
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
//log_info("spp_rx:");
|
||||
//put_buf(packet,size);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
static int a2dp_open_cnt = 0;
|
||||
u8 bt_audio_is_running(void);
|
||||
|
||||
static void a2dp_play_pause_test(void *p)
|
||||
{
|
||||
struct sys_event evt;
|
||||
|
||||
if (bt_audio_is_running()) {
|
||||
if (p) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (!p) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
r_printf("a2dp_play_pause_test\n");
|
||||
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
evt.arg = (void *)DEVICE_EVENT_FROM_KEY;
|
||||
evt.type = SYS_KEY_EVENT;
|
||||
evt.u.key.value = KEY_POWER_START;
|
||||
evt.u.key.event = KEY_EVENT_CLICK;
|
||||
/*evt.u.key.event = KEY_EVENT_DOUBLE_CLICK;*/
|
||||
|
||||
sys_event_notify(&evt);
|
||||
}
|
||||
}
|
||||
|
||||
static void disconnect_test(void *p)
|
||||
{
|
||||
r_printf("disconnect_test: %x\n", p);
|
||||
|
||||
if (!p) {
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
user_send_cmd_prepare(USER_CTRL_POWER_OFF, 0, NULL);
|
||||
}
|
||||
} else {
|
||||
bt_user_priv_var.auto_connection_counter = 60 * 1000;
|
||||
bt_tws_phone_connect_timeout();
|
||||
}
|
||||
}
|
||||
|
||||
#if CONFIG_TWS_SUPER_TIMEOUT_TEST
|
||||
extern void tws_timeout_test();
|
||||
static void tws_super_timeout_test(void *p)
|
||||
{
|
||||
tws_timeout_test();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CONFIG_ROLE_SWITCH_TEST
|
||||
static void tws_role_switch_test(void *p)
|
||||
{
|
||||
tws_conn_switch_role();
|
||||
|
||||
/*void bt_tws_role_switch();
|
||||
bt_tws_role_switch();*/
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if CONFIG_MODE_SWITCH_ENABLE
|
||||
static void mode_switch_test()
|
||||
{
|
||||
struct sys_event evt;
|
||||
|
||||
if (tws_api_get_role() == 0) {
|
||||
evt.arg = (void *)DEVICE_EVENT_FROM_KEY;
|
||||
evt.type = SYS_KEY_EVENT;
|
||||
evt.u.key.value = KEY_POWER_START;
|
||||
evt.u.key.event = KEY_EVENT_TRIPLE_CLICK;
|
||||
sys_event_notify(&evt);
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
static int bt_connction_status_event_handler(struct bt_event *bt)
|
||||
{
|
||||
switch (bt->event) {
|
||||
case BT_STATUS_FIRST_CONNECTED:
|
||||
#if CONFIG_SPP_PRINTF_DEBUG
|
||||
spp_data_deal_handle_register(spp_data_handler);
|
||||
#endif
|
||||
|
||||
#if CONFIG_A2DP_AUTO_PLAY
|
||||
if (tws_api_get_role() == 0) {
|
||||
sys_timeout_add((void *)1, a2dp_play_pause_test, 8000);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_LOW_LATENCY_TEST
|
||||
if (tws_api_get_role() == 0) {
|
||||
sys_timer_add(NULL, low_latency_switch_test, 15000);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_GMA_TEST
|
||||
if (tws_api_get_role() == 0) {
|
||||
sys_timeout_add(NULL, gma_test, 15000);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_POWEROFF_TEST
|
||||
{
|
||||
int msec = 10000 ;//+ rand32() % 5 * 5000;
|
||||
sys_timeout_add(NULL, disconnect_test, msec);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_MODE_SWITCH_ENABLE
|
||||
sys_timer_add(NULL, mode_switch_test, 20000);
|
||||
#endif
|
||||
break;
|
||||
case BT_STATUS_FIRST_DISCONNECT:
|
||||
#if CONFIG_POWEROFF_TEST
|
||||
a2dp_open_cnt = 0;
|
||||
sys_timeout_add((void *)1, disconnect_test, 2000);
|
||||
#endif
|
||||
break;
|
||||
case BT_STATUS_A2DP_MEDIA_START:
|
||||
#if CONFIG_A2DP_PLAY_PAUSE_TEST
|
||||
if (CONFIG_A2DP_PLAY_NUM && ++a2dp_open_cnt >= CONFIG_A2DP_PLAY_NUM) {
|
||||
#if CONFIG_POWEROFF_TEST
|
||||
sys_timeout_add(NULL, disconnect_test, 5000);
|
||||
#endif
|
||||
} else {
|
||||
sys_timeout_add(NULL, a2dp_play_pause_test, 10000);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_ROLE_SWITCH_TEST
|
||||
sys_timeout_add(NULL, tws_role_switch_test, 5000);
|
||||
#endif
|
||||
break;
|
||||
case BT_STATUS_A2DP_MEDIA_STOP:
|
||||
#if CONFIG_A2DP_PLAY_PAUSE_TEST
|
||||
if (CONFIG_A2DP_PLAY_NUM == 0 || a2dp_open_cnt < CONFIG_A2DP_PLAY_NUM) {
|
||||
sys_timeout_add((void *)1, a2dp_play_pause_test, 15000);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bt_tws_event_handler(struct bt_event *evt)
|
||||
{
|
||||
int role = evt->args[0];
|
||||
int phone_link_connection = evt->args[1];
|
||||
int reason = evt->args[2];
|
||||
|
||||
switch (evt->event) {
|
||||
case TWS_EVENT_CONNECTED:
|
||||
#if CONFIG_IN_OUT_CHARGESTORE_TEST
|
||||
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
|
||||
void sys_enter_soft_poweroff(void *priv);
|
||||
sys_timeout_add((void *)1, sys_enter_soft_poweroff, 5000);
|
||||
}
|
||||
#endif
|
||||
#if CONFIG_TWS_SUPER_TIMEOUT_TEST
|
||||
sys_timeout_add(NULL, tws_super_timeout_test, 10000);
|
||||
#endif
|
||||
#if CONFIG_ROLE_SWITCH_TEST
|
||||
sys_timeout_add(NULL, tws_role_switch_test, 15000);
|
||||
#endif
|
||||
break;
|
||||
case TWS_EVENT_ROLE_SWITCH:
|
||||
#if CONFIG_ROLE_SWITCH_TEST
|
||||
sys_timeout_add(NULL, tws_role_switch_test, 5000);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void auto_test_event_handler(struct sys_event *event, void *priv)
|
||||
{
|
||||
/*
|
||||
* 蓝牙事件处理
|
||||
*/
|
||||
switch ((u32)event->arg) {
|
||||
case SYS_BT_EVENT_TYPE_CON_STATUS:
|
||||
bt_connction_status_event_handler(&event->u.bt);
|
||||
break;
|
||||
case SYS_BT_EVENT_TYPE_HCI_STATUS:
|
||||
break;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
case SYS_BT_EVENT_FROM_TWS:
|
||||
bt_tws_event_handler(&event->u.bt);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void bt_auto_test_task(void *p)
|
||||
{
|
||||
int res;
|
||||
int msg[32];
|
||||
|
||||
register_sys_event_handler(SYS_BT_EVENT, 0, 0, auto_test_event_handler);
|
||||
|
||||
os_time_dly(2);
|
||||
|
||||
#if CONFIG_IN_OUT_CHARGESTORE_TEST
|
||||
void sys_enter_soft_poweroff(void *priv);
|
||||
int msec = 500 + rand32() % 10 * 200;
|
||||
sys_timeout_add((void *)1, sys_enter_soft_poweroff, msec);
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
res = os_taskq_pend("taskq", msg, ARRAY_SIZE(msg));
|
||||
if (res != OS_TASKQ) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int bt_auto_test_init()
|
||||
{
|
||||
os_task_create(bt_auto_test_task, NULL, 1, 256, 256, "auto_test");
|
||||
return 0;
|
||||
}
|
||||
late_initcall(bt_auto_test_init);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
255
apps/earphone/bt_background.c
Normal file
255
apps/earphone/bt_background.c
Normal file
@ -0,0 +1,255 @@
|
||||
#include "system/includes.h"
|
||||
#include "classic/tws_api.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "btstack/a2dp_media_codec.h"
|
||||
|
||||
#include "app_config.h"
|
||||
#include "app_main.h"
|
||||
#include "app_action.h"
|
||||
|
||||
#include "app_task.h"
|
||||
#include "audio_config.h"
|
||||
|
||||
static u16 clear_to_seqn = 0;
|
||||
static u16 slience_timer;
|
||||
static u8 unmute_packet_cnt;
|
||||
static u8 g_bt_background = 0;
|
||||
static u8 energy_check_stop;
|
||||
|
||||
u8 bt_media_is_running();
|
||||
void a2dp_dec_close();
|
||||
void bt_switch_to_foreground(int action, bool exit_curr_app);
|
||||
|
||||
#define TWS_A2DP_CLEAR_ID TWS_FUNC_ID('A', 2, 'C', 'R')
|
||||
|
||||
|
||||
static void __tws_a2dp_clear_to_seqn(void *data, u16 len, bool rx)
|
||||
{
|
||||
if (rx) {
|
||||
clear_to_seqn = *(u16 *)data;
|
||||
}
|
||||
}
|
||||
|
||||
REGISTER_TWS_FUNC_STUB(tws_a2dp_clear_to_seqn) = {
|
||||
.func_id = TWS_A2DP_CLEAR_ID,
|
||||
.func = __tws_a2dp_clear_to_seqn,
|
||||
};
|
||||
|
||||
bool bt_in_background()
|
||||
{
|
||||
return g_bt_background;
|
||||
}
|
||||
|
||||
void a2dp_slience_detect(void *p)
|
||||
{
|
||||
int len;
|
||||
u8 *packet;
|
||||
int ingore_packet_num = (int)p;
|
||||
int role = tws_api_get_role();
|
||||
|
||||
u32 media_type;
|
||||
putchar('^');
|
||||
while (1) {
|
||||
media_type = a2dp_media_get_codec_type();
|
||||
len = a2dp_media_try_get_packet(&packet);
|
||||
if (len <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
u16 seqn = (packet[2] << 8) | packet[3];
|
||||
|
||||
if (role == TWS_ROLE_MASTER) {
|
||||
if (clear_to_seqn == 0) {
|
||||
clear_to_seqn = seqn + ingore_packet_num;
|
||||
if (clear_to_seqn == 0) {
|
||||
clear_to_seqn = 1;
|
||||
}
|
||||
a2dp_media_free_packet(packet);
|
||||
a2dp_media_clear_packet_before_seqn(clear_to_seqn);
|
||||
break;
|
||||
}
|
||||
|
||||
//能量检测
|
||||
if (energy_check_stop == 0) {
|
||||
int energy;
|
||||
if (media_type == 0) {
|
||||
energy = sbc_energy_check(packet, len);
|
||||
} else {
|
||||
energy = aac_energy_check(packet, len);
|
||||
|
||||
}
|
||||
|
||||
printf("energy:media_type= %d,%d, %d, %d\n", media_type, seqn, energy, unmute_packet_cnt);
|
||||
|
||||
if (energy >= 10) {
|
||||
if (++unmute_packet_cnt >= 20) {
|
||||
unmute_packet_cnt = 0;
|
||||
energy_check_stop = 1;
|
||||
|
||||
//能量检测结束,通知从机丢到指定包号数据,然后开始A2DP解码
|
||||
clear_to_seqn = seqn + 10;
|
||||
if (clear_to_seqn == 0) {
|
||||
clear_to_seqn = 1;
|
||||
}
|
||||
tws_api_send_data_to_slave(&clear_to_seqn, 2, TWS_A2DP_CLEAR_ID);
|
||||
}
|
||||
} else {
|
||||
unmute_packet_cnt >>= 1;
|
||||
}
|
||||
a2dp_media_free_packet(packet);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
printf("seqn: %d, %d\n", seqn, clear_to_seqn);
|
||||
|
||||
a2dp_media_free_packet(packet);
|
||||
|
||||
if (clear_to_seqn && seqn_after(seqn, clear_to_seqn)) {
|
||||
clear_to_seqn = 0;
|
||||
sys_timer_del(slience_timer);
|
||||
slience_timer = 0;
|
||||
if (!bt_in_background()) {
|
||||
//先点击手机播放再立马按键切模式时,此处需要打开a2dp解码
|
||||
g_bt_background = 1;
|
||||
bt_switch_to_foreground(ACTION_A2DP_START, 0);
|
||||
} else {
|
||||
app_task_switch_to(APP_BT_TASK, ACTION_A2DP_START);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void bt_start_a2dp_slience_detect(int ingore_packet_num)
|
||||
{
|
||||
if (slience_timer) {
|
||||
sys_timer_del(slience_timer);
|
||||
}
|
||||
clear_to_seqn = 0;
|
||||
unmute_packet_cnt = 0;
|
||||
energy_check_stop = 0;
|
||||
slience_timer = sys_timer_add((void *)ingore_packet_num, a2dp_slience_detect, 40);
|
||||
g_printf("bt_start_a2dp_slience_detect=%d\n", slience_timer);
|
||||
}
|
||||
|
||||
void bt_stop_a2dp_slience_detect()
|
||||
{
|
||||
if (slience_timer) {
|
||||
sys_timer_del(slience_timer);
|
||||
g_printf("bt_stop_a2dp_slience_detect");
|
||||
slience_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
int bt_switch_to_background()
|
||||
{
|
||||
int a2dp_state;
|
||||
int esco_state;
|
||||
struct intent it;
|
||||
|
||||
if (app_var.siri_stu && app_var.siri_stu != 3 && get_esco_busy_flag()) {
|
||||
// siri不退出
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
esco_state = get_call_status();
|
||||
if (esco_state == BT_CALL_OUTGOING ||
|
||||
esco_state == BT_CALL_ALERT ||
|
||||
esco_state == BT_CALL_INCOMING ||
|
||||
esco_state == BT_CALL_ACTIVE) {
|
||||
// 通话不退出
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
a2dp_state = a2dp_get_status();
|
||||
r_printf("a2dp_state=%d\n", a2dp_state);
|
||||
if ((tws_api_get_role() == TWS_ROLE_MASTER) && (a2dp_state == BT_MUSIC_STATUS_STARTING)) {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PAUSE, 0, NULL);
|
||||
}
|
||||
if (bt_media_is_running()) {
|
||||
a2dp_dec_close();
|
||||
a2dp_media_clear_packet_before_seqn(0);
|
||||
bt_start_a2dp_slience_detect(30);
|
||||
}
|
||||
|
||||
g_bt_background = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void bt_switch_to_foreground(int action, bool exit_curr_app)
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
if (g_bt_background) {
|
||||
g_bt_background = 0;
|
||||
|
||||
/* 退出当前模式 */
|
||||
if (exit_curr_app) {
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
}
|
||||
|
||||
if (action) {
|
||||
init_intent(&it);
|
||||
it.name = "earphone";
|
||||
it.action = action;
|
||||
start_app(&it);
|
||||
}
|
||||
}
|
||||
|
||||
int bt_background_event_probe_handler(struct bt_event *bt)
|
||||
{
|
||||
int len;
|
||||
|
||||
switch (bt->event) {
|
||||
case BT_STATUS_INIT_OK:
|
||||
len = syscfg_read(CFG_HAVE_MASS_STORAGE, &app_var.have_mass_storage, 1);
|
||||
if (len != 1) {
|
||||
if (dev_online("sd0")) {
|
||||
app_var.have_mass_storage = 1;
|
||||
syscfg_write(CFG_HAVE_MASS_STORAGE, &app_var.have_mass_storage, 1);
|
||||
}
|
||||
}
|
||||
printf("have_mass_storage: %d\n", app_var.have_mass_storage);
|
||||
break;
|
||||
case BT_STATUS_A2DP_MEDIA_START:
|
||||
puts("BT_STATUS_A2DP_MEDIA_START\n");
|
||||
if (bt_in_background()) {
|
||||
bt_start_a2dp_slience_detect(30);
|
||||
return -EINVAL;
|
||||
} else {
|
||||
bt_stop_a2dp_slience_detect();
|
||||
}
|
||||
break;
|
||||
case BT_STATUS_A2DP_MEDIA_STOP:
|
||||
puts("BT_STATUS_A2DP_MEDIA_STOP\n");
|
||||
if (bt_in_background()) {
|
||||
bt_stop_a2dp_slience_detect();
|
||||
extern void free_a2dp_using_decoder_conn();
|
||||
free_a2dp_using_decoder_conn();
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case BT_STATUS_VOICE_RECOGNITION:
|
||||
if (bt->value && bt->value != 3) {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
case BT_STATUS_PHONE_INCOME:
|
||||
case BT_STATUS_PHONE_OUT:
|
||||
case BT_STATUS_PHONE_ACTIVE:
|
||||
bt_switch_to_foreground(ACTION_DO_NOTHING, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
1054
apps/earphone/bt_ble.c
Normal file
1054
apps/earphone/bt_ble.c
Normal file
File diff suppressed because it is too large
Load Diff
253
apps/earphone/bt_ble_hid.c
Normal file
253
apps/earphone/bt_ble_hid.c
Normal file
@ -0,0 +1,253 @@
|
||||
#include "system/app_core.h"
|
||||
#include "system/includes.h"
|
||||
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
|
||||
#include "earphone.h"
|
||||
#include "app_main.h"
|
||||
#include "update_tws.h"
|
||||
#include "3th_profile_api.h"
|
||||
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "btstack/btstack_task.h"
|
||||
#include "bt_tws.h"
|
||||
|
||||
#include "user_cfg.h"
|
||||
#include "vm.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "btcontroller_modules.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "bt_common.h"
|
||||
#include "le_common.h"
|
||||
|
||||
#if (BLE_HID_EN)
|
||||
|
||||
/* #define LOG_TAG_CONST BLE_HID */
|
||||
/* #define LOG_TAG "[BLE_HID]" */
|
||||
/* #define LOG_ERROR_ENABLE */
|
||||
/* #define LOG_DEBUG_ENABLE */
|
||||
/* #define LOG_INFO_ENABLE */
|
||||
/* #define LOG_CLI_ENABLE */
|
||||
/* #include "debug.h" */
|
||||
|
||||
#if 1
|
||||
#define log_info(x, ...) printf("[BLE-HID]" x " ", ## __VA_ARGS__)
|
||||
#define log_info_hexdump put_buf
|
||||
#else
|
||||
#define log_info(...)
|
||||
#define log_info_hexdump(...)
|
||||
#endif
|
||||
|
||||
|
||||
#define HID_TRACE_FUNC() log_info("func:%s ,line:%d\n",__FUNCTION__,__LINE__)
|
||||
|
||||
//----------------------------------
|
||||
static const u8 bt_hidkey_report_map[] = {
|
||||
0x05, 0x0C, // Usage Page (Consumer)
|
||||
0x09, 0x01, // Usage (Consumer Control)
|
||||
0xA1, 0x01, // Collection (Application)
|
||||
0x85, 0x01, // Report ID (1)
|
||||
0x09, 0xE9, // Usage (Volume Increment)
|
||||
0x09, 0xEA, // Usage (Volume Decrement)
|
||||
0x09, 0xCD, // Usage (Play/Pause)
|
||||
0x09, 0xE2, // Usage (Mute)
|
||||
0x09, 0xB6, // Usage (Scan Previous Track)
|
||||
0x09, 0xB5, // Usage (Scan Next Track)
|
||||
0x09, 0xB3, // Usage (Fast Forward)
|
||||
0x09, 0xB4, // Usage (Rewind)
|
||||
0x15, 0x00, // Logical Minimum (0)
|
||||
0x25, 0x01, // Logical Maximum (1)
|
||||
0x75, 0x01, // Report Size (1)
|
||||
0x95, 0x10, // Report Count (16)
|
||||
0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
|
||||
0xC0, // End Collection
|
||||
// 35 bytes
|
||||
};
|
||||
|
||||
// consumer key
|
||||
#define CONSUMER_VOLUME_INC 0x0001
|
||||
#define CONSUMER_VOLUME_DEC 0x0002
|
||||
#define CONSUMER_PLAY_PAUSE 0x0004
|
||||
#define CONSUMER_MUTE 0x0008
|
||||
#define CONSUMER_SCAN_PREV_TRACK 0x0010
|
||||
#define CONSUMER_SCAN_NEXT_TRACK 0x0020
|
||||
#define CONSUMER_SCAN_FRAME_FORWARD 0x0040
|
||||
#define CONSUMER_SCAN_FRAME_BACK 0x0080
|
||||
|
||||
int ble_hid_is_connected(void);
|
||||
int ble_hid_data_send(u8 report_id, u8 *data, u16 len);
|
||||
void le_hogp_set_icon(u16 class_type);
|
||||
void le_hogp_set_ReportMap(u8 *map, u16 size);
|
||||
void le_hogp_regiest_get_battery(u8(*get_battery_cbk)(void));
|
||||
u8 get_vbat_percent(void);
|
||||
void ble_module_enable(u8 en);
|
||||
void bt_update_mac_addr(u8 *addr);
|
||||
void lib_make_ble_address(u8 *ble_address, u8 *edr_address);
|
||||
|
||||
static void ble_hid_test_timer(void *priv)
|
||||
{
|
||||
if (ble_hid_is_connected()) {
|
||||
log_info("PP key for test!!!\n");
|
||||
u16 key = CONSUMER_PLAY_PAUSE;
|
||||
ble_hid_data_send(1, &key, 2);
|
||||
key = 0;
|
||||
ble_hid_data_send(1, &key, 2);
|
||||
}
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_set_page_scan_enable()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_get_connect_mac_addr()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_cancel_page_scan()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_tws_init(int paired)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_tws_connected(int first_pair, u8 *comm_addr)
|
||||
{
|
||||
if (first_pair) {
|
||||
u8 tmp_ble_addr[6] = {0};
|
||||
lib_make_ble_address(tmp_ble_addr, comm_addr);
|
||||
le_controller_set_mac(tmp_ble_addr);//将ble广播地址改成公共地址
|
||||
bt_update_mac_addr(comm_addr);
|
||||
|
||||
/*新的连接,公共地址改变了,要重新将新的地址广播出去*/
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
log_info("New Connect Master!!!\n");
|
||||
ble_module_enable(0);
|
||||
ble_module_enable(1);
|
||||
} else {
|
||||
log_info("Connect Slave!!!\n\n");
|
||||
/*从机ble关掉*/
|
||||
ble_module_enable(0);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_earphone_state_enter_soft_poweroff()
|
||||
{
|
||||
extern void bt_ble_exit(void);
|
||||
bt_ble_exit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_bt_status_event_handler(struct bt_event *bt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ble_hid_hci_event_handler(struct bt_event *bt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ble_hid_bt_tws_event_handler(struct bt_event *bt)
|
||||
{
|
||||
int role = bt->args[0];
|
||||
int phone_link_connection = bt->args[1];
|
||||
int reason = bt->args[2];
|
||||
|
||||
log_info("tws_msg: %d\n", bt->event);
|
||||
|
||||
switch (bt->event) {
|
||||
case TWS_EVENT_CONNECTED:
|
||||
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
|
||||
//master enable
|
||||
log_info("Connect Slave!!!\n");
|
||||
/*从机ble关掉*/
|
||||
ble_module_enable(0);
|
||||
}
|
||||
break;
|
||||
|
||||
case TWS_EVENT_CONNECTION_TIMEOUT:
|
||||
break;
|
||||
|
||||
case TWS_EVENT_PHONE_LINK_DETACH:
|
||||
/*
|
||||
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
|
||||
*/
|
||||
break;
|
||||
case TWS_EVENT_CONNECTION_DETACH:
|
||||
/*
|
||||
* TWS连接断开
|
||||
*/
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* if (get_app_connect_type() == 0) { */
|
||||
/* log_info("tws detach to open ble~~~\n"); */
|
||||
/* ble_module_enable(1); */
|
||||
/* } */
|
||||
/* set_ble_connect_type(TYPE_NULL); */
|
||||
|
||||
break;
|
||||
|
||||
case TWS_EVENT_SYNC_FUN_CMD:
|
||||
break;
|
||||
|
||||
case TWS_EVENT_ROLE_SWITCH:
|
||||
break;
|
||||
}
|
||||
|
||||
#if OTA_TWS_SAME_TIME_ENABLE
|
||||
/* tws_ota_app_event_deal(bt->event); */
|
||||
#endif
|
||||
}
|
||||
|
||||
int ble_hid_sys_event_handler_specific(struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_BT_EVENT:
|
||||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||||
|
||||
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
|
||||
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||||
trans_data_bt_tws_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
#if OTA_TWS_SAME_TIME_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_OTA_EVENT_TYPE_STATUS)) {
|
||||
bt_ota_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case SYS_DEVICE_EVENT:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int ble_hid_earphone_state_init()
|
||||
{
|
||||
le_hogp_set_icon(BLE_APPEARANCE_HID_KEYBOARD);
|
||||
le_hogp_set_ReportMap(bt_hidkey_report_map, sizeof(bt_hidkey_report_map));
|
||||
le_hogp_regiest_get_battery(get_vbat_percent);
|
||||
|
||||
sys_timer_add(0, ble_hid_test_timer, 6000);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
1218
apps/earphone/bt_emitter.c
Normal file
1218
apps/earphone/bt_emitter.c
Normal file
File diff suppressed because it is too large
Load Diff
2228
apps/earphone/bt_tws.c
Normal file
2228
apps/earphone/bt_tws.c
Normal file
File diff suppressed because it is too large
Load Diff
373
apps/earphone/default_event_handler.c
Normal file
373
apps/earphone/default_event_handler.c
Normal file
@ -0,0 +1,373 @@
|
||||
#include "default_event_handler.h"
|
||||
#include "app_action.h"
|
||||
#include "bt_background.h"
|
||||
#include "earphone.h"
|
||||
#include "dev_manager/dev_manager.h"
|
||||
#include "app_config.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "bt_tws.h"
|
||||
#include "app_main.h"
|
||||
#include "app_music.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "asm/charge.h"
|
||||
#include "app_sd_music.h"
|
||||
#include "usb/otg.h"
|
||||
#include "update.h"
|
||||
|
||||
#if (TCFG_APP_MUSIC_EN || TCFG_PC_ENABLE)
|
||||
#include "app_task.h"
|
||||
|
||||
#if TCFG_DEC2TWS_ENABLE
|
||||
#include "audio_dec/audio_dec_file.h"
|
||||
#endif
|
||||
|
||||
extern u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX];
|
||||
extern int pc_device_event_handler(struct sys_event *event);
|
||||
extern u32 timer_get_ms(void);
|
||||
extern u16 dev_update_check(char *logo);
|
||||
|
||||
int switch_to_music_app(int action)
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
if (action == ACTION_MUSIC_MAIN) {
|
||||
/* 卡不在线不切到music模式,
|
||||
* 防止TWS之间所处的模式不同导致A2DP播歌不同步
|
||||
*/
|
||||
#if TCFG_DEV_MANAGER_ENABLE
|
||||
if (!music_app_check()) {
|
||||
return -ENODEV;
|
||||
}
|
||||
#else
|
||||
if (!dev_online("sd0")) {
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
init_intent(&it);
|
||||
it.name = "music";
|
||||
it.action = action;
|
||||
return start_app(&it);
|
||||
}
|
||||
|
||||
void switch_to_prev_app()
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
|
||||
void switch_to_earphone_app()
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
|
||||
void switch_to_pc_app()
|
||||
{
|
||||
struct intent it;
|
||||
|
||||
/* 退出bt和music模式 */
|
||||
if (bt_in_background()) {
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
|
||||
|
||||
/* 切到PC模式 */
|
||||
init_intent(&it);
|
||||
it.name = "pc";
|
||||
it.action = ACTION_PC_MAIN;
|
||||
start_app(&it);
|
||||
}
|
||||
|
||||
static void sd_event_handler(struct device_event *evt)
|
||||
{
|
||||
//add 设备的返回值, 0成功
|
||||
int err = 0;
|
||||
if (evt->event == DEVICE_EVENT_IN) {
|
||||
if (app_var.have_mass_storage == 0) {
|
||||
app_var.have_mass_storage = 1;
|
||||
syscfg_write(CFG_HAVE_MASS_STORAGE, &app_var.have_mass_storage, 1);
|
||||
}
|
||||
#if TCFG_DEC2TWS_ENABLE
|
||||
if (bt_in_background()) {
|
||||
switch_to_music_app(ACTION_MUSIC_MAIN);
|
||||
}
|
||||
#elif TWFG_APP_POWERON_IGNORE_DEV
|
||||
err = dev_manager_add((char *)evt->value);
|
||||
if ((err == 0) && (!get_charge_online_flag()) && (usb_otg_online(0) != SLAVE_MODE)) { //充电状态只add设备,不切模式
|
||||
///检查设备升级
|
||||
if (dev_update_check((char *)evt->value) == UPDATA_READY) {
|
||||
return;
|
||||
}
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
if ((timer_get_ms() - app_var.start_time) > TWFG_APP_POWERON_IGNORE_DEV) {
|
||||
app_task_switch_to(APP_MUSIC_TASK, NULL_VALUE);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#else
|
||||
err = dev_manager_add((char *)evt->value);
|
||||
if ((err == 0) && (!get_charge_online_flag()) && (usb_otg_online(0) != SLAVE_MODE)) { //充电状态只add设备,不切模式
|
||||
///检查设备升级
|
||||
if (dev_update_check((char *)evt->value) == UPDATA_READY) {
|
||||
return;
|
||||
}
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
app_task_switch_to(APP_MUSIC_TASK, NULL_VALUE);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
} else if (evt->event == DEVICE_EVENT_OUT) {
|
||||
update_clear_result();
|
||||
#if (!TCFG_DEC2TWS_ENABLE)
|
||||
dev_manager_del((char *)evt->value);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
static int default_earphone_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
struct key_event *key = &event->u.key;
|
||||
u8 key_event = key_table[key->value][key->event];
|
||||
|
||||
switch (key_event) {
|
||||
case KEY_MODE_SWITCH:
|
||||
puts("key_mode_switch\n");
|
||||
app_task_switch_next();
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#if ((TCFG_APP_MUSIC_EN || TCFG_APP_PC_EN) && TCFG_DEC2TWS_ENABLE)
|
||||
void tws_loacl_media_channe_start(struct bt_event *evt)
|
||||
{
|
||||
int role = tws_api_get_role();
|
||||
int state = tws_api_get_tws_state();
|
||||
|
||||
if (role == TWS_ROLE_MASTER) {
|
||||
if (state & TWS_STA_PHONE_CONNECTED) {
|
||||
tws_conn_switch_role();
|
||||
}
|
||||
if (state & (TWS_STA_ESCO_OPEN | TWS_STA_SBC_OPEN)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (file_dec_get_source() == FILE_FROM_LOCAL) {
|
||||
if (role == TWS_ROLE_MASTER) {
|
||||
return;
|
||||
}
|
||||
app_music_exit();
|
||||
}
|
||||
|
||||
switch_to_music_app(ACTION_MUSIC_TWS_RX);
|
||||
tws_local_media_dec_open(evt->args[0], evt->args + 2);
|
||||
sys_auto_shut_down_disable();
|
||||
}
|
||||
|
||||
void tws_loacl_media_channe_stop(struct bt_event *evt)
|
||||
{
|
||||
tws_local_media_dec_close(evt->args[0]);
|
||||
|
||||
sys_auto_shut_down_enable();
|
||||
|
||||
if (tws_api_get_tws_state() & TWS_STA_SIBLING_DISCONNECTED) {
|
||||
struct application *app = get_current_app();
|
||||
if (app && app->action != ACTION_PC_MAIN) {
|
||||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int default_tws_event_handler(struct bt_event *evt)
|
||||
{
|
||||
#if TCFG_DEC2TWS_ENABLE
|
||||
int role = evt->args[0];
|
||||
int phone_link_connection = evt->args[1];
|
||||
int state = evt->args[2];
|
||||
|
||||
switch (evt->event) {
|
||||
case TWS_EVENT_CONNECTED:
|
||||
tws_api_auto_role_switch_disable();
|
||||
if (state & (TWS_STA_ESCO_OPEN | TWS_STA_SBC_OPEN)) {
|
||||
if (bt_in_background()) {
|
||||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (file_dec_get_source() == FILE_FROM_LOCAL) {
|
||||
send_local_media_dec_open_cmd();
|
||||
} else {
|
||||
if (role == TWS_ROLE_MASTER) {
|
||||
if (switch_to_music_app(ACTION_MUSIC_MAIN) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (bt_in_background()) {
|
||||
bt_switch_to_foreground(ACTION_DO_NOTHING, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TWS_EVENT_CONNECTION_TIMEOUT:
|
||||
if (file_dec_get_source() == -EINVAL) {
|
||||
switch_to_music_app(ACTION_MUSIC_MAIN);
|
||||
}
|
||||
break;
|
||||
case TWS_EVENT_MONITOR_START:
|
||||
if (role == TWS_ROLE_MASTER) {
|
||||
if (!app_var.have_mass_storage || file_dec_get_source() == FILE_FROM_TWS) {
|
||||
tws_conn_switch_role();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TWS_EVENT_CONNECTION_DETACH:
|
||||
break;
|
||||
case TWS_EVENT_DATA_TRANS_OPEN:
|
||||
printf("TWS_EVENT_DATA_TRANS_OPEN: %d, %d\n", evt->args[0], evt->args[1]);
|
||||
break;
|
||||
case TWS_EVENT_DATA_TRANS_START:
|
||||
printf("TWS_EVENT_DATA_TRANS_START: %d, %d\n", evt->args[0], evt->args[1]);
|
||||
if (evt->args[1] == TWS_DTC_LOCAL_MEDIA) {
|
||||
tws_loacl_media_channe_start(evt);
|
||||
}
|
||||
break;
|
||||
case TWS_EVENT_DATA_TRANS_STOP:
|
||||
printf("TWS_EVENT_DATA_TRANS_STOP: %d, %d\n", evt->args[0], evt->args[1]);
|
||||
if (evt->args[1] == TWS_DTC_LOCAL_MEDIA) {
|
||||
tws_loacl_media_channe_stop(evt);
|
||||
}
|
||||
break;
|
||||
case TWS_EVENT_DATA_TRANS_CLOSE:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
#endif
|
||||
}
|
||||
#endif/* #if ((TCFG_APP_MUSIC_EN || TCFG_APP_PC_EN) && TCFG_DEC2TWS_ENABLE) */
|
||||
|
||||
void default_event_handler(struct sys_event *event)
|
||||
{
|
||||
printf("@@@default_event_handler event->type = %d\n", event->type);
|
||||
if (bt_in_background()) {
|
||||
bt_in_background_event_handler(event);
|
||||
}
|
||||
switch (event->type) {
|
||||
case SYS_KEY_EVENT:
|
||||
if (!bt_in_background()) {
|
||||
default_earphone_key_event_handler(event);
|
||||
}
|
||||
break;
|
||||
case SYS_BT_EVENT:
|
||||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||||
struct bt_event *bt = &event->u.bt;
|
||||
if (bt->event == BT_STATUS_PHONE_HANGUP || (bt->event == BT_STATUS_VOICE_RECOGNITION && !bt->value)) {
|
||||
r_printf("BT_STATUS_SCO_STATUS_CHANGE");
|
||||
/* if (bt->value == 0xff) */
|
||||
{
|
||||
app_core_back_to_prev_app();
|
||||
if (!app_core_back_to_prev_app_over_check()) {
|
||||
app_task_switch_to(APP_BT_TASK, ACTION_DO_NOTHING);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE && TCFG_DEC2TWS_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||||
default_tws_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case SYS_DEVICE_EVENT:
|
||||
/* 系统设备事件处理 */
|
||||
#if (TCFG_ONLINE_ENABLE || TCFG_CFG_TOOL_ENABLE)
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_CFG_TOOL) {
|
||||
extern int app_cfg_tool_event_handler(struct cfg_tool_event * cfg_tool_dev);
|
||||
app_cfg_tool_event_handler(&event->u.cfg_tool);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
if ((u32)event->arg == DRIVER_EVENT_FROM_SD0) {
|
||||
sd_event_handler(&event->u.dev);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_PC_ENABLE
|
||||
int ret = pc_device_event_handler(event);
|
||||
if (ret) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_IN) {
|
||||
app_task_switch_to(APP_PC_TASK, NULL_VALUE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void default_event_handler(struct sys_event *event)
|
||||
{
|
||||
/*puts("default_event_handler\n");*/
|
||||
struct intent it;
|
||||
switch (event->type) {
|
||||
case SYS_DEVICE_EVENT:
|
||||
/* 系统设备事件处理 */
|
||||
#if TCFG_PC_ENABLE
|
||||
extern int pc_device_event_handler(struct sys_event * event);
|
||||
int ret = pc_device_event_handler(event);
|
||||
if (ret) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_IN) {
|
||||
/* 退出bt和music模式 */
|
||||
if (bt_in_background()) {
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
}
|
||||
init_intent(&it);
|
||||
it.action = ACTION_BACK;
|
||||
start_app(&it);
|
||||
|
||||
/* 切到PC模式 */
|
||||
init_intent(&it);
|
||||
it.name = "pc";
|
||||
it.action = ACTION_PC_MAIN;
|
||||
start_app(&it);
|
||||
} else {
|
||||
cpu_reset();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
2792
apps/earphone/earphone.c
Normal file
2792
apps/earphone/earphone.c
Normal file
File diff suppressed because it is too large
Load Diff
672
apps/earphone/eartch_event_deal.c
Normal file
672
apps/earphone/eartch_event_deal.c
Normal file
@ -0,0 +1,672 @@
|
||||
//===========================================================//
|
||||
// LP TOUCH EAR EVENT HANDLE //
|
||||
//===========================================================//
|
||||
//1.入耳事件产生 --> sync state --> state 回调中处理播放暂停, 通话转换
|
||||
#include "includes.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif /* #if TCFG_USER_TWS_ENABLE */
|
||||
#include "tone_player.h"
|
||||
#include "app_config.h"
|
||||
#include "classic/tws_api.h"
|
||||
|
||||
#define LOG_TAG_CONST EARTCH_EVENT_DEAL
|
||||
#define LOG_TAG "[EARTCH_EVENT_DEAL]"
|
||||
/* #define LOG_ERROR_ENABLE */
|
||||
/* #define LOG_DEBUG_ENABLE */
|
||||
#define LOG_INFO_ENABLE
|
||||
#define LOG_DUMP_ENABLE
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
/* #define SUPPORT_MS_EXTENSIONS */
|
||||
/* #ifdef SUPPORT_MS_EXTENSIONS */
|
||||
/* #pragma bss_seg( ".eartch_event_deal_bss") */
|
||||
/* #pragma data_seg(".eartch_event_deal_data") */
|
||||
/* #pragma const_seg(".eartch_event_deal_const") */
|
||||
/* #pragma code_seg(".eartch_event_deal_code") */
|
||||
/* #endif */
|
||||
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
//========================================================================================//
|
||||
//入耳检测UI控制流程:
|
||||
//1.控制音乐播放条件:
|
||||
// 1)两只取下, 音乐暂停, 15s内佩戴耳机, 控制音乐为播放状态;
|
||||
// 2)一只取下, 音乐暂停, 没有时间限制, 控制音乐为播放状态;
|
||||
//2.控制音乐暂停条件: 当音乐播放时, 取下任意一个耳机, 音乐暂停;
|
||||
//3.控制通话语音转移到远端: 在通话状态下, 当两个耳机都取下, 语音由耳机端转移到远端;
|
||||
//4.控制通话语音转移到耳机端: 在通话状态下, 佩戴任意一个耳机, 语音由手机端端转移到耳机端;
|
||||
//========================================================================================//
|
||||
|
||||
bool __attribute__((weak)) get_tws_sibling_connect_state(void)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#define TWS_FUNC_ID_EARTCH_SYNC TWS_FUNC_ID('E', 'A', 'T', 'H')
|
||||
|
||||
|
||||
#define TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE 0 //对耳不在耳, 15s超时后入耳控制音乐播放无效
|
||||
#define TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT 0 //对耳不在耳, 断开a2dp链路, 音乐转移到手机扬声器
|
||||
#define TCFG_EARTCH_CALL_CTL_SCO_CONNECT 1 //对耳不在耳, 断开SCO链路, 通话转移到手机扬声器
|
||||
#define TCFG_EARTCH_AUTO_CHANGE_MASTER 1
|
||||
#define TCFG_EARTCH_SWITCH_CFG_ENABLE 1 //入耳消息处理使能开关, 配置项保存到vm, 支持动态开关
|
||||
|
||||
struct eartch_control {
|
||||
u8 eartch_event_deal_en;
|
||||
u8 local_state: 1;
|
||||
u8 remote_state: 1;
|
||||
u8 last_state: 1;
|
||||
u8 event_source: 1;
|
||||
u8 a2dp_connect_state: 1;
|
||||
u8 a2dp_send_flag: 1;
|
||||
u8 music_ctrl_en: 1;
|
||||
u8 state_check_cnt;
|
||||
u8 a2dp_play_state_cnt;
|
||||
u8 a2dp_stop_state_cnt;
|
||||
u16 state_check_timer;
|
||||
u16 music_ctrl_en_timer;
|
||||
u16 a2dp_monitor_timer;
|
||||
};
|
||||
|
||||
static struct eartch_control _eartch = {
|
||||
.local_state = EARTCH_STATE_OUT,
|
||||
.remote_state = EARTCH_STATE_OUT,
|
||||
.last_state = EARTCH_STATE_OUT,
|
||||
};
|
||||
|
||||
#define __this (&_eartch)
|
||||
|
||||
//============= 关于配置项保存信息 ==========//
|
||||
#define EARTCH_SWITCH_CFG_LEN 1 //配置项长度
|
||||
|
||||
enum EARTCH_TWS_SYNC_CMD {
|
||||
EARTCH_TWS_STATE_IN = 0x00,
|
||||
EARTCH_TWS_STATE_OUT = 0x01,
|
||||
EARTCH_TWS_STATE_TRIM_OK = 0x02,
|
||||
EARTCH_TWS_STATE_TRIM_ERR = 0x03,
|
||||
EARTCH_TWS_CFG_SAVE_EVENT_DEAL_ENABLE = 0x10,
|
||||
EARTCH_TWS_CFG_SAVE_EVENT_DEAL_DISABLE = 0x20,
|
||||
};
|
||||
|
||||
u8 earin_status = 0;
|
||||
u8 last_status = 0;
|
||||
u16 earin_lock_time = 0;
|
||||
|
||||
static void eartch_post_event(u8 event)
|
||||
{
|
||||
struct sys_event e;
|
||||
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
|
||||
e.type = SYS_DEVICE_EVENT;
|
||||
e.arg = (void *)DEVICE_EVENT_FROM_EARTCH;
|
||||
e.u.ear.value = event;
|
||||
log_info("notify event: %d", event);
|
||||
sys_event_notify(&e);
|
||||
}
|
||||
|
||||
static void eartch_send_bt_ctrl_cmd(u8 cmd)
|
||||
{
|
||||
static u8 last_cmd = 0;
|
||||
static u32 last_jiffies = 0;
|
||||
u32 cur_jiffies = jiffies;
|
||||
if (last_cmd == cmd) {
|
||||
if (jiffies_to_msecs(cur_jiffies - last_jiffies) < 1000) {
|
||||
log_debug("same cmd: %d", cmd);
|
||||
return;
|
||||
}
|
||||
}
|
||||
log_info("send cmd: %d", cmd);
|
||||
last_cmd = cmd;
|
||||
last_jiffies = cur_jiffies;
|
||||
user_send_cmd_prepare(cmd, 0, NULL);
|
||||
}
|
||||
|
||||
static void eartch_music_state_check_timer_del(void)
|
||||
{
|
||||
log_debug("timer del");
|
||||
if (__this->state_check_timer) {
|
||||
usr_timer_del(__this->state_check_timer);
|
||||
}
|
||||
__this->state_check_timer = 0;
|
||||
__this->state_check_cnt = 0;
|
||||
}
|
||||
|
||||
static void eartch_music_state_check(void *priv)
|
||||
{
|
||||
struct eartch_control *eartch = (struct eartch_control *)priv;
|
||||
|
||||
if (get_total_connect_dev() == 0) {
|
||||
log_info("no connect dev");
|
||||
eartch_music_state_check_timer_del();
|
||||
return;
|
||||
}
|
||||
|
||||
u8 a2dp_state;
|
||||
|
||||
log_debug("music_check_state cnt: %d, a2dp_connect_state = %d", __this->state_check_cnt, __this->a2dp_connect_state);
|
||||
if (__this->a2dp_connect_state) {
|
||||
a2dp_state = a2dp_get_status();
|
||||
log_debug("a2dp_state = %d", a2dp_state);
|
||||
if (__this->last_state == EARTCH_STATE_IN) {
|
||||
if (__this->music_ctrl_en) {
|
||||
if (a2dp_state != BT_MUSIC_STATUS_STARTING) {
|
||||
log_info("SEND PLAY");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_AVCTP_OPID_PLAY);
|
||||
__this->a2dp_send_flag = 0;
|
||||
eartch_music_state_check_timer_del();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (a2dp_state == BT_MUSIC_STATUS_STARTING) {
|
||||
log_info("SEND PAUSE");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_AVCTP_OPID_PAUSE);
|
||||
__this->a2dp_send_flag = 0;
|
||||
eartch_music_state_check_timer_del();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
__this->state_check_cnt++;
|
||||
if (__this->state_check_cnt > 15) {
|
||||
eartch_music_state_check_timer_del();
|
||||
}
|
||||
}
|
||||
|
||||
static void eartch_music_state_check_timer_add(void)
|
||||
{
|
||||
if (__this->state_check_timer != 0) {
|
||||
eartch_music_state_check_timer_del();
|
||||
}
|
||||
|
||||
log_debug("timer add");
|
||||
|
||||
__this->state_check_timer = usr_timer_add((void *)__this, eartch_music_state_check, 200, 1);
|
||||
}
|
||||
|
||||
static void eartch_a2dp_status_callback_handle(u8 conn_flag)
|
||||
{
|
||||
log_debug("update a2dp conflag: %d", conn_flag);
|
||||
if (conn_flag) {
|
||||
__this->a2dp_connect_state = 1;
|
||||
log_debug("a2dp_send_flag: %d, event_deal_en: %d", __this->a2dp_send_flag, __this->eartch_event_deal_en);
|
||||
if (__this->eartch_event_deal_en) {
|
||||
if (__this->a2dp_send_flag) {
|
||||
if (__this->music_ctrl_en) {
|
||||
eartch_music_state_check_timer_add();
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
__this->a2dp_connect_state = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void eartch_sync_tws_state(u8 state)
|
||||
{
|
||||
if (get_tws_sibling_connect_state() == TRUE) {
|
||||
tws_api_send_data_to_sibling(&state, 1, TWS_FUNC_ID_EARTCH_SYNC);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void eartch_sync_tws_state_deal(void *_data, u16 len, bool rx)
|
||||
{
|
||||
u8 *data = (u8 *)_data;
|
||||
u8 state = data[0];
|
||||
if (rx) {
|
||||
if (state <= EARTCH_TWS_STATE_OUT) {
|
||||
__this->remote_state = state & BIT(0);
|
||||
__this->event_source = 0;
|
||||
log_debug("sync remote_state: %d", __this->remote_state);
|
||||
}
|
||||
}
|
||||
//TODO: post event
|
||||
log_debug("state: %d, local_state: %d, remote_state = %d", state, __this->local_state, __this->remote_state);
|
||||
eartch_post_event(state);
|
||||
}
|
||||
|
||||
static void eartch_music_ctrl_timeout_handle(void *priv)
|
||||
{
|
||||
log_info("Disnable music ctrl");
|
||||
__this->music_ctrl_en = 0;
|
||||
__this->music_ctrl_en_timer = 0;
|
||||
}
|
||||
|
||||
|
||||
static void eartch_music_ctrl_timeout_del(void)
|
||||
{
|
||||
if (__this->music_ctrl_en_timer) {
|
||||
usr_timer_del(__this->music_ctrl_en_timer);
|
||||
__this->music_ctrl_en_timer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void eartch_music_ctrl_timeout_add(void)
|
||||
{
|
||||
if (__this->music_ctrl_en_timer) {
|
||||
eartch_music_ctrl_timeout_del();
|
||||
}
|
||||
__this->music_ctrl_en_timer = usr_timeout_add((void *)__this, eartch_music_ctrl_timeout_handle, 15000, 1);
|
||||
}
|
||||
|
||||
#define A2DP_PLAY_STATE_CNT 2
|
||||
#define A2DP_STOP_STATE_CNT 2
|
||||
static void eartch_a2dp_status_monitor(void *priv)
|
||||
{
|
||||
if (get_total_connect_dev() == 0) {
|
||||
__this->a2dp_stop_state_cnt = 0;
|
||||
__this->a2dp_play_state_cnt = 0;
|
||||
return;
|
||||
}
|
||||
u8 a2dp_state = a2dp_get_status();
|
||||
if (a2dp_state == BT_MUSIC_STATUS_STARTING) { //在播歌
|
||||
__this->a2dp_stop_state_cnt = 0;
|
||||
__this->a2dp_play_state_cnt++;
|
||||
if (__this->a2dp_play_state_cnt > A2DP_PLAY_STATE_CNT) {
|
||||
if (__this->music_ctrl_en == 0) {
|
||||
log_info("Enable music ctrl");
|
||||
__this->music_ctrl_en = 1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
__this->a2dp_play_state_cnt = 0;
|
||||
__this->a2dp_stop_state_cnt++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void eartch_a2dp_status_monitor_init(u8 init)
|
||||
{
|
||||
if (__this->a2dp_monitor_timer) {
|
||||
sys_timer_del(__this->a2dp_monitor_timer);
|
||||
__this->a2dp_monitor_timer = 0;
|
||||
}
|
||||
if (init) {
|
||||
__this->a2dp_monitor_timer = sys_timer_add(NULL, eartch_a2dp_status_monitor, 500);
|
||||
__this->a2dp_stop_state_cnt = 0;
|
||||
__this->a2dp_play_state_cnt = 0;
|
||||
}
|
||||
}
|
||||
|
||||
extern void test_esco_role_switch(u8 flag);
|
||||
//master: local out
|
||||
static void eartch_in_bt_control_handle(void)
|
||||
{
|
||||
u8 call_status = get_call_status();
|
||||
u8 tws_con = get_tws_sibling_connect_state();
|
||||
u8 role;
|
||||
u8 a2dp_state;
|
||||
if (tws_con) {
|
||||
role = tws_api_get_role();
|
||||
}
|
||||
|
||||
if (call_status != BT_CALL_HANGUP) {
|
||||
//通话中
|
||||
#if TCFG_EARTCH_CALL_CTL_SCO_CONNECT
|
||||
if (call_status == BT_CALL_ACTIVE) {//通话中
|
||||
if ((tws_con && ((__this->local_state != EARTCH_STATE_IN) || (__this->remote_state != EARTCH_STATE_IN))) //对耳戴上一只
|
||||
|| (!tws_con)) { //单耳且入耳
|
||||
log_info("USER_CTRL_CONN_SCO\n");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_CONN_SCO);
|
||||
}
|
||||
}
|
||||
#endif /* #if TCFG_EARTCH_CALL_CTL_SCO_CONNECT */
|
||||
#if TCFG_EARTCH_AUTO_CHANGE_MASTER
|
||||
if (tws_con && ((role == TWS_ROLE_MASTER) && ((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_IN)))) {//主机不在耳,从机在耳,切换主从
|
||||
log_info("master no inside, start change role");
|
||||
tws_api_auto_role_switch_disable();
|
||||
test_esco_role_switch(1); //主机调用
|
||||
}
|
||||
#endif /* #if TCFG_EARTCH_AUTO_CHANGE_MASTER */
|
||||
} else {
|
||||
#if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT
|
||||
log_info("a2dp_connect_state: %d", __this->a2dp_connect_state);
|
||||
if (__this->a2dp_connect_state == 0) {
|
||||
/* if ((tws_con && (((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_IN)) || */
|
||||
/* ((__this->local_state == EARTCH_STATE_IN) && (__this->remote_state == EARTCH_STATE_OUT)))) || //对耳一只戴上 */
|
||||
/* (!tws_con)) { //单耳 */
|
||||
log_info("CONN_A2DP");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_CONN_A2DP); //链接链路
|
||||
__this->a2dp_send_flag = 1;
|
||||
/* } */
|
||||
} else
|
||||
#endif /* #if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT */
|
||||
{
|
||||
log_info("music ctrl en: %d", __this->music_ctrl_en);
|
||||
if (__this->music_ctrl_en) {
|
||||
a2dp_state = a2dp_get_status();
|
||||
log_info("a2dp_state: %d", a2dp_state);
|
||||
if (a2dp_state != BT_MUSIC_STATUS_STARTING) { //没有播放
|
||||
log_info("SEND PLAY");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_AVCTP_OPID_PLAY);
|
||||
} else {
|
||||
eartch_music_state_check_timer_add();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void eartch_out_bt_control_handle(void)
|
||||
{
|
||||
u8 call_status = get_call_status();
|
||||
u8 tws_con = get_tws_sibling_connect_state();
|
||||
u8 role;
|
||||
u8 a2dp_state;
|
||||
if (tws_con) {
|
||||
role = tws_api_get_role();
|
||||
}
|
||||
|
||||
if (call_status != BT_CALL_HANGUP) {//通话中
|
||||
if (call_status == BT_CALL_ACTIVE) {//通话中
|
||||
if ((tws_con && ((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_OUT))) //对耳且都不在耳朵上
|
||||
|| (!tws_con)) { //单耳且不在耳朵
|
||||
#if TCFG_EARTCH_CALL_CTL_SCO_CONNECT
|
||||
log_info("USER_CTRL_DISCONN_SCO\n");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_DISCONN_SCO);
|
||||
#endif /* #if TCFG_EARTCH_CALL_CTL_SCO_CONNECT */
|
||||
}
|
||||
#if TCFG_EARTCH_AUTO_CHANGE_MASTER
|
||||
if (tws_con && ((role == TWS_ROLE_MASTER) && ((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_IN)))) {//主机不在耳,从机在耳,切换主从
|
||||
log_info("master no inside, start change role");
|
||||
tws_api_auto_role_switch_disable();
|
||||
test_esco_role_switch(1); //主机调用
|
||||
}
|
||||
#endif /* #if TCFG_EARTCH_AUTO_CHANGE_MASTER */
|
||||
}
|
||||
} else {
|
||||
log_info("a2dp_connect_state: %d", __this->a2dp_connect_state);
|
||||
if (__this->a2dp_connect_state) {
|
||||
#if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT
|
||||
if ((tws_con && ((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_OUT))) || //对耳出耳, 断开链路
|
||||
(!tws_con)) { //单耳出耳
|
||||
log_info("DISCON A2DP");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_DISCONN_A2DP);
|
||||
} else
|
||||
#endif /* #if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT */
|
||||
{
|
||||
a2dp_state = a2dp_get_status();
|
||||
log_info("a2dp_state: %d", a2dp_state);
|
||||
if (a2dp_state == BT_MUSIC_STATUS_STARTING) { //在播放
|
||||
log_info("SEND PAUSE");
|
||||
eartch_send_bt_ctrl_cmd(USER_CTRL_AVCTP_OPID_PAUSE);
|
||||
} else {
|
||||
eartch_music_state_check_timer_add();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//-------------测试盒流程-----------------//
|
||||
u8 testbox_in_ear_detect_test_flag_get(void);
|
||||
void lp_touch_key_testbox_inear_trim(u8 flag);
|
||||
|
||||
enum {
|
||||
IN_EAR_TRIM_SUCC_KEY = 0xf4,
|
||||
IN_EAR_DETECT_IN,
|
||||
IN_EAR_DETECT_OUT,
|
||||
IN_EAR_TRIM_FAIL_KEY,
|
||||
};
|
||||
|
||||
void test_in_ear_detect_state_notify(u8 key)
|
||||
{
|
||||
user_send_cmd_prepare(USER_CTRL_TEST_KEY, 1, &key); //
|
||||
}
|
||||
|
||||
__attribute__((weak))
|
||||
void lp_touch_key_testbox_inear_trim(u8 flag)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void eartch_testbox_flag(u8 flag)
|
||||
{
|
||||
lp_touch_key_testbox_inear_trim(flag);
|
||||
}
|
||||
|
||||
static void eartch_bt_event_control_handle(u8 event)
|
||||
{
|
||||
u8 call_status;
|
||||
if (get_total_connect_dev() == 0) {
|
||||
log_info("no connect dev");
|
||||
return;
|
||||
}
|
||||
|
||||
u8 tws_con = get_tws_sibling_connect_state();
|
||||
|
||||
if (event == EARTCH_STATE_IN) {
|
||||
eartch_music_ctrl_timeout_del();
|
||||
eartch_in_bt_control_handle();
|
||||
} else {
|
||||
#if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE
|
||||
if ((tws_con && ((__this->local_state == EARTCH_STATE_OUT) && (__this->remote_state == EARTCH_STATE_OUT))) //对耳且都不在耳朵上
|
||||
|| (!tws_con)) { //单耳且不在耳朵
|
||||
if (__this->music_ctrl_en) {
|
||||
eartch_music_ctrl_timeout_add();
|
||||
}
|
||||
}
|
||||
#endif /* #if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE */
|
||||
eartch_out_bt_control_handle();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void eartch_event_deal_en_cfg_save(u8 cfg_data)
|
||||
{
|
||||
u8 rdata = 0;
|
||||
int ret = 0;
|
||||
|
||||
ret = syscfg_read(CFG_EARTCH_ENABLE_ID, &rdata, EARTCH_SWITCH_CFG_LEN);
|
||||
if (ret == EARTCH_SWITCH_CFG_LEN) {
|
||||
if (rdata == cfg_data) {
|
||||
log_debug("cfg same: %d", rdata);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
rdata = cfg_data;
|
||||
log_debug("cfg write: %d", rdata);
|
||||
ret = syscfg_write(CFG_EARTCH_ENABLE_ID, &rdata, EARTCH_SWITCH_CFG_LEN);
|
||||
if (ret != EARTCH_SWITCH_CFG_LEN) {
|
||||
log_error("cfg write err!!!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void eartch_state_update(u8 state)
|
||||
{
|
||||
switch (state) {
|
||||
case EARTCH_TWS_STATE_IN:
|
||||
case EARTCH_TWS_STATE_OUT:
|
||||
__this->local_state = state;
|
||||
__this->event_source = 1;
|
||||
log_debug("update local_state: %d", __this->local_state);
|
||||
|
||||
if (__this->eartch_event_deal_en == 0) {
|
||||
log_debug("eartch event deal en 0");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case EARTCH_TWS_STATE_TRIM_OK:
|
||||
if (testbox_in_ear_detect_test_flag_get()) {
|
||||
test_in_ear_detect_state_notify(IN_EAR_TRIM_SUCC_KEY);
|
||||
}
|
||||
return;
|
||||
|
||||
case EARTCH_TWS_STATE_TRIM_ERR:
|
||||
if (testbox_in_ear_detect_test_flag_get()) {
|
||||
test_in_ear_detect_state_notify(IN_EAR_TRIM_FAIL_KEY);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (get_tws_sibling_connect_state() == TRUE) {
|
||||
eartch_sync_tws_state(state);
|
||||
} else {
|
||||
eartch_post_event(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
extern void eartch_hardware_suspend(void);
|
||||
extern void eartch_hardware_recover(void);
|
||||
|
||||
__attribute__((weak))
|
||||
void eartch_hardware_suspend(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
__attribute__((weak))
|
||||
void eartch_hardware_recover(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void eartch_event_deal_enable(void)
|
||||
{
|
||||
__this->eartch_event_deal_en = 1;
|
||||
#if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE
|
||||
eartch_a2dp_status_monitor_init(1);
|
||||
#endif
|
||||
eartch_hardware_recover();
|
||||
}
|
||||
|
||||
void eartch_event_deal_disable()
|
||||
{
|
||||
__this->eartch_event_deal_en = 0;
|
||||
#if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE
|
||||
eartch_a2dp_status_monitor_init(0);
|
||||
#endif
|
||||
eartch_hardware_suspend();
|
||||
}
|
||||
|
||||
void eartch_event_deal_enable_cfg_save(u8 en)
|
||||
{
|
||||
#if TCFG_EARTCH_SWITCH_CFG_ENABLE
|
||||
if (en) {
|
||||
eartch_event_deal_enable();
|
||||
eartch_event_deal_en_cfg_save(1);
|
||||
} else {
|
||||
eartch_event_deal_disable();
|
||||
eartch_event_deal_en_cfg_save(0);
|
||||
}
|
||||
#endif /* #if TCFG_EARTCH_SWITCH_CFG_ENABLE */
|
||||
}
|
||||
|
||||
void eartch_handle()
|
||||
{
|
||||
if (earin_status == EARTCH_STATE_IN) {
|
||||
if (get_tws_sibling_connect_state() == TRUE) {
|
||||
if ((__this->remote_state == EARTCH_STATE_OUT) && (__this->local_state == EARTCH_STATE_IN)) {
|
||||
log_info("tone_play1");
|
||||
tone_play(TONE_NORMAL, 1);
|
||||
}
|
||||
} else {
|
||||
log_info("tone_play2");
|
||||
tone_play(TONE_NORMAL, 1);
|
||||
}
|
||||
|
||||
if (testbox_in_ear_detect_test_flag_get()) {
|
||||
test_in_ear_detect_state_notify(IN_EAR_DETECT_IN);
|
||||
}
|
||||
} else {
|
||||
if (testbox_in_ear_detect_test_flag_get()) {
|
||||
test_in_ear_detect_state_notify(IN_EAR_DETECT_OUT);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
eartch_bt_event_control_handle(earin_status);
|
||||
__this->last_state = earin_status;
|
||||
sys_timer_del(earin_lock_time);
|
||||
earin_lock_time = 0;
|
||||
}
|
||||
|
||||
void eartch_event_handle(u8 event)
|
||||
{
|
||||
switch (event) {
|
||||
case EARTCH_TWS_STATE_IN:
|
||||
case EARTCH_TWS_STATE_OUT:
|
||||
last_status = event;
|
||||
if (earin_lock_time == 0) {
|
||||
earin_status = event;
|
||||
earin_lock_time = sys_timeout_add(NULL, eartch_handle, 500);
|
||||
} else {
|
||||
if (earin_status != last_status) {
|
||||
earin_status = last_status;
|
||||
sys_timer_modify(earin_lock_time, 500);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#if TCFG_EARTCH_SWITCH_CFG_ENABLE
|
||||
case EARTCH_TWS_CFG_SAVE_EVENT_DEAL_ENABLE:
|
||||
eartch_event_deal_enable_cfg_save(1);
|
||||
break;
|
||||
|
||||
case EARTCH_TWS_CFG_SAVE_EVENT_DEAL_DISABLE:
|
||||
eartch_event_deal_enable_cfg_save(0);
|
||||
break;
|
||||
#endif /* #if TCFG_EARTCH_SWITCH_CFG_ENABLE */
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void a2dp_connect_status_register(void (*cbk)(u8 conn_flag));
|
||||
int eartch_event_deal_init(void)
|
||||
{
|
||||
u8 rdata = 0;
|
||||
int ret = 0;
|
||||
|
||||
#if TCFG_EARTCH_SWITCH_CFG_ENABLE
|
||||
ret = syscfg_read(CFG_EARTCH_ENABLE_ID, &rdata, EARTCH_SWITCH_CFG_LEN);
|
||||
if (ret == EARTCH_SWITCH_CFG_LEN) {
|
||||
__this->eartch_event_deal_en = rdata;
|
||||
log_debug("switch cfg: %d", rdata);
|
||||
} else
|
||||
#endif /* #if TCFG_EARTCH_SWITCH_CFG_ENABLE */
|
||||
{
|
||||
log_debug("switch cfg not write, default enable");
|
||||
__this->eartch_event_deal_en = 1;
|
||||
}
|
||||
|
||||
#if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT
|
||||
a2dp_connect_status_register(eartch_a2dp_status_callback_handle);
|
||||
#else
|
||||
__this->a2dp_connect_state = 1;
|
||||
#endif /* #if TCFG_EARTCH_MUSIC_CTL_A2DP_CONNECT */
|
||||
#if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE
|
||||
if (__this->eartch_event_deal_en) {
|
||||
eartch_a2dp_status_monitor_init(1);
|
||||
}
|
||||
#else
|
||||
__this->music_ctrl_en = 1;
|
||||
#endif /* #if TCFG_EARTCH_MUSIC_CTL_TIMEOUT_ENABLE */
|
||||
return __this->eartch_event_deal_en;
|
||||
}
|
||||
|
||||
|
||||
void eartch_event_deal_enable_cfg_tws_save(u8 en)
|
||||
{
|
||||
if (en) {
|
||||
eartch_state_update(EARTCH_TWS_CFG_SAVE_EVENT_DEAL_ENABLE);
|
||||
} else {
|
||||
eartch_state_update(EARTCH_TWS_CFG_SAVE_EVENT_DEAL_DISABLE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
REGISTER_TWS_FUNC_STUB(ear_lptch_sync) = {
|
||||
.func_id = TWS_FUNC_ID_EARTCH_SYNC,
|
||||
.func = eartch_sync_tws_state_deal,
|
||||
};
|
||||
|
||||
#endif /* #if TCFG_EARTCH_EVENT_HANDLE_ENABLE */
|
||||
87
apps/earphone/font/fontinit.c
Normal file
87
apps/earphone/font/fontinit.c
Normal file
@ -0,0 +1,87 @@
|
||||
#include "font/font_all.h"
|
||||
#include "font/language_list.h"
|
||||
#include "app_config.h"
|
||||
#include "ui/res_config.h"
|
||||
|
||||
#if TCFG_UI_ENABLE
|
||||
#if (TCFG_SPI_LCD_ENABLE || TCFG_SIMPLE_LCD_ENABLE)
|
||||
|
||||
|
||||
extern void platform_putchar(struct font_info *info, u8 *pixel, u16 width, u16 height, u16 x, u16 y);//字库输出显示函数
|
||||
extern void ui_simple_putchar(struct font_info *info, u8 *pixel, u16 width, u16 height, u16 x, u16 y);//字库输出显示函数
|
||||
|
||||
#if TCFG_SPI_LCD_ENABLE
|
||||
#define font_putchar (platform_putchar)
|
||||
#else
|
||||
#define font_putchar (ui_simple_putchar)
|
||||
#endif
|
||||
|
||||
/* 语言字库配置 */
|
||||
|
||||
#define LANGUAGE BIT(Chinese_Simplified)|\
|
||||
BIT(English)|\
|
||||
BIT(Chinese_Traditional)
|
||||
|
||||
const struct font_info font_info_table[] = {
|
||||
|
||||
#if LANGUAGE&BIT(Chinese_Simplified)
|
||||
//gb2312
|
||||
{
|
||||
.language_id = Chinese_Simplified,
|
||||
.flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE,
|
||||
.pixel.file.name = (char *)FONT_PATH"F_GB2312.PIX",
|
||||
.ascpixel.file.name = (char *)FONT_PATH"F_ASCII.PIX",
|
||||
.tabfile.name = (char *)FONT_PATH"F_GB2312.TAB",
|
||||
.isgb2312 = true,
|
||||
.bigendian = false,
|
||||
.putchar = font_putchar,
|
||||
},
|
||||
//gbk
|
||||
/* { */
|
||||
/* .language_id = Chinese_Simplified, */
|
||||
/* .flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE, */
|
||||
/* .pixel.file.name = (char *)"mnt/sdfile/res/F_GBK.PIX", */
|
||||
/* .ascpixel.file.name = (char *)"mnt/sdfile/res/F_ASCII.PIX", */
|
||||
/* .tabfile.name = (char *)"mnt/sdfile/res/F_GBK.TAB", */
|
||||
/* .isgb2312 = false, */
|
||||
/* .bigendian = false, */
|
||||
/* .putchar = platform_putchar, */
|
||||
/* }, */
|
||||
#endif
|
||||
|
||||
#if LANGUAGE&BIT(Chinese_Traditional)
|
||||
{
|
||||
.language_id = Chinese_Traditional,
|
||||
.flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE,
|
||||
.pixel.file.name = (char *)FONT_PATH"F_GBK.PIX",
|
||||
.ascpixel.file.name = (char *)FONT_PATH"F_ASCII.PIX",
|
||||
.tabfile.name = (char *)FONT_PATH"F_GBK.TAB",
|
||||
.isgb2312 = false,
|
||||
.bigendian = false,
|
||||
.putchar = font_putchar,
|
||||
},
|
||||
#endif
|
||||
|
||||
#if LANGUAGE&BIT(English)
|
||||
{
|
||||
.language_id = English,
|
||||
.flags = FONT_SHOW_PIXEL | FONT_SHOW_MULTI_LINE,
|
||||
.pixel.file.name = (char *)"mnt/sdfile/res/F_GBK.PIX",
|
||||
.ascpixel.file.name = (char *)"mnt/sdfile/res/F_ASCII.PIX",
|
||||
.tabfile.name = (char *)"mnt/sdfile/res/F_GBK.TAB",
|
||||
.isgb2312 = false,
|
||||
.bigendian = false,
|
||||
.putchar = font_putchar,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.language_id = 0,//不能删
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
#endif
|
||||
251
apps/earphone/idle.c
Normal file
251
apps/earphone/idle.c
Normal file
@ -0,0 +1,251 @@
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "app_config.h"
|
||||
#include "app_action.h"
|
||||
#include "tone_player.h"
|
||||
#include "asm/charge.h"
|
||||
#include "app_charge.h"
|
||||
#include "app_main.h"
|
||||
#include "ui_manage.h"
|
||||
#include "vm.h"
|
||||
#include "app_chargestore.h"
|
||||
#include "app_umidigi_chargestore.h"
|
||||
#include "app_testbox.h"
|
||||
#include "user_cfg.h"
|
||||
#include "default_event_handler.h"
|
||||
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
#include "app_ancbox.h"
|
||||
#endif
|
||||
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
#define LOG_TAG "[APP_IDLE]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#if CHARGING_CLEAN_PHONE_INFO
|
||||
#include "key_event_deal.h"
|
||||
#include "btstack/btstack_typedef.h"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MEDIA_DEVELOP_ENABLE
|
||||
#define AUDIO_PLAY_EVENT_END AUDIO_DEC_EVENT_END
|
||||
#endif /* #ifdef CONFIG_MEDIA_DEVELOP_ENABLE */
|
||||
|
||||
static void app_idle_enter_softoff(void)
|
||||
{
|
||||
//ui_update_status(STATUS_POWEROFF);
|
||||
while (get_ui_busy_status()) {
|
||||
log_info("ui_status:%d\n", get_ui_busy_status());
|
||||
}
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
if (get_lvcmp_det() && (0 == get_charge_full_flag())) {
|
||||
log_info("charge inset, system reset!\n");
|
||||
cpu_reset();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_SMART_VOICE_ENABLE
|
||||
extern void audio_smart_voice_detect_close(void);
|
||||
audio_smart_voice_detect_close();
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_BOARD_AISPEECH_VAD_ASR
|
||||
extern void ais_platform_asr_close(void);
|
||||
ais_platform_asr_close();
|
||||
#endif /*CONFIG_BOARD_AISPEECH_VAD_ASR*/
|
||||
|
||||
extern void dac_power_off(void);
|
||||
dac_power_off(); // 关机前先关dac
|
||||
|
||||
power_set_soft_poweroff();
|
||||
}
|
||||
|
||||
static int app_idle_tone_event_handler(struct device_event *dev)
|
||||
{
|
||||
int ret = false;
|
||||
|
||||
switch (dev->event) {
|
||||
case AUDIO_PLAY_EVENT_END:
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
log_info("audio_play_event_end,enter soft poweroff");
|
||||
app_idle_enter_softoff();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if CHARGING_CLEAN_PHONE_INFO
|
||||
|
||||
#define IDLE_CLEAN_INFO_CNT 20
|
||||
|
||||
static u8 idle_key_table[KEY_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
//SHORT LONG HOLD UP DOUBLE TRIPLE
|
||||
{KEY_NULL, KEY_CLEAN_PHONE_INFO, KEY_CLEAN_PHONE_INFO_HOLD, KEY_CLEAN_PHONE_INFO_UP, KEY_NULL, KEY_NULL}, //KEY_0
|
||||
};
|
||||
int app_idle_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
int ret = false;
|
||||
struct key_event *key = &event->u.key;
|
||||
u8 key_event = idle_key_table[key->value][key->event];
|
||||
static u16 key_hold_cnt = 0;
|
||||
static u8 key_press_flag = 0;
|
||||
|
||||
switch (key_event) {
|
||||
case KEY_CLEAN_PHONE_INFO:
|
||||
log_info("KEY_CLEAN_PHONE_INFO");
|
||||
key_hold_cnt = 0;
|
||||
key_press_flag = 1;
|
||||
P33_CON_SET(P3_PINR_CON, 0, 1, 0);
|
||||
break;
|
||||
case KEY_CLEAN_PHONE_INFO_HOLD:
|
||||
key_hold_cnt++;
|
||||
if (key_press_flag) {
|
||||
if (key_hold_cnt == IDLE_CLEAN_INFO_CNT) {
|
||||
log_info("KEY_CLEAN_PHONE_INFO_HOLD");
|
||||
extern void delete_link_key_for_app(bd_addr_t *bd_addr, u8 id);
|
||||
delete_link_key_for_app(NULL, 0);
|
||||
tone_play(TONE_SIN_NORMAL, 1);
|
||||
key_press_flag = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_CLEAN_PHONE_INFO_UP:
|
||||
log_info("KEY_CLEAN_PHONE_INFO_UP");
|
||||
key_hold_cnt = 0;
|
||||
key_press_flag = 0;
|
||||
P33_CON_SET(P3_PINR_CON, 0, 1, 1);
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int idle_event_handler(struct application *app, struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_KEY_EVENT:
|
||||
#if CHARGING_CLEAN_PHONE_INFO
|
||||
/* log_info("idle_event_handler:SYS_KEY_EVENT\n"); */
|
||||
app_idle_key_event_handler(event);
|
||||
#endif
|
||||
return 0;
|
||||
case SYS_BT_EVENT:
|
||||
return 0;
|
||||
case SYS_DEVICE_EVENT:
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
return app_charge_event_handler(&event->u.dev);
|
||||
#endif
|
||||
}
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_TONE) {
|
||||
return app_idle_tone_event_handler(&event->u.dev);
|
||||
}
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
if ((u32)event->arg == DEVICE_EVENT_CHARGE_STORE) {
|
||||
app_chargestore_event_handler(&event->u.chargestore);
|
||||
}
|
||||
#endif
|
||||
#if TCFG_UMIDIGI_BOX_ENABLE
|
||||
else if ((u32)event->arg == DEVICE_EVENT_UMIDIGI_CHARGE_STORE) {
|
||||
app_umidigi_chargestore_event_handler(&event->u.umidigi_chargestore);
|
||||
}
|
||||
#endif
|
||||
#if TCFG_TEST_BOX_ENABLE
|
||||
if ((u32)event->arg == DEVICE_EVENT_TEST_BOX) {
|
||||
app_testbox_event_handler(&event->u.testbox);
|
||||
}
|
||||
#endif
|
||||
#if TCFG_ANC_BOX_ENABLE
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_ANC) {
|
||||
return app_ancbox_event_handler(&event->u.ancbox);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
#if (CONFIG_BT_BACKGROUND_ENABLE || TCFG_PC_ENABLE)
|
||||
#if(!TCFG_ONLY_PC_ENABLE)
|
||||
default_event_handler(event);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int idle_state_machine(struct application *app, enum app_state state,
|
||||
struct intent *it)
|
||||
{
|
||||
int ret;
|
||||
switch (state) {
|
||||
case APP_STA_CREATE:
|
||||
break;
|
||||
case APP_STA_START:
|
||||
if (!it) {
|
||||
break;
|
||||
}
|
||||
switch (it->action) {
|
||||
case ACTION_IDLE_MAIN:
|
||||
log_info("ACTION_IDLE_MAIN\n");
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
|
||||
/* tone_play(TONE_POWER_OFF); */
|
||||
os_taskq_flush();
|
||||
STATUS *p_tone = get_tone_config();
|
||||
ret = tone_play_index(p_tone->power_off, 1);
|
||||
printf("power_off tone play ret:%d", ret);
|
||||
if (ret) {
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
log_info("power_off tone play err,enter soft poweroff");
|
||||
app_idle_enter_softoff();
|
||||
}
|
||||
}
|
||||
}
|
||||
#if CHARGING_CLEAN_PHONE_INFO
|
||||
else {
|
||||
sys_key_event_enable();
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case ACTION_IDLE_POWER_OFF:
|
||||
os_taskq_flush();
|
||||
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case APP_STA_PAUSE:
|
||||
break;
|
||||
case APP_STA_RESUME:
|
||||
break;
|
||||
case APP_STA_STOP:
|
||||
break;
|
||||
case APP_STA_DESTROY:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct application_operation app_idle_ops = {
|
||||
.state_machine = idle_state_machine,
|
||||
.event_handler = idle_event_handler,
|
||||
};
|
||||
|
||||
REGISTER_APPLICATION(app_app_idle) = {
|
||||
.name = "idle",
|
||||
.action = ACTION_IDLE_MAIN,
|
||||
.ops = &app_idle_ops,
|
||||
.state = APP_STA_DESTROY,
|
||||
};
|
||||
|
||||
|
||||
209
apps/earphone/include/aec_user.h
Normal file
209
apps/earphone/include/aec_user.h
Normal file
@ -0,0 +1,209 @@
|
||||
#ifndef _AEC_USER_H_
|
||||
#define _AEC_USER_H_
|
||||
|
||||
#include "generic/typedef.h"
|
||||
#include "user_cfg.h"
|
||||
|
||||
#define AEC_DEBUG_ONLINE 0
|
||||
#define AEC_READ_CONFIG 1
|
||||
|
||||
/*
|
||||
*CVP(清晰语音模式定义)
|
||||
*/
|
||||
#define CVP_MODE_NONE 0x00 //清晰语音处理关闭
|
||||
#define CVP_MODE_NORMAL 0x01 //通用模式
|
||||
#define CVP_MODE_DMS 0x02 //双mic降噪(ENC)模式
|
||||
#define CVP_MODE_SMS 0x03 //单mic系统(外加延时估计)
|
||||
#define CVP_MODE_SMS_TDE 0x04 //单mic系统(内置延时估计)
|
||||
#define CVP_MODE_SEL CVP_MODE_NORMAL
|
||||
|
||||
#define AEC_EN BIT(0)
|
||||
#define NLP_EN BIT(1)
|
||||
#define ANS_EN BIT(2)
|
||||
#define ENC_EN BIT(3)
|
||||
#define AGC_EN BIT(4)
|
||||
#define WNC_EN BIT(5)
|
||||
#define MFDT_EN BIT(6)
|
||||
|
||||
/*aec module enable bit define*/
|
||||
#define AEC_MODE_ADVANCE (AEC_EN | NLP_EN | ANS_EN )
|
||||
#define AEC_MODE_REDUCE (NLP_EN | ANS_EN )
|
||||
|
||||
#define AEC_MODE_SIMPLEX (ANS_EN)
|
||||
|
||||
/*
|
||||
*SMS模式选择
|
||||
*(1)SMS模式性能更好,同时也需要更多的ram和mips
|
||||
*(2)SMS_NORMAL和SMS_TDE功能一样,只是SMS_TDE内置了延时估计和延时补偿
|
||||
*可以更好的兼容延时不固定的场景
|
||||
*/
|
||||
#define SMS_DISABLE 0
|
||||
#define SMS_NORMAL 1
|
||||
#define SMS_TDE 2
|
||||
#define TCFG_AUDIO_SMS_ENABLE SMS_DISABLE
|
||||
|
||||
/*
|
||||
*DMS版本配置
|
||||
*DMS_GLOBAL_V100:第一版双麦算法
|
||||
*DMS_GLOBAL_V200:第二版双麦算法,更少的ram和mips
|
||||
*/
|
||||
#define TCFG_AUDIO_DMS_GLOBAL_VERSION DMS_GLOBAL_V100
|
||||
|
||||
#if (defined(CONFIG_MEDIA_NEW_ENABLE) || (defined(CONFIG_MEDIA_DEVELOP_ENABLE)))
|
||||
|
||||
extern const u8 CONST_AEC_SIMPLEX;
|
||||
|
||||
/*兼容SMS和DMS*/
|
||||
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
|
||||
#include "commproc_tms.h"
|
||||
#define aec_open aec_tms_init
|
||||
#define aec_close aec_tms_exit
|
||||
#define aec_in_data aec_tms_fill_in_data
|
||||
#define aec_in_data_ref aec_tms_fill_in_ref_data
|
||||
#define aec_in_data_ref_1 aec_tms_fill_in_ref_1_data
|
||||
#define aec_ref_data aec_tms_fill_ref_data
|
||||
|
||||
#elif TCFG_AUDIO_DUAL_MIC_ENABLE
|
||||
#include "commproc_dms.h"
|
||||
#if (TCFG_AUDIO_DMS_SEL == DMS_NORMAL)
|
||||
#define aec_open aec_dms_init
|
||||
#define aec_close aec_dms_exit
|
||||
#define aec_in_data aec_dms_fill_in_data
|
||||
#define aec_in_data_ref aec_dms_fill_in_ref_data
|
||||
#define aec_ref_data aec_dms_fill_ref_data
|
||||
#else
|
||||
#define aec_open aec_dms_flexible_init
|
||||
#define aec_close aec_dms_flexible_exit
|
||||
#define aec_in_data aec_dms_flexible_fill_in_data
|
||||
#define aec_in_data_ref aec_dms_flexible_fill_in_ref_data
|
||||
#define aec_ref_data aec_dms_flexible_fill_ref_data
|
||||
#endif/*TCFG_AUDIO_DMS_SEL*/
|
||||
|
||||
void aec_cfg_fill(AEC_DMS_CONFIG *cfg);
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Output Select
|
||||
* Description: 输出选择
|
||||
* Arguments : sel = Default 默认输出算法处理结果
|
||||
* = Master 输出主mic(通话mic)的原始数据
|
||||
* = Slave 输出副mic(降噪mic)的原始数据
|
||||
* agc 输出数据要不要经过agc自动增益控制模块
|
||||
* Return : None.
|
||||
* Note(s) : 可以通过选择不同的输出,来测试mic的频响和ENC指标
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_aec_output_sel(CVP_OUTPUT_ENUM sel, u8 agc);
|
||||
|
||||
#elif (TCFG_AUDIO_SMS_ENABLE == SMS_TDE)
|
||||
#include "commproc.h"
|
||||
#define aec_open sms_tde_init
|
||||
#define aec_close sms_tde_exit
|
||||
#define aec_in_data sms_tde_fill_in_data
|
||||
#define aec_in_data_ref(...)
|
||||
#define aec_ref_data sms_tde_fill_ref_data
|
||||
void aec_cfg_fill(AEC_CONFIG *cfg);
|
||||
#else
|
||||
#include "commproc.h"
|
||||
#define aec_open aec_init
|
||||
#define aec_close aec_exit
|
||||
#define aec_in_data aec_fill_in_data
|
||||
#define aec_in_data_ref(...)
|
||||
#define aec_ref_data aec_fill_ref_data
|
||||
void aec_cfg_fill(AEC_CONFIG *cfg);
|
||||
#endif
|
||||
|
||||
s8 aec_debug_online(void *buf, u16 size);
|
||||
void aec_input_clear_enable(u8 enable);
|
||||
|
||||
int audio_aec_init(u16 sample_rate);
|
||||
void audio_aec_close(void);
|
||||
void audio_aec_inbuf(s16 *buf, u16 len);
|
||||
void audio_aec_inbuf_ref(s16 *buf, u16 len);
|
||||
void audio_aec_inbuf_ref_1(s16 *buf, u16 len);
|
||||
void audio_aec_refbuf(s16 *buf, u16 len);
|
||||
u8 audio_aec_status(void);
|
||||
void audio_aec_reboot(u8 reduce);
|
||||
void audio_aec_ref_start(u8 en);
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio AEC Open
|
||||
* Description: 初始化AEC模块
|
||||
* Arguments : sr 采样率(8000/16000)
|
||||
* enablebit 使能模块(AEC/NLP/AGC/ANS...)
|
||||
* out_hdl 自定义回调函数,NULL则用默认的回调
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : 该接口是对audio_aec_init的扩展,支持自定义使能模块以及
|
||||
* 数据输出回调函数
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_aec_open(u16 sample_rate, s16 enablebit, int (*out_hdl)(s16 *data, u16 len));
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* Audio CVP IOCTL
|
||||
* Description: CVP功能配置
|
||||
* Arguments : cmd 操作命令
|
||||
* value 操作数
|
||||
* priv 操作内存地址
|
||||
* Return : 0 成功 其他 失败
|
||||
* Note(s) : (1)比如动态开关降噪NS模块:
|
||||
* audio_cvp_ioctl(CVP_NS_SWITCH,1,NULL); //降噪关
|
||||
* audio_cvp_ioctl(CVP_NS_SWITCH,0,NULL); //降噪开
|
||||
*********************************************************************
|
||||
*/
|
||||
int audio_cvp_ioctl(int cmd, int value, void *priv);
|
||||
|
||||
/*获取风噪的检测结果,1:有风噪,0:无风噪*/
|
||||
int audio_cvp_dms_wnc_state(void);
|
||||
|
||||
/*获取单双麦切换状态
|
||||
* 0: 正常双麦 ;
|
||||
* 1: 副麦坏了,触发故障
|
||||
* -1: 主麦坏了,触发故障
|
||||
*/
|
||||
int audio_cvp_dms_malfunc_state();
|
||||
|
||||
/*
|
||||
* 获取mic的能量值,开了MFDT_EN才能用
|
||||
* mic: 0 获取主麦能量
|
||||
* mic:1 获取副麦能量
|
||||
* return:返回能量值,[0~90.3],返回-1表示错误
|
||||
*/
|
||||
float audio_cvp_dms_mic_energy(u8 mic);
|
||||
|
||||
/*tri_en: 1 正常3MIC降噪
|
||||
* 0 变成2MIC降噪,不使用 FB MIC数据*/
|
||||
int audio_tms_mode_choose(u8 tri_en);
|
||||
|
||||
#else
|
||||
|
||||
extern struct aec_s_attr aec_param;
|
||||
extern const u8 CONST_AEC_SIMPLEX;
|
||||
|
||||
struct aec_s_attr *aec_param_init(u16 sr);
|
||||
s8 aec_debug_online(void *buf, u16 size);
|
||||
void aec_cfg_fill(AEC_CONFIG *cfg);
|
||||
void aec_input_clear_enable(u8 enable);
|
||||
|
||||
#endif /* #if (defined(CONFIG_MEDIA_NEW_ENABLE) || (defined(CONFIG_MEDIA_DEVELOP_ENABLE))) */
|
||||
|
||||
|
||||
//aec 上行音效
|
||||
enum {
|
||||
SOUND_ORIGINAL, //原声
|
||||
SOUND_UNCLE, //大叔
|
||||
SOUND_GODDESS, //女神
|
||||
};
|
||||
|
||||
#if defined(AEC_PRESETS_UL_EQ_CONFIG) && AEC_PRESETS_UL_EQ_CONFIG
|
||||
#ifndef UL_PRESETS_EQ_NSECTION
|
||||
#define UL_PRESETS_EQ_NSECTION 5
|
||||
#endif
|
||||
#if (UL_PRESETS_EQ_NSECTION > EQ_SECTION_MAX )
|
||||
#error "EQ_SETCTION_MAX too samll"
|
||||
#endif
|
||||
void aec_ul_eq_update();
|
||||
void ul_presets_eq_set(u8 tab_num);
|
||||
#endif/*AEC_PRESETS_UL_EQ_CONFIG*/
|
||||
|
||||
#endif/*_AEC_USER_H_*/
|
||||
31
apps/earphone/include/app_action.h
Normal file
31
apps/earphone/include/app_action.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef APP_ACTION_H
|
||||
#define APP_ACTION_H
|
||||
|
||||
|
||||
#define ACTION_EARPHONE_MAIN 0x0001
|
||||
#define ACTION_A2DP_START 0x0002
|
||||
#define ACTION_ESCO_START 0x0003
|
||||
#define ACTION_BY_KEY_MODE 0x0004
|
||||
|
||||
#define ACTION_IDLE_MAIN 0x0010
|
||||
#define ACTION_IDLE_POWER_OFF 0x0011
|
||||
|
||||
#define ACTION_MUSIC_MAIN 0x0020
|
||||
#define ACTION_MUSIC_TWS_RX 0x0021
|
||||
|
||||
#define ACTION_PC_MAIN 0x0030
|
||||
|
||||
#define ACTION_AUX_MAIN 0x0040
|
||||
|
||||
#define APP_NAME_BT "earphone"
|
||||
#define APP_NAME_IDLE "idle"
|
||||
#define APP_NAME_PC "pc"
|
||||
#define APP_NAME_MUSIC "music"
|
||||
#define APP_NAME_AUX "aux"
|
||||
|
||||
extern void task_switch(const char *name, int action);
|
||||
#define task_switch_to_bt() task_switch(APP_NAME_BT, ACTION_EARPHONE_MAIN)
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
12
apps/earphone/include/app_ancbox.h
Normal file
12
apps/earphone/include/app_ancbox.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _APP_ANCBOX_H_
|
||||
#define _APP_ANCBOX_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
|
||||
extern int app_ancbox_event_handler(struct ancbox_event *anc_dev);
|
||||
extern u8 ancbox_get_status(void);
|
||||
extern void ancbox_clear_status(void);
|
||||
|
||||
#endif //_APP_CHARGESTORE_H_
|
||||
|
||||
13
apps/earphone/include/app_anctool.h
Normal file
13
apps/earphone/include/app_anctool.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef _APP_ANCTOOL_H_
|
||||
#define _APP_ANCTOOL_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "anctool.h"
|
||||
|
||||
u8 app_anctool_spp_rx_data(u8 *packet, u16 size);
|
||||
void app_anctool_spp_connect(void);
|
||||
void app_anctool_spp_disconnect(void);
|
||||
u8 get_app_anctool_spp_connected_flag();
|
||||
|
||||
#endif //_APP_CHARGESTORE_H_
|
||||
|
||||
17
apps/earphone/include/app_charge.h
Normal file
17
apps/earphone/include/app_charge.h
Normal file
@ -0,0 +1,17 @@
|
||||
#ifndef _APP_CHARGE_H_
|
||||
#define _APP_CHARGE_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
|
||||
extern void charge_close_deal(void);
|
||||
extern void charge_start_deal(void);
|
||||
extern void ldo5v_keep_deal(void);
|
||||
extern void charge_full_deal(void);
|
||||
extern void charge_ldo5v_in_deal(void);
|
||||
extern void charge_ldo5v_off_deal(void);
|
||||
extern u8 get_charge_full_flag(void);
|
||||
|
||||
extern int app_charge_event_handler(struct device_event *dev);
|
||||
|
||||
#endif //_APP_CHARGE_H_
|
||||
78
apps/earphone/include/app_chargestore.h
Normal file
78
apps/earphone/include/app_chargestore.h
Normal file
@ -0,0 +1,78 @@
|
||||
#ifndef _APP_CHARGESTORE_H_
|
||||
#define _APP_CHARGESTORE_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
|
||||
//LDOIN升级口命令定义
|
||||
#define CMD_TWS_CHANNEL_SET 0x01
|
||||
#define CMD_TWS_REMOTE_ADDR 0x02
|
||||
#define CMD_TWS_ADDR_DELETE 0x03
|
||||
#define CMD_BOX_TWS_CHANNEL_SEL 0x04//测试盒获取地址
|
||||
#define CMD_BOX_TWS_REMOTE_ADDR 0x05//测试盒交换地址
|
||||
#define CMD_POWER_LEVEL_OPEN 0x06//开盖充电舱报告/获取电量
|
||||
#define CMD_POWER_LEVEL_CLOSE 0x07//合盖充电舱报告/获取电量
|
||||
#define CMD_RESTORE_SYS 0x08//恢复出厂设置
|
||||
#define CMD_ENTER_DUT 0x09//进入测试模式
|
||||
#define CMD_EX_FIRST_READ_INFO 0x0A//F95读取数据首包信息
|
||||
#define CMD_EX_CONTINUE_READ_INFO 0x0B//F95读取数据后续包信息
|
||||
#define CMD_EX_FIRST_WRITE_INFO 0x0C//F95写入数据首包信息
|
||||
#define CMD_EX_CONTINUE_WRITE_INFO 0x0D//F95写入数据后续包信息
|
||||
#define CMD_EX_INFO_COMPLETE 0x0E//F95完成信息交换
|
||||
#define CMD_TWS_SET_CHANNEL 0x0F//F95设置左右声道信息
|
||||
#define CMD_BOX_UPDATE 0x20//测试盒升级
|
||||
#define CMD_BOX_MODULE 0x21//测试盒一级命令
|
||||
|
||||
#define CMD_SHUT_DOWN 0x80//充电舱关机,充满电关机,或者是低电关机
|
||||
#define CMD_CLOSE_CID 0x81//充电舱盒盖
|
||||
#define CMD_ANC_MODULE 0x90//ANC一级命令
|
||||
#define CMD_FAIL 0xfe//失败
|
||||
#define CMD_UNDEFINE 0xff//未知命令回复
|
||||
|
||||
enum {
|
||||
TWS_CHANNEL_LEFT = 1, //左耳
|
||||
TWS_CHANNEL_RIGHT, //右耳
|
||||
};
|
||||
|
||||
enum {
|
||||
TWS_DEL_TWS_ADDR = 1, //删除对箱地址
|
||||
TWS_DEL_PHONE_ADDR,//删除手机地址
|
||||
TWS_DEL_ALL_ADDR,//删除手机与对箱地址
|
||||
};
|
||||
|
||||
struct _CHARGE_STORE_INFO {
|
||||
u8 tws_local_addr[6];
|
||||
u8 tws_remote_addr[6];
|
||||
u8 tws_mac_addr[6];
|
||||
u32 search_aa;
|
||||
u32 pair_aa;
|
||||
u8 local_channel;
|
||||
u16 device_ind;
|
||||
u16 reserved_data;
|
||||
} _GNU_PACKED_;
|
||||
typedef struct _CHARGE_STORE_INFO CHARGE_STORE_INFO;
|
||||
|
||||
extern void chargestore_set_tws_channel_info(u8 channel);
|
||||
extern bool chargestore_set_tws_remote_info(u8 *data, u8 len);
|
||||
extern u16 chargestore_get_tws_remote_info(u8 *data);
|
||||
extern u8 chargestore_get_power_level(void);
|
||||
extern u8 chargestore_get_power_status(void);
|
||||
extern u8 chargestore_get_cover_status(void);
|
||||
extern u8 chargestore_get_sibling_power_level(void);
|
||||
extern void chargestore_set_bt_init_ok(u8 flag);
|
||||
extern int app_chargestore_event_handler(struct chargestore_event *chargestore_dev);
|
||||
extern u8 chargestore_get_earphone_online(void);
|
||||
extern u8 chargestore_get_earphone_pos(void);
|
||||
extern int chargestore_sync_chg_level(void);
|
||||
extern void chargestore_set_power_level(u8 power);
|
||||
extern void chargestore_set_sibling_chg_lev(u8 chg_lev);
|
||||
extern void chargestore_set_phone_disconnect(void);
|
||||
extern void chargestore_set_phone_connect(void);
|
||||
extern u8 chargestore_check_going_to_poweroff(void);
|
||||
extern void chargestore_shutdown_reset(void);
|
||||
extern void testbox_set_testbox_tws_paired(u8 flag);
|
||||
extern u8 testbox_get_testbox_tws_paired(void);
|
||||
extern u8 testbox_get_touch_trim_en(u8 *sec);
|
||||
extern u8 testbox_get_softpwroff_after_paired(void);
|
||||
|
||||
#endif //_APP_CHARGESTORE_H_
|
||||
555
apps/earphone/include/app_config.h
Normal file
555
apps/earphone/include/app_config.h
Normal file
@ -0,0 +1,555 @@
|
||||
#ifndef APP_CONFIG_H
|
||||
#define APP_CONFIG_H
|
||||
|
||||
/*
|
||||
* 系统打印总开关
|
||||
*/
|
||||
|
||||
#define LIB_DEBUG 1 //1 //xtelllog 1是打开库打印
|
||||
#define CONFIG_DEBUG_LIB(x) (x & LIB_DEBUG)
|
||||
|
||||
#define CONFIG_DEBUG_ENABLE //xtelllog 注释就关闭log
|
||||
|
||||
#ifndef CONFIG_DEBUG_ENABLE
|
||||
//#define CONFIG_DEBUG_LITE_ENABLE //轻量级打印开关, 默认关闭
|
||||
#endif
|
||||
|
||||
|
||||
//*********************************************************************************//
|
||||
// AI配置 //
|
||||
//*********************************************************************************//
|
||||
#define CONFIG_APP_BT_ENABLE
|
||||
|
||||
#ifdef CONFIG_APP_BT_ENABLE
|
||||
#define TRANS_DATA_EN 0
|
||||
#define RCSP_BTMATE_EN 0
|
||||
#define RCSP_ADV_EN 1
|
||||
#define AI_APP_PROTOCOL 0
|
||||
#define LL_SYNC_EN 0
|
||||
#define TUYA_DEMO_EN 0
|
||||
#else
|
||||
#define TRANS_DATA_EN 1
|
||||
#define RCSP_BTMATE_EN 0
|
||||
#define RCSP_ADV_EN 0
|
||||
#define AI_APP_PROTOCOL 0
|
||||
#define LL_SYNC_EN 0
|
||||
#define TUYA_DEMO_EN 0
|
||||
#endif
|
||||
|
||||
|
||||
#include "board_config.h"
|
||||
#ifdef TCFG_AUDIO_CVP_NS_MODE
|
||||
#if (TCFG_AUDIO_CVP_NS_MODE==CVP_DNS_MODE) || (TCFG_KWS_VOICE_RECOGNITION_ENABLE == 1)||(TCFG_AUDIO_ANC_ENABLE==1&&TCFG_AUDIO_DUAL_MIC_ENABLE==1)
|
||||
#undef CONFIG_MOVABLE_ENABLE
|
||||
#define CONFIG_MOVABLE_ENABLE //省ram空间,将部分ram空间的代码挪到flash
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(TCFG_CVP_DEVELOP_ENABLE) && (TCFG_CVP_DEVELOP_ENABLE == 1)
|
||||
#undef CONFIG_MOVABLE_ENABLE
|
||||
#define CONFIG_MOVABLE_ENABLE //省ram空间,将部分ram空间的代码挪到flash
|
||||
#endif
|
||||
|
||||
#if CONFIG_UPDATE_WITH_MD5_CHECK_EN
|
||||
#define UPDATE_MD5_ENABLE 1
|
||||
#else
|
||||
#define UPDATE_MD5_ENABLE 0
|
||||
#endif
|
||||
|
||||
|
||||
//升级需要打开CONFIG_APP_OTA_ENABLE,同时单双备份的配置也在board_xxx_global_cfg里配置,需要注意只有JL_RCSP才支持单备份,其余升级都是只支持双备份升级
|
||||
//支持TWS同步升级,OTA_TWS_SAME_TIME_NEW宏需要配置为1,旧的流程已不再支持
|
||||
#if (RCSP_ADV_EN) //rcsp需要打开ble
|
||||
#define JL_EARPHONE_APP_EN 1
|
||||
// #define CONFIG_CHARGESTORE_REMAP_ENABLE //充电仓重映射接收函数使能
|
||||
#if CONFIG_APP_OTA_ENABLE
|
||||
#define RCSP_UPDATE_EN 1 //是否支持rcsp升级
|
||||
#if CONFIG_DOUBLE_BANK_ENABLE //双备份才能打开同步升级流程
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 0 //是否支持TWS同步升级
|
||||
#define OTA_TWS_SAME_TIME_NEW 0 //使用新的tws ota流程
|
||||
#else
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 1//0 xtellota //是否支持TWS同步升级
|
||||
#define OTA_TWS_SAME_TIME_NEW 1//0 //使用新的tws ota流程
|
||||
#endif //CONFIG_DOUBLE_BANK_ENABLE
|
||||
#else
|
||||
#define RCSP_UPDATE_EN 0 //是否支持rcsp升级
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 0 //是否支持TWS同步升级
|
||||
#define OTA_TWS_SAME_TIME_NEW 0 //使用新的tws ota流程
|
||||
#endif
|
||||
#undef TCFG_USER_BLE_ENABLE
|
||||
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
|
||||
#elif (AI_APP_PROTOCOL)
|
||||
#define BT_MIC_EN 0
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 0 //是否支持TWS同步升级
|
||||
#elif (LL_SYNC_EN)
|
||||
#define JL_EARPHONE_APP_EN 0
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 1
|
||||
#define OTA_TWS_SAME_TIME_NEW 1 //使用新的tws ota流程
|
||||
#elif (TUYA_DEMO_EN)
|
||||
#define JL_EARPHONE_APP_EN 0
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 0
|
||||
#define OTA_TWS_SAME_TIME_NEW 0 //使用新的tws ota流程
|
||||
#else
|
||||
#define JL_EARPHONE_APP_EN 0
|
||||
#define OTA_TWS_SAME_TIME_ENABLE 0
|
||||
#define OTA_TWS_SAME_TIME_NEW 0 //使用新的tws ota流程
|
||||
#endif
|
||||
|
||||
#define CONFIG_MEDIA_LIB_USE_MALLOC 1
|
||||
|
||||
|
||||
|
||||
#include "usb_std_class_def.h"
|
||||
|
||||
#undef USB_MALLOC_ENABLE
|
||||
#define USB_MALLOC_ENABLE 1
|
||||
///USB 配置重定义
|
||||
// #undef USB_DEVICE_CLASS_CONFIG
|
||||
// #define USB_DEVICE_CLASS_CONFIG (AUDIO_CLASS)
|
||||
/////要确保 上面 undef 后在include usb
|
||||
#include "usb_common_def.h"
|
||||
|
||||
#define USB_PC_NO_APP_MODE 0
|
||||
|
||||
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
|
||||
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
|
||||
#undef TCFG_OTG_MODE
|
||||
#define TCFG_OTG_MODE (TCFG_OTG_MODE_HOST|TCFG_OTG_MODE_SLAVE|TCFG_OTG_MODE_CHARGE|OTG_DET_DM_ONLY)
|
||||
#endif
|
||||
|
||||
|
||||
#include "btcontroller_mode.h"
|
||||
|
||||
#include "user_cfg_id.h"
|
||||
|
||||
#ifndef __LD__
|
||||
#include "bt_profile_cfg.h"
|
||||
#endif
|
||||
|
||||
|
||||
// #ifdef CONFIG_APP_BT_ENABLE
|
||||
// #if(APP_ONLINE_DEBUG)
|
||||
// #error "they can not enable at the same time,just select one!!!"
|
||||
// #endif
|
||||
// #endif
|
||||
|
||||
|
||||
#ifdef CONFIG_SDFILE_ENABLE
|
||||
|
||||
#define SDFILE_DEV "sdfile"
|
||||
#define SDFILE_MOUNT_PATH "mnt/sdfile"
|
||||
|
||||
#if (USE_SDFILE_NEW)
|
||||
#define SDFILE_APP_ROOT_PATH SDFILE_MOUNT_PATH"/app/" //app分区
|
||||
#define SDFILE_RES_ROOT_PATH SDFILE_MOUNT_PATH"/res/" //资源文件分区
|
||||
#else
|
||||
#define SDFILE_RES_ROOT_PATH SDFILE_MOUNT_PATH"/C/"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define STYLE_JL_WTACH (1)//彩屏demo
|
||||
#define STYLE_JL_SOUNDBOX (2)//点阵屏demo
|
||||
#define STYLE_JL_CHARGE (3)//点阵屏充电仓
|
||||
#define STYLE_JL_LED7 (4)//led7
|
||||
#define STYLE_UI_SIMPLE (5)//没有ui框架
|
||||
|
||||
|
||||
//*********************************************************************************//
|
||||
// 测试模式配置 //
|
||||
//*********************************************************************************//
|
||||
#if (CONFIG_BT_MODE != BT_NORMAL)
|
||||
#undef TCFG_BD_NUM
|
||||
#define TCFG_BD_NUM 1
|
||||
|
||||
#undef TCFG_USER_TWS_ENABLE
|
||||
#define TCFG_USER_TWS_ENABLE 0 //tws功能使能
|
||||
|
||||
#undef TCFG_USER_BLE_ENABLE
|
||||
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
|
||||
|
||||
#undef TCFG_AUTO_SHUT_DOWN_TIME
|
||||
#define TCFG_AUTO_SHUT_DOWN_TIME 0
|
||||
|
||||
#undef TCFG_SYS_LVD_EN
|
||||
#define TCFG_SYS_LVD_EN 0
|
||||
|
||||
#undef TCFG_LOWPOWER_LOWPOWER_SEL
|
||||
#define TCFG_LOWPOWER_LOWPOWER_SEL 0
|
||||
|
||||
#undef TCFG_AUDIO_DAC_LDO_VOLT
|
||||
#define TCFG_AUDIO_DAC_LDO_VOLT DUT_AUDIO_DAC_LDO_VOLT
|
||||
|
||||
#undef TCFG_LOWPOWER_POWER_SEL
|
||||
#define TCFG_LOWPOWER_POWER_SEL PWR_LDO15
|
||||
|
||||
#undef TCFG_PWMLED_ENABLE
|
||||
#define TCFG_PWMLED_ENABLE DISABLE_THIS_MOUDLE
|
||||
|
||||
#undef TCFG_ADKEY_ENABLE
|
||||
#define TCFG_ADKEY_ENABLE DISABLE_THIS_MOUDLE
|
||||
|
||||
#undef TCFG_IOKEY_ENABLE
|
||||
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE
|
||||
|
||||
#undef TCFG_TEST_BOX_ENABLE
|
||||
#define TCFG_TEST_BOX_ENABLE 0
|
||||
|
||||
#undef TCFG_AUTO_SHUT_DOWN_TIME
|
||||
#define TCFG_AUTO_SHUT_DOWN_TIME 0
|
||||
|
||||
#undef TCFG_POWER_ON_NEED_KEY
|
||||
#define TCFG_POWER_ON_NEED_KEY 0
|
||||
|
||||
/* #undef TCFG_UART0_ENABLE
|
||||
#define TCFG_UART0_ENABLE DISABLE_THIS_MOUDLE */
|
||||
dzfghsdfhgsfgh
|
||||
#endif //(CONFIG_BT_MODE != BT_NORMAL)
|
||||
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
|
||||
#define CONFIG_TWS_COMMON_ADDR_AUTO 0 /* 自动生成TWS配对后的MAC地址 */
|
||||
#define CONFIG_TWS_COMMON_ADDR_USED_LEFT 1 /* 使用左耳的MAC地址作为TWS配对后的地址
|
||||
可配合烧写器MAC地址自增功能一起使用
|
||||
多台交叉配对会出现MAC地址相同情况 */
|
||||
#define CONFIG_TWS_COMMON_ADDR_SELECT CONFIG_TWS_COMMON_ADDR_AUTO
|
||||
|
||||
//*********************************************************************************//
|
||||
// 对耳配置方式配置 //
|
||||
//*********************************************************************************//
|
||||
#define CONFIG_TWS_CONNECT_SIBLING_TIMEOUT 4 /* 开机或超时断开后对耳互连超时时间,单位s */
|
||||
// #define CONFIG_TWS_REMOVE_PAIR_ENABLE [> 不连手机的情况下双击按键删除配对信息 <]
|
||||
#define CONFIG_TWS_POWEROFF_SAME_TIME 1 /*按键关机时两个耳机同时关机*/
|
||||
|
||||
#define ONE_KEY_CTL_DIFF_FUNC 1 /*通过左右耳实现一个按键控制两个功能*/
|
||||
#define CONFIG_TWS_SCO_ONLY_MASTER 0 /*通话的时候只有主机出声音*/
|
||||
|
||||
/* 配对方式选择 */
|
||||
#define CONFIG_TWS_PAIR_BY_CLICK 0 /* 按键发起配对 */
|
||||
#define CONFIG_TWS_PAIR_BY_AUTO 1 /* 开机自动配对 */
|
||||
#define CONFIG_TWS_PAIR_BY_FAST_CONN 2 /* 开机快速连接,连接速度比自动配对快,不支持取消配对操作 */
|
||||
#define CONFIG_TWS_PAIR_MODE CONFIG_TWS_PAIR_BY_AUTO
|
||||
|
||||
|
||||
/* 声道确定方式选择 */
|
||||
#define CONFIG_TWS_MASTER_AS_LEFT 0 //主机作为左耳
|
||||
#define CONFIG_TWS_AS_LEFT_CHANNEL 1 //固定左耳
|
||||
#define CONFIG_TWS_AS_RIGHT_CHANNEL 2 //固定右耳
|
||||
#define CONFIG_TWS_LEFT_START_PAIR 3 //双击发起配对的耳机做左耳
|
||||
#define CONFIG_TWS_RIGHT_START_PAIR 4 //双击发起配对的耳机做右耳
|
||||
#define CONFIG_TWS_EXTERN_UP_AS_LEFT 5 //外部有上拉电阻作为左耳
|
||||
#define CONFIG_TWS_EXTERN_DOWN_AS_LEFT 6 //外部有下拉电阻作为左耳
|
||||
#define CONFIG_TWS_SECECT_BY_CHARGESTORE 7 //充电仓决定左右耳
|
||||
#define CONFIG_TWS_CHANNEL_SELECT CONFIG_TWS_LEFT_START_PAIR //配对方式选择
|
||||
|
||||
#define CONFIG_TWS_CHANNEL_CHECK_IO IO_PORTA_07 //上下拉电阻检测引脚
|
||||
|
||||
|
||||
#if CONFIG_TWS_PAIR_MODE != CONFIG_TWS_PAIR_BY_CLICK
|
||||
#if (CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_LEFT_START_PAIR) ||\
|
||||
(CONFIG_TWS_CHANNEL_SELECT == CONFIG_TWS_RIGHT_START_PAIR)
|
||||
#undef CONFIG_TWS_CHANNEL_SELECT
|
||||
#define CONFIG_TWS_CHANNEL_SELECT CONFIG_TWS_MASTER_AS_LEFT
|
||||
#endif
|
||||
|
||||
#if CONFIG_TWS_PAIR_MODE == CONFIG_TWS_PAIR_BY_AUTO
|
||||
#define CONFIG_TWS_AUTO_PAIR_WITHOUT_UNPAIR /* 不取消配对也可以配对新的耳机 */
|
||||
#endif
|
||||
|
||||
#if CONFIG_TWS_PAIR_MODE == CONFIG_TWS_PAIR_BY_FAST_CONN
|
||||
#undef CONFIG_TWS_REMOVE_PAIR_ENABLE
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#define CONFIG_A2DP_GAME_MODE_ENABLE 0 //游戏模式
|
||||
#define CONFIG_A2DP_GAME_MODE_DELAY_TIME 35 //游戏模式延时ms
|
||||
|
||||
//*********************************************************************************//
|
||||
// 低延时游戏模式脚步声、枪声增强,需使能蓝牙音乐10段eq以及蓝牙音乐drc
|
||||
// 用户开关宏AUDIO_GAME_EFFECT_CONFIG(开关蓝牙低延时模式的游戏音效)
|
||||
// 低延时eq效果文件使用eq_game_eff.bin,调试时需保存成该文件,并在批处理-res后添加
|
||||
// 非低延时eq效果文件使用eq_cfg_hw.bin,也需在批处理-res后添加
|
||||
//*********************************************************************************//
|
||||
#if CONFIG_A2DP_GAME_MODE_ENABLE
|
||||
#define AUDIO_GAME_EFFECT_CONFIG 1 //低延时游戏模式脚步声、枪声增强 1:使能、0:关闭
|
||||
#else
|
||||
#define AUDIO_GAME_EFFECT_CONFIG 0 //低延时游戏模式脚步声、枪声增强 1:使能、0:关闭
|
||||
#endif
|
||||
/***********************************非用户配置区***********************************/
|
||||
//以下宏定义,是游戏音效使能后,需要开启的宏定义,已配好,用户不用修改
|
||||
#if AUDIO_GAME_EFFECT_CONFIG
|
||||
#if (TCFG_EQ_ENABLE == 0)
|
||||
#undef TCFG_EQ_ENABLE
|
||||
#define TCFG_EQ_ENABLE 1
|
||||
#endif/* (TCFG_EQ_ENABLE == 0) */
|
||||
#if (TCFG_BT_MUSIC_EQ_ENABLE == 0)
|
||||
#undef TCFG_BT_MUSIC_EQ_ENABLE
|
||||
#define TCFG_BT_MUSIC_EQ_ENABLE 1
|
||||
#endif/*(TCFG_BT_MUSIC_EQ_ENABLE == 0)*/
|
||||
#if (TCFG_DRC_ENABLE == 0)
|
||||
#undef TCFG_DRC_ENABLE
|
||||
#define TCFG_DRC_ENABLE 1
|
||||
#endif/* (TCFG_DRC_ENABLE == 0) */
|
||||
#if (TCFG_BT_MUSIC_DRC_ENABLE == 0)
|
||||
#undef TCFG_BT_MUSIC_DRC_ENABLE
|
||||
#define TCFG_BT_MUSIC_DRC_ENABLE 1
|
||||
#endif/* (TCFG_BT_MUSIC_DRC_ENABLE == 0) */
|
||||
#if (EQ_SECTION_MAX < 10)
|
||||
#undef EQ_SECTION_MAX
|
||||
#define EQ_SECTION_MAX 10
|
||||
#endif/* (EQ_SECTION_MAX < 10) */
|
||||
#if (TCFG_USE_EQ_FILE == 0)
|
||||
#undef TCFG_USE_EQ_FILE
|
||||
#define TCFG_USE_EQ_FILE 1
|
||||
#endif/* TCFG_USE_EQ_FILE */
|
||||
#endif/* AUDIO_GAME_EFFECT_CONFIG */
|
||||
/**********************************************************************************/
|
||||
|
||||
|
||||
|
||||
#if CONFIG_TWS_PAIR_MODE == CONFIG_TWS_PAIR_BY_CLICK
|
||||
#define CONFIG_TWS_BY_CLICK_PAIR_WITHOUT_PAIR /*双击按键可以配对已配对过的样机,即交叉配对 */
|
||||
#ifdef CONFIG_TWS_BY_CLICK_PAIR_WITHOUT_PAIR
|
||||
#define CONFIG_TWS_AUTO_PAIR_WITHOUT_UNPAIR /* 不取消配对也可以配对新的耳机 */
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if TCFG_CHARGESTORE_ENABLE
|
||||
#undef CONFIG_TWS_CHANNEL_SELECT
|
||||
#define CONFIG_TWS_CHANNEL_SELECT CONFIG_TWS_SECECT_BY_CHARGESTORE //充电仓区分左右
|
||||
#endif //TCFG_CHARGESTORE_ENABLE
|
||||
|
||||
#if TCFG_TEST_BOX_ENABLE && (!TCFG_CHARGESTORE_ENABLE)
|
||||
#define CONFIG_TWS_SECECT_CHARGESTORE_PRIO 1 //测试盒配置左右耳优先
|
||||
#else
|
||||
#define CONFIG_TWS_SECECT_CHARGESTORE_PRIO 0
|
||||
#endif //TCFG_TEST_BOX_ENABLE
|
||||
|
||||
//*********************************************************************************//
|
||||
// 对耳电量显示方式 //
|
||||
//*********************************************************************************//
|
||||
|
||||
#if BT_SUPPORT_DISPLAY_BAT
|
||||
#define CONFIG_DISPLAY_TWS_BAT_LOWER 1 //对耳手机端电量显示,显示低电量耳机的电量
|
||||
#define CONFIG_DISPLAY_TWS_BAT_HIGHER 2 //对耳手机端电量显示,显示高电量耳机的电量
|
||||
#define CONFIG_DISPLAY_TWS_BAT_LEFT 3 //对耳手机端电量显示,显示左耳的电量
|
||||
#define CONFIG_DISPLAY_TWS_BAT_RIGHT 4 //对耳手机端电量显示,显示右耳的电量
|
||||
|
||||
#define CONFIG_DISPLAY_TWS_BAT_TYPE CONFIG_DISPLAY_TWS_BAT_LOWER
|
||||
#endif //BT_SUPPORT_DISPLAY_BAT
|
||||
|
||||
#define CONFIG_DISPLAY_DETAIL_BAT 0 //BLE广播显示具体的电量
|
||||
#define CONFIG_NO_DISPLAY_BUTTON_ICON 1 //BLE广播不显示按键界面,智能充电仓置1
|
||||
|
||||
#endif //TCFG_USER_TWS_ENABLE
|
||||
|
||||
#ifndef CONFIG_BT_RX_BUFF_SIZE
|
||||
#define CONFIG_BT_RX_BUFF_SIZE (14 * 1024)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_APP_BT_ENABLE
|
||||
#if TCFG_BT_SUPPORT_AAC || TCFG_BT_SUPPORT_LDAC
|
||||
#define CONFIG_BT_TX_BUFF_SIZE (5 * 1024)
|
||||
#else
|
||||
#define CONFIG_BT_TX_BUFF_SIZE (4 * 1024)
|
||||
#endif
|
||||
#else
|
||||
#if TCFG_BT_SUPPORT_AAC || TCFG_BT_SUPPORT_LDAC
|
||||
#define CONFIG_BT_TX_BUFF_SIZE (4 * 1024)
|
||||
#else
|
||||
#define CONFIG_BT_TX_BUFF_SIZE (3 * 1024)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef CONFIG_NEW_BREDR_ENABLE
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
|
||||
#ifdef CONFIG_LOCAL_TWS_ENABLE
|
||||
#define CONFIG_TWS_BULK_POOL_SIZE (4 * 1024)
|
||||
#else
|
||||
#define CONFIG_TWS_BULK_POOL_SIZE (2 * 1024)
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#if (CONFIG_BT_MODE != BT_NORMAL)
|
||||
////bqb 如果测试3M tx buf 最好加大一点
|
||||
#undef CONFIG_BT_TX_BUFF_SIZE
|
||||
#define CONFIG_BT_TX_BUFF_SIZE (6 * 1024)
|
||||
|
||||
#endif
|
||||
|
||||
//*********************************************************************************//
|
||||
// 电源切换配置 //
|
||||
//*********************************************************************************//
|
||||
|
||||
#define PHONE_CALL_USE_LDO15 CONFIG_PHONE_CALL_USE_LDO15
|
||||
|
||||
//*********************************************************************************//
|
||||
// 时钟切换配置 //
|
||||
//*********************************************************************************//
|
||||
#define BT_NORMAL_HZ CONFIG_BT_NORMAL_HZ
|
||||
#define BT_CONNECT_HZ CONFIG_BT_CONNECT_HZ
|
||||
|
||||
#define BT_A2DP_HZ CONFIG_BT_A2DP_HZ
|
||||
|
||||
#define BT_CALL_HZ CONFIG_BT_CALL_HZ
|
||||
#define BT_CALL_ADVANCE_HZ CONFIG_BT_CALL_ADVANCE_HZ
|
||||
#define BT_CALL_16k_HZ CONFIG_BT_CALL_16k_HZ
|
||||
#define BT_CALL_16k_ADVANCE_HZ CONFIG_BT_CALL_16k_ADVANCE_HZ
|
||||
|
||||
|
||||
#define MUSIC_DEC_FASTEST_CLOCK CONFIG_MUSIC_DEC_FASTEST_CLOCK
|
||||
#define MUSIC_DEC_FAST_CLOCK CONFIG_MUSIC_DEC_FAST_CLOCK
|
||||
#define MUSIC_DEC_CLOCK CONFIG_MUSIC_DEC_CLOCK
|
||||
#define MUSIC_DEC_IDLE_CLOCK CONFIG_MUSIC_IDLE_CLOCK
|
||||
#define MUSIC_FSCAN_CLOCK CONFIG_MUSIC_FSCAN_CLOCK
|
||||
#define LINEIN_CLOCK CONFIG_LINEIN_CLOCK
|
||||
#define FM_CLOCK CONFIG_FM_CLOCK
|
||||
#define FM_EMITTER_CLOCK CONFIG_FM_EMITTER_CLOCK
|
||||
#define PC_CLOCK CONFIG_PC_CLOCK
|
||||
#define RECODRD_CLOCK CONFIG_RECORD_CLOCK
|
||||
#define SPDIF_CLOCK CONFIG_SPDIF_CLOCK
|
||||
|
||||
////////////////////////
|
||||
#if TCFG_BT_SUPPORT_AAC || TCFG_BT_SUPPORT_LDAC
|
||||
#define BT_A2DP_STEREO_EQ_HZ 48 * 1000000L
|
||||
#else
|
||||
#define BT_A2DP_STEREO_EQ_HZ 32 * 1000000L
|
||||
#endif
|
||||
#define BT_A2DP_AAC_HZ 48 * 1000000L
|
||||
#define BT_A2DP_TWS_AAC_HZ 64 * 1000000L
|
||||
#define BT_A2DP_MONO_EQ_HZ 32 * 1000000L
|
||||
#define BT_A2DP_ONLINE_EQ_HZ 48 * 1000000L
|
||||
|
||||
#define BT_CALL_SIMPLEX_HZ 96 * 1000000L
|
||||
#ifdef CONFIG_ANS_V2
|
||||
//#define BT_CALL_16k_HZ 96 * 1000000L
|
||||
//#define BT_CALL_16k_ADVANCE_HZ 120 * 1000000L
|
||||
#else
|
||||
//#define BT_CALL_16k_HZ 80 * 1000000L
|
||||
//#define BT_CALL_16k_ADVANCE_HZ 96 * 1000000L
|
||||
#endif
|
||||
#define BT_CALL_16k_SIMPLEX_HZ 120 * 1000000L
|
||||
////////////////////////
|
||||
|
||||
#ifdef CONFIG_FPGA_ENABLE
|
||||
|
||||
// #undef TCFG_CLOCK_OSC_HZ
|
||||
// #define TCFG_CLOCK_OSC_HZ 12000000
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_CPU_BR26
|
||||
#undef BT_CALL_16k_HZ
|
||||
#undef BT_CALL_16k_ADVANCE_HZ
|
||||
#define BT_CALL_16k_HZ 96 * 1000000L
|
||||
#define BT_CALL_16k_ADVANCE_HZ 96 * 1000000L
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_BR23
|
||||
#undef BT_A2DP_STEREO_EQ_HZ
|
||||
#define BT_A2DP_STEREO_EQ_HZ 48 * 1000000L
|
||||
#undef BT_A2DP_MONO_EQ_HZ
|
||||
#define BT_A2DP_MONO_EQ_HZ 48 * 1000000L
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_BR25
|
||||
#undef BT_A2DP_STEREO_EQ_HZ
|
||||
#define BT_A2DP_STEREO_EQ_HZ 48 * 1000000L
|
||||
#undef BT_A2DP_MONO_EQ_HZ
|
||||
#define BT_A2DP_MONO_EQ_HZ 48 * 1000000L
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FPGA_ENABLE
|
||||
|
||||
// #undef TCFG_CLOCK_OSC_HZ
|
||||
// #define TCFG_CLOCK_OSC_HZ 12000000
|
||||
|
||||
#undef TCFG_MC_BIAS_AUTO_ADJUST
|
||||
#define TCFG_MC_BIAS_AUTO_ADJUST MC_BIAS_ADJUST_DISABLE
|
||||
|
||||
#endif
|
||||
//*********************************************************************************//
|
||||
// 低功耗配置 //
|
||||
//*********************************************************************************//
|
||||
#if TCFG_IRKEY_ENABLE
|
||||
#undef TCFG_LOWPOWER_LOWPOWER_SEL
|
||||
#define TCFG_LOWPOWER_LOWPOWER_SEL 0 //开红外不进入低功耗
|
||||
#endif /* #if TCFG_IRKEY_ENABLE */
|
||||
|
||||
//*********************************************************************************//
|
||||
// LED使用 16SLOT TIMER 同步 //
|
||||
//*********************************************************************************//
|
||||
//LED模块使用slot timer同步使用注意点:
|
||||
// 1.soundbox不开该功能, 原因: 默认打开osc时钟, 使用原来的osc流程同步即可
|
||||
// 2.带sd卡earphone不开该功能, 一般为单耳, 不需要同步, 使用原来的流程(lrc)
|
||||
// 3.一般用在tws应用中, 而且默认关闭osc;
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#define TCFG_PWMLED_USE_SLOT_TIME ENABLE_THIS_MOUDLE
|
||||
#endif
|
||||
|
||||
//*********************************************************************************//
|
||||
// 升级配置 //
|
||||
//*********************************************************************************//
|
||||
//升级LED显示使能
|
||||
#define UPDATE_LED_REMIND
|
||||
//升级提示音使能
|
||||
#define UPDATE_VOICE_REMIND
|
||||
|
||||
#ifndef CONFIG_UPDATE_JUMP_TO_MASK
|
||||
#define CONFIG_UPDATE_JUMP_TO_MASK 0
|
||||
#endif
|
||||
|
||||
#if CONFIG_UPDATE_JUMP_TO_MASK
|
||||
//升级IO保持使能
|
||||
#define DEV_UPDATE_SUPPORT_JUMP //目前只有br23\br25支持
|
||||
#endif
|
||||
|
||||
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
#define CONFIG_SD_UPDATE_ENABLE
|
||||
#define CONFIG_USB_UPDATE_ENABLE
|
||||
#endif
|
||||
//*********************************************************************************//
|
||||
// Audio配置 //
|
||||
//*********************************************************************************//
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#if ((defined VOL_TYPE_ANALOG) && (SYS_VOL_TYPE == VOL_TYPE_ANALOG)) || \
|
||||
((defined VOL_TYPE_AD) && (SYS_VOL_TYPE == VOL_TYPE_AD))
|
||||
#error "ANC can not use VOL_TYPE_ANALOG and VOL_TYPE_AD!!!"
|
||||
#endif/*(SYS_VOL_TYPE = VOL_TYPE_ANALOG) || (SYS_VOL_TYPE = VOL_TYPE_AD)*/
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
|
||||
/*通话语音处理算法放在.data段*/
|
||||
#ifndef TCFG_AUDIO_CVP_CODE_AT_RAM
|
||||
#define TCFG_AUDIO_CVP_CODE_AT_RAM 1
|
||||
#endif/*TCFG_AUDIO_CVP_CODE_AT_RAM*/
|
||||
|
||||
/*AAC解码算法放在.data段*/
|
||||
#ifndef TCFG_AUDIO_AAC_CODE_AT_RAM
|
||||
#define TCFG_AUDIO_AAC_CODE_AT_RAM 1
|
||||
#endif/*TCFG_AUDIO_AAC_CODE_AT_RAM*/
|
||||
|
||||
#if (TCFG_AUDIO_DUAL_MIC_ENABLE && TCFG_AUDIO_TRIPLE_MIC_ENABLE)
|
||||
#error "TCFG_AUDIO_DUAL_MIC_ENABLE and TCFG_AUDIO_TRIPLE_MIC_ENABLE can not enable together !!!"
|
||||
#endif
|
||||
|
||||
//*********************************************************************************//
|
||||
// 充电中按键清除手机配对信息配置 //
|
||||
//*********************************************************************************//
|
||||
|
||||
#define CHARGING_CLEAN_PHONE_INFO 0
|
||||
|
||||
|
||||
#define PC_MODE_DETECTION
|
||||
|
||||
#endif
|
||||
90
apps/earphone/include/app_main.h
Normal file
90
apps/earphone/include/app_main.h
Normal file
@ -0,0 +1,90 @@
|
||||
#ifndef APP_MAIN_H
|
||||
#define APP_MAIN_H
|
||||
|
||||
typedef struct {
|
||||
float talk;
|
||||
float ff;
|
||||
float fb;
|
||||
} audio_mic_cmp_t;
|
||||
|
||||
typedef struct _APP_VAR {
|
||||
s8 bt_volume;
|
||||
s8 dev_volume;
|
||||
s8 music_volume;
|
||||
s8 call_volume;
|
||||
s8 wtone_volume;
|
||||
u8 opid_play_vol_sync;
|
||||
u8 aec_dac_gain;
|
||||
u8 aec_mic_gain;
|
||||
u8 aec_mic1_gain;
|
||||
u8 aec_mic2_gain;
|
||||
u8 aec_mic3_gain;
|
||||
u8 rf_power;
|
||||
u8 goto_poweroff_flag;
|
||||
u8 goto_poweroff_cnt;
|
||||
u8 play_poweron_tone;
|
||||
u8 remote_dev_company;
|
||||
u8 siri_stu;
|
||||
u8 cycle_mode;
|
||||
u8 have_mass_storage;
|
||||
int auto_stop_page_scan_timer; //用于1拖2时,有一台连接上后,超过三分钟自动关闭Page Scan
|
||||
volatile int auto_shut_down_timer;
|
||||
volatile int wait_exit_timer;
|
||||
u16 auto_off_time;
|
||||
u16 warning_tone_v;
|
||||
u16 poweroff_tone_v;
|
||||
u16 phone_dly_discon_time;
|
||||
u8 usb_mic_gain;
|
||||
int wait_timer_do;
|
||||
u32 start_time;
|
||||
float audio_mic_array_diff_cmp;//麦克风阵列补偿值
|
||||
u8 audio_mic_array_trim_en; //麦克风阵列校准
|
||||
audio_mic_cmp_t audio_mic_cmp;
|
||||
float enc_degradation;//default:1,range[0:1]
|
||||
/*3麦通话配置使用:选择第几个mic*/
|
||||
u8 talk_mic_ch; //主MIC通道选择
|
||||
u8 talk_ref_mic_ch; //副MIC通道选择
|
||||
u8 talk_fb_mic_ch; //FB通道选择
|
||||
} APP_VAR;
|
||||
|
||||
typedef struct _BT_USER_PRIV_VAR {
|
||||
//phone
|
||||
u8 phone_ring_flag: 1;
|
||||
u8 phone_num_flag: 1;
|
||||
u8 phone_income_flag: 1;
|
||||
u8 phone_call_dec_begin: 1;
|
||||
u8 phone_con_sync_num_ring: 1;
|
||||
u8 phone_con_sync_ring: 1;
|
||||
// u8 reserved: 2;
|
||||
u8 emitter_or_receiver: 2;
|
||||
u8 get_phone_num_timecnt;
|
||||
|
||||
u8 inband_ringtone;
|
||||
u8 phone_vol;
|
||||
u16 phone_timer_id;
|
||||
u8 last_call_type;
|
||||
u8 income_phone_num[30];
|
||||
u8 income_phone_len;
|
||||
s32 auto_connection_counter;
|
||||
int auto_connection_timer;
|
||||
u8 auto_connection_addr[6];
|
||||
int tws_con_timer;
|
||||
u8 tws_start_con_cnt;
|
||||
u8 tws_conn_state;
|
||||
bool search_tws_ing;
|
||||
int sniff_timer;
|
||||
bool fast_test_mode;
|
||||
} BT_USER_PRIV_VAR;
|
||||
|
||||
#define BT_EMITTER_EN 1
|
||||
#define BT_RECEIVER_EN 2
|
||||
|
||||
typedef struct _BT_USER_COMM_VAR {
|
||||
} BT_USER_COMM_VAR;
|
||||
|
||||
extern APP_VAR app_var;
|
||||
extern BT_USER_PRIV_VAR bt_user_priv_var;
|
||||
|
||||
#define earphone (&bt_user_priv_var)
|
||||
|
||||
#endif
|
||||
8
apps/earphone/include/app_music.h
Normal file
8
apps/earphone/include/app_music.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef CONFIG_APP_MUSIC_H
|
||||
#define CONFIG_APP_MUSIC_H
|
||||
|
||||
void app_music_exit();
|
||||
int music_app_check(void);
|
||||
|
||||
#endif
|
||||
|
||||
13
apps/earphone/include/app_online_cfg.h
Normal file
13
apps/earphone/include/app_online_cfg.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef ONLINE_CONFIG_H
|
||||
#define ONLINE_CONFIG_H
|
||||
|
||||
#define DEVICE_EVENT_FROM_CI_UART (('C' << 24) | ('I' << 16) | ('U' << 8) | '\0')
|
||||
#define DEVICE_EVENT_FROM_CI_TWS (('C' << 24) | ('I' << 16) | ('T' << 8) | '\0')
|
||||
|
||||
#define CI_UART 0
|
||||
#define CI_TWS 1
|
||||
|
||||
void ci_data_rx_handler(u8 type);
|
||||
u32 eq_cfg_sync(u8 priority);
|
||||
#endif
|
||||
|
||||
39
apps/earphone/include/app_power_manage.h
Normal file
39
apps/earphone/include/app_power_manage.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef APP_POWER_MANAGE_H
|
||||
#define APP_POWER_MANAGE_H
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
|
||||
#define LOW_POWER_SHUTDOWN 300 //低电直接关机电压-拔出不开机-开盖不开机
|
||||
#define LOW_POWER_OFF_VAL 330 //低电关机电压
|
||||
#define LOW_POWER_WARN_VAL 340 //低电提醒电压
|
||||
#define LOW_POWER_WARN_TIME (60 * 1000) //低电提醒时间
|
||||
|
||||
#define DEVICE_EVENT_FROM_POWER (('P' << 24) | ('O' << 16) | ('W' << 8) | '\0')
|
||||
|
||||
enum {
|
||||
POWER_EVENT_POWER_NORMAL,
|
||||
POWER_EVENT_POWER_WARNING,
|
||||
POWER_EVENT_POWER_LOW,
|
||||
POWER_EVENT_POWER_CHANGE,
|
||||
POWER_EVENT_SYNC_TWS_VBAT_LEVEL,
|
||||
POWER_EVENT_POWER_CHARGE,
|
||||
};
|
||||
|
||||
int app_power_event_handler(struct device_event *dev);
|
||||
void check_power_on_voltage(void);
|
||||
u16 get_vbat_level(void);
|
||||
u8 get_vbat_percent(void);
|
||||
void vbat_check_init(void);
|
||||
void vbat_timer_update(u32 msec);
|
||||
void vbat_timer_delete(void);
|
||||
void tws_sync_bat_level(void);
|
||||
u8 get_tws_sibling_bat_level(void);
|
||||
u8 get_tws_sibling_bat_persent(void);
|
||||
bool get_vbat_need_shutdown(void);
|
||||
u8 get_self_battery_level(void);
|
||||
|
||||
void app_power_set_tws_sibling_bat_level(u8 vbat, u8 percent);
|
||||
|
||||
#endif
|
||||
|
||||
6
apps/earphone/include/app_sd_music.h
Normal file
6
apps/earphone/include/app_sd_music.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef CONFIG_APP_SD_MUSIC_H
|
||||
#define CONFIG_APP_SD_MUSIC_H
|
||||
|
||||
int music_app_check(void);//music 在线检测 切换模式判断使用
|
||||
|
||||
#endif
|
||||
31
apps/earphone/include/app_task.h
Normal file
31
apps/earphone/include/app_task.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef APP_TASK_H
|
||||
#define APP_TASK_H
|
||||
|
||||
#include "typedef.h"
|
||||
#define NULL_VALUE 0
|
||||
|
||||
enum {
|
||||
APP_BT_TASK,
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
APP_MUSIC_TASK,
|
||||
#endif
|
||||
#if TCFG_PC_ENABLE
|
||||
APP_PC_TASK,
|
||||
#endif
|
||||
#if TCFG_APP_AUX_EN
|
||||
APP_AUX_TASK,
|
||||
#endif
|
||||
};
|
||||
|
||||
extern u8 app_curr_task;
|
||||
extern u8 app_next_task;
|
||||
extern u8 app_prev_task;
|
||||
|
||||
int app_task_switch_check(u8 app_task);
|
||||
int app_core_back_to_prev_app_over_check(void);
|
||||
int app_task_switch_to(u8 app_task, int priv);
|
||||
void app_task_switch_next(void);
|
||||
void app_task_switch_prev(void);
|
||||
u8 app_get_curr_task(void);
|
||||
|
||||
#endif
|
||||
18
apps/earphone/include/app_testbox.h
Normal file
18
apps/earphone/include/app_testbox.h
Normal file
@ -0,0 +1,18 @@
|
||||
#ifndef _APP_TESTBOX_H_
|
||||
#define _APP_TESTBOX_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
|
||||
extern void testbox_set_bt_init_ok(u8 flag);
|
||||
extern u8 testbox_get_status(void);
|
||||
extern void testbox_clear_status(void);
|
||||
extern u8 testbox_get_ex_enter_dut_flag(void);
|
||||
extern u8 testbox_get_ex_enter_storage_mode_flag(void);
|
||||
extern u8 testbox_get_connect_status(void);
|
||||
extern void testbox_clear_connect_status(void);
|
||||
extern u8 testbox_get_keep_tws_conn_flag(void);
|
||||
extern int app_testbox_event_handler(struct testbox_event *testbox_dev);
|
||||
|
||||
|
||||
#endif //_APP_TESTBOX_H_
|
||||
50
apps/earphone/include/app_umidigi_chargestore.h
Normal file
50
apps/earphone/include/app_umidigi_chargestore.h
Normal file
@ -0,0 +1,50 @@
|
||||
#ifndef _APP_UMIDIGI_CHARGESTORE_H_
|
||||
#define _APP_UMIDIGI_CHARGESTORE_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "system/event.h"
|
||||
#include "board_config.h"
|
||||
|
||||
/*******************************UMIDIGI充电舱数据包格式*****************************/
|
||||
/*
|
||||
* |<--1bit-->||<-------4bits----->||<--------------8bits------------>||<--1bit-->||<--1bits-->|
|
||||
* |<-start-->||<-------CMD------->||<--------------DATA------------->|| crc_odd ||<--stop--->|
|
||||
* | 14 || 13 | 12 | 11 | 10 || 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 || 1 || 0 |
|
||||
*/
|
||||
|
||||
/*充电舱发送的命令列表*/
|
||||
#define CMD_RESERVED_0 0x00 //reserved
|
||||
#define CMD_FACTORY_RESET 0x01 //恢复出厂设置
|
||||
#define CMD_RESERVED_2 0x02 //reserved
|
||||
#define CMD_OPEN_CASE 0x03 //充电舱开盖
|
||||
#define CMD_CLOSE_CASE 0x04 //充电舱关盖
|
||||
#define CMD_ENTER_PAIRING_MODE 0x06 //进入配对模式
|
||||
#define CMD_DUT_MODE_CMD 0x08 //进入DUT模式
|
||||
#define CMD_USB_STATE 0x0A //USB状态
|
||||
#define CMD_RESERVED_B 0x0B //reserved(RTK internal use)
|
||||
#define CMD_SEND_CASE_BATTERY 0x0D //发送充电舱电量
|
||||
|
||||
/*message中的CMD与DATA位置,用于从一个完整的数据包中截取CMD和DATA*/
|
||||
/*CMD_IN_MESSAGE = 0xf000*/
|
||||
#define CMD_IN_MESSAGE (BIT(13) | BIT(12) | BIT(11) | BIT(10))
|
||||
/*DATA_IN_MESSAGE = 0x0ff0*/
|
||||
#define DATA_IN_MESSAGE (BIT(9) | BIT(8) | BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2))
|
||||
|
||||
void app_umidigi_chargetore_message_deal(u16 message);
|
||||
|
||||
extern u8 umidigi_chargestore_get_power_level(void); //获取充电舱电池电量
|
||||
extern u8 umidigi_chargestore_get_power_status(void); //获取充电舱充电状态
|
||||
extern u8 umidigi_chargestore_get_cover_status(void); //获取充电舱合盖或开盖状态
|
||||
extern u8 umidigi_chargestore_get_earphone_online(void); //获取合盖状态时耳机在仓数量
|
||||
extern void umidigi_chargestore_set_bt_init_ok(u8 flag); //获取蓝牙初始化成功标志位
|
||||
extern u8 umidigi_chargestore_check_going_to_poweroff(void); //获取允许poweroff标志位
|
||||
extern void umidigi_chargestore_set_phone_disconnect(void);
|
||||
extern void umidigi_chargestore_set_phone_connect(void);
|
||||
extern void umidigi_chargestore_set_sibling_chg_lev(u8 chg_lev);//设置对耳同步的充电舱电量
|
||||
extern void umidigi_chargestore_set_power_level(u8 power); //设置充电舱电池电量
|
||||
extern int umidigi_chargestore_sync_chg_level(void);
|
||||
|
||||
extern int app_umidigi_chargestore_event_handler(struct umidigi_chargestore_event *umidigi_chargestore_dev);
|
||||
|
||||
#endif
|
||||
|
||||
69
apps/earphone/include/audio_enc_mpt_self.h
Normal file
69
apps/earphone/include/audio_enc_mpt_self.h
Normal file
@ -0,0 +1,69 @@
|
||||
|
||||
#ifndef __AUDIO_ENC_MPT_FRE_RESPONE_H_
|
||||
#define __AUDIO_ENC_MPT_FRE_RESPONE_H_
|
||||
|
||||
#include "asm/cpu.h"
|
||||
|
||||
/********************用户配置****************************/
|
||||
|
||||
//计算长度 输入单位s16/输出单位float
|
||||
#define AUDIO_ENC_MPT_FRERES_POINT 1024
|
||||
|
||||
/********************非用户配置****************************/
|
||||
|
||||
//MIC频响测试通道ID u16
|
||||
#define AUDIO_ENC_MPT_FF_MIC 0X01 //测试TWS FFMIC or 头戴式LFF MIC
|
||||
#define AUDIO_ENC_MPT_FB_MIC 0X02 //测试TWS FBMIC or 头戴式LFB MIC
|
||||
#define AUDIO_ENC_MPT_RFF_MIC 0X04 //测试头戴式RFF MIC
|
||||
#define AUDIO_ENC_MPT_RFB_MIC 0X08 //测试头戴式RFB MIC
|
||||
#define AUDIO_ENC_MPT_CVP_OUT 0X10 //测试通话算法输出
|
||||
#define AUDIO_ENC_MPT_TALK_MIC 0X20 //测试通话TALK 主MIC
|
||||
#define AUDIO_ENC_MPT_SLAVE_MIC 0X40 //测试通话TALK 副MIC
|
||||
#define AUDIO_ENC_MPT_TALK_FB_MIC 0X80 //测试通话TALK FBMIC
|
||||
|
||||
//常见通道组合
|
||||
//FF+TALK+算法输出频响测试,默认关闭DNS, 外部喇叭发声
|
||||
#define AUDIO_ENC_MPT_CH_TWS_CVP_ENC (AUDIO_ENC_MPT_SLAVE_MIC | AUDIO_ENC_MPT_TALK_MIC | AUDIO_ENC_MPT_CVP_OUT)
|
||||
|
||||
//FF回声/气密性+FB频响测试,耳机喇叭发声
|
||||
#define AUDIO_ENC_MPT_CH_TWS_FF_FB (AUDIO_ENC_MPT_FF_MIC | AUDIO_ENC_MPT_FB_MIC)
|
||||
|
||||
|
||||
#define AUDIO_ENC_MPT_FRERES_ASYNC 1 //是否异步处理, 异步算不过来要加时钟提醒
|
||||
|
||||
enum {
|
||||
ENC_FRE_RES_STATE_START = 0,
|
||||
ENC_FRE_RES_STATE_RUN,
|
||||
ENC_FRE_RES_STATE_STOP,
|
||||
};
|
||||
|
||||
enum {
|
||||
ENC_FRE_RESPONE_MSG_RUN = 0xA1,
|
||||
};
|
||||
|
||||
//更新目标通道输入buf、len
|
||||
void audio_enc_mpt_fre_response_inbuf(u16 id, s16 *buf, int len);
|
||||
|
||||
//音频测试频响计算运行
|
||||
void audio_enc_mpt_fre_response_post_run(u16 id);
|
||||
|
||||
//音频测试频响计算启动, ch 对应目标的通道
|
||||
void audio_enc_mpt_fre_response_start(u16 ch);
|
||||
|
||||
//音频测试频响计算停止
|
||||
void audio_enc_mpt_fre_response_stop(void);
|
||||
|
||||
//工具获取数据文件
|
||||
int audio_enc_mpt_fre_response_file_get(u8 **buf);
|
||||
|
||||
//数据获取结束,释放内存
|
||||
void audio_enc_mpt_fre_response_release(void);
|
||||
|
||||
//音频测试MIC频响开启, ch 对应目标的通道
|
||||
void audio_enc_mpt_fre_response_open(u16 ch);
|
||||
|
||||
//音频测试MIC频响关闭
|
||||
void audio_enc_mpt_fre_response_close(void);
|
||||
|
||||
#endif /*__AUDIO_ENC_MPT_FRE_RESPONE_H_*/
|
||||
|
||||
43
apps/earphone/include/bt_background.h
Normal file
43
apps/earphone/include/bt_background.h
Normal file
@ -0,0 +1,43 @@
|
||||
#ifndef BT_BACKGROUND_H
|
||||
#define BT_BACKGROUND_H
|
||||
|
||||
|
||||
#include "generic/typedef.h"
|
||||
|
||||
bool bt_in_background();
|
||||
|
||||
|
||||
void bt_switch_to_foreground(int action, bool exit_curr_app);
|
||||
|
||||
|
||||
int bt_switch_to_background();
|
||||
|
||||
|
||||
void bt_stop_a2dp_slience_detect();
|
||||
|
||||
|
||||
void bt_start_a2dp_slience_detect(int ingore_packet_num);
|
||||
|
||||
|
||||
int bt_background_event_probe_handler(struct bt_event *bt);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
48
apps/earphone/include/bt_ble.h
Normal file
48
apps/earphone/include/bt_ble.h
Normal file
@ -0,0 +1,48 @@
|
||||
#ifndef APP_BT_BLE_H
|
||||
#define APP_BT_BLE_H
|
||||
|
||||
#include "typedef.h"
|
||||
|
||||
// #define ADV_RSP_PACKET_MAX 31
|
||||
#define ADV_RAND_MAX 7
|
||||
|
||||
// typedef struct {
|
||||
// u16 pid; //厂家id,默认用杰理的id (0x5d6)
|
||||
// u8 private_data[17];//厂家自定义数据内容
|
||||
|
||||
// } manufacturer_data_t;
|
||||
|
||||
enum {
|
||||
ICON_TYPE_INQUIRY = 0,
|
||||
ICON_TYPE_CONNECTED,
|
||||
ICON_TYPE_RECONNECT,
|
||||
ICON_TYPE_PRE_DEV,
|
||||
};
|
||||
|
||||
|
||||
enum {
|
||||
ADV_ST_NULL,
|
||||
ADV_ST_PRE1,
|
||||
ADV_ST_PRE2,
|
||||
ADV_ST_INQUIRY,
|
||||
ADV_ST_CONN,
|
||||
ADV_ST_RECONN,
|
||||
ADV_ST_DISMISS,
|
||||
ADV_ST_FAST_DISMISS,
|
||||
ADV_ST_END,
|
||||
};
|
||||
|
||||
extern void bt_ble_icon_set(u8 *info, u8 len);
|
||||
extern u8 bt_ble_get_adv_enable(void);
|
||||
extern void bt_ble_icon_open(u8 type);
|
||||
extern void bt_ble_icon_close(u8 dismiss_flag);
|
||||
extern void bt_ble_icon_set_comm_address(u8 *addr);
|
||||
extern void bt_ble_icon_reset(void);
|
||||
extern void bt_ble_set_control_en(u8 en);
|
||||
extern void bt_ble_icon_slave_en(u8 en);
|
||||
extern u8 bt_ble_icon_get_adv_state(void);
|
||||
extern void bt_ble_icon_role_switch(u8 role);
|
||||
extern void bt_ble_icon_state_sniff(u8 state);
|
||||
|
||||
#endif
|
||||
|
||||
26
apps/earphone/include/bt_emitter.h
Normal file
26
apps/earphone/include/bt_emitter.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef _BT_EMITTER_H
|
||||
#define _BT_EMITTER_H
|
||||
|
||||
|
||||
extern void bt_search_device(void);
|
||||
extern void emitter_search_noname(u8 status, u8 *addr, u8 *name);
|
||||
extern u8 bt_emitter_stu_set(u8 *addr, u8 on);
|
||||
extern u8 bt_emitter_stu_get(void);
|
||||
extern int bt_emitter_mic_open(void);
|
||||
extern void bt_emitter_mic_close(void);
|
||||
extern int bt_emitter_iis_open(void);
|
||||
extern void bt_emitter_iis_close(void);
|
||||
extern void emitter_media_source(u8 *addr, u8 source, u8 en);
|
||||
extern u8 emitter_search_result(char *name, u8 name_len, u8 *addr, u32 dev_class, char rssi);
|
||||
extern void emitter_search_stop(u8 result);
|
||||
extern void emitter_media_source(u8 *addr, u8 source, u8 en);
|
||||
extern void bt_emitter_receiver_sw();
|
||||
extern u8 bt_emitter_pp(u8 pp);
|
||||
extern void emitter_or_receiver_switch(u8 flag);
|
||||
extern u8 bt_emitter_role_get();
|
||||
extern void bt_emitter_start_search_device();
|
||||
extern void bt_emitter_stop_search_device();
|
||||
extern void emitter_open(u8 source);
|
||||
extern void emitter_close(u8 source);
|
||||
|
||||
#endif
|
||||
194
apps/earphone/include/bt_tws.h
Normal file
194
apps/earphone/include/bt_tws.h
Normal file
@ -0,0 +1,194 @@
|
||||
#ifndef APP_BT_TWS_H
|
||||
#define APP_BT_TWS_H
|
||||
|
||||
#include "classic/tws_api.h"
|
||||
#include "classic/tws_event.h"
|
||||
#include "system/includes.h"
|
||||
|
||||
#define TWS_FUNC_ID_VOL_SYNC TWS_FUNC_ID('V', 'O', 'L', 'S')
|
||||
#define TWS_FUNC_ID_VBAT_SYNC TWS_FUNC_ID('V', 'B', 'A', 'T')
|
||||
#define TWS_FUNC_ID_CHARGE_SYNC TWS_FUNC_ID('C', 'H', 'G', 'S')
|
||||
#define TWS_FUNC_ID_BOX_SYNC TWS_FUNC_ID('B', 'O', 'X', 'S')
|
||||
#define TWS_FUNC_ID_AI_DMA_RAND TWS_FUNC_ID('A', 'I', 'D', 'M')
|
||||
#define TWS_FUNC_ID_AI_SPEECH_STOP TWS_FUNC_ID('A', 'I', 'S', 'T')
|
||||
#define TWS_FUNC_ID_APP_MODE TWS_FUNC_ID('M', 'O', 'D', 'E')
|
||||
#define TWS_FUNC_ID_AI_SYNC TWS_FUNC_ID('A', 'I', 'P', 'A')
|
||||
#define TWS_FUNC_ID_EAR_DETECT_SYNC TWS_FUNC_ID('E', 'D', 'E', 'T')
|
||||
#define TWS_FUNC_ID_LL_SYNC_STATE TWS_FUNC_ID('L', 'L', 'S', 'S')
|
||||
#define TWS_FUNC_ID_TUYA_STATE TWS_FUNC_ID('T', 'U', 'Y', 'A')
|
||||
|
||||
enum {
|
||||
DEBUG_LINK_PAGE_STATE = 0,
|
||||
DEBUG_LINK_INQUIRY_STATE,
|
||||
DEBUG_LINK_PAGE_SCAN_STATE,
|
||||
DEBUG_LINK_INQUIRY_SCAN_STATE,
|
||||
DEBUG_LINK_CONNECTION_STATE,
|
||||
DEBUG_LINK_PAGE_TWS_STATE,
|
||||
DEBUG_LINK_PAGE_SCAN_TWS_STATE,
|
||||
};
|
||||
enum {
|
||||
BT_TWS_STATUS_INIT_OK = 1,
|
||||
BT_TWS_STATUS_SEARCH_START,
|
||||
BT_TWS_STATUS_SEARCH_TIMEOUT,
|
||||
BT_TWS_STATUS_PHONE_CONN,
|
||||
BT_TWS_STATUS_PHONE_DISCONN,
|
||||
};
|
||||
|
||||
enum {
|
||||
SYNC_TONE_TWS_CONNECTED = 1,
|
||||
SYNC_TONE_PHONE_CONNECTED,
|
||||
SYNC_TONE_PHONE_DISCONNECTED,
|
||||
SYNC_TONE_PHONE_NUM,
|
||||
SYNC_TONE_PHONE_RING,
|
||||
SYNC_TONE_PHONE_NUM_RING,
|
||||
SYNC_TONE_MAX_VOL,
|
||||
SYNC_TONE_POWER_OFF,
|
||||
SYNC_TONE_ANC_ON,
|
||||
SYNC_TONE_ANC_OFF,
|
||||
SYNC_TONE_ANC_TRANS,
|
||||
SYNC_TONE_EARDET_IN,
|
||||
SYNC_TONE_VOICE_RECOGNIZE,
|
||||
SYNC_TONE_HEARING_AID_OPEN,
|
||||
SYNC_TONE_DHA_FITTING_CLOSE,
|
||||
SYNC_TONE_ICSD_ADT_SUSPEND,
|
||||
SYNC_TONE_ICSD_ADT_VOICE_STATE,
|
||||
SYNC_TONE_ICSD_ADT_OPEN,
|
||||
};
|
||||
|
||||
enum {
|
||||
SYNC_LED_STA_TWS_CONN,
|
||||
SYNC_LED_STA_PHONE_CONN,
|
||||
SYNC_LED_STA_PHONE_DISCONN,
|
||||
};
|
||||
|
||||
enum {
|
||||
SYNC_CMD_SHUT_DOWN_TIME,
|
||||
SYNC_CMD_POWER_OFF_TOGETHER,
|
||||
SYNC_CMD_LOW_LATENCY_ENABLE,
|
||||
SYNC_CMD_LOW_LATENCY_DISABLE,
|
||||
SYNC_CMD_EARPHONE_CHAREG_START,
|
||||
SYNC_CMD_IRSENSOR_EVENT_NEAR,
|
||||
SYNC_CMD_IRSENSOR_EVENT_FAR,
|
||||
#if(USE_DMA_TONE)
|
||||
SYNC_CMD_CUT_TWS_TONE, //断开对耳提示音
|
||||
SYNC_CMD_START_SPEECH_TONE,//AI键提示音
|
||||
SYNC_CMD_DMA_CONNECTED_ALL_FINISH_TONE, //AI连接成功
|
||||
SYNC_CMD_NEED_BT_TONE, //需要连接蓝牙
|
||||
SYNC_CMD_PLEASE_OPEN_XIAODU_TONE,//请打开小度
|
||||
#endif
|
||||
#if(RCSP_ADV_EN)
|
||||
SYNC_CMD_SYNC_ADV_SETTING,
|
||||
SYNC_CMD_ADV_COMMON_SETTING_SYNC,
|
||||
SYNC_CMD_APP_RESET_LED_UI,
|
||||
SYNC_CMD_MUSIC_INFO,
|
||||
SYNC_CMD_RCSP_AUTH_RES,
|
||||
SYNC_CMD_MUSIC_PLAYER_STATE,
|
||||
SYNC_CMD_MUSIC_PLAYER_TIEM_EN,
|
||||
#endif
|
||||
SYNC_CMD_OPUS_CLOSE,
|
||||
};
|
||||
|
||||
enum {
|
||||
TWS_SYNC_VOL = 0,
|
||||
TWS_SYNC_VBAT,
|
||||
TWS_SYNC_CHG,
|
||||
TWS_SYNC_CALL_VOL,
|
||||
TWS_SYNC_PBG_INFO,
|
||||
TWS_SYNC_ADSP_UART_CMD,
|
||||
TWS_APP_DATA_SEND,
|
||||
TWS_AI_DMA_RAND,
|
||||
TWS_DATA_SEND,
|
||||
|
||||
TWS_UPDATE_START,
|
||||
TWS_UPDATE_RESULT_EXCHANGE,
|
||||
TWS_UPDATE_RESULT_EXCHANGE_RES,
|
||||
TWS_UPDATE_OVER,
|
||||
TWS_UPDATE_OVER_CONFIRM,
|
||||
TWS_UPDATE_OVER_CONFIRM_REQ,
|
||||
TWS_UPDATE_OVER_CONFIRM_RES,
|
||||
TWS_UPDATE_VERIFY,
|
||||
|
||||
TWS_AI_A2DP_DROP_FRAME_CTL,
|
||||
};
|
||||
struct tws_sync_info_t {
|
||||
u8 type;
|
||||
union {
|
||||
s8 volume_lev;
|
||||
u16 vbat_lev;
|
||||
u8 chg_lev;
|
||||
u8 adsp_cmd[2];
|
||||
u8 conn_type;
|
||||
u8 data[9];
|
||||
u8 data_large[32];
|
||||
} u;
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct tws_sync_big_info_t {
|
||||
u8 type;
|
||||
u8 sub_type;
|
||||
union {
|
||||
u8 pbg_info[36];
|
||||
} u;
|
||||
};
|
||||
|
||||
|
||||
typedef struct time_stamp_bt_name {
|
||||
u8 bt_name[32];
|
||||
u32 time_stamp;
|
||||
} tws_time_stamp_bt_name;
|
||||
|
||||
|
||||
#define TWS_WAIT_CONN_TIMEOUT (400)
|
||||
|
||||
#define TWS_SYNC_TIME_DO 400
|
||||
// #define TWS_CON_SUPER_TIMEOUT 8000
|
||||
#define TWS_CON_SEARCH_TIMEOUT 0x07//(n*1.28s)
|
||||
|
||||
|
||||
char bt_tws_get_local_channel();
|
||||
|
||||
int bt_tws_connction_status_event_handler(struct bt_event *evt);
|
||||
|
||||
int bt_tws_poweron();
|
||||
|
||||
int bt_tws_poweroff();
|
||||
|
||||
int bt_tws_start_search_sibling();
|
||||
|
||||
void bt_tws_hci_event_connect();
|
||||
|
||||
bool get_tws_phone_connect_state(void);
|
||||
|
||||
int bt_tws_phone_connected();
|
||||
|
||||
void bt_tws_phone_page_timeout();
|
||||
|
||||
void bt_tws_phone_connect_timeout();
|
||||
|
||||
void bt_tws_phone_disconnected();
|
||||
|
||||
int bt_tws_sync_phone_num(void *priv);
|
||||
|
||||
int bt_tws_sync_led_status();
|
||||
|
||||
int get_bt_tws_connect_status();
|
||||
u8 get_bt_tws_discon_dly_state();
|
||||
|
||||
void bt_tws_sync_volume();
|
||||
|
||||
u8 tws_network_audio_was_started(void);
|
||||
|
||||
void tws_network_local_audio_start(void);
|
||||
|
||||
u32 bt_tws_future_slot_time(u32 msecs);
|
||||
|
||||
void bt_tws_play_tone_at_same_time(int tone_name, int msec);
|
||||
void bt_tws_led_state_sync(int led_state, int msec);
|
||||
bool get_tws_sibling_connect_state(void);
|
||||
|
||||
void tws_cancle_all_noconn();
|
||||
void tws_sniff_controle_check_enable(void);
|
||||
void tws_sniff_controle_check_disable(void);
|
||||
#endif
|
||||
41
apps/earphone/include/default_event_handler.h
Normal file
41
apps/earphone/include/default_event_handler.h
Normal file
@ -0,0 +1,41 @@
|
||||
#ifndef DEFAULT_EVENT_HANDLER_H
|
||||
#define DEFAULT_EVENT_HANDLER_H
|
||||
|
||||
|
||||
#include "system/includes.h"
|
||||
|
||||
|
||||
void default_event_handler(struct sys_event *event);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
272
apps/earphone/include/earphone.h
Normal file
272
apps/earphone/include/earphone.h
Normal file
@ -0,0 +1,272 @@
|
||||
#ifndef EARPHONE_H
|
||||
#define EARPHONE_H
|
||||
|
||||
#include "system/includes.h"
|
||||
///搜索完整结束的事件
|
||||
#define HCI_EVENT_INQUIRY_COMPLETE 0x01
|
||||
///连接完成的事件
|
||||
#define HCI_EVENT_CONNECTION_COMPLETE 0x03
|
||||
///断开的事件,会有一些错误码区分不同情况的断开
|
||||
#define HCI_EVENT_DISCONNECTION_COMPLETE 0x05
|
||||
///连接中请求pin code的事件,给这个事件上来目前是做了一个确认的操作
|
||||
#define HCI_EVENT_PIN_CODE_REQUEST 0x16
|
||||
///连接设备发起了简易配对加密的连接
|
||||
#define HCI_EVENT_IO_CAPABILITY_REQUEST 0x31
|
||||
///这个事件上来目前是做了一个连接确认的操作
|
||||
#define HCI_EVENT_USER_CONFIRMATION_REQUEST 0x33
|
||||
///这个事件是需要输入6个数字的连接消息,一般在键盘应用才会有
|
||||
#define HCI_EVENT_USER_PASSKEY_REQUEST 0x34
|
||||
///<可用于显示输入passkey位置 value 0:start 1:enrer 2:earse 3:clear 4:complete
|
||||
#define HCI_EVENT_USER_PRESSKEY_NOTIFICATION 0x3B
|
||||
///杰理自定义的事件,上电回连的时候读不到VM的地址。
|
||||
#define HCI_EVENT_VENDOR_NO_RECONN_ADDR 0xF8
|
||||
///杰理自定义的事件,有测试盒连接的时候会有这个事件
|
||||
#define HCI_EVENT_VENDOR_REMOTE_TEST 0xFE
|
||||
///杰理自定义的事件,可以认为是断开之后协议栈资源释放完成的事件
|
||||
#define BTSTACK_EVENT_HCI_CONNECTIONS_DELETE 0x6D
|
||||
|
||||
|
||||
#define ERROR_CODE_SUCCESS 0x00
|
||||
///<回连超时退出消息
|
||||
#define ERROR_CODE_PAGE_TIMEOUT 0x04
|
||||
///<连接过程中linkkey错误
|
||||
#define ERROR_CODE_AUTHENTICATION_FAILURE 0x05
|
||||
///<连接过程中linkkey丢失,手机删除了linkkey,回连就会出现一次
|
||||
#define ERROR_CODE_PIN_OR_KEY_MISSING 0x06
|
||||
///<连接超时,一般拿远就会断开有这个消息
|
||||
#define ERROR_CODE_CONNECTION_TIMEOUT 0x08
|
||||
///<连接个数超出了资源允许
|
||||
#define ERROR_CODE_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE_EXCEEDED 0x0A
|
||||
///<回连的时候发现设备还没释放我们这个地址,一般直接断电开机回连会出现
|
||||
#define ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS 0x0B
|
||||
///<需要回连的设备资源不够。有些手机连了一个设备之后就会用这个拒绝。或者其它的资源原因
|
||||
#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_LIMITED_RESOURCES 0x0D
|
||||
///<有些可能只允许指定地址连接的,可能会用这个去拒绝连接。或者我们设备的地址全0或者有问题
|
||||
#define ERROR_CODE_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE_BD_ADDR 0x0F
|
||||
///<连接的时间太长了,手机要断开了。这种容易复现可以联系我们分析
|
||||
#define ERROR_CODE_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10
|
||||
///<经常用的连接断开消息。就认为断开就行
|
||||
#define ERROR_CODE_REMOTE_USER_TERMINATED_CONNECTION 0x13
|
||||
///<正常的断开消息,本地L2CAP资源释放之后就会发这个值上来了
|
||||
#define ERROR_CODE_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16
|
||||
///<回连的时候发现设备两次role switch失败了,发断开在重新连接
|
||||
#define ERROR_CODE_ROLE_SWITCH_FAILED 0x35
|
||||
///杰理自定义,在回连的过程中使用page cancel命令主动取消成功会有这个命令
|
||||
#define CUSTOM_BB_AUTO_CANCEL_PAGE 0xFD //// app cancle page
|
||||
///杰理自定义,库里面有些功能需要停止page的时候会有。比如page的时候来了电话
|
||||
#define BB_CANCEL_PAGE 0xFE //// bb cancle page
|
||||
|
||||
|
||||
#if (TCFG_USER_BLE_ENABLE && (CONFIG_BT_MODE == BT_NORMAL))
|
||||
|
||||
#if RCSP_ADV_EN
|
||||
|
||||
int rcsp_earphone_state_init();
|
||||
int rcsp_earphone_state_set_page_scan_enable();
|
||||
int rcsp_earphone_state_get_connect_mac_addr();
|
||||
int rcsp_earphone_state_cancel_page_scan();
|
||||
int rcsp_earphone_state_enter_soft_poweroff();
|
||||
int rcsp_earphone_state_tws_init(int paired);
|
||||
int rcsp_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int rcsp_sys_event_handler_specific(struct sys_event *event);
|
||||
|
||||
#define EARPHONE_STATE_INIT() rcsp_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() rcsp_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() rcsp_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() rcsp_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() rcsp_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) rcsp_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) rcsp_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) rcsp_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
#elif TRANS_DATA_EN
|
||||
|
||||
int trans_data_earphone_state_init();
|
||||
int trans_data_earphone_state_set_page_scan_enable();
|
||||
int trans_data_earphone_state_get_connect_mac_addr();
|
||||
int trans_data_earphone_state_cancel_page_scan();
|
||||
int trans_data_earphone_state_enter_soft_poweroff();
|
||||
int trans_data_earphone_state_tws_init(int paired);
|
||||
int trans_data_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int trans_data_sys_event_handler_specific(struct sys_event *event);
|
||||
|
||||
#define EARPHONE_STATE_INIT() trans_data_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() trans_data_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() trans_data_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() trans_data_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() trans_data_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) trans_data_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) trans_data_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) trans_data_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
#elif BLE_HID_EN
|
||||
|
||||
int ble_hid_earphone_state_init();
|
||||
int ble_hid_earphone_state_set_page_scan_enable();
|
||||
int ble_hid_earphone_state_get_connect_mac_addr();
|
||||
int ble_hid_earphone_state_cancel_page_scan();
|
||||
int ble_hid_earphone_state_enter_soft_poweroff();
|
||||
int ble_hid_earphone_state_tws_init(int paired);
|
||||
int ble_hid_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int ble_hid_sys_event_handler_specific(struct sys_event *event);
|
||||
|
||||
#define EARPHONE_STATE_INIT() ble_hid_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() ble_hid_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() ble_hid_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() ble_hid_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() ble_hid_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) ble_hid_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) ble_hid_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) ble_hid_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
|
||||
|
||||
#elif LL_SYNC_EN
|
||||
|
||||
int ll_sync_earphone_state_init();
|
||||
int ll_sync_earphone_state_set_page_scan_enable();
|
||||
int ll_sync_earphone_state_get_connect_mac_addr();
|
||||
int ll_sync_earphone_state_cancel_page_scan();
|
||||
int ll_sync_earphone_state_enter_soft_poweroff();
|
||||
int ll_sync_earphone_state_tws_init(int paired);
|
||||
int ll_sync_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int ll_sync_sys_event_handler_specific(struct sys_event *event);
|
||||
|
||||
#define EARPHONE_STATE_INIT() ll_sync_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() ll_sync_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() ll_sync_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() ll_sync_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() ll_sync_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) ll_sync_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) ll_sync_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) ll_sync_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
#elif TUYA_DEMO_EN
|
||||
int tuya_earphone_state_init();
|
||||
int tuya_earphone_state_set_page_scan_enable();
|
||||
int tuya_earphone_state_get_connect_mac_addr();
|
||||
int tuya_earphone_state_cancel_page_scan();
|
||||
int tuya_earphone_state_enter_soft_poweroff();
|
||||
int tuya_earphone_state_tws_init(int paired);
|
||||
int tuya_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int tuya_sys_event_handler_specific(struct sys_event *event);
|
||||
|
||||
#define EARPHONE_STATE_INIT() tuya_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() tuya_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() tuya_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() tuya_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() tuya_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) tuya_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) tuya_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) tuya_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
|
||||
#elif (AI_APP_PROTOCOL | LE_AUDIO_EN)
|
||||
|
||||
int app_protocol_sys_event_handler(struct sys_event *event);
|
||||
#define EARPHONE_STATE_INIT() do { } while(0)
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() do { } while(0)
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() do { } while(0)
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() do { } while(0)
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_INIT(a) do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) do { } while(0)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) app_protocol_sys_event_handler(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
#elif TCFG_WIRELESS_MIC_ENABLE
|
||||
#define EARPHONE_STATE_INIT() do { } while(0)
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() do { } while(0)
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() do { } while(0)
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() do { } while(0)
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_INIT(a) do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) do { } while(0)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) do { } while(0)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
|
||||
#else
|
||||
int adv_earphone_state_init();
|
||||
int adv_earphone_state_set_page_scan_enable();
|
||||
int adv_earphone_state_get_connect_mac_addr();
|
||||
int adv_earphone_state_cancel_page_scan();
|
||||
int adv_earphone_state_enter_soft_poweroff();
|
||||
int adv_earphone_state_tws_init(int paired);
|
||||
int adv_earphone_state_tws_connected(int first_pair, u8 *comm_addr);
|
||||
int adv_sys_event_handler_specific(struct sys_event *event);
|
||||
int adv_earphone_state_sniff(u8 state);
|
||||
int adv_earphone_state_role_switch(u8 role);
|
||||
|
||||
#define EARPHONE_STATE_INIT() adv_earphone_state_init()
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() adv_earphone_state_set_page_scan_enable()
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() adv_earphone_state_get_connect_mac_addr()
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() adv_earphone_state_cancel_page_scan()
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() adv_earphone_state_enter_soft_poweroff()
|
||||
#define EARPHONE_STATE_TWS_INIT(a) adv_earphone_state_tws_init(a)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) adv_earphone_state_tws_connected(a,b)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) adv_sys_event_handler_specific(a)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a) adv_earphone_state_sniff(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a) adv_earphone_state_role_switch(a)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#else
|
||||
|
||||
#define EARPHONE_STATE_INIT() do { } while(0)
|
||||
#define EARPHONE_STATE_SET_PAGE_SCAN_ENABLE() do { } while(0)
|
||||
#define EARPHONE_STATE_GET_CONNECT_MAC_ADDR() do { } while(0)
|
||||
#define EARPHONE_STATE_CANCEL_PAGE_SCAN() do { } while(0)
|
||||
#define EARPHONE_STATE_ENTER_SOFT_POWEROFF() do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_INIT(a) do { } while(0)
|
||||
#define EARPHONE_STATE_TWS_CONNECTED(a, b) do { } while(0)
|
||||
#define SYS_EVENT_HANDLER_SPECIFIC(a) do { } while(0)
|
||||
#define SYS_EVENT_REMAP(a) 0
|
||||
#define EARPHONE_STATE_SNIFF(a)
|
||||
#define EARPHONE_STATE_ROLE_SWITCH(a)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
extern void sys_auto_shut_down_enable(void);
|
||||
|
||||
extern void sys_auto_shut_down_disable(void);
|
||||
|
||||
extern int bt_in_background_event_handler(struct sys_event *event);
|
||||
|
||||
extern u8 bt_app_exit_check(void);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
100
apps/earphone/include/key_event_deal.h
Normal file
100
apps/earphone/include/key_event_deal.h
Normal file
@ -0,0 +1,100 @@
|
||||
#ifndef __KEY_EVENT_DEAL_H__
|
||||
#define __KEY_EVENT_DEAL_H__
|
||||
|
||||
#include "typedef.h"
|
||||
#include "bt_profile_cfg.h"
|
||||
#include "system/event.h"
|
||||
|
||||
enum {
|
||||
KEY_POWER_ON = KEY_EVENT_MAX,
|
||||
KEY_POWEROFF,
|
||||
KEY_POWEROFF_HOLD,
|
||||
KEY_MUSIC_PP,
|
||||
KEY_MUSIC_PREV,
|
||||
KEY_MUSIC_NEXT,
|
||||
KEY_VOL_UP,
|
||||
KEY_VOL_DOWN,
|
||||
KEY_CALL_LAST_NO,
|
||||
KEY_CALL_HANG_UP,
|
||||
KEY_CALL_ANSWER,
|
||||
KEY_CALL_ANSWER_UP,
|
||||
KEY_OPEN_SIRI,
|
||||
KEY_HID_CONTROL,
|
||||
KEY_LOW_LANTECY,
|
||||
KEY_MODE_SWITCH,
|
||||
|
||||
KEY_EQ_MODE,
|
||||
KEY_THIRD_CLICK,
|
||||
|
||||
KEY_MUSIC_FF,
|
||||
KEY_MUSIC_FR,
|
||||
KEY_MUSIC_PLAYER_START,
|
||||
KEY_MUSIC_PLAYER_END,
|
||||
KEY_MUSIC_PLAYER_DEC_ERR,
|
||||
KEY_MUSIC_DEVICE_TONE_END,
|
||||
KEY_MUSIC_PLAYER_QUIT,
|
||||
KEY_MUSIC_PLAYER_AUTO_NEXT,
|
||||
KEY_MUSIC_PLAYER_PLAY_FIRST,
|
||||
KEY_MUSIC_PLAYER_PLAY_LAST,
|
||||
KEY_MUSIC_CHANGE_REPEAT,
|
||||
KEY_MUSIC_CHANGE_DEV,
|
||||
KEY_MUSIC_AUTO_NEXT_DEV,
|
||||
KEY_MUSIC_CHANGE_DEV_REPEAT,
|
||||
KEY_MUSIC_SET_PITCH,
|
||||
KEY_MUSIC_SET_SPEED,
|
||||
KEY_MUSIC_PLAYE_BY_DEV_FILENUM,
|
||||
KEY_MUSIC_PLAYE_BY_DEV_SCLUST,
|
||||
KEY_MUSIC_PLAYE_BY_DEV_PATH,
|
||||
KEY_MUSIC_DELETE_FILE,
|
||||
KEY_MUSIC_PLAYE_NEXT_FOLDER,
|
||||
KEY_MUSIC_PLAYE_PREV_FOLDER,
|
||||
KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH,
|
||||
KEY_MUSIC_PLAYER_AB_REPEAT_SWITCH,
|
||||
|
||||
KEY_SEND_SPEECH_START,
|
||||
KEY_SEND_SPEECH_STOP,
|
||||
#if (BT_FOR_APP_EN)
|
||||
KEY_AI_DEC_SUSPEND,
|
||||
KEY_AI_DEC_RESUME,
|
||||
|
||||
#endif
|
||||
|
||||
KEY_EARTCH_ENABLE,
|
||||
KEY_EARTCH_DISABLE,
|
||||
KEY_ANC_SWITCH,
|
||||
KEY_ANC_EAR_ADAPTIVE,
|
||||
KEY_ANC_COEFF_SWITCH,
|
||||
KEY_MUSIC_EFF, //播歌音效切换
|
||||
KEY_PHONE_PITCH,//通话上行 变声切换
|
||||
KEY_HEARING_AID_TOGGLE,//辅听功能开关
|
||||
|
||||
MSG_HALF_SECOND,
|
||||
KEY_CLEAN_PHONE_INFO,
|
||||
KEY_CLEAN_PHONE_INFO_HOLD,
|
||||
KEY_CLEAN_PHONE_INFO_UP,
|
||||
|
||||
KEY_SPATIAL_EFFECT_MODE_SWITCH, /*切换空间音频模式*/
|
||||
KEY_SPEAK_TO_CHAT_SWITCH, /*智能免摘开关*/
|
||||
KEY_WIND_NOISE_DET_SWITCH, /*风噪检测开关*/
|
||||
KEY_WIDE_AREA_TAP_SWITCH, /*广域点击开关*/
|
||||
KEY_ANC_MULT_SCENE_SWITCH, /*多滤波器切换demo*/
|
||||
KEY_NULL = 0xFF,
|
||||
};
|
||||
|
||||
enum {
|
||||
ONE_KEY_CTL_NEXT_PREV = 1,
|
||||
ONE_KEY_CTL_VOL_UP_DOWN,
|
||||
};
|
||||
|
||||
enum {
|
||||
EARTCH_STATE_IN,
|
||||
EARTCH_STATE_OUT,
|
||||
EARTCH_STATE_TRIM_OK,
|
||||
EARTCH_STATE_TRIM_ERR,
|
||||
};
|
||||
|
||||
extern void volume_up(u8 inc);
|
||||
extern void volume_down(u8 inc);
|
||||
extern int app_earphone_key_event_handler(struct sys_event *);
|
||||
|
||||
#endif
|
||||
31
apps/earphone/include/pbg_user.h
Normal file
31
apps/earphone/include/pbg_user.h
Normal file
@ -0,0 +1,31 @@
|
||||
#ifndef PBG_USER_H_
|
||||
#define PBG_USER_H_
|
||||
|
||||
#include "typedef.h"
|
||||
#include "key_event_deal.h"
|
||||
|
||||
enum {
|
||||
PBG_POS_IN_EAR = 0, //入耳
|
||||
PBG_POS_OUT_BOX, //出仓
|
||||
PBG_POS_IN_BOX, //在仓
|
||||
PBG_POS_NOT_EXIST, //不在线
|
||||
PBG_POS_KEEP_NOW = 0x0f, //维持,不改变
|
||||
PBG_POS_MAX, //
|
||||
};
|
||||
|
||||
|
||||
#define BD_ADDR_LEN 6
|
||||
typedef uint8_t bd_addr_t[BD_ADDR_LEN];
|
||||
|
||||
void pbg_user_set_tws_state(u8 conn_flag);
|
||||
void pbg_user_recieve_sync_info(u8 *sync_info);
|
||||
void pbg_user_mic_fixed_deal(u8 mode);
|
||||
void pbg_user_event_deal(struct pbg_event *evt);
|
||||
bool pbg_user_key_vaild(u8 *key_msg, struct sys_event *event);
|
||||
void pbg_user_ear_pos_sync(u8 left, u8 right);
|
||||
void pbg_user_battery_level_sync(u8 *dev_bat);
|
||||
int pbg_user_is_connected(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
157
apps/earphone/include/tone_player.h
Normal file
157
apps/earphone/include/tone_player.h
Normal file
@ -0,0 +1,157 @@
|
||||
#ifndef TONE_PLAYER_H
|
||||
#define TONE_PLAYER_H
|
||||
|
||||
#include "app_config.h"
|
||||
#include "tone_player_api.h"
|
||||
|
||||
#define TONE_NUM_0 SDFILE_RES_ROOT_PATH"tone/0.*"
|
||||
#define TONE_NUM_1 SDFILE_RES_ROOT_PATH"tone/1.*"
|
||||
#define TONE_NUM_2 SDFILE_RES_ROOT_PATH"tone/2.*"
|
||||
#define TONE_NUM_3 SDFILE_RES_ROOT_PATH"tone/3.*"
|
||||
#define TONE_NUM_4 SDFILE_RES_ROOT_PATH"tone/4.*"
|
||||
#define TONE_NUM_5 SDFILE_RES_ROOT_PATH"tone/5.*"
|
||||
#define TONE_NUM_6 SDFILE_RES_ROOT_PATH"tone/6.*"
|
||||
#define TONE_NUM_7 SDFILE_RES_ROOT_PATH"tone/7.*"
|
||||
#define TONE_NUM_8 SDFILE_RES_ROOT_PATH"tone/8.*"
|
||||
#define TONE_NUM_9 SDFILE_RES_ROOT_PATH"tone/9.*"
|
||||
#define TONE_BT_MODE SDFILE_RES_ROOT_PATH"tone/bt.*"
|
||||
#define TONE_BT_CONN SDFILE_RES_ROOT_PATH"tone/bt_conn.*"
|
||||
#define TONE_BT_DISCONN SDFILE_RES_ROOT_PATH"tone/bt_dconn.*"
|
||||
#define TONE_TWS_CONN SDFILE_RES_ROOT_PATH"tone/tws_conn.*"
|
||||
#define TONE_TWS_DISCONN SDFILE_RES_ROOT_PATH"tone/tws_dconn.*"
|
||||
#define TONE_LOW_POWER SDFILE_RES_ROOT_PATH"tone/low_power.*"
|
||||
#define TONE_POWER_OFF SDFILE_RES_ROOT_PATH"tone/power_off.*"
|
||||
#define TONE_POWER_ON SDFILE_RES_ROOT_PATH"tone/power_on.*"
|
||||
#define TONE_RING SDFILE_RES_ROOT_PATH"tone/ring.*"
|
||||
#define TONE_MAX_VOL SDFILE_RES_ROOT_PATH"tone/vol_max.*"
|
||||
#define TONE_ANC_OFF SDFILE_RES_ROOT_PATH"tone/anc_off.*"
|
||||
#define TONE_ANC_ON SDFILE_RES_ROOT_PATH"tone/anc_on.*"
|
||||
#define TONE_TRANSPARENCY SDFILE_RES_ROOT_PATH"tone/anc_trans.*"
|
||||
#define TONE_ANC_ADAPTIVE SDFILE_RES_ROOT_PATH"tone/adaptive.*"
|
||||
#define TONE_ANC_ADAPTIVE_COEFF SDFILE_RES_ROOT_PATH"tone/adap_coeff.*"
|
||||
#define TONE_ANC_NORMAL_COEFF SDFILE_RES_ROOT_PATH"tone/nor_coeff.*"
|
||||
#define TONE_EAR_CHECK SDFILE_RES_ROOT_PATH"tone/ear_check.*"
|
||||
#define TONE_MUSIC_MODE SDFILE_RES_ROOT_PATH"tone/music.*"
|
||||
#define TONE_PC_MODE SDFILE_RES_ROOT_PATH"tone/pc.*"
|
||||
#define TONE_SPKCHAT_OFF SDFILE_RES_ROOT_PATH"tone/spkchat_off.*"
|
||||
#define TONE_SPKCHAT_ON SDFILE_RES_ROOT_PATH"tone/spkchat_on.*"
|
||||
#define TONE_WCLICK_OFF SDFILE_RES_ROOT_PATH"tone/wclick_off.*"
|
||||
#define TONE_WCLICK_ON SDFILE_RES_ROOT_PATH"tone/wclick_on.*"
|
||||
#define TONE_WINDDET_OFF SDFILE_RES_ROOT_PATH"tone/winddet_off.*"
|
||||
#define TONE_WINDDET_ON SDFILE_RES_ROOT_PATH"tone/winddet_on.*"
|
||||
|
||||
|
||||
#define SINE_WTONE_NORAML 0
|
||||
#define SINE_WTONE_TWS_CONNECT 1
|
||||
#define SINE_WTONE_TWS_DISCONNECT 2
|
||||
#define SINE_WTONE_LOW_POWER 4
|
||||
#define SINE_WTONE_RING 5
|
||||
#define SINE_WTONE_MAX_VOLUME 6
|
||||
#define SINE_WTONE_ADSP 7
|
||||
#define SINE_WTONE_LOW_LATENRY_IN 8
|
||||
#define SINE_WTONE_LOW_LATENRY_OUT 9
|
||||
#define SINE_WTONE_ANC_ADAPTIVE_1 10
|
||||
#define SINE_WTONE_ANC_ADAPTIVE_2 11
|
||||
|
||||
#if CONFIG_USE_DEFAULT_SINE
|
||||
#undef TONE_TWS_CONN
|
||||
#define TONE_TWS_CONN DEFAULT_SINE_TONE(SINE_WTONE_TWS_CONNECT)
|
||||
#undef TONE_TWS_DISCONN
|
||||
#define TONE_TWS_DISCONN DEFAULT_SINE_TONE(SINE_WTONE_TWS_DISCONNECT)
|
||||
|
||||
#undef TONE_MAX_VOL
|
||||
#define TONE_MAX_VOL DEFAULT_SINE_TONE(SINE_WTONE_MAX_VOLUME)
|
||||
|
||||
#undef TONE_NORMAL
|
||||
#define TONE_NORMAL DEFAULT_SINE_TONE(SINE_WTONE_NORAML)
|
||||
#if BT_PHONE_NUMBER
|
||||
|
||||
#else
|
||||
#undef TONE_RING
|
||||
#define TONE_RING DEFAULT_SINE_TONE(SINE_WTONE_RING)
|
||||
#endif
|
||||
|
||||
#undef TONE_LOW_POWER
|
||||
#define TONE_LOW_POWER DEFAULT_SINE_TONE(SINE_WTONE_LOW_POWER)
|
||||
#endif
|
||||
|
||||
#define TONE_SIN_NORMAL DEFAULT_SINE_TONE(SINE_WTONE_NORAML)
|
||||
|
||||
#define TONE_LOW_LATENCY_IN DEFAULT_SINE_TONE(SINE_WTONE_LOW_LATENRY_IN)
|
||||
#define TONE_LOW_LATENCY_OUT DEFAULT_SINE_TONE(SINE_WTONE_LOW_LATENRY_OUT)
|
||||
|
||||
#define TONE_ANC_ADAPTIVE_LVL1 DEFAULT_SINE_TONE(SINE_WTONE_ANC_ADAPTIVE_1)
|
||||
#define TONE_ANC_ADAPTIVE_LVL2 DEFAULT_SINE_TONE(SINE_WTONE_ANC_ADAPTIVE_2)
|
||||
|
||||
|
||||
enum {
|
||||
IDEX_TONE_NUM_0,
|
||||
IDEX_TONE_NUM_1,
|
||||
IDEX_TONE_NUM_2,
|
||||
IDEX_TONE_NUM_3,
|
||||
IDEX_TONE_NUM_4,
|
||||
IDEX_TONE_NUM_5,
|
||||
IDEX_TONE_NUM_6,
|
||||
IDEX_TONE_NUM_7,
|
||||
IDEX_TONE_NUM_8,
|
||||
IDEX_TONE_NUM_9,
|
||||
IDEX_TONE_BT_MODE,
|
||||
IDEX_TONE_BT_CONN,
|
||||
IDEX_TONE_BT_DISCONN,
|
||||
IDEX_TONE_TWS_CONN,
|
||||
IDEX_TONE_TWS_DISCONN,
|
||||
IDEX_TONE_LOW_POWER,
|
||||
IDEX_TONE_POWER_OFF,
|
||||
IDEX_TONE_POWER_ON,
|
||||
IDEX_TONE_RING,
|
||||
IDEX_TONE_MAX_VOL,
|
||||
IDEX_TONE_NORMAL,
|
||||
IDEX_TONE_ANC_OFF,
|
||||
IDEX_TONE_ANC_ON,
|
||||
IDEX_TONE_TRANSPARCNCY,
|
||||
IDEX_TONE_ANC_ADAPTIVE,
|
||||
IDEX_TONE_ANC_ADAPTIVE_COEFF,
|
||||
IDEX_TONE_ANC_NORMAL_COEFF,
|
||||
|
||||
|
||||
IDEX_TONE_NONE = 0xFF,
|
||||
};
|
||||
|
||||
|
||||
|
||||
int tone_play_init(void);
|
||||
int tone_play_index(u8 index, u8 preemption);
|
||||
int tone_play_index_with_callback(u8 index, u8 preemption, void (*user_evt_handler)(void *priv), void *priv);
|
||||
int tone_play_index_no_tws(u8 index, u8 preemption);
|
||||
/*
|
||||
*@brief:提示音比较,确认目标提示音和正在播放的提示音是否一致
|
||||
*@return: 0 匹配
|
||||
* 非0 不匹配或者当前没有提示音播放
|
||||
*@note:通过提示音索引比较
|
||||
*/
|
||||
int tone_name_cmp_by_index(u8 index);
|
||||
|
||||
|
||||
// 按键提示音初始化
|
||||
int audio_key_tone_init(void);
|
||||
// 注销按键提示音播放
|
||||
void audio_key_tone_destroy(void);
|
||||
|
||||
// 播放正弦波数组
|
||||
int audio_key_tone_play_sin(struct audio_sin_param *sin, u8 sin_num, u8 preemption);
|
||||
// 播放文件
|
||||
int audio_key_tone_play_name(const char *name, u8 preemption);
|
||||
// 按序号播放文件 // 使用key_tone_index[]数组
|
||||
int audio_key_tone_play_index(u8 index, u8 preemption);
|
||||
// 按键提示音播放 // 默认播放数组中第一个
|
||||
void audio_key_tone_play(void);
|
||||
|
||||
// 检测按键提示音是否在播放
|
||||
int audio_key_tone_is_play(void);
|
||||
|
||||
// 设置按键提示音的音量
|
||||
void audio_key_tone_digvol_set(u8 volume);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
134
apps/earphone/include/ui/lcd_seg/lcd_seg3x9_driver.h
Normal file
134
apps/earphone/include/ui/lcd_seg/lcd_seg3x9_driver.h
Normal file
@ -0,0 +1,134 @@
|
||||
#ifndef _LCD_SEG3X9_DRV_H_
|
||||
#define _LCD_SEG3X9_DRV_H_
|
||||
|
||||
typedef struct _lcd_seg3x9_var {
|
||||
u8 bCoordinateX;
|
||||
u8 bFlashChar;
|
||||
u8 bShowBuff[4]; //[0] ~ [3]显示的数字/字母显示的所有段
|
||||
u32 bShowIcon; //每1bit对应LED4的1段, maybe icon > 7段
|
||||
u32 bFlashIcon; //闪烁标志
|
||||
} LCD_SEG3X9_VAR;
|
||||
|
||||
#define LCD_SEG3X9_USB BIT(0) //0: USB图标
|
||||
#define LCD_SEG3X9_SD BIT(1) //1: SD图标
|
||||
#define LCD_SEG3X9_VOL BIT(2) //2: SD图标
|
||||
#define LCD_SEG3X9_MHZ BIT(3) //3: FM图标
|
||||
#define LCD_SEG3X9_DIGIT1 BIT(4) //4: 数字1
|
||||
#define LCD_SEG3X9_2POINT BIT(5) //5: 冒号
|
||||
#define LCD_SEG3X9_DOT BIT(6) //6: 点
|
||||
|
||||
typedef u32 UI_LCD_SEG3X9_ICON;
|
||||
|
||||
struct lcd_seg3x9_pin {
|
||||
u8 pin_com[3];
|
||||
u8 pin_seg[9];
|
||||
};
|
||||
|
||||
enum LCD_SEG3X9_BIAS {
|
||||
LCD_SEG3X9_BIAS_OFF = 0,
|
||||
LCD_SEG3X9_BIAS_1_2, // 1/2 bias
|
||||
LCD_SEG3X9_BIAS_1_3, // 1/3 bias
|
||||
LCD_SEG3X9_BIAS_1_4, // 1/4 bias
|
||||
};
|
||||
|
||||
enum LCD_SEG3X9_COM_NUMBER {
|
||||
LCD_SEG3X9_COM_NUMBER_3 = 0,
|
||||
LCD_SEG3X9_COM_NUMBER_4,
|
||||
LCD_SEG3X9_COM_NUMBER_5,
|
||||
LCD_SEG3X9_COM_NUMBER_6,
|
||||
};
|
||||
|
||||
enum LCD_SEG3X9_VOLTAGE {
|
||||
LCD_SEG3X9_VOLTAGE_2_6V = 0, //000b
|
||||
LCD_SEG3X9_VOLTAGE_2_7V, //001b
|
||||
LCD_SEG3X9_VOLTAGE_2_8V, //010b
|
||||
LCD_SEG3X9_VOLTAGE_2_9V, //011b
|
||||
LCD_SEG3X9_VOLTAGE_3_0V, //100b
|
||||
LCD_SEG3X9_VOLTAGE_3_1V, //101b
|
||||
LCD_SEG3X9_VOLTAGE_3_2V, //110b
|
||||
LCD_SEG3X9_VOLTAGE_3_3V, //111b
|
||||
};
|
||||
|
||||
|
||||
struct lcd_seg3x9_platform_data {
|
||||
enum LCD_SEG3X9_VOLTAGE vlcd;
|
||||
enum LCD_SEG3X9_BIAS bias;
|
||||
struct lcd_seg3x9_pin pin_cfg;
|
||||
};
|
||||
|
||||
|
||||
//=================================================================================//
|
||||
// 关于LCD段码屏接线问题 //
|
||||
// 1.COM口需要从COM0按顺序开始连接, 如3COM, 则IO必须占用COM0/1/2,而不能COM1/2/3;
|
||||
// 2.COM0/1/2与LCD屏可以不按照对应需要接线, 如:
|
||||
// LCD_COM0 --> CHIP_COM2;
|
||||
// LCD_COM1 --> CHIP_COM1;
|
||||
// LCD_COM2 --> CHIP_COM0;
|
||||
// 但一般建议按顺序接线;
|
||||
// 2.SEG可以根据实际情况选择SEG0~SEG21接线, 如;
|
||||
// LCD_SEG0 --> CHIP_SEG7;
|
||||
// LCD_SEG1 --> CHIP_SEG8;
|
||||
// LCD_SEG2 --> CHIP_SEG9;
|
||||
//=================================================================================//
|
||||
#define LCD_SEG3X9_PLATFORM_DATA_BEGIN(data) \
|
||||
const struct lcd_seg3x9_platform_data data = {
|
||||
|
||||
#define LCD_SEG3X9_PLATFORM_DATA_END() \
|
||||
};
|
||||
|
||||
//UI LED7 API:
|
||||
//=================================================================================//
|
||||
// 模块初始化显示接口 //
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_init(const struct lcd_seg3x9_platform_data *_data);
|
||||
const struct ui_display_api *ui_lcd_seg3x9_init(void *para);
|
||||
//=================================================================================//
|
||||
// 设置显示坐标接口 //
|
||||
/*
|
||||
___ ___ ___
|
||||
|___| |___| |___|
|
||||
|___| |___| |___|
|
||||
---0------1------2----> X
|
||||
*/
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_setX(u8 X);
|
||||
|
||||
//=================================================================================//
|
||||
// 字符类显示接口 //
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_show_char(u8 chardata); //显示字符(追加方式)
|
||||
void lcd_seg3x9_flash_char_start(u8 index); //闪烁单个字符
|
||||
void lcd_seg3x9_flash_char_stop(u8 index); //取消闪烁单个字符
|
||||
void lcd_seg3x9_show_string(u8 *str); //显示字符串(追加方式)
|
||||
void lcd_seg3x9_show_string_reset_x(u8 *str); //显示字符串, x从0开始
|
||||
void lcd_seg3x9_show_string_align_right(u8 *str); //led7显示字符串(清屏&右方式)
|
||||
void lcd_seg3x9_show_string_align_left(u8 *str); //led7显示字符串(清屏&左方式)
|
||||
|
||||
//=================================================================================//
|
||||
// 数字类显示接口 //
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_show_number(u16 val); //显示数字(清屏&高位显示0)
|
||||
void lcd_seg3x9_show_number2(u16 val); //显示数字(清屏&高位不显示)
|
||||
void lcd_seg3x9_show_number_add(u16 val); //显示数字(追加方式)
|
||||
|
||||
//=================================================================================//
|
||||
// 图标类显示接口 //
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_show_icon(UI_LCD_SEG3X9_ICON icon); //显示单个图标(追加)
|
||||
void lcd_seg3x9_flash_icon(UI_LCD_SEG3X9_ICON icon); //闪烁单个图标(追加)
|
||||
|
||||
//=================================================================================//
|
||||
// 模式类类显示接口 //
|
||||
//=================================================================================//
|
||||
|
||||
//=================================================================================//
|
||||
// 清屏类显示接口 //
|
||||
//=================================================================================//
|
||||
void lcd_seg3x9_show_null(void); //清除所有显示(数字,字符串和图标)
|
||||
void lcd_seg3x9_clear_string(void); //清除显示数字和字母
|
||||
void lcd_seg3x9_clear_icon(UI_LCD_SEG3X9_ICON icon); //清除显示单个图标
|
||||
void lcd_seg3x9_clear_all_icon(void); //清除显示所有图标
|
||||
|
||||
|
||||
#endif /* #ifndef _LCD_SEG3X9_DRV_H_ */
|
||||
|
||||
363
apps/earphone/include/ui/lcd_simple/menu.h
Normal file
363
apps/earphone/include/ui/lcd_simple/menu.h
Normal file
@ -0,0 +1,363 @@
|
||||
|
||||
//generated by ResBuilder in 2011//
|
||||
|
||||
#ifndef _MENU_H_
|
||||
#define _MENU_H_
|
||||
|
||||
////StringResID Define Table////
|
||||
#define Chinese_Simplified 1
|
||||
#define Chinese_Traditional 2
|
||||
#define Japanese 3
|
||||
#define Korean 4
|
||||
#define English 5
|
||||
#define French 6
|
||||
#define German 7
|
||||
#define Italian 8
|
||||
#define Dutch 9
|
||||
#define Portuguese 10
|
||||
#define Spanish 11
|
||||
#define Swedish 12
|
||||
#define Czech 13
|
||||
#define Danish 14
|
||||
#define Polish 15
|
||||
#define Russian 16
|
||||
#define Turkey 17
|
||||
#define Hebrew 18
|
||||
#define Thai 19
|
||||
#define Hungarian 20
|
||||
#define Romanian 21
|
||||
#define Arabic 22
|
||||
|
||||
#define LANGUAGEID_SUM 22
|
||||
|
||||
|
||||
|
||||
////Multi Language Define Table////
|
||||
#define vplaym1 1
|
||||
#define mplay2 2
|
||||
#define mplay4 3
|
||||
#define mplay5 4
|
||||
#define vstopm1 5
|
||||
#define vstopm2 6
|
||||
#define udisk 7
|
||||
#define cdelfile 8
|
||||
#define cdelall 9
|
||||
#define mstop5 10
|
||||
#define vloopm1 11
|
||||
#define vloopm2 12
|
||||
#define vloopm3 13
|
||||
#define vloopm4 14
|
||||
#define vloopm5 15
|
||||
#define vloopm6 16
|
||||
#define meq1 17
|
||||
#define meq2 18
|
||||
#define meq3 19
|
||||
#define meq4 20
|
||||
#define meq5 21
|
||||
#define meq6 22
|
||||
#define meq7 23
|
||||
#define meq8 24
|
||||
#define recpara 25
|
||||
#define mrstop3 26
|
||||
#define rsetgain 27
|
||||
#define main2 28
|
||||
#define mbps 29
|
||||
#define msrate 30
|
||||
#define smain7 31
|
||||
#define mrbps0 32
|
||||
#define mrbps1 33
|
||||
#define mrbps2 34
|
||||
#define mrbps3 35
|
||||
#define mrbps4 36
|
||||
#define mrbps5 37
|
||||
#define mrbps6 38
|
||||
#define mrbps7 39
|
||||
#define mrbps8 40
|
||||
#define mrbps9 41
|
||||
#define mrbps10 42
|
||||
#define mrbps11 43
|
||||
#define srate48k 44
|
||||
#define srate32k 45
|
||||
#define srate24k 46
|
||||
#define srate16k 47
|
||||
#define srate12k 48
|
||||
#define record1 49
|
||||
#define record2 50
|
||||
#define record 51
|
||||
#define rsaving 52
|
||||
#define fmenu16 53
|
||||
#define sreplay1 54
|
||||
#define fmenu1 55
|
||||
#define fmenu15 56
|
||||
#define fmfreq 57
|
||||
#define fmenu2 58
|
||||
#define fmenu3 59
|
||||
#define smain1 60
|
||||
#define smain2 61
|
||||
#define smain3 62
|
||||
#define s_tools 63
|
||||
#define kvoice1 64
|
||||
#define kvoice2 65
|
||||
#define smain6 66
|
||||
#define smain8 67
|
||||
#define smain9 68
|
||||
#define slan1 69
|
||||
#define slan3 70
|
||||
#define slan4 71
|
||||
#define slan5 72
|
||||
#define slan2 73
|
||||
#define slan6 74
|
||||
#define slan7 75
|
||||
#define slan8 76
|
||||
#define slan9 77
|
||||
#define slan10 78
|
||||
#define slan11 79
|
||||
#define slan12 80
|
||||
#define slan13 81
|
||||
#define slan14 82
|
||||
#define slan15 83
|
||||
#define slan16 84
|
||||
#define slan17 85
|
||||
#define slan18 86
|
||||
#define slan19 87
|
||||
#define slan20 88
|
||||
#define slan21 89
|
||||
#define slan22 90
|
||||
#define smain4 91
|
||||
#define clock 92
|
||||
#define fmset 93
|
||||
#define alarmon 94
|
||||
#define alarmoff 95
|
||||
#define alarmtm 96
|
||||
#define alarmcyc 97
|
||||
#define alarmmus 98
|
||||
#define alarmvol 99
|
||||
#define ringonce 100
|
||||
#define ringday 101
|
||||
#define ringweek 102
|
||||
#define ringinl 103
|
||||
#define fm_rmon 104
|
||||
#define fm_rtue 105
|
||||
#define fm_rwed 106
|
||||
#define fm_rthu 107
|
||||
#define fm_rfri 108
|
||||
#define fm_rsat 109
|
||||
#define fm_rsun 110
|
||||
#define timingfmon 111
|
||||
#define timingfmoff 112
|
||||
#define fmrecordon 113
|
||||
#define fmrecordoff 114
|
||||
#define fmtime 115
|
||||
#define fm_manual 116
|
||||
#define fmautoload 117
|
||||
#define fm_switch 118
|
||||
#define fm_vol 119
|
||||
#define t_cal 120
|
||||
#define t_music 121
|
||||
#define t_record 122
|
||||
#define t_fm 123
|
||||
#define t_sys 124
|
||||
#define f_browse 125
|
||||
#define alarm1 126
|
||||
#define t_ebook 127
|
||||
#define sel_file 128
|
||||
#define play_set 129
|
||||
#define handplay 130
|
||||
#define autoplay 131
|
||||
#define playspeed 132
|
||||
|
||||
#define STRINGID_SUM 132
|
||||
|
||||
|
||||
|
||||
////BmpResID Define Table////
|
||||
#define CH_NOFILE 1
|
||||
#define CLOCK 2
|
||||
#define CLOCKA 3
|
||||
#define CONTRSTW 4
|
||||
#define DELLA 5
|
||||
#define DIRROOTA 6
|
||||
#define EBOOK 7
|
||||
#define EBOOKA 8
|
||||
#define ENGDELLA 9
|
||||
#define EN_NOFILE 10
|
||||
#define FM 11
|
||||
#define FMA 12
|
||||
#define MMP3 13
|
||||
#define MUSIC1 14
|
||||
#define MUSICA 15
|
||||
#define MWAV 16
|
||||
#define MWMA 17
|
||||
#define NOUDISK 18
|
||||
#define PMDSCOM 19
|
||||
#define RTC_NUM_0 20
|
||||
#define RTC_NUM_1 21
|
||||
#define RTC_NUM_2 22
|
||||
#define RTC_NUM_3 23
|
||||
#define RTC_NUM_4 24
|
||||
#define RTC_NUM_5 25
|
||||
#define RTC_NUM_6 26
|
||||
#define RTC_NUM_7 27
|
||||
#define RTC_NUM_8 28
|
||||
#define RTC_NUM_9 29
|
||||
#define RTC_NUM_A 30
|
||||
#define RTC_NUM_B 31
|
||||
#define RECORD1 32
|
||||
#define RECORDA 33
|
||||
#define SDMMC 34
|
||||
#define SIGNAL_1 35
|
||||
#define SIGNAL_2 36
|
||||
#define SIGNAL_3 37
|
||||
#define SIGNAL_4 38
|
||||
#define SIGNAL_5 39
|
||||
#define SIGNAL_6 40
|
||||
#define SYSTEM1 41
|
||||
#define SYSTEMA 42
|
||||
#define UDISK 43
|
||||
#define UDISKOUT 44
|
||||
#define ACTIVE 45
|
||||
#define ALARM 46
|
||||
#define ALARM_C 47
|
||||
#define ALARM_CA 48
|
||||
#define ALARM_O 49
|
||||
#define ALARM_OA 50
|
||||
#define ALARM_T 51
|
||||
#define ALARM_TA 52
|
||||
#define ALARM_V 53
|
||||
#define ALARM_VA 54
|
||||
#define ALMICON 55
|
||||
#define BATTERY01 56
|
||||
#define BATTERY02 57
|
||||
#define BATTERY03 58
|
||||
#define BATTERY04 59
|
||||
#define BATTERY05 60
|
||||
#define BATTERY06 61
|
||||
#define BIGBAT1 62
|
||||
#define BIGBAT2 63
|
||||
#define BIGBAT3 64
|
||||
#define BIGBAT4 65
|
||||
#define BIGBAT5 66
|
||||
#define BKCLR1 67
|
||||
#define BPS128 68
|
||||
#define BPS160 69
|
||||
#define BPS48 70
|
||||
#define BPS64 71
|
||||
#define BPS96 72
|
||||
#define C_NOSEL 73
|
||||
#define C_SEL 74
|
||||
#define CALENDAR 75
|
||||
#define CALENDAR1 76
|
||||
#define CALENDAR2 77
|
||||
#define CARDOUT 78
|
||||
#define CDEL_NO 79
|
||||
#define CDEL_YES 80
|
||||
#define CHNDEL 81
|
||||
#define CHNSAVE 82
|
||||
#define CHNWAIT 83
|
||||
#define CONTRSTB 84
|
||||
#define CYCLE1 85
|
||||
#define CYCLE2 86
|
||||
#define CYCLE3 87
|
||||
#define CYCLE4 88
|
||||
#define DELFILE 89
|
||||
#define DISCERR 90
|
||||
#define EDELFILE 91
|
||||
#define EFICON 92
|
||||
#define ENGCOUT 93
|
||||
#define ENGDEL 94
|
||||
#define ENGDICERR 95
|
||||
#define ENGNOCARD 96
|
||||
#define ENGNODISK 97
|
||||
#define ENGNOSPAC 98
|
||||
#define ENGSAVE 99
|
||||
#define ENGUOUT 100
|
||||
#define ENGWAIT 101
|
||||
#define ENOFILE 102
|
||||
#define EQCLAS 103
|
||||
#define EQDBB 104
|
||||
#define EQJAZZ 105
|
||||
#define EQNOR 106
|
||||
#define EQPOP 107
|
||||
#define EQROCK 108
|
||||
#define EQSOFT 109
|
||||
#define EQWOW 110
|
||||
#define FLASH 111
|
||||
#define FMUSIC 112
|
||||
#define FOLDER 113
|
||||
#define FOLDERM 114
|
||||
#define FQBAR 115
|
||||
#define FQBAR2 116
|
||||
#define GOODBYTE 117
|
||||
#define LARROW 118
|
||||
#define LINEIN1 119
|
||||
#define LINEIN2 120
|
||||
#define LINEINBIG 121
|
||||
#define LINEINXXX 122
|
||||
#define LOGOFM 123
|
||||
#define LOWBAT 124
|
||||
#define MICIN 125
|
||||
#define MLOOP1 126
|
||||
#define MLOOP2 127
|
||||
#define MLOOP3 128
|
||||
#define MLOOP4 129
|
||||
#define MLOOP5 130
|
||||
#define MLOOP6 131
|
||||
#define MP3_128 132
|
||||
#define MP3_16 133
|
||||
#define MP3_192 134
|
||||
#define MP3_24K 135
|
||||
#define MP3_256 136
|
||||
#define MP3_32 137
|
||||
#define MP3_320 138
|
||||
#define MP3_32K 139
|
||||
#define MP3_48 140
|
||||
#define MP3_48K 141
|
||||
#define MP3_64 142
|
||||
#define MP3_8 143
|
||||
#define MP3_96 144
|
||||
#define MREC 145
|
||||
#define MWAV128K 146
|
||||
#define MWAV176K 147
|
||||
#define MWAV192K 148
|
||||
#define MWAV256K 149
|
||||
#define MWAV32K 150
|
||||
#define MWAV353K 151
|
||||
#define MWAV384K 152
|
||||
#define MWAV64K 153
|
||||
#define MWMA128K 154
|
||||
#define MWMA176K 155
|
||||
#define MWMA192K 156
|
||||
#define MWMA32K 157
|
||||
#define MWMA64K 158
|
||||
#define MWMA96K 159
|
||||
#define NO_ICON 160
|
||||
#define NOCARD 161
|
||||
#define NOFILE 162
|
||||
#define NOMEMORY 163
|
||||
#define NONGZI 164
|
||||
#define OFF_SEL 165
|
||||
#define ON_SEL 166
|
||||
#define PAUSE 167
|
||||
#define PAUSE1 168
|
||||
#define RARROW 169
|
||||
#define REC_FILE 170
|
||||
#define RECSAVE 171
|
||||
#define SCANSD1 172
|
||||
#define SCANSDMMC 173
|
||||
#define SCANUD1 174
|
||||
#define SCANUDISK 175
|
||||
#define SLIDER 176
|
||||
#define SLIDER_P 177
|
||||
#define TOOLP 178
|
||||
#define TOOLPA 179
|
||||
#define UNACTIVE 180
|
||||
#define WAV_12K 181
|
||||
#define WAV_16K 182
|
||||
#define WAV_24K 183
|
||||
#define WAV_32K 184
|
||||
#define WAV_48K 185
|
||||
#define WAV_8K 186
|
||||
|
||||
#define BMPID_SUM 186
|
||||
|
||||
#endif
|
||||
76
apps/earphone/include/ui/lcd_simple/ui.h
Normal file
76
apps/earphone/include/ui/lcd_simple/ui.h
Normal file
@ -0,0 +1,76 @@
|
||||
#ifndef __LCDSIMULATOR_H__
|
||||
#define __LCDSIMULATOR_H__
|
||||
|
||||
#include "menu.h"
|
||||
#include "font/language_list.h"
|
||||
#include "typedef.h"
|
||||
|
||||
// #define USE_BLANK_FUNC 1
|
||||
// #define LCDPAGE 8
|
||||
// #define LCDCOLUMN 128
|
||||
// #define SCR_WIDTH LCDCOLUMN
|
||||
// #define SCR_HEIGHT (LCDPAGE*8)
|
||||
|
||||
#define MENUICONWIDTH 12 //菜单项目左边图标的宽度(象素)
|
||||
#define MENUITEMHEIGHT 16 //菜单项目的高度(象素)
|
||||
#define SCROLLBARWIDTH 6 //垂直滚动条的宽度(象素)
|
||||
#define MENUITEMSUMPERSCR (SCR_HEIGHT/MENUITEMHEIGHT) //每屏可显示的最大菜单项
|
||||
#define MENUITEMPAGEHEIGHT 2 //每个菜单项所占的页数 2个LCDPAGE --> 2*8=16个像素
|
||||
|
||||
#define RESFILESTARTADDRESS 0 //资源文件的起始地址
|
||||
|
||||
|
||||
#define PROGRESSLENGTH 100 //进度条长度(象素)
|
||||
#define SLIDERLENGTH 100 //滑动条长度(象素)
|
||||
#define SLIDERMOVESTEP 5 //滑动块的移动步长
|
||||
#define SLIDER_NOMOVE_TIMEEXIT 10 //滑动条不动超过此时间自动退出,(*0.5S)
|
||||
|
||||
#define MENUWAITTIME (8*2) //菜单界面不操作超过MENUWAITTIME时间则自动返回
|
||||
|
||||
#define ntohl(x) (unsigned long)((x>>24)|((x>>8)&0xff00)|(x<<24)|((x&0xff00)<<8))
|
||||
#define ntoh(x) (unsigned short int )((x>>8&0x00ff)|x<<8&0xff00)
|
||||
|
||||
//#pragma pack(1)
|
||||
typedef u8(* FUN)(u8 mode);
|
||||
|
||||
typedef struct _MENULIST {
|
||||
u8 ItemSum; //菜单项目总数
|
||||
u8 ActiveItemNum; //当前活动菜单项目序号:1--ItemSum
|
||||
u8 IconID[2]; //第一个为菜单选中时显示图标的ID号,第二个为菜单未选中时显示图标的ID号
|
||||
u16 TitleID; //菜单的标题字符串ID号,没有标题此值为0
|
||||
u16 *ItemString; //菜单项目对应的字符串ID号
|
||||
// FUN fun;
|
||||
} MENULIST;
|
||||
|
||||
//////函数声明//////
|
||||
|
||||
u8 TurnPixelReverse_Page(u8 startpage, u8 pagelen);
|
||||
u8 TurnPixelReverse_Rect(u8 left, u8 top, u8 right, u8 bottom);
|
||||
|
||||
void UI_MenuSelectOn(u8 showitemnum);
|
||||
void Scrol_String(u16 StringID);
|
||||
u8 SetScrollBar(u8 Start_x);
|
||||
u8 SetSlideBlock(u8 Start_x, u8 Start_y);
|
||||
|
||||
u8 UI_Slider(FUN gslider);
|
||||
u8 UI_Progress(u8 currentpos, u8 progress_y_pos, u8 progresslength);
|
||||
u8 SetSlider(u8 start_x, u8 start_y, u8 length);
|
||||
u8 SetProgress(u8 start_x, u8 start_y, u8 length);
|
||||
u8 ClearLcdBuf_Page(u8 startpage, u8 pagelen);
|
||||
u8 ClearLcdBuf_Rect(u8 left, u8 top, u8 right, u8 bottom);
|
||||
u8 draw_slider(s8 currentpos, u8 slider_y_pos, u8 sliderlength);
|
||||
#define UI_SLIDER_CURR_VALUE 0
|
||||
#define UI_SLIDER_DEC 1
|
||||
#define UI_SLIDER_INC 2
|
||||
|
||||
extern s8 MenuItemSelectOnNum; //当前屏幕活动page序号:0--(MENUITEMSUMPERSCR-1)
|
||||
extern s8 CurrentScreenNum; //当前所处屏幕数,从0序号开始
|
||||
extern u8 NeedScreenSumViaItem; //菜单项目总数将占用屏幕的屏数
|
||||
extern u8 LaseScreenRemainMenuItem; //最后一屏只需显示的菜单项目数
|
||||
extern u8 LanguageMode;
|
||||
|
||||
extern void clear_lcd();
|
||||
extern void draw_lcd(u8 start_page, u8 page_len);
|
||||
extern void clear_lcd_area(u8 start_page, u8 end_page);
|
||||
|
||||
#endif
|
||||
21
apps/earphone/include/ui/lcd_simple/ui_mainmenu.h
Normal file
21
apps/earphone/include/ui/lcd_simple/ui_mainmenu.h
Normal file
@ -0,0 +1,21 @@
|
||||
#ifndef __UI_MAINMENU_H__
|
||||
#define __UI_MAINMENU_H__
|
||||
|
||||
#define AUTORUNTIMEMAX 10
|
||||
#define TASKTOTLE 24 //任务总数
|
||||
#define SCREENSHOWTASKSUM 5 //屏幕需显示的任务图标
|
||||
//#define SHOWTASKSUM 8 //需显示的任务图标总数
|
||||
|
||||
typedef struct {
|
||||
u8 taskname[16]; //任务名
|
||||
u16 bmpID; //该任务在主界面显示的图标
|
||||
u16 strID; //该任务在主界面显示的字符串
|
||||
u8 showflag; //标识该任务是否显式的显示任务图标
|
||||
} TASKSTRUCT;
|
||||
|
||||
extern const TASKSTRUCT taskbuf[TASKTOTLE];
|
||||
extern u8 taskshow[TASKTOTLE];
|
||||
|
||||
u8 UI_mainmenu(s8 apprun);
|
||||
void findtaskexist(u8 tasksum);
|
||||
#endif
|
||||
150
apps/earphone/include/ui/lcd_spi/lcd_drive.h
Normal file
150
apps/earphone/include/ui/lcd_spi/lcd_drive.h
Normal file
@ -0,0 +1,150 @@
|
||||
#ifndef __SPI_LCD_DRIVER_H
|
||||
#define __SPI_LCD_DRIVER_H
|
||||
|
||||
|
||||
#include "asm/spi.h"
|
||||
|
||||
|
||||
#if (SPI_LCD_DEBUG_ENABLE == 0)
|
||||
#define lcd_d(...)
|
||||
#define lcd_w(...)
|
||||
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
|
||||
#elif (SPI_LCD_DEBUG_ENABLE == 1)
|
||||
#define lcd_d(...)
|
||||
#define lcd_w(fmt, ...) printf("[LCD WARNING]: "fmt, ##__VA_ARGS__)
|
||||
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
|
||||
#else
|
||||
#define lcd_d(fmt, ...) printf("[LCD DEBUG]: "fmt, ##__VA_ARGS__)
|
||||
#define lcd_w(fmt, ...) printf("[LCD WARNING]: "fmt, ##__VA_ARGS__)
|
||||
#define lcd_e(fmt, ...) printf("[LCD ERROR]: "fmt, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
// 两毫秒延时
|
||||
extern void delay_2ms(int cnt);
|
||||
#define delay2ms(t) delay_2ms(t)
|
||||
|
||||
|
||||
/* 定义初始化数据结构体 */
|
||||
typedef struct {
|
||||
u8 cmd; // 地址
|
||||
u8 cnt; // 数据个数
|
||||
u8 dat[64]; // 数据
|
||||
} InitCode;
|
||||
|
||||
#define REGFLAG_DELAY 0xFF
|
||||
|
||||
struct spi_lcd_init {
|
||||
char *name; // 名称
|
||||
u8 spi_pending;
|
||||
u8 soft_spi;
|
||||
u16 lcd_width;
|
||||
u16 lcd_height;
|
||||
u8 color_format;
|
||||
u8 interface;
|
||||
u8 column_addr_align;
|
||||
u8 row_addr_align;
|
||||
u8 backlight_status;
|
||||
u8 *dispbuf;
|
||||
u32 bufsize;
|
||||
InitCode *initcode; // 初始化代码
|
||||
u16 initcode_cnt; // 初始化代码条数
|
||||
void (*Init)(void);
|
||||
void (*WriteComm)(u16 cmd); // 写命令
|
||||
void (*WriteData)(u16 dat); // 写数据
|
||||
void (*WriteMap)(char *map, int size); // 写整个buf
|
||||
void (*WritePAGE)(char *map, u8 page_star, u8 page_len); // 写page
|
||||
void (*SetDrawArea)(int, int, int, int);
|
||||
void (*Reset)(void);
|
||||
void (*BackLightCtrl)(u8);
|
||||
void (*EnterSleep)();
|
||||
void (*ExitSleep)();
|
||||
};
|
||||
|
||||
|
||||
void spi_dma_send_byte(u8 dat);
|
||||
void spi_dma_send_map(u8 *map, u32 size);
|
||||
void SPI_LcdTest();
|
||||
|
||||
|
||||
|
||||
|
||||
struct lcd_spi_platform_data {
|
||||
u32 pin_reset;
|
||||
u32 pin_cs;
|
||||
u32 pin_rs;
|
||||
u32 pin_bl;
|
||||
spi_dev spi_cfg;
|
||||
const struct spi_platform_data *spi_pdata;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// LCD 初始化接口
|
||||
#define REGISTER_LCD_DRIVE() \
|
||||
const struct spi_lcd_init dev_drive
|
||||
|
||||
enum LCD_COLOR {
|
||||
LCD_COLOR_RGB565,
|
||||
LCD_COLOR_MONO,
|
||||
};
|
||||
|
||||
enum LCD_IF {
|
||||
LCD_SPI,
|
||||
LCD_EMI,
|
||||
};
|
||||
|
||||
struct lcd_info {
|
||||
u16 width;
|
||||
u16 height;
|
||||
u8 color_format;
|
||||
u8 interface;
|
||||
u8 col_align;
|
||||
u8 row_align;
|
||||
u8 bl_status;
|
||||
};
|
||||
|
||||
|
||||
struct lcd_interface {
|
||||
void (*init)(void *);
|
||||
void (*get_screen_info)(struct lcd_info *info);
|
||||
void (*buffer_malloc)(u8 **buf, u32 *size);
|
||||
void (*buffer_free)(u8 *buf);
|
||||
void (*draw)(u8 *buf, u32 len, u8 wait);
|
||||
void (*set_draw_area)(u16 xs, u16 xe, u16 ys, u16 ye);
|
||||
void (*clear_screen)(u16 color);
|
||||
int (*backlight_ctrl)(u8 on);
|
||||
void (*draw_page)(u8 *buf, u8 page_star, u8 page_len);
|
||||
};
|
||||
|
||||
extern struct lcd_interface lcd_interface_begin[];
|
||||
extern struct lcd_interface lcd_interface_end[];
|
||||
|
||||
#define REGISTER_LCD_INTERFACE(lcd) \
|
||||
static const struct lcd_interface lcd sec(.lcd_if_info) __attribute__((used))
|
||||
|
||||
struct lcd_interface *lcd_get_hdl();
|
||||
|
||||
#define LCD_SPI_PLATFORM_DATA_BEGIN(data) \
|
||||
const struct lcd_spi_platform_data data = {
|
||||
|
||||
#define LCD_SPI__PLATFORM_DATA_END() \
|
||||
};
|
||||
|
||||
|
||||
void lcd_reset_l();
|
||||
void lcd_reset_h();
|
||||
void lcd_cs_l();
|
||||
void lcd_cs_h();
|
||||
void lcd_rs_l();
|
||||
void lcd_rs_h();
|
||||
void lcd_bl_l();
|
||||
void lcd_bl_h();
|
||||
u8 lcd_bl_io();
|
||||
|
||||
extern int lcd_backlight_status();
|
||||
u8 lcd_spi_recv_byte();
|
||||
int lcd_spi_send_byte(u8 byte);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
143
apps/earphone/include/ui/led7/led7_driver.h
Normal file
143
apps/earphone/include/ui/led7/led7_driver.h
Normal file
@ -0,0 +1,143 @@
|
||||
#ifndef _LED7_DRV_H_
|
||||
#define _LED7_DRV_H_
|
||||
|
||||
|
||||
typedef struct _led7_VAR {
|
||||
u8 bCoordinateX;
|
||||
u8 bFlashChar;
|
||||
u8 bShowBuff[4]; //[0] ~ [3]显示的数字/字母显示的所有段
|
||||
u32 bShowIcon; //每1bit对应LED4的1段, maybe icon > 7段
|
||||
u32 bFlashIcon; //闪烁标志
|
||||
u8 bShowBuff1[9]; //[i]->第i个管脚, value的每一bit对应一个管脚, scan时使用
|
||||
} LED7_VAR;
|
||||
|
||||
#define LED7_PLAY BIT(0) //0: 播放图标
|
||||
#define LED7_PAUSE BIT(1) //1: 暂停图标
|
||||
#define LED7_USB BIT(2) //2: USB图标
|
||||
#define LED7_SD BIT(3) //3: SD图标
|
||||
#define LED7_2POINT BIT(4) //4: 冒号图标
|
||||
#define LED7_FM BIT(5) //5: FM图标
|
||||
#define LED7_DOT BIT(6) //6: 小数点图标
|
||||
#define LED7_MP3 BIT(7) //7: MP3图标
|
||||
#define LED7_REPEAT BIT(8) //8: REPEAT图标
|
||||
#define LED7_CHARGE BIT(9) //9: 充电图标
|
||||
#define LED7_BT BIT(10) //10: 充电图标
|
||||
#define LED7_AUX BIT(11) //11: AUX图标
|
||||
#define LED7_WMA BIT(12) //12: WMA图标
|
||||
|
||||
typedef u32 UI_LED7_ICON;
|
||||
|
||||
typedef enum _led7_pin_type {
|
||||
LED7_PIN7, //7个引脚
|
||||
LED7_PIN12, //12个引脚
|
||||
LED7_PIN13, //13个引脚
|
||||
} LED7_PIN_TYPE;
|
||||
|
||||
struct seg2pin {
|
||||
u8 pinH;
|
||||
u8 pinL;
|
||||
};
|
||||
|
||||
struct icon_seg2pin {
|
||||
UI_LED7_ICON icon;
|
||||
struct seg2pin seg2pin;
|
||||
};
|
||||
|
||||
struct led7_pin7 {
|
||||
u8 pin[7];
|
||||
};
|
||||
|
||||
struct led7_pin12 {
|
||||
u8 pin_comh[5];
|
||||
u8 pin_segl[7];
|
||||
};
|
||||
|
||||
struct led7_pin13 {
|
||||
u8 pin_com[6];
|
||||
u8 pin_seg[7];
|
||||
};
|
||||
|
||||
|
||||
union led7_pin_cfg {
|
||||
struct led7_pin7 pin7;
|
||||
struct led7_pin12 pin12;
|
||||
struct led7_pin13 pin13;
|
||||
};
|
||||
|
||||
#define LED_A BIT(0)
|
||||
#define LED_B BIT(1)
|
||||
#define LED_C BIT(2)
|
||||
#define LED_D BIT(3)
|
||||
#define LED_E BIT(4)
|
||||
#define LED_F BIT(5)
|
||||
#define LED_G BIT(6)
|
||||
#define LED_H BIT(7)
|
||||
|
||||
|
||||
struct led7_platform_data {
|
||||
LED7_PIN_TYPE pin_type;
|
||||
union led7_pin_cfg pin_cfg;
|
||||
};
|
||||
|
||||
#define LED7_PLATFORM_DATA_BEGIN(data) \
|
||||
const struct led7_platform_data data = {
|
||||
|
||||
#define LED7_PLATFORM_DATA_END() \
|
||||
};
|
||||
|
||||
//UI LED7 API:
|
||||
//=================================================================================//
|
||||
// 模块初始化显示接口 //
|
||||
//=================================================================================//
|
||||
void *led7_init(const struct led7_platform_data *_data);
|
||||
const struct ui_display_api *ui_led7_init(void *para);
|
||||
|
||||
//=================================================================================//
|
||||
// 设置显示坐标接口 //
|
||||
/*
|
||||
___ ___ ___ ___
|
||||
|___| |___| |___| |___|
|
||||
|___| |___| |___| |___|
|
||||
---0------1------2------3------> X
|
||||
*/
|
||||
//=================================================================================//
|
||||
void led7_setX(u8 X);
|
||||
|
||||
//=================================================================================//
|
||||
// 字符类显示接口 //
|
||||
//=================================================================================//
|
||||
void led7_show_char(u8 chardata); //显示字符(追加方式)
|
||||
void led7_flash_char_start(u8 index); //闪烁单个字符
|
||||
void led7_flash_char_stop(u8 index); //取消闪烁单个字符
|
||||
void led7_show_string(u8 *str); //显示字符串(追加方式)
|
||||
void led7_show_string_reset_x(u8 *str); //显示字符串, x从0开始
|
||||
void led7_show_string_align_right(u8 *str); //led7显示字符串(清屏&右方式)
|
||||
void led7_show_string_align_left(u8 *str); //led7显示字符串(清屏&左方式)
|
||||
|
||||
//=================================================================================//
|
||||
// 数字类显示接口 //
|
||||
//=================================================================================//
|
||||
void led7_show_number(u16 val); //显示数字(清屏&高位显示0)
|
||||
void led7_show_number2(u16 val); //显示数字(清屏&高位不显示)
|
||||
void led7_show_number_add(u16 val); //显示数字(追加方式)
|
||||
|
||||
//=================================================================================//
|
||||
// 图标类显示接口 //
|
||||
//=================================================================================//
|
||||
void led7_show_icon(UI_LED7_ICON icon); //显示单个图标(追加)
|
||||
void led7_flash_icon(UI_LED7_ICON icon); //闪烁单个图标(追加)
|
||||
|
||||
//=================================================================================//
|
||||
// 模式类类显示接口 //
|
||||
//=================================================================================//
|
||||
|
||||
//=================================================================================//
|
||||
// 清屏类显示接口 //
|
||||
//=================================================================================//
|
||||
void led7_show_null(void); //清除所有显示(数字,字符串和图标)
|
||||
void led7_clear_string(void); //清除显示数字和字母
|
||||
void led7_clear_icon(UI_LED7_ICON icon); //清除显示单个图标
|
||||
void led7_clear_all_icon(void); //清除显示所有图标
|
||||
|
||||
|
||||
#endif /* _LED_H_ */
|
||||
26
apps/earphone/include/ui/res_config.h
Normal file
26
apps/earphone/include/ui/res_config.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef __RES_CONFIG_H__
|
||||
#define __RES_CONFIG_H__
|
||||
|
||||
|
||||
#define EXTERN_PATH "storage/virfat_flash/C/"
|
||||
#define INTERN_PATH "mnt/sdfile/res/"
|
||||
#define RES_PATH INTERN_PATH
|
||||
|
||||
#define FONT_PATH RES_PATH
|
||||
|
||||
|
||||
#define UI_STY_CHECK_PATH \
|
||||
RES_PATH"JL.sty",
|
||||
|
||||
#define UI_RES_CHECK_PATH \
|
||||
RES_PATH"JL.res",
|
||||
|
||||
#define UI_STR_CHECK_PATH \
|
||||
RES_PATH"JL.str",
|
||||
|
||||
|
||||
|
||||
#define UI_WATCH_RES_ENABLE 0//表盘功能
|
||||
|
||||
|
||||
#endif
|
||||
130
apps/earphone/include/ui/style_led7.h
Normal file
130
apps/earphone/include/ui/style_led7.h
Normal file
@ -0,0 +1,130 @@
|
||||
#ifndef UI_STYLE_LED7_H
|
||||
#define UI_STYLE_LED7_H
|
||||
|
||||
#include "ui/ui_common.h"
|
||||
#include "ui/led7/led7_driver.h"
|
||||
#include "ui/lcd_seg/lcd_seg3x9_driver.h"
|
||||
|
||||
|
||||
|
||||
enum ui_menu_main {
|
||||
UI_MENU_MAIN_NULL = 0,
|
||||
UI_RTC_MENU_MAIN,
|
||||
UI_MUSIC_MENU_MAIN,
|
||||
UI_AUX_MENU_MAIN,
|
||||
UI_BT_MENU_MAIN,
|
||||
UI_RECORD_MENU_MAIN,
|
||||
UI_FM_MENU_MAIN,
|
||||
UI_PC_MENU_MAIN,
|
||||
UI_IDLE_MENU_MAIN,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
|
||||
MENU_POWER_UP = 1,
|
||||
MENU_WAIT,
|
||||
MENU_BT,
|
||||
MENU_PC,
|
||||
MENU_PC_VOL_UP,
|
||||
MENU_PC_VOL_DOWN,
|
||||
MENU_AUX,
|
||||
MENU_ALM_UP,
|
||||
|
||||
MENU_SHOW_STRING,
|
||||
MENU_MAIN_VOL,
|
||||
MENU_SET_EQ,
|
||||
MENU_SET_PLAY_MODE,
|
||||
|
||||
MENU_PLAY_TIME,
|
||||
MENU_FILENUM,
|
||||
MENU_INPUT_NUMBER,
|
||||
MENU_MUSIC_PAUSE,
|
||||
MENU_MUSIC_REPEATMODE,
|
||||
|
||||
MENU_FM_MAIN,
|
||||
MENU_FM_DISP_FRE,
|
||||
MENU_FM_SET_FRE,
|
||||
MENU_FM_STATION,
|
||||
MENU_IR_FM_SET_FRE,
|
||||
|
||||
MENU_RTC_SET,
|
||||
MENU_RTC_PWD,
|
||||
MENU_ALM_SET,
|
||||
|
||||
MENU_BT_SEARCH_DEVICE,
|
||||
MENU_BT_CONNECT_DEVICE,
|
||||
MENU_BT_DEVICE_ADD,
|
||||
MENU_BT_DEVICE_NAME,
|
||||
MENU_RECODE_MAIN,
|
||||
MENU_RECODE_ERR,
|
||||
MENU_POWER,
|
||||
MENU_LIST_DISPLAY,
|
||||
|
||||
|
||||
MENU_LED0,
|
||||
MENU_LED1,
|
||||
|
||||
|
||||
MENU_RECORD,
|
||||
|
||||
MENU_SEC_REFRESH = 0x80,
|
||||
MENU_REFRESH,
|
||||
MENU_MAIN = 0xff,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//=================================================================================//
|
||||
// UI 配置数据结构 //
|
||||
//=================================================================================//
|
||||
struct ui_dis_api {
|
||||
int ui;
|
||||
void *(*open)(void *hd);
|
||||
void (*ui_main)(void *hd, void *private);
|
||||
int (*ui_user)(void *hd, void *private, int menu, int arg);
|
||||
void (*close)(void *hd, void *private);
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef struct _LCD_DISP_API {
|
||||
void (*clear)(void);
|
||||
void (*setXY)(u32 x, u32 y);
|
||||
void (*FlashChar)(u32);
|
||||
void (*Clear_FlashChar)(u32);
|
||||
void (*show_string)(u8 *);
|
||||
void (*show_char)(u8);
|
||||
void (*show_number)(u8);
|
||||
void (*show_icon)(u32);
|
||||
void (*flash_icon)(u32);
|
||||
void (*clear_icon)(u32);
|
||||
void (*show_pic)(u32);
|
||||
void (*hide_pic)(u32);
|
||||
void (*lock)(u32);
|
||||
} LCD_API;
|
||||
|
||||
|
||||
|
||||
extern const struct ui_dis_api bt_main;
|
||||
extern const struct ui_dis_api fm_main;
|
||||
extern const struct ui_dis_api music_main;
|
||||
extern const struct ui_dis_api record_main;
|
||||
extern const struct ui_dis_api rtc_main;
|
||||
extern const struct ui_dis_api pc_main;
|
||||
extern const struct ui_dis_api linein_main;
|
||||
extern const struct ui_dis_api idle_main;
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
131
apps/earphone/include/ui/ui_api.h
Normal file
131
apps/earphone/include/ui/ui_api.h
Normal file
@ -0,0 +1,131 @@
|
||||
#ifndef _UI_API_H_
|
||||
#define _UI_API_H_
|
||||
|
||||
#include "app_config.h"
|
||||
#include "ui/lcd_spi/lcd_drive.h"
|
||||
#include "ui/ui.h"
|
||||
#include "ui/ui_style.h"
|
||||
|
||||
#define GRT_CUR_MENU (0)
|
||||
#define GET_MAIN_MENU (1)
|
||||
|
||||
|
||||
enum ui_devices_type {
|
||||
LED_7,
|
||||
LCD_SEG3X9,
|
||||
TFT_LCD,//彩屏
|
||||
DOT_LCD,//点阵屏
|
||||
};
|
||||
|
||||
//板级配置数据结构
|
||||
struct ui_devices_cfg {
|
||||
enum ui_devices_type type;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
|
||||
struct touch_event {
|
||||
int event;
|
||||
int x;
|
||||
int y;
|
||||
};
|
||||
|
||||
|
||||
//led7 api
|
||||
extern int led7_ui_init(const struct ui_devices_cfg *ui_cfg);
|
||||
extern void ui_set_main_menu(enum ui_menu_main menu);
|
||||
extern void ui_menu_reflash(u8 break_in);//break_in 是否打断显示,例如显示设置过程中需要刷新新界面。是是否打断设置界面显示
|
||||
extern u8 ui_get_app_menu(u8);
|
||||
extern void ui_set_led(u8 app_menu, u8 on, u8 phase, u16 highlight, u16 period);
|
||||
extern void ui_set_auto_reflash(u32 msec);//自动刷新主页
|
||||
extern void ui_close_main_menu();
|
||||
extern void ui_set_tmp_menu(u8 app_menu, u16 ret_time, s32 arg, void (*timeout_cb)(u8 menu));
|
||||
extern void ui_common(void *hd, void *private, u8 menu, u32 arg);//公共显示
|
||||
|
||||
|
||||
//lcd api
|
||||
//
|
||||
extern int lcd_ui_init(void *arg);
|
||||
extern int ui_hide_main(int id);
|
||||
extern int ui_show_main(int id);
|
||||
|
||||
extern int ui_server_msg_post(const char *msg, ...);
|
||||
extern int ui_hide_curr_main();
|
||||
extern int ui_touch_msg_post(struct touch_event *event);
|
||||
extern int ui_key_msg_post(int msg);
|
||||
extern void key_ui_takeover(u8 on);
|
||||
extern int key_is_ui_takeover();
|
||||
extern void ui_backlight_open(void);
|
||||
extern void ui_backlight_close(void);
|
||||
|
||||
extern void ui_touch_timer_delete();
|
||||
extern void ui_touch_timer_start();
|
||||
extern void ui_auto_shut_down_modify(void);
|
||||
extern void ui_auto_shut_down_enable(void);
|
||||
extern void ui_auto_shut_down_disable(void);
|
||||
extern int ui_simple_key_msg_post(int, int);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//=================================================================================//
|
||||
// UI API //
|
||||
//=================================================================================//
|
||||
#if (TCFG_UI_ENABLE)
|
||||
#if(CONFIG_UI_STYLE == STYLE_JL_LED7)//led7 显示
|
||||
#define UI_INIT(a) led7_ui_init(a)
|
||||
#define UI_SHOW_WINDOW(a) ui_set_main_menu(a)
|
||||
#define UI_HIDE_WINDOW(...) ui_close_main_menu()
|
||||
#define UI_HIDE_CURR_WINDOW() ui_close_main_menu()
|
||||
#define UI_GET_WINDOW_ID() ui_get_app_menu(GET_MAIN_MENU)
|
||||
#define UI_GET_CURR_MENU() ui_get_app_menu(GRT_CUR_MENU)
|
||||
#define UI_REFLASH_WINDOW(a) ui_menu_reflash(a)
|
||||
#define UI_SHOW_MENU ui_set_tmp_menu
|
||||
#define UI_MSG_POST(...)
|
||||
#define UI_KEY_MSG_POST(...)
|
||||
|
||||
|
||||
#elif(CONFIG_UI_STYLE == STYLE_UI_SIMPLE)//去框架显示显示
|
||||
|
||||
#define UI_INIT(a) lcd_ui_init(a)
|
||||
#define UI_SHOW_WINDOW(...)
|
||||
#define UI_HIDE_WINDOW(...)
|
||||
#define UI_GET_WINDOW_ID() (0)
|
||||
#define UI_HIDE_CURR_WINDOW()
|
||||
#define UI_SHOW_MENU(...)
|
||||
#define UI_MSG_POST(...)
|
||||
#define UI_REFLASH_WINDOW(a)
|
||||
#define UI_KEY_MSG_POST(a)
|
||||
|
||||
#else
|
||||
|
||||
#define UI_INIT(a) lcd_ui_init(a)
|
||||
#define UI_SHOW_WINDOW(a) ui_show_main(a)
|
||||
#define UI_HIDE_WINDOW(a) ui_hide_main(a)
|
||||
#define UI_HIDE_CURR_WINDOW() ui_hide_curr_main()
|
||||
#define UI_GET_WINDOW_ID() ui_get_current_window_id()
|
||||
#define UI_MSG_POST ui_server_msg_post
|
||||
#define UI_SHOW_MENU(...)
|
||||
#define UI_GET_CURR_MENU()
|
||||
#define UI_REFLASH_WINDOW(a)
|
||||
#define UI_KEY_MSG_POST(a) ui_key_msg_post
|
||||
|
||||
|
||||
#endif//if(CONFIG_UI_STYLE == STYLE_JL_LED7)
|
||||
|
||||
#else
|
||||
|
||||
//common api lcd屏和led7 通用api
|
||||
#define UI_INIT(...)
|
||||
#define UI_SHOW_WINDOW(...)
|
||||
#define UI_HIDE_WINDOW(...)
|
||||
#define UI_GET_WINDOW_ID()
|
||||
#define UI_HIDE_CURR_WINDOW()
|
||||
#define UI_SHOW_MENU(...)
|
||||
#define UI_MSG_POST(...)
|
||||
#define UI_REFLASH_WINDOW(a)
|
||||
#define UI_KEY_MSG_POST(...)
|
||||
#endif /* #if TCFG_UI_ENABLE */
|
||||
|
||||
#endif
|
||||
15
apps/earphone/include/ui/ui_common.h
Normal file
15
apps/earphone/include/ui/ui_common.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef _UI_COMMON_H_
|
||||
#define _UI_COMMON_H_
|
||||
|
||||
#include "typedef.h"
|
||||
/* =================== 十进制数值(1位)转ASCII值 =================== */
|
||||
void itoa1(u8 i, u8 *buf);
|
||||
/* =================== 十进制数值(2位)转ASCII值 =================== */
|
||||
void itoa2(u8 i, u8 *buf);
|
||||
/* =================== 十进制数值(3位)转ASCII值 =================== */
|
||||
void itoa3(u16 i, u8 *buf);
|
||||
/* =================== 十进制数值(4位)转ASCII值 =================== */
|
||||
void itoa4(u16 i, u8 *buf);
|
||||
|
||||
|
||||
#endif
|
||||
72
apps/earphone/include/ui/ui_style.h
Normal file
72
apps/earphone/include/ui/ui_style.h
Normal file
@ -0,0 +1,72 @@
|
||||
#ifndef UI_STYLE_H
|
||||
#define UI_STYLE_H
|
||||
|
||||
#include "ui/style_led7.h"//led7
|
||||
|
||||
|
||||
|
||||
#if(CONFIG_UI_STYLE == STYLE_JL_WTACH)
|
||||
#include "ui/style_jl01.h"//彩屏//
|
||||
#define ID_WINDOW_MAIN PAGE_3
|
||||
#define ID_WINDOW_BT PAGE_0
|
||||
#define ID_WINDOW_MUSIC PAGE_1
|
||||
#define ID_WINDOW_LINEIN PAGE_1
|
||||
// #define ID_WINDOW_FM PAGE_2
|
||||
#define ID_WINDOW_CLOCK PAGE_0
|
||||
// #define ID_WINDOW_BT_MENU PAGE_3
|
||||
#define ID_WINDOW_POWER_ON PAGE_4
|
||||
#define ID_WINDOW_POWER_OFF PAGE_5
|
||||
#define CONFIG_UI_STYLE_JL_ENABLE
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if(CONFIG_UI_STYLE == STYLE_JL_SOUNDBOX)
|
||||
#include "ui/style_jl02.h"//点阵//
|
||||
#define ID_WINDOW_MAIN PAGE_0
|
||||
#define ID_WINDOW_BT PAGE_1
|
||||
#define ID_WINDOW_FM PAGE_2
|
||||
#define ID_WINDOW_CLOCK PAGE_3
|
||||
#define ID_WINDOW_MUSIC PAGE_4
|
||||
#define ID_WINDOW_LINEIN PAGE_9
|
||||
#define ID_WINDOW_POWER_ON PAGE_5
|
||||
#define ID_WINDOW_POWER_OFF PAGE_6
|
||||
#define ID_WINDOW_SYS PAGE_7
|
||||
#define ID_WINDOW_PC PAGE_8
|
||||
#define ID_WINDOW_IDLE (-1)
|
||||
#define ID_WINDOW_REC PAGE_10
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#if(CONFIG_UI_STYLE == STYLE_JL_LED7)//led7 显示
|
||||
#define ID_WINDOW_BT UI_BT_MENU_MAIN
|
||||
#define ID_WINDOW_FM UI_FM_MENU_MAIN
|
||||
#define ID_WINDOW_CLOCK UI_RTC_MENU_MAIN
|
||||
#define ID_WINDOW_MUSIC UI_MUSIC_MENU_MAIN
|
||||
#define ID_WINDOW_LINEIN UI_AUX_MENU_MAIN
|
||||
#define ID_WINDOW_PC UI_PC_MENU_MAIN
|
||||
#define ID_WINDOW_REC UI_RECORD_MENU_MAIN
|
||||
#define ID_WINDOW_POWER_ON UI_IDLE_MENU_MAIN
|
||||
#define ID_WINDOW_POWER_OFF UI_IDLE_MENU_MAIN
|
||||
#define ID_WINDOW_SPDIF UI_IDLE_MENU_MAIN
|
||||
#define ID_WINDOW_IDLE UI_IDLE_MENU_MAIN
|
||||
#endif
|
||||
|
||||
#if(CONFIG_UI_STYLE == STYLE_UI_SIMPLE)//lcd 去架构
|
||||
#define ID_WINDOW_BT (0)
|
||||
#define ID_WINDOW_FM (0)
|
||||
#define ID_WINDOW_CLOCK (0)
|
||||
#define ID_WINDOW_MUSIC (0)
|
||||
#define ID_WINDOW_LINEIN (0)
|
||||
#define ID_WINDOW_PC (0)
|
||||
#define ID_WINDOW_REC (0)
|
||||
#define ID_WINDOW_POWER_ON (0)
|
||||
#define ID_WINDOW_POWER_OFF (0)
|
||||
#define ID_WINDOW_SPDIF (0)
|
||||
#define ID_WINDOW_IDLE (0)
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
39
apps/earphone/include/ui_manage.h
Normal file
39
apps/earphone/include/ui_manage.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef __UI_MANAGE_H_
|
||||
#define __UI_MANAGE_H_
|
||||
|
||||
#include "typedef.h"
|
||||
|
||||
typedef enum {
|
||||
STATUS_NULL = 0,
|
||||
STATUS_POWERON,
|
||||
STATUS_POWEROFF,
|
||||
STATUS_POWERON_LOWPOWER,
|
||||
STATUS_BT_INIT_OK,
|
||||
STATUS_BT_CONN,
|
||||
STATUS_BT_SLAVE_CONN_MASTER,
|
||||
STATUS_BT_MASTER_CONN_ONE,
|
||||
STATUS_BT_DISCONN,
|
||||
STATUS_BT_TWS_CONN,
|
||||
STATUS_BT_TWS_DISCONN,
|
||||
STATUS_PHONE_INCOME,
|
||||
STATUS_PHONE_OUT,
|
||||
STATUS_PHONE_ACTIV,
|
||||
STATUS_CHARGE_START,
|
||||
STATUS_CHARGE_FULL,
|
||||
STATUS_CHARGE_CLOSE,
|
||||
STATUS_CHARGE_ERR,
|
||||
STATUS_LOWPOWER,
|
||||
STATUS_CHARGE_LDO5V_OFF,
|
||||
STATUS_EXIT_LOWPOWER,
|
||||
STATUS_NORMAL_POWER,
|
||||
STATUS_POWER_NULL,
|
||||
} UI_STATUS;
|
||||
|
||||
|
||||
int ui_manage_init(void);
|
||||
void ui_update_status(u8 status);
|
||||
u8 get_ui_busy_status();
|
||||
void led_module_enter_sniff_mode();
|
||||
void led_module_exit_sniff_mode();
|
||||
|
||||
#endif
|
||||
68
apps/earphone/include/user_cfg_id.h
Normal file
68
apps/earphone/include/user_cfg_id.h
Normal file
@ -0,0 +1,68 @@
|
||||
#ifndef _USER_CFG_ID_H_
|
||||
#define _USER_CFG_ID_H_
|
||||
|
||||
//=================================================================================//
|
||||
// 与APP CASE相关配置项[1 ~ 60] //
|
||||
//=================================================================================//
|
||||
|
||||
#define CFG_EARTCH_ENABLE_ID 1
|
||||
#define CFG_PBG_MODE_INFO 2
|
||||
#define CFG_CHARGESTORE_TWS_CHANNEL 3
|
||||
#define CFG_SYS_VOL 4
|
||||
|
||||
#define CFG_MIC_ARRAY_DIFF_CMP_VALUE 5//麦克风阵列算法前补偿值
|
||||
#define CFG_MIC_ARRAY_TRIM_EN 6//麦克风补偿使能
|
||||
#define CFG_DMS_MALFUNC_STATE_ID 7//dms故障麦克风检测默认使用哪个mic的参数id
|
||||
#define CFG_MIC_TARGET_DIFF_CMP 8//目标MIC补偿值
|
||||
|
||||
|
||||
|
||||
#define CFG_DHA_FITTING_ID 26 //辅听验配保存参数的id
|
||||
#define CFG_REMOTE_DN_00 27
|
||||
|
||||
#define CFG_IMU_GYRO_OFFEST_ID 28 //空间音频imu陀螺仪偏置
|
||||
#define CFG_IMU_ACC_OFFEST_ID 29 //空间音频imu加速度偏置
|
||||
|
||||
#define VM_LP_TOUCH_KEY0_ALOG_CFG 30
|
||||
#define VM_LP_TOUCH_KEY1_ALOG_CFG 31
|
||||
#define VM_LP_TOUCH_KEY2_ALOG_CFG 32
|
||||
#define VM_LP_TOUCH_KEY3_ALOG_CFG 33
|
||||
#define VM_LP_TOUCH_KEY4_ALOG_CFG 34
|
||||
|
||||
#define VM_UPDATE_FLAG 35
|
||||
#define VM_DMA_RAND 36
|
||||
#define VM_DMA_RAND 37
|
||||
#define VM_GMA_ALI_PARA 38
|
||||
#define CFG_BCS_MAP_WEIGHT 39
|
||||
#define CFG_RCSP_ADV_HIGH_LOW_VOL 40
|
||||
#define CFG_RCSP_ADV_EQ_MODE_SETTING 41
|
||||
#define CFG_RCSP_ADV_EQ_DATA_SETTING 42
|
||||
#define ADV_SEQ_RAND 43
|
||||
#define CFG_RCSP_ADV_TIME_STAMP 44
|
||||
#define CFG_RCSP_ADV_WORK_SETTING 45
|
||||
#define CFG_RCSP_ADV_MIC_SETTING 46
|
||||
#define CFG_RCSP_ADV_LED_SETTING 47
|
||||
#define CFG_RCSP_ADV_KEY_SETTING 48
|
||||
|
||||
#define CFG_USB_BREAKPOINT0 49
|
||||
#define CFG_SD0_BREAKPOINT0 50
|
||||
#define CFG_SD1_BREAKPOINT0 51
|
||||
|
||||
#define CFG_HAVE_MASS_STORAGE 52
|
||||
#define CFG_MUSIC_MODE 53
|
||||
|
||||
#define LP_KEY_EARTCH_TRIM_VALUE 54
|
||||
|
||||
#define CFG_RCSP_ADV_ANC_VOICE 55
|
||||
#define CFG_RCSP_ADV_ANC_VOICE_MODE 56
|
||||
#define CFG_RCSP_ADV_ANC_VOICE_KEY 57
|
||||
|
||||
|
||||
#define CFG_SPK_EQ_SEG_SAVE 58
|
||||
#define CFG_SPK_EQ_GLOBAL_GAIN_SAVE 59
|
||||
|
||||
#define CFG_ANC_ADAPTIVE_DATA_ID 60//保存ANC自适应参数id
|
||||
|
||||
#define CFG_REMOTE_DN_00 63
|
||||
|
||||
#endif /* #ifndef _USER_CFG_ID_H_ */
|
||||
9
apps/earphone/include/vol_sync.h
Normal file
9
apps/earphone/include/vol_sync.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef __VOL_SYNC_H__
|
||||
#define __VOL_SYNC_H__
|
||||
|
||||
void vol_sys_tab_init(void);
|
||||
void set_music_device_volume(int volume);
|
||||
int phone_get_device_vol(void);
|
||||
void opid_play_vol_sync_fun(u8 *vol, u8 mode);
|
||||
|
||||
#endif
|
||||
104
apps/earphone/include/wireless_mic/bt_edr_fun.h
Normal file
104
apps/earphone/include/wireless_mic/bt_edr_fun.h
Normal file
@ -0,0 +1,104 @@
|
||||
#ifndef __BT_EDR_FUN_H__
|
||||
#define __BT_EDR_FUN_H__
|
||||
|
||||
#include "adapter_odev_bt.h"
|
||||
#include "app_main.h"
|
||||
|
||||
/*配置通话时前面丢掉的数据包包数*/
|
||||
#define ESCO_DUMP_PACKET_ADJUST 1 /*配置使能*/
|
||||
#define ESCO_DUMP_PACKET_DEFAULT 0
|
||||
#define ESCO_DUMP_PACKET_CALL 120 /*0~0xFF*/
|
||||
|
||||
#if(TCFG_UI_ENABLE && TCFG_SPI_LCD_ENABLE)//点阵屏断开蓝牙连接时可选择不跳回蓝牙模式
|
||||
#define BACKGROUND_GOBACK 0 //后台链接是否跳回蓝牙 1:跳回
|
||||
#else
|
||||
#define BACKGROUND_GOBACK 1
|
||||
#endif
|
||||
|
||||
#define TIMEOUT_CONN_TIME 60 //超时断开之后回连的时间s
|
||||
#define POWERON_AUTO_CONN_TIME 12 //开机去回连的时间
|
||||
|
||||
#define PHONE_CALL_FORCE_POWEROFF 0 //通话时候强制关机
|
||||
|
||||
#define SBC_FILTER_TIME_MS 1000 //后台音频过滤时间ms
|
||||
#define SBC_ZERO_TIME_MS 500 //静音多长时间认为已经退出
|
||||
#define NO_SBC_TIME_MS 200 //无音频时间ms
|
||||
|
||||
#define SNIFF_CNT_TIME 5/////<空闲5S之后进入sniff模式
|
||||
#define SNIFF_MAX_INTERVALSLOT 800
|
||||
#define SNIFF_MIN_INTERVALSLOT 100
|
||||
#define SNIFF_ATTEMPT_SLOT 4
|
||||
#define SNIFF_TIMEOUT_SLOT 1
|
||||
|
||||
enum {
|
||||
BT_AS_IDEV = 0,
|
||||
BT_AS_ODEV,
|
||||
};
|
||||
|
||||
void set_bt_dev_role(u8 role);
|
||||
|
||||
struct app_bt_opr {
|
||||
u8 init_ok : 1; // 1-初始化完成
|
||||
u8 call_flag : 1; // 1-由于蓝牙打电话命令切回蓝牙模式
|
||||
u8 exit_flag : 1; // 1-可以退出蓝牙标志
|
||||
u8 exiting : 1; // 1-正在退出蓝牙模式
|
||||
u8 wait_exit : 1; // 1-等退出蓝牙模式
|
||||
u8 a2dp_decoder_type: 3; // 从后台返回时记录解码格式用
|
||||
u8 cmd_flag ; // 1-由于蓝牙命令切回蓝牙模式
|
||||
u8 init_start ; //蓝牙协议栈初始化开始 ,但未初始化不一定已经完成,要判断initok完成的标志
|
||||
u8 ignore_discon_tone; // 1-退出蓝牙模式, 不响应discon提示音
|
||||
u8 sbc_packet_valid_cnt; // 有效sbc包计数
|
||||
u8 sbc_packet_valid_cnt_max;// 最大有效sbc包计数
|
||||
u8 sbc_packet_lose_cnt; // sbc丢失的包数
|
||||
u8 sbc_packet_step; // 0-正常;1-退出中;2-后台
|
||||
u32 tws_local_back_role : 4;
|
||||
u32 tws_local_to_bt_mode : 1;
|
||||
u32 a2dp_start_flag : 1;
|
||||
u32 bt_back_flag : 4;
|
||||
u32 replay_tone_flag : 1;
|
||||
u8 esco_dump_packet;
|
||||
u8 last_connecting_addr[6];
|
||||
|
||||
u32 sbc_packet_filter_to; // 过滤超时
|
||||
u32 no_sbc_packet_to; // 无声超时
|
||||
u32 init_ok_time; // 初始化完成时间
|
||||
u32 auto_exit_limit_time; // 自动退出时间限制
|
||||
u8 bt_direct_init;
|
||||
u8 bt_close_bredr;
|
||||
u8 hid_mode;
|
||||
u8 force_poweroff;
|
||||
u8 call_back_flag; //BIT(0):hfp_status BIT(1):esco_status
|
||||
|
||||
int timer;
|
||||
int tmr_cnt;
|
||||
int back_mode_systime;
|
||||
int max_tone_timer_hdl;
|
||||
int exit_sniff_timer ;
|
||||
|
||||
u32 sco_info;
|
||||
};
|
||||
extern struct app_bt_opr app_bt_hdl;
|
||||
extern BT_USER_PRIV_VAR bt_user_priv_var;
|
||||
|
||||
void bt_init();
|
||||
void bt_close(void);
|
||||
|
||||
void sys_auto_shut_down_enable(void);
|
||||
void sys_auto_shut_down_disable(void);
|
||||
|
||||
u8 get_bt_init_status();
|
||||
void bt_set_led_status(u8 status);
|
||||
void sys_auto_sniff_controle(u8 enable, u8 *addr);
|
||||
|
||||
void bt_wait_phone_connect_control(u8 enable);
|
||||
int bt_wait_connect_and_phone_connect_switch(void *p);
|
||||
|
||||
u8 is_call_now();
|
||||
|
||||
//bt status
|
||||
int bt_connction_status_event_handler(struct bt_event *bt, struct _odev_bt *odev_bt);
|
||||
|
||||
//hci event
|
||||
int bt_hci_event_handler(struct bt_event *bt, struct _odev_bt *odev_bt);
|
||||
|
||||
#endif //__BT_EDR_FUN_H__
|
||||
12
apps/earphone/include/wireless_mic/wireless_mic_test.h
Normal file
12
apps/earphone/include/wireless_mic/wireless_mic_test.h
Normal file
@ -0,0 +1,12 @@
|
||||
#ifndef _WIRELESS_MIC_TEST_
|
||||
#define _WIRELESS_MIC_TEST_
|
||||
|
||||
#include "system/includes.h"
|
||||
|
||||
// struct adapter_media {
|
||||
|
||||
// };
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
713
apps/earphone/key_event_deal.c
Normal file
713
apps/earphone/key_event_deal.c
Normal file
@ -0,0 +1,713 @@
|
||||
#include "key_event_deal.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "event.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_main.h"
|
||||
#include "app_task.h"
|
||||
#include "tone_player.h"
|
||||
#include "audio_config.h"
|
||||
#include "user_cfg.h"
|
||||
#include "system/timer.h"
|
||||
#include "vol_sync.h"
|
||||
#include "media/includes.h"
|
||||
#include "pbg_user.h"
|
||||
#include "key_driver.h"
|
||||
#if TCFG_EQ_ENABLE
|
||||
#include "application/eq_config.h"
|
||||
#endif/*TCFG_EQ_ENABLE*/
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
|
||||
#include "icsd_adt_app.h"
|
||||
#endif /*TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/
|
||||
|
||||
#define LOG_TAG_CONST KEY_EVENT_DEAL
|
||||
#define LOG_TAG "[KEY_EVENT_DEAL]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#define POWER_OFF_CNT 6
|
||||
|
||||
static u8 goto_poweroff_cnt = 0;
|
||||
static u8 goto_poweroff_flag = 0;
|
||||
extern u8 key_table[KEY_NUM_MAX][KEY_EVENT_MAX];
|
||||
extern u8 get_max_sys_vol(void);
|
||||
extern void sys_enter_soft_poweroff(void *priv);
|
||||
extern bool get_tws_sibling_connect_state(void);
|
||||
extern int bt_get_low_latency_mode();
|
||||
extern void bt_set_low_latency_mode(int enable);
|
||||
|
||||
u8 poweroff_sametime_flag = 0;
|
||||
|
||||
#if CONFIG_TWS_POWEROFF_SAME_TIME
|
||||
enum {
|
||||
FROM_HOST_POWEROFF_CNT_ENOUGH = 1,
|
||||
FROM_TWS_POWEROFF_CNT_ENOUGH,
|
||||
POWEROFF_CNT_ENOUGH,
|
||||
};
|
||||
|
||||
static u16 poweroff_sametime_timer_id = 0;
|
||||
static void poweroff_sametime_timer(void *priv)
|
||||
{
|
||||
log_info("poweroff_sametime_timer\n");
|
||||
int state = tws_api_get_tws_state();
|
||||
if (!(state & TWS_STA_SIBLING_CONNECTED)) {
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
return;
|
||||
}
|
||||
if (priv == NULL || poweroff_sametime_flag == POWEROFF_CNT_ENOUGH) {
|
||||
poweroff_sametime_timer_id = sys_timeout_add((void *)1, poweroff_sametime_timer, 500);
|
||||
} else {
|
||||
poweroff_sametime_timer_id = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void poweroff_sametime_timer_init(void)
|
||||
{
|
||||
if (poweroff_sametime_timer_id) {
|
||||
return;
|
||||
}
|
||||
|
||||
poweroff_sametime_timer_id = sys_timeout_add(NULL, poweroff_sametime_timer, 500);
|
||||
}
|
||||
#endif
|
||||
|
||||
void volume_up_down_direct(s8 value);
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
u8 replay_tone_flag = 1;
|
||||
int max_tone_timer_hdl = 0;
|
||||
static void max_tone_timer(void *priv)
|
||||
{
|
||||
if (!tone_get_status()) {
|
||||
max_tone_timer_hdl = 0;
|
||||
replay_tone_flag = 1;
|
||||
} else {
|
||||
max_tone_timer_hdl = sys_timeout_add(NULL, max_tone_timer, TWS_SYNC_TIME_DO + 100);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static u8 volume_flag = 1;
|
||||
void volume_up(u8 inc)
|
||||
{
|
||||
u8 test_box_vol_up = 0x41;
|
||||
s8 cur_vol = 0;
|
||||
u8 call_status = get_call_status();
|
||||
|
||||
if (tone_get_status() && volume_flag) {
|
||||
if (get_call_status() == BT_CALL_INCOMING) {
|
||||
volume_up_down_direct(1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*打电话出去彩铃要可以调音量大小*/
|
||||
if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING)) {
|
||||
cur_vol = app_audio_get_volume(APP_AUDIO_STATE_CALL);
|
||||
} else {
|
||||
cur_vol = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
|
||||
}
|
||||
if (get_remote_test_flag()) {
|
||||
user_send_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_up); //音量加
|
||||
}
|
||||
|
||||
if (cur_vol >= app_audio_get_max_volume()) {
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (get_tws_sibling_connect_state()) {
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER && replay_tone_flag) {
|
||||
replay_tone_flag = 0; //防止提示音被打断标志
|
||||
bt_tws_play_tone_at_same_time(SYNC_TONE_MAX_VOL, 400);
|
||||
max_tone_timer_hdl = sys_timeout_add(NULL, max_tone_timer, TWS_SYNC_TIME_DO + 100); //同步在TWS_SYNC_TIME_DO之后才会播放提示音,所以timer需要在这个时间之后才去检测提示音状态
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
#if TCFG_MAX_VOL_PROMPT
|
||||
STATUS *p_tone = get_tone_config();
|
||||
tone_play_index(p_tone->max_vol, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (get_call_status() != BT_CALL_HANGUP) {
|
||||
/*本地音量最大,如果手机音量还没最大,继续加,以防显示不同步*/
|
||||
if (bt_user_priv_var.phone_vol < 15) {
|
||||
if (get_curr_channel_state() & HID_CH) {
|
||||
user_send_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
opid_play_vol_sync_fun(&app_var.music_volume, 1);
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL);
|
||||
#endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/
|
||||
return;
|
||||
}
|
||||
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
opid_play_vol_sync_fun(&app_var.music_volume, 1);
|
||||
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
|
||||
#else
|
||||
app_audio_volume_up(inc);
|
||||
#endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/
|
||||
log_info("vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
|
||||
if (get_call_status() != BT_CALL_HANGUP) {
|
||||
if (get_curr_channel_state() & HID_CH) {
|
||||
user_send_cmd_prepare(USER_CTRL_HID_VOL_UP, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_UP, 0, NULL);
|
||||
}
|
||||
} else {
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
/* opid_play_vol_sync_fun(&app_var.music_volume, 1); */
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL); //使用HID调音量
|
||||
//user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_SEND_VOL, 0, NULL);
|
||||
#else
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_INC, 0, NULL);
|
||||
#endif/*TCFG_USER_TWS_ENABLE*/
|
||||
#endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/
|
||||
}
|
||||
}
|
||||
void volume_down(u8 dec)
|
||||
{
|
||||
u8 test_box_vol_down = 0x42;
|
||||
if (tone_get_status() && volume_flag) {
|
||||
if (get_call_status() == BT_CALL_INCOMING) {
|
||||
volume_up_down_direct(-1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (get_remote_test_flag()) {
|
||||
user_send_cmd_prepare(USER_CTRL_TEST_KEY, 1, &test_box_vol_down); //音量减
|
||||
}
|
||||
|
||||
if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) <= 0) {
|
||||
if (get_call_status() != BT_CALL_HANGUP) {
|
||||
/*
|
||||
*本地音量最小,如果手机音量还没最小,继续减
|
||||
*注意:有些手机通话最小音量是1(GREE G0245D)
|
||||
*/
|
||||
if (bt_user_priv_var.phone_vol > 1) {
|
||||
if (get_curr_channel_state() & HID_CH) {
|
||||
user_send_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
|
||||
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
opid_play_vol_sync_fun(&app_var.music_volume, 0);
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
opid_play_vol_sync_fun(&app_var.music_volume, 0);
|
||||
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, app_var.music_volume, 1);
|
||||
#else
|
||||
app_audio_volume_down(dec);
|
||||
#endif/*BT_SUPPORT_MUSIC_VOL_SYNC*/
|
||||
log_info("vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
|
||||
if (get_call_status() != BT_CALL_HANGUP) {
|
||||
if (get_curr_channel_state() & HID_CH) {
|
||||
user_send_cmd_prepare(USER_CTRL_HID_VOL_DOWN, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_VOLUME_DOWN, 0, NULL);
|
||||
}
|
||||
} else {
|
||||
#if BT_SUPPORT_MUSIC_VOL_SYNC
|
||||
/* opid_play_vol_sync_fun(&app_var.music_volume, 0); */
|
||||
if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) == 0) {
|
||||
app_audio_volume_down(0);
|
||||
}
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
|
||||
//user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_SEND_VOL, 0, NULL);
|
||||
#else
|
||||
user_send_cmd_prepare(USER_CTRL_CMD_SYNC_VOL_DEC, 0, NULL);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if ONE_KEY_CTL_DIFF_FUNC
|
||||
static void lr_diff_otp_deal(u8 opt, char channel)
|
||||
{
|
||||
log_info("lr_diff_otp_deal:%d", opt);
|
||||
switch (opt) {
|
||||
case ONE_KEY_CTL_NEXT_PREV:
|
||||
if (channel == 'L') {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
} else if (channel == 'R') {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case ONE_KEY_CTL_VOL_UP_DOWN:
|
||||
if (channel == 'L') {
|
||||
volume_up(1);
|
||||
} else if (channel == 'R') {
|
||||
volume_down(1);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void key_tws_lr_diff_deal(struct sys_event *event, u8 opt)
|
||||
{
|
||||
u8 channel = 'U';
|
||||
if (get_bt_tws_connect_status()) {
|
||||
channel = tws_api_get_local_channel();
|
||||
if ('L' == channel) {
|
||||
channel = (u32)event->arg == KEY_EVENT_FROM_TWS ? 'R' : 'L';
|
||||
} else {
|
||||
channel = (u32)event->arg == KEY_EVENT_FROM_TWS ? 'L' : 'R';
|
||||
}
|
||||
}
|
||||
lr_diff_otp_deal(opt, channel);
|
||||
}
|
||||
#else
|
||||
void key_tws_lr_diff_deal(struct sys_event *event, u8 opt)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void audio_aec_pitch_change_ctrl();
|
||||
void audio_surround_voice_ctrl();
|
||||
extern void start_streamer_test(void);
|
||||
extern int jl_kws_voice_event_handle(struct key_event *key);
|
||||
int app_earphone_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
int ret = false;
|
||||
struct key_event *key = &event->u.key;
|
||||
|
||||
u8 key_event;
|
||||
|
||||
if (key->type == KEY_DRIVER_TYPE_VOICE) {
|
||||
/* 语音消息 */
|
||||
ret = jl_kws_voice_event_handle(event);
|
||||
if (ret == true) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
if (event->arg == DEVICE_EVENT_FROM_CUSTOM) {
|
||||
log_e("is music mode msg\n");
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (TCFG_EAR_DETECT_ENABLE && TCFG_EAR_DETECT_CTL_KEY)
|
||||
extern int cmd_key_msg_handle(struct sys_event * event);
|
||||
if (key->event == KEY_EVENT_USER) {
|
||||
cmd_key_msg_handle(event);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (pbg_user_key_vaild(&key_event, event)) {
|
||||
;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
key_event = key_table[key->value][key->event];
|
||||
}
|
||||
|
||||
void bt_sniff_ready_clean(void);
|
||||
bt_sniff_ready_clean();
|
||||
|
||||
#if RCSP_ADV_EN
|
||||
extern void set_key_event_by_rcsp_info(struct sys_event * event, u8 * key_event);
|
||||
set_key_event_by_rcsp_info(event, &key_event);
|
||||
#endif
|
||||
|
||||
log_info("key_event:%d %d %d\n", key_event, key->value, key->event);
|
||||
|
||||
#if LL_SYNC_EN
|
||||
extern void ll_sync_led_switch(void);
|
||||
if (key->value == 0 && key->event == KEY_EVENT_CLICK) {
|
||||
log_info("ll_sync_led_switch\n");
|
||||
ll_sync_led_switch();
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if TCFG_AUDIO_WIDE_AREA_TAP_ENABLE
|
||||
audio_wide_area_tap_ignore_flag_set(1, 1000);
|
||||
#endif
|
||||
|
||||
switch (key_event) {
|
||||
case KEY_MUSIC_PP:
|
||||
/* tone_play_index(IDEX_TONE_NORMAL,1);
|
||||
break; */
|
||||
|
||||
/*start_streamer_test();
|
||||
break;*/
|
||||
#if TCFG_AUDIO_BASS_BOOST_TEST
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
//log_info("from tws\n");
|
||||
break;
|
||||
} else {
|
||||
//log_info("from key\n");
|
||||
}
|
||||
extern void audio_bass_ctrl();
|
||||
audio_bass_ctrl();
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_BASS_BOOST_TEST*/
|
||||
|
||||
if ((get_call_status() == BT_CALL_OUTGOING) ||
|
||||
(get_call_status() == BT_CALL_ALERT)) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else if (get_call_status() == BT_CALL_INCOMING) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
|
||||
} else if (get_call_status() == BT_CALL_ACTIVE) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case KEY_POWEROFF:
|
||||
goto_poweroff_cnt = 0;
|
||||
poweroff_sametime_flag = 0;
|
||||
goto_poweroff_flag = 0;
|
||||
|
||||
if ((BT_STATUS_CONNECTING == get_bt_connect_status()) ||
|
||||
(BT_STATUS_TAKEING_PHONE == get_bt_connect_status()) ||
|
||||
(BT_STATUS_PLAYING_MUSIC == get_bt_connect_status())) {
|
||||
/* if (get_call_status() != BT_CALL_HANGUP) {
|
||||
log_info("call hangup\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
goto_poweroff_flag = 0;
|
||||
break;
|
||||
} */
|
||||
if ((get_call_status() == BT_CALL_INCOMING) ||
|
||||
(get_call_status() == BT_CALL_OUTGOING)) {
|
||||
log_info("key call reject\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
goto_poweroff_flag = 0;
|
||||
break;
|
||||
} else if (get_call_status() == BT_CALL_ACTIVE) {
|
||||
log_info("key call hangup\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
goto_poweroff_flag = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#if (TCFG_USER_TWS_ENABLE && CONFIG_TWS_POWEROFF_SAME_TIME == 0)
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#if TCFG_WIRELESS_MIC_ENABLE
|
||||
extern void wireless_mic_change_mode(u8 mode);
|
||||
wireless_mic_change_mode(0);
|
||||
#endif
|
||||
goto_poweroff_flag = 1;
|
||||
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
|
||||
break;
|
||||
case KEY_POWEROFF_HOLD:
|
||||
#if (TCFG_USER_TWS_ENABLE && CONFIG_TWS_POWEROFF_SAME_TIME == 0)
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
log_info("poweroff flag:%d cnt:%d\n", goto_poweroff_flag, goto_poweroff_cnt);
|
||||
|
||||
if (goto_poweroff_flag) {
|
||||
goto_poweroff_cnt++;
|
||||
|
||||
#if CONFIG_TWS_POWEROFF_SAME_TIME
|
||||
if (goto_poweroff_cnt == POWER_OFF_CNT) {
|
||||
if (get_tws_sibling_connect_state()) {
|
||||
if ((u32)event->arg != KEY_EVENT_FROM_TWS) {
|
||||
tws_api_sync_call_by_uuid('T', SYNC_CMD_POWER_OFF_TOGETHER, TWS_SYNC_TIME_DO);
|
||||
} else {
|
||||
goto_poweroff_cnt--;
|
||||
}
|
||||
} else {
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (goto_poweroff_cnt >= POWER_OFF_CNT) {
|
||||
goto_poweroff_cnt = 0;
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
}
|
||||
#endif //CONFIG_TWS_POWEROFF_SAME_TIME
|
||||
|
||||
}
|
||||
break;
|
||||
case KEY_MUSIC_PREV:
|
||||
//user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL);
|
||||
//============ for test ==============//
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
if (get_bt_connect_status() == BT_STATUS_TAKEING_PHONE) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else {
|
||||
if (a2dp_get_status() != BT_MUSIC_STATUS_STARTING) {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (a2dp_get_status() != BT_MUSIC_STATUS_STARTING) {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL);
|
||||
}
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
//====================================//
|
||||
break;
|
||||
case KEY_MUSIC_NEXT:
|
||||
#if ( (defined CONFIG_BOARD_AC6933B_LIGHTING) || (defined CONFIG_BOARD_AC6953B_LIGHTING))
|
||||
if (get_call_status() == BT_CALL_INCOMING) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
//user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
|
||||
//============ for test ==============//
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
if (get_bt_connect_status() == BT_STATUS_TAKEING_PHONE) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else {
|
||||
if (a2dp_get_status() != BT_MUSIC_STATUS_STARTING) {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (a2dp_get_status() != BT_MUSIC_STATUS_STARTING) {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
}
|
||||
#endif
|
||||
//====================================//
|
||||
break;
|
||||
case KEY_VOL_UP:
|
||||
volume_up(1);
|
||||
break;
|
||||
case KEY_VOL_DOWN:
|
||||
volume_down(1);
|
||||
break;
|
||||
case KEY_CALL_LAST_NO:
|
||||
if (bt_user_priv_var.last_call_type == BT_STATUS_PHONE_INCOME) {
|
||||
user_send_cmd_prepare(USER_CTRL_DIAL_NUMBER, bt_user_priv_var.income_phone_len,
|
||||
bt_user_priv_var.income_phone_num);
|
||||
} else {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case KEY_CALL_HANG_UP:
|
||||
|
||||
break;
|
||||
case KEY_CALL_ANSWER:
|
||||
/* sys_enter_soft_poweroff(NULL); */
|
||||
break;
|
||||
case KEY_OPEN_SIRI:
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
|
||||
break;
|
||||
case KEY_EQ_MODE:
|
||||
#if(TCFG_EQ_ENABLE == 1)
|
||||
eq_mode_sw();
|
||||
#endif
|
||||
break;
|
||||
case KEY_HID_CONTROL:
|
||||
log_info("get_curr_channel_state:%x\n", get_curr_channel_state());
|
||||
if (get_curr_channel_state() & HID_CH) {
|
||||
log_info("KEY_HID_CONTROL\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HID_IOS, 0, NULL);
|
||||
}
|
||||
break;
|
||||
case KEY_THIRD_CLICK:
|
||||
log_info("KEY_THIRD_CLICK");
|
||||
key_tws_lr_diff_deal(event, ONE_KEY_CTL_NEXT_PREV);
|
||||
break;
|
||||
case KEY_LOW_LANTECY:
|
||||
bt_set_low_latency_mode(!bt_get_low_latency_mode());
|
||||
break;
|
||||
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
|
||||
extern void eartch_event_deal_enable_cfg_save(u8 en);
|
||||
case KEY_EARTCH_ENABLE:
|
||||
eartch_event_deal_enable_cfg_save(1);
|
||||
break;
|
||||
case KEY_EARTCH_DISABLE:
|
||||
eartch_event_deal_enable_cfg_save(0);
|
||||
break;
|
||||
#endif /* #if TCFG_EARTCH_EVENT_HANDLE_ENABLE */
|
||||
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
case KEY_ANC_SWITCH:
|
||||
//来电不切模式
|
||||
if ((BT_STATUS_CONNECTING == get_bt_connect_status()) ||
|
||||
(BT_STATUS_TAKEING_PHONE == get_bt_connect_status()) ||
|
||||
(BT_STATUS_PLAYING_MUSIC == get_bt_connect_status())) {
|
||||
/* if (get_call_status() != BT_CALL_HANGUP) {
|
||||
log_info("call hangup\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
goto_poweroff_flag = 0;
|
||||
break;
|
||||
} */
|
||||
if ((get_call_status() == BT_CALL_INCOMING)) {
|
||||
log_info("key call reject\n");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#if RCSP_ADV_EN
|
||||
update_anc_voice_key_opt();
|
||||
#else
|
||||
anc_mode_next();
|
||||
#endif
|
||||
break;
|
||||
#if ANC_EAR_ADAPTIVE_EN
|
||||
case KEY_ANC_EAR_ADAPTIVE:
|
||||
audio_anc_mode_ear_adaptive(1);
|
||||
break;
|
||||
case KEY_ANC_COEFF_SWITCH:
|
||||
audio_anc_coeff_adaptive_switch();
|
||||
break;
|
||||
#endif/*ANC_EAR_ADAPTIVE_EN*/
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
case KEY_NULL:
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
/* goto_poweroff_cnt = 0; */
|
||||
/* goto_poweroff_flag = 0; */
|
||||
break;
|
||||
case KEY_MUSIC_EFF:
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#if AUDIO_SURROUND_CONFIG
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
//log_info("from tws\n");
|
||||
break;
|
||||
} else {
|
||||
//log_info("from key\n");
|
||||
}
|
||||
audio_surround_voice_ctrl();
|
||||
#endif /* AUDIO_SURROUND_CONFIG */
|
||||
#endif /*TCFG_USER_TWS_ENABLE*/
|
||||
break;
|
||||
|
||||
case KEY_PHONE_PITCH:
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#if AEC_PITCHSHIFTER_CONFIG
|
||||
if ((u32)event->arg == KEY_EVENT_FROM_TWS) {
|
||||
//log_info("from tws\n");
|
||||
break;
|
||||
} else {
|
||||
//log_info("from key\n");
|
||||
}
|
||||
audio_aec_pitch_change_ctrl();
|
||||
#endif /* AEC_PITCHSHIFTER_CONFIG */
|
||||
#endif /* TCFG_USER_TWS_ENABLE */
|
||||
break;
|
||||
|
||||
#if TCFG_AUDIO_HEARING_AID_ENABLE
|
||||
/*辅听功能测试demo开关*/
|
||||
case KEY_HEARING_AID_TOGGLE:
|
||||
printf("KEY_HEARING_AID_TOGGLE\n");
|
||||
extern void audio_hearing_aid_demo(void);
|
||||
audio_hearing_aid_demo();
|
||||
break;
|
||||
#endif/*TCFG_AUDIO_HEARING_AID_ENABLE*/
|
||||
|
||||
#if TCFG_APP_AUX_EN
|
||||
case KEY_MODE_SWITCH:
|
||||
log_info("KEY_MODE_SWITCH");
|
||||
app_task_switch_next();
|
||||
break;
|
||||
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
|
||||
#if TCFG_AUDIO_SPATIAL_EFFECT_ENABLE
|
||||
case KEY_SPATIAL_EFFECT_MODE_SWITCH:
|
||||
extern void audio_spatial_effects_mode_switch(u8 mode, u8 tone_play);
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)
|
||||
#endif /*TCFG_USER_TWS_ENABLE*/
|
||||
{
|
||||
static u8 mode = 0;
|
||||
audio_spatial_effects_mode_switch(mode++, 0);
|
||||
if (mode > 2) {
|
||||
mode = 0;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
#endif /*TCFG_AUDIO_SPATIAL_EFFECT_ENABLE*/
|
||||
#if TCFG_AUDIO_SPEAK_TO_CHAT_ENABLE
|
||||
case KEY_SPEAK_TO_CHAT_SWITCH:
|
||||
/*智能免摘测试demo开关*/
|
||||
audio_speak_to_chat_demo();
|
||||
break;
|
||||
#endif /*TCFG_AUDIO_SPEAK_TO_CHAT_ENABLE*/
|
||||
#if TCFG_AUDIO_ANC_WIND_NOISE_DET_ENABLE
|
||||
case KEY_WIND_NOISE_DET_SWITCH:
|
||||
/*风噪检测demo开关*/
|
||||
audio_icsd_wind_detect_demo();
|
||||
break;
|
||||
#endif /*TCFG_AUDIO_ANC_WIND_NOISE_DET_ENABLE*/
|
||||
#if TCFG_AUDIO_WIDE_AREA_TAP_ENABLE
|
||||
case KEY_WIDE_AREA_TAP_SWITCH:
|
||||
/*广域点击测试demo开关*/
|
||||
audio_wat_click_demo();
|
||||
break;
|
||||
#endif /*TCFG_AUDIO_WIDE_AREA_TAP_ENABLE*/
|
||||
#if ANC_MULT_ORDER_ENABLE
|
||||
case KEY_ANC_MULT_SCENE_SWITCH:
|
||||
audio_anc_mult_scene_switch(1);
|
||||
break;
|
||||
#endif/*ANC_MULT_ORDER_ENABLE*/
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void adsp_volume_up(void)
|
||||
{
|
||||
volume_flag = 0;
|
||||
volume_up(1);
|
||||
volume_flag = 1;
|
||||
}
|
||||
|
||||
void adsp_volume_down(void)
|
||||
{
|
||||
volume_flag = 0;
|
||||
volume_down(1);
|
||||
volume_flag = 1;
|
||||
}
|
||||
|
||||
182
apps/earphone/kws_voice_event_deal.c
Normal file
182
apps/earphone/kws_voice_event_deal.c
Normal file
@ -0,0 +1,182 @@
|
||||
#include "includes.h"
|
||||
#include "event.h"
|
||||
#include "app_config.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "media/kws_event.h"
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
#include "bt_tws.h"
|
||||
#endif
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif/*TCFG_AUDIO_ANC_ENABLE*/
|
||||
|
||||
#define LOG_TAG_CONST KWS_VOICE_EVENT
|
||||
#define LOG_TAG "[KWS_VOICE_EVENT]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#if ((defined TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE) && (TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE))
|
||||
|
||||
struct jl_kws_event_hdl {
|
||||
u32 last_event;
|
||||
u32 last_event_jiffies;
|
||||
};
|
||||
|
||||
static struct jl_kws_event_hdl kws_hdl = {
|
||||
.last_event = 0,
|
||||
.last_event_jiffies = 0,
|
||||
};
|
||||
|
||||
#define __this (&kws_hdl)
|
||||
|
||||
|
||||
extern void volume_up(u8 inc);
|
||||
extern void volume_down(u8 inc);
|
||||
|
||||
/* ---------------------------------------------------------------------------- */
|
||||
/**
|
||||
* @brief: 关键词唤醒语音事件处理流程
|
||||
*
|
||||
* @param event: 系统事件
|
||||
*
|
||||
* @return : true: 处理该事件; false: 不处理该事件, 由
|
||||
*/
|
||||
/* ---------------------------------------------------------------------------- */
|
||||
int jl_kws_voice_event_handle(struct sys_event *event)
|
||||
{
|
||||
struct key_event *key = &(event->u.key);
|
||||
|
||||
if (key->type != KEY_DRIVER_TYPE_VOICE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 cur_jiffies = jiffies;
|
||||
u8 a2dp_state;
|
||||
u8 call_state;
|
||||
u32 voice_event = key->event;
|
||||
|
||||
log_info("%s: event: %d", __func__, voice_event);
|
||||
|
||||
if (voice_event == __this->last_event) {
|
||||
if (jiffies_to_msecs(cur_jiffies - __this->last_event_jiffies) < 1000) {
|
||||
log_info("voice event %d same, ignore", voice_event);
|
||||
__this->last_event_jiffies = cur_jiffies;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
__this->last_event_jiffies = cur_jiffies;
|
||||
__this->last_event = voice_event;
|
||||
|
||||
switch (voice_event) {
|
||||
case KWS_EVENT_HEY_KEYWORD:
|
||||
case KWS_EVENT_XIAOJIE:
|
||||
//主唤醒词:
|
||||
log_info("send SIRI cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
|
||||
break;
|
||||
|
||||
case KWS_EVENT_XIAODU:
|
||||
//主唤醒词:
|
||||
log_info("send SIRI cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_GET_SIRI_OPEN, 0, NULL);
|
||||
break;
|
||||
|
||||
case KWS_EVENT_PLAY_MUSIC:
|
||||
case KWS_EVENT_STOP_MUSIC:
|
||||
case KWS_EVENT_PAUSE_MUSIC:
|
||||
call_state = get_call_status();
|
||||
if ((call_state == BT_CALL_OUTGOING) ||
|
||||
(call_state == BT_CALL_ALERT)) {
|
||||
//user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else if (call_state == BT_CALL_INCOMING) {
|
||||
//user_send_cmd_prepare(USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
|
||||
} else if (call_state == BT_CALL_ACTIVE) {
|
||||
//user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
} else {
|
||||
a2dp_state = a2dp_get_status();
|
||||
if (a2dp_state == BT_MUSIC_STATUS_STARTING) {
|
||||
if (voice_event == KWS_EVENT_PAUSE_MUSIC) {
|
||||
log_info("send PAUSE cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PAUSE, 0, NULL);
|
||||
} else if (voice_event == KWS_EVENT_STOP_MUSIC) {
|
||||
log_info("send STOP cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_STOP, 0, NULL);
|
||||
}
|
||||
} else {
|
||||
if (voice_event == KWS_EVENT_PLAY_MUSIC) {
|
||||
log_info("send PLAY cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PLAY, 0, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case KWS_EVENT_VOLUME_UP:
|
||||
log_info("volume up");
|
||||
volume_up(4); //music: 0 ~ 16, call: 0 ~ 15, step: 25%
|
||||
break;
|
||||
|
||||
case KWS_EVENT_VOLUME_DOWN:
|
||||
log_info("volume down");
|
||||
volume_down(4); //music: 0 ~ 16, call: 0 ~ 15, step: 25%
|
||||
break;
|
||||
|
||||
case KWS_EVENT_PREV_SONG:
|
||||
log_info("Send PREV cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_PREV, 0, NULL);
|
||||
break;
|
||||
|
||||
case KWS_EVENT_NEXT_SONG:
|
||||
log_info("Send NEXT cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_AVCTP_OPID_NEXT, 0, NULL);
|
||||
break;
|
||||
|
||||
case KWS_EVENT_CALL_ACTIVE:
|
||||
if (get_call_status() == BT_CALL_INCOMING) {
|
||||
log_info("Send ANSWER cmd");
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_ANSWER, 0, NULL);
|
||||
}
|
||||
break;
|
||||
|
||||
case KWS_EVENT_CALL_HANGUP:
|
||||
log_info("Send HANG UP cmd");
|
||||
if ((get_call_status() >= BT_CALL_INCOMING) && (get_call_status() <= BT_CALL_ALERT)) {
|
||||
user_send_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP, 0, NULL);
|
||||
}
|
||||
break;
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
case KWS_EVENT_ANC_ON:
|
||||
anc_mode_switch(ANC_ON, 1);
|
||||
break;
|
||||
case KWS_EVENT_TRANSARENT_ON:
|
||||
anc_mode_switch(ANC_TRANSPARENCY, 1);
|
||||
break;
|
||||
case KWS_EVENT_ANC_OFF:
|
||||
anc_mode_switch(ANC_OFF, 1);
|
||||
break;
|
||||
#endif
|
||||
|
||||
case KWS_EVENT_NULL:
|
||||
log_info("KWS_EVENT_NULL");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#else /* #if ((defined TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE) && (TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE)) */
|
||||
|
||||
int jl_kws_voice_event_handle(struct key_event *key)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif /* #if ((defined TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE) && (TCFG_KWS_VOICE_EVENT_HANDLE_ENABLE)) */
|
||||
445
apps/earphone/linein/linein.c
Normal file
445
apps/earphone/linein/linein.c
Normal file
@ -0,0 +1,445 @@
|
||||
#include "system/includes.h"
|
||||
#include "app_action.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "bt_background.h"
|
||||
#include "default_event_handler.h"
|
||||
#include "tone_player.h"
|
||||
#include "user_cfg.h"
|
||||
#include "app_task.h"
|
||||
#include "earphone.h"
|
||||
#include "app_charge.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_main.h"
|
||||
#include "media/includes.h"
|
||||
#include "audio_config.h"
|
||||
#include "asm/audio_adc.h"
|
||||
#include "circular_buf.h"
|
||||
#include "audio_dec_pcm.h"
|
||||
|
||||
#define LOG_TAG_CONST AUX
|
||||
#define LOG_TAG "[AUX]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
#include "log.h"
|
||||
|
||||
#if TCFG_APP_AUX_EN
|
||||
|
||||
#define POWER_OFF_CNT 6
|
||||
|
||||
extern void sys_enter_soft_poweroff(void *priv);
|
||||
extern int app_power_event_handler(struct device_event *dev);
|
||||
extern void app_task_switch_next(void);
|
||||
extern struct audio_dac_hdl dac_hdl;
|
||||
extern struct audio_adc_hdl adc_hdl;
|
||||
|
||||
#define AUX_CH_NUM 4 /*支持的最大采样通道(max = 2)*/
|
||||
#define AUX_BUF_NUM 2 /*采样buf数*/
|
||||
#define AUX_IRQ_POINTS 64 /*采样中断点数*/
|
||||
#define AUX_BUFS_SIZE (AUX_CH_NUM * AUX_BUF_NUM * AUX_IRQ_POINTS)
|
||||
#define AUX_CBUF_SIZE (AUX_BUFS_SIZE / 2)
|
||||
|
||||
struct linein_hdl {
|
||||
u8 adc_2_dac;
|
||||
u8 linein_idx;
|
||||
struct audio_adc_output_hdl adc_output;
|
||||
struct adc_mic_ch mic_ch;
|
||||
struct adc_linein_ch linein_ch;
|
||||
cbuffer_t linein_cbuf;
|
||||
s16 adc_buf[AUX_BUFS_SIZE];
|
||||
u8 *cbuf;
|
||||
u8 linein_ch_num;
|
||||
u8 linein_ch_sel;
|
||||
u8 need_resume;
|
||||
u8 start;
|
||||
};
|
||||
struct app_aux_var {
|
||||
struct linein_hdl *linein_demo;
|
||||
u8 inited;
|
||||
u8 idle;
|
||||
};
|
||||
|
||||
static u8 goto_poweroff_cnt = 0;
|
||||
static u8 goto_poweroff_flag = 0;
|
||||
static struct app_aux_var g_aux = {0};
|
||||
|
||||
static const u8 aux_key_table[][KEY_EVENT_MAX] = {
|
||||
// SHORT LONG HOLD
|
||||
// UP DOUBLE TRIPLE
|
||||
{
|
||||
KEY_MODE_SWITCH, KEY_POWEROFF, KEY_POWEROFF_HOLD,
|
||||
KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
{
|
||||
KEY_NULL, KEY_NULL, KEY_NULL,
|
||||
KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
{
|
||||
KEY_NULL, KEY_NULL, KEY_NULL,
|
||||
KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
};
|
||||
|
||||
static u8 aux_idle_query()
|
||||
{
|
||||
return !g_aux.idle;
|
||||
}
|
||||
REGISTER_LP_TARGET(aux_lp_target) = {
|
||||
.name = "aux",
|
||||
.is_idle = aux_idle_query,
|
||||
};
|
||||
|
||||
|
||||
// linein adc 回调函数
|
||||
static void adc_linein_output_hdl(void *priv, s16 *data, int len)
|
||||
{
|
||||
int wlen = 0;
|
||||
if (g_aux.linein_demo && g_aux.linein_demo->cbuf && g_aux.linein_demo->start == 1) {
|
||||
if (g_aux.linein_demo->linein_ch_num >= 2) {
|
||||
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR)
|
||||
/*输出两个linein的数据到DAC两个通道,默认输出第一个和第二个采样通道的数据*/
|
||||
s16 temp[len * 2];
|
||||
for (int i = 0; i < len / 2; i++) {
|
||||
temp[2 * i] = data[g_aux.linein_demo->linein_ch_num * i];
|
||||
temp[2 * i + 1] = data[g_aux.linein_demo->linein_ch_num * i + 1];
|
||||
}
|
||||
/* wlen = audio_dac_write(&dac_hdl, temp, len * 2); */
|
||||
wlen = cbuf_write(&g_aux.linein_demo->linein_cbuf, temp, len * 2);
|
||||
#else
|
||||
/*输出其中一个linein的数据到DAC一个通道*/
|
||||
s16 *mono_data = data;
|
||||
for (int i = 0; i < (len / 2); i++) {
|
||||
switch (g_aux.linein_demo->linein_ch_sel) {
|
||||
case 0:
|
||||
mono_data[i] = data[i * g_aux.linein_demo->linein_ch_num]; /*第一路 linein采样的数据*/
|
||||
break;
|
||||
case 1:
|
||||
mono_data[i] = data[i * g_aux.linein_demo->linein_ch_num + 1]; /*第一路 linein采样的数据*/
|
||||
break;
|
||||
case 2:
|
||||
mono_data[i] = data[i * g_aux.linein_demo->linein_ch_num + 2]; /*第三路 linein采样的数据*/
|
||||
break;
|
||||
case 3:
|
||||
mono_data[i] = data[i * g_aux.linein_demo->linein_ch_num + 3]; /*第四路 linein采样的数据*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* wlen = audio_dac_write(&dac_hdl, mono_data, len); */
|
||||
wlen = cbuf_write(&g_aux.linein_demo->linein_cbuf, mono_data, len);
|
||||
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
||||
} else {
|
||||
/*输出一个linein的数据到DAC一个通道*/
|
||||
/* wlen = audio_dac_write(&dac_hdl, data, len); */
|
||||
wlen = cbuf_write(&g_aux.linein_demo->linein_cbuf, data, len);
|
||||
}
|
||||
|
||||
/* pcm_dec_resume(); */
|
||||
if (g_aux.linein_demo->need_resume == 1) {
|
||||
//激活解码
|
||||
pcm_dec_resume();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int linein_data_read(void *priv, void *data, int len)
|
||||
{
|
||||
int rlen = 0;
|
||||
if (g_aux.linein_demo && g_aux.linein_demo->start == 1) {
|
||||
int read_len = cbuf_get_data_size(&g_aux.linein_demo->linein_cbuf);
|
||||
read_len = read_len > len ? len : read_len;
|
||||
rlen = cbuf_read(&g_aux.linein_demo->linein_cbuf, data, read_len);
|
||||
if (!rlen) {
|
||||
g_aux.linein_demo->need_resume = 1;
|
||||
}
|
||||
}
|
||||
return rlen;
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* AUDIO ADC linein OPEN
|
||||
* Description: 打开linein通道
|
||||
* Arguments : linein_idx linein通道
|
||||
* gain linein增益
|
||||
* sr linein采样率
|
||||
* linein_2_dac linein数据(通过DAC)监听
|
||||
* Return : None.
|
||||
* Note(s) : (1)打开一个linein通道示例:
|
||||
* audio_linein_open(AUDIO_ADC_LINE0,10,16000,1);
|
||||
* 或者
|
||||
* audio_linein_open(AUDIO_ADC_LINE1,10,16000,1);
|
||||
* (2)打开两个linein通道示例:
|
||||
* audio_linein_open(AUDIO_ADC_LINE1|AUDIO_ADC_LINE0,10,16000,1);
|
||||
* (3)打开四个linein通道示例:
|
||||
* audio_linein_open(AUDIO_ADC_LINE3|AUDIO_ADC_LINE2|AUDIO_ADC_LINE1|AUDIO_ADC_LINE0,10,16000,1);
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_linein_open(u8 linein_idx, u8 gain, u16 sr, u8 linein_2_dac)
|
||||
{
|
||||
if (g_aux.linein_demo) {
|
||||
printf("Func:%s,Line:%d, audio linein is opened!\n", __func__, __LINE__);
|
||||
}
|
||||
printf("\naudio_adc_linein_demo open:%d,gain:%d,sr:%d,linein_2_dac:%d\n", linein_idx, gain, sr, linein_2_dac);
|
||||
g_aux.linein_demo = zalloc(sizeof(struct linein_hdl));
|
||||
if (g_aux.linein_demo) {
|
||||
//step0:打开linein通道,并设置增益
|
||||
if (linein_idx & AUDIO_ADC_LINE0) {
|
||||
audio_adc_linein_open(&g_aux.linein_demo->linein_ch, AUDIO_ADC_LINE0, &adc_hdl);
|
||||
audio_adc_linein_set_gain(&g_aux.linein_demo->linein_ch, gain);
|
||||
audio_adc_linein_0dB_en(1);
|
||||
g_aux.linein_demo->linein_ch_num += 1;
|
||||
}
|
||||
if (linein_idx & AUDIO_ADC_LINE1) {
|
||||
audio_adc_linein1_open(&g_aux.linein_demo->linein_ch, AUDIO_ADC_LINE1, &adc_hdl);
|
||||
audio_adc_linein1_set_gain(&g_aux.linein_demo->linein_ch, gain);
|
||||
audio_adc_linein1_0dB_en(1);
|
||||
g_aux.linein_demo->linein_ch_num += 1;
|
||||
}
|
||||
if (linein_idx & AUDIO_ADC_LINE2) {
|
||||
audio_adc_linein2_open(&g_aux.linein_demo->linein_ch, AUDIO_ADC_LINE2, &adc_hdl);
|
||||
audio_adc_linein2_set_gain(&g_aux.linein_demo->linein_ch, gain);
|
||||
audio_adc_linein2_0dB_en(1);
|
||||
g_aux.linein_demo->linein_ch_num += 1;
|
||||
|
||||
}
|
||||
if (linein_idx & AUDIO_ADC_LINE3) {
|
||||
audio_adc_linein3_open(&g_aux.linein_demo->linein_ch, AUDIO_ADC_LINE3, &adc_hdl);
|
||||
audio_adc_linein3_set_gain(&g_aux.linein_demo->linein_ch, gain);
|
||||
audio_adc_linein3_0dB_en(1);
|
||||
g_aux.linein_demo->linein_ch_num += 1;
|
||||
}
|
||||
//初始化cbuffer
|
||||
if (!g_aux.linein_demo->cbuf) {
|
||||
g_aux.linein_demo->cbuf = malloc(AUX_CBUF_SIZE);
|
||||
if (g_aux.linein_demo->cbuf) {
|
||||
cbuf_init(&g_aux.linein_demo->linein_cbuf, g_aux.linein_demo->cbuf, AUX_CBUF_SIZE);
|
||||
} else {
|
||||
r_printf("Error, Func:%s, Line:%d\n", __func__, __LINE__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//step1:设置linein通道采样率
|
||||
audio_adc_linein_set_sample_rate(&g_aux.linein_demo->linein_ch, sr);
|
||||
//step2:设置linein采样buf
|
||||
audio_adc_linein_set_buffs(&g_aux.linein_demo->linein_ch, g_aux.linein_demo->adc_buf, AUX_IRQ_POINTS * 2, AUX_BUF_NUM);
|
||||
//step3:设置linein采样输出回调函数
|
||||
g_aux.linein_demo->adc_output.handler = adc_linein_output_hdl;
|
||||
audio_adc_add_output_handler(&adc_hdl, &g_aux.linein_demo->adc_output);
|
||||
//step4:启动linein通道采样
|
||||
audio_adc_linein_start(&g_aux.linein_demo->linein_ch);
|
||||
|
||||
/*监听配置(可选)*/
|
||||
g_aux.linein_demo->adc_2_dac = linein_2_dac;
|
||||
g_aux.linein_demo->linein_idx = linein_idx;
|
||||
#if 0
|
||||
if (linein_2_dac) {
|
||||
printf("max_sys_vol:%d\n", get_max_sys_vol());
|
||||
app_audio_state_switch(APP_AUDIO_STATE_MUSIC, get_max_sys_vol());
|
||||
printf("cur_vol:%d\n", app_audio_get_volume(APP_AUDIO_STATE_MUSIC));
|
||||
audio_dac_set_volume(&dac_hdl, app_audio_get_volume(APP_AUDIO_STATE_MUSIC));
|
||||
audio_dac_set_sample_rate(&dac_hdl, sr);
|
||||
audio_dac_start(&dac_hdl);
|
||||
}
|
||||
#endif
|
||||
g_aux.linein_demo->start = 1;
|
||||
}
|
||||
printf("audio_adc_linein_demo start succ\n");
|
||||
}
|
||||
|
||||
/*
|
||||
*********************************************************************
|
||||
* AUDIO ADC linein CLOSE
|
||||
* Description: 关闭linein采样模块
|
||||
* Arguments : None.
|
||||
* Return : None.
|
||||
* Note(s) : None.
|
||||
*********************************************************************
|
||||
*/
|
||||
void audio_linein_close(void)
|
||||
{
|
||||
printf("\naudio_adc_linein_close\n");
|
||||
if (g_aux.linein_demo) {
|
||||
g_aux.linein_demo->start = 0;
|
||||
audio_adc_del_output_handler(&adc_hdl, &g_aux.linein_demo->adc_output);
|
||||
audio_adc_linein_close(&g_aux.linein_demo->linein_ch);
|
||||
local_irq_disable();
|
||||
if (g_aux.linein_demo->cbuf) {
|
||||
free(g_aux.linein_demo->cbuf);
|
||||
g_aux.linein_demo->cbuf = NULL;
|
||||
}
|
||||
free(g_aux.linein_demo);
|
||||
g_aux.linein_demo = NULL;
|
||||
local_irq_enable();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void app_aux_init()
|
||||
{
|
||||
log_info("app_aux_init");
|
||||
audio_linein_open(AUDIO_ADC_LINE1 | AUDIO_ADC_LINE0, 10, 44100, 1);
|
||||
pcm_audio_play_open(44100, g_aux.linein_demo->linein_ch_num);
|
||||
pcm_dec_set_read_cb(linein_data_read);
|
||||
}
|
||||
|
||||
static void app_aux_exit()
|
||||
{
|
||||
log_info("app_aux_exit");
|
||||
audio_linein_close();
|
||||
pcm_audio_play_close();
|
||||
g_aux.idle = 0;
|
||||
}
|
||||
|
||||
|
||||
static int app_aux_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
struct key_event *key = &event->u.key;
|
||||
int key_event = aux_key_table[key->value][key->event];
|
||||
log_info("key_event:%d %d %d\n", key_event, key->value, key->event);
|
||||
switch (key_event) {
|
||||
case KEY_MODE_SWITCH:
|
||||
log_info("KEY_MODE_SWITCH");
|
||||
app_task_switch_next();
|
||||
break;
|
||||
|
||||
case KEY_POWEROFF:
|
||||
goto_poweroff_cnt = 0;
|
||||
goto_poweroff_flag = 1;
|
||||
break;
|
||||
|
||||
case KEY_POWEROFF_HOLD:
|
||||
log_info("poweroff flag:%d cnt:%d\n", goto_poweroff_flag, goto_poweroff_cnt);
|
||||
|
||||
if (goto_poweroff_flag) {
|
||||
goto_poweroff_cnt++;
|
||||
if (goto_poweroff_cnt >= POWER_OFF_CNT) {
|
||||
goto_poweroff_cnt = 0;
|
||||
sys_enter_soft_poweroff(NULL);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_ANC_SWITCH:
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
extern void anc_mode_next(void);
|
||||
anc_mode_next();
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* 系统事件处理函数
|
||||
*/
|
||||
static int event_handler(struct application *app, struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_KEY_EVENT:
|
||||
/*
|
||||
* 普通按键消息处理
|
||||
*/
|
||||
return app_aux_key_event_handler(event);
|
||||
case SYS_BT_EVENT:
|
||||
/*
|
||||
* 蓝牙事件处理
|
||||
*/
|
||||
break;
|
||||
case SYS_DEVICE_EVENT:
|
||||
/*
|
||||
* 系统设备事件处理
|
||||
*/
|
||||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT) {
|
||||
/* app_task_switch_next(); */
|
||||
return true;
|
||||
}
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) {
|
||||
/* app_power_event_handler(&event->u.dev); */
|
||||
return true;
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
|
||||
#if TCFG_CHARGE_ENABLE
|
||||
/* app_charge_event_handler(&event->u.dev); */
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int state_machine(struct application *app, enum app_state state,
|
||||
struct intent *it)
|
||||
{
|
||||
switch (state) {
|
||||
case APP_STA_CREATE:
|
||||
log_info("APP_STA_CREATE");
|
||||
break;
|
||||
case APP_STA_START:
|
||||
log_info("APP_STA_START");
|
||||
if (!it) {
|
||||
break;
|
||||
}
|
||||
switch (it->action) {
|
||||
case ACTION_AUX_MAIN:
|
||||
y_printf("\n>>>>>>> Enter Linein Mode!\n");
|
||||
log_info("ACTION_AUX_MAIN");
|
||||
///按键使能
|
||||
sys_key_event_enable();
|
||||
//关闭自动关机
|
||||
sys_auto_shut_down_disable();
|
||||
app_aux_init();
|
||||
g_aux.idle = 1; //防止进入低功耗
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case APP_STA_PAUSE:
|
||||
log_info("APP_STA_PAUSE");
|
||||
app_aux_exit();
|
||||
break;
|
||||
case APP_STA_RESUME:
|
||||
log_info("APP_STA_RESUME");
|
||||
app_aux_init();
|
||||
break;
|
||||
case APP_STA_STOP:
|
||||
log_info("APP_STA_STOP");
|
||||
app_aux_exit();
|
||||
break;
|
||||
case APP_STA_DESTROY:
|
||||
log_info("APP_STA_DESTROY");
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct application_operation app_aux_ops = {
|
||||
.state_machine = state_machine,
|
||||
.event_handler = event_handler,
|
||||
};
|
||||
|
||||
/*
|
||||
* 注册aux模式
|
||||
*/
|
||||
REGISTER_APPLICATION(app_aux) = {
|
||||
.name = "aux",
|
||||
.action = ACTION_AUX_MAIN,
|
||||
.ops = &app_aux_ops,
|
||||
.state = APP_STA_DESTROY,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
254
apps/earphone/ll_sync_demo/ll_sync_demo.c
Normal file
254
apps/earphone/ll_sync_demo/ll_sync_demo.c
Normal file
@ -0,0 +1,254 @@
|
||||
#include "app_config.h"
|
||||
|
||||
|
||||
#include "earphone.h"
|
||||
#include "app_main.h"
|
||||
#include "3th_profile_api.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "btstack/btstack_task.h"
|
||||
#include "bt_tws.h"
|
||||
#include "ble_qiot_export.h"
|
||||
|
||||
#include "update_tws.h"
|
||||
#include "update_tws_new.h"
|
||||
|
||||
#if LL_SYNC_EN
|
||||
|
||||
#define LOG_TAG "[ll_sync]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
extern void ble_app_disconnect(void);
|
||||
|
||||
int ll_sync_earphone_state_set_page_scan_enable()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_earphone_state_get_connect_mac_addr()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_earphone_state_cancel_page_scan()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_earphone_state_tws_init(int paired)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_earphone_state_tws_connected(int first_pair, u8 *comm_addr)
|
||||
{
|
||||
if (first_pair) {
|
||||
extern void ble_module_enable(u8 en);
|
||||
extern void bt_update_mac_addr(u8 * addr);
|
||||
extern void lib_make_ble_address(u8 * ble_address, u8 * edr_address);
|
||||
/* bt_ble_adv_enable(0); */
|
||||
u8 tmp_ble_addr[6] = {0};
|
||||
lib_make_ble_address(tmp_ble_addr, comm_addr);
|
||||
le_controller_set_mac(tmp_ble_addr);//将ble广播地址改成公共地址
|
||||
bt_update_mac_addr(comm_addr);
|
||||
/* bt_ble_adv_enable(1); */
|
||||
|
||||
|
||||
/*新的连接,公共地址改变了,要重新将新的地址广播出去*/
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
printf("\nNew Connect Master!!!\n\n");
|
||||
ble_app_disconnect();
|
||||
ble_qiot_advertising_start();
|
||||
} else {
|
||||
printf("\nConnect Slave!!!\n\n");
|
||||
/*从机ble关掉*/
|
||||
ble_app_disconnect();
|
||||
ble_qiot_advertising_stop();
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_earphone_state_enter_soft_poweroff()
|
||||
{
|
||||
extern void bt_ble_exit(void);
|
||||
bt_ble_exit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ll_sync_adv_bt_status_event_handler(struct bt_event *bt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int ll_sync_adv_hci_event_handler(struct bt_event *bt)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ll_sync_bt_tws_event_handler(struct bt_event *bt)
|
||||
{
|
||||
int role = bt->args[0];
|
||||
int phone_link_connection = bt->args[1];
|
||||
int reason = bt->args[2];
|
||||
|
||||
switch (bt->event) {
|
||||
case TWS_EVENT_CONNECTED:
|
||||
//bt_ble_adv_enable(1);
|
||||
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
|
||||
//master enable
|
||||
printf("\nConnect Slave!!!\n\n");
|
||||
/*从机ble关掉*/
|
||||
ble_app_disconnect();
|
||||
ble_qiot_advertising_stop();
|
||||
} else {
|
||||
void bt_tws_sync_ll_sync_state();
|
||||
bt_tws_sync_ll_sync_state();
|
||||
}
|
||||
|
||||
break;
|
||||
case TWS_EVENT_PHONE_LINK_DETACH:
|
||||
/*
|
||||
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
|
||||
*/
|
||||
break;
|
||||
case TWS_EVENT_CONNECTION_DETACH:
|
||||
/*
|
||||
* TWS连接断开
|
||||
*/
|
||||
if (app_var.goto_poweroff_flag) {
|
||||
break;
|
||||
}
|
||||
if (get_app_connect_type() == 0) {
|
||||
printf("\ntws detach to open ble~~~\n\n");
|
||||
|
||||
ble_qiot_advertising_start();
|
||||
}
|
||||
set_ble_connect_type(TYPE_NULL);
|
||||
|
||||
break;
|
||||
case TWS_EVENT_SYNC_FUN_CMD:
|
||||
break;
|
||||
case TWS_EVENT_ROLE_SWITCH:
|
||||
break;
|
||||
}
|
||||
|
||||
#if OTA_TWS_SAME_TIME_ENABLE
|
||||
tws_ota_app_event_deal(bt->event);
|
||||
#endif
|
||||
}
|
||||
|
||||
int ll_sync_sys_event_handler_specific(struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_BT_EVENT:
|
||||
if ((u32)event->arg == SYS_BT_EVENT_TYPE_CON_STATUS) {
|
||||
|
||||
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
|
||||
|
||||
}
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
|
||||
ll_sync_bt_tws_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
#if OTA_TWS_SAME_TIME_ENABLE
|
||||
else if (((u32)event->arg == SYS_BT_OTA_EVENT_TYPE_STATUS)) {
|
||||
bt_ota_event_handler(&event->u.bt);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case SYS_DEVICE_EVENT:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* int user_spp_state_specific(u8 packet_type) */
|
||||
/* { */
|
||||
/* */
|
||||
/* switch (packet_type) { */
|
||||
/* case 1: */
|
||||
/* bt_ble_adv_enable(0); */
|
||||
/* set_app_connect_type(TYPE_SPP); */
|
||||
/* break; */
|
||||
/* case 2: */
|
||||
/* */
|
||||
/* set_app_connect_type(TYPE_NULL); */
|
||||
/* */
|
||||
/* #if TCFG_USER_TWS_ENABLE */
|
||||
/* if (!(tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)) { */
|
||||
/* ble_module_enable(1); */
|
||||
/* } else { */
|
||||
/* if (tws_api_get_role() == TWS_ROLE_MASTER) { */
|
||||
/* ble_module_enable(1); */
|
||||
/* } */
|
||||
/* } */
|
||||
/* #else */
|
||||
/* ble_module_enable(1); */
|
||||
/* #endif */
|
||||
/* */
|
||||
/* break; */
|
||||
/* } */
|
||||
/* return 0; */
|
||||
/* } */
|
||||
|
||||
|
||||
int ll_sync_earphone_state_init()
|
||||
{
|
||||
/* transport_spp_init(); */
|
||||
/* spp_data_deal_handle_register(user_spp_data_handler); */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
extern void ll_sync_state_deal(void *_data, u16 len);
|
||||
static void bt_tws_ll_sync_state(void *_data, u16 len, bool rx)
|
||||
{
|
||||
|
||||
if (rx) {
|
||||
//r_printf("slave ll sync data");
|
||||
//put_buf(_data,len);
|
||||
ll_sync_state_deal(_data, len);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
REGISTER_TWS_FUNC_STUB(app_ll_sync_state_stub) = {
|
||||
.func_id = TWS_FUNC_ID_LL_SYNC_STATE,
|
||||
.func = bt_tws_ll_sync_state,
|
||||
};
|
||||
|
||||
extern u16 ll_sync_get_core_data(u8 *data);
|
||||
void bt_tws_sync_ll_sync_state()
|
||||
{
|
||||
u8 data[20];
|
||||
u16 data_len;
|
||||
|
||||
if (tws_api_get_role() == TWS_ROLE_MASTER) {
|
||||
data_len = ll_sync_get_core_data(data);
|
||||
|
||||
//r_printf("master ll sync data");
|
||||
put_buf(&data, data_len);
|
||||
|
||||
|
||||
tws_api_send_data_to_sibling(data, data_len, TWS_FUNC_ID_LL_SYNC_STATE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
180
apps/earphone/log_config/app_config.c
Normal file
180
apps/earphone/log_config/app_config.c
Normal file
@ -0,0 +1,180 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : log_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化Log配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-18 14:45
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
#include "system/includes.h"
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Controller Log
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
const char log_tag_const_v_SETUP AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_SETUP AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_SETUP AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_d_SETUP AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_SETUP AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_BOARD AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_BOARD AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_BOARD AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_w_BOARD AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_BOARD AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_EARPHONE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_EARPHONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_EARPHONE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_EARPHONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_EARPHONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_UI AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_UI AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_UI AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_UI AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_UI AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_CHARGE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_CHARGE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_CHARGE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_CHARGE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_CHARGE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_ANCBOX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_ANCBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_ANCBOX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_ANCBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_ANCBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_KEY_EVENT_DEAL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_KEY_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_KEY_EVENT_DEAL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_KEY_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_KEY_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_CHARGESTORE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_CHARGESTORE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_UMIDIGI_CHARGESTORE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_UMIDIGI_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_UMIDIGI_CHARGESTORE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_UMIDIGI_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_UMIDIGI_CHARGESTORE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_CFG_TOOL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_CFG_TOOL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_CFG_TOOL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_CFG_TOOL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_CFG_TOOL AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_TESTBOX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_TESTBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_TESTBOX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_TESTBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_TESTBOX AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_IDLE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_IDLE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_IDLE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_IDLE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_IDLE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_POWER AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_POWER AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_POWER AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_POWER AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_POWER AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_USER_CFG AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_USER_CFG AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_USER_CFG AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_USER_CFG AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_USER_CFG AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_TONE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_TONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_TONE AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_TONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_TONE AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_BT_TWS AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_BT_TWS AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_BT_TWS AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_BT_TWS AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_BT_TWS AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_AEC_USER AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_AEC_USER AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_AEC_USER AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_AEC_USER AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_AEC_USER AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_BT_BLE AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_i_BT_BLE AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_d_BT_BLE AT(.LOG_TAG_CONST) = 1;
|
||||
const char log_tag_const_w_BT_BLE AT(.LOG_TAG_CONST) = 1;
|
||||
const char log_tag_const_e_BT_BLE AT(.LOG_TAG_CONST) = 1;
|
||||
|
||||
const char log_tag_const_v_EARTCH_EVENT_DEAL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_EARTCH_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_EARTCH_EVENT_DEAL AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_EARTCH_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_EARTCH_EVENT_DEAL AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_ONLINE_DB AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_i_ONLINE_DB AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_d_ONLINE_DB AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_w_ONLINE_DB AT(.LOG_TAG_CONST) = 0;
|
||||
const char log_tag_const_e_ONLINE_DB AT(.LOG_TAG_CONST) = 1;
|
||||
|
||||
const char log_tag_const_v_MUSIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_w_MUSIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_d_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_APP_MUSIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_APP_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_APP_MUSIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_APP_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_APP_MUSIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_PC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_PC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_w_PC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_d_PC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_PC AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_AUX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_AUX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_AUX AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_w_AUX AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_AUX AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_WIRELESSMIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_WIRELESSMIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_w_WIRELESSMIC AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_d_WIRELESSMIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_WIRELESSMIC AT(.LOG_TAG_CONST) = TRUE;
|
||||
|
||||
const char log_tag_const_v_KWS_VOICE_EVENT AT(.LOG_TAG_CONST) = FALSE;
|
||||
const char log_tag_const_i_KWS_VOICE_EVENT AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_d_KWS_VOICE_EVENT AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_w_KWS_VOICE_EVENT AT(.LOG_TAG_CONST) = TRUE;
|
||||
const char log_tag_const_e_KWS_VOICE_EVENT AT(.LOG_TAG_CONST) = TRUE;
|
||||
539
apps/earphone/log_config/lib_btctrler_config.c
Normal file
539
apps/earphone/log_config/lib_btctrler_config.c
Normal file
@ -0,0 +1,539 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : btctrler_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-16 11:49
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "btcontroller_config.h"
|
||||
#include "bt_common.h"
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Module
|
||||
*/
|
||||
|
||||
//固定使用正常发射功率的等级:0-使用不同模式的各自等级;1~10-固定发射功率等级
|
||||
const int config_force_bt_pwr_tab_using_normal_level = 0;
|
||||
const int CONFIG_BLE_SYNC_WORD_BIT = 30;
|
||||
const int CONFIG_LNA_CHECK_VAL = -80;
|
||||
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
|
||||
#if (BT_FOR_APP_EN || TCFG_USER_BLE_ENABLE)
|
||||
const int config_btctler_modules = BT_MODULE_CLASSIC | BT_MODULE_LE;
|
||||
#else
|
||||
#ifdef CONFIG_NEW_BREDR_ENABLE
|
||||
#if (BT_FOR_APP_EN)
|
||||
const int config_btctler_modules = (BT_MODULE_CLASSIC | BT_MODULE_LE);
|
||||
#else
|
||||
const int config_btctler_modules = (BT_MODULE_CLASSIC);
|
||||
#endif
|
||||
#else
|
||||
const int config_btctler_modules = (BT_MODULE_CLASSIC | BT_MODULE_LE);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_NEW_BREDR_ENABLE
|
||||
const int config_btctler_le_tws = 0;
|
||||
const int CONFIG_BTCTLER_FAST_CONNECT_ENABLE = 0;
|
||||
#if TCFG_DEC2TWS_ENABLE
|
||||
const int CONFIG_TWS_WORK_MODE = 1;
|
||||
#else
|
||||
const int CONFIG_TWS_WORK_MODE = 2;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SUPPORT_EX_TWS_ADJUST
|
||||
const int CONFIG_EX_TWS_ADJUST = 1;
|
||||
#else
|
||||
const int CONFIG_EX_TWS_ADJUST = 0;
|
||||
#endif
|
||||
const int CONFIG_EXTWS_NACK_LIMIT_INT_CNT = 4;
|
||||
|
||||
const int CONFIG_TWS_RUN_SLOT = 200;
|
||||
const int CONFIG_PHONE_RUN_SLOT = 160;
|
||||
const int CONFIG_TWS_LOW_LATENCY_RUN_SLOT = 8;
|
||||
const int CONFIG_PHONE_LOW_LATENCY_RUN_SLOT = 120;
|
||||
const int CONFIG_TWS_FORWARD_TIMEOUT = 64;
|
||||
#else
|
||||
const int config_btctler_le_tws = 1;
|
||||
const int CONFIG_BTCTLER_FAST_CONNECT_ENABLE = 0;
|
||||
#endif
|
||||
|
||||
const int CONFIG_BTCTLER_TWS_ENABLE = 1;
|
||||
|
||||
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
const int CONFIG_TWS_POWER_BALANCE_ENABLE = 0;
|
||||
const int CONFIG_LOW_LATENCY_ENABLE = 0;
|
||||
const int CONFIG_TWS_AFH_ENABLE = 0;
|
||||
#else
|
||||
const int CONFIG_TWS_POWER_BALANCE_ENABLE = 1;
|
||||
const int CONFIG_LOW_LATENCY_ENABLE = 1;
|
||||
const int CONFIG_TWS_AFH_ENABLE = 1;
|
||||
#endif
|
||||
const int CONFIG_MASTER_MAX_RX_BULK_PERSENT = 70;
|
||||
|
||||
#else //TCFG_USER_TWS_ENABLE
|
||||
|
||||
/* #if (TCFG_USER_BLE_ENABLE || GMA_EN) */
|
||||
#if (TCFG_USER_BLE_ENABLE)
|
||||
const int config_btctler_modules = BT_MODULE_CLASSIC | BT_MODULE_LE;
|
||||
#else
|
||||
const int config_btctler_modules = BT_MODULE_CLASSIC;
|
||||
#endif
|
||||
const int config_btctler_le_tws = 0;
|
||||
const int CONFIG_BTCTLER_TWS_ENABLE = 0;
|
||||
const int CONFIG_TWS_AFH_ENABLE = 0;
|
||||
const int CONFIG_LOW_LATENCY_ENABLE = 0;
|
||||
const int CONFIG_MASTER_MAX_RX_BULK_PERSENT = 0;
|
||||
const int CONFIG_TWS_POWER_BALANCE_ENABLE = 0;
|
||||
const int CONFIG_BTCTLER_FAST_CONNECT_ENABLE = 0;
|
||||
|
||||
#endif
|
||||
|
||||
const int CONFIG_A2DP_MAX_BUF_SIZE = 20 * 1024;
|
||||
const int CONFIG_BT_TX_BUFF_MAX_SIZE = 10 * 1024;
|
||||
const int CONFIG_TWS_SUPER_TIMEOUT = 2000;
|
||||
const int CONFIG_BTCTLER_QOS_ENABLE = 1;
|
||||
const int CONFIG_A2DP_DATA_CACHE_LOW_AAC = 100;
|
||||
const int CONFIG_A2DP_DATA_CACHE_HI_AAC = 250;
|
||||
const int CONFIG_A2DP_DATA_CACHE_LOW_SBC = 150;
|
||||
const int CONFIG_A2DP_DATA_CACHE_HI_SBC = 260;
|
||||
#if TCFG_EQ_ONLINE_ENABLE
|
||||
const int CONFIG_A2DP_DELAY_TIME = 200;//调音时,减少延时,避免影响频响测试
|
||||
#else
|
||||
const int CONFIG_A2DP_DELAY_TIME = 340;
|
||||
#endif
|
||||
const int CONFIG_A2DP_DELAY_TIME_LO = 100;
|
||||
#ifdef CONFIG_A2DP_GAME_MODE_DELAY_TIME
|
||||
const int CONFIG_A2DP_SBC_DELAY_TIME_LO = CONFIG_A2DP_GAME_MODE_DELAY_TIME + 12;
|
||||
#else
|
||||
const int CONFIG_A2DP_SBC_DELAY_TIME_LO = 75;
|
||||
#endif
|
||||
|
||||
const int CONFIG_PAGE_POWER = 4;
|
||||
const int CONFIG_PAGE_SCAN_POWER = 7;
|
||||
const int CONFIG_INQUIRY_POWER = 7;
|
||||
const int CONFIG_INQUIRY_SCAN_POWER = 7;
|
||||
const int CONFIG_DUT_POWER = 10;
|
||||
|
||||
#if (CONFIG_BT_MODE != BT_NORMAL)
|
||||
const int config_btctler_hci_standard = 1;
|
||||
#else
|
||||
const int config_btctler_hci_standard = 0;
|
||||
#endif
|
||||
|
||||
const int config_btctler_mode = CONFIG_BT_MODE;
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Classic setting
|
||||
*/
|
||||
const u8 rx_fre_offset_adjust_enable = 1;
|
||||
|
||||
const int config_bredr_fcc_fix_fre = 0;
|
||||
const int ble_disable_wait_enable = 1;
|
||||
|
||||
const int config_btctler_eir_version_info_len = 21;
|
||||
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
const int CONFIG_TEST_DUT_CODE = 1;
|
||||
const int CONFIG_TEST_FCC_CODE = 0;
|
||||
const int CONFIG_TEST_DUT_ONLY_BOX_CODE = 1;
|
||||
#else
|
||||
const int CONFIG_TEST_DUT_CODE = 1;
|
||||
const int CONFIG_TEST_FCC_CODE = 1;
|
||||
const int CONFIG_TEST_DUT_ONLY_BOX_CODE = 0;
|
||||
#endif
|
||||
|
||||
const int CONFIG_ESCO_MUX_RX_BULK_ENABLE = 0;
|
||||
|
||||
#if TCFG_USER_EMITTER_ENABLE
|
||||
const int CONFIG_BREDR_INQUIRY = 1;
|
||||
const int CONFIG_LMP_MASTER_ESCO_ENABLE = 1;
|
||||
#else
|
||||
const int CONFIG_BREDR_INQUIRY = 0;
|
||||
const int CONFIG_LMP_MASTER_ESCO_ENABLE = 0;
|
||||
#endif
|
||||
const int CONFIG_INQUIRY_PAGE_OFFSET_ADJUST = 0;
|
||||
|
||||
const int CONFIG_LMP_NAME_REQ_ENABLE = 0;
|
||||
const int CONFIG_LMP_PASSKEY_ENABLE = 0;
|
||||
|
||||
// *INDENT-OFF*
|
||||
#ifdef CONFIG_SUPPORT_WIFI_DETECT
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
const int CONFIG_WIFI_DETECT_ENABLE = 1;
|
||||
#else
|
||||
const int CONFIG_WIFI_DETECT_ENABLE = 1;
|
||||
#endif
|
||||
|
||||
#else
|
||||
const int CONFIG_WIFI_DETECT_ENABLE = 0;
|
||||
|
||||
#endif
|
||||
|
||||
const int ESCO_FORWARD_ENABLE = 0;
|
||||
// *INDENT-ON*
|
||||
|
||||
|
||||
const int config_bt_function = 0;
|
||||
|
||||
///bredr 强制 做 maseter
|
||||
const int config_btctler_bredr_master = 0;
|
||||
const int config_btctler_dual_a2dp = 0;
|
||||
|
||||
///afh maseter 使用app设置的map 通过USER_CTRL_AFH_CHANNEL 设置
|
||||
const int config_bredr_afh_user = 0;
|
||||
//bt PLL 温度跟随trim
|
||||
const int config_bt_temperature_pll_trim = 0;
|
||||
/*security check*/
|
||||
const int config_bt_security_vulnerability = 0;
|
||||
|
||||
const int config_delete_link_key = 1; //配置是否连接失败返回PIN or Link Key Missing时删除linkKey
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Bluetooth LE setting
|
||||
*/
|
||||
|
||||
#if (TCFG_USER_BLE_ENABLE)
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
|
||||
const int config_btctler_le_roles = (LE_ADV);
|
||||
const uint64_t config_btctler_le_features = 0;
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_CLIENT)
|
||||
const uint64_t config_btctler_le_features = LE_ENCRYPTION | LE_CODED_PHY | LE_DATA_PACKET_LENGTH_EXTENSION | LE_2M_PHY;
|
||||
const int config_btctler_le_roles = (LE_SCAN | LE_INIT | LE_MASTER);
|
||||
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_SERVER)
|
||||
const int config_btctler_le_roles = (LE_ADV | LE_SLAVE);
|
||||
const uint64_t config_btctler_le_features = LE_ENCRYPTION | LE_CODED_PHY | LE_DATA_PACKET_LENGTH_EXTENSION | LE_2M_PHY;
|
||||
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_LE_AUDIO_CENTRAL)
|
||||
const int config_btctler_le_roles = (LE_SCAN | LE_INIT | LE_MASTER);
|
||||
const uint64_t config_btctler_le_features = LE_ENCRYPTION | LE_CODED_PHY | LE_FEATURES_ISO | LE_2M_PHY;
|
||||
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_LE_AUDIO_PERIPHERAL)
|
||||
const int config_btctler_le_roles = (LE_ADV | LE_SLAVE);
|
||||
const uint64_t config_btctler_le_features = LE_ENCRYPTION | LE_CODED_PHY | LE_FEATURES_ISO | LE_2M_PHY;
|
||||
|
||||
#elif (BLE_HID_EN)
|
||||
const int config_btctler_le_roles = (LE_ADV | LE_SLAVE);
|
||||
const uint64_t config_btctler_le_features = LE_ENCRYPTION;
|
||||
|
||||
#else
|
||||
const int config_btctler_le_roles = (LE_ADV | LE_SLAVE);
|
||||
const uint64_t config_btctler_le_features = 0;
|
||||
#endif
|
||||
#else
|
||||
const int config_btctler_le_roles = 0;
|
||||
const uint64_t config_btctler_le_features = 0;
|
||||
#endif
|
||||
|
||||
|
||||
// Master multi-link
|
||||
const int config_btctler_le_master_multilink = 0;
|
||||
// LE RAM Control
|
||||
|
||||
#ifdef CONFIG_NEW_BREDR_ENABLE
|
||||
const int config_btctler_le_hw_nums = 1;
|
||||
#else
|
||||
const int config_btctler_le_hw_nums = 2;
|
||||
#endif
|
||||
|
||||
|
||||
const int config_btctler_le_slave_conn_update_winden = 2500;//range:100 to 2500
|
||||
|
||||
// LE vendor baseband
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_CLIENT)
|
||||
//const u32 config_vendor_le_bb = VENDOR_BB_MD_CLOSE |
|
||||
//VENDOR_BB_CONNECT_SLOT |
|
||||
//VENDOR_BB_EVT_HOLD |
|
||||
//VENDOR_BB_EVT_HOLD_TRIGG(25) |
|
||||
//VENDOR_BB_EVT_HOLD_TICK(0); //LE vendor baseband
|
||||
const u32 config_vendor_le_bb = VENDOR_BB_MD_CLOSE | VENDOR_BB_CONNECT_SLOT | VENDOR_BB_ADV_PDU_INT(3);//LE vendor baseband
|
||||
// Master AFH
|
||||
const int config_btctler_le_afh_en = 1;
|
||||
const int config_btctler_le_rx_nums = 8;
|
||||
const int config_btctler_le_acl_packet_length = 251;
|
||||
const int config_btctler_le_acl_total_nums = 1;
|
||||
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_SERVER)
|
||||
const u32 config_vendor_le_bb = VENDOR_BB_MD_CLOSE | VENDOR_BB_CONNECT_SLOT | VENDOR_BB_ADV_PDU_INT(3);//LE vendor baseband
|
||||
// Master AFH
|
||||
const int config_btctler_le_afh_en = 1;
|
||||
const int config_btctler_le_rx_nums = 8;
|
||||
const int config_btctler_le_acl_packet_length = 251;
|
||||
const int config_btctler_le_acl_total_nums = 1;
|
||||
|
||||
#else
|
||||
// Master AFH
|
||||
const int config_btctler_le_afh_en = 0;
|
||||
const u32 config_vendor_le_bb = 0;
|
||||
|
||||
const int config_btctler_le_rx_nums = 5;
|
||||
const int config_btctler_le_acl_packet_length = 27;
|
||||
const int config_btctler_le_acl_total_nums = 5;
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
/**
|
||||
* @brief Bluetooth Analog setting
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
#if ((!TCFG_USER_BT_CLASSIC_ENABLE) && TCFG_USER_BLE_ENABLE)
|
||||
const int config_btctler_single_carrier_en = 1; ////单模ble才设置
|
||||
#else
|
||||
const int config_btctler_single_carrier_en = 0;
|
||||
#endif
|
||||
|
||||
const int sniff_support_reset_anchor_point = 0; //sniff状态下是否支持reset到最近一次通信点,用于HID
|
||||
|
||||
const int sniff_long_interval = (500 / 0.625); //sniff状态下进入long interval的通信间隔(ms)
|
||||
|
||||
const int config_rf_oob = 0;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* @brief Log (Verbose/Info/Debug/Warn/Error)
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
//RF part
|
||||
const char log_tag_const_v_Analog AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_Analog AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_Analog AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_Analog AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_Analog AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_RF AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_RF AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_RF AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_RF AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_RF AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
//Classic part
|
||||
const char log_tag_const_v_HCI_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_HCI_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_HCI_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_HCI_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_HCI_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
//LE part
|
||||
const char log_tag_const_v_LE_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LE_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LE_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_LE_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_LE_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LE5_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LE5_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LE5_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LE5_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LE5_BB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_HCI_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_HCI_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_HCI_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_HCI_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_HCI_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_LL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_E AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_E AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_E AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_E AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_E AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_M AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_M AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_M AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_M AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_M AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_EXT_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_EXT_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_EXT_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_EXT_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_EXT_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_EXT_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_EXT_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_EXT_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_EXT_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_EXT_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_EXT_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_EXT_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_EXT_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_EXT_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_EXT_INIT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_TWS_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_TWS_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_TWS_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_TWS_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_TWS_ADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_TWS_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_TWS_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_TWS_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_TWS_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_TWS_SCAN AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_S AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_S AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LL_S AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_S AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_S AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_RL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_RL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LL_RL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_RL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_RL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_WL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_WL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LL_WL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_WL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_WL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_AES AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AES AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AES AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_AES AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_AES AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_PADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_PADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_PADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_PADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_PADV AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_DX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_DX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_DX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_DX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_DX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_PHY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_PHY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_PHY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_PHY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_PHY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_AFH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_AFH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LL_AFH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_LL_AFH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_AFH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
//HCI part
|
||||
const char log_tag_const_v_Thread AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_Thread AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_Thread AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_Thread AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_Thread AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_HCI_STD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_HCI_STD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_HCI_STD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_HCI_STD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_HCI_STD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_HCI_LL5 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_HCI_LL5 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_HCI_LL5 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_HCI_LL5 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_HCI_LL5 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_ISO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_i_LL_ISO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_LL_ISO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_ISO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_ISO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_BIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_BIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_BIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_BIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_BIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_LL_CIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_LL_CIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_LL_CIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_LL_CIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_LL_CIS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_c_BL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
|
||||
const char log_tag_const_v_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_i_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_TWS_LE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
|
||||
const char log_tag_const_v_TWS_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_i_TWS_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_TWS_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_TWS_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_TWS_LMP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_TWS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_TWS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_TWS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_TWS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_e_TWS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
|
||||
const char log_tag_const_v_TWS_ESCO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_i_TWS_ESCO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_TWS_ESCO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_TWS_ESCO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_TWS_ESCO AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
85
apps/earphone/log_config/lib_btstack_config.c
Normal file
85
apps/earphone/log_config/lib_btstack_config.c
Normal file
@ -0,0 +1,85 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : btstack_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-16 11:49
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "btcontroller_config.h"
|
||||
#include "bt_common.h"
|
||||
|
||||
/**
|
||||
* @brief Bluetooth Stack Module
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_SOUNDBOX_FLASH_256K
|
||||
const int CONFIG_BTSTACK_BIG_FLASH_ENABLE = 0;
|
||||
#else
|
||||
const int CONFIG_BTSTACK_BIG_FLASH_ENABLE = 1;
|
||||
#endif
|
||||
|
||||
|
||||
#if TCFG_BT_SUPPORT_AAC
|
||||
const int CONFIG_BTSTACK_SUPPORT_AAC = 1;
|
||||
#else
|
||||
const int CONFIG_BTSTACK_SUPPORT_AAC = 0;
|
||||
#endif
|
||||
|
||||
#if TCFG_BT_SUPPORT_LDAC
|
||||
const int CONFIG_BTSTACK_SUPPORT_LDAC = 1;
|
||||
#else
|
||||
const int CONFIG_BTSTACK_SUPPORT_LDAC = 0;
|
||||
#endif
|
||||
//协议栈接收到命令是否自动退出sniff
|
||||
const int config_btstask_auto_exit_sniff = 1;
|
||||
|
||||
|
||||
|
||||
#if SMART_BOX_EN
|
||||
const int config_rcsp_stack_enable = 1;
|
||||
#else
|
||||
const int config_rcsp_stack_enable = 0;
|
||||
#endif
|
||||
|
||||
#if (TCFG_USER_BLE_ENABLE)
|
||||
//le 配置,可以优化代码和RAM
|
||||
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_CLIENT)
|
||||
const int config_le_hci_connection_num = 1;//支持同时连接个数
|
||||
const int config_le_sm_support_enable = 0; //是否支持加密配对
|
||||
const int config_le_gatt_client_num = 1; //支持client角色个数
|
||||
const int config_le_gatt_server_num = 0; //支持server角色个数
|
||||
|
||||
#elif (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_WIRELESS_MIC_SERVER)
|
||||
const int config_le_hci_connection_num = 1;//支持同时连接个数
|
||||
const int config_le_sm_support_enable = 0; //是否支持加密配对
|
||||
const int config_le_gatt_client_num = 0; //支持client角色个数
|
||||
const int config_le_gatt_server_num = 1; //支持server角色个数
|
||||
|
||||
#elif (BLE_HID_EN)
|
||||
const int config_le_hci_connection_num = 1;//支持同时连接个数
|
||||
const int config_le_sm_support_enable = 1; //是否支持加密配对
|
||||
const int config_le_gatt_server_num = 1; //支持server角色个数
|
||||
const int config_le_gatt_client_num = 0; //支持client角色个数
|
||||
|
||||
#else
|
||||
const int config_le_hci_connection_num = 1;//支持同时连接个数
|
||||
const int config_le_sm_support_enable = 0; //是否支持加密配对
|
||||
const int config_le_gatt_server_num = 1; //支持server角色个数
|
||||
const int config_le_gatt_client_num = 0; //支持client角色个数
|
||||
#endif
|
||||
|
||||
#else
|
||||
//no ble
|
||||
const int config_le_hci_connection_num = 0;//支持同时连接个数
|
||||
const int config_le_sm_support_enable = 0; //是否支持加密配对
|
||||
const int config_le_gatt_server_num = 0; //支持server角色个数
|
||||
const int config_le_gatt_client_num = 0; //支持client角色个数
|
||||
#endif
|
||||
231
apps/earphone/log_config/lib_driver_config.c
Normal file
231
apps/earphone/log_config/lib_driver_config.c
Normal file
@ -0,0 +1,231 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : lib_driver_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-18 14:58
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
|
||||
#if TCFG_SD0_SD1_USE_THE_SAME_HW
|
||||
const int sd0_sd1_use_the_same_hw = 1;
|
||||
#else
|
||||
const int sd0_sd1_use_the_same_hw = 0;
|
||||
#endif
|
||||
#ifdef CONFIG_MOVABLE_ENABLE
|
||||
const int config_spi_code_user_cache = 1;
|
||||
#else
|
||||
const int config_spi_code_user_cache = 0;
|
||||
#endif
|
||||
|
||||
#if TCFG_KEEP_CARD_AT_ACTIVE_STATUS
|
||||
const int keep_card_at_active_status = 1;
|
||||
#else
|
||||
const int keep_card_at_active_status = 0;
|
||||
#endif
|
||||
|
||||
#if TCFG_SDX_CAN_OPERATE_MMC_CARD
|
||||
const int sdx_can_operate_mmc_card = TCFG_SDX_CAN_OPERATE_MMC_CARD;
|
||||
#else
|
||||
const int sdx_can_operate_mmc_card = 0;
|
||||
#endif
|
||||
|
||||
#if TCFG_POWER_MODE_QUIET_ENABLE
|
||||
const int config_dcdc_mode = 1;
|
||||
#else
|
||||
const int config_dcdc_mode = 0;
|
||||
#endif
|
||||
|
||||
#if(TCFG_CLOCK_SYS_SRC == SYS_CLOCK_INPUT_PLL_RCL) //系统时钟源选择
|
||||
const int clock_sys_src_use_lrc_hw = 1; //当使用lrc时timer.c需要特殊设置
|
||||
#else
|
||||
const int clock_sys_src_use_lrc_hw = 0;
|
||||
#endif
|
||||
|
||||
#ifdef TCFG_VAD_LOWPOWER_CLOCK
|
||||
const char config_vad_lowpower_clock = TCFG_VAD_LOWPOWER_CLOCK;
|
||||
#else
|
||||
const char config_vad_lowpower_clock = 0;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_BR28) || ((TCFG_OTG_MODE & OTG_DET_DM_ONLY) != 0)
|
||||
const int config_otg_slave_detect_method_2 = 1;
|
||||
#else
|
||||
const int config_otg_slave_detect_method_2 = 0;
|
||||
#endif
|
||||
/**
|
||||
* @brief Log (Verbose/Info/Debug/Warn/Error)
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
const char log_tag_const_v_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
|
||||
const char log_tag_const_i_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
|
||||
const char log_tag_const_d_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_w_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
|
||||
const char log_tag_const_i_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_w_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
//audio dac
|
||||
const char log_tag_const_v_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
|
||||
const char log_tag_const_v_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
|
||||
const char log_tag_const_v_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
const char log_tag_const_v_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
const char log_tag_const_v_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
|
||||
const char log_tag_const_d_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
const char log_tag_const_v_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_w_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_e_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
|
||||
const char log_tag_const_v_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_d_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_w_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_w_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
544
apps/earphone/log_config/lib_media_config.c
Normal file
544
apps/earphone/log_config/lib_media_config.c
Normal file
@ -0,0 +1,544 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : lib_driver_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-18 14:58
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "media/includes.h"
|
||||
#include "audio_adc.h"
|
||||
#include "audio_config.h"
|
||||
#include "media/hw_fft.h"
|
||||
#if TCFG_AUDIO_ANC_ENABLE
|
||||
#include "audio_anc.h"
|
||||
#endif
|
||||
|
||||
#if (TCFG_AUDIO_DECODER_OCCUPY_TRACE)
|
||||
const u8 audio_decoder_occupy_trace_enable = 1;
|
||||
const u8 audio_decoder_occupy_trace_dump = 0;
|
||||
#else
|
||||
const u8 audio_decoder_occupy_trace_enable = 0;
|
||||
const u8 audio_decoder_occupy_trace_dump = 0;
|
||||
#endif/*TCFG_AUDIO_DECODER_OCCUPY_TRACE*/
|
||||
|
||||
|
||||
const int JL_HW_FFT_V = FFT_EXT ; //FFT硬件版本
|
||||
|
||||
/* #if (TCFG_APP_MUSIC_EN && !TCFG_DEC2TWS_ENABLE) */
|
||||
|
||||
const int WMA_TWSDEC_EN = 0; // wma tws 解码控制
|
||||
|
||||
// 解码一次输出点数,1代表32对点,n就是n*32对点
|
||||
// 超过1时,解码需要使用malloc,如config_mp3_dec_use_malloc=1
|
||||
const int MP3_OUTPUT_LEN = 1;
|
||||
const int WMA_OUTPUT_LEN = 1;
|
||||
|
||||
|
||||
#define FAST_FREQ_restrict 0x01 //限制超过16k的频率不解【一般超出人耳听力范围,但是仪器会测出来】
|
||||
#define FAST_FILTER_restrict 0x02 //限制滤波器长度【子带滤波器旁瓣加大,边缘不够陡】
|
||||
#define FAST_CHANNEL_restrict 0x04 //混合左右声道,再解码【如果是左右声道独立性较强的歌曲,会牺牲空间感,特别耳机听会听出来的话】
|
||||
const int config_mp3_dec_speed_mode = 0;//FAST_FREQ_restrict | FAST_FILTER_restrict | FAST_CHANNEL_restrict; //3个开关都置上,是最快的解码模式
|
||||
/* #endif // (TCFG_APP_MUSIC_EN && !TCFG_DEC2TWS_ENABLE) */
|
||||
|
||||
|
||||
const int WAV_MAX_BITRATEV = (48 * 2 * 32); // wav最大支持比特率,单位kbps
|
||||
|
||||
|
||||
// 解码一次输出点数,建议范围32到900,例如128代表128对点
|
||||
// 超过128时,解码需要使用malloc,如config_wav_dec_use_malloc=1
|
||||
const int WAV_DECODER_PCM_POINTS = 128;
|
||||
|
||||
// output超过128时,如果不使用malloc,需要增大对应buf
|
||||
// 可以看打印中解码器需要的大小,一般输出每增加1长度增加4个字节
|
||||
int wav_mem_ext[(1336 + 3) / 4] SEC(.wav_mem); //超过128要增加这个数组的大小
|
||||
|
||||
const int OPUS_SRINDEX = 0; //选择opus解码文件的帧大小,0代表一帧40字节,1代表一帧80字节,2代表一帧160字节
|
||||
|
||||
const int WTGV2_STACK2BUF = 0; //等于1时解码buf会加大760,栈会减小
|
||||
|
||||
const int const_sel_adpcm_type = 0;//1:使用imaen_adpcm, 0:msen_adpcm
|
||||
|
||||
#ifdef CONFIG_MIDI_DEC_ADDR
|
||||
const int MIDI_TONE_MODE = 0;//0是地址访问(仅支持在内置flash,读数快,消耗mips低),1 是文件访问(内置、外挂flash,sd,u盘均可,读数慢,消耗mips较大)
|
||||
#else
|
||||
const int MIDI_TONE_MODE = 1;
|
||||
#endif
|
||||
const int MAINTRACK_USE_CHN = 0; //MAINTRACK_USE_CHN控制主通道区分方式; 0用track号区分主通道 1用chn号区分主通道
|
||||
const int MAX_PLAYER_CNT = 18; //控制可配置的最大同时发声的key数的BUF[1,32]
|
||||
|
||||
#if CONFIG_MEDIA_LIB_USE_MALLOC
|
||||
const int config_mp3_dec_use_malloc = 1;
|
||||
const int config_mp3pick_dec_use_malloc = 1;
|
||||
const int config_wma_dec_use_malloc = 1;
|
||||
const int config_wmapick_dec_use_malloc = 1;
|
||||
const int config_m4a_dec_use_malloc = 1;
|
||||
const int config_m4apick_dec_use_malloc = 1;
|
||||
const int config_wav_dec_use_malloc = 1;
|
||||
const int config_alac_dec_use_malloc = 1;
|
||||
const int config_dts_dec_use_malloc = 1;
|
||||
const int config_amr_dec_use_malloc = 1;
|
||||
const int config_flac_dec_use_malloc = 1;
|
||||
const int config_ape_dec_use_malloc = 1;
|
||||
const int config_aac_dec_use_malloc = 1;
|
||||
const int config_ldac_dec_use_malloc = 1;
|
||||
const int config_aptx_dec_use_malloc = 1;
|
||||
const int config_midi_dec_use_malloc = 1;
|
||||
const int config_lc3_dec_use_malloc = 1;
|
||||
const int config_speex_dec_use_malloc = 1;
|
||||
const int config_opus_dec_use_malloc = 1;
|
||||
#else
|
||||
const int config_mp3_dec_use_malloc = 0;
|
||||
const int config_mp3pick_dec_use_malloc = 0;
|
||||
const int config_wma_dec_use_malloc = 0;
|
||||
const int config_wmapick_dec_use_malloc = 0;
|
||||
const int config_m4a_dec_use_malloc = 0;
|
||||
const int config_m4apick_dec_use_malloc = 0;
|
||||
const int config_wav_dec_use_malloc = 0;
|
||||
const int config_alac_dec_use_malloc = 0;
|
||||
const int config_dts_dec_use_malloc = 0;
|
||||
const int config_amr_dec_use_malloc = 0;
|
||||
const int config_flac_dec_use_malloc = 0;
|
||||
const int config_ape_dec_use_malloc = 0;
|
||||
const int config_aac_dec_use_malloc = 0;
|
||||
const int config_ldac_dec_use_malloc = 0;
|
||||
const int config_aptx_dec_use_malloc = 0;
|
||||
const int config_midi_dec_use_malloc = 0;
|
||||
const int config_lc3_dec_use_malloc = 0;
|
||||
const int config_speex_dec_use_malloc = 0;
|
||||
const int config_opus_dec_use_malloc = 0;
|
||||
|
||||
#endif
|
||||
|
||||
const int LC3_SUPPORT_CH = 2; //lc3解码输入通道数 1:单声道输入, 2:双声道输入(br30可支持2)
|
||||
const int LC3_DMS_VAL = 25; //单位ms, 【只支持 25,50,100】
|
||||
const int LC3_DMS_FSINDEX = 4; //配置采样率【只支持0到4】,影响用哪组表以及一次的处理长度(<=8k的时候,配0. <=16k的时候,配1.<=24k的时候,配2.<=32k的时候,配3.<=48k的时候,配4)
|
||||
const int LC3_QUALTIY_CONFIG = 4;//【范围1到4, 1需要的速度最少,这个默认先配4】
|
||||
|
||||
//wts解码支持采样率可选择,可以同时打开也可以单独打开
|
||||
const int silk_fsN_enable = 1; //支持8-12k采样率
|
||||
const int silk_fsW_enable = 1; //支持16-24k采样率
|
||||
|
||||
/*省电容mic使能配置*/
|
||||
#if TCFG_SUPPORT_MIC_CAPLESS
|
||||
const u8 const_mic_capless_en = 1;
|
||||
#else
|
||||
const u8 const_mic_capless_en = 0;
|
||||
#endif/*TCFG_SUPPORT_MIC_CAPLESS*/
|
||||
|
||||
// 快进快退到文件end返回结束消息
|
||||
const int config_decoder_ff_fr_end_return_event_end = 0;
|
||||
|
||||
|
||||
const int config_audio_eq_en = 0
|
||||
#if TCFG_EQ_ENABLE
|
||||
| EQ_EN //eq使能
|
||||
#if TCFG_EQ_ONLINE_ENABLE
|
||||
| EQ_ONLINE_EN //在线调试使能
|
||||
#endif/*TCFG_AUDIO_OUT_EQ_ENABLE*/
|
||||
#if TCFG_USE_EQ_FILE
|
||||
| EQ_FILE_EN //使用eq_cfg_hw.bin文件效果
|
||||
|
||||
#if TCFG_EQ_FILE_SWITCH_EN
|
||||
| EQ_FILE_SWITCH_EN //使能eq_cfg_hw.bin多文件切换,对应旧版config_audio_eq_file_sw_en
|
||||
#endif
|
||||
#endif/*TCFG_USE_EQ_FILE*/
|
||||
#if TCFG_AUDIO_OUT_EQ_ENABLE
|
||||
| EQ_HIGH_BASS_EN //高低音接口使能
|
||||
| EQ_HIGH_BASS_FADE_EN //高低音接口数据更新使用淡入淡出,配合config_audio_eq_fade_step步进使用
|
||||
#endif/*TCFG_AUDIO_OUT_EQ_ENABLE*/
|
||||
#if (RCSP_ADV_EN)&&(JL_EARPHONE_APP_EN)&&(TCFG_DRC_ENABLE == 0)
|
||||
/* |EQ_FILTER_COEFF_LIMITER_ZERO_EN */
|
||||
#endif
|
||||
#ifndef CONFIG_SOUNDBOX_FLASH_256K
|
||||
| EQ_HW_UPDATE_COEFF_ONLY_EN
|
||||
| EQ_HW_LR_ALONE
|
||||
#endif/* CONFIG_SOUNDBOX_FLASH_256K */
|
||||
#if defined(EQ_CORE_V1) && TCFG_DRC_ENABLE
|
||||
| EQ_SUPPORT_MULIT_CHANNEL_EN //eq是否支持多声道(3~8) 打开:支持 否则:仅支持1~2声道*/
|
||||
| EQ_HW_CROSSOVER_TYPE0_EN //硬件分频器用序列进序列出
|
||||
//|EQ_HW_CROSSOVER_TYPE1_EN //硬件分频器使用块出方式,会增加mem(该方式仅支持单声道处理)
|
||||
#endif/*(EQ_CORE_V1) && TCFG_DRC_ENABLE*/
|
||||
#if defined(TCFG_EQ_DIVIDE_ENABLE) && TCFG_EQ_DIVIDE_ENABLE
|
||||
| EQ_LR_DIVIDE_EN
|
||||
#endif/*TCFG_EQ_DIVIDE_ENABLE*/
|
||||
|
||||
#if defined(EQ_LITE_CODE) && EQ_LITE_CODE
|
||||
| EQ_LITE_VER_EN //不支持异步,不支持默认效果切换接口,仅支持文件解析
|
||||
#if TCFG_DRC_ENABLE
|
||||
| EQ_SUPPORT_32BIT_SYNC_EN //32bit同步方式eq使能,eq_lite_en后,该宏需使能
|
||||
#endif/*TCFG_DRC_ENABLE*/
|
||||
#endif/* EQ_LITE_CODE */
|
||||
| EQ_FILTER_COEFF_FADE_EN//默认系数切换更新时使用淡入淡出
|
||||
|
||||
#if defined(EQ_CORE_V1)
|
||||
| EQ_SUPPORT_OLD_VER_EN //AC700N,或上BIT(1)支持版本0.7.1.0,0.7.1.1
|
||||
#endif/*EQ_CORE_V1*/
|
||||
#endif/* TCFG_EQ_ENABLE */
|
||||
| 0; //end
|
||||
|
||||
const float config_audio_eq_fade_step = 0.1f;//播歌高低音增益调节步进
|
||||
|
||||
|
||||
const int const_eq_debug = 0;
|
||||
const int AUDIO_EQ_CLEAR_MEM_BY_MUTE_TIME_MS = 0;//300 //连续多长时间静音就清除EQ MEM
|
||||
const int AUDIO_EQ_CLEAR_MEM_BY_MUTE_LIMIT = 0; //静音判断阀值
|
||||
|
||||
const int config_audio_drc_en = 0
|
||||
#if TCFG_DRC_ENABLE
|
||||
| DRC_EN //drc使能
|
||||
#if ((defined(TCFG_AUDIO_HEARING_AID_ENABLE) && TCFG_AUDIO_HEARING_AID_ENABLE) || TCFG_CVP_UL_DRC_ENABLE || (defined(TCFG_AUDIO_BASS_BOOST)&&TCFG_AUDIO_BASS_BOOST) || defined(TCFG_AUDIO_MDRC_ENABLE) && TCFG_AUDIO_MDRC_ENABLE)
|
||||
| WDRC_TYPE_EN
|
||||
#endif
|
||||
/* |DRC_COMPRESSOF_DIS //关闭压缩器 */
|
||||
/* |DRC_NBAND_DIS //关闭多带压缩器,关闭多带限幅器 */
|
||||
#endif /*TCFG_DRC_ENABLE*/
|
||||
| 0; //end
|
||||
|
||||
#ifdef CONFIG_ANC_30C_ENABLE
|
||||
const char config_audio_30c_en = 1;
|
||||
#else
|
||||
const char config_audio_30c_en = 0;
|
||||
#endif
|
||||
|
||||
#if AUDIO_SURROUND_CONFIG
|
||||
const int const_surround_en = BIT(2) | 1;//或上BIT(2)使能新的环绕音效
|
||||
#else
|
||||
const int const_surround_en = 0;
|
||||
#endif
|
||||
|
||||
#if AUDIO_VBASS_CONFIG
|
||||
const int const_vbass_en = 1;
|
||||
#else
|
||||
const int const_vbass_en = 0;
|
||||
#endif
|
||||
|
||||
const int A2DP_AUDIO_PLC_ENABLE = 0;
|
||||
const int LPC_JUST_FADE = 0; //播歌PLC仅淡入淡出配置, 0 - 补包运算(Ram 3660bytes, Code 1268bytes),1 - 仅淡出淡入(Ram 688bytes, Code 500bytes)
|
||||
const char config_audio_mixer_ch_highlight_enable = 0; //混音器声音突出功能使能
|
||||
|
||||
#ifdef SBC_CUSTOM_DECODER_BUF_SIZE
|
||||
const short config_sbc_decoder_buf_size = 512;
|
||||
#endif
|
||||
// tws音频解码自动设置输出声道。
|
||||
// 单声道:AUDIO_CH_L/AUDIO_CH_R。双声道:AUDIO_CH_DUAL_L/AUDIO_CH_DUAL_R
|
||||
// 关闭后,按照output_ch_num和output_ch_type/ch_type设置输出声道
|
||||
const int audio_tws_auto_channel = 1;
|
||||
|
||||
const int MP3_SEARCH_MAX = 200; //本地解码设成200, 网络解码可以设成3
|
||||
const int MP3_TGF_TWS_EN = 1; //tws解码使能
|
||||
const int MP3_TGF_POSPLAY_EN = 1; //定点播放 获取ms级别时间 接口使能
|
||||
const int MP3_TGF_AB_EN = 1; //AB点复读使能
|
||||
const int MP3_TGF_FASTMO = 0; //快速解码使能【默认关闭,之前给一个sdk单独加的,配置是否解高频,解双声道等】
|
||||
|
||||
#if (TCFG_MIC_EFFECT_ENABLE || TCFG_AUDIO_DAC_MIX_ENABLE)
|
||||
const int config_audio_dac_mix_enable = 1;
|
||||
#else
|
||||
const int config_audio_dac_mix_enable = 0;
|
||||
#endif
|
||||
|
||||
#if TCFG_AUDIO_DAC_MIX_ENABLE
|
||||
const int config_audio_dac_noisefloor_optimize_enable = 0;
|
||||
#else
|
||||
const int config_audio_dac_noisefloor_optimize_enable = BIT(1);
|
||||
#endif
|
||||
|
||||
// mixer在单独任务中输出
|
||||
#if TCFG_MIXER_CYCLIC_TASK_EN
|
||||
const int config_mixer_task = 1;
|
||||
#else
|
||||
const int config_mixer_task = 0;
|
||||
#endif
|
||||
|
||||
// mixer各个通道拥有独立buf
|
||||
const int config_mixer_ch_self_buf_en = 0;
|
||||
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
// mixer模块使能。不使能将关闭大部分功能,mix为直通
|
||||
const int config_mixer_en = 0;
|
||||
// mixer变采样使能
|
||||
const int config_mixer_src_en = 0;
|
||||
|
||||
// audio解码资源叠加功能使能。不使能,如果配置了叠加方式,将改成抢占方式
|
||||
const int config_audio_dec_wait_protect_en = 0;
|
||||
|
||||
// audio数据流分支功能使能。
|
||||
const int config_audio_stream_frame_copy_en = 0;
|
||||
|
||||
// audio dec app调用mixer相关函数控制。关闭后需上层设置数据流的输出节点
|
||||
const int audio_dec_app_mix_en = 0;
|
||||
|
||||
#else
|
||||
|
||||
// mixer模块使能。不使能将关闭大部分功能,mix为直通
|
||||
const int config_mixer_en = 1;
|
||||
// mixer变采样使能
|
||||
const int config_mixer_src_en = 1;
|
||||
|
||||
// audio解码资源叠加功能使能。不使能,如果配置了叠加方式,将改成抢占方式
|
||||
const int config_audio_dec_wait_protect_en = 1;
|
||||
|
||||
// audio数据流分支功能使能。
|
||||
const int config_audio_stream_frame_copy_en = 1;
|
||||
|
||||
// audio dec app调用mixer相关函数控制。关闭后需上层设置数据流的输出节点
|
||||
const int audio_dec_app_mix_en = 1;
|
||||
|
||||
#endif
|
||||
|
||||
// audio数据流分支cbuf大小控制
|
||||
const int config_audio_stream_frame_copy_cbuf_min = 128;
|
||||
const int config_audio_stream_frame_copy_cbuf_max = 1024;
|
||||
|
||||
// 超时等待其他解码unactive步骤完成
|
||||
const int config_audio_dec_unactive_to = 0;
|
||||
// audio数据流ioctrl使能
|
||||
const int config_audio_stream_frame_ioctrl_en = 0;
|
||||
|
||||
// audio dec app tws同步使能
|
||||
const int audio_dec_app_sync_en = 0;
|
||||
|
||||
// 解码使用单独任务做输出
|
||||
#if TCFG_AUDIO_DEC_OUT_TASK
|
||||
const int config_audio_dec_out_task_en = 1;
|
||||
#else
|
||||
const int config_audio_dec_out_task_en = 0;
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
const char config_audio_mini_enable = 1;
|
||||
#else
|
||||
const char config_audio_mini_enable = 0;
|
||||
#endif
|
||||
|
||||
enum {
|
||||
PLATFORM_FREQSHIFT_CORDIC = 0,
|
||||
PLATFORM_FREQSHIFT_CORDICV2 = 1
|
||||
};
|
||||
|
||||
/* 备注: */
|
||||
/* br23/br25/br30/br34/br40是PLATFORM_FREQSHIFT_CORDIC */
|
||||
/* , br36/br28/br27是PLATFORM_FREQSHIFT_CORDICV2 */
|
||||
|
||||
#if (CONFIG_CPU_BR28 || CONFIG_CPU_BR27 || CONFIG_CPU_BR36)
|
||||
#define PLATFORM_PARM_SEL PLATFORM_FREQSHIFT_CORDICV2
|
||||
#else
|
||||
#define PLATFORM_PARM_SEL PLATFORM_FREQSHIFT_CORDIC
|
||||
#endif
|
||||
|
||||
const int howling_freshift_PLATFORM = PLATFORM_PARM_SEL;
|
||||
const int howling_freshift_highmode_flag = 0; //移频快速模式
|
||||
const int howling_pitchshift_fastmode_flag = 1;//移频啸叫抑制快速模式使能
|
||||
|
||||
const int vc_pitchshift_fastmode_flag = 1; //变声快速模式使能
|
||||
const int vc_pitchshift_downmode_flag = 0; //变声下采样处理使能
|
||||
const int VC_KINDO_TVM = 1; //含义为EFFECT_VOICECHANGE_KIN0是否另一种算法 : 0表示跟原来一样,1表示用另一种
|
||||
const int RS_FAST_MODE_QUALITY = 2; //软件变采样 滤波阶数配置,范围2到8, 8代表16阶的变采样模式 ,速度跟它的大小呈正相关
|
||||
const int config_howling_enable_pemafrow_mode = 0;
|
||||
const int config_howling_enable_trap_mode = 1;//陷波啸叫抑制模式使能
|
||||
const int config_howling_enable_pitchps_mode = 1; //移频啸叫抑制模式使能
|
||||
|
||||
const unsigned char config_audio_dac_underrun_protect = 1;
|
||||
|
||||
#if ((SYS_VOL_TYPE == VOL_TYPE_DIGITAL_HW) || (SYS_VOL_TYPE == VOL_TYPE_DIGITAL))
|
||||
const char config_audio_dac_trim_enable = 1;
|
||||
#else
|
||||
const char config_audio_dac_trim_enable = 1;
|
||||
#endif
|
||||
|
||||
#if TCFG_LOWPOWER_LOWPOWER_SEL
|
||||
const int config_audio_dac_delay_off_ms = 300;
|
||||
#else
|
||||
const int config_audio_dac_delay_off_ms = 0;
|
||||
#endif
|
||||
|
||||
const int config_audio_dac_vcm_chsel_delay = 1500;
|
||||
|
||||
|
||||
// 解码任务测试
|
||||
const int audio_decoder_test_en = 0;
|
||||
// 当audio_decoder_test_en使能时需要实现以下接口
|
||||
#if 0
|
||||
void audio_decoder_test_out_before(struct audio_decoder *dec, void *buff, int len) {} ;
|
||||
void audio_decoder_test_out_after(struct audio_decoder *dec, int wlen) {} ;
|
||||
void audio_decoder_test_read_before(struct audio_decoder *dec, int len, u32 offset) {} ;
|
||||
void audio_decoder_test_read_after(struct audio_decoder *dec, u8 *data, int rlen) {} ;
|
||||
void audio_decoder_test_get_frame_before(struct audio_decoder *dec) {} ;
|
||||
void audio_decoder_test_get_frame_after(struct audio_decoder *dec, u8 *frame, int rlen) {} ;
|
||||
void audio_decoder_test_fetch_before(struct audio_decoder *dec) {} ;
|
||||
void audio_decoder_test_fetch_after(struct audio_decoder *dec, u8 *frame, int rlen) {} ;
|
||||
void audio_decoder_test_run_before(struct audio_decoder *dec) {} ;
|
||||
void audio_decoder_test_run_after(struct audio_decoder *dec, int err) {} ;
|
||||
#else
|
||||
// 接口实现示例
|
||||
#include "audio/demo/audio_decoder_test.c"
|
||||
#endif
|
||||
|
||||
|
||||
// 编码任务测试
|
||||
const int audio_encoder_test_en = 0;
|
||||
// 当audio_encoder_test_en使能时需要实现以下接口
|
||||
#if 0
|
||||
void audio_encoder_test_out_before(struct audio_encoder *enc, void *buff, int len) {} ;
|
||||
void audio_encoder_test_out_after(struct audio_encoder *enc, int wlen) {} ;
|
||||
void audio_encoder_test_get_frame_before(struct audio_encoder *enc, u16 frame_len) {} ;
|
||||
void audio_encoder_test_get_frame_after(struct audio_encoder *enc, s16 *frame, int rlen) {} ;
|
||||
void audio_encoder_test_run_before(struct audio_encoder *enc) {} ;
|
||||
void audio_encoder_test_run_after(struct audio_encoder *enc, int err) {} ;
|
||||
#else
|
||||
// 接口实现示例
|
||||
#include "audio/demo/audio_encoder_test.c"
|
||||
#endif
|
||||
//数字音量节点 是否使用汇编优化 不支持的芯片需置0
|
||||
#if(CONFIG_CPU_BR18)
|
||||
const int const_config_digvol_use_round = 0;
|
||||
#else
|
||||
const int const_config_digvol_use_round = 1;
|
||||
#endif
|
||||
|
||||
/*杰理KWS关键词识别*/
|
||||
#if TCFG_SMART_VOICE_ENABLE
|
||||
const int CONFIG_KWS_WAKE_WORD_MODEL_ENABLE = 0;
|
||||
const int CONFIG_KWS_MULTI_CMD_MODEL_ENABLE = 1;
|
||||
#if TCFG_CALL_KWS_SWITCH_ENABLE
|
||||
const int CONFIG_KWS_CALL_CMD_MODEL_ENABLE = 1;
|
||||
#else
|
||||
const int CONFIG_KWS_CALL_CMD_MODEL_ENABLE = 0;
|
||||
#endif
|
||||
#ifdef CONFIG_CPU_BR28
|
||||
const int CONFIG_KWS_RAM_USE_ENABLE = 1;
|
||||
#else
|
||||
const int CONFIG_KWS_RAM_USE_ENABLE = 2;
|
||||
#endif
|
||||
const int CONFIG_KWS_ONLINE_MODEL = 1;
|
||||
const float CONFIG_KWS_MULTI_CONFIDENCE[] = {
|
||||
0.4, 0.4, 0.4, 0.4, //小杰小杰,小杰同学,播放音乐,停止播放
|
||||
0.4, 0.4, 0.4, 0.3, //暂停播放,增大音量,减小音量,上一首
|
||||
0.3, 0.35, 0.35, 0.35, //下一首,打开降噪,关闭降噪,打开通透
|
||||
};
|
||||
|
||||
const float CONFIG_KWS_CALL_CONFIDENCE[] = {
|
||||
0.4, 0.4, //接听电话,挂断电话
|
||||
};
|
||||
#else
|
||||
const int CONFIG_KWS_WAKE_WORD_MODEL_ENABLE = 0;
|
||||
const int CONFIG_KWS_MULTI_CMD_MODEL_ENABLE = 0;
|
||||
const int CONFIG_KWS_CALL_CMD_MODEL_ENABLE = 0;
|
||||
const int CONFIG_KWS_ONLINE_MODEL = 0;
|
||||
#endif
|
||||
|
||||
#if (defined TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN) && TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
|
||||
const int config_resample_pcm_frame_buffer = 512;
|
||||
#else
|
||||
const int config_resample_pcm_frame_buffer = 128;
|
||||
#endif
|
||||
|
||||
/*第二版串口写卡工具,支持写不定长度数据*/
|
||||
u8 const_audio_pcm_debug_v2_en = 0;
|
||||
|
||||
/**
|
||||
* @brief Log (Verbose/Info/Debug/Warn/Error)
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
const char log_tag_const_v_EQ_CFG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_EQ_CFG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_EQ_CFG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_EQ_CFG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_EQ_CFG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_EQ_CFG_TOOL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_EQ_CFG_TOOL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_EQ_CFG_TOOL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_EQ_CFG_TOOL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_EQ_CFG_TOOL AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_EQ_APPLY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_EQ_APPLY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_EQ_APPLY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_EQ_APPLY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_EQ_APPLY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_APP_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_APP_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_APP_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_APP_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_APP_DRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
|
||||
const char log_tag_const_v_EQ AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_EQ AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_EQ AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_EQ AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_EQ AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_AUD_ADC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUD_ADC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUD_ADC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_AUD_ADC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_AUD_ADC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_AUD_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUD_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUD_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_AUD_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_AUD_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_APP_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_APP_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_APP_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_APP_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_APP_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_AUD_AUX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUD_AUX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUD_AUX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_w_AUD_AUX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_AUD_AUX AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
|
||||
const char log_tag_const_v_MIXER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_MIXER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_MIXER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_MIXER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_MIXER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_AUDIO_STREAM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_AUDIO_STREAM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUDIO_STREAM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUDIO_STREAM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_AUDIO_STREAM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_AUDIO_DECODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_AUDIO_DECODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUDIO_DECODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUDIO_DECODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_AUDIO_DECODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_AUDIO_ENCODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_AUDIO_ENCODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_AUDIO_ENCODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_AUDIO_ENCODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_AUDIO_ENCODER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
|
||||
const char log_tag_const_v_SYNCTS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_c_SYNCTS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_i_SYNCTS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_d_SYNCTS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
|
||||
const char log_tag_const_e_SYNCTS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
|
||||
|
||||
109
apps/earphone/log_config/lib_system_config.c
Normal file
109
apps/earphone/log_config/lib_system_config.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*********************************************************************************************
|
||||
* Filename : lib_system_config.c
|
||||
|
||||
* Description : Optimized Code & RAM (编译优化配置)
|
||||
|
||||
* Author : Bingquan
|
||||
|
||||
* Email : caibingquan@zh-jieli.com
|
||||
|
||||
* Last modifiled : 2019-03-18 15:22
|
||||
|
||||
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
|
||||
*********************************************************************************************/
|
||||
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
|
||||
|
||||
///打印是否时间打印信息
|
||||
const int config_printf_time = 1;
|
||||
|
||||
///异常中断,asser打印开启
|
||||
#ifdef CONFIG_RELEASE_ENABLE
|
||||
const int config_asser = 1;//= 0;
|
||||
#else
|
||||
const int config_asser = 1;
|
||||
#endif
|
||||
|
||||
const int config_system_info = 0;
|
||||
|
||||
//================================================//
|
||||
// SDFILE 精简使能 //
|
||||
//================================================//
|
||||
const int SDFILE_VFS_REDUCE_ENABLE = 1;
|
||||
|
||||
//================================================//
|
||||
// dev使用异步读使能 //
|
||||
//================================================//
|
||||
#ifdef TCFG_DEVICE_BULK_READ_ASYNC_ENABLE
|
||||
const int device_bulk_read_async_enable = 1;
|
||||
#else
|
||||
const int device_bulk_read_async_enable = 0;
|
||||
#endif
|
||||
|
||||
|
||||
const int VIRFAT_FLASH_ENABLE = 0;
|
||||
|
||||
//================================================//
|
||||
// UI //
|
||||
//================================================//
|
||||
const int ENABLE_LUA_VIRTUAL_MACHINE = 0;
|
||||
|
||||
//================================================//
|
||||
// 不可屏蔽中断使能配置(unmask_irq) //
|
||||
//================================================//
|
||||
const int CONFIG_CPU_UNMASK_IRQ_ENABLE = 0;
|
||||
|
||||
/**
|
||||
* @brief Log (Verbose/Info/Debug/Warn/Error)
|
||||
*/
|
||||
/*-----------------------------------------------------------*/
|
||||
const char log_tag_const_v_SYS_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_SYS_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_SYS_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_SYS_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_SYS_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_JLFS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_JLFS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_JLFS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_JLFS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_JLFS AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
//FreeRTOS
|
||||
const char log_tag_const_v_PORT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_PORT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_PORT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_PORT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_PORT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_KTASK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_KTASK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_KTASK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_KTASK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_KTASK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_uECC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_uECC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_uECC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_uECC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_uECC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_HEAP_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_HEAP_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_HEAP_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_w_HEAP_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_HEAP_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_V_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_V_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_V_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_V_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_V_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
|
||||
const char log_tag_const_v_P_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_i_P_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_d_P_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
|
||||
const char log_tag_const_w_P_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
const char log_tag_const_e_P_MEM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
|
||||
48
apps/earphone/log_config/lib_update_config.c
Normal file
48
apps/earphone/log_config/lib_update_config.c
Normal file
@ -0,0 +1,48 @@
|
||||
|
||||
#include "app_config.h"
|
||||
#include "system/includes.h"
|
||||
#include "update_loader_download.h"
|
||||
|
||||
#ifdef CONFIG_256K_FLASH
|
||||
const int config_update_mode = UPDATE_UART_EN;
|
||||
#else
|
||||
const int config_update_mode = UPDATE_BT_LMP_EN \
|
||||
| UPDATE_STORAGE_DEV_EN | UPDATE_BLE_TEST_EN | UPDATE_APP_EN | UPDATE_UART_EN;
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_APP_BT_ENABLE
|
||||
//是否采用双备份升级方案:0-单备份;1-双备份
|
||||
#if CONFIG_DOUBLE_BANK_ENABLE
|
||||
const int support_dual_bank_update_en = 1;
|
||||
#else
|
||||
const int support_dual_bank_update_en = 0;
|
||||
#endif //CONFIG_DOUBLE_BANK_ENABLE
|
||||
#else
|
||||
|
||||
//是否采用双备份升级方案:0-单备份;1-双备份
|
||||
#if CONFIG_DOUBLE_BANK_ENABLE
|
||||
const int support_dual_bank_update_en = 1;
|
||||
#else
|
||||
const int support_dual_bank_update_en = 0;
|
||||
#endif //CONFIG_DOUBLE_BANK_ENABLE
|
||||
#endif
|
||||
|
||||
#if OTA_TWS_SAME_TIME_NEW //使用新的同步升级流程
|
||||
const int support_ota_tws_same_time_new = 1;
|
||||
#else
|
||||
const int support_ota_tws_same_time_new = 0;
|
||||
#endif
|
||||
//是否支持升级之后保留vm数据
|
||||
const int support_vm_data_keep = 0;
|
||||
|
||||
//是否支持外挂flash升级,需要打开Board.h中的TCFG_NOR_FS_ENABLE
|
||||
const int support_norflash_update_en = 0;
|
||||
|
||||
//支持从外挂flash读取ufw文件升级使能
|
||||
const int support_norflash_ufw_update_en = 0;
|
||||
|
||||
const char log_tag_const_v_UPDATE AT(.LOG_TAG_CONST) = LIB_DEBUG & FALSE;
|
||||
const char log_tag_const_i_UPDATE AT(.LOG_TAG_CONST) = LIB_DEBUG & TRUE;
|
||||
const char log_tag_const_d_UPDATE AT(.LOG_TAG_CONST) = LIB_DEBUG & FALSE;
|
||||
const char log_tag_const_w_UPDATE AT(.LOG_TAG_CONST) = LIB_DEBUG & TRUE;
|
||||
const char log_tag_const_e_UPDATE AT(.LOG_TAG_CONST) = LIB_DEBUG & TRUE;
|
||||
754
apps/earphone/music/sd_music.c
Normal file
754
apps/earphone/music/sd_music.c
Normal file
@ -0,0 +1,754 @@
|
||||
#include "system/includes.h"
|
||||
#include "music/music_player.h"
|
||||
#include "music/breakpoint.h"
|
||||
#include "app_action.h"
|
||||
#include "app_main.h"
|
||||
#include "earphone.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "audio_config.h"
|
||||
#include "bt_background.h"
|
||||
#include "default_event_handler.h"
|
||||
#include "app_online_cfg.h"
|
||||
#include "user_cfg.h"
|
||||
#include "tone_player.h"
|
||||
#include "app_task.h"
|
||||
#include "earphone.h"
|
||||
#include "update.h"
|
||||
#include "app_power_manage.h"
|
||||
#include "app_charge.h"
|
||||
|
||||
#define LOG_TAG_CONST MUSIC
|
||||
#define LOG_TAG "[MUSIC]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
/* #define LOG_DUMP_ENABLE */
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
#if TCFG_APP_MUSIC_EN
|
||||
#define VALUE_NULL 0
|
||||
|
||||
//模式idle状态
|
||||
static volatile u8 is_music_active = 0;
|
||||
|
||||
///模式参数结构体
|
||||
struct __music_task_parm {
|
||||
u8 type;
|
||||
int val;
|
||||
};
|
||||
|
||||
///music模式控制结构体
|
||||
struct __music {
|
||||
struct __music_task_parm task_parm;
|
||||
u16 file_err_counter;//错误文件统计
|
||||
u8 file_play_direct;//0:下一曲, 1:上一曲
|
||||
u8 scandisk_break;//扫描设备打断标志
|
||||
char device_tone_dev[16];
|
||||
#if SD_BAUD_RATE_CHANGE_WHEN_SCAN
|
||||
u32 old_speed;
|
||||
#endif
|
||||
};
|
||||
struct __music music_hdl = {0};
|
||||
#define __this (&music_hdl)
|
||||
static struct __breakpoint *breakpoint = NULL;
|
||||
|
||||
static const u8 music_key_table[][KEY_EVENT_MAX] = {
|
||||
// SHORT LONG HOLD
|
||||
// UP DOUBLE TRIPLE
|
||||
{
|
||||
KEY_MUSIC_PP, KEY_POWEROFF, KEY_POWEROFF_HOLD,
|
||||
KEY_NULL, KEY_MODE_SWITCH, KEY_NULL
|
||||
},
|
||||
{
|
||||
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP,
|
||||
KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
{
|
||||
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN,
|
||||
KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 检测能否进入低功耗
|
||||
@param 无
|
||||
@return 无
|
||||
@note 无
|
||||
@note 放在按键事件处理后
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_powerdown_enter_check(void)
|
||||
{
|
||||
u8 music_play_status = 0;
|
||||
music_play_status = music_player_get_play_status();
|
||||
if ((is_music_active == 1) && (music_play_status == FILE_DEC_STATUS_PAUSE)) {
|
||||
is_music_active = 0;
|
||||
}
|
||||
/* log_info(">>>>>>>>>>>>>>>enter music_play_status = %d\n", music_play_status); */
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 检测能否退出低功耗
|
||||
@param 无
|
||||
@return 无
|
||||
@note 无
|
||||
@note 放在按键事件处理前
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_powerdown_exit_check(void)
|
||||
{
|
||||
u8 music_play_status = 0;
|
||||
music_play_status = music_player_get_play_status();
|
||||
//非暂停的自定义按键事件, 把进低功耗的定时器删除
|
||||
if (music_play_status == FILE_DEC_STATUS_PAUSE) {
|
||||
if (is_music_active == 0) {
|
||||
is_music_active = 1;
|
||||
}
|
||||
}
|
||||
/* log_info(">>>>>>>>>>>>>>>exit music_play_status = %d\n", music_play_status); */
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 解码成功回调
|
||||
@param priv:私有参数, parm:暂时未用
|
||||
@return
|
||||
@note 此处可以做一些用户操作, 如断点保存, 显示, 获取播放信息等
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_player_play_success(void *priv, int parm)
|
||||
{
|
||||
char *logo = music_player_get_dev_cur();
|
||||
log_info("\n\n----------------music_player_play_success----------------------\n");
|
||||
log_info("cur dev = %s\n", logo);
|
||||
log_info("total dev = %d\n", dev_manager_get_total(1));
|
||||
log_info("cur filenum = %d\n", music_player_get_file_cur());
|
||||
log_info("totol filenum = %d\n", music_player_get_file_total());
|
||||
log_info("totol time = %d\n", music_player_get_dec_total_time());
|
||||
log_info("sclust = %d\n", music_player_get_file_sclust());
|
||||
log_info("dir_cur = %d\n", music_player_get_dir_cur());
|
||||
log_info("dir_total = %d\n", music_player_get_dir_total());
|
||||
log_info("file indir = %d\n", music_player_get_fileindir_number());
|
||||
log_info("\n");
|
||||
///save breakpoint, 只保存文件信息
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 0) == true) {
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 发送自定义按键消息
|
||||
@param msg:按键类型; value:发送的值
|
||||
@return 0:发送正常 -1:发送失败
|
||||
@note 虚拟按键消息
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int app_music_task_put_key_msg(int msg, int value)
|
||||
{
|
||||
if (app_get_curr_task() != APP_MUSIC_TASK) {
|
||||
//不在音乐模式不发自定义按键消息
|
||||
log_w("custom msg invalid!");
|
||||
return -1;
|
||||
}
|
||||
struct sys_event e;
|
||||
e.type = SYS_KEY_EVENT;
|
||||
e.u.key.event = msg;
|
||||
e.u.key.value = value;
|
||||
e.arg = (void *)DEVICE_EVENT_FROM_CUSTOM;
|
||||
sys_event_notify(&e);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 解码结束回调处理
|
||||
@param
|
||||
@return
|
||||
@note 此处统一将错误通过消息的方式发出, 在key msg中统一响应
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_player_play_end(void *priv, int parm)
|
||||
{
|
||||
log_info("music_player_play_end\n");
|
||||
///这里推出消息, 目的是在music主流程switch case统一入口
|
||||
app_music_task_put_key_msg(KEY_MUSIC_PLAYER_END, parm);
|
||||
}
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 解码错误回调
|
||||
@param
|
||||
@return
|
||||
@note 此处统一将错误通过消息的方式发出, 在key msg中统一响应
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_player_decode_err(void *priv, int parm)
|
||||
{
|
||||
log_info("music_player_decode_err\n");
|
||||
///这里推出消息, 目的是在music主流程switch case统一入口
|
||||
app_music_task_put_key_msg(KEY_MUSIC_PLAYER_DEC_ERR, parm);
|
||||
}
|
||||
|
||||
static const struct __player_cb music_player_callback = {
|
||||
.start = music_player_play_success,
|
||||
.end = music_player_play_end,
|
||||
.err = music_player_decode_err,
|
||||
// .fsn_break = music_player_scandisk_break,
|
||||
};
|
||||
|
||||
static const struct __scan_callback scan_cb = {
|
||||
.enter = NULL,
|
||||
.exit = NULL,
|
||||
.scan_break = NULL,
|
||||
};
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式初始化处理
|
||||
@param 无
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_task_start()
|
||||
{
|
||||
char *log = NULL;
|
||||
log_info("music task start!!!!!\n");
|
||||
///时钟初始化
|
||||
clk_set("sys", CONFIG_MUSIC_DEC_CLOCK);
|
||||
///按键使能
|
||||
sys_key_event_enable();
|
||||
//关闭自动关机
|
||||
sys_auto_shut_down_disable();
|
||||
|
||||
///播放器初始化
|
||||
struct __player_parm parm = {0};
|
||||
parm.cb = &music_player_callback;
|
||||
parm.scan_cb = &scan_cb;
|
||||
music_player_creat(NULL, &parm);
|
||||
music_player_set_repeat_mode(FCYCLE_ALL);
|
||||
///获取断点句柄, 后面所有断点读/写都需要用到
|
||||
breakpoint = breakpoint_handle_creat();
|
||||
///初始化一些参数
|
||||
__this->file_err_counter = 0;
|
||||
__this->file_play_direct = 0;
|
||||
__this->scandisk_break = 0;
|
||||
is_music_active = 1;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 开始播歌
|
||||
@param 无
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_player_play_start(void)
|
||||
{
|
||||
app_music_task_put_key_msg(KEY_MUSIC_PLAYER_START, VALUE_NULL);
|
||||
}
|
||||
|
||||
static void music_save_breakpoint(int save_dec_bp)
|
||||
{
|
||||
char *logo = music_player_get_dev_cur();
|
||||
|
||||
///save breakpoint, 只保存文件信息
|
||||
if (music_player_get_playing_breakpoint(breakpoint, save_dec_bp) == true) {
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式退出处理
|
||||
@param 无
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_task_close()
|
||||
{
|
||||
music_save_breakpoint(1);
|
||||
music_player_stop(1);
|
||||
breakpoint_handle_destroy(&breakpoint);
|
||||
music_player_destroy();
|
||||
memset(__this, 0, sizeof(struct __music));
|
||||
is_music_active = 0;
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 恢复音乐模式
|
||||
@param 无
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void music_task_resume(void)
|
||||
{
|
||||
music_task_start();
|
||||
music_player_play_start();
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief 清除自定义按键消息
|
||||
@param 无
|
||||
@return 无
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void custom_event_clr(void)
|
||||
{
|
||||
struct sys_event clear_key_event = {
|
||||
.type = SYS_KEY_EVENT,
|
||||
.arg = (void *)DEVICE_EVENT_FROM_CUSTOM,
|
||||
};
|
||||
sys_key_event_disable();
|
||||
sys_event_clear(&clear_key_event);
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 在线检测 切换模式判断使用
|
||||
@param 无
|
||||
@return 1 设备在线 0 设备不在线
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int music_app_check(void)
|
||||
{
|
||||
log_info("music_app_check");
|
||||
if (dev_manager_get_total(1)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式解码错误处理
|
||||
@param err:错误码,详细错误码描述请看music_player错误码表枚举
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void music_player_err_deal(int err)
|
||||
{
|
||||
u16 msg = KEY_NULL;
|
||||
char *logo = NULL;
|
||||
if (err != MUSIC_PLAYER_ERR_NULL && err != MUSIC_PLAYER_SUCC) {
|
||||
log_e("music player err = %d\n", err);
|
||||
}
|
||||
|
||||
switch (err) {
|
||||
case MUSIC_PLAYER_SUCC:
|
||||
__this->file_err_counter = 0;
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_NULL:
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_POINT:
|
||||
case MUSIC_PLAYER_ERR_NO_RAM:
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;//退出音乐模式
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_DECODE_FAIL:
|
||||
if (__this->file_err_counter >= music_player_get_file_total()) {
|
||||
__this->file_err_counter = 0;
|
||||
dev_manager_set_valid_by_logo(music_player_get_dev_cur(), 0);///将设备设置为无效设备
|
||||
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;///所有文件都是错误的, 切换到下一个设备
|
||||
}
|
||||
} else {
|
||||
__this->file_err_counter ++;
|
||||
if (__this->file_play_direct == 0) {
|
||||
msg = KEY_MUSIC_NEXT;//播放下一曲
|
||||
} else {
|
||||
msg = KEY_MUSIC_PREV;//播放上一曲
|
||||
}
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_DEV_NOFOUND:
|
||||
if (dev_manager_get_total(1) == 0) {//参数为1 :获取所有有效设备 参数0:获取所有设备
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_PLAYER_START;///没有找到指定设备, 播放之前的活动设备
|
||||
}
|
||||
break;
|
||||
|
||||
case MUSIC_PLAYER_ERR_FSCAN:
|
||||
///需要结合music_player_scandisk_break中处理的标志位处理
|
||||
if (__this->scandisk_break) {
|
||||
__this->scandisk_break = 0;
|
||||
///此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
|
||||
break;
|
||||
}
|
||||
case MUSIC_PLAYER_ERR_DEV_READ:
|
||||
case MUSIC_PLAYER_ERR_DEV_OFFLINE:
|
||||
log_e("MUSIC_PLAYER_ERR_DEV_OFFLINE \n");
|
||||
logo = music_player_get_dev_cur();
|
||||
if (dev_manager_online_check_by_logo(logo, 1)) {
|
||||
///如果错误失败在线, 并且是播放过程中产生的,先记录下断点
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
music_player_stop(0);//先停止,防止下一步操作VM卡顿
|
||||
breakpoint_vm_write(breakpoint, logo);
|
||||
}
|
||||
if (err == MUSIC_PLAYER_ERR_FSCAN) {
|
||||
dev_manager_set_valid_by_logo(logo, 0);///将设备设置为无效设备
|
||||
} else {
|
||||
//针对读错误, 因为时间推到应用层有延时导致下一个模式判断不正常, 此处需要将设备卸载
|
||||
dev_manager_unmount(dev_manager_get_logo(dev_manager_find_active(0)));
|
||||
}
|
||||
}
|
||||
if (dev_manager_get_total(1) == 0) {
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;///没有设备在线, 退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;///切换设备
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_FILE_NOFOUND:
|
||||
///查找文件有扫盘的可能,也需要结合music_player_scandisk_break中处理的标志位处理
|
||||
if (__this->scandisk_break) {
|
||||
__this->scandisk_break = 0;
|
||||
///此处不做任何处理, 打断的事件已经重发, 由重发事件执行后续处理
|
||||
break;
|
||||
}
|
||||
case MUSIC_PLAYER_ERR_PARM:
|
||||
logo = music_player_get_dev_cur();
|
||||
if (dev_manager_online_check_by_logo(logo, 1)) {
|
||||
if (music_player_get_file_total()) {
|
||||
msg = KEY_MUSIC_PLAYER_PLAY_FIRST;///有文件,播放第一个文件
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev_manager_get_total(1) == 0) {
|
||||
msg = KEY_MUSIC_PLAYER_QUIT;//没有设备了,退出音乐模式
|
||||
} else {
|
||||
msg = KEY_MUSIC_AUTO_NEXT_DEV;
|
||||
}
|
||||
break;
|
||||
case MUSIC_PLAYER_ERR_FILE_READ://文件读错误
|
||||
msg = KEY_MUSIC_NEXT;//播放下一曲
|
||||
break;
|
||||
}
|
||||
|
||||
if (msg != KEY_NULL) {
|
||||
app_music_task_put_key_msg(msg, VALUE_NULL);
|
||||
}
|
||||
}
|
||||
|
||||
//*----------------------------------------------------------------------------*/
|
||||
/**@brief music 模式按键处理
|
||||
@param 按键消息
|
||||
@return
|
||||
@note
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int app_music_key_event_handler(struct sys_event *event)
|
||||
{
|
||||
int ret = true;
|
||||
int err = MUSIC_PLAYER_ERR_NULL;
|
||||
u8 vol, auto_next_dev;
|
||||
int mode ;
|
||||
char *logo = NULL;
|
||||
int key_event = 0;
|
||||
|
||||
struct key_event *key = &event->u.key;
|
||||
if (event->arg == DEVICE_EVENT_FROM_KEY) {
|
||||
key_event = music_key_table[key->value][key->event];//物理按键事件
|
||||
} else {
|
||||
key_event = key->event;//软件按键事件
|
||||
}
|
||||
log_info("music task msg = %d\n", key_event);
|
||||
music_powerdown_exit_check();
|
||||
switch (key_event) {
|
||||
case KEY_MUSIC_PLAYER_START:
|
||||
log_info("KEY_MUSIC_PLAYER_START !!\n");
|
||||
///断点播放活动设备
|
||||
logo = dev_manager_get_logo(dev_manager_find_active(1));
|
||||
if (music_player_get_play_status() == FILE_DEC_STATUS_PLAY) {
|
||||
if (music_player_get_dev_cur() && logo) {
|
||||
///播放的设备跟当前活动的设备是同一个设备,不处理
|
||||
if (0 == strcmp(logo, music_player_get_dev_cur())) {
|
||||
log_w("the same dev!!\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (true == breakpoint_vm_read(breakpoint, logo)) {
|
||||
err = music_player_play_by_breakpoint(logo, breakpoint);
|
||||
} else {
|
||||
err = music_player_play_first_file(logo);
|
||||
}
|
||||
break;
|
||||
///播放器退出处理
|
||||
case KEY_MUSIC_PLAYER_QUIT:
|
||||
log_info("KEY_MUSIC_PLAYER_QUIT !!\n");
|
||||
app_task_switch_next();
|
||||
break;
|
||||
///结束消息处理
|
||||
case KEY_MUSIC_PLAYER_END:
|
||||
log_info("KEY_MUSIC_PLAYER_END\n");
|
||||
err = music_player_end_deal(key->value);
|
||||
break;
|
||||
//播放器解码错误处理
|
||||
case KEY_MUSIC_PLAYER_DEC_ERR:
|
||||
err = music_player_decode_err_deal(key->value);
|
||||
break;
|
||||
///播放执行类消息
|
||||
case KEY_MUSIC_PP:
|
||||
log_info("KEY_MUSIC_PP\n");
|
||||
err = music_player_pp();
|
||||
log_info("=============================================%d\n", music_player_get_play_status());
|
||||
break;
|
||||
case KEY_MUSIC_PLAYER_AUTO_NEXT:
|
||||
log_info("KEY_MUSIC_PLAYER_AUTO_NEXT\n");
|
||||
err = music_player_play_auto_next();
|
||||
break;
|
||||
case KEY_MUSIC_PLAYER_PLAY_FIRST:
|
||||
log_info("KEY_MUSIC_PLAYER_PLAY_FIRST\n");
|
||||
err = music_player_play_first_file(NULL);
|
||||
break;
|
||||
case KEY_MUSIC_PREV:
|
||||
log_info("KEY_MUSIC_PREV\n");
|
||||
__this->file_play_direct = 1;
|
||||
err = music_player_play_prev();
|
||||
break;
|
||||
case KEY_MUSIC_NEXT:
|
||||
log_info("KEY_MUSIC_NEXT\n");
|
||||
__this->file_play_direct = 0;
|
||||
err = music_player_play_next();
|
||||
break;
|
||||
case KEY_MUSIC_PLAYE_PREV_FOLDER:
|
||||
log_info("KEY_MUSIC_PLAYE_PREV_FOLDER\n");
|
||||
err = music_player_play_folder_prev();
|
||||
break;
|
||||
case KEY_MUSIC_PLAYE_NEXT_FOLDER:
|
||||
log_info("KEY_MUSIC_PLAYE_NEXT_FOLDER\n");
|
||||
err = music_player_play_folder_next();
|
||||
break;
|
||||
|
||||
case KEY_MUSIC_AUTO_NEXT_DEV:
|
||||
case KEY_MUSIC_CHANGE_DEV:
|
||||
log_info("KEY_MUSIC_CHANGE_DEV\n");
|
||||
auto_next_dev = ((key_event == KEY_MUSIC_AUTO_NEXT_DEV) ? 1 : 0);
|
||||
logo = music_player_get_dev_next(auto_next_dev);
|
||||
log_info("next dev = %s\n", logo);
|
||||
if (logo == NULL) { ///找不到下一个设备,不响应设备切换
|
||||
break;
|
||||
}
|
||||
///切换设备前先保存一下上一个设备的断点信息,包括文件和解码信息
|
||||
if (music_player_get_playing_breakpoint(breakpoint, 1) == true) {
|
||||
music_player_stop(0);//先停止,防止下一步操作VM卡顿
|
||||
breakpoint_vm_write(breakpoint, music_player_get_dev_cur());
|
||||
}
|
||||
if (true == breakpoint_vm_read(breakpoint, logo)) {
|
||||
err = music_player_play_by_breakpoint(logo, breakpoint);
|
||||
} else {
|
||||
err = music_player_play_first_file(logo);
|
||||
}
|
||||
break;
|
||||
case KEY_MUSIC_PLAYE_BY_DEV_FILENUM:
|
||||
log_info("KEY_MUSIC_PLAYE_BY_DEV_FILENUM, file_number = %d\n", key->value);
|
||||
logo = dev_manager_get_logo(dev_manager_find_active(1));
|
||||
err = music_player_play_by_number(logo, key->value);
|
||||
break;
|
||||
case KEY_MUSIC_PLAYE_BY_DEV_SCLUST:
|
||||
log_info("KEY_MUSIC_PLAYE_BY_DEV_SCLUST\n");
|
||||
logo = dev_manager_get_logo(dev_manager_find_active(1));
|
||||
err = music_player_play_by_sclust(logo, key->value);
|
||||
break;
|
||||
case KEY_MUSIC_PLAYE_BY_DEV_PATH:
|
||||
log_info("KEY_MUSIC_PLAYE_BY_DEV_PATH\n");
|
||||
err = music_player_play_by_path((char *)"udisk0", "/sin.wav");///this is a demo
|
||||
break;
|
||||
|
||||
///非播放执行类消息
|
||||
case KEY_MUSIC_FF:
|
||||
log_info("KEY_MUSIC_FF\n");
|
||||
music_player_ff(3);
|
||||
break;
|
||||
case KEY_MUSIC_FR:
|
||||
log_info("KEY_MUSIC_FR\n");
|
||||
music_player_fr(3);
|
||||
break;
|
||||
case KEY_MUSIC_CHANGE_REPEAT:
|
||||
log_info("KEY_MUSIC_CHANGE_REPEAT\n");
|
||||
mode = music_player_change_repeat_mode();
|
||||
break;
|
||||
case KEY_MUSIC_DELETE_FILE:
|
||||
log_info("KEY_MUSIC_DELETE_FILE\n");
|
||||
err = music_player_delete_playing_file();
|
||||
break;
|
||||
case KEY_MUSIC_PLAYER_AB_REPEAT_SWITCH:
|
||||
/* file_dec_ab_repeat_switch(); */
|
||||
break;
|
||||
|
||||
case KEY_MODE_SWITCH:
|
||||
log_info("KEY_MUSIC_SWITCH\n");
|
||||
app_task_switch_next();
|
||||
break;
|
||||
case KEY_VOL_UP:
|
||||
log_info("KEY_VOL_UP\n");
|
||||
if (!tone_get_status()) {
|
||||
app_audio_volume_up(1);
|
||||
log_info("vol+: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
|
||||
}
|
||||
if (app_audio_get_volume(APP_AUDIO_CURRENT_STATE) == app_audio_get_max_volume()) {
|
||||
if (tone_get_status() == 0) {
|
||||
#if TCFG_MAX_VOL_PROMPT
|
||||
STATUS *p_tone = get_tone_config();
|
||||
tone_play_index(p_tone->max_vol, 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
break;
|
||||
case KEY_VOL_DOWN:
|
||||
log_info("KEY_VOL_DOWN\n");
|
||||
app_audio_volume_down(1);
|
||||
log_info("vol-: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
|
||||
break;
|
||||
case KEY_POWEROFF:
|
||||
case KEY_POWEROFF_HOLD:
|
||||
app_earphone_key_event_handler(event);
|
||||
break;
|
||||
default:
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
|
||||
music_powerdown_enter_check();
|
||||
//退出模式后,不做错误处理
|
||||
if (is_music_active == 0) {
|
||||
return false;
|
||||
}
|
||||
///错误处理
|
||||
log_info("music play err = %d\n", err);
|
||||
music_player_err_deal(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* 系统事件处理函数
|
||||
*/
|
||||
static int event_handler(struct application *app, struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
case SYS_KEY_EVENT:
|
||||
/*
|
||||
* 普通按键消息处理
|
||||
*/
|
||||
return app_music_key_event_handler(event);
|
||||
case SYS_BT_EVENT:
|
||||
/*
|
||||
* 蓝牙事件处理
|
||||
*/
|
||||
break;
|
||||
case SYS_DEVICE_EVENT:
|
||||
/*
|
||||
* 系统设备事件处理
|
||||
*/
|
||||
if ((u32)event->arg == DRIVER_EVENT_FROM_SD0) {
|
||||
if (event->u.dev.event == DEVICE_EVENT_OUT) {
|
||||
update_clear_result();
|
||||
music_save_breakpoint(1);
|
||||
dev_manager_del((char *)event->u.dev.value);
|
||||
app_task_switch_next();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if ((u32)event->arg == DRIVER_EVENT_FROM_SD0) {
|
||||
#if TCFG_ONLINE_ENABLE
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CI_UART) {
|
||||
ci_data_rx_handler(CI_UART);
|
||||
#if TCFG_USER_TWS_ENABLE
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CI_TWS) {
|
||||
ci_data_rx_handler(CI_TWS);
|
||||
#endif
|
||||
#endif
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) {
|
||||
app_power_event_handler(&event->u.dev);
|
||||
return true;
|
||||
} else if ((u32)event->arg == DEVICE_EVENT_FROM_CHARGE) {
|
||||
app_charge_event_handler(&event->u.dev);
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
default_event_handler(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
static int state_machine(struct application *app, enum app_state state,
|
||||
struct intent *it)
|
||||
{
|
||||
int err = 0;
|
||||
int tone_play_err = 0;
|
||||
switch (state) {
|
||||
case APP_STA_CREATE: {
|
||||
log_info("APP_STA_CREATE\n");
|
||||
//播完提示音再开始播SD卡
|
||||
tone_play_err = tone_play_with_callback(TONE_MUSIC_MODE, 1, music_player_play_start, NULL);
|
||||
if (tone_play_err == -EINVAL) {
|
||||
log_info("tone play err! music_player_play_start!\n");
|
||||
music_player_play_start();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case APP_STA_START:
|
||||
if (!it) {
|
||||
break;
|
||||
}
|
||||
switch (it->action) {
|
||||
case ACTION_MUSIC_MAIN:
|
||||
log_info("ACTION_MUSIC_MAIN\n");
|
||||
music_task_start();
|
||||
break;
|
||||
case ACTION_MUSIC_TWS_RX:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case APP_STA_PAUSE:
|
||||
log_info("APP_STA_PAUSE\n");
|
||||
music_task_close();
|
||||
break;
|
||||
case APP_STA_RESUME:
|
||||
log_info("APP_STA_RESUME\n");
|
||||
music_task_resume();
|
||||
break;
|
||||
case APP_STA_STOP:
|
||||
log_info("APP_STA_STOP\n");
|
||||
music_task_close();
|
||||
break;
|
||||
case APP_STA_DESTROY:
|
||||
log_info("APP_STA_DESTROY\n");
|
||||
custom_event_clr();
|
||||
break;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct application_operation app_music_ops = {
|
||||
.state_machine = state_machine,
|
||||
.event_handler = event_handler,
|
||||
};
|
||||
|
||||
/*
|
||||
* 注册music模式
|
||||
*/
|
||||
REGISTER_APPLICATION(app_music) = {
|
||||
.name = "music",
|
||||
.action = ACTION_MUSIC_MAIN,
|
||||
.ops = &app_music_ops,
|
||||
.state = APP_STA_DESTROY,
|
||||
};
|
||||
|
||||
/*
|
||||
* 注册idle状态
|
||||
*/
|
||||
static u8 music_idle_query(void)
|
||||
{
|
||||
return !is_music_active;
|
||||
}
|
||||
REGISTER_LP_TARGET(music_lp_target) = {
|
||||
.name = "music",
|
||||
.is_idle = music_idle_query,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
228
apps/earphone/pbg_demo.c
Normal file
228
apps/earphone/pbg_demo.c
Normal file
@ -0,0 +1,228 @@
|
||||
|
||||
#include "system/includes.h"
|
||||
#include "string.h"
|
||||
#include "circular_buf.h"
|
||||
#include "btstack/avctp_user.h"
|
||||
#include "app_config.h"
|
||||
#include "bt_tws.h"
|
||||
#include "bt_common.h"
|
||||
#include "syscfg_id.h"
|
||||
#include "pbg_user.h"
|
||||
#include "aec_user.h"
|
||||
#include "tone_player.h"
|
||||
|
||||
#define PBG_DEMO_EN 0//enalbe pbg_demo
|
||||
|
||||
#if (PBG_DEMO_EN&&TCFG_USER_TWS_ENABLE)
|
||||
|
||||
#define log_info(x, ...) printf("\n[###pbg_demo@@@]" x " ", ## __VA_ARGS__)
|
||||
|
||||
typedef struct {
|
||||
// linked list - assert: first field
|
||||
void *offset_item;
|
||||
|
||||
// data is contained in same memory
|
||||
u32 service_record_handle;
|
||||
u8 *service_record;
|
||||
} service_record_item_t;
|
||||
|
||||
|
||||
#define SDP_RECORD_HANDLER_REGISTER(handler) \
|
||||
const service_record_item_t handler \
|
||||
sec(.sdp_record_item)
|
||||
|
||||
//---------
|
||||
enum {
|
||||
PBG_EVENT_CONNECT = 1,
|
||||
PBG_EVENT_DISCONNECT,
|
||||
PBG_EVENT_MONITOR_START,//监听开始
|
||||
PBG_EVENT_PACKET_HANDLER = 7,
|
||||
};
|
||||
|
||||
enum {
|
||||
PBG_USER_ST_NULL = 0x0,
|
||||
PBG_USER_ST_CONNECT,
|
||||
PBG_USER_ST_DISCONN,
|
||||
};
|
||||
|
||||
enum {
|
||||
PBG_USER_ERR_NONE = 0x0,
|
||||
PBG_USER_ERR_SEND_BUFF_BUSY,
|
||||
PBG_USER_ERR_SEND_OVER_LIMIT,
|
||||
PBG_USER_ERR_SEND_FAIL,
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//---------
|
||||
u8 pbg_profile_support = 1; //enable libs profile success
|
||||
//---------
|
||||
|
||||
#define USER_SEND_POOL_SIZE (256L)
|
||||
static u8 user_send_pool[USER_SEND_POOL_SIZE];
|
||||
static u8 user_send_busy;
|
||||
static u8 user_state;
|
||||
|
||||
u32 pbg_user_send(void *priv, u8 *buf, u32 len);
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
//示例添加SDP服务表,注意不要跟bt_profile_config.c的定义有重复和冲突!!!!!!
|
||||
|
||||
//标准sdp结构表,以PNP服务示例定义,表末端增加 0x00,0x00 为结束符
|
||||
/* static const u8 sdp_pnp_service_data[] = { */
|
||||
/* 0x36, 0x00, 0x34, 0x09, 0x00, 0x00, 0x0A, 0x50, 0x01, 0x10, 0x00, 0x09, 0x00, 0x01, 0x36, 0x00, */
|
||||
/* 0x03, 0x19, 0x12, 0x00, 0x09, 0x02, 0x00, 0x09, 0x01, 0x03, 0x09, 0x02, 0x01, 0x09, 0x05, 0xD6, */
|
||||
/* 0x09, 0x02, 0x02, 0x09, 0x00, 0x0A, 0x09, 0x02, 0x03, 0x09, 0x02, 0x40, 0x09, 0x02, 0x04, 0x28, */
|
||||
/* 0x01, 0x09, 0x02, 0x05, 0x09, 0x00, 0x01, 0x00, 0x00 */
|
||||
/* }; */
|
||||
|
||||
/* SDP_RECORD_HANDLER_REGISTER(pnp_sdp_record_item) = { */
|
||||
/* .service_record = (u8 *)sdp_pnp_service_data, */
|
||||
/* .service_record_handle = 0x50011000, */
|
||||
/* }; */
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
||||
//发送数据接口,注意返回值;确定OK
|
||||
//数据真正发送成功,以接口user_pbg_send_ok_callback 回调为准
|
||||
u32 pbg_user_send(void *priv, u8 *buf, u32 len)
|
||||
{
|
||||
if (user_state != PBG_USER_ST_CONNECT) {
|
||||
return PBG_USER_ERR_SEND_FAIL;
|
||||
}
|
||||
|
||||
log_info("send_data(%d)\n", len);
|
||||
put_buf(buf, len);
|
||||
|
||||
if (user_send_busy == 1) {
|
||||
log_info("ERR_SEND_BUFF_BUSY\n");
|
||||
return PBG_USER_ERR_SEND_BUFF_BUSY;
|
||||
}
|
||||
|
||||
if (user_send_pool == NULL) {
|
||||
return PBG_USER_ERR_SEND_FAIL;
|
||||
}
|
||||
|
||||
if (len) {
|
||||
if (len > USER_SEND_POOL_SIZE) {
|
||||
log_info("ERR_SEND_OVER_LIMIT\n");
|
||||
return PBG_USER_ERR_SEND_OVER_LIMIT;
|
||||
}
|
||||
|
||||
user_send_busy = 1;
|
||||
memcpy(user_send_pool, buf, len);
|
||||
u32 ret = user_send_cmd_prepare(USER_CTRL_PBG_SEND_DATA, len, user_send_pool);
|
||||
if (ret) {
|
||||
user_send_busy = 0;
|
||||
return PBG_USER_ERR_SEND_FAIL;
|
||||
}
|
||||
}
|
||||
return PBG_USER_ERR_NONE;
|
||||
}
|
||||
|
||||
void user_pbg_send_ok_callback(int err_code)
|
||||
{
|
||||
user_send_busy = 0;
|
||||
log_info("send_ok\n");
|
||||
}
|
||||
|
||||
static void user_pbg_packet_handler(u8 packet_type, u16 ch, u8 *packet, u16 size)
|
||||
{
|
||||
u32 tmp32;
|
||||
|
||||
switch (packet_type) {
|
||||
case PBG_EVENT_PACKET_HANDLER:
|
||||
log_info("pbg packet_data(%d):");
|
||||
put_buf(packet, size);
|
||||
/* test_pbg_cmd_send(packet);//for test */
|
||||
break;
|
||||
|
||||
case PBG_EVENT_CONNECT:
|
||||
user_state = PBG_USER_ST_CONNECT;
|
||||
log_info("pbg connect #############\n");
|
||||
break;
|
||||
|
||||
case PBG_EVENT_DISCONNECT:
|
||||
user_state = PBG_USER_ST_DISCONN;
|
||||
log_info("pbg disconnect #############\n");
|
||||
break;
|
||||
|
||||
case PBG_EVENT_MONITOR_START:
|
||||
log_info("pbg monitor start #############\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#define PSM_BrowseGroupDescriptor (0x1001)
|
||||
extern void pbg_profile_init(u16 psm);
|
||||
extern void pbg_event_handler_register(void (*handler)(u8 packet_type, u16 channel, u8 *packet, u16 size));
|
||||
void pbg_demo_init(void)
|
||||
{
|
||||
log_info("pbg_demo_init\n");
|
||||
pbg_profile_init(PSM_BrowseGroupDescriptor);//input PSM ID
|
||||
pbg_event_handler_register(user_pbg_packet_handler);
|
||||
user_state = PBG_USER_ST_DISCONN;
|
||||
user_send_busy = 0;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void pbg_demo_init(void)
|
||||
{
|
||||
/* printf("pbg not enable...\n"); */
|
||||
}
|
||||
|
||||
void pbg_user_battery_level_sync(u8 *dev_bat)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
void pbg_user_ear_pos_sync(u8 left, u8 right)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
bool pbg_user_key_vaild(u8 *key_msg, struct sys_event *event)
|
||||
{
|
||||
//add code
|
||||
return false;
|
||||
}
|
||||
|
||||
void pbg_user_event_deal(struct pbg_event *evt)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
void pbg_user_set_tws_state(u8 conn_flag)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
void pbg_user_mic_fixed_deal(u8 mode)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
void pbg_user_recieve_sync_info(u8 *sync_info)
|
||||
{
|
||||
//add code
|
||||
}
|
||||
|
||||
int pbg_user_is_connected(void)
|
||||
{
|
||||
//add code
|
||||
//return PBG服务是否已连上,区分安卓和苹果,是否持续广播
|
||||
return 1;//不支持PBG服务,return 1
|
||||
}
|
||||
|
||||
//----------------------------------------
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user