driver/sensor: simplify buffer operation

1.Simplify buffer opeations to avoid frequent resize for batch and no-batch mode.
2.When sensor event is first generated, the buffer is initialized.
3.Remove and merge batch_number to buffer_number when device support batch mode.

Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Jiuzhu Dong 2022-07-21 02:32:29 +00:00 committed by Xiang Xiao
parent dad5ab75ff
commit 8f39c5f11b
2 changed files with 24 additions and 47 deletions

View File

@ -207,17 +207,6 @@ static int sensor_open(FAR struct file *filep)
ret = -EMFILE;
goto err;
}
else if (tmp == 1)
{
/* Initialize sensor buffer */
ret = circbuf_init(&upper->buffer, NULL, lower->buffer_number *
upper->esize);
if (ret < 0)
{
goto err;
}
}
upper->crefs = tmp;
err:
@ -330,19 +319,6 @@ static ssize_t sensor_read(FAR struct file *filep, FAR char *buffer,
}
ret = circbuf_read(&upper->buffer, buffer, len);
/* Release some buffer space when current mode isn't batch mode
* and last mode is batch mode, and the number of bytes available
* in buffer is less than the number of bytes origin.
*/
uint32_t buffer_size = lower->buffer_number * upper->esize;
if (upper->latency == 0 &&
circbuf_size(&upper->buffer) > buffer_size &&
circbuf_used(&upper->buffer) <= buffer_size)
{
ret = circbuf_resize(&upper->buffer, buffer_size);
}
}
out:
@ -393,8 +369,6 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
{
upper->interval = 0;
upper->latency = 0;
ret = circbuf_resize(&upper->buffer, lower->buffer_number *
upper->esize);
}
}
}
@ -444,17 +418,6 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
if (ret >= 0)
{
upper->latency = *val;
if (*val != 0)
{
/* Adjust length of buffer in batch mode */
uint32_t buffer_size = (ROUNDUP(*val, upper->interval) /
upper->interval +
lower->buffer_number) *
upper->esize;
ret = circbuf_resize(&upper->buffer, buffer_size);
}
}
}
break;
@ -497,16 +460,19 @@ static int sensor_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
case SNIOC_GET_NEVENTBUF:
{
*val = lower->buffer_number + lower->batch_number;
*val = lower->buffer_number;
}
break;
case SNIOC_SET_BUFFER_NUMBER:
{
if (arg != 0)
if (!circbuf_is_init(&upper->buffer))
{
lower->buffer_number = arg;
ret = circbuf_resize(&upper->buffer, arg * upper->esize);
}
else
{
ret = -EBUSY;
}
}
break;
@ -617,6 +583,7 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data,
size_t bytes)
{
FAR struct sensor_upperhalf_s *upper = priv;
FAR struct sensor_lowerhalf_s *lower = upper->lower;
int semcount;
int ret;
@ -631,6 +598,19 @@ static ssize_t sensor_push_event(FAR void *priv, FAR const void *data,
return ret;
}
if (!circbuf_is_init(&upper->buffer))
{
/* Initialize sensor buffer when data is first generated */
ret = circbuf_init(&upper->buffer, NULL, lower->buffer_number *
upper->esize);
if (ret < 0)
{
nxsem_post(&upper->exclsem);
return ret;
}
}
circbuf_overwrite(&upper->buffer, data, bytes);
sensor_pollnotify(upper, POLLIN);
nxsem_get_value(&upper->buffersem, &semcount);

View File

@ -811,17 +811,14 @@ struct sensor_lowerhalf_s
* is too small, the event will be overwrite before application read them.
* So, it's recommended to set according to sensor odr. If odr is low, you
* can set to one. If odr is high, you can set to two or three.
*
* If device support batch mode, the number of events that hardware fifo
* hold maximum number of samples, must be aligned with size of
* struct sensor_event_xxx.
*/
uint32_t buffer_number;
/* The number of events that hardware fifo hold maximum number of samples,
* must be aligned with size of struct sensor_event_xxx.
* If sensor don't hardware fifo, you don't need to care about fifo_size.
*/
uint32_t batch_number;
/* The uncalibrated use to describe whether the sensor event is
* uncalibrated. True is uncalibrated data, false is calibrated data,
* default false.