| /* |
| * Copyright (C) 2008-2014 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. |
| */ |
| |
| #ifndef CROS_EC_SENSORS_H |
| #define CROS_EC_SENSORS_H |
| |
| #include <errno.h> |
| #include <stdint.h> |
| #include <sys/cdefs.h> |
| #include <sys/types.h> |
| #include <utils/BitSet.h> |
| |
| #include <hardware/sensors.h> |
| |
| #define IIO_DIR "/sys/bus/iio/devices/" |
| #define IIO_MAX_NAME_LENGTH 30 |
| #define IIO_MAX_BUFF_SIZE 4096 |
| #define INT32_CHAR_LEN 12 |
| |
| /* |
| * Use sizeof(...) - 1 instead of strlen because clang FORTIFY makes strlen |
| * non-constant. |
| */ |
| #define IIO_MAX_DEVICE_NAME_LENGTH (sizeof(IIO_DIR) - 1 + IIO_MAX_NAME_LENGTH) |
| |
| #define CROS_EC_MAX_SAMPLING_PERIOD ((1 << 16) - 2) |
| |
| enum {X, Y, Z, MAX_AXIS}; |
| |
| extern const char *cros_ec_sensor_names[]; |
| |
| #define CROS_EC_EVENT_FLUSH_FLAG 0x1 |
| #define CROS_EC_EVENT_WAKEUP_FLAG 0x2 |
| |
| #define CROS_EC_MAX_PHYSICAL_SENSOR 256 |
| |
| enum cros_ec_gesture { |
| CROS_EC_SIGMO, |
| CROS_EC_MAX_GESTURE, |
| }; |
| |
| |
| /*****************************************************************************/ |
| /* from ec_commands.h */ |
| struct cros_ec_event { |
| uint8_t sensor_id; |
| uint8_t flags; |
| union { |
| int16_t vector[MAX_AXIS]; |
| struct { |
| uint8_t activity; |
| uint8_t state; |
| uint16_t add_info[2]; |
| }; |
| }; |
| uint64_t timestamp; |
| } __packed; |
| |
| enum motionsensor_activity { |
| MOTIONSENSE_ACTIVITY_RESERVED = 0, |
| MOTIONSENSE_ACTIVITY_SIG_MOTION = 1, |
| MOTIONSENSE_MAX_ACTIVITY, |
| }; |
| |
| |
| /*****************************************************************************/ |
| |
| enum cros_ec_sensor_device { |
| CROS_EC_ACCEL, |
| CROS_EC_GYRO, |
| CROS_EC_MAG, |
| CROS_EC_PROX, |
| CROS_EC_LIGHT, |
| CROS_EC_ACTIVITY, |
| CROS_EC_RING, /* should be the last device */ |
| CROS_EC_MAX_DEVICE, |
| }; |
| |
| struct cros_ec_sensor_info { |
| /* description of the sensor, as reported to sensorservice. */ |
| sensor_t sensor_data; |
| enum cros_ec_sensor_device type; |
| const char *device_name; |
| int64_t sampling_period_ns; |
| int64_t max_report_latency_ns; |
| bool enabled; |
| }; |
| |
| struct cros_ec_gesture_info { |
| /* For activities managed by the sensor interface */ |
| sensor_t sensor_data; |
| const char *device_name; |
| const char *enable_entry; |
| bool enabled; |
| }; |
| |
| /* |
| * To write sysfs parameters: IIO_DIR is appended before path. |
| */ |
| int cros_ec_sysfs_set_input_attr(const char *path, const char *attr, const char *value, size_t len); |
| int cros_ec_sysfs_set_input_attr_by_int(const char *path, const char *attr, int value); |
| |
| /* |
| * To read sysfs parameters: IIO_DIR is NOT appended. |
| */ |
| int cros_ec_sysfs_get_attr(const char *path, const char *attr, char *output); |
| |
| class CrosECSensor { |
| struct cros_ec_sensor_info *mSensorInfo; |
| size_t mSensorNb; |
| struct cros_ec_gesture_info *mGestureInfo; |
| size_t mGestureNb; |
| char mRingPath[IIO_MAX_DEVICE_NAME_LENGTH]; |
| cros_ec_event mEvents[IIO_MAX_BUFF_SIZE]; |
| int mDataFd; |
| |
| int processEvent(sensors_event_t* data, const cros_ec_event *event); |
| public: |
| CrosECSensor( |
| struct cros_ec_sensor_info *sensor_info, |
| size_t sensor_nb, |
| struct cros_ec_gesture_info *gesture_info, |
| size_t gesture_nb, |
| const char *ring_device_name, |
| const char *trigger_name); |
| virtual ~CrosECSensor(); |
| virtual int getFd(void); |
| int readEvents(sensors_event_t* data, int count); |
| |
| virtual int activate(int handle, int enabled); |
| virtual int batch(int handle, int64_t period_ns, int64_t timeout); |
| virtual int flush(int handle); |
| }; |
| |
| #endif // CROS_EC_SENSORS_H |