#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
#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 //²¨¶¯×´Ì¬
#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;
{
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)
#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();
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)
{
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: