bt.c 16 KB

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