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));
}
Esempio n. 2
0
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
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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));
}
Esempio n. 8
0
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;
}