Merge pull request #14531 from benpicco/drivers/stmpe811/fix_polarity

drivers/stmpe811: fix interrupt polarity & interrupt generation
This commit is contained in:
Alexandre Abadie 2020-07-22 11:12:31 +02:00 committed by GitHub
commit 09fe0c7667
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 25 deletions

View File

@ -162,7 +162,7 @@ int stmpe811_init(stmpe811_t *dev, const stmpe811_params_t * params, touch_event
if ((dev->params.int_pin != GPIO_UNDEF) && cb) { if ((dev->params.int_pin != GPIO_UNDEF) && cb) {
DEBUG("[stmpe811] init: configuring touchscreen interrupt\n"); DEBUG("[stmpe811] init: configuring touchscreen interrupt\n");
gpio_init_int(dev->params.int_pin, GPIO_IN, GPIO_RISING, cb, arg); gpio_init_int(dev->params.int_pin, GPIO_IN, GPIO_FALLING, cb, arg);
/* Enable touchscreen interrupt */ /* Enable touchscreen interrupt */
ret += i2c_write_reg(STMPE811_DEV_I2C, STMPE811_DEV_ADDR, ret += i2c_write_reg(STMPE811_DEV_I2C, STMPE811_DEV_ADDR,
@ -170,7 +170,7 @@ int stmpe811_init(stmpe811_t *dev, const stmpe811_params_t * params, touch_event
/* Enable global interrupt */ /* Enable global interrupt */
ret += i2c_write_reg(STMPE811_DEV_I2C, STMPE811_DEV_ADDR, ret += i2c_write_reg(STMPE811_DEV_I2C, STMPE811_DEV_ADDR,
STMPE811_INT_CTRL, STMPE811_INT_CTRL_GLOBAL_INT, 0); STMPE811_INT_CTRL, STMPE811_INT_CTRL_GLOBAL_INT | STMPE811_INT_CTRL_INT_TYPE, 0);
} }
if (ret < 0) { if (ret < 0) {
@ -194,6 +194,13 @@ int stmpe811_read_touch_position(stmpe811_t *dev, stmpe811_touch_position_t *pos
/* Acquire I2C device */ /* Acquire I2C device */
i2c_acquire(STMPE811_DEV_I2C); i2c_acquire(STMPE811_DEV_I2C);
/* Ensure there's a least one position measured in the FIFO */
uint8_t fifo_size = 0;
do {
i2c_read_reg(STMPE811_DEV_I2C, STMPE811_DEV_ADDR,
STMPE811_FIFO_SIZE, &fifo_size, 0);
} while (!fifo_size);
uint8_t xyz[4]; uint8_t xyz[4];
uint32_t xyz_ul; uint32_t xyz_ul;
@ -203,7 +210,6 @@ int stmpe811_read_touch_position(stmpe811_t *dev, stmpe811_touch_position_t *pos
i2c_release(STMPE811_DEV_I2C); i2c_release(STMPE811_DEV_I2C);
return -STMPE811_ERR_I2C; return -STMPE811_ERR_I2C;
} }
_reset_fifo(dev);
/* Release I2C device */ /* Release I2C device */
i2c_release(STMPE811_DEV_I2C); i2c_release(STMPE811_DEV_I2C);
@ -262,8 +268,9 @@ int stmpe811_read_touch_state(const stmpe811_t *dev, stmpe811_touch_state_t *sta
return -STMPE811_ERR_I2C; return -STMPE811_ERR_I2C;
} }
if ((val & STMPE811_TSC_CTRL_STA)) {
_clear_interrupt_status(dev); _clear_interrupt_status(dev);
if ((val & STMPE811_TSC_CTRL_STA)) {
*state = STMPE811_TOUCH_STATE_PRESSED; *state = STMPE811_TOUCH_STATE_PRESSED;
} }
else { else {

View File

@ -2,7 +2,6 @@ BOARD ?= stm32f429i-disc1
include ../Makefile.tests_common include ../Makefile.tests_common
USEMODULE += xtimer
USEMODULE += stmpe811 USEMODULE += stmpe811
include $(RIOTBASE)/Makefile.include include $(RIOTBASE)/Makefile.include

View File

@ -13,21 +13,17 @@ make -C tests/driver_stmpe811 flash term
## Expected output ## Expected output
The application initializes the STMPE811 and displays "Pressed!" when a touch The application initializes the STMPE811 and displays "Pressed!" when a touch
event is detected. event is detected. The position of the touch event is also displayed.
Current touch positions are printed in terminal while holding the screen
pressed.
"Released" is displayed when the screen is released. "Released" is displayed when the screen is released.
``` ```
2020-02-10 10:20:17,647 # Pressed! 2020-07-21 21:24:49,286 # Pressed!
2020-02-10 10:20:17,653 # X: 167, Y:81 2020-07-21 21:24:49,293 # X: 132, Y:138
2020-02-10 10:20:17,659 # X: 165, Y:75 2020-07-21 21:24:49,826 # Released!
2020-02-10 10:20:17,671 # X: 165, Y:69 2020-07-21 21:24:51,218 # Pressed!
2020-02-10 10:20:17,689 # X: 166, Y:68 2020-07-21 21:24:51,219 # X: 42, Y:16
2020-02-10 10:20:17,701 # X: 167, Y:68 2020-07-21 21:24:51,614 # Released!
2020-02-10 10:20:17,713 # X: 169, Y:69 2020-07-21 21:24:53,385 # Pressed!
2020-02-10 10:20:17,725 # X: 170, Y:69 2020-07-21 21:24:53,385 # X: 197, Y:64
2020-02-10 10:20:17,737 # X: 170, Y:70 2020-07-21 21:24:53,588 # Released!
2020-02-10 10:20:17,755 # X: 173, Y:69
2020-02-10 10:20:17,761 # Released!
``` ```

View File

@ -20,25 +20,25 @@
#include <stdio.h> #include <stdio.h>
#include "xtimer.h" #include "mutex.h"
#include "stmpe811.h" #include "stmpe811.h"
#include "stmpe811_params.h" #include "stmpe811_params.h"
static void _touch_event_cb(void *arg) static void _touch_event_cb(void *arg)
{ {
(void)arg; mutex_unlock(arg);
puts("Pressed!");
} }
int main(void) int main(void)
{ {
mutex_t lock = MUTEX_INIT_LOCKED;
stmpe811_t dev; stmpe811_t dev;
puts("STMPE811 test application\n"); puts("STMPE811 test application\n");
printf("+------------Initializing------------+\n"); printf("+------------Initializing------------+\n");
int ret = stmpe811_init(&dev, &stmpe811_params[0], _touch_event_cb, NULL); int ret = stmpe811_init(&dev, &stmpe811_params[0], _touch_event_cb, &lock);
if (ret != STMPE811_OK) { if (ret != STMPE811_OK) {
puts("[Error] Initialization failed"); puts("[Error] Initialization failed");
return 1; return 1;
@ -51,8 +51,16 @@ int main(void)
stmpe811_touch_state_t last_touch_state = current_touch_state; stmpe811_touch_state_t last_touch_state = current_touch_state;
while (1) { while (1) {
/* wait for touch event */
mutex_lock(&lock);
stmpe811_read_touch_state(&dev, &current_touch_state); stmpe811_read_touch_state(&dev, &current_touch_state);
if (current_touch_state != last_touch_state) { if (current_touch_state != last_touch_state) {
if (current_touch_state == STMPE811_TOUCH_STATE_PRESSED) {
puts("Pressed!");
}
if (current_touch_state == STMPE811_TOUCH_STATE_RELEASED) { if (current_touch_state == STMPE811_TOUCH_STATE_RELEASED) {
puts("Released!"); puts("Released!");
} }
@ -65,8 +73,6 @@ int main(void)
stmpe811_read_touch_position(&dev, &position); stmpe811_read_touch_position(&dev, &position);
printf("X: %i, Y:%i\n", position.x, position.y); printf("X: %i, Y:%i\n", position.x, position.y);
} }
xtimer_usleep(10 * US_PER_MS);
} }
return 0; return 0;