SmartAudio/lichee/brandy/u-boot-2011.09/board/sunxi/load_check.c

504 lines
12 KiB
C
Raw Normal View History

2018-07-13 01:31:50 +00:00
/*
* (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 ;
}