X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=enumeration.c;h=c43ec8312a7af1a036a6b3f3c272f662e26a92a4;hb=cda77fa4f1de5197c40d1845a382f9abaa4818a4;hp=c8fa34a6c8c09df96ca14e31648018fb9a752957;hpb=cea652e22655f5e72d24a2d7e9d1dc51aa4aaf8e;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/enumeration.c b/enumeration.c index c8fa34a..c43ec83 100644 --- a/enumeration.c +++ b/enumeration.c @@ -1,6 +1,18 @@ /* - * 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. +*/ #include #include @@ -17,6 +29,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 +239,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 +506,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 +583,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); @@ -636,6 +667,8 @@ static int add_sensor (int dev_num, int catalog_index, int mode) sensor[s].channel[c].raw_path_present = (access(sysfs_path, R_OK) != -1); } + sensor_get_available_frequencies(s); + if (sensor_get_mounting_matrix(s, sensor[s].mounting_matrix)) sensor[s].quirks |= QUIRK_MOUNTING_MATRIX; else @@ -863,12 +896,16 @@ static void update_sensor_matching_trigger_name (char name[MAX_NAME_SIZE], int* } } +extern float sensor_get_max_static_freq(int s); +extern float sensor_get_min_freq (int s); + static int create_hrtimer_trigger(int s, int trigger) { struct stat dir_status; char buf[MAX_NAME_SIZE]; char hrtimer_path[PATH_MAX]; char hrtimer_name[MAX_NAME_SIZE]; + float min_supported_rate = 1, min_rate_cap, max_supported_rate; snprintf(buf, MAX_NAME_SIZE, "hrtimer-%s-hr-dev%d", sensor[s].internal_name, sensor[s].dev_num); snprintf(hrtimer_name, MAX_NAME_SIZE, "%s-hr-dev%d", sensor[s].internal_name, sensor[s].dev_num); @@ -885,6 +922,27 @@ static int create_hrtimer_trigger(int s, int trigger) strncpy (sensor[s].hrtimer_trigger_name, hrtimer_name, MAX_NAME_SIZE); sensor[s].trigger_nr = trigger; + + max_supported_rate = sensor_get_max_static_freq(s); + + /* set 0 for wrong values */ + if (max_supported_rate < 0.1) { + max_supported_rate = 0; + } + + sensor[s].max_supported_rate = max_supported_rate; + sensor_desc[s].minDelay = max_supported_rate ? (int32_t) (1000000.0 / max_supported_rate) : 0; + + /* Check if a minimum rate was specified for this sensor */ + min_rate_cap = sensor_get_min_freq(s); + + if (min_supported_rate < min_rate_cap) { + min_supported_rate = min_rate_cap; + } + + sensor[s].min_supported_rate = min_supported_rate; + sensor_desc[s].maxDelay = (max_delay_t) (1000000.0 / min_supported_rate); + return 0; } @@ -975,6 +1033,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