modify how to monitor whether charge is full
authorroot <root@nzy.(none)>
Fri, 24 Sep 2010 03:31:47 +0000 (11:31 +0800)
committerroot <root@nzy.(none)>
Fri, 24 Sep 2010 03:31:47 +0000 (11:31 +0800)
arch/arm/mach-rk2818/board-raho.c
drivers/power/rk2818_battery.c

index 09c6b404ebe04dcd0cbc0d766e095783b981ade1..7920817f9ed1a6abc1b35e8d516ea097ff7987c2 100755 (executable)
@@ -1127,7 +1127,7 @@ struct platform_device rk2818_soc_camera_pdrv = {
  * battery  devices
  * author: lw@rock-chips.com
  *****************************************************************************************/
-#define CHARGEOK_PIN   SPI_GPIO_P6_06//RK2818_PIN_PB1
+#define CHARGEOK_PIN   FPGA_PIO0_06
 struct rk2818_battery_platform_data rk2818_battery_platdata = {
        .charge_ok_pin = CHARGEOK_PIN,
        .charge_ok_level = 0,
index 0faea03ac422762366feafaeb7d32906466d84eb..df151d1f4c7af6ca7508e65cb69c37ad3f1631a3 100755 (executable)
@@ -40,7 +40,7 @@
 #define        SLOPE_SECOND_COUNTS     120             //ͳ¼ÆµçѹбÂʵÄʱ¼ä¼ä¸ôs
 #define        TIME_UPDATE_STATUS      5000    //¸üеç³Ø״̬µÄʱ¼ä¼ä¸ôms
 #define BATT_MAX_VOL_VALUE     4180    //ÂúµçʱµÄµç³Øµçѹ       FOR A7
-#define        BATT_ZERO_VOL_VALUE  3400       //¹Ø»úʱµÄµç³Øµçѹ
+#define        BATT_ZERO_VOL_VALUE  3500       //¹Ø»úʱµÄµç³Øµçѹ
 #define BATT_NOMAL_VOL_VALUE  3800
 #define THRESHOLD_VOLTAGE_LEVEL0          4050
 #define THRESHOLD_VOLTAGE_LEVEL1          3950
@@ -56,7 +56,7 @@
 #define BATT_LEVEL_EMPTY       0
 #define BATT_PRESENT_TRUE       1
 #define BATT_PRESENT_FALSE  0
-#define BAT_1V2_VALUE  1330
+#define BAT_1V2_VALUE  1270
 
 #define BAT_LOADER_STATUS              0       //Óõç״̬
 #define BAT_CHANGE_STATUS              1       //²¨¶¯×´Ì¬
@@ -74,6 +74,8 @@
 
 #define        NUM_VOLTAGE_SAMPLE      ((1000*SLOPE_SECOND_COUNTS) / TIMER_MS_COUNTS)  //´æ´¢µÄ²ÉÑùµã¸öÊý
 
+static int gBatFullFlag =  0;
+
 static int gBatLastStatus = 0;
 static int gBatStatus =  POWER_SUPPLY_STATUS_UNKNOWN;
 static int gBatHealth = POWER_SUPPLY_HEALTH_GOOD;
@@ -148,49 +150,52 @@ static int rk2818_get_charge_status(void)
 {
  struct regulator * rdev = pChargeregulator;
        //DBG("gAdcValue[CHN_USB_ADC]=%d\n",gAdcValue[CHN_USB_ADC]);
-       if(gAdcValue[CHN_USB_ADC] > 250)        //about 0.5V
-               {
-               return 1;
-               }
-       else if((1 == dwc_vbus_status())&& (0 == get_msc_connect_flag()))
-               {
-                 if(gVbuscharge !=1)
-{
-     if(rdev== pChargeregulator )
-                       regulator_set_current_limit(rdev,0,1200000);
-}
-                  gVbuscharge = 1;
-               return 1;
-               }
-       else
-               {
-               if(gVbuscharge !=0 )
-{
-     if(rdev== pChargeregulator )
-                       regulator_set_current_limit(rdev,0,475000);             
-}
-                gVbuscharge = 0;
-               
-               return 0;
-               }
+    /*if(gAdcValue[CHN_USB_ADC] > 250) 
+    {   //about 0.5V 
+        return 1;
+    } 
+    else */
+    if((1 == dwc_vbus_status())&& (0 == get_msc_connect_flag())) 
+    {
+        DBG("CHARGE!\n");
+        if(gVbuscharge !=1) {
+            if(rdev== pChargeregulator )
+                regulator_set_current_limit(rdev,0,1200000);
+        }
+        gVbuscharge = 1;
+        return 1;
+    } 
+    else 
+    {
+        DBG("NOT CHARGING!\n");
+        if(gVbuscharge !=0 ) {
+            if(rdev== pChargeregulator )
+            regulator_set_current_limit(rdev,0,475000);     
+        }
+        gVbuscharge = 0;
+        return 0;
+    }
+
 }
 
 static void rk2818_get_bat_status(struct rk2818_battery_data *bat)
 {
        if(rk2818_get_charge_status() == 1)
        {
-               /*
-               if(gpio_get_value (bat->charge_ok_pin) == bat->charge_ok_level)
-               {
-                       gBatStatus = POWER_SUPPLY_STATUS_FULL;
-                       DBG("Battery is Full!\n");
-               }
-               else
-               */      
-               gBatStatus = POWER_SUPPLY_STATUS_CHARGING;              
+           //local_irq_disable();
+           if (gBatFullFlag == 0) {
+            gBatStatus = POWER_SUPPLY_STATUS_CHARGING;
+           } else {
+            gBatStatus = POWER_SUPPLY_STATUS_FULL;
+           }
+           //local_irq_enable();
+        DBG("Battery is Charging!\n");
+       }
+       else {
+           gBatFullFlag = 0;
+        gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING;
+        DBG("Battery is Not Charging!\n");
        }
-       else
-       gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING;  
 }
 
 static void rk2818_get_bat_health(struct rk2818_battery_data *bat)
@@ -555,12 +560,23 @@ static int rk2818_battery_resume(struct platform_device *dev)
 #define rk2818_battery_resume NULL
 #endif
 
+static irqreturn_t rk2818_battery_interrupt(int irq, void *dev_id)
+{
+    if((1 == dwc_vbus_status())&& (0 == get_msc_connect_flag())) {//detech when charging
+        gBatFullFlag = 1;
+    }
+
+    DBG(KERN_INFO "-----battery is full-----\n");
+
+    return 0;
+}
 
 static int rk2818_battery_probe(struct platform_device *pdev)
 {
        int ret;
        struct rk2818_battery_data *data;
        struct rk2818_battery_platform_data *pdata = pdev->dev.platform_data;
+       int irq_flag;
 
        if (pdata && pdata->io_init) {
                ret = pdata->io_init();
@@ -614,7 +630,14 @@ static int rk2818_battery_probe(struct platform_device *pdev)
 
        data->charge_ok_pin = pdata->charge_ok_pin;
        data->charge_ok_level = pdata->charge_ok_level;
-       
+
+       irq_flag = (!pdata->charge_ok_level) ? IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING;
+       ret = request_irq(gpio_to_irq(pdata->charge_ok_pin), rk2818_battery_interrupt, irq_flag, "rk2818_battery", data);
+       if (ret) {
+               printk("failed to request irq\n");
+               goto err_irq_failed;
+       }
+
        ret = power_supply_register(&pdev->dev, &data->ac);
        if (ret)
        {
@@ -659,6 +682,8 @@ err_battery_failed:
 err_usb_failed:
        power_supply_unregister(&data->ac);
 err_ac_failed:
+       free_irq(gpio_to_irq(pdata->charge_ok_pin), data);
+err_irq_failed:
        kfree(data);
 err_data_alloc_failed: