diff --git a/ChangeLog b/ChangeLog
index 1311332177..79e746f6bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2760,3 +2760,10 @@
window to revert to the previous window. Not good behavior.
* sched/sched_mergepending.c: Add task switching instrumentation. There is a case
here where instrumentation was missing. Contributed by Petri Tanskanen.
+ CONFIG_STMPE11_THRESHX, CONFIG_STMPE11_THRESHX, and drivers/stmpe11_tsc.c: Add some
+ threasholding controls to all slow down processing of touchscreen samples.
+ This is a problem with NX in multi-user mode: touchscreen data gets sent
+ via a message and when the message queue gets full the sender blocks and
+ touch events are lost. Basic data overrun. The badly effects touchscreen
+ human factors.
+
\ No newline at end of file
diff --git a/Documentation/NuttxPortingGuide.html b/Documentation/NuttxPortingGuide.html
index 4ded08f0fb..15019ad102 100644
--- a/Documentation/NuttxPortingGuide.html
+++ b/Documentation/NuttxPortingGuide.html
@@ -4730,6 +4730,15 @@ build
CONFIG_STMPE11_REGDEBUG
:
Enabled very low register-level debug output. Requires CONFIG_DEBUG
.
+
+ CONFIG_STMPE11_THRESHX
and CONFIG_STMPE11_THRESHY
:
+ STMPE11 touchscreen data comes in a a very high rate. New touch positions
+ will only be reported when the X or Y data changes by these thresholds.
+ This trades reduces data rate for some loss in dragging accuracy. The
+ STMPE11 is configure for 12-bit values so the raw ranges are 0-4095. So
+ for example, if your display is 320x240, then THRESHX=13 and THRESHY=17
+ would correspond to one pixel. Default: 12
+
Analog Devices
diff --git a/configs/README.txt b/configs/README.txt
index 15ff30e114..fc85e89e12 100644
--- a/configs/README.txt
+++ b/configs/README.txt
@@ -814,6 +814,13 @@ defconfig -- This is a configuration file similar to the Linux
Disable driver temperature sensor functionality.
CONFIG_STMPE11_REGDEBUG
Enabled very low register-level debug output. Requires CONFIG_DEBUG.
+ CONFIG_STMPE11_THRESHX and CONFIG_STMPE11_THRESHY
+ STMPE11 touchscreen data comes in a a very high rate. New touch positions
+ will only be reported when the X or Y data changes by these thresholds.
+ This trades reduces data rate for some loss in dragging accuracy. The
+ STMPE11 is configure for 12-bit values so the raw ranges are 0-4095. So
+ for example, if your display is 320x240, then THRESHX=13 and THRESHY=17
+ would correspond to one pixel. Default: 12
Analog Devices
diff --git a/configs/stm3240g-eval/nsh/defconfig b/configs/stm3240g-eval/nsh/defconfig
index a0131c9932..0d298f520d 100644
--- a/configs/stm3240g-eval/nsh/defconfig
+++ b/configs/stm3240g-eval/nsh/defconfig
@@ -990,6 +990,13 @@ CONFIG_INPUT_TSC2007=n
# Disable driver temperature sensor functionality.
# CONFIG_STMPE11_REGDBUG
# Enabled very low register-level debug output. Requires CONFIG_DEBUG.
+# CONFIG_STMPE11_THRESHX and CONFIG_STMPE11_THRESHY
+# STMPE11 touchscreen data comes in a a very high rate. New touch positions
+# will only be reported when the X or Y data changes by these thresholds.
+# This trades reduces data rate for some loss in dragging accuracy. The
+# STMPE11 is configure for 12-bit values so the raw ranges are 0-4095. So
+# for example, if your display is 320x240, then THRESHX=13 and THRESHY=17
+# would correspond to one pixel. Default: 12
#
CONFIG_INPUT_STMPE11=n
CONFIG_STMPE11_SPI=n
@@ -1005,7 +1012,8 @@ CONFIG_STMPE11_GPIOINT_DISABLE=y
CONFIG_STMPE11_SWAPXY=y
CONFIG_STMPE11_TEMP_DISABLE=y
CONFIG_STMPE11_REGDEBUG=n
-
+CONFIG_STMPE11_THRESHX=26
+CONFIG_STMPE11_THRESHY=34
#
# USB Device Configuration
#
diff --git a/configs/stm3240g-eval/nxwm/defconfig b/configs/stm3240g-eval/nxwm/defconfig
index 3242948f30..ca7b242ce0 100644
--- a/configs/stm3240g-eval/nxwm/defconfig
+++ b/configs/stm3240g-eval/nxwm/defconfig
@@ -990,6 +990,13 @@ CONFIG_INPUT_TSC2007=n
# Disable driver temperature sensor functionality.
# CONFIG_STMPE11_REGDBUG
# Enabled very low register-level debug output. Requires CONFIG_DEBUG.
+# CONFIG_STMPE11_THRESHX and CONFIG_STMPE11_THRESHY
+# STMPE11 touchscreen data comes in a a very high rate. New touch positions
+# will only be reported when the X or Y data changes by these thresholds.
+# This trades reduces data rate for some loss in dragging accuracy. The
+# STMPE11 is configure for 12-bit values so the raw ranges are 0-4095. So
+# for example, if your display is 320x240, then THRESHX=13 and THRESHY=17
+# would correspond to one pixel. Default: 12
#
CONFIG_INPUT_STMPE11=n
CONFIG_STMPE11_SPI=n
@@ -1005,6 +1012,8 @@ CONFIG_STMPE11_GPIOINT_DISABLE=y
CONFIG_STMPE11_SWAPXY=n
CONFIG_STMPE11_TEMP_DISABLE=y
CONFIG_STMPE11_REGDEBUG=n
+CONFIG_STMPE11_THRESHX=26
+CONFIG_STMPE11_THRESHY=34
#
# USB Device Configuration
diff --git a/drivers/input/stmpe11_tsc.c b/drivers/input/stmpe11_tsc.c
index 70eb11259f..afe27ac899 100644
--- a/drivers/input/stmpe11_tsc.c
+++ b/drivers/input/stmpe11_tsc.c
@@ -986,19 +986,17 @@ void stmpe11_tscworker(FAR struct stmpe11_dev_s *priv, uint8_t intsta)
goto ignored;
}
- /* Perform a thresholding operation so that the results will be more stable */
+ /* Perform a thresholding operation so that the results will be more stable.
+ * If the difference from the last sample is small, then ignore the event.
+ * REVISIT: Should a large change in pressure also generate a event?
+ */
xdiff = x > priv->threshx ? (x - priv->threshx) : (priv->threshx - x);
ydiff = y > priv->threshy ? (y - priv->threshy) : (priv->threshy - y);
- /* If the difference from the last sample is small, then ignore the event.
- * REVISIT: Should a large change in pressure also generate a event?
- */
-
- if (xdiff + ydiff < 6)
+ if (xdiff < CONFIG_STMPE11_THRESHX && ydiff < CONFIG_STMPE11_THRESHY)
{
- /* Little or no change in position ... don't report anything.
- */
+ /* Little or no change in either direction ... don't report anything. */
goto ignored;
}
diff --git a/include/nuttx/input/stmpe11.h b/include/nuttx/input/stmpe11.h
index 5ecc53af10..2436437e6f 100644
--- a/include/nuttx/input/stmpe11.h
+++ b/include/nuttx/input/stmpe11.h
@@ -86,6 +86,13 @@
* Disable driver temperature sensor functionality.
* CONFIG_STMPE11_REGDEBUG
* Enabled very low register-level debug output. Requires CONFIG_DEBUG.
+ * CONFIG_STMPE11_THRESHX and CONFIG_STMPE11_THRESHY
+ * STMPE11 touchscreen data comes in a a very high rate. New touch positions
+ * will only be reported when the X or Y data changes by these thresholds.
+ * This trades reduces data rate for some loss in dragging accuracy. The
+ * STMPE11 is configure for 12-bit values so the raw ranges are 0-4095. So
+ * for example, if your display is 320x240, then THRESHX=13 and THRESHY=17
+ * would correspond to one pixel. Default: 12
*/
/* The STMPE811 interfaces with the target CPU via a I2C or SPI interface. The pin IN_1
@@ -127,6 +134,16 @@
# error "Work queue support required. CONFIG_SCHED_WORKQUEUE must be selected."
#endif
+/* Thresholds */
+
+#ifndef CONFIG_STMPE11_THRESHX
+# define CONFIG_STMPE11_THRESHX 12
+#endif
+
+#ifndef CONFIG_STMPE11_THRESHY
+# define CONFIG_STMPE11_THRESHY 12
+#endif
+
/* Debug output */
#ifndef CONFIG_DEBUG