备份,已实现命令配置,配置保存。从后台下发配置目前没实现
authorp15692025051 <846603105@qq.com>
Fri, 30 May 2025 04:06:24 +0000 (12:06 +0800)
committerp15692025051 <846603105@qq.com>
Fri, 30 May 2025 04:06:24 +0000 (12:06 +0800)
24 files changed:
2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.c
2.code/aicos/app/AI_AMP_2_5/AI_AMP_2_5.h
2.code/aicos/app/AI_AMP_2_5/CMakeLists.txt
2.code/aicos/app/AI_AMP_2_5/bk_key.c
2.code/aicos/app/AI_AMP_2_5/bk_websocket.c
2.code/aicos/app/AI_AMP_2_5/dev_authentication.c
2.code/aicos/app/AI_AMP_2_5/imsl_vad.h [new file with mode: 0644]
2.code/aicos/app/AI_AMP_2_5/libimslvad.a [new file with mode: 0644]
2.code/aicos/app/AI_AMP_2_5/stream_play.c
2.code/aicos/app/util/audio/app_audio.c
2.code/aicos/components/at/src/aic_at_interact_cp.c
2.code/aicos/drivers/sound/Kconfig
2.code/aicos/drivers/sound/driver/codec/es8311.c
2.code/aicos/drivers/sound/driver/stream/snd_stream_pcm.c
2.code/aicos/mm/audio/audio_sink_stream.c
2.code/aicos/mm/audio/vendor/voiceproc/lib/libvoiceproc.a
2.code/aicos/mm/audio/vendor/voiceproc/lib_ext/libvoiceproc.a
2.code/aicos/projects/banyan/ap/common_inc/audio/snd_config.h
2.code/aicos/projects/banyan/ap/common_inc/gp202_pmu_units.h
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/connmgr_cfg.h
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/kpc_cfg.c
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/config/pin_cfg.h
2.code/aicos/projects/banyan/ap/gx306l_h3_d_sms_aichat/default_config
2.code/aicos/projects/banyan/nvram/ap/gx306l_h3/native/bin/VOIP_SPK_Mode.bin

index 91f1a95..bb20303 100644 (file)
@@ -1,6 +1,7 @@
 
 
 #define AIC_THIS_FILE    0x888888
+#define SUPPORT_OPUS 1
 #include <aic_errno.h>
 #include <aic_init.h>
 #include <aic_osa_ex.h>
 #include <serial_inc.h>
 #include "aic_osa.h"
 #include "app_audio.h"
-#include "helios_ringbuf.h"
+#include "bk_ringbuf.h"
 #include "bk_websocket.h"
 #include "AI_AMP_2_5.h"
 #include "bk_key.h"
+#include "aic_srv_tele_sim.h"
+#include <gpio_inc.h>
+#if SUPPORT_OPUS 
 #include "opus/guixin/opus_interface.h"
+#endif
 #include "dev_authentication.h"
+#include "imsl_vad.h"
+#include "aic_srv_tele_ex.h"
+#include "power_supply.h"
+#include "sysoff.h"
 // #include "opus/include/opus.h"
-char dev_imei[20] = {0};
+u8 current_card_id = 0;
+u8 Close_flag = 0;
 typedef enum
 {
     inbound_attributes_format_PCM,
     inbound_attributes_format_OPUS,
 }inbound_attributes_format_type;
 inbound_attributes_format_type inbound_attributes_format = inbound_attributes_format_PCM;
+AI_AMP_2_5_cfg vc_cfg;
+volatile char app_audio_flag = 0;
+volatile char audio_stop_flag = 0;
+int32_t bk_audio_start_callback(void *p_param, uint32_t size);
+#define VAD_RB_LEN 16*1024
+bk_ring_buf_t *VAD_rb_data = NULL;
+int VAD_status = 0;//VAD状态
 char VC_mode = 0;//0:短按连续问答模式 1:长按录音模式
 #define ai_VC_task_priority 35
 static aos_thread_id AI_AMP_task_id = 0;
@@ -34,13 +51,25 @@ static aos_queue_ptr AI_AMP_task_queue = NULL;
 static u32 AI_VC_client_websocket_handle = 0;
 static u32* ai_uart_handle;
 static aos_thread_id AI_VC_send_task_id = 0;
+char AI_VC_send_task_flag = 0;
 static aos_thread_id AI_VC_read_task_id = 0;
+volatile char AI_VC_read_task_flag = 0;
 static aos_queue_ptr AI_VC_send_queue = NULL;
 static aos_thread_id AI_VC_play_task_id = 0;
+volatile char AI_VC_play_task_flag = 0;
 static aos_queue_ptr AI_VC_play_queue = NULL;
-static char VC_Play_flag = 0;
+volatile static char VC_Play_flag = 0;
+//volatile static char AI_VC_play_queue_lock = 0;
 static aos_thread_id AI_VC_record_task_id = 0;
+volatile char AI_VC_record_task_flag = 0;
 static aos_queue_ptr AI_VC_record_tmp_queue = NULL;
+
+static void AI_VC_send_task(void *thread_input);//websocket 发送线程
+static void AI_VC_read_task(void *thread_input);//websocket 读线程
+static void AI_VC_play_task(void *thread_input);//音频播放线程
+static void AI_VC_record_task(void *thread_input);//录音线程
+static void AI_client_VC_synthesis(char *str);
+static void AI_VC_put_record_data(char *data,u32 len);
 WebSocketClient *AI_client_VC = NULL;
 static u32 close_timerout = 0;
 static u32 VC_pingping_timerout = 0;
@@ -55,8 +84,7 @@ static struct opus_dec_init_param  *opus_decoder_h = NULL;
 static void AI_VC_send_satrt(void);
 static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE);
 VC_state_type VC_state = VC_State_None;
-static void AI_VC_send_task(void *thread_input);//websocket 发送线程
-static void AI_VC_read_task(void *thread_input);//websocket 读线程
+
 static void AI_VC_put_play_data(char *data,u32 len);//音频数据入队播放
 //关闭录音
 void VC_record_End(void);
@@ -68,45 +96,6 @@ static int websocket_connect_VC(void);
 static void websocket_deconnect_VC(void);
 #include <stdio.h>
 #include <stdlib.h>
-
-#define SCALE_FACTOR 10000  // 用于缩放的因子
-// 高级声学回声消除算法(基于NLMS),不使用浮点运算
-void aec(short *input_signal, short *reference_signal, short *output_signal, int num_samples, int filter_length) {
-    int *filter_weights = (int *)calloc(filter_length, sizeof(int));
-    if (filter_weights == NULL) {
-        fprintf(stderr, "内存分配失败\n");
-        return;
-    }
-
-    int mu = 5000; // 步长因子,相当于浮点的0.5 * SCALE_FACTOR
-    int delta = 1; // 正则化参数,避免分母为零
-
-    for (int n = filter_length; n < num_samples; n++) {
-        int echo_estimate = 0;
-        // 计算估计的回声
-        for (int i = 0; i < filter_length; i++) {
-            echo_estimate += filter_weights[i] * reference_signal[n - i - 1];
-        }
-        echo_estimate /= SCALE_FACTOR;
-
-        // 计算误差信号(消除回声后的信号)
-        output_signal[n] = input_signal[n] - (echo_estimate);
-
-        // 计算参考信号的能量
-        int energy = 0;
-        for (int i = 0; i < filter_length; i++) {
-            energy += reference_signal[n - i - 1] * reference_signal[n - i - 1];
-        }
-
-        // 使用NLMS算法更新滤波器权重
-        int step = (mu * SCALE_FACTOR) / (energy + delta);
-        for (int i = 0; i < filter_length; i++) {
-            filter_weights[i] += (step * output_signal[n] * reference_signal[n - i - 1]) / SCALE_FACTOR;
-        }
-    }
-
-    free(filter_weights);
-}
 int play_data_len = 0;
 //关闭音频播放
 void VC_Play_End(void);
@@ -116,13 +105,13 @@ int bk_get_imei(char *imei)
 {
     if(imei == NULL)
         return -1;
-    strcpy(imei,dev_imei);
+    strcpy(imei,vc_cfg.dev_imei);
     return 0;
 }
 int bk_printf(const char *format, ...)
 {
     int ret=0;
-    int bk_printf_count = 3*2048;
+    int bk_printf_count = 10*1024;
        va_list args;
        char *out = NULL;
     out = aic_zalloc(bk_printf_count);
@@ -183,6 +172,288 @@ void bk_print_hex(u8 *data,int data_len)
     }
     uart_write(ai_uart_handle,"\r\n", 2);
 }
+int save_VC_cfg(void)
+{
+    FILE *fp = NULL;
+    char *vc_cfg_tmp = aic_malloc(sizeof(vc_cfg));
+    if(!vc_cfg_tmp)
+    {
+        bk_printf("save_VC_cfg malloc error");
+        return -1;
+    }
+    bk_printf("save_VC_cfg !");
+   
+    int count_t = 5;
+    int read_tmp = 0;
+    int write_len = 1;
+    while (count_t--)
+    {
+        fp = fopen("C:/VC_cfg.bin","w+");
+        write_len = fwrite(&vc_cfg,1,sizeof(vc_cfg),fp);
+        fclose(fp);
+        fp = fopen("C:/VC_cfg.bin","r");
+        read_tmp  = fread(vc_cfg_tmp,1,sizeof(vc_cfg),fp);
+        fclose(fp);
+        if(memcmp(vc_cfg_tmp,&vc_cfg,sizeof(vc_cfg))==0)
+            break;
+        bk_printf("save_VC_cfg 保存出错了!write_len:%d,read_tmp:%d",write_len,read_tmp);
+    }
+        
+    
+    
+    aic_free(vc_cfg_tmp);
+    return 0;
+}
+void reset_VC_cfg(void)
+{
+    vc_cfg.start_flag = 0xaaaa;
+    vc_cfg.end_flag = 0xaaaa;
+    vc_cfg.dev_type = DEV_FX1_H;//产品
+    //vc_cfg.dev_type = DEV_ADS;//奥德赛
+    //strcpy(vc_cfg.server_ip,"amp.raisound.com");//服务器地址
+    strcpy(vc_cfg.server_ip,"115.190.94.208:22080");//服务器地址
+    vc_cfg.VC_mode =0;//对话模式
+    strcpy(vc_cfg.power_on_tone,"你好,请问您有什么需要我帮忙的吗?");//开机提示词
+    vc_cfg.VC_record_TYPE = VC_record_TYPE_PCM;//录音格式
+    vc_cfg.VC_play_TYPE = VC_play_TYPE_PCM;//播放格式
+    vc_cfg.VC_record_samplerate = 16000;//录音采样率
+    vc_cfg.VC_play_samplerate = 16000;//播放采样率
+    vc_cfg.is_VAD = 1;//=1打开vad打断
+    vc_cfg.speech_rate = 0;//语速配置
+    vc_cfg.vad_silence = 200;//vad断句时间 ms
+    vc_cfg.VC_TTS_volume = 50;//音量
+}
+int init_VC_cfg(void)
+{
+    FILE *fp = NULL;
+    fp = fopen("C:/VC_cfg.bin","r");
+    bk_printf("init_VC_cfg:fp:%p",fp);
+    //reset_VC_cfg();
+    if(fp)
+    {
+        int fread_len ;
+        fread_len = fread(&vc_cfg,1,sizeof(vc_cfg),fp);
+        bk_printf("init_VC_cfg:fread_len:%d,start_flag:0x%x,end_flag:0x%x",fread_len,vc_cfg.start_flag,vc_cfg.end_flag);
+        if(vc_cfg.start_flag == 0xaaaa && vc_cfg.end_flag == 0xaaaa)//已经有数据
+        {
+            bk_printf("init_VC_cfg:获取配置正常。vc_cfg.VC_TTS_volume:%d",vc_cfg.VC_TTS_volume);
+        }else if(vc_cfg.start_flag == 0xaaaa && vc_cfg.end_flag != 0xaaaa)//结构体新增参数
+        {
+
+        }else //if(vc_cfg.start_flag != 0xaaaa && vc_cfg.end_flag != 0xaaaa)//m没有配置,要初始化配置
+        {
+            bk_printf("init_VC_cfg:没有配置");
+            reset_VC_cfg();
+        }
+        fclose(fp);
+    }
+    return 0;
+}
+
+int check_text(char *text,int ret_str_len)
+{
+    //bk_printf("check_text:text:%s",text);
+    if(ret_str_len >60)
+        return -1;
+    int ret = -1;
+    unsigned char is_save_VC_cfg = 0;
+    char tmp_data[70] = {0};
+    int tmp_data_len = 0;
+    if(strstr(text,"声音改"))
+    {
+        if(strstr(text,"男"))
+        {
+
+        }
+    }
+    if(strstr(text,"音量"))
+    {
+        if(strstr(text,"加")||(strstr(text,"大")&&!strstr(text,"太")) || (strstr(text,"太小")))
+        {
+            vc_cfg.VC_TTS_volume +=10;
+            if(vc_cfg.VC_TTS_volume > 100)
+            {
+                vc_cfg.VC_TTS_volume = 100;
+                AI_AMP_MSG_put("音量已最大。",strlen("音量已最大。"),VC_TTS_PLAY);
+                //AI_TTS_str
+            }else{
+
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前音量%d。",vc_cfg.VC_TTS_volume);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"减")||(strstr(text,"小")&&!strstr(text,"太")) || (strstr(text,"太大")))
+        {
+            vc_cfg.VC_TTS_volume -=10;
+            if(vc_cfg.VC_TTS_volume < 0)
+            {
+                vc_cfg.VC_TTS_volume = 0;
+                AI_AMP_MSG_put("音量已最小。",strlen("音量已最小。"),VC_TTS_PLAY);
+                //AI_TTS_str
+            }else{
+
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前音量%d。",vc_cfg.VC_TTS_volume);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }
+    }
+    if(strstr(text,"查询"))
+    {
+        if(strstr(text,"信号"))
+        {
+            
+            ts_radio_signal_info_t p_signal_info;
+            int32_t ret = 0;
+
+            ret = aic_srv_tele_radio_get_signal_info_sync(current_card_id, &p_signal_info);
+            bk_printf("信号查询:current_card_id = %d,signal_level = %d, signal_level_val = %d, signal_strength= %d.", current_card_id,
+            p_signal_info.signal_level, p_signal_info.signal_level_val, p_signal_info.signal_strength);
+            tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前信号%ld。",p_signal_info.signal_level_val);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"电量"))
+        {
+            struct psy_info psy_info;
+            get_psy_info(&psy_info);
+
+            bk_printf("电量查询:psy_name:%s bat_vol:%d bat_cap:%d chg_status%d chg_type:%d bat_min_voltage:%d bat_max_voltage:%d\n",
+
+                    psy_info.psy_name,
+                    psy_info.bat_current_voltage,
+                    psy_info.bat_capacity,
+                    psy_info.bat_chg_status,
+                    psy_info.bat_chg_type,
+                    psy_info.bat_min_voltage,
+                    psy_info.bat_max_voltage);
+            tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前电量为百分之%d。",psy_info.bat_capacity);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);        
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"设备号"))
+        {
+            tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前设备号为:%s。",vc_cfg.dev_imei);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);   
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"卡号"))
+        {
+            tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前卡号为:%s。",vc_cfg.ICCID);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);   
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"版本号"))
+        {
+            if(vc_cfg.dev_type == DEV_ADS)
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前版本号为:%s_%s。","ADS_",BK_VERSION);
+            else
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"当前版本号为:%s。",BK_VERSION);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            ret = 0;
+            goto RET;   
+        }else if(strstr(text,"服务器地址"))
+        {
+            tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"服务器地址:%s。",vc_cfg.server_ip);
+            AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            ret = 0;
+            goto RET;   
+        }
+    }
+    if(strstr(text,"说话") || strstr(text,"讲话")|| strstr(text,"语速") )
+    {
+        if(strstr(text,"太慢") || strstr(text,"快点") ||  strstr(text,"快一点"))
+        {
+            vc_cfg.speech_rate +=10;
+            if(vc_cfg.speech_rate >50)
+            {
+                vc_cfg.speech_rate = 50;
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"语速已经是最快了。");
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }else
+            {
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"明白,语速已经调快了,当前语速是%d。",vc_cfg.speech_rate);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }else if(strstr(text,"太快") || strstr(text,"慢点") ||  strstr(text,"慢一点"))
+        {
+            vc_cfg.speech_rate -=10;
+            if(vc_cfg.speech_rate  < -50)
+            {
+                vc_cfg.speech_rate = -50;
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"语速已经是最慢了。");
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }else
+            {
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"明白,语速已经调慢了,当前语速是%d。",vc_cfg.speech_rate);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }
+    }
+    if(ret_str_len<20 && (strstr(text,"聆听") || strstr(text,"明天") ))
+    {
+        if(strstr(text,"慢") && !strstr(text,"太"))
+        {
+            vc_cfg.vad_silence += 200;
+            if(vc_cfg.vad_silence>2000)
+            {
+                vc_cfg.vad_silence = 2000;
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"已经是最慢了。");
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }else
+            {
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前语音断句速度是%d毫秒。",vc_cfg.vad_silence);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }
+        if(strstr(text,"快") && !strstr(text,"太"))
+        {
+            vc_cfg.vad_silence -= 200;
+            if(vc_cfg.vad_silence < 100)
+            {
+                vc_cfg.vad_silence = 100;
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"已经是最快了。");
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }else
+            {
+                tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"配置成功,当前语音断句速度是%d毫秒。",vc_cfg.vad_silence);
+                AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY);
+            }
+            is_save_VC_cfg = 1;
+            ret = 0;
+            goto RET;
+        }
+    }
+    if(ret_str_len<16 && (strstr(text,"再见") || strstr(text,"拜拜") || strstr(text,"关闭对话")))
+    {
+        tmp_data_len = snprintf(tmp_data,sizeof(tmp_data),"再见了,我会想你的。");
+        AI_AMP_MSG_put(tmp_data,tmp_data_len,VC_TTS_PLAY_CLOSE);
+
+    }
+    if(ret_str_len<16 && (strstr(text,"关机") ))
+    {
+        AI_AMP_MSG_put(tmp_data,tmp_data_len,POWER_OFF);
+    }
+RET:
+    if(is_save_VC_cfg == 1)
+        save_VC_cfg();
+    return ret;
+}
 //发送tts播放接口
 static void AI_client_VC_synthesis(char *str)
 {
@@ -219,7 +490,7 @@ static void AI_client_VC_synthesis(char *str)
     }
     AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
     // 输出 JSON 字符串
-    bk_printf("%s\n", json_str);
+    //bk_printf("%s\n", json_str);
 
     // 释放内存
     free(json_str);
@@ -234,12 +505,17 @@ static void AI_VC_send_satrt(void)
 
     // 创建 payload 对象
     cJSON *payload = cJSON_CreateObject();
-    cJSON_AddStringToObject(payload, "device_id", "12569874564165");
+    cJSON_AddStringToObject(payload, "device_id", vc_cfg.dev_imei);
     cJSON_AddStringToObject(payload, "user_agent", "AudioClient/1.0");
 
     // 创建 dialog_attributes 对象
     cJSON *dialog_attributes = cJSON_CreateObject();
-    cJSON_AddStringToObject(dialog_attributes, "provider", "coze");
+    if(vc_cfg.dev_type == DEV_ADS)
+    {
+        cJSON_AddStringToObject(dialog_attributes, "provider", "ads_coze");
+    }else
+        cJSON_AddStringToObject(dialog_attributes, "provider", "coze");
+    
 
     // 创建 dialog_attributes 下的 cfg 对象
     cJSON *dialog_cfg = cJSON_CreateObject();
@@ -247,7 +523,7 @@ static void AI_VC_send_satrt(void)
 
     // 创建 custom_variables 对象
     cJSON *custom_variables = cJSON_CreateObject();
-    cJSON_AddStringToObject(custom_variables, "name", "小瑞");
+    cJSON_AddStringToObject(custom_variables, "name", "食梦貘");
     cJSON_AddItemToObject(dialog_cfg, "custom_variables", custom_variables);
 
     // 创建 greeting 对象
@@ -258,9 +534,24 @@ static void AI_VC_send_satrt(void)
 
     // 创建 bot_option 对象
     cJSON *bot_option = cJSON_CreateObject();
-    cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
-    cJSON_AddStringToObject(bot_option, "bot_id", "7486697248416989193");
-    cJSON_AddStringToObject(bot_option, "workflow_id", "7486698347416649778");
+    // cJSON_AddBoolToObject(bot_option, "use_workflow", 1);//小瑞
+    // cJSON_AddStringToObject(bot_option, "bot_id", "7486697248416989193");
+    // cJSON_AddStringToObject(bot_option, "workflow_id", "7486698347416649778");
+    // cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
+    // cJSON_AddStringToObject(bot_option, "bot_id", "7491256313561825332");//食梦貘
+    // cJSON_AddStringToObject(bot_option, "workflow_id", "7508598451564150820");
+    if(vc_cfg.dev_type == DEV_ADS)
+    {
+        cJSON_AddBoolToObject(bot_option, "use_workflow", 0);//奥德赛
+        cJSON_AddStringToObject(bot_option, "bot_id", "7507478798502625295");//奥德赛
+        cJSON_AddStringToObject(bot_option, "workflow_id", "");
+        
+    }else
+    {
+        cJSON_AddBoolToObject(bot_option, "use_workflow", 1);
+        cJSON_AddStringToObject(bot_option, "bot_id", "7491256313561825332");//食梦貘
+        cJSON_AddStringToObject(bot_option, "workflow_id", "7508598451564150820");
+    }
     cJSON_AddItemToObject(dialog_cfg, "bot_option", bot_option);
 
     cJSON_AddItemToObject(dialog_attributes, "cfg", dialog_cfg);
@@ -277,21 +568,27 @@ static void AI_VC_send_satrt(void)
     cJSON_AddNumberToObject(outbound_cfg, "bit_rate", 16);
     cJSON_AddNumberToObject(outbound_cfg, "channel", 1);
     cJSON_AddNumberToObject(outbound_cfg, "volume", 100);
-    cJSON_AddNumberToObject(outbound_cfg, "speech_rate", 0);
-    cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 50);
-    cJSON_AddStringToObject(outbound_cfg, "voice", "7426720361733013513");
-    cJSON_AddStringToObject(outbound_cfg, "voice", "ICL_zh_female_huoponvhai_tob");
+    cJSON_AddNumberToObject(outbound_cfg, "speech_rate", vc_cfg.speech_rate);
+    cJSON_AddNumberToObject(outbound_cfg, "chunk_interval_ms", 20);
+    //cJSON_AddStringToObject(outbound_cfg, "voice", "7426720361733013513");
+    //cJSON_AddStringToObject(outbound_cfg, "voice", "ICL_zh_female_huoponvhai_tob");
+    if(vc_cfg.dev_type == DEV_ADS)
+        cJSON_AddStringToObject(outbound_cfg, "voice", "zh_female_mengyatou_mars_bigtts");
+    else
+        cJSON_AddStringToObject(outbound_cfg, "voice", "zh_female_meituojieer_moon_bigtts");
+    
+    
     cJSON_AddItemToObject(outbound_attributes, "cfg", outbound_cfg);
     cJSON_AddItemToObject(payload, "outbound_attributes", outbound_attributes);
 
     // 创建 inbound_attributes 对象
     cJSON *inbound_attributes = cJSON_CreateObject();
     cJSON_AddStringToObject(inbound_attributes, "provider", "volcengine");
-    if(VC_mode == 0)//连续对话模式
+    if(VC_mode == 0 && vc_cfg.is_VAD == 0)//连续对话模式
         cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 0);
     else
         cJSON_AddBoolToObject(inbound_attributes, "disable_vad", 1);
-    cJSON_AddNumberToObject(inbound_attributes, "vad_silence", 500);
+    cJSON_AddNumberToObject(inbound_attributes, "vad_silence", vc_cfg.vad_silence);
 
     // 创建 interrupt_options 对象
     cJSON *interrupt_options = cJSON_CreateObject();
@@ -333,7 +630,7 @@ static void AI_VC_send_satrt(void)
     char *json_str = cJSON_Print(root);
     if (json_str) {
         //remove_whitespace(json_str);
-        bk_printf("json_str:%s",json_str);
+        //bk_printf("json_str:%s",json_str);
 
         AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
 
@@ -346,6 +643,7 @@ static void AI_VC_send_satrt(void)
 //Audio.Create 开始发送音频
 static void AI_VC_send_audio_create(void)
 {
+    VC_state = VC_State_SpeechStart;//开始说
     // 创建根对象
     cJSON *root = cJSON_CreateObject();
     if (root == NULL) {
@@ -383,6 +681,7 @@ static void AI_VC_send_audio_create(void)
 //Audio.Completed 结束发送音频
 static void AI_VC_send_audio_completed(void)
 {
+    VC_state = VC_State_SpeechEnd;//说结束
     // 创建根对象
     cJSON *root = cJSON_CreateObject();
     if (root == NULL) {
@@ -415,10 +714,52 @@ static void AI_VC_send_audio_completed(void)
     free(json_str);
     cJSON_Delete(root);
 }
+//打断
+static void AI_VC_send_cancel(void)
+{
+    // 创建根对象
+    cJSON *root = cJSON_CreateObject();
+    if (root == NULL) {
+        bk_printf("Failed to create root object.\n");
+        return ;
+    }
+
+    // 设置 "event" 字段
+    cJSON_AddStringToObject(root, "event", "cancel");
+
+    // 创建 "payload" 对象
+    cJSON *payload = cJSON_CreateObject();
+    if (payload == NULL) {
+        bk_printf("Failed to create payload object.\n");
+        cJSON_Delete(root);
+        return ;
+    }
+    // 将 "payload" 对象添加到根对象中
+    cJSON_AddItemToObject(root, "payload", payload);
+
+    // 将 JSON 对象转换为字符串
+    char *json_str = cJSON_Print(root);
+    if (json_str == NULL) {
+        bk_printf("Failed to print JSON object.\n");
+        cJSON_Delete(root);
+        
+    }
+    AI_VC_send_data(json_str,strlen(json_str),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
+    
+
+    // 释放内存
+    free(json_str);
+    cJSON_Delete(root);
+}
 //TTS播放
 static void VC_TTS_Play(const char *str)
 {
     bk_printf("VC_TTS_Play:%s",str);
+    if(AI_TTS_str)
+    {
+        aic_free(AI_TTS_str);
+        AI_TTS_str = NULL;
+    }
     AI_TTS_str = aic_zalloc(strlen(str)+1);
     strcpy(AI_TTS_str,str);
     //VC_record_End();
@@ -426,151 +767,38 @@ static void VC_TTS_Play(const char *str)
     websocket_deconnect_VC();
     AI_VC_start();
 }
-
 //pinpin发送
 void AI_VC_send_ping_ping(void)
 {
     AI_VC_send_data("ping",strlen("ping"),AIC_WEBSOCKET_OPCODE_TEXT_FRAME);//发送数据
 }
-//连接websocket
-static int websocket_connect_VC(void)
-{
-    //连接服务器
-    if(AI_client_VC == NULL)
-    {
-        //AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/coze?is_auth=0",NULL);
-        AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/chat?is_auth=0",NULL);
-    }
-    //创建发送线程
-    if(AI_VC_send_task_id == 0)
-    {
-        AI_VC_send_task_id = aos_create_thread(
-            "AI_VC_send",
-            AI_VC_send_task,
-            &AI_VC_send_task_id,
-            1024*16,
-            0,
-            NULL,
-            ai_VC_task_priority,
-            AOS_AUTO_START);
-    }
-    //创建发送队列
-    if(AI_VC_send_queue == NULL)
-    {
-        AI_VC_send_queue = aos_create_queue("AI_VC_send_queue",
-            sizeof(AI_VC_send_queue_t),
-            200);
-    }
-    //创建读线程
-    if(AI_VC_read_task_id == 0)
-    {
-        AI_VC_read_task_id = aos_create_thread(
-            "AI_VC_read",
-            AI_VC_read_task,
-            &AI_VC_read_task_id,
-            4096u,
-            0,
-            NULL,
-            ai_VC_task_priority,
-            AOS_AUTO_START);
-    }
-    return 0;
-    
-}
-static void websocket_deconnect_VC(void)
+
+
+u16 opus_remain_buf[640];
+u32 opus_remain_size = 0;
+static void AI_VC_send_task(void *thread_input)//websocket 发送线程
 {
-    bk_printf("websocket_deconnect_VC!!!!!!!!!!!!");
-    // if(AI_VC_client_websocket_handle)//断开服务器
-    // {
-    //     aic_websocket_disconnect(AI_VC_client_websocket_handle,5000);
-    //     aic_websocket_delete(AI_VC_client_websocket_handle,5000);
-    //     AI_VC_client_websocket_handle = 0;
-    // }
-    
-    //销毁发送线程
-    if(AI_VC_send_task_id != 0)
-    {
-        aos_delete_thread(AI_VC_send_task_id);
-        AI_VC_send_task_id = 0;
-    }
-    //销毁发送队列
-    if(AI_VC_send_queue != NULL)
+    AI_VC_send_queue_t AI_VC_send_queue_data;
+    bk_printf("AI_VC_send_task go......");
+    int ret = 0;
+    AI_VC_send_task_flag = 1;
+    while(1)
     {
-        char count_t= 200;
-        AI_VC_send_queue_t AI_VC_send_queue_data_t;
-        while(count_t--)//清空队列数据
+        if(AI_VC_send_task_flag == 2)//要退出了
+            break;
+
+        if(AI_VC_send_queue && aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT) == AOS_SUCCESS)
         {
-            if(aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data_t,AOS_NO_WAIT) == AOS_SUCCESS)
+            
+            if(AI_client_VC && AI_VC_send_queue_data.data)
             {
-                if(AI_VC_send_queue_data_t.data)
-                    aic_free(AI_VC_send_queue_data_t.data);
-            }
-            else{
-                break;
-            }
-        }
-        aos_delete_queue(AI_VC_send_queue); 
-        AI_VC_send_queue = NULL;
-    }
-    //销毁读线程
-    if(AI_VC_read_task_id != 0)
-    {
-        aos_delete_thread(AI_VC_read_task_id);
-        AI_VC_read_task_id = 0;
-    }
-    if(AI_client_VC)
-    {
-        close_websocket_client(AI_client_VC);
-        AI_client_VC = NULL;
-    }
-    
-}
-//websocket 发送数据,AIC_WEBSOCKET_OPCODE = AIC_WEBSOCKET_OPCODE_TEXT_FRAME发送字符串,
-//AIC_WEBSOCKET_OPCODE =AIC_WEBSOCKET_OPCODE_BINARY_FRAME发送二进制
-static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE)
-{
-    if(AI_VC_send_queue == NULL)
-        return AOS_ERROR;
-    AI_VC_send_queue_t AI_VC_send_queue_data;
-    AI_VC_send_queue_data.data = aic_malloc(len+1);
-    memset(AI_VC_send_queue_data.data ,0,len+1);
-    if(!AI_VC_send_queue_data.data)
-    {
-        bk_printf("AI_VC_send_data aic_malloc ERROR!!!!!!!!!!");
-        return AOS_ERROR;
-    }
-    memcpy(AI_VC_send_queue_data.data,data,len);
-    AI_VC_send_queue_data.len=len;
-    AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE=AIC_WEBSOCKET_OPCODE;
-    if(AI_VC_send_queue && AOS_SUCCESS!=aos_send_to_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT))
-    {
-       
-        aic_free(AI_VC_send_queue_data.data);
-        return AOS_ERROR;
-    }
-    
-    return AOS_SUCCESS;
-}
-u16 opus_remain_buf[640];
-u32 opus_remain_size = 0;
-static void AI_VC_send_task(void *thread_input)//websocket 发送线程
-{
-    AI_VC_send_queue_t AI_VC_send_queue_data;
-    bk_printf("AI_VC_send_task go......");
-    int ret = 0;
-    while(1)
-    {
-        if(AI_VC_send_queue && aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_WAIT_FOREVER) == AOS_SUCCESS)
-        {
-            
-            if(AI_client_VC && AI_VC_send_queue_data.data)
-            {
-                VC_pingping_timerout = 5;
+                VC_pingping_timerout = 4;
                 if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME &&inbound_attributes_format == inbound_attributes_format_OPUS)
                 {
+                    #if SUPPORT_OPUS 
                     u8 *opus_data =aic_zalloc(AI_VC_send_queue_data.len); 
                     u8 *pcm_data =aic_zalloc(opus_remain_size+AI_VC_send_queue_data.len); 
-                    struct opus_dec_param dec_inparam;
+                    //struct opus_dec_param dec_inparam;
                     struct opus_enc_param enc_inparam;
                     u32 opus_count = 0;
                     u32 pcm_count = 0;
@@ -583,6 +811,7 @@ static void AI_VC_send_task(void *thread_input)//websocket 发送线程
                     opus_remain_size = 0;
                     if(opus_data)
                     {
+
                         enc_inparam.input = (int16_t*)(pcm_data);//PCM数据
                         enc_inparam.input_size = pcm_count;
                         enc_inparam.output = (int8_t*)opus_data;
@@ -619,17 +848,18 @@ static void AI_VC_send_task(void *thread_input)//websocket 发送线程
                         // ret = aic_opus_decode(&dec_inparam);
                         // audio_data(pcm_data,dec_inparam.outputfrms_size,25);
                         ////aos_sleep(10);
-                        //bk_printf("OPUS:inputfrm_count:%d,opus_remain_size:%d,pcm_len:%d,dec_pcm_len:%d,opus_count:%d",\
+                        //bk_printf("OPUS:inputfrm_count:%d,opus_remain_size:%d,pcm_len:%d,dec_pcm_len:%d,opus_count:%d",
                         //    dec_inparam.inputfrm_count,opus_remain_size,AI_VC_send_queue_data.len,dec_inparam.outputfrms_size,opus_count);
                         if(opus_data)
                             aic_free(opus_data);
                         if(pcm_data)
                             aic_free(pcm_data);
+                       
                     }else
                     {
                         bk_printf("opus alloc ERROR!!!!!!!!!!!");
                     }
-                    
+                    #endif
                 }else//正常pcm
                 {
                     ret = send_websocket_message(AI_client_VC,AI_VC_send_queue_data.data,AI_VC_send_queue_data.len,
@@ -637,39 +867,60 @@ static void AI_VC_send_task(void *thread_input)//websocket 发送线程
                 }
                 
                 if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_TEXT_FRAME )
-                    bk_printf("VCVC:send ret=%d,len=%d,str=%s",ret,AI_VC_send_queue_data.len,AI_VC_send_queue_data.data);
-                // else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
-                //     bk_printf("VCVC:send ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
+                    bk_printf("send ret=%d,len=%d,str=%s",ret,AI_VC_send_queue_data.len,AI_VC_send_queue_data.data);
+                else if(AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE ==AIC_WEBSOCKET_OPCODE_BINARY_FRAME )
+                {
+                    audio_data(AI_VC_send_queue_data.data,AI_VC_send_queue_data.len,21);
+                    bk_printf("send ret=%d,len=%d",ret,AI_VC_send_queue_data.len);
+                }
+                    
                 aic_free(AI_VC_send_queue_data.data);
             }else
             {
                 bk_printf("AI_VC_send ERROR:close_websocket_client = %d",AI_client_VC);
+                break;
             }
+            
         }else
         {
             aos_sleep(1);
         }
     }
-    
+    bk_printf("AI_VC_send_task exit......");
+    AI_VC_send_task_flag = 3;
 }
-static u8 recv_buff[20*1024];
+
+
+#define recv_buff_mxa_len  20*1024
 static void AI_VC_read_task(void *thread_input)//websocket 读线程
 {
-
     int status;
+    static u8 *recv_buff = NULL;
     
+    if(recv_buff == NULL)
+    {
+        recv_buff = aic_malloc(recv_buff_mxa_len);
+    }
+    if(recv_buff == NULL)
+    {
+        bk_printf("AI_VC_read_task aic_malloc ERROR!!!!!!!!!!!!!!!!!!......");
+        return;
+    }
     WebSocketMessageType code;
     bk_printf("AI_VC_read_task go......");
+    AI_VC_read_task_flag = 1;
     while (1) {
         //if(AI_VC_client_websocket_handle!=0)
         //bk_printf("AI_VC_read_task ...");
+        if(AI_VC_read_task_flag>=2)
+            break;
         if(AI_client_VC)
         {
-            memset(recv_buff,0,sizeof(recv_buff));
+            memset(recv_buff,0,recv_buff_mxa_len);
             // status = aic_websocket_recv(AI_VC_client_websocket_handle, recv_buff, sizeof(recv_buff),
             //     &code, AOS_WAIT_FOREVER,&result_val);
             //bk_printf("AI_VC_read_task 1");
-            status = receive_websocket_message(AI_client_VC,recv_buff,sizeof(recv_buff),&code);
+            status = receive_websocket_message(AI_client_VC,recv_buff,recv_buff_mxa_len,&code);
             //bk_printf("AI_VC_read_task 2");
             if(status>0)
             {  
@@ -677,11 +928,10 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
                 if(code == WS_TEXT)//字符串
                 {
                     //bk_printf("AI_VC_read_task 3");
-                    bk_printf("VCVC:read TEXT:status:%d,data:%s\n",status,recv_buff);
+                    bk_printf("read TEXT:status:%d,data:%s\n",status,recv_buff);
                     if(strstr(recv_buff,"\"started\""))//开始
                     {
-                        if(VC_mode == 0)//连续对话模式
-                            VC_state = VC_State_Listening;
+                        
                         if(AI_TTS_str)
                         {
                             AI_client_VC_synthesis(AI_TTS_str);
@@ -690,13 +940,33 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
                             VC_state = VC_State_TTSStart;
                         }else
                         {
-                            if(VC_mode == 1)//长按模式
+                            
+                            if(VC_mode == 1)//长按模式,或者本地vad模式
+                            {
                                 AI_VC_send_audio_create();
+                            }else if(VC_mode == 0 )//连续对话模式
+                                VC_state = VC_State_Listening;
+                                
                         }
                     }else if(strstr(recv_buff,"\"asr.started\""))//asr开始
                     {
-                        if(VC_mode == 1)//长按模式
-                            VC_state = VC_State_Listening;
+                        if(VC_mode == 1 || vc_cfg.is_VAD ==1)//长按模式
+                            VC_state = VC_State_SpeechIng;
+                    }else if(strstr(recv_buff,"\"asr.result\""))
+                    {
+                        //bk_printf("asr.result!!");
+                        char *str_tmp = strstr(recv_buff,"\"content\":\"");
+                        if(str_tmp)
+                        {
+                            //bk_printf("content!!");
+                            str_tmp += strlen("\"content\":\"");
+                            int str_tmp_len = str_count(str_tmp,'\"');
+
+                            int ret = check_text(str_tmp,str_tmp_len) ;
+                            //识别到有命令词,退出
+                            if(ret == 0)
+                                break;
+                        }
                     }
                     else if(strstr(recv_buff,"\"vad.active\""))//vad触发
                     {
@@ -726,33 +996,473 @@ static void AI_VC_read_task(void *thread_input)//websocket 读线程
                 }
                 else if(code == WS_BINARY)//二进制
                 {
-                    //bk_printf("VCVC:read BIN  status:%d,code:%d\n",status,code);
-                    // if(status<1000)
+                    
+                    // for(int i = 0;i<4;i++)
                     // {
-                    //     bk_printf("VCVC:read :status:%d,code:%d,result_val:%d,data:%s\n",status,code,result_val,recv_buff);
+                    //     audio_data(recv_buff+status/4*i,status/4,24);
+                    //     //bk_printf("recv_buff len = %d",status/4);
+                    //     aos_sleep(1);
                     // }
+                    // if(status%4)
+                    // {
+                    //     audio_data(recv_buff+status/4*4,status%4,24);
+                    //     aos_sleep(1);
+                    // }
+                    //bk_printf("read BIN  status:%d,code:%d!!!!!!",status,code);
+                    
                     AI_VC_put_play_data(recv_buff,status);//音频调试1
                     play_data_len+=status;
                     
                 }
-            }else if(status <0)//报错,关闭连接
+            }else// if(status == -1)//报错,关闭连接
             {
-                bk_printf("AI_VC_read_task:vc连接断开了");
-
-                AI_AMP_MSG_put("vc连接断开了",strlen("vc连接断开了"),VC_CONNECT_ERROR);
+                aos_sleep(1);
+                if(AI_client_VC != NULL)
+                {
+                    bk_printf("AI_VC_read_task:vc连接断开了");
+                    AI_AMP_MSG_put("vc连接断开了",strlen("vc连接断开了"),VC_CONNECT_ERROR);
+                }else{
+                    bk_printf("AI_VC_read_task:客户端主动断开连接了");
+                }
+                
+                break;
             }
             aos_sleep(1);
         }else
         {
             bk_printf("AI_VC_read_task:error AI_VC_client_websocket_handle=%d\n",AI_VC_client_websocket_handle);
-            aos_sleep(100);
+            break;
         }
         // bk_printf("AI_VC_read_task ..... \n");
-        // aos_sleep(5000);
+        // aos_sleep(5000);     
+    }
+    if(recv_buff)
+    {
+        aic_free(recv_buff);
+        recv_buff = NULL;
+    }
+    bk_printf("AI_VC_read_task exit\n");
+    AI_VC_read_task_flag=3;
+}
+u8 vrecord_buf[3500 + 4];
+static void AI_VC_record_task(void *thread_input)//录音线程
+{
+    
+    //bk_stream_record_start();
+    int vad_status_t = 0;
+    int ret = 0;
+    bk_printf("AI_VC_record_task go......");
+    if(app_audio_flag == 0)
+    {
+        app_audio_param_t param;
+        param.channel = 1;
+        param.format = ASTREAM_FORMAT_PCM;
+        param.sample_rate = 16000;
+        param.flag = 0;
+        param.bit_rate = 0;
+        play_data_len = 0;
+        app_audio_flag = 1;
+        ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, &param, bk_audio_start_callback);//初始化音频
+        bk_printf("app_audio_start ret=%d",ret);
+        app_logi("AI_VC_record_task app_audio_start ret=%d",ret);
+    }
+    AI_VC_audio_queue_t AI_VC_play_record_data;
+    AI_VC_record_task_flag = 1;
+    while(1)
+    {
+        if(AI_VC_record_task_flag >= 2)
+            break;
+        //bk_printf("AI_VC_record_task 1 ");
+        ret = app_audio_read(APP_AUDIO_TYPE_STREAM_DUPLEX,
+            vrecord_buf, 3200, 1010);
+        // u32 timer_ms = aos_get_tickcount();
+        // bk_printf("%d:ret=%d",timer_ms,ret);
+        //bk_printf("AI_VC_record_task app_audio_read len = %d,VC_state = %d",ret,VC_state);
+        if(ret<=0)
+        {
+            //bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
+            aos_sleep(1);
+            continue;
+        }
+        audio_data(vrecord_buf,ret,23);
+        if(vc_cfg.is_VAD == 1)//VAD逻辑:先判断有没有有效数据,触发了有效数据才发送
+        {
+            
+            // 每次获得语音后调用, 语音长度最好小于100ms
+            // wave为u8*或void*指针时需要 / 2
+            run_vad((int16_t *)vrecord_buf, ret / 2);
+            vad_status_t = vad_detect(); 
+            //bk_printf("VAD:vad_status_t:%d",vad_status_t);  
+            
+            if (vad_status_t == 2) {
+                vad_clear();
+                if(VAD_status == 1)//清空buff
+                {
+                    bk_rb_clear(VAD_rb_data);
+                    AI_VC_put_record_data(vrecord_buf,ret);
+                }
+                VAD_status = 2;
+                
+            }else if(vad_status_t == 1 )//检测到说话
+            {
+                if(VAD_status ==0)//第一次检测到说话
+                {
+                    
+                    int rb_len_t = bk_rb_data_len(VAD_rb_data);
+                    bk_printf("VAD:检测到说话了,回溯音频大小:%d,VC_state:%d",rb_len_t,VC_state); 
+                    while(bk_rb_data_len(VAD_rb_data))//清空缓存数据
+                    {
+                        unsigned char *vad_r_tmp =  aic_malloc(1280);
+                        if(vad_r_tmp)
+                        {
+                            unsigned int r_len =  bk_rb_read(VAD_rb_data,vad_r_tmp,1280);
+                            //AI_VC_send_data(vad_r_tmp,r_len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);//发送缓冲数据
+                            AI_VC_put_record_data(vad_r_tmp,r_len);//入队缓冲数据
+                            aic_free(vad_r_tmp);
+                        }
+                    }
+                    VAD_status = 1;
+                }
+                AI_VC_put_record_data(vrecord_buf,ret);
+                //bk_printf("VAD:检测到说话了"); 
+            }else if(vad_status_t == 0 )//m没有说话
+            {
+                //把音频入队,缓存回溯数据
+                if(VAD_rb_data)
+                {
+                    if(VAD_RB_LEN - bk_rb_data_len(VAD_rb_data) >= ret)//缓存够
+                    {
+                        bk_rb_write(VAD_rb_data,vrecord_buf,ret);
+                    }else//缓存太大,需要出队处理
+                    {
+                        unsigned char *vad_tmp =  aic_malloc(ret);
+                        if(vad_tmp)
+                        {
+                            bk_rb_read(VAD_rb_data,vad_tmp,ret);
+                            aic_free(vad_tmp);
+                        }
+                        //bk_printf("缓存太大,先出队");
+                        bk_rb_write(VAD_rb_data,vrecord_buf,ret);
+                    }
+                }
+
+            }
+            u32 count_tmp = 0;
+            if(AI_VC_record_tmp_queue)
+                aos_get_queue_used_count(AI_VC_record_tmp_queue,&count_tmp);
+            //bk_printf("count_tmp:%d,VC_state:%d",count_tmp,VC_state);
+            if(count_tmp>0)//有有效录音数据
+            {
+                if(VC_state >= VC_State_TTSStart)//
+                {
+                    VC_state = VC_State_None;
+                    bk_printf("VAD:vad_status_t:%d",vad_status_t); 
+                    bk_printf("VAD:发送打断对话"); 
+                    AI_AMP_MSG_put(0,0,VC_Cancel);//发送打断
+                }
+                else if(VC_state == VC_State_SpeechIng )//可以发数据了
+                {
+                    char count_tmp = 200;
+                    while(count_tmp --)
+                    {
+                        if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有有效录音数据
+                        {
+                            audio_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,22);
+                            AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+                            aic_free(AI_VC_play_record_data.data);
+                        }else
+                            break;
+                    }
+                }
+                else if(VC_state == VC_State_Listening )
+                {
+                    AI_VC_send_audio_create();//发送开始音频
+                    bk_printf("VAD:发送开始音频"); 
+                }
+
+            }else//没录音数据
+            {
+                if(VC_state == VC_State_SpeechIng )//开始说话,且没数据
+                {
+                    AI_VC_send_audio_completed();//发送停止音频、、目前还是会有数据下发
+                    bk_printf("VAD:发送停止音频"); 
+                    bk_printf("VAD:vad_status_t:%d",vad_status_t); 
+                }
+                VAD_status = 0;
+            }
+            
+
+            continue;
+        }
+
         
+        //AI_VC_put_play_data(vrecord_buf,ret);//音频调试0
+        
+        if(AI_VC_record_tmp_queue == NULL)
+            continue;
+        if(VC_state == VC_State_None)//开启的时候,先缓存音频
+        {
 
+            AI_VC_put_record_data(vrecord_buf,ret);
+        }
+       //else if(VC_state >= VC_State_Listening && VC_state<VC_State_TTSStart)//正常录音
+        else if(VC_state >= VC_State_Listening )//正常录音
+        {
+            char count_t = 200;
+            while(count_t--)
+            {
+                if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
+                {
+                    AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+                    aic_free(AI_VC_play_record_data.data);
+                }else
+                 break;
+            }
+            AI_VC_send_data(vrecord_buf,ret,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
+            //bk_printf("AI_VC_record_task send_data len = %d",ret);
+        }else
+        {
+            char count_t = 200;
+            while(count_t--)//清掉缓存
+            {
+                if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
+                {
+                    aic_free(AI_VC_play_record_data.data);
+                }else
+                 break;
+            }
+        }
         
     }
+    AI_VC_record_task_flag = 3;
+    bk_printf("AI_VC_record_task exit.....");
+    //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
+}
+
+char play_tmp_d[320] = {0};
+static void AI_VC_play_task(void *thread_input)//音频播放线程
+{
+    int ret=0;
+    //bk_stream_play_start();
+    AI_VC_audio_queue_t AI_VC_play_queue_data;
+    aos_status queue_ret = AOS_ERROR;
+    AI_VC_play_task_flag = 1;
+    bk_printf("AI_VC_play_task go......");
+    if(app_audio_flag == 0)
+    {
+        app_audio_param_t param;
+        param.channel = 1;
+        param.format = ASTREAM_FORMAT_PCM;
+        param.sample_rate = 16000;
+        param.flag = 0;
+        param.bit_rate = 0;
+        play_data_len = 0;
+        app_audio_flag = 1;
+        ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, &param, bk_audio_start_callback);//初始化音频
+        bk_printf("app_audio_start ret=%d",ret);
+        app_logi("AI_VC_play_task app_audio_start ret=%d",ret);
+    }
+    while(1)
+    {
+        if(AI_VC_play_task_flag >=2)
+            break;
+        //app_logi("app_audio_write0!!\r\n");
+        if(VC_Play_flag ==1 && AI_VC_play_queue )
+        {
+            queue_ret = aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_NO_WAIT);
+            if( queue_ret== AOS_SUCCESS)
+            {
+                if( AI_VC_play_queue_data.data)
+                {
+                    ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
+                        AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, 2000);
+
+                    if (ret < 0)
+                        bk_printf("app_audio_write error, ret=%d\n", ret);
+    
+
+                    aic_free(AI_VC_play_queue_data.data);
+                    if(VC_state == VC_State_End)
+                    {
+                        u32 count_tmp = 0;
+                        if(AI_VC_play_queue)
+                            aos_get_queue_used_count(AI_VC_play_queue,&count_tmp);
+                        bk_printf("VC_State_End:count_tmp = %d",count_tmp);
+                        if(count_tmp <= 0 )//播放完了
+                        {
+                            VC_END_play_timerout = 1;
+                        }
+                    }
+                    continue;//正常有数据就不执行下面写0
+                }else
+                {
+                    bk_printf("AI_VC_play ERROR:AI_client_VC = %d",AI_client_VC);
+                    break;
+
+                }
+                
+            }
+        }
+        //没数据的时候也要写0x00
+        {
+            //bk_printf("AI_VC_play_task no data ");
+            memset(play_tmp_d,0,sizeof(play_tmp_d));
+            //app_logi("app_audio_write0:write 0");
+            ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
+                play_tmp_d, sizeof(play_tmp_d), AOS_WAIT_FOREVER);
+            // app_logi("app_audio_write3:write 0");
+           
+        }
+    }
+    AI_VC_play_task_flag = 3;
+    bk_printf("AI_VC_play_task exit......");
+    //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
+}
+
+
+
+//连接websocket
+static int websocket_connect_VC(void)
+{
+    //连接服务器
+    if(AI_client_VC == NULL)
+    {
+        //AI_client_VC = init_websocket_client("ws://118.145.158.207:22086/vc/coze?is_auth=0",NULL);
+        char *url = aic_malloc(512);//[100] = "ws://118.145.158.207:22086/vc/chat?is_auth=0";
+        int url_len = 0;
+        if(!url)
+            return -1;
+        url_len =snprintf(url,511,"ws://%s/vc/chat?is_auth=0",vc_cfg.server_ip);
+        url[url_len] = 0;
+        AI_client_VC = init_websocket_client(url,NULL);
+        bk_printf("连接服务器 url:%s",url);
+        aic_free(url);
+    }
+    //创建发送线程
+    if(AI_VC_send_task_id == 0)
+    {
+        AI_VC_send_task_id = aos_create_thread(
+            "AI_VC_send",
+            AI_VC_send_task,
+            &AI_VC_send_task_id,
+            1024*16,
+            0,
+            NULL,
+            ai_VC_task_priority,
+            AOS_AUTO_START);
+        bk_printf("创建发送线程 AI_VC_send_task_id:%d",AI_VC_send_task_id);
+    }
+    //创建发送队列
+    if(AI_VC_send_queue == NULL)
+    {
+        AI_VC_send_queue = aos_create_queue("AI_VC_send_queue",
+            sizeof(AI_VC_send_queue_t),
+            200);
+        bk_printf("创建发送队列 AI_VC_send_queue:%d",AI_VC_send_queue);
+    }
+    //创建读线程
+    if(AI_VC_read_task_id == 0)
+    {
+        AI_VC_read_task_id = aos_create_thread(
+            "AI_VC_read",
+            AI_VC_read_task,
+            &AI_VC_read_task_id,
+            4096u,
+            0,
+            NULL,
+            ai_VC_task_priority,
+            AOS_AUTO_START);
+        bk_printf("创建读线程 AI_VC_read_task_id:%d",AI_VC_read_task_id);
+    }
+    return 0;
+    
+}
+static void websocket_deconnect_VC(void)
+{
+    int count = 0;
+    bk_printf("websocket_deconnect_VC!!!!!!!!!!!!");
+    // if(AI_VC_client_websocket_handle)//断开服务器
+    // {
+    //     aic_websocket_disconnect(AI_VC_client_websocket_handle,5000);
+    //     aic_websocket_delete(AI_VC_client_websocket_handle,5000);
+    //     AI_VC_client_websocket_handle = 0;
+    // }
+    if(AI_client_VC)//先断开再关闭读线程
+    {
+        close_websocket_client(AI_client_VC);
+        AI_client_VC = NULL;
+    }
+    //销毁发送线程
+    if(AI_VC_send_task_id != 0)
+    {
+        if(AI_VC_send_task_flag <3)
+        {
+            AI_VC_send_task_flag =2;//告诉线程要退出了
+            count = 300;
+            while (count--)
+            {
+                if(AI_VC_send_task_flag>=3)
+                    break;
+                aos_sleep(1);
+                
+            }
+            bk_printf("close AI_VC_send_task %d ...",count);
+                
+        }
+        aos_delete_thread(AI_VC_send_task_id);
+        AI_VC_send_task_flag = 0;
+        AI_VC_send_task_id = 0;
+    }
+    
+    
+    //销毁读线程
+    if(AI_VC_read_task_id != 0)
+    {
+        if(AI_VC_read_task_flag<3)
+        {
+            AI_VC_read_task_flag =2;//告诉线程要退出了
+            count = 300;
+            while (count--)
+            {
+                if(AI_VC_read_task_flag>=3)
+                    break;
+                aos_sleep(1);
+                
+            }
+            bk_printf("close AI_VC_read_task %d ...",count);
+        }
+        aos_delete_thread(AI_VC_read_task_id);
+        AI_VC_read_task_flag = 0;
+        AI_VC_read_task_id = 0;
+    }
+    
+    
+}
+//websocket 发送数据,AIC_WEBSOCKET_OPCODE = AIC_WEBSOCKET_OPCODE_TEXT_FRAME发送字符串,
+//AIC_WEBSOCKET_OPCODE =AIC_WEBSOCKET_OPCODE_BINARY_FRAME发送二进制
+static aos_status AI_VC_send_data(char *data,u32 len,u8 AIC_WEBSOCKET_OPCODE)
+{
+    if(AI_VC_send_queue == NULL)
+        return AOS_ERROR;
+    AI_VC_send_queue_t AI_VC_send_queue_data;
+    AI_VC_send_queue_data.data = aic_malloc(len+1);
+    memset(AI_VC_send_queue_data.data ,0,len+1);
+    if(!AI_VC_send_queue_data.data)
+    {
+        bk_printf("AI_VC_send_data aic_malloc ERROR!!!!!!!!!!");
+        return AOS_ERROR;
+    }
+    memcpy(AI_VC_send_queue_data.data,data,len);
+    AI_VC_send_queue_data.len=len;
+    AI_VC_send_queue_data.AIC_WEBSOCKET_OPCODE=AIC_WEBSOCKET_OPCODE;
+    if(AI_VC_send_queue && AOS_SUCCESS!=aos_send_to_queue(AI_VC_send_queue,&AI_VC_send_queue_data,AOS_NO_WAIT))
+    {
+       
+        aic_free(AI_VC_send_queue_data.data);
+        return AOS_ERROR;
+    }
+    
+    return AOS_SUCCESS;
 }
 
 static void AI_VC_put_play_data(char *data,u32 len)
@@ -801,80 +1511,6 @@ static void AI_VC_put_play_data(char *data,u32 len)
 PUT_PLAY_ERROR:
     aic_free(AI_VC_play_queue_data.data);
 }
-char play_tmp_d[320] = {0};
-// u32 play_tmp_d_len = 0;
-// #define SAMPLE_RATE 16000  // 采样率,通常为 44100 Hz
-// #define DURATION 2        // 音频时长,单位为秒
-// #define FREQUENCY 440     // 音频频率,单位为 Hz
-// #define AMPLITUDE 32767   // 音频振幅,16 位有符号整数的最大值
-// #define num_samples SAMPLE_RATE * DURATION  // 计算总采样数
-// short bk_audio_data[num_samples+4096];             // 定义音频数据数组
-// #include <stdio.h>
-// #include <math.h>
-
-static void AI_VC_play_task(void *thread_input)//音频播放线程
-{
-    int ret=0;
-    //bk_stream_play_start();
-    AI_VC_audio_queue_t AI_VC_play_queue_data;
-
-    while(1)
-    {
-        if(VC_Play_flag ==1 && AI_VC_play_queue && aos_recv_from_queue(AI_VC_play_queue,&AI_VC_play_queue_data,AOS_NO_WAIT) == AOS_SUCCESS)
-        {
-            if( AI_VC_play_queue_data.data)
-            {
-
-                // int audio_play_time = AI_VC_play_queue_data.len*1000/32000+1;
-                ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
-                    AI_VC_play_queue_data.data, AI_VC_play_queue_data.len, 2000);
-                //audio_data(AI_VC_play_queue_data.data,AI_VC_play_queue_data.len,20);
-                if (ret < 0)
-                    bk_printf("app_audio_write error, ret=%d\n", ret);
-                // for(int i = 0;i<=AI_VC_play_queue_data.len/sizeof(play_tmp_d);i++)//分段写,一次写入小于640会出问题
-                // {
-                //     int play_tmp_d_len  = sizeof(play_tmp_d);
-                //     memset(play_tmp_d,0,play_tmp_d_len);
-                    
-                //     if(i == AI_VC_play_queue_data.len/sizeof(play_tmp_d))//最后一段
-                //     {
-                //         play_tmp_d_len = AI_VC_play_queue_data.len - i*play_tmp_d_len;
-                //     }
-                //     memcpy(play_tmp_d,AI_VC_play_queue_data.data+i*play_tmp_d_len,play_tmp_d_len);
-                //     ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
-                //         play_tmp_d, play_tmp_d_len, AOS_WAIT_FOREVER);
-                //     bk_printf("AI_VC_play_task:write len  = %d",play_tmp_d_len);
-                // }
-                
-
-                aic_free(AI_VC_play_queue_data.data);
-                if(VC_state == VC_State_End)
-                {
-                    u32 count_tmp = 0;
-                    if(AI_VC_play_queue)
-                        aos_get_queue_used_count(AI_VC_play_queue,&count_tmp);
-                    bk_printf("VC_State_End:count_tmp = %d",count_tmp);
-                    if(count_tmp <= 0 )//播放完了
-                    {
-                        VC_END_play_timerout = 1;
-                    }
-                }
-            }else
-            {
-                bk_printf("AI_VC_play ERROR:AI_client_VC = %d",AI_client_VC);
-            }
-            
-        }else//没数据的时候也要写0x00
-        {
-            //bk_printf("AI_VC_play_task no data ");
-            memset(play_tmp_d,0,sizeof(play_tmp_d));
-            ret = app_audio_write(APP_AUDIO_TYPE_STREAM_DUPLEX,
-                play_tmp_d, sizeof(play_tmp_d), AOS_WAIT_FOREVER);
-           
-        }
-    }
-    //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
-}
 
 //打开音频播放
 void VC_Play_Start(void)
@@ -964,68 +1600,9 @@ PUT_RECORD_ERROR:
     aic_free(AI_VC_record_queue_data.data);
 
 }
-u8 vrecord_buf[3500 + 4];
-static void AI_VC_record_task(void *thread_input)//录音线程
-{
-    
-    //bk_stream_record_start();
-    int ret = 0;
-    bk_printf("AI_VC_record_task go......");
-    AI_VC_audio_queue_t AI_VC_play_record_data;
-    while(1)
-    {
-        //bk_printf("AI_VC_record_task 1 ");
-        ret = app_audio_read(APP_AUDIO_TYPE_STREAM_DUPLEX,
-            vrecord_buf, 3200, 1010);
-        // u32 timer_ms = aos_get_tickcount();
-        // bk_printf("%d:ret=%d",timer_ms,ret);
-        
-        if(ret<=0)
-        {
-            //bk_printf("AI_VC_record_task continue len = %d,VC_state = %d",ret,VC_state);
-            aos_sleep(1);
-            continue;
-        }
-        //AI_VC_put_play_data(vrecord_buf,ret);//音频调试0
-        audio_data(vrecord_buf,ret,23);
-        if(AI_VC_record_tmp_queue == NULL)
-            continue;
-        if(VC_state == VC_State_None)//开启的时候,先缓存音频
-        {
 
-            AI_VC_put_record_data(vrecord_buf,ret);
-        }else if(VC_state >= VC_State_Listening )//正常录音
-        {
-            char count_t = 200;
-            while(count_t--)
-            {
-                if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
-                {
-                    AI_VC_send_data(AI_VC_play_record_data.data,AI_VC_play_record_data.len,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
-                    aic_free(AI_VC_play_record_data.data);
-                }else
-                 break;
-            }
-            AI_VC_send_data(vrecord_buf,ret,AIC_WEBSOCKET_OPCODE_BINARY_FRAME);
-            //bk_printf("AI_VC_record_task send_data len = %d",ret);
-        }else
-        {
-            char count_t = 200;
-            while(count_t--)//清掉缓存
-            {
-                if(aos_recv_from_queue(AI_VC_record_tmp_queue,&AI_VC_play_record_data,AOS_NO_WAIT) == AOS_SUCCESS)//有录音数据
-                {
-                    aic_free(AI_VC_play_record_data.data);
-                }else
-                 break;
-            }
-        }
-        
-    }
-    aos_sleep(1);
-    bk_printf("AI_VC_record_task end.....");
-    //app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);
-}
+
+
 
 //打开录音
 void VC_record_Start(void)
@@ -1038,7 +1615,7 @@ void VC_record_Start(void)
             "AI_VC_record",
             AI_VC_record_task,
             &AI_VC_record_task_id,
-            4096u,
+            1024*16,
             0,
             NULL,
             ai_VC_task_priority,
@@ -1051,6 +1628,16 @@ void VC_record_Start(void)
             sizeof(AI_VC_audio_queue_t),
             200);
     }
+    //创建VAD回溯缓冲buf
+    if(vc_cfg.is_VAD == 1 && VAD_rb_data == NULL)
+    {
+        VAD_rb_data =  bk_rb_create(VAD_RB_LEN);
+        if(!VAD_rb_data )
+        {
+            bk_printf("VAD_rb_data error!申请失败");
+        }
+    }
+    
 }
 //关闭录音
 void VC_record_End(void)
@@ -1076,7 +1663,11 @@ void VC_record_End(void)
         // aos_delete_queue(AI_VC_record_tmp_queue); 
         // AI_VC_record_tmp_queue = NULL;
     }
-      
+     //删除VAD回溯缓冲buf
+     if(VAD_rb_data != NULL)
+     {
+        bk_rb_destroy(&VAD_rb_data);
+     }
     
 }
 static void AI_VC_1S_timeout(void *param)
@@ -1104,29 +1695,49 @@ static void AI_VC_1S_timeout(void *param)
         if(VC_END_play_timerout<=0)
         {
             if(VC_mode == 0)
-                VC_state = VC_State_Listening;//重新开始了
+            {
+                if(Close_flag == 1)
+                {
+                    Close_flag = 0;
+                    AI_AMP_MSG_put(0,0,VC_CLOSE);
+                }else
+                {
+                    VAD_status = 0;
+                    VC_state = VC_State_Listening;//重新开始了
+                }
+                
+            }
             else
                 AI_AMP_MSG_put(0,0,VC_CLOSE);
             //AI_AMP_MSG_put(0,0,VC_RECORD_START);//开启录音
             bk_msg_printf("VC_END_play_timerout=%d",VC_END_play_timerout);
         }
     }
-    if(AI_VC_play_queue)
-    {
-        int play_queue_count = 0;
-        aos_get_queue_used_count(AI_VC_play_queue,&play_queue_count);
-        bk_msg_printf("AI_VC_send_queue:play_queue_count=%d",play_queue_count);
-    }
+    // if(AI_VC_play_queue)
+    // {
+    //     int play_queue_count = 0;
+    //     aos_get_queue_used_count(AI_VC_play_queue,&play_queue_count);
+    //     bk_msg_printf("AI_VC_send_queue:play_queue_count=%d",play_queue_count);
+    // }
 }
 void AI_key_press(void)
 {
+    static u64 timer_ms = 0;
+
+    u64 timer_ms_tmp = aos_get_tickcount();
+    if(timer_ms_tmp-timer_ms<1000)//每次触发小于1000ms不响应
+        return;
+    timer_ms = timer_ms_tmp;
     bk_printf("AI_key_press");
     AI_VC_Close();
+   
     VC_state = VC_State_None;
     VC_record_Start()  ;
     AI_VC_start();
-    
-
+    int ret = 0;
+    ret = audio_play_tone(3,300);//播放提示音,测试用
+    app_logi("audio_play_tone ret = %d\r\n",ret);
+    aos_sleep(1);
 }
 void AI_key_release(void)
 {
@@ -1135,17 +1746,60 @@ void AI_key_release(void)
 }
 void AI_key_long_press(void)
 {
-    AI_VC_Close();
     bk_printf("AI_key_long_press");
+
 }
-void pwk_key_release(void)
+void AI_key_long_release(void)
 {
-    bk_printf("pwk_key_release");
+    bk_printf("AI_key_long_release");
     if(VC_mode == 1)//长按模式
         AI_VC_send_audio_completed();
+}
+void pwk_key_release(void)
+{
+    bk_printf("pwk_key_release");
+    AI_VC_Close();
     
 }
 
+int32_t bk_audio_stop_callback(void *p_param, uint32_t size)
+{
+    app_event_audio_t * p_app_event;
+    p_app_event = (app_event_audio_t *)p_param;
+    bk_printf("bk_audio_stop_callback:event_id:%d",p_app_event->event_id);
+    app_logi("bk_audio_stop_callback:event_id:%d",p_app_event->event_id);
+    switch (p_app_event->event_id)
+    {
+        case APP_EVENT_AUDIO_STREAM_DUPLEX_FINISH:
+            /* code */
+            audio_stop_flag= 1;
+            break;
+        
+        default:
+            break;
+    }
+    
+    return 0;
+}
+int32_t bk_audio_start_callback(void *p_param, uint32_t size)
+{
+    app_event_audio_t * p_app_event;
+    p_app_event = (app_event_audio_t *)p_param;
+    bk_printf("bk_audio_start_callback:event_id:%d",p_app_event->event_id);
+    app_logi("bk_audio_start_callback:event_id:%d",p_app_event->event_id);
+    // switch (p_app_event->event_id)
+    // {
+    //     case APP_EVENT_AUDIO_STREAM_DUPLEX_FINISH:
+    //         /* code */
+    //         audio_stop_flag= 1;
+    //         break;
+        
+    //     default:
+    //         break;
+    // }
+    
+    return 0;
+}
 void AI_VC_start(void)
 {
     int ret = 0;
@@ -1158,8 +1812,20 @@ void AI_VC_start(void)
     param.flag = 0;
     param.bit_rate = 0;
     play_data_len = 0;
-    ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, &param, NULL);//初始化音频
-    app_audio_set_master_volume(2);
+    if(app_audio_flag == 0)
+    {
+        app_audio_flag = 1;
+        ret = app_audio_start(APP_AUDIO_TYPE_STREAM_DUPLEX, &param, bk_audio_start_callback);//初始化音频
+        bk_printf("app_audio_start ret=%d",ret);
+        app_logi("app_audio_start ret=%d",ret);
+    }
+    // aic_gpio_output(GPIO_25,GPIO_OUTPUT_LVL_HIGH );//led
+    // aic_gpio_output(GPIO_30,GPIO_OUTPUT_LVL_HIGH );//led
+    // aic_gpio_output(GPIO_31,GPIO_OUTPUT_LVL_HIGH );//led
+    // aic_gpio_output(GPIO_GPO_8,GPIO_OUTPUT_LVL_HIGH );//马达
+    // aic_gpio_output(GPIO_GPO_1,GPIO_OUTPUT_LVL_LOW );//马达
+    // aic_gpio_output(GPIO_20,GPIO_OUTPUT_LVL_HIGH );//马达
+    //app_audio_set_master_volume(8);
     // if (ret) {
     //     bk_printf("AI_VC_start app_audio_start error");
     //     return;
@@ -1174,6 +1840,7 @@ void AI_VC_start(void)
     }
     if(inbound_attributes_format == inbound_attributes_format_OPUS)
     {
+        #if SUPPORT_OPUS 
         //int err;
         if (opus_encoder_h == NULL)
         {
@@ -1217,27 +1884,75 @@ void AI_VC_start(void)
                
             //opus_decoder_h = opus_decoder_create(16000, 1, &err);
         }
+        #endif
     }
     
         
-    
+    if(vc_cfg.is_VAD == 1)
+    {
+        
+
+        // 启用VAD时初始化
+        struct VadConfig conf;
+        conf.sil_threshold = 63;
+        conf.energy_threshold = 10000;
+        conf.min_speech_length = 240;
+        conf.silence_detect_length = 300;
+        conf.rule1_min_tailing_silence = 480;
+        conf.rule2_min_tailing_silence = vc_cfg.vad_silence ;
+        conf.rule3_min_tailing_silence = vc_cfg.vad_silence;
+        conf.vad_log_level = 2;
+        init_vad(&conf);
+        VAD_status = 0;
+        
+
+        
+    }
     VC_record_Start();
-    VC_Play_Start();//音频调试1
-    websocket_connect_VC();//音频调试1
-    aos_sleep(5);
-    AI_VC_send_satrt();//音频调试1
+    VC_Play_Start();//
+    websocket_connect_VC();//
+    //aos_sleep(5);
+    AI_VC_send_satrt();//
     close_timerout = 0;
 }
 
 void AI_VC_Close(void)
 {
+    int count;
+    // aic_gpio_output(GPIO_25,GPIO_OUTPUT_LVL_LOW );
+    // aic_gpio_output(GPIO_30,GPIO_OUTPUT_LVL_LOW );
+    // aic_gpio_output(GPIO_31,GPIO_OUTPUT_LVL_LOW );
+    // aic_gpio_output(GPIO_GPO_8,GPIO_OUTPUT_LVL_LOW );
+    // aic_gpio_output(GPIO_GPO_1,GPIO_OUTPUT_LVL_LOW);
+    // aic_gpio_output(GPIO_20,GPIO_OUTPUT_LVL_LOW );
+    if(vc_cfg.is_VAD == 1)
+    {
+        // 不使用或暂停使用VAD时调用
+        free_vad();
+        VAD_status = 0;
+    }
+    
     bk_printf("AI_VC_Close!!!!!!!!!!!!");
     
-     //é\94\80æ¯\81å\8f\91é\80\81线程
+     //é\94\80æ¯\81å½\95é\9f³线程
      if(AI_VC_record_task_id != 0)
      {
-         aos_delete_thread(AI_VC_record_task_id);
-         AI_VC_record_task_id = 0;
+        if(AI_VC_record_task_flag <3)
+        {
+            AI_VC_record_task_flag =2;//告诉线程要退出了
+            count = 300;
+            while (count--)
+            {
+                if(AI_VC_record_task_flag>=3)
+                    break;
+                aos_sleep(1);
+                
+            }
+            bk_printf("close AI_VC_record_task %d ...",count);
+        }
+        aos_delete_thread(AI_VC_record_task_id);
+        AI_VC_record_task_flag = 0;
+        AI_VC_record_task_id = 0;
      }
     //销毁录音缓存队列
     if(AI_VC_record_tmp_queue != NULL)
@@ -1264,7 +1979,24 @@ void AI_VC_Close(void)
     //销毁播放线程
     if(AI_VC_play_task_id != 0)
     {
+        if(AI_VC_play_task_flag <3)
+        {
+            AI_VC_play_task_flag =2;//告诉线程要退出了
+            count = 300;
+            while (count--)
+            {
+                if(AI_VC_play_task_flag>=3)
+                    break;
+                aos_sleep(1);
+                
+            }
+            bk_printf("close AI_VC_play_task %d ...",count);
+            //app_logi("close AI_VC_play_task %d ...",count);
+                
+        }
+
         aos_delete_thread(AI_VC_play_task_id);
+        AI_VC_play_task_flag = 0;
         AI_VC_play_task_id = 0;
     }
     //销毁发送队列
@@ -1290,6 +2022,25 @@ void AI_VC_Close(void)
     
     bk_printf("AI_VC_Close2!!!!!!!!!!!!");
     websocket_deconnect_VC();
+    //销毁发送队列,不在websocket_deconnect_VC里调用,避免重连需要发指令
+    if(AI_VC_send_queue != NULL)
+    {
+        char count_t= 200;
+        AI_VC_send_queue_t AI_VC_send_queue_data_t;
+        while(count_t--)//清空队列数据
+        {
+            if(aos_recv_from_queue(AI_VC_send_queue,&AI_VC_send_queue_data_t,AOS_NO_WAIT) == AOS_SUCCESS)
+            {
+                if(AI_VC_send_queue_data_t.data)
+                    aic_free(AI_VC_send_queue_data_t.data);
+            }
+            else{
+                break;
+            }
+        }
+        aos_delete_queue(AI_VC_send_queue); 
+        AI_VC_send_queue = NULL;
+    }
     bk_printf("AI_VC_Close3!!!!!!!!!!!!");
     if(AI_TTS_str)
     {
@@ -1304,6 +2055,7 @@ void AI_VC_Close(void)
     close_timerout = 0;
     if(inbound_attributes_format == inbound_attributes_format_OPUS)
     {
+        #if SUPPORT_OPUS 
         // if(opus_encoder_h)
         //     opus_encoder_destroy(opus_encoder_h);
         // opus_encoder_h =  NULL;
@@ -1322,9 +2074,28 @@ void AI_VC_Close(void)
                 aic_free(opus_decoder_h);
             opus_decoder_h =  NULL;
         }
+        #endif
+    }
+    bk_printf("app_audio_stop1");
+    //app_logi("app_audio_stop1");
+    if(app_audio_flag == 1)
+    {
+        app_audio_flag = 0;
+        audio_stop_flag = 0;
+        app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, bk_audio_stop_callback);//要在销毁线程之后
+        int audio_count = 300;
+        while(audio_count--)
+        {
+            if(audio_stop_flag == 1)//关成功了
+                break;
+            aos_sleep(1);
+        }
+        bk_printf("app_audio_stop2 audio_count:%d",audio_count);
     }
     
-    app_audio_stop(APP_AUDIO_TYPE_STREAM_DUPLEX, NULL);//要在销毁线程之后
+    //app_logi("app_audio_stop2");
+    
+    
 }
 aos_status AI_AMP_MSG_put(const char *data,u32 len,AI_AMP_MSG_Type MSG_Type)
 {
@@ -1356,30 +2127,60 @@ aos_status AI_AMP_MSG_put(const char *data,u32 len,AI_AMP_MSG_Type MSG_Type)
 
 static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
 {
-    char count = 20;
+    char count = 30;
     boolean pdp_activated ;
     AI_AMP_MSG_queue_t AI_AMP_msg = {0};
+    
+    init_VC_cfg();
+    app_audio_set_master_volume(15*vc_cfg.VC_TTS_volume/100);
     while(count --)
     {
         pdp_activated = aic_is_default_pdp_activated();
         if(pdp_activated == TRUE)
             break;
         bk_printf("AI_AMP_2_5_init 等待注网..... \n");
+        audio_play_tone(3,200);//播放提示音,测试用
         aos_sleep(1000);
     }
-    aic_srv_tele_radio_get_current_slot_imei_sync(dev_imei);
-    bk_printf("IMEI:%s",dev_imei);
+
+    current_card_id = aic_srv_tele_sim_get_current_card_sync();
+    aic_srv_tele_radio_get_current_slot_imei_sync(vc_cfg.dev_imei);
+    bk_printf("IMEI:%s",vc_cfg.dev_imei);
+    aic_srv_tele_sim_get_iccid_sync(current_card_id,vc_cfg.ICCID);
+    bk_printf("vc_cfg.ICCID:%s",vc_cfg.ICCID);
     dev_authentication_init();
     
     aic_network_enable_pdp_nic_capdump();//打开网络调试log
-    char *tts_str = "你好!我是小瑞";
-    VC_TTS_Play(tts_str);//开启vc播放tts
+    // while(1)
+    // {
+    //     aos_sleep(1000);
+    // }
+
+    VC_TTS_Play(vc_cfg.power_on_tone);//开启vc播放tts
     while (1) {
         if(AI_AMP_task_queue)
         {
             aos_recv_from_queue(AI_AMP_task_queue,&AI_AMP_msg,AOS_WAIT_FOREVER) ;
             switch (AI_AMP_msg.MSG_Type)
             {
+                
+                case POWER_OFF://关机
+                    AI_VC_Close();
+                    //播放关机提示音
+                    sysoff_shutdown();
+                    break;
+                case VC_Cancel://打断
+                    //发送打断
+                    //AI_VC_send_cancel();//发送打断,发送完打断还有发开始音频
+                    //app_logi("interruption!!!!!!!!!!!!!!!!!!!!!");
+                    VC_Play_End();
+                    VC_state = VC_State_None;
+                    websocket_deconnect_VC();
+                    websocket_connect_VC();//重连
+                    AI_VC_send_satrt();//发送开始
+                    
+                    
+                    break;
                 case VC_CLOSE:
                     AI_VC_Close();
                     break;
@@ -1398,7 +2199,19 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
                 case VC_RECORD_END:
                     VC_record_End();
                     break;
-
+                case VC_TTS_PLAY:
+                    if(AI_AMP_msg.data!=NULL)
+                        VC_TTS_Play(AI_AMP_msg.data);
+                    break;
+                case VC_TTS_PLAY_CLOSE:
+                    if(AI_AMP_msg.data!=NULL)
+                    {
+                        VC_TTS_Play(AI_AMP_msg.data);
+                        Close_flag = 1;
+                    }
+                        
+                    
+                    break;
                     
                 case VC_CONNECT_ERROR://连接错误
                     AI_VC_Close();
@@ -1408,6 +2221,7 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
                     }
                     break;
                 case AI_KEY_PRESS:
+                    
                     AI_key_press();
                     break;
 
@@ -1417,6 +2231,9 @@ static void AI_AMP_2_5_task(void *thread_input)//做逻辑线程
                 case AI_KEY_LONG_PRESS:
                     AI_key_long_press();
                     break;  
+                case AI_KEY_LONG_RELEASE:
+                    AI_key_long_release();
+                    break;  
                 case PWK_KEY_RELEASE:
                     pwk_key_release();
                     break;  
@@ -1450,11 +2267,9 @@ int AI_AMP_2_5_init(void)
      */
     ai_uart_handle = uart_open(1);
     aic_assert(ai_uart_handle);
-
-    
-
     /* change baudrate */
     uart_set_baud_rate(ai_uart_handle, 921600);
+    
     //创建AI_AMP_task队列
     if(AI_AMP_task_queue == NULL)
     {
@@ -1470,7 +2285,7 @@ int AI_AMP_2_5_init(void)
         4096u,
         0,
         NULL,
-        ai_VC_task_priority-3,
+        ai_VC_task_priority,
         AOS_AUTO_START);
 
     return AIC_SUCCESS;
index d7bfdf3..57a7ac4 100644 (file)
@@ -1,17 +1,62 @@
 #include "aic_osa.h"
+typedef enum 
+{
+    DEV_FX1_H,//玩具机芯
+    DEV_ADS,//奥德赛
+} DEV_TYPE;
+typedef enum 
+{
+    VC_record_TYPE_PCM,
+    VC_record_TYPE_MP3,
+    VC_record_TYPE_OPUS,
+} VC_RECORD_TYPE;
+typedef enum 
+{
+    VC_play_TYPE_PCM,
+    VC_play_TYPE_MP3,
+    VC_play_TYPE_OPUS,
+} VC_PLAY_TYPE;
+typedef struct 
+{
+
+    unsigned int start_flag;
+    DEV_TYPE dev_type;//产品
+    char dev_imei[20] ;
+    char ICCID[20] ;
+    char server_ip[100];//服务器地址
+    char VC_mode ;//对话模式
+    char power_on_tone[1024];//开机提示词
+    VC_RECORD_TYPE VC_record_TYPE;//录音格式
+    VC_PLAY_TYPE VC_play_TYPE;//播放格式
+    unsigned int VC_record_samplerate;//录音采样率
+    unsigned int VC_play_samplerate;//播放采样率
+    unsigned char is_VAD;//=1打开vad打断
+    int speech_rate;//语速配置
+    unsigned int vad_silence;//vad断句时间 ms
+    char VC_TTS_volume;
+    //unsigned 
+    unsigned int end_flag;
+
+}AI_AMP_2_5_cfg;
+#define BK_VERSION "BK_FX01H_V202505300931"
+extern AI_AMP_2_5_cfg vc_cfg;
 typedef enum AI_AMP_MSG
 {
+    POWER_OFF,//关机
     VC_START,
     VC_PLAY_START,
     VC_PLAY_END,
     VC_RECORD_START,
     VC_RECORD_END,
     VC_Cancel,//打断取消
+    VC_TTS_PLAY,
+    VC_TTS_PLAY_CLOSE,//播放完关闭对话
     VC_CLOSE,
     VC_CONNECT_ERROR,
     AI_KEY_PRESS,//AI键按下
     AI_KEY_RELEASE,//AI键释放
     AI_KEY_LONG_PRESS,//AI键长按
+    AI_KEY_LONG_RELEASE,//AI键长按释放
     PWK_KEY_RELEASE,//侧键
     AI_PRINTF,//打印
 } AI_AMP_MSG_Type;
index e7ef7c5..250300d 100644 (file)
@@ -5,7 +5,7 @@
 aic_library_sources_ifdef(
     CONFIG_APP_AI_AMP_2_5
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/AI_AMP_2_5.c
-    ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/helios_ringbuf.c
+    ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/bk_ringbuf.c
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/stream_play.c
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/bk_websocket.c
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/bk_key.c
@@ -13,11 +13,7 @@ aic_library_sources_ifdef(
 
 
 )
-#归芯原厂库opus库
-aic_library_import(
-    CONFIG_APP_AI_AMP_2_5
-    ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/opus/guixin/libopus.a
-)
+
 aic_library_include_directories_ifdef(
     CONFIG_APP_AI_AMP_2_5
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/opus/guixin/
@@ -83,3 +79,14 @@ aic_library_include_directories_ifdef(
     CONFIG_APP_AI_AMP_2_5
     ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/
 )
+#
+aic_library_import(APP_AI_AMP_2_5_VAD
+    ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/libimslvad.a
+    #${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/opus/guixin/libopus.a
+)
+aic_library_import(APP_AI_AMP_2_5_OPUS
+    #${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/libimslvad.a
+    ${AIC_SOURCE_ROOT}/app/AI_AMP_2_5/opus/guixin/libopus.a
+)
+
+
index 7b9d59f..7da7d42 100644 (file)
@@ -8,7 +8,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include "alog_api.h"  
-
+#include "pwr_key.h"
 
 
 
@@ -28,35 +28,45 @@ static int32_t bk_kpc_callback(void *p_param, uint32_t size)
     }
 
     for (int i = 0; i < 5; i++) {
+        bk_printf("bk_kpc_callback key[%d].key_value=%d",i,key_arr->key[i].key_value);
         switch (key_arr->key[i].key_event) {
             case KPC_KEY_EVENT_PRESS://按下
                 // bk_printf("[%d]AI_key_press",key_arr->key[i].key_value);
 
                 if (key_arr->key[i].key_value == 0) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_PRESS);
+                }else if(key_arr->key[i].key_value == 1) {//AI键
+                    
                     AI_AMP_MSG_put(0, 0, AI_KEY_PRESS);
                 }
                 break;
             case KPC_KEY_EVENT_RELEASE://释放
                 if (key_arr->key[i].key_value == 0) {//AI键
                     AI_AMP_MSG_put(0, 0, AI_KEY_RELEASE);
-                }else if(key_arr->key[i].key_value == 1) {//PWK键
-                    AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE);
+                }else if(key_arr->key[i].key_value == 1) {//AI键
+                    
+                    AI_AMP_MSG_put(0, 0, AI_KEY_RELEASE);
+                }else if(key_arr->key[i].key_value == 2) {//
+
                 }
                 
                 break;
             case KPC_KEY_EVENT_LONGKEY://长按
                 if (key_arr->key[i].key_value == 0) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_LONG_PRESS);
+                }else if(key_arr->key[i].key_value == 1) {//AI键
+                    
                     AI_AMP_MSG_put(0, 0, AI_KEY_LONG_PRESS);
                 }
-                // bk_printf("[%d]AI_key_long_press",key_arr->key[i].key_value);
-                
-                
                 break;
 
             case KPC_KEY_EVENT_LONGKEY_RELEASE:
                 if (key_arr->key[i].key_value == 0) {//AI键
                     AI_AMP_MSG_put(0, 0, AI_KEY_RELEASE);
-                }else if(key_arr->key[i].key_value == 1) {//PWK键
+                }else if (key_arr->key[i].key_value == 1) {//AI键
+                    AI_AMP_MSG_put(0, 0, AI_KEY_LONG_RELEASE);
+                }
+                else if(key_arr->key[i].key_value == 2) {//PWK键
                     AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE);
                 }
 
@@ -74,8 +84,39 @@ static int32_t bk_kpc_callback(void *p_param, uint32_t size)
 
 
 }
+static int32_t bk_kpc_pwr_key_handle(void *para, uint32_t size)
+{
+    int ret = 0;
+    int pwr_status = 0;
+    kpc_key_array_t key_arr = {0};
 
+    memcpy(&pwr_status, para, size);
 
+    switch (pwr_status) {
+    case AIC_PWR_KEYDOWN:
+        bk_msg_printf("AIC_PWR_KEYDOWN");
+        break;
+
+    case AIC_PWR_KEYUP:
+        bk_msg_printf("AIC_PWR_KEYUP");
+        AI_AMP_MSG_put(0, 0, PWK_KEY_RELEASE);
+        break;
+
+    default:
+        alog_error("kpc_pwr_key_handle error pwr_status is %d\n", pwr_status);
+        return -1;
+        break;
+    }
+
+    return ret;
+}
+void bk_to_ups_sync(void *ptr)
+{
+    // gx_ups_phy_from_rtc();
+
+    // gx_ups_phy_cnt_clr();
+    bk_msg_printf("bk_to_ups_sync");
+}
 
 void bk_key_init(void)
 {
@@ -87,6 +128,7 @@ void bk_key_init(void)
     } else {
         aicx_info(0x0202e8, "d", "g_kpc_handle = %d \n", handle);  // 
     }
-    
+    int ret = register_pwr_key_monitor("kpc", bk_kpc_pwr_key_handle);//注册电源按键回调
+    sysoff_register_hook(bk_to_ups_sync, AIC_NULL);//注册关机事件
 }
 
index e809044..8b322cc 100644 (file)
@@ -421,14 +421,21 @@ send_websocket_message_ERROR:
 }
 
 // 接收 WebSocket 消息,返回读到长度
+// char websocket_tmp_b[8*1024] = {0};
+// int websocket_tmp_b_len = 0;
+// char frame_t[20] = {0};
+// int frame_t_len = 0;
+// int bytes_received_t_1 = 0;
+// int bytes_received_t = 0;
 int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int len,WebSocketMessageType *code) {
-    u32 timer_ms = aos_get_tickcount();
+    //u64 timer_ms = aos_get_tickcount();
     //bk_printf("receive_websocket_message 1 timer_ms=%d\n",timer_ms);
     unsigned char frame[20]={0};
     unsigned char masking_key[4];
-    unsigned int bytes_received = 0;
+    int bytes_received = 0;
     int recv_len = 0 ;
     static u8 last_byte = 0;
+    static u32 error_count = 0;
     // while(1)
     // {
     //     recv_len = recv(client->sockfd, frame+bytes_received, 2-bytes_received, 0);
@@ -436,20 +443,22 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
     //     if(bytes_received>=2)
     //         break;
     // }
+    
     while(1)
     {
         bytes_received = recv(client->sockfd, frame, 1, 0);
-        if (bytes_received <= 0) {
-            if (bytes_received == 0) {
-                bk_printf("Connection closed by server.\n");
-            } else {
-                bk_printf("receive message failed");
-            }
+        //bk_printf("receive_websocket_message:frame:0x%x,bytes_received:%d",frame[0],bytes_received);
+        if (bytes_received == 0) {
+            bk_printf("Connection closed by server.1\n\n\n\n");
+            return 0;
+        } else if(bytes_received<0){
+            bk_printf("receive message failed1\n\n\n\n");
             return -1;
         }
         if(frame[0]!= 0x80 && frame[0]!= 0x81 && frame[0]!= 0x82 && frame[0]!= 0x88 && frame[0]!= 0x89 && frame[0]!= 0x8A)
         {
-            bk_printf("receive_websocket_message:hend =0x%X,0x%X ,last_byte =0x%x ERROR!!!!!!!!!",frame[0],frame[1],last_byte);
+            error_count++;
+            bk_printf("receive_websocket_message:hend =0x%X,0x%X ,last_byte =0x%x error_count =%d ERROR!!!!!!!!!",frame[0],frame[1],last_byte,error_count);
 
             if(last_byte!= 0x80 && last_byte!= 0x81 && last_byte!= 0x82 && last_byte!= 0x88 && last_byte!= 0x89 && last_byte!= 0x8A)
             {
@@ -459,18 +468,19 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
                 
         }else
         {
+            
             break;
         }
     }
-    timer_ms = aos_get_tickcount();
-    //bk_printf("receive_websocket_message 2 timer_ms=%d\n",timer_ms);
+    // bk_printf("websocket2 timer_ms=%d\n",timer_ms- aos_get_tickcount());
+    // timer_ms = aos_get_tickcount();
+    //bk_sleep(5);
     bytes_received = recv(client->sockfd, frame+1, 1, 0);
-    if (bytes_received <= 0) {
-        if (bytes_received == 0) {
-            bk_printf("Connection closed by server.\n");
-        } else {
-            bk_printf("receive message failed");
-        }
+    if (bytes_received == 0) {
+        bk_printf("Connection closed by server.2\n\n\n\n");
+        return 0;
+    } else if(bytes_received<0){
+        bk_printf("receive message failed 2 \n\n\n\n");
         return -1;
     }
     //unsigned char fin = (frame[0] & 0x80) >> 7;
@@ -482,14 +492,46 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
     size_t offset = 2;
     if (payload_len == 126) {
         unsigned short extended_payload_len;
-        bytes_received += recv(client->sockfd, frame+offset, 2, 0);
+        bytes_received = 0;
+        while(1)
+        {
+            recv_len= recv(client->sockfd, frame+offset+bytes_received, 2-bytes_received, 0);
+            if (recv_len == 0) {
+                bk_printf("Connection closed by server 3.\n\n\n\n");
+                return 0;
+            } else if(recv_len<0){
+                bk_printf("receive message failed 3 \n\n\n\n");
+                return -1;
+            }
+            bytes_received +=recv_len;
+            if(bytes_received>=2)
+                break;
+            
+        }
+        
+        // bytes_received_t = bytes_received;
         memcpy(&extended_payload_len, frame + 2, 2);
         payload_len = ntohs(extended_payload_len);
         //bk_printf("receive_websocket_message:payload_len=0x%X",extended_payload_len);
         offset += 2;
     } else if (payload_len == 127) {
         u64 extended_payload_len;
-        bytes_received += recv(client->sockfd, frame+offset, 8, 0);
+        bytes_received = 0;
+        while(1)
+        {
+            recv_len= recv(client->sockfd, frame+offset+bytes_received, 8-bytes_received, 0);
+            if (recv_len == 0) {
+                bk_printf("Connection closed by server 4.1\n\n\n\n");
+                return 0;
+            } else if(recv_len<0){
+                bk_printf("receive message failed 4\n\n\n\n");
+                return -1;
+            }
+            bytes_received +=recv_len;
+            if(bytes_received>=8)
+                break;
+            
+        }
         memcpy(&extended_payload_len, frame + 2, 8);
         payload_len = ntohll(extended_payload_len);
         offset += 8;
@@ -500,8 +542,7 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
         recv(client->sockfd, buf, len, 0);
         return -1;
     }
-    timer_ms = aos_get_tickcount();
-    //bk_printf("receive_websocket_message 3 timer_ms=%d\n",timer_ms);
+    
     // bk_printf("receive_websocket_message :");
     // for(int i = 0;i<offset;i++)
     // {
@@ -514,19 +555,25 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
         memcpy(masking_key, frame + offset, 4);
         offset += 4;    
     } 
-    bytes_received = 0;
     
+        
+    bytes_received = 0;
+    // payload_len-=1;//少读一个字节,防止粘包
+    //bk_sleep(1);
     while(1)//读主体内容
     {
-        //bk_sleep(recv_len/1000+1);
+        //bk_sleep(recv_len/200+1);
         recv_len = recv(client->sockfd, buf+bytes_received, payload_len-bytes_received, 0);
-        if(recv_len>0)
-            bytes_received += recv_len;
-        else if(recv_len<0)
-        {
-            bk_printf("receive_websocket_message: recv_len =%d  recv ERROR!!!!!!",recv_len);
+        if (recv_len == 0) {
+            bk_printf("Connection closed by server.5\n\n\n\n\n");
+            return 0;
+        } else if(recv_len<0){
+            bk_printf("receive message failed 5\n\n\n\n");
             return -1;
         }
+
+        bytes_received += recv_len;
+        
         //bk_printf("receive_websocket_message:bytes_received=%d recv_len =%d",bytes_received,recv_len);
         if(bytes_received >=  payload_len)
         {
@@ -535,6 +582,12 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
         }
         
     }
+    //bk_sleep(1);
+    // bk_printf("websocket 3 timer_ms=%d\n",timer_ms- aos_get_tickcount());
+    // timer_ms= aos_get_tickcount();
+    // bk_sleep(1);//等最后一字节返回,防止粘包
+    // recv(client->sockfd, buf+payload_len, 1, 0);//读最后一字节
+    // payload_len+=1;
     if(mask)
     {
         for (size_t i = 0; i < payload_len; ++i) {
@@ -547,7 +600,17 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
     // } else if (*code == WS_BINARY) {
     //     bk_printf("Received binary message of length %zu\n", payload_len);
     // }
-
+    // if(error_count>0)
+    // {
+    //     bk_printf("WS ERROR!!!!!!last_byte:0x%x bytes_received_t_1:0x%x\r\n\n\n\n\n\n\n",last_byte,bytes_received_t_1);
+    //     bk_print_hex(frame_t,frame_t_len);
+    //     bk_print_hex(websocket_tmp_b,websocket_tmp_b_len);
+    //     bk_printf("WS ERROR!!!!!!\r\n\n\n\n\n\n\n");
+    //     bk_print_hex(frame,offset);
+    //     bk_print_hex(buf,payload_len);
+        
+    // }
+    // bytes_received_t_1 = bytes_received_t;
     if (*code == WS_TEXT)
     {
 
@@ -559,18 +622,35 @@ int  receive_websocket_message(WebSocketClient *client, unsigned char *buf,int l
         payload_len = 0;
     }else if(*code == WS_PONG)
     {
-        payload_len = 0;
+        //payload_len = 1;
     }else if(*code == WS_PING)
     {
         send_websocket_message(client,buf,payload_len,WS_PONG);
-        payload_len = 0;
+        //payload_len = 1;
     }else if(*code == WS_CONT)
     {
-        payload_len = 0;
+        //payload_len = 1;
     }
     last_byte = buf[payload_len-1];
-    timer_ms = aos_get_tickcount();
+    //timer_ms = aos_get_tickcount();
     //bk_printf("receive_websocket_message 4 timer_ms=%d len = %d\n",timer_ms,payload_len);
+    error_count=0;
+    // websocket_tmp_b_len = payload_len;
+    // if(payload_len>sizeof(websocket_tmp_b))
+    // {
+    //     websocket_tmp_b_len=sizeof(websocket_tmp_b);
+    // }
+    // memcpy(websocket_tmp_b,buf,websocket_tmp_b_len);
+    
+
+    // frame_t_len = offset;
+    // if(frame_t_len>sizeof(frame_t))
+    // {
+    //     frame_t_len=sizeof(frame_t);
+    // }
+    // memcpy(frame_t,frame,frame_t_len);
+    
+
     return payload_len;//parse_frame(buf, bytes_received, buf,code);
 }
 
@@ -581,7 +661,7 @@ WebSocketClient *init_websocket_client(const char *url, const char *headers) {
     WebSocketClient *client  =NULL;
     BK_URL parsed_url = {0};
     parsed_url = parse_url(url);//解析url
-    bk_printf("Error: %x", parsed_url);
+    //bk_printf("url: %s", url);
     if (parsed_url.error) {
         bk_printf("Error: %s", parsed_url.error_message);
         goto client_ERROR;
index 341c8b9..7e21ade 100644 (file)
@@ -221,48 +221,53 @@ int aes_cbc_pkcs5_decrypt(const char *Base64_str_input,const char* str_key,const
     // const unsigned char *ciphertext, size_t ciphertext_len,
     // unsigned char *plaintext, size_t *plaintext_len) 
 {
-    mbedtls_cipher_context_t ctx = {0};
+    mbedtls_aes_context ctx = {0};
     int ret;
     char *input_buf = NULL;
     // 初始化上下文
-    mbedtls_cipher_init(&ctx);
-    bk_printf("aes_cbc_pkcs5_decrypt str_key:%s,str_iv:%s!!!!!!!!!!!!!!!!!!!!!!!!", str_key,str_iv);
-    // 设置加密算法
-    ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC));
-    if (ret != 0) {
-        bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret);
-        goto exit;
-    }
+    mbedtls_aes_init(&ctx);
+    //bk_printf("aes_cbc_pkcs5_decrypt str_key:%s,str_iv:%s!!!!!!!!!!!!!!!!!!!!!!!!", str_key,str_iv);
+    // // 设置加密算法
+    // ret = mbedtls_cipher_setup(&ctx, mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_256_CBC));
+    // if (ret != 0) {
+    //     bk_printf("mbedtls_cipher_setup failed: -0x%04x\n", -ret);
+    //     goto exit;
+    // }
     
     // 设置密钥和IV
-    ret = mbedtls_cipher_setkey(&ctx, str_key, strlen(str_key) * 8, MBEDTLS_DECRYPT);
+    ret = mbedtls_aes_setkey_dec(&ctx, str_key, strlen(str_key) * 8);
     if (ret != 0) {
         bk_printf("mbedtls_cipher_setkey failed: -0x%04x\n", -ret);
         goto exit;
     }
 
-    ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv));
-    if (ret != 0) {
-        bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret);
-        goto exit;
-    }
+    // ret = mbedtls_cipher_set_iv(&ctx, str_iv, strlen(str_iv));
+    // if (ret != 0) {
+    //     bk_printf("mbedtls_cipher_set_iv failed: -0x%04x\n", -ret);
+    //     goto exit;
+    // }
     size_t input_buf_len = strlen(Base64_str_input)+1;
     input_buf = kb_malloc(input_buf_len);
     memset(input_buf,0,input_buf_len);
-    bk_printf("mbedtls_base64_decode1:input_buf_len:%d,Base64_str_input:%s",input_buf_len,Base64_str_input);
+    //bk_printf("mbedtls_base64_decode1:input_buf_len:%d,Base64_str_input:%s",input_buf_len,Base64_str_input);
     mbedtls_base64_decode(input_buf, input_buf_len, &input_buf_len, Base64_str_input, strlen(Base64_str_input));
-    bk_printf("mbedtls_base64_decode2:input_buf_len:%d,output_len:%d",input_buf_len,*output_len);
+    //bk_printf("mbedtls_base64_decode2:input_buf_len:%d,output_len:%d",input_buf_len,*output_len);
     bk_print_hex(input_buf,input_buf_len);
     // 解密
-    ret = mbedtls_cipher_update(&ctx, input_buf, input_buf_len, output, output_len);
+
+    char vi_tmp[16];
+    memcpy(vi_tmp,str_iv,16);
+    ret = mbedtls_aes_crypt_cbc(&ctx,MBEDTLS_AES_DECRYPT,input_buf_len, vi_tmp,input_buf,output);
+    *output_len = input_buf_len;
+
     if (ret != 0) {
         bk_printf("mbedtls_cipher_update failed: -0x%04x\n", -ret);
         goto exit;
     }
 
     // 清理上下文
-    mbedtls_cipher_free(&ctx);
-    bk_printf("aes_cbc_pkcs5_decrypt output_len:%d output:%s",*output_len,output);
+    mbedtls_aes_free(&ctx);
+    //bk_printf("aes_cbc_pkcs5_decrypt output_len:%d output:%s",*output_len,output);
     // 移除填充
     *output_len = pkcs5_unpadding(output, *output_len,AES_BLOCK_SIZE);
     output[*output_len] = 0;
@@ -276,10 +281,9 @@ int aes_cbc_pkcs5_decrypt(const char *Base64_str_input,const char* str_key,const
     mbedtls_cipher_free(&ctx);
     return ret;
 }
-
 void ase_encrypt_demo(void)
 {
-    const char *data = "11111111222222223333333344444444";
+    const char *data = "123456789123456789001234567890";
     size_t  Base64_data_len = strlen(data)*3+32;
     char *Base64_data = kb_malloc(Base64_data_len);
     memset(Base64_data,0,Base64_data_len);
@@ -573,62 +577,7 @@ void aut_login(void)//登录
         u32 lbytes = aic_https_client_response_data_get(http_demo_handle, buff, 1024*2,
             10 * 1024);
         bk_printf("LOGIN:%s",buff);
-        //[2025-05-13 11:28:45.371] LOGIN:{"success":false,"msg":".","code":50021,"data":null}":"2025-05-13 11:28:44","timestamp":1747106924796}}
-        //接下来需要解析buff
-        // const char *delimiter = "{";
-        // const char *start = strstr(buff, delimiter) + strlen(delimiter);//从buff中截取
-        // if (start == NULL) {
-        //     bk_printf("未找到起始标记\n");
-        //     return ;
-        // }
-        // else
-        //     bk_printf("已找到起始标记\n");
-        // const char *stop = strstr(buff, "}") - strlen("}"); // 截取{}里面的部分
-        // if (stop == NULL) {
-        //     bk_printf("未找到结束标记\n");
-        //     return ;
-        // }
-        // else
-        //     bk_printf("已找到结束标记\n");
-        // if (start != NULL && stop != NULL)
-        // {
-        //     bk_printf("start AND stop is OK!");
-        //     size_t length = stop - start;
-        //     char *data = (char *)malloc(length + 1);
-        //     if (data == NULL)
-        //     {
-        //         bk_printf("data == NULL");
-        //         return NULL;
-        //     }
-        //     strncpy(data, start, length);
-        //     data[length] = '\0';
-        //     bk_printf("data:%s",data);
-        //     if(data != "")
-        //     {      
-        //         if(strstr(data,"status_code")+strlen("status_code\":") == "200")
-        //         {
-        //             if(strstr(data,"success")!= NULL)///在前者里面找后者
-        //             {
-        //                 if(strstr(data,"success")+strlen("success\":") == "True")
-        //                 {
-        //                     if(strstr(data,"data")!= NULL)
-        //                     {
-        //                         char * data_tmp = strstr(data,"data")+strlen("data\":");
-        //                         bk_printf("data_tmp == %s",data_tmp);
-        //                         if(strstr(data_tmp,"token")!= NULL)
-        //                             dev_token = strstr(data_tmp,"token")+strlen("token\":");
-        //                         //释放data内存
-        //                         free(data);
-        //                     }
-        //                 }
-
-        //             }
-                    
-        //             if(strstr(data,"code")+strlen("code") == "50003")
-        //                 ntptime_flag = 0;
-        //         }
-        //     }
-        // }  
+        
     }
     // 释放内存
     free(json_string);
@@ -685,6 +634,7 @@ aos_status dev_authentication_MSG_put(const char *data,u32 len,dev_authenticatio
 static void dev_authentication_task(void *thread_input)//鉴权逻辑线程
 {
     dev_authentication_MSG_queue_t dev_authentication_msg = {0};
+    ase_encrypt_demo();
     //dev_NTP();//获取时间
     aut_active();//激活
     aut_login();//登录
diff --git a/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h b/2.code/aicos/app/AI_AMP_2_5/imsl_vad.h
new file mode 100644 (file)
index 0000000..04afa01
--- /dev/null
@@ -0,0 +1,75 @@
+#ifndef _IMSL_VAD_DLL
+#define _IMSL_VAD_DLL
+#include <stdint.h>
+
+struct VadConfig
+{
+    int vad_log_level;                        // 0 不启用  1 INFO  2 INFO、DEBUG
+    int sil_threshold;                        // 静音阈值   推荐值 63 (0-127)  (修改意义不大)
+    int energy_threshold;                     // 能量阈值   推荐值 10000
+    int min_speech_length;                    // 最短语音长度   240 (须小于 rule1_min_tailing_silence)
+    int silence_detect_length;                // vad_silence_detect 接口判定的尾部静音长度, 如果不需要vad_silence_detect接口可以忽略这个参数
+    int rule1_min_tailing_silence;            // 多长时间没有检测到语音重置VAD状态 (ms)        480
+    int rule2_min_tailing_silence;            // 0-10s最短多少静音判定语音结束 (ms)           960  
+    int rule3_min_tailing_silence;            // 10s以上最短多少静音判定语音结束 (ms)          960
+};
+
+/* 初始化vad
+详细参数设置参照 imsl_vad.h
+返回值 :
+    0  初始化失败
+    1  试用模式 (最长30分钟)
+    2  授权模型 (授权失败  控制台会打印,同时转为试用模式)
+*/
+int init_vad(struct VadConfig* conf);
+
+// 运行vad函数,data为16khz  16bit的pcm音频数据  
+// 注意data_len是int16_t的data_len,如果传入u8*或void* 数据data_len需要 / 2
+void run_vad(const int16_t* data, const int data_len);
+
+// 获取VAD的状态
+// 0 静音  1 语音   2 语音结束
+int vad_detect();
+
+// 获取尾部静音的状态
+// 1 尾部静音超过规定时长,0 尾部静音未超过规定时长
+// 注意如果要调用 vad_silence_detect,需要在vad_clear前调用
+int vad_silence_detect();
+
+// 清除尾部静音,调用这个函数后尾部静音长度会清0
+void vad_silence_clear();
+
+// 重置VAD的状态   每次在vad_detect为2时调用
+void vad_clear();
+
+// 释放VAD内存,不使用VAD或暂停使用VAD时调用
+void free_vad();
+
+#endif
+
+/*example :
+    #include "imsl_vad.h"
+
+    // 启用VAD时初始化
+    struct VadConfig conf;
+    conf.sil_threshold = 63;
+    conf.energy_threshold = 10000;
+    conf.min_speech_length = 240;
+    conf.silence_detect_length = 300;
+    conf.rule1_min_tailing_silence = 480;
+    conf.rule2_min_tailing_silence = 960;
+    conf.rule3_min_tailing_silence = 960;
+    conf.vad_log_level = 2;
+    init_vad(&conf);
+
+    // 每次获得语音后调用, 语音长度最好小于100ms
+    // wave为u8*或void*指针时需要 / 2
+    run_vad(wave, wave_len / 2);
+    int status = vad_detect();    
+    if (status == 2) {
+        vad_clear();
+    }
+
+    // 不使用或暂停使用VAD时调用
+    free_vad();
+*/
\ No newline at end of file
diff --git a/2.code/aicos/app/AI_AMP_2_5/libimslvad.a b/2.code/aicos/app/AI_AMP_2_5/libimslvad.a
new file mode 100644 (file)
index 0000000..874671e
Binary files /dev/null and b/2.code/aicos/app/AI_AMP_2_5/libimslvad.a differ
index 56d4328..2476c68 100644 (file)
@@ -2,14 +2,14 @@
 #include <stdio.h>
 #include "stdlib.h"
 #include "string.h"    
-#include "helios_ringbuf.h"
+#include "bk_ringbuf.h"
 #include "aic_osa.h"
 #include "app_audio.h"
 #include "stream_play.h"
 extern int bk_printf(const char *format, ...);
 int bk_stream_play_handle = 0;
 static aos_thread_id bk_stream_play_task_id = 0;
-static helios_ring_buf_t *bk_stream_play_rb;
+static bk_ring_buf_t *bk_stream_play_rb;
 #define PCM_READ_BUF_LEN 4*1024
 char p_data[PCM_READ_BUF_LEN]={0};
 #define ring_buf_len 32*1024
@@ -17,7 +17,7 @@ static void bk_stream_play_task(void *thread_input)//音频播放线程
 {
     while(1)
     {
-        int bytes_read = helios_rb_read(bk_stream_play_rb, (unsigned char*)p_data, PCM_READ_BUF_LEN);
+        int bytes_read = bk_rb_read(bk_stream_play_rb, (unsigned char*)p_data, PCM_READ_BUF_LEN);
         if(bytes_read>0)
         {
             if(bk_stream_play_handle)
@@ -25,7 +25,7 @@ static void bk_stream_play_task(void *thread_input)//音频播放线程
                 int data_sum = audio_write(bk_stream_play_handle, p_data, bytes_read, AOS_WAIT_FOREVER);
                 if(data_sum<1)
                 {
-                    //printf("helios_audio_PCM_stream_task:pcm write error\r\n");
+                    //printf("bk_audio_PCM_stream_task:pcm write error\r\n");
                     bk_printf("bk_stream_play_task audio_write error!!!!!!!");
                 }
             }
@@ -35,7 +35,7 @@ static void bk_stream_play_task(void *thread_input)//音频播放线程
 }
 int bk_stream_play_start(void)
 {
-    bk_stream_play_rb = helios_rb_create(ring_buf_len);
+    bk_stream_play_rb = bk_rb_create(ring_buf_len);
     if(bk_stream_play_handle == 0)
     {
         bk_stream_play_handle = audio_open(ASTREAM_TYPE_MUSIC,
@@ -72,11 +72,11 @@ int bk_stream_play_write(char *data ,u32 len)
         while(1)
         {
             timerout--;
-            if(timerout <=0 ||(helios_rb_data_len(bk_stream_play_rb) + len < ring_buf_len))
+            if(timerout <=0 ||(bk_rb_data_len(bk_stream_play_rb) + len < ring_buf_len))
                 break;
             aos_sleep(1);
         }
-        int write_actual_len = helios_rb_write(bk_stream_play_rb, data, len);
+        int write_actual_len = bk_rb_write(bk_stream_play_rb, data, len);
         return write_actual_len;
     }
     return 0;
index a8b049f..58a048d 100644 (file)
@@ -2820,6 +2820,7 @@ app_audio_status_e app_audio_get_status(app_audio_type_e e_type)
 int32_t app_audio_write(app_audio_type_e e_type, char *p_buf, uint32_t len, uint32_t wait_time)
 {
     // TODO: support stream record
+    //app_logi("app_audio_write:len=%d\r\n",len);
     if ( APP_AUDIO_TYPE_STREAM_DUPLEX != e_type ) {
         alog_error("[%s](%d) The type is NOT stream duplex, NOT support yet.\r\n", __func__, __LINE__);
         return 0;
@@ -2870,7 +2871,7 @@ int32_t app_audio_read(app_audio_type_e e_type, char *p_buf, uint32_t len, uint3
     }
 
     audio_data_len = audio_read(g_aa_handles[APP_AUDIO_TYPE_STREAM_DUPLEX], p_buf, (u32)len, (u32)wait_time);
-
+    //app_logi("app_audio_read:len:%d\r\n",audio_data_len);
     return (int32_t)audio_data_len;
 
 }
index f558016..2feaaf6 100644 (file)
@@ -2000,6 +2000,7 @@ void enable_cereg_urc_callback(u8 *cmd_resp, u8 line_count)
 #ifdef CONFIG_OVER_SIGNAL_THRESHOLD
         aic_send_cmd_with_callback("AT^ATEST=12,1", AIC_NULL);
 #endif
+////BK_DBUG 正常打开注释
 #ifdef CONFIG_TELE_CTRL_BY_AT
         /* Not send AT+CFUN=1 in gxem mode. */
         if (!aic_boot_mode_is_gxem()) {
index 341132e..40e7259 100644 (file)
@@ -39,7 +39,7 @@ config SND_STREAM_CMUX
 config SND_STREAM_VOICE_MIX
     bool "voice mix stream"
     default y
-    depends on SOUND_SUPPORT && MCU_AUDIO_VOICE_CLIENT
+    depends on SOUND_SUPPORT && (MCU_AUDIO_VOICE_CLIENT || MCU_AUDIO_VOIP_CLIENT)
     help
         Enable voice mix stream.
 
index dac98c8..f1ac627 100644 (file)
@@ -18,7 +18,7 @@
 /* Auto gen by tool, don't change it. */
 #define AIC_THIS_FILE    0x091cd4
 #define LOG_MODULE    AMOD_SOUND
-
+#define BK_CODEC 1
 #include <stdio.h>
 #include <stdlib.h>
 #include <aic_assert.h>
 #include <timer_inc.h>
 #include <mha.h>
 #include <audio/snd_config.h>
-
+#include <gpio_inc.h>
 #include "snd_card.h"
 #include "snd_dpm_driver.h"
 #include "snd_ext_pa.h"
 
 #include "es8311.h"
 #include <pmic_io.h>
-
+#include "AI_AMP_2_5.h"
 #define SND_SOC_NOPM                    -1
 
 #define snd_soc_component_write         dpm_reg_write
@@ -605,12 +605,18 @@ static void es8311_ext_power(BOOL on)
     if (on) {
         if (!es8311_data->ext_power_on) {
             pmu_enable(es8311_data->power);
+            #if BK_CODEC ==1
+            aic_gpio_output(GPIO_GPO_13,GPIO_OUTPUT_LVL_HIGH );
+            #endif
             es8311_data->ext_power_on = TRUE;
             printk("ext power on\n");
             aic_mdelay(2);
         }
     } else {
         if (es8311_data->ext_power_on) {
+            #if BK_CODEC ==1
+            aic_gpio_output(GPIO_GPO_13,GPIO_OUTPUT_LVL_LOW);
+            #endif
             pmu_disable(es8311_data->power);
             es8311_data->ext_power_on = FALSE;
         }
@@ -997,6 +1003,9 @@ static int amic_event(struct snd_dpm_widget *w,
     switch (event) {
     case SND_DPM_PRE_PMU:
         pmu_enable(es8311->vmicbias);
+        #if BK_CODEC ==1
+            aic_gpio_output(GPIO_GPO_13,GPIO_OUTPUT_LVL_HIGH );
+        #endif
         printk("amic vmicbias on!\n");
         if (es8311->is_low_domain)
             aos_sleep(20);
@@ -1144,6 +1153,7 @@ static int es8311_probe(struct snd_codec *codec)
     printk("Enter into %s()\n", __func__);
     snd_soc_component_set_drvdata(codec, (u32)es8311);
     es8311->codec = codec;
+    bk_printf("es8311_probe:id:%d",codec->id);
     if (codec == NULL) {
         dev_err("Codec device not registered\n");
         return AIC_ENODEV;
@@ -1304,8 +1314,11 @@ static int es8311_i2c_probe(void)
 #endif
     if (es8311->power)
         pmu_enable(es8311->power);
-
+    #if BK_CODEC ==1
+    aic_gpio_output(GPIO_GPO_13,GPIO_OUTPUT_LVL_HIGH );
+    #endif
     i2c_init(&es8311->client);
+    bk_printf("es8311_i2c_probe:es8311->client=%d",es8311->client.index);
 
     es8311_data = es8311;
     ret =  snd_card_register_codec("es8311", &soc_component_dev_es8311);
index e368432..00f7983 100644 (file)
@@ -279,7 +279,7 @@ void pcm_buf_done(void *param)
 {
     struct pcm_rtd *rtd = (struct pcm_rtd *)param;
     struct snd_stream_runtime *runtime = rtd->stream->runtime;
-
+    
     rtd->dsp_copied_total += runtime->fragment_size;
     if (rtd->stream->direction == SND_STREAM_PLAYBACK) {
         rtd->irq_cnt++;
@@ -288,6 +288,17 @@ void pcm_buf_done(void *param)
             rtd->app_pointer = runtime->fragment_size *
                                     (rtd->irq_cnt % runtime->fragments);
             SNX_ERROR(0x042705, "", "U\n");
+            // static u64 timer_ms = 0;
+            // if(aos_get_tickcount() - timer_ms<2000)
+            // {
+            //     SNX_ERROR(0x042705, "", "pcm_buf_done Error !!!!!!!!!!!!!!!!!!!!!!!!!!U\n");
+            //     aos_sleep(100);
+            //     AIC_ASSERT(0);
+            // }
+                
+            // timer_ms = aos_get_tickcount();
+
+            //AIC_ASSERT(0);
         }
     }
 
index 24c1312..ddd91ab 100644 (file)
@@ -332,7 +332,7 @@ static int asink_stream_rec_callback(u32 obj, int event, char *buffer,
 
 #define CLIENT_LOCK
 #define CLIENT_SEMPH_SET(s)    if (s) aos_put_semaphore(s);
-#define CLIENT_SEMPH_GET(s)    if (s) aos_get_semaphore(s, 41);
+#define CLIENT_SEMPH_GET(s)    if (s) aos_get_semaphore(s, 1);//(s, 41)
 
 struct client_voip {
     void *hvp;
index e72d7f4..ef76e7b 100644 (file)
Binary files a/2.code/aicos/mm/audio/vendor/voiceproc/lib/libvoiceproc.a and b/2.code/aicos/mm/audio/vendor/voiceproc/lib/libvoiceproc.a differ
index 9da7cca..61105af 100644 (file)
Binary files a/2.code/aicos/mm/audio/vendor/voiceproc/lib_ext/libvoiceproc.a and b/2.code/aicos/mm/audio/vendor/voiceproc/lib_ext/libvoiceproc.a differ
index 9d49664..2880ebd 100644 (file)
@@ -14,7 +14,7 @@
 #ifndef __SND_CONFIG_H__
 
 #ifdef CONFIG_SOUND_CODEC_ES8311
-#define SND_CODEC_DEFALT_ADC_GAIN   0xBF
+#define SND_CODEC_DEFALT_ADC_GAIN   0xCF//0xBF
 #define SND_CODEC_DEFALT_DAC_GAIN   0xBF
 #define SND_CODEC_DMIC_EN           0
 #define SND_CODEC_MCLK_INV          0
index d342a4d..bba7668 100644 (file)
@@ -68,7 +68,7 @@ PMU_UNIT_INFO_OPS(VDDUSB3V1,VBAT, REG_GLB_PD_LDO5_CFG_REG, BIT_GLB_PD_LDO_VSEL_R
 PMU_UNIT_INFO_OPS(VDDTCXO,VBAT, REG_GLB_PD_LDO6_CFG_REG, BIT_GLB_PD_LDO_VSEL_REG(0x1F, 0x1F),
             REG_PMU_RTC_LDO6_BOUND_REG, BIT_PMU_RTC_BUCK_LDO_POWER_DOWN_REG,
             REG_PMU_RTC_DCDC_LDO_CFG_UPDATE_REG, BIT_PMU_RTC_BUCK_LDO_POWER_DOWN_REG,
-            1600000, 1987500, 12500, GP201_SCALING_SETTLING_TIME, GP201_PD_SETTLING_TIME, false, false, true, &gp202_pmu_ldo_gen_ops, 0),
+            1600000, 1987500, 12500, GP201_SCALING_SETTLING_TIME, GP201_PD_SETTLING_TIME, true, true, true, &gp202_pmu_ldo_gen_ops, 0),
 #else
 
 
index cef9257..3804231 100644 (file)
@@ -15,7 +15,7 @@
 
 /* at cmd dev config tbl. */
 const static conn_dev_t s_at_dev_tbl[] = {
-    {AIC_IODEV_UART,    AIC_COM0}, /* use the uart com5. */
+//    {AIC_IODEV_UART,    AIC_COM0}, /* use the uart com5. */
 #ifdef CONFIG_CDC_ACM_INSTANCE
     {AIC_IODEV_USB,     AIC_COM2}, /* use the usb com2. */
 #endif
index c651200..df1f3cf 100644 (file)
 /*****************************************************************************/
 
 #define KEY_0_EIPU_INDEX              (0)
-#define KEY_1_GPIO_INDEX              (GPIO_1)
-#define KEY_2_GPIO_INDEX              (GPIO_17)
-#define KEY_3_GPIO_INDEX              (GPIO_AGPIO_3)
-#define KEY_4_GPIO_INDEX              (GPIO_19)
+#define KEY_1_GPIO_INDEX              (GPIO_AGPIO_0)
+#define KEY_2_GPIO_INDEX              (GPIO_AGPIO_3)
+#define KEY_3_GPIO_INDEX              (4)
+//#define KEY_4_GPIO_INDEX              (GPIO_19)
 
 gpio_key_config_t g_gpio_key_config[] = {
 
@@ -61,8 +61,8 @@ gpio_key_config_t g_gpio_key_config[] = {
     {KEY_0, KEY_0_EIPU_INDEX, KEY_TYPE_EIPU},
     {KEY_1, KEY_1_GPIO_INDEX, KEY_TYPE_GPIO},
     {KEY_2, KEY_2_GPIO_INDEX, KEY_TYPE_GPIO},
-    {KEY_3, KEY_3_GPIO_INDEX, KEY_TYPE_GPIO},
-    {KEY_4, KEY_4_GPIO_INDEX, KEY_TYPE_GPIO},
+    {KEY_3, KEY_3_GPIO_INDEX, KEY_TYPE_EIPU},
+    //{KEY_4, KEY_4_GPIO_INDEX, KEY_TYPE_GPIO},
 
     /* add key upside */
     {0, 0, KEY_TYPE_MAX}
index 133f2cf..63d3826 100644 (file)
@@ -1,6 +1,6 @@
 /*****************************************************************************/
 /*                                                                           */
-/*    Copyright 2024 by AICXTEK TECHNOLOGIES CO.,LTD. All rights reserved.   */
+/*    Copyright 2025 by AICXTEK TECHNOLOGIES CO.,LTD. All rights reserved.   */
 /*                                                                           */
 /*****************************************************************************/
 
@@ -9,7 +9,7 @@
 /* @@Platform: GX306 */
 /* @@Author:  */
 /* @@Version:  */
-/* @@Time: 2024/8/17 17:02:52 */
+/* @@Time: 2025/5/13 17:00:19 */
 
 #ifndef __PIN_CFG_H__
 #define __PIN_CFG_H__
@@ -40,8 +40,8 @@ const u32 pin_cfg0[][2] = {
 {REG_PG1_PAD_CTRL_RFCTRL1,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_IOMUX_RFCTRL2,                   BIT_FUNC_SEL(0)},//RFCTRL3
 {REG_PG1_PAD_CTRL_RFCTRL2,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_RFCTRL3,                   BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG1_PAD_CTRL_RFCTRL3,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
+{REG_IOMUX_RFCTRL3,                   BIT_FUNC_SEL(3)},//GPIO27_AUDIO_PA_EN,ACTIVE LOW
+{REG_PG1_PAD_CTRL_RFCTRL3,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
 {REG_IOMUX_RFCTRL4,                   BIT_FUNC_SEL(4)},//U1TXD
 {REG_PG1_PAD_CTRL_RFCTRL4,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
 {REG_IOMUX_RFCTRL5,                   BIT_FUNC_SEL(4)},//U1RXD
@@ -51,8 +51,8 @@ const u32 pin_cfg0[][2] = {
 {REG_IOMUX_RFCTRL7,                   BIT_FUNC_SEL(1)},//RFFE_SDA
 {REG_PG1_PAD_CTRL_RFCTRL7,            BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 /* Group2 */
-{REG_IOMUX_IIS_MCLK,                  BIT_FUNC_SEL(0)},//IIS_MCLK
-{REG_PG2_PAD_CTRL_IIS_MCLK,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_IIS_MCLK,                  BIT_FUNC_SEL(3)},//GPIO20_MOT_EN1
+{REG_PG2_PAD_CTRL_IIS_MCLK,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
 {REG_IOMUX_IIS_CLK,                   BIT_FUNC_SEL(0)},//IIS_CLK
 {REG_PG2_PAD_CTRL_IIS_CLK,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_IOMUX_IIS_LRCLK,                 BIT_FUNC_SEL(0)},//IIS_LRCLK
@@ -66,18 +66,18 @@ const u32 pin_cfg0[][2] = {
 {REG_IOMUX_UART1_TXD,                 BIT_FUNC_SEL(0)},//DEBUG_TXD
 {REG_PG2_PAD_CTRL_UART1_TXD,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
 /* Group3 */
-{REG_IOMUX_SSP_CS1,                   BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG3_PAD_CTRL_SSP_CS1,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
-{REG_IOMUX_SSP_CLK,                   BIT_FUNC_SEL(4)},// IIC.SDA.INF3
-{REG_PG3_PAD_CTRL_SSP_CLK,            BIT_PAD_DRV(2)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_SSP_CS0,                   BIT_FUNC_SEL(4)},// IIC.SCL.INF3
-{REG_PG3_PAD_CTRL_SSP_CS0,            BIT_PAD_DRV(2)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_SSP_MISO,                  BIT_FUNC_SEL(3)},//KEYIN
-{REG_PG3_PAD_CTRL_SSP_MISO,           BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_SSP_MOSI,                  BIT_FUNC_SEL(3)},//KEYOUT
-{REG_PG3_PAD_CTRL_SSP_MOSI,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CL},
-{REG_IOMUX_AUX_CLK0,                  BIT_FUNC_SEL(3)},//KEYIN
-{REG_PG3_PAD_CTRL_AUX_CLK0,           BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_SSP_CS1,                   BIT_FUNC_SEL(3)},//2210_WAKE_6824
+{REG_PG3_PAD_CTRL_SSP_CS1,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_SSP_CLK,                   BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_CLK,            BIT_PAD_DRV(2)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_CS0,                   BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_CS0,            BIT_PAD_DRV(2)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_MISO,                  BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_MISO,           BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_SSP_MOSI,                  BIT_FUNC_SEL(3)},//NC
+{REG_PG3_PAD_CTRL_SSP_MOSI,           BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_AUX_CLK0,                  BIT_FUNC_SEL(5)},//IIS_MCLK
+{REG_PG3_PAD_CTRL_AUX_CLK0,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 /* Group4 */
 {REG_PG4_PAD_CTRL_PSRAM_RWDS,         BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_PG4_PAD_CTRL_PSRAM_DQ7,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
@@ -94,17 +94,17 @@ const u32 pin_cfg0[][2] = {
 {REG_PG4_PAD_CTRL_PSRAM_DM,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_PG4_PAD_CTRL_PSRAM_RESETB,       BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_NONE|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
 /* Group5 */
-{REG_IOMUX_GPO0,                      BIT_FUNC_SEL(4)},//NETLIGHT
+{REG_IOMUX_GPO0,                      BIT_FUNC_SEL(4)},//TP_EN_GPO0
 {REG_PG5_PAD_CTRL_GPO0,               BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
-{REG_IOMUX_GPO1,                      BIT_FUNC_SEL(1)},//UART0_DTR
-{REG_PG5_PAD_CTRL_GPO1,               BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_EIU_INT4,                  BIT_FUNC_SEL(4)},//UART0_RI
-{REG_PG5_PAD_CTRL_EIU_INT4,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT5,                  BIT_FUNC_SEL(4)},//UART0_DCD
-{REG_PG5_PAD_CTRL_EIU_INT5,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT6,                  BIT_FUNC_SEL(4)},//reserved
+{REG_IOMUX_GPO1,                      BIT_FUNC_SEL(4)},//MOT_EN_REV_GPO1
+{REG_PG5_PAD_CTRL_GPO1,               BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_EIU_INT4,                  BIT_FUNC_SEL(0)},//KEY3_INT4
+{REG_PG5_PAD_CTRL_EIU_INT4,           BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_EIU_INT5,                  BIT_FUNC_SEL(4)},//GPO3_INT5_TPQ1
+{REG_PG5_PAD_CTRL_EIU_INT5,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_EIU_INT6,                  BIT_FUNC_SEL(5)},//IIC3_SDA
 {REG_PG5_PAD_CTRL_EIU_INT6,           BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_EIU_INT7,                  BIT_FUNC_SEL(4)},//reserved
+{REG_IOMUX_EIU_INT7,                  BIT_FUNC_SEL(5)},//IIC3_SCL
 {REG_PG5_PAD_CTRL_EIU_INT7,           BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
 {REG_IOMUX_SWD_CLK,                   BIT_FUNC_SEL(0)},//SWD_CLK
 {REG_PG5_PAD_CTRL_SWD_CLK,            BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
@@ -124,18 +124,18 @@ const u32 pin_cfg0[][2] = {
 {REG_PG6_PAD_CTRL_PMIC_INT,           BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_IE},
 {REG_IOMUX_CHIP_SLEEP,                BIT_FUNC_SEL(0)},//CHIP_SLEEP
 {REG_PG6_PAD_CTRL_CHIP_SLEEP,         BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
-{REG_IOMUX_UART0_TXD,                 BIT_FUNC_SEL(0)},//UART0_TXD
-{REG_PG6_PAD_CTRL_UART0_TXD,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_UART0_RXD,                 BIT_FUNC_SEL(0)},//UART0_RXD
-{REG_PG6_PAD_CTRL_UART0_RXD,          BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_UART0_CTS,                 BIT_FUNC_SEL(0)},//UART0_CTS
-{REG_PG6_PAD_CTRL_UART0_CTS,          BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_UART0_RTS,                 BIT_FUNC_SEL(0)},//UART0_RTS
-{REG_PG6_PAD_CTRL_UART0_RTS,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_UART0_TXD,                 BIT_FUNC_SEL(4)},//MOT_EN_FWD_GPO
+{REG_PG6_PAD_CTRL_UART0_TXD,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_UART0_RXD,                 BIT_FUNC_SEL(4)},//STATUS_GPO9
+{REG_PG6_PAD_CTRL_UART0_RXD,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
+{REG_IOMUX_UART0_CTS,                 BIT_FUNC_SEL(1)},//G_EINT_INT6_GPO1
+{REG_PG6_PAD_CTRL_UART0_CTS,          BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_UART0_RTS,                 BIT_FUNC_SEL(4)},//GPO11_INT7_TPQ2
+{REG_PG6_PAD_CTRL_UART0_RTS,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
 {REG_IOMUX_EIU_INT0,                  BIT_FUNC_SEL(0)},//U_BOOT_KEY_KEYIN
 {REG_PG6_PAD_CTRL_EIU_INT0,           BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
-{REG_IOMUX_EIU_INT3,                  BIT_FUNC_SEL(0)},//SIM0_DET
-{REG_PG6_PAD_CTRL_EIU_INT3,           BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_EIU_INT3,                  BIT_FUNC_SEL(4)},//CODEC_VDD_EN_GPO13
+{REG_PG6_PAD_CTRL_EIU_INT3,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_PX|BIT_PAD_SLP_OE},
 {REG_IOMUX_EIU_INT2,                  BIT_FUNC_SEL(0)},//USB_VBUS_INT
 {REG_PG6_PAD_CTRL_EIU_INT2,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_PX|BIT_PAD_SLP_IE},
 /* Group7 */
@@ -148,11 +148,11 @@ const u32 pin_cfg0[][2] = {
 {REG_IOMUX_CAM_SPI_D0,                BIT_FUNC_SEL(0)},//CAM_SI0
 {REG_PG7_PAD_CTRL_CAM_SPI_D0,         BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_IOMUX_GPIO0,                     BIT_FUNC_SEL(0)},//CAM_PWDN
-{REG_PG7_PAD_CTRL_GPIO0,              BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_PG7_PAD_CTRL_GPIO0,              BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_IOMUX_CAM_SPI_CLK,               BIT_FUNC_SEL(0)},//CAM_SCK
 {REG_PG7_PAD_CTRL_CAM_SPI_CLK,        BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_GPIO1,                     BIT_FUNC_SEL(0)},//KEYIN
-{REG_PG7_PAD_CTRL_GPIO1,              BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPU|BIT_PAD_SLP_IE},
+{REG_IOMUX_GPIO1,                     BIT_FUNC_SEL(0)},//CAM_RST0
+{REG_PG7_PAD_CTRL_GPIO1,              BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 {REG_IOMUX_CAM_SPI_D1,                BIT_FUNC_SEL(0)},//CAM_SI1
 {REG_PG7_PAD_CTRL_CAM_SPI_D1,         BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 /* Group8 */
@@ -176,27 +176,27 @@ const u32 pin_cfg0[][2] = {
 {REG_IOMUX_SIM_DAT,                   BIT_FUNC_SEL(0)},//SIM0_DAT
 {REG_PG9_PAD_CTRL_SIM_DAT,            BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_CP|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
 /* Group10 */
-{REG_IOMUX_CAN_TXD,                   BIT_FUNC_SEL(4)},//SIM1_RST
-{REG_PG10_PAD_CTRL_CAN_TXD,           BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
-{REG_IOMUX_CAN_RXD,                   BIT_FUNC_SEL(4)},//SIM1_DAT
-{REG_PG10_PAD_CTRL_CAN_RXD,           BIT_PAD_DRV(1)|BIT_PAD_SSPU|BIT_PAD_SLP_CP|BIT_PAD_SLP_SPU|BIT_PAD_SLP_Z},
-{REG_IOMUX_CAN_STBY,                  BIT_FUNC_SEL(4)},//SIM1_CLK
-{REG_PG10_PAD_CTRL_CAN_STBY,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_CP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_TXD,                   BIT_FUNC_SEL(6)},//LED1_GPIO30
+{REG_PG10_PAD_CTRL_CAN_TXD,           BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_RXD,                   BIT_FUNC_SEL(6)},//LED2_GPIO32
+{REG_PG10_PAD_CTRL_CAN_RXD,           BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_CAN_STBY,                  BIT_FUNC_SEL(6)},//LED0_GPIO25
+{REG_PG10_PAD_CTRL_CAN_STBY,          BIT_PAD_DRV(1)|BIT_PAD_WPD|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
 /* Group11 */
-{REG_IOMUX_SPI_LCD_SDI,               BIT_FUNC_SEL(6)},//GPIO2
+{REG_IOMUX_SPI_LCD_SDI,               BIT_FUNC_SEL(6)},//NC
 {REG_PG11_PAD_CTRL_SPI_LCD_SDI,       BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_TOP|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_SDO,               BIT_FUNC_SEL(0)},//SPI_LCD_SIO
+{REG_IOMUX_SPI_LCD_SDO,               BIT_FUNC_SEL(5)},//SPI_D0
 {REG_PG11_PAD_CTRL_SPI_LCD_SDO,       BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_DCX,               BIT_FUNC_SEL(0)},//SPI_LCD_SDC
+{REG_IOMUX_SPI_LCD_DCX,               BIT_FUNC_SEL(5)},//SPI_D1
 {REG_PG11_PAD_CTRL_SPI_LCD_DCX,       BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_CS,                BIT_FUNC_SEL(0)},//SPI_LCD_CS
-{REG_PG11_PAD_CTRL_SPI_LCD_CS,        BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_SPI_LCD_CLK,               BIT_FUNC_SEL(0)},//SPI_LCD_CLK
+{REG_IOMUX_SPI_LCD_CS,                BIT_FUNC_SEL(5)},//SPI_D2
+{REG_PG11_PAD_CTRL_SPI_LCD_CS,        BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_SPI_LCD_CLK,               BIT_FUNC_SEL(5)},//SPI_CLK
 {REG_PG11_PAD_CTRL_SPI_LCD_CLK,       BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_LCD_FMARK,                 BIT_FUNC_SEL(0)},//LCD_FMARK
-{REG_PG11_PAD_CTRL_LCD_FMARK,         BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
-{REG_IOMUX_LCD_RSTN,                  BIT_FUNC_SEL(3)},//WAKEOUT(default GPIO)/LCD_RSTN
-{REG_PG11_PAD_CTRL_LCD_RSTN,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPD|BIT_PAD_SLP_Z},
+{REG_IOMUX_LCD_FMARK,                 BIT_FUNC_SEL(5)},//SPI_D3
+{REG_PG11_PAD_CTRL_LCD_FMARK,         BIT_PAD_DRV(1)|BIT_PAD_WPU|BIT_PAD_SLP_MCU|BIT_PAD_SLP_WPU|BIT_PAD_SLP_Z},
+{REG_IOMUX_LCD_RSTN,                  BIT_FUNC_SEL(5)},//SPI_CS
+{REG_PG11_PAD_CTRL_LCD_RSTN,          BIT_PAD_DRV(1)|BIT_PAD_PX|BIT_PAD_SLP_MCU|BIT_PAD_SLP_PX|BIT_PAD_SLP_CH},
 };
 
 dig_pin_cfg_t g_dig_pinlist0[] = {
@@ -225,13 +225,13 @@ const u32 gp202_pin_cfg0[][2] = {
 {GP202_IIC_CLK,                       BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
 {GP202_IO_MUX_IIC_DAT,                BIT_FUNC_SEL(0)},//pmic IIC SDA
 {GP202_IIC_DAT,                       BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
-{GP202_IO_MUX_GPIO0,                  BIT_FUNC_SEL(2)},//ADC0
-{GP202_GPIO0,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO1,                  BIT_FUNC_SEL(2)},//ADC1
+{GP202_IO_MUX_GPIO0,                  BIT_FUNC_SEL(0)},//KEY1
+{GP202_GPIO0,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
+{GP202_IO_MUX_GPIO1,                  BIT_FUNC_SEL(0)},//PIN96_TPQ0
 {GP202_GPIO1,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO2,                  BIT_FUNC_SEL(1)},//RTC_IN
-{GP202_GPIO2,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_PX},
-{GP202_IO_MUX_GPIO3,                  BIT_FUNC_SEL(0)},//KEYIN
+{GP202_IO_MUX_GPIO2,                  BIT_FUNC_SEL(0)},//NC
+{GP202_GPIO2,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPD},
+{GP202_IO_MUX_GPIO3,                  BIT_FUNC_SEL(0)},//KEY2
 {GP202_GPIO3,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPU},
 {GP202_IO_MUX_GPIO4,                  BIT_FUNC_SEL(0)},//NC
 {GP202_GPIO4,                         BIT_GP202_PAD_DRV(1)|BIT_GP202_PAD_WPD},
index 7a9d693..92685ca 100644 (file)
@@ -1102,5 +1102,5 @@ CONFIG_APP_AI_AMP_2_5=y
 CONFIG_VENDORS=y
 # CONFIG_SSV_WIFI is not set
 # CONFIG_FOTA_SUPPORT_ABUP is not set
-CONFIG_TTS_IFLY=y
+# CONFIG_TTS_IFLY is not set
 # CONFIG_TC_IOT_VIDEO is not set
index 07841cb..5a02d51 100644 (file)
Binary files a/2.code/aicos/projects/banyan/nvram/ap/gx306l_h3/native/bin/VOIP_SPK_Mode.bin and b/2.code/aicos/projects/banyan/nvram/ap/gx306l_h3/native/bin/VOIP_SPK_Mode.bin differ