summaryrefslogtreecommitdiffstats
path: root/60xx/libsensors/SensorBase.cpp
diff options
context:
space:
mode:
authorVineeta Srivastava <vsrivastava@google.com>2013-06-04 14:28:40 -0700
committerVineeta Srivastava <vsrivastava@google.com>2013-06-04 16:03:11 -0700
commit501aae5c0464eab71924aa4e382e5f3c8885aece (patch)
tree8c7f402a6bfe9d18c75efdb73a919b915e9ddb35 /60xx/libsensors/SensorBase.cpp
parent60c042a376b34a7f4343752b96c1bc0bf4da31cc (diff)
downloadandroid_hardware_invensense-501aae5c0464eab71924aa4e382e5f3c8885aece.tar.gz
android_hardware_invensense-501aae5c0464eab71924aa4e382e5f3c8885aece.tar.bz2
android_hardware_invensense-501aae5c0464eab71924aa4e382e5f3c8885aece.zip
Prepare for commiting 6515 chip specifc drop.
Split /hardware/invensesnse code to chip specific 60xx and 65xx directories. Moved 6050 chip specific stuff into 60xx directory. Manta uses that. This will allow 6515 chip specific stuff go in 65xx directoryi which will be used by hammerhead. Change-Id: If7ae097cba5376bbc68c644f14fdb2689dee2da5
Diffstat (limited to '60xx/libsensors/SensorBase.cpp')
-rw-r--r--60xx/libsensors/SensorBase.cpp128
1 files changed, 128 insertions, 0 deletions
diff --git a/60xx/libsensors/SensorBase.cpp b/60xx/libsensors/SensorBase.cpp
new file mode 100644
index 0000000..79b1ee2
--- /dev/null
+++ b/60xx/libsensors/SensorBase.cpp
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2008 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.
+ */
+
+#include <fcntl.h>
+#include <errno.h>
+#include <math.h>
+#include <poll.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/select.h>
+
+#include <cutils/log.h>
+
+#include <linux/input.h>
+
+#include "SensorBase.h"
+
+/*****************************************************************************/
+
+SensorBase::SensorBase(
+ const char* dev_name,
+ const char* data_name)
+ : dev_name(dev_name), data_name(data_name),
+ dev_fd(-1), data_fd(-1)
+{
+ if (data_name) {
+ data_fd = openInput(data_name);
+ }
+}
+
+SensorBase::~SensorBase() {
+ if (data_fd >= 0) {
+ close(data_fd);
+ }
+ if (dev_fd >= 0) {
+ close(dev_fd);
+ }
+}
+
+int SensorBase::open_device() {
+ if (dev_fd<0 && dev_name) {
+ dev_fd = open(dev_name, O_RDONLY);
+ ALOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
+ }
+ return 0;
+}
+
+int SensorBase::close_device() {
+ if (dev_fd >= 0) {
+ close(dev_fd);
+ dev_fd = -1;
+ }
+ return 0;
+}
+
+int SensorBase::getFd() const {
+ if (!data_name) {
+ return dev_fd;
+ }
+ return data_fd;
+}
+
+int SensorBase::setDelay(int32_t handle, int64_t ns) {
+ return 0;
+}
+
+bool SensorBase::hasPendingEvents() const {
+ return false;
+}
+
+int64_t SensorBase::getTimestamp() {
+ struct timespec t;
+ t.tv_sec = t.tv_nsec = 0;
+ clock_gettime(CLOCK_MONOTONIC, &t);
+ return int64_t(t.tv_sec)*1000000000LL + t.tv_nsec;
+}
+
+int SensorBase::openInput(const char* inputName) {
+ int fd = -1;
+ const char *dirname = "/dev/input";
+ char devname[PATH_MAX];
+ char *filename;
+ DIR *dir;
+ struct dirent *de;
+ dir = opendir(dirname);
+ if(dir == NULL)
+ return -1;
+ strcpy(devname, dirname);
+ filename = devname + strlen(devname);
+ *filename++ = '/';
+ while((de = readdir(dir))) {
+ if(de->d_name[0] == '.' &&
+ (de->d_name[1] == '\0' ||
+ (de->d_name[1] == '.' && de->d_name[2] == '\0')))
+ continue;
+ strcpy(filename, de->d_name);
+ fd = open(devname, O_RDONLY);
+ if (fd>=0) {
+ char name[80];
+ if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
+ name[0] = '\0';
+ }
+ if (!strcmp(name, inputName)) {
+ strcpy(input_name, filename);
+ break;
+ } else {
+ close(fd);
+ fd = -1;
+ }
+ }
+ }
+ closedir(dir);
+ ALOGE_IF(fd<0, "couldn't find '%s' input device", inputName);
+ return fd;
+}