bt.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. #include "include.h"
  2. #include "api.h"
  3. #if BT_FCC_TEST_EN
  4. #define WORK_MODE MODE_FCC_TEST
  5. #elif BT_BQB_RF_EN
  6. #define WORK_MODE MODE_BQB_RF_BREDR
  7. #elif LE_BQB_RF_EN
  8. #define WORK_MODE MODE_BQB_RF_BLE
  9. #elif BT_DUT_MODE_EN
  10. #define WORK_MODE MODE_NORMAL_DUT
  11. #else
  12. #define WORK_MODE MODE_NORMAL
  13. #endif
  14. #define BT_PROFILE (PROF_A2DP*BT_A2DP_EN) | \
  15. (PROF_HFP*BT_HFP_EN) | \
  16. (PROF_SPP*BT_SPP_EN) | \
  17. (PROF_HID*BT_HID_EN) | \
  18. (PROF_HSP*BT_HSP_EN) | \
  19. (PROF_GATT * BT_ATT_EN)
  20. #define BT_CODEC (CODEC_SBC) | \
  21. (CODEC_AAC*BT_A2DP_AAC_AUDIO_EN) | \
  22. (CODEC_MSBC * BT_HFP_MSBC_EN) | \
  23. (CODEC_PLC * BT_PLC_EN) | \
  24. (CODEC_LHDCV4*BT_A2DP_LHDC_AUDIO_EN) | \
  25. (CODEC_LHDCV5*BT_A2DP_LHDC_AUDIO_EN) | \
  26. (CODEC_LDAC*BT_A2DP_LDAC_AUDIO_EN)
  27. #define HFP_FEATURE (HFP_BAT_REPORT*BT_HFP_BAT_REPORT_EN) | \
  28. (HFP_INBAND_RING_TONE*BT_HFP_INBAND_RING_EN) | \
  29. (HFP_CALL_PRIVATE*BT_HFP_CALL_PRIVATE_FORCE_EN) | \
  30. (HFP_RING_NUMBER_EN*BT_HFP_RING_NUMBER_EN)
  31. #define HFP_FEATURE1 (HFP_RECORD_DEVICE_VOL * BT_HFP_RECORD_DEVICE_VOL_EN)
  32. #define A2DP_FEATURE (A2DP_AVRCP_VOL_CTRL*BT_A2DP_VOL_CTRL_EN) | \
  33. (A2DP_RESTORE_PLAYING*BT_A2DP_SUPTO_RESTORE_PLAY_EN) | \
  34. (A2DP_AVDTP_DELAY_REPORT) | \
  35. (A2DP_AVDTP_DYN_LATENCY * BT_AVDTP_DYN_LATENCY_EN) | \
  36. (A2DP_AVDTP_EXCEPT_REST_PLAY * BT_A2DP_EXCEPT_RESTORE_PLAY_EN)
  37. #define A2DP_FEATURE1 (A2DP_AVRCP_RECORD_DEVICE_VOL*BT_A2DP_RECORD_DEVICE_VOL_EN) | \
  38. (A2DP_RESET_DEVICE_VOL*BT_A2DP_VOL_REST_EN)
  39. #define ACL2_FEATURE (BT_2ACL_SNATCH * BT_SNATCH_EN)
  40. ///baseband
  41. uint8_t cfg_bt_rf_def_txpwr = 0; //降低预置参数RF发射功率,单位0.5dbm
  42. uint8_t cfg_bt_page_txpwr = 0; //降低回连RF发射功率,单位3dbm
  43. uint8_t cfg_bt_inq_txpwr = 0; //降低搜索RF发射功率,单位3dbm
  44. uint8_t cfg_ble_page_txpwr = 0; //降低组队RF发射功率,单位3dbm
  45. uint8_t cfg_ble_page_rssi_thr = 0; //设置组队范围rssi
  46. uint8_t cfg_ble_rf_delta_gain = 0; //降低BLE功率值,单位3dbm
  47. #if HLW_UI
  48. //定义为1,有spp连接也会发断连消息
  49. uint8_t cfg_bt_hci_disc_only_spp = 0;
  50. #endif
  51. ///stack
  52. uint8_t cfg_bt_work_mode = WORK_MODE;
  53. uint8_t cfg_bt_max_acl_link = BT_2ACL_EN+1;
  54. bool cfg_bt_dual_mode = BT_DUAL_MODE_EN;
  55. bool cfg_bt_tws_mode = BT_TWS_EN;
  56. uint8_t cfg_bt_scan_ctrl_mode = BT_DISCOVER_CTRL_EN;
  57. bool cfg_bt_simple_pair_mode = BT_SIMPLE_PAIR_EN;
  58. uint16_t cfg_bt_support_profile = BT_PROFILE;
  59. uint16_t cfg_bt_support_codec = BT_CODEC;
  60. uint8_t cfg_bt_a2dp_feature = A2DP_FEATURE;
  61. uint8_t cfg_bt_a2dp_feature1 = A2DP_FEATURE1;
  62. uint8_t cfg_bt_hfp_feature = HFP_FEATURE;
  63. uint8_t cfg_bt_hfp_feature1 = HFP_FEATURE1;
  64. uint8_t cfg_bt_hid_type = BT_HID_TYPE;
  65. uint16_t cfg_bt_2acl_feature = ACL2_FEATURE;
  66. #if BT_HID_DOUYIN_EN
  67. uint8_t cfg_bt_hid_douyin_mode = BT_HID_DOUYIN_EN;
  68. uint8_t cfg_bt_hid_android_param = 0;
  69. #endif
  70. const uint8_t cfg_bt_spp_rfcomm_server_ch0 = SPP_RFCOMM_SERVER_CHANNEL0;
  71. const uint8_t cfg_bt_spp_rfcomm_server_ch1 = SPP_RFCOMM_SERVER_CHANNEL1;
  72. const uint8_t cfg_bt_spp_rfcomm_server_ch2 = SPP_RFCOMM_SERVER_CHANNEL2;
  73. uint8_t cfg_bt_connect_times = 2; //按键回连重试次数, 5.12s * n
  74. uint8_t cfg_bt_pwrup_connect_times = BT_POWER_UP_RECONNECT_TIMES; //上电回连重试次数, 5.12s * n
  75. uint16_t cfg_bt_sup_to_connect_times = BT_TIME_OUT_RECONNECT_TIMES; //超时断线回连重试次数, 5.12s * n, 设置(-1)为一直回连
  76. #if BT_LINK_INFO_PAGE1_EN
  77. uint8_t const cfg_bt_link_info_items = 8; //保存回连信息的个数(最小1,最大8)
  78. #endif
  79. ///app
  80. const char bt_local_name[] = BT_NAME_DEFAULT;
  81. const char bt_local_addr[6] = {0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};
  82. // uint8_t cfg_bb_rf_gfsk_pwr = 127; //调节GFSK TXPWR,范围:90~127
  83. #if BT_RF_POWER_BALANCE_EN
  84. //使用空闲的IO,配置内部300欧上下拉,消耗电流来实现btrf tx,rx及空闲时电流不均衡问题
  85. #define GPIOA_TEST_BIT (BIT(3)|BIT(4)|BIT(5)|BIT(6)|BIT(7))
  86. void rf_current_supply(void);
  87. void rf_current_recover(void);
  88. static volatile bool bt_reconnect_flag;
  89. static volatile u8 btrf_power_level = 0;
  90. AT(.com_text.btrf_pwrbalance)
  91. static void btrf_power_balance_level_set(u8 level) //unit 3.3V/600 = 5.5mA
  92. {
  93. GPIOAPU300 &= ~GPIOA_TEST_BIT;
  94. GPIOAPD300 &= ~GPIOA_TEST_BIT;
  95. if (0 == level) {
  96. return;
  97. }
  98. if(level >= 1){
  99. GPIOAPU300 |= BIT(3);
  100. GPIOAPD300 |= BIT(3);
  101. }
  102. if(level >= 2) {
  103. GPIOAPU300 |= BIT(4);
  104. GPIOAPD300 |= BIT(4);
  105. }
  106. if(level >= 3) {
  107. GPIOAPU300 |= BIT(5);
  108. GPIOAPD300 |= BIT(5);
  109. }
  110. if(level >= 4) {
  111. GPIOAPU300 |= BIT(6);
  112. GPIOAPD300 |= BIT(6);
  113. }
  114. if(level >= 5) {
  115. GPIOAPU300 |= BIT(7);
  116. GPIOAPD300 |= BIT(7);
  117. }
  118. }
  119. AT(.com_text.btrf_pwrbalance) FIQ
  120. static void timer3_isr(void)
  121. {
  122. if (TMR3CON & BIT(9)) {
  123. TMR3CPND = BIT(9); //Clear Pending
  124. TMR3CON &= ~BIT(7);
  125. btrf_power_balance_level_set(btrf_power_level);
  126. }
  127. }
  128. AT(.com_text.btrf_pwrbalance)
  129. static void btrf_power_balance_level_delay_set(u32 delay_us, u8 level) //unit us
  130. {
  131. btrf_power_level = level;
  132. TMR3CNT = 0;
  133. TMR3PR = delay_us;
  134. TMR3CPND = BIT(9);
  135. TMR3CON |= BIT(7);
  136. }
  137. static void timer3_init(void)
  138. {
  139. CLKGAT0 |= BIT(3); //timer3 clkgat 要放在最前面
  140. u8 div_sel = 2; //对应BIT4
  141. u32 tim3pr_1s = 24000000 / div_sel - 1; //1s对应的CNT
  142. TMR3CON = 0;
  143. TMR3CON |= BIT(4) | BIT(2); //BIT2:Timer clk select xosc24mhz; BIT(4):prepare clk div2
  144. TMR3CNT = 0;
  145. TMR3PR = tim3pr_1s; //示例1000ms
  146. TMR3CON |= BIT(7); //Timer works in Timer Mode,Timer overflow interrupt enable
  147. TMR3CON |= BIT(0); //Timer enable
  148. sys_irq_init(IRQ_TMR3_VECTOR, 1, timer3_isr);
  149. }
  150. static void btrf_power_balance_init(void)
  151. {
  152. printf("%s\n",__func__);
  153. timer3_init();
  154. GPIOADE |= GPIOA_TEST_BIT;
  155. GPIOAFEN &= ~GPIOA_TEST_BIT;
  156. GPIOADIR |= GPIOA_TEST_BIT;
  157. }
  158. static void btrf_power_balance_exit(void)
  159. {
  160. printf("%s\n",__func__);
  161. TMR3CON = 0;
  162. GPIOAPU300 &= ~GPIOA_TEST_BIT;
  163. GPIOAPD300 &= ~GPIOA_TEST_BIT;
  164. GPIOADE &= ~GPIOA_TEST_BIT;
  165. }
  166. AT(.com_text.btrf_pwrbalance)
  167. static void btrf_power_balance_isr(u32 rf_sta)
  168. {
  169. TMR3CON |= BIT(7);
  170. if(rf_sta & BIT(8)) { //tx on
  171. btrf_power_balance_level_delay_set(750,0); //TX开始后,TX延时一段时间才真正耗电,这里延时一段时间后才降低功耗
  172. } else if(rf_sta & BIT(9)){ //tx down
  173. btrf_power_balance_level_delay_set(120,5); //TX结束,增加耗电
  174. } else if(rf_sta & BIT(10)){ //rx on
  175. btrf_power_balance_level_set(2);
  176. } else if(rf_sta & BIT(11)){ //rx down
  177. btrf_power_balance_level_set(5); //RX结束,增加耗电
  178. }
  179. }
  180. void bt_power_balance_reconnect(u8 start)
  181. {
  182. bt_reconnect_flag = start;
  183. if (start) {
  184. rf_current_supply();
  185. btrf_power_balance_init();
  186. } else {
  187. btrf_power_balance_exit();
  188. rf_current_recover();
  189. }
  190. }
  191. #endif
  192. #if BT_RF_EXT_CTL_EN || BT_RF_POWER_BALANCE_EN
  193. const uint8_t cfg_bb_rf_ctl = BIT(0); //bit0=RF_EXT_CTL_EN
  194. AT(.com_text.isr.txrx)
  195. void bb_rf_ext_ctl_cb(u32 rf_sta)
  196. {
  197. // if(rf_sta & BIT(8)) { //tx on
  198. // } else if(rf_sta & BIT(9)){ //tx down
  199. // } else if(rf_sta & BIT(10)){ //rx on
  200. // } else if(rf_sta & BIT(11)){ //rx down
  201. // } else { //idle
  202. // }
  203. #if BT_RF_POWER_BALANCE_EN
  204. if (bt_reconnect_flag) {
  205. btrf_power_balance_isr(rf_sta);
  206. }
  207. #endif
  208. }
  209. #endif
  210. //自定义蓝牙类别图标,根据需要选择
  211. u32 bt_get_class_of_device(void)
  212. {
  213. if(cfg_bt_work_mode == MODE_BQB_RF_BREDR) {
  214. return 0x0000;
  215. }
  216. #if BT_HID_TYPE == 2
  217. return 0x0025c0; //GamePad - 游戏手柄
  218. #else
  219. // return 0x002540; //Keyboard - 键盘图标,Android带显示电量,IOS不带电量显示。全部IOS均可连接HID拍照。
  220. // return 0x240418; //HeadPhone - 耳机图标,Android和IOS均带电量显示。
  221. return 0x240404; //WearableHeadset - 耳机图标,Android和IOS均带电量显示。(默认使用)
  222. #endif
  223. }
  224. //PIN配对码(最多16个字符),默认"0000"
  225. //#if !BT_SIMPLE_PAIR_EN
  226. //const char *bt_get_pin_code(void)
  227. //{
  228. // return "0000";
  229. //}
  230. //#endif
  231. //回连间隔(N+3000)mS,间隔越大,下一次回连越慢,更容易被其他手机搜索连接,关闭TWS 功能时 N应大于等于2000
  232. //u32 bt_get_conn_fail_delay(void)
  233. //{
  234. // return 200;
  235. //}
  236. //是否需要一直回连手机
  237. //bool bt_is_always_reconn(void)
  238. //{
  239. // return false;
  240. //}
  241. //自定义回连方式,order为回连信息序号
  242. uint8_t connect_addr[6];
  243. //void bt_cocnnect_order(uint8_t order)
  244. //{
  245. // if(bt_nor_get_link_info_addr(connect_addr, order)) {
  246. // bt_connect_address();
  247. // }
  248. //}
  249. //
  250. uint8_t bt_get_connect_addr(uint8_t *bd_addr, uint16_t *times)
  251. {
  252. *times = 2; //n*5.12s
  253. memcpy(bd_addr, connect_addr, 6);
  254. return 1;
  255. }
  256. const char *bt_get_local_name(void)
  257. {
  258. #if 1
  259. #if IODM_TEST_EN
  260. bt_get_new_name(xcfg_cb.bt_name);
  261. #endif
  262. #if FUNC_BTHID_EN
  263. if (is_bthid_mode()) {
  264. return xcfg_cb.bthid_name;
  265. }
  266. #endif // FUNC_BTHID_EN
  267. return xcfg_cb.bt_name;
  268. #else
  269. return bt_local_name;
  270. #endif // 1
  271. }
  272. void bt_clr_master_addr(void)
  273. {
  274. u8 addr[6];
  275. memset(addr, 0, 6);
  276. cm_write8(PARAM_MASTER_ADDR_VALID, 0);
  277. cm_write(addr, PARAM_MASTER_ADDR, 6);
  278. cm_sync();
  279. }
  280. void bt_save_master_addr(u8 *addr)
  281. {
  282. if (bt_tws_is_ms_switch()||qtest_get_mode()) {
  283. u8 mst_addr[6];
  284. u8 valid = cm_read8(PAGE0(PARAM_MASTER_ADDR_VALID));
  285. if(valid == 1) {
  286. cm_read(mst_addr, PAGE0(PARAM_MASTER_ADDR), 6);
  287. if(memcmp(mst_addr, addr, 6) == 0) {
  288. return;
  289. }
  290. }
  291. cm_write8(PARAM_MASTER_ADDR_VALID, 1);
  292. cm_write(addr, PARAM_MASTER_ADDR, 6);
  293. cm_sync();
  294. }
  295. }
  296. bool bt_get_master_addr(u8 *addr)
  297. {
  298. if ((bt_tws_is_ms_switch()||qtest_get_mode()) && cm_read8(PARAM_MASTER_ADDR_VALID)) {
  299. cm_read(addr, PARAM_MASTER_ADDR, 6);
  300. return true;
  301. }
  302. return false;
  303. }
  304. //删除所有配对信息
  305. void bt_clr_all_link_info(void)
  306. {
  307. bt_clr_master_addr();
  308. bt_nor_delete_link_info();
  309. bt_tws_delete_link_info();
  310. }
  311. //删除TWS配对信息
  312. void bt_tws_clr_link_info(void)
  313. {
  314. bt_clr_master_addr();
  315. bt_tws_delete_link_info();
  316. }
  317. void bt_get_local_bd_addr(u8 *addr)
  318. {
  319. if (bt_get_master_addr(addr)&&(!qtest_is_send_btmsg())) {
  320. return;
  321. }
  322. #if BT_LOCAL_ADDR
  323. param_random_key_read(&addr[2]);
  324. addr[0] = 0x41;
  325. addr[1] = 0x42;
  326. #else
  327. #if IODM_TEST_EN
  328. if(bt_get_qr_addr(addr)){
  329. return;
  330. }
  331. #endif
  332. memcpy(addr, xcfg_cb.bt_addr, 6);
  333. #endif
  334. #if FUNC_BTHID_EN
  335. if (is_bthid_mode()) {
  336. addr[5] ^= BIT(0);
  337. }
  338. #endif // FUNC_BTHID_EN
  339. }
  340. u32 bt_get_rand_seed(void)
  341. {
  342. return sys_cb.rand_seed;
  343. }
  344. void bt_get_link_info_flash(void *buf, u16 addr, u16 size)
  345. {
  346. // printf("bt_read: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  347. #if FUNC_BTHID_EN
  348. if (is_bthid_mode()) {
  349. cm_read(buf, BTHID_CM_PAGE(addr), size);
  350. } else
  351. #endif // FUNC_BTHID_EN
  352. {
  353. if ((addr + size) <= PAGE_DATA_SIZE) {
  354. cm_read(buf, BT_CM_PAGE(addr), size);
  355. #if BT_LINK_INFO_PAGE1_EN
  356. } else {
  357. cm_read(buf, BT_CM_PAGE1(addr - link_info_page_size), size);
  358. #endif
  359. }
  360. }
  361. // print_r(buf, size);
  362. }
  363. void bt_put_link_info_flash(void *buf, u16 addr, u16 size)
  364. {
  365. // printf("bt_write: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  366. // print_r(buf, size);
  367. #if FUNC_BTHID_EN
  368. if (is_bthid_mode()) {
  369. cm_write(buf, BTHID_CM_PAGE(addr), size);
  370. } else
  371. #endif // FUNC_BTHID_EN
  372. {
  373. if ((addr + size) <= PAGE_DATA_SIZE) {
  374. cm_write(buf, BT_CM_PAGE(addr), size);
  375. #if BT_LINK_INFO_PAGE1_EN
  376. } else {
  377. cm_write(buf, BT_CM_PAGE1(addr - link_info_page_size), size);
  378. #endif
  379. }
  380. }
  381. }
  382. void bt_get_ext_link_info_flash(void *buf, u16 addr, u16 size)
  383. {
  384. // printf("bt_read: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  385. cm_read(buf, EXT_CM_PAGE(addr), size);
  386. // print_r(buf, size);
  387. }
  388. void bt_put_ext_link_info_flash(void *buf, u16 addr, u16 size)
  389. {
  390. // printf("bt_write: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  391. // print_r(buf, size);
  392. cm_write(buf, EXT_CM_PAGE(addr), size);
  393. }
  394. void bt_sync_link_info(void)
  395. {
  396. cm_sync();
  397. }
  398. #if TEST_MODE_BT_INFO
  399. u8 test_bt_buf[512] AT(.test_buf);
  400. //u8 test_tws_buf[64] AT(.test_buf);
  401. void bt_test_mode_init(void)
  402. {
  403. memset(test_bt_buf,0x00,sizeof(test_bt_buf));
  404. // memset(test_tws_buf,0x00,sizeof(test_tws_buf));
  405. }
  406. static bool bt_is_test_mode(void)
  407. {
  408. if (cfg_bt_work_mode == MODE_IODM_TEST ||\
  409. cfg_bt_work_mode == MODE_FCC_TEST ||\
  410. cfg_bt_work_mode == MODE_BQB_RF_BREDR || qtest_get_mode()) {
  411. return true;
  412. } else {
  413. return false;
  414. }
  415. }
  416. void bt_get_link_info_ram(void *buf, u16 addr, u16 size)
  417. {
  418. memcpy(buf,&test_bt_buf[addr],size);
  419. }
  420. void bt_put_link_info_ram(void *buf, u16 addr, u16 size)
  421. {
  422. memcpy(&test_bt_buf[addr],buf,size);
  423. }
  424. //void bt_get_ext_link_info_ram(void *buf, u16 addr, u16 size)
  425. //{
  426. // memcpy(buf,&test_tws_buf[addr],size);
  427. //}
  428. //
  429. //void bt_put_ext_link_info_ram(void *buf, u16 addr, u16 size)
  430. //{
  431. // memcpy(&test_tws_buf[addr],buf,size);
  432. //}
  433. #endif
  434. void bt_get_link_info(void *buf, u16 addr, u16 size)
  435. {
  436. #if TEST_MODE_BT_INFO
  437. if (bt_is_test_mode()) {
  438. bt_get_link_info_ram(buf,addr,size);
  439. } else
  440. #endif
  441. {
  442. bt_get_link_info_flash(buf,addr,size);
  443. }
  444. }
  445. void bt_put_link_info(void *buf, u16 addr, u16 size)
  446. {
  447. #if TEST_MODE_BT_INFO
  448. if (bt_is_test_mode()) {
  449. bt_put_link_info_ram(buf,addr,size);
  450. } else
  451. #endif
  452. {
  453. bt_put_link_info_flash(buf,addr,size);
  454. }
  455. }
  456. void bt_get_ext_link_info(void *buf, u16 addr, u16 size)
  457. {
  458. bt_get_ext_link_info_flash(buf,addr,size);
  459. }
  460. void bt_put_ext_link_info(void *buf, u16 addr, u16 size)
  461. {
  462. bt_put_ext_link_info_flash(buf,addr,size);
  463. }
  464. #if BT_FCC_TEST_EN
  465. uint8_t ble_set_delta_gain(void) {
  466. return xcfg_cb.ble_delta_value; //设置BLE与BT的功率差值
  467. }
  468. #endif
  469. void bt_decode_init_cb(uint8_t media_codec_type)
  470. {
  471. // printf("bt_decode_init_cb %d\n", media_codec_type);
  472. #if BT_A2DP_LHDC_AUDIO_EN || BT_A2DP_LDAC_AUDIO_EN
  473. if (media_codec_type == 0x10 || media_codec_type == 0x11) { //LHDC LDAC
  474. #if ANC_ALG_EN
  475. if (sys_cb.anc_alg_en) {
  476. sys_cb.anc_alg_type_bak = bsp_anc_alg_get_type();
  477. bsp_anc_alg_stop();
  478. }
  479. #endif // ANC_ALG_EN
  480. } else {
  481. #if ANC_ALG_EN
  482. if (sys_cb.anc_alg_type_bak) {
  483. if ((!bt_decode_is_lhdc()) && (!bt_decode_is_ldac())) {
  484. bsp_anc_alg_start(sys_cb.anc_alg_type_bak);
  485. sys_cb.anc_alg_type_bak = 0;
  486. }
  487. }
  488. #endif // ANC_ALG_EN
  489. }
  490. #endif
  491. }