diff options
author | Ziyan <jaraidaniel@gmail.com> | 2016-09-22 12:20:22 +0200 |
---|---|---|
committer | Andreas Blaesius <skate4life@gmx.de> | 2016-09-22 19:40:41 +0200 |
commit | 4a1b906e8e9167882d5bb539f9b0cd4f31d4e207 (patch) | |
tree | 10e5e13b9b4d9b603960d2b13c7e5ee982997012 /libsensors | |
parent | a234348b622d15479c68714c78f9d9193d1345be (diff) | |
download | device_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.zip device_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.tar.gz device_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.tar.bz2 |
libsensors: commonize light sensor handlers, fix GP2A conversion
Change-Id: I8f98e17485534147cdbfdb85e7230ef7b6496d2e
Diffstat (limited to 'libsensors')
-rw-r--r-- | libsensors/Android.mk | 3 | ||||
-rw-r--r-- | libsensors/bh1721.c | 231 | ||||
-rw-r--r-- | libsensors/light.c (renamed from libsensors/gp2a_light.c) | 101 | ||||
-rw-r--r-- | libsensors/piranha_sensors.c | 33 | ||||
-rw-r--r-- | libsensors/piranha_sensors.h | 3 |
5 files changed, 88 insertions, 283 deletions
diff --git a/libsensors/Android.mk b/libsensors/Android.mk index b3e39ee..6e7cb93 100644 --- a/libsensors/Android.mk +++ b/libsensors/Android.mk @@ -21,9 +21,8 @@ include $(CLEAR_VARS) LOCAL_SRC_FILES := \ piranha_sensors.c \ input.c \ - bh1721.c \ bma250.c \ - gp2a_light.c \ + light.c \ gp2a_proximity.c \ yas530.c \ yas_orientation.c diff --git a/libsensors/bh1721.c b/libsensors/bh1721.c deleted file mode 100644 index bdc41b5..0000000 --- a/libsensors/bh1721.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2013 Paul Kocialkowski <contact@paulk.fr> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdint.h> -#include <fcntl.h> -#include <errno.h> -#include <math.h> -#include <sys/types.h> -#include <linux/ioctl.h> -#include <linux/input.h> - -#include <hardware/sensors.h> -#include <hardware/hardware.h> - -#define LOG_TAG "piranha_sensors" -#include <utils/Log.h> - -#include "piranha_sensors.h" - -struct bh1721_data { - char path_enable[PATH_MAX]; - char path_delay[PATH_MAX]; -}; - -int bh1721_init(struct piranha_sensors_handlers *handlers, - struct piranha_sensors_device *device) -{ - struct bh1721_data *data = NULL; - char path[PATH_MAX] = { 0 }; - int input_fd = -1; - int rc; - - ALOGD("%s(%p, %p)", __func__, handlers, device); - - if (handlers == NULL) - return -EINVAL; - - data = (struct bh1721_data *) calloc(1, sizeof(struct bh1721_data)); - - input_fd = input_open("light_sensor"); - if (input_fd < 0) { - ALOGE("%s: Unable to open input", __func__); - goto error; - } - - rc = sysfs_path_prefix("light_sensor", (char *) &path); - if (rc < 0 || path[0] == '\0') { - ALOGE("%s: Unable to open sysfs", __func__); - goto error; - } - - snprintf(data->path_enable, PATH_MAX, "%s/enable", path); - snprintf(data->path_delay, PATH_MAX, "%s/poll_delay", path); - - handlers->poll_fd = input_fd; - handlers->data = (void *) data; - - return 0; - -error: - if (data != NULL) - free(data); - - if (input_fd >= 0) - close(input_fd); - - handlers->poll_fd = -1; - handlers->data = NULL; - - return -1; -} - -int bh1721_deinit(struct piranha_sensors_handlers *handlers) -{ - ALOGD("%s(%p)", __func__, handlers); - - if (handlers == NULL) - return -EINVAL; - - if (handlers->poll_fd >= 0) - close(handlers->poll_fd); - handlers->poll_fd = -1; - - if (handlers->data != NULL) - free(handlers->data); - handlers->data = NULL; - - return 0; -} - -int bh1721_activate(struct piranha_sensors_handlers *handlers) -{ - struct bh1721_data *data; - int rc; - - ALOGD("%s(%p)", __func__, handlers); - - if (handlers == NULL || handlers->data == NULL) - return -EINVAL; - - data = (struct bh1721_data *) handlers->data; - - rc = sysfs_value_write(data->path_enable, 1); - if (rc < 0) { - ALOGE("%s: Unable to write sysfs value", __func__); - return -1; - } - - handlers->activated = 1; - - return 0; -} - -int bh1721_deactivate(struct piranha_sensors_handlers *handlers) -{ - struct bh1721_data *data; - int rc; - - ALOGD("%s(%p)", __func__, handlers); - - if (handlers == NULL || handlers->data == NULL) - return -EINVAL; - - data = (struct bh1721_data *) handlers->data; - - rc = sysfs_value_write(data->path_enable, 0); - if (rc < 0) { - ALOGE("%s: Unable to write sysfs value", __func__); - return -1; - } - - handlers->activated = 1; - - return 0; -} - -int bh1721_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay) -{ - struct bh1721_data *data; - int rc; - - ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay); - - if (handlers == NULL || handlers->data == NULL) - return -EINVAL; - - data = (struct bh1721_data *) handlers->data; - - rc = sysfs_value_write(data->path_delay, delay); - if (rc < 0) { - ALOGE("%s: Unable to write sysfs value", __func__); - return -1; - } - - return 0; -} - -float bh1721_convert(int value) -{ - return value * 0.712f; -} - -int bh1721_get_data(struct piranha_sensors_handlers *handlers, - struct sensors_event_t *event) -{ - struct input_event input_event; - int input_fd; - int rc; - -// ALOGD("%s(%p, %p)", __func__, handlers, event); - - if (handlers == NULL || event == NULL) - return -EINVAL; - - input_fd = handlers->poll_fd; - if (input_fd < 0) - return -EINVAL; - - memset(event, 0, sizeof(struct sensors_event_t)); - event->version = sizeof(struct sensors_event_t); - event->sensor = handlers->handle; - event->type = handlers->handle; - - do { - rc = read(input_fd, &input_event, sizeof(input_event)); - if (rc < (int) sizeof(input_event)) - break; - - if (input_event.type == EV_REL) { - if (input_event.code == REL_MISC) - event->light = bh1721_convert(input_event.value); - } else if (input_event.type == EV_SYN) { - if (input_event.code == SYN_REPORT) - event->timestamp = input_timestamp(&input_event); - } - } while (input_event.type != EV_SYN); - - return 0; -} - -struct piranha_sensors_handlers bh1721 = { - .name = "BH1721", - .handle = SENSOR_TYPE_LIGHT, - .init = bh1721_init, - .deinit = bh1721_deinit, - .activate = bh1721_activate, - .deactivate = bh1721_deactivate, - .set_delay = bh1721_set_delay, - .get_data = bh1721_get_data, - .activated = 0, - .needed = 0, - .poll_fd = -1, - .data = NULL, -}; diff --git a/libsensors/gp2a_light.c b/libsensors/light.c index 3fd5c70..f84691f 100644 --- a/libsensors/gp2a_light.c +++ b/libsensors/light.c @@ -34,15 +34,22 @@ #include "piranha_sensors.h" -struct gp2a_light_data { +enum { + SENSOR_TYPE_BH1721 = 1, + SENSOR_TYPE_AL3201, + SENSOR_TYPE_GP2A, +}; + +struct light_data { char path_enable[PATH_MAX]; char path_delay[PATH_MAX]; + int sensor_type; }; -int gp2a_light_init(struct piranha_sensors_handlers *handlers, +int light_init(struct piranha_sensors_handlers *handlers, struct piranha_sensors_device *device) { - struct gp2a_light_data *data = NULL; + struct light_data *data = NULL; char path[PATH_MAX] = { 0 }; int input_fd = -1; int rc; @@ -52,7 +59,7 @@ int gp2a_light_init(struct piranha_sensors_handlers *handlers, if (handlers == NULL) return -EINVAL; - data = (struct gp2a_light_data *) calloc(1, sizeof(struct gp2a_light_data)); + data = (struct light_data *) calloc(1, sizeof(struct light_data)); input_fd = input_open("light_sensor"); if (input_fd < 0) { @@ -72,6 +79,28 @@ int gp2a_light_init(struct piranha_sensors_handlers *handlers, handlers->poll_fd = input_fd; handlers->data = (void *) data; + char device_variant[16]; + FILE *f = fopen(DEVICE_VARIANT_SYSFS, "r"); + if (!f || fgets(device_variant, 16, f) == NULL) { + ALOGE("Failed to read " DEVICE_VARIANT_SYSFS ", assuming P51xx\n"); + strcpy(device_variant, "espresso10"); + } + if (f) + fclose(f); + + ALOGD("Device: %s", device_variant); + + if (strcmp(device_variant, "espresso10") == 0) { + /* Device is P51xx */ + data->sensor_type = SENSOR_TYPE_BH1721; + } else if (strcmp(device_variant, "espressowifi") == 0) { + /* Device is P3110 */ + data->sensor_type = SENSOR_TYPE_AL3201; + } else { + /* Device is P3100 */ + data->sensor_type = SENSOR_TYPE_GP2A; + } + return 0; error: @@ -87,7 +116,7 @@ error: return -1; } -int gp2a_light_deinit(struct piranha_sensors_handlers *handlers) +int light_deinit(struct piranha_sensors_handlers *handlers) { ALOGD("%s(%p)", __func__, handlers); @@ -105,9 +134,9 @@ int gp2a_light_deinit(struct piranha_sensors_handlers *handlers) return 0; } -int gp2a_light_activate(struct piranha_sensors_handlers *handlers) +int light_activate(struct piranha_sensors_handlers *handlers) { - struct gp2a_light_data *data; + struct light_data *data; int rc; ALOGD("%s(%p)", __func__, handlers); @@ -115,7 +144,7 @@ int gp2a_light_activate(struct piranha_sensors_handlers *handlers) if (handlers == NULL || handlers->data == NULL) return -EINVAL; - data = (struct gp2a_light_data *) handlers->data; + data = (struct light_data *) handlers->data; rc = sysfs_value_write(data->path_enable, 1); if (rc < 0) { @@ -128,9 +157,9 @@ int gp2a_light_activate(struct piranha_sensors_handlers *handlers) return 0; } -int gp2a_light_deactivate(struct piranha_sensors_handlers *handlers) +int light_deactivate(struct piranha_sensors_handlers *handlers) { - struct gp2a_light_data *data; + struct light_data *data; int rc; ALOGD("%s(%p)", __func__, handlers); @@ -138,7 +167,7 @@ int gp2a_light_deactivate(struct piranha_sensors_handlers *handlers) if (handlers == NULL || handlers->data == NULL) return -EINVAL; - data = (struct gp2a_light_data *) handlers->data; + data = (struct light_data *) handlers->data; rc = sysfs_value_write(data->path_enable, 0); if (rc < 0) { @@ -151,9 +180,9 @@ int gp2a_light_deactivate(struct piranha_sensors_handlers *handlers) return 0; } -int gp2a_light_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay) +int light_set_delay(struct piranha_sensors_handlers *handlers, int64_t delay) { - struct gp2a_light_data *data; + struct light_data *data; int rc; ALOGD("%s(%p, %" PRId64 ")", __func__, handlers, delay); @@ -161,7 +190,7 @@ int gp2a_light_set_delay(struct piranha_sensors_handlers *handlers, int64_t dela if (handlers == NULL || handlers->data == NULL) return -EINVAL; - data = (struct gp2a_light_data *) handlers->data; + data = (struct light_data *) handlers->data; rc = sysfs_value_write(data->path_delay, delay); if (rc < 0) { @@ -172,9 +201,9 @@ int gp2a_light_set_delay(struct piranha_sensors_handlers *handlers, int64_t dela return 0; } -float gp2a_light_convert(int value) +float light_convert(int value, int sensor_type) { - // Converting the raw value to lux units is done with: + // Converting the AL3201 raw value to lux: // I = 10 * log(light) uA // U = raw * 3300 / 4095 (max ADC value is 3.3V for 4095 LSB) // R = 47kOhm @@ -183,12 +212,30 @@ float gp2a_light_convert(int value) // Only 1/4 of light reaches the sensor: // => light = 4 * (10 ^ (raw * 330 / 4095 / 47)) - return powf(10, value * (330.0f / 4095.0f / 47.0f)) * 4; + // Converting the GP2A raw value to lux: + // I = 10 * log(Ev) uA + // R = 24kOhm + // Max adc value 1023 = 1.25V + // 1/4 of light reaches sensor + + switch (sensor_type) { + case SENSOR_TYPE_AL3201: + return powf(10, value * (330.0f / 4095.0f / 47.0f)) * 4; + case SENSOR_TYPE_BH1721: + return value * 0.712f; + case SENSOR_TYPE_GP2A: + return powf(10, value * (125.0f / 1023.0f / 24.0f)) * 4; + default: + ALOGE("%s: Unknown sensor type", __func__); + } + + return 0; } -int gp2a_light_get_data(struct piranha_sensors_handlers *handlers, +int light_get_data(struct piranha_sensors_handlers *handlers, struct sensors_event_t *event) { + struct light_data *data = (struct light_data *) handlers->data; struct input_event input_event; int input_fd; int rc; @@ -214,7 +261,7 @@ int gp2a_light_get_data(struct piranha_sensors_handlers *handlers, if (input_event.type == EV_REL) { if (input_event.code == REL_MISC) - event->light = gp2a_light_convert(input_event.value); + event->light = light_convert(input_event.value, data->sensor_type); } else if (input_event.type == EV_SYN) { if (input_event.code == SYN_REPORT) event->timestamp = input_timestamp(&input_event); @@ -224,15 +271,15 @@ int gp2a_light_get_data(struct piranha_sensors_handlers *handlers, return 0; } -struct piranha_sensors_handlers gp2a_light = { - .name = "GP2A Light", +struct piranha_sensors_handlers light = { + .name = "Light", .handle = SENSOR_TYPE_LIGHT, - .init = gp2a_light_init, - .deinit = gp2a_light_deinit, - .activate = gp2a_light_activate, - .deactivate = gp2a_light_deactivate, - .set_delay = gp2a_light_set_delay, - .get_data = gp2a_light_get_data, + .init = light_init, + .deinit = light_deinit, + .activate = light_activate, + .deactivate = light_deactivate, + .set_delay = light_set_delay, + .get_data = light_get_data, .activated = 0, .needed = 0, .poll_fd = -1, diff --git a/libsensors/piranha_sensors.c b/libsensors/piranha_sensors.c index b4c2814..38d999e 100644 --- a/libsensors/piranha_sensors.c +++ b/libsensors/piranha_sensors.c @@ -49,18 +49,13 @@ struct sensor_t piranha_sensors[] = { { "YAS Orientation Sensor", "Yamaha Corporation", 1, SENSOR_TYPE_ORIENTATION, SENSOR_TYPE_ORIENTATION, 360.0f, 0.1f, 0.0f, 10000, 0, 0, 0, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {0}, }, -/* P51xx only */ - { "BH1721 Light Sensor", "ROHM", 1, SENSOR_TYPE_LIGHT, - SENSOR_TYPE_LIGHT, 0.0f, 0.0f, 0.0f, 0, - 0, 0, 0, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {0}, }, -/* ---------- */ -/* P31xx only */ - { "GP2A Light Sensor", "Sharp", 1, SENSOR_TYPE_LIGHT, +/* To be changed during the initialization process */ + { "Light Sensor", "Dummy", 1, SENSOR_TYPE_LIGHT, SENSOR_TYPE_LIGHT, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {0}, }, /* ---------- */ /* P3100 only */ - { "GP2A Proximity Sensor", "Sharp", 1, SENSOR_TYPE_PROXIMITY, + { "GP2AP002 Proximity Sensor", "Sharp", 1, SENSOR_TYPE_PROXIMITY, SENSOR_TYPE_PROXIMITY, 5.0f, 0.0f, 0.0f, 0, 0, 0, 0, 0, 0, SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE, {0}, }, /* ---------- */ @@ -72,12 +67,7 @@ struct piranha_sensors_handlers *piranha_sensors_handlers[] = { &bma250, &yas530, &yas_orientation, -/* P51xx only */ - &bh1721, -/* ---------- */ -/* P31xx only */ - &gp2a_light, -/* ---------- */ + &light, /* P3100 only */ &gp2a_proximity, /* ---------- */ @@ -251,24 +241,25 @@ void piranha_sensors_setup() { ALOGE("Failed to read " DEVICE_VARIANT_SYSFS ", assuming P51xx\n"); strcpy(device, "espresso10"); } - if (f) fclose(f); + if (f) + fclose(f); ALOGD("Device: %s", device); if (strcmp(device, "espresso10") == 0) { /* Device is P51xx */ + piranha_sensors[3].name = "BH1721 Light Sensor"; + piranha_sensors[3].vendor = "ROHM", piranha_sensors_count = 4; } else if (strcmp(device, "espressowifi") == 0) { /* Device is P3110 */ - piranha_sensors[3] = piranha_sensors[4]; - piranha_sensors_handlers[3] = piranha_sensors_handlers[4]; + piranha_sensors[3].name = "AL3201 Light Sensor"; + piranha_sensors[3].vendor = "Lite-On", piranha_sensors_count = 4; } else { /* Device is P3100 */ - piranha_sensors[3] = piranha_sensors[4]; - piranha_sensors_handlers[3] = piranha_sensors_handlers[4]; - piranha_sensors[4] = piranha_sensors[5]; - piranha_sensors_handlers[4] = piranha_sensors_handlers[5]; + piranha_sensors[3].name = "GP2AP002 Light Sensor"; + piranha_sensors[3].vendor = "Sharp", piranha_sensors_count = 5; } diff --git a/libsensors/piranha_sensors.h b/libsensors/piranha_sensors.h index 2b5a935..1741945 100644 --- a/libsensors/piranha_sensors.h +++ b/libsensors/piranha_sensors.h @@ -101,8 +101,7 @@ int orientation_fill(struct piranha_sensors_handlers *handlers, extern struct piranha_sensors_handlers bma250; extern struct piranha_sensors_handlers yas530; extern struct piranha_sensors_handlers yas_orientation; -extern struct piranha_sensors_handlers bh1721; -extern struct piranha_sensors_handlers gp2a_light; +extern struct piranha_sensors_handlers light; extern struct piranha_sensors_handlers gp2a_proximity; #endif |