bsp_bt.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275
  1. #include "include.h"
  2. #define BT_PROFILE (PROF_A2DP*BT_A2DP_EN) | (PROF_HFP*BT_HFP_EN) | (PROF_SPP*BT_SPP_EN) | (PROF_HID*BT_HID_EN) | (PROF_MAP*BT_MAP_EN)
  3. #define A2DP_FEATURE (A2DP_AVRCP_VOL_CTRL*BT_A2DP_VOL_CTRL_EN) | (A2DP_RECON_CTRL*BT_A2DP_RECON_EN | (A2DP_AVDTP_DELAY_REPORT))
  4. #define HFP_FEATURE (HFP_BAT_REPORT*BT_HFP_BAT_REPORT_EN) | (HFP_INBAND_RING_TONE*BT_HFP_INBAND_RING_EN) | (HFP_CALL_PRIVATE*BT_HFP_CALL_PRIVATE_FORCE_EN) | (HFP_RING_NUMBER_EN*BT_HFP_RING_NUMBER_EN)
  5. AT(.rodata.bt_cfg)
  6. const bt_cfg_t bt_cfg_tbl = {
  7. .pwrup_connect_times = BT_POWER_UP_RECONNECT_TIMES,
  8. .sup_to_connect_times = BT_TIME_OUT_RECONNECT_TIMES,
  9. .nor_connect_times = BT_NOR_RECONNECT_TIMES,
  10. .tws_connect_times = BT_TWS_RECONNECT_TIMES,
  11. .tws_sup_to_connect_times = BT_TWS_TIME_OUT_RECONNECT_TIMES,
  12. .scan_timeout = BT_DISCOVER_TIMEOUT, //待实现
  13. .profile = BT_PROFILE,
  14. .max_acl_link = BT_2ACL_EN+1,
  15. .a2dp_feature = A2DP_FEATURE,
  16. .hfp_feature = HFP_FEATURE,
  17. .vx_set = 2, //0=hv3, 1=ev3, 2=2ev3
  18. .dual_mode = BT_DUAL_MODE_EN,
  19. .tws_mode = BT_TWS_EN,
  20. .simple_pair_mode = BT_SIMPLE_PAIR_EN,
  21. .scan_ctrl = BT_DISCOVER_CTRL_EN,
  22. .supervision_to_dft = 0x7d00, //timeout 20s
  23. .new_conn_timeout_add = 8,
  24. .sco_plc_en = BT_PLC_EN,
  25. .sco_msbc_en = BT_HFP_MSBC_EN,
  26. .remote_name_req_en = 0,
  27. .sdp_client_avrcp_en = 1,
  28. };
  29. extern char bt_name_buf[32];
  30. extern char redial_buf[2][32];
  31. extern char bt_new_local_name[64];
  32. extern bt_cfg_t bt_cfg;
  33. extern volatile uint8_t a2dp_media_index;
  34. extern volatile uint8_t hfp_index;
  35. extern uint8_t cfg_bt_sw_ver_build;
  36. extern uint8_t cfg_bt_sw_ver_build;
  37. extern uint8_t cfg_bt_tws_limit_pair_time; //设置TWS上电、出仓配对限制时间, 单位200ms, 0为不限制(L、R规定时间内上电、出仓才能配对)
  38. extern uint8_t cfg_bt_tws_slot_inc;
  39. extern uint8_t cfg_bt_a2dp_media_discard;
  40. extern uint8_t cfg_bt_work_mode;
  41. extern uint16_t cfg_bt_tws_feat;
  42. bool btstack_is_invalid_addr(bd_addr_t addr);
  43. void bt_new_name_init(void);
  44. void btstack_set_tws_info_hook(uint8_t *param);
  45. bool bt_get_stored_a2dp_volume(u8 *vol);
  46. void btstack_send_tws_vol_ctrl_status(void);
  47. void btstack_volume_change(void);
  48. u8 bt_call_need_switch(void);
  49. bool bt_get_stored_a2dp_volume(u8 *vol);
  50. void timer3_capture_isr(void);
  51. void btstack_volume_change(void);
  52. void hfp_at_kick(void);
  53. void bt_map_kick(void);
  54. AT(.rodata.sup_to)
  55. const u8 sup_to_con_times_tbl[4] = {40, 80, 160, 0xff};
  56. //返回非0 地址有效按地址链接,返回0地址无效
  57. uint8_t bt_get_connect_addr(uint8_t *bd_addr)
  58. {
  59. u8 addr[6] = {0x41,0x42,0x77,0x88,0x99,0xaa};
  60. memcpy(bd_addr,addr,6);
  61. return 1;
  62. }
  63. WEAK bool bt_fcc_test_is_en(void)
  64. {
  65. return BT_FCC_TEST_EN * xcfg_cb.bt_fcc_en;
  66. }
  67. u8 bt_hid_get_compatibility(void)
  68. {
  69. //return 0; //耳机图标(带电量显示),不影响键盘使用,使用V+拍照,影响部分Android拍照,体验较好
  70. //return 1; //耳机图标(带电量显示),影响ios键盘使用,使用V+和ENTER拍照,拍照兼容性好
  71. //return 2; //键盘图标(IOS不带电量显示),影响ios键盘使用,使用V+和ENTER拍照,拍照兼容性好
  72. return xcfg_cb.bt_hid_mode_sel;
  73. }
  74. //const char *bt_get_pin_code(void)
  75. //{
  76. // return "0000";
  77. //}
  78. //此函数返回需要回拨的号码,例如“10086”
  79. const char * hfp_get_outgoing_number(void) {
  80. return "10086";
  81. }
  82. void bsp_bt_init_hook(void)
  83. {
  84. memcpy(&bt_cfg, &bt_cfg_tbl, sizeof(bt_cfg_t));
  85. bt_cfg.sco_msbc_en = BT_HFP_MSBC_EN * xcfg_cb.bt_sco_msbc_en;
  86. bt_cfg.profile = (PROF_A2DP*BT_A2DP_EN*xcfg_cb.bt_a2dp_en) | (PROF_HFP*BT_HFP_EN*xcfg_cb.bt_sco_en)\
  87. | (PROF_SPP*BT_SPP_EN*xcfg_cb.bt_spp_en) | (PROF_HID*BT_HID_EN*xcfg_cb.bt_hid_en) | (PROF_MAP*BT_MAP_EN);
  88. bt_cfg.a2dp_feature = (A2DP_AVRCP_VOL_CTRL*xcfg_cb.bt_a2dp_vol_ctrl_en) | A2DP_RESTORE_PLAYING | (A2DP_AVDTP_DELAY_REPORT*xcfg_cb.bt_a2dp_delay_report_en);
  89. #if BT_RESOLVE_SIRI_STA_NOUPDATE_EN
  90. bt_cfg.hfp_feature = (HFP_BAT_REPORT*xcfg_cb.bt_hfp_bat_report_en) | (HFP_INBAND_RING_TONE*BT_HFP_INBAND_RING_EN)
  91. | (HFP_CALL_PRIVATE*xcfg_cb.bt_hfp_private_en) | (HFP_RING_NUMBER_EN*xcfg_cb.bt_hfp_ring_number_en) | HFP_SIRI_CMD;
  92. #else
  93. bt_cfg.hfp_feature = (HFP_BAT_REPORT*xcfg_cb.bt_hfp_bat_report_en) | (HFP_INBAND_RING_TONE*BT_HFP_INBAND_RING_EN)
  94. | (HFP_CALL_PRIVATE*xcfg_cb.bt_hfp_private_en) | (HFP_RING_NUMBER_EN*xcfg_cb.bt_hfp_ring_number_en) ;
  95. #endif
  96. if (xcfg_cb.bt_recon_play_dis) {
  97. bt_cfg.a2dp_feature &= ~A2DP_RESTORE_PLAYING;
  98. }
  99. if (xcfg_cb.bt_a2dp_avrcp_play_status) {
  100. bt_cfg.a2dp_feature |= A2DP_AVRCP_PLAY_STATUS;
  101. }
  102. cfg_bt_hid_feature = HID_CONN_IOS_ONLY * xcfg_cb.bt_hid_ios_only_en;
  103. cfg_bt_sw_ver_major = TRY_BT_VERSION/*14*/; //bt6.0
  104. bt_cfg.tws_mode = xcfg_cb.bt_tws_en*BT_TWS_EN;
  105. if (xcfg_cb.bt_tws_pair_mode > 1) {
  106. bt_cfg.res[0] |= BT_FLAG0_TWS_SCAN;
  107. } else if (xcfg_cb.bt_tws_pair_mode == 1 && xcfg_cb.bt_tws_fast_con_en) {
  108. bt_cfg.res[0] |= BT_FLAG0_TWS_FAST_PAIR;
  109. }
  110. bt_cfg.dual_mode = 0;//BT_DUAL_MODE_EN * xcfg_cb.ble_en;
  111. #if BT_2ACL_EN
  112. bt_cfg.max_acl_link = BT_2ACL_EN * xcfg_cb.bt_2acl_en + 1;
  113. #endif
  114. cfg_bt_tws_feat = 0;
  115. if (bt_cfg.tws_mode) {
  116. if (xcfg_cb.bt_tws_public_addr) {
  117. cfg_bt_tws_feat |= BT_FEAT_NEGO_PUBLIC_ADDR;
  118. }
  119. }
  120. #if BT_LINK_FILTER
  121. cfg_bt_link_filter = 1;
  122. #endif
  123. cfg_bt_tws_limit_pair_time = 0;
  124. bt_cfg.tws_fast_con_en = xcfg_cb.bt_tws_fast_con_en;
  125. if (bt_cfg.tws_fast_con_en) {
  126. bt_cfg.tws_connect_times = BT_TWS_RECONNECT_TIMES * 5; //0.25s * n > 5s
  127. bt_cfg.tws_sup_to_connect_times = BT_TWS_TIME_OUT_RECONNECT_TIMES * 5;
  128. cfg_bt_tws_limit_pair_time = xcfg_cb.bt_tws_limit_pair_time;
  129. }
  130. bt_cfg.sup_to_connect_times = sup_to_con_times_tbl[xcfg_cb.bt_tout_reconn_times];
  131. if (BT_FCC_TEST_EN && xcfg_cb.bt_fcc_en) {
  132. cfg_bt_work_mode = MODE_FCC_TEST;
  133. }
  134. #if BT_QUICK_TEST_EN
  135. bt_cfg.bt_quick_test = BT_QUICK_TEST_EN*xcfg_cb.iphone_head_quick_test_en;
  136. #endif // BT_QUICK_TEST_EN
  137. bt_cfg.new_conn_timeout_add = 8;
  138. cfg_bt_tws_slot_inc = 0;
  139. memset(bt_new_local_name, 0, sizeof(bt_new_local_name));
  140. sys_cb.ear_menu_en = 0;
  141. sys_cb.loc_ear_sta = 0x1; //有入耳检测时,改为实际状态(0=戴入,1=取下)
  142. sys_cb.rem_ear_sta = 0x1; //有入耳检测时,改为实际状态(0=戴入,1=取下)
  143. sys_cb.nr_bits = 0x7; //bit0=NR disable, bit1=ANC, bit2=transparency
  144. sys_cb.nr_sta = 1; //NR disable
  145. ble_house_adv_init();
  146. memset(&f_bt, 0, sizeof(func_bt_t));
  147. f_bt.disp_status = 0xfe;
  148. f_bt.need_pairing = 1; //开机若回连不成功,需要播报pairing
  149. f_bt.hid_menu_flag = 1;
  150. f_bt.tick_vbat = tick_get();
  151. f_bt.loc_vbat = hfp_get_bat_level();
  152. #if FUNC_BTHID_EN
  153. if (is_bthid_mode()) {
  154. bt_cfg.max_nr_link_key = 1;
  155. bt_cfg.profile = PROF_HID;
  156. bt_cfg.max_acl_link = 1;
  157. bt_cfg.dual_mode = 0;
  158. f_bt.hid_menu_flag = 0;
  159. } else
  160. #endif // FUNC_BTHID_EN
  161. {
  162. bt_cfg.max_nr_link_key = BT_MAX_NR_LINK_KEY;
  163. }
  164. }
  165. void bt_work_mode_init(void)
  166. {
  167. if (xcfg_cb.bb_dut_test_en) {
  168. cfg_bt_work_mode = MODE_NORMAL_DUT;
  169. } else {
  170. cfg_bt_work_mode = MODE_NORMAL;
  171. }
  172. }
  173. //客户控制tws scan状态使能
  174. #if BT_TWS_CUSTOMER_CONTROL_TWSSCAN_STA_EN
  175. bool bt_tws_customer_control_tws_scan_sta_en(void)
  176. {
  177. return true;
  178. }
  179. #endif
  180. //tws一些同步信息,例如EQ, 语言等,param最大是12byte
  181. bool bt_get_tws_info(uint8_t *param)
  182. {
  183. #if LANG_SELECT >= LANG_EN_ZH
  184. if(xcfg_cb.lang_id >= LANG_EN_ZH) {
  185. param[0] = sys_cb.lang_id & 0x0f; //bit0~3
  186. }
  187. #endif
  188. #if EQ_MODE_EN
  189. param[0] |= (u8)sys_cb.eq_mode<<4;
  190. #endif
  191. param[1] = sys_cb.hfp_vol; //同步初始通话音量
  192. param[5] = sys_cb.tws_force_channel;
  193. param[6] = sys_cb.loc_ear_sta;
  194. param[8] = f_bt.loc_vbat;
  195. return true;
  196. }
  197. void bt_set_tws_info(uint8_t *param)
  198. {
  199. uint8_t tmp = 0;
  200. #if LANG_SELECT >= LANG_EN_ZH
  201. tmp = (param[0] & 0x0f);
  202. if(xcfg_cb.lang_id >= 2 && tmp < 2 && tmp != sys_cb.lang_id) { //bit0~3
  203. sys_cb.lang_id = tmp;
  204. msg_enqueue(EVT_BT_SET_LANG_ID);
  205. }
  206. #endif
  207. #if EQ_MODE_EN
  208. tmp = (param[0] & 0xf0)>>4;
  209. if(tmp < 6 && tmp != sys_cb.eq_mode) { //bit4~7
  210. sys_cb.eq_mode = tmp;
  211. msg_enqueue(EVT_BT_SET_EQ);
  212. }
  213. #endif
  214. sys_cb.hfp_vol = param[1]; //同步初始通话音量
  215. sys_cb.rem_force_channel = param[5];
  216. if (sys_cb.rem_ear_sta != param[6]) {
  217. sys_cb.rem_ear_sta = param[6];
  218. msg_enqueue(EVT_BT_TWS_EAR_STA);
  219. }
  220. f_bt.rem_vbat = param[8];
  221. }
  222. #if BT_RF_POWER_BALANCE_EN
  223. void btmdm_enable(void);
  224. void btmdm_disable(void);
  225. //使用空闲的IO,配置内部300欧上下拉,消耗电流来实现btrf tx,rx及空闲时电流不均衡问题
  226. #define GPIOA_TEST_BIT (BIT(2)|BIT(3)|BIT(4)|BIT(5)|BIT(6))
  227. void rf_current_supply(void);
  228. void rf_current_recover(void);
  229. void bt_set_reconnect_txpwr(u8 gain);
  230. static volatile bool bt_reconnect_flag;
  231. static volatile u8 btrf_power_level = 0;
  232. AT(.com_rodata.debug)
  233. const char haha_debug[] = "**";
  234. AT(.com_text.btrf_pwrbalance)
  235. static void btrf_power_balance_level_set(u8 level) //unit 3.3V/600 = 5.5mA
  236. {
  237. // printf(haha_debug);
  238. GPIOAPU300 &= ~GPIOA_TEST_BIT;
  239. GPIOAPD300 &= ~GPIOA_TEST_BIT;
  240. if (0 == level) {
  241. return;
  242. }
  243. if(level >= 1){
  244. GPIOAPU300 |= BIT(3);
  245. GPIOAPD300 |= BIT(3);
  246. }
  247. if(level >= 2) {
  248. GPIOAPU300 |= BIT(4);
  249. GPIOAPD300 |= BIT(4);
  250. }
  251. if(level >= 3) {
  252. GPIOAPU300 |= BIT(5);
  253. GPIOAPD300 |= BIT(5);
  254. }
  255. if(level >= 4) {
  256. GPIOAPU300 |= BIT(6);
  257. GPIOAPD300 |= BIT(6);
  258. }
  259. if(level >= 5){
  260. GPIOAPU300 |= BIT(2);
  261. GPIOAPD300 |= BIT(2);
  262. }
  263. }
  264. AT(.com_text.btrf_pwrbalance)
  265. void timer3_isr(void)
  266. {
  267. if (TMR3CON & BIT(16)) {
  268. TMR3CPND = BIT(16); //Clear Pending
  269. TMR3CON &=~ BIT(7);
  270. btrf_power_balance_level_set(btrf_power_level);
  271. }
  272. timer3_capture_isr();
  273. }
  274. AT(.com_text.btrf_pwrbalance)
  275. static void btrf_power_balance_level_delay_set(u32 delay_us, u8 level) //unit us
  276. {
  277. btrf_power_level = level;
  278. TMR3CNT = 0;
  279. TMR3PR = delay_us;
  280. TMR3CPND = BIT(9);
  281. TMR3CON |= BIT(7);
  282. }
  283. void timer3_init(void)
  284. {
  285. // printf("PICCON %x\n",PICCON);
  286. CLKGAT1 |= BIT(8);
  287. u8 div_sel = 2;
  288. u32 tim3pr_1s = 26000000/div_sel - 1;
  289. TMR3CON = 0;
  290. TMR3CNT = 0;
  291. TMR3PR = tim3pr_1s;
  292. TMR3CON |= BIT(7); //Timer works in Timer Mode,Timer overflow interrupt enable
  293. TMR3CON |= BIT(0) ; //Timer enable
  294. PICCON |= BIT(2);
  295. PICPR|= BIT(IRQ_TMR3_VECTOR);
  296. PICEN |= BIT(IRQ_TMR3_VECTOR);
  297. }
  298. static void btrf_power_balance_init(void)
  299. {
  300. printf("%s\n",__func__);
  301. timer3_init();
  302. GPIOADE |= GPIOA_TEST_BIT;
  303. GPIOAFEN &= ~GPIOA_TEST_BIT;
  304. GPIOADIR |= GPIOA_TEST_BIT;
  305. btmdm_enable();
  306. }
  307. static void btrf_power_balance_exit(void)
  308. {
  309. printf("%s\n",__func__);
  310. TMR3CON = 0;
  311. GPIOAPU300 &= ~GPIOA_TEST_BIT;
  312. GPIOAPD300 &= ~GPIOA_TEST_BIT;
  313. GPIOADE &=~GPIOA_TEST_BIT;
  314. btmdm_disable();
  315. }
  316. AT(.com_text.btrf_pwrbalance)
  317. static void btrf_power_balance_isr(u32 rf_sta)
  318. {
  319. TMR3CON |= BIT(7);
  320. if(rf_sta & BIT(8)) { //tx on
  321. btrf_power_balance_level_delay_set(750,0); //TX开始后,TX延时一段时间才真正耗电,这里延时一段时间后才降低功耗
  322. } else if(rf_sta & BIT(9)){ //tx down
  323. btrf_power_balance_level_delay_set(120,5); //TX结束,增加耗电
  324. } else if(rf_sta & BIT(10)){ //rx on
  325. btrf_power_balance_level_set(2);
  326. } else if(rf_sta & BIT(11)){ //rx down
  327. btrf_power_balance_level_set(5); //RX结束,增加耗电
  328. }
  329. }
  330. WEAK void bt_power_balance_reconnect(u8 start)
  331. {
  332. bt_reconnect_flag = start;
  333. if (start) {
  334. bt_set_reconnect_txpwr(55);
  335. rf_current_supply();
  336. btrf_power_balance_init();
  337. } else {
  338. btrf_power_balance_exit();
  339. rf_current_recover();
  340. bt_set_reconnect_txpwr(xcfg_cb.rf_dig_gain0);
  341. }
  342. }
  343. AT(.com_text.isr.txrx)
  344. void bb_rf_ext_ctl_cb(u32 rf_sta)
  345. {
  346. if (bt_reconnect_flag) {
  347. btrf_power_balance_isr(rf_sta);
  348. }
  349. }
  350. #endif
  351. void bt_emit_notice_init_finish(void)
  352. {
  353. u8 opcode = 0;
  354. u8 scan_status = 0x03;
  355. //是否使能vusb delay reset?
  356. if (xcfg_cb.charge_dc_reset) {
  357. if (xcfg_cb.bt_tswi_en || (!(RTCCON & BIT(6)))) {
  358. RTCCON &= ~BIT(6);
  359. vusb_delay_rst_en(8); //soft kick vusb延时8秒复位使能
  360. sys_cb.dc_rst_flag = 1;
  361. }
  362. }
  363. #if BT_TWS_EN
  364. if(xcfg_cb.bt_tws_en && (bt_cfg.res[0] & BT_FLAG0_TWS_SCAN)) {
  365. bt_tws_set_scan(0x3); //手动配对,默认只需要按一只耳机。如果需要左右耳都双击才配对,此处改为2,双击按键时改成3
  366. }
  367. #endif
  368. if (cfg_bt_work_mode == MODE_BQB_RF_BREDR || get_qtest_mode()) {
  369. opcode = 1; //测试模式,不回连,打开可被发现可被连接
  370. #if BT_PWRKEY_5S_DISCOVER_EN
  371. } else if(!bsp_bt_w4_connect()) {
  372. opcode = 1; //长按5S开机,不回连,打开可被发现可被连接
  373. #endif
  374. } else {
  375. if (bt_cfg.res[0] & BT_FLAG0_TWS_FAST_PAIR) { //tws不回连, 直接进入自动配对
  376. opcode = 2;
  377. }
  378. if (bt_nor_get_link_info(NULL)) {
  379. scan_status = 0x02; //有回连信息,不开可被发现
  380. }
  381. }
  382. bt_start_work(opcode, scan_status);
  383. }
  384. void bt_emit_notice_disconnect(u8 *param)
  385. {
  386. #if VUSB_TBOX_QTEST_EN
  387. if(get_qtest_mode()) {
  388. if(qtest_feature_is_btdisconnet_pwroff()){
  389. msg_enqueue(EVT_QTEST_PICKUP_PWROFF);
  390. }else if(!qtest_feature_is_pickup_pwroff()) {
  391. sw_reset_kick(SW_RST_FLAG);
  392. }
  393. }
  394. #endif
  395. f_bt.tws_status &= ~0x01;
  396. f_bt.warning_status |= BT_WARN_DISCON;
  397. bsp_bt_redial_reset(param[0] & 0x01);
  398. f_bt.popup_delay_dis = 0;
  399. sys_cb.popup_bat_hide = 0;
  400. sys_cb.menu_det_dis = 0;
  401. #if BT_A2DP_DEFAULT_VOLUME_EN
  402. if (!bt_is_ios_device()) {
  403. sys_cb1.a2dp_default_volume = 0; //断开清flag
  404. }
  405. #endif
  406. delay_5ms(5);
  407. }
  408. void bt_emit_notice_connected(u8 *param)
  409. {
  410. f_bt.warning_status |= BT_WARN_CON;
  411. f_bt.tws_status |= 0x01;
  412. bsp_bt_redial_reset(param[0] & 0x01);
  413. #if BT_PWRKEY_5S_DISCOVER_EN
  414. bsp_bt_pwrkey5s_clr();
  415. #endif // BT_PWRKEY_5S_DISCOVER_EN
  416. #if BT_A2DP_STORE_VOL_EN
  417. u8 volume;
  418. if (bt_get_stored_a2dp_volume(&volume)) {
  419. if (volume != sys_cb.vol) {
  420. bsp_set_volume(volume);
  421. btstack_volume_change();
  422. }
  423. }
  424. #endif
  425. delay_5ms(5);
  426. }
  427. void bt_emit_notice_tws_connected(u8 *param)
  428. {
  429. u8 reason;
  430. #if VUSB_SMART_VBAT_HOUSE_EN
  431. if (xcfg_cb.chbox_smart_en) {
  432. bsp_vhouse_update_sta();
  433. } else
  434. #endif
  435. {
  436. ble_bat_tws_sync();
  437. }
  438. #if BT_DISP_LOW_VBAT_EN
  439. if(bt_tws_is_slave()){
  440. sys_cb1.disp_low_vbat_flag = 1;
  441. }
  442. #endif
  443. reason = param[0];
  444. f_bt.tws_status |= reason & 0xc0;
  445. if (reason & 0x08) {
  446. f_bt.warning_status |= BT_WARN_TWS_CON; //无连接提示音
  447. } else if(reason & 0x80) {
  448. f_bt.warning_status |= BT_WARN_TWS_SCON; //TWS连接提示音
  449. } else if(reason & 0x40) {
  450. f_bt.warning_status |= BT_WARN_TWS_MCON; //TWS连接提示音
  451. }
  452. if (bt_nor_is_connected()) {
  453. f_bt.tws_status |= 0x01; //已连接手机
  454. btstack_send_tws_vol_ctrl_status();
  455. }
  456. if ((f_bt.tws_status & 0xc1) == 0x41) { //主耳且已连接手机
  457. bt_msg_tws_ring_sync();
  458. }
  459. if (atmosphere_led_is_on()) { //同步到对方
  460. btstack_tws_atmos_led();
  461. }
  462. }
  463. void bt_emit_notice(uint evt, u32 param)
  464. {
  465. switch(evt) {
  466. case BT_NOTICE_INIT_FINISH:
  467. bt_emit_notice_init_finish();
  468. break;
  469. case BT_NOTICE_DISCONNECT:
  470. bt_emit_notice_disconnect((u8 *)param);
  471. if(!bt_tws_is_slave())
  472. {
  473. #if TRY_TWS_USER_KEY_SWITCH
  474. bt_tws_user_key(TWS_USER_KEY_DISCONNECT);
  475. #endif // TRY_TWS_USER_KEY_SWITCH
  476. }
  477. break;
  478. case BT_NOTICE_CONNECTED:
  479. bt_emit_notice_connected((u8 *)param);
  480. #if BT_RF_POWER_BALANCE_EN
  481. bt_power_balance_reconnect(0);
  482. #endif
  483. if(!bt_tws_is_slave())
  484. {
  485. #if TRY_TWS_USER_KEY_SWITCH
  486. bt_tws_user_key(TWS_USER_KEY_CONNECTED);
  487. #endif // TRY_TWS_USER_KEY_SWITCH
  488. }
  489. break;
  490. case BT_NOTICE_TWS_DISCONNECT:
  491. #if TRY_TWS_CONN_SCAN_CLOSE
  492. bt_tws_set_scan(3);
  493. #endif // TRY_TWS_CONN_SCAN_CLOSE
  494. f_bt.tws_status &= ~0xc0;
  495. f_bt.warning_status |= BT_WARN_TWS_DISCON;
  496. break;
  497. case BT_NOTICE_TWS_CONNECTED:
  498. #if BT_RF_POWER_BALANCE_EN
  499. if(bt_tws_is_slave()){
  500. bt_power_balance_reconnect(0);
  501. }
  502. #endif
  503. #if TRY_WARNING_SWITCH
  504. if(bt_tws_is_slave())
  505. {
  506. sys_cb1.tws_is_slave_flag = true;
  507. }
  508. #endif // TRY_WARNING_SWITCH
  509. #if TRY_TWS_CONN_SCAN_CLOSE
  510. sys_cb1.tws_conn_ticks = tick_get();
  511. #endif // TRY_TWS_CONN_SCAN_CLOSE
  512. bt_emit_notice_tws_connected((u8 *)param);
  513. break;
  514. case BT_NOTICE_TWS_RES_PLAY:
  515. if (*(u8 *)param <= TWS_RES_RING && !f_bt.ring_sta) {
  516. break;
  517. }
  518. if (*(u8 *)param < TWS_RES_MAX) {
  519. sys_cb.tws_res_brk = 1; //打断当前提示音
  520. }
  521. tws_res_add(*(u8 *)param, *(u32 *)(param+1));
  522. break;
  523. // case BT_NOTICE_LOSTCONNECT:
  524. // msg_enqueue(EVT_BT_LOSTCONNECT);
  525. // break;
  526. //
  527. // case BT_NOTICE_RECON_FINISH:
  528. // if (param == 0) {
  529. // msg_enqueue(EVT_BT_LOSTCONN_END);
  530. // }
  531. // break;
  532. // case BT_NOTICE_DISCONNECT_STATUS:
  533. // if (((u8 *)param)[0] == 0x08) {
  534. // //超距断连
  535. // }
  536. // break;
  537. case BT_NOTICE_SCO_KILL:
  538. #if BT_HFP_CALL_EARPHONE_EN
  539. if (bt_call_need_switch()) {
  540. sys_cb1.call_need_switch = 1;
  541. }
  542. #endif
  543. break;
  544. case BT_NOTICE_INCOMING:
  545. case BT_NOTICE_RING:
  546. case BT_NOTICE_OUTGOING:
  547. case BT_NOTICE_CALL:
  548. break;
  549. case BT_NOTICE_SET_SPK_GAIN:
  550. if(param != sys_cb.hfp_vol) {
  551. sys_cb.hfp_vol = param;
  552. msg_enqueue(EVT_HFP_SET_VOL);
  553. }
  554. break;
  555. case BT_NOTICE_MUSIC_PLAY:
  556. #if (BT_A2DP_DEFAULT_VOLUME_EN && !BT_A2DP_IOS_DEFAULT_VOLUME_FIX)
  557. if (bt_is_ios_device()) {
  558. if (sys_cb1.a2dp_default_volume == 2) {
  559. sys_cb1.a2dp_default_volume = 3;
  560. sys_cb1.a2dp_default_volume_ticks = tick_get();
  561. }
  562. }
  563. #endif
  564. msg_enqueue(EVT_A2DP_MUSIC_PLAY);
  565. break;
  566. case BT_NOTICE_MUSIC_STOP:
  567. msg_enqueue(EVT_A2DP_MUSIC_STOP);
  568. break;
  569. case BT_NOTICE_MUSIC_CHANGE_VOL:
  570. if(param == 0) {
  571. msg_enqueue(KU_VOL_DOWN);
  572. } else {
  573. msg_enqueue(KU_VOL_UP);
  574. }
  575. break;
  576. #if BT_HID_EN
  577. case BT_NOTICE_TWS_HID_SHUTTER:
  578. if (param == HID_KEY_VOL_UP) {
  579. msg_enqueue(EVT_TWS_HID_VOLUP);
  580. } else if (param == HID_KEY_VOL_DOWN) {
  581. msg_enqueue(EVT_TWS_HID_VOLDOWN);
  582. }
  583. break;
  584. #endif // BT_HID_EN
  585. case BT_NOTICE_TWS_INFO:
  586. bt_set_tws_info((u8 *)param);
  587. break;
  588. //TWS自定义按键,通过bt_tws_user_key函数发送
  589. case BT_NOTICE_TWS_USER_KEY:
  590. #if TRY_SYNC_KL_4S_FACTORY_SWITCH
  591. if (param == TWS_USER_KEY_SYNC_KL_L)
  592. {
  593. sys_cb1.sync_kl_l_flag = true;
  594. }
  595. else if(param == TWS_USER_KEY_SYNC_KL_R)
  596. {
  597. sys_cb1.sync_kl_r_flag = true;
  598. }
  599. #endif // TRY_SYNC_KL_4S_FACTORY_SWITCH
  600. #if TRY_TWS_USER_KEY_SWITCH
  601. else if(param == TWS_USER_KEY_CONNECTED || param == TWS_USER_KEY_DISCONNECT)
  602. {
  603. if(!bt_nor_is_connected())
  604. {
  605. led_set_sta(0x00,0x00,0,0);
  606. }
  607. else
  608. {
  609. led_bt_connected();
  610. }
  611. }
  612. #endif // TRY_TWS_USER_KEY_SWITCH
  613. if (param == TWS_USER_KEY_RING_STOP) {
  614. f_bt.ring_stop = 1;
  615. } else if (param == TWS_USER_KEY_ATMOS) {
  616. atmosphere_led_sta_set(1);
  617. }
  618. break;
  619. case BT_NOTICE_SET_QTEST_CH:
  620. if (param && !sys_cb.qtest_force_channel) { //tws检查下qtest固定的声道信息(不能保存到RTCRAM, 否则会传染)
  621. sys_cb.qtest_force_channel = param;
  622. sys_cb.tws_force_channel = param;
  623. }
  624. break;
  625. case BT_NOTICE_TWS_SET_VOL:
  626. param = (param+1) * VOL_MAX / 128;
  627. sys_cb.vol = param;
  628. if (sys_cb.vol > VOL_MAX) {
  629. sys_cb.vol = VOL_MAX;
  630. }
  631. msg_enqueue(EVT_TWS_SET_VOL);
  632. break;
  633. case BT_NOTICE_MUSIC_SET_VOL:
  634. #if BT_A2DP_DEFAULT_VOLUME_EN
  635. if (sys_cb1.a2dp_default_volume == 2) {
  636. if (!bt_is_ios_device()) {
  637. sys_cb1.a2dp_default_volume = 0;
  638. sys_cb1.a2dp_default_volume_ticks = 0;
  639. msg_enqueue(EVT_A2DP_DEFAULT_VOLUME);
  640. break;
  641. }
  642. }
  643. #endif
  644. param = (param+1) * VOL_MAX / 128;
  645. if(param != sys_cb.vol) {
  646. sys_cb.vol = param;
  647. if (sys_cb.vol > VOL_MAX) {
  648. sys_cb.vol = VOL_MAX;
  649. }
  650. msg_enqueue(EVT_A2DP_SET_VOL);
  651. }
  652. break;
  653. #if BT_HID_MENU_EN
  654. case BT_NOTICE_HID_CONN_EVT:
  655. bt_emit_notice_hid_con(param);
  656. break;
  657. #endif // BT_HID_MENU_EN
  658. case BT_NOTICE_FIRST_CONNECT:
  659. #if BT_A2DP_DEFAULT_VOLUME_EN
  660. sys_cb1.a2dp_default_volume = 1;
  661. #endif
  662. #if BT_A2DP_IOS_DEFAULT_VOLUME_FIX
  663. sys_cb1.delay_send_vol_ticks = tick_get();
  664. #endif
  665. break;
  666. case BT_NOTICE_A2DP_VOL_CTRL:
  667. #if BT_A2DP_DEFAULT_VOLUME_EN
  668. if (sys_cb1.a2dp_default_volume == 1) {
  669. sys_cb1.a2dp_default_volume = 2;
  670. sys_cb1.a2dp_default_volume_ticks = tick_get();
  671. }
  672. #endif
  673. break;
  674. case BT_NOTICE_TWS_GET_MAP_TIME:
  675. sys_cb1.tws_get_map_time = 1;
  676. break;
  677. case BT_NOTICE_CONNECT_START:
  678. #if BT_RF_POWER_BALANCE_EN
  679. printf("BT_NOTICE_CONNECT_START\n");
  680. bt_power_balance_reconnect(1);
  681. #endif
  682. break;
  683. case BT_NOTICE_CONNECT_FAIL:
  684. #if BT_RF_POWER_BALANCE_EN
  685. printf("BT_NOTICE_CONNECT_FAIL\n");
  686. bt_power_balance_reconnect(0);
  687. #endif
  688. break;
  689. case BT_NOTICE_TWS_CONNECT_START:
  690. #if BT_RF_POWER_BALANCE_EN
  691. bt_power_balance_reconnect(1);
  692. printf("BT_NOTICE_TWS_CONNECT_START\n");
  693. #endif
  694. break;
  695. case BT_NOTICE_TWS_CONNECT_FAIL:
  696. #if BT_RF_POWER_BALANCE_EN
  697. bt_power_balance_reconnect(0);
  698. printf("BT_NOTICE_TWS_CONNECT_FAIL\n");
  699. #endif
  700. break;
  701. }
  702. }
  703. //TWS断连状态
  704. void bt_notice_tws_disconnect_status(u32 param)
  705. {
  706. #if BT_TWS_SLAVE_LOSTCONN_WARNING_EN
  707. if (((u8 *)param)[0] == 0x08) { //TWS超距断连
  708. if (bt_tws_is_slave() && bt_nor_is_connected()) {
  709. msg_enqueue(EVT_TWS_SLAVE_LOSTCONN);
  710. }
  711. }
  712. #endif
  713. }
  714. //调用后可动态更新蓝牙名字
  715. void updata_bt_name(const char *bt_name)
  716. {
  717. lm_set_name_buf(bt_name, 32);
  718. bt_send_msg(BT_MSG_RESET_BT_NAME);
  719. }
  720. const char *bt_get_local_name(void)
  721. {
  722. #if FUNC_BTHID_EN
  723. if (is_bthid_mode()) {
  724. return bt_name_buf; //可修改独立HID模式的蓝牙名称
  725. }
  726. #endif
  727. return bt_name_buf;
  728. }
  729. #if BT_TWS_FIX_LR_SAME_CH_MAC_EN
  730. bool bt_tws_set_lr_same_ch_mac_is_en(void)
  731. {
  732. return BT_TWS_FIX_LR_SAME_CH_MAC_EN && (xcfg_cb.bt_tws_public_addr == 0);
  733. }
  734. bool bt_tws_is_mac_channel(void)
  735. {
  736. if(sys_cb.tws_force_channel == BT_TWS_SET_MAC_CH && (bt_tws_set_lr_same_ch_mac_is_en())){
  737. return true;
  738. }
  739. return false;
  740. }
  741. #endif
  742. void bt_get_local_bd_addr(u8 *addr)
  743. {
  744. if(qtest_is_loading_local_addr()){
  745. memcpy(addr, xcfg_cb.bt_addr, 6);
  746. return;
  747. }
  748. #if BT_TWS_FIX_LR_SAME_CH_MAC_EN
  749. if(sys_cb.tws_force_channel == BT_TWS_SET_MAC_CH && (bt_tws_set_lr_same_ch_mac_is_en())){
  750. memcpy(addr, xcfg_cb.bt_addr, 6);
  751. #if IODM_TEST_MODE
  752. if(bt_get_qr_addr(addr)){
  753. return;
  754. }
  755. #endif
  756. return;
  757. }
  758. #endif
  759. if (!bt_get_master_addr(addr)) {
  760. #if IODM_TEST_MODE
  761. if(bt_get_qr_addr(addr)){
  762. return;
  763. }
  764. #endif
  765. memcpy(addr, xcfg_cb.bt_addr, 6);
  766. }
  767. #if FUNC_BTHID_EN
  768. if (is_bthid_mode()) {
  769. addr[5] ^= BIT(0);
  770. }
  771. #endif
  772. }
  773. void bt_get_channel_mac_addr(u8 *addr)
  774. {
  775. #if BT_TWS_FIX_LR_SAME_CH_MAC_EN
  776. if(sys_cb.tws_force_channel == BT_TWS_SET_MAC_CH) {
  777. bt_get_local_bd_addr(addr);
  778. }
  779. return ;
  780. #endif
  781. }
  782. void bt_get_link_info(void *buf, u16 addr, u16 size)
  783. {
  784. // printf("bt_read: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  785. #if FUNC_BTHID_EN
  786. if (is_bthid_mode()) {
  787. param_read(buf, size*4, size); //only 1
  788. } else
  789. #endif
  790. {
  791. param_read(buf, PAGE1(addr), size);
  792. }
  793. // print_r(buf, size);
  794. }
  795. void bt_put_link_info(void *buf, u16 addr, u16 size)
  796. {
  797. if(qtest_is_loading_local_addr()){
  798. return;
  799. }
  800. // printf("bt_write: %04x,%04x, %08lx\n", addr, size, BT_CM_PAGE(addr));
  801. // print_r(buf, size);
  802. #if FUNC_BTHID_EN
  803. if (is_bthid_mode()) {
  804. param_write(buf, size*4, size); //only 1
  805. } else
  806. #endif
  807. {
  808. param_write(buf, PAGE1(addr), size);
  809. }
  810. }
  811. #if BT_TWS_CHARGE_DELAY_EN
  812. u8 bsp_bt_tws_charge_delay(void)
  813. {
  814. sys_cb1.charge_ticks = tick_get();
  815. dac_fade_out();
  816. dac_power_off();
  817. while(!tick_check_expire(sys_cb1.charge_ticks, 3000)) {
  818. WDT_CLR();
  819. delay_ms(5);
  820. if (!CHARGE_DC_IN()) {
  821. sys_cb1.dc_in_cnt++;
  822. } else {
  823. sys_cb1.dc_in_cnt = 0;
  824. }
  825. if (sys_cb1.dc_in_cnt == 10) {
  826. sys_cb1.dc_in_cnt = 0;
  827. dac_restart();
  828. dac_fade_in();
  829. return 0;
  830. }
  831. }
  832. return 1;
  833. }
  834. #endif
  835. void ble_box_tws_switch(u8 en);
  836. //耳机进仓充电
  837. void bsp_bt_tws_switch_for_charge(void)
  838. {
  839. printf("bsp_bt_tws_switch_for_charge\n");
  840. bt_clkn_rst = 0;
  841. atmosphere_led_sta_set(0);
  842. led_off();
  843. if (!sys_cb.charge_sta) {
  844. sys_cb.charge_sta = 1;
  845. charge_led_on(); //先亮charge灯状态
  846. }
  847. #if VUSB_TBOX_QTEST_EN
  848. //防止快测蓝牙还未断开就入仓,会一直反复进出充电函数
  849. if(bt_is_testmode() && get_qtest_mode()){
  850. sw_reset_kick(SW_RST_DC_IN);
  851. }
  852. #endif
  853. printf("func_bt_exit_start\n");
  854. func_bt_exit();
  855. printf("func_bt_exit_done\n");
  856. #if ANC_EN
  857. u8 anc_user_mode = sys_cb.anc_user_mode;
  858. bsp_anc_set_mode(0);
  859. #endif
  860. dac_power_off();
  861. bsp_charge_box_enter(1);
  862. sys_cb.dc_rst_flag = 0;
  863. vusb_delay_rst_dis();
  864. #if TRY_CHARGEBOX_PWROFF
  865. sys_cb1.charge_flag = true;
  866. #endif // TRY_CHARGEBOX_PWROFF
  867. printf("charge_start\n");
  868. while(1) {
  869. WDT_CLR();
  870. delay_ms(5);
  871. if (bsp_charge_box_process()) {
  872. break;
  873. }
  874. }
  875. printf("bsp_charge_box_exit_start\n");
  876. bsp_charge_box_exit();
  877. printf("bsp_charge_box_exit_end\n");
  878. sys_cb.charge_sta = 0;
  879. printf("dc out\n");
  880. #if TRY_WARNING_SWITCH
  881. sys_cb1.tws_is_slave_flag = false;
  882. #endif // TRY_WARNING_SWITCH
  883. charge_led_off(0);
  884. led_bt_init();
  885. func_bt_init();
  886. reset_sleep_delay();
  887. en_auto_pwroff();
  888. bt_clkn_rst = 1;
  889. dac_restart();
  890. #if ANC_EN
  891. bsp_anc_set_mode(anc_user_mode);
  892. dac_fade_in();
  893. #endif
  894. #if DAC_DNR_EN
  895. dac_dnr_set_sta(xcfg_cb.dac_dnr_en);
  896. #endif
  897. if (xcfg_cb.bt_outbox_voice_pwron_en) {
  898. sys_warning_play(T_WARNING_POWER_ON, PIANO_POWER_ON);
  899. }
  900. bt_audio_enable();
  901. // printf("bt connect\n");
  902. }
  903. #if TRY_VBAT_LEVEL_SWITCH
  904. AT(.com_text.bat)
  905. u8 get_vbat_level(void)
  906. {
  907. static u8 vbat_level = 0;
  908. if(sys_cb.vbat > 4130)
  909. {
  910. vbat_level = 9;
  911. f_bt.loc_vbat = 9;
  912. }
  913. else if(sys_cb.vbat > 4050)
  914. {
  915. vbat_level = 8;
  916. f_bt.loc_vbat = 8;
  917. }
  918. else if(sys_cb.vbat > 4000)
  919. {
  920. vbat_level = 7;
  921. f_bt.loc_vbat = 7;
  922. }
  923. else if(sys_cb.vbat > 3940)
  924. {
  925. vbat_level = 6;
  926. f_bt.loc_vbat = 6;
  927. }
  928. else if(sys_cb.vbat > 3890)
  929. {
  930. vbat_level = 5;
  931. f_bt.loc_vbat = 5;
  932. }
  933. else if(sys_cb.vbat > 3850)
  934. {
  935. vbat_level = 4;
  936. f_bt.loc_vbat = 4;
  937. }
  938. else if(sys_cb.vbat > 3810)
  939. {
  940. vbat_level = 3;
  941. f_bt.loc_vbat = 3;
  942. }
  943. else if(sys_cb.vbat > 3780)
  944. {
  945. vbat_level = 2;
  946. f_bt.loc_vbat = 2;
  947. }
  948. else if(sys_cb.vbat > 3710)
  949. {
  950. vbat_level = 1;
  951. f_bt.loc_vbat = 2;
  952. }
  953. else if(sys_cb.vbat > 3390)
  954. {
  955. vbat_level = 0;
  956. f_bt.loc_vbat = 0;
  957. }
  958. else
  959. {
  960. vbat_level = 0;
  961. f_bt.loc_vbat = 0;
  962. }
  963. return vbat_level;
  964. }
  965. #endif // TRY_VBAT_LEVEL_SWITCH
  966. AT(.com_text.bat)
  967. void hfp_get_bat_level_hook(uint *level)
  968. {
  969. #if BT_DISP_LOW_VBAT_EN
  970. if(bt_tws_is_connected() && (bt_tws_is_slave() == 0)){
  971. if(*level > f_bt.rem_vbat){
  972. *level = f_bt.rem_vbat;
  973. }
  974. }
  975. #endif
  976. #if TRY_VBAT_LEVEL_SWITCH
  977. *level = get_vbat_level();
  978. #endif // TRY_VBAT_LEVEL_SWITCH
  979. // printf("*level %d vbat %d role %d\n",*level,sys_cb.vbat,bt_tws_is_slave());
  980. return;
  981. }
  982. //播放降噪状态提示音
  983. void bsp_bt_msg_nr_sta_change(void)
  984. {
  985. if(bt_tws_is_slave()) {
  986. return;
  987. }
  988. #if ANC_EN
  989. // switch(sys_cb.nr_sta) {
  990. // case 1:
  991. // tws_res_play(TWS_RES_NR_DISABLE); //同步播放语言提示音
  992. // break;
  993. // case 2:
  994. // tws_res_play(TWS_RES_ANC); //同步播放语言提示音
  995. // break;
  996. // case 3:
  997. // tws_res_play(TWS_RES_TRANSPARENCY); //同步播放语言提示音
  998. // break;
  999. // }
  1000. bsp_anc_set_mode(sys_cb.nr_sta - 1);
  1001. #endif // ANC_EN
  1002. }
  1003. uint8_t bt_get_loc_nr_sta(void)
  1004. {
  1005. return sys_cb.nr_sta;
  1006. }
  1007. void bt_va_callback(u16 operate)
  1008. {
  1009. }
  1010. u8 bt_sco_magic_voice_en(void)
  1011. {
  1012. return BT_SCO_MAV_EN;
  1013. }
  1014. #if BT_A2DP_DEFAULT_VOLUME_EN
  1015. u8 bt_a2dp_default_volume_is_enable(void)
  1016. {
  1017. return 1;
  1018. }
  1019. #endif
  1020. #if BT_TWS_SLAVE_CONN_NOR_FIX
  1021. u8 bt_tws_slave_conn_nor_fix_enable(void)
  1022. {
  1023. return 1;
  1024. }
  1025. #endif
  1026. //void tws_send_custom_data(u8* buf, u8 len) 自定义数据发送接口,最大14bytes
  1027. void tws_set_custom_data(u8* buf)
  1028. {
  1029. // u8 len = buf[0];
  1030. }
  1031. #if BT_HFP_CALL_EARPHONE_EN
  1032. u8 bt_call_need_switch(void)
  1033. {
  1034. return sys_cb1.call_switch;
  1035. // return 1; // 1: 强制使用耳机端接听, 手机无法切换
  1036. }
  1037. #endif
  1038. u8 bt_play_pause_siri_ctrl_dis(void)
  1039. {
  1040. return BT_PLAY_PAUSE_SIRI_CTRL_DIS_EN;
  1041. }
  1042. void bt_store_a2dp_volume(u8 vol)
  1043. {
  1044. bt_send_msg(BT_MSG_STORE_A2DP_VOLUME | (vol << 8));
  1045. }
  1046. //设置TWS搜索从机的时间
  1047. uint8_t bt_tws_get_search_slave_times(void)
  1048. {
  1049. return 3;
  1050. }
  1051. //设置TWS快速连接(不回连)的出仓配对时间
  1052. u8 bt_get_tws_fast_pair_inq_status(void)
  1053. {
  1054. return 4;
  1055. }
  1056. #if BT_TWS_TIMEOUT_DELAY_TIME_CTRL_EN
  1057. u32 bt_tws_timeout_delay_times(void)
  1058. {
  1059. return 1000; //增加TWS超距断线单次回连时间1000ms
  1060. }
  1061. #endif
  1062. u8 bt_hid_shutter_oppo_is_enable(void)
  1063. {
  1064. return BT_HID_SHUTTER_OPPO_EN;
  1065. }
  1066. #if BT_TWS_WARNING_SLAVE_BYPASS_FIX
  1067. void bt_warning_set_playing(u8 flag)
  1068. {
  1069. sys_cb1.warning_is_playing = flag;
  1070. }
  1071. u8 bt_warning_is_playing(void)
  1072. {
  1073. return sys_cb1.warning_is_playing;
  1074. }
  1075. #endif
  1076. #if BT_A2DP_AAC_BITRATE_CONFIG_EN
  1077. u32 bt_get_a2dp_aac_max_bitrate(void)
  1078. {
  1079. return 256000; //256kbit/s
  1080. }
  1081. #endif
  1082. //解决和AB5656A2配对,通话声音不同步的问题
  1083. //u8 bt_sco_far_delay_enable(void)
  1084. //{
  1085. // return 1;
  1086. //}
  1087. //解决VT-S20点读笔音频连接问题
  1088. //u8 bt_talking_pen_fix_enable(void)
  1089. //{
  1090. // return 1;
  1091. //}
  1092. #if BT_TWS_SET_RECONN_NOR_EN
  1093. u8 bt_tws_set_reconn_nor_enable(void)
  1094. {
  1095. return 1;
  1096. }
  1097. #endif
  1098. #if BT_HID_EN
  1099. bool bsp_bt_hid_photo(u16 keycode)
  1100. {
  1101. if ((xcfg_cb.bt_hid_en) && (bt_hid_is_connected())) {
  1102. bt_hid_key(HID_KEY_ENTER); //enter key, android 4.0以上
  1103. delay_5ms(10);
  1104. bt_hid_consumer(keycode); //consumer key vol_up or vol_down, ios
  1105. sys_warning_play(T_WARNING_TAKE_PHOTO, PIANO_TAKE_PHOTO);
  1106. return true;
  1107. }
  1108. return false;
  1109. }
  1110. #endif // BT_HID_EN
  1111. #if BT_MAP_EN
  1112. #if BT_MAP_EN
  1113. bool bt_time_get_flag = false;
  1114. void bsp_get_real_time_process(void)
  1115. {
  1116. static u32 map_ticks = 1;
  1117. if (tick_check_expire(map_ticks, 10000)) {
  1118. map_ticks = tick_get();
  1119. if(bt_nor_is_connected()) {
  1120. if (!bt_tws_is_slave() && !bt_time_get_flag) {
  1121. printf("---map timer---\r\n");
  1122. #if BT_MAP_EN
  1123. hfp_at_kick();
  1124. bt_map_kick();
  1125. #endif
  1126. }
  1127. } else {
  1128. bt_time_get_flag = false;
  1129. }
  1130. }
  1131. }
  1132. #endif
  1133. #endif