Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxxxxx
> Signed-off-by: John Brooks <john@xxxxxxxxxxxxx>
> ---
>  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@xxxxxxxxx>

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
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux