This is an automated email from the ASF dual-hosted git repository. acassis pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit ed1384fc8104e664c4d795542dcdf634ca5fa5cb Author: wangjianyu3 <wangjian...@xiaomi.com> AuthorDate: Sat Jul 5 00:06:23 2025 +0800 driver/touchscreen: Add support for mirror/swap Add support for mirror/swap coordinates. There are some touchscreen drivers not support mirror or swap coordinates. For example, drivers/input/ft5x06 does not support mirror. Signed-off-by: wangjianyu3 <wangjian...@xiaomi.com> --- drivers/input/touchscreen_upper.c | 44 ++++++++++++++++++++++++++++++--------- drivers/input/uinput.c | 3 +-- include/nuttx/input/touchscreen.h | 13 +++++++++++- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/drivers/input/touchscreen_upper.c b/drivers/input/touchscreen_upper.c index 9afcfcc82f..a8e110b8ec 100644 --- a/drivers/input/touchscreen_upper.c +++ b/drivers/input/touchscreen_upper.c @@ -81,8 +81,9 @@ static int touch_ioctl(FAR struct file *filep, int cmd, static int touch_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); -static void touch_event_notify(FAR struct touch_openpriv_s *openpriv, - FAR const struct touch_sample_s *sample); +static void touch_event_notify(FAR struct touch_upperhalf_s *upper, + FAR struct touch_openpriv_s *openpriv, + FAR struct touch_sample_s *sample); /**************************************************************************** * Private Data @@ -384,17 +385,40 @@ errout: * Name: touch_event_notify ****************************************************************************/ -static void touch_event_notify(FAR struct touch_openpriv_s *openpriv, - FAR const struct touch_sample_s *sample) +static void touch_event_notify(FAR struct touch_upperhalf_s *upper, + FAR struct touch_openpriv_s *openpriv, + FAR struct touch_sample_s *sample) { - int semcount; + FAR struct touch_lowerhalf_s *lower = upper->lower; + FAR struct touch_point_s *point = sample->point; + int n; + + for (n = 0; lower->flags && n < sample->npoints; n++) + { + if (lower->flags & TOUCH_FLAG_SWAPXY) + { + int16_t p = point[n].x; + point[n].x = point[n].y; + point[n].y = p; + } + + if (lower->flags & TOUCH_FLAG_MIRRORX) + { + point[n].x = upper->lower->xres - point[n].x; + } + + if (lower->flags & TOUCH_FLAG_MIRRORY) + { + point[n].y = upper->lower->yres - point[n].y; + } + } nxmutex_lock(&openpriv->lock); circbuf_overwrite(&openpriv->circbuf, sample, SIZEOF_TOUCH_SAMPLE_S(sample->npoints)); - nxsem_get_value(&openpriv->waitsem, &semcount); - if (semcount < 1) + nxsem_get_value(&openpriv->waitsem, &n); + if (n < 1) { nxsem_post(&openpriv->waitsem); } @@ -411,7 +435,7 @@ static void touch_event_notify(FAR struct touch_openpriv_s *openpriv, * Name: touch_event ****************************************************************************/ -void touch_event(FAR void *priv, FAR const struct touch_sample_s *sample) +void touch_event(FAR void *priv, FAR struct touch_sample_s *sample) { FAR struct touch_upperhalf_s *upper = priv; FAR struct touch_openpriv_s *openpriv; @@ -423,14 +447,14 @@ void touch_event(FAR void *priv, FAR const struct touch_sample_s *sample) if (upper->grab) { - touch_event_notify(upper->grab, sample); + touch_event_notify(upper, upper->grab, sample); } else { list_for_every_entry(&upper->head, openpriv, struct touch_openpriv_s, node) { - touch_event_notify(openpriv, sample); + touch_event_notify(upper, openpriv, sample); } } diff --git a/drivers/input/uinput.c b/drivers/input/uinput.c index 406ef65627..bb3cfb8cdf 100644 --- a/drivers/input/uinput.c +++ b/drivers/input/uinput.c @@ -309,8 +309,7 @@ static ssize_t uinput_touch_notify(FAR void *uinput_lower, { FAR struct uinput_touch_lowerhalf_s *utcs_lower = (FAR struct uinput_touch_lowerhalf_s *)uinput_lower; - FAR const struct touch_sample_s *sample = - (FAR const struct touch_sample_s *)buffer; + FAR struct touch_sample_s *sample = (FAR struct touch_sample_s *)buffer; touch_event(utcs_lower->lower.priv, sample); return buflen; diff --git a/include/nuttx/input/touchscreen.h b/include/nuttx/input/touchscreen.h index f93a4eb300..16052a3e61 100644 --- a/include/nuttx/input/touchscreen.h +++ b/include/nuttx/input/touchscreen.h @@ -141,6 +141,14 @@ #define TOUCH_SIZE_VALID (1 << 6) /* Hardware provided a valid H/W contact size */ #define TOUCH_GESTURE_VALID (1 << 7) /* Hardware provided a valid gesture */ +/* These definitions provide the meaning of all of the bits that may be + * reported in the struct touch_lowerhalf_s flags. + */ + +#define TOUCH_FLAG_SWAPXY (1 << 0) /* Swap the X and Y coordinates */ +#define TOUCH_FLAG_MIRRORX (1 << 1) /* Mirror X coordinate */ +#define TOUCH_FLAG_MIRRORY (1 << 2) /* Mirror Y coordinate */ + /* These are definitions for touch gesture */ #define TOUCH_DOUBLE_CLICK (0x00) @@ -234,6 +242,9 @@ struct touch_sample_s struct touch_lowerhalf_s { uint8_t maxpoint; /* Maximal point supported by the touchscreen */ + uint8_t flags; /* Flags for rotation, see TOUCH_FLAG_* */ + uint16_t xres; /* Horizontal resolution in pixels */ + uint16_t yres; /* Vertical resolution in pixels */ FAR void *priv; /* Save the upper half pointer */ /************************************************************************** @@ -333,7 +344,7 @@ static inline uint64_t touch_get_time(void) * sample - pointer to data of touch point event. ****************************************************************************/ -void touch_event(FAR void *priv, FAR const struct touch_sample_s *sample); +void touch_event(FAR void *priv, FAR struct touch_sample_s *sample); /**************************************************************************** * Name: touch_register