/*
- * Copyright (C) 2014-2015 Intel Corporation.
- */
+// Copyright (c) 2015 Intel Corporation
+//
+// 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 __COMMON_H__
#define __COMMON_H__
+#include <string.h>
+
#define MAX_DEVICES 9 /* Check iio devices 0 to MAX_DEVICES-1 */
#define MAX_SENSORS 12 /* We can handle as many sensors */
#define MAX_CHANNELS 4 /* We can handle as many channels per sensor */
#define DEV_FILE_PATH "/dev/iio:device%d"
#define BASE_PATH "/sys/bus/iio/devices/iio:device%d/"
#define TRIGGER_FILE_PATH "/sys/bus/iio/devices/trigger%d/name"
+#define IIO_DEVICES "/sys/bus/iio/devices/"
#define CHANNEL_PATH BASE_PATH "scan_elements/"
#define ENABLE_PATH BASE_PATH "buffer/enable"
+#define BUFFER_LENGTH_PATH BASE_PATH "buffer/length"
#define NAME_PATH BASE_PATH "name"
#define TRIGGER_PATH BASE_PATH "trigger/current_trigger"
#define EVENTS_PATH BASE_PATH "events/"
#define DEVICE_AVAIL_FREQ_PATH BASE_PATH "sampling_frequency_available"
#define ILLUMINATION_CALIBPATH BASE_PATH "in_illuminance_calibscale"
#define SENSOR_CALIB_BIAS_PATH BASE_PATH "in_%s_calibbias"
+#define MOUNTING_MATRIX_PATH BASE_PATH "mounting_matrix"
+
+#define CONFIGFS_TRIGGER_PATH "/sys/kernel/config/iio/triggers/"
#define PROP_BASE "ro.iio.%s.%s" /* Note: PROPERTY_KEY_MAX is small */
#define MAX_SENSOR_REPORT_SIZE 32 /* Sensor report buffer size */
#define MAX_DEVICE_REPORT_SIZE 32 /* iio device scan buffer size */
-#define MAX_NAME_SIZE 32
+#define MAX_NAME_SIZE 64
#define MAX_SENSOR_BASES 3 /* Max number of base sensors a sensor can rely on */
#define MODE_TRIGGER 2
#define MODE_EVENT 3
+
typedef struct
{
const char *type; /* event type; e.g: transition */
typedef struct
{
const char *tag; /* Prefix such as "accel", "gyro", "temp"... */
+ const char *shorthand;
const int type; /* Sensor type ; ex: SENSOR_TYPE_ACCELEROMETER */
const int num_channels; /* Expected iio channels for this sensor */
const int is_virtual; /* Is the sensor virtual or not */
char vendor_name[MAX_NAME_SIZE]; /* ex: Intel */
char init_trigger_name[MAX_NAME_SIZE]; /* ex: accel-name-dev1 */
char motion_trigger_name[MAX_NAME_SIZE];/* ex: accel-any-motion-dev1 */
+ char hrtimer_trigger_name[MAX_NAME_SIZE]; /*ex: accel-hr-dev1 */
+ int trigger_nr; /* trigger number associated with this device */
float max_range;
float resolution;
float power;
* more than one at a later time.
*/
sensors_event_t sample;
+ uint64_t event_id;
/*
* If the QUIRK_FIELD_ORDERING bit is set in quirks, the contents of this array are used in the finalization stage to swap sample fields
unsigned char order[MAX_CHANNELS];
/*
+ * If the QUIRK_MOUNTING_MATRIX bit is set in quirks, the contents of this matrix is used to correct the sample values so that it takes
+ * into account the way the sensor has been mounted on the PCB.
+ */
+ float mounting_matrix[9];
+
+ /** Count of available frequencies */
+ int avail_freqs_count;
+
+ /** Array of available frequencies */
+ float* avail_freqs;
+
+ /*
* Event counter - will be used to check if we have a significant sample for noisy sensors. We want to make sure we do not send any wrong
* events before filtering kicks in. We can also use it for statistics.
*/
*/
int needs_enable;
- int semi_arbitrated_rate; /* Arbitrated sampling rate before we considered other sensors co-located on the same iio device */
+ float semi_arbitrated_rate; /* Arbitrated sampling rate before we considered other sensors co-located on the same iio device */
}
sensor_info_t;
void discover_sensors(int dev_num, char *sysfs_base_path, char map[catalog_size],
void (*discover_sensor)(int, char*, char*));
+/*
+ * Macros associating iio sysfs entries to to sensor types ; see
+ * linux/kernel/drivers/iio/industrialio-core.c and
+ * hardware/libhardware/include/hardware/sensor.h
+ */
+
+#define DECLARE_VOID_CHANNEL(tag) \
+ tag, \
+ "", \
+ "", \
+ "", \
+ "", \
+ "", \
+ "", \
+
+#define DECLARE_CHANNEL(tag, spacer, name) \
+ name, \
+ "in_"tag spacer name"_en", \
+ "in_"tag spacer name"_type", \
+ "in_"tag spacer name"_index", \
+ "in_"tag spacer name"_raw", \
+ "in_"tag spacer name"_input", \
+ "in_"tag spacer name"_scale", \
+ 0, {{0}},
+
+#define DECLARE_NAMED_CHANNEL(tag, name) DECLARE_CHANNEL(tag, "_", name)
+
+#define DECLARE_GENERIC_CHANNEL(tag) DECLARE_CHANNEL(tag, "", "")
+
+#define DECLARE_EVENT(tag, spacer1, name, spacer2, type, spacer3, dir) \
+ type, dir, \
+ "in_"tag spacer1 name spacer2 type spacer3 dir"_en", \
+ "in_"tag spacer1 name spacer2 type spacer3 dir"_value", \
+
+#define DECLARE_GENERIC_EVENT(tag, name, type, dir) \
+ DECLARE_EVENT(tag, "_", name, "_", type, "_", dir)
+#define DECLARE_NAMED_EVENT(tag, name) \
+ DECLARE_EVENT(tag, "_", name, "","","","")
#endif