Linux IIO development
 help / color / mirror / Atom feed
From: ASSI <Stromeko@nexgo.de>
To: linux-iio@vger.kernel.org
Subject: Re: [PATCH v9 1/4] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures
Date: Sun, 29 Jun 2025 09:43:03 +0200	[thread overview]
Message-ID: <87o6u7dmd4.fsf@Gerda.invalid> (raw)
In-Reply-To: c894cfda-a775-4598-ac3b-b3d35c6a84b3@baylibre.com

David Lechner writes:
> It looks like the wait time calculations in bmp280_wait_conv() don't
> match up with the datasheet [1] that I found.
>
> [1]: https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf

The canonical location for these is
https://www.bosch-sensortec.com/products/downloads/ and there is a later
version available (no changes w.r.t. the information discussed here,
though).

> There, table 13 says that if pressure and temperature oversampling
> are bot set to x1, then it could take up to 6.4 ms to complete the
> measurement.

The BME280 has a slightly different specification that matches up with
the numbers in the header file…

> However, in the code, we have:
>
> ```
> #define BMP280_MEAS_OFFSET		1250
> #define BMP280_MEAS_DUR			2300
> #define BMP280_PRESS_HUMID_MEAS_OFFSET	575
> ```

… with the proviso that BMP280_MEAS_OFFSET is applied to each
measurement independent of any other settings and
BMP280_PRESS_HUMID_MEAS_OFFSET to the humidity and pressure measurement
if these are activated.

> and 
>
> ```
> 	/* Check if we are using a BME280 device */
> 	if (data->oversampling_humid)
> 		meas_time_us = BMP280_PRESS_HUMID_MEAS_OFFSET +
> 				BIT(data->oversampling_humid) * BMP280_MEAS_DUR;
>
> 	else
> 		meas_time_us = 0;
>
> 	/* Pressure measurement time */
> 	meas_time_us += BMP280_PRESS_HUMID_MEAS_OFFSET +
> 			BIT(data->oversampling_press) * BMP280_MEAS_DUR;
>
> 	/* Temperature measurement time */
> 	meas_time_us += BIT(data->oversampling_temp) * BMP280_MEAS_DUR;
>
> 	/* Waiting time according to the BM(P/E)2 Sensor API */
> 	fsleep(meas_time_us);
> ```
>
> Assuming BIT(*oversampling*) is 1 for x1 oversampling, we get
>
> meas_time_us = (0) + (575 + 1 * 2300) + (1 * 2300) = 5175
>                ^     ^                  ^
>                |     |                  |
>                |     |                  temperature
>                |     pressure
>                humidity
>
> 5175 microseconds is less than the 6.4 milliseconds max time, so
> that would explain the error that is seen since the error is
> triggered by the status bit that says the chip is still busy taking
> the measurement.
>
> BMP280_MEAS_OFFSET is unused in the code. But 6400 - 5175 is 1225
> which is very close to 1250. So I think the intention was to include
> that it the calculation like this:

Yes, I think that's where the trouble comes from.

> ---
> diff --git a/drivers/iio/pressure/bmp280-core.c b/drivers/iio/pressure/bmp280-core.c
> index 74505c9ec1a0..50c869e3d5c9 100644
> --- a/drivers/iio/pressure/bmp280-core.c
> +++ b/drivers/iio/pressure/bmp280-core.c
> @@ -1042,14 +1042,13 @@ static int bmp280_wait_conv(struct bmp280_data *data)
>  	unsigned int reg, meas_time_us;
>  	int ret;
>  
> +	meas_time_us = BMP280_MEAS_OFFSET;
> +
>  	/* Check if we are using a BME280 device */
>  	if (data->oversampling_humid)
> -		meas_time_us = BMP280_PRESS_HUMID_MEAS_OFFSET +
> +		meas_time_us += BMP280_PRESS_HUMID_MEAS_OFFSET +
>  				BIT(data->oversampling_humid) * BMP280_MEAS_DUR;
>  
> -	else
> -		meas_time_us = 0;
> -
>  	/* Pressure measurement time */
>  	meas_time_us += BMP280_PRESS_HUMID_MEAS_OFFSET +
>  			BIT(data->oversampling_press) * BMP280_MEAS_DUR;
> ---

That looks correct to me. So in my case (all three measurements
performed) the measurement should take 8ms nominal / 9.3ms maximum, but
the current code waits just 8.05ms (which is still slightly above
nominal, but apparently not sufficiently long for my sensor).

Another area of concern is that now that each sysfs read triggers
another forced measurement instead of just looking at the values from
the last one that was produced automatically, should the oversampling
ratio of the unused measurements (as specified by chan->type) for that
read not be set to zero temporarily so that the measurements whose
values you don't get the result of are not performed?  That would still
be at least 2.5ms or 12.5ms slower (2×1.25ms + 2×5ms entering sleep mode
and 2.3ms more for each increment of OSR settings) than before depending
on whether the device enters sleep mode inbetween readings (I haven't
figured that one out from the code, but my timing results suggest it
does) in normal mode when reading all three values in succession (which
suggests that there should probably be a separate sysfs interface for
doing a complete read), but not quite as much as currently seen.

Also, instead of waiting the maximum time (typical +15%) unconditionally
it might be preferrable to initially wait just the typical time followed
by a wait of (meas_time_us>>3) and then (meas_time_us>>5) if the busy
flag is still on before returning EBUSY.  That of course depends on how
large the overhead is of that wait plus the register read, but it
probably still is a net win even if the actual sensor always requires
two reads.

> Hopefully you can compile your own kernel and test this. If that fixes it
> we can turn it into a proper patch.

I used to compile the driver myself, but Tumbleweed since switched to a
signed kernel, so I have to figure out how to load an unsigned driver and
then get up to speed again on how to compile and install it.


Regards,
Achim.
-- 
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+


  reply	other threads:[~2025-06-29  7:43 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-17 23:30 [PATCH v9 0/4] pressure: bmp280: Minor cleanup and interrupt support Vasileios Amoiridis
2024-10-17 23:30 ` [PATCH v9 1/4] iio: pressure: bmp280: Use sleep and forced mode for oneshot captures Vasileios Amoiridis
2025-06-28 18:45   ` ASSI
2025-06-28 20:57     ` David Lechner
2025-06-29  7:43       ` ASSI [this message]
2025-07-11 19:17       ` ASSI
2025-07-12 14:49         ` ASSI
2025-07-21 19:15           ` ASSI
2025-07-26 18:34           ` ASSI
2025-07-27 19:08             ` ASSI
2024-10-17 23:30 ` [PATCH v9 2/4] dt-bindings: iio: pressure: bmp085: Add interrupts for BMP3xx and BMP5xx devices Vasileios Amoiridis
2024-10-17 23:30 ` [PATCH v9 3/4] iio: pressure: bmp280: Add data ready trigger support Vasileios Amoiridis
2024-10-17 23:30 ` [PATCH v9 4/4] iio: pressure: bmp280: Move bmp085 interrupt to new configuration Vasileios Amoiridis
2024-10-19 13:55 ` [PATCH v9 0/4] pressure: bmp280: Minor cleanup and interrupt support Jonathan Cameron
2025-08-03 14:07 ` [bmp280 v1 0/6] Fixes and enhancements for the bmp280 driver Achim Gratz
2025-08-03 14:07   ` [bmp280 v1 1/6] iio: pressure: bmp280: correct meas_time_us calculation Achim Gratz
2025-08-06 15:46     ` Jonathan Cameron
2025-08-06 17:53       ` ASSI
2025-08-10 18:04         ` Jonathan Cameron
2025-08-03 14:07   ` [bmp280 v1 2/6] iio: pressure: bmp280: reduce overhead on read with MODE_FORCED Achim Gratz
2025-08-03 20:12     ` Andy Shevchenko
2025-08-06 15:58     ` Jonathan Cameron
2025-08-06 18:00       ` ASSI
2025-08-03 14:07   ` [bmp280 v1 3/6] iio: pressure: bmp280: implement sampling_frequency for BMx280 Achim Gratz
2025-08-03 20:26     ` Andy Shevchenko
2025-08-04 17:29       ` ASSI
2025-08-10 18:11         ` Jonathan Cameron
2025-08-10 19:12           ` ASSI
2025-08-11 19:48             ` Jonathan Cameron
2025-08-12 19:53               ` ASSI
2025-08-17 15:10                 ` Jonathan Cameron
2025-08-17 16:36                   ` ASSI
2025-08-03 14:08   ` [bmp280 v1 4/6] iio: pressure: bmp280: enable filter settings " Achim Gratz
2025-08-03 20:28     ` Andy Shevchenko
2025-08-04 17:14       ` ASSI
2025-08-10 18:13     ` Jonathan Cameron
2025-08-10 19:01       ` ASSI
2025-08-11 20:14         ` Jonathan Cameron
2025-08-12 19:34           ` ASSI
2025-08-17 14:51             ` Jonathan Cameron
2025-08-03 14:08   ` [bmp280 v1 5/6] iio: pressure: bmp280: remove code duplication Achim Gratz
2025-08-03 20:30     ` Andy Shevchenko
2025-08-10 18:19     ` Jonathan Cameron
2025-08-03 14:08   ` [bmp280 v1 6/6] iio: pressure: bmp280: implement sampling_frequency calculation for BMx280 Achim Gratz
2025-08-03 20:37     ` Andy Shevchenko
2025-08-04 17:20       ` ASSI
2025-08-03 19:20   ` [bmp280 v1 0/6] Fixes and enhancements for the bmp280 driver Andy Shevchenko
2025-08-10 18:58 ` [RFC PATCH v2 0/9] " Achim Gratz
2025-08-10 18:58   ` [RFC PATCH v2 1/9] iio: pressure: bmp280: correct meas_time_us calculation Achim Gratz
2025-08-17 15:16     ` Jonathan Cameron
2025-08-10 18:58   ` [RFC PATCH v2 2/9] iio: pressure: bmp280: implement adaptive wait for BMx280 devices Achim Gratz
2025-08-10 19:49     ` Andy Shevchenko
2025-08-16 18:42       ` ASSI
2025-08-10 18:58   ` [RFC PATCH v2 3/9] iio: pressure: bmp280: implement adaptive wait for BMP380 devices Achim Gratz
2025-08-10 18:58   ` [RFC PATCH v2 4/9] iio: pressure: bmp280: refactoring Achim Gratz
2025-08-17 15:23     ` Jonathan Cameron
2025-08-10 18:58   ` [RFC PATCH v2 5/9] iio: pressure: bmp280: remove code duplication Achim Gratz
2025-08-10 18:58   ` [RFC PATCH v2 6/9] iio: pressure: bmp280: enable filter settings for BMx280 Achim Gratz
2025-08-17 16:37     ` Jonathan Cameron
2025-08-10 18:58   ` [RFC PATCH v2 7/9] iio: pressure: bmp280: implement sampling_frequency " Achim Gratz
2025-08-17 16:53     ` Jonathan Cameron
2025-08-17 17:36       ` ASSI
2025-08-10 18:58   ` [RFC PATCH v2 8/9] iio: pressure: bmp280: implement sampling_frequency calculation " Achim Gratz
2025-08-17 17:04     ` Jonathan Cameron
2025-08-17 17:40       ` ASSI
2025-08-18 17:52         ` Jonathan Cameron
2025-08-10 18:58   ` [RFC PATCH v2 9/9] iio: pressure: bmp280: test longer autosuspend (WIP) Achim Gratz
2025-08-17 17:05     ` Jonathan Cameron
2025-08-17 17:44       ` ASSI
2025-08-11 12:14   ` [RFC PATCH v2 0/9] Fixes and enhancements for the bmp280 driver Andy Shevchenko
2025-08-11 20:17   ` Jonathan Cameron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87o6u7dmd4.fsf@Gerda.invalid \
    --to=stromeko@nexgo.de \
    --cc=linux-iio@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox