From 2be2aeb2a2bafe10fabc6373b1aadee7b03ed5be Mon Sep 17 00:00:00 2001 From: Vencislav Atanasov Date: Fri, 26 Jun 2026 20:16:48 +0200 Subject: [PATCH] 3DS: add circle pad support for scrolling and navigation (Olivier Senn) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Map the circle pad to directional buttons, giving an alternative input method to the D-pad. Uses a deadzone of 64 to prevent unintended movement from minor stick drift. 💘 Generated with Crush Assisted-by: Crush:deepseek-v4-pro Edited by Vencislav Atanasov: Fixed KEY_SELECT handling. Change-Id: I34bf7127688423fca209e199d9535e032ad8b753 --- docs/CREDITS | 1 + firmware/target/hosted/ctru/button-ctru.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/CREDITS b/docs/CREDITS index 9b64d7dfbc..edb859249c 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -766,6 +766,7 @@ Lê Khánh Bình Michael McAllister Hemant Kumar Jerry Shen +Olivier Senn The libmad team The wavpack team diff --git a/firmware/target/hosted/ctru/button-ctru.c b/firmware/target/hosted/ctru/button-ctru.c index a03c0d0eb5..aaf07f2a83 100644 --- a/firmware/target/hosted/ctru/button-ctru.c +++ b/firmware/target/hosted/ctru/button-ctru.c @@ -86,6 +86,8 @@ void update_sound_slider_level(void) } } +#define CPAD_DEADZONE 64 + int button_read_device(int* data) { int key = BUTTON_NONE; @@ -97,14 +99,26 @@ int button_read_device(int* data) hidScanInput(); u32 kDown = hidKeysDown(); - + if (kDown & KEY_SELECT) { touchscreen_set_mode(touchscreen_get_mode() == TOUCHSCREEN_POINT ? TOUCHSCREEN_BUTTON : TOUCHSCREEN_POINT); printf("Touchscreen mode: %s\n", touchscreen_get_mode() == TOUCHSCREEN_POINT ? "TOUCHSCREEN_POINT" : "TOUCHSCREEN_BUTTON"); } - + u32 kHeld = hidKeysHeld(); + /* Circle pad → directional buttons (alternative to D-pad) */ + circlePosition cpad; + hidCircleRead(&cpad); + if (cpad.dx > CPAD_DEADZONE) + kHeld |= KEY_DRIGHT; + else if (cpad.dx < -CPAD_DEADZONE) + kHeld |= KEY_DLEFT; + if (cpad.dy > CPAD_DEADZONE) + kHeld |= KEY_DUP; + else if (cpad.dy < -CPAD_DEADZONE) + kHeld |= KEY_DDOWN; + /* rockbox will handle button repeats */ kDown |= kHeld;