This is an automated email from the ASF dual-hosted git repository.

jerzy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit d9dc15831efeb2deab54187bd68933c5ca172782
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Wed Aug 20 21:17:28 2025 +0200

    lvgl/indev: Fix touch during rotation
    
    Driver converts values reported by xpt2046 (adc values)
    and stmpe610 to screen coordinates.
    It was using screen resolution reported by LV_HOR_RES
    and LV_VER_RES but those values were already subject
    to rotation conversion.
    
    Input device is expected report values without rotation
    conversion.
    
    Now coordinates conversion is changed so touch screen
    works in all 4 rotations.
    
    Signed-off-by: Jerzy Kasenberg <[email protected]>
---
 hw/drivers/display/lvgl/indev/adc_touch/src/adc_touch.c |  6 ++++--
 hw/drivers/display/lvgl/indev/stmpe610/src/stmpe610.c   | 12 ++++++------
 hw/drivers/display/lvgl/indev/xpt2046/src/xpt2046.c     | 12 ++++++------
 3 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/hw/drivers/display/lvgl/indev/adc_touch/src/adc_touch.c 
b/hw/drivers/display/lvgl/indev/adc_touch/src/adc_touch.c
index 453591b45..a8323f8aa 100644
--- a/hw/drivers/display/lvgl/indev/adc_touch/src/adc_touch.c
+++ b/hw/drivers/display/lvgl/indev/adc_touch/src/adc_touch.c
@@ -67,6 +67,8 @@ struct touch_screen_data {
 
 #define INVERTED_X (MYNEWT_VAL(ADC_TOUCH_ADC_LEFT) > 
MYNEWT_VAL(ADC_TOUCH_ADC_RIGHT))
 #define INVERTED_Y (MYNEWT_VAL(ADC_TOUCH_ADC_TOP) > 
MYNEWT_VAL(ADC_TOUCH_ADC_BOTTOM))
+#define HOR_RES MYNEWT_VAL_LVGL_DISPLAY_HORIZONTAL_RESOLUTION
+#define VER_RES MYNEWT_VAL_LVGL_DISPLAY_VERTICAL_RESOLUTION
 
 static struct touch_screen_data touch_screen_data = {
     .adc_left = MYNEWT_VAL(ADC_TOUCH_ADC_LEFT),
@@ -184,9 +186,9 @@ adc_touch_handler(void)
         }
 
         /* Convert to display coordinates */
-        touch_screen_data.x = (x - touch_screen_data.adc_left) * LV_HOR_RES /
+        touch_screen_data.x = (x - touch_screen_data.adc_left) * HOR_RES /
                               (touch_screen_data.adc_right - 
touch_screen_data.adc_left);
-        touch_screen_data.y = (y - touch_screen_data.adc_top) * LV_VER_RES /
+        touch_screen_data.y = (y - touch_screen_data.adc_top) * VER_RES /
                               (touch_screen_data.adc_bottom - 
touch_screen_data.adc_top);
     }
 done:
diff --git a/hw/drivers/display/lvgl/indev/stmpe610/src/stmpe610.c 
b/hw/drivers/display/lvgl/indev/stmpe610/src/stmpe610.c
index dd17f603e..f6b008114 100644
--- a/hw/drivers/display/lvgl/indev/stmpe610/src/stmpe610.c
+++ b/hw/drivers/display/lvgl/indev/stmpe610/src/stmpe610.c
@@ -34,8 +34,8 @@
 #define STMPE610_MAX_Y           MYNEWT_VAL(STMPE610_MAX_Y)
 #define STMPE610_X_RANGE         ((STMPE610_MAX_X) - (STMPE610_MIN_X))
 #define STMPE610_Y_RANGE         ((STMPE610_MAX_Y) - (STMPE610_MIN_Y))
-#define STMPE610_HOR_RES         MYNEWT_VAL(STMPE610_HOR_RES)
-#define STMPE610_VER_RES         MYNEWT_VAL(STMPE610_VER_RES)
+#define STMPE610_HOR_RES         MYNEWT_VAL_LVGL_DISPLAY_HORIZONTAL_RESOLUTION
+#define STMPE610_VER_RES         MYNEWT_VAL_LVGL_DISPLAY_VERTICAL_RESOLUTION
 
 struct bus_spi_node touch;
 struct bus_spi_node_cfg touch_spi_cfg = {
@@ -202,15 +202,15 @@ xpt2046_corr(int16_t *xp, int16_t *yp)
         y = MYNEWT_VAL(STMPE610_MIN_Y);
     }
 
-    x = (x - STMPE610_MIN_X) * LV_HOR_RES / STMPE610_X_RANGE;
-    y = (y - STMPE610_MIN_Y) * LV_VER_RES / STMPE610_Y_RANGE;
+    x = (x - STMPE610_MIN_X) * STMPE610_HOR_RES / STMPE610_X_RANGE;
+    y = (y - STMPE610_MIN_Y) * STMPE610_VER_RES / STMPE610_Y_RANGE;
 
 #if STMPE610_X_INV
-    x = LV_HOR_RES - x;
+    x = STMPE610_HOR_RES - x;
 #endif
 
 #if STMPE610_Y_INV
-    y = LV_VER_RES - y;
+    y = STMPE610_VER_RES - y;
 #endif
     *xp = x;
     *yp = y;
diff --git a/hw/drivers/display/lvgl/indev/xpt2046/src/xpt2046.c 
b/hw/drivers/display/lvgl/indev/xpt2046/src/xpt2046.c
index 9ec052066..b9b582b29 100644
--- a/hw/drivers/display/lvgl/indev/xpt2046/src/xpt2046.c
+++ b/hw/drivers/display/lvgl/indev/xpt2046/src/xpt2046.c
@@ -39,8 +39,8 @@
 #define XPT2046_MAX_Y           MYNEWT_VAL(XPT2046_MAX_Y)
 #define XPT2046_X_RANGE         ((XPT2046_MAX_X) - (XPT2046_MIN_X))
 #define XPT2046_Y_RANGE         ((XPT2046_MAX_Y) - (XPT2046_MIN_Y))
-#define XPT2046_HOR_RES         MYNEWT_VAL(XPT2046_HOR_RES)
-#define XPT2046_VER_RES         MYNEWT_VAL(XPT2046_VER_RES)
+#define XPT2046_HOR_RES         MYNEWT_VAL_LVGL_DISPLAY_HORIZONTAL_RESOLUTION
+#define XPT2046_VER_RES         MYNEWT_VAL_LVGL_DISPLAY_VERTICAL_RESOLUTION
 
 struct bus_spi_node touch;
 struct bus_spi_node_cfg touch_spi_cfg = {
@@ -99,15 +99,15 @@ xpt2046_corr(int16_t *xp, int16_t *yp)
         y = MYNEWT_VAL(XPT2046_MIN_Y);
     }
 
-    x = (x - XPT2046_MIN_X) * LV_HOR_RES / XPT2046_X_RANGE;
-    y = (y - XPT2046_MIN_Y) * LV_VER_RES / XPT2046_Y_RANGE;
+    x = (x - XPT2046_MIN_X) * XPT2046_HOR_RES / XPT2046_X_RANGE;
+    y = (y - XPT2046_MIN_Y) * XPT2046_VER_RES / XPT2046_Y_RANGE;
 
 #if XPT2046_X_INV
-    x = LV_HOR_RES - x;
+    x = XPT2046_HOR_RES - x;
 #endif
 
 #if XPT2046_Y_INV
-    y = LV_VER_RES - y;
+    y = XPT2046_VER_RES - y;
 #endif
     *xp = x;
     *yp = y;

Reply via email to