From c6ce0a2d151d88da3d3487fab46e4946f18fa240 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 | 50 +++++++++++++++++++++++++++++++++++++++++- loader/llext_exports.c | 3 +++ 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/loader/fixups.c b/loader/fixups.c index 5832319c..dcfe8b37 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)) { @@ -99,7 +147,7 @@ int smh_init(void) { return 0; } -SYS_INIT(smh_init, POST_KERNEL, CONFIG_CLOCK_CONTROL_PWM_INIT_PRIORITY); +SYS_INIT(smh_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); #endif #if defined(CONFIG_BOARD_ARDUINO_PORTENTA_C33) && defined(CONFIG_LLEXT) diff --git a/loader/llext_exports.c b/loader/llext_exports.c index 52d214c1..8da13bde 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -130,6 +130,9 @@ FORCE_EXPORT_SYM(video_buffer_aligned_alloc); FORCE_EXPORT_SYM(video_buffer_alloc); FORCE_EXPORT_SYM(video_buffer_release); #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 13960d67efa2d5b5d89c03566c99eef4849f5924 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 dcfe8b37..92d1a6c2 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 8da13bde..31aa12a1 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -131,7 +131,9 @@ FORCE_EXPORT_SYM(video_buffer_alloc); FORCE_EXPORT_SYM(video_buffer_release); #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); +}