Ejemplo n.º 1
0
static void rk2918_get_bat_status(struct rk2918_battery_data *bat)
{
	static int stable = 0;
	
  	rk2918_get_charge_status(); 
	if((gBatChargeStatus == 1))
	{
        if (gBatteryData->charge_ok_pin == INVALID_GPIO)
        {
            printk("dc_det_pin invalid!\n");
            return;
        }
    
			if (gBatStatus == POWER_SUPPLY_STATUS_FULL)
			{
				return;
			}
	    if ((gpio_get_value(gBatteryData->charge_ok_pin) == gBatteryData->charge_ok_level) && (gBatCapacity >= 80))
        {
			gBatteryData->full_times++;
			stable = 0;
            if (gBatteryData->full_times >= NUM_CHARGE_FULL_DELAY_TIMES)
		    {
				gBatStatus = POWER_SUPPLY_STATUS_FULL;
				gBatStatusBack=POWER_SUPPLY_STATUS_FULL;
		        gBatteryData->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
		    }
		    else
		    {
		        gBatStatus = POWER_SUPPLY_STATUS_CHARGING;
		    }
	    }
	    else
	    {
				if (gBatteryData->full_times>0)
				{
	
					stable++;
					if(stable >= NUM_STABLE_SAMPLE)
					{
						stable = 0;
						gBatteryData->full_times = 0;
					
					}
	
				}
	    	    gBatStatus = POWER_SUPPLY_STATUS_CHARGING;			
	        
		}
	}
	else 
    	{
    	stable = 0;	
	    gBatteryData->full_times = 0;
        gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING;
	}
}
static void rk2918_get_bat_status(struct rk2918_battery_data *bat)
{
	
	dprint("func=%s, line=%d :\n", __func__, __LINE__);
	
    rk2918_get_charge_status();
    
	if(gBatChargeStatus == 1)
	{
        if (gBatteryData->charge_ok_pin == INVALID_GPIO)
        {
            printk("dc_det_pin invalid!\n");
            return;
        }
    
		if (gBatStatus == POWER_SUPPLY_STATUS_FULL)
		{
			return;
		}
	    if ((gpio_get_value(gBatteryData->charge_ok_pin) == gBatteryData->charge_ok_level) && (gBatCapacity >= 80))
        {
            gBatteryData->full_times++;
            if (gBatteryData->full_times >= NUM_CHARGE_FULL_DELAY_TIMES)
		    {
		        gBatStatus = POWER_SUPPLY_STATUS_FULL;
		        gBatteryData->full_times = NUM_CHARGE_FULL_DELAY_TIMES + 1;
		    }
		    else
		    {
		        gBatStatus = POWER_SUPPLY_STATUS_CHARGING;
		    }
	    }
	    else
	    {
	        gBatStatus = POWER_SUPPLY_STATUS_CHARGING;
	        gBatteryData->full_times = 0;
	    }
	}
	else 
    {
	    gBatteryData->full_times = 0;
        gBatStatus = POWER_SUPPLY_STATUS_NOT_CHARGING;
	}
}
Ejemplo n.º 3
0
static void rk2918_low_battery_check(void)
{
    int i;
    int tmp = 0;
    
    for (i = 0; i < 100; i++)
    {
        tmp += adc_sync_read(gBatteryData->client);
        mdelay(1);
    }
    tmp = tmp / 100;
    //gBatteryData->adc_val = tmp;
    //gBatVoltage = (tmp * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R);
    //rk2918_get_charge_status();
    //gBatCapacity = rk2918_get_bat_capacity_raw(gBatVoltage);
    rk2918_get_charge_status();
    tmp = (tmp * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R);
	if(RK29_ADC_CLI_ADD)
		tmp += RK29_ADC_CLI_VALUE;
	else
		tmp -= RK29_ADC_CLI_VALUE;
    gBatCapacity = rk2918_get_bat_capacity_raw(tmp);
    if (gBatCapacity == 0) gBatCapacity = 1;
    printk("rk2918_low_battery_check: gBatVoltage = %d, gBatCapacity = %d\n", gBatVoltage, gBatCapacity);
    
    if (gBatVoltage <= BATT_ZERO_VOL_VALUE + 50)
    {
        printk("low battery: powerdown\n");
        gpio_direction_output(POWER_ON_PIN, GPIO_LOW);
        tmp = 0;
        while(1)
        {
            if(gpio_get_value(POWER_ON_PIN) == GPIO_HIGH)
		    {
			    gpio_set_value(POWER_ON_PIN,GPIO_LOW);
		    }
		    mdelay(5);
		    if (++tmp > 50) break;
		}
    }
    gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
}