#define DBG(x...)
#endif
-#define CHN_BAT_ADC 3
+#define CHN_BAT_ADC 0
#define CHN_USB_ADC 2
#define BATT_LEVEL_EMPTY 0
#define BATT_PRESENT_TRUE 1
#define BATT_PRESENT_FALSE 0
-#define BATT_NOMAL_VOL_VALUE 4000
+#define BATT_NOMAL_VOL_VALUE 3900
static int gBatStatus = POWER_SUPPLY_STATUS_UNKNOWN;
static int gBatHealth = POWER_SUPPLY_HEALTH_GOOD;
+static int gBatLastCapacity = 0;
static int gBatCapacity = BATT_LEVEL_EMPTY;
static int gBatPresent = BATT_PRESENT_TRUE;
static int gBatVoltage = BATT_NOMAL_VOL_VALUE;
int gBatMaxVol = 4300;
#else
-int gBatMaxVol = 4300;
-int gBatZeroVol = 3400;
+int gBatMaxVol = 4200;
+int gBatZeroVol = 3350;
#endif
#define TIMER_MS_COUNTS 50 //¶¨Ê±Æ÷µÄ³¤¶Èms
#define SLOPE_SECOND_COUNTS 60 //ͳ¼ÆµçѹбÂʵÄʱ¼ä¼ä¸ôs
#define TIME_UPDATE_STATUS 3000 //¸üеç³Ø״̬µÄʱ¼ä¼ä¸ôms
-#define THRESHOLD_VOLTAGE_HIGH 3900
-#define THRESHOLD_VOLTAGE_MID 3550
+#define THRESHOLD_VOLTAGE_HIGH 3850
+#define THRESHOLD_VOLTAGE_MID 3450
#define THRESHOLD_VOLTAGE_LOW gBatZeroVol
#define THRESHOLD_SLOPE_HIGH 8 //ÕæʵбÂÊÖµ
#define THRESHOLD_SLOPE_MID 3
#define THRESHOLD_SLOPE_LOW 0
/*************************************************************/
-#define LODER_HIGH_LEVEL 0 //¸ººÉ״̬µÈ¼¶
-#define LODER_MID_LEVEL 1
-#define LODER_LOW_LEVEL 2
+#define LODER_CHARGE_LEVEL 0 //¸ººÉ״̬µÈ¼¶
+#define LODER_HIGH_LEVEL 1
+#define LODER_MID_LEVEL 2
#define LOADER_RELEASE_LEVEL 3 //µç³Ø¼´½«ºÄ¾¡×´Ì¬
#define SLOPE_HIGH_LEVEL 0 //µçѹ±ä»¯Ð±Âʵȼ¶
#define NUM_VOLTAGE_SAMPLE ((1000*SLOPE_SECOND_COUNTS) / TIMER_MS_COUNTS) //´æ´¢µÄ²ÉÑùµã¸öÊý
int gBatVoltageSamples[NUM_VOLTAGE_SAMPLE];
int gBatSlopeValue = 0;
-int gBatVoltageValue[2];
+int gBatVoltageValue[2]={0,0};
int *pSamples = &gBatVoltageSamples[0]; //²ÉÑùµãÖ¸Õë
-int gFlagLoop = 0; //Ñ»·±êÖ¾
+int gFlagLoop = 0; //²ÉÑù×ã¹»±êÖ¾
int gNumSamples = 0;
int gBatSlopeLevel = SLOPE_LOW_LEVEL;
int gBatVoltageLevel = VOLTAGE_MID_LEVEL;
+int gBatLastLoaderLevel = LODER_MID_LEVEL;
int gBatLoaderLevel = LODER_MID_LEVEL;
int i,*pSamp,*pStart = &gBatVoltageSamples[0];
int temp[2] = {0,0};
value = gAdcValue[CHN_BAT_ADC];
- gBatVoltage = (value * 5000)>>10; // 3.3v to 5v
+ gBatVoltage = (value * 1422 * 2)/gAdcValue[3]; // channel 3 is about 1.42v,need modified
*pSamples = gBatVoltage;
if((++pSamples - pStart) > NUM_VOLTAGE_SAMPLE)
{
}
gBatVoltageValue[1] = temp[1] / (NUM_VOLTAGE_SAMPLE >> 1);
- //DBG("gBatVoltageValue[0]=%d,gBatVoltageValue[1]=%d\n",gBatVoltageValue[0],gBatVoltageValue[1]);
gBatSlopeValue = gBatVoltageValue[0] - gBatVoltageValue[1];
-
+ //DBG("gBatSlopeValue=%d,gBatVoltageValue[1]=%d\n",gBatSlopeValue,gBatVoltageValue[1]);
if(gBatSlopeValue >= 0) //Óõç״̬
{
else //³äµç״̬
{
//to do
+ gBatLoaderLevel = LODER_CHARGE_LEVEL;
}
}
static void rk2818_get_bat_capacity(struct rk2818_battery_data *bat)
{
if(gFlagLoop)
- gBatCapacity = ((gBatVoltageValue[1] - bat->bat_min) * 100) / (bat->bat_max - bat->bat_min);
+ {
+ //³öÏÖ¸ºÔرäСʱÈÝÁ¿±ä´óµÄÇé¿öʱ£¬²»¸üÐÂÈÝÁ¿Öµ
+ if((gBatLastCapacity ==0) \
+ || (gBatLoaderLevel <= gBatLastLoaderLevel) \
+ || ((gBatLoaderLevel > gBatLastLoaderLevel)&&(gBatCapacity <= gBatLastCapacity)))
+ {
+ gBatCapacity = ((gBatVoltageValue[1] - bat->bat_min) * 100) / (bat->bat_max - bat->bat_min);
+ gBatLastCapacity = gBatCapacity;
+ gBatLastLoaderLevel = gBatLoaderLevel;
+ }
+
+ }
else
- gBatCapacity = ((gBatVoltage - bat->bat_min) * 100) / (bat->bat_max - bat->bat_min);
+ {
+ gBatCapacity = ((gBatVoltage - bat->bat_min) * 100) / (bat->bat_max - bat->bat_min);
+ }
}
if(++gNumSamples > TIME_UPDATE_STATUS/TIMER_MS_COUNTS)
{
gNumSamples = 0;
- if(gBatSlopeValue != 0) //if voltage has changed
+ if(gBatVoltage != 0) //update battery parameter after adc
{
power_supply_changed(&gBatteryData->battery);
DBG("voltage has changed\n");
switch (psp) {
case POWER_SUPPLY_PROP_STATUS:
val->intval = gBatStatus;
- DBG("gBatStatus=0x%x\n",val->intval);
+ DBG("gBatStatus=%d\n",val->intval);
break;
case POWER_SUPPLY_PROP_HEALTH:
val->intval = gBatHealth;
- DBG("gBatHealth=0x%x\n",val->intval);
+ DBG("gBatHealth=%d\n",val->intval);
break;
case POWER_SUPPLY_PROP_PRESENT:
val->intval = gBatPresent;
- DBG("gBatPresent=0x%x\n",val->intval);
+ DBG("gBatPresent=%d\n",val->intval);
break;
case POWER_SUPPLY_PROP_VOLTAGE_NOW:
+ if(gBatVoltageValue[1] == 0)
val ->intval = gBatVoltage;
- DBG("gBatVoltage=0x%x\n",val->intval);
+ else
+ val ->intval = gBatVoltageValue[1];
+ DBG("gBatVoltage=%d\n",val->intval);
break;
case POWER_SUPPLY_PROP_TECHNOLOGY:
val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
break;
case POWER_SUPPLY_PROP_CAPACITY:
+ if(gBatLastCapacity == 0)
val->intval = gBatCapacity;
+ else
+ val->intval = gBatLastCapacity;
DBG("gBatCapacity=%d%\n",val->intval);
break;
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
gBatteryData = data;
setup_timer(&data->timer, rk2818_batscan_timer, (unsigned long)data);
- data->timer.expires = jiffies+50;
+ data->timer.expires = jiffies+500;
add_timer(&data->timer);
printk(KERN_INFO "rk2818_battery: driver initialized\n");