feat: 添加杰理 JL7016 SOC 代码生成模板

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-19 16:05:36 +08:00
co-authored by Cursor
parent 0eda925f58
commit 16bffd16b2
914 changed files with 254709 additions and 45 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+497
View File
@@ -0,0 +1,497 @@
#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"
#include "usr_rtc.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+768+2048, 256 },
{"sys_event", 7, 0, 256+128, 0 },
{"systimer", 7, 0, 128+128+128, 0 },
{"btctrler", 4, 0, 1536+512+128, 384 },
{"btencry", 1, 0, 1536+512+128, 128 },
//{"tws", 5, 0, 512, 128 },
#if (BT_FOR_APP_EN)
{"btstack", 3, 0, 1024+1024+1024+512, 256 },
#else
{"btstack", 3, 0, 1024+1024+1024+512, 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+128, 0 },
//{"tws_ota", 2, 0, 256, 0 },
//{"tws_ota_msg", 2, 0, 256, 128 },
{"dw_update", 2, 0, 256+768, 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;
USR_VAR usr_var;
void clr_wdt(void);
u8 usr_get_ldoin();
void app_earphone_play_voice_file(const char *name);
extern int cpu_reset_by_soft();
extern int audio_dec_init();
extern int audio_enc_init();
extern u32 timer_get_ms(void);
extern void uart_dev_test_main();
extern int ana_demo();
extern void uart_dev_main_init();
extern void usr_check_mcu_all_sta();
extern void usr_clear_pair_info_noreset(void);
extern void usr_disable_intterupt();
extern void usr_disable_charge_intterupt();
u8 power_reset_flag=0;
/*
* 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;
}
__attribute__((weak))
u8 get_charge_online_flag(void)
{
return 0;
}
/* 软复位 / 充电唤醒时跳过开机提示音 */
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
#endif
}
u8 usr_get_ldoin()
{
#if USR_CHG_IN_IO
if(gpio_read(USR_CHG_IN_IO)==0)return 1;
return 0;
#else
#if TCFG_CHARGE_ENABLE
if (get_ldo5v_online_hw() && get_charge_online_flag())return 1;
else return 0;
#else
return 0;
#endif // TCFG_CHARGE_ENABLE
#endif // USR_CHG_IN_IO
}
u8 usr_get_full()
{
#if USR_CHG_FULL_IO
if(gpio_read(USR_CHG_FULL_IO)==0)return 1;
return 0;
#else
#if TCFG_CHARGE_ENABLE
if(get_charge_full_flag())return 1;
else return 0;
#else
return 0;
#endif // TCFG_CHARGE_ENABLE
#endif // USR_CHG_FULL_IO
}
u8 usr_get_ldoin_all()
{
if(usr_get_ldoin()||usr_get_full())return 1;
return 0;
}
#if 0
const struct sys_time def_sys_time = { //初始一下当前时间
.year = 2020,
.month = 1,
.day = 1,
.hour = 0,
.min = 0,
.sec = 0,
};
const struct rtc_dev_platform_data rtc_init_data=
{
.default_sys_time = &def_sys_time,
.default_alarm = NULL,
.clk_sel = CLK_SEL_32K,//CLK_SEL_LRC,//CLK_SEL_32K,
.cbfun = NULL, //闹钟中断的回调函数,用户自行定义
/* .cbfun = alarm_isr_user_cbfun, */
};
#endif // 0
extern void bt_osc_offset_ext_updata(s32 offset);
extern void usr_jb_init();
void app_main()
{
int update = 0;
u32 addr = 0, size = 0;
struct intent it;
log_info("app_main...............#####\n");
bt_osc_offset_ext_updata(11);
usr_var.usr_ota_succ_flag=0;
usb_iomode(1);
//#ifndef CONFIG_DEBUG_ENABLE
// uart_dev_test_main();
//#endif // CONFIG_DEBUG_ENABLE
app_var.start_time = timer_get_ms();
#if (defined(CONFIG_MEDIA_NEW_ENABLE) || (defined(CONFIG_MEDIA_DEVELOP_ENABLE)))
/*解码器*/
audio_enc_init();
audio_dec_init();
#endif
//rtc_init(&rtc_init_data);
#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 = 0;//update_result_deal();
}
app_var_init();
usr_rtc_init(); /* 打开硬件 RTC,网关 DEVICEINFO 对时走 usr_rtc_set_from_unix */
usr_jb_init();
#if TCFG_MC_BIAS_AUTO_ADJUST
mc_trim_init(update);
#endif/*TCFG_MC_BIAS_AUTO_ADJUST*/
//if (get_charge_online_flag())
if(0){
#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);
//uart_dev_main_init();
//sys_timeout_add(NULL,usr_check_mcu_all_sta,1000);
if(usr_get_ldoin()||usr_get_full())
{
usr_var.usr_power_charge_flag=1;
}
else
{
usr_var.usr_power_charge_flag=2;
}
/*
* 上电强制进入配对模式:
* 1) usr_goto_pair=1:后续 usr_ble_adv_init() 走绑定广播(encode4bind),不走重连广播
* 2) usr_clear_pair_info_noreset():清 VM 中三元组,保证 paired_flag=0
* 注意:须在 BLE 协议栈调用 usr_ble_adv_init() 之前设置;此处不清复位,避免上电死循环复位
*/
usr_var.usr_goto_pair = 1;
usr_clear_pair_info_noreset();
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
}
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");
}
*/
+285
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;
}
+462
View File
@@ -0,0 +1,462 @@
#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 (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;
}
}
}*/
break;
//不是测试盒事件,返回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;*/
//不是测试盒命令,返回0,未处理
default:
return 0;
}
return 1;
}
CHARGESTORE_HANDLE_REG(testbox, app_testbox_data_handler);
#endif
+598
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*/
+434
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
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
+66
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
}
+164
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
+20
View File
@@ -0,0 +1,20 @@
#ifndef BOARD_CONFIG_H
#define BOARD_CONFIG_H
/*
* 板级配置选择
*/
#define CONFIG_BOARD_JL701N_DEMO
#include "board_jl701n_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
@@ -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 1 //配置是否使用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 1 //是否生成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 -1
//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 00 //unit:second
#define CONFIG_RESET_LEVEL 0 //tigger level(0/1)
#if CONFIG_IO_KEY_EN
#define CONFIG_SUPPORT_RESET1
#define CONFIG_RESET1_PIN PB01 //io pin
#define CONFIG_RESET1_TIME 16 //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 3 ////VDDIO_LVD挡位,0: 1.9V 1: 2.0V 2: 2.1V 3: 2.2V 4: 2.3V 5: 2.4V 6: 2.5V 7: 2.6V
//with single-bank mode,actual vm size should larger this VM_LEAST_SIZE,and dual bank mode,actual vm size equals this;
#define CONFIG_VM_LEAST_SIZE 8K
//config whether erased this area when do a update,1-No Operation,0-Erase
#define CONFIG_VM_OPT 1
//config whether erased this area when do a update,1-No Operation,0-Erase
#define CONFIG_BTIF_OPT 1
//reserved two custom cfg area for the future definition
//#define CONFIG_RESERVED_AREA1 EXIF1
#ifdef CONFIG_RESERVED_AREA1
#define CONFIG_RESERVED_AREA1_ADDR AUTO
#define CONFIG_RESERVED_AREA1_LEN 0x1000
#define CONFIG_RESERVED_AREA1_OPT 1
//#define CONFIG_RESERVED_AREA1_FILE anc_gains.bin
#endif
//#define CONFIG_RESERVED_AREA2 EXIF2
#ifdef CONFIG_RESERVED_AREA2
#define CONFIG_RESERVED_AREA2_ADDR AUTO
#define CONFIG_RESERVED_AREA2_LEN 0x1000
#define CONFIG_RESERVED_AREA2_OPT 1
//#define CONFIG_RESERVED_AREA2_FILE anc_gains.bin
#endif
/* Above Macros Only For Post Bulid Configuaration */
#endif /* #ifdef CONFIG_BOARD_JL701N_DEMO */
#endif /* #ifndef CONFIG_BOARD_JL701N_DEMO_POST_BUILD_CFG_H */
+417
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
+255
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;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+373
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
+479
View File
@@ -0,0 +1,479 @@
#include "board_config.h"
#include "system/includes.h"
#include "asm/power_interface.h"
#include "app_config.h"
#include "dual_bank_updata_api.h"
#include "update.h"
#include "update_loader_download.h"
#include "app_main.h"
#include "event.h"
#undef _DEBUG_H_
#define LOG_TAG_CONST DUAL_OTA //修改成文件名
#define LOG_TAG "[DUAL_OTA]"
#include "debug.h"
#define LOG_v(t) log_tag_const_v_ ## t
#define LOG_i(t) log_tag_const_i_ ## t
#define LOG_d(t) log_tag_const_d_ ## t
#define LOG_w(t) log_tag_const_w_ ## t
#define LOG_e(t) log_tag_const_e_ ## t
#define LOG_c(t) log_tag_const_c_ ## t
#define LOG_tag(tag, n) n(tag)
const char LOG_tag(LOG_TAG_CONST,LOG_v) AT(.LOG_TAG_CONST) = 0;
const char LOG_tag(LOG_TAG_CONST,LOG_i) AT(.LOG_TAG_CONST) = 1;
const char LOG_tag(LOG_TAG_CONST,LOG_d) AT(.LOG_TAG_CONST) = 1; //log_debug
const char LOG_tag(LOG_TAG_CONST,LOG_w) AT(.LOG_TAG_CONST) = 1;
const char LOG_tag(LOG_TAG_CONST,LOG_e) AT(.LOG_TAG_CONST) = 1;
const char LOG_tag(LOG_TAG_CONST,LOG_c) AT(.LOG_TAG_CONST) = 1;
/*******************************************************************************
* #define CONFIG_DOUBLE_BANK_ENABLE 1
* #define CONFIG_FLASH_SIZE FLASH_SIZE_512K //配置FLASH大小
* #define CONFIG_DB_UPDATE_DATA_GENERATE_EN 1
* #define CONFIG_ONLY_GRENERATE_ALIGN_4K_CODE 1
*
* 检查isd_config.ini文件
* BR22_TWS_DB = YES; // dual bank flash framework enable
* FLASH_SIZE = 0x100000; // flash_size cfg
* BR22_TWS_VERSION = 0; // default fw version
* DB_UPDATE_DATA = YES; // generate db_update_data.bin
* FORCE_4K_ALIGN = YES; // force aligin with 4k bytes
* SPECIAL_OPT = 0; // only generate one flash.bin
*
* const int support_dual_bank_update_en = 1;
* const int support_vm_data_keep = 1;
*******************************************************************************/
#define MAX_PACKET_LEN 4096//(512 * 8)//(512 * 4) //最大包长,至少512,最好4K,需要自行组包
//0:CRC-16/XMODEM Standard 杰理默认的
//1:客户自行选择crc16的算法类型,重定义 dual_ota_crc_calc()
#define CRC_TYPE 1
__attribute__((weak))
u16 dual_ota_crc_calc(u8 *buf, u32 len, u16 init)
{
log_debug("%s weak func", __func__);
//CRC16-XMODEM
u16 poly = 0x1021;
u16 crc = init;
while(len--){
u16 data = *buf++;
crc ^= data << 8; //逆序
for (u8 i = 0; i < 8; ++i){
crc = crc & 0x8000 ? (crc << 1) ^ poly : crc << 1; //逆序
}
}
return crc;
}
enum{
DUAL_OTA_NOTIFY_SUCCESS = 0,
DUAL_OTA_NOTIFY_FAIL,
DUAL_OTA_NOTIFY_CONTINUE,
};
typedef enum{
DUAL_OTA_STEP_START = 0,
DUAL_OTA_STEP_WRITE,
DUAL_OTA_STEP_VERIFY,
}DUAL_OTA_STEP;
typedef struct {
u32 file_size; // db_update_data.bin
u32 file_crc; // CRC_TYPE 的对应值
u32 max_pkt_len; // MAX_PACKET_LEN
}dual_ota_info;
static dual_ota_info ota_info;
static u8 *bin_buf=NULL;//[MAX_PACKET_LEN];
static DUAL_OTA_STEP dual_ota_step = DUAL_OTA_STEP_START;
static int dual_ota_written_size = 0;
static u8 dual_ota_idle = 1; // 置 1 可进睡眠, 置 0 不可进睡眠
u8 usr_get_ota_status()
{
return dual_ota_idle;
}
static u8 dual_ota_idle_query(void)
{
if(dual_ota_idle){
return 1;
}else{
return 0;
}
}
REGISTER_LP_TARGET(dual_ota_lp_target) = {
.name = "dual_ota_lp",
.is_idle = dual_ota_idle_query,
};
static u32 read_32(u8 *p)
{
return ((u32)(p[3]) << 24) | ((u32)(p[2]) << 16) | ((u32)(p[1]) << 8) | (p[0]);
}
extern void ram_protect_close(void);
extern void hwi_all_close(void);
static void dual_ota_fail_exit(void)
{
log_info("%s[step:%d]", __func__, dual_ota_step);
if(bin_buf){
free(bin_buf);
bin_buf = NULL;
}
memset(&ota_info, 0x00, sizeof(ota_info));
dual_ota_step = DUAL_OTA_STEP_START;
dual_ota_written_size = 0;
dual_ota_idle = 0;
}
static void dual_ota_succ_exit(void)
{
log_info("%s[step:%d]", __func__, dual_ota_step);
if(bin_buf){
free(bin_buf);
bin_buf = NULL;
}
memset(&ota_info, 0x00, sizeof(ota_info));
dual_ota_step = DUAL_OTA_STEP_START;
dual_ota_written_size = 0;
dual_ota_idle = 0;
}
enum {
OTA_START_UPDATE = 0,
OTA_START_UPDATE_READY,
OTA_START_VERIFY,
OTA_UPDATE_OVER,
OTA_UPDATE_ERR,
OTA_UPDATE_SUCC,
};
#include "update_tws_new.h"
void usr_ota_event_post(u32 type, u8 event);
static void dual_ota_cpu_reset(void)
{
log_info("%s", __func__);
dual_ota_succ_exit();
usr_var.usr_ota_succ_flag=2;
//os_task_del("dw_update");
//update_result_set(UPDATA_SUCC);
//dual_bank_passive_update_exit(NULL);
//ram_protect_close();
//hwi_all_close();
//cpu_reset();
//sys_enter_soft_poweroff(NULL);
//wdt_init(WDT_256MS);
//while(1);
usr_ota_event_post(SYS_BT_OTA_EVENT_TYPE_STATUS, OTA_UPDATE_OVER);
}
static void dual_ota_fail_cpu_reset(void)
{
log_info("%s", __func__);
dual_ota_fail_exit();
usr_ota_event_post(SYS_BT_OTA_EVENT_TYPE_STATUS, OTA_UPDATE_ERR);
}
void usr_ota_exit()
{
sys_timeout_add(NULL, dual_ota_fail_cpu_reset, 300);
}
extern void ble_multi_trans_disconnect(void);
static void dual_ota_success_reset(void)
{
log_info("%s", __func__);
usr_var.usr_ota_succ_flag=1;
ble_multi_trans_disconnect();
sys_timeout_add(NULL, dual_ota_cpu_reset, 300);
/* 通知上位机升级完整,准备复位 */
//dual_ota_notify_msg_to_app(DUAL_OTA_NOTIFY_SUCCESS);
}
static void dual_ota_fail_reset(void)
{
log_info("%s", __func__);
usr_var.usr_ota_succ_flag=3;
ble_multi_trans_disconnect();
dual_ota_fail_exit();
//sys_timeout_add(NULL, dual_ota_fail_cpu_reset, 300);
wdt_init(WDT_512MS);
while(1);
/* 通知上位机升级完整,准备复位 */
//dual_ota_notify_msg_to_app(DUAL_OTA_NOTIFY_SUCCESS);
}
static int dual_ota_boot_info_cb(int err)
{
log_info("%s[err:%d]", __func__, err);
if (err == 0) {
dual_ota_success_reset();
} else {
dual_ota_fail_reset();
}
return 0;
}
extern int dual_bank_update_verify_without_crc(void); //0:success 1:fail
static int dual_ota_verify_result(int res) //1:success 0:fail
{
log_info("%s[res:%d %s]", __func__, res, res ? "success" : "fail");
if(res){
/* 校验成功 */
dual_bank_update_burn_boot_info(dual_ota_boot_info_cb);
} else{
/* 校验失败 */
usr_var.usr_ota_succ_flag=1;
flash_update_clr_boot_info(CLEAR_APP_UPDATE_BANK);
dual_ota_fail_reset();
}
return 0;
}
static void dual_ota_crc_init_cb(void)
{
log_info("%s", __func__);
}
static u32 dual_ota_crc_calc_cb(u32 init_crc, u8 *data, u32 len)
{
u32 crc16 = 0;
crc16 = dual_ota_crc_calc(data, len, init_crc);
log_debug("%s[init_crc:0x%x len:%d crc:0x%x]", __func__, init_crc, len, crc16);
return crc16;
}
static int dual_ota_update_verify(void)
{
log_info("%s[file_crc:0x%x]", __func__, ota_info.file_crc);
clk_set("sys", 120 * 1000000L);
os_time_dly(1);
if(ota_info.file_crc){
if(CRC_TYPE){
dual_bank_update_verify(dual_ota_crc_init_cb, dual_ota_crc_calc_cb,
dual_ota_verify_result);
}else{
dual_bank_update_verify(NULL, NULL, dual_ota_verify_result);
}
}else{
int ret = dual_bank_update_verify_without_crc();
dual_ota_verify_result(ret ? 0 : 1);
}
return 0;
}
static int dual_ota_write_cb(void *priv)
{
int ret = (int)priv;
if (ret) {
log_info("%s -> fail", __func__);
dual_ota_fail_reset();
return -1;
}else{
//log_info("%s -> success", __func__);
/* 通知上位机发送下一组数据 */
dual_ota_notify_msg_to_app(DUAL_OTA_NOTIFY_CONTINUE);
return 0;
}
}
static int dual_ota_update_init(u32 file_size, u32 file_crc, u32 pkt_len)
{
log_info("%s[size:%d crc:0x%x ptk_len:%d]",__func__,file_size, file_crc, pkt_len);
if(bin_buf) return -1;
bin_buf = malloc(MAX_PACKET_LEN);
if(bin_buf == NULL) return -2;
if((u32)bin_buf % 4) {//4byte对齐
log_info("buf err !!!!!!!");
ASSERT(0, "%s: bin_buf addr unaligned !!!!", __func__);
}
memset(bin_buf, 0x00, MAX_PACKET_LEN);
int ret = 0;
ret = dual_bank_passive_update_init(file_crc, file_size, pkt_len, NULL);
if(ret == 0){
ret = dual_bank_update_allow_check(file_size);
if(ret == 0){
dual_ota_idle = 0;
dual_ota_written_size = 0;
ota_info.file_size = file_size;
ota_info.file_crc = file_crc;
ota_info.max_pkt_len = pkt_len;
/* 可以升级,需要通知上位机准备发包 */
dual_ota_notify_msg_to_app(DUAL_OTA_NOTIFY_CONTINUE);
}
}
log_info("%s[ret:%d]", __func__, ret);
if(ret){
dual_ota_fail_reset();
//dual_ota_fail_exit(); /* 无法升级 */
return -3;
}
return ret;
}
static int dual_ota_update_deal(u8 step, u8 *buf, u32 len) //升级流程处理
{
int ret = 0;
int w_ret = 0xffff;
//log_info("%s[step:%d]", __func__, step);
switch(step){
case DUAL_OTA_STEP_START:
u32 *data = (u32 *)buf; //buf 地址需要aligned(4)
u32 file_size = data[0];
u32 file_crc = data[1];
/* update_mode_info_t info = {
.type = BLE_APP_UPDATA,
.state_cbk = NULL,
.p_op_api = NULL,
.task_en = 1,
};*/
//app_active_update_task_init(&info);
//os_time_dly(2);
ret = dual_ota_update_init(file_size, file_crc, MAX_PACKET_LEN);
break;
case DUAL_OTA_STEP_WRITE:
//OS_ENTER_CRITICAL();
w_ret=dual_bank_update_write(buf, len, dual_ota_write_cb);
dual_ota_written_size += len;
//printf("w_ret = %d written_size=%d\n",w_ret,dual_ota_written_size);
//OS_EXIT_CRITICAL();
break;
case DUAL_OTA_STEP_VERIFY:
dual_ota_update_verify();
break;
}
return ret;
}
/********************************************************************************
* 跟上位机通信接口
* 自行按照协议,自行修改,这个写法只是个demo
* 数据来源:串口、USB、BLE等
* 数据包很小,需要缓存成一包大包:MAX_PACKET_LEN,才能调用dual_bank_update_write
* MAX_PACKET_LEN 定义成 小包的整数倍 MAX_PACKET_LEN == len * n
* 必须在低优先级任务执行,不能在中断函数、蓝牙回调函数执行
* https://gitee.com/Jieli-Tech/fw-AC63_BT_SDK/issues/I79ORW
*********************************************************************************/
int dual_ota_app_data_deal(u32 msg, u8 *buf, u32 len)
{
if((buf == NULL) || (len == 0)){
log_info("%s para is error", __func__);
return -1;
}
//log_info("%s[msg:%d len:%d]", __func__, msg, len);
/* log_debug_hexdump(buf, len); */
int ret = 0;
static u32 size = 0;
if(dual_ota_step == DUAL_OTA_STEP_WRITE){
//log_info("##### size = %d len = %d ota_info.max_pkt_len = %d\n",size,len,ota_info.max_pkt_len);
if((size < ota_info.max_pkt_len) && (size + len <= ota_info.max_pkt_len)){
memcpy(bin_buf + size, buf, len);
size += len;
}else{
log_info("%s size + len over MAX_PACKET_LEN", __func__);
}
if((size == ota_info.max_pkt_len)
||(size + dual_ota_written_size >= ota_info.file_size))
{
if(size + dual_ota_written_size >= ota_info.file_size){
dual_ota_step = DUAL_OTA_STEP_VERIFY;
}
dual_ota_update_deal(DUAL_OTA_STEP_WRITE, bin_buf, size);
size = 0;
}
}else{
log_info("444444444444444");
if((buf[0] == 0x55) && (buf[1] == 0xAA)){
u32 data[2];
data[0] = read_32(buf + 2); //file_size
data[1] = read_32(buf + 6); //file_crc
flash_update_clr_boot_info(CLEAR_APP_UPDATE_BANK);
ret = dual_ota_update_deal(DUAL_OTA_STEP_START, (u8 *)data, sizeof(data));
if(ret == 0){
log_info("555555555555");
dual_ota_step = DUAL_OTA_STEP_WRITE;
}
}
if((buf[0] == 0xAA) && (buf[1] == 0x55)){
dual_ota_update_deal(DUAL_OTA_STEP_VERIFY, NULL, 0);
}
}
return ret;
}
extern int uart_tr_send_data(u8 *data, u32 len);
/* int dual_ota_notify_msg_to_app(u32 msg, u8 *buf, u32 len) */
int dual_ota_notify_msg_to_app(u32 msg)
{
int ret = 0;
char * str = NULL;
//log_info("%s[msg:%d]", __func__, msg);
switch(msg)
{
case DUAL_OTA_NOTIFY_SUCCESS: //成功
str = "success\r\n";
log_info("#########3 DUAL_OTA_NOTIFY_SUCCESS");
break;
case DUAL_OTA_NOTIFY_FAIL: //失败
str = "fail\r\n";
log_info("#########3 DUAL_OTA_NOTIFY_FAIL");
break;
case DUAL_OTA_NOTIFY_CONTINUE: //上一组数据处理成功,继续下一组
str = "continue\r\n";
// log_info("#########3 DUAL_OTA_NOTIFY_CONTINUE");
break;
}
// uart_tr_send_data((u8 *)str, strlen(str));
return ret;
}
int bt_ota_event_handler(struct bt_event *bt)
{
int ret = 0;
switch (bt->event) {
case OTA_START_UPDATE:
log_info("OTA_START_UPDATE\n");
break;
case OTA_UPDATE_OVER:
log_info("11OTA_UPDATE_OVER@##################3\n");
// update_result_set(UPDATA_SUCC);
// //os_time_dly(5);
dual_bank_passive_update_exit(NULL);
cpu_reset();
break;
case OTA_UPDATE_ERR:
log_info("111OTA_UPDATE_ERR@##################3\n");
dual_bank_passive_update_exit(NULL);
cpu_reset();
break;
/*case OTA_UPDATE_SUCC:
printf("OTA_UPDATE_SUCC\n");
update_result_set(UPDATA_SUCC);
dual_bank_passive_update_exit(NULL);
sys_enter_soft_poweroff((void *)1);
break;*/
default:
break;
}
return 0;
}
void usr_ota_event_post(u32 type, u8 event)
{
struct sys_event e;
log_info("usr_ota_event_post = %d\n",event);
e.type = SYS_BT_EVENT;
e.arg = (void *)type;
e.u.bt.event = event;
sys_event_notify(&e);
}
File diff suppressed because it is too large Load Diff
+672
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 */
+87
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
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 = 1;//tone_play_index(p_tone->power_off, 1);
//printf("power_off tone play ret:%d", ret);
if (ret) {
if (app_var.goto_poweroff_flag) {
log_info("power_off tone play err,enter soft poweroff");
app_idle_enter_softoff();
}
}
}
#if CHARGING_CLEAN_PHONE_INFO
else {
sys_key_event_enable();
}
#endif
break;
case ACTION_IDLE_POWER_OFF:
os_taskq_flush();
syscfg_write(CFG_MUSIC_VOL, &app_var.music_volume, 1);
break;
}
break;
case APP_STA_PAUSE:
break;
case APP_STA_RESUME:
break;
case APP_STA_STOP:
break;
case APP_STA_DESTROY:
break;
}
return 0;
}
static const struct application_operation app_idle_ops = {
.state_machine = idle_state_machine,
.event_handler = idle_event_handler,
};
REGISTER_APPLICATION(app_app_idle) = {
.name = "idle",
.action = ACTION_IDLE_MAIN,
.ops = &app_idle_ops,
.state = APP_STA_DESTROY,
};
+209
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_*/
+31
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
+12
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_
+13
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_
+17
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_
+556
View File
@@ -0,0 +1,556 @@
#ifndef APP_CONFIG_H
#define APP_CONFIG_H
/*
* 系统打印总开关
*/
#define LIB_DEBUG 0
#define CONFIG_DEBUG_LIB(x) (x & LIB_DEBUG)
#define CONFIG_DEBUG_ENABLE
#ifndef CONFIG_DEBUG_ENABLE
//#define CONFIG_DEBUG_LITE_ENABLE //轻量级打印开关, 默认关闭
#endif
#define TCFG_APP_RTC_EN 1
//*********************************************************************************//
// 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 0
#define RCSP_BTMATE_EN 1
#define RCSP_ADV_EN 1
//#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 0 //是否支持TWS同步升级
#define OTA_TWS_SAME_TIME_NEW 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 */
#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 -1 //上下拉电阻检测引脚
#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
#endif
+136
View File
@@ -0,0 +1,136 @@
#ifndef APP_MAIN_H
#define APP_MAIN_H
typedef struct _USR_VAR {
u8 usr_start_write_flash ;
u8 usr_plan_cnt ;
u8 usr_intterupt_reinit_falg ;
u8 usr_goto_updata ;
u8 usr_goto_pair ;
u8 usr_can_pair ;
u8 usr_ota_succ_flag ;
u8 usr_adv_flag ;
u8 usr_low_power_flag ;
u8 usr_allow_to_sleep_cnt;
u8 usr_power_charge_flag ;
u8 usr_disable_zjhendong;
u8 usr_enter_dlps_flag ;
u16 usr_bat_level_read ;
u16 usr_auto_off_cnt ;
u16 usr_interrupt_cnt ;
u16 usr_adv_interval ;
u16 usr_bat_level ;
u32 usr_data_index ;
u32 usr_allow_to_flash ;
u32 usr_ota_data_size ;
u32 usr_cureent_utc ;
int usr_double_ota_timer_id ;
int ota_timer ;
int usr_ota_data_id ;
int usr_timezoneOffset ;
} USR_VAR;
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
#define earphone (&bt_user_priv_var)
typedef struct _BT_USER_COMM_VAR {
} BT_USER_COMM_VAR;
extern APP_VAR app_var;
extern USR_VAR usr_var;
extern BT_USER_PRIV_VAR bt_user_priv_var;
#endif
+13
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
+39
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
+6
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
+32
View File
@@ -0,0 +1,32 @@
#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
APP_RTC_TASK,
#if TCFG_APP_AUX_EN
APP_AUX_TASK,
#endif
};
extern u8 app_curr_task;
extern u8 app_next_task;
extern u8 app_prev_task;
int app_task_switch_check(u8 app_task);
int app_core_back_to_prev_app_over_check(void);
int app_task_switch_to(u8 app_task, int priv);
void app_task_switch_next(void);
void app_task_switch_prev(void);
u8 app_get_curr_task(void);
#endif
+18
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_
@@ -0,0 +1,69 @@
#ifndef __AUDIO_ENC_MPT_FRE_RESPONE_H_
#define __AUDIO_ENC_MPT_FRE_RESPONE_H_
#include "asm/cpu.h"
/********************用户配置****************************/
//计算长度 输入单位s16/输出单位float
#define AUDIO_ENC_MPT_FRERES_POINT 1024
/********************非用户配置****************************/
//MIC频响测试通道ID u16
#define AUDIO_ENC_MPT_FF_MIC 0X01 //测试TWS FFMIC or 头戴式LFF MIC
#define AUDIO_ENC_MPT_FB_MIC 0X02 //测试TWS FBMIC or 头戴式LFB MIC
#define AUDIO_ENC_MPT_RFF_MIC 0X04 //测试头戴式RFF MIC
#define AUDIO_ENC_MPT_RFB_MIC 0X08 //测试头戴式RFB MIC
#define AUDIO_ENC_MPT_CVP_OUT 0X10 //测试通话算法输出
#define AUDIO_ENC_MPT_TALK_MIC 0X20 //测试通话TALK 主MIC
#define AUDIO_ENC_MPT_SLAVE_MIC 0X40 //测试通话TALK 副MIC
#define AUDIO_ENC_MPT_TALK_FB_MIC 0X80 //测试通话TALK FBMIC
//常见通道组合
//FF+TALK+算法输出频响测试,默认关闭DNS, 外部喇叭发声
#define AUDIO_ENC_MPT_CH_TWS_CVP_ENC (AUDIO_ENC_MPT_SLAVE_MIC | AUDIO_ENC_MPT_TALK_MIC | AUDIO_ENC_MPT_CVP_OUT)
//FF回声/气密性+FB频响测试,耳机喇叭发声
#define AUDIO_ENC_MPT_CH_TWS_FF_FB (AUDIO_ENC_MPT_FF_MIC | AUDIO_ENC_MPT_FB_MIC)
#define AUDIO_ENC_MPT_FRERES_ASYNC 1 //是否异步处理, 异步算不过来要加时钟提醒
enum {
ENC_FRE_RES_STATE_START = 0,
ENC_FRE_RES_STATE_RUN,
ENC_FRE_RES_STATE_STOP,
};
enum {
ENC_FRE_RESPONE_MSG_RUN = 0xA1,
};
//更新目标通道输入buf、len
void audio_enc_mpt_fre_response_inbuf(u16 id, s16 *buf, int len);
//音频测试频响计算运行
void audio_enc_mpt_fre_response_post_run(u16 id);
//音频测试频响计算启动, ch 对应目标的通道
void audio_enc_mpt_fre_response_start(u16 ch);
//音频测试频响计算停止
void audio_enc_mpt_fre_response_stop(void);
//工具获取数据文件
int audio_enc_mpt_fre_response_file_get(u8 **buf);
//数据获取结束,释放内存
void audio_enc_mpt_fre_response_release(void);
//音频测试MIC频响开启, ch 对应目标的通道
void audio_enc_mpt_fre_response_open(u16 ch);
//音频测试MIC频响关闭
void audio_enc_mpt_fre_response_close(void);
#endif /*__AUDIO_ENC_MPT_FRE_RESPONE_H_*/
+43
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
+48
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
+26
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
+194
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
@@ -0,0 +1,41 @@
#ifndef DEFAULT_EVENT_HANDLER_H
#define DEFAULT_EVENT_HANDLER_H
#include "system/includes.h"
void default_event_handler(struct sys_event *event);
#endif
+272
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
+103
View File
@@ -0,0 +1,103 @@
#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_POWEROFF_HOLD_UP,
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_IR_NUM_0,
KEY_IR_NUM_1,
KEY_IR_NUM_2,
KEY_EQ_MODE,
KEY_THIRD_CLICK,
KEY_MUSIC_FF,
KEY_MUSIC_FR,
KEY_MUSIC_PLAYER_START,
KEY_MUSIC_PLAYER_END,
KEY_MUSIC_PLAYER_DEC_ERR,
KEY_MUSIC_DEVICE_TONE_END,
KEY_MUSIC_PLAYER_QUIT,
KEY_MUSIC_PLAYER_AUTO_NEXT,
KEY_MUSIC_PLAYER_PLAY_FIRST,
KEY_MUSIC_PLAYER_PLAY_LAST,
KEY_MUSIC_CHANGE_REPEAT,
KEY_MUSIC_CHANGE_DEV,
KEY_MUSIC_AUTO_NEXT_DEV,
KEY_MUSIC_CHANGE_DEV_REPEAT,
KEY_MUSIC_SET_PITCH,
KEY_MUSIC_SET_SPEED,
KEY_MUSIC_PLAYE_BY_DEV_FILENUM,
KEY_MUSIC_PLAYE_BY_DEV_SCLUST,
KEY_MUSIC_PLAYE_BY_DEV_PATH,
KEY_MUSIC_DELETE_FILE,
KEY_MUSIC_PLAYE_NEXT_FOLDER,
KEY_MUSIC_PLAYE_PREV_FOLDER,
KEY_MUSIC_PLAYE_REC_FOLDER_SWITCH,
KEY_MUSIC_PLAYER_AB_REPEAT_SWITCH,
KEY_SEND_SPEECH_START,
KEY_SEND_SPEECH_STOP,
#if (BT_FOR_APP_EN)
KEY_AI_DEC_SUSPEND,
KEY_AI_DEC_RESUME,
#endif
KEY_EARTCH_ENABLE,
KEY_EARTCH_DISABLE,
KEY_ANC_SWITCH,
KEY_ANC_EAR_ADAPTIVE,
KEY_ANC_COEFF_SWITCH,
KEY_MUSIC_EFF, //播歌音效切换
KEY_PHONE_PITCH,//通话上行 变声切换
KEY_HEARING_AID_TOGGLE,//辅听功能开关
MSG_HALF_SECOND,
KEY_CLEAN_PHONE_INFO,
KEY_CLEAN_PHONE_INFO_HOLD,
KEY_CLEAN_PHONE_INFO_UP,
KEY_SPATIAL_EFFECT_MODE_SWITCH, /*切换空间音频模式*/
KEY_SPEAK_TO_CHAT_SWITCH, /*智能免摘开关*/
KEY_WIND_NOISE_DET_SWITCH, /*风噪检测开关*/
KEY_WIDE_AREA_TAP_SWITCH, /*广域点击开关*/
KEY_ANC_MULT_SCENE_SWITCH, /*多滤波器切换demo*/
KEY_NULL = 0xFF,
};
enum {
ONE_KEY_CTL_NEXT_PREV = 1,
ONE_KEY_CTL_VOL_UP_DOWN,
};
enum {
EARTCH_STATE_IN,
EARTCH_STATE_OUT,
EARTCH_STATE_TRIM_OK,
EARTCH_STATE_TRIM_ERR,
};
extern void volume_up(u8 inc);
extern void volume_down(u8 inc);
extern int app_earphone_key_event_handler(struct sys_event *);
#endif
+31
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
+157
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
+39
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
+68
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_ */
+9
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
+431
View File
@@ -0,0 +1,431 @@
#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 10
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);
void audio_aec_pitch_change_ctrl();
void audio_surround_voice_ctrl();
extern void start_streamer_test(void);
extern void usr_intterupt_close();
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
int app_earphone_key_event_handler(struct sys_event *event)
{
int ret = false;
struct key_event *key = &event->u.key;
u8 key_event;
#if TCFG_APP_MUSIC_EN
if (event->arg == DEVICE_EVENT_FROM_CUSTOM) {
log_e("is music mode msg\n");
return false;
}
#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);
switch (key_event) {
case KEY_MUSIC_PP:
break;
case KEY_IR_NUM_0:
// tone_play_by_path(TONE_POWER_ON, 0);
break;
case KEY_IR_NUM_1:
// tone_play_by_path(TONE_RING, 0);
break;
case KEY_IR_NUM_2:
// tone_play_by_path(TONE_RING, 0);
break;
case KEY_POWEROFF:
if(usr_var.usr_power_charge_flag==1)break;
poweroff_sametime_flag = 0;
user_send_cmd_prepare(USER_CTRL_ALL_SNIFF_EXIT, 0, NULL);
break;
case KEY_POWEROFF_HOLD:
break;
case KEY_POWEROFF_HOLD_UP:
break;
case KEY_MUSIC_PREV:
break;
case KEY_MUSIC_NEXT:
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;
case KEY_NULL:
break;
case KEY_MUSIC_EFF:
break;
case KEY_PHONE_PITCH:
break;
#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*/
}
return ret;
}
void adsp_volume_up(void)
{
volume_flag = 0;
volume_up(1);
volume_flag = 1;
}
void adsp_volume_down(void)
{
volume_flag = 0;
volume_down(1);
volume_flag = 1;
}
+182
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)) */
+180
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;
@@ -0,0 +1,540 @@
/*********************************************************************************************
* 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 = 2 * 1024;//20 * 1024;
const int CONFIG_BT_TX_BUFF_MAX_SIZE = 1 * 1024;//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 = LE_ENCRYPTION| LE_DATA_PACKET_LENGTH_EXTENSION | LE_2M_PHY;
#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 = 8;
const int config_btctler_le_acl_packet_length = 251;
const int config_btctler_le_acl_total_nums = 8;
#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);
@@ -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 = 1; //是否支持加密配对
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
@@ -0,0 +1,231 @@
/*********************************************************************************************
* Filename : lib_driver_config.c
* Description : Optimized Code & RAM (编译优化配置)
* Author : Bingquan
* Email : caibingquan@zh-jieli.com
* Last modifiled : 2019-03-18 14:58
* Copyright:(c)JIELI 2011-2019 @ , All Rights Reserved.
*********************************************************************************************/
#include "app_config.h"
#include "system/includes.h"
#if TCFG_SD0_SD1_USE_THE_SAME_HW
const int sd0_sd1_use_the_same_hw = 1;
#else
const int sd0_sd1_use_the_same_hw = 0;
#endif
#ifdef CONFIG_MOVABLE_ENABLE
const int config_spi_code_user_cache = 1;
#else
const int config_spi_code_user_cache = 0;
#endif
#if TCFG_KEEP_CARD_AT_ACTIVE_STATUS
const int keep_card_at_active_status = 1;
#else
const int keep_card_at_active_status = 0;
#endif
#if TCFG_SDX_CAN_OPERATE_MMC_CARD
const int sdx_can_operate_mmc_card = TCFG_SDX_CAN_OPERATE_MMC_CARD;
#else
const int sdx_can_operate_mmc_card = 0;
#endif
#if TCFG_POWER_MODE_QUIET_ENABLE
const int config_dcdc_mode = 1;
#else
const int config_dcdc_mode = 0;
#endif
#if(TCFG_CLOCK_SYS_SRC == SYS_CLOCK_INPUT_PLL_RCL) //系统时钟源选择
const int clock_sys_src_use_lrc_hw = 1; //当使用lrc时timer.c需要特殊设置
#else
const int clock_sys_src_use_lrc_hw = 0;
#endif
#ifdef TCFG_VAD_LOWPOWER_CLOCK
const char config_vad_lowpower_clock = TCFG_VAD_LOWPOWER_CLOCK;
#else
const char config_vad_lowpower_clock = 0;
#endif
#if defined(CONFIG_CPU_BR28) || ((TCFG_OTG_MODE & OTG_DET_DM_ONLY) != 0)
const int config_otg_slave_detect_method_2 = 1;
#else
const int config_otg_slave_detect_method_2 = 0;
#endif
/**
* @brief Log (Verbose/Info/Debug/Warn/Error)
*/
/*-----------------------------------------------------------*/
const char log_tag_const_v_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
const char log_tag_const_i_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
const char log_tag_const_d_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_w_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_CLOCK AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_LP_TIMER AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_LRC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_RCH AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_P33_MISC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
const char log_tag_const_d_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_P33 AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_PMU AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_RTC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_WKUP AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_SDFILE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_CHARGE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_DEBUG AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_PWM_LED AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(0);
const char log_tag_const_w_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_TMR AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_VM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE) ;
const char log_tag_const_i_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
const char log_tag_const_d_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
const char log_tag_const_w_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_TRIM_VDD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
//audio dac
const char log_tag_const_v_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_SYS_DAC AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_APP_EDET AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_FM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
const char log_tag_const_d_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_CORE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(1);
const char log_tag_const_d_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_CACHE AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_w_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_LP_KEY AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_SD AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_w_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_e_EAR_DETECT AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_v_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_d_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_w_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_TDM AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_v_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_i_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(FALSE);
const char log_tag_const_d_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_w_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
const char log_tag_const_e_USB AT(.LOG_TAG_CONST) = CONFIG_DEBUG_LIB(TRUE);
+544
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);
@@ -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 = 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);
@@ -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 = 1;
//是否支持外挂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;
+345
View File
@@ -0,0 +1,345 @@
#include "system/includes.h"
//#include "music/music_player.h"
//#include "music/breakpoint.h"
#include "app_action.h"
#include "key_event_deal.h"
#include "audio_config.h"
#include "bt_background.h"
#include "default_event_handler.h"
#include "usb/device/usb_stack.h"
#include "usb/device/hid.h"
#include "tone_player.h"
#include "user_cfg.h"
#include "app_task.h"
#include "earphone.h"
#include "app_power_manage.h"
#include "app_charge.h"
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
#include "asm/chargestore.h"
#endif
#define LOG_TAG_CONST PC
#define LOG_TAG "[PC]"
#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_PC_ENABLE
struct app_pc_var {
u8 inited;
u8 idle;
};
static struct app_pc_var g_pc;
#if(TCFG_TYPE_C_ENABLE)
static u8 pc_key_table[][KEY_EVENT_MAX] = {
// SHORT LONG HOLD
// UP DOUBLE TRIPLE
{
KEY_MUSIC_PP, KEY_CALL_ANSWER, KEY_NULL,
KEY_CALL_ANSWER_UP, KEY_NULL, 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
},
};
#else
static u8 pc_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
},
};
#endif
static u8 pc_idle_query()
{
return !g_pc.idle;
}
REGISTER_LP_TARGET(pc_lp_target) = {
.name = "pc",
.is_idle = pc_idle_query,
};
//*----------------------------------------------------------------------------*/
/**@brief pc 在线检测 切换模式判断使用
@param 无
@return 1 linein设备在线 0 设备不在线
@note
*/
/*----------------------------------------------------------------------------*/
int pc_app_check(void)
{
log_info("pc_app_check");
#if TCFG_ONLY_PC_ENABLE
return true; //不需要检测
#endif
u32 r = usb_otg_online(0);
if ((r == SLAVE_MODE) ||
(r == SLAVE_MODE_WAIT_CONFIRMATION)) {
return true;
}
log_info("pc check offline");
return false;
}
static void app_pc_exit();
static void app_pc_init(enum app_state state)
{
log_info("app_pc_init");
g_pc.idle = 1;
#if TCFG_PC_ENABLE
clk_set("sys", 96000000); //提高系统时钟,优化usb出盘符速度
if (pc_app_check() == false) {
if (state == APP_STA_RESUME) {
log_info("APP_PC_RESUME err");
/* APP_STA_RESUME时若设备不在线,不可在该位置切模式,
因为上一次的app切换还没完成,还未真正进入PC模式 */
app_pc_exit();
} else {
app_task_switch_next();
}
} else {
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_stop();
#endif
usb_start();
}
#endif
}
static void app_pc_exit()
{
log_info("app_pc_exit");
if (pc_app_check() == false) {
usb_stop();
} else {
usb_pause();
#if TCFG_USB_CDC_BACKGROUND_RUN
usb_cdc_background_run();
#endif
}
g_pc.idle = 0;
}
static int app_pc_key_event_handler(struct sys_event *event)
{
struct key_event *key = &event->u.key;
int key_event = pc_key_table[key->value][key->event];
switch (key_event) {
#if TCFG_USB_SLAVE_HID_ENABLE
case KEY_MUSIC_PP:
log_info("KEY_MUSIC_PP");
hid_key_handler(0, USB_AUDIO_PP);
break;
case KEY_MUSIC_NEXT:
log_info("KEY_MUSIC_NEXT");
#if(TCFG_TYPE_C_ENABLE)
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
#else
hid_key_handler(0, USB_AUDIO_NEXTFILE);
#endif
break;
case KEY_MUSIC_PREV:
log_info("KEY_MUSIC_PREV");
#if(TCFG_TYPE_C_ENABLE)
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
os_time_dly(2);
hid_key_handler(0, USB_AUDIO_PP);
#else
hid_key_handler(0, USB_AUDIO_PREFILE);
#endif
break;
case KEY_VOL_UP:
log_info("KEY_MUSIC_UP");
hid_key_handler(0, USB_AUDIO_VOLUP);
break;
case KEY_VOL_DOWN:
log_info("KEY_MUSIC_DOWN");
hid_key_handler(0, USB_AUDIO_VOLDOWN);
break;
#if(TCFG_TYPE_C_ENABLE)
case KEY_CALL_ANSWER:
puts("KEY_CALL_ANSWER\n");
hid_key_handler_send_one_packet(0, USB_AUDIO_PP);
break;
case KEY_CALL_ANSWER_UP:
puts("KEY_CALL_ANSWER_UP\n");
hid_key_handler_send_one_packet(0, 0);
break;
#endif
#endif//end TCFG_USB_SLAVE_HID_ENABLE
case KEY_MODE_SWITCH:
log_info("KEY_MODE_SWITCH");
app_task_switch_next();
break;
case KEY_POWEROFF:
case KEY_POWEROFF_HOLD:
app_earphone_key_event_handler(event);
break;
default:
break;
}
return false;
}
/*
* 系统事件处理函数
*/
static int event_handler(struct application *app, struct sys_event *event)
{
/*if (SYS_EVENT_REMAP(event)) {
g_printf("****SYS_EVENT_REMAP**** \n");
return 0;
}*/
switch (event->type) {
case SYS_KEY_EVENT:
/*
* 普通按键消息处理
*/
return app_pc_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;
}
#if(!TCFG_ONLY_PC_ENABLE)
default_event_handler(event);
#endif
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");
STATUS *p_tone = get_tone_config();
tone_play(TONE_PC_MODE, 1);
break;
case APP_STA_START:
log_info("APP_STA_START");
if (!it) {
break;
}
switch (it->action) {
case ACTION_PC_MAIN:
log_info("ACTION_PC_MAIN");
///按键使能
sys_key_event_enable();
//关闭自动关机
sys_auto_shut_down_disable();
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
power_wakeup_index_enable(2, 0);
chargestore_api_stop();
#endif
app_pc_init(state);
break;
}
break;
case APP_STA_PAUSE:
log_info("APP_STA_PAUSE");
app_pc_exit();
break;
case APP_STA_RESUME:
log_info("APP_STA_RESUME");
app_pc_init(state);
break;
case APP_STA_STOP:
log_info("APP_STA_STOP");
app_pc_exit();
#if ((TCFG_CHARGESTORE_ENABLE || TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE) \
&& TCFG_CHARGESTORE_PORT == IO_PORT_DP)
chargestore_api_restart();
power_wakeup_index_enable(2, 1);
#endif
break;
case APP_STA_DESTROY:
log_info("APP_STA_DESTROY");
break;
}
return 0;
}
static const struct application_operation app_pc_ops = {
.state_machine = state_machine,
.event_handler = event_handler,
};
/*
* 注册pc模式
*/
REGISTER_APPLICATION(app_pc) = {
.name = "pc",
.action = ACTION_PC_MAIN,
.ops = &app_pc_ops,
.state = APP_STA_DESTROY,
};
#endif
+743
View File
@@ -0,0 +1,743 @@
#include "app_config.h"
#include "asm/charge.h"
#include "asm/pwm_led.h"
#include "asm/power_interface.h"
#include "ui_manage.h"
#include "system/event.h"
#include "system/app_core.h"
#include "system/includes.h"
#include "app_action.h"
#include "asm/wdt.h"
#include "app_power_manage.h"
//#include "app_chargestore.h"
#include "app_testbox.h"
#include "btstack/avctp_user.h"
#include "app_action.h"
#include "app_main.h"
#include "bt_tws.h"
#include "usb/otg.h"
#include "bt_common.h"
#if TCFG_AUDIO_ANC_ENABLE
#include "audio_anc.h"
#endif
#if NTC_DET_EN
#include "ntc_det_api.h"
#endif
#if TCFG_ANC_BOX_ENABLE
#include "app_ancbox.h"
#endif
#define LOG_TAG_CONST APP_CHARGE
#define LOG_TAG "[APP_CHARGE]"
#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 sys_enter_soft_poweroff(void *priv);
extern void gSensor_wkupup_enable(void);
extern void gSensor_wkupup_disable(void);
extern u32 dual_bank_update_exist_flag_get(void);
extern u32 classic_update_task_exist_flag_get(void);
extern void lp_touch_key_disable(void);
extern void linein_det_disable(void);
extern void linein_det_enable(void);
#if TCFG_CHARGE_ENABLE
static u8 charge_full_flag = 0;
#if TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
static int ldo5v_keep_timer = 0;
#endif
static u8 delay_timeout = 20;
static int ldo5v_in_reset_timer = 0;
static void ldo5v_in_reset_delay(void)
{
int deal_state = tws_api_get_tws_state();
u8 cpu_reset_flag = 1;
if (delay_timeout) {
delay_timeout--;
}
if (deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_PHONE_CONNECTED && !(deal_state & TWS_STA_MONITOR_START)) {
//tws已连接 手机已连接 从机未监听手机
cpu_reset_flag = 0;
} else {
if (deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_ESCO_OPEN && !get_esco_coder_busy_flag()) {
//手机有请求但没建立ESCO链路
cpu_reset_flag = 0;
}
}
printf("----------------ldo5v_in_reset_delay tws state:%x, delay_timeout:%d, cpu_reset_flag:%d\n", deal_state, delay_timeout, cpu_reset_flag);
if (delay_timeout == 0 || cpu_reset_flag == 1) {
if (ldo5v_in_reset_timer) {
sys_timer_del(ldo5v_in_reset_timer);
ldo5v_in_reset_timer = 0;
}
sys_enter_soft_poweroff((void *)1);
}
}
extern void power_event_to_user(u8 event);
u8 get_charge_full_flag(void)
{
return charge_full_flag;
}
void charge_start_deal(void)
{
log_info("%s\n", __FUNCTION__);
power_set_mode(PWR_LDO15);
struct application *app;
app = get_current_app();
//在IDLE时才开启充电UI
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
ui_update_status(STATUS_CHARGE_START);
}
}
static void ldo5v_keep_delay_deal(void *priv)
{
log_info("%s\n", __func__);
#if TCFG_TEST_BOX_ENABLE
ldo5v_keep_timer = 0;
if (testbox_get_status()) {
log_info("testbox online!\n");
return;
}
#endif
#if TCFG_ANC_BOX_ENABLE
ldo5v_keep_timer = 0;
if (ancbox_get_status()) {
log_info("ancbox online!\n");
return;
}
#endif
struct application *app;
app = get_current_app();
if (app) {
if (strcmp(app->name, APP_NAME_IDLE)) {
sys_enter_soft_poweroff((void *)2);
}
}
pwm_led_mode_set(PWM_LED_ALL_OFF);
os_time_dly(30);
pwm_led_mode_set(PWM_LED1_ON);
os_time_dly(40);
//兼容一些充电仓5v输出慢的时候会导致无法充电的问题
if (get_lvcmp_det()) {
log_info("...charge ing...\n");
cpu_reset();
}
log_info("get_charge_online_flag:%d %d\n", get_charge_online_flag(), get_ldo5v_online_hw());
if (get_ldo5v_online_hw() && get_charge_online_flag()) {
power_set_soft_poweroff();
} else {
#if TCFG_CHARGE_OFF_POWERON_NE
cpu_reset();
#else
charge_check_and_set_pinr(1);
power_set_soft_poweroff();
#endif
}
}
/*ldoin电压大于拔出电压(0.6V左右)且小于VBat电压时调用该函数进行一些错误提示或其他处理*/
void ldo5v_keep_deal(void)
{
log_info("%s\n", __func__);
//插入交换
power_event_to_user(POWER_EVENT_POWER_CHANGE);
#if TCFG_GSENSOR_ENABLE
//在舱关闭gSensor
gSensor_wkupup_disable();
#endif
#if TCFG_LINEIN_ENABLE
//入舱关闭linein
linein_det_disable();
#endif
#if TCFG_LP_TOUCH_KEY_ENABLE
extern void lp_touch_key_charge_mode_enter();
lp_touch_key_charge_mode_enter();
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
#if TCFG_GX8002_NPU_ENABLE
extern void gx8002_module_suspend(u8 keep_vddio);
gx8002_module_suspend(0);
#endif /* #if TCFG_GX8002_NPU_ENABLE */
charge_check_and_set_pinr(0);
#if TCFG_AUDIO_ANC_ENABLE
#if TCFG_ANC_BOX_ENABLE
if (!ancbox_get_status())
#endif
{
anc_suspend();
}
#endif
if (get_charge_poweron_en() == 0) {
#if TCFG_CHARGESTORE_ENABLE
//智能充电舱不处理充电err
struct application *app;
app = get_current_app();
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
ui_update_status(STATUS_CHARGE_LDO5V_OFF);
}
#else //TCFG_CHARGESTORE_ENABLE
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
return;
}
#endif
#if TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
if (testbox_get_ex_enter_dut_flag()) {
putchar('D');
return;
}
if (testbox_get_ex_enter_storage_mode_flag()) {
putchar('S');
return;
}
if (ldo5v_keep_timer == 0) {
//延时执行避免测试盒通信不上
ldo5v_keep_timer = sys_timeout_add(NULL, ldo5v_keep_delay_deal, 250);
}
#else
ldo5v_keep_delay_deal(NULL);
#endif//TCFG_TEST_BOX_ENABLE || TCFG_ANC_BOX_ENABLE
#endif//TCFG_CHARGESTORE_ENABLE
} else {
ui_update_status(STATUS_CHARGE_ERR);
}
}
extern u8 umidigi_chargestore_get_cover_status(void);
void charge_full_deal(void)
{
log_info("%s\n", __func__);
charge_full_flag = 1;
charge_close();
if (get_charge_poweron_en() == 0) {
#if (TCFG_LP_TOUCH_KEY_ENABLE && CHARGING_CLEAN_PHONE_INFO)
extern void lp_touch_key_charge_mode_enter();
lp_touch_key_charge_mode_enter();
#endif
/* power_set_soft_poweroff(); */
#if TCFG_USER_TWS_ENABLE
#else
ui_update_status(STATUS_CHARGE_FULL);
#endif
#if (!TCFG_CHARGESTORE_ENABLE)
#if TCFG_UMIDIGI_BOX_ENABLE
//当前为开盖
if (umidigi_chargestore_get_cover_status() == 1) {
vbat_timer_delete();
}
#else
vbat_timer_delete();
#endif
#endif
} else {
ui_update_status(STATUS_CHARGE_FULL);
}
}
void charge_close_deal(void)
{
log_info("%s\n", __FUNCTION__);
power_set_mode(TCFG_LOWPOWER_POWER_SEL);
#if TCFG_USER_TWS_ENABLE
//在idle的时候才执行充电关闭的UI
struct application *app;
app = get_current_app();
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
ui_update_status(STATUS_CHARGE_CLOSE);
}
#endif
}
void charge_ldo5v_in_deal(void)
{
log_info("%s\n", __FUNCTION__);
#if TCFG_IRSENSOR_ENABLE
if (get_bt_tws_connect_status()) {
tws_api_sync_call_by_uuid('T', SYNC_CMD_EARPHONE_CHAREG_START, 300);
}
#endif
//插入交换
power_event_to_user(POWER_EVENT_POWER_CHANGE);
charge_full_flag = 0;
#if TCFG_GSENSOR_ENABLE
//入舱关闭gSensor
gSensor_wkupup_disable();
#endif
#if TCFG_LINEIN_ENABLE
//入舱关闭linein
linein_det_disable();
#endif
#if (TCFG_LP_TOUCH_KEY_ENABLE && !CHARGING_CLEAN_PHONE_INFO)
extern void lp_touch_key_charge_mode_enter();
lp_touch_key_charge_mode_enter();
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
#if TCFG_GX8002_NPU_ENABLE
extern void gx8002_module_suspend(u8 keep_vddio);
gx8002_module_suspend(0);
#endif /* #if TCFG_GX8002_NPU_ENABLE */
charge_check_and_set_pinr(0);
#if TCFG_AUDIO_ANC_ENABLE
anc_suspend();
#endif
#if TCFG_TEST_BOX_ENABLE
testbox_clear_status();
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
#endif
#if TCFG_ANC_BOX_ENABLE
ancbox_clear_status();
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
#endif
#if TCFG_CHARGESTORE_ENABLE
chargestore_shutdown_reset();
#endif
if (get_charge_poweron_en() == 0) {
#if defined(TCFG_CHARGE_KEEP_UPDATA) && TCFG_CHARGE_KEEP_UPDATA
if (dual_bank_update_exist_flag_get() || classic_update_task_exist_flag_get()) {
return;
}
#endif
struct application *app;
app = get_current_app();
#if TCFG_WIRELESS_MIC_ENABLE
if (strcmp(app->name, APP_NAME_IDLE) != 0) {
sys_enter_soft_poweroff((void *)1);
}
#endif
if (app && strcmp(app->name, APP_NAME_IDLE)) {
#if (TCFG_CHARGESTORE_ENABLE && TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
if (!chargestore_check_going_to_poweroff()) {
#endif
#if TCFG_USER_TWS_ENABLE
printf("----------------tws_api_get_tws_state %x\n", tws_api_get_tws_state());
int deal_state = tws_api_get_tws_state();
if (tws_api_get_role() == TWS_ROLE_MASTER && deal_state & TWS_STA_SIBLING_CONNECTED && deal_state & TWS_STA_PHONE_CONNECTED && !(deal_state & TWS_STA_MONITOR_START)) {
if (ldo5v_in_reset_timer == 0) {
delay_timeout = 30;
ldo5v_in_reset_timer = sys_timer_add(NULL, ldo5v_in_reset_delay, 100);
}
} else {
if (ldo5v_in_reset_timer) {
sys_timer_del(ldo5v_in_reset_timer);
ldo5v_in_reset_timer = 0;
}
sys_enter_soft_poweroff((void *)1);
}
#else
sys_enter_soft_poweroff((void *)1);
#endif
#if (TCFG_CHARGESTORE_ENABLE && TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_ADV)
} else {
log_info("chargestore do poweroff!\n");
}
#endif
} else {
charge_start();
wdt_init(WDT_32S);
log_info("set wdt to 32s!\n");
goto _check_reset;
}
} else {
charge_start();
goto _check_reset;
}
return;
_check_reset:
//防止耳机低电时,插拔充电有几率出现关机不充电问题
if (app_var.goto_poweroff_flag) {
cpu_reset();
}
}
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
static u8 _enter_softoff_flag = 0;
extern lp_touch_key_testbox_inear_trim(u8 flag);
void exit_lp_touch_eartch_trim(void *priv)
{
log_info("<<<<<<<<<< exit_lp_touch_eartch_trim!\n");
lp_touch_key_testbox_inear_trim(0);
#if TCFG_PWMLED_ENABLE
gpio_set_direction(TCFG_PWMLED_PIN, 1);
#endif
if (_enter_softoff_flag) {
log_info("<<<<<<<<<<< sys_enter_soft_poweroff after eartch_trim!\n");
sys_enter_soft_poweroff(NULL);
} else {
cpu_reset();
}
}
void enter_lp_touch_eartch_trim(void *priv)
{
log_info(">>>>>>>>>> enter_lp_touch_eartch_trim!\n");
lp_touch_key_testbox_inear_trim(1);
sys_timeout_add(NULL, exit_lp_touch_eartch_trim, 1000);
}
#endif
//外置触摸断电
void __attribute__((weak)) external_touch_key_disable(void)
{
}
//使能外置电源控制芯片对耳机进行断电
void __attribute__((weak)) external_storage_io_disable(void)
{
}
//关闭vddio keep
u8 __attribute__((weak)) power_set_vddio_keep(u8 en)
{
}
void charge_ldo5v_off_deal(void)
{
log_info("%s\n", __FUNCTION__);
//拨出交换
power_event_to_user(POWER_EVENT_POWER_CHANGE);
#if (TCFG_CHARGESTORE_ENABLE && TCFG_USER_TWS_ENABLE)
if (TWS_ROLE_SLAVE == tws_api_get_role()) {
chargestore_set_power_level(0xFF);
}
#endif
charge_full_flag = 0;
charge_close();
struct application *app;
app = get_current_app();
//在idle的时候才执行充电拔出的UI
if (app && (!strcmp(app->name, APP_NAME_IDLE))) {
ui_update_status(STATUS_CHARGE_LDO5V_OFF);
}
charge_check_and_set_pinr(1);
#if TCFG_TEST_BOX_ENABLE
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
u8 sec = 0;
u8 eartch_trim_en = testbox_get_touch_trim_en(&sec);
if (eartch_trim_en) {
log_info("******* testbox_get_touch_trim_en : %ds\n", sec);
sys_timeout_add(NULL, enter_lp_touch_eartch_trim, sec * 1000);
#if TCFG_PWMLED_ENABLE
gpio_set_pull_up(TCFG_PWMLED_PIN, 0);
gpio_set_pull_down(TCFG_PWMLED_PIN, 0);
gpio_set_die(TCFG_PWMLED_PIN, 0);
gpio_set_direction(TCFG_PWMLED_PIN, 0);
gpio_write(TCFG_PWMLED_PIN, 1);
#endif
}
#endif
if (testbox_get_status() && !get_total_connect_dev()) {
if (!testbox_get_keep_tws_conn_flag()) {
log_info("<<<<<<<<<<<<<<testbox out and bt noconn reset>>>>>>>>>>>>>>>\n");
if (testbox_get_testbox_tws_paired() && testbox_get_softpwroff_after_paired()) {
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
if (eartch_trim_en) {
_enter_softoff_flag = 1;
} else
#endif
{
sys_enter_soft_poweroff(NULL);
}
} else {
#if TCFG_EARTCH_EVENT_HANDLE_ENABLE
if (eartch_trim_en) {
} else
#endif
{
cpu_reset();
}
}
} else {
log_info("testbox out ret\n");
}
}
testbox_clear_status();
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
#endif
#if TCFG_CHARGESTORE_ENABLE
chargestore_shutdown_reset();
#endif
#if TCFG_AUDIO_ANC_ENABLE
#if TCFG_ANC_BOX_ENABLE
if (ldo5v_keep_timer) {
sys_timeout_del(ldo5v_keep_timer);
ldo5v_keep_timer = 0;
}
if (ancbox_get_status()) {
return;
} else
#endif
{
anc_resume();
}
#endif
#if TCFG_TEST_BOX_ENABLE
if (testbox_get_ex_enter_storage_mode_flag()) {
power_set_vddio_keep(0);//关VDDIO KEEP
#if TCFG_LP_TOUCH_KEY_ENABLE
lp_touch_key_disable();//仓储模式关内置触摸
#else
external_touch_key_disable(); //仓储模式关外置触摸供电
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
#if TCFG_EXTERN_STORAGE_MODE_ENABLE
external_storage_io_disable();
#endif/* TCFG_EXTERN_STORAGE_MODE_ENABLE */
power_set_soft_poweroff();
}
#endif
if ((get_charge_poweron_en() == 0)) {
wdt_init(WDT_4S);
log_info("set wdt to 4s!\n");
#if TCFG_CHARGESTORE_ENABLE
if (chargestore_get_power_status()) {
#endif
#if TCFG_CHARGE_OFF_POWERON_NE
log_info("ldo5v off,task switch to BT\n");
app_var.play_poweron_tone = 0;
#if TCFG_SYS_LVD_EN
vbat_check_init();
#endif
if (app && (app_var.goto_poweroff_flag == 0)) {
if (strcmp(app->name, APP_NAME_BT)) {
#if TCFG_SYS_LVD_EN
if (get_vbat_need_shutdown() == FALSE) {
#if TCFG_WIRELESS_MIC_ENABLE
cpu_reset();
#endif
task_switch_to_bt();
} else {
log_info("ldo5v off,lowpower,need enter softpoweroff\n");
power_set_soft_poweroff();
}
#else
task_switch_to_bt();
#endif
}
}
#else //TCFG_CHARGE_OFF_POWERON_NE
log_info("ldo5v off,enter softpoweroff\n");
#if TCFG_LP_TOUCH_KEY_ENABLE
extern void lp_touch_key_charge_mode_exit();
lp_touch_key_charge_mode_exit();
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
power_set_soft_poweroff();
#endif //TCFG_CHARGE_OFF_POWERON_NE
#if TCFG_CHARGESTORE_ENABLE
} else {
log_info("ldo5v off,enter softpoweroff\n");
if (app && (!strcmp(app->name, APP_NAME_BT))) { //软关机
sys_enter_soft_poweroff(NULL);
} else {
power_set_soft_poweroff();
}
}
#endif
} else {
if (app && (!strcmp(app->name, APP_NAME_IDLE)) && (app_var.goto_poweroff_flag == 0)) {
#if TCFG_CHARGE_OFF_POWERON_NE
log_info("ldo5v off,task switch to BT\n");
app_var.play_poweron_tone = 0;
#if TCFG_SYS_LVD_EN
vbat_check_init();
#endif
#if TCFG_SYS_LVD_EN
if (get_vbat_need_shutdown() == FALSE) {
task_switch_to_bt();
} else {
log_info("ldo5v off,lowpower,need enter softpoweroff\n");
power_set_soft_poweroff();
}
#else
task_switch_to_bt();
#endif
#else
power_set_soft_poweroff();
#endif
}
}
#if TCFG_GSENSOR_ENABLE
//出舱使能gSensor
gSensor_wkupup_enable();
#endif
#if TCFG_LINEIN_ENABLE
//出舱开启linein检测
linein_det_enable();
#endif
#if TCFG_LP_TOUCH_KEY_ENABLE
extern void lp_touch_key_charge_mode_exit();
lp_touch_key_charge_mode_exit();
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
#if TCFG_TEST_BOX_ENABLE
if (testbox_get_ex_enter_storage_mode_flag()) {
power_set_vddio_keep(0);//关VDDIO KEEP
#if TCFG_LP_TOUCH_KEY_ENABLE
lp_touch_key_disable();//仓储模式关内置触摸
#else
external_touch_key_disable(); //仓储模式关外置触摸供电
#endif /* #if TCFG_LP_TOUCH_KEY_ENABLE */
//测试盒仓储模式使能后,断开测试盒直接关机
power_set_soft_poweroff();
}
#endif
#if TCFG_GX8002_NPU_ENABLE
extern void gx8002_module_resumed();
gx8002_module_resumed();
#endif /* #if TCFG_GX8002_NPU_ENABLE */
}
int app_charge_event_handler(struct device_event *dev)
{
int ret = false;
u8 otg_status = 0;
switch (dev->event) {
case CHARGE_EVENT_CHARGE_START:
#if NTC_DET_EN
ntc_det_start();
#endif
charge_start_deal();
break;
case CHARGE_EVENT_CHARGE_CLOSE:
#if NTC_DET_EN
ntc_det_stop();
#endif
charge_close_deal();
break;
case CHARGE_EVENT_CHARGE_FULL:
charge_full_deal();
break;
case CHARGE_EVENT_LDO5V_KEEP:
#if NTC_DET_EN
ntc_det_stop();
#endif
ldo5v_keep_deal();
break;
case CHARGE_EVENT_LDO5V_IN:
#if ((TCFG_OTG_MODE & OTG_SLAVE_MODE) && (TCFG_OTG_MODE & OTG_CHARGE_MODE))
while (1) {
otg_status = usb_otg_online(0);
if (otg_status != IDLE_MODE) {
break;
}
os_time_dly(2);
}
if (otg_status == SLAVE_MODE) {
set_charge_poweron_en(1);
}
#endif
if (get_charge_poweron_en() || (otg_status != SLAVE_MODE)) {
charge_ldo5v_in_deal();
}
break;
case CHARGE_EVENT_LDO5V_OFF:
#if ((TCFG_OTG_MODE & OTG_SLAVE_MODE) && (TCFG_OTG_MODE & OTG_CHARGE_MODE))
while (1) {
otg_status = usb_otg_online(0);
if (otg_status != IDLE_MODE) {
break;
}
os_time_dly(2);
}
#endif
if (get_charge_poweron_en() || (otg_status != SLAVE_MODE)) {
charge_ldo5v_off_deal();
}
break;
default:
break;
}
return ret;
}
#else
u8 get_charge_full_flag(void)
{
return 0;
}
#endif
@@ -0,0 +1,475 @@
#include "system/includes.h"
#include "app_power_manage.h"
#include "app_main.h"
#include "app_config.h"
#include "app_action.h"
#include "asm/charge.h"
#include "ui_manage.h"
#include "tone_player.h"
#include "asm/adc_api.h"
#include "btstack/avctp_user.h"
#include "user_cfg.h"
#include "asm/charge.h"
#if TCFG_USER_TWS_ENABLE
#include "bt_tws.h"
#endif
#define LOG_TAG_CONST APP_POWER
#define LOG_TAG "[APP_POWER]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
enum {
VBAT_NORMAL = 0,
VBAT_WARNING,
VBAT_LOWPOWER,
} VBAT_STATUS;
#define VBAT_DETECT_CNT 6
static int vbat_slow_timer = 0;
static int vbat_fast_timer = 0;
static int lowpower_timer = 0;
static u8 old_battery_level = 9;
static u16 bat_val = 0;
static volatile u8 cur_battery_level = 0;
static u16 battery_full_value = 0;
static u8 tws_sibling_bat_level = 0xff;
static u8 tws_sibling_bat_percent_level = 0xff;
static u8 cur_bat_st = VBAT_NORMAL;
void vbat_check(void *priv);
void sys_enter_soft_poweroff(void *priv);
void clr_wdt(void);
void power_event_to_user(u8 event);
u8 get_tws_sibling_bat_level(void)
{
#if TCFG_USER_TWS_ENABLE
/* log_info("***********get_tws_sibling_bat_level: %2x", tws_sibling_bat_percent_level); */
return tws_sibling_bat_level & 0x7f;
#endif
return 0xff;
}
u8 get_tws_sibling_bat_persent(void)
{
#if TCFG_USER_TWS_ENABLE
/* log_info("***********get_tws_sibling_bat_level: %2x", tws_sibling_bat_percent_level); */
return tws_sibling_bat_percent_level;
#endif
return 0xff;
}
void app_power_set_tws_sibling_bat_level(u8 vbat, u8 percent)
{
#if TCFG_USER_TWS_ENABLE
tws_sibling_bat_level = vbat;
tws_sibling_bat_percent_level = percent;
/*
** 发出电量同步事件进行进一步处理
**/
power_event_to_user(POWER_EVENT_SYNC_TWS_VBAT_LEVEL);
log_info("set_sibling_bat_level: %d, %d\n", vbat, percent);
#endif
}
static void set_tws_sibling_bat_level(void *_data, u16 len, bool rx)
{
u8 *data = (u8 *)_data;
if (rx) {
app_power_set_tws_sibling_bat_level(data[0], data[1]);
}
}
#if TCFG_USER_TWS_ENABLE
REGISTER_TWS_FUNC_STUB(vbat_sync_stub) = {
.func_id = TWS_FUNC_ID_VBAT_SYNC,
.func = set_tws_sibling_bat_level,
};
#endif
void tws_sync_bat_level(void)
{
#if (TCFG_USER_TWS_ENABLE && BT_SUPPORT_DISPLAY_BAT)
u8 battery_level = cur_battery_level;
#if CONFIG_DISPLAY_DETAIL_BAT
u8 percent_level = get_vbat_percent();
#else
u8 percent_level = get_self_battery_level() * 10 + 10;
#endif
if (get_charge_online_flag()) {
percent_level |= BIT(7);
}
u8 data[2];
data[0] = battery_level;
data[1] = percent_level;
tws_api_send_data_to_sibling(data, 2, TWS_FUNC_ID_VBAT_SYNC);
log_info("tws_sync_bat_level: %d,%d\n", battery_level, percent_level);
#endif
}
void power_event_to_user(u8 event)
{
struct sys_event e;
e.type = SYS_DEVICE_EVENT;
e.arg = (void *)DEVICE_EVENT_FROM_POWER;
e.u.dev.event = event;
e.u.dev.value = 0;
sys_event_notify(&e);
}
int app_power_event_handler(struct device_event *dev)
{
int ret = false;
#if(TCFG_SYS_LVD_EN == 1)
switch (dev->event) {
case POWER_EVENT_POWER_NORMAL:
ui_update_status(STATUS_EXIT_LOWPOWER);
break;
case POWER_EVENT_POWER_WARNING:
ui_update_status(STATUS_LOWPOWER);
/* tone_play(TONE_LOW_POWER); */
STATUS *p_tone = get_tone_config();
tone_play_index(p_tone->lowpower, 0);
if (lowpower_timer == 0) {
lowpower_timer = sys_timer_add((void *)POWER_EVENT_POWER_WARNING, (void (*)(void *))power_event_to_user, LOW_POWER_WARN_TIME);
}
break;
case POWER_EVENT_POWER_LOW:
printf(" POWER_EVENT_POWER_LOW");
vbat_timer_delete();
if (lowpower_timer) {
sys_timer_del(lowpower_timer);
lowpower_timer = 0 ;
}
#if TCFG_APP_BT_EN
#if (RCSP_ADV_EN)
extern u8 adv_tws_both_in_charge_box(u8 type);
adv_tws_both_in_charge_box(1);
#endif
sys_enter_soft_poweroff(NULL);
#else
void app_entry_idle() ;
app_entry_idle() ;
#endif
break;
#if TCFG_APP_BT_EN
#if TCFG_USER_TWS_ENABLE
case POWER_EVENT_SYNC_TWS_VBAT_LEVEL:
if (tws_api_get_role() == TWS_ROLE_MASTER) {
user_send_cmd_prepare(USER_CTRL_HFP_CMD_UPDATE_BATTARY, 0, NULL);
}
break;
#endif
case POWER_EVENT_POWER_CHANGE:
/* log_info("POWER_EVENT_POWER_CHANGE\n"); */
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED) {
if (tws_api_get_tws_state()&TWS_STA_ESCO_OPEN) {
break;
}
tws_sync_bat_level();
}
#endif
user_send_cmd_prepare(USER_CTRL_HFP_CMD_UPDATE_BATTARY, 0, NULL);
#endif
break;
case POWER_EVENT_POWER_CHARGE:
if (lowpower_timer) {
sys_timer_del(lowpower_timer);
lowpower_timer = 0 ;
}
break;
default:
break;
}
#endif
return ret;
}
u16 get_vbat_level(void)
{
//return 370; //debug
return (adc_get_voltage(AD_CH_VBAT) * 4/* / 10*/);
}
__attribute__((weak)) u8 remap_calculate_vbat_percent(u16 bat_val)
{
return 0;
}
u16 get_vbat_value(void)
{
return bat_val;
}
u8 get_vbat_percent(void)
{
u16 tmp_bat_val;
u16 bat_val = get_vbat_level();
if (battery_full_value == 0) {
#if TCFG_CHARGE_ENABLE
battery_full_value = (get_charge_full_value() - 100) / 10; //防止部分电池充不了这么高电量,充满显示未满的情况
#else
battery_full_value = 420;
#endif
}
if (bat_val <= app_var.poweroff_tone_v) {
return 0;
}
tmp_bat_val = remap_calculate_vbat_percent(bat_val);
if (!tmp_bat_val) {
tmp_bat_val = ((u32)bat_val - app_var.poweroff_tone_v) * 100 / (battery_full_value - app_var.poweroff_tone_v);
if (tmp_bat_val > 100) {
tmp_bat_val = 100;
}
}
return (u8)tmp_bat_val;
}
bool get_vbat_need_shutdown(void)
{
if ((bat_val <= LOW_POWER_SHUTDOWN) || adc_check_vbat_lowpower()) {
return TRUE;
}
return FALSE;
}
//将当前电量转换为1~9级发送给手机同步电量
u8 battery_value_to_phone_level(u16 bat_val)
{
u8 battery_level = 0;
u8 vbat_percent = get_vbat_percent();
if (vbat_percent < 5) { //小于5%电量等级为0,显示10%
return 0;
}
battery_level = (vbat_percent - 5) / 10;
return battery_level;
}
//获取自身的电量
u8 get_self_battery_level(void)
{
return cur_battery_level;
}
u8 get_cur_battery_level(void)
{
u8 bat_lev = tws_sibling_bat_level & (~BIT(7));
#if TCFG_USER_TWS_ENABLE
if (bat_lev == 0x7f) {
return cur_battery_level;
}
#if (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_LOWER)
return cur_battery_level < bat_lev ? cur_battery_level : bat_lev;
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_HIGHER)
return cur_battery_level < bat_lev ? bat_lev : cur_battery_level;
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_LEFT)
return tws_api_get_local_channel() == 'L' ? cur_battery_level : bat_lev;
#elif (CONFIG_DISPLAY_TWS_BAT_TYPE == CONFIG_DISPLAY_TWS_BAT_RIGHT)
return tws_api_get_local_channel() == 'R' ? cur_battery_level : bat_lev;
#else
return cur_battery_level;
#endif //END CONFIG_DISPLAY_TWS_BAT_TYPE
#else //TCFG_USER_TWS_ENABLE == 0
return cur_battery_level;
#endif
}
void vbat_check_slow(void *priv)
{
if (vbat_fast_timer == 0) {
vbat_fast_timer = usr_timer_add(NULL, vbat_check, 10, 1);
}
if (get_charge_online_flag()) {
sys_timer_modify(vbat_slow_timer, 60 * 1000);
} else {
sys_timer_modify(vbat_slow_timer, 10 * 1000);
}
}
void vbat_check_init(void)
{
if (vbat_slow_timer == 0) {
vbat_slow_timer = sys_timer_add(NULL, vbat_check_slow, 10 * 1000);
} else {
sys_timer_modify(vbat_slow_timer, 10 * 1000);
}
if (vbat_fast_timer == 0) {
vbat_fast_timer = usr_timer_add(NULL, vbat_check, 10, 1);
}
}
void vbat_timer_delete(void)
{
if (vbat_slow_timer) {
sys_timer_del(vbat_slow_timer);
vbat_slow_timer = 0;
}
if (vbat_fast_timer) {
usr_timer_del(vbat_fast_timer);
vbat_fast_timer = 0;
}
}
void vbat_check(void *priv)
{
static u8 unit_cnt = 0;
static u8 low_warn_cnt = 0;
static u8 low_off_cnt = 0;
static u8 low_voice_cnt = 0;
static u8 low_power_cnt = 0;
static u8 power_normal_cnt = 0;
static u8 charge_online_flag = 0;
static u8 low_voice_first_flag = 1;//进入低电后先提醒一次
if (!bat_val) {
bat_val = get_vbat_level();
} else {
bat_val = (get_vbat_level() + bat_val) / 2;
}
cur_battery_level = battery_value_to_phone_level(bat_val);
/* printf("bv:%d, bl:%d , check_vbat:%d\n", bat_val, cur_battery_level, adc_check_vbat_lowpower()); */
unit_cnt++;
/* if (bat_val < LOW_POWER_OFF_VAL) { */
if (adc_check_vbat_lowpower() || (bat_val <= app_var.poweroff_tone_v)) {
low_off_cnt++;
}
/* if (bat_val < LOW_POWER_WARN_VAL) { */
if (bat_val <= app_var.warning_tone_v) {
low_warn_cnt++;
}
/* log_info("unit_cnt:%d\n", unit_cnt); */
if (unit_cnt >= VBAT_DETECT_CNT) {
if (get_charge_online_flag() == 0) {
if (low_off_cnt > (VBAT_DETECT_CNT / 2)) { //低电关机
low_power_cnt++;
low_voice_cnt = 0;
power_normal_cnt = 0;
cur_bat_st = VBAT_LOWPOWER;
if (low_power_cnt > 6) {
log_info("\n*******Low Power,enter softpoweroff********\n");
low_power_cnt = 0;
power_event_to_user(POWER_EVENT_POWER_LOW);
usr_timer_del(vbat_fast_timer);
vbat_fast_timer = 0;
}
} else if (low_warn_cnt > (VBAT_DETECT_CNT / 2)) { //低电提醒
low_voice_cnt ++;
low_power_cnt = 0;
power_normal_cnt = 0;
cur_bat_st = VBAT_WARNING;
if ((low_voice_first_flag && low_voice_cnt > 1) || //第一次进低电10s后报一次
(!low_voice_first_flag && low_voice_cnt >= 5)) {
low_voice_first_flag = 0;
low_voice_cnt = 0;
if (!lowpower_timer) {
log_info("\n**Low Power,Please Charge Soon!!!**\n");
power_event_to_user(POWER_EVENT_POWER_WARNING);
}
}
} else {
power_normal_cnt++;
low_voice_cnt = 0;
low_power_cnt = 0;
if (power_normal_cnt > 2) {
if (cur_bat_st != VBAT_NORMAL) {
log_info("[Noraml power]\n");
cur_bat_st = VBAT_NORMAL;
power_event_to_user(POWER_EVENT_POWER_NORMAL);
}
}
}
} else {
power_event_to_user(POWER_EVENT_POWER_CHARGE);
}
unit_cnt = 0;
low_off_cnt = 0;
low_warn_cnt = 0;
if (cur_bat_st != VBAT_LOWPOWER) {
usr_timer_del(vbat_fast_timer);
vbat_fast_timer = 0;
cur_battery_level = battery_value_to_phone_level(bat_val);
if (cur_battery_level != old_battery_level) {
power_event_to_user(POWER_EVENT_POWER_CHANGE);
} else {
if (charge_online_flag != get_charge_online_flag()) {
//充电变化也要交换,确定是否在充电仓
power_event_to_user(POWER_EVENT_POWER_CHANGE);
}
}
charge_online_flag = get_charge_online_flag();
old_battery_level = cur_battery_level;
}
}
}
bool vbat_is_low_power(void)
{
return (cur_bat_st != VBAT_NORMAL);
}
void check_power_on_voltage(void)
{
#if(TCFG_SYS_LVD_EN == 1)
u16 val = 0;
u8 normal_power_cnt = 0;
u8 low_power_cnt = 0;
while (1) {
clr_wdt();
val = get_vbat_level();
printf("vbat: %d\n", val);
if ((val < app_var.poweroff_tone_v) || adc_check_vbat_lowpower()) {
low_power_cnt++;
normal_power_cnt = 0;
if (low_power_cnt > 10) {
ui_update_status(STATUS_POWERON_LOWPOWER);
os_time_dly(100);
log_info("power on low power , enter softpoweroff!\n");
power_set_soft_poweroff();
}
} else {
normal_power_cnt++;
low_power_cnt = 0;
if (normal_power_cnt > 10) {
vbat_check_init();
return;
}
}
}
#endif
}
+15
View File
@@ -0,0 +1,15 @@
#include "app_config.h"
#include "btstack/avctp_user.h"
#include "adv_music_info_setting.h"
#if (JL_EARPHONE_APP_EN)
int jl_phone_app_init()
{
#if RCSP_ADV_MUSIC_INFO_ENABLE
bt_music_info_handle_register(rcsp_adv_music_info_deal);
#endif
return 0;
}
#endif
+481
View File
@@ -0,0 +1,481 @@
#include "app_config.h"
#if RCSP_ADV_EN
#include "earphone.h"
#include "app_main.h"
#include "le_rcsp_adv_module.h"
#include "rcsp_adv_bluetooth.h"
#include "rcsp_bluetooth.h"
#include "adv_mic_setting.h"
#include "JL_rcsp_api.h"
#include "update_tws.h"
#include "update_tws_new.h"
#include "3th_profile_api.h"
#include "adv_time_stamp_setting.h"
#include "adv_anc_voice.h"
#include "btstack/avctp_user.h"
#include "btstack/btstack_task.h"
#include "bt_tws.h"
#define LOG_TAG "[RCSP-ADV]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
extern APP_VAR app_var;
extern void rcsp_spp_init();
extern u8 get_app_connect_type(void);
extern void ble_app_disconnect(void);
extern u8 get_app_connect_type(void);
extern void mic_data_sync_tx_deal(void);
extern void set_ble_connect_type(u8 type);
extern void bt_ble_adv_enable(u8 enable);
extern void app_tws_get_data_from_sibling(u8 cmd, u8 *data, u8 len);
extern u8 JL_get_cur_bt_channel_sel(void);
extern void send_version_to_sibling(void);
extern void set_rcsp_dev_type_spp(void);
extern u8 rcsp_get_update_flag(void);
u8 ble_adv_miss_flag = 0;
u8 ble_adv_poweron_flag = 0;
int rcsp_earphone_state_set_page_scan_enable()
{
#if (TCFG_USER_TWS_ENABLE == 0)
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
#elif (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
if (tws_api_get_role() == TWS_ROLE_MASTER) {
printf("switch_icon_ctl11...\n");
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
}
#endif
return 0;
}
int rcsp_earphone_state_get_connect_mac_addr()
{
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTING, 1);
return 0;
}
int rcsp_earphone_state_cancel_page_scan()
{
#if (TCFG_USER_TWS_ENABLE == 0)
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
#elif (CONFIG_NO_DISPLAY_BUTTON_ICON || !TCFG_CHARGESTORE_ENABLE)
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (ble_adv_miss_flag) {
ble_adv_miss_flag = 0;
puts("ble_adv_miss_flag...\n");
} else {
printf("switch_icon_ctl00...\n");
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
}
}
#endif
return 0;
}
int rcsp_earphone_state_tws_init(int paired)
{
ble_adv_poweron_flag = 1;
if (paired) {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
bt_ble_adv_ioctl(BT_ADV_ENABLE, 0, 1);
} else {
//slave close
bt_ble_adv_ioctl(BT_ADV_DISABLE, 0, 1);
}
} else {
#if 0 //disable
//no_pair_adv,last do
if (tws_api_get_role() == TWS_ROLE_MASTER) {
printf("switch_icon_ctl no_pair...\n");
bt_ble_set_control_en(1);
bt_ble_icon_open(ICON_TYPE_INQUIRY);
} else {
bt_ble_set_control_en(0);
}
#endif
}
return 0;
}
int rcsp_earphone_state_tws_connected(int first_pair, u8 *comm_addr)
{
#if JL_EARPHONE_APP_EN
#if RCSP_ADV_MUSIC_INFO_ENABLE
extern void stop_get_music_timer(u8 en) ;
stop_get_music_timer(0);
#endif
#endif
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();
bt_ble_adv_enable(0);
bt_ble_adv_enable(1);
} else {
printf("\nConnect Slave!!!\n\n");
/*从机ble关掉*/
ble_app_disconnect();
bt_ble_adv_enable(0);
}
}
return 0;
}
int rcsp_earphone_state_enter_soft_poweroff()
{
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER) {
u8 adv_cmd = 0x3;
extern u8 adv_info_device_request(u8 * buf, u16 len);
extern u8 adv_tws_both_in_charge_box(u8 type);
if (adv_tws_both_in_charge_box(0)) {
adv_info_device_request(&adv_cmd, sizeof(adv_cmd));
}
}
#endif
extern void bt_ble_exit(void);
bt_ble_exit();
return 0;
}
int rcsp_adv_bt_status_event_handler(struct bt_event *bt)
{
switch (bt->event) {
case BT_STATUS_SECOND_CONNECTED:
case BT_STATUS_FIRST_CONNECTED:
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER || JL_get_cur_bt_channel_sel() == RCSP_SPP) {
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
} else {
//maybe slave already open
bt_ble_adv_ioctl(BT_ADV_DISABLE, 0, 1);
}
#else
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
#endif
break;
case BT_STATUS_FIRST_DISCONNECT:
case BT_STATUS_SECOND_DISCONNECT:
bt_adv_seq_change();
if (!app_var.goto_poweroff_flag) {
#if TCFG_USER_TWS_ENABLE
if (tws_api_get_role() == TWS_ROLE_MASTER || JL_get_cur_bt_channel_sel() == RCSP_SPP) {
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
} else {
//maybe slave already open
bt_ble_adv_ioctl(BT_ADV_DISABLE, 0, 1);
}
#else
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
#endif
}
break;
case BT_STATUS_SCO_STATUS_CHANGE:
#if TCFG_USER_TWS_ENABLE
if (bt->value != 0xff) {
rcsp_user_mic_fixed_deal(1);
} else {
rcsp_user_mic_fixed_deal(0);
}
#endif
break;
case BT_STATUS_PHONE_INCOME:
case BT_STATUS_PHONE_OUT:
case BT_STATUS_PHONE_ACTIVE:
printf("BT_STATUS_PHONE_ACTIVE\n");
#if RCSP_ADV_FIND_DEVICE_ENABLE
extern void send_find_device_stop(void);
send_find_device_stop();
#endif
// 更新通话状态
extern void JL_bt_phone_state_update(void);
JL_bt_phone_state_update();
break;
case BT_STATUS_PHONE_HANGUP:
printf("BT_STATUS_PHONE_HANGUP\n");
// 更新通话状态
extern void JL_bt_phone_state_update(void);
JL_bt_phone_state_update();
break;
}
return 0;
}
int rcsp_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)
//已取消配对了, 切换广播
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
#endif
break;
}
break;
}
return 0;
}
void rcsp_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_MASTER) {
//master enable
log_info("master do icon_open\n");
if (phone_link_connection) {
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
} else {
#if (TCFG_CHARGESTORE_ENABLE && !CONFIG_NO_DISPLAY_BUTTON_ICON)
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTED, 1);
#else
if (ble_adv_poweron_flag) { //上电标记
if (bt_user_priv_var.auto_connection_counter > 0) {
//有回连手机动作
/* g_printf("ICON_TYPE_RECONNECT"); */
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_CONNECTING, 1);
//没按键配对的话,等回连成功的时候才显示电量。如果在这里显示,手机取消配对后耳机开机,会显示出按键的界面
} else {
//没有回连,设可连接
/* g_printf("ICON_TYPE_INQUIRY"); */
bt_ble_adv_ioctl(BT_ADV_SET_EDR_CON_FLAG, SECNE_UNCONNECTED, 1);
}
}
#endif
}
} else {
//slave disable
printf("\nConnect Slave!!!\n\n");
/*从机ble关掉*/
ble_app_disconnect();
bt_ble_adv_enable(0);
}
send_version_to_sibling();
ble_adv_poweron_flag = 0;
#if RCSP_ADV_ANC_VOICE
anc_voice_setting_sync();
#endif
sync_setting_by_time_stamp();
#if (RCSP_ADV_FIND_DEVICE_ENABLE && TCFG_USER_TWS_ENABLE)
extern void find_decice_tws_connect_handle(u8 flag, u8 * param);
find_decice_tws_connect_handle(0, NULL);
#endif
break;
case TWS_EVENT_PHONE_LINK_DETACH:
/*
* 跟手机的链路LMP层已完全断开, 只有tws在连接状态才会收到此事件
*/
if (reason == 0x0b) {
//CONNECTION ALREADY EXISTS
ble_adv_miss_flag = 1;
} else {
ble_adv_miss_flag = 0;
}
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");
bt_ble_adv_enable(1);
}
set_ble_connect_type(TYPE_NULL);
deal_adv_setting_gain_time_stamp();
break;
case TWS_EVENT_SYNC_FUN_CMD:
#if JL_EARPHONE_APP_EN
if (reason == SYNC_CMD_APP_RESET_LED_UI) {
#if RCSP_ADV_LED_SET_ENABLE
extern void update_led_setting_state(void);
update_led_setting_state();
#endif
} else if (reason == SYNC_CMD_MUSIC_INFO) {
#if RCSP_ADV_MUSIC_INFO_ENABLE
extern void get_music_info(void);
get_music_info();
#endif
} else if (reason == SYNC_CMD_RCSP_AUTH_RES) {
extern void rcsp_tws_auth_sync_deal(void);
rcsp_tws_auth_sync_deal();
} else if (reason == SYNC_CMD_MUSIC_PLAYER_STATE) {
#if RCSP_ADV_MUSIC_INFO_ENABLE
void rcsp_update_player_state(void);
rcsp_update_player_state();
#endif
} else if (reason == SYNC_CMD_MUSIC_PLAYER_TIEM_EN) {
#if RCSP_ADV_MUSIC_INFO_ENABLE
extern void reset_player_time_en(void);
reset_player_time_en();
#endif
}
#endif
break;
case TWS_EVENT_ROLE_SWITCH:
if (role == TWS_ROLE_MASTER) { // 切换后触发
#if JL_EARPHONE_APP_EN
#if RCSP_ADV_LED_SET_ENABLE
extern void update_led_setting_state(void);
update_led_setting_state();
#endif
#endif
}
{
extern void adv_role_switch_handle(void);
adv_role_switch_handle();
}
break;
}
#if OTA_TWS_SAME_TIME_ENABLE
tws_ota_app_event_deal(bt->event);
#endif
}
int rcsp_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) {
rcsp_adv_bt_status_event_handler(&event->u.bt);
} else if ((u32)event->arg == SYS_BT_EVENT_TYPE_HCI_STATUS) {
rcsp_adv_hci_event_handler(&event->u.bt);
}
#if TCFG_USER_TWS_ENABLE
else if (((u32)event->arg == SYS_BT_EVENT_FROM_TWS)) {
rcsp_bt_tws_event_handler(&event->u.bt);
}
#endif
#if 1//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:
if ((u32)event->arg == DEVICE_EVENT_FROM_RCSP) {
int JL_rcsp_event_handler(struct rcsp_event * rcsp);
JL_rcsp_event_handler(&event->u.rcsp);
}
break;
}
return 0;
}
int user_spp_state_specific(u8 packet_type)
{
u8 tws_need_update = 0;
switch (packet_type) {
case 1:
ble_app_disconnect();
bt_ble_adv_enable(0);
// set_app_connect_type(TYPE_SPP);
#if (0 == BT_CONNECTION_VERIFY)
JL_rcsp_auth_reset();
#endif
set_rcsp_dev_type_spp();
set_connect_flag(2);
bt_ble_adv_ioctl(BT_ADV_SET_NOTIFY_EN, 1, 1);
break;
case 2:
// set_app_connect_type(TYPE_NULL);
#if TCFG_USER_TWS_ENABLE
if (syscfg_read(VM_UPDATE_FLAG, &tws_need_update, sizeof(tws_need_update)) == 1) {
printf("packet_type:%d need:%d\n", packet_type, tws_need_update);
if (tws_need_update) { //这里直接return防止升级过程从机断开SPP之后又开广播然后被主机误连
return 0;
}
}
if (!(tws_api_get_tws_state() & TWS_STA_SIBLING_CONNECTED)) {
if (!rcsp_get_update_flag()) {
ble_module_enable(1);
}
} else {
if (tws_api_get_role() == TWS_ROLE_MASTER) {
if (!rcsp_get_update_flag()) {
ble_module_enable(1);
}
}
}
#else
ble_module_enable(1);
#endif
#if (0 == BT_CONNECTION_VERIFY)
JL_rcsp_auth_reset();
#endif
break;
}
return 0;
}
int rcsp_earphone_state_init()
{
// rcsp_spp_init();
rcsp_init();
spp_data_deal_handle_register(user_spp_data_handler);
#if JL_EARPHONE_APP_EN
extern int jl_phone_app_init();
jl_phone_app_init();
#endif
return 0;
}
#endif
+4
View File
@@ -0,0 +1,4 @@
.section .sys.version, "ax"
.long 254991771
.asciz "JL701N_V1.6.1-@20240130-$8f8f3995"
+223
View File
@@ -0,0 +1,223 @@
#include "tone_player.h"
#include "system/includes.h"
#ifdef CONFIG_MEDIA_NEW_ENABLE
static const char *const tone_index[] = {
TONE_NUM_0,
TONE_NUM_1,
TONE_NUM_2,
TONE_NUM_3,
TONE_NUM_4,
TONE_NUM_5,
TONE_NUM_6,
TONE_NUM_7,
TONE_NUM_8,
TONE_NUM_9,
TONE_BT_MODE,
TONE_BT_CONN,
TONE_BT_DISCONN,
TONE_TWS_CONN,
TONE_TWS_DISCONN,
TONE_LOW_POWER,
TONE_POWER_OFF,
TONE_POWER_ON,
TONE_RING,
TONE_MAX_VOL,
TONE_NORMAL,
TONE_ANC_OFF,
TONE_ANC_ON,
TONE_TRANSPARENCY,
TONE_ANC_ADAPTIVE,
TONE_ANC_ADAPTIVE_COEFF,
TONE_ANC_NORMAL_COEFF,
};
/*
* 参数配置:
* freq : 实际频率 * 512
* points : 正弦波点数
* win : 正弦窗
* decay : 衰减系数(百分比), 正弦窗模式下为频率设置:频率*512
*
*/
static const struct sin_param sine_16k_normal[] __BANK_TONE = {
/*{0, 1000, 0, 100},*/
{1000 << 9, 4000, 0, 100},
};
static const struct sin_param sine_key_tone[] __BANK_TONE = {
/*sine_make.c/fade_points = 0效果更加*/
{2800 << 9, 1400, 1, 60 << 9},
};
static const struct sin_param sine_low_latency_in[] __BANK_TONE = {
/*{0, 1000, 0, 100},*/
{400 << 9, 4000, 0, 100},
};
static const struct sin_param sine_low_latency_out[] __BANK_TONE = {
/*{0, 1000, 0, 100},*/
{600 << 9, 8000, 0, 100},
};
static const struct sin_param sine_tws_disconnect_16k[] __BANK_TONE = {
/*
{390 << 9, 4026, SINE_TOTAL_VOLUME / 4026},
{262 << 9, 8000, SINE_TOTAL_VOLUME / 8000},
*/
{262 << 9, 4026, 0, 100},
{390 << 9, 8000, 0, 100},
};
static const struct sin_param sine_tws_connect_16k[] __BANK_TONE = {
/*
{262 << 9, 4026, SINE_TOTAL_VOLUME / 4026},
{390 << 9, 8000, SINE_TOTAL_VOLUME / 8000},
*/
{262.298 * 512, 8358, 0, 100},
};
static const struct sin_param sine_low_power[] __BANK_TONE = {
{424 << 9, 3613, 0, 100},
{319 << 9, 3623, 0, 100},
};
static const struct sin_param sine_ring[] __BANK_TONE = {
{450 << 9, 24960, 1, 16.667 * 512},
{0, 16000, 0, 100},
};
static const struct sin_param sine_tws_max_volume[] __BANK_TONE = {
{210 << 9, 2539, 0, 100},
{260 << 9, 7619, 0, 100},
{400 << 9, 2539, 0, 100},
};
static const struct sin_param sine_anc_adaptive_1[] __BANK_TONE = {
{330 << 9, 2539, 0, 100}, //低 mi
{392 << 9, 7619, 0, 100}, //低 so
};
static const struct sin_param sine_anc_adaptive_2[] __BANK_TONE = {
{392 << 9, 2539, 0, 100}, //低 so
{330 << 9, 7619, 0, 100}, //低 mi
};
__BANK_TONE_ENTRY
static const struct sin_param *get_sine_param_by_index(u8 index, u8 *num)
{
const struct sin_param *param_data;
switch (index) {
case SINE_WTONE_NORAML:
param_data = sine_16k_normal;
*num = ARRAY_SIZE(sine_16k_normal);
break;
case SINE_WTONE_TWS_CONNECT:
param_data = sine_tws_connect_16k;
*num = ARRAY_SIZE(sine_tws_connect_16k);
break;
case SINE_WTONE_TWS_DISCONNECT:
param_data = sine_tws_disconnect_16k;
*num = ARRAY_SIZE(sine_tws_disconnect_16k);
break;
case SINE_WTONE_LOW_POWER:
param_data = sine_low_power;
*num = ARRAY_SIZE(sine_low_power);
break;
case SINE_WTONE_RING:
param_data = sine_ring;
*num = ARRAY_SIZE(sine_ring);
break;
case SINE_WTONE_MAX_VOLUME:
param_data = sine_tws_max_volume;
*num = ARRAY_SIZE(sine_tws_max_volume);
break;
case SINE_WTONE_LOW_LATENRY_IN:
param_data = sine_low_latency_in;
*num = ARRAY_SIZE(sine_low_latency_in);
break;
case SINE_WTONE_LOW_LATENRY_OUT:
param_data = sine_low_latency_out;
*num = ARRAY_SIZE(sine_low_latency_out);
break;
case SINE_WTONE_ANC_ADAPTIVE_1:
param_data = sine_anc_adaptive_1;
*num = ARRAY_SIZE(sine_anc_adaptive_1);
break;
case SINE_WTONE_ANC_ADAPTIVE_2:
param_data = sine_anc_adaptive_2;
*num = ARRAY_SIZE(sine_anc_adaptive_2);
break;
default:
return NULL;
}
return param_data;
}
/*
*index:提示音索引
*preemption:抢断标志
*/
__BANK_TONE_ENTRY
int tone_play_index(u8 index, u8 preemption)
{
printf("tone_play_index:%d,preemption:%d", index, preemption);
if (index >= IDEX_TONE_NONE) {
return 0;
}
return tone_play(tone_index[index], preemption);
}
/*
*@brief:提示音比较,确认目标提示音和正在播放的提示音是否一致
*@return: 0 匹配
* 非0 不匹配或者当前没有提示音播放
*@note:通过提示音索引比较
*/
int tone_name_cmp_by_index(u8 index)
{
if (index >= IDEX_TONE_NONE) {
return 0;
}
return tone_name_compare(tone_index[index]);
}
__BANK_TONE_ENTRY
int tone_play_index_no_tws(u8 index, u8 preemption)
{
printf("tone_play_index no tws:%d,preemption:%d", index, preemption);
if (index >= IDEX_TONE_NONE) {
return 0;
}
return tone_play_no_tws(tone_index[index], preemption);
}
/* __BANK_TONE_ENTRY */
int tone_play_index_with_callback(u8 index, u8 preemption, void (*user_evt_handler)(void *priv), void *priv)
{
printf("tone_play_index:%d,preemption:%d", index, preemption);
if (index >= IDEX_TONE_NONE) {
return 0;
}
return tone_play_with_callback(tone_index[index], preemption, user_evt_handler, priv);
}
__BANK_INIT_ENTRY
int tone_table_init()
{
tone_play_set_sine_param_handler(get_sine_param_by_index);
return 0;
}
__initcall(tone_table_init);
#endif /*CONFIG_MEDIA_NEW_ENABLE*/
@@ -0,0 +1,217 @@
#include "app_config.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 "spp_trans_data.h"
#include "spp_user.h"
#if TRANS_DATA_EN
#define LOG_TAG "[TRANS_DATA]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
u8 ble_adv_miss_flag = 0;
u8 ble_adv_poweron_flag = 0;
int trans_data_earphone_state_set_page_scan_enable()
{
return 0;
}
int trans_data_earphone_state_get_connect_mac_addr()
{
return 0;
}
int trans_data_earphone_state_cancel_page_scan()
{
return 0;
}
int trans_data_earphone_state_tws_init(int paired)
{
return 0;
}
int trans_data_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();
bt_ble_adv_enable(0);
bt_ble_adv_enable(1);
} else {
printf("\nConnect Slave!!!\n\n");
/*从机ble关掉*/
ble_app_disconnect();
bt_ble_adv_enable(0);
}
}
return 0;
}
int trans_data_earphone_state_enter_soft_poweroff()
{
extern void bt_ble_exit(void);
bt_ble_exit();
return 0;
}
int trans_data_adv_bt_status_event_handler(struct bt_event *bt)
{
return 0;
}
int trans_data_adv_hci_event_handler(struct bt_event *bt)
{
return 0;
}
void trans_data_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();
bt_ble_adv_enable(0);
}
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");
bt_ble_adv_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 trans_data_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 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 trans_data_earphone_state_init()
{
transport_spp_init();
spp_data_deal_handle_register(user_spp_data_handler);
return 0;
}
#endif
+352
View File
@@ -0,0 +1,352 @@
#include "ui_manage.h"
#include "asm/pwm_led.h"
#include "system/includes.h"
#include "app_config.h"
#include "user_cfg.h"
#include "classic/tws_api.h"
#define LOG_TAG_CONST UI
#define LOG_TAG "[UI]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#define LED_VDDIO_KEEP 1
#define UI_MANAGE_BUF 8
typedef struct _ui_var {
u8 ui_init_flag;
u8 other_status;
u8 power_status;
u8 current_status;
volatile u8 ui_flash_cnt;
cbuffer_t ui_cbuf;
u8 ui_buf[UI_MANAGE_BUF];
int sys_ui_timer;
} ui_var;
static ui_var sys_ui_var = {.power_status = STATUS_NORMAL_POWER};
extern int get_bt_tws_connect_status();
u8 get_ui_status(u8 *status)
{
return cbuf_read(&(sys_ui_var.ui_cbuf), status, 1);
}
u8 get_ui_status_len(void)
{
return cbuf_get_data_size(&(sys_ui_var.ui_cbuf));
}
u8 get_ui_busy_status()
{
return sys_ui_var.ui_flash_cnt;
}
#if (RCSP_ADV_EN)
u8 adv_get_led_status(void)
{
return sys_ui_var.other_status;
}
#endif
void ui_manage_scan(void *priv)
{
STATUS *p_led = get_led_config();
sys_ui_var.sys_ui_timer = 0;
log_info("ui_flash_cnt:%d cur_ui_status:%d", sys_ui_var.ui_flash_cnt, sys_ui_var.current_status);
if (sys_ui_var.ui_flash_cnt == 0 || sys_ui_var.ui_flash_cnt == 7) { //有特殊的闪烁状态等当前状态执行完再进入下一个状态
if (get_ui_status(&sys_ui_var.current_status)) {
if (sys_ui_var.current_status >= STATUS_CHARGE_START && sys_ui_var.current_status <= STATUS_NORMAL_POWER) {
sys_ui_var.power_status = sys_ui_var.current_status;
} else {
sys_ui_var.other_status = sys_ui_var.current_status;
}
}
}
if (sys_ui_var.ui_flash_cnt) {
sys_ui_var.ui_flash_cnt --;
sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 300, 1);
} else if (get_ui_status_len()) {
sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 100, 1);
}
#if ((RCSP_ADV_EN)&&(JL_EARPHONE_APP_EN))
if (tws_api_get_role() == TWS_ROLE_SLAVE) {
pwm_led_mode_set(PWM_LED_ALL_OFF);
return;
}
#endif
if (sys_ui_var.other_status != STATUS_POWEROFF && sys_ui_var.power_status != STATUS_NORMAL_POWER) { //关机的状态优先级要高于电源状态
switch (sys_ui_var.power_status) {
case STATUS_LOWPOWER:
log_info("[STATUS_LOWPOWER]\n");
pwm_led_mode_set(p_led->lowpower);
return;
case STATUS_CHARGE_START:
log_info("[STATUS_CHARGE_START]\n");
pwm_led_mode_set(p_led->charge_start);
return;
case STATUS_CHARGE_FULL:
log_info("[STATUS_CHARGE_FULL]\n");
pwm_led_mode_set(p_led->charge_full);
return;
case STATUS_CHARGE_ERR:
log_info("[STATUS_CHARGE_ERR]\n");
pwm_led_mode_set(PWM_LED0_ON);
pwm_led_mode_set(PWM_LED1_ON);
return;
case STATUS_CHARGE_CLOSE:
log_info("[STATUS_CHARGE_CLOSE]\n");
pwm_led_mode_set(PWM_LED0_OFF);
pwm_led_mode_set(PWM_LED1_OFF);
return;
case STATUS_CHARGE_LDO5V_OFF:
log_info("[STATUS_CHARGE_LDO5V_OFF]\n");
case STATUS_EXIT_LOWPOWER:
case STATUS_NORMAL_POWER:
//pwm_led_mode_set(PWM_LED0_OFF);
//pwm_led_mode_set(PWM_LED1_OFF);
sys_ui_var.power_status = STATUS_NORMAL_POWER;
break;
}
}
switch (sys_ui_var.other_status) {
case STATUS_POWERON:
log_info("[STATUS_POWERON]\n");
if (p_led->power_on != PWM_LED0_FLASH_THREE) {
pwm_led_mode_set(p_led->power_on);
} else {
if (sys_ui_var.ui_flash_cnt) {
if (get_bt_tws_connect_status()) {
sys_ui_var.ui_flash_cnt = 0;
ui_manage_scan(NULL);
return;
}
if (sys_ui_var.ui_flash_cnt % 2) {
pwm_led_mode_set(PWM_LED0_OFF);
} else {
pwm_led_mode_set(PWM_LED0_ON);
}
}
}
break;
case STATUS_POWEROFF:
log_info("[STATUS_POWEROFF]\n");
if (p_led->power_off != PWM_LED1_FLASH_THREE) {
pwm_led_mode_set(p_led->power_off);
} else {
if (sys_ui_var.ui_flash_cnt) {
if (sys_ui_var.ui_flash_cnt % 2) {
pwm_led_mode_set(PWM_LED1_OFF);
} else {
pwm_led_mode_set(PWM_LED1_ON);
}
}
}
break;
case STATUS_BT_INIT_OK:
log_info("[STATUS_BT_INIT_OK]\n");
pwm_led_mode_set(p_led->bt_init_ok);
break;
case STATUS_BT_SLAVE_CONN_MASTER:
pwm_led_mode_set(PWM_LED1_SLOW_FLASH);
break;
case STATUS_BT_CONN:
log_info("[STATUS_BT_CONN]\n");
pwm_led_mode_set(p_led->bt_connect_ok);
break;
case STATUS_BT_MASTER_CONN_ONE:
log_info("[STATUS_BT_MASTER_CONN_ONE]\n");
pwm_led_mode_set(PWM_LED0_LED1_SLOW_FLASH);
break;
case STATUS_BT_DISCONN:
log_info("[STATUS_BT_DISCONN]\n");
pwm_led_mode_set(p_led->bt_disconnect);
break;
case STATUS_PHONE_INCOME:
log_info("[STATUS_PHONE_INCOME]\n");
pwm_led_mode_set(p_led->phone_in);
break;
case STATUS_PHONE_OUT:
log_info("[STATUS_PHONE_OUT]\n");
pwm_led_mode_set(p_led->phone_out);
break;
case STATUS_PHONE_ACTIV:
log_info("[STATUS_PHONE_ACTIV]\n");
pwm_led_mode_set(p_led->phone_activ);
break;
case STATUS_POWERON_LOWPOWER:
log_info("[STATUS_POWERON_LOWPOWER]\n");
pwm_led_mode_set(p_led->lowpower);
break;
case STATUS_BT_TWS_CONN:
log_info("[STATUS_BT_TWS_CONN]\n");
pwm_led_mode_set(p_led->tws_connect_ok);
break;
case STATUS_BT_TWS_DISCONN:
log_info("[STATUS_BT_TWS_DISCONN]\n");
pwm_led_mode_set(p_led->tws_disconnect);
break;
}
}
int ui_manage_init(void)
{
if (!sys_ui_var.ui_init_flag) {
cbuf_init(&(sys_ui_var.ui_cbuf), &(sys_ui_var.ui_buf), UI_MANAGE_BUF);
sys_ui_var.ui_init_flag = 1;
}
return 0;
}
void ui_update_status(u8 status)
{
STATUS *p_led = get_led_config();
if (!sys_ui_var.ui_init_flag) { //更新UI状态之前需先初始化ui_cbuf
ui_manage_init();
}
log_info("update ui status :%d", status);
if ((status == STATUS_POWERON && p_led->power_on == PWM_LED0_FLASH_THREE) || (status == STATUS_POWEROFF && p_led->power_off == PWM_LED1_FLASH_THREE)) {
log_info(">>>set ui_flash_cnt");
sys_ui_var.ui_flash_cnt = 7;
}
cbuf_write(&(sys_ui_var.ui_cbuf), &status, 1);
/* if (!sys_ui_var.sys_ui_timer) { */
/* sys_ui_var.sys_ui_timer = usr_timeout_add(NULL, ui_manage_scan, 10); */
/* } */
if (sys_ui_var.ui_flash_cnt >= 1 && sys_ui_var.ui_flash_cnt <= 6) {
return;
}
ui_manage_scan(NULL);
}
u8 pdown_keep_pw_gate()
{
#if(LED_VDDIO_KEEP == 1) //led 进入powerdown时模块的电源是否降低,降低会导致灯抖动,不降的话功耗会高100ua
return true;
#else
if ((sys_ui_var.current_status == STATUS_BT_DISCONN) ||
(sys_ui_var.current_status == STATUS_BT_INIT_OK) ||
(sys_ui_var.current_status == STATUS_BT_TWS_DISCONN)) {
return true;
} else {
return false;
}
#endif
}
#if (TCFG_USER_TWS_ENABLE == 1)
__attribute__((weak))
bool is_led_module_on()
{
return 0;
}
__attribute__((weak))
void led_module_on()
{
}
__attribute__((weak))
void led_module_off()
{
}
__attribute__((weak))
void led_timer_del()
{
}
__attribute__((weak))
void led_module_enter_sniff_mode()
{
}
__attribute__((weak))
void led_module_exit_sniff_mode()
{
}
__attribute__((weak))
void led_sniff_mode_double_display(u32 index)
{
}
extern int get_bt_tws_connect_status();
//对耳连接成功之后利用SNIFF的节奏来进行闪灯同步,只是通过开关LED模块来实现同步
void sniff_achor_point_hook(u32 slot)
{
u8 led_mode = pwm_led_display_mode_get();
if (led_mode != PWM_LED0_ONE_FLASH_5S && led_mode != PWM_LED1_ONE_FLASH_5S) {
if (get_bt_tws_connect_status()) {
//交替闪进sniff同步
if (led_mode == PWM_LED0_LED1_FAST_FLASH) {
if ((slot % ((CFG_DOUBLE_FAST_FLASH_FREQ * 1000) / 625)) < 800) {
led_sniff_mode_double_display((slot / ((CFG_DOUBLE_FAST_FLASH_FREQ * 1000) / 625)) & BIT(0));
}
} else if (led_mode == PWM_LED0_LED1_SLOW_FLASH) {
if ((slot % ((CFG_DOUBLE_SLOW_FLASH_FREQ * 1000) / 625)) < 800) {
led_sniff_mode_double_display((slot / ((CFG_DOUBLE_SLOW_FLASH_FREQ * 1000) / 625)) & BIT(0));
}
}
}
return;
}
/* if (get_bt_tws_connect_status()) { */
#if defined CFG_LED_MODE && (CFG_LED_MODE == CFG_LED_SOFT_MODE)
led_timer_del();
#endif
if (is_led_module_on()) {
led_module_off();
}
if ((slot % (1600 * 5)) < 800) { //一个slot = 0.625ms 1600*0.625 = 1s
led_module_on();
}
/* } else { */
/* } */
}
#else
__attribute__((weak))
int get_bt_tws_connect_status()
{
return 0;
}
#endif
+583
View File
@@ -0,0 +1,583 @@
#include "app_config.h"
#include "user_cfg.h"
#include "fs.h"
#include "string.h"
#include "system/includes.h"
#include "vm.h"
#include "btcontroller_config.h"
#include "app_main.h"
#include "media/includes.h"
#include "audio_config.h"
#include "asm/pwm_led.h"
#include "aec_user.h"
#include "app_power_manage.h"
#define LOG_TAG_CONST USER_CFG
#define LOG_TAG "[USER_CFG]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
#define LOG_INFO_ENABLE
#define LOG_DUMP_ENABLE
#define LOG_CLI_ENABLE
#include "debug.h"
void lp_winsize_init(struct lp_ws_t *lp);
void bt_max_pwr_set(u8 pwr, u8 pg_pwr, u8 iq_pwr, u8 ble_pwr);
void app_set_sys_vol(s16 vol_l, s16 vol_r);
BT_CONFIG bt_cfg = {
.edr_name = {'Y', 'L', '-', 'B', 'R', '3', '0'},
.mac_addr = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
.tws_local_addr = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
.rf_power = 10,
.dac_analog_gain = 25,
.mic_analog_gain = 7,
.tws_device_indicate = 0x6688,
};
AUDIO_CONFIG audio_cfg = {
.max_sys_vol = SYS_MAX_VOL,
.default_vol = SYS_DEFAULT_VOL,
.tone_vol = SYS_DEFAULT_TONE_VOL,
};
//======================================================================================//
// BTIF配置项表 //
// 参数1: 配置项名字 //
// 参数2: 配置项需要多少个byte存储 //
// 说明: 配置项ID注册到该表后该配置项将读写于BTIF区域, 其它没有注册到该表 //
// 的配置项则默认读写于VM区域. //
//======================================================================================//
const struct btif_item btif_table[] = {
// item id len //
{CFG_BT_MAC_ADDR, 6 },
{CFG_BT_FRE_OFFSET, 6 }, //测试盒矫正频偏值
//{CFG_DAC_DTB, 2 },
//{CFG_MC_BIAS, 1 },
{0, 0 }, //reserved cfg
};
//============================= VM 区域空间最大值 ======================================//
//以下宏在app_cfg中配置:
const int vm_max_page_align_size_config = VM_MAX_PAGE_ALIGN_SIZE_CONFIG; //page对齐vm管理空间最大值配置
const int vm_max_sector_align_size_config = VM_MAX_SECTOR_ALIGN_SIZE_CONFIG; //sector对齐vm管理空间最大值配置
//======================================================================================//
struct lp_ws_t lp_winsize = {
.lrc_ws_inc = 480, //260
.lrc_ws_init = 160,
.bt_osc_ws_inc = 100,
.bt_osc_ws_init = 140,
.osc_change_mode = 0,
};
u16 bt_get_tws_device_indicate(u8 *tws_device_indicate)
{
return bt_cfg.tws_device_indicate;
}
const u8 *bt_get_mac_addr()
{
return bt_cfg.mac_addr;
}
void bt_update_mac_addr(u8 *addr)
{
memcpy(bt_cfg.mac_addr, addr, 6);
}
static u8 bt_mac_addr_for_testbox[6] = {0};
void bt_get_vm_mac_addr(u8 *addr)
{
#if 0
//中断不能调用syscfg_read;
int ret = 0;
ret = syscfg_read(CFG_BT_MAC_ADDR, addr, 6);
if ((ret != 6)) {
syscfg_write(CFG_BT_MAC_ADDR, addr, 6);
}
#else
memcpy(addr, bt_mac_addr_for_testbox, 6);
#endif
}
void bt_get_tws_local_addr(u8 *addr)
{
memcpy(addr, bt_cfg.tws_local_addr, 6);
}
const char *sdk_version_info_get(void)
{
extern u32 __VERSION_BEGIN;
char *version_str = ((char *)&__VERSION_BEGIN) + 4;
return version_str;
}
const char *bt_get_local_name()
{
return (const char *)(bt_cfg.edr_name);
}
const char *bt_get_pin_code()
{
return "0000";
}
extern STATUS_CONFIG status_config;
extern struct charge_platform_data charge_data;
/* extern struct dac_platform_data dac_data; */
extern struct adkey_platform_data adkey_data;
extern struct led_platform_data pwm_led_data;
extern struct adc_platform_data adc_data;
extern u8 key_table[KEY_EVENT_MAX][KEY_NUM_MAX];
u8 get_max_sys_vol(void)
{
return (audio_cfg.max_sys_vol);
}
u8 get_tone_vol(void)
{
if (!audio_cfg.tone_vol) {
return (get_max_sys_vol());
}
if (audio_cfg.tone_vol > get_max_sys_vol()) {
return (get_max_sys_vol());
}
return (audio_cfg.tone_vol);
}
#define USE_CONFIG_BIN_FILE 0
#define USE_CONFIG_STATUS_SETTING 1 //状态设置,包括灯状态和提示音
#define USE_CONFIG_AUDIO_SETTING USE_CONFIG_BIN_FILE //音频设置
#define USE_CONFIG_CHARGE_SETTING USE_CONFIG_BIN_FILE //充电设置
#define USE_CONFIG_KEY_SETTING USE_CONFIG_BIN_FILE //按键消息设置
#define USE_CONFIG_MIC_TYPE_SETTING USE_CONFIG_BIN_FILE //MIC类型设置
#define USE_CONFIG_LOWPOWER_V_SETTING USE_CONFIG_BIN_FILE //低电提示设置
#define USE_CONFIG_AUTO_OFF_SETTING USE_CONFIG_BIN_FILE //自动关机时间设置
#define USE_CONFIG_VOL_SETTING 1 //音量表读配置
__attribute__((weak))
void get_config_mic_gain(u8 mic_gain0, u8 mic_gain1, u8 mic_gain2)
{
}
/*更加mic通道值获取使用的第几个mic*/
u8 get_mic_num(u8 bit)
{
u8 i = 0;
for (i = 0; i < 4; i++) {
if (bit & 0x1) {
return i;
}
bit >>= 1;
}
return 0;
}
__BANK_INIT_ENTRY
void cfg_file_parse(u8 idx)
{
u8 tmp[128] = {0};
int ret = 0;
memset(tmp, 0x00, sizeof(tmp));
/*************************************************************************/
/* CFG READ IN cfg_tools.bin */
/*************************************************************************/
//-----------------------------CFG_BT_NAME--------------------------------------//
ret = syscfg_read(CFG_BT_NAME, tmp, 32);
if (ret < 0) {
log_info("read bt name err");
} else if (ret >= LOCAL_NAME_LEN) {
memset(bt_cfg.edr_name, 0x00, LOCAL_NAME_LEN);
memcpy(bt_cfg.edr_name, tmp, LOCAL_NAME_LEN);
bt_cfg.edr_name[LOCAL_NAME_LEN - 1] = 0;
} else {
memset(bt_cfg.edr_name, 0x00, LOCAL_NAME_LEN);
memcpy(bt_cfg.edr_name, tmp, ret);
}
/* g_printf("bt name config:%s", bt_cfg.edr_name); */
log_info("bt name config:%s", bt_cfg.edr_name);
//-----------------------------CFG_TWS_PAIR_CODE_ID----------------------------//
ret = syscfg_read(CFG_TWS_PAIR_CODE_ID, &bt_cfg.tws_device_indicate, 2);
if (ret < 0) {
log_debug("read pair code err");
bt_cfg.tws_device_indicate = 0x8888;
}
/* g_printf("tws pair code config:"); */
log_info("tws pair code config:");
log_info_hexdump(&bt_cfg.tws_device_indicate, 2);
//-----------------------------CFG_BT_RF_POWER_ID----------------------------//
ret = syscfg_read(CFG_BT_RF_POWER_ID, &app_var.rf_power, 1);
if (ret < 0) {
log_debug("read rf err");
app_var.rf_power = 10;
}
bt_max_pwr_set(app_var.rf_power, 5, 8, 9);//last is ble tx_pwer(0~9)
/* g_printf("rf config:%d\n", app_var.rf_power); */
log_info("rf config:%d\n", app_var.rf_power);
//-----------------------------CFG_AEC_ID------------------------------------//
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
log_info("3mic config:");
AEC_TMS_CONFIG aec;
ret = syscfg_read(CFG_TMS_DNS_ID, &aec, sizeof(aec));
#elif TCFG_AUDIO_DUAL_MIC_ENABLE
#if ((defined TCFG_AUDIO_DMS_SEL) && (TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE))
#if(TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
log_info("dms_flexible config:");/*双mic话务耳机降噪*/
DMS_FLEXIBLE_CONFIG aec;
ret = syscfg_read(CFG_DMS_FLEXIBLE_ID, &aec, sizeof(aec));
#else /*DMS_DNS*/
log_info("dms_dns_flexible config:");/*双mic话务耳机神经网络降噪*/
DMS_FLEXIBLE_CONFIG aec;
ret = syscfg_read(CFG_DMS_DNS_FLEXIBLE_ID, &aec, sizeof(aec));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
#else /*TCFG_AUDIO_DMS_SEL == DMS_NORMAL*/
#if(TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
log_info("dms_ans config:");/*双mic传统降噪*/
AEC_DMS_CONFIG aec;
ret = syscfg_read(CFG_DMS_ID, &aec, sizeof(aec));
#else /*DMS_DNS*/
log_info("dms_dns config:");/*双mic神经网络降噪*/
AEC_DMS_CONFIG aec;
ret = syscfg_read(CFG_DMS_DNS_ID, &aec, sizeof(aec));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
#if TCFG_AUDIO_MIC_ARRAY_TRIM_ENABLE
app_var.enc_degradation = aec.target_signal_degradation;
#endif /*TCFG_AUDIO_MIC_ARRAY_TRIM_ENABLE*/
#endif/*TCFG_AUDIO_DMS_SEL*/
#else /*single mic*/
AEC_CONFIG aec;
#if(TCFG_AUDIO_CVP_NS_MODE == CVP_ANS_MODE)
log_info("sms_ans config:");
ret = syscfg_read(CFG_AEC_ID, &aec, sizeof(aec));
#else /*SMS_DNS*/
log_info("sms_dns config:");
ret = syscfg_read(CFG_SMS_DNS_ID, &aec, sizeof(aec));
#endif/*TCFG_AUDIO_CVP_NS_MODE*/
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
//log_info("ret:%d,aec_cfg size:%d\n",ret,sizeof(aec));
if (ret == sizeof(aec)) {
log_info("aec cfg read succ\n");
log_info_hexdump(&aec, sizeof(aec));
app_var.aec_mic_gain = aec.mic_again;
app_var.aec_mic1_gain = aec.mic_again;
app_var.aec_mic2_gain = aec.mic_again;
app_var.aec_mic3_gain = aec.mic_again;
#if TCFG_AUDIO_DUAL_MIC_ENABLE
#if ((defined TCFG_AUDIO_DMS_SEL) && (TCFG_AUDIO_DMS_SEL == DMS_FLEXIBLE))
app_var.aec_mic1_gain = aec.mic1_again;
#endif/*TCFG_AUDIO_DMS_SEL*/
#endif/*TCFG_AUDIO_DUAL_MIC_ENABLE*/
get_config_mic_gain(app_var.aec_mic_gain, app_var.aec_mic1_gain, app_var.aec_mic1_gain);
/*3麦增益设置*/
#if TCFG_AUDIO_TRIPLE_MIC_ENABLE
app_var.talk_mic_ch = aec.talk_mic_ch;
app_var.talk_ref_mic_ch = aec.talk_ref_mic_ch;
app_var.talk_fb_mic_ch = aec.talk_fb_mic_ch;
printf("3 mic ch sel , talk : %d, ref : %d, fb : %d", app_var.talk_mic_ch, app_var.talk_ref_mic_ch, app_var.talk_fb_mic_ch);
u8 gain[4] = {0};
gain[get_mic_num(aec.talk_mic_ch)] = aec.mic_again;
gain[get_mic_num(aec.talk_ref_mic_ch)] = aec.mic_again;
gain[get_mic_num(aec.talk_fb_mic_ch)] = aec.fb_mic_again;
app_var.aec_mic_gain = gain[0];
app_var.aec_mic1_gain = gain[1];
app_var.aec_mic2_gain = gain[2];
app_var.aec_mic3_gain = gain[3];
#endif
app_var.aec_dac_gain = aec.dac_again;
#if AEC_READ_CONFIG
#ifdef CONFIG_MEDIA_ORIGIN_ENABLE
aec_cfg_fill(&aec);
#endif/*CONFIG_MEDIA_ORIGIN_ENABLE*/
#endif/*AEC_READ_CONFIG*/
} else {
log_info("aec cfg read err ret: %d, aec : %d,use default value\n", ret, sizeof(aec));
app_var.talk_mic_ch = 1;
app_var.talk_ref_mic_ch = 2;
app_var.talk_fb_mic_ch = 4;
app_var.aec_mic_gain = 6;
app_var.aec_mic1_gain = 6;
app_var.aec_mic2_gain = 1;
app_var.aec_mic3_gain = 1;
app_var.aec_dac_gain = 12;/*初始化默认值要注意不能大于芯片支持最大模拟音量*/
}
log_info("CVP_cfg Mic0_gain:%d Mic1_gain:%d Mic2_gain:%d Mic3_gain:%d DAC_Gain:%d",
app_var.aec_mic_gain, app_var.aec_mic1_gain, app_var.aec_mic2_gain, app_var.aec_mic3_gain, app_var.aec_dac_gain);
//-----------------------------CFG_MIC_ARRAY_TRIM-------------------------------------//
#if TCFG_AUDIO_MIC_ARRAY_TRIM_ENABLE
extern void put_float(double fv);
ret = syscfg_read(CFG_MIC_ARRAY_TRIM_EN, (u8 *)(&app_var.audio_mic_array_trim_en), sizeof(app_var.audio_mic_array_trim_en));
if (ret != sizeof(app_var.audio_mic_array_trim_en)) {
log_info("audio_mic_array_trim_en vm read fail %d, %d!!!", ret, sizeof(app_var.audio_mic_array_trim_en));
}
ret = syscfg_read(CFG_MIC_ARRAY_DIFF_CMP_VALUE, (u8 *)(&app_var.audio_mic_array_diff_cmp), sizeof(app_var.audio_mic_array_diff_cmp));
if (ret != sizeof(app_var.audio_mic_array_diff_cmp)) {
log_info("audio_mic_array_diff_cmp vm read fail %d, %d!!!", ret, sizeof(app_var.audio_mic_array_diff_cmp));
app_var.audio_mic_array_diff_cmp = 1.0f;
}
ret = syscfg_read(CFG_MIC_TARGET_DIFF_CMP, (u8 *)(&app_var.audio_mic_cmp), sizeof(audio_mic_cmp_t));
if (ret != sizeof(audio_mic_cmp_t)) {
log_info("audio_mic_array_diff_cmp vm read fail %d, %d!!!", ret, sizeof(audio_mic_cmp_t));
app_var.audio_mic_cmp.talk = 1.0f;
app_var.audio_mic_cmp.ff = 1.0f;
app_var.audio_mic_cmp.fb = 1.0f;
}
log_info("mic array trim en: %d\n", app_var.audio_mic_array_trim_en);
log_info("mic_array_diff_cmp:");
put_float(app_var.audio_mic_array_diff_cmp);
log_info("mic_cmp-talk:");
put_float(app_var.audio_mic_cmp.talk);
log_info("mic_cmp-ff:");
put_float(app_var.audio_mic_cmp.ff);
log_info("mic_cmp-fb:");
put_float(app_var.audio_mic_cmp.fb);
#endif
//-----------------------------CFG_VOL_LIST-------------------------------------//
audio_volume_list_init(USE_CONFIG_VOL_SETTING);
//-----------------------------CFG_MIC_TYPE_ID------------------------------------//
#if USE_CONFIG_MIC_TYPE_SETTING
log_info("mic_type_config:");
extern int read_mic_type_config(void);
read_mic_type_config();
#endif
#if TCFG_MC_BIAS_AUTO_ADJUST
ret = syscfg_read(CFG_MC_BIAS, &adc_data.mic_bias_res, 1);
log_info("mic_bias_res:%d", adc_data.mic_bias_res);
if (ret != 1) {
log_info("mic_bias_adjust NULL");
}
u8 mic_ldo_idx;
ret = syscfg_read(CFG_MIC_LDO_VSEL, &mic_ldo_idx, 1);
if (ret == 1) {
adc_data.mic_ldo_vsel = mic_ldo_idx & 0x3;
log_info("mic_ldo_vsel:%d,%d\n", adc_data.mic_ldo_vsel, mic_ldo_idx);
} else {
log_info("mic_ldo_vsel_adjust NULL\n");
}
#endif
#if USE_CONFIG_STATUS_SETTING
/* g_printf("status_config:"); */
log_info("status_config:");
STATUS_CONFIG *status = (STATUS_CONFIG *)tmp;
ret = syscfg_read(CFG_UI_TONE_STATUS_ID, status, sizeof(STATUS_CONFIG));
if (ret > 0) {
memcpy((u8 *)&status_config, (u8 *)status, sizeof(STATUS_CONFIG));
log_info_hexdump(&status_config, sizeof(STATUS_CONFIG));
}
#endif
#if USE_CONFIG_AUDIO_SETTING
/* g_printf("app audio_config:"); */
log_info("app audio_config:");
ret = syscfg_read(CFG_AUDIO_ID, (u8 *)&audio_cfg, sizeof(AUDIO_CONFIG));
if (ret > 0) {
log_info_hexdump((u8 *)&audio_cfg, sizeof(AUDIO_CONFIG));
#else
{
#endif
/* dac_data.max_ana_vol = audio_cfg.max_sys_vol; */
/* if (dac_data.max_ana_vol > 30) { */
/* dac_data.max_ana_vol = 30; */
/* } */
u8 default_volume = audio_cfg.default_vol;
s8 music_volume = -1;
#if SYS_DEFAULT_VOL
default_volume = audio_cfg.default_vol;
#else
syscfg_read(CFG_SYS_VOL, &default_volume, 1);
ret = syscfg_read(CFG_MUSIC_VOL, &music_volume, 1);
if (ret < 0) {
music_volume = -1;
}
#endif
if (default_volume > audio_cfg.max_sys_vol) {
default_volume = audio_cfg.max_sys_vol;
}
if (default_volume == 0) {
default_volume = audio_cfg.max_sys_vol / 2;
}
app_var.music_volume = music_volume == -1 ? default_volume : music_volume;
app_var.wtone_volume = audio_cfg.tone_vol;
#if TCFG_CALL_USE_DIGITAL_VOLUME
app_var.call_volume = 15;
#else
app_var.call_volume = app_var.aec_dac_gain;
#endif
app_var.opid_play_vol_sync = default_volume * 127 / audio_cfg.max_sys_vol;
log_info("max vol:%d default vol:%d tone vol:%d", audio_cfg.max_sys_vol, default_volume, audio_cfg.tone_vol);
}
#if (USE_CONFIG_CHARGE_SETTING) && (TCFG_CHARGE_ENABLE)
/* g_printf("app charge config:"); */
log_info("app charge config:");
CHARGE_CONFIG *charge = (CHARGE_CONFIG *)tmp;
ret = syscfg_read(CFG_CHARGE_ID, charge, sizeof(CHARGE_CONFIG));
if (ret > 0) {
log_info_hexdump(charge, sizeof(CHARGE_CONFIG));
log_info("sw:%d poweron_en:%d full_v:%d full_mA:%d charge_mA:%d",
charge->sw, charge->poweron_en, charge->full_v, charge->full_c, charge->charge_c);
memcpy((u8 *)&charge_data, (u8 *)charge, sizeof(CHARGE_CONFIG));
}
#endif
#if (USE_CONFIG_KEY_SETTING) && (TCFG_ADKEY_ENABLE || TCFG_IOKEY_ENABLE)
/* g_printf("app key config:"); */
log_info("app key config:");
KEY_OP *key_msg = (KEY_OP *)tmp;
ret = syscfg_read(CFG_KEY_MSG_ID, key_msg, sizeof(KEY_OP) * KEY_NUM_MAX);
if (ret > 0) {
log_info_hexdump(key_msg, sizeof(KEY_OP) * KEY_NUM);
memcpy(key_table, key_msg, sizeof(KEY_OP) * KEY_NUM);
}
log_info("key_msg:");
log_info_hexdump((u8 *)key_table, KEY_EVENT_MAX * KEY_NUM_MAX);
#endif
#if USE_CONFIG_LOWPOWER_V_SETTING
/* g_printf("auto low power config:"); */
log_info("auto low power config:");
AUTO_LOWPOWER_V_CONFIG auto_lowpower;
ret = syscfg_read(CFG_LOWPOWER_V_ID, &auto_lowpower, sizeof(AUTO_LOWPOWER_V_CONFIG));
if (ret > 0) {
app_var.warning_tone_v = auto_lowpower.warning_tone_v;
app_var.poweroff_tone_v = auto_lowpower.poweroff_tone_v;
}
log_info("warning_tone_v:%d poweroff_tone_v:%d", app_var.warning_tone_v, app_var.poweroff_tone_v);
#else
app_var.warning_tone_v = LOW_POWER_WARN_VAL;
app_var.poweroff_tone_v = LOW_POWER_OFF_VAL;
log_info("warning_tone_v:%d poweroff_tone_v:%d", app_var.warning_tone_v, app_var.poweroff_tone_v);
#endif
#if USE_CONFIG_AUTO_OFF_SETTING
/* g_printf("auto off time config:"); */
log_info("auto off time config:");
AUTO_OFF_TIME_CONFIG auto_off_time;
ret = syscfg_read(CFG_AUTO_OFF_TIME_ID, &auto_off_time, sizeof(AUTO_OFF_TIME_CONFIG));
if (ret > 0) {
app_var.auto_off_time = auto_off_time.auto_off_time * 60;
}
log_info("auto_off_time:%d", app_var.auto_off_time);
#else
app_var.auto_off_time = TCFG_AUTO_SHUT_DOWN_TIME;
log_info("auto_off_time:%d", app_var.auto_off_time);
#endif
/*************************************************************************/
/* CFG READ IN VM */
/*************************************************************************/
u8 mac_buf[6];
u8 mac_buf_tmp[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
u8 mac_buf_tmp2[6] = {0, 0, 0, 0, 0, 0};
#if TCFG_USER_TWS_ENABLE
int len = syscfg_read(CFG_TWS_LOCAL_ADDR, bt_cfg.tws_local_addr, 6);
if (len != 6) {
get_random_number(bt_cfg.tws_local_addr, 6);
syscfg_write(CFG_TWS_LOCAL_ADDR, bt_cfg.tws_local_addr, 6);
}
log_debug("tws_local_mac:");
log_info_hexdump(bt_cfg.tws_local_addr, sizeof(bt_cfg.tws_local_addr));
ret = syscfg_read(CFG_TWS_COMMON_ADDR, mac_buf, 6);
if (ret != 6 || !memcmp(mac_buf, mac_buf_tmp, 6))
#endif
do {
ret = syscfg_read(CFG_BT_MAC_ADDR, mac_buf, 6);
if ((ret != 6) || !memcmp(mac_buf, mac_buf_tmp, 6) || !memcmp(mac_buf, mac_buf_tmp2, 6)) {
get_random_number(mac_buf, 6);
syscfg_write(CFG_BT_MAC_ADDR, mac_buf, 6);
}
} while (0);
syscfg_read(CFG_BT_MAC_ADDR, bt_mac_addr_for_testbox, 6);
if (!memcmp(bt_mac_addr_for_testbox, mac_buf_tmp, 6)) {
get_random_number(bt_mac_addr_for_testbox, 6);
syscfg_write(CFG_BT_MAC_ADDR, bt_mac_addr_for_testbox, 6);
log_info(">>>init mac addr!!!\n");
}
log_info("mac:");
log_info_hexdump(mac_buf, sizeof(mac_buf));
memcpy(bt_cfg.mac_addr, mac_buf, 6);
#if (CONFIG_BT_MODE != BT_NORMAL)
const u8 dut_name[] = "AC693x_DUT";
const u8 dut_addr[6] = {0x12, 0x34, 0x56, 0x56, 0x34, 0x12};
memcpy(bt_cfg.edr_name, dut_name, sizeof(dut_name));
memcpy(bt_cfg.mac_addr, dut_addr, 6);
#endif
/*************************************************************************/
/* CFG READ IN isd_config.ini */
/*************************************************************************/
LRC_CONFIG lrc_cfg;
ret = syscfg_read(CFG_LRC_ID, &lrc_cfg, sizeof(LRC_CONFIG));
if (ret > 0) {
log_info("lrc cfg:");
log_info_hexdump(&lrc_cfg, sizeof(LRC_CONFIG));
lp_winsize.lrc_ws_inc = lrc_cfg.lrc_ws_inc;
lp_winsize.lrc_ws_init = lrc_cfg.lrc_ws_init;
lp_winsize.bt_osc_ws_inc = lrc_cfg.btosc_ws_inc;
lp_winsize.bt_osc_ws_init = lrc_cfg.btosc_ws_init;
lp_winsize.osc_change_mode = lrc_cfg.lrc_change_mode;
}
/* printf("%d %d %d ",lp_winsize.lrc_ws_inc,lp_winsize.lrc_ws_init,lp_winsize.osc_change_mode); */
lp_winsize_init(&lp_winsize);
}
extern void lmp_hci_write_local_name(const char *name);
int bt_modify_name(u8 *new_name)
{
u8 new_len = strlen(new_name);
if (new_len >= LOCAL_NAME_LEN) {
new_name[LOCAL_NAME_LEN - 1] = 0;
}
if (strcmp(new_name, bt_cfg.edr_name)) {
syscfg_write(CFG_BT_NAME, new_name, LOCAL_NAME_LEN);
memcpy(bt_cfg.edr_name, new_name, LOCAL_NAME_LEN);
lmp_hci_write_local_name(bt_get_local_name());
log_info("mdy_name sucess\n");
return 1;
}
return 0;
}
+32
View File
@@ -0,0 +1,32 @@
#include "system/includes.h"
#include "generic/log.h"
extern char __VERSION_BEGIN[];
extern char __VERSION_END[];
_INLINE_
int app_version_check()
{
/*lib_version_check();*/
char *version;
puts("=================Version===============\n");
for (version = __VERSION_BEGIN; version < __VERSION_END;) {
version += 4;
printf("%s\n", version);
version += strlen(version) + 1;
}
puts("=======================================\n");
/*#ifdef CONFIG_FATFS_ENBALE
VERSION_CHECK(fatfs, FATFS_VERSION);
#endif
#ifdef SDFILE_VERSION
VERSION_CHECK(sdfile, SDFILE_VERSION);
#endif*/
return 0;
}
+182
View File
@@ -0,0 +1,182 @@
#include "typedef.h"
#include "app_main.h"
#include "app_config.h"
#include "vol_sync.h"
#include "tone_player.h"
#include "app_core.h"
u8 vol_sys_tab[17] = {0, 2, 3, 4, 6, 8, 10, 11, 12, 14, 16, 18, 19, 20, 22, 23, 25};
const u8 vol_sync_tab[17] = {0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 127};
extern u8 get_max_sys_vol(void);
extern bool get_esco_busy_flag(void);
void vol_sys_tab_init(void)
{
#if BT_SUPPORT_MUSIC_VOL_SYNC
#if 1
u8 i = 0;
u8 max_vol = get_max_sys_vol();
for (i = 0; i < 17; i++) {
vol_sys_tab[i] = i * max_vol / 16;
}
#else
u8 i = 0;
u8 max_vol = get_max_sys_vol();
vol_sys_tab[0] = 0;
//最大音量<16,补最大值
if (max_vol <= 16) {
for (i = 1; i <= max_vol; i++) {
vol_sys_tab[i] = i;
}
for (; i < 17; i++) {
vol_sys_tab[i] = max_vol;
}
} else {
u8 j = max_vol - 16;
u8 k = 1;
for (i = 1; i <= max_vol; i++) {
/* g_printf("i=%d j=%d k=%d",i,j,k); */
if (i % 2) {
} else {
//忽略多余的级数
if (j > 0) {
j--;
continue;
}
}
if (k < 17) {
vol_sys_tab[k] = i;
}
k++;
}
vol_sys_tab[16] = max_vol;
}
#endif
#if 1
for (i = 0; i < 17; i++) {
g_printf("[%d]:%d ", i, vol_sys_tab[i]);
}
#endif
#endif //BT_SUPPORT_MUSIC_VOL_SYNC
}
//注册给库的回调函数,用户手机设置设备音量
void set_music_device_volume(int volume)
{
r_printf("set_music_device_volume=%d\n", volume);
#if BT_SUPPORT_MUSIC_VOL_SYNC
s16 music_volume;
#if CONFIG_BT_BACKGROUND_ENABLE
struct application *app = get_current_app();
if (app->name != "earphone") {
app_var.bt_volume = ((volume + 1) * 16) / 127;
r_printf("set_app_var.bt_volume=%d\n", app_var.bt_volume);
return;
}
#endif
//音量同步最大是127,请计数比例
if (volume > 127) {
/*log_info("vol %d invalid\n", volume);*/
#if TCFG_VOL_RESET_WHEN_NO_SUPPORT_VOL_SYNC
/*不支持音量同步的设备,默认设置到最大值,可以根据实际需要进行修改。
注意如果不是最大值,设备又没有按键可以调音量到最大,则输出也就达不到最大*/
music_volume = get_max_sys_vol();
log_i("unsupport vol_sync,reset vol:%d\n", music_volume);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, music_volume, 1);
#endif
return;
}
if (tone_get_status() || get_esco_busy_flag()) {
log_i("It's not smart to sync a2dp vol now\n");
//app_var.music_volume = vol_sys_tab[(volume + 1) / 8];
app_var.music_volume = ((volume + 1) * 16) / 127;
return;
}
#if 1
/*
*0~16,总共17级
*这里将手机的0~127的音量值换成实际的dac音量等级
*/
music_volume = ((volume + 1) * 16) / 127;
#else
music_volume = vol_sys_tab[(volume + 1) / 8];
#endif
y_printf("phone_vol:%d,dac_vol:%d", volume, music_volume);
app_var.opid_play_vol_sync = vol_sync_tab[(volume + 1) / 8];
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, music_volume, 1);
#endif
}
//注册给库的回调函数,用于手机获取当前设备音量
int phone_get_device_vol(void)
{
//音量同步最大是127,请计数比例
#if 0
return (app_var.sys_vol_l * get_max_sys_vol() / 127) ;
#else
return app_var.opid_play_vol_sync;
#endif
}
void opid_play_vol_sync_fun(u8 *vol, u8 mode)
{
#if BT_SUPPORT_MUSIC_VOL_SYNC
u8 i = 0;
vol_sys_tab[16] = get_max_sys_vol();
if (*vol == 0) {
if (mode) {
*vol = vol_sys_tab[1];
app_var.opid_play_vol_sync = vol_sync_tab[1];
} else {
*vol = vol_sys_tab[0];
app_var.opid_play_vol_sync = vol_sync_tab[0];
}
} else if (*vol >= get_max_sys_vol()) {
if (mode) {
*vol = vol_sys_tab[16];
app_var.opid_play_vol_sync = vol_sync_tab[16];
} else {
*vol = vol_sys_tab[15];
app_var.opid_play_vol_sync = vol_sync_tab[15];
}
} else {
for (i = 0; i < sizeof(vol_sys_tab); i++) {
if (*vol == vol_sys_tab[i]) {
if (mode) {
app_var.opid_play_vol_sync = vol_sync_tab[i + 1];
*vol = vol_sys_tab[i + 1];
} else {
app_var.opid_play_vol_sync = vol_sync_tab[i - 1];
*vol = vol_sys_tab[i - 1];
}
break;
} else if (*vol < vol_sys_tab[i]) {
if (mode) {
*vol = vol_sys_tab[i + 1];
app_var.opid_play_vol_sync = vol_sync_tab[i];
} else {
*vol = vol_sys_tab[i - 1];
app_var.opid_play_vol_sync = vol_sync_tab[i - 1];
}
break;
}
}
}
#endif
}