(no commit message)
author罗伟 <lw@rock-chips.com>
Mon, 24 May 2010 11:43:29 +0000 (11:43 +0000)
committer黄涛 <huangtao@rock-chips.com>
Mon, 21 Jun 2010 05:35:15 +0000 (13:35 +0800)
drivers/power/rk2818_battery.c

index 97b4bdb5c23fa42ef34d88a0db8824f65e6ab1da..b18cdcb07c55fd85cd200033004e231b45bfedfb 100644 (file)
 #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;
@@ -76,8 +77,8 @@ int gBatZeroVol       = BatMinVoltage[BAT_SELECT][ELECTRICITY_SELECT];
 int gBatMaxVol = 4300;
 
 #else
-int gBatMaxVol = 4300;
-int gBatZeroVol        = 3400;
+int gBatMaxVol = 4200;
+int gBatZeroVol        = 3350;
 
 #endif
 
@@ -85,17 +86,17 @@ int gBatZeroVol     = 3400;
 #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       //µçѹ±ä»¯Ð±Âʵȼ¶
@@ -110,13 +111,14 @@ int gBatZeroVol   = 3400;
 #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; 
 
 
@@ -190,7 +192,7 @@ static void rk2818_get_bat_voltage(struct rk2818_battery_data *bat)
        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)
        {
@@ -218,10 +220,9 @@ static void rk2818_get_bat_voltage(struct rk2818_battery_data *bat)
                }
                
                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) //Óõç״̬
                {
 
@@ -269,6 +270,7 @@ static void rk2818_get_bat_voltage(struct rk2818_battery_data *bat)
                else    //³äµç״̬
                {
                        //to do
+                       gBatLoaderLevel = LODER_CHARGE_LEVEL;
                }
                
        }
@@ -278,9 +280,22 @@ static void rk2818_get_bat_voltage(struct rk2818_battery_data *bat)
 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);
+       }
 }
 
 
@@ -297,7 +312,7 @@ static void rk2818_batscan_timer(unsigned long data)
        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");
@@ -366,25 +381,31 @@ static int rk2818_battery_get_property(struct power_supply *psy,
        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:
@@ -517,7 +538,7 @@ static int rk2818_battery_probe(struct platform_device *pdev)
        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");