X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=enumeration.c;h=c236b25868555276e98ece9bea27716851a4f474;hb=45c968846622ba2f3467bd2a5b481f1de424ee8c;hp=0db6c8b9ab15eefd06ad7239974aa96900322437;hpb=b1efe3a07dc7a3cbc22cb7e8a87961c399457153;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/enumeration.c b/enumeration.c index 0db6c8b..c236b25 100644 --- a/enumeration.c +++ b/enumeration.c @@ -14,7 +14,6 @@ #include "description.h" #include "control.h" #include "calibration.h" -#include "filtering.h" /* * This table maps syfs entries in scan_elements directories to sensor types, @@ -29,7 +28,7 @@ * from the same iio device as the base one. */ -struct sensor_catalog_entry_t sensor_catalog[] = { +sensor_catalog_entry_t sensor_catalog[] = { DECLARE_SENSOR3("accel", SENSOR_TYPE_ACCELEROMETER, "x", "y", "z") DECLARE_SENSOR3("anglvel", SENSOR_TYPE_GYROSCOPE, "x", "y", "z") DECLARE_SENSOR3("magn", SENSOR_TYPE_MAGNETIC_FIELD, "x", "y", "z") @@ -40,7 +39,7 @@ struct sensor_catalog_entry_t sensor_catalog[] = { "quat_x", "quat_y", "quat_z", "quat_w") DECLARE_SENSOR0("temp", SENSOR_TYPE_AMBIENT_TEMPERATURE ) DECLARE_SENSOR0("proximity", SENSOR_TYPE_PROXIMITY ) - DECLARE_SENSOR3("anglvel", SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, "x", "y", "z") + DECLARE_VIRTUAL(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED ) }; #define CATALOG_SIZE ARRAY_SIZE(sensor_catalog) @@ -52,13 +51,13 @@ struct sensor_catalog_entry_t sensor_catalog[] = { /* We equate sensor handles to indices in these tables */ -struct sensor_t sensor_desc[MAX_SENSORS]; /* Android-level descriptors */ -struct sensor_info_t sensor_info[MAX_SENSORS]; /* Internal descriptors */ -int sensor_count; /* Detected sensors */ +struct sensor_t sensor_desc[MAX_SENSORS]; /* Android-level descriptors */ +sensor_info_t sensor[MAX_SENSORS]; /* Internal descriptors */ +int sensor_count; /* Detected sensors */ -static void setup_properties_from_pld(int s, int panel, int rotation, - int num_channels) +static void setup_properties_from_pld (int s, int panel, int rotation, + int num_channels) { /* * Generate suitable order and opt_scale directives from the PLD panel @@ -101,15 +100,15 @@ static void setup_properties_from_pld(int s, int panel, int rotation, } if (xy_swap) { - sensor_info[s].order[0] = 1; - sensor_info[s].order[1] = 0; - sensor_info[s].order[2] = 2; - sensor_info[s].quirks |= QUIRK_FIELD_ORDERING; + sensor[s].order[0] = 1; + sensor[s].order[1] = 0; + sensor[s].order[2] = 2; + sensor[s].quirks |= QUIRK_FIELD_ORDERING; } - sensor_info[s].channel[0].opt_scale = x; - sensor_info[s].channel[1].opt_scale = y; - sensor_info[s].channel[2].opt_scale = z; + sensor[s].channel[0].opt_scale = x; + sensor[s].channel[1].opt_scale = y; + sensor[s].channel[2].opt_scale = z; } @@ -200,6 +199,76 @@ static void decode_placement_information (int dev_num, int num_channels, int s) } +static void populate_descriptors (int s, int sensor_type) +{ + int32_t min_delay_us; + max_delay_t max_delay_us; + + /* Initialize Android-visible descriptor */ + sensor_desc[s].name = sensor_get_name(s); + sensor_desc[s].vendor = sensor_get_vendor(s); + sensor_desc[s].version = sensor_get_version(s); + sensor_desc[s].handle = s; + sensor_desc[s].type = sensor_type; + + sensor_desc[s].maxRange = sensor_get_max_range(s); + sensor_desc[s].resolution = sensor_get_resolution(s); + sensor_desc[s].power = sensor_get_power(s); + sensor_desc[s].stringType = sensor_get_string_type(s); + + /* None of our supported sensors requires a special permission */ + sensor_desc[s].requiredPermission = ""; + + sensor_desc[s].flags = sensor_get_flags(s); + sensor_desc[s].minDelay = sensor_get_min_delay(s); + sensor_desc[s].maxDelay = sensor_get_max_delay(s); + + ALOGV("Sensor %d (%s) type(%d) minD(%d) maxD(%d) flags(%2.2x)\n", + s, sensor[s].friendly_name, sensor_desc[s].type, + sensor_desc[s].minDelay, sensor_desc[s].maxDelay, + sensor_desc[s].flags); + + /* We currently do not implement batching */ + sensor_desc[s].fifoReservedEventCount = 0; + sensor_desc[s].fifoMaxEventCount = 0; + + min_delay_us = sensor_desc[s].minDelay; + max_delay_us = sensor_desc[s].maxDelay; + + sensor[s].min_supported_rate = max_delay_us ? 1000000.0 / max_delay_us : 1; + sensor[s].max_supported_rate = min_delay_us && min_delay_us != -1 ? 1000000.0 / min_delay_us : 0; +} + + +static void add_virtual_sensor (int catalog_index) +{ + int s; + int sensor_type; + + if (sensor_count == MAX_SENSORS) { + ALOGE("Too many sensors!\n"); + return; + } + + sensor_type = sensor_catalog[catalog_index].type; + + s = sensor_count; + + sensor[s].is_virtual = 1; + sensor[s].catalog_index = catalog_index; + sensor[s].type = sensor_type; + + populate_descriptors(s, sensor_type); + + /* Initialize fields related to sysfs reads offloading */ + sensor[s].thread_data_fd[0] = -1; + sensor[s].thread_data_fd[1] = -1; + sensor[s].acquisition_thread = -1; + + sensor_count++; +} + + static void add_sensor (int dev_num, int catalog_index, int use_polling) { int s; @@ -229,15 +298,16 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) s = sensor_count; - sensor_info[s].dev_num = dev_num; - sensor_info[s].catalog_index = catalog_index; + sensor[s].dev_num = dev_num; + sensor[s].catalog_index = catalog_index; + sensor[s].type = sensor_type; num_channels = sensor_catalog[catalog_index].num_channels; if (use_polling) - sensor_info[s].num_channels = 0; + sensor[s].num_channels = 0; else - sensor_info[s].num_channels = num_channels; + sensor[s].num_channels = num_channels; prefix = sensor_catalog[catalog_index].tag; @@ -245,7 +315,7 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) * receiving the illumination sensor calibration inputs from * the Android properties and setting it within sysfs */ - if (sensor_catalog[catalog_index].type == SENSOR_TYPE_LIGHT) { + if (sensor_type == SENSOR_TYPE_LIGHT) { retval = sensor_get_illumincalib(s); if (retval > 0) { sprintf(sysfs_path, ILLUMINATION_CALIBPATH, dev_num); @@ -255,20 +325,39 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) /* Read name attribute, if available */ sprintf(sysfs_path, NAME_PATH, dev_num); - sysfs_read_str(sysfs_path, sensor_info[s].internal_name, MAX_NAME_SIZE); + sysfs_read_str(sysfs_path, sensor[s].internal_name, MAX_NAME_SIZE); /* See if we have general offsets and scale values for this sensor */ sprintf(sysfs_path, SENSOR_OFFSET_PATH, dev_num, prefix); - sysfs_read_float(sysfs_path, &sensor_info[s].offset); + sysfs_read_float(sysfs_path, &sensor[s].offset); + + sprintf(sysfs_path, SENSOR_SCALE_PATH, dev_num, prefix); + if (!sensor_get_fl_prop(s, "scale", &scale)) { + /* + * There is a chip preferred scale specified, + * so try to store it in sensor's scale file + */ + if (sysfs_write_float(sysfs_path, scale) == -1 && errno == ENOENT) { + ALOGE("Failed to store scale[%g] into %s - file is missing", scale, sysfs_path); + /* Store failed, try to store the scale into channel specific file */ + for (c = 0; c < num_channels; c++) + { + sprintf(sysfs_path, BASE_PATH "%s", dev_num, + sensor_catalog[catalog_index].channel[c].scale_path); + if (sysfs_write_float(sysfs_path, scale) == -1) + ALOGE("Failed to store scale[%g] into %s", scale, sysfs_path); + } + } + } sprintf(sysfs_path, SENSOR_SCALE_PATH, dev_num, prefix); if (!sysfs_read_float(sysfs_path, &scale)) { - sensor_info[s].scale = scale; - ALOGI("Scale path:%s scale:%f dev_num:%d\n", + sensor[s].scale = scale; + ALOGV("Scale path:%s scale:%g dev_num:%d\n", sysfs_path, scale, dev_num); } else { - sensor_info[s].scale = 1; + sensor[s].scale = 1; /* Read channel specific scale if any*/ for (c = 0; c < num_channels; c++) @@ -277,11 +366,11 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) sensor_catalog[catalog_index].channel[c].scale_path); if (!sysfs_read_float(sysfs_path, &scale)) { - sensor_info[s].channel[c].scale = scale; - sensor_info[s].scale = 0; + sensor[s].channel[c].scale = scale; + sensor[s].scale = 0; - ALOGI( "Scale path:%s " - "channel scale:%f dev_num:%d\n", + ALOGV( "Scale path:%s " + "channel scale:%g dev_num:%d\n", sysfs_path, scale, dev_num); } } @@ -289,10 +378,10 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) /* Set default scaling - if num_channels is zero, we have one channel */ - sensor_info[s].channel[0].opt_scale = 1; + sensor[s].channel[0].opt_scale = 1; for (c = 1; c < num_channels; c++) - sensor_info[s].channel[c].opt_scale = 1; + sensor[s].channel[c].opt_scale = 1; /* Read ACPI _PLD attributes for this sensor, if there are any */ decode_placement_information(dev_num, num_channels, s); @@ -311,75 +400,50 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling) ch_name = sensor_catalog[catalog_index].channel[c].name; sprintf(suffix, "%s.opt_scale", ch_name); if (!sensor_get_fl_prop(s, suffix, &opt_scale)) - sensor_info[s].channel[c].opt_scale = opt_scale; + sensor[s].channel[c].opt_scale = opt_scale; } } else if (!sensor_get_fl_prop(s, "opt_scale", &opt_scale)) - sensor_info[s].channel[0].opt_scale = opt_scale; + sensor[s].channel[0].opt_scale = opt_scale; - /* Initialize Android-visible descriptor */ - sensor_desc[s].name = sensor_get_name(s); - sensor_desc[s].vendor = sensor_get_vendor(s); - sensor_desc[s].version = sensor_get_version(s); - sensor_desc[s].handle = s; - sensor_desc[s].type = sensor_type; - sensor_desc[s].maxRange = sensor_get_max_range(s); - sensor_desc[s].resolution = sensor_get_resolution(s); - sensor_desc[s].power = sensor_get_power(s); - sensor_desc[s].stringType = sensor_get_string_type(s); + populate_descriptors(s, sensor_type); - /* None of our supported sensors requires a special permission. - * If this will be the case we should implement a sensor_get_perm - */ - sensor_desc[s].requiredPermission = ""; - sensor_desc[s].flags = sensor_get_flags(s); - sensor_desc[s].minDelay = sensor_get_min_delay(s); - sensor_desc[s].maxDelay = sensor_get_max_delay(s); - ALOGI("Sensor %d (%s) type(%d) minD(%d) maxD(%d) flags(%2.2x)\n", - s, sensor_info[s].friendly_name, sensor_desc[s].type, - sensor_desc[s].minDelay, sensor_desc[s].maxDelay, sensor_desc[s].flags); + /* Populate the quirks array */ + sensor_get_quirks(s); - /* We currently do not implement batching when we'll so - * these should be overriden appropriately - */ - sensor_desc[s].fifoReservedEventCount = 0; - sensor_desc[s].fifoMaxEventCount = 0; - - if (sensor_info[s].internal_name[0] == '\0') { + if (sensor[s].internal_name[0] == '\0') { /* * In case the kernel-mode driver doesn't expose a name for * the iio device, use (null)-dev%d as the trigger name... * This can be considered a kernel-mode iio driver bug. */ ALOGW("Using null trigger on sensor %d (dev %d)\n", s, dev_num); - strcpy(sensor_info[s].internal_name, "(null)"); + strcpy(sensor[s].internal_name, "(null)"); } - if (sensor_type == SENSOR_TYPE_GYROSCOPE || - sensor_type == SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) { - struct gyro_cal* calibration_data = calloc(1, sizeof(struct gyro_cal)); - sensor_info[s].cal_data = calibration_data; - denoise_median_init(s, 7, 3); - } + switch (sensor_type) { + case SENSOR_TYPE_GYROSCOPE: + sensor[s].cal_data = malloc(sizeof(gyro_cal_t)); + break; - if (sensor_type == SENSOR_TYPE_MAGNETIC_FIELD) { - struct compass_cal* calibration_data = calloc(1, sizeof(struct compass_cal)); - sensor_info[s].cal_data = calibration_data; + case SENSOR_TYPE_MAGNETIC_FIELD: + sensor[s].cal_data = malloc(sizeof(compass_cal_t)); + break; } + sensor[s].max_cal_level = sensor_get_cal_steps(s); + /* Select one of the available sensor sample processing styles */ select_transform(s); /* Initialize fields related to sysfs reads offloading */ - sensor_info[s].thread_data_fd[0] = -1; - sensor_info[s].thread_data_fd[1] = -1; - sensor_info[s].acquisition_thread = -1; - - sensor_info[s].meta_data_pending = 0; + sensor[s].thread_data_fd[0] = -1; + sensor[s].thread_data_fd[1] = -1; + sensor[s].acquisition_thread = -1; /* Check if we have a special ordering property on this sensor */ - if (sensor_get_order(s, sensor_info[s].order)) - sensor_info[s].quirks |= QUIRK_FIELD_ORDERING; + if (sensor_get_order(s, sensor[s].order)) + sensor[s].quirks |= QUIRK_FIELD_ORDERING; sensor_count++; } @@ -409,9 +473,9 @@ static void discover_poll_sensors (int dev_num, char map[CATALOG_SIZE]) continue; /* If the name matches a catalog entry, flag it */ - for (i = 0; id_name,sensor_catalog[i].channel[c].raw_path) || @@ -451,7 +515,8 @@ static void discover_trig_sensors (int dev_num, char map[CATALOG_SIZE]) /* Compare en entry to known ones and create matching sensors */ for (i = 0; id_name, sensor_catalog[i].channel[0].en_path)) { @@ -465,7 +530,7 @@ static void discover_trig_sensors (int dev_num, char map[CATALOG_SIZE]) } -static void orientation_sensor_check(void) +static void orientation_sensor_check (void) { /* * If we have accel + gyro + magn but no rotation vector sensor, @@ -486,7 +551,7 @@ static void orientation_sensor_check(void) int catalog_size = CATALOG_SIZE; for (i=0; i