2 * Copyright (C) 2014-2015 Intel Corporation.
5 #include <hardware/sensors.h>
7 #include "enumeration.h"
9 #include "description.h"
14 /* This is the IIO Sensors HAL module entry points file */
16 static int init_count;
18 static int activate (__attribute__((unused)) struct sensors_poll_device_t* dev,
19 int handle, int enabled)
25 if (init_count == 0 || handle < 0 || handle >= sensor_count)
28 entry_ts = get_timestamp_boot();
31 * The Intel sensor hub seems to have trouble enabling sensors before
32 * a sampling rate has been configured, and setting the sampling rate
33 * after it's been enabled does not seem to revive affected sensors.
34 * The issue does not show up with an up to date ISH firmware but as the
35 * updater is a Windows only tool and is not widely available, implement
36 * a workaround for this behavior. We set the initial sampling rate to
37 * 10 events per second when the sensor is enabled for the first time.
40 if (enabled && sensor_get_quirks(handle) & QUIRK_INITIAL_RATE) {
41 ALOGI("Forcing initial sampling rate\n");
42 sensor_activate(handle, 1, 0);
43 sensor_set_delay(handle, 100000000); /* Start with 100 ms */
44 sensor_activate(handle, 0, 0);
46 /* Clear flag for this sensor as do this only once */
47 sensor[handle].quirks ^= QUIRK_INITIAL_RATE;
50 ret = sensor_activate(handle, enabled, 0);
52 elapsed_ms = (int) ((get_timestamp_boot() - entry_ts) / 1000000);
56 ALOGI("Activation of sensor %s took %d ms\n", sensor[handle].friendly_name, elapsed_ms);
58 ALOGI("Deactivation of sensor %s took %d ms\n", sensor[handle].friendly_name, elapsed_ms);
65 static int set_delay (__attribute__((unused)) struct sensors_poll_device_t* dev,
66 int handle, int64_t ns)
70 if (init_count == 0 || handle < 0 || handle >= sensor_count)
74 * If this sensor relies on other sensors, try to propagate the
75 * requested sampling rate to the base sensors.
78 for (i=0; i<sensor[handle].base_count; i++)
79 sensor_set_delay(sensor[handle].base[i], ns);
81 return sensor_set_delay(handle, ns);
85 static int poll (__attribute__((unused)) struct sensors_poll_device_t* dev,
86 sensors_event_t* data, int count)
88 if (init_count == 0 || !data || count < 1)
91 return sensor_poll(data, count);
95 static int batch (__attribute__((unused)) struct sensors_poll_device_1* dev,
96 int sensor_handle, __attribute__((unused)) int flags,
97 int64_t sampling_period_ns,
98 __attribute__((unused)) int64_t max_report_latency_ns)
100 return set_delay ((struct sensors_poll_device_t*)dev,
101 sensor_handle, sampling_period_ns);
104 static int flush (__attribute__((unused)) struct sensors_poll_device_1* dev,
107 return sensor_flush (handle);
111 static int close_module (__attribute__((unused)) hw_device_t *device)
118 if (init_count == 0) {
119 ALOGI("Closing IIO sensors HAL module\n");
120 delete_enumeration_data();
121 delete_control_data();
128 static int initialize_module(const struct hw_module_t *module, const char *id,
129 struct hw_device_t** device)
131 static struct sensors_poll_device_1 poll_device;
133 if (strcmp(id, SENSORS_HARDWARE_POLL))
136 poll_device.common.tag = HARDWARE_DEVICE_TAG;
137 poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3;
138 poll_device.common.module = (struct hw_module_t*) module;
139 poll_device.common.close = close_module;
141 poll_device.activate = activate;
142 poll_device.setDelay = set_delay;
143 poll_device.poll = poll;
144 poll_device.batch = batch;
145 poll_device.flush = flush;
147 *device = &poll_device.common;
149 if (init_count == 0) {
150 ALOGI("Initializing IIO sensors HAL module\n");
151 allocate_control_data();
160 static struct hw_module_methods_t module_methods = {
161 .open = initialize_module
165 /* Externally visible module descriptor */
166 struct sensors_module_t __attribute__ ((visibility ("default")))
167 HAL_MODULE_INFO_SYM = {
169 .tag = HARDWARE_MODULE_TAG,
172 .id = SENSORS_HARDWARE_MODULE_ID,
173 .name = "IIO sensors HAL",
175 .methods = &module_methods,
177 .get_sensors_list = get_sensors_list