---
drivers/iio/humidity/dht11.c | 28 +++++++++++-----------------
1 file changed, 11 insertions(+), 17 deletions(-)
diff --git a/drivers/iio/humidity/dht11.c
b/drivers/iio/humidity/dht11.c
index c97e25448772..d1cd053c5dd4 100644
--- a/drivers/iio/humidity/dht11.c
+++ b/drivers/iio/humidity/dht11.c
@@ -30,13 +30,13 @@
#define DHT11_DATA_VALID_TIME 2000000000 /* 2s in ns */
-#define DHT11_EDGES_PREAMBLE 2
+#define DHT11_EDGES_PREAMBLE 1
#define DHT11_BITS_PER_READ 40
/*
* Note that when reading the sensor actually 84 edges are detected,
but
* since the last edge is not significant, we only store 83:
*/
-#define DHT11_EDGES_PER_READ (2 * DHT11_BITS_PER_READ + \
+#define DHT11_EDGES_PER_READ (DHT11_BITS_PER_READ + \
DHT11_EDGES_PREAMBLE + 1)
/*
@@ -46,6 +46,7 @@
* 1-bit: 68-75uS -- typically 70uS (AM2302)
* The acutal timings also depend on the properties of the cable,
with
* longer cables typically making pulses shorter.
+ * Low time is constant 50uS.
*
* Our decoding depends on the time resolution of the system:
* timeres > 34uS ... don't know what a 1-tick pulse is
@@ -63,7 +64,8 @@
#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_LOW 50000 /* ns */
+#define DHT11_THRESHOLD (49000 + DHT11_LOW) /* ns */
#define DHT11_AMBIG_LOW 23000 /* ns */
#define DHT11_AMBIG_HIGH 30000 /* ns */
@@ -83,7 +85,7 @@ struct dht11 {
/* num_edges: -1 means "no transmission in progress" */
int num_edges;
- struct {s64 ts; int value; } edges[DHT11_EDGES_PER_READ];
+ struct {s64 ts; } edges[DHT11_EDGES_PER_READ];
};
#ifdef CONFIG_DYNAMIC_DEBUG
@@ -99,7 +101,7 @@ static void dht11_edges_print(struct dht11 *dht11)
for (i = 1; i < dht11->num_edges; ++i) {
dev_dbg(dht11->dev, "%d: %lld ns %s\n", i,
dht11->edges[i].ts - dht11->edges[i - 1].ts,
- dht11->edges[i - 1].value ? "high" : "low");
+ "falling");
}
}
#endif /* CONFIG_DYNAMIC_DEBUG */
@@ -125,14 +127,8 @@ static int dht11_decode(struct dht11 *dht11, int
offset)
unsigned char temp_int, temp_dec, hum_int, hum_dec, checksum;
for (i = 0; i < DHT11_BITS_PER_READ; ++i) {
- t = dht11->edges[offset + 2 * i + 2].ts -
- dht11->edges[offset + 2 * i + 1].ts;
- if (!dht11->edges[offset + 2 * i + 1].value) {
- dev_dbg(dht11->dev,
- "lost synchronisation at edge %d\n",
- offset + 2 * i + 1);
- return -EIO;
- }
+ t = dht11->edges[offset + i + 1].ts -
+ dht11->edges[offset + i].ts;
bits[i] = t > DHT11_THRESHOLD;
}
@@ -174,9 +170,7 @@ static irqreturn_t dht11_handle_irq(int irq, void
*data)
struct dht11 *dht11 = iio_priv(iio);
if (dht11->num_edges < DHT11_EDGES_PER_READ && dht11->num_edges >=
0) {
- dht11->edges[dht11->num_edges].ts = ktime_get_boottime_ns();
- dht11->edges[dht11->num_edges++].value =
- gpiod_get_value(dht11->gpiod);
+ dht11->edges[dht11->num_edges++].ts = ktime_get_boottime_ns();
if (dht11->num_edges >= DHT11_EDGES_PER_READ)
complete(&dht11->completion);
@@ -224,7 +218,7 @@ static int dht11_read_raw(struct iio_dev *iio_dev,
goto err;
ret = request_irq(dht11->irq, dht11_handle_irq,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ IRQF_TRIGGER_FALLING,
iio_dev->name, iio_dev);
if (ret)
goto err;