/* ADC Voltage sample function.
 *
 */
int AdcTestvalue = 0;
static int *pSamples; /**< Pointer to current sample memory for ADC */
static void rk29_adc_battery_voltage_samples(struct rk29_adc_battery_data *bat)
{
	struct rk29_adc_battery_platform_data *pdata = bat->pdata;
	int value;
	int i, *pStart = bat->adc_samples, num = 0;

	value = bat->adc_val;
	AdcTestvalue = value;
	adc_async_read(bat->client);

	/* Calculate mV from ADC value */
	bat->bat_voltageNow = ((value * pdata->adc_vref * (pdata->adc_rset_high + pdata->adc_rset_low)) / (ADC_RESOLUTION * pdata->adc_rset_low));

	/* Limit battery voltage */
	if (bat->bat_voltageNow >= pdata->adc_bat_levels[BATT_MAX_VOL_IDX] + 300)
		bat->bat_voltageNow = pdata->adc_bat_levels[BATT_MAX_VOL_IDX] + 300;

	/* Add value to averaging ring buffer */
	*pSamples++ = bat->bat_voltageNow;

	/* Slow down status changes by counting... */
	bat->bat_status_cnt++;
	if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)
		bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;

	num = pSamples - pStart;
	if (num >= NUM_VOLTAGE_SAMPLE)
	{
		pSamples = pStart;
		num = NUM_VOLTAGE_SAMPLE;
	}

	value = 0;
	for (i = 0; i < NUM_VOLTAGE_SAMPLE; i++)
	{
		if (bat->adc_samples[i]) {
			/* this ensures that on startup only valid samples are
			 * taken for averaging.
			 */
			value += bat->adc_samples[i];
		}
	}
	bat->bat_voltageAvg = value / i;

	if (num == 1)
	{
		/* Preset min/max memories */
		bat->bat_voltageMax = bat->bat_voltageNow;
		bat->bat_voltageMin = bat->bat_voltageNow;
	}
	else
	{
		/* track min/max values... we could detect battery health from this. */
		if (bat->bat_voltageNow > bat->bat_voltageMax)
			bat->bat_voltageMax = bat->bat_voltageNow;
		else if (bat->bat_voltageNow < bat->bat_voltageMin)
			bat->bat_voltageMin = bat->bat_voltageNow;
	}

}
static void adc_timer_work(struct work_struct *work)
{	
	int sync_read = 0;
	struct adc_test_data *test = container_of(work, struct adc_test_data,
						timer_work);
	adc_async_read(test->client);
	sync_read = adc_sync_read(test->client);
	dev_info(test->client->adc->dev, "[chn%d] sync_read = %d\n", 0, sync_read);
}
//3
static void hook_timer_callback(unsigned long arg)
{
	struct headset_priv *headset = (struct headset_priv *)(arg);
//	DBG("hook_timer_callback\n");
	if(headset->headset_status == HEADSET_OUT
		|| headset->heatset_irq_working == BUSY
		|| headset->heatset_irq_working == WAIT)
		return;
	adc_async_read(headset->client);
	mod_timer(&headset->hook_timer, jiffies + msecs_to_jiffies(headset->hook_time));
}
static inline void timer_callback(unsigned long data)
{
	int ret;
	unsigned int rate;
	adc_async_read(lightsensor->client);
	mutex_lock(&lightsensor->lsr_mutex);
	rate = lightsensor->rate;
	mutex_unlock(&lightsensor->lsr_mutex);
	if(lightsensor->client->result != lightsensor->oldresult)
		{
			lsr_report_value(lightsensor->input_dev, lightsensor->client->result);
			lightsensor->oldresult = lightsensor->client->result;
		}
	ret = mod_timer( &lightsensor->timer, jiffies + msecs_to_jiffies(RATE(rate)));
	if(ret)
		printk("Error in mod_timer\n");
}
static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
{
	int value;
	int i,*pStart = bat->adc_samples, num = 0;
	int level = rk30_adc_battery_get_charge_level(bat);


	value = bat->adc_val;
	adc_async_read(bat->client);

	*pSamples++ = adc_to_voltage(value);

	bat->bat_status_cnt++;
	if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)  bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;

	num = pSamples - pStart;
	
	if (num >= NUM_VOLTAGE_SAMPLE){
		pSamples = pStart;
		num = NUM_VOLTAGE_SAMPLE;
		
	}

	value = 0;
	for (i = 0; i < num; i++){
		value += bat->adc_samples[i];
	}
	bat->bat_voltage = value / num;

	/* Check limits */
	if(1 == level){
		if(bat->bat_voltage >= batt_table[BATT_NUM-1].charge_vol + 10)
			bat->bat_voltage = batt_table[BATT_NUM-1].charge_vol + 10;
		else if(bat->bat_voltage <= batt_table[0].charge_vol - 10)
			bat->bat_voltage = batt_table[0].charge_vol - 10;
	}
	else{
		if(bat->bat_voltage >= batt_table[BATT_NUM-1].dis_charge_vol + 10)
			bat->bat_voltage = batt_table[BATT_NUM-1].dis_charge_vol + 10;
		else if(bat->bat_voltage <= batt_table[0].dis_charge_vol  - 10)
			bat->bat_voltage = batt_table[0].dis_charge_vol - 10;

	}

}
Exemple #6
0
static void rk2918_get_bat_voltage(struct rk2918_battery_data *bat)
{
	int value;
	int i,*pStart = &gBatVoltageSamples[0],num = 0;
	int temp[2] = {0,0};
	
	value = gBatteryData->adc_val;
	AdcTestvalue = value;
    adc_async_read(gBatteryData->client);
	if(RK29_ADC_CLI_ADD)
		*pSamples++ = (value * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R) + RK29_ADC_CLI_VALUE;
	else
		*pSamples++ = (value * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R) - RK29_ADC_CLI_VALUE;
	//*pSamples++ = (value * BAT_2V5_VALUE * (BAT_PULL_UP_R + BAT_PULL_DOWN_R)) / (1024 * BAT_PULL_DOWN_R);
	num = pSamples - pStart;
	if (num >= NUM_VOLTAGE_SAMPLE)
	{
	    pSamples = pStart;
	    gFlagLoop = 1;
	}
	if (gFlagLoop == 1)
	{
	    num = NUM_VOLTAGE_SAMPLE;
	}
	value = 0;
	for (i = 0; i < num; i++)
	{
	    value += gBatVoltageSamples[i];
	}
	gBatVoltage = value / num;
	//gBatVoltage = (value * BAT_2V5_VALUE * 2) / 1024;
	
	/*消除毛刺电压*/
	if(gBatVoltage >= BATT_MAX_VOL_VALUE + 10)
		gBatVoltage = BATT_MAX_VOL_VALUE + 10;
	else if(gBatVoltage <= BATT_ZERO_VOL_VALUE - 10)
		gBatVoltage = BATT_ZERO_VOL_VALUE - 10;

    //充放电状态变化时,开始计数	
	if (++gBatStatusChangeCnt > NUM_VOLTAGE_SAMPLE)  
	    gBatStatusChangeCnt = NUM_VOLTAGE_SAMPLE + 1;
}
static void rk29_adc_battery_voltage_samples(struct rk29_adc_battery_data *bat)
{
	int value;
	int i,*pStart = bat->adc_samples, num = 0;
	
	value = bat->adc_val;
	AdcTestvalue = value;
    adc_async_read(bat->client);
    
	*pSamples++ = adc_to_voltage(value);
	
	bat->bat_status_cnt++;
	if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)  bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;
	
	num = pSamples - pStart;
	if (num >= NUM_VOLTAGE_SAMPLE)
	{
	    pSamples = pStart;
	    gFlagLoop = 1;
	}
	if (gFlagLoop == 1)
	{
	    num = NUM_VOLTAGE_SAMPLE;
	}
	value = 0;
	for (i = 0; i < num; i++)
	{
	    value += bat->adc_samples[i];
	}
	bat->bat_voltage = value / num;
	
	/*消除毛刺电压*/
	if(bat->bat_voltage >= BATT_MAX_VOL_VALUE + 10)
		bat->bat_voltage = BATT_MAX_VOL_VALUE + 10;
	else if(bat->bat_voltage <= BATT_ZERO_VOL_VALUE - 10)
		bat->bat_voltage = BATT_ZERO_VOL_VALUE - 10;
}
static void rk30_adc_battery_voltage_samples(struct rk30_adc_battery_data *bat)
{
	int value;
	int i,*pStart = bat->adc_samples, num = 0;
	int level = rk30_adc_battery_get_charge_level(bat);


	value = bat->adc_val;
	adc_async_read(bat->client);

	*pSamples++ = adc_to_voltage(value);

	bat->bat_status_cnt++;
	if (bat->bat_status_cnt > NUM_VOLTAGE_SAMPLE)  bat->bat_status_cnt = NUM_VOLTAGE_SAMPLE + 1;

	num = pSamples - pStart;
	
	if (num >= NUM_VOLTAGE_SAMPLE){
		pSamples = pStart;
		num = NUM_VOLTAGE_SAMPLE;
		
	}

	value = 0;
	for (i = 0; i < num; i++){
		value += bat->adc_samples[i];
	}
	bat->bat_voltage = value / num;

	/*消除毛刺电压*/
if(battery_test_flag == 0)
{
	if(1 == level){
		if(bat->bat_voltage >= batt_table[2*BATT_NUM +5]+ 10)
			bat->bat_voltage = batt_table[2*BATT_NUM +5]  + 10;
		else if(bat->bat_voltage <= batt_table[BATT_NUM +6]  - 10)
			bat->bat_voltage =  batt_table[BATT_NUM +6] - 10;
	}
	else{
		if(bat->bat_voltage >= batt_table[BATT_NUM +5]+ 10)
			bat->bat_voltage = batt_table[BATT_NUM +5]  + 10;
		else if(bat->bat_voltage <= batt_table[6]  - 10)
			bat->bat_voltage =  batt_table[6] - 10;

	}
}else if(battery_test_flag == 2)
/**************************************************/
	{
		if(batt_table[3] == 0)
		{
			if(bat->bat_voltage < 3400)
			{
				//printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
				if((get_seconds() - gSecondsCnt) > 30)
				{
					gSecondsCnt = get_seconds();
					//printk("gSecondsCnt=%ld,gVoltageCnt=%d,(gVoltageCnt - bat->bat_voltage)=%d,bat->bat_voltage=%d-------------------2\n",gSecondsCnt,gVoltageCnt,(gVoltageCnt - bat->bat_voltage),bat->bat_voltage);
					if((gVoltageCnt - bat->bat_voltage) > 15)
					{
						//gVoltageCnt = bat->bat_voltage;
						//printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
						strncpy(gDischargeFlag, "off" ,3);	
					}
					gVoltageCnt = bat->bat_voltage;

				}
			}
			
			if(bat->bat_voltage < 3400)
			{
				bat->bat_voltage = 3400;
			}
		}
		else
		{
			if(bat->bat_voltage < 6800)
			{
				//printk("gSecondsCnt=%ld,get_seconds()=%ld,(get_seconds() - gSecondsCnt)=%ld-------------------1\n",gSecondsCnt,get_seconds(),(get_seconds() - gSecondsCnt));
				if((get_seconds() - gSecondsCnt) > 30)
				{
					gSecondsCnt = get_seconds();
					//printk("gSecondsCnt=%ld,gVoltageCnt=%d,(gVoltageCnt - bat->bat_voltage)=%d,bat->bat_voltage=%d-------------------2\n",gSecondsCnt,gVoltageCnt,(gVoltageCnt - bat->bat_voltage),bat->bat_voltage);
					if((gDoubleVoltageCnt - bat->bat_voltage) > 30)
					{
						//gVoltageCnt = bat->bat_voltage;
						//printk("gVoltageCnt=%d-------------------3\n",gVoltageCnt);
						strncpy(gDischargeFlag, "off" ,3);	
					}
					gDoubleVoltageCnt =bat->bat_voltage;
				}
			}
			if(bat->bat_voltage < 6800)
			{
				bat->bat_voltage = 6800;
			}	
		}
	}
/****************************************************/
}