linux-iio.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jonathan Cameron <jic23@kernel.org>
To: Harald Geyer <harald@ccbib.org>, John Brooks <john@fastquake.com>
Cc: linux-iio@vger.kernel.org
Subject: Re: [PATCH] iio: dht11: Use usleep_range instead of msleep for start signal
Date: Sun, 22 Jan 2017 13:36:47 +0000	[thread overview]
Message-ID: <03e7614a-8f7f-e4f4-07cd-d1c591480239@kernel.org> (raw)
In-Reply-To: <E1cUAqD-0000MZ-0T@stardust.g4.wien.funkfeuer.at>

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
>>
> 


  reply	other threads:[~2017-01-22 13:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
2017-01-27  1:33     ` John Brooks
2017-01-28 10:30       ` 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=03e7614a-8f7f-e4f4-07cd-d1c591480239@kernel.org \
    --to=jic23@kernel.org \
    --cc=harald@ccbib.org \
    --cc=john@fastquake.com \
    --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;
as well as URLs for NNTP newsgroup(s).