system.c 28 KB

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