summaryrefslogtreecommitdiffstats
path: root/libsensors_iio/CompassSensor.IIO.primary.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors_iio/CompassSensor.IIO.primary.cpp')
-rw-r--r--libsensors_iio/CompassSensor.IIO.primary.cpp630
1 files changed, 0 insertions, 630 deletions
diff --git a/libsensors_iio/CompassSensor.IIO.primary.cpp b/libsensors_iio/CompassSensor.IIO.primary.cpp
deleted file mode 100644
index 8b78338..0000000
--- a/libsensors_iio/CompassSensor.IIO.primary.cpp
+++ /dev/null
@@ -1,630 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_NDEBUG 0
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-#include <cutils/log.h>
-#include <linux/input.h>
-#include <string.h>
-
-#include "CompassSensor.IIO.primary.h"
-#include "sensors.h"
-#include "MPLSupport.h"
-#include "sensor_params.h"
-#include "ml_sysfs_helper.h"
-//#include "log.h"
-
-#define COMPASS_MAX_SYSFS_ATTRB sizeof(compassSysFs) / sizeof(char*)
-
-#if defined COMPASS_AK8975
-# warning "Invensense compass cal with AK8975 on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "INV_AK8975"
-#elif defined INVENSENSE_COMPASS_CAL
-
-#if defined COMPASS_YAS53x
-# warning "Invensense compass cal with YAS53x IIO on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "yas53" // prefix for YAS53[023]
-#elif defined COMPASS_AMI306
-# warning "Invensense compass cal with AMI306 IIO on primary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "ami306"
-#else
-# warning "Invensense compass cal with compass on secondary bus"
-# define USE_MPL_COMPASS_HAL (1)
-# define COMPASS_NAME "INV_COMPASS"
-#endif
-
-#else
-# warning "third party compass cal HAL"
-# define USE_MPL_COMPASS_HAL (0)
-// TODO: change to vendor's name
-# define COMPASS_NAME "AKM8975"
-#endif
-
-/******************************************************************************/
-
-CompassSensor::CompassSensor()
- : SensorBase(COMPASS_NAME, NULL),
- mCompassTimestamp(0),
- mCompassInputReader(8)
-#ifdef COMPASS_YAS53x
- , mCoilsResetFd(0)
-#endif
-{
- FILE *fptr;
-
- VFUNC_LOG;
-
- /*
- char temp_sysfs_path[30];
- inv_get_sysfs_path(temp_sysfs_path);
- LOGI("sysfs: %s", temp_sysfs_path);
- */
-
-#ifdef COMPASS_YAS53x
- /* for YAS53x compasses, dev_name is just a prefix,
- we need to find the actual name */
- if (fill_dev_full_name_by_prefix(dev_name,
- dev_full_name, sizeof(dev_full_name) / sizeof(dev_full_name[0]))) {
- LOGE("Cannot find Yamaha device with prefix name '%s' - "
- "magnetometer will likely not work.", dev_name);
- }
-#else
- strncpy(dev_full_name, dev_name,
- sizeof(dev_full_name) / sizeof(dev_full_name[0]));
-#endif
-
- if (inv_init_sysfs_attributes()) {
- LOGE("Error Instantiating Compass\n");
- return;
- }
-
- if (!strcmp(dev_full_name, "INV_COMPASS")) {
- mI2CBus = COMPASS_BUS_SECONDARY;
- } else {
- mI2CBus = COMPASS_BUS_PRIMARY;
- }
-
- memset(mCachedCompassData, 0, sizeof(mCachedCompassData));
-
- if (!isIntegrated()) {
- enable(ID_M, 0);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:compass name: %s", dev_full_name);
- enable_iio_sysfs();
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- compassSysFs.compass_orient, getTimestamp());
- fptr = fopen(compassSysFs.compass_orient, "r");
- if (fptr != NULL) {
- int om[9];
- fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
- &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
- &om[6], &om[7], &om[8]);
- fclose(fptr);
-
- LOGV_IF(EXTRA_VERBOSE,
- "HAL:compass mounting matrix: "
- "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
- om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
-
- mCompassOrientation[0] = om[0];
- mCompassOrientation[1] = om[1];
- mCompassOrientation[2] = om[2];
- mCompassOrientation[3] = om[3];
- mCompassOrientation[4] = om[4];
- mCompassOrientation[5] = om[5];
- mCompassOrientation[6] = om[6];
- mCompassOrientation[7] = om[7];
- mCompassOrientation[8] = om[8];
- } else {
- LOGE("HAL:Couldn't read compass mounting matrix");
- }
-
-#ifdef COMPASS_YAS53x
- mCoilsResetFd = fopen(compassSysFs.compass_attr_1, "r+");
- if (fptr == NULL) {
- LOGE("HAL:Couldn't read compass overunderflow");
- }
-#endif
-}
-
-void CompassSensor::enable_iio_sysfs()
-{
- VFUNC_LOG;
-
- int tempFd = 0;
- char iio_trigger_name[MAX_CHIP_ID_LEN], iio_device_node[MAX_CHIP_ID_LEN];
- FILE *tempFp = NULL;
- const char* compass = dev_full_name;
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.in_timestamp_en, getTimestamp());
- tempFd = open(compassSysFs.in_timestamp_en, O_RDWR);
- if(tempFd < 0) {
- LOGE("HAL:could not open %s timestamp enable", compass);
- } else if(enable_sysfs_sensor(tempFd, 1) < 0) {
- LOGE("HAL:could not enable timestamp");
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:cat %s (%lld)",
- compassSysFs.trigger_name, getTimestamp());
- tempFp = fopen(compassSysFs.trigger_name, "r");
- if (tempFp == NULL) {
- LOGE("HAL:could not open %s trigger name", compass);
- } else {
- if (fscanf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not read trigger name");
- }
- fclose(tempFp);
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo %s > %s (%lld)",
- iio_trigger_name, compassSysFs.current_trigger, getTimestamp());
- tempFp = fopen(compassSysFs.current_trigger, "w");
- if (tempFp == NULL) {
- LOGE("HAL:could not open current trigger");
- } else {
- if (fprintf(tempFp, "%s", iio_trigger_name) < 0) {
- LOGE("HAL:could not write current trigger");
- }
- fclose(tempFp);
- }
-
- LOGV_IF(SYSFS_VERBOSE,
- "HAL:sysfs:echo %d > %s (%lld)",
- IIO_BUFFER_LENGTH, compassSysFs.buffer_length, getTimestamp());
- tempFp = fopen(compassSysFs.buffer_length, "w");
- if (tempFp == NULL) {
- LOGE("HAL:could not open buffer length");
- } else {
- if (fprintf(tempFp, "%d", IIO_BUFFER_LENGTH) < 0) {
- LOGE("HAL:could not write buffer length");
- }
- fclose(tempFp);
- }
-
- sprintf(iio_device_node, "%s%d", "/dev/iio:device",
- find_type_by_name(compass, "iio:device"));
- compass_fd = open(iio_device_node, O_RDONLY);
- int res = errno;
- if (compass_fd < 0) {
- LOGE("HAL:could not open '%s' iio device node in path '%s' - "
- "error '%s' (%d)",
- compass, iio_device_node, strerror(res), res);
- } else {
- LOGV_IF(EXTRA_VERBOSE,
- "HAL:iio %s, compass_fd opened : %d", compass, compass_fd);
- }
-
- /* TODO: need further tests for optimization to reduce context-switch
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_x_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_x_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_y_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_y_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo 1 > %s (%lld)",
- compassSysFs.compass_z_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, 1);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_z_fifo_enable, strerror(res), res);
- }
- */
-}
-
-CompassSensor::~CompassSensor()
-{
- VFUNC_LOG;
-
- free(pathP);
- if( compass_fd > 0)
- close(compass_fd);
-#ifdef COMPASS_YAS53x
- if( mCoilsResetFd != NULL )
- fclose(mCoilsResetFd);
-#endif
-}
-
-int CompassSensor::getFd() const
-{
- VHANDLER_LOG;
- return compass_fd;
-}
-
-/**
- * @brief This function will enable/disable sensor.
- * @param[in] handle
- * which sensor to enable/disable.
- * @param[in] en
- * en=1, enable;
- * en=0, disable
- * @return if the operation is successful.
- */
-int CompassSensor::enable(int32_t handle, int en)
-{
- VFUNC_LOG;
-
- mEnable = en;
- int tempFd;
- int res;
-
- /* reset master enable */
- res = masterEnable(0);
- if (res < 0) {
- return res;
- }
-
- if (en) {
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_x_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_x_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_x_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_y_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_y_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_y_fifo_enable, strerror(res), res);
- }
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.compass_z_fifo_enable, getTimestamp());
- tempFd = open(compassSysFs.compass_z_fifo_enable, O_RDWR);
- res = errno;
- if (tempFd > 0) {
- res = enable_sysfs_sensor(tempFd, en);
- } else {
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.compass_z_fifo_enable, strerror(res), res);
- }
-
- res = masterEnable(en);
- if (res < en) {
- return res;
- }
- }
-
- return res;
-}
-
-int CompassSensor::masterEnable(int en) {
- VFUNC_LOG;
-
- int res = 0;
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
- en, compassSysFs.chip_enable, getTimestamp());
- int tempFd = open(compassSysFs.chip_enable, O_RDWR);
- res = errno;
- if(tempFd < 0){
- LOGE("HAL:open of %s failed with '%s' (%d)",
- compassSysFs.chip_enable, strerror(res), res);
- return res;
- }
- res = enable_sysfs_sensor(tempFd, en);
- return res;
-}
-
-int CompassSensor::setDelay(int32_t handle, int64_t ns)
-{
- VFUNC_LOG;
- int tempFd;
- int res;
-
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
- 1000000000.f / ns, compassSysFs.compass_rate, getTimestamp());
- mDelay = ns;
- if (ns == 0)
- return -1;
- tempFd = open(compassSysFs.compass_rate, O_RDWR);
- res = write_attribute_sensor(tempFd, 1000000000.f / ns);
- if(res < 0) {
- LOGE("HAL:Compass update delay error");
- }
- return res;
-}
-
-/**
- @brief This function will return the state of the sensor.
- @return 1=enabled; 0=disabled
-**/
-int CompassSensor::getEnable(int32_t handle)
-{
- VFUNC_LOG;
- return mEnable;
-}
-
-/* use for Invensense compass calibration */
-#define COMPASS_EVENT_DEBUG (0)
-void CompassSensor::processCompassEvent(const input_event *event)
-{
- VHANDLER_LOG;
-
- switch (event->code) {
- case EVENT_TYPE_ICOMPASS_X:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_X\n");
- mCachedCompassData[0] = event->value;
- break;
- case EVENT_TYPE_ICOMPASS_Y:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Y\n");
- mCachedCompassData[1] = event->value;
- break;
- case EVENT_TYPE_ICOMPASS_Z:
- LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Z\n");
- mCachedCompassData[2] = event->value;
- break;
- }
-
- mCompassTimestamp =
- (int64_t)event->time.tv_sec * 1000000000L + event->time.tv_usec * 1000L;
-}
-
-void CompassSensor::getOrientationMatrix(signed char *orient)
-{
- VFUNC_LOG;
- memcpy(orient, mCompassOrientation, sizeof(mCompassOrientation));
-}
-
-long CompassSensor::getSensitivity()
-{
- VFUNC_LOG;
-
- long sensitivity;
- LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
- compassSysFs.compass_scale, getTimestamp());
- inv_read_data(compassSysFs.compass_scale, &sensitivity);
- return sensitivity;
-}
-
-/**
- @brief This function is called by sensors_mpl.cpp
- to read sensor data from the driver.
- @param[out] data sensor data is stored in this variable. Scaled such that
- 1 uT = 2^16
- @para[in] timestamp data's timestamp
- @return 1, if 1 sample read, 0, if not, negative if error
- */
-int CompassSensor::readSample(long *data, int64_t *timestamp) {
- VFUNC_LOG;
-
- int i;
- char *rdata = mIIOBuffer;
-
- size_t rsize = read(compass_fd, rdata, (8 * mEnable + 8) * 1);
-
- if (!mEnable) {
- rsize = read(compass_fd, rdata, (8 + 8) * IIO_BUFFER_LENGTH);
- // LOGI("clear buffer with size: %d", rsize);
- }
-/*
- LOGI("get one sample of AMI IIO data with size: %d", rsize);
- LOGI_IF(mEnable, "compass x/y/z: %d/%d/%d", *((short *) (rdata + 0)),
- *((short *) (rdata + 2)), *((short *) (rdata + 4)));
-*/
- if (mEnable) {
- for (i = 0; i < 3; i++) {
- data[i] = *((short *) (rdata + i * 2));
- }
- *timestamp = *((long long *) (rdata + 8 * mEnable));
- }
-
- return mEnable;
-}
-
-/**
- * @brief This function will return the current delay for this sensor.
- * @return delay in nanoseconds.
- */
-int64_t CompassSensor::getDelay(int32_t handle)
-{
- VFUNC_LOG;
- return mDelay;
-}
-
-void CompassSensor::fillList(struct sensor_t *list)
-{
- VFUNC_LOG;
-
- const char *compass = dev_full_name;
-
- if (compass) {
- if(!strcmp(compass, "INV_COMPASS")) {
- list->maxRange = COMPASS_MPU9150_RANGE;
- list->resolution = COMPASS_MPU9150_RESOLUTION;
- list->power = COMPASS_MPU9150_POWER;
- list->minDelay = COMPASS_MPU9150_MINDELAY;
- return;
- }
- if(!strcmp(compass, "compass")
- || !strcmp(compass, "INV_AK8975")) {
- list->maxRange = COMPASS_AKM8975_RANGE;
- list->resolution = COMPASS_AKM8975_RESOLUTION;
- list->power = COMPASS_AKM8975_POWER;
- list->minDelay = COMPASS_AKM8975_MINDELAY;
- return;
- }
- if(!strcmp(compass, "ami306")) {
- list->maxRange = COMPASS_AMI306_RANGE;
- list->resolution = COMPASS_AMI306_RESOLUTION;
- list->power = COMPASS_AMI306_POWER;
- list->minDelay = COMPASS_AMI306_MINDELAY;
- return;
- }
- if(!strcmp(compass, "yas530")
- || !strcmp(compass, "yas532")
- || !strcmp(compass, "yas533")) {
- list->maxRange = COMPASS_YAS53x_RANGE;
- list->resolution = COMPASS_YAS53x_RESOLUTION;
- list->power = COMPASS_YAS53x_POWER;
- list->minDelay = COMPASS_YAS53x_MINDELAY;
- return;
- }
- }
-
- LOGE("HAL:unknown compass id %s -- "
- "params default to ak8975 and might be wrong.",
- compass);
- list->maxRange = COMPASS_AKM8975_RANGE;
- list->resolution = COMPASS_AKM8975_RESOLUTION;
- list->power = COMPASS_AKM8975_POWER;
- list->minDelay = COMPASS_AKM8975_MINDELAY;
-}
-
-#ifdef COMPASS_YAS53x
-/* Read sysfs entry to determine whether overflow had happend
- then write to sysfs to reset to zero */
-int CompassSensor::checkCoilsReset()
-{
- int result=-1;
- VFUNC_LOG;
-
- if(mCoilsResetFd != NULL) {
- int attr;
- rewind(mCoilsResetFd);
- fscanf(mCoilsResetFd, "%d", &attr);
- if(attr == 0)
- return 0;
- else {
- LOGV_IF(SYSFS_VERBOSE, "HAL:overflow detected");
- rewind(mCoilsResetFd);
- if( fprintf(mCoilsResetFd, "%d", 0) < 0) {
- LOGE("HAL:could not write overunderflow");
- }
- else
- return 1;
- }
- }
- else {
- LOGE("HAL:could not read overunderflow");
- }
- return result;
-}
-#endif
-
-int CompassSensor::inv_init_sysfs_attributes(void)
-{
- VFUNC_LOG;
-
- unsigned char i = 0;
- char sysfs_path[MAX_SYSFS_NAME_LEN],
- iio_trigger_path[MAX_SYSFS_NAME_LEN], tbuf[2];
- char *sptr;
- char **dptr;
- int num;
- const char* compass = dev_full_name;
-
- pathP = (char*)malloc(
- sizeof(char[COMPASS_MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
- sptr = pathP;
- dptr = (char**)&compassSysFs;
- if (sptr == NULL)
- return -1;
-
- do {
- *dptr++ = sptr;
- sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
- } while (++i < COMPASS_MAX_SYSFS_ATTRB);
-
- // get proper (in absolute/relative) IIO path & build sysfs paths
- sprintf(sysfs_path, "%s%d", "/sys/bus/iio/devices/iio:device",
- find_type_by_name(compass, "iio:device"));
- sprintf(iio_trigger_path, "%s%d", "/sys/bus/iio/devices/trigger",
- find_type_by_name(compass, "iio:device"));
-
-#if defined COMPASS_AK8975
- inv_get_input_number(compass, &num);
- tbuf[0] = num + 0x30;
- tbuf[1] = 0;
- sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf);
- strcat(sysfs_path, "/ak8975");
-
- sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable");
- sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate");
- sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale");
- sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-#else /* IIO */
- sprintf(compassSysFs.chip_enable, "%s%s", sysfs_path, "/buffer/enable");
- sprintf(compassSysFs.in_timestamp_en, "%s%s", sysfs_path, "/scan_elements/in_timestamp_en");
- sprintf(compassSysFs.trigger_name, "%s%s", iio_trigger_path, "/name");
- sprintf(compassSysFs.current_trigger, "%s%s", sysfs_path, "/trigger/current_trigger");
- sprintf(compassSysFs.buffer_length, "%s%s", sysfs_path, "/buffer/length");
-
- sprintf(compassSysFs.compass_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_x_en");
- sprintf(compassSysFs.compass_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_y_en");
- sprintf(compassSysFs.compass_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_z_en");
- sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/sampling_frequency");
- sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/in_magn_scale");
- sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-
-#if defined COMPASS_YAS53x
- sprintf(compassSysFs.compass_attr_1, "%s%s", sysfs_path, "/overunderflow");
-#endif
-#endif
-
-#if 0
- // test print sysfs paths
- dptr = (char**)&compassSysFs;
- LOGI("sysfs path base: %s", sysfs_path);
- LOGI("trigger sysfs path base: %s", iio_trigger_path);
- for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) {
- LOGE("HAL:sysfs path: %s", *dptr++);
- }
-#endif
- return 0;
-}