aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZiyan <jaraidaniel@gmail.com>2016-09-22 12:20:22 +0200
committerAndreas Blaesius <skate4life@gmx.de>2016-09-22 19:40:41 +0200
commit4a1b906e8e9167882d5bb539f9b0cd4f31d4e207 (patch)
tree10e5e13b9b4d9b603960d2b13c7e5ee982997012
parenta234348b622d15479c68714c78f9d9193d1345be (diff)
downloaddevice_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.tar.gz
device_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.tar.bz2
device_samsung_espressowifi-4a1b906e8e9167882d5bb539f9b0cd4f31d4e207.zip
libsensors: commonize light sensor handlers, fix GP2A conversion
Change-Id: I8f98e17485534147cdbfdb85e7230ef7b6496d2e
-rw-r--r--libsensors/Android.mk3
-rw-r--r--libsensors/bh1721.c231
-rw-r--r--libsensors/light.c (renamed from libsensors/gp2a_light.c)101
-rw-r--r--libsensors/piranha_sensors.c33
-rw-r--r--libsensors/piranha_sensors.h3
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