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
>>
>
next prev parent 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).