mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-20 21:38:26 +00:00
fix(core/embed): fix too frequent reading of touch panel registers
[no changelog]
This commit is contained in:
parent
33f5d47330
commit
470d6ec24e
@ -21,6 +21,7 @@
|
|||||||
#include TREZOR_BOARD
|
#include TREZOR_BOARD
|
||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
@ -33,6 +34,9 @@
|
|||||||
#include "panels/lx154a2422cpt23.h"
|
#include "panels/lx154a2422cpt23.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// #define TOUCH_TRACE_REGS
|
||||||
|
// #define TOUCH_TRACE_EVENT
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// Set if the driver is initialized
|
// Set if the driver is initialized
|
||||||
secbool initialized;
|
secbool initialized;
|
||||||
@ -43,6 +47,8 @@ typedef struct {
|
|||||||
uint32_t init_ticks;
|
uint32_t init_ticks;
|
||||||
// Time (in ticks) when touch_get_event() was called last time
|
// Time (in ticks) when touch_get_event() was called last time
|
||||||
uint32_t poll_ticks;
|
uint32_t poll_ticks;
|
||||||
|
// Time (in ticks) when the touch registers were read last time
|
||||||
|
uint32_t read_ticks;
|
||||||
// Set if the touch controller is currently touched
|
// Set if the touch controller is currently touched
|
||||||
// (respectively, the we detected a touch event)
|
// (respectively, the we detected a touch event)
|
||||||
bool pressed;
|
bool pressed;
|
||||||
@ -259,6 +265,7 @@ secbool touch_init(void) {
|
|||||||
|
|
||||||
driver->init_ticks = hal_ticks_ms();
|
driver->init_ticks = hal_ticks_ms();
|
||||||
driver->poll_ticks = driver->init_ticks;
|
driver->poll_ticks = driver->init_ticks;
|
||||||
|
driver->read_ticks = driver->init_ticks;
|
||||||
driver->initialized = sectrue;
|
driver->initialized = sectrue;
|
||||||
|
|
||||||
return sectrue;
|
return sectrue;
|
||||||
@ -337,6 +344,57 @@ secbool touch_activity(void) {
|
|||||||
return secfalse;
|
return secfalse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOUCH_TRACE_REGS
|
||||||
|
void trace_regs(uint8_t* regs) {
|
||||||
|
// Extract gesture ID (FT6X63_GESTURE_xxx)
|
||||||
|
uint8_t gesture = regs[FT6X63_REG_GEST_ID];
|
||||||
|
|
||||||
|
// Extract number of touches (0, 1, 2) or 0x0F before
|
||||||
|
// the first touch (tested with FT6206)
|
||||||
|
uint8_t nb_touches = regs[FT6X63_REG_TD_STATUS] & 0x0F;
|
||||||
|
|
||||||
|
// Extract event flags (one of press down, contact, lift up)
|
||||||
|
uint8_t flags = regs[FT6X63_REG_P1_XH] & FT6X63_EVENT_MASK;
|
||||||
|
|
||||||
|
// Extract touch coordinates
|
||||||
|
uint16_t x = ((regs[FT6X63_REG_P1_XH] & 0x0F) << 8) | regs[FT6X63_REG_P1_XL];
|
||||||
|
uint16_t y = ((regs[FT6X63_REG_P1_YH] & 0x0F) << 8) | regs[FT6X63_REG_P1_YL];
|
||||||
|
|
||||||
|
char event;
|
||||||
|
|
||||||
|
if (flags == FT6X63_EVENT_PRESS_DOWN) {
|
||||||
|
event = 'D';
|
||||||
|
} else if (flags == FT6X63_EVENT_CONTACT) {
|
||||||
|
event = 'C';
|
||||||
|
} else if (flags == FT6X63_EVENT_LIFT_UP) {
|
||||||
|
event = 'U';
|
||||||
|
} else {
|
||||||
|
event = '-';
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t time = hal_ticks_ms() % 10000;
|
||||||
|
|
||||||
|
printf("%04ld [gesture=%02X, nb_touches=%d, flags=%c, x=%3d, y=%3d]\r\n",
|
||||||
|
time, gesture, nb_touches, event, x, y);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TOUCH_TRACE_EVENT
|
||||||
|
void trace_event(uint32_t event) {
|
||||||
|
char event_type = (event & TOUCH_START) ? 'D'
|
||||||
|
: (event & TOUCH_MOVE) ? 'M'
|
||||||
|
: (event & TOUCH_END) ? 'U'
|
||||||
|
: '-';
|
||||||
|
|
||||||
|
uint16_t x = touch_unpack_x(event);
|
||||||
|
uint16_t y = touch_unpack_y(event);
|
||||||
|
|
||||||
|
uint32_t time = hal_ticks_ms() % 10000;
|
||||||
|
|
||||||
|
printf("%04ld [event=%c, x=%3d, y=%3d]\r\n", time, event_type, x, y);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
uint32_t touch_get_event(void) {
|
uint32_t touch_get_event(void) {
|
||||||
touch_driver_t* driver = &g_touch_driver;
|
touch_driver_t* driver = &g_touch_driver;
|
||||||
|
|
||||||
@ -361,18 +419,28 @@ uint32_t touch_get_event(void) {
|
|||||||
bool starving = (int32_t)(ticks - driver->poll_ticks) > 300 /* ms */;
|
bool starving = (int32_t)(ticks - driver->poll_ticks) > 300 /* ms */;
|
||||||
driver->poll_ticks = ticks;
|
driver->poll_ticks = ticks;
|
||||||
|
|
||||||
|
// Test if the touch controller is polled too frequently
|
||||||
|
// (less than 20ms since the last read)
|
||||||
|
bool toofast = (int32_t)(ticks - driver->read_ticks) < 20 /* ms */;
|
||||||
|
|
||||||
// Fast track: if there is no new event and the touch controller
|
// Fast track: if there is no new event and the touch controller
|
||||||
// is not touched, we do not need to read the registers
|
// is not touched, we do not need to read the registers
|
||||||
if (!ft6x36_test_and_clear_interrupt() && !driver->pressed) {
|
if (!ft6x36_test_and_clear_interrupt() && (!driver->pressed || toofast)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
driver->read_ticks = ticks;
|
||||||
|
|
||||||
// Read the set of registers containing touch event and coordinates
|
// Read the set of registers containing touch event and coordinates
|
||||||
if (sectrue != ft6x36_read_regs(0x00, regs, sizeof(regs))) {
|
if (sectrue != ft6x36_read_regs(0x00, regs, sizeof(regs))) {
|
||||||
// Failed to read the touch registers
|
// Failed to read the touch registers
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TOUCH_TRACE_REGS
|
||||||
|
trace_regs(regs);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Extract gesture ID (FT6X63_GESTURE_xxx)
|
// Extract gesture ID (FT6X63_GESTURE_xxx)
|
||||||
uint8_t gesture = regs[FT6X63_REG_GEST_ID];
|
uint8_t gesture = regs[FT6X63_REG_GEST_ID];
|
||||||
|
|
||||||
@ -465,5 +533,9 @@ uint32_t touch_get_event(void) {
|
|||||||
driver->last_x = x;
|
driver->last_x = x;
|
||||||
driver->last_y = y;
|
driver->last_y = y;
|
||||||
|
|
||||||
|
#ifdef TOUCH_TRACE_EVENT
|
||||||
|
trace_event(event);
|
||||||
|
#endif
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user