func_lowpwr.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. #include "include.h"
  2. #include "func.h"
  3. void user_tmr_set_enable(bool tmr5ms, bool tmr1ms);
  4. void bsp_set_stop_time(u16 stop_time);
  5. u8 power_off_check(void);
  6. uint32_t sleep_timer(void); //休眠定时器,500ms进一次(返回值: 1->关机 2->退出sleep)
  7. void sfunc_lowbat(void);
  8. void sfunc_pwrdown(u8 vusb_wakeup_en);
  9. void sfunc_power_save_enter(void);
  10. void delay_15us(void);
  11. bool led_bt_sleep_tws_sync(void);
  12. extern u32 __sleep_comm_vma, __sleep_comm_lma, __sleep_comm_size;
  13. extern u32 __pwrdwn_comm_vma, __pwrdwn_comm_lma, __pwrdwn_comm_size;
  14. #define RI_VRTC(bit) RTCCON4 = (RTCCON4 & ~(3<<24)) | ((bit)<<24)
  15. //休眠定时器,500ms进一次(返回值: 1->关机 2->退出sleep)
  16. AT(.text.sleep_com.timer)
  17. uint32_t sleep_timer(void)
  18. {
  19. uint32_t ret = 0;
  20. sys_cb.sleep_counter++;
  21. #if CHARGE_EN
  22. //定时检测charge状态
  23. if (xcfg_cb.charge_en) {
  24. charge_detect();
  25. if ((sys_cb.sleep_counter % 2) == 0) { //1秒调用一次
  26. bsp_charge_bled_ctrl();
  27. }
  28. if (!port_2led_is_sleep_en()) { //1个IO推两个灯, 充电状态需要退出休眠, 否则充电灯指示不正常
  29. ret = 2;
  30. }
  31. }
  32. #endif // CHARGE_EN
  33. #if VBAT_DETECT_EN || USER_NTC || CHARGE_TSEN_DETECT
  34. //定时检测电池电量, 低电需要唤醒
  35. if (sys_cb.sleep_counter == 10) {
  36. sys_cb.sleep_counter = 0;
  37. bsp_bcnt_temp_calibration();
  38. bsp_saradc_init(adc_cb.channel);
  39. if ((LPWR_WARNING_VBAT) && (sys_cb.vbat < ((u16)LPWR_WARNING_VBAT*100 + 2850))) {
  40. //低电需要唤醒sniff mode
  41. ret = 2;
  42. }
  43. #if USER_NTC
  44. if ((xcfg_cb.sys_ntc_en) && (adc_cb.ntc_val <= xcfg_cb.ntc_thd_val)) {
  45. ret = 2;
  46. }
  47. #endif
  48. #if CHARGE_TSEN_DETECT
  49. charge_tsen_check(1);
  50. #endif
  51. saradc_exit(adc_cb.channel);
  52. }
  53. #endif // VBAT_DETECT_EN
  54. #if BT_TWS_SLEEP_LED_SYNC_EN
  55. if (led_bt_sleep_tws_sync()) {
  56. sys_cb.sleep_wakeup_time = 50000 / 312;
  57. } else {
  58. sys_cb.sleep_wakeup_time = -1L;
  59. }
  60. #else
  61. sys_cb.sleep_wakeup_time = led_bt_sleep(xcfg_cb.led_bt_sleep_sel);
  62. #endif
  63. if ((sys_cb.pwroff_delay != -1L) && (sys_cb.sleep_wakeup_time == -1L)) {
  64. if(sys_cb.pwroff_delay > 5) {
  65. sys_cb.pwroff_delay -= 5;
  66. } else {
  67. sys_cb.pwroff_delay = 0;
  68. return 1;
  69. }
  70. }
  71. if ((PWRKEY_2_HW_PWRON) && (!IS_PWRKEY_PRESS())){
  72. ret = 1;
  73. }
  74. return ret;
  75. }
  76. AT(.text.lowpwr.sleep)
  77. static void sfunc_sleep_dac_off(u8 off)
  78. {
  79. #if ANC_EN
  80. if (sys_cb.anc_start) {
  81. return;
  82. }
  83. #endif
  84. if (off) {
  85. #if ANC_EN
  86. bsp_anc_stop();
  87. #endif
  88. #if TINY_TRANSPARENCY_EN
  89. bsp_ttp_stop();
  90. #endif
  91. dac_power_off(); //dac power down
  92. if(!SLEEP_DAC_OFF_EN) {
  93. dac_power_off_pulldown_daclr();
  94. }
  95. } else {
  96. if(!SLEEP_DAC_OFF_EN) {
  97. dac_power_off_restore_daclr();
  98. }
  99. dac_restart();
  100. #if ANC_EN || TINY_TRANSPARENCY_EN
  101. bsp_anc_set_mode(sys_cb.anc_user_mode);
  102. #endif
  103. }
  104. }
  105. #if USER_LED_SLEEP_EN
  106. void sys_sleep_cb(u8 lpclk_type)
  107. {
  108. u32 clkgat0 = CLKGAT0;
  109. u32 clkcon0 = CLKCON0;
  110. u32 clkcon2 = CLKCON2;
  111. u32 clkcon1 = CLKCON1;
  112. u32 xo26mcon = XO26MCON;
  113. RI_VIO_TC(0); //减小VDDIO尾电流, 减小功耗
  114. CLKCON2 = (CLKCON2&0x00ffffff) | (25<<24); //div26, x26m_div_clk=1m
  115. CLKCON0 |= BIT(2) | BIT(3); //select x26m_div_clk as sysclk
  116. asm("nop");asm("nop");
  117. if (!sys_cb.sleep_aupll_en) {
  118. RSTCON0 &= ~BIT(7); //reset adda_clk48_a
  119. CLKGAT0 &= ~(BIT(12) | BIT(22)); //disable dac_clk, sdadcl_clk gate
  120. CLKCON1 &= ~0x3; //disable dac clk
  121. }
  122. asm("nop");asm("nop");
  123. // CLKGAT0 &= ~BIT(20); //disable bt 52m clock
  124. XO26MCON &= ~BIT(5); //DI_EN_CCKOUT_X2
  125. asm("nop");asm("nop");
  126. // LPMCON |= BIT(2); //system sniff
  127. asm("nop");asm("nop");
  128. asm("nop");asm("nop");
  129. //wakeup now
  130. XO26MCON = xo26mcon;
  131. delay_15us();
  132. if (!sys_cb.sleep_aupll_en) {
  133. CLKCON1 = clkcon1; //recover dac clk
  134. delay_15us();
  135. CLKGAT0 |= (BIT(12) | BIT(22)); //enable dac_clk, sdadcl_clk gate
  136. delay_15us();
  137. RSTCON0 |= BIT(7); //release adda_clk48_a
  138. }
  139. asm("nop"); asm("nop");
  140. CLKGAT0 = clkgat0; //enable bt 52m clock
  141. CLKCON2 = clkcon2;
  142. CLKCON0 = clkcon0;
  143. RI_VIO_TC(3);
  144. }
  145. #endif // USER_LED_SLEEP_EN
  146. AT(.text.sleep_com.process)
  147. u32 sfunc_sleep_process(void)
  148. {
  149. uint32_t status, ret = 0;
  150. u32 wkupedg;
  151. bsp_gpiode_reinit_save(); //io analog input
  152. loudspeaker_gpiode_set(); //sleep维持mute脚状态
  153. atmosphere_led_gpiode_set(); //sleep维持氛围灯状态
  154. #if BT_EARIN_DETECT_EN
  155. earin_sniff_gpiode_set(); //sleep维持入耳检测IO状态
  156. #endif
  157. // if(xcfg_cb.bb_rxtx_sync_dbg_en) {
  158. // GPIOADE |= BIT(7) | BIT(6);
  159. // GPIOBDE |= BIT(4);
  160. // }
  161. #if USER_NTC
  162. if (xcfg_cb.sys_ntc_en) {
  163. adc_cb.channel |= BIT(NTC_ADCCH);
  164. ntc_gpio_inner_pu10k_init(); //sleep维持ntc检测
  165. }
  166. #endif
  167. #if CHARGE_TSEN_DETECT
  168. adc_cb.channel |= BIT(ADCCH_VTSEN); //sleep维持tsen检测
  169. #endif
  170. #if CHARGE_EN
  171. if (CHARGE_DC_IN()) { //保持充电灯的IO状态
  172. if (sys_cb.charge_sta == 1) {
  173. charge_led_on();
  174. } else if (sys_cb.charge_full_bled_flag == 1) {
  175. charge_bled_on();
  176. }
  177. }
  178. bsp_set_stop_time(3600);
  179. #endif // CHARGE_EN
  180. WKUPEDG = 0;
  181. WKUPCON = 0;
  182. PORTINTEDG = 0;
  183. PORTINTEN = 0;
  184. sys_cb.sleep_wakeup_time = -1L;
  185. sys_cb.sleep_counter = 0;
  186. sleep_wakeup_config();
  187. while(bt_is_sleep()) {
  188. WDT_CLR();
  189. status = bt_sleep_proc();
  190. if(status == 1) {
  191. ret = sleep_timer();
  192. if(ret) {
  193. if (ret == 1) {
  194. sys_cb.pwrdwn_tone_en = 1;
  195. func_cb.sta = FUNC_PWROFF;
  196. }
  197. break;
  198. }
  199. }
  200. // printf("WKUPEDG:%x\n", WKUPEDG);
  201. if (WKUPEDG & (0xff << 16)) {
  202. break;
  203. }
  204. #if BT_TWS_AUTO_SWITCH
  205. if((sys_cb.dc_rst_flag != 0) && CHARGE_DC_IN()) {
  206. break;
  207. }
  208. #endif // BT_TWS_AUTO_SWITCH
  209. if (bsp_chbox_type_is_maintain_volt() && CHARGE_INBOX()) {
  210. break;
  211. }
  212. #if USER_TKEY
  213. if (tkey_is_pressed()) {
  214. break;
  215. }
  216. #endif
  217. #if BT_EARIN_DETECT_EN
  218. if (earin_is_wakeup() || touchear_is_wakeup()) {
  219. break;
  220. }
  221. #endif
  222. }
  223. wkupedg = WKUPEDG;
  224. WKUPCPND = 0xff << 16;
  225. WKUPCON = 0;
  226. WDT_CLR();
  227. bsp_gpiode_recover();
  228. return wkupedg;
  229. }
  230. AT(.text.lowpwr.sleep)
  231. void sfunc_sleep(void)
  232. {
  233. uint32_t sysclk;
  234. u32 wkupedg;
  235. u16 adc_ch;
  236. #if VBAT_DETECT_EN
  237. if (is_lowpower_vbat_warning() || sys_cb.breathe_led_sta) { //低电或呼吸灯不进sniff mode
  238. return;
  239. }
  240. #endif // VBAT_DETECT_EN
  241. #if LOUDSPEAKER_MUTE_MUX_RLED_EN
  242. if (sys_cb1.unmute_rled_on) {
  243. return;
  244. }
  245. #endif
  246. printf("sleep\n");
  247. #if !USER_LED_SLEEP_EN
  248. bt_enter_sleep();
  249. led_off();
  250. rled_off();
  251. #endif
  252. #if DAC_DNR_EN
  253. u8 sta = dac_dnr_get_sta();
  254. dac_dnr_set_sta(0);
  255. #endif
  256. sfunc_sleep_dac_off(1);
  257. saradc_exit(adc_cb.channel); //close saradc及相关通路模拟
  258. #if !USER_LED_SLEEP_EN
  259. user_tmr_set_enable(0, 0);
  260. #endif
  261. sysclk = sys_clk_get();
  262. sys_clk_set(SYS_26M);
  263. bsp_bcnt_temp_calibration_start();
  264. if (!sys_cb.sleep_aupll_en) {
  265. adpll_disable();
  266. }
  267. adc_ch = adc_cb.channel;
  268. adc_cb.channel = BIT(ADCCH_VBAT) | BIT(ADCCH_BGOP);
  269. memcpy(&__sleep_comm_vma, &__sleep_comm_lma, (u32)&__sleep_comm_size); //Load sleep comm
  270. wkupedg = sfunc_sleep_process(); //不能切Flash
  271. if (!sys_cb.sleep_aupll_en) {
  272. adpll_init(DAC_OUT_SPR); //enable adpll
  273. }
  274. dac_clk_source_sel(1); //dac clk select adpll_div(PLL0)
  275. bsp_bcnt_temp_calibration_stop();
  276. adc_cb.channel = adc_ch;
  277. bsp_saradc_init(adc_cb.channel);
  278. if (wkupedg & BIT(16 + 5)) { //pwrkey wakeup, 加快第一次短按检测
  279. u16 key_val = get_pwrkey();
  280. if (key_val != NO_KEY) {
  281. bsp_key_process(key_val);
  282. key_cb.cnt = key_cb.filter.scan_cnt - 2;
  283. }
  284. }
  285. #if CHARGE_EN
  286. bsp_set_stop_time(18000);
  287. #endif // CHARGE_EN
  288. sys_clk_set(sysclk);
  289. user_tmr_set_enable(1, 1);
  290. sfunc_sleep_dac_off(0);
  291. bsp_change_volume(sys_cb.vol);
  292. #if DAC_DNR_EN
  293. dac_dnr_set_sta(sta);
  294. #endif
  295. bt_exit_sleep();
  296. #if BT_DISP_LOW_VBAT_EN
  297. sys_cb1.disp_low_vbat_flag = 1;
  298. #endif
  299. printf("wakeup\n");
  300. }
  301. AT(.text.bfunc.sleep)
  302. bool sleep_process(is_sleep_func is_sleep)
  303. {
  304. if ((*is_sleep)()) {
  305. if ((!sys_cb.sleep_en) || (!port_2led_is_sleep_en())) {
  306. reset_sleep_delay();
  307. return false;
  308. }
  309. if(sys_cb.sleep_delay == 0) {
  310. sfunc_sleep();
  311. reset_sleep_delay();
  312. return true;
  313. }
  314. } else {
  315. reset_sleep_delay();
  316. }
  317. return false;
  318. }
  319. extern const u8 chg_timeout_tbl[4];
  320. ///解决充满关机后按充电仓按键不能唤醒进入充电的问题(5V掉电但有维持电压的仓类型)
  321. AT(.text.pwrdwn.vusb)
  322. static u8 sfunc_pwrdown_w4_vusb_offline(void)
  323. {
  324. u32 off_cnt = 0;
  325. u32 timeout = (u32)chg_timeout_tbl[xcfg_cb.ch_w4_off_sel] * 200;
  326. if ((xcfg_cb.ch_box_type_sel != 1) && timeout) {
  327. if (xcfg_cb.led_charge_fully_xcfg == 1) {
  328. charge_bled_on();
  329. }
  330. while (timeout--) {
  331. WDT_CLR();
  332. delay(1700); //5ms
  333. if (!CHARGE_DC_IN()) {
  334. off_cnt++;
  335. } else {
  336. off_cnt = 0;
  337. }
  338. if (off_cnt > 5) {
  339. return 1; //VUSB已掉线,打开VUSB唤醒
  340. }
  341. }
  342. }
  343. return 0;
  344. }
  345. AT(.text.pwrdwn.lowbat)
  346. void sfunc_lowbat_do(void)
  347. {
  348. sfunc_power_save_enter();
  349. WDT_DIS();
  350. LPMCON |= BIT(0); //Sleep mode enable
  351. asm("nop");asm("nop");asm("nop");
  352. while(1);
  353. }
  354. //硬开关方案,低电时,进入省电状态
  355. void sfunc_lowbat(void)
  356. {
  357. memcpy(&__pwrdwn_comm_vma, &__pwrdwn_comm_lma, (u32)&__pwrdwn_comm_size); //Load pwrdwn comm
  358. sfunc_lowbat_do();
  359. }
  360. //软开关方案,POWER键/低电时,进入关机状态
  361. AT(.text.pwrdwn)
  362. void sfunc_pwrdown_do(u8 vusb_wakeup_en)
  363. {
  364. printf("%s:%d\n", __func__, vusb_wakeup_en);
  365. u32 tkey_wakeup_en = sys_cb.tkey_pwrdwn_en;
  366. u32 wakeup_bit = 0;
  367. WDT_CLR();
  368. vusb_delay_rst_dis();
  369. if (sys_cb.vbat < 3050) {
  370. tkey_wakeup_en = 0; //低电关机, 关掉触模唤醒
  371. }
  372. RTCCON4 &= ~BIT(15); //RI_VIO_PD(0)
  373. RTCCON8 &= ~BIT(15); //RI_EN_VUSBDIV = 0
  374. RTCCON1 &= ~(BIT(5) | BIT(7)); //BIT(7): VRTC voltage for ADC, BIT(5):WK pin analog
  375. RTCCON9 = 0xfff; //Clr pending
  376. if (!vusb_wakeup_en && xcfg_cb.ch_box_type_sel == 3) { //5V完全掉电的仓
  377. RTCCON3 &= ~BIT(12); //RTCCON3[12], INBOX Wakeup disable
  378. }
  379. if (sys_cb.pdn_boat_flag) { //船运模式关机, 只保留5V唤醒。
  380. RTCCON3 &= ~BIT(12); //RTCCON3[12], INBOX Wakeup disable
  381. tkey_wakeup_en = 0; //disable tkey wakeup
  382. }
  383. if (!(RTCCON3 & BIT(12))) { //非仓内关机, 开下漏电
  384. bsp_charge_leakage_set(1, 0);
  385. } else {
  386. if (bsp_chbox_type_is_maintain_volt()) { //有维持电压的充电仓关闭leakage漏电
  387. bsp_charge_leakage_set(0, 0);
  388. }
  389. }
  390. if ((RTCCON3 & BIT(12)) || sys_cb.lowpwr_dwn_flag || xcfg_cb.user_tkey_wakeup_dis) { //仓内关机或低电关机?
  391. tkey_wakeup_en = 0; //disable tkey wakeup
  392. }
  393. if ((tkey_wakeup_en) && (!xcfg_cb.user_tkey_alarm_dis)) {
  394. RTCCON0 |= BIT(21); //BGUV reset TKSWRSTN
  395. RTCCON8 |= BIT(29); //RI_EN_BGUVT = 1, rtc bgp undervoltage detect enable
  396. }
  397. sfunc_power_save_enter();
  398. if (!vusb_wakeup_en || sys_cb.chstop_pwrwn_en) {
  399. RTCCON8 = (RTCCON8 & ~BIT(6)) | BIT(1); //disable charger function
  400. }
  401. if (!vusb_wakeup_en) { //充满关机
  402. vusb_wakeup_en = sfunc_pwrdown_w4_vusb_offline();
  403. }
  404. RTCCON11 = (RTCCON11 & ~0x03) | BIT(2); //WK PIN filter select 8ms
  405. uint rtccon3 = RTCCON3 & ~BIT(11);
  406. #if CHARGE_EN
  407. if (((xcfg_cb.charge_en) && (vusb_wakeup_en))||get_qtest_mode()) {
  408. rtccon3 |= BIT(11); //VUSB wakeup enable
  409. #if CHARGE_PULL_OUT_FILTER_EN
  410. RTCCON &= ~BIT(6); //VUSB insert reset system disable
  411. asm("nop"); asm("nop");
  412. RTCCON3 |= BIT(11); //VUSB wakeup enable
  413. RTCCON11 |= BIT(6); //VUSB pull out filter VUSB拔出滤波
  414. delay_us(100);
  415. RTCCON10 = BIT(3);
  416. #endif
  417. }
  418. #endif
  419. RTCCON3 = rtccon3 & ~(BIT(10) | BIT(14)); //关WK PIN,再打开,以清除Pending
  420. wakeup_bit = RTCCON3 & (0xff << 8); //备份wakeup
  421. if ((TKCON1 & BIT(13)) && tkey_wakeup_en) { //TK is enable?
  422. pmu_vdd11_select_vrtc11();
  423. RTCCON3 |= BIT(14); //Touch key long press wakeup
  424. wakeup_bit |= BIT(14);
  425. RTCCON0 &= ~BIT(4); //TKITF_EN disable
  426. } else {
  427. RTCCON0 |= BIT(4);
  428. INPCPND = BIT(0);
  429. RTCCON0 &= ~BIT(5); //touch key reset
  430. RTCCON0 &= ~BIT(0); //RING2M_RTC Disable
  431. RTCCON0 &= ~BIT(4); //TKITF_EN disable
  432. }
  433. uint rtccon1 = RTCCON1 & ~0x1f;
  434. rtccon3 = RTCCON3 & ~0x17; //Disable VDDCORE, buck
  435. rtccon3 |= BIT(6); //Core power down enable, VDDCORE short disable
  436. #if USER_PWRKEY
  437. if (sys_cb.wko_pwrkey_en) {
  438. if (!sys_cb.pdn_boat_flag) {
  439. wakeup_bit |= BIT(10);
  440. rtccon3 |= BIT(10); //WK pin wake up enable
  441. }
  442. rtccon1 |= BIT(0) | BIT(2) | BIT(4); //WK 90K pull up enable
  443. rtccon3 &= ~BIT(5); //RI_EN_PG_2CORE = 0, vddcore-vdd11 short disable
  444. }
  445. #endif
  446. WDT_DIS();
  447. RTCCON |= BIT(5); //PowerDown Reset,如果有Pending,则马上Reset
  448. RTCCON1 = rtccon1;
  449. RTCCON3 = rtccon3 | wakeup_bit;
  450. LPMCON |= BIT(0);
  451. LPMCON |= BIT(1); //idle mode
  452. asm("nop");asm("nop");asm("nop");
  453. while (1);
  454. }
  455. void sfunc_pwrdown(u8 vusb_wakeup_en)
  456. {
  457. memcpy(&__pwrdwn_comm_vma, &__pwrdwn_comm_lma, (u32)&__pwrdwn_comm_size); //Load pwrdwn comm
  458. sfunc_pwrdown_do(vusb_wakeup_en);
  459. }
  460. AT(.text.lowpwr.pwroff)
  461. void func_pwroff(int pwroff_tone_en)
  462. {
  463. printf("%s\n", __func__);
  464. #if VUSB_SMART_VBAT_HOUSE_EN
  465. if (vhouse_cb.inbox_sta) {
  466. bsp_charge_inbox_wakeup_enable();
  467. }
  468. #endif
  469. vusb_delay_rst_dis();
  470. led_power_down();
  471. motor_enable(MOTOR_PWROFF, T_MOTOR_PWROFF_SEL);
  472. #if WARNING_POWER_OFF
  473. if ((pwroff_tone_en) && (SOFT_POWER_ON_OFF)) {
  474. sys_warning_play(T_WARNING_POWER_OFF, PIANO_POWER_OFF);
  475. }
  476. #endif // WARNING_POWER_OFF
  477. dac_power_off(); //dac power down
  478. motor_disable();
  479. if (SOFT_POWER_ON_OFF) {
  480. if (!PWRKEY_2_HW_PWRON) {
  481. u8 dcin_cnt = 0;
  482. #if USER_TKEY
  483. tkey_press_timeout_clr();
  484. #endif
  485. while (IS_PWRKEY_PRESS() || IS_TKEY_PRESS()) { //等待PWRKWY松开
  486. if (CHARGE_DC_IN()) {
  487. dcin_cnt++;
  488. if (dcin_cnt > 3) {
  489. sw_reset_kick(SW_RST_DC_IN); //直接复位进入充电
  490. }
  491. } else {
  492. dcin_cnt = 0;
  493. }
  494. #if USER_TKEY
  495. if (sys_cb.tkey_pwrdwn_en) {
  496. tkey_press_timeout_process();
  497. }
  498. #endif
  499. delay_5ms(2);
  500. WDT_CLR();
  501. }
  502. }
  503. led_power_down_w4_done();
  504. if (CHARGE_DC_IN() && (xcfg_cb.chbox_en == 0)) {
  505. if (!power_off_check()) {
  506. return; //pwrkey按下,再次开机
  507. }
  508. }
  509. saradc_exit(adc_cb.channel); //close saradc及相关通路模拟
  510. if ((PWRKEY_2_HW_PWRON) && (sys_cb.poweron_flag)) {
  511. RTCCON1 |= BIT(6); //WK PIN High level wakeup
  512. }
  513. sfunc_pwrdown(2);
  514. } else {
  515. saradc_exit(adc_cb.channel); //close saradc及相关通路模拟
  516. led_power_down_w4_done();
  517. sfunc_lowbat(); //低电关机进入Sleep Mode
  518. }
  519. }