static void gp2a_work_func_light(struct work_struct *work) { struct gp2a_data *data = container_of((struct delayed_work *)work, struct gp2a_data, light_work); int adc; static int count; if (data == NULL || data->light_input_dev == NULL) return; adc = lightsensor_get_adc(data); /* detecting 0 after 3.6sec, set the register again. */ if (adc == 0) { count++; if (count == 18) { lightsensor_onoff(1, data); count = 0; pr_info("%s: register reset\n", __func__); } } else count = 0; input_report_rel(data->light_input_dev, REL_MISC, adc + 1); input_sync(data->light_input_dev); if (data->light_enabled) schedule_delayed_work(&data->light_work, msecs_to_jiffies(data->light_delay)); }
static void gp2a_work_func_light(struct work_struct *work) { struct gp2a_data *data = container_of((struct delayed_work *)work, struct gp2a_data, light_work); int adc; adc = lightsensor_get_adc(data); input_report_rel(data->light_input_dev, REL_MISC, adc + 1); input_sync(data->light_input_dev); if (data->light_enabled) schedule_delayed_work(&data->light_work, msecs_to_jiffies(data->light_delay)); if (adc == 0) { if (data->light_zero_count++ > LIGHT_ZERO_LIMIT) { data->light_zero_count = 0; if (data->light_reset_count++ < LIGHT_RESET_LIMIT) { pr_info("%s: call gp2a reset\n", __func__); lightsensor_reset(data); } } } else { data->light_reset_count = 0; data->light_zero_count = 0; } }
/* Light Sysfs interface */ static ssize_t lightsensor_file_state_show(struct device *dev, struct device_attribute *attr, char *buf) { int adc = 0; struct gp2a_data *data = dev_get_drvdata(dev); adc = lightsensor_get_adc(data); return snprintf(buf, PAGE_SIZE, "%d\n", adc); }
static int lightsensor_get_adcvalue(struct gp2a_data *data) { #if 0 //disable average int i = 0, j = 0; unsigned int adc_total = 0; static int adc_avr_value; unsigned int adc_index = 0; static unsigned int adc_index_count; unsigned int adc_max = 0; unsigned int adc_min = 0; int value = 0; static int adc_value_buf[ADC_BUFFER_NUM] = { 0 }; #else int value = 0; #endif value = lightsensor_get_adc(data); #if 0 //disable average /*cur_adc_value = value; */ adc_index = (adc_index_count++) % ADC_BUFFER_NUM; /*ADC buffer initialize (light sensor off ---> light sensor on) */ if (data->light_data_first) { for (j = 0; j < ADC_BUFFER_NUM; j++) adc_value_buf[j] = value; data->light_data_first = false; } else { adc_value_buf[adc_index] = value; } adc_max = adc_value_buf[0]; adc_min = adc_value_buf[0]; for (i = 0; i < ADC_BUFFER_NUM; i++) { adc_total += adc_value_buf[i]; if (adc_max < adc_value_buf[i]) adc_max = adc_value_buf[i]; if (adc_min > adc_value_buf[i]) adc_min = adc_value_buf[i]; } adc_avr_value = (adc_total - (adc_max + adc_min)) / (ADC_BUFFER_NUM - 2); if (adc_index_count == ADC_BUFFER_NUM - 1) adc_index_count = 0; return adc_avr_value; #else return value; #endif }
int lightsensor_get_adcvalue(void) { int i = 0; int j = 0; unsigned int adc_total = 0; static int adc_avr_value = 0; unsigned int adc_index = 0; static unsigned int adc_index_count = 0; unsigned int adc_max = 0; unsigned int adc_min = 0; int value =0; //get ADC #ifdef MSM_LIGHTSENSOR_ADC_READ value = lightsensor_get_adc(); #endif cur_adc_value = value; adc_index = (adc_index_count++)%ADC_BUFFER_NUM; if(cur_state == LIGHT_INIT) //ADC buffer initialize (light sensor off ---> light sensor on) { for(j = 0; j<ADC_BUFFER_NUM; j++) adc_value_buf[j] = value; } else { adc_value_buf[adc_index] = value; } adc_max = adc_value_buf[0]; adc_min = adc_value_buf[0]; for(i = 0; i <ADC_BUFFER_NUM; i++) { adc_total += adc_value_buf[i]; if(adc_max < adc_value_buf[i]) adc_max = adc_value_buf[i]; if(adc_min > adc_value_buf[i]) adc_min = adc_value_buf[i]; } adc_avr_value = (adc_total-(adc_max+adc_min))/(ADC_BUFFER_NUM-2); if(adc_index_count == ADC_BUFFER_NUM-1) adc_index_count = 0; return adc_avr_value; }
static void gp2a_work_func_light(struct work_struct *work) { struct gp2a_data *data = container_of((struct delayed_work *)work, struct gp2a_data, light_work); int adc; adc = lightsensor_get_adc(data); if (!adc) adc = 1; input_report_rel(data->light_input_dev, REL_MISC, adc); input_sync(data->light_input_dev); if (data->light_enabled) schedule_delayed_work(&data->light_work, msecs_to_jiffies(data->light_delay)); }
static void gp2a_work_func_light(struct work_struct *work) { struct gp2a_data *data = container_of((struct delayed_work *)work, struct gp2a_data, light_work); int adc; adc = lightsensor_get_adc(data); input_report_abs(data->light_input_dev, ABS_MISC, adc); input_sync(data->light_input_dev); if (lightval_logcount++ > 250) { printk(KERN_INFO "[GP2A] light value = %d \n", adc); lightval_logcount = 0; } if (data->light_enabled) schedule_delayed_work(&data->light_work, msecs_to_jiffies(data->light_delay)); }
int lightsensor_get_adcvalue(struct sensor_data *data) { int i, j, value, adc_avr_value; unsigned int adc_total = 0, adc_max, adc_min, adc_index; static unsigned int adc_index_count; static int adc_value_buf[ADC_BUFFER_NUM] = { 0, }; value = lightsensor_get_adc(data); adc_index = (adc_index_count++) % ADC_BUFFER_NUM; /*ADC buffer initialize (light sensor off -> light sensor on) */ if (first_value == true) { for (j = 0; j < ADC_BUFFER_NUM; j++) adc_value_buf[j] = value; first_value = false; } else { adc_value_buf[adc_index] = value; } adc_max = adc_value_buf[0]; adc_min = adc_value_buf[0]; for (i = 0; i < ADC_BUFFER_NUM; i++) { adc_total += adc_value_buf[i]; if (adc_max < adc_value_buf[i]) adc_max = adc_value_buf[i]; if (adc_min > adc_value_buf[i]) adc_min = adc_value_buf[i]; } adc_avr_value = (adc_total - (adc_max + adc_min)) / (ADC_BUFFER_NUM - 2); if (adc_index_count == ADC_BUFFER_NUM - 1) adc_index_count = 0; return adc_avr_value; }