Input: ads7846 - introduce sample settling delay
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> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
committed by
Dmitry Torokhov
parent
4994cd8dad
commit
e4f4886199
@ -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(struct spi_device *spi)
|
||||
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(struct spi_device *spi)
|
||||
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(struct spi_device *spi)
|
||||
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(struct spi_device *spi)
|
||||
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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user