system.c 28 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147
  1. #include "include.h"
  2. #if HLW_UI
  3. #include "hlw_func.h"
  4. #endif
  5. xcfg_cb_t xcfg_cb;
  6. sys_cb_t sys_cb AT(.buf.bsp.sys_cb);
  7. volatile int micl2gnd_flag;
  8. volatile u32 ticks_50ms;
  9. uint8_t cfg_spiflash_speed_up_en = FLASH_SPEED_UP_EN; //SPI FLASH提速。部份FLASH不支持提速
  10. uint8_t cfg_pmu_vddio_lp_enable = SYS_VDDIO_LP_EN;
  11. void sd_detect(void);
  12. void tbox_uart_isr(void);
  13. void testbox_init(void);
  14. bool exspiflash_init(void);
  15. void ledseg_6c6s_clr(void);
  16. u8 getcfg_buck_mode_en(void);
  17. #if BT_PWRKEY_5S_DISCOVER_EN
  18. AT(.com_text.detect)
  19. void pwrkey_5s_on_check(void)
  20. {
  21. if (!xcfg_cb.bt_pwrkey_nsec_discover) {
  22. return;
  23. }
  24. if (sys_cb.pwrkey_5s_check) {
  25. if (PWRKEY_IS_PRESS() || TKEY_IS_PRESS()) {
  26. if (tick_check_expire(sys_cb.ms_ticks, 1000 * xcfg_cb.bt_pwrkey_nsec_discover)) {
  27. sys_cb.pwrkey_5s_flag = 1;
  28. sys_cb.pwrkey_5s_check = 0;
  29. }
  30. } else {
  31. sys_cb.pwrkey_5s_check = 0;
  32. }
  33. }
  34. }
  35. #endif // BT_PWRKEY_5S_DISCOVER_EN
  36. #if PWRKEY_2_HW_PWRON
  37. //软开机模拟硬开关,松开PWRKEY就关机。
  38. AT(.com_text.detect)
  39. void pwrkey_2_hw_pwroff_detect(void)
  40. {
  41. static int off_cnt = 0;
  42. if (!PWRKEY_2_HW_PWRON) {
  43. return;
  44. }
  45. if (PWRKEY_IS_PRESS()) {
  46. off_cnt = 0;
  47. } else {
  48. if (off_cnt < 10) {
  49. off_cnt++;
  50. } else if (off_cnt == 10) {
  51. //pwrkey已松开,需要关机
  52. off_cnt = 20;
  53. sys_cb.pwrdwn_hw_flag = 1;
  54. sys_cb.poweron_flag = 0;
  55. }
  56. }
  57. }
  58. #endif // PWRKEY_2_HW_PWRON
  59. #if USER_NTC
  60. AT(.com_text.ntc)
  61. u8 sys_ntc_check(void)
  62. {
  63. if (!xcfg_cb.ntc_en) {
  64. return 0;
  65. }
  66. #if HLW_UI
  67. hlw_func_ntc_handle_process();
  68. #else
  69. static int n_cnt = 0;
  70. if (xcfg_cb.ntc_en) {
  71. if (saradc_get_value8(ADCCH_NTC) <= xcfg_cb.ntc_thd_val) {
  72. if (n_cnt >= 20) {
  73. sys_cb.ntc_2_pwrdwn_flag = 1;
  74. return 1;
  75. } else {
  76. n_cnt++;
  77. }
  78. } else {
  79. n_cnt = 0;
  80. }
  81. }
  82. #endif
  83. return 0;
  84. }
  85. #endif
  86. //timer tick interrupt(1ms)
  87. AT(.com_text.timer)
  88. void usr_tmr1ms_isr(void)
  89. {
  90. #if (GUI_SELECT & DISPLAY_LEDSEG)
  91. gui_scan(); //7P屏按COM扫描时,1ms间隔
  92. #endif
  93. #if LED_DISP_EN
  94. port_2led_scan();
  95. #endif // LED_DISP_EN
  96. plugin_tmr1ms_isr();
  97. #if USER_KEY_KNOB2_EN
  98. bsp_key_scan();
  99. #endif
  100. led_scan();
  101. }
  102. //timer tick interrupt(5ms)
  103. AT(.com_text.timer)
  104. void usr_tmr5ms_thread(void)
  105. {
  106. tmr5ms_cnt++;
  107. //5ms timer process
  108. dac_fade_process();
  109. #if !USER_KEY_KNOB2_EN
  110. bsp_key_scan();
  111. #endif
  112. #if PWRKEY_2_HW_PWRON
  113. pwrkey_2_hw_pwroff_detect();
  114. #endif
  115. #if (CHARGE_BOX_TYPE == CBOX_SSW)
  116. charge_box_heart_beat_ack();
  117. #endif
  118. plugin_tmr5ms_isr();
  119. #if MUSIC_SDCARD_EN
  120. sd_detect();
  121. #endif // MUSIC_SDCARD_EN
  122. #if USER_NTC
  123. #if !HLW_UI
  124. sys_ntc_check();
  125. #endif
  126. #endif
  127. #if USB_SUPPORT_EN
  128. usb_detect();
  129. #endif // USB_SUPPORT_EN
  130. #if LINEIN_DETECT_EN
  131. linein_detect();
  132. #endif // LINEIN_DETECT_EN
  133. #if USER_INEAR_DETECT_EN
  134. earin_detect();
  135. #endif
  136. #if WARNING_WSBC_EN
  137. warning_dec_check_kick();
  138. #endif
  139. //20ms timer process
  140. if ((tmr5ms_cnt % 4) == 0) {
  141. #if CHARGE_EN
  142. if (xcfg_cb.charge_en) {
  143. ///入仓自动主从切换
  144. if (CHARGE_DC_IN()) {
  145. if (sys_cb.dc_in_filter < CHARGE_DC_IN_FILTER) {
  146. sys_cb.dc_in_filter++;
  147. }
  148. } else {
  149. sys_cb.dc_in_filter = 0;
  150. }
  151. }
  152. #endif
  153. }
  154. //50ms timer process
  155. if ((tmr5ms_cnt % 10) == 0) {
  156. ticks_50ms++;
  157. #if BT_PWRKEY_5S_DISCOVER_EN
  158. pwrkey_5s_on_check();
  159. #endif // BT_PWRKEY_5S_DISCOVER_EN
  160. #if HLW_UI
  161. hlw_func_anc_led_handle();
  162. #endif // HLW_UI
  163. }
  164. //100ms timer process
  165. if ((tmr5ms_cnt % 20) == 0) {
  166. lowpwr_tout_ticks();
  167. #if UDE_HID_EN
  168. if (func_cb.sta == FUNC_USBDEV) {
  169. ude_tmr_isr();
  170. }
  171. #endif // UDE_HID_EN
  172. gui_box_isr(); //显示控件计数处理
  173. if (sys_cb.lpwr_cnt > 0) {
  174. sys_cb.lpwr_cnt++;
  175. }
  176. #if HLW_UI
  177. hlw_bt_disconnect_count_process();
  178. hlw_bt_reconnect_fail_process();
  179. #endif
  180. #if USER_NTC
  181. #if HLW_UI
  182. sys_ntc_check();
  183. #endif
  184. #endif
  185. if (sys_cb.key2unmute_cnt) {
  186. sys_cb.key2unmute_cnt--;
  187. if (!sys_cb.key2unmute_cnt) {
  188. msg_enqueue(EVT_KEY_2_UNMUTE);
  189. }
  190. }
  191. dac_fifo_detect();
  192. }
  193. //500ms timer process
  194. if ((tmr5ms_cnt % 100) == 0) {
  195. sys_cb.cm_times++;
  196. #if FUNC_CLOCK_EN
  197. msg_enqueue(MSG_SYS_500MS);
  198. #endif // FUNC_CLOCK_EN
  199. #if HLW_UI
  200. hlw_func_poweron_first_battery_process();
  201. #endif
  202. }
  203. //1s timer process
  204. if ((tmr5ms_cnt % 200) == 0) {
  205. msg_enqueue(MSG_SYS_1S);
  206. #if HLW_UI
  207. hlw_func_low_bat_count_handle();
  208. hlw_func_qian30s_count_handle();
  209. #else
  210. sys_cb.lpwr_warning_cnt++;
  211. #endif // HLW_UI
  212. #if HLW_UI
  213. hlw_func_battery_process();
  214. #endif
  215. }
  216. //10s timer process
  217. if ((tmr5ms_cnt % 6000) == 0) {
  218. msg_enqueue(EVT_MSG_SYS_30S);
  219. tmr5ms_cnt = 0;
  220. }
  221. }
  222. uint bsp_get_bat_level(void)
  223. {
  224. #if VBAT_DETECT_EN
  225. //计算方法:level = (实测电压 - 关机电压) / ((满电电压 - 关机电压) / 100)
  226. u16 bat_off = LPWR_OFF_VBAT * 100 + 2700;
  227. if (bat_off > sys_cb.vbat) {
  228. return 0;
  229. }
  230. uint bat_level = (sys_cb.vbat - bat_off) / ((4200 - bat_off) / 100);
  231. //printf("bat level: %d %d\n", sys_cb.vbat, bat_level);
  232. if (bat_level > 100) {
  233. bat_level = 100;
  234. }
  235. return bat_level;
  236. #else
  237. return 100;
  238. #endif
  239. }
  240. AT(.text.bsp.sys.init)
  241. static void rtc_32k_configure(void)
  242. {
  243. u32 temp = RTCCON0;
  244. // //xosc_div768_rtc
  245. // temp &= ~BIT(6);
  246. // temp |= BIT(9) | BIT(8); //sel xosc_div768_rtc
  247. // RTCCON0 = temp;
  248. // RTCCON4 |= BIT(17); //xosc24m low power clk enable
  249. // RTCCON2 = 31249;
  250. //clk2m_rtc_div32
  251. temp &= ~BIT(6);
  252. temp &= ~(BIT(9) | BIT(8));
  253. temp |= BIT(8);
  254. temp |= BIT(2) | BIT(0);
  255. RTCCON0 = temp;
  256. RTCCON2 = sys_get_rc2m_rtc_clk() / 32 - 1;
  257. }
  258. AT(.text.bsp.sys.init)
  259. bool rtc_init(void)
  260. {
  261. u32 temp;
  262. rtc_32k_configure();
  263. sys_cb.rtc_first_pwron = 0;
  264. temp = RTCCON0;
  265. if (temp & BIT(7)) {
  266. temp &= ~BIT(7); //clear first poweron flag
  267. RTCCON0 = temp;
  268. sys_cb.rtc_first_pwron = 1;
  269. #if FUNC_CLOCK_EN
  270. rtc_clock_init();
  271. #endif // FUNC_CLOCK_EN
  272. printf("rtc 1st pwrup\n");
  273. return false;
  274. }
  275. return true;
  276. }
  277. //UART0打印信息输出GPIO选择,UART0默认G1(PA7)
  278. void uart0_mapping_sel(void)
  279. {
  280. //等待uart0发送完成
  281. if(UART0CON & BIT(0)) {
  282. while (!(UART0CON & BIT(8)));
  283. }
  284. GPIOEDE &= ~BIT(13);
  285. GPIOEPU &= ~BIT(13);
  286. GPIOBPU &= ~(BIT(2) | BIT(3));
  287. FUNCMCON0 = (0xf << 12) | (0xf << 8); //clear uart0 mapping
  288. #if (UART0_PRINTF_SEL == PRINTF_PA7)
  289. GPIOADE |= BIT(7);
  290. GPIOAPU |= BIT(7);
  291. GPIOADIR |= BIT(7);
  292. GPIOAFEN |= BIT(7);
  293. GPIOADRV |= BIT(7);
  294. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PA7; //RX0 Map To TX0, TX0 Map to G1
  295. #elif (UART0_PRINTF_SEL == PRINTF_PB2)
  296. GPIOBDE |= BIT(2);
  297. GPIOBPU |= BIT(2);
  298. GPIOBDIR |= BIT(2);
  299. GPIOBFEN |= BIT(2);
  300. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PB2; //RX0 Map To TX0, TX0 Map to G2
  301. #elif (UART0_PRINTF_SEL == PRINTF_PB3)
  302. GPIOBDE |= BIT(3);
  303. GPIOBPU |= BIT(3);
  304. GPIOBDIR |= BIT(3);
  305. GPIOBFEN |= BIT(3);
  306. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PB3; //RX0 Map To TX0, TX0 Map to G3
  307. #elif (UART0_PRINTF_SEL == PRINTF_PE7)
  308. GPIOEDE |= BIT(7);
  309. GPIOEPU |= BIT(7);
  310. GPIOEDIR |= BIT(7);
  311. GPIOEFEN |= BIT(7);
  312. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PE7; //RX0 Map To TX0, TX0 Map to G4
  313. #elif (UART0_PRINTF_SEL == PRINTF_PE0)
  314. GPIOEDE |= BIT(0);
  315. GPIOEPU |= BIT(0);
  316. GPIOEDIR |= BIT(0);
  317. GPIOEFEN |= BIT(0);
  318. FUNCMCON0 = URX0MAP_TX | UTX0MAP_PE0; //RX0 Map To TX0, TX0 Map to G5
  319. #elif (UART0_PRINTF_SEL == PRINTF_VUSB)
  320. FUNCMCON0 = URX0MAP_TX | UTX0MAP_VUSB; //RX0 Map To TX0, TX0 Map to G8
  321. #endif
  322. }
  323. //开user timer前初始化的内容
  324. AT(.text.bsp.sys.init)
  325. static void sys_var_init(void)
  326. {
  327. u32 rst_reason = sys_cb.rst_reason;
  328. memset(&sys_cb, 0, sizeof(sys_cb));
  329. sys_cb.rst_reason = rst_reason;
  330. sys_cb.loudspeaker_mute = 1;
  331. sys_cb.ms_ticks = tick_get();
  332. sys_cb.pwrkey_5s_check = 1;
  333. xcfg_cb.vol_max = (xcfg_cb.vol_max) ? 32 : 16;
  334. sys_cb.hfp2sys_mul = (xcfg_cb.vol_max + 2) / 16;
  335. if (SYS_INIT_VOLUME > xcfg_cb.vol_max) {
  336. SYS_INIT_VOLUME = xcfg_cb.vol_max;
  337. }
  338. if (WARNING_VOLUME > xcfg_cb.vol_max) {
  339. WARNING_VOLUME = xcfg_cb.vol_max;
  340. }
  341. sys_cb.sleep_time = -1L;
  342. sys_cb.pwroff_time = -1L;
  343. if (xcfg_cb.sys_sleep_time != 0) {
  344. sys_cb.sleep_time = (u32)xcfg_cb.sys_sleep_time * 10; //100ms为单位
  345. }
  346. if (xcfg_cb.sys_off_time != 0) {
  347. sys_cb.pwroff_time = (u32)xcfg_cb.sys_off_time * 10; //100ms为单位
  348. }
  349. sys_cb.sleep_delay = -1L;
  350. sys_cb.pwroff_delay = -1L;
  351. sys_cb.sleep_en = 0;
  352. sys_cb.lpwr_warning_times = LPWR_WARING_TIMES;
  353. sys_cb.led_scan_en = 1;
  354. if(xcfg_cb.osci_cap == 0 && xcfg_cb.osco_cap == 0) { //没有过产测时,使用自定义OSC电容
  355. xcfg_cb.osci_cap = xcfg_cb.uosci_cap;
  356. xcfg_cb.osco_cap = xcfg_cb.uosco_cap;
  357. }
  358. if(xcfg_cb.ft_rf_param_en == 0 && xcfg_cb.bt_rf_param_en) { //使用自定义参数时,不需要微调
  359. xcfg_cb.bt_rf_pwrdec = 0;
  360. }
  361. #if HLW_UI
  362. hlw_func_var_init();
  363. #endif
  364. saradc_var_init();
  365. key_var_init();
  366. plugin_var_init();
  367. msg_queue_init();
  368. bsp_res_init();
  369. dev_init(((u8)is_sd_support()) | ((u8)is_usb_support() * 0x02));
  370. #if SD_SOFT_DETECT_EN
  371. if (SD_IS_SOFT_DETECT()) {
  372. dev_delay_times(DEV_SDCARD, 3);
  373. }
  374. #endif
  375. #if MUSIC_SDCARD_EN
  376. if((xcfg_cb.sddet_iosel == IO_MUX_SDCLK) || (xcfg_cb.sddet_iosel == IO_MUX_SDCMD)) {
  377. dev_delay_offline_times(DEV_SDCARD, 3); //复用时, 加快拔出检测. 这里拔出检测为3次.
  378. }
  379. #endif
  380. sdadc_var_init();
  381. #if SDADC_5CH_EN
  382. sdadc_set_5ch_en();
  383. #endif
  384. #if (MUSIC_UDISK_EN || MUSIC_SDCARD_EN)
  385. fs_var_init();
  386. #endif
  387. music_stream_var_init();
  388. msc_pcm_out_var_init();
  389. dac_cb_init((DAC_CH_SEL & 0x0f) | (0x200 * DAC_FAST_SETUP_EN) | (0x400 * DAC_VCM_CAPLESS_EN) \
  390. | (0x800 * DAC_MAXOUT_EN));
  391. #if ANC_EN
  392. anc_var_init();
  393. #endif
  394. }
  395. AT(.text.bsp.sys.init)
  396. static void sys_io_init(void)
  397. {
  398. //全部设置成模拟GPIO,防止漏电。使用时,自行配置对应数字GPIO
  399. GPIOADE = 0;
  400. GPIOBDE = 0;
  401. GPIOEDE = 0;
  402. GPIOFDE = 0;
  403. GPIOGDE = 0x3F; //MCP FLASH
  404. uart0_mapping_sel(); //调试UART IO选择或关闭
  405. #if !USB_BC_EN
  406. usb_bc_init(1);
  407. #endif
  408. #if LINEIN_DETECT_EN
  409. LINEIN_DETECT_INIT();
  410. #endif // LINEIN_DETECT_EN
  411. #if MUSIC_SDCARD_EN
  412. SD_DETECT_INIT();
  413. #endif // MUSIC_SDCARD_EN
  414. LOUDSPEAKER_MUTE_INIT();
  415. #if USER_INEAR_DET_OPT
  416. INEAR_OPT_PORT_INIT()
  417. #endif
  418. #if HLW_UI
  419. sys_pe4_power_gate_set(1);
  420. #endif
  421. }
  422. void xosc_get_cfg_cap(u8 *osci_cap, u8 *osco_cap, u8 *both_cap)
  423. {
  424. *osci_cap = xcfg_cb.osci_cap;
  425. *osco_cap = xcfg_cb.osco_cap;
  426. *both_cap = xcfg_cb.osc_both_cap;
  427. }
  428. #if 0 //port_int_example
  429. AT(.com_text)
  430. const char strisr0[] = ">>[0x%X]_[0x%X]\n";
  431. const char strisr1[] = "portisr->";
  432. AT(.com_text.timer)
  433. void port_isr(void)
  434. {
  435. printf(strisr0,WKUPEDG,WKUPCPND);
  436. if (WKUPEDG & (BIT(6) << 16)) {
  437. WKUPCPND = (BIT(6) << 16); //CLEAR PENDING
  438. printf(strisr1);
  439. }
  440. }
  441. void port_int_example(void) //sys_set_tmr_enable(1, 1); 前调用 测试OK
  442. {
  443. GPIOFDE |= BIT(0); GPIOFDIR |= BIT(0); GPIOFFEN &= ~BIT(0);
  444. GPIOFPU |= BIT(0);
  445. sys_irq_init(IRQ_PORT_VECTOR,0, port_isr);
  446. PORTINTEN |= BIT(21);
  447. PORTINTEDG |= BIT(21); //falling edge;
  448. WKUPEDG |= BIT(6); //falling edge
  449. WKUPCON = BIT(6) | BIT(16); //falling edge wake iput //wakeup int en
  450. printf("PORTINTEN = 0x%X, PORTINTEDG = 0x%X WKUPEDG = 0x%X, WKUPCON = 0x%X\n", PORTINTEN, PORTINTEDG, WKUPEDG, WKUPCON);
  451. WDT_CLR();
  452. while(1) {
  453. // printf("WKUPEDG = 0x%X\n", WKUPEDG);
  454. // printf("GPIOF = 0x%X\n", GPIOF);
  455. // delay_ms(500);
  456. }
  457. }
  458. #endif
  459. AT(.text.bsp.power)
  460. bool power_off_check(void)
  461. {
  462. #if CHARGE_EN
  463. u16 charge_cnt = 0;
  464. #endif
  465. u32 pwron_press_nms;
  466. int pwrkey_pressed_flag, ticks = 0, up_cnt = 0;
  467. u8 restart_chk_en = 1;
  468. pwrkey_pressed_flag = 0;
  469. pwron_press_nms = PWRON_PRESS_TIME;
  470. if (pwron_press_nms == 0) {
  471. pwron_press_nms = 15; //bootloader 80ms + 15ms, 最小开机时间在100ms左右
  472. }
  473. //要等PWRKEY开关释放后再次按下才能重新开机, 否则充电过程中5分钟关机, 低电关机等异常
  474. if ((PWRKEY_2_HW_PWRON) && (sys_cb.poweron_flag)) {
  475. restart_chk_en = 0;
  476. sys_cb.poweron_flag = 0;
  477. }
  478. while (1) {
  479. WDT_CLR();
  480. delay_ms(5);
  481. if ((bsp_key_pwr_scan() & K_PWR_MASK) == K_PWR) {
  482. up_cnt = 0;
  483. if (restart_chk_en) {
  484. if (!pwrkey_pressed_flag) {
  485. ticks = tick_get();
  486. pwrkey_pressed_flag = 1;
  487. sys_cb.ms_ticks = tick_get(); //记录PWRKEY按键按下的时刻
  488. sys_cb.pwrkey_5s_check = 1;
  489. }
  490. if (!sys_cb.poweron_flag) {
  491. if (tick_check_expire(ticks, pwron_press_nms)) { //长按开机时间配置
  492. sys_cb.poweron_flag = 1;
  493. sys_cb.pwrdwn_hw_flag = 0; //清PWRKEY硬开关的关机标志
  494. }
  495. }
  496. }
  497. } else {
  498. if (up_cnt < 3) {
  499. up_cnt++;
  500. }
  501. if (up_cnt == 3) {
  502. up_cnt = 10;
  503. sys_cb.poweron_flag = 0;
  504. pwrkey_pressed_flag = 0;
  505. restart_chk_en = 1;
  506. }
  507. }
  508. #if CHARGE_EN
  509. if (xcfg_cb.charge_en) {
  510. charge_cnt++;
  511. if (charge_cnt > 20) {
  512. charge_cnt = 0;
  513. charge_detect(0);
  514. }
  515. }
  516. #endif // CHARGE_EN
  517. if (sys_cb.poweron_flag) {
  518. if ((CHARGE_DC_NOT_PWRON) && CHARGE_DC_IN()) {
  519. continue;
  520. }
  521. #if LINEIN_2_PWRDOWN_EN
  522. if (dev_is_online(DEV_LINEIN)) {
  523. continue;
  524. }
  525. #endif // LINEIN_2_PWRDOWN_EN
  526. //长按PP/POWER开机
  527. gui_display(DISP_POWERON);
  528. led_power_up();
  529. dac_restart();
  530. bsp_change_volume(sys_cb.vol);
  531. #if WARNING_POWER_ON
  532. #if WARNING_WSBC_EN
  533. wsbc_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  534. #else
  535. mp3_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  536. #endif
  537. #endif // WARNING_POWER_ON
  538. if (PWRON_ENTER_BTMODE_EN) {
  539. func_cb.sta = FUNC_BT;
  540. if (dev_is_online(DEV_UDISK)) {
  541. sys_cb.cur_dev = DEV_UDISK;
  542. } else {
  543. sys_cb.cur_dev = DEV_SDCARD;
  544. }
  545. } else {
  546. if (dev_is_online(DEV_SDCARD) || dev_is_online(DEV_UDISK) || dev_is_online(DEV_SDCARD1)) {
  547. func_cb.sta = FUNC_MUSIC;
  548. if (dev_is_online(DEV_UDISK)) {
  549. sys_cb.cur_dev = DEV_UDISK;
  550. } else if (dev_is_online(DEV_SDCARD1)) {
  551. sys_cb.cur_dev = DEV_SDCARD1;
  552. } else {
  553. sys_cb.cur_dev = DEV_SDCARD;
  554. }
  555. } else {
  556. #if FUNC_BT_EN
  557. func_cb.sta = FUNC_BT;
  558. #elif FUNC_CLOCK_EN
  559. func_cb.sta = FUNC_CLOCK;
  560. #else
  561. func_cb.sta = FUNC_IDLE;
  562. #endif
  563. }
  564. }
  565. return true;
  566. } else {
  567. if (CHARGE_DC_IN()) {
  568. continue;
  569. } else {
  570. return false;
  571. }
  572. }
  573. }
  574. }
  575. AT(.text.bsp.power)
  576. static bool power_on_frist_enable(u32 rtccon9)
  577. {
  578. if (!PWRON_FRIST_BAT_EN) {
  579. return false;
  580. }
  581. if (rtccon9 & BIT(4)) { //charge inbox wakeup
  582. return false;
  583. }
  584. if (rtccon9 & BIT(2)) { //WKO wakeup不能直接开机
  585. return false;
  586. }
  587. if (rtccon9 & BIT(6)) { //TK Wakeup pending
  588. return false;
  589. }
  590. if (CHARGE_DC_IN() && (CHARGE_DC_NOT_PWRON) && (xcfg_cb.charge_en)) { //VUSB充电禁止开机
  591. return false;
  592. }
  593. return true;
  594. }
  595. static bool power_on_check_do_pre(u32 rtccon9)
  596. {
  597. bool ret = false;
  598. //第一次上电是否直接开机
  599. if (power_on_frist_enable(rtccon9)) {
  600. ret = true;
  601. }
  602. if(sys_cb.sw_rst_flag == SW_RST_FLAG){
  603. ret = true;
  604. }
  605. #if HLW_UI
  606. else if(sys_cb.sw_rst_flag == SW_RST_CLEAR_PAIRLIST){
  607. hlw_cb.clear_pairlist_flag = true;
  608. ret = true;
  609. }
  610. #endif // HLW_UI
  611. if (sys_cb.rst_reason & BIT(19)) { //is wko 10s reset pending
  612. if (PWRKEY_IS_PRESS()) {
  613. sys_cb.poweron_flag = 1;
  614. }
  615. ret = true; //长按PWRKEY 10S复位后直接开机。
  616. }
  617. #if QTEST_EN
  618. if(qtest_get_mode()){
  619. ret = true;
  620. }
  621. #endif
  622. #if IODM_TEST_EN
  623. if (cm_read8(PARAM_RST_FLAG) == RST_FLAG_MAGIC_VALUE) {
  624. cm_write8(PARAM_RST_FLAG, 0);
  625. cm_sync();
  626. printf("iodm rst power_on\n");
  627. ret = true;
  628. }
  629. #endif
  630. #if USER_PWRKEY
  631. if ((!xcfg_cb.user_pwrkey_en) && (!PWRKEY_2_HW_PWRON) && (!sys_cb.tkey_pwrdwn_en)) {
  632. ret = true;
  633. }
  634. #endif
  635. return ret;
  636. }
  637. AT(.text.bsp.power)
  638. static void power_on_check_do(void)
  639. {
  640. int pwrkey_pressed_flag = 0;
  641. int up_cnt = 0, ticks = 0;
  642. u32 pwron_press_nms;
  643. u8 chbox_sta = 1; //默认offline
  644. u32 rtccon9 = RTCCON9; //wakeup pending
  645. printf("power_on_check_do: %08x\n", rtccon9);
  646. RTCCON9 = 0xffff; //Clr pending
  647. RTCCON10 = BIT(10) | BIT(1) | BIT(0); //Clr pending
  648. CRSTPND = 0x1ff0000; //clear reset pending
  649. LVDCON &= ~(0x1f << 8); //clear software reset
  650. RTCCON13 &= ~BIT(16); //wko pin0 low level wakeup
  651. #if HLW_UI
  652. if((rtccon9 & 0x08) == 0x08)
  653. {
  654. printf("charge poweron\n");
  655. hlw_cb.charge_poweron_flag = true;
  656. }
  657. #endif
  658. if (power_on_check_do_pre(rtccon9)) {
  659. return;
  660. }
  661. #if CHARGE_EN
  662. if (charge_power_on_pre(rtccon9)) {
  663. return;
  664. }
  665. #endif
  666. #if USER_PWRKEY
  667. if (PWRKEY_IS_PRESS() || TKEY_IS_PRESS()) { //PWRKEY是否按下
  668. pwrkey_pressed_flag = 1;
  669. ticks = sys_cb.ms_ticks;
  670. }
  671. #endif // USER_PWRKEY
  672. pwron_press_nms = PWRON_PRESS_TIME;
  673. if (pwron_press_nms == 0) {
  674. pwron_press_nms = 15; //最小开机时间在100ms左右
  675. }
  676. while (1) {
  677. WDT_CLR();
  678. #if CHARGE_LOW_POWER_EN
  679. delay_us(350);
  680. #else
  681. delay_5ms(1);
  682. #endif
  683. bsp_key_scan_do();
  684. if ((bsp_key_pwr_scan() & K_PWR_MASK) == K_PWR) {
  685. up_cnt = 0;
  686. if (!pwrkey_pressed_flag) {
  687. ticks = tick_get();
  688. sys_cb.ms_ticks = ticks; //记录PWRKEY按键按下的时刻
  689. pwrkey_pressed_flag = 1;
  690. }
  691. if (!sys_cb.poweron_flag) {
  692. if (tick_check_expire(ticks, pwron_press_nms)) { //长按开机时间配置
  693. sys_cb.poweron_flag = 1;
  694. }
  695. }
  696. } else {
  697. if (up_cnt < 3) {
  698. up_cnt++;
  699. }
  700. if (up_cnt == 3) {
  701. up_cnt = 10;
  702. pwrkey_pressed_flag = 0;
  703. sys_cb.poweron_flag = 0;
  704. }
  705. }
  706. #if LINEIN_2_PWRDOWN_EN
  707. linein_detect();
  708. #endif // LINEIN_2_PWRDOWN_EN
  709. #if CHARGE_EN
  710. if (xcfg_cb.charge_en) {
  711. chbox_sta = charge_charge_on_process();
  712. if (chbox_sta == 2) {
  713. #if !HLW_UI
  714. break; //充电仓拿起开机
  715. #endif // HLW_UI
  716. }
  717. }
  718. #endif // CHARGE_EN
  719. if (sys_cb.poweron_flag) {
  720. #if VBAT_DETECT_EN
  721. if (sys_cb.vbat <= 2950) { //电压小于2.95v不开机
  722. continue;
  723. }
  724. #endif
  725. if ((CHARGE_DC_NOT_PWRON) && CHARGE_DC_IN()) {
  726. continue;
  727. }
  728. #if LINEIN_2_PWRDOWN_EN
  729. if (dev_is_online(DEV_LINEIN)) {
  730. continue;
  731. }
  732. #endif // LINEIN_2_PWRDOWN_EN
  733. break;
  734. } else {
  735. //PWKKEY已松开, 不在充电仓或未充电直接进行关机
  736. #if HLW_UI
  737. if((!pwrkey_pressed_flag)){
  738. #else
  739. if ((!pwrkey_pressed_flag) && (chbox_sta)) {
  740. #endif // HLW_UI
  741. if ((!SOFT_POWER_ON_OFF) || ((!sys_cb.wko_pwrkey_en) && (!USER_TKEY_SOFT_PWR_EN))) {
  742. break; //没有按键软开关机功能,不在充电状态直接开机
  743. }
  744. #if HLW_UI
  745. if(hlw_cb.charge_poweron_flag && CHARGE_DC_IN())
  746. {
  747. break;
  748. }
  749. #endif
  750. #if CHARGE_EN
  751. charge_exit();
  752. #endif
  753. unlock_code_charge();
  754. bsp_saradc_exit();
  755. sfunc_pwrdown(1);
  756. }
  757. }
  758. }
  759. #if CHARGE_EN
  760. charge_exit();
  761. #endif
  762. }
  763. AT(.text.bsp.power)
  764. void power_on_check(void)
  765. {
  766. lock_code_charge();
  767. power_on_check_do();
  768. #if CHARGE_BOX_EN
  769. charge_box_reinit();
  770. #endif
  771. unlock_code_charge();
  772. }
  773. AT(.text.bsp.sys.init)
  774. void sys_init(void)
  775. {
  776. /// config
  777. if (!xcfg_init(&xcfg_cb, sizeof(xcfg_cb))) { //获取配置参数
  778. printf("xcfg init error\n");
  779. WDT_RST();
  780. while(1);
  781. }
  782. // io init
  783. sys_io_init();
  784. // var init
  785. sys_var_init();
  786. // power init
  787. pmu_init(getcfg_buck_mode_en());
  788. //audio pll init
  789. adpll_init(DAC_OUT_SPR);
  790. // clock init
  791. sys_clk_set(SYS_CLK_SEL);
  792. // peripheral init
  793. rtc_init();
  794. param_init(sys_cb.rtc_first_pwron);
  795. //晶振配置
  796. xosc_init();
  797. plugin_init();
  798. if (POWKEY_10S_RESET) {
  799. WKO_10SRST_EN(0); //10s reset source select 0: wko pin press, 1: touch key press
  800. } else {
  801. WKO_10SRST_DIS();
  802. }
  803. led_init();
  804. #if CHARGE_EN
  805. if (xcfg_cb.charge_en) {
  806. charge_init();
  807. }
  808. #endif
  809. key_init();
  810. #if QTEST_EN
  811. if(QTEST_IS_ENABLE()) {
  812. qtest_init();
  813. }
  814. #endif
  815. #if HUART_EN
  816. if(xcfg_cb.huart_en){
  817. bsp_huart_init();
  818. }
  819. #endif // HUART_EN
  820. #if UART1_EN
  821. if (xcfg_cb.uart1_en) {
  822. bsp_uart1_init(9600);
  823. }
  824. #elif UART2_EN
  825. if (xcfg_cb.uart2_en) {
  826. bsp_uart2_init(9600);
  827. }
  828. #endif
  829. bt_init();
  830. power_on_check(); //在key_init之后
  831. gui_init();
  832. #if PWM_RGB_EN
  833. pwm_init();
  834. #endif // PWM_RGB_EN
  835. gsensor_init();
  836. en_auto_pwroff();
  837. /// enable user timer for display & dac
  838. sys_set_tmr_enable(1, 1);
  839. #if !HLW_UI
  840. led_power_up();
  841. #endif
  842. gui_display(DISP_POWERON);
  843. #if ANC_EQ_RES2_EN
  844. copy_res2flash();
  845. #endif
  846. if (bsp_dac_off_for_bt_conn()) {
  847. dac_init();
  848. func_bt_init();
  849. } else {
  850. func_bt_init();
  851. dac_init();
  852. }
  853. codecs_pcm_init();
  854. #if TINY_TRANSPARENCY_EN
  855. bsp_ttp_init();
  856. #endif
  857. app_init_do();
  858. bsp_change_volume(sys_cb.vol);
  859. #if HLW_UI
  860. bt_get_local_bd_addr(hlw_cb.bt_addr);
  861. print_r(hlw_cb.bt_addr,6);
  862. hlw_cb.exist_pairlist_flag = bt_nor_get_link_info(NULL);
  863. #endif // HLW_UI
  864. #if WARNING_POWER_ON
  865. if ((xcfg_cb.bt_outbox_voice_pwron_en) || (!sys_cb.outbox_pwron_flag)) {
  866. #if HLW_UI
  867. //不是清除记录复位重启,不是插入5V开机,就播开机提示音
  868. if((!hlw_cb.charge_poweron_flag)&&(!hlw_cb.clear_pairlist_flag))
  869. {
  870. hlw_cb.poweron_led_control_flag = true;
  871. hlw_cb.poweron_voice_flag = true;
  872. hlw_cb.poweron_bat_voice_flag = true;
  873. led_power_up();
  874. #if WARNING_WSBC_EN
  875. wsbc_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  876. #else
  877. mp3_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  878. #endif
  879. }
  880. #else
  881. #if WARNING_WSBC_EN
  882. wsbc_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  883. #else
  884. mp3_res_play(RES_BUF_POWERON, RES_LEN_POWERON);
  885. #endif
  886. #endif
  887. }
  888. sys_cb.outbox_pwron_flag = 0;
  889. #endif // WARNING_POWER_ON
  890. if (PWRON_ENTER_BTMODE_EN) {
  891. func_cb.sta = FUNC_BT;
  892. if (dev_is_online(DEV_UDISK)) {
  893. sys_cb.cur_dev = DEV_UDISK;
  894. } else {
  895. sys_cb.cur_dev = DEV_SDCARD;
  896. }
  897. } else {
  898. #if SD_SOFT_DETECT_EN
  899. sd_soft_detect_poweron_check();
  900. #endif
  901. #if FUNC_MUSIC_EN
  902. if (dev_is_online(DEV_SDCARD) || dev_is_online(DEV_UDISK) || dev_is_online(DEV_SDCARD1)) {
  903. func_cb.sta = FUNC_MUSIC;
  904. if (dev_is_online(DEV_UDISK)) {
  905. sys_cb.cur_dev = DEV_UDISK;
  906. } else if (dev_is_online(DEV_SDCARD1)) {
  907. sys_cb.cur_dev = DEV_SDCARD1;
  908. } else {
  909. sys_cb.cur_dev = DEV_SDCARD;
  910. }
  911. } else
  912. #endif // FUNC_MUSIC_EN
  913. {
  914. #if FUNC_AUX_EN
  915. if (dev_is_online(DEV_LINEIN)) {
  916. func_cb.sta = FUNC_AUX;
  917. } else
  918. #endif // FUNC_AUX_EN
  919. {
  920. #if HLW_UI
  921. if(hlw_cb.charge_poweron_flag)
  922. {
  923. if(!CHARGE_DC_IN())
  924. {
  925. func_cb.sta = FUNC_PWROFF;
  926. }
  927. else
  928. {
  929. func_cb.sta = FUNC_CHARGE;
  930. }
  931. hlw_cb.charge_poweron_flag = false;
  932. }
  933. if(func_cb.sta == FUNC_CHARGE)
  934. {
  935. if(dev_is_online(DEV_USBPC))
  936. {
  937. func_cb.sta = FUNC_USBDEV;
  938. }
  939. }
  940. if((func_cb.sta != FUNC_CHARGE)&&(func_cb.sta != FUNC_PWROFF)&&(func_cb.sta != FUNC_USBDEV)
  941. &&(func_cb.sta != FUNC_BT_DUT)&&(func_cb.sta != FUNC_BT_FCC)&&(func_cb.sta != FUNC_BT_IODM))
  942. {
  943. func_cb.sta = FUNC_BT;
  944. }
  945. #else
  946. func_cb.sta = FUNC_BT;
  947. #endif
  948. }
  949. }
  950. }
  951. #if SYS_MODE_BREAKPOINT_EN
  952. u8 sta = param_sys_mode_read();
  953. if (sta != 0 && sta != 0xff) {
  954. func_cb.sta = sta & 0xf;
  955. if (func_cb.sta == FUNC_MUSIC) {
  956. sys_cb.cur_dev = sta >> 4;
  957. }
  958. }
  959. #endif // SYS_MODE_BREAKPOINT_EN
  960. #if LINEIN_2_PWRDOWN_EN
  961. if (dev_is_online(DEV_LINEIN)) {
  962. sys_cb.pwrdwn_tone_en = LINEIN_2_PWRDOWN_TONE_EN;
  963. func_cb.sta = FUNC_PWROFF;
  964. }
  965. #endif // LINEIN_2_PWRDOWN_EN
  966. #if BT_BACKSTAGE_EN
  967. bsp_bt_init();
  968. #endif
  969. #if EQ_DBG_IN_UART || EQ_DBG_IN_SPP
  970. eq_dbg_init();
  971. #endif // EQ_DBG_IN_UART
  972. #if PLUGIN_SYS_INIT_FINISH_CALLBACK
  973. plugin_sys_init_finish_callback(); //初始化完成, 各方案可能还有些不同参数需要初始化,预留接口到各方案
  974. #endif
  975. #if SYS_KARAOK_EN
  976. bsp_karaok_init(AUDIO_PATH_KARAOK, func_cb.sta);
  977. #endif
  978. #if BT_MUSIC_EFFECT_EN
  979. music_effect_init();
  980. #endif // BT_MUSIC_EFFECT_EN
  981. #if HLW_UI
  982. //把EQ放在音阶之后
  983. DACBQ0CON |= BIT(24);
  984. #endif // HLW_UI
  985. }
  986. AT(.text.bsp.sys.init)
  987. void sys_update_init(void)
  988. {
  989. /// config
  990. if (!xcfg_init(&xcfg_cb, sizeof(xcfg_cb))) { //获取配置参数
  991. printf("xcfg init error\n");
  992. }
  993. // io init
  994. sys_io_init();
  995. // var init
  996. sys_var_init();
  997. sys_cb.lang_id = 0;
  998. // power init
  999. pmu_init(getcfg_buck_mode_en());
  1000. // peripheral init
  1001. rtc_init();
  1002. param_init(sys_cb.rtc_first_pwron);
  1003. //晶振配置
  1004. xosc_init();
  1005. plugin_init();
  1006. sys_set_tmr_enable(1, 1);
  1007. adpll_init(DAC_OUT_SPR);
  1008. dac_init();
  1009. mp3_res_play(RES_BUF_UPDATE_DONE_MP3, RES_LEN_UPDATE_DONE_MP3);
  1010. }