1  /*
2   * Copyright (C) 2015 The Android Open Source Project
3   *
4   * Licensed under the Apache License, Version 2.0 (the "License");
5   * you may not use this file except in compliance with the License.
6   * You may obtain a copy of the License at
7   *
8   *      http://www.apache.org/licenses/LICENSE-2.0
9   *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  #define LOG_TAG "sensors"
18  #define LOG_NDEBUG  1
19  #include <utils/Log.h>
20  
21  #include "hubconnection.h"
22  #include "sensorlist.h"
23  #include "sensors.h"
24  
25  #include <cutils/ashmem.h>
26  #include <errno.h>
27  #include <math.h>
28  #include <media/stagefright/foundation/ADebug.h>
29  #include <string.h>
30  #include <sys/mman.h>
31  #include <stdlib.h>
32  
33  #ifdef DYNAMIC_SENSOR_EXT_ENABLED
34  #include <DynamicSensorManager.h>
35  #include <SensorEventCallback.h>
36  #endif
37  
38  #ifdef LEFTY_SERVICE_ENABLED
39  #include "lefty_service.h"
40  #endif
41  
42  using namespace android;
43  
44  ////////////////////////////////////////////////////////////////////////////////
45  
SensorContext(const struct hw_module_t * module)46  SensorContext::SensorContext(const struct hw_module_t *module)
47          : mSensorList(kSensorList, kSensorList + kSensorCount),
48            mHubConnection(HubConnection::getInstance()) {
49      memset(&device, 0, sizeof(device));
50  
51      device.common.tag = HARDWARE_DEVICE_TAG;
52      device.common.version = SENSORS_DEVICE_API_VERSION_1_4;
53      device.common.module = const_cast<hw_module_t *>(module);
54      device.common.close = CloseWrapper;
55      device.activate = ActivateWrapper;
56      device.setDelay = SetDelayWrapper;
57      device.poll = PollWrapper;
58      device.batch = BatchWrapper;
59      device.flush = FlushWrapper;
60      device.inject_sensor_data = InjectSensorDataWrapper;
61      mHubConnection->setRawScale(kScaleAccel, kScaleMag);
62      if (mHubConnection->isDirectReportSupported()) {
63          device.register_direct_channel = RegisterDirectChannelWrapper;
64          device.config_direct_report = ConfigDirectReportWrapper;
65      }
66  
67      mOperationHandler.emplace_back(new HubConnectionOperation(mHubConnection));
68  
69      initializeHalExtension();
70  }
71  
close()72  int SensorContext::close() {
73      ALOGV("close");
74  
75      delete this;
76  
77      return 0;
78  }
79  
activate(int handle,int enabled)80  int SensorContext::activate(int handle, int enabled) {
81      ALOGV("activate");
82  
83      for (auto &h : mOperationHandler) {
84          if (h->owns(handle)) {
85              return h->activate(handle, enabled);
86          }
87      }
88      return INVALID_OPERATION;
89  }
90  
setDelay(int handle,int64_t delayNs)91  int SensorContext::setDelay(int handle, int64_t delayNs) {
92      ALOGV("setDelay");
93  
94      for (auto &h: mOperationHandler) {
95          if (h->owns(handle)) {
96              return h->setDelay(handle, delayNs);
97          }
98      }
99      return INVALID_OPERATION;
100  }
101  
poll(sensors_event_t * data,int count)102  int SensorContext::poll(sensors_event_t *data, int count) {
103      ALOGV("poll");
104  
105      // Release wakelock if held and no more events in ring buffer
106      mHubConnection->releaseWakeLockIfAppropriate();
107  
108      return mHubConnection->read(data, count);
109  }
110  
batch(int handle,int64_t sampling_period_ns,int64_t max_report_latency_ns)111  int SensorContext::batch(
112          int handle,
113          int64_t sampling_period_ns,
114          int64_t max_report_latency_ns) {
115      ALOGV("batch");
116  
117      for (auto &h : mOperationHandler) {
118          if (h->owns(handle)) {
119              return h->batch(handle, sampling_period_ns, max_report_latency_ns);
120          }
121      }
122      return INVALID_OPERATION;
123  }
124  
flush(int handle)125  int SensorContext::flush(int handle) {
126      ALOGV("flush");
127  
128      for (auto &h : mOperationHandler) {
129          if (h->owns(handle)) {
130              return h->flush(handle);
131          }
132      }
133      return INVALID_OPERATION;
134  }
135  
register_direct_channel(const struct sensors_direct_mem_t * mem,int32_t channel_handle)136  int SensorContext::register_direct_channel(
137          const struct sensors_direct_mem_t *mem, int32_t channel_handle) {
138      if (mem) {
139          //add
140          return mHubConnection->addDirectChannel(mem);
141      } else {
142          //remove
143          mHubConnection->removeDirectChannel(channel_handle);
144          return NO_ERROR;
145      }
146  }
147  
config_direct_report(int32_t sensor_handle,int32_t channel_handle,const struct sensors_direct_cfg_t * config)148  int SensorContext::config_direct_report(
149          int32_t sensor_handle, int32_t channel_handle, const struct sensors_direct_cfg_t * config) {
150      int rate_level = config->rate_level;
151      return mHubConnection->configDirectReport(sensor_handle, channel_handle, rate_level);
152  }
153  
154  // static
CloseWrapper(struct hw_device_t * dev)155  int SensorContext::CloseWrapper(struct hw_device_t *dev) {
156      return reinterpret_cast<SensorContext *>(dev)->close();
157  }
158  
159  // static
ActivateWrapper(struct sensors_poll_device_t * dev,int handle,int enabled)160  int SensorContext::ActivateWrapper(
161          struct sensors_poll_device_t *dev, int handle, int enabled) {
162      return reinterpret_cast<SensorContext *>(dev)->activate(handle, enabled);
163  }
164  
165  // static
SetDelayWrapper(struct sensors_poll_device_t * dev,int handle,int64_t delayNs)166  int SensorContext::SetDelayWrapper(
167          struct sensors_poll_device_t *dev, int handle, int64_t delayNs) {
168      return reinterpret_cast<SensorContext *>(dev)->setDelay(handle, delayNs);
169  }
170  
171  // static
PollWrapper(struct sensors_poll_device_t * dev,sensors_event_t * data,int count)172  int SensorContext::PollWrapper(
173          struct sensors_poll_device_t *dev, sensors_event_t *data, int count) {
174      return reinterpret_cast<SensorContext *>(dev)->poll(data, count);
175  }
176  
177  // static
BatchWrapper(struct sensors_poll_device_1 * dev,int handle,int flags,int64_t sampling_period_ns,int64_t max_report_latency_ns)178  int SensorContext::BatchWrapper(
179          struct sensors_poll_device_1 *dev,
180          int handle,
181          int flags,
182          int64_t sampling_period_ns,
183          int64_t max_report_latency_ns) {
184      (void) flags;
185      return reinterpret_cast<SensorContext *>(dev)->batch(
186              handle, sampling_period_ns, max_report_latency_ns);
187  }
188  
189  // static
FlushWrapper(struct sensors_poll_device_1 * dev,int handle)190  int SensorContext::FlushWrapper(struct sensors_poll_device_1 *dev, int handle) {
191      return reinterpret_cast<SensorContext *>(dev)->flush(handle);
192  }
193  
194  // static
RegisterDirectChannelWrapper(struct sensors_poll_device_1 * dev,const struct sensors_direct_mem_t * mem,int channel_handle)195  int SensorContext::RegisterDirectChannelWrapper(struct sensors_poll_device_1 *dev,
196          const struct sensors_direct_mem_t* mem, int channel_handle) {
197      return reinterpret_cast<SensorContext *>(dev)->register_direct_channel(
198              mem, channel_handle);
199  }
200  
201  // static
ConfigDirectReportWrapper(struct sensors_poll_device_1 * dev,int sensor_handle,int channel_handle,const sensors_direct_cfg_t * config)202  int SensorContext::ConfigDirectReportWrapper(struct sensors_poll_device_1 *dev,
203          int sensor_handle, int channel_handle, const sensors_direct_cfg_t * config) {
204      return reinterpret_cast<SensorContext *>(dev)->config_direct_report(
205              sensor_handle, channel_handle, config);
206  }
207  
inject_sensor_data(const sensors_event_t * event)208  int SensorContext::inject_sensor_data(const sensors_event_t *event) {
209      ALOGV("inject_sensor_data");
210  
211      // only support set operation parameter, which will have handle == 0
212      if (event == nullptr || event->type != SENSOR_TYPE_ADDITIONAL_INFO) {
213          return -EINVAL;
214      }
215  
216      if (event->sensor != SENSORS_HANDLE_BASE - 1) {
217          return -ENOSYS;
218      }
219  
220      if (event->additional_info.type == AINFO_BEGIN
221              || event->additional_info.type == AINFO_END) {
222          return 0;
223      }
224  
225      mHubConnection->setOperationParameter(event->additional_info);
226      return 0;
227  }
228  
229  // static
InjectSensorDataWrapper(struct sensors_poll_device_1 * dev,const struct sensors_event_t * event)230  int SensorContext::InjectSensorDataWrapper(struct sensors_poll_device_1 *dev,
231          const struct sensors_event_t *event) {
232      return reinterpret_cast<SensorContext *>(dev)->inject_sensor_data(event);
233  }
234  
getHubAlive()235  bool SensorContext::getHubAlive() {
236      return (mHubConnection->initCheck() == OK && mHubConnection->getAliveCheck() == OK);
237  }
238  
getSensorList(sensor_t const ** list)239  size_t SensorContext::getSensorList(sensor_t const **list) {
240      ALOGE("sensor p = %p, n = %zu", mSensorList.data(), mSensorList.size());
241      *list = mSensorList.data();
242      return mSensorList.size();
243  }
244  
245  // HubConnectionOperation functions
HubConnectionOperation(sp<HubConnection> hubConnection)246  SensorContext::HubConnectionOperation::HubConnectionOperation(sp<HubConnection> hubConnection)
247          : mHubConnection(hubConnection) {
248      for (size_t i = 0; i < kSensorCount; i++) {
249          mHandles.emplace(kSensorList[i].handle);
250      }
251  }
252  
owns(int handle)253  bool SensorContext::HubConnectionOperation::owns(int handle) {
254      return mHandles.find(handle) != mHandles.end();
255  }
256  
activate(int handle,int enabled)257  int SensorContext::HubConnectionOperation::activate(int handle, int enabled) {
258      mHubConnection->queueActivate(handle, enabled);
259      return 0;
260  }
261  
setDelay(int handle,int64_t delayNs)262  int SensorContext::HubConnectionOperation::setDelay(int handle, int64_t delayNs) {
263      // clamp sample rate based on minDelay and maxDelay defined in kSensorList
264      int64_t delayNsClamped = delayNs;
265      for (size_t i = 0; i < kSensorCount; i++) {
266          sensor_t sensor = kSensorList[i];
267          if (sensor.handle != handle) {
268              continue;
269          }
270  
271          if ((sensor.flags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) {
272              if ((delayNs/1000) < sensor.minDelay) {
273                  delayNsClamped = sensor.minDelay * 1000;
274              } else if ((delayNs/1000) > sensor.maxDelay) {
275                  delayNsClamped = sensor.maxDelay * 1000;
276              }
277          }
278  
279          break;
280      }
281  
282      mHubConnection->queueSetDelay(handle, delayNsClamped);
283      return 0;
284  }
285  
batch(int handle,int64_t sampling_period_ns,int64_t max_report_latency_ns)286  int SensorContext::HubConnectionOperation::batch(
287          int handle, int64_t sampling_period_ns,
288          int64_t max_report_latency_ns) {
289      // clamp sample rate based on minDelay and maxDelay defined in kSensorList
290      int64_t sampling_period_ns_clamped = sampling_period_ns;
291      for (size_t i = 0; i < kSensorCount; i++) {
292          sensor_t sensor = kSensorList[i];
293          if (sensor.handle != handle) {
294              continue;
295          }
296  
297          if ((sensor.flags & REPORTING_MODE_MASK) == SENSOR_FLAG_CONTINUOUS_MODE) {
298              if ((sampling_period_ns/1000) < sensor.minDelay) {
299                  sampling_period_ns_clamped = sensor.minDelay * 1000;
300              } else if ((sampling_period_ns/1000) > sensor.maxDelay) {
301                  sampling_period_ns_clamped = sensor.maxDelay * 1000;
302              }
303          }
304  
305          break;
306      }
307  
308      mHubConnection->queueBatch(handle, sampling_period_ns_clamped,
309                                 max_report_latency_ns);
310      return 0;
311  }
312  
flush(int handle)313  int SensorContext::HubConnectionOperation::flush(int handle) {
314      mHubConnection->queueFlush(handle);
315      return 0;
316  }
317  
318  #ifdef DYNAMIC_SENSOR_EXT_ENABLED
319  namespace {
320  // adaptor class
321  class Callback : public SensorEventCallback {
322  public:
Callback(sp<HubConnection> hubConnection)323      Callback(sp<HubConnection> hubConnection) : mHubConnection(hubConnection) {}
324      virtual int submitEvent(sp<BaseSensorObject> source, const sensors_event_t &e) override;
325  private:
326      sp<HubConnection> mHubConnection;
327  };
328  
submitEvent(sp<BaseSensorObject> source,const sensors_event_t & e)329  int Callback::submitEvent(sp<BaseSensorObject> source, const sensors_event_t &e) {
330      (void) source; // irrelavent in this context
331      return (mHubConnection->write(&e, 1) == 1) ? 0 : -ENOSPC;
332  }
333  } // anonymous namespace
334  
DynamicSensorManagerOperation(DynamicSensorManager * manager)335  SensorContext::DynamicSensorManagerOperation::DynamicSensorManagerOperation(DynamicSensorManager* manager)
336          : mDynamicSensorManager(manager) {
337  }
338  
owns(int handle)339  bool SensorContext::DynamicSensorManagerOperation::owns(int handle) {
340      return mDynamicSensorManager->owns(handle);
341  }
342  
activate(int handle,int enabled)343  int SensorContext::DynamicSensorManagerOperation::activate(int handle, int enabled) {
344      return mDynamicSensorManager->activate(handle, enabled);
345  }
346  
setDelay(int handle,int64_t delayNs)347  int SensorContext::DynamicSensorManagerOperation::setDelay(int handle, int64_t delayNs) {
348      return mDynamicSensorManager->setDelay(handle, delayNs);
349  }
350  
batch(int handle,int64_t sampling_period_ns,int64_t max_report_latency_ns)351  int SensorContext::DynamicSensorManagerOperation::batch(int handle, int64_t sampling_period_ns,
352          int64_t max_report_latency_ns) {
353      return mDynamicSensorManager->batch(handle, sampling_period_ns, max_report_latency_ns);
354  }
355  
flush(int handle)356  int SensorContext::DynamicSensorManagerOperation::flush(int handle) {
357      return mDynamicSensorManager->flush(handle);
358  }
359  #endif
360  
initializeHalExtension()361  void SensorContext::initializeHalExtension() {
362  #ifdef DYNAMIC_SENSOR_EXT_ENABLED
363      // initialize callback and dynamic sensor manager
364      mEventCallback.reset(new Callback(mHubConnection));
365      DynamicSensorManager* manager = DynamicSensorManager::createInstance(
366          kDynamicHandleBase, kMaxDynamicHandleCount, mEventCallback.get());
367  
368      // add meta sensor to list
369      mSensorList.push_back(manager->getDynamicMetaSensor());
370  
371      // register operation
372      mOperationHandler.emplace_back(new DynamicSensorManagerOperation(manager));
373  #endif
374  }
375  
376  ////////////////////////////////////////////////////////////////////////////////
377  
378  static bool gHubAlive;
379  static sensor_t const *sensor_list;
380  static int n_sensor;
381  
open_sensors(const struct hw_module_t * module,const char *,struct hw_device_t ** dev)382  static int open_sensors(
383          const struct hw_module_t *module,
384          const char *,
385          struct hw_device_t **dev) {
386      ALOGV("open_sensors");
387  
388      SensorContext *ctx = new SensorContext(module);
389      n_sensor = ctx->getSensorList(&sensor_list);
390      gHubAlive = ctx->getHubAlive();
391      *dev = &ctx->device.common;
392  
393  #ifdef LEFTY_SERVICE_ENABLED
394      register_lefty_service();
395  #endif
396      return 0;
397  }
398  
399  static struct hw_module_methods_t sensors_module_methods = {
400      .open = open_sensors
401  };
402  
get_sensors_list(struct sensors_module_t *,struct sensor_t const ** list)403  static int get_sensors_list(
404          struct sensors_module_t *,
405          struct sensor_t const **list) {
406      ALOGV("get_sensors_list");
407      if (gHubAlive && sensor_list != nullptr) {
408          *list = sensor_list;
409          return n_sensor;
410      } else {
411          *list = {};
412          return 0;
413      }
414  }
415  
set_operation_mode(unsigned int mode)416  static int set_operation_mode(unsigned int mode) {
417      ALOGV("set_operation_mode");
418  
419      // This is no-op because there is no sensor in the hal that system can
420      // inject events. Only operation parameter injection is implemented, which
421      // works in both data injection and normal mode.
422      (void) mode;
423      return 0;
424  }
425  
426  struct sensors_module_t HAL_MODULE_INFO_SYM = {
427          .common = {
428                  .tag = HARDWARE_MODULE_TAG,
429                  .version_major = 1,
430                  .version_minor = 0,
431                  .id = SENSORS_HARDWARE_MODULE_ID,
432                  .name = "Google Sensor module",
433                  .author = "Google",
434                  .methods = &sensors_module_methods,
435                  .dso  = NULL,
436                  .reserved = {0},
437          },
438          .get_sensors_list = get_sensors_list,
439          .set_operation_mode = set_operation_mode,
440  };
441