static void rk29_adc_battery_capacity_samples(struct rk29_adc_battery_data *bat)
{
	int capacity = 0;

	/* First collect minimum number of samples needed for
	 * calculation of mean value
	 */
	if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE)
	{
		gBatCapacityDisChargeCnt = 0;
		gBatCapacityChargeCnt = 0;
		return;
	}

	/* calculate capacity currently available in battery. */
	capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltageAvg);

	if (rk29_adc_battery_get_charge_level(bat))
	{
		/* This is executed if the battery is charging... */
		rk29_adc_bat_capacity_charge(bat, capacity);
	}
	else
	{
		/* Battery is discharging */
		rk29_adc_bat_capacity_discharge(bat, capacity);
	}

	/* save current capacity for comparisions in next run */
	capacitytmp = capacity;
}
static void rk29_adc_battery_lowpower_check(struct rk29_adc_battery_data *bat)
{
	int i;
	int level, oldlevel;
	struct rk29_adc_battery_platform_data *pdata = bat->pdata;

	printk("%s--%d:\n", __FUNCTION__, __LINE__);

	old_charge_level = -1;
	pSamples = bat->adc_samples;

	adc_sync_read(bat->client); //start adc sample
	level = oldlevel = rk29_adc_battery_status_samples(bat); //init charge status

	/* Fill sample buffer with values */
	bat->full_times = 0;
	for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++) //0.3 s
	{
		mdelay(1);
		rk29_adc_battery_voltage_samples(bat); //get voltage
		//level = rk29_adc_battery_status_samples(bat);       //check charge status
		level = rk29_adc_battery_get_charge_level(bat);
		if (oldlevel != level)
		{
			oldlevel = level; //if charge status changed, reset sample
			i = 0;
		}
	}

	bat->bat_capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltageAvg);

	bat->bat_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
	if (rk29_adc_battery_get_charge_level(bat))
	{
		bat->bat_status = POWER_SUPPLY_STATUS_CHARGING;
		if (pdata->charge_ok_pin != INVALID_GPIO)
		{
			if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level)
			{
				bat->bat_status = POWER_SUPPLY_STATUS_FULL;
				bat->bat_capacity = 100;
			}
		}
	}

#if 0
	rk29_adc_battery_poweron_capacity_check();
#else
	poweron_check = 1;
#endif

	/* Immediate power off for battery protection */
	if (bat->bat_voltageAvg <= (pdata->adc_bat_levels[BATT_ZERO_VOL_IDX] + 50))
	{
		printk("%umV -> low battery: powerdown (%u)\n", bat->bat_voltageAvg, pdata->adc_bat_levels[BATT_ZERO_VOL_IDX]+50);
		system_state = SYSTEM_POWER_OFF;
		pm_power_off();
	}
}
/** Wakeup after power management standby.
 *
 * This function needs to fill the measurement buffer first
 * before the normal way of operation can be continued.
 */
static void rk29_adc_battery_resume_check(struct work_struct *work)
{
	int i;
	int level,oldlevel;
	int new_capacity, old_capacity;
	struct rk29_adc_battery_data *bat = gBatteryData;

	old_charge_level = -1;
	pSamples = bat->adc_samples;

	adc_sync_read(bat->client); //start adc sample
	level = oldlevel = rk29_adc_battery_status_samples(bat);//init charge status

	for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++)	// 300 samples per s
	{
		mdelay(1);
		rk29_adc_battery_voltage_samples(bat); //get voltage
		level = rk29_adc_battery_status_samples(bat);//check charge status
		if (oldlevel != level)
		{
			oldlevel = level; //if charge status changed, reset sample
			i = 0;
		}
	}
	new_capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltageAvg);
	old_capacity = suspend_capacity;

#if 0
	if (bat->bat_status != POWER_SUPPLY_STATUS_NOT_CHARGING)
	{
		//chargeing state
		bat->bat_capacity = (new_capacity > old_capacity) ? new_capacity : old_capacity;
	}
	else
	{
		bat->bat_capacity = (new_capacity < old_capacity) ? new_capacity : old_capacity;
	}
#else
	bat->bat_capacity = new_capacity;
#endif
	printk("rk29_adc_battery_resume: status = %d, voltage = %d, capacity = %d, new_capacity = %d, old_capacity = %d\n",
			bat->bat_status, bat->bat_voltageNow, bat->bat_capacity, new_capacity, old_capacity);

	//start timer scan
	schedule_work(&bat->timer_work);
	bat->timer.expires = jiffies + 10;
	add_timer(&bat->timer);
}
//static int rk29_adc_battery_get_capacity_ext(int BatVoltage)
static void rk29_adc_battery_capacity_samples(struct rk29_adc_battery_data *bat)
{
	int capacity = 0;
	struct rk29_adc_battery_platform_data *pdata = bat->pdata;
	
    //充放电状态变化后,Buffer填满之前,不更新
	if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE)  
	{
	    gBatCapacityDisChargeCnt = 0;
	    gBatCapacityChargeCnt    = 0;
	    return;
	}
	
    capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
	    
    if (rk29_adc_battery_get_charge_level(bat))
    {
        if (capacity > bat->bat_capacity)
        {
            //实际采样到的电压比显示的电压大,逐级上升
            if (++gBatCapacityDisChargeCnt >= NUM_CHARGE_MIN_SAMPLE)
            {
                gBatCapacityDisChargeCnt = 0;
                if (bat->bat_capacity < 99)
                {
                    bat->bat_capacity++;
                    bat->bat_change  = 1;
                }
            }
            gBatCapacityChargeCnt = 0;
        }
        else
        {
            gBatCapacityDisChargeCnt = 0;
            gBatCapacityChargeCnt++;
            
            if (pdata->charge_ok_pin != INVALID_GPIO)
            {
                if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level)
                {
                    //检测到电池充满标志,同时长时间内充电电压无变化,开始启动计时充电,快速上升容量
                    if (gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE)
                    {
                        gBatCapacityChargeCnt = 0;
                        if (bat->bat_capacity < 99)
                        {
                            bat->bat_capacity++;
                            bat->bat_change  = 1;
                        }
                    }
                }
                else
                {
                    if (capacity > capacitytmp)
                    {
                        //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快
                        gBatCapacityChargeCnt = 0;
                    }
                    if (/*(bat->bat_capacity >= 80) && */(gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE))
                    {
                        gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
                        if (bat->bat_capacity < 99)
                        {
                            bat->bat_capacity++;
                            bat->bat_change  = 1;
                        }
                    }
                }
            }
            else
            {
                //没有充电满检测脚,长时间内电压无变化,定时器模拟充电
                if (capacity > capacitytmp)
                {
                    //过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快
                    gBatCapacityChargeCnt = 0;
                }
                if (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)
                {
                    gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);
                    if (bat->bat_capacity < 100)
                    {
                        bat->bat_capacity++;
                        bat->bat_change  = 1;
                    }
                }
            }            
        }
    }    
    else
    {   
        //放电时,只允许电压下降
        if (capacity < bat->bat_capacity)
        {
            if (++gBatCapacityDisChargeCnt >= NUM_DISCHARGE_MIN_SAMPLE)
            {
                gBatCapacityDisChargeCnt = 0;
                if (bat->bat_capacity > 0)
                {
                    bat->bat_capacity-- ;
                    bat->bat_change  = 1;
                }
            }
        }
        else
        {
            gBatCapacityDisChargeCnt = 0;
        }
        
        gBatCapacityChargeCnt = 0;
    }
	capacitytmp = capacity;
}
static void rk29_adc_battery_capacity_samples(struct rk29_adc_battery_data *bat)
{
	int capacity = 0;
	struct rk29_adc_battery_platform_data *pdata = bat->pdata;

	//充放电状态变化后,Buffer填满之前,不更新
	if (bat->bat_status_cnt < NUM_VOLTAGE_SAMPLE)  {
		bat->gBatCapacityDisChargeCnt = 0;
		bat->gBatCapacityChargeCnt    = 0;
		return;
	}
	
	capacity = rk29_adc_battery_voltage_to_capacity(bat, bat->bat_voltage);
	    
	if (rk29_adc_battery_get_charge_level(bat)){
		if (capacity > bat->bat_capacity){
			//实际采样到的容量比显示的容量大,逐级上升
			if (++(bat->gBatCapacityDisChargeCnt) >= NUM_CHARGE_MIN_SAMPLE){
				bat->gBatCapacityDisChargeCnt  = 0;
				if (bat->bat_capacity < 99){
					bat->bat_capacity++;
					bat->bat_change  = 1;
				}
			}
			bat->gBatCapacityChargeCnt = 0;
		}
		else{  //   实际的容量比采样比 显示的容量小
		            bat->gBatCapacityDisChargeCnt = 0;
		            (bat->gBatCapacityChargeCnt)++;
            
			if (pdata->charge_ok_pin != INVALID_GPIO){
				if (gpio_get_value(pdata->charge_ok_pin) == pdata->charge_ok_level){
				//检测到电池充满标志,同时长时间内充电电压无变化,开始启动计时充电,快速上升容量
					if (bat->gBatCapacityChargeCnt >= NUM_CHARGE_MIN_SAMPLE){
						bat->gBatCapacityChargeCnt = 0;
						if (bat->bat_capacity < 99){
							bat->bat_capacity++;
							bat->bat_change  = 1;
						}
					}
				}
				else{
#if 0					
					if (capacity > capacitytmp){
					//过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快
						gBatCapacityChargeCnt = 0;
					}
					else if (/*bat->bat_capacity >= 85) &&*/ (gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
						gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);

						if (bat->bat_capacity < 99){
						bat->bat_capacity++;
						bat->bat_change  = 1;
						}
					}
				}
#else			//  防止电池老化后出现冲不满的情况,
					if (capacity > bat->capacitytmp){
					//过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快
						bat->gBatCapacityChargeCnt = 0;
					}
					else{

						if ((bat->bat_capacity >= 85) &&((bat->gBatCapacityChargeCnt) > NUM_CHARGE_MAX_SAMPLE)){
							bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);

							if (bat->bat_capacity < 99){
								bat->bat_capacity++;
								bat->bat_change  = 1;
							}
						}
					}
				}
#endif

			}
			else{
			//没有充电满检测脚,长时间内电压无变化,定时器模拟充电
				if (capacity > bat->capacitytmp){
				//过程中如果电压有增长,定时器复位,防止定时器模拟充电比实际充电快
					bat->gBatCapacityChargeCnt = 0;
				}
				else{

					if ((bat->bat_capacity >= 85) &&(bat->gBatCapacityChargeCnt > NUM_CHARGE_MAX_SAMPLE)){
						bat->gBatCapacityChargeCnt = (NUM_CHARGE_MAX_SAMPLE - NUM_CHARGE_MID_SAMPLE);

						if (bat->bat_capacity < 99){
							bat->bat_capacity++;
							bat->bat_change  = 1;
						}
					}
				}
				

			}            
		}