1ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* 2ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Copyright (C) 2008 The Android Open Source Project 3ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 4ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Licensed under the Apache License, Version 2.0 (the "License"); 5ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * you may not use this file except in compliance with the License. 6ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * You may obtain a copy of the License at 7ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 8ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * http://www.apache.org/licenses/LICENSE-2.0 9ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * 10ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * Unless required by applicable law or agreed to in writing, software 11ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * distributed under the License is distributed on an "AS IS" BASIS, 12ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * See the License for the specific language governing permissions and 14ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * limitations under the License. 15ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 16ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 17ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define LOG_TAG "Sensors" 18ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 19ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <hardware/sensors.h> 20ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <fcntl.h> 21ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <errno.h> 22ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <dirent.h> 23ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <math.h> 24ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <poll.h> 25ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <pthread.h> 26ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <stdlib.h> 27ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 28ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <linux/input.h> 29ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 30ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <utils/Atomic.h> 31ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include <utils/Log.h> 32ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 33ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "sensors.h" 34ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 35ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#if defined SENSORHAL_ACC_ADXL346 36ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AdxlSensor.h" 37ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#elif defined SENSORHAL_ACC_KXTF9 38ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "KionixSensor.h" 39ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#else 40ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#error "Sensor configuration ERROR: No sensor is defined." 41ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 42ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 43ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#include "AkmSensor.h" 44ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 45ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 46ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 47ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define DELAY_OUT_TIME 0x7FFFFFFF 48ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 49ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define LIGHT_SENSOR_POLLTIME 2000000000 50ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 51ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 52ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ACCELERATION (1<<ID_A) 53ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_MAGNETIC_FIELD (1<<ID_M) 54ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ORIENTATION (1<<ID_O) 55ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 56ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ACCELERATION_HANDLE 0 57ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_MAGNETIC_FIELD_HANDLE 1 58ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#define SENSORS_ORIENTATION_HANDLE 2 59ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 60ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 61ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 62ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/* The SENSORS Module */ 63ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic const struct sensor_t sSensorList[] = { 64ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda { "AK8975 3-axis Magnetic field sensor", 65ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda "Asahi Kasei Microdevices", 66ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 1, 67ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSORS_MAGNETIC_FIELD_HANDLE, 68ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSOR_TYPE_MAGNETIC_FIELD, 1228.8f, 69af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella CONVERT_M, 0.35f, 10000, 0, 0, 0, 0, 0, 0, { } }, 70ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_ADXL346 71ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda { "Analog Devices ADXL345/6 3-axis Accelerometer", 72ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda "ADI", 73ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 1, SENSORS_ACCELERATION_HANDLE, 74ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSOR_TYPE_ACCELEROMETER, (GRAVITY_EARTH * 16.0f), 75af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella (GRAVITY_EARTH * 16.0f) / 4096.0f, 0.145f, 10000, 0, 0, 0, 0, 0, 0, { } }, 76ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda { "AK8975 Orientation sensor", 77ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda "Asahi Kasei Microdevices", 78ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 1, SENSORS_ORIENTATION_HANDLE, 79ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSOR_TYPE_ORIENTATION, 360.0f, 80af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella CONVERT_O, 0.495f, 10000, 0, 0, 0, 0, 0, 0, { } } 81ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 82ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_KXTF9 83ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda { "Kionix KXTF9 3-axis Accelerometer", 84ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda "Kionix", 85ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 1, SENSORS_ACCELERATION_HANDLE, 86ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSOR_TYPE_ACCELEROMETER, (GRAVITY_EARTH * 2.0f), 87af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella (GRAVITY_EARTH) / 1024.0f, 0.7f, 10000, 0, 0, 0, 0, 0, 0, { } }, 88ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda { "AK8975 Orientation sensor", 89ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda "Asahi Kasei Microdevices", 90ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 1, SENSORS_ORIENTATION_HANDLE, 91ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SENSOR_TYPE_ORIENTATION, 360.0f, 92af614e0b09ba9ef358f82092fdbf04efb6fb1dc5Aravind Akella CONVERT_O, 1.05f, 10000, 0, 0, 0, 0, 0, 0, { } } 93ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 94ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}; 95ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 96ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 97ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int open_sensors(const struct hw_module_t* module, const char* id, 98ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda struct hw_device_t** device); 99ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 100ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int sensors__get_sensors_list(struct sensors_module_t* module, 10185d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev struct sensor_t const** list) 102ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 103ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *list = sSensorList; 104ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return ARRAY_SIZE(sSensorList); 105ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 106ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 107ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic struct hw_module_methods_t sensors_module_methods = { 10885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .open = open_sensors 109ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}; 110ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 111ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastruct sensors_module_t HAL_MODULE_INFO_SYM = { 11285d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .common = { 11385d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .tag = HARDWARE_MODULE_TAG, 11485d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .version_major = 1, 11585d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .version_minor = 0, 11685d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .id = SENSORS_HARDWARE_MODULE_ID, 11785d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .name = "AKM Sensor module", 11885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .author = "Asahi Kasei Microdevices", 11985d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .methods = &sensors_module_methods, 120ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda }, 12185d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev .get_sensors_list = sensors__get_sensors_list, 122ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}; 123ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 124ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastruct sensors_poll_context_t { 125ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda struct sensors_poll_device_t device; // must be first 126ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 127ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t(); 128ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ~sensors_poll_context_t(); 129ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int activate(int handle, int enabled); 130ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int setDelay(int handle, int64_t ns); 131ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int setDelay_sub(int handle, int64_t ns); 132ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int pollEvents(sensors_event_t* data, int count); 133ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 134ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaprivate: 135ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda enum { 136ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda acc = 0, 137ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda akm = 1, 138ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda numSensorDrivers, 139ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda numFds, 140ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda }; 141ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 142ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda static const size_t wake = numFds - 1; 143ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda static const char WAKE_MESSAGE = 'W'; 144ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda struct pollfd mPollFds[numFds]; 145ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int mWritePipeFd; 146ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SensorBase* mSensors[numSensorDrivers]; 147ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 14885d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev /* These function will be different depends on 149ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda * which sensor is implemented in AKMD program. 150ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda */ 151ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int handleToDriver(int handle); 152ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int proxy_enable(int handle, int enabled); 153ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int proxy_setDelay(int handle, int64_t ns); 154ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda}; 155ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 156ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 157ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 158ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudasensors_poll_context_t::sensors_poll_context_t() 159ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 160ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_ADXL346 161ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mSensors[acc] = new AdxlSensor(); 162ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 163ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#ifdef SENSORHAL_ACC_KXTF9 164ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mSensors[acc] = new KionixSensor(); 165ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda#endif 166ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[acc].fd = mSensors[acc]->getFd(); 167ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[acc].events = POLLIN; 168ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[acc].revents = 0; 169ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 170ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mSensors[akm] = new AkmSensor(); 171ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[akm].fd = mSensors[akm]->getFd(); 172ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[akm].events = POLLIN; 173ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[akm].revents = 0; 174ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 175ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int wakeFds[2]; 176ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int result = pipe(wakeFds); 177ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE_IF(result<0, "error creating wake pipe (%s)", strerror(errno)); 178ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda fcntl(wakeFds[0], F_SETFL, O_NONBLOCK); 179ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda fcntl(wakeFds[1], F_SETFL, O_NONBLOCK); 180ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mWritePipeFd = wakeFds[1]; 181ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 182ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[wake].fd = wakeFds[0]; 183ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[wake].events = POLLIN; 184ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[wake].revents = 0; 185ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 186ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 187ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudasensors_poll_context_t::~sensors_poll_context_t() { 188ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda for (int i=0 ; i<numSensorDrivers ; i++) { 189ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda delete mSensors[i]; 190ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 191ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda close(mPollFds[wake].fd); 192ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda close(mWritePipeFd); 193ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 194ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 195ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::handleToDriver(int handle) { 196ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda switch (handle) { 197ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_A: 198ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return acc; 199ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_M: 200ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_O: 201ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return akm; 202ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 203ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return -EINVAL; 204ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 205ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 206ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::activate(int handle, int enabled) { 207ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int drv = handleToDriver(handle); 208ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int err; 209ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 210ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda switch (handle) { 211ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_A: 212ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_M: 213ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* No dependencies */ 214ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 215ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 216ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_O: 217ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* These sensors depend on ID_A and ID_M */ 218ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mSensors[handleToDriver(ID_A)]->setEnable(ID_A, enabled); 219ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mSensors[handleToDriver(ID_M)]->setEnable(ID_M, enabled); 220ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 221ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 222ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda default: 223ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return -EINVAL; 224ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 225ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda err = mSensors[drv]->setEnable(handle, enabled); 226ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 227ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (enabled && !err) { 228ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda const char wakeMessage(WAKE_MESSAGE); 229ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int result = write(mWritePipeFd, &wakeMessage, 1); 230ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE_IF(result<0, "error sending wake message (%s)", strerror(errno)); 231ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 232ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return err; 233ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 234ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 235ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::setDelay(int handle, int64_t ns) { 236ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda switch (handle) { 237ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_A: 238ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_M: 239ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* No dependencies */ 240ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 241ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 242ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda case ID_O: 243ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* These sensors depend on ID_A and ID_M */ 244ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda setDelay_sub(ID_A, ns); 245ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda setDelay_sub(ID_M, ns); 246ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda break; 247ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 248ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda default: 249ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return -EINVAL; 250ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 251ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return setDelay_sub(handle, ns); 252ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 253ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 254ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::setDelay_sub(int handle, int64_t ns) { 255ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int drv = handleToDriver(handle); 256ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int en = mSensors[drv]->getEnable(handle); 257ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int64_t cur = mSensors[drv]->getDelay(handle); 258ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int err = 0; 259ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 260ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (en <= 1) { 261ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* no dependencies */ 262ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (cur != ns) { 263ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda err = mSensors[drv]->setDelay(handle, ns); 264ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 265ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } else { 266ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda /* has dependencies, choose shorter interval */ 267ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (cur > ns) { 268ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda err = mSensors[drv]->setDelay(handle, ns); 26985d3473b2b6814a7f0d47cccae0c1af86cc53a9esynergy dev } 270ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 271ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return err; 272ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 273ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 274ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudaint sensors_poll_context_t::pollEvents(sensors_event_t* data, int count) 275ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 276ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int nbEvents = 0; 277ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int n = 0; 278ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 279ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda do { 280ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // see if we have some leftover from the last poll() 281ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda for (int i=0 ; count && i<numSensorDrivers ; i++) { 282ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda SensorBase* const sensor(mSensors[i]); 283ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((mPollFds[i].revents & POLLIN) || (sensor->hasPendingEvents())) { 284ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int nb = sensor->readEvents(data, count); 285ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (nb < count) { 286ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // no more data for this sensor 287ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[i].revents = 0; 288ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 289ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if ((0 != nb) && (acc == i)) { 290ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ((AkmSensor*)(mSensors[akm]))->setAccel(&data[nb-1]); 291ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 292ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda count -= nb; 293ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda nbEvents += nb; 294ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda data += nb; 295ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 296ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 297ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 298ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (count) { 299ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // we still have some room, so try to see if we can get 300ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // some events immediately or just wait if we don't have 301ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // anything to return 302ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda n = poll(mPollFds, numFds, nbEvents ? 0 : -1); 303ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (n<0) { 304ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE("poll() failed (%s)", strerror(errno)); 305ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return -errno; 306ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 307ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (mPollFds[wake].revents & POLLIN) { 308ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda char msg; 309ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int result = read(mPollFds[wake].fd, &msg, 1); 310ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE_IF(result<0, "error reading from wake pipe (%s)", strerror(errno)); 311ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda ALOGE_IF(msg != WAKE_MESSAGE, "unknown message on wake queue (0x%02x)", int(msg)); 312ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda mPollFds[wake].revents = 0; 313ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 314ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 315ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda // if we have events and space, go read them 316ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } while (n && count); 317ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 318ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return nbEvents; 319ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 320ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 321ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 322ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 323ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__close(struct hw_device_t *dev) 324ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 325ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 326ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda if (ctx) { 327ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda delete ctx; 328ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda } 329ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return 0; 330ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 331ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 332ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__activate(struct sensors_poll_device_t *dev, 333ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int handle, int enabled) { 334ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 335ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return ctx->activate(handle, enabled); 336ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 337ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 338ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__setDelay(struct sensors_poll_device_t *dev, 339ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int handle, int64_t ns) { 340ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 341ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return ctx->setDelay(handle, ns); 342ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 343ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 344ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int poll__poll(struct sensors_poll_device_t *dev, 345ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_event_t* data, int count) { 346ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev; 347ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return ctx->pollEvents(data, count); 348ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 349ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 350ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/*****************************************************************************/ 351ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 352ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda/** Open a new instance of a sensor device using name */ 353ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masudastatic int open_sensors(const struct hw_module_t* module, const char* id, 354ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda struct hw_device_t** device) 355ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda{ 356ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda int status = -EINVAL; 357ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda sensors_poll_context_t *dev = new sensors_poll_context_t(); 358ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 359ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda memset(&dev->device, 0, sizeof(sensors_poll_device_t)); 360ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 361ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.common.tag = HARDWARE_DEVICE_TAG; 362ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.common.version = 0; 363ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.common.module = const_cast<hw_module_t*>(module); 364ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.common.close = poll__close; 365ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.activate = poll__activate; 366ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.setDelay = poll__setDelay; 367ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda dev->device.poll = poll__poll; 368ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 369ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda *device = &dev->device.common; 370ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda status = 0; 371ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 372ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda return status; 373ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda} 374ab17e987e7f5371df91fe4e137fcf9041489ffdfTsuyoshi Masuda 375