Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Touchscreen spurious event fix
Browse files Browse the repository at this point in the history
Touchscreen driver was not checking event type,
which meant bad coords that arrived with the
finger up event were being used, causing this
spurious coordinate event.

Fix is to ignore all finger up events.

Signed-off-by: James Hughes <james.hughes@raspberrypi.org>
James Hughes authored and Phil Elwell committed Nov 19, 2017

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 59bf1df commit 02f9693
Showing 1 changed file with 16 additions and 8 deletions.
24 changes: 16 additions & 8 deletions drivers/input/touchscreen/rpi-ft5406.c
Original file line number Diff line number Diff line change
@@ -42,6 +42,9 @@ struct ft5406_regs {

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 480
#define FTS_TOUCH_DOWN 0
#define FTS_TOUCH_UP 1
#define FTS_TOUCH_CONTACT 2

struct ft5406 {
struct platform_device * pdev;
@@ -81,26 +84,31 @@ static int ft5406_thread(void *arg)
int x = (((int) regs.point[i].xh & 0xf) << 8) + regs.point[i].xl;
int y = (((int) regs.point[i].yh & 0xf) << 8) + regs.point[i].yl;
int touchid = (regs.point[i].yh >> 4) & 0xf;
int event_id = (regs.point[i].xh >> 6) & 0x3;

modified_ids |= 1 << touchid;

if(!((1 << touchid) & known_ids))
dev_dbg(&ts->pdev->dev, "x = %d, y = %d, touchid = %d\n", x, y, touchid);

input_mt_slot(ts->input_dev, touchid);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1);
if (event_id == FTS_TOUCH_CONTACT ||
event_id == FTS_TOUCH_DOWN) {
if(!((1 << touchid) & known_ids))
dev_dbg(&ts->pdev->dev, "x = %d, y = %d, touchid = %d\n",
x, y, touchid);

input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
input_mt_slot(ts->input_dev, touchid);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 1);

input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x);
input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y);
}
}

released_ids = known_ids & ~modified_ids;
for(i = 0; released_ids && i < MAXIMUM_SUPPORTED_POINTS; i++)
{
if(released_ids & (1<<i))
{
dev_dbg(&ts->pdev->dev, "Released %d, known = %x modified = %x\n", i, known_ids, modified_ids);
dev_dbg(&ts->pdev->dev, "Released %d, known = %x modified = %x\n",
i, known_ids, modified_ids);
input_mt_slot(ts->input_dev, i);
input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, 0);
modified_ids &= ~(1 << i);

0 comments on commit 02f9693

Please sign in to comment.