/* 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; } }
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; } } } /****************************************************/ }