1、死机问题
authordxy <1731678236qq.com>
Tue, 30 Sep 2025 06:30:26 +0000 (14:30 +0800)
committerdxy <1731678236qq.com>
Tue, 30 Sep 2025 06:30:26 +0000 (14:30 +0800)
2、删除耳机key不再重连

15 files changed:
2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c
2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c
2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h
2.code/1.sdk/apps/BK_app/bk_app.c
2.code/1.sdk/apps/BK_app/bk_app.h
2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c
2.code/1.sdk/apps/watch/include/task_manager/bt/bt_emitter.h
2.code/1.sdk/apps/watch/log_config/lib_btstack_config.c
2.code/1.sdk/apps/watch/task_manager/bt/bt.c
2.code/1.sdk/apps/watch/task_manager/bt/bt_emitter.c
2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c
2.code/1.sdk/cpu/br28/audio_link.c
2.code/1.sdk/cpu/br28/liba/btctrler.a
2.code/1.sdk/cpu/br28/liba/btstack.a
2.code/1.sdk/cpu/br28/liba/rcsp_stack.a

index cb2be86..a41fbab 100644 (file)
@@ -199,18 +199,25 @@ static void bk_iis_rx_cb(void *priv, void *buf, int len)
     static i = 0;
     int rlen ;
     //  putchar('s');
-    char *tmpbuf = zalloc(len);
-    if(tmpbuf)
+    char *single_buf = zalloc(len*2);
+    if(single_buf)
     {
-         //printf("bk_iis_rx_cb:,len:%d",len);
-        //pcm_LR_to_mono((s16*)buf, (s16 *)tmpbuf, len/4);
-        // wlen = app_audio_output_write(alink_demo_hdl->tmpbuf,cbuf_len/2);
-
-        pcm_dual_to_single(tmpbuf, buf,len*2);
-        //rlen = dac_write_pcm((char *)tmpbuf,len/2);
-        audio_link_demo_RX_data((char *)tmpbuf,len/2);
-
-        free(tmpbuf);
+        // char *dual_buf = zalloc(len*2);
+        // if(dual_buf)
+        {
+            //memcpy(dual_buf,buf,len*2);
+            //pcm_LR_to_mono(dual_buf,single_buf,len/2);
+            //printf("bk_iis_rx_cb1:%x %d",buf,len);
+            //pcm_LR_to_mono((s16*)buf, (s16 *)single_buf, len/4);
+            // wlen = app_audio_output_write(alink_demo_hdl->single_buf,cbuf_len/2);
+
+            pcm_dual_to_single(single_buf, buf,len);
+            //printf("bk_iis_rx_cb2");
+            //rlen = dac_write_pcm((char *)single_buf,len/2);
+            audio_link_demo_RX_data((char *)single_buf,len/2);
+            //free(dual_buf);
+        }
+        free(single_buf);
     }else
     {
         log_info("%s: alloc ERROR!!!!!!",__FUNCTION__);
@@ -462,7 +469,9 @@ int audio_link_demo_RX_data(char *data, int len)
         }
         void *c_data = cbuf_write_alloc(dac_cbuffer, &wlen);
         if (wlen < len ) {
+            printf("CBUF NO ENOUGH MEMORY!1");
             ASSERT(0, "CBUF NO ENOUGH MEMORY!!!");
+            printf("CBUF NO ENOUGH MEMORY!2");
         }
         //log_info("%s2:len!!!!!!",__FUNCTION__,len);
         //pcm_single_to_dual(data, data, len);
index afc158d..45c8b62 100644 (file)
@@ -14,6 +14,7 @@
 #include "bk_uart.h"
 #include "BK_versions.h"
 #include "btstack/avctp_user.h"
+#define UART_RECV_MAX_COUNT 512 //可更改串口发送数据最大长度
 int ut=0;
 static u8 uart_send_flag = 0;
 static u8 uart_recv_flag = 0;
@@ -239,11 +240,11 @@ void bk_uart_recv_task(void *p)
             if(uart_timer_id == 0)//有数据启动定时器
                 uart_timer_id = sys_timer_add(NULL, uart_timer_cb, 10);
             uart_timer_count = 0;
-            if(uart_data_len+512>uart_read_buf_len)
+            if(uart_data_len+UART_RECV_MAX_COUNT>uart_read_buf_len)
             {
                 uart_data_len = 0;
             }
-            int r = uart_recv_blocking(ut, uart_dma_buf, 512, 10);
+            int r = uart_recv_blocking(ut, uart_dma_buf, UART_RECV_MAX_COUNT, 10);
             if (r > 0) {
                 memcpy(uart_data+uart_data_len,(u8 *)uart_dma_buf,r);
                 //log_info("分段数据!***len:%d uart_data_len:%d*****", r,uart_data_len);
@@ -447,8 +448,8 @@ void bk_uart_init()
         .parity = UART_PARITY_DISABLE,
     };
     if(uart_dma_buf == NULL)
-        uart_dma_buf = dma_malloc(512);
-    memset(uart_dma_buf,0,512);
+        uart_dma_buf = dma_malloc(UART_RECV_MAX_COUNT);
+    memset(uart_dma_buf,0,UART_RECV_MAX_COUNT);
     if(uart_data == NULL)
     {
         uart_data = zalloc(uart_read_buf_len);
@@ -458,7 +459,7 @@ void bk_uart_init()
 
     struct uart_dma_config dma = {
         .rx_timeout_thresh = 500,
-        .frame_size = 512,
+        .frame_size = UART_RECV_MAX_COUNT,
         .event_mask =  UART_EVENT_RX_DATA|UART_EVENT_RX_TIMEOUT,
         .tx_wait_mutex = 0,
         .irq_priority = 6,
@@ -523,7 +524,7 @@ int uart_send_AI_key_even(void)
     }
     // 打印JSON字符串
     
-    bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
+    bk_uart_send_smg(BK_UART_WRITE_DATA_ACK,json_string,strlen(json_string));
     //bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));(ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
@@ -551,7 +552,7 @@ int uart_send_BT_AI_key_even(void)
     }
     // 打印JSON字符串
     
-    bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
+    bk_uart_send_smg(BK_UART_WRITE_DATA_ACK,json_string,strlen(json_string));
     //bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));(ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
@@ -578,7 +579,7 @@ int uart_send_PWR_key_even(void)
     }
     
     printf("JSON数据: %s\n", json_string);
-    bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
+    bk_uart_send_smg(BK_UART_WRITE_DATA_ACK,json_string,strlen(json_string));
     // (ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
@@ -721,15 +722,15 @@ int uart_send_bt_list(u8 *data)
     u16 len_tmp = 0;
     u16 data_flag = 1;
     u16 date_len = strlen(data);
-    if (date_len >= 512){
+    if (date_len >= UART_RECV_MAX_COUNT){
         while (data_flag)
         {
             //531
-            if (date_len >= 512){
+            if (date_len >= UART_RECV_MAX_COUNT){
                 printf("uart_send_bt_list 1");
-                bk_uart_send_smg(BK_UART_WRITE_DATA, data+len_tmp,512);
-                // uart_send_blocking(ut, data+len_tmp, 512, 200);
-                len_tmp+=512;
+                bk_uart_send_smg(BK_UART_WRITE_DATA, data+len_tmp,UART_RECV_MAX_COUNT);
+                // uart_send_blocking(ut, data+len_tmp, UART_RECV_MAX_COUNT, 200);
+                len_tmp+=UART_RECV_MAX_COUNT;
             }else{
                 if(date_len >= 0){
                     printf("uart_send_bt_list 2");
@@ -741,7 +742,7 @@ int uart_send_bt_list(u8 *data)
                 break; //最后一包
             }
             //532
-            date_len=date_len-512;
+            date_len=date_len-UART_RECV_MAX_COUNT;
             if(date_len <= 0){
                 data_flag = 0;
                 break;
@@ -785,7 +786,7 @@ int uart_send_versions(void)
     }
     
     printf("JSON数据: %s\n", json_string);
-    bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string));
+    bk_uart_send_smg(BK_UART_WRITE_DATA_ACK,json_string,strlen(json_string));
     // (ut, json_string, strlen(json_string), 20);
     // 释放内存
     cJSON_free(json_string);
@@ -1141,23 +1142,54 @@ void print_hex(char *data ,int len)
 //清楚蓝牙耳机连接记录
 extern u8 *get_cur_connect_emitter_mac_addr(void);
 extern void delete_link_key(bd_addr_t *bd_addr, u8 id);
-void clear_earphone_record(void){
-    if(bt_connect){
-        user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
+u8 delete_key_flag = 0;
+void send_clear_earphone_key_msg(void)
+{
+    printf("send_clear_earphone_key_ms:%s %d",__func__,delete_key_flag);
+    if(delete_key_flag){
+        bk_app_send_smg(DELETE_BT_KEY,NULL,0); 
     }
-    delete_last_device_from_vm();
-    u8 delete_mac[6]={0};
-    uart_send_clear_earphoneok();
-    printf("删除连接密钥!!!!!!!");
-    if(memcmp(bt_conn_addr,"\0\0\0\0\0\0",6) != 0){
-        printf("删除连接密钥:%02X:%02X:%02X:%02X:%02X:%02X",bt_conn_addr[5],bt_conn_addr[4],bt_conn_addr[3],bt_conn_addr[2],bt_conn_addr[1],bt_conn_addr[0]);
-        for (u8 i = 0; i < 6; i++)
-        {
-            delete_mac[i]=bt_conn_addr[5-i];
-        }
-        printf("连接密钥:%02X:%02X:%02X:%02X:%02X:%02X",delete_mac[5],delete_mac[4],delete_mac[3],delete_mac[2],delete_mac[1],delete_mac[0]);
-        // delete_link_key((bd_addr_t *)delete_mac,1);
-        
+}
+extern void connect_target_mac();//先断开再去连接目标设备
+extern u8 delete_target_mac[6]; //需要删除的目标mac地址key
+u8 ai_delete_key = 0; //通过AI对话删除连接设备key
+u8 reconnect_dev = 0;
+void clear_earphone_key(void) //清除设备key不再回连旧的设备
+{
+    printf("delete_key_flag:%s %d %02X:%02X:%02X:%02X:%02X:%02X",__func__,delete_key_flag,delete_target_mac[0],delete_target_mac[1],\
+        delete_target_mac[2],delete_target_mac[3],delete_target_mac[4],delete_target_mac[5]);
+    if(delete_key_flag){
+        delete_key_flag=0;
+        printf("delete_last_device_from_vm start");
+        reconnect_dev=1;
+        // user_send_cmd_prepare(USER_CTRL_DEL_ALL_REMOTE_INFO, 0, NULL);
+        delete_last_device_from_vm();
+        printf("delete_last_device_from_vm end");
+    }
+    if(!ai_delete_key)
+    {
+        connect_target_mac();
+    }
+    ai_delete_key=0;
+    delete_key_flag=0;
+}
+//通过AI对话删除bt的key标识
+void clear_earphone_record(void){
+    printf("bt_connect:%s %d",__func__,bt_connect);
+    ai_delete_key=0;
+    delete_key_flag=0;
+    if(bt_connect==2){
+        ai_delete_key=1;
+        delete_key_flag=1;
+        user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); //蓝牙耳机连接先断开再删除
+        uart_send_clear_earphoneok();
+        return; 
+    }else{
+        ai_delete_key=1;
+        delete_key_flag=1;
+        send_clear_earphone_key_msg();
+        uart_send_clear_earphoneok();
+        return;
     }
 }
 int uart_send_clear_earphoneok(void)
index 45ca19c..cb058d3 100644 (file)
@@ -29,4 +29,6 @@ int uart_send_clear_earphoneok(void);
 void print_hex(char *data ,int len);
 int uart_send_BT_AI_key_even(void);
 void bk_uart_recv_smg(bk_uart_msg_event event,char *data,int data_len);
+void clear_earphone_key(void);
+void send_clear_earphone_key_msg(void);
 #endif
index a5a9d39..95837fd 100644 (file)
@@ -364,7 +364,10 @@ void bk_app_task(void *p)
             break;
         case RECV_CONNECT_BT:
             connect_bt(data,0);//开始连接蓝牙耳机设备
-            break;    
+            break;  
+        case DELETE_BT_KEY:
+            clear_earphone_key();
+            break;
         default:
             break;
         }
index dd00078..efca3a9 100644 (file)
@@ -30,7 +30,8 @@ typedef enum
     BT_SCAN_SWITCH,
     BT_GET_IMEI,
     RECV_DISCONNECT_BT,
-    RECV_CONNECT_BT
+    RECV_CONNECT_BT,
+    DELETE_BT_KEY,
 
 }bk_app_msg_event;
 
index 1fd4062..5a6fe31 100644 (file)
@@ -263,8 +263,8 @@ void bt_scan_list(void) //扫描完成发送设备列表->小程序
     {
         return;
     }
-    scan_state=0;
     printf("scan_state:%d",scan_state);
+    scan_state=0;
     // if(!scan_state){
     //     return;
     // }
@@ -395,7 +395,16 @@ static int str_to_u8_buf(const char *str, u8 *buf) {
 extern u8 bt_connect;
 extern u8 bt_conn_addr[6];//蓝牙连接成功的地址
 u8 maddr[6]={0}; // 目标数组
+u8 delete_target_mac[6]={0};//需要删除目标的耳机配对信息key
 extern u8 is_need_send_bt_state;
+extern u8 delete_key_flag; //删除耳机bt的key标识 1需要删除 0不需要删除
+u8 reversed_mac[6]; // 反序数组 
+extern u8 ai_delete_key; //ai对话删除目标bt的key标识
+void connect_target_mac(void) //连接目标耳机mac地址
+{
+    printf("connect_target_mac!!!!!!!");
+    emitter_bt_connect(reversed_mac);//连接地址
+}
 void connect_bt(char *json_data,u8 conect){
     if(is_bredr_close() == 1) //经典蓝牙关闭能去连蓝牙耳机
     {
@@ -431,7 +440,7 @@ void connect_bt(char *json_data,u8 conect){
             return;
         }   
         
-        u8 reversed_mac[6]; // 反序数组
+        
         memset(reversed_mac,0,6);
         memset(maddr,0,6);
         printf("mac->valuestring %s\r\n",data->valuestring);
@@ -450,22 +459,27 @@ void connect_bt(char *json_data,u8 conect){
         printf("bt_connect:%d bt_conn_addr %x %x %x %x %x %x\r\n",bt_connect,bt_conn_addr[0],bt_conn_addr[1],bt_conn_addr[2],bt_conn_addr[3],bt_conn_addr[4],bt_conn_addr[5]);
         printf("maddr %x %x %x %x %x %x\r\n",maddr[0],maddr[1],maddr[2],maddr[3],maddr[4],maddr[5]);
         is_need_send_bt_state=1;
-        if(bt_connect == 2) //已经连上了看看连接的地址是否一致
+        if(bt_connect==2) //已经连上了看看连接的地址是否一致
         {
             if (memcmp(bt_conn_addr, reversed_mac, 6) != 0){//如果连上了并且和小程序下发得mac地址是一致不需要重新连接
                 if(get_call_status() != BT_CALL_HANGUP){ //如果是主动挂断的不需要再重复挂断
                     user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
                 }
+                printf("蓝牙连上指令对话删除耳机记录1!!!!!!!!");
+                delete_key_flag=1;
+                ai_delete_key=0;
                 user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); //
-                emitter_bt_connect(reversed_mac);//连接地址
-            }
-            else{
-                
+                return;
+            }else{
                 uart_send_bt_state(bt_connect);
                 is_need_send_bt_state=0;
             }
         }else{
-            emitter_bt_connect(reversed_mac);//连接地址
+            printf("指令对话删除耳机记录5 bt_conn_addr!!!!!!!!!");
+            delete_key_flag=1;
+            ai_delete_key=0;
+            send_clear_earphone_key_msg();
+            return;
         }  
     }
 }
index f335694..8e8134a 100644 (file)
@@ -40,4 +40,5 @@ extern void emitter_delete_remote_name(u8 *addr);
 extern void emitter_delete_remote_all(void);
 extern void clear_dev_list(void);
 extern void emitter_bt_connect(u8 *mac);
+extern u8 *emitter_get_last_vm_device(void);
 #endif
index 68e066e..6d2d21e 100644 (file)
@@ -35,7 +35,7 @@ const int CONFIG_BTSTACK_SUPPORT_AAC    = 0;
 //协议栈接收到命令是否自动退出sniff
 const int config_btstask_auto_exit_sniff = 1;
 
-
+u8 ble_list_verison_update_dispose = 1;
 #if SMART_BOX_EN
 #define RCSP_API_LOG           0
 #define RCSP_PACKET_LOG                1
index 77c7b9d..b1d9c26 100644 (file)
@@ -711,6 +711,8 @@ static int bt_connction_status_event_handler(struct bt_event *bt)
         break;
     case  BT_STATUS_RECONN_OR_CONN:
         log_info("  BT_STATUS_RECONN_OR_CONN \n");
+        printf("bt->value %d",bt->value);
+        put_buf(bt->args,7);
 #if USER_SUPPORT_PROFILE_PBAP_LIST
         user_send_cmd_prepare(USER_CTRL_PBAP_CONNECT, 0, NULL);
 #endif
@@ -857,6 +859,7 @@ int bt_update_event_handler(struct sys_event *event)
 extern u8 bt_connect;
 extern char userremote_name[32]; //当前连接或者断开的蓝牙名称
 extern u8 bt_conn_addr[6];//蓝牙连接成功的地址
+extern u8 reconnect_dev;
 /*----------------------------------------------------------------------------*/
 /**@brief    蓝牙模式协议栈事件
    @param    bt:事件
@@ -947,8 +950,15 @@ static int bt_hci_event_handler(struct bt_event *bt)
             bt_hci_event_page_timeout(bt);
             break;
         case ERROR_CODE_CONNECTION_TIMEOUT:
-            log_info(" ERROR_CODE_CONNECTION_TIMEOUT \n");
-            bt_hci_event_connection_timeout(bt);
+            printf("ERROR_CODE_CONNECTION_TIMEOUT %d\n",reconnect_dev);
+            if(!reconnect_dev){//bt.args如果跟4G下发的要连接的蓝牙的mac一致,就执行重连,不一致,就断开
+                put_buf(bt->args,7);
+                printf("ERROR_CODE_CONNECTION_TIMEOUT!!!!!!!!!!!!!\n");
+                bt_hci_event_connection_timeout(bt);
+            }
+            else{
+                bt_hci_event_disconnect(bt);
+            }
             break;
         case ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS  :
             log_info("ERROR_CODE_ACL_CONNECTION_ALREADY_EXISTS   \n");
index 65a3105..6bb388f 100644 (file)
@@ -200,7 +200,7 @@ void emitter_bt_connect(u8 *mac)
     if (bt_user_priv_var.emitter_or_receiver != BT_EMITTER_EN) {
         return ;
     }
-    bt_connect=BT_CONN_STATE_CONNECTING;
+    // bt_connect=BT_CONN_STATE_CONNECTING;
 #if 0
     while (hci_standard_connect_check() == 0x80) {
         //wait profile connect ok;
@@ -1526,6 +1526,7 @@ const char *bt_get_emitter_pin_code(u8 flag)
         //reset index
         index_flag = 0;
     } else if (flag == 2) {
+        return NULL;
         //查询是否要开始继续回连尝试pin code。
         if (index_flag >= pincode_num) {
             //之前已经遍历完了
@@ -1733,7 +1734,24 @@ void emitter_get_vm_device()
         log_debug_hexdump(remote_addr[i], 6);
     }
 }
-
+u8 *emitter_get_last_vm_device(void)
+{
+    u8 *last_dev_mac=malloc(6);
+    if(last_dev_mac==NULL)
+    {
+        return NULL;
+    }
+    memset(last_dev_mac, 0, 6);
+    memset(remote_addr, 0, sizeof(remote_addr));
+    u8 flag = restore_remote_device_info_opt(&remote_addr, 1, get_remote_dev_info_index());
+    for (u8 i = 0; i < 1; i++) {
+        printf("emitter_get_last_vm_device ----- \n");
+        // log_debug_hexdump(remote_addr[i], 6);
+        memcpy(last_dev_mac,remote_addr[i],6);
+        log_debug_hexdump(last_dev_mac, 6);
+    }
+    return last_dev_mac;
+}
 /*----------------------------------------------------------------------------*/
 /**@brief  蓝牙  开关ag_a2dp
    @param
@@ -1754,6 +1772,7 @@ void bredr_ag_a2dp_open_and_close()
 
 /*----------------------------------------------------------------------------*/
 /**@brief  蓝牙  开关ag_hfp
+ * 
    @param
    @return
    @note
index c2d1cc6..29baa67 100644 (file)
@@ -1255,8 +1255,10 @@ u8 bt_connect = BT_CONN_STATE_INIT;
 */
 /*----------------------------------------------------------------------------*/
 static u8 mac_addr[6]={0};
+extern u8 reconnect_dev;
 void bt_status_connect(struct bt_event *bt)
 {
+    reconnect_dev=0;
     bt_connect = BT_CONN_STATE_CONNECTED;
     uart_send_bt_state(bt_connect);
     auto_switch_local_mic();
@@ -1454,6 +1456,7 @@ void bt_status_disconnect(struct bt_event *bt)
     uart_send_bt_state(bt_connect);
     auto_switch_local_mic();
     sys_auto_sniff_controle(0, NULL);
+    send_clear_earphone_key_msg();
     __this->call_flag = 0;
     /* log_info("BT_STATUS_DISCONNECT\n"); */
 #if (SMART_BOX_EN)
index 8a6c1b6..a84f95d 100644 (file)
@@ -374,7 +374,7 @@ void *alink_channel_init(void *hw_alink, ALINK_CH ch_idx, u8 dir, void *priv, vo
     hw_alink_parm->ch_cfg[ch_idx].private_data = priv;
     hw_alink_parm->ch_cfg[ch_idx].buf = zalloc(hw_alink_parm->dma_len);
 
-    /* printf(">>> alink_channel_init %x\n", hw_alink_parm->ch_cfg[ch_idx].buf); */
+     printf(">>> alink_channel_init buf:%x len:%d\n", hw_alink_parm->ch_cfg[ch_idx].buf,hw_alink_parm->dma_len); 
     u32 *buf_addr;
 
     //===================================//
index eec537b..d45f055 100644 (file)
Binary files a/2.code/1.sdk/cpu/br28/liba/btctrler.a and b/2.code/1.sdk/cpu/br28/liba/btctrler.a differ
index 1ac618d..f18580c 100644 (file)
Binary files a/2.code/1.sdk/cpu/br28/liba/btstack.a and b/2.code/1.sdk/cpu/br28/liba/btstack.a differ
index 563f61b..936e010 100644 (file)
Binary files a/2.code/1.sdk/cpu/br28/liba/rcsp_stack.a and b/2.code/1.sdk/cpu/br28/liba/rcsp_stack.a differ