From deb1ca0e57dec6247b0506dd8a361acbc1dc3c57 Mon Sep 17 00:00:00 2001 From: Kurt Eckhardt Date: Thu, 5 Jun 2025 08:05:07 -0700 Subject: [PATCH 1/2] Beginning touch support Add a callback function for the touch device within the fixups for the GIGA. This callback simply remembers the last touch that happened and sets a semaphore. There is also a function added to retrieve this data. Needed to add the callback function into the exports file. --- loader/fixups.c | 48 ++++++++++++++++++++++++++++++++++++++++++ loader/llext_exports.c | 3 +++ 2 files changed, 51 insertions(+) diff --git a/loader/fixups.c b/loader/fixups.c index cf5e60cd..8249218e 100644 --- a/loader/fixups.c +++ b/loader/fixups.c @@ -45,10 +45,58 @@ SYS_INIT(disable_mpu_rasr_xn, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT) #include #include +#include + +// experiment to try to capture touch screen events +typedef struct { + int32_t x; + int32_t y; + int32_t pressed; +} touch_point_t; + +touch_point_t last_touch_point; + +static struct k_sem touch_event_sync; + +bool getVideoTouchEvent(touch_point_t *tp, k_timeout_t timeout) { + if (k_sem_take(&touch_event_sync, timeout) != 0) return false; + // BUGBUG: should probably put stuff in to return only + // data from whole event, but first see if anything works + memcpy(tp, &last_touch_point, sizeof(touch_point_t)); + return true; +} + + +void touch_event_callback(struct input_event *evt, void *user_data) +{ + //printk("touch_event_callback(%p %p): %p %u %u %u %d\n", evt, user_data, + // evt->dev, evt->sync, evt->type, evt->code, evt->value); + if (evt->code == INPUT_ABS_X) { + last_touch_point.x = evt->value; + } + if (evt->code == INPUT_ABS_Y) { + last_touch_point.y = evt->value; + } + if (evt->code == INPUT_BTN_TOUCH) { + last_touch_point.pressed = evt->value; + } + if (evt->sync) { + k_sem_give(&touch_event_sync); + } +} +static const struct device *const touch_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_touch)); +INPUT_CALLBACK_DEFINE(touch_dev, touch_event_callback, NULL); + + int camera_ext_clock_enable(void) { int ret; uint32_t rate; + + // Hack in init semaphore for touch events + k_sem_init(&touch_event_sync, 0, 1); + + const struct device *cam_ext_clk_dev = DEVICE_DT_GET(DT_NODELABEL(pwmclock)); if (!device_is_ready(cam_ext_clk_dev)) { diff --git a/loader/llext_exports.c b/loader/llext_exports.c index f6f8c85e..310079cb 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -131,6 +131,9 @@ FORCE_EXPORT_SYM(video_buffer_alloc); FORCE_EXPORT_SYM(video_buffer_release); FORCE_EXPORT_SYM(video_set_ctrl); #endif +#if defined(CONFIG_BOARD_ARDUINO_GIGA_R1) && defined(CONFIG_VIDEO) +FORCE_EXPORT_SYM(getVideoTouchEvent) +#endif #if defined(CONFIG_SHARED_MULTI_HEAP) FORCE_EXPORT_SYM(shared_multi_heap_aligned_alloc); From c939cb7cfbbb496e1921da059af15a6a47d59846 Mon Sep 17 00:00:00 2001 From: kurte Date: Sat, 7 Jun 2025 05:24:47 -0700 Subject: [PATCH 2/2] GIGA touch - convert callback to simple forward instead of processing in the fixups.c Also add clear out the callback in the initVariant such that if new program is launched it does not use old address --- loader/fixups.c | 36 ++++++++++++++++--- loader/llext_exports.c | 4 ++- .../variant.cpp | 7 ++++ 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/loader/fixups.c b/loader/fixups.c index 8249218e..2e79c461 100644 --- a/loader/fixups.c +++ b/loader/fixups.c @@ -48,10 +48,34 @@ SYS_INIT(disable_mpu_rasr_xn, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT) #include // experiment to try to capture touch screen events +#define GIGA_TOUCH_SET_CB +#ifdef GIGA_TOUCH_SET_CB +// This version we just register a callback function with the zephyr +// object, which then allows are Arduino Code to register a call back +// to be called... + + +void (*_giga_touch_callback)(struct input_event *evt, void *user_data) = 0; + +void registerGigaTouchCallback(void (*cb)(struct input_event *evt, void *user_data)) { + _giga_touch_callback = cb; +} + + +void touch_event_callback(struct input_event *evt, void *user_data) +{ + //printk("touch_event_callback(%p %p): %p %u %u %u %d\n", evt, user_data, + // evt->dev, evt->sync, evt->type, evt->code, evt->value); + if (_giga_touch_callback) { + (*_giga_touch_callback)(evt, user_data); + + } +} +#else typedef struct { - int32_t x; - int32_t y; - int32_t pressed; + size_t x; + size_t y; + bool pressed; } touch_point_t; touch_point_t last_touch_point; @@ -84,18 +108,22 @@ void touch_event_callback(struct input_event *evt, void *user_data) k_sem_give(&touch_event_sync); } } +#endif + static const struct device *const touch_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_touch)); INPUT_CALLBACK_DEFINE(touch_dev, touch_event_callback, NULL); + int camera_ext_clock_enable(void) { int ret; uint32_t rate; +#ifndef GIGA_TOUCH_SET_CB // Hack in init semaphore for touch events k_sem_init(&touch_event_sync, 0, 1); - +#endif const struct device *cam_ext_clk_dev = DEVICE_DT_GET(DT_NODELABEL(pwmclock)); diff --git a/loader/llext_exports.c b/loader/llext_exports.c index 310079cb..f2a8bc0b 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -132,7 +132,9 @@ FORCE_EXPORT_SYM(video_buffer_release); FORCE_EXPORT_SYM(video_set_ctrl); #endif #if defined(CONFIG_BOARD_ARDUINO_GIGA_R1) && defined(CONFIG_VIDEO) -FORCE_EXPORT_SYM(getVideoTouchEvent) +//FORCE_EXPORT_SYM(getVideoTouchEvent); +FORCE_EXPORT_SYM(registerGigaTouchCallback); + #endif #if defined(CONFIG_SHARED_MULTI_HEAP) diff --git a/variants/arduino_giga_r1_stm32h747xx_m7/variant.cpp b/variants/arduino_giga_r1_stm32h747xx_m7/variant.cpp index 786c9712..b62b4a8b 100644 --- a/variants/arduino_giga_r1_stm32h747xx_m7/variant.cpp +++ b/variants/arduino_giga_r1_stm32h747xx_m7/variant.cpp @@ -6,3 +6,10 @@ void _on_1200_bps() { *(__IO uint32_t *)tmp = (uint32_t)0xDF59; NVIC_SystemReset(); } + +extern "C" void registerGigaTouchCallback(void (*cb)(struct input_event *evt, void *user_data)); +void initVariant(void) { + // Make sure to set to NULL in case previous sketch or pvevious build of sketch + // set a callback, whoes pointer may not be valid + registerGigaTouchCallback(nullptr); +}