From 73a044c33829a5ef13954084960911433ffd5ad5 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 24 Sep 2010 11:31:47 +0800 Subject: [PATCH] modify how to monitor whether charge is full --- arch/arm/mach-rk2818/board-raho.c | 2 +- drivers/power/rk2818_battery.c | 103 +++++++++++++++++++----------- 2 files changed, 65 insertions(+), 40 deletions(-) diff --git a/arch/arm/mach-rk2818/board-raho.c b/arch/arm/mach-rk2818/board-raho.c index 09c6b404ebe0..7920817f9ed1 100755 --- a/arch/arm/mach-rk2818/board-raho.c +++ b/arch/arm/mach-rk2818/board-raho.c @@ -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, diff --git a/drivers/power/rk2818_battery.c b/drivers/power/rk2818_battery.c index 0faea03ac422..df151d1f4c7a 100755 --- a/drivers/power/rk2818_battery.c +++ b/drivers/power/rk2818_battery.c @@ -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: -- 2.34.1