static int proximity_adc_read(struct px3215_data *data) { int sum[OFFSET_ARRAY_LENGTH]; int i = OFFSET_ARRAY_LENGTH-1; int avg; int min; int max; int total; do { msleep(50); sum[i] = px3215_get_px_value(data->client); if (i == 0) { min = sum[i]; max = sum[i]; } else { if (sum[i] < min) min = sum[i]; else if (sum[i] > max) max = sum[i]; } total += sum[i]; } while (i--); total -= (min + max); avg = (total / (OFFSET_ARRAY_LENGTH - 2)); pr_info("%s: offset = %d\n", __func__, avg); return avg; }
static void prox_work_func_avg(struct work_struct *work) { struct px3215_data *data = container_of(work, struct px3215_data, work_prox_avg); u16 proximity_value = 0; int min = 0, max = 0, avg = 0; int i = 0; for (i = 0; i < PROX_AVG_COUNT; i++) { proximity_value = px3215_get_px_value(data->client); if (proximity_value > PROX_MIN) { if (proximity_value > PROX_MAX) proximity_value = PROX_MAX; avg += proximity_value; if (!i) min = proximity_value; if (proximity_value < min) min = proximity_value; if (proximity_value > max) max = proximity_value; } else { proximity_value = PROX_MIN; } msleep(40); } avg /= i; data->avg[0] = min; data->avg[1] = avg; data->avg[2] = max; }
/* Px data */ static ssize_t px3215_show_pxvalue(struct device *dev, struct device_attribute *attr, char *buf) { struct input_dev *input = to_input_dev(dev); struct px3215_data *data = input_get_drvdata(input); /* No Px data if power down */ if (px3215_get_mode(data->client) == 0x00) return -EBUSY; return sprintf(buf, "%d\n", px3215_get_px_value(data->client)); }
/* Px data */ static ssize_t px3215_show_adc(struct device *dev, struct device_attribute *attr, char *buf) { struct input_dev *input = to_input_dev(dev); struct px3215_data *data = input_get_drvdata(input); static int count; /*count for proximity average */ int adc = 0; /* No Px data if power down */ if (px3215_get_mode(data->client) == 0x00) return -EBUSY; adc = px3215_get_px_value(data->client); data->average[count] = adc; if (count == PROX_READ_NUM) count = 0; return sprintf(buf, "%d\n", adc); }
static void px3215_work_func(struct work_struct *work) { struct px3215_data *data = container_of(work, struct px3215_data, work_ptime); u16 value = 0; int min = 0, max = 0, avg = 0; int i = 0; for (i = 0; i < PROX_READ_NUM; i++) { value = px3215_get_px_value(data->client); if (value > PX_PROX_MIN) { if (value > PX_PROX_MAX) value = PX_PROX_MAX; avg += value; if (!i) min = value; else if (value < min) min = value; if (value > max) max = value; } else { value = PX_PROX_MIN; break; } msleep(40); } if (i != 0) avg /= i; data->avg[0] = min; data->avg[1] = avg; data->avg[2] = max; }