feat: Add rfid feature and .gitignore file

This commit is contained in:
lmx
2025-11-28 16:25:35 +08:00
parent 818e8c3778
commit ade4b0a1f8
1244 changed files with 342105 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View 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*/

View 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*/

File diff suppressed because it is too large Load Diff

View 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

View 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_*/

File diff suppressed because it is too large Load Diff

View 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

File diff suppressed because it is too large Load Diff

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
View 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");
}

View 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

View 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
View 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

View 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*/

View 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
View 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

View 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
}

View 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

View 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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 */

View 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,引脚输出低电平。
1MIC0 作为通话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 */

File diff suppressed because it is too large Load Diff

View 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 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View 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 */

View 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

View 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

File diff suppressed because it is too large Load Diff

253
apps/earphone/bt_ble_hid.c Normal file
View 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

File diff suppressed because it is too large Load Diff

2228
apps/earphone/bt_tws.c Normal file

File diff suppressed because it is too large Load Diff

View 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

File diff suppressed because it is too large Load Diff

View 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 */

View 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
View 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,
};

View 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 获取主麦能量
* mic1 获取副麦能量
* 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_*/

View 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

View 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_

View 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_

View 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_

View 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_

View 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

View 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

View 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

View 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

View 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

View File

@ -0,0 +1,6 @@
#ifndef CONFIG_APP_SD_MUSIC_H
#define CONFIG_APP_SD_MUSIC_H
int music_app_check(void);//music 在线检测 切换模式判断使用
#endif

View 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

View 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_

View 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

View 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_*/

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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_ */

View 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

View 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

View 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

View 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

View 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_ */

View 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

View 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

View 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

View 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

View 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

View 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

View 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_ */

View 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

View 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__

View File

@ -0,0 +1,12 @@
#ifndef _WIRELESS_MIC_TEST_
#define _WIRELESS_MIC_TEST_
#include "system/includes.h"
// struct adapter_media {
// };
#endif

View 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;
}

View 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)) */

View 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

View 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

View 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;

View 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);

View 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

View 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);

View 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);

View 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);

View 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;

View 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
View 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