All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
@ 2017-01-18 21:50 John Brooks
  2017-01-19 11:25 ` Harald Geyer
  0 siblings, 1 reply; 5+ messages in thread
From: John Brooks @ 2017-01-18 21:50 UTC (permalink / raw)
  To: linux-iio, Harald Geyer; +Cc: Jonathan Cameron

The DHT22 (AM2302) datasheet specifies that the LOW start pulse should not
exceed 20ms. However, observations with an oscilloscope of an RPi Model 2B
(rev 1.1) communicating with a DHT22 sensor showed that the driver was
consistently sending start pulses longer than 20ms:

Kernel 4.7.10-v7+ (n=132):
    Minimum pulse length: 20.20ms
    Maximum:              29.84ms
    Mean:                 24.96ms
    StDev:                2.82ms
    Sensor response rate: 100%
    Read success rate:    76%

On kernel 4.8, the start pulse was so long that the sensor would not even
respond 97% of the time:

Kernel 4.8.16-v7+ (n=100):
    Minimum pulse length: 30.4ms
    Maximum:              74.4ms
    Mean:                 39.3ms
    StDev:                10.2ms
    Sensor response rate: 3%
    Read success rate:    3%

The driver would return ETIMEDOUT and write log messages like this:

[   51.430987] dht11 dht11@0: Only 1 signal edges detected
[   66.311019] dht11 dht11@0: Only 0 signal edges detected

Replacing msleep(18) with usleep_range(18000, 20000) made the pulse length
sane again and restored responsiveness:

Kernel 4.8.16-v7+ with usleep_range (n=123):
    Minimum pulse length: 18.16ms
    Maximum:              20.20ms
    Mean:                 19.85ms
    StDev:                0.51ms
    Sensor response rate: 100%
    Read success rate:    84%

Cc: stable@vger.kernel.org
Signed-off-by: John Brooks <john@fastquake.com>
---
 drivers/iio/humidity/dht11.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
index 9c47bc9..2a22ad9 100644
--- a/drivers/iio/humidity/dht11.c
+++ b/drivers/iio/humidity/dht11.c
@@ -71,7 +71,8 @@
  * a) select an implementation using busy loop polling on those systems
  * b) use the checksum to do some probabilistic decoding
  */
-#define DHT11_START_TRANSMISSION	18  /* ms */
+#define DHT11_START_TRANSMISSION_MIN	18000  /* us */
+#define DHT11_START_TRANSMISSION_MAX	20000  /* us */
 #define DHT11_MIN_TIMERES	34000  /* ns */
 #define DHT11_THRESHOLD		49000  /* ns */
 #define DHT11_AMBIG_LOW		23000  /* ns */
@@ -228,7 +229,8 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
 		ret = gpio_direction_output(dht11->gpio, 0);
 		if (ret)
 			goto err;
-		msleep(DHT11_START_TRANSMISSION);
+		usleep_range(DHT11_START_TRANSMISSION_MIN,
+			     DHT11_START_TRANSMISSION_MAX);
 		ret = gpio_direction_input(dht11->gpio);
 		if (ret)
 			goto err;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
  2017-01-18 21:50 [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal John Brooks
@ 2017-01-19 11:25 ` Harald Geyer
  2017-01-22 13:36   ` Jonathan Cameron
  0 siblings, 1 reply; 5+ messages in thread
From: Harald Geyer @ 2017-01-19 11:25 UTC (permalink / raw)
  To: John Brooks; +Cc: linux-iio, Jonathan Cameron

John Brooks writes:
> The DHT22 (AM2302) datasheet specifies that the LOW start pulse should not
> exceed 20ms. However, observations with an oscilloscope of an RPi Model 2B
> (rev 1.1) communicating with a DHT22 sensor showed that the driver was
> consistently sending start pulses longer than 20ms:
> 
> Kernel 4.7.10-v7+ (n=132):
>     Minimum pulse length: 20.20ms
>     Maximum:              29.84ms
>     Mean:                 24.96ms
>     StDev:                2.82ms
>     Sensor response rate: 100%
>     Read success rate:    76%
> 
> On kernel 4.8, the start pulse was so long that the sensor would not even
> respond 97% of the time:
> 
> Kernel 4.8.16-v7+ (n=100):
>     Minimum pulse length: 30.4ms
>     Maximum:              74.4ms
>     Mean:                 39.3ms
>     StDev:                10.2ms
>     Sensor response rate: 3%
>     Read success rate:    3%
> 
> The driver would return ETIMEDOUT and write log messages like this:
> 
> [   51.430987] dht11 dht11@0: Only 1 signal edges detected
> [   66.311019] dht11 dht11@0: Only 0 signal edges detected
> 
> Replacing msleep(18) with usleep_range(18000, 20000) made the pulse length
> sane again and restored responsiveness:
> 
> Kernel 4.8.16-v7+ with usleep_range (n=123):
>     Minimum pulse length: 18.16ms
>     Maximum:              20.20ms
>     Mean:                 19.85ms
>     StDev:                0.51ms
>     Sensor response rate: 100%
>     Read success rate:    84%
> 
> Cc: stable@vger.kernel.org
> Signed-off-by: John Brooks <john@fastquake.com>
> ---
>  drivers/iio/humidity/dht11.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
> index 9c47bc9..2a22ad9 100644
> --- a/drivers/iio/humidity/dht11.c
> +++ b/drivers/iio/humidity/dht11.c
> @@ -71,7 +71,8 @@
>   * a) select an implementation using busy loop polling on those systems
>   * b) use the checksum to do some probabilistic decoding
>   */
> -#define DHT11_START_TRANSMISSION	18  /* ms */
> +#define DHT11_START_TRANSMISSION_MIN	18000  /* us */
> +#define DHT11_START_TRANSMISSION_MAX	20000  /* us */

If you want to stay strictly within the 20ms range, you might want to
make this a bit lower like 19750. However, I don't care much either way.
I think this is a reasonable change.

Reviewed-by: Harald Geyer <harald@ccbib.org>

I do wonder why there is a difference between 4.7 and 4.8. Is this a
performance regression on the RPi or have there been changes to the
scheduler, that make this actually expected behaviour. (Ie is this a
bug or a feature?)

Thanks for your patch,
Harald

>  #define DHT11_MIN_TIMERES	34000  /* ns */
>  #define DHT11_THRESHOLD		49000  /* ns */
>  #define DHT11_AMBIG_LOW		23000  /* ns */
> @@ -228,7 +229,8 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
>  		ret = gpio_direction_output(dht11->gpio, 0);
>  		if (ret)
>  			goto err;
> -		msleep(DHT11_START_TRANSMISSION);
> +		usleep_range(DHT11_START_TRANSMISSION_MIN,
> +			     DHT11_START_TRANSMISSION_MAX);
>  		ret = gpio_direction_input(dht11->gpio);
>  		if (ret)
>  			goto err;
> -- 
> 2.7.4
> 

-- 
If you want to support my work:
see http://friends.ccbib.org/harald/supporting/
or donate via CLAM to xASPBtezLNqj4cUe8MT5nZjthRSEjrRQXN
or via peercoin to P98LRdhit3gZbHDBe7ta5jtXrMJUms4p7w

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
  2017-01-19 11:25 ` Harald Geyer
@ 2017-01-22 13:36   ` Jonathan Cameron
  2017-01-27  1:33     ` John Brooks
  0 siblings, 1 reply; 5+ messages in thread
From: Jonathan Cameron @ 2017-01-22 13:36 UTC (permalink / raw)
  To: Harald Geyer, John Brooks; +Cc: linux-iio

On 19/01/17 11:25, Harald Geyer wrote:
> John Brooks writes:
>> The DHT22 (AM2302) datasheet specifies that the LOW start pulse should not
>> exceed 20ms. However, observations with an oscilloscope of an RPi Model 2B
>> (rev 1.1) communicating with a DHT22 sensor showed that the driver was
>> consistently sending start pulses longer than 20ms:
>>
>> Kernel 4.7.10-v7+ (n=132):
>>     Minimum pulse length: 20.20ms
>>     Maximum:              29.84ms
>>     Mean:                 24.96ms
>>     StDev:                2.82ms
>>     Sensor response rate: 100%
>>     Read success rate:    76%
>>
>> On kernel 4.8, the start pulse was so long that the sensor would not even
>> respond 97% of the time:
>>
>> Kernel 4.8.16-v7+ (n=100):
>>     Minimum pulse length: 30.4ms
>>     Maximum:              74.4ms
>>     Mean:                 39.3ms
>>     StDev:                10.2ms
>>     Sensor response rate: 3%
>>     Read success rate:    3%
>>
>> The driver would return ETIMEDOUT and write log messages like this:
>>
>> [   51.430987] dht11 dht11@0: Only 1 signal edges detected
>> [   66.311019] dht11 dht11@0: Only 0 signal edges detected
>>
>> Replacing msleep(18) with usleep_range(18000, 20000) made the pulse length
>> sane again and restored responsiveness:
>>
>> Kernel 4.8.16-v7+ with usleep_range (n=123):
>>     Minimum pulse length: 18.16ms
>>     Maximum:              20.20ms
>>     Mean:                 19.85ms
>>     StDev:                0.51ms
>>     Sensor response rate: 100%
>>     Read success rate:    84%
>>
>> Cc: stable@vger.kernel.org
>> Signed-off-by: John Brooks <john@fastquake.com>
>> ---
>>  drivers/iio/humidity/dht11.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/iio/humidity/dht11.c b/drivers/iio/humidity/dht11.c
>> index 9c47bc9..2a22ad9 100644
>> --- a/drivers/iio/humidity/dht11.c
>> +++ b/drivers/iio/humidity/dht11.c
>> @@ -71,7 +71,8 @@
>>   * a) select an implementation using busy loop polling on those systems
>>   * b) use the checksum to do some probabilistic decoding
>>   */
>> -#define DHT11_START_TRANSMISSION	18  /* ms */
>> +#define DHT11_START_TRANSMISSION_MIN	18000  /* us */
>> +#define DHT11_START_TRANSMISSION_MAX	20000  /* us */
> 
> If you want to stay strictly within the 20ms range, you might want to
> make this a bit lower like 19750. However, I don't care much either way.
> I think this is a reasonable change.
> 
> Reviewed-by: Harald Geyer <harald@ccbib.org>
> 
> I do wonder why there is a difference between 4.7 and 4.8. Is this a
> performance regression on the RPi or have there been changes to the
> scheduler, that make this actually expected behaviour. (Ie is this a
> bug or a feature?)
Agreed.  Any chance you can do a bisection on this John?

Either way - defence in depth!
Applied to the fixes-togreg branch of iio.git.

thanks,

Jonathan
> 
> Thanks for your patch,
> Harald
> 
>>  #define DHT11_MIN_TIMERES	34000  /* ns */
>>  #define DHT11_THRESHOLD		49000  /* ns */
>>  #define DHT11_AMBIG_LOW		23000  /* ns */
>> @@ -228,7 +229,8 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
>>  		ret = gpio_direction_output(dht11->gpio, 0);
>>  		if (ret)
>>  			goto err;
>> -		msleep(DHT11_START_TRANSMISSION);
>> +		usleep_range(DHT11_START_TRANSMISSION_MIN,
>> +			     DHT11_START_TRANSMISSION_MAX);
>>  		ret = gpio_direction_input(dht11->gpio);
>>  		if (ret)
>>  			goto err;
>> -- 
>> 2.7.4
>>
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
  2017-01-22 13:36   ` Jonathan Cameron
@ 2017-01-27  1:33     ` John Brooks
  2017-01-28 10:30       ` Jonathan Cameron
  0 siblings, 1 reply; 5+ messages in thread
From: John Brooks @ 2017-01-27  1:33 UTC (permalink / raw)
  To: Jonathan Cameron, Harald Geyer; +Cc: linux-iio

On Sun, Jan 22, 2017 at 01:36:47PM +0000, Jonathan Cameron wrote:
> Agreed.  Any chance you can do a bisection on this John?
> 
> Either way - defence in depth!
> Applied to the fixes-togreg branch of iio.git.
> 
> thanks,
> 
> Jonathan

It's my first bug fixing kernel patch; I'm very happy to see it applied :)

I would like to bisect this. It's a bit of a pain because I'll need to branch
and apply all the RPi kernel patches every step of the way. If I find the time,
I will do it.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
  2017-01-27  1:33     ` John Brooks
@ 2017-01-28 10:30       ` Jonathan Cameron
  0 siblings, 0 replies; 5+ messages in thread
From: Jonathan Cameron @ 2017-01-28 10:30 UTC (permalink / raw)
  To: John Brooks, Harald Geyer; +Cc: linux-iio

On 27/01/17 01:33, John Brooks wrote:
> On Sun, Jan 22, 2017 at 01:36:47PM +0000, Jonathan Cameron wrote:
>> Agreed.  Any chance you can do a bisection on this John?
>>
>> Either way - defence in depth!
>> Applied to the fixes-togreg branch of iio.git.
>>
>> thanks,
>>
>> Jonathan
> 
> It's my first bug fixing kernel patch; I'm very happy to see it applied :)
> 
> I would like to bisect this. It's a bit of a pain because I'll need to branch
> and apply all the RPi kernel patches every step of the way. If I find the time,
> I will do it.
Cool and good luck!
> --
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-01-28 10:31 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-18 21:50 [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal John Brooks
2017-01-19 11:25 ` Harald Geyer
2017-01-22 13:36   ` Jonathan Cameron
2017-01-27  1:33     ` John Brooks
2017-01-28 10:30       ` Jonathan Cameron

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.