From 7abe8c3070d9d7b788fadca9a964e7c87184ba73 Mon Sep 17 00:00:00 2001 From: Kurt Eckhardt Date: Thu, 5 Jun 2025 08:05:07 -0700 Subject: [PATCH] GIGA touch - callback to simple forward instead of processing in the fixups.c Add a callback function for the touch device within the fixups for the GIGA. Needed to add function to set the callback function. Also add clear out the callback in the initVariant such that if new program is launched it does not use old address, and instead uses the new address or not at all if the new sketch does not use touch. --- loader/fixups.c | 76 +++++++++++++++++++ loader/llext_exports.c | 5 ++ .../variant.cpp | 7 ++ 3 files changed, 88 insertions(+) diff --git a/loader/fixups.c b/loader/fixups.c index cf5e60cd..2e79c461 100644 --- a/loader/fixups.c +++ b/loader/fixups.c @@ -45,10 +45,86 @@ 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 +#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 { + size_t x; + size_t y; + bool 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); + } +} +#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)); if (!device_is_ready(cam_ext_clk_dev)) { diff --git a/loader/llext_exports.c b/loader/llext_exports.c index f1370a92..ee3a857c 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -133,6 +133,11 @@ FORCE_EXPORT_SYM(video_buffer_aligned_alloc); 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); +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); +}