hardware/intel/libsensors
Revision | 6dd7dd1b4b8fb2e833671956ad936cbd635ed4db (tree) |
---|---|
Zeit | 2015-08-12 00:18:12 |
Autor | buildslave <sys_buildbot@inte...> |
Commiter | buildslave |
Merge branch e35fc5677585eb789efb5c02e2de084fbedcd67d into android/master
Change-Id: I6d82ee93caa92676ff671d9b706ce7ee100aaed9
Tracked-On: https://jira01.devtools.intel.com/browse/CACTUS-3894
@@ -38,7 +38,7 @@ LOCAL_LDFLAGS := -Wl,--gc-sections | ||
38 | 38 | LOCAL_SHARED_LIBRARIES := liblog libcutils libdl |
39 | 39 | LOCAL_PRELINK_MODULE := false |
40 | 40 | LOCAL_SRC_FILES := $(src_files) |
41 | - | |
41 | +LOCAL_PROPRIETARY_MODULE := true | |
42 | 42 | include $(BUILD_SHARED_LIBRARY) |
43 | 43 | |
44 | 44 | include $(CLEAR_VARS) |
@@ -48,6 +48,7 @@ LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\" -fvisibility=hidden | ||
48 | 48 | LOCAL_SHARED_LIBRARIES := liblog libcutils libdl |
49 | 49 | LOCAL_SRC_FILES := sens.c |
50 | 50 | LOCAL_MODULE_TAGS := eng |
51 | +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) | |
51 | 52 | include $(BUILD_EXECUTABLE) |
52 | 53 | |
53 | 54 | endif |
@@ -74,7 +75,7 @@ LOCAL_LDFLAGS := -Wl,--gc-sections | ||
74 | 75 | LOCAL_SHARED_LIBRARIES := liblog libcutils |
75 | 76 | LOCAL_PRELINK_MODULE := false |
76 | 77 | LOCAL_SRC_FILES := $(activity_src_files) |
77 | - | |
78 | +LOCAL_PROPRIETARY_MODULE := true | |
78 | 79 | include $(BUILD_SHARED_LIBRARY) |
79 | 80 | |
80 | 81 | include $(CLEAR_VARS) |
@@ -84,6 +85,7 @@ LOCAL_CFLAGS := -DLOG_TAG=\"Activity\" -fvisibility=hidden | ||
84 | 85 | LOCAL_SHARED_LIBRARIES := liblog libcutils libdl |
85 | 86 | LOCAL_SRC_FILES := activity.c |
86 | 87 | LOCAL_MODULE_TAGS := eng |
88 | +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) | |
87 | 89 | include $(BUILD_EXECUTABLE) |
88 | 90 | |
89 | 91 | endif |
@@ -280,6 +280,12 @@ typedef struct | ||
280 | 280 | */ |
281 | 281 | float mounting_matrix[9]; |
282 | 282 | |
283 | + /** Count of available frequencies */ | |
284 | + int avail_freqs_count; | |
285 | + | |
286 | + /** Array of available frequencies */ | |
287 | + float* avail_freqs; | |
288 | + | |
283 | 289 | /* |
284 | 290 | * 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 |
285 | 291 | * events before filtering kicks in. We can also use it for statistics. |
@@ -36,11 +36,14 @@ static int poll_fd; /* epoll instance covering all enabled sensors */ | ||
36 | 36 | |
37 | 37 | static int active_poll_sensors; /* Number of enabled poll-mode sensors */ |
38 | 38 | |
39 | +static int flush_event_fd[2]; /* Pipe used for flush signaling */ | |
40 | + | |
39 | 41 | /* We use pthread condition variables to get worker threads out of sleep */ |
40 | 42 | static pthread_condattr_t thread_cond_attr [MAX_SENSORS]; |
41 | 43 | static pthread_cond_t thread_release_cond [MAX_SENSORS]; |
42 | 44 | static pthread_mutex_t thread_release_mutex [MAX_SENSORS]; |
43 | 45 | |
46 | +#define FLUSH_REPORT_TAG 900 | |
44 | 47 | /* |
45 | 48 | * We associate tags to each of our poll set entries. These tags have the following values: |
46 | 49 | * - a iio device number if the fd is a iio character device fd |
@@ -302,6 +305,8 @@ void build_sensor_report_maps (int dev_num) | ||
302 | 305 | known_channels++; |
303 | 306 | } |
304 | 307 | |
308 | + sensor_update_max_range(s); | |
309 | + | |
305 | 310 | /* Stop sampling - if we are recovering from hal restart */ |
306 | 311 | enable_buffer(dev_num, 0); |
307 | 312 | setup_trigger(s, "\n"); |
@@ -733,29 +738,18 @@ extern float sensor_get_max_freq (int s); | ||
733 | 738 | |
734 | 739 | static float select_closest_available_rate(int s, float requested_rate) |
735 | 740 | { |
736 | - char avail_sysfs_path[PATH_MAX]; | |
737 | - char freqs_buf[100]; | |
738 | - char* cursor; | |
739 | 741 | float sr; |
742 | + int j; | |
740 | 743 | float selected_rate = 0; |
741 | - float max_rate_from_prop; | |
744 | + float max_rate_from_prop = sensor_get_max_freq(s); | |
742 | 745 | int dev_num = sensor[s].dev_num; |
743 | 746 | |
744 | - sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); | |
745 | - if (sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)) <= 0) { | |
747 | + if (!sensor[s].avail_freqs_count) | |
746 | 748 | return requested_rate; |
747 | - } | |
748 | 749 | |
749 | - max_rate_from_prop = sensor_get_max_freq(s); | |
750 | - cursor = freqs_buf; | |
750 | + for (j = 0; j < sensor[s].avail_freqs_count; j++) { | |
751 | 751 | |
752 | - /* Decode allowed sampling rates string, ex: "10 20 50 100" */ | |
753 | - | |
754 | - /* While we're not at the end of the string */ | |
755 | - while (*cursor && cursor[0]) { | |
756 | - | |
757 | - /* Decode a single value */ | |
758 | - sr = strtod(cursor, NULL); | |
752 | + sr = sensor[s].avail_freqs[j]; | |
759 | 753 | |
760 | 754 | /* If this matches the selected rate, we're happy. Have some tolerance for rounding errors and avoid needless jumps to higher rates */ |
761 | 755 | if ((fabs(requested_rate - sr) <= 0.01) && (sr <= max_rate_from_prop)) { |
@@ -774,14 +768,6 @@ static float select_closest_available_rate(int s, float requested_rate) | ||
774 | 768 | if (sr > requested_rate) { |
775 | 769 | return selected_rate; |
776 | 770 | } |
777 | - | |
778 | - /* Skip digits */ | |
779 | - while (cursor[0] && !isspace(cursor[0])) | |
780 | - cursor++; | |
781 | - | |
782 | - /* Skip spaces */ | |
783 | - while (cursor[0] && isspace(cursor[0])) | |
784 | - cursor++; | |
785 | 771 | } |
786 | 772 | |
787 | 773 | /* Check for wrong values */ |
@@ -875,15 +861,10 @@ static int sensor_set_rate (int s, float requested_rate) | ||
875 | 861 | * frequency and current sampling rate are different */ |
876 | 862 | if (sysfs_read_float(hrtimer_sampling_path, &sr) != -1 && sr != cur_sampling_rate) |
877 | 863 | cur_sampling_rate = -1; |
878 | - } | |
879 | - | |
880 | - /* Check if we have contraints on allowed sampling rates */ | |
881 | - | |
882 | - if (!(sensor_get_quirks(s) & QUIRK_HRTIMER)) { | |
864 | + } else { | |
883 | 865 | arb_sampling_rate = select_closest_available_rate(s, arb_sampling_rate); |
884 | 866 | } |
885 | 867 | |
886 | - | |
887 | 868 | /* Record the rate that was agreed upon with the sensor taken in isolation ; this avoid uncontrolled ripple effects between colocated sensor rates */ |
888 | 869 | sensor[s].semi_arbitrated_rate = arb_sampling_rate; |
889 | 870 |
@@ -917,7 +898,7 @@ static int sensor_set_rate (int s, float requested_rate) | ||
917 | 898 | if (trig_sensors_per_dev[dev_num]) |
918 | 899 | enable_buffer(dev_num, 0); |
919 | 900 | |
920 | - if (sensor_get_quirks(s) & QUIRK_HRTIMER) { | |
901 | + if (sensor[s].hrtimer_trigger_name[0] != '\0') { | |
921 | 902 | sysfs_write_float(sysfs_path, select_closest_available_rate(s, arb_sampling_rate)); |
922 | 903 | } else { |
923 | 904 | sysfs_write_float(sysfs_path, arb_sampling_rate); |
@@ -1654,6 +1635,12 @@ await_event: | ||
1654 | 1635 | /* Get report from acquisition thread */ |
1655 | 1636 | integrate_thread_report(ev[i].data.u32); |
1656 | 1637 | break; |
1638 | + case FLUSH_REPORT_TAG: | |
1639 | + { | |
1640 | + char flush_event_content; | |
1641 | + read(flush_event_fd[0], &flush_event_content, sizeof(flush_event_content)); | |
1642 | + break; | |
1643 | + } | |
1657 | 1644 | |
1658 | 1645 | default: |
1659 | 1646 | ALOGW("Unexpected event source!\n"); |
@@ -1693,18 +1680,21 @@ int sensor_set_delay (int s, int64_t ns) | ||
1693 | 1680 | |
1694 | 1681 | int sensor_flush (int s) |
1695 | 1682 | { |
1683 | + char flush_event_content = 0; | |
1696 | 1684 | /* If one shot or not enabled return -EINVAL */ |
1697 | 1685 | if (sensor_desc[s].flags & SENSOR_FLAG_ONE_SHOT_MODE || !is_enabled(s)) |
1698 | 1686 | return -EINVAL; |
1699 | 1687 | |
1700 | 1688 | sensor[s].meta_data_pending++; |
1689 | + write(flush_event_fd[1], &flush_event_content, sizeof(flush_event_content)); | |
1701 | 1690 | return 0; |
1702 | 1691 | } |
1703 | 1692 | |
1704 | 1693 | |
1705 | 1694 | int allocate_control_data (void) |
1706 | 1695 | { |
1707 | - int i; | |
1696 | + int i, ret; | |
1697 | + struct epoll_event ev = {0}; | |
1708 | 1698 | |
1709 | 1699 | for (i=0; i<MAX_DEVICES; i++) { |
1710 | 1700 | device_fd[i] = -1; |
@@ -1718,6 +1708,21 @@ int allocate_control_data (void) | ||
1718 | 1708 | return -1; |
1719 | 1709 | } |
1720 | 1710 | |
1711 | + ret = pipe(flush_event_fd); | |
1712 | + if (ret) { | |
1713 | + ALOGE("Cannot create flush_event_fd"); | |
1714 | + return -1; | |
1715 | + } | |
1716 | + | |
1717 | + ev.events = EPOLLIN; | |
1718 | + ev.data.u32 = FLUSH_REPORT_TAG; | |
1719 | + ret = epoll_ctl(poll_fd, EPOLL_CTL_ADD, flush_event_fd[0] , &ev); | |
1720 | + if (ret == -1) { | |
1721 | + ALOGE("Failed adding %d to poll set (%s)\n", | |
1722 | + flush_event_fd[0], strerror(errno)); | |
1723 | + return -1; | |
1724 | + } | |
1725 | + | |
1721 | 1726 | return poll_fd; |
1722 | 1727 | } |
1723 | 1728 |
@@ -11,6 +11,7 @@ | ||
11 | 11 | #include "enumeration.h" |
12 | 12 | #include "description.h" |
13 | 13 | #include "utils.h" |
14 | +#include "transform.h" | |
14 | 15 | |
15 | 16 | #define IIO_SENSOR_HAL_VERSION 1 |
16 | 17 |
@@ -218,6 +219,60 @@ int sensor_get_version (__attribute__((unused)) int s) | ||
218 | 219 | return IIO_SENSOR_HAL_VERSION; |
219 | 220 | } |
220 | 221 | |
222 | +void sensor_update_max_range(int s) | |
223 | +{ | |
224 | + if (sensor[s].max_range) | |
225 | + return; | |
226 | + | |
227 | + if (sensor[s].num_channels && sensor[s].channel[0].type_info.realbits) { | |
228 | + switch (sensor[s].type) { | |
229 | + case SENSOR_TYPE_MAGNETIC_FIELD: | |
230 | + sensor[s].max_range = (1ULL << sensor[s].channel[0].type_info.realbits) * | |
231 | + CONVERT_MICROTESLA_TO_GAUSS(sensor[s].resolution) + | |
232 | + (sensor[s].offset || sensor[s].channel[0].offset); | |
233 | + sensor[s].max_range = CONVERT_GAUSS_TO_MICROTESLA(sensor[s].max_range); | |
234 | + break; | |
235 | + case SENSOR_TYPE_PROXIMITY: | |
236 | + break; | |
237 | + default: | |
238 | + sensor[s].max_range = (1ULL << sensor[s].channel[0].type_info.realbits) * | |
239 | + sensor[s].resolution + (sensor[s].offset || sensor[s].channel[0].offset); | |
240 | + break; | |
241 | + } | |
242 | + } | |
243 | + | |
244 | + if (!sensor[s].max_range) { | |
245 | + /* Try returning a sensible value given the sensor type */ | |
246 | + /* We should cap returned samples accordingly... */ | |
247 | + switch (sensor[s].type) { | |
248 | + case SENSOR_TYPE_ACCELEROMETER: /* m/s^2 */ | |
249 | + sensor[s].max_range = 50; | |
250 | + break; | |
251 | + case SENSOR_TYPE_MAGNETIC_FIELD: /* micro-tesla */ | |
252 | + sensor[s].max_range = 500; | |
253 | + break; | |
254 | + case SENSOR_TYPE_ORIENTATION: /* degrees */ | |
255 | + sensor[s].max_range = 360; | |
256 | + break; | |
257 | + case SENSOR_TYPE_GYROSCOPE: /* radians/s */ | |
258 | + sensor[s].max_range = 10; | |
259 | + break; | |
260 | + case SENSOR_TYPE_LIGHT: /* SI lux units */ | |
261 | + sensor[s].max_range = 50000; | |
262 | + break; | |
263 | + case SENSOR_TYPE_AMBIENT_TEMPERATURE: /* °C */ | |
264 | + case SENSOR_TYPE_TEMPERATURE: /* °C */ | |
265 | + case SENSOR_TYPE_PROXIMITY: /* centimeters */ | |
266 | + case SENSOR_TYPE_PRESSURE: /* hecto-pascal */ | |
267 | + case SENSOR_TYPE_RELATIVE_HUMIDITY: /* percent */ | |
268 | + sensor[s].max_range = 100; | |
269 | + break; | |
270 | + } | |
271 | + } | |
272 | + | |
273 | + if (sensor[s].max_range) | |
274 | + sensor_desc[s].maxRange = sensor[s].max_range; | |
275 | +} | |
221 | 276 | |
222 | 277 | float sensor_get_max_range (int s) |
223 | 278 | { |
@@ -236,39 +291,10 @@ float sensor_get_max_range (int s) | ||
236 | 291 | !sensor_get_fl_prop(s, "max_range", &sensor[s].max_range)) |
237 | 292 | return sensor[s].max_range; |
238 | 293 | |
239 | - /* Try returning a sensible value given the sensor type */ | |
240 | - | |
241 | - /* We should cap returned samples accordingly... */ | |
242 | - | |
243 | - switch (sensor_desc[s].type) { | |
244 | - case SENSOR_TYPE_ACCELEROMETER: /* m/s^2 */ | |
245 | - return 50; | |
246 | - | |
247 | - case SENSOR_TYPE_MAGNETIC_FIELD: /* micro-tesla */ | |
248 | - return 500; | |
249 | - | |
250 | - case SENSOR_TYPE_ORIENTATION: /* degrees */ | |
251 | - return 360; | |
252 | - | |
253 | - case SENSOR_TYPE_GYROSCOPE: /* radians/s */ | |
254 | - return 10; | |
255 | - | |
256 | - case SENSOR_TYPE_LIGHT: /* SI lux units */ | |
257 | - return 50000; | |
258 | - | |
259 | - case SENSOR_TYPE_AMBIENT_TEMPERATURE: /* °C */ | |
260 | - case SENSOR_TYPE_TEMPERATURE: /* °C */ | |
261 | - case SENSOR_TYPE_PROXIMITY: /* centimeters */ | |
262 | - case SENSOR_TYPE_PRESSURE: /* hecto-pascal */ | |
263 | - case SENSOR_TYPE_RELATIVE_HUMIDITY: /* percent */ | |
264 | - return 100; | |
265 | - | |
266 | - default: | |
267 | - return 0; | |
268 | - } | |
294 | + return 0; | |
269 | 295 | } |
270 | 296 | |
271 | -static float sensor_get_min_freq (int s) | |
297 | +float sensor_get_min_freq (int s) | |
272 | 298 | { |
273 | 299 | /* |
274 | 300 | * Check if a low cap has been specified for this sensor sampling rate. |
@@ -319,10 +345,18 @@ float sensor_get_resolution (int s) | ||
319 | 345 | } |
320 | 346 | |
321 | 347 | if (sensor[s].resolution != 0.0 || |
322 | - !sensor_get_fl_prop(s, "resolution", &sensor[s].resolution)) | |
323 | - return sensor[s].resolution; | |
348 | + !sensor_get_fl_prop(s, "resolution", &sensor[s].resolution)) { | |
349 | + return sensor[s].resolution; | |
350 | + } | |
324 | 351 | |
325 | - return 0; | |
352 | + sensor[s].resolution = sensor[s].scale; | |
353 | + if (!sensor[s].resolution && sensor[s].num_channels) | |
354 | + sensor[s].resolution = sensor[s].channel[0].scale; | |
355 | + | |
356 | + if (sensor[s].type == SENSOR_TYPE_MAGNETIC_FIELD) | |
357 | + sensor[s].resolution = CONVERT_GAUSS_TO_MICROTESLA(sensor[s].resolution); | |
358 | + | |
359 | + return sensor[s].resolution ? : 1; | |
326 | 360 | } |
327 | 361 | |
328 | 362 |
@@ -433,6 +467,35 @@ int sensor_get_order (int s, unsigned char map[MAX_CHANNELS]) | ||
433 | 467 | return 1; /* OK to use modified ordering map */ |
434 | 468 | } |
435 | 469 | |
470 | +int sensor_get_available_frequencies (int s) | |
471 | +{ | |
472 | + int dev_num = sensor[s].dev_num, err, i; | |
473 | + char avail_sysfs_path[PATH_MAX], freqs_buf[100]; | |
474 | + char *p, *end; | |
475 | + float f; | |
476 | + | |
477 | + sensor[s].avail_freqs_count = 0; | |
478 | + sensor[s].avail_freqs = 0; | |
479 | + | |
480 | + sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); | |
481 | + | |
482 | + err = sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)); | |
483 | + if (err < 0) | |
484 | + return 0; | |
485 | + | |
486 | + for (p = freqs_buf, f = strtof(p, &end); p != end; p = end, f = strtof(p, &end)) | |
487 | + sensor[s].avail_freqs_count++; | |
488 | + | |
489 | + if (sensor[s].avail_freqs_count) { | |
490 | + sensor[s].avail_freqs = (float*) calloc(sensor[s].avail_freqs_count, sizeof(float)); | |
491 | + | |
492 | + for (p = freqs_buf, f = strtof(p, &end), i = 0; p != end; p = end, f = strtof(p, &end), i++) | |
493 | + sensor[s].avail_freqs[i] = f; | |
494 | + } | |
495 | + | |
496 | + return 0; | |
497 | +} | |
498 | + | |
436 | 499 | int sensor_get_mounting_matrix (int s, float mm[9]) |
437 | 500 | { |
438 | 501 | int dev_num = sensor[s].dev_num, err, i; |
@@ -585,13 +648,9 @@ static int get_cdd_freq (int s, int must) | ||
585 | 648 | */ |
586 | 649 | max_delay_t sensor_get_max_delay (int s) |
587 | 650 | { |
588 | - char avail_sysfs_path[PATH_MAX]; | |
589 | - int dev_num = sensor[s].dev_num; | |
590 | - char freqs_buf[100]; | |
591 | - char* cursor; | |
651 | + int dev_num = sensor[s].dev_num, i; | |
592 | 652 | float min_supported_rate; |
593 | 653 | float rate_cap; |
594 | - float sr; | |
595 | 654 | |
596 | 655 | /* |
597 | 656 | * continuous, on-change: maximum sampling period allowed in microseconds. |
@@ -622,33 +681,14 @@ max_delay_t sensor_get_max_delay (int s) | ||
622 | 681 | switch (sensor[s].mode) { |
623 | 682 | case MODE_TRIGGER: |
624 | 683 | /* For interrupt-based devices, obey the list of supported sampling rates */ |
625 | - sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); | |
626 | - if (!(sensor_get_quirks(s) & QUIRK_HRTIMER) && | |
627 | - sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)) > 0) { | |
628 | - | |
684 | + if (sensor[s].avail_freqs_count) { | |
629 | 685 | min_supported_rate = 1000; |
630 | - cursor = freqs_buf; | |
631 | - | |
632 | - while (*cursor && cursor[0]) { | |
633 | - | |
634 | - /* Decode a single value */ | |
635 | - sr = strtod(cursor, NULL); | |
636 | - | |
637 | - if (sr < min_supported_rate) | |
638 | - min_supported_rate = sr; | |
639 | - | |
640 | - /* Skip digits */ | |
641 | - while (cursor[0] && !isspace(cursor[0])) | |
642 | - cursor++; | |
643 | - | |
644 | - /* Skip spaces */ | |
645 | - while (cursor[0] && isspace(cursor[0])) | |
646 | - cursor++; | |
686 | + for (i = 0; i < sensor[s].avail_freqs_count; i++) { | |
687 | + if (sensor[s].avail_freqs[i] < min_supported_rate) | |
688 | + min_supported_rate = sensor[s].avail_freqs[i]; | |
647 | 689 | } |
648 | - | |
649 | 690 | break; |
650 | 691 | } |
651 | - | |
652 | 692 | /* Fall through ... */ |
653 | 693 | |
654 | 694 | default: |
@@ -671,17 +711,24 @@ max_delay_t sensor_get_max_delay (int s) | ||
671 | 711 | return (max_delay_t) (1000000.0 / min_supported_rate); |
672 | 712 | } |
673 | 713 | |
714 | +float sensor_get_max_static_freq(int s) | |
715 | +{ | |
716 | + float max_from_prop = sensor_get_max_freq(s); | |
717 | + | |
718 | + /* If we have max specified via a property use it */ | |
719 | + if (max_from_prop != ANDROID_MAX_FREQ) { | |
720 | + return max_from_prop; | |
721 | + } else { | |
722 | + /* The should rate */ | |
723 | + return get_cdd_freq(s, 0); | |
724 | + } | |
725 | +} | |
674 | 726 | |
675 | 727 | int32_t sensor_get_min_delay (int s) |
676 | 728 | { |
677 | - char avail_sysfs_path[PATH_MAX]; | |
678 | - int dev_num = sensor[s].dev_num; | |
679 | - char freqs_buf[100]; | |
680 | - char* cursor; | |
729 | + int dev_num = sensor[s].dev_num, i; | |
681 | 730 | float max_supported_rate = 0; |
682 | 731 | float max_from_prop = sensor_get_max_freq(s); |
683 | - float sr; | |
684 | - int hrtimer_quirk_enabled = sensor_get_quirks(s) & QUIRK_HRTIMER; | |
685 | 732 | |
686 | 733 | /* continuous, on change: minimum sampling period allowed in microseconds. |
687 | 734 | * special : 0, unless otherwise noted |
@@ -711,10 +758,8 @@ int32_t sensor_get_min_delay (int s) | ||
711 | 758 | } |
712 | 759 | } |
713 | 760 | |
714 | - sprintf(avail_sysfs_path, DEVICE_AVAIL_FREQ_PATH, dev_num); | |
715 | - | |
716 | - if (hrtimer_quirk_enabled || sysfs_read_str(avail_sysfs_path, freqs_buf, sizeof(freqs_buf)) < 0) { | |
717 | - if (hrtimer_quirk_enabled || (sensor[s].mode == MODE_POLL)) { | |
761 | + if (!sensor[s].avail_freqs_count) { | |
762 | + if (sensor[s].mode == MODE_POLL) { | |
718 | 763 | /* If we have max specified via a property use it */ |
719 | 764 | if (max_from_prop != ANDROID_MAX_FREQ) |
720 | 765 | max_supported_rate = max_from_prop; |
@@ -723,22 +768,11 @@ int32_t sensor_get_min_delay (int s) | ||
723 | 768 | max_supported_rate = get_cdd_freq(s, 0); |
724 | 769 | } |
725 | 770 | } else { |
726 | - cursor = freqs_buf; | |
727 | - while (*cursor && cursor[0]) { | |
728 | - | |
729 | - /* Decode a single value */ | |
730 | - sr = strtod(cursor, NULL); | |
731 | - | |
732 | - if (sr > max_supported_rate && sr <= max_from_prop) | |
733 | - max_supported_rate = sr; | |
734 | - | |
735 | - /* Skip digits */ | |
736 | - while (cursor[0] && !isspace(cursor[0])) | |
737 | - cursor++; | |
738 | - | |
739 | - /* Skip spaces */ | |
740 | - while (cursor[0] && isspace(cursor[0])) | |
741 | - cursor++; | |
771 | + for (i = 0; i < sensor[s].avail_freqs_count; i++) { | |
772 | + if (sensor[s].avail_freqs[i] > max_supported_rate && | |
773 | + sensor[s].avail_freqs[i] <= max_from_prop) { | |
774 | + max_supported_rate = sensor[s].avail_freqs[i]; | |
775 | + } | |
742 | 776 | } |
743 | 777 | } |
744 | 778 |
@@ -34,6 +34,7 @@ char* sensor_get_name (int s); | ||
34 | 34 | char* sensor_get_vendor (int s); |
35 | 35 | int sensor_get_version (int s); |
36 | 36 | float sensor_get_max_range (int s); |
37 | +void sensor_update_max_range (int s); | |
37 | 38 | float sensor_get_resolution (int s); |
38 | 39 | float sensor_get_power (int s); |
39 | 40 | flag_t sensor_get_flags (int s); |
@@ -45,6 +46,7 @@ int sensor_get_prop (int s, const char* sel, int* val); | ||
45 | 46 | int sensor_get_fl_prop (int s, const char* sel, float* val); |
46 | 47 | int sensor_get_order (int s,unsigned char map[MAX_CHANNELS]); |
47 | 48 | int sensor_get_mounting_matrix(int s,float mounting_matrix[9]); |
49 | +int sensor_get_available_frequencies(int s); | |
48 | 50 | int sensor_get_cal_steps (int s); |
49 | 51 | char* sensor_get_string_type (int s); |
50 | 52 | int sensor_get_st_prop (int s, const char* sel, char val[MAX_NAME_SIZE]); |
@@ -25,7 +25,7 @@ static int activate (__attribute__((unused)) struct sensors_poll_device_t* dev, | ||
25 | 25 | if (init_count == 0 || handle < 0 || handle >= sensor_count) |
26 | 26 | return -EINVAL; |
27 | 27 | |
28 | - entry_ts = get_timestamp_boot(); | |
28 | + entry_ts = get_timestamp_thread(); | |
29 | 29 | |
30 | 30 | /* |
31 | 31 | * The Intel sensor hub seems to have trouble enabling sensors before |
@@ -49,7 +49,7 @@ static int activate (__attribute__((unused)) struct sensors_poll_device_t* dev, | ||
49 | 49 | |
50 | 50 | ret = sensor_activate(handle, enabled, 0); |
51 | 51 | |
52 | - elapsed_ms = (int) ((get_timestamp_boot() - entry_ts) / 1000000); | |
52 | + elapsed_ms = (int) ((get_timestamp_thread() - entry_ts) / 1000000); | |
53 | 53 | |
54 | 54 | if (elapsed_ms) { |
55 | 55 | if (enabled) |
@@ -655,6 +655,8 @@ static int add_sensor (int dev_num, int catalog_index, int mode) | ||
655 | 655 | sensor[s].channel[c].raw_path_present = (access(sysfs_path, R_OK) != -1); |
656 | 656 | } |
657 | 657 | |
658 | + sensor_get_available_frequencies(s); | |
659 | + | |
658 | 660 | if (sensor_get_mounting_matrix(s, sensor[s].mounting_matrix)) |
659 | 661 | sensor[s].quirks |= QUIRK_MOUNTING_MATRIX; |
660 | 662 | else |
@@ -882,12 +884,16 @@ static void update_sensor_matching_trigger_name (char name[MAX_NAME_SIZE], int* | ||
882 | 884 | } |
883 | 885 | } |
884 | 886 | |
887 | +extern float sensor_get_max_static_freq(int s); | |
888 | +extern float sensor_get_min_freq (int s); | |
889 | + | |
885 | 890 | static int create_hrtimer_trigger(int s, int trigger) |
886 | 891 | { |
887 | 892 | struct stat dir_status; |
888 | 893 | char buf[MAX_NAME_SIZE]; |
889 | 894 | char hrtimer_path[PATH_MAX]; |
890 | 895 | char hrtimer_name[MAX_NAME_SIZE]; |
896 | + float min_supported_rate = 1, min_rate_cap, max_supported_rate; | |
891 | 897 | |
892 | 898 | snprintf(buf, MAX_NAME_SIZE, "hrtimer-%s-hr-dev%d", sensor[s].internal_name, sensor[s].dev_num); |
893 | 899 | snprintf(hrtimer_name, MAX_NAME_SIZE, "%s-hr-dev%d", sensor[s].internal_name, sensor[s].dev_num); |
@@ -904,6 +910,27 @@ static int create_hrtimer_trigger(int s, int trigger) | ||
904 | 910 | |
905 | 911 | strncpy (sensor[s].hrtimer_trigger_name, hrtimer_name, MAX_NAME_SIZE); |
906 | 912 | sensor[s].trigger_nr = trigger; |
913 | + | |
914 | + max_supported_rate = sensor_get_max_static_freq(s); | |
915 | + | |
916 | + /* set 0 for wrong values */ | |
917 | + if (max_supported_rate < 0.1) { | |
918 | + max_supported_rate = 0; | |
919 | + } | |
920 | + | |
921 | + sensor[s].max_supported_rate = max_supported_rate; | |
922 | + sensor_desc[s].minDelay = max_supported_rate ? (int32_t) (1000000.0 / max_supported_rate) : 0; | |
923 | + | |
924 | + /* Check if a minimum rate was specified for this sensor */ | |
925 | + min_rate_cap = sensor_get_min_freq(s); | |
926 | + | |
927 | + if (min_supported_rate < min_rate_cap) { | |
928 | + min_supported_rate = min_rate_cap; | |
929 | + } | |
930 | + | |
931 | + sensor[s].min_supported_rate = min_supported_rate; | |
932 | + sensor_desc[s].maxDelay = (max_delay_t) (1000000.0 / min_supported_rate); | |
933 | + | |
907 | 934 | return 0; |
908 | 935 | } |
909 | 936 |
@@ -41,8 +41,6 @@ | ||
41 | 41 | #define CONVERT_M_Y (-CONVERT_M) |
42 | 42 | #define CONVERT_M_Z (CONVERT_M) |
43 | 43 | |
44 | -#define CONVERT_GAUSS_TO_MICROTESLA(x) ((x) * 100) | |
45 | - | |
46 | 44 | /* Conversion of orientation data to degree units */ |
47 | 45 | #define CONVERT_O (1.0 / 64) |
48 | 46 | #define CONVERT_O_A (CONVERT_O) |
@@ -7,6 +7,9 @@ | ||
7 | 7 | |
8 | 8 | #include "common.h" |
9 | 9 | |
10 | +#define CONVERT_GAUSS_TO_MICROTESLA(x) ((x) * 100) | |
11 | +#define CONVERT_MICROTESLA_TO_GAUSS(x) ((x) / 100) | |
12 | + | |
10 | 13 | void select_transform (int s); |
11 | 14 | float acquire_immediate_float_value (int s, int c); |
12 | 15 | uint64_t acquire_immediate_uint64_value (int s, int c); |
@@ -189,33 +189,36 @@ int sysfs_read_str(const char path[PATH_MAX], char *buf, int buf_len) | ||
189 | 189 | } |
190 | 190 | |
191 | 191 | |
192 | -int64_t get_timestamp_realtime (void) | |
192 | +int64_t get_timestamp (clockid_t clock_id) | |
193 | 193 | { |
194 | 194 | struct timespec ts = {0}; |
195 | - clock_gettime(CLOCK_REALTIME, &ts); | |
196 | 195 | |
197 | - return 1000000000LL * ts.tv_sec + ts.tv_nsec; | |
196 | + if (!clock_gettime(clock_id, &ts)) | |
197 | + return 1000000000LL * ts.tv_sec + ts.tv_nsec; | |
198 | + else /* in this case errno is set appropriately */ | |
199 | + return -1; | |
198 | 200 | } |
199 | 201 | |
202 | +int64_t get_timestamp_realtime (void) | |
203 | +{ | |
204 | + return get_timestamp(CLOCK_REALTIME); | |
205 | +} | |
200 | 206 | |
201 | 207 | int64_t get_timestamp_boot (void) |
202 | 208 | { |
203 | - struct timespec ts = {0}; | |
204 | - clock_gettime(CLOCK_BOOTTIME, &ts); | |
205 | - | |
206 | - return 1000000000LL * ts.tv_sec + ts.tv_nsec; | |
209 | + return get_timestamp(CLOCK_BOOTTIME); | |
207 | 210 | } |
208 | 211 | |
212 | +int64_t get_timestamp_thread (void) | |
213 | +{ | |
214 | + return get_timestamp(CLOCK_THREAD_CPUTIME_ID); | |
215 | +} | |
209 | 216 | |
210 | 217 | int64_t get_timestamp_monotonic (void) |
211 | 218 | { |
212 | - struct timespec ts = {0}; | |
213 | - clock_gettime(CLOCK_MONOTONIC, &ts); | |
214 | - | |
215 | - return 1000000000LL * ts.tv_sec + ts.tv_nsec; | |
219 | + return get_timestamp(CLOCK_MONOTONIC); | |
216 | 220 | } |
217 | 221 | |
218 | - | |
219 | 222 | void set_timestamp (struct timespec *out, int64_t target_ns) |
220 | 223 | { |
221 | 224 | out->tv_sec = target_ns / 1000000000LL; |
@@ -21,6 +21,7 @@ int sysfs_read_uint64(const char path[PATH_MAX], uint64_t *value); | ||
21 | 21 | void set_timestamp (struct timespec *out, int64_t target_ns); |
22 | 22 | |
23 | 23 | int64_t get_timestamp_boot (void); |
24 | +int64_t get_timestamp_thread (void); | |
24 | 25 | int64_t get_timestamp_realtime (void); |
25 | 26 | int64_t get_timestamp_monotonic (void); |
26 | 27 |