X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=description.c;h=36730ccc5251f241de68300d1891212206123f18;hb=a1f3c1145082b49c72e817c644858432e4c14c17;hp=6b5a5de91c3a8a0f70c16e234a740e2e47a43d66;hpb=a0caca20076314c05fac53649326349f728fa7d0;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/description.c b/description.c index 6b5a5de..36730cc 100644 --- a/description.c +++ b/description.c @@ -14,6 +14,9 @@ #define IIO_SENSOR_HAL_VERSION 1 +#define MIN_ON_CHANGE_SAMPLING_PERIOD_US 200000 /* For on change sensors (temperature, proximity, ALS, etc.) report we support 5 Hz max (0.2 s min period) */ +#define MAX_ON_CHANGE_SAMPLING_PERIOD_US 10000000 /* 0.1 Hz min (10 s max period)*/ + /* * About properties * @@ -397,6 +400,7 @@ int sensor_get_order (int s, unsigned char map[MAX_CHANNELS]) return 1; /* OK to use modified ordering map */ } + char* sensor_get_string_type (int s) { switch (sensor[s].type) { @@ -406,6 +410,9 @@ char* sensor_get_string_type (int s) case SENSOR_TYPE_MAGNETIC_FIELD: return SENSOR_STRING_TYPE_MAGNETIC_FIELD; + case SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED: + return SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED; + case SENSOR_TYPE_ORIENTATION: return SENSOR_STRING_TYPE_ORIENTATION; @@ -438,20 +445,12 @@ char* sensor_get_string_type (int s) } } + flag_t sensor_get_flags (int s) { - flag_t flags = 0x0; + flag_t flags = 0; switch (sensor[s].type) { - case SENSOR_TYPE_ACCELEROMETER: - case SENSOR_TYPE_MAGNETIC_FIELD: - case SENSOR_TYPE_ORIENTATION: - case SENSOR_TYPE_GYROSCOPE: - case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: - case SENSOR_TYPE_PRESSURE: - flags |= SENSOR_FLAG_CONTINUOUS_MODE; - break; - case SENSOR_TYPE_LIGHT: case SENSOR_TYPE_AMBIENT_TEMPERATURE: case SENSOR_TYPE_TEMPERATURE: @@ -466,42 +465,39 @@ flag_t sensor_get_flags (int s) break; default: - ALOGI("Unknown sensor"); + break; } return flags; } -int get_cdd_freq (int s, int must) + +static int get_cdd_freq (int s, int must) { switch (sensor[s].type) { case SENSOR_TYPE_ACCELEROMETER: return (must ? 100 : 200); /* must 100 Hz, should 200 Hz, CDD compliant */ + case SENSOR_TYPE_GYROSCOPE: - case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: return (must ? 200 : 200); /* must 200 Hz, should 200 Hz, CDD compliant */ + case SENSOR_TYPE_MAGNETIC_FIELD: return (must ? 10 : 50); /* must 10 Hz, should 50 Hz, CDD compliant */ + case SENSOR_TYPE_LIGHT: case SENSOR_TYPE_AMBIENT_TEMPERATURE: case SENSOR_TYPE_TEMPERATURE: return (must ? 1 : 2); /* must 1 Hz, should 2Hz, not mentioned in CDD */ + default: - return 0; + return 1; /* Use 1 Hz by default, e.g. for proximity */ } } -/* This value is defined only for continuous mode and on-change sensors. It is the delay between - * two sensor events corresponding to the lowest frequency that this sensor supports. When lower - * frequencies are requested through batch()/setDelay() the events will be generated at this - * frequency instead. It can be used by the framework or applications to estimate when the batch - * FIFO may be full. - * - * NOTE: 1) period_ns is in nanoseconds where as maxDelay/minDelay are in microseconds. - * continuous, on-change: maximum sampling period allowed in microseconds. - * one-shot, special : 0 - * 2) maxDelay should always fit within a 32 bit signed integer. It is declared as 64 bit - * on 64 bit architectures only for binary compatibility reasons. - * Availability: SENSORS_DEVICE_API_VERSION_1_3 +/* + * This value is defined only for continuous mode and on-change sensors. It is the delay between two sensor events corresponding to the lowest frequency that + * this sensor supports. When lower frequencies are requested through batch()/setDelay() the events will be generated at this frequency instead. It can be used + * by the framework or applications to estimate when the batch FIFO may be full. maxDelay should always fit within a 32 bit signed integer. It is declared as + * 64 bit on 64 bit architectures only for binary compatibility reasons. Availability: SENSORS_DEVICE_API_VERSION_1_3 */ max_delay_t sensor_get_max_delay (int s) { @@ -513,12 +509,21 @@ max_delay_t sensor_get_max_delay (int s) float rate_cap; float sr; - /* continuous, on-change: maximum sampling period allowed in microseconds. + /* + * continuous, on-change: maximum sampling period allowed in microseconds. * one-shot, special : 0 */ - if (REPORTING_MODE(sensor_desc[s].flags) == SENSOR_FLAG_ONE_SHOT_MODE || - REPORTING_MODE(sensor_desc[s].flags) == SENSOR_FLAG_SPECIAL_REPORTING_MODE) - return 0; + switch (REPORTING_MODE(sensor_desc[s].flags)) { + case SENSOR_FLAG_ONE_SHOT_MODE: + case SENSOR_FLAG_SPECIAL_REPORTING_MODE: + return 0; + + case SENSOR_FLAG_ON_CHANGE_MODE: + return MAX_ON_CHANGE_SAMPLING_PERIOD_US; + + default: + break; + } if (sensor[s].is_virtual) { switch (sensor[s].type) { @@ -532,8 +537,7 @@ max_delay_t sensor_get_max_delay (int s) sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); if (sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)) < 0) { - /* If poll mode sensor */ - if (!sensor[s].num_channels) { + if (sensor[s].is_polling) { /* The must rate */ min_supported_rate = get_cdd_freq(s, 1); } @@ -568,17 +572,11 @@ max_delay_t sensor_get_max_delay (int s) return 0; /* Return microseconds */ - return (max_delay_t)(1000000.0 / min_supported_rate); + return (max_delay_t) (1000000.0 / min_supported_rate); } -/* this value depends on the reporting mode: - * - * continuous: minimum sample period allowed in microseconds - * on-change : 0 - * one-shot :-1 - * special : 0, unless otherwise noted - */ -int32_t sensor_get_min_delay(int s) + +int32_t sensor_get_min_delay (int s) { char avail_sysfs_path[PATH_MAX]; int dev_num = sensor[s].dev_num; @@ -587,16 +585,23 @@ int32_t sensor_get_min_delay(int s) float max_supported_rate = 0; float sr; - /* continuous: minimum sampling period allowed in microseconds. - * on-change, special : 0 - * one-shot :-1 + /* continuous, on change: minimum sampling period allowed in microseconds. + * special : 0, unless otherwise noted + * one-shot:-1 */ - if (REPORTING_MODE(sensor_desc[s].flags) == SENSOR_FLAG_ON_CHANGE_MODE || - REPORTING_MODE(sensor_desc[s].flags) == SENSOR_FLAG_SPECIAL_REPORTING_MODE) - return 0; + switch (REPORTING_MODE(sensor_desc[s].flags)) { + case SENSOR_FLAG_ON_CHANGE_MODE: + return MIN_ON_CHANGE_SAMPLING_PERIOD_US; - if (REPORTING_MODE(sensor_desc[s].flags) == SENSOR_FLAG_ONE_SHOT_MODE) - return -1; + case SENSOR_FLAG_SPECIAL_REPORTING_MODE: + return 0; + + case SENSOR_FLAG_ONE_SHOT_MODE: + return -1; + + default: + break; + } if (sensor[s].is_virtual) { switch (sensor[s].type) { @@ -611,8 +616,7 @@ int32_t sensor_get_min_delay(int s) sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); if (sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)) < 0) { - /* If poll mode sensor */ - if (!sensor[s].num_channels) { + if (sensor[s].is_polling) { /* The should rate */ max_supported_rate = get_cdd_freq(s, 0); } @@ -641,5 +645,5 @@ int32_t sensor_get_min_delay(int s) return 0; /* Return microseconds */ - return (int32_t)(1000000.0 / max_supported_rate); + return (int32_t) (1000000.0 / max_supported_rate); }