* [RESEND patch 2.6.22-rc4 1/2] ads7846 sample settling
@ 2007-07-13 18:29 David Brownell
2007-07-13 19:01 ` Dmitry Torokhov
0 siblings, 1 reply; 3+ messages in thread
From: David Brownell @ 2007-07-13 18:29 UTC (permalink / raw)
To: Dmitry Torokhov, dtor; +Cc: Semih Hazar, Imre Deak, Linux Kernel list
From: Semih Hazar <semih.hazar@indefia.com>
The ads7846 driver has support for filtering, but when the chip gets
deselected between samples this causes noise. This patch adds support
for an optional settling delay time, so that two consecutive samples
will be taken with the specified delay time apart. This ensures that
the chip won't be deselected, so the noise won't appear.
Filtering can still be done, but will have less work to do since each
time a new sample is taken the same delay applies.
Signed-off-by: Semih Hazar <semih.hazar@indefia.com>
Cc: Imre Deak <imre.deak@solidboot.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
---
Still applies fine against 2.6.22-git ... this should be in 2.6.23
drivers/input/touchscreen/ads7846.c | 65 +++++++++++++++++++++++++++++++++++-
include/linux/spi/ads7846.h | 8 ++++
2 files changed, 72 insertions(+), 1 deletion(-)
--- g26.orig/include/linux/spi/ads7846.h 2007-02-12 00:31:26.000000000 -0800
+++ g26/include/linux/spi/ads7846.h 2007-06-16 04:33:43.000000000 -0700
@@ -16,6 +16,14 @@ struct ads7846_platform_data {
u16 vref_delay_usecs; /* 0 for external vref; etc */
int keep_vref_on:1; /* set to keep vref on for differential
* measurements as well */
+
+ /* Settling time of the analog signals; a function of Vcc and the
+ * capacitance on the X/Y drivers. If set to non-zero, two samples
+ * are taken with settle_delay us apart, and the second one is used.
+ * ~150 uSec with 0.01uF caps.
+ */
+ u16 settle_delay_usecs;
+
u16 x_plate_ohms;
u16 y_plate_ohms;
--- g26.orig/drivers/input/touchscreen/ads7846.c 2007-05-24 12:04:45.000000000 -0700
+++ g26/drivers/input/touchscreen/ads7846.c 2007-06-16 09:46:22.000000000 -0700
@@ -95,7 +95,7 @@ struct ads7846 {
u16 dummy; /* for the pwrdown read */
struct ts_event tc;
- struct spi_transfer xfer[10];
+ struct spi_transfer xfer[18];
struct spi_message msg[5];
struct spi_message *last_msg;
int msg_idx;
@@ -936,6 +936,24 @@ static int __devinit ads7846_probe(struc
x->len = 2;
spi_message_add_tail(x, m);
+ /* the first sample after switching drivers can be low quality;
+ * optionally discard it, using a second one after the signals
+ * have had enough time to stabilize.
+ */
+ if (pdata->settle_delay_usecs) {
+ x->delay_usecs = pdata->settle_delay_usecs;
+
+ x++;
+ x->tx_buf = &ts->read_y;
+ x->len = 1;
+ spi_message_add_tail(x, m);
+
+ x++;
+ x->rx_buf = &ts->tc.y;
+ x->len = 2;
+ spi_message_add_tail(x, m);
+ }
+
m->complete = ads7846_rx_val;
m->context = ts;
@@ -954,6 +972,21 @@ static int __devinit ads7846_probe(struc
x->len = 2;
spi_message_add_tail(x, m);
+ /* ... maybe discard first sample ... */
+ if (pdata->settle_delay_usecs) {
+ x->delay_usecs = pdata->settle_delay_usecs;
+
+ x++;
+ x->tx_buf = &ts->read_x;
+ x->len = 1;
+ spi_message_add_tail(x, m);
+
+ x++;
+ x->rx_buf = &ts->tc.x;
+ x->len = 2;
+ spi_message_add_tail(x, m);
+ }
+
m->complete = ads7846_rx_val;
m->context = ts;
@@ -973,6 +1006,21 @@ static int __devinit ads7846_probe(struc
x->len = 2;
spi_message_add_tail(x, m);
+ /* ... maybe discard first sample ... */
+ if (pdata->settle_delay_usecs) {
+ x->delay_usecs = pdata->settle_delay_usecs;
+
+ x++;
+ x->tx_buf = &ts->read_z1;
+ x->len = 1;
+ spi_message_add_tail(x, m);
+
+ x++;
+ x->rx_buf = &ts->tc.z1;
+ x->len = 2;
+ spi_message_add_tail(x, m);
+ }
+
m->complete = ads7846_rx_val;
m->context = ts;
@@ -990,6 +1038,21 @@ static int __devinit ads7846_probe(struc
x->len = 2;
spi_message_add_tail(x, m);
+ /* ... maybe discard first sample ... */
+ if (pdata->settle_delay_usecs) {
+ x->delay_usecs = pdata->settle_delay_usecs;
+
+ x++;
+ x->tx_buf = &ts->read_z2;
+ x->len = 1;
+ spi_message_add_tail(x, m);
+
+ x++;
+ x->rx_buf = &ts->tc.z2;
+ x->len = 2;
+ spi_message_add_tail(x, m);
+ }
+
m->complete = ads7846_rx_val;
m->context = ts;
}
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [RESEND patch 2.6.22-rc4 1/2] ads7846 sample settling
2007-07-13 18:29 [RESEND patch 2.6.22-rc4 1/2] ads7846 sample settling David Brownell
@ 2007-07-13 19:01 ` Dmitry Torokhov
2007-07-13 19:58 ` David Brownell
0 siblings, 1 reply; 3+ messages in thread
From: Dmitry Torokhov @ 2007-07-13 19:01 UTC (permalink / raw)
To: David Brownell; +Cc: Semih Hazar, Imre Deak, Linux Kernel list
HI David,
On 7/13/07, David Brownell <david-b@pacbell.net> wrote:
> From: Semih Hazar <semih.hazar@indefia.com>
>
> The ads7846 driver has support for filtering, but when the chip gets
> deselected between samples this causes noise. This patch adds support
> for an optional settling delay time, so that two consecutive samples
> will be taken with the specified delay time apart. This ensures that
> the chip won't be deselected, so the noise won't appear.
>
Sorry for being unresponsive. I have both patches in my tree and I
will push them to Linus with my next batch for 2.6.23-pre-rc1.
--
Dmitry
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RESEND patch 2.6.22-rc4 1/2] ads7846 sample settling
2007-07-13 19:01 ` Dmitry Torokhov
@ 2007-07-13 19:58 ` David Brownell
0 siblings, 0 replies; 3+ messages in thread
From: David Brownell @ 2007-07-13 19:58 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: Semih Hazar, Imre Deak, Linux Kernel list
On Friday 13 July 2007, Dmitry Torokhov wrote:
> HI David,
>
> On 7/13/07, David Brownell <david-b@pacbell.net> wrote:
> > From: Semih Hazar <semih.hazar@indefia.com>
> >
> > The ads7846 driver has support for filtering, but when the chip gets
> > deselected between samples this causes noise. This patch adds support
> > for an optional settling delay time, so that two consecutive samples
> > will be taken with the specified delay time apart. This ensures that
> > the chip won't be deselected, so the noise won't appear.
> >
>
>
> Sorry for being unresponsive.
It happens to all of us sometimes! No real problem.
> I have both patches in my tree and I
> will push them to Linus with my next batch for 2.6.23-pre-rc1.
Great, that's what I wanted to see happen.
Watching this touchscreen driver evolve has been interesting;
I hadn't realized it took quite so much work to get accurate
measurements! Some touchscreen controllers seem to do the
sample quality improvement in hardware (or firmware), but this
seems to be the only driver doing this much of the work itself.
- Dave
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-07-13 19:58 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-13 18:29 [RESEND patch 2.6.22-rc4 1/2] ads7846 sample settling David Brownell
2007-07-13 19:01 ` Dmitry Torokhov
2007-07-13 19:58 ` David Brownell
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.