1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

drivers/stmpe811: enable FIFO threshold interrupt

For continuous reporting of the touch position the FIFO threshold interrupt is used. This is necessary for example to implement gestures in interrupt mode. To activate the FIFO threshold interrupt and thus continuous reporting, the macro 'STMPE811_FIFO_THRESHOLD_ENABLED' must be set to 1. However, the driver only works reliably with FIFO threshold interrupts if the FIFO threshold value is at least 2. Otherwise the Touch Detect interrupt will not work correctly when a touch is released. Therefore, the FIFO threshold is set to 2 by default when `STMPE811_FIFO_THRESHOLD_ENABLED` is set. This default value can be overwritten by `STMPE811_FIFO_THRESHOLD`.
This commit is contained in:
Gunar Schorcht 2023-08-14 17:26:33 +02:00
parent 3531770689
commit 9aecdaf2f6

View File

@ -46,6 +46,23 @@
#define ADDR (dev->params.addr)
#endif
#ifndef STMPE811_FIFO_THRESHOLD_ENABLED
#define STMPE811_FIFO_THRESHOLD_ENABLED (0)
#endif
/* The driver only works reliably with FIFO threshold interrupts if the FIFO
* threshold is at least 2. The reason is that all interrupts are cleared when
* the status is checked in `stmpe811_read_touch_state` but the FIFO Threshold
* interrupt is asserted again immediately since the FIFO is not read so that
* a new interrupt is pending. On the other hand, the Touch Detected interrupt
* does not work reliably for the release event if only the Touch Detected
* interrupt in `stmpe811_read_touch_state` is cleared. The workaround is
* to set the FIFO threshold to at least 2 to introduce a small delay between
* the Touch Detect interrupt on a touch and the first FIFO threshold
* interrupt. */
#ifndef STMPE811_FIFO_THRESHOLD
#define STMPE811_FIFO_THRESHOLD (STMPE811_FIFO_THRESHOLD_ENABLED ? 2 : 1)
#endif
#if IS_USED(MODULE_STMPE811_SPI) /* using SPI mode */
static inline void _acquire(const stmpe811_t *dev)
@ -194,7 +211,7 @@ int stmpe811_init(stmpe811_t *dev, const stmpe811_params_t *params, stmpe811_eve
}
/* check mode configuration */
if(_stmpe811_check_mode(dev) != 0) {
if (_stmpe811_check_mode(dev) != 0) {
DEBUG("[stmpe811] error: couldn't setup SPI\n");
return -EIO;
}
@ -257,7 +274,7 @@ int stmpe811_init(stmpe811_t *dev, const stmpe811_params_t *params, stmpe811_eve
ret += _write_reg(dev, STMPE811_TSC_CFG, reg);
/* set fifo threshold */
ret += _write_reg(dev, STMPE811_FIFO_TH, 0x01);
ret += _write_reg(dev, STMPE811_FIFO_TH, STMPE811_FIFO_THRESHOLD);
/* reset fifo */
_reset_fifo(dev);
@ -285,7 +302,9 @@ int stmpe811_init(stmpe811_t *dev, const stmpe811_params_t *params, stmpe811_eve
gpio_init_int(dev->params.int_pin, GPIO_IN, GPIO_FALLING, cb, arg);
/* Enable touchscreen interrupt */
ret += _write_reg(dev, STMPE811_INT_EN, STMPE811_INT_EN_TOUCH_DET);
ret += _write_reg(dev, STMPE811_INT_EN,
STMPE811_INT_EN_TOUCH_DET |
(STMPE811_FIFO_THRESHOLD_ENABLED ? STMPE811_INT_EN_FIFO_TH : 0));
/* Enable global interrupt */
ret += _write_reg(dev, STMPE811_INT_CTRL,