504 lines
12 KiB
C
504 lines
12 KiB
C
|
/*
|
|||
|
* (C) Copyright 2007-2013
|
|||
|
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
|||
|
* Jerry Wang <wangflord@allwinnertech.com>
|
|||
|
*
|
|||
|
* See file CREDITS for list of people who contributed to this
|
|||
|
* project.
|
|||
|
*
|
|||
|
* This program is free software; you can redistribute it and/or
|
|||
|
* modify it under the terms of the GNU General Public License as
|
|||
|
* published by the Free Software Foundation; either version 2 of
|
|||
|
* the License, or (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,
|
|||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|||
|
* GNU General Public License for more details.
|
|||
|
*
|
|||
|
* You should have received a copy of the GNU General Public License
|
|||
|
* along with this program; if not, write to the Free Software
|
|||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|||
|
* MA 02111-1307 USA
|
|||
|
*/
|
|||
|
#include <common.h>
|
|||
|
#include <malloc.h>
|
|||
|
#include <asm/arch/drv_display.h>
|
|||
|
#include <bat.h>
|
|||
|
#include <sys_config.h>
|
|||
|
#include <asm/arch/timer.h>
|
|||
|
#include <pmu.h>
|
|||
|
#include <power.h>
|
|||
|
#include "bat_cartoon.h"
|
|||
|
#include "power_probe.h"
|
|||
|
#include "de.h"
|
|||
|
#include <standby.h>
|
|||
|
|
|||
|
DECLARE_GLOBAL_DATA_PTR;
|
|||
|
|
|||
|
#ifndef CONFIG_NO_BOOT_STANDBY
|
|||
|
int boot_standby_action = 0;
|
|||
|
|
|||
|
typedef int (* standby_func)(void);
|
|||
|
|
|||
|
static int board_try_boot_standby(void)
|
|||
|
{
|
|||
|
uint func_addr = (uint)boot_standby_mode;
|
|||
|
standby_func boot_standby_func;
|
|||
|
|
|||
|
//cal the real function address of boot_standby_mode
|
|||
|
flush_dcache_all();
|
|||
|
boot_standby_func = (standby_func)(func_addr - gd->reloc_off);
|
|||
|
|
|||
|
return boot_standby_func();
|
|||
|
}
|
|||
|
#endif
|
|||
|
extern int efex_test;
|
|||
|
static int board_probe_power_level(void)
|
|||
|
{
|
|||
|
int power_status;
|
|||
|
int power_start;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>power<65><72><EFBFBD><EFBFBD>
|
|||
|
axp_probe_key();
|
|||
|
//<2F><>ȡ<EFBFBD><C8A1>Դ״̬
|
|||
|
power_status = axp_get_power_vol_level();
|
|||
|
debug("power status = %d\n", power_status);
|
|||
|
if(power_status == BATTERY_RATIO_TOO_LOW_WITHOUT_DCIN)
|
|||
|
{
|
|||
|
tick_printf("battery power is low without no dc or ac, should be set off\n");
|
|||
|
sunxi_bmp_display("bat\\low_pwr.bmp");
|
|||
|
__msdelay(3000);
|
|||
|
if(!efex_test)
|
|||
|
return -1;
|
|||
|
else
|
|||
|
return 0;
|
|||
|
}
|
|||
|
power_start = 0;
|
|||
|
//power_start<72>ĺ<EFBFBD><C4BA><EFBFBD>
|
|||
|
//0: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţֱ<C5A3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>power<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ϵͳ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//1: <20><><EFBFBD><EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţֱ<C5A3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD>ͬʱҪ<CAB1><D2AA><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD>㹻<EFBFBD><E3B9BB>
|
|||
|
//2: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţֱ<C5A3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>power<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ϵͳ״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
|
|||
|
//3: <20><><EFBFBD><EFBFBD>״̬<D7B4>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţֱ<C5A3>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
|
|||
|
script_parser_fetch(PMU_SCRIPT_NAME, "power_start", &power_start, 1);
|
|||
|
debug("power start cause = %d\n", power_start);
|
|||
|
if(power_start == 3)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if(power_status == BATTERY_RATIO_TOO_LOW_WITH_DCIN_VOL_TOO_LOW)//<2F>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>͵<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ״̬
|
|||
|
{
|
|||
|
if(!(power_start & 0x02)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3>͵<EFBFBD>״̬<D7B4>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, power_start==0 | power_start==1
|
|||
|
{
|
|||
|
tick_printf("battery low power and vol with dc or ac, should charge longer\n");
|
|||
|
sunxi_bmp_display("bat\\bempty.bmp");
|
|||
|
__msdelay(3000);
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
//<2F>͵<EFBFBD><CDB5>ص͵<D8B5><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ2<CEAA><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return 1;
|
|||
|
}
|
|||
|
if(power_status == BATTERY_RATIO_TOO_LOW_WITH_DCIN)//<2F>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ״̬
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>͵<EFBFBD>ͼ<EFBFBD><CDBC>Ȼ<EFBFBD><C8BB><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>͵<EFBFBD>ͼ<EFBFBD><CDBC>Ȼ<EFBFBD><C8BB><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2<CEAA><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if(!(power_start & 0x02)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3>͵<EFBFBD>״̬<D7B4>²<EFBFBD><C2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, power_start==0 | power_start==1
|
|||
|
{
|
|||
|
tick_printf("battery low power with dc or ac\n");
|
|||
|
|
|||
|
return 2;
|
|||
|
}
|
|||
|
//<2F>͵<EFBFBD><CDB5>ص͵<D8B5><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ϊ2<CEAA><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return 1;
|
|||
|
}
|
|||
|
//<2F><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹻
|
|||
|
if(power_start == 0x01) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0bit<69><74>ֵΪ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return 1;
|
|||
|
}
|
|||
|
|
|||
|
static int board_probe_battery_exist(void) //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
|
|||
|
{
|
|||
|
int counter;
|
|||
|
int dc_exist, bat_exist;
|
|||
|
|
|||
|
counter = 4;
|
|||
|
do
|
|||
|
{
|
|||
|
dc_exist = 0;
|
|||
|
bat_exist = 0;
|
|||
|
axp_power_get_dcin_battery_exist(&dc_exist, &bat_exist);
|
|||
|
printf("bat_exist=%d\n", bat_exist);
|
|||
|
if(bat_exist == -1)
|
|||
|
{
|
|||
|
printf("bat is unknown\n");
|
|||
|
__msdelay(500);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
while(counter --);
|
|||
|
|
|||
|
return bat_exist;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static int board_probe_poweron_cause(void)
|
|||
|
{
|
|||
|
int status = -1;
|
|||
|
|
|||
|
status = axp_probe_startup_cause();
|
|||
|
debug("startup status = %d\n", status);
|
|||
|
#ifdef FORCE_BOOT_STANDBY
|
|||
|
status = 1;
|
|||
|
#endif
|
|||
|
return status;
|
|||
|
}
|
|||
|
|
|||
|
static int board_probe_bat_status(int standby_mode)
|
|||
|
{
|
|||
|
int bat_cal = 1;
|
|||
|
int ret, chargemode = 0;
|
|||
|
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ǻ<EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<C7B7><F1BFAABB><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫȷ<D2AA>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>android<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ret = script_parser_fetch("charging_type", "charging_type", &chargemode, 1);
|
|||
|
if((!ret) && chargemode)
|
|||
|
{
|
|||
|
gd->chargemode = 1;
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
if(battery_charge_cartoon_init(0) < 0)
|
|||
|
{
|
|||
|
tick_printf("init charge cartoon fail\n");
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
bat_cal = axp_probe_rest_battery_capacity();
|
|||
|
printf("bat not inited\n");
|
|||
|
if(battery_charge_cartoon_init(bat_cal/(100/(SUNXI_BAT_BMP_MAX-1))) < 0)
|
|||
|
{
|
|||
|
tick_printf("init charge cartoon fail\n");
|
|||
|
|
|||
|
return -1;
|
|||
|
}
|
|||
|
if((!bat_cal) && (standby_mode))
|
|||
|
{
|
|||
|
bat_cal = 100;
|
|||
|
}
|
|||
|
|
|||
|
return bat_cal;
|
|||
|
}
|
|||
|
|
|||
|
#ifndef CONFIG_NO_BOOT_STANDBY
|
|||
|
static int board_standby_status(int source_bat_cal)
|
|||
|
{
|
|||
|
int bat_cal, this_bat_cal;
|
|||
|
int i, j, status;
|
|||
|
int one_delay;
|
|||
|
int ret;
|
|||
|
|
|||
|
boot_standby_action = 0;
|
|||
|
this_bat_cal = source_bat_cal;
|
|||
|
tick_printf("base bat_cal = %d\n", this_bat_cal);
|
|||
|
if(this_bat_cal > 95)
|
|||
|
{
|
|||
|
this_bat_cal = 100;
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD>
|
|||
|
usb_detect_for_charge(BOOT_USB_DETECT_DELAY_TIME + 200);
|
|||
|
//<2F><><EFBFBD><EFBFBD>axp<78><70><EFBFBD><EFBFBD>
|
|||
|
power_limit_detect_enter();
|
|||
|
status = 1;
|
|||
|
goto __start_case_status__;
|
|||
|
/******************************************************************
|
|||
|
*
|
|||
|
* standby <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ˵<EFBFBD><EFBFBD>
|
|||
|
*
|
|||
|
* -1: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>standbyʧ<EFBFBD><EFBFBD>
|
|||
|
* 1: <EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* 2: <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* 3: <EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* 4: <EFBFBD>ⲿ<EFBFBD><EFBFBD>Դ<EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* 5: <EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* 6: <EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
|
|||
|
* 7: <EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD>³<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*
|
|||
|
******************************************************************/
|
|||
|
do
|
|||
|
{
|
|||
|
tick_printf("enter standby\n");
|
|||
|
board_display_layer_close();
|
|||
|
power_limit_detect_exit();
|
|||
|
status = board_try_boot_standby();
|
|||
|
tick_printf("exit standby by %d\n", status);
|
|||
|
|
|||
|
bat_cal = axp_probe_rest_battery_capacity();
|
|||
|
tick_printf("current bat_cal = %d\n", bat_cal);
|
|||
|
if(bat_cal > this_bat_cal)
|
|||
|
{
|
|||
|
this_bat_cal = bat_cal;
|
|||
|
}
|
|||
|
__start_case_status__:
|
|||
|
tick_printf("status = %d\n", status);
|
|||
|
switch(status)
|
|||
|
{
|
|||
|
case 2: //<2F>̰<EFBFBD>power<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD>
|
|||
|
boot_standby_action = 0;
|
|||
|
power_limit_detect_enter();
|
|||
|
board_display_layer_open();
|
|||
|
case 1:
|
|||
|
//<2F><><EFBFBD>¼<EFBFBD><C2BC>㶯<EFBFBD><E3B6AF><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
|
|||
|
if(this_bat_cal == 100)
|
|||
|
{
|
|||
|
one_delay = 1000;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
one_delay = 1000/(10 - (this_bat_cal/10));
|
|||
|
}
|
|||
|
//<2F><><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>
|
|||
|
for(j=0;j<3;j++)
|
|||
|
{
|
|||
|
for(i=this_bat_cal/(100/(SUNXI_BAT_BMP_MAX-1));i<SUNXI_BAT_BMP_MAX;i++)
|
|||
|
{
|
|||
|
battery_charge_cartoon_rate(i);
|
|||
|
if(boot_standby_action & 0x08) //<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ
|
|||
|
{
|
|||
|
boot_standby_action &= ~0x08;
|
|||
|
j = 0;
|
|||
|
}
|
|||
|
else if(boot_standby_action & 0x02) //<2F>̰<EFBFBD>
|
|||
|
{
|
|||
|
boot_standby_action &= ~2;
|
|||
|
j = 0;
|
|||
|
}
|
|||
|
else if(boot_standby_action & 0x01) //<2F><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
battery_charge_cartoon_exit();
|
|||
|
power_limit_detect_exit();
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
else if(boot_standby_action & 0x10) //<2F>ε<EFBFBD><CEB5>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD><D4B4>û<EFBFBD><C3BB><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ
|
|||
|
{
|
|||
|
status = 10;
|
|||
|
boot_standby_action &= ~0x10;
|
|||
|
|
|||
|
goto __start_case_status__;
|
|||
|
}
|
|||
|
__msdelay(one_delay);
|
|||
|
}
|
|||
|
}
|
|||
|
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>ʾ<EFBFBD><CABE>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
|||
|
battery_charge_cartoon_rate(this_bat_cal/(100/(SUNXI_BAT_BMP_MAX-1)));
|
|||
|
for(j=0;j<4;j++)
|
|||
|
{
|
|||
|
if(boot_standby_action & 0x08) //<2F><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ
|
|||
|
{
|
|||
|
boot_standby_action &= ~0x08;
|
|||
|
j = 0;
|
|||
|
}
|
|||
|
else if(boot_standby_action & 0x10) //<2F>ε<EFBFBD><CEB5>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD><D4B4>û<EFBFBD><C3BB><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ
|
|||
|
{
|
|||
|
status = 10;
|
|||
|
boot_standby_action &= ~0x10;
|
|||
|
|
|||
|
goto __start_case_status__;
|
|||
|
}
|
|||
|
else if(boot_standby_action & 0x01) //<2F><><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
battery_charge_cartoon_exit();
|
|||
|
power_limit_detect_exit();
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
__msdelay(250);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 3: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֮<EFBFBD>رյ<D8B1><D5B5><EFBFBD>ͼ<EFBFBD>꣬<EFBFBD><EAA3AC><EFBFBD><EFBFBD>ϵͳ
|
|||
|
battery_charge_cartoon_exit();
|
|||
|
|
|||
|
return 0;
|
|||
|
|
|||
|
case 4: //<2F><><EFBFBD>Ƴ<EFBFBD><C6B3>ⲿ<EFBFBD><E2B2BF>Դʱ<D4B4><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD>
|
|||
|
case 5: //<2F><><EFBFBD><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ػ<EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>жϼ<D0B6><CFBC><EFBFBD>
|
|||
|
boot_standby_action = 0;
|
|||
|
power_limit_detect_enter();
|
|||
|
|
|||
|
board_display_layer_open();
|
|||
|
battery_charge_cartoon_rate(this_bat_cal/(100/(SUNXI_BAT_BMP_MAX-1)));
|
|||
|
case 6:
|
|||
|
case 7:
|
|||
|
if((status != 4) && (status != 5))
|
|||
|
{
|
|||
|
board_display_layer_open();
|
|||
|
battery_charge_cartoon_rate(this_bat_cal/(100/(SUNXI_BAT_BMP_MAX-1)));
|
|||
|
}
|
|||
|
case 10:
|
|||
|
battery_charge_cartoon_rate(this_bat_cal/(100/(SUNXI_BAT_BMP_MAX-1)));
|
|||
|
__msdelay(500);
|
|||
|
do
|
|||
|
{
|
|||
|
if(!(boot_standby_action & 0x04))
|
|||
|
{
|
|||
|
ret = battery_charge_cartoon_degrade(5);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
status = 1;
|
|||
|
battery_charge_cartoon_reset();
|
|||
|
|
|||
|
goto __start_case_status__;
|
|||
|
}
|
|||
|
}
|
|||
|
while(!ret);
|
|||
|
|
|||
|
battery_charge_cartoon_exit();
|
|||
|
|
|||
|
power_limit_detect_exit();
|
|||
|
|
|||
|
return -1;
|
|||
|
|
|||
|
case 8: //standby<62><79><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC>vbus<75><73><EFBFBD>ڱ仯
|
|||
|
{
|
|||
|
usb_detect_for_charge(BOOT_USB_DETECT_DELAY_TIME + 200);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case 9: //standby<62><79><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC>vbus<75>Ƴ<EFBFBD><C6B3><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨdc
|
|||
|
{
|
|||
|
// power_set_usbpc();
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
while(1);
|
|||
|
}
|
|||
|
#endif
|
|||
|
/*
|
|||
|
************************************************************************************************************
|
|||
|
*
|
|||
|
* function
|
|||
|
*
|
|||
|
* name :
|
|||
|
*
|
|||
|
* parmeters : standby_mode: 0, <EFBFBD><EFBFBD>ͨģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ״̬
|
|||
|
*
|
|||
|
* 1, <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ǿ<EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD>standbyģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>۵<EFBFBD>Դ״̬
|
|||
|
*
|
|||
|
* return :
|
|||
|
*
|
|||
|
* note : probe power and other condition
|
|||
|
*
|
|||
|
*
|
|||
|
*
|
|||
|
************************************************************************************************************
|
|||
|
*/
|
|||
|
void board_status_probe(int standby_mode)
|
|||
|
{
|
|||
|
int ret;
|
|||
|
int start_condition = 0;
|
|||
|
int bat_exist;
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>power<65><72><EFBFBD><EFBFBD>
|
|||
|
axp_probe_key();
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>һ<EFBFBD>Σ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ѹ״̬
|
|||
|
if(!standby_mode)
|
|||
|
{
|
|||
|
ret = board_probe_power_level(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
debug("stage1 resule %d\n", ret);
|
|||
|
if(ret < 0)
|
|||
|
{
|
|||
|
do_shutdown(NULL, 0, 1, NULL);
|
|||
|
}
|
|||
|
else if(!ret)
|
|||
|
{
|
|||
|
return ;
|
|||
|
}
|
|||
|
else if(ret == 2) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>͵<EFBFBD>ͼ<EFBFBD><CDBC>Ȼ<EFBFBD><C8BB><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
start_condition = 1;
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3>ڶ<EFBFBD><DAB6>Σ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD><E2BFAA>ԭ<EFBFBD><D4AD>
|
|||
|
ret = board_probe_poweron_cause(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӹػ<D3B9>
|
|||
|
debug("stage2 resule %d\n", ret);
|
|||
|
if(ret <= 0)
|
|||
|
{
|
|||
|
if(!start_condition)
|
|||
|
{
|
|||
|
return ;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
tick_printf("battery low power with dc or ac, should charge longer\n");
|
|||
|
sunxi_bmp_display("bat\\bempty.bmp");
|
|||
|
__msdelay(3000);
|
|||
|
|
|||
|
do_shutdown(NULL, 0, 1, NULL);
|
|||
|
}
|
|||
|
}
|
|||
|
else if(ret == AXP_VBUS_DCIN_NOT_EXIST) //<2F><>ǰһ<C7B0><D2BB>Ϊboot standby״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF>Դ<EFBFBD><D4B4>ֱ<EFBFBD>ӹػ<D3B9>
|
|||
|
{
|
|||
|
do_shutdown(NULL, 0, 1, NULL);
|
|||
|
}
|
|||
|
}
|
|||
|
#ifdef FORCE_BOOT_STANDBY
|
|||
|
bat_exist = 1;
|
|||
|
#else
|
|||
|
if(standby_mode)
|
|||
|
{
|
|||
|
bat_exist = 1;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
bat_exist = board_probe_battery_exist();
|
|||
|
if(bat_exist <= 0)
|
|||
|
{
|
|||
|
tick_printf("no battery exist\n");
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ret = board_probe_bat_status(standby_mode);
|
|||
|
debug("stage3 resule %d\n", ret);
|
|||
|
if(ret < 0)
|
|||
|
{
|
|||
|
do_shutdown(NULL, 0, 1, NULL);
|
|||
|
}
|
|||
|
else if(!ret)
|
|||
|
{
|
|||
|
return ;
|
|||
|
}
|
|||
|
#ifndef CONFIG_NO_BOOT_STANDBY
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>ĽΣ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD>boot<6F><74><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
|
|||
|
ret = board_standby_status(ret);
|
|||
|
debug("stage4 resule %d\n", ret);
|
|||
|
if(ret < 0)
|
|||
|
{
|
|||
|
do_shutdown(NULL, 0, 1, NULL);
|
|||
|
}
|
|||
|
#endif
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
|