📄 hw_battery.c
字号:
/*********************************************************************************
* Copyright (C),2004-2005, Fuzhou Rockchip Co.,Ltd.
* All Rights Reserved
* V1.00
* FileName : hw_battery.c
* Author : lzy
* Description:
* History :
* <author> <time> <version> <desc>
* lzy 07/9/17 1.0 ORG
$Log: hw_battery.c,v $
Revision 1.3 2008/06/19 04:43:29 Administrator
代码整理!
Revision 1.2 2008/05/19 13:21:37 Administrator
IdleDetec 修改提交,各个模块可能需要修改 IdleDetec 相关的部份代码!
Revision 1.1.1.1 2008/03/06 13:29:04 Lingzhaojun
no message
*********************************************************************************/
#include "hw_include.h"
//#include "idledetec.h"
#include "usb.h"
#include "include.h"
BATT_INFO gBattery;
INT16U Batt_StaticCnt;
extern unsigned short AdcValue[];
#define CHARGEOKCNTRMAX 20
static UINT32 ChargeOKcnt = 0;
const UINT16 Batt_Level[BATT_TOTAL_STEPS] =
{
BATT_LEVEL0, \
BATT_LEVEL1, \
BATT_LEVEL2, \
BATT_FULL_VALUE
};
/**************************************************************************
* 函数名称: RealBattValue
* 函数描述:
* 入口参数: adc
* 出口参数:
* 返回值:
***************************************************************************/
UINT32 RealBattValue(UINT16 adc)
{
UINT32 ret = (UINT32)adc;
ret <<= 1;
ret *= VCC_VALUE;
ret >>= 10;
return ret;
}
/**************************************************************************
* 函数名称: Battery_GetChargeState
* 函数描述:
* 入口参数:
* 出口参数:
* 返回值:
***************************************************************************/
UINT16 Battery_GetChargeState(void)
{
UINT32 batt_state = CHARGE_NO;
if (VBUS_OK())
{
UINT32 batt = (UINT32)RealBattValue(AdcValue[BATTERY_ADC]);
batt_state = CHARGE_BATT;
if (batt > BATT_FULL_VALUE)
{
if (++ChargeOKcnt > CHARGEOKCNTRMAX)
batt_state = CHARGE_FULL;
}
else
ChargeOKcnt = 0;
}
else
{
ChargeOKcnt = 0;
batt_state = CHARGE_NO;
}
return batt_state;
}
/**************************************************************************
* 函数名称: Battery_GetLevel
* 函数描述: 得到系统的电池电量信息200ms/tick
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
UINT16 Battery_GetLevel(void)
{
UINT32 battlevel;
UINT32 ChargeState = Battery_GetChargeState();
switch (ChargeState)
{
case CHARGE_BATT:
{
if (++gBattery.Batt_Level > 3)
gBattery.Batt_Level = 0;
gBattery.Batt_Value = BATT_FULL_VALUE;
}
break;
case CHARGE_FULL:
{
gBattery.Batt_Level = 3;
gBattery.Batt_Value = BATT_FULL_VALUE;
}
break;
default:
{
battlevel = (UINT32)RealBattValue(AdcValue[BATTERY_ADC]);
gBattery.Batt_Value += battlevel;
gBattery.Batt_Value >>= 1;
if (gBattery.Batt_Value < BATT_POWEROFF_VALUE)
gBattery.Batt_LowCnt++;
else
gBattery.Batt_LowCnt = 0;
for (gBattery.Batt_Level = 0;gBattery.Batt_Level < BATT_TOTAL_STEPS - 1;gBattery.Batt_Level++)
{
if (battlevel < Batt_Level[gBattery.Batt_Level])
break;
}
}
break;
}
return gBattery.Batt_Level;
}
/**************************************************************************
* 函数名称: Battery_PowerOnCheck
* 函数描述: 开机时检查电池容量
* 入口参数: 无
* 出口参数: 无
* 说明: 刚上电时检查电池容量,如太低则直接须直接关机
如冲电器插入开机,则电池电压一般会较高
开机电池检测采用1.25 v 作为基准
***************************************************************************/
UINT32 Battery_PowerOnCheck(void)
{
UINT16 i, adcref, adcbat;
UINT16 temp;
//
// the ADC frequency is no set after frist power on, so set to MAX APB frequency here, LZY modify 4-15
//
ADC_PowerOnInit();
ADC_Start(BATTERY_ADC, NULL);
USDELAY(20);
ADC_ReadData((UINT16 *)&adcbat);
ADC_Start(VREF_ADC, NULL);
USDELAY(20);
ADC_ReadData((UINT16 *)&adcref);
for (i = 0; i < 5; i++)
{
ADC_Start(BATTERY_ADC, NULL);
USDELAY(20);
ADC_ReadData((UINT16 *)&temp);
adcbat += temp;
adcbat >>= 1;
ADC_Start(VREF_ADC, NULL);
USDELAY(20);
ADC_ReadData((UINT16 *)&temp);
adcref += temp;
adcref >>= 1;
}
//转换到1.2v参考电压
temp = ((UINT32)adcbat * 2L * BATT_1V2_VALUE) / ((UINT32)adcref);
// 当电池电压小于BATT_EMPTY_VALUE -0.25v,返回false
if ((!(VBUS_OK())) && (temp < (BATT_EMPTY_VALUE - 250)))
return FALSE;
else
{
gBattery.Batt_Value = BATT_FULL_VALUE;
gBattery.Batt_LowCnt = 0;
return TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -