diff options
author | Javi Ferrer <javi.f.o@gmail.com> | 2015-05-12 19:40:59 +0200 |
---|---|---|
committer | forkbomb <keepcalm444@gmail.com> | 2015-11-25 08:33:40 +1100 |
commit | 948970715990bde9caf07377f928530848d19a36 (patch) | |
tree | 8ed27e6116225749dab0ac6de29b640e9617bfab /libsensors/akm8975.c | |
parent | ef3bca4b0959df074d5b0867b95699c330b5779e (diff) | |
download | device_samsung_i9300-948970715990bde9caf07377f928530848d19a36.zip device_samsung_i9300-948970715990bde9caf07377f928530848d19a36.tar.gz device_samsung_i9300-948970715990bde9caf07377f928530848d19a36.tar.bz2 |
i9300: update libsensors from replicant
- Orientation sensor still broken
Change-Id: I7d20afbbc1f8b1ca5d046a38c0c3b7ce824c12cd
Diffstat (limited to 'libsensors/akm8975.c')
-rw-r--r-- | libsensors/akm8975.c | 121 |
1 files changed, 65 insertions, 56 deletions
diff --git a/libsensors/akm8975.c b/libsensors/akm8975.c index a8352ca..ef84e93 100644 --- a/libsensors/akm8975.c +++ b/libsensors/akm8975.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Paul Kocialkowski + * Copyright (C) 2013 Paul Kocialkowski <contact@paulk.fr> * Copyright (C) 2012 Asahi Kasei Microdevices Corporation, Japan * * This program is free software: you can redistribute it and/or modify @@ -21,20 +21,16 @@ #include <stdint.h> #include <fcntl.h> #include <errno.h> -#include <sys/types.h> -#include <linux/ioctl.h> -#include <linux/uinput.h> -#include <linux/input.h> #include <hardware/sensors.h> #include <hardware/hardware.h> -#define LOG_TAG "exynos_sensors" +#define LOG_TAG "smdk4x12_sensors" #include <utils/Log.h> -#include "exynos_sensors.h" -#include "akm8975.h" -#include "akm8975-reg.h" +#include "smdk4x12_sensors.h" +#include "ak8975.h" +#include "ak8975-reg.h" #include <AKFS_Compass.h> #include <AKFS_FileIO.h> @@ -43,7 +39,7 @@ #define AKFS_PAT PAT3 struct akm8975_data { - struct exynos_sensors_handlers *orientation_sensor; + struct smdk4x12_sensors_handlers *orientation_sensor; AK8975PRMS akfs_params; sensors_vec_t magnetic; @@ -57,37 +53,37 @@ struct akm8975_data { int thread_continue; }; -int akfs_get_magnetic_field(struct akm8975_data *akm8975_data, short *mag_data) +int akfs_get_magnetic_field(struct akm8975_data *akm8975_data, short *magnetic_data) { AK8975PRMS *params; int rc; - if (akm8975_data == NULL || mag_data == NULL) + if (akm8975_data == NULL || magnetic_data == NULL) return -EINVAL; params = &akm8975_data->akfs_params; - /* Decomposition */ - /* Sensitivity adjustment, i.e. multiply ASA, is done in this function. */ - rc = AKFS_DecompAK8975(mag_data, 1, ¶ms->mi_asa, AKFS_HDATA_SIZE, params->mfv_hdata); + // Decomposition + // Sensitivity adjustment, i.e. multiply ASA, is done in this function. + rc = AKFS_DecompAK8975(magnetic_data, 1, ¶ms->mi_asa, AKFS_HDATA_SIZE, params->mfv_hdata); if (rc == AKFS_ERROR) { ALOGE("Failed to decomp!"); return -1; } - /* Adjust coordination */ + // Adjust coordination rc = AKFS_Rotate(params->m_hpat, ¶ms->mfv_hdata[0]); if (rc == AKFS_ERROR) { ALOGE("Failed to rotate!"); return -1; } - /* AOC for magnetometer */ - /* Offset estimation is done in this function */ + // AOC for magnetometer + // Offset estimation is done in this function AKFS_AOC(¶ms->m_aocv, params->mfv_hdata, ¶ms->mfv_ho); - /* Subtract offset */ - /* Then, a magnetic vector, the unit is uT, is stored in mfv_hvbuf. */ + // Subtract offset + // Then, a magnetic vector, the unit is uT, is stored in mfv_hvbuf. rc = AKFS_VbNorm(AKFS_HDATA_SIZE, params->mfv_hdata, 1, ¶ms->mfv_ho, ¶ms->mfv_hs, AK8975_HSENSE_TARGET, AKFS_HDATA_SIZE, params->mfv_hvbuf); @@ -96,7 +92,7 @@ int akfs_get_magnetic_field(struct akm8975_data *akm8975_data, short *mag_data) return -1; } - /* Averaging */ + // Averaging rc = AKFS_VbAve(AKFS_HDATA_SIZE, params->mfv_hvbuf, CSPEC_HNAVE_V, ¶ms->mfv_hvec); if (rc == AKFS_ERROR) { ALOGE("Failed to average!"); @@ -121,7 +117,7 @@ int akfs_init(struct akm8975_data *akm8975_data, char *asa, AKFS_PATNO pat) memset(params, 0, sizeof(AK8975PRMS)); - /* Sensitivity */ + // Sensitivity params->mfv_hs.u.x = AK8975_HSENSE_DEFAULT; params->mfv_hs.u.y = AK8975_HSENSE_DEFAULT; params->mfv_hs.u.z = AK8975_HSENSE_DEFAULT; @@ -129,18 +125,18 @@ int akfs_init(struct akm8975_data *akm8975_data, char *asa, AKFS_PATNO pat) params->mfv_as.u.y = AK8975_ASENSE_DEFAULT; params->mfv_as.u.z = AK8975_ASENSE_DEFAULT; - /* Initialize variables that initial value is not 0. */ + // Initialize variables that initial value is not 0. params->mi_hnaveV = CSPEC_HNAVE_V; params->mi_hnaveD = CSPEC_HNAVE_D; params->mi_anaveV = CSPEC_ANAVE_V; params->mi_anaveD = CSPEC_ANAVE_D; - /* Copy ASA values */ + // Copy ASA values params->mi_asa.u.x = asa[0]; params->mi_asa.u.y = asa[1]; params->mi_asa.u.z = asa[2]; - /* Copy layout pattern */ + // Copy layout pattern params->m_hpat = pat; return 0; @@ -148,12 +144,12 @@ int akfs_init(struct akm8975_data *akm8975_data, char *asa, AKFS_PATNO pat) void *akm8975_thread(void *thread_data) { - struct exynos_sensors_handlers *handlers = NULL; + struct smdk4x12_sensors_handlers *handlers = NULL; struct akm8975_data *data = NULL; struct input_event event; struct timeval time; char i2c_data[SENSOR_DATA_SIZE] = { 0 }; - short mag_data[3]; + short magnetic_data[3]; short mode; long int before, after; int diff; @@ -164,7 +160,7 @@ void *akm8975_thread(void *thread_data) if (thread_data == NULL) return NULL; - handlers = (struct exynos_sensors_handlers *) thread_data; + handlers = (struct smdk4x12_sensors_handlers *) thread_data; if (handlers->data == NULL) return NULL; @@ -211,11 +207,11 @@ void *akm8975_thread(void *thread_data) continue; } - mag_data[0] = (short) (i2c_data[2] << 8) | (i2c_data[1]); - mag_data[1] = (short) (i2c_data[4] << 8) | (i2c_data[3]); - mag_data[2] = (short) (i2c_data[6] << 8) | (i2c_data[5]); + magnetic_data[0] = (short) (i2c_data[2] << 8) | (i2c_data[1]); + magnetic_data[1] = (short) (i2c_data[4] << 8) | (i2c_data[3]); + magnetic_data[2] = (short) (i2c_data[6] << 8) | (i2c_data[5]); - rc = akfs_get_magnetic_field(data, (short *) &mag_data); + rc = akfs_get_magnetic_field(data, (short *) &magnetic_data); if (rc < 0) { ALOGE("%s: Unable to get AKFS magnetic field", __func__); continue; @@ -243,12 +239,12 @@ void *akm8975_thread(void *thread_data) return NULL; } -int akm8975_init(struct exynos_sensors_handlers *handlers, - struct exynos_sensors_device *device) +int akm8975_init(struct smdk4x12_sensors_handlers *handlers, + struct smdk4x12_sensors_device *device) { struct akm8975_data *data = NULL; pthread_attr_t thread_attr; - char i2c_data[4] = { 0 }; + char i2c_data[RWBUF_SIZE] = { 0 }; short mode; int device_fd = -1; int uinput_fd = -1; @@ -258,7 +254,7 @@ int akm8975_init(struct exynos_sensors_handlers *handlers, ALOGD("%s(%p, %p)", __func__, handlers, device); - if (handlers == NULL) + if (handlers == NULL || device == NULL) return -EINVAL; data = (struct akm8975_data *) calloc(1, sizeof(struct akm8975_data)); @@ -295,7 +291,7 @@ int akm8975_init(struct exynos_sensors_handlers *handlers, i2c_data[1] = AK8975_FUSE_ASAY; rc = ioctl(device_fd, ECS_IOCTL_READ, &i2c_data); if (rc < 0) { - ALOGE("%s: Unable to set read akm8975 FUSE data", __func__); + ALOGE("%s: Unable to read akm8975 FUSE data", __func__); goto error; } @@ -312,7 +308,7 @@ int akm8975_init(struct exynos_sensors_handlers *handlers, i2c_data[1] = AK8975_REG_WIA; rc = ioctl(device_fd, ECS_IOCTL_READ, &i2c_data); if (rc < 0) { - ALOGE("%s: Unable to set read akm8975 FUSE data", __func__); + ALOGE("%s: Unable to read akm8975 FUSE data", __func__); goto error; } @@ -347,7 +343,7 @@ int akm8975_init(struct exynos_sensors_handlers *handlers, rc = pthread_create(&data->thread, &thread_attr, akm8975_thread, (void *) handlers); if (rc < 0) { - ALOGE("%s: Unable to create acceleration thread", __func__); + ALOGE("%s: Unable to create akm8975 thread", __func__); pthread_mutex_destroy(&data->mutex); goto error; } @@ -378,7 +374,7 @@ error: return -1; } -int akm8975_deinit(struct exynos_sensors_handlers *handlers) +int akm8975_deinit(struct smdk4x12_sensors_handlers *handlers) { struct akm8975_data *data = NULL; short mode; @@ -422,7 +418,7 @@ int akm8975_deinit(struct exynos_sensors_handlers *handlers) return 0; } -int akm8975_activate(struct exynos_sensors_handlers *handlers) +int akm8975_activate(struct smdk4x12_sensors_handlers *handlers) { struct akm8975_data *data; AK8975PRMS *akfs_params; @@ -436,20 +432,20 @@ int akm8975_activate(struct exynos_sensors_handlers *handlers) data = (struct akm8975_data *) handlers->data; akfs_params = &data->akfs_params; - /* Read setting files from a file */ + // Read settings from a file rc = AKFS_LoadParameters(akfs_params, AKFS_CONFIG_PATH); if (rc != AKM_SUCCESS) ALOGE("%s: Unable to read AKFS parameters", __func__); - /* Initialize buffer */ + // Initialize buffer AKFS_InitBuffer(AKFS_HDATA_SIZE, akfs_params->mfv_hdata); AKFS_InitBuffer(AKFS_HDATA_SIZE, akfs_params->mfv_hvbuf); AKFS_InitBuffer(AKFS_ADATA_SIZE, akfs_params->mfv_adata); AKFS_InitBuffer(AKFS_ADATA_SIZE, akfs_params->mfv_avbuf); - /* Initialize for AOC */ + // Initialize for AOC AKFS_InitAOC(&akfs_params->m_aocv); - /* Initialize magnetic status */ + // Initialize magnetic status akfs_params->mi_hstatus = 0; handlers->activated = 1; @@ -458,13 +454,15 @@ int akm8975_activate(struct exynos_sensors_handlers *handlers) return 0; } -int akm8975_deactivate(struct exynos_sensors_handlers *handlers) +int akm8975_deactivate(struct smdk4x12_sensors_handlers *handlers) { struct akm8975_data *data; AK8975PRMS *akfs_params; int device_fd; short mode; + int empty; int rc; + int i; ALOGD("%s(%p)", __func__, handlers); @@ -476,12 +474,23 @@ int akm8975_deactivate(struct exynos_sensors_handlers *handlers) device_fd = data->device_fd; if (device_fd < 0) - return -EINVAL; + return -1; - /* Write setting files to a file */ - rc = AKFS_SaveParameters(akfs_params, AKFS_CONFIG_PATH); - if (rc != AKM_SUCCESS) - ALOGE("%s: Unable to write AKFS parameters", __func__); + empty = 1; + + for (i = 0; i < 3; i++) { + if (akfs_params->mfv_ho.v[i] != 0) { + empty = 0; + break; + } + } + + if (!empty) { + // Write settings to a file + rc = AKFS_SaveParameters(akfs_params, AKFS_CONFIG_PATH); + if (rc != AKM_SUCCESS) + ALOGE("%s: Unable to write AKFS parameters", __func__); + } mode = AK8975_MODE_POWER_DOWN; rc = ioctl(device_fd, ECS_IOCTL_SET_MODE, &mode); @@ -493,7 +502,7 @@ int akm8975_deactivate(struct exynos_sensors_handlers *handlers) return 0; } -int akm8975_set_delay(struct exynos_sensors_handlers *handlers, long int delay) +int akm8975_set_delay(struct smdk4x12_sensors_handlers *handlers, long int delay) { struct akm8975_data *data; @@ -514,7 +523,7 @@ float akm8975_convert(int value) return (float) value / 1000.0f; } -int akm8975_get_data(struct exynos_sensors_handlers *handlers, +int akm8975_get_data(struct smdk4x12_sensors_handlers *handlers, struct sensors_event_t *event) { struct akm8975_data *data; @@ -531,8 +540,9 @@ int akm8975_get_data(struct exynos_sensors_handlers *handlers, input_fd = handlers->poll_fd; if (input_fd < 0) - return -EINVAL; + return -1; + memset(event, 0, sizeof(struct sensors_event_t)); event->version = sizeof(struct sensors_event_t); event->sensor = handlers->handle; event->type = handlers->handle; @@ -570,8 +580,7 @@ int akm8975_get_data(struct exynos_sensors_handlers *handlers, return 0; } - -struct exynos_sensors_handlers akm8975 = { +struct smdk4x12_sensors_handlers akm8975 = { .name = "AKM8975", .handle = SENSOR_TYPE_MAGNETIC_FIELD, .init = akm8975_init, |