/* * 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