ret = wm831x_bulk_read(wm831x, WM831X_TOUCH_DATA_X, count,
data); if (ret != 0) {
dev_err(wm831x->dev, "Failed to read touch data: %d\n",
ret); return IRQ_NONE;
}
/* * We get a pen down reading on every reading, report pen up if any * individual reading does so.
*/
wm831x_ts->pen_down = true; for (i = 0; i < count; i++) { if (!(data[i] & WM831X_TCH_PD)) {
wm831x_ts->pen_down = false; continue;
}
input_report_abs(wm831x_ts->input_dev, data_types[i],
data[i] & WM831X_TCH_DATA_MASK);
}
if (!wm831x_ts->pen_down) { /* Switch from data to pen down */
dev_dbg(wm831x->dev, "IRQ DATA->PD\n");
disable_irq_nosync(wm831x_ts->data_irq);
/* Don't need data any more */
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
WM831X_TCH_X_ENA | WM831X_TCH_Y_ENA |
WM831X_TCH_Z_ENA, 0);
/* Flush any final samples that arrived while reading */
wm831x_set_bits(wm831x, WM831X_INTERRUPT_STATUS_1,
WM831X_TCHDATA_EINT, WM831X_TCHDATA_EINT);
/* Shut the controller down, disabling all other functionality too */
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_1,
WM831X_TCH_ENA | WM831X_TCH_X_ENA |
WM831X_TCH_Y_ENA | WM831X_TCH_Z_ENA, 0);
/* Make sure any pending IRQs are done, the above will prevent * new ones firing.
*/
synchronize_irq(wm831x_ts->data_irq);
synchronize_irq(wm831x_ts->pd_irq);
/* Make sure the IRQ completion work is quiesced */
flush_work(&wm831x_ts->pd_data_work);
/* If we ended up with the pen down then make sure we revert back * to pen detection state for the next time we start up.
*/ if (wm831x_ts->pen_down) {
disable_irq(wm831x_ts->data_irq);
enable_irq(wm831x_ts->pd_irq);
wm831x_ts->pen_down = false;
}
}
/* * If we have a direct IRQ use it, otherwise use the interrupt * from the WM831x IRQ controller.
*/
wm831x_ts->data_irq = wm831x_irq(wm831x,
platform_get_irq_byname(pdev, "TCHDATA")); if (pdata && pdata->data_irq)
wm831x_ts->data_irq = pdata->data_irq;
if (pdata)
wm831x_ts->pressure = pdata->pressure; else
wm831x_ts->pressure = true;
/* Five wire touchscreens can't report pressure */ if (pdata && pdata->fivewire) {
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
WM831X_TCH_5WIRE, WM831X_TCH_5WIRE);
/* Pressure measurements are not possible for five wire mode */
WARN_ON(pdata->pressure && pdata->fivewire);
wm831x_ts->pressure = false;
} else {
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
WM831X_TCH_5WIRE, 0);
}
if (pdata) { switch (pdata->isel) { default:
dev_err(&pdev->dev, "Unsupported ISEL setting: %d\n",
pdata->isel);
fallthrough; case 200: case 0:
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
WM831X_TCH_ISEL, 0); break; case 400:
wm831x_set_bits(wm831x, WM831X_TOUCH_CONTROL_2,
WM831X_TCH_ISEL, WM831X_TCH_ISEL); break;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.