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;
