• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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