bsp_sys.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  1. #include "include.h"
  2. sys_cb1_t sys_cb1;
  3. extern sys_cb_t sys_cb;
  4. void user_tmr_set_enable(bool tmr5ms, bool tmr1ms);
  5. void voltage_trim_value_init(void);
  6. void mic_bias_var_init(void);
  7. void bsp_xcfg_enable_default(void);
  8. void bsp_get_xcfg_bt_name(void);
  9. void tws_lr_xcfg_sel(void);
  10. bool rtc_init(void);
  11. void x26m_cap_tune(void);
  12. void eeprom_init(void);
  13. void e2p_var_init(void);
  14. void bsp_bt_name_suffix(void);
  15. void sw_reset_flag_get(void);
  16. void pwrkey_2_hw_pwroff_detect(void);
  17. void pwrkey_5s_on_check(void);
  18. void mic_bias_trim(void);
  19. void lt_charge_poweron(void);
  20. void lt_charge_init(void);
  21. void lt_charge_tx_kick(void);
  22. void lt_charge_var_init(void);
  23. void bsp_var_init_m(void);
  24. void bsp_188led_gpio_init(void);
  25. void bsp_188led_var_init(void);
  26. void charge_box_ble_init(void);
  27. void ble_charge_box_addr_set(void);
  28. void led_pwm_scan(void);
  29. extern const u16 sleep_time_tbl[22];
  30. AT(.text.dongle)
  31. const u8 tbl_secret_key[16] = {0x45, 0xDB, 0x98, 0x3A, 0xE2, 0x59, 0x7A, 0x35, 0x17, 0x66, 0xDD, 0x7D, 0x9F, 0x2F, 0xD2, 0x5D};
  32. #if TRY_SYNC_KL_4S_FACTORY_SWITCH
  33. void sync_kl_4s_factory_process(void)
  34. {
  35. if(sys_cb1.factory_flag)
  36. {
  37. if(!bt_tws_is_slave())
  38. {
  39. bt_nor_disconnect();
  40. led_bt_idle();
  41. f_bt.warning_status |= BT_WARN_PAIRING;
  42. }
  43. else
  44. {
  45. led_set_sta(0x00,0x00,0,0);
  46. }
  47. sys_cb1.factory_flag = false;
  48. #if TRY_TOUCH_WARNING_DELAY_FIX
  49. sys_cb1.pairing_warning_flag = true;
  50. sys_cb1.pairing_warning_delay = 0;
  51. #endif // TRY_TOUCH_WARNING_DELAY_FIX
  52. }
  53. if(sys_cb1.sync_kl_flag)
  54. {
  55. if(tkey_get_key())
  56. {
  57. if(sys_cb1.sync_kl_l_flag && sys_cb1.sync_kl_r_flag)
  58. {
  59. tws_res_play(TWS_SYNC_FACTORY);
  60. }
  61. }
  62. else
  63. {
  64. sys_cb1.sync_kl_flag = false;
  65. }
  66. }
  67. else
  68. {
  69. sys_cb1.sync_kl_l_flag = false;
  70. sys_cb1.sync_kl_r_flag = false;
  71. }
  72. }
  73. #endif // TRY_SYNC_KL_4S_FACTORY_SWITCH
  74. #if TRY_LOWBAT_WARNING_SWITCH
  75. void lowbat_warning_process(void)
  76. {
  77. if(sys_cb.vbat < TRY_LOWBAT_PWROFF_VBAT)
  78. {
  79. sys_cb.discon_reason = 0;
  80. sys_cb.pwrdwn_tone_en = 1;
  81. func_cb.sta = FUNC_PWROFF;
  82. }
  83. if(f_bt.loc_vbat <= 2/*sys_cb.vbat < TRY_LOWBAT_WARNING_VBAT*/ && !sys_cb1.lowbat_warning_time_count)
  84. {
  85. led_set_sta(0x00,0x00,0,0);
  86. sys_warning_play(T_WARNING_LOW_BATTERY,2);
  87. }
  88. if(f_bt.loc_vbat <= 2/*sys_cb.vbat < TRY_LOWBAT_WARNING_VBAT*/)
  89. {
  90. sys_cb1.lowbat_warning_time_count++;
  91. }
  92. if(f_bt.loc_vbat > 2/*sys_cb.vbat >= TRY_LOWBAT_WARNING_VBAT*/ || sys_cb1.lowbat_warning_time_count >= TRY_LOWBAT_WARNING_TIME)
  93. {
  94. sys_cb1.lowbat_warning_time_count = 0;
  95. }
  96. }
  97. #endif // TRY_LOWBAT_WARNING_SWITCH
  98. //timer tick interrupt(1ms)
  99. AT(.com_text.timer)
  100. void usr_tmr1ms_isr(void)
  101. {
  102. #if TRY_KEY_SWITCH
  103. if(sys_cb1.change_vol_flag)
  104. {
  105. sys_cb1.change_vol_delay++;
  106. if(sys_cb1.change_vol_delay >= 1000 && !tkey_get_key())
  107. {
  108. sys_cb1.change_vol_flag = false;
  109. sys_cb1.change_vol_delay = 0;
  110. }
  111. }
  112. #endif // TRY_KEY_SWITCH
  113. #if TRY_TOUCH_WARNING_DELAY_FIX
  114. if(sys_cb1.pairing_warning_flag)
  115. {
  116. sys_cb1.pairing_warning_delay++;
  117. if(sys_cb1.pairing_warning_delay >= 7500)
  118. {
  119. sys_cb1.pairing_warning_flag = false;
  120. sys_cb1.pairing_warning_delay = 0;
  121. }
  122. }
  123. if(sys_cb1.mode_warning_flag)
  124. {
  125. sys_cb1.mode_warning_delay++;
  126. if(sys_cb1.mode_warning_delay >= 2500)
  127. {
  128. sys_cb1.mode_warning_flag = false;
  129. sys_cb1.mode_warning_delay = 0;
  130. }
  131. }
  132. #endif // TRY_TOUCH_WARNING_DELAY_FIX
  133. #if TRY_LED_SWITCH
  134. if(sys_cb.charge_sta == 1)
  135. {
  136. LED_SET_OFF();
  137. }
  138. #endif // TRY_LED_SWITCH
  139. }
  140. #if TRY_CHARGEBOX_PWROFF
  141. //AT(.com_rodata.bsp.key)
  142. //const char CHARGE_INBOX_STR[] = "CHARGE_INBOX():%d\n";
  143. //AT(.com_rodata.bsp.key)
  144. //const char high_v_count_str[] = "sys_cb1.high_v_count:%d\n";
  145. //AT(.com_rodata.bsp.key)
  146. //const char low_v_count_str[] = "sys_cb1.low_v_count:%d\n";
  147. //AT(.com_rodata.bsp.key)
  148. //const char pwroff_str[] = "charge box pwroff\n";
  149. #endif // TRY_CHARGEBOX_PWROFF
  150. //timer tick interrupt(5ms)
  151. AT(.com_text.timer)
  152. void usr_tmr5ms_isr_hook(void)
  153. {
  154. #if TRY_CHARGEBOX_PWROFF
  155. // printf(CHARGE_INBOX_STR,CHARGE_INBOX());
  156. if(sys_cb1.charge_flag)
  157. {
  158. if(CHARGE_INBOX())
  159. {
  160. if(sys_cb1.high_v_time)
  161. {
  162. // printf(CHARGE_INBOX_STR,CHARGE_INBOX());
  163. sys_cb1.high_v_time_count++;
  164. if(sys_cb1.high_v_time_count >= 4)
  165. {
  166. sys_cb1.high_v_count++;
  167. sys_cb1.high_v_time_count = 0;
  168. sys_cb1.high_v_time = false;
  169. sys_cb1.low_v_time = true;
  170. sys_cb1.charge_pwroff_check_ticks = tick_get();
  171. // printf(high_v_count_str,sys_cb1.high_v_count);
  172. // printf(low_v_count_str,sys_cb1.low_v_count);
  173. }
  174. }
  175. }
  176. else
  177. {
  178. if(sys_cb1.low_v_time)
  179. {
  180. // printf(CHARGE_INBOX_STR,CHARGE_INBOX());
  181. sys_cb1.low_v_time_count++;
  182. if(sys_cb1.low_v_time_count >= 4)
  183. {
  184. sys_cb1.low_v_count++;
  185. sys_cb1.low_v_time_count = 0;
  186. sys_cb1.low_v_time = false;
  187. sys_cb1.high_v_time = true;
  188. sys_cb1.charge_pwroff_check_ticks = tick_get();
  189. // printf(high_v_count_str,sys_cb1.high_v_count);
  190. // printf(low_v_count_str,sys_cb1.low_v_count);
  191. }
  192. }
  193. }
  194. if(sys_cb1.high_v_count == 6 && sys_cb1.low_v_count == 7)
  195. {
  196. // printf(pwroff_str);
  197. sys_cb1.high_v_time_count = 0;
  198. sys_cb1.low_v_time_count = 0;
  199. sys_cb1.high_v_count = 0;
  200. sys_cb1.low_v_count = 0;
  201. sys_cb1.charge_pwroff_flag = true;
  202. }
  203. else if(sys_cb1.high_v_count && sys_cb1.low_v_count)
  204. {
  205. if(tick_check_expire(sys_cb1.charge_pwroff_check_ticks, 1000))
  206. {
  207. sys_cb1.high_v_time = false;
  208. sys_cb1.low_v_time = true;
  209. sys_cb1.high_v_time_count = 0;
  210. sys_cb1.low_v_time_count = 0;
  211. sys_cb1.high_v_count = 0;
  212. sys_cb1.low_v_count = 0;
  213. sys_cb1.charge_pwroff_check_ticks = 0;
  214. }
  215. }
  216. }
  217. #endif // TRY_CHARGEBOX_PWROFF
  218. dac_fade_process();
  219. bsp_key_scan();
  220. #if VUSB_SMART_VBAT_HOUSE_EN
  221. if (xcfg_cb.chbox_smart_en) {
  222. bsp_vhouse_cmd_ack();
  223. }
  224. #endif
  225. pwrkey_2_hw_pwroff_detect();
  226. hall_sensor_detect();
  227. #if USER_NTC
  228. sys_ntc_check();
  229. #endif // USER_NTC
  230. #if LINEIN_DETECT_EN
  231. linein_detect();
  232. #endif // LINEIN_DETECT_EN
  233. #if EARPHONE_DETECT_EN
  234. earphone_detect();
  235. #endif // EARPHONE_DETECT_EN
  236. #if BT_EARIN_DETECT_EN
  237. earin_detect();
  238. #endif
  239. #if BT_LIGHTNINIG_EN
  240. lt_uart_tx_auth_process();
  241. #endif
  242. #if CHARGE_TSEN_DETECT
  243. charge_tsen_check(20);
  244. #endif
  245. mic_bias_trim();
  246. //SYNC 50ms timer process
  247. if (bt_sync_tick()) {
  248. led_scan();
  249. led_sync();
  250. }
  251. }
  252. void uart0_mapping_sel(void)
  253. {
  254. //等待uart0发送完成
  255. if(UART0CON & BIT(0)) {
  256. while (!(UART0CON & BIT(8)));
  257. }
  258. GPIOBDE &= ~BIT(3);
  259. GPIOBPU &= ~BIT(3);
  260. GPIOBDIR |= BIT(3);
  261. FUNCMCON0 = (0xf << 12) | (0xf << 8); //clear uart0 mapping
  262. #if (UART0_PRINTF_SEL == PRINTF_PA7)
  263. GPIOADE |= BIT(7);
  264. GPIOAPU |= BIT(7);
  265. GPIOADIR |= BIT(7);
  266. GPIOAFEN |= BIT(7);
  267. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PA7; //RX0 Map To TX0, TX0 Map to G1
  268. #elif (UART0_PRINTF_SEL == PRINTF_PB3)
  269. GPIOBDE |= BIT(3);
  270. GPIOBPU |= BIT(3);
  271. GPIOBDIR |= BIT(3);
  272. GPIOBFEN |= BIT(3);
  273. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PB3; //RX0 Map To TX0, TX0 Map to G3
  274. #elif (UART0_PRINTF_SEL == PRINTF_PE7)
  275. GPIOEDE |= BIT(7);
  276. GPIOEPU |= BIT(7);
  277. GPIOEDIR |= BIT(7);
  278. GPIOEFEN |= BIT(7);
  279. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PE7; //RX0 Map To TX0, TX0 Map to G4
  280. #elif (UART0_PRINTF_SEL == PRINTF_PF2)
  281. GPIOFDE |= BIT(2);
  282. GPIOFPU |= BIT(2);
  283. GPIOFDIR |= BIT(2);
  284. GPIOFFEN |= BIT(2);
  285. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PF2; //RX0 Map To TX0, TX0 Map to G4
  286. #elif (UART0_PRINTF_SEL == PRINTF_PE0)
  287. GPIOEDE |= BIT(0);
  288. GPIOEPU |= BIT(0);
  289. GPIOEDIR |= BIT(0);
  290. GPIOEFEN |= BIT(0);
  291. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PE0; //RX0 Map To TX0, TX0 Map to G4
  292. #endif
  293. }
  294. //开user timer前初始化的内容
  295. void bsp_var_init(void)
  296. {
  297. memset(&sys_cb1, 0, sizeof(sys_cb1));
  298. memset(&sys_cb, 0, sizeof(sys_cb));
  299. sys_cb.loudspeaker_mute = 1;
  300. sys_cb.ms_ticks = tick_get(); //用于5S开机判断
  301. sys_cb.pwrkey_5s_check = 1;
  302. sys_cb.vol_max = (xcfg_cb.vol32_en) ? 32 : 16;
  303. sys_cb.hfp2sys_mul = (sys_cb.vol_max + 2) / 16;
  304. if (SYS_INIT_VOLUME > (sys_cb.vol_max - 1)) {
  305. SYS_INIT_VOLUME = sys_cb.vol_max - 1;
  306. }
  307. if (SYS_RECOVER_INITVOL > (sys_cb.vol_max - 1)) {
  308. SYS_RECOVER_INITVOL = sys_cb.vol_max - 1;
  309. }
  310. if (WARNING_VOLUME > (sys_cb.vol_max - 1)) {
  311. WARNING_VOLUME = sys_cb.vol_max - 1;
  312. }
  313. sys_cb.lpwr_leave_vbat = 2;
  314. sys_cb.sleep_time = -1L;
  315. sys_cb.pwroff_time = -1L;
  316. if ((xcfg_cb.sys_sleep_time > 0) && (xcfg_cb.sys_sleep_time < 23)) {
  317. sys_cb.sleep_time = sleep_time_tbl[xcfg_cb.sys_sleep_time - 1];
  318. }
  319. if ((xcfg_cb.sys_off_time > 0) && (xcfg_cb.sys_off_time < 23)) {
  320. sys_cb.pwroff_time = sleep_time_tbl[xcfg_cb.sys_off_time - 1];
  321. }
  322. sys_cb.sleep_delay = -1L;
  323. sys_cb.pwroff_delay = -1L;
  324. sys_cb.sleep_en = 0;
  325. bt_clkn_rst = 1;
  326. sys_cb.adkey_ch = cfg_adcch_tbl[xcfg_cb.adkey_ch];
  327. sys_cb.ntc_adc_ch = cfg_adcch_tbl[xcfg_cb.ntc_adc_ch];
  328. sys_cb.loc_bat = 100 | BIT(7); //初始化耳机在仓电量默认100%
  329. sys_cb.loc_house_bat = 100; //上电电池仓电量默认100%
  330. sys_cb.loc_house_state = BIT(0); //上电电池仓盖默认打开
  331. sys_cb.rem_bat = sys_cb.loc_bat;
  332. sys_cb.rem_house_bat = sys_cb.loc_house_bat;
  333. sys_cb.rem_house_state = sys_cb.loc_house_state;
  334. cfg_spiflash_speed_up_en = SPIFLASH_SPEED_UP_EN;
  335. memset(&f_aux, 0, sizeof(func_aux_t));
  336. memset(&f_bt, 0, sizeof(func_bt_t));
  337. plugin_var_init();
  338. key_var_init();
  339. msg_queue_init();
  340. device_init();
  341. sdadc_var_init();
  342. dac_cb_init();
  343. piano_var_init();
  344. mic_bias_var_init();
  345. e2p_var_init();
  346. charge_box_var_init();
  347. anc_var_init();
  348. lt_var_init();
  349. lt_charge_var_init();
  350. #if LED_188LED_DISP_EN
  351. if(CHARGE_DC_IN()) { //开机进充电提前初始化
  352. bsp_188led_gpio_init();
  353. bsp_188led_var_init();
  354. }
  355. #endif
  356. #if TRY_KEY_SWITCH
  357. sys_cb1.change_vol_flag = false;
  358. sys_cb1.change_vol_delay = 0;
  359. #endif // TRY_KEY_SWITCH
  360. #if TRY_WARNING_SWITCH
  361. sys_cb1.tws_is_slave_flag = false;
  362. #endif // TRY_WARNING_SWITCH
  363. #if TRY_SYNC_KL_4S_FACTORY_SWITCH
  364. sys_cb1.factory_flag = false;
  365. sys_cb1.sync_kl_flag = false;
  366. sys_cb1.sync_kl_l_flag = false;
  367. sys_cb1.sync_kl_r_flag = false;
  368. #endif // TRY_SYNC_KL_4S_FACTORY_SWITCH
  369. #if TRY_LOWBAT_WARNING_SWITCH
  370. sys_cb1.lowbat_warning_time_count = 0;
  371. #endif // TRY_LOWBAT_WARNING_SWITCH
  372. #if TRY_CHARGEBOX_PWROFF
  373. sys_cb1.charge_flag = false;
  374. sys_cb1.high_v_time = false;
  375. sys_cb1.low_v_time = true;
  376. sys_cb1.high_v_time_count = 0;
  377. sys_cb1.low_v_time_count = 0;
  378. sys_cb1.high_v_count = 0;
  379. sys_cb1.low_v_count = 0;
  380. sys_cb1.charge_pwroff_flag = false;
  381. sys_cb1.charge_pwroff_check_ticks = 0;
  382. #endif // TRY_CHARGEBOX_PWROFF
  383. #if TRY_KH_VOL_CHANGE_INTERVAL
  384. sys_cb1.key_hold_count = 0;
  385. #endif // TRY_KH_VOL_CHANGE_INTERVAL
  386. #if TRY_TOUCH_WARNING_DELAY_FIX
  387. sys_cb1.pairing_warning_flag = false;
  388. sys_cb1.pairing_warning_delay = 0;
  389. sys_cb1.mode_warning_flag = false;
  390. sys_cb1.mode_warning_delay = 0;
  391. #endif // TRY_TOUCH_WARNING_DELAY_FIX
  392. #if TRY_TWS_CONN_SCAN_CLOSE
  393. sys_cb1.tws_conn_ticks = 0;
  394. #endif // TRY_TWS_CONN_SCAN_CLOSE
  395. }
  396. AT(.text.bsp.sys.init)
  397. static void bsp_io_init(void)
  398. {
  399. if (lt_sdq_valid) {
  400. GPIOAPU = BIT(7);
  401. GPIOADE = BIT(7);
  402. GPIOBDE = BIT(4);
  403. } else {
  404. GPIOAPU = 0;
  405. GPIOADE = 0;
  406. GPIOBDE = 0;
  407. }
  408. GPIOEDE = 0;
  409. GPIOFDE = 0;
  410. GPIOGDE = 0x3F; //MCP FLASH
  411. #if (UART0_PRINTF_SEL == PRINTF_PA7)
  412. GPIOADE = BIT(7);
  413. #elif (UART0_PRINTF_SEL == PRINTF_PB3)
  414. GPIOBDE = BIT(3);
  415. #elif (UART0_PRINTF_SEL == PRINTF_PF2)
  416. GPIOFDE = BIT(2);
  417. #elif (UART0_PRINTF_SEL == PRINTF_PE7)
  418. GPIOEDE = BIT(7);
  419. #elif (UART0_PRINTF_SEL == PRINTF_PE0)
  420. GPIOEDE = BIT(0);
  421. #endif
  422. }
  423. void bt_rf_update_ft_trim_value(void)
  424. {
  425. if (sys_trim.ft_trim_flag) {
  426. s32 offset = 55 - (s32)xcfg_cb.rf_dig_gain0;
  427. xcfg_cb.rf_dig_gain0 = sys_trim.dig_gain - offset - 2;
  428. xcfg_cb.rf_dig_gain_sco = sys_trim.dig_gain - offset - 2;
  429. }
  430. }
  431. void bsp_xcfg_init(void)
  432. {
  433. voltage_trim_value_init(); //初始化CP Trim值
  434. bsp_xcfg_enable_default(); //启动配置后,部分模块关闭时需要设置默认值
  435. update_set_qcheck_code();
  436. if(xcfg_cb.anc_en){
  437. xcfg_cb.dac_out_spr = 1; //anc使能后固定dac输出采样率48K
  438. }
  439. bt_rf_update_ft_trim_value();
  440. if (!xcfg_cb.lt_sa_en) {
  441. lt_sdq_valid = 0;
  442. SDQCON = 0;
  443. } else {
  444. if (!xcfg_cb.lt_chg_en) {
  445. SDQCON = 0x01;
  446. }
  447. }
  448. //更新蓝牙名称
  449. bsp_get_xcfg_bt_name();
  450. bsp_bt_name_suffix();
  451. }
  452. AT(.text.bsp.sys.init)
  453. void bsp_sys_init(void)
  454. {
  455. /// config
  456. bsp_xcfg_init();
  457. // io init
  458. bsp_io_init();
  459. // var init
  460. bsp_var_init();
  461. // power init
  462. pmu_init(BUCK_MODE_EN*xcfg_cb.buck_mode_en);
  463. // clock init
  464. adpll_init(DAC_OUT_SPR); //要放在pmu_init之后
  465. sys_clk_set(SYS_CLK_SEL);
  466. // peripheral init
  467. rtc_init();
  468. #if SYS_PARAM_EEPROM
  469. eeprom_init();
  470. #endif // SYS_PARAM_EEPROM
  471. param_init(sys_cb.rtc_first_pwron);
  472. #if IODM_TEST_MODE
  473. iodm_init();
  474. iodm_reflash_bt_name();
  475. #endif
  476. sw_reset_flag_get();
  477. tws_lr_xcfg_sel(); //TWS声道初始化, 放在param_init之后
  478. plugin_popup_auto_config(); //popup初始化,放在param_init之后
  479. x26m_cap_tune(); //26M晶振电容配置
  480. clkgate_configure();
  481. #if CHARGE_EN
  482. if (xcfg_cb.charge_en) {
  483. #if TRY_CHARGEBOX_PWROFF
  484. user_tmr_set_enable(1, 1);
  485. #endif // TRY_CHARGEBOX_PWROFF
  486. bsp_charge_init();
  487. }
  488. #endif // CHARGE_EN
  489. #if SYS_SUPPORT_DONGLE_EN
  490. dongle_check_key();
  491. #endif
  492. #if LINEIN_2_PWRDOWN_EN
  493. if (sys_cb.sleep_dac_en) {
  494. dac_power_off_pulldown_daclr();
  495. }
  496. #endif
  497. led_init();
  498. key_init();
  499. #if LED_188LED_DISP_EN
  500. bsp_188led_gpio_init();
  501. bsp_188led_var_init();
  502. #endif
  503. #if PWM_RGB_EN
  504. pwm_init();
  505. #endif // PWM_RGB_EN
  506. plugin_init();
  507. /// enable user timer for display & dac
  508. user_tmr_set_enable(1, 1);
  509. led_power_up();
  510. motor_enable(MOTOR_PWRON, T_MOTOR_PWRON_SEL); //开机马达振动
  511. #if BT_LIGHTNINIG_EN
  512. if (xcfg_cb.lt_sa_en) {
  513. lt_uart_tx_auth_start();
  514. if (xcfg_cb.lt_chg_en) {
  515. lt_charge_init();
  516. }
  517. }
  518. #endif
  519. bt_init();
  520. bt_work_mode_init();
  521. if (!xcfg_cb.bt_init_fast_dis) { //是否蓝牙提前初始化,可以加速回连
  522. func_bt_init();
  523. }
  524. dac_init();
  525. #if VUSB_TBOX_QTEST_EN
  526. qtest_create_env();
  527. #endif
  528. #if ANC_EN
  529. bsp_anc_init();
  530. bsp_anc_set_mode(1);
  531. #endif
  532. bsp_change_volume(sys_cb.vol);
  533. #if LINEIN_2_PWRDOWN_EN
  534. if (xcfg_cb.linein_2_pwrdown_en) {
  535. delay_5ms(60);
  536. if (device_is_online(DEV_LINEIN)) {
  537. sys_cb.pwrdwn_tone_en = LINEIN_2_PWRDOWN_TONE_EN;
  538. func_cb.sta = FUNC_PWROFF;
  539. return;
  540. }
  541. }
  542. #endif // LINEIN_2_PWRDOWN_EN
  543. #if WARNING_POWER_ON
  544. if ((xcfg_cb.bt_outbox_voice_pwron_en) || (!sys_cb.outbox_pwron_flag)) {
  545. mic_bias_trim_w4_done_do();
  546. sys_warning_play(T_WARNING_POWER_ON, PIANO_POWER_ON);
  547. }
  548. sys_cb.outbox_pwron_flag = 0;
  549. #endif // WARNING_POWER_ON
  550. #if FUNC_AUX_EN
  551. if ((xcfg_cb.func_aux_en) && (!xcfg_cb.linein_2_pwrdown_en)) {
  552. if (device_is_online(DEV_LINEIN)) {
  553. func_cb.sta = FUNC_AUX;
  554. return;
  555. }
  556. }
  557. #endif // FUNC_AUX_EN
  558. func_cb.sta = FUNC_BT;
  559. #if EQ_DBG_IN_UART || EQ_DBG_IN_SPP
  560. eq_dbg_init();
  561. #endif // EQ_DBG_IN_UART
  562. }