#include "include.h" #if CHARGE_EN #define TRACE_EN 0 #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define DC_IN() ((RTCCON >> 20) & 0x01) //VUSB Online state: 0->not online, 1->online static charge_cfg_t charge_cfg; #if TRACE_EN AT(.com_rodata.tkey) const char charge_on_str[] = "Charge on\n"; AT(.com_rodata.tkey) const char charge_off_str[] = "Charge off: %d\n"; #endif AT(.text.charge_com.sta) void bsp_charge_sta(u8 sta) { if (sta == 1) { //充电开启 sys_cb.charge_sta = 1; sys_cb.charge_bled_flag = 0; TRACE(charge_on_str); } else { //充电关闭 TRACE(charge_off_str, sta); sys_cb.charge_sta = 0; sys_cb.charge_bled_flag = 0; if (sta == 2) { sys_cb.charge_sta = 2; } } } void bsp_charge_off(void) { if (charge_cfg.chag_sta > CHAG_STA_OFF) { charge_stop(0); } } AT(.text.charge_com.det) u8 charge_dc_detect(void) { if (!xcfg_cb.charge_en) { return 0; } return (RTCCON >> 20) & 0x01; } void bsp_charge_set_stop_time(u16 stop_time) { charge_cfg.stop_time = stop_time; } void bsp_charge_init(void) { charge_cfg_t *p = &charge_cfg; memset(p, 0, sizeof(charge_cfg_t)); if (xcfg_cb.charge_en) { p->trick_curr_en = CHARGE_TRICK_EN; p->dcin_reset = CHARGE_DC_RESET; p->buck_mode_en = BUCK_MODE_EN*xcfg_cb.buck_mode_en; p->trick_stop_volt = CHARGE_TRICK_STOP_VOLT; p->stop_volt = CHARGE_STOP_VOLT; p->follow_volt = CHARGE_VOLT_FOLLOW; p->const_curr = CHARGE_CONSTANT_CURR; p->trick_curr = CHARGE_TRICKLE_CURR; p->stop_curr = CHARGE_STOP_CURR; p->stop_curr_thd = 80; p->bled_on_pr = 0; p->stop_time = 18000; //默认30分钟 RTCCON3 &= ~BIT(12); //RTCCON3[12], INBOX Wakeup disable RTCCON7 &= ~BIT(6); //PWRUPICH = 20mA RTCCON8 |= BIT(4); //inbox voltage selection. 1'b1, 1.7v; 1'b0, 1.1v charge_init(p); } } #endif // CHARGE_EN