summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaadi Maalem <saadi.maalem@intel.com>2015-10-27 13:28:16 +0800
committerZhengyin Qian <qianzy@google.com>2015-10-29 11:26:32 -0700
commit7193963e58558e4ee8518c68766e40e463bf9041 (patch)
treea692de68d913be647a55f52d8d02ac8094a92f2e
parent1748bd6b0d9873908f709eba173248b7f759a76e (diff)
downloadsensors-7193963e58558e4ee8518c68766e40e463bf9041.tar.gz
sensor: add iio buffer store length support
The iio length is just for allow buffer to store data, 2.5's raw data at least. the store_length is just the real raw data length you want to batch in the buffer. We must ensure length is large or equal to store_length. Change-Id: I79b26daa9e95d853e649c3e2f6eb470bf636a5cc Tracked-On: https://jira.ndg.intel.com/browse/MARVIN-962 Signed-off-by: Fei Li <feix.f.li@intel.com>
-rw-r--r--libsensors_iio/src/HWSensorBase.cpp41
-rw-r--r--libsensors_iio/src/HWSensorBase.h3
2 files changed, 32 insertions, 12 deletions
diff --git a/libsensors_iio/src/HWSensorBase.cpp b/libsensors_iio/src/HWSensorBase.cpp
index 43f7fbb..1b487c5 100644
--- a/libsensors_iio/src/HWSensorBase.cpp
+++ b/libsensors_iio/src/HWSensorBase.cpp
@@ -230,21 +230,30 @@ HWSensorBase::~HWSensorBase()
close(pollfd_iio[1].fd);
}
-int HWSensorBase::WriteBufferLenght(unsigned int buf_len)
+int HWSensorBase::WriteBufferLenght(unsigned int buf_len, unsigned int store_len)
{
- unsigned int hw_buf_fifo_len;
- int err, current_len, buff_enable;
+ unsigned int hw_buf_fifo_len, hw_store_fifo_len;
+ int err, current_len, cur_store_len, buff_enable;
hw_buf_fifo_len = buf_len * HW_SENSOR_BASE_DEFAULT_IIO_BUFFER_LEN;
if (hw_buf_fifo_len == 0)
hw_buf_fifo_len = HW_SENSOR_BASE_DEFAULT_IIO_BUFFER_LEN;
+ hw_store_fifo_len = store_len * HW_SENSOR_BASE_DEFAULT_IIO_BUFFER_LEN;
+ if (hw_store_fifo_len == 0)
+ hw_store_fifo_len = HW_SENSOR_BASE_DEFAULT_IIO_BUFFER_LEN;
+
current_len = read_sysfs_posint((char *)FILENAME_BUFFER_LENGTH,
common_data.iio_sysfs_path);
if (current_len < 0)
return current_len;
- if (current_len == (int)hw_buf_fifo_len)
+ cur_store_len = read_sysfs_posint((char *)FILENAME_BUFFER_STORE_LENGTH,
+ common_data.iio_sysfs_path);
+ if (cur_store_len < 0)
+ return cur_store_len;
+
+ if ((current_len == (int)hw_buf_fifo_len) && (cur_store_len == (int)hw_store_fifo_len))
return 0;
buff_enable = read_sysfs_posint((char *)FILENAME_BUFFER_ENABLE,
@@ -264,6 +273,11 @@ int HWSensorBase::WriteBufferLenght(unsigned int buf_len)
if (err < 0)
return err;
+ err = write_sysfs_int_and_verify((char *)FILENAME_BUFFER_STORE_LENGTH,
+ common_data.iio_sysfs_path, hw_store_fifo_len);
+ if (err < 0)
+ return err;
+
current_fifo_len = hw_buf_fifo_len;
if (buff_enable > 0) {
@@ -398,9 +412,10 @@ HWSensorBaseWithPollrate::~HWSensorBaseWithPollrate()
int HWSensorBaseWithPollrate::SetDelay(int handle, int64_t period_ns, int64_t timeout)
{
+#define MIN_BUF_TIMEOUT 2500000000ULL
int err, i;
- int64_t min_pollrate_ns;
- unsigned int sampling_frequency, buf_len;
+ int64_t min_pollrate_ns, tmp_real_pollrate;
+ unsigned int sampling_frequency, buf_len, store_len;
err = HWSensorBase::SetDelay(handle, period_ns, timeout);
if (err < 0)
@@ -424,14 +439,18 @@ int HWSensorBaseWithPollrate::SetDelay(int handle, int64_t period_ns, int64_t ti
return err;
}
- real_pollrate = FREQUENCY_TO_NS(sampling_frequency_available.hz[i]);
+ tmp_real_pollrate = real_pollrate = FREQUENCY_TO_NS(sampling_frequency_available.hz[i]);
if (sensor_t_data.fifoMaxEventCount > 0) {
- buf_len = GetMinTimeout() / FREQUENCY_TO_NS(sampling_frequency_available.hz[i]);
- if (buf_len > sensor_t_data.fifoMaxEventCount)
- buf_len = sensor_t_data.fifoMaxEventCount;
+ store_len = GetMinTimeout() / tmp_real_pollrate;
+ if (store_len > sensor_t_data.fifoMaxEventCount)
+ store_len = sensor_t_data.fifoMaxEventCount;
+
+ buf_len = MIN_BUF_TIMEOUT / tmp_real_pollrate;
+ if (buf_len < store_len)
+ buf_len = store_len;
- err = WriteBufferLenght(buf_len);
+ err = WriteBufferLenght(buf_len, store_len);
if (err < 0)
return err;
}
diff --git a/libsensors_iio/src/HWSensorBase.h b/libsensors_iio/src/HWSensorBase.h
index 4a6f319..4996cad 100644
--- a/libsensors_iio/src/HWSensorBase.h
+++ b/libsensors_iio/src/HWSensorBase.h
@@ -36,6 +36,7 @@ extern "C" {
#define FILENAME_BUFFER_ENABLE "buffer/enable"
#define FILENAME_BUFFER_LENGTH "buffer/length"
+#define FILENAME_BUFFER_STORE_LENGTH "buffer/store_length"
#define FILENAME_SAMPLING_FREQ "sampling_frequency"
#define FILENAME_MAX_RATE_DELIVERY "max_delivery_rate"
#define FILENAME_HRTIMER_TRIGGER_FREQ "frequency"
@@ -67,7 +68,7 @@ protected:
unsigned int current_fifo_len;
HWSensorBaseCommonData common_data;
- int WriteBufferLenght(unsigned int buf_len);
+ int WriteBufferLenght(unsigned int buf_len, unsigned int store_len);
public:
HWSensorBase(HWSensorBaseCommonData *data, const char *name,