X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=enumeration.c;h=25b07e7adaa5f1df3f498fe8b942d984c438d108;hb=b27955f055242b9fc17832ae248a615d57ee85a9;hp=c8fa34a6c8c09df96ca14e31648018fb9a752957;hpb=cea652e22655f5e72d24a2d7e9d1dc51aa4aaf8e;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/enumeration.c b/enumeration.c index c8fa34a..25b07e7 100644 --- a/enumeration.c +++ b/enumeration.c @@ -17,6 +17,8 @@ #include "control.h" #include "calibration.h" +#include + /* * This table maps syfs entries in scan_elements directories to sensor types, * and will also be used to determine other sysfs names as well as the iio @@ -225,6 +227,9 @@ unsigned int catalog_size = ARRAY_SIZE(sensor_catalog); #define PANEL_FRONT 4 #define PANEL_BACK 5 +/* Buffer default length */ +#define BUFFER_LENGTH 16 + /* We equate sensor handles to indices in these tables */ struct sensor_t sensor_desc[MAX_SENSORS]; /* Android-level descriptors */ @@ -489,6 +494,7 @@ static int add_sensor (int dev_num, int catalog_index, int mode) int num_channels; char suffix[MAX_NAME_SIZE + 8]; int calib_bias; + int buffer_length; if (sensor_count == MAX_SENSORS) { ALOGE("Too many sensors!\n"); @@ -565,6 +571,19 @@ static int add_sensor (int dev_num, int catalog_index, int mode) sysfs_write_int(sysfs_path, calib_bias); } + /* Change buffer length according to the property or use default value */ + if (mode == MODE_TRIGGER) { + if (sensor_get_prop(s, "buffer_length", &buffer_length)) { + buffer_length = BUFFER_LENGTH; + } + + sprintf(sysfs_path, BUFFER_LENGTH_PATH, dev_num); + + if (sysfs_write_int(sysfs_path, buffer_length) <= 0) { + ALOGE("Failed to set buffer length on dev%d", dev_num); + } + } + /* Read name attribute, if available */ sprintf(sysfs_path, NAME_PATH, dev_num); sysfs_read_str(sysfs_path, sensor[s].internal_name, MAX_NAME_SIZE); @@ -975,6 +994,53 @@ static void post_process_sensor_list (char poll_map[catalog_size], char trig_map } +static void swap_sensors (int s1, int s2) +{ + struct sensor_t temp_sensor_desc; + sensor_info_t temp_sensor; + + /* S1 -> temp */ + memcpy(&temp_sensor, &sensor[s1], sizeof(sensor_info_t)); + memcpy(&temp_sensor_desc, &sensor_desc[s1], sizeof(struct sensor_t)); + + /* S2 -> S1 */ + memcpy(&sensor[s1], &sensor[s2], sizeof(sensor_info_t)); + memcpy(&sensor_desc[s1], &sensor_desc[s2], sizeof(struct sensor_t)); + + /* temp -> S2 */ + memcpy(&sensor[s2], &temp_sensor, sizeof(sensor_info_t)); + memcpy(&sensor_desc[s2], &temp_sensor_desc, sizeof(struct sensor_t)); + + /* Fix-up sensor id mapping, which is stale */ + sensor_desc[s1].handle = s1; + sensor_desc[s2].handle = s2; + + /* Fix up name and vendor buffer pointers, which are potentially stale pointers */ + sensor_desc[s1].name = sensor_get_name(s1); + sensor_desc[s1].vendor = sensor_get_vendor(s1); + sensor_desc[s2].name = sensor_get_name(s2); + sensor_desc[s2].vendor = sensor_get_vendor(s2); +} + + +static void reorder_sensors (void) +{ + /* Some sensors may be marked as secondary - these need to be listed after other sensors of the same type */ + int s1, s2; + + for (s1=0; s1