From a4de1195cdc49532e67d591306743c1ab8f4f09c Mon Sep 17 00:00:00 2001 From: Mauricio Garrido Date: Mon, 29 Sep 2025 16:06:04 -0600 Subject: [PATCH 1/2] 3ds: 3ds port sources. First set of two This commit adds changes to the original rockbox sources. Note: the port files, functions, folders, etc., will be referred to as 'ctru' to avoid using the Nintendo name elsewhere. Change-Id: I0e2d3d4d2a75bd45ea67dc3452eb8d5487cf1f5a --- apps/SOURCES | 2 + apps/tree.c | 4 + apps/tree.h | 5 ++ firmware/SOURCES | 34 ++++++- firmware/export/audiohw.h | 2 +- firmware/export/config.h | 12 ++- firmware/export/debug.h | 4 + firmware/export/hosted_codec.h | 5 +- firmware/export/rbpaths.h | 4 +- firmware/include/_ansi.h | 6 +- firmware/include/dir.h | 4 +- firmware/include/file.h | 4 +- firmware/include/rbendian.h | 2 +- firmware/kernel/include/thread.h | 2 +- firmware/kernel/mutex.c | 4 + firmware/kernel/thread-common.c | 2 +- firmware/kernel/thread-internal.h | 2 +- firmware/target/hosted/filesystem-app.h | 4 + firmware/target/hosted/rtc.c | 4 +- lib/rbcodec/codecs/codec_crt0.c | 6 ++ lib/rbcodec/codecs/codecs.make | 4 + tools/buildzip.pl | 17 ++++ tools/configure | 112 ++++++++++++++++++++++++ tools/functions.make | 2 + tools/root.make | 3 + 25 files changed, 227 insertions(+), 23 deletions(-) diff --git a/apps/SOURCES b/apps/SOURCES index 6fc8a276c8..0bf42a6999 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -305,4 +305,6 @@ keymaps/keymap-echor1.c keymaps/keymap-surfansf28.c #elif CONFIG_KEYPAD == RG_NANO_PAD keymaps/keymap-rgnano.c +#elif CONFIG_KEYPAD == CTRU_PAD +keymaps/keymap-ctru.c #endif diff --git a/apps/tree.c b/apps/tree.c index 86b841988c..5df204bbf2 100644 --- a/apps/tree.c +++ b/apps/tree.c @@ -565,7 +565,11 @@ void resume_directory(const char *dir) /* Returns the current working directory and also writes cwd to buf if non-NULL. In case of error, returns NULL. */ +#ifdef CTRU +char *__wrap_getcwd(char *buf, getcwd_size_t size) +#else char *getcwd(char *buf, getcwd_size_t size) +#endif { if (!buf) return tc.currdir; diff --git a/apps/tree.h b/apps/tree.h index 70d013e945..4c7c2e8fe7 100644 --- a/apps/tree.h +++ b/apps/tree.h @@ -128,7 +128,12 @@ void tree_unlock_cache(struct tree_context *t); #else #define getcwd_size_t size_t #endif +#ifdef CTRU +/* devkitarm already defines getcwd */ +char *__wrap_getcwd(char *buf, getcwd_size_t size); +#else char *getcwd(char *buf, getcwd_size_t size); +#endif void reload_directory(void); bool check_rockboxdir(void); struct tree_context* tree_get_context(void); diff --git a/firmware/SOURCES b/firmware/SOURCES index 19d7fa1bba..c8d8212927 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -25,7 +25,7 @@ target/hosted/rtc.c #if (CONFIG_PLATFORM & PLATFORM_ANDROID) == 0 && \ !defined(DX50) && !defined(DX90) && \ - (defined(DEBUG) || defined(SIMULATOR)) /* sim should define DEBUG instead */ + (defined(DEBUG) || defined(SIMULATOR) || defined(CTRU)) /* sim should define DEBUG instead */ target/hosted/debug-hosted.c #endif @@ -94,12 +94,14 @@ target/hosted/sdl/app/button-application.c #ifdef WIN32 target/hosted/filesystem-win32.c #else /* !WIN32 */ +#ifndef CTRU target/hosted/filesystem-unix.c +#endif /* CTRU */ #endif /* WIN32 */ #endif /* APPLICATION */ #endif /* HAVE_SDL */ -#ifdef APPLICATION +#if defined(APPLICATION) && !defined(CTRU) target/hosted/filesystem-app.c #endif /* APPLICATION */ @@ -581,6 +583,8 @@ target/hosted/maemo/pcm-gstreamer.c target/hosted/sdl/pcm-sdl.c #endif /* (CONFIG_PLATFORM & PLATFORM_MAEMO) */ +#elif defined(CTRU) +drivers/audio/ctru.c #endif #endif /* (CONFIG_PLATFORM & PLATFORM_NATIVE) */ @@ -2071,6 +2075,28 @@ target/hosted/ibasso/dx90/button-dx90.c #endif #endif +#if (CONFIG_PLATFORM & PLATFORM_CTRU) +asm/arm/lcd-as-memframe.S +target/hosted/ctru/backlight-ctru.c +target/hosted/ctru/button-ctru.c +target/hosted/ctru/kernel-ctru.c +target/hosted/ctru/thread-ctru.c +target/hosted/ctru/lcd-bitmap.c +target/hosted/ctru/luminance-ctru.c +target/hosted/ctru/system-ctru.c +target/hosted/ctru/filesystem-ctru.c +target/hosted/ctru/lc-ctru.c +target/hosted/ctru/lc-program-resolver.c +target/hosted/ctru/powermgmt-ctru.c +target/hosted/ctru/timer-ctru.c +target/hosted/ctru/pcm-ctru.c +target/hosted/ctru/lib/sys_file.c +target/hosted/ctru/lib/sys_dir.c +target/hosted/ctru/lib/sys_thread.c +target/hosted/ctru/lib/sys_timer.c +target/hosted/ctru/lib/bfile/bfile.c +#endif + #else /* defined(SIMULATOR) */ #ifdef WIN32 @@ -2119,9 +2145,9 @@ kernel/queue.c #ifdef HAVE_SEMAPHORE_OBJECTS kernel/semaphore.c #endif -#if defined(HAVE_SDL_THREADS) +#ifdef HAVE_SDL_THREADS target/hosted/sdl/thread-sdl.c -#else +#elif !defined(CTRU) kernel/thread.c #endif kernel/thread-common.c diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index 7fc6d39468..98f0857daf 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -224,7 +224,7 @@ struct sound_settings_info #elif defined(HAVE_ES9218) #include "es9218.h" #elif ((CONFIG_PLATFORM & (PLATFORM_ANDROID | PLATFORM_MAEMO \ - | PLATFORM_PANDORA | PLATFORM_SDL )) | defined(RG_NANO)) + | PLATFORM_PANDORA | PLATFORM_SDL | PLATFORM_CTRU)) | defined(RG_NANO)) #include "hosted_codec.h" #elif defined(DX50) #include "codec-dx50.h" diff --git a/firmware/export/config.h b/firmware/export/config.h index fe66f06644..9ddc563d9b 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -85,6 +85,7 @@ #define RK27XX 2700 #define X1000 1000 #define STM32H743 32743 +#define N10480H 10480 /* platforms * bit fields to allow PLATFORM_HOSTED to be OR'ed e.g. with a @@ -98,6 +99,7 @@ #define PLATFORM_MAEMO5 (1<<5) #define PLATFORM_MAEMO (PLATFORM_MAEMO4|PLATFORM_MAEMO5) #define PLATFORM_PANDORA (1<<6) +#define PLATFORM_CTRU (1<<7) /* CONFIG_KEYPAD */ #define IRIVER_H100_PAD 4 @@ -167,6 +169,7 @@ #define ECHO_R1_PAD 75 #define SURFANS_F28_PAD 76 #define RG_NANO_PAD 77 +#define CTRU_PAD 78 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -623,6 +626,8 @@ Lyre prototype 1 */ #include "config/surfansf28.h" #elif defined(RG_NANO) #include "config/rgnano.h" +#elif defined(CTRU) +#include "config/ctru.h" #else #error "unknown hardware platform!" #endif @@ -650,7 +655,7 @@ Lyre prototype 1 */ # define CONFIG_BUFLIB_BACKEND BUFLIB_BACKEND_MEMPOOL #endif -#ifdef APPLICATION +#if defined(APPLICATION) #ifndef CONFIG_CPU #define CONFIG_CPU 0 #endif @@ -1033,7 +1038,8 @@ Lyre prototype 1 */ #if defined(ASSEMBLER_THREADS) \ || defined(HAVE_WIN32_FIBER_THREADS) \ - || defined(HAVE_SIGALTSTACK_THREADS) + || defined(HAVE_SIGALTSTACK_THREADS) \ + || defined(CTRU) #define HAVE_PRIORITY_SCHEDULING #endif @@ -1104,7 +1110,7 @@ Lyre prototype 1 */ * Older versions of GCC emit assembly in divided syntax with no option * to enable unified syntax. */ -#if (__GNUC__ < 8) && defined(CPU_ARM_CLASSIC) +#if (__GNUC__ < 8) && defined(CPU_ARM_CLASSIC) || defined(CTRU) #define BEGIN_ARM_ASM_SYNTAX_UNIFIED ".syntax unified\n" #define END_ARM_ASM_SYNTAX_UNIFIED ".syntax divided\n" #else diff --git a/firmware/export/debug.h b/firmware/export/debug.h index 3a4a774f42..623b9e4827 100644 --- a/firmware/export/debug.h +++ b/firmware/export/debug.h @@ -35,6 +35,10 @@ extern void ldebugf(const char* file, int line, const char *fmt, ...) || (defined(APPLICATION) && defined(DEBUG)) #define DEBUGF debugf #define LDEBUGF(...) ldebugf(__FILE__, __LINE__, __VA_ARGS__) +#elif (CONFIG_PLATFORM & PLATFORM_CTRU) +/* let's use second display for debug output */ +#define DEBUGF debugf +#define LDEBUGF(...) ldebugf(__FILE__, __LINE__, __VA_ARGS__) #elif defined(DEBUG) /* DEBUG on native targets */ #ifdef HAVE_GDB_API diff --git a/firmware/export/hosted_codec.h b/firmware/export/hosted_codec.h index 5391ca8ee9..1a689c534b 100644 --- a/firmware/export/hosted_codec.h +++ b/firmware/export/hosted_codec.h @@ -21,8 +21,9 @@ #ifndef HOSTED_CODEC_H #define HOSTED_CODEC_H -#if defined(HAVE_SDL_AUDIO) \ - && !(CONFIG_PLATFORM & PLATFORM_MAEMO5) +#if (defined(HAVE_SDL_AUDIO) \ + && !(CONFIG_PLATFORM & PLATFORM_MAEMO5)) \ + || (CONFIG_PLATFORM & PLATFORM_CTRU) AUDIOHW_SETTING(VOLUME, "dB", 0, 1, -80, 0, 0) #else #define AUDIOHW_CAPS (MONO_VOL_CAP) diff --git a/firmware/export/rbpaths.h b/firmware/export/rbpaths.h index 72715906b9..322f47bbe0 100644 --- a/firmware/export/rbpaths.h +++ b/firmware/export/rbpaths.h @@ -41,7 +41,7 @@ /* NOTE: target-specific hosted HOME_DIR resides in filesystem-app.c */ #if !defined(APPLICATION) || defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || \ - defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX) + defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX) || defined(CTRU) #define HOME_DIR "/" @@ -87,7 +87,7 @@ #if defined(APPLICATION) && \ !(defined(SAMSUNG_YPR0) || defined(SAMSUNG_YPR1) || \ - defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX)) + defined(DX50) || defined(DX90) || defined(SONY_NWZ_LINUX) || defined(HIBY_LINUX) || defined(FIIO_M3K_LINUX) || defined(CTRU)) #define PLUGIN_DATA_DIR ROCKBOX_DIR "/rocks.data" #define PLUGIN_GAMES_DATA_DIR PLUGIN_DATA_DIR diff --git a/firmware/include/_ansi.h b/firmware/include/_ansi.h index 5f0ce211ed..d5b19172e7 100644 --- a/firmware/include/_ansi.h +++ b/firmware/include/_ansi.h @@ -9,8 +9,8 @@ "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header files aren't affected). */ -#ifndef _ANSIDECL_H_ -#define _ANSIDECL_H_ +#ifndef __ANSIDECL_H__ +#define __ANSIDECL_H__ /* First try to figure out whether we really are in an ANSI C environment. */ /* FIXME: This probably needs some work. Perhaps sys/config.h can be @@ -64,4 +64,4 @@ #endif #endif -#endif /* _ANSIDECL_H_ */ +#endif /* __ANSIDECL_H__ */ diff --git a/firmware/include/dir.h b/firmware/include/dir.h index 6336cee81d..516b407bf1 100644 --- a/firmware/include/dir.h +++ b/firmware/include/dir.h @@ -28,7 +28,9 @@ #include "fs_attr.h" #include "fs_defines.h" -#if defined (APPLICATION) || defined(CHECKWPS) +#if defined(CTRU) && !defined(SIMULATOR) +#include "filesystem-ctru.h" +#elif defined (APPLICATION) || defined(CHECKWPS) #include "filesystem-app.h" #elif defined(SIMULATOR) || defined(DBTOOL) #include "../../uisimulator/common/filesystem-sim.h" diff --git a/firmware/include/file.h b/firmware/include/file.h index 20b2224db6..324a657848 100644 --- a/firmware/include/file.h +++ b/firmware/include/file.h @@ -40,7 +40,9 @@ enum relate_result RELATE_PREFIX, /* the path2 contains path1 as a prefix */ }; -#if defined(APPLICATION) || defined(CHECKWPS) +#if defined(CTRU) && !defined(SIMULATOR) +#include "filesystem-ctru.h" +#elif defined(APPLICATION) || defined(CHECKWPS) #include "filesystem-app.h" #elif defined(SIMULATOR) || defined(DBTOOL) #include "../../uisimulator/common/filesystem-sim.h" diff --git a/firmware/include/rbendian.h b/firmware/include/rbendian.h index 16888335fe..690c9a115a 100644 --- a/firmware/include/rbendian.h +++ b/firmware/include/rbendian.h @@ -28,7 +28,7 @@ #endif #ifndef __MINGW32__ -#ifdef __APPLE__ +#if defined(__APPLE__) || defined(CTRU) #include #else #include diff --git a/firmware/kernel/include/thread.h b/firmware/kernel/include/thread.h index 5cf7c71b78..a80080b979 100644 --- a/firmware/kernel/include/thread.h +++ b/firmware/kernel/include/thread.h @@ -89,7 +89,7 @@ struct thread_entry; * * simulator (possibly) doesn't simulate stack usage anyway but well ... */ -#if defined(HAVE_SDL_THREADS) || defined(__PCTOOL__) +#if defined(HAVE_SDL_THREADS) || defined(__PCTOOL__) || defined(CTRU) #define DEFAULT_STACK_SIZE 0x100 /* tiny, ignored anyway */ #else #include "asm/thread.h" diff --git a/firmware/kernel/mutex.c b/firmware/kernel/mutex.c index b1ae3e9e54..eb09b9d68c 100644 --- a/firmware/kernel/mutex.c +++ b/firmware/kernel/mutex.c @@ -75,11 +75,15 @@ void mutex_lock(struct mutex *m) /* Release ownership of a mutex object - only owning thread must call this */ void mutex_unlock(struct mutex *m) { +#ifndef CTRU + /* FIXME: synchronization primitives does not behave + correctly between different cores */ /* unlocker not being the owner is an unlocking violation */ KERNEL_ASSERT(m->blocker.thread == __running_self_entry(), "mutex_unlock->wrong thread (%s != %s)\n", m->blocker.thread->name, __running_self_entry()->name); +#endif if(m->recursion > 0) { diff --git a/firmware/kernel/thread-common.c b/firmware/kernel/thread-common.c index 76424e9e9c..074af1b7e1 100644 --- a/firmware/kernel/thread-common.c +++ b/firmware/kernel/thread-common.c @@ -304,7 +304,7 @@ int thread_get_debug_info(unsigned int thread_id, #ifdef HAVE_SCHEDULER_BOOSTCTRL cpu_boost = thread->cpu_boost; #endif -#ifndef HAVE_SDL_THREADS +#if !defined(HAVE_SDL_THREADS) && !defined(CTRU) infop->stack_usage = stack_usage(thread->stack, thread->stack_size); size_t stack_used_current = diff --git a/firmware/kernel/thread-internal.h b/firmware/kernel/thread-internal.h index 2d2eb161bd..f7e3d82117 100644 --- a/firmware/kernel/thread-internal.h +++ b/firmware/kernel/thread-internal.h @@ -32,7 +32,7 @@ * * simulator (possibly) doesn't simulate stack usage anyway but well ... */ -#if defined(HAVE_SDL_THREADS) || defined(__PCTOOL__) +#if defined(HAVE_SDL_THREADS) || defined(__PCTOOL__) || defined(CTRU) struct regs { void *t; /* OS thread */ diff --git a/firmware/target/hosted/filesystem-app.h b/firmware/target/hosted/filesystem-app.h index 2d907b98fa..6233524bb4 100644 --- a/firmware/target/hosted/filesystem-app.h +++ b/firmware/target/hosted/filesystem-app.h @@ -58,7 +58,11 @@ const char * handle_special_dirs(const char *dir, unsigned flags, #ifdef WIN32 #include "filesystem-win32.h" #else /* !WIN32 */ +#if defined(CTRU) && !defined(SIMULATOR) +#include "filesystem-ctru.h" +#else #include "filesystem-unix.h" +#endif #endif /* WIN32 */ #include "filesystem-hosted.h" diff --git a/firmware/target/hosted/rtc.c b/firmware/target/hosted/rtc.c index b41862f977..82266d8e40 100644 --- a/firmware/target/hosted/rtc.c +++ b/firmware/target/hosted/rtc.c @@ -24,7 +24,7 @@ #include #if !defined(WIN32) #include -#if !defined(__APPLE__) +#if !defined(__APPLE__) && !defined(CTRU) #include #endif #include @@ -49,7 +49,7 @@ int rtc_read_datetime(struct tm *tm) int rtc_write_datetime(const struct tm *tm) { -#if !defined(WIN32) && !defined(__APPLE__) +#if !defined(WIN32) && !defined(__APPLE__) && !defined(CTRU) struct timeval tv; struct tm *tm_time; diff --git a/lib/rbcodec/codecs/codec_crt0.c b/lib/rbcodec/codecs/codec_crt0.c index 0f9749ddb8..4a4dd8ee82 100644 --- a/lib/rbcodec/codecs/codec_crt0.c +++ b/lib/rbcodec/codecs/codec_crt0.c @@ -31,6 +31,12 @@ extern unsigned char plugin_end_addr[]; * avoid warning with certain compilers */ int _start(void) {return 0;} +#ifdef CTRU +/* dummy undefined symbols */ +void __aeabi_unwind_cpp_pr0(void) {} +struct _reent * _EXFUN(__getreent, (void)) {} +#endif + enum codec_status codec_start(enum codec_entry_call_reason reason) { #if (CONFIG_PLATFORM & PLATFORM_NATIVE) diff --git a/lib/rbcodec/codecs/codecs.make b/lib/rbcodec/codecs/codecs.make index 598bee091c..6d790f5d9a 100644 --- a/lib/rbcodec/codecs/codecs.make +++ b/lib/rbcodec/codecs/codecs.make @@ -137,6 +137,10 @@ ifeq ($(ARCH),arch_arm) $(SGCLIB) : CODECFLAGS += -O1 $(VGMLIB) : CODECFLAGS += -O1 $(WAVPACKLIB) : CODECFLAGS += -O3 + ifneq (,$(findstring ctru, $(MODELNAME))) + # segfault with -O1 + $(SPCLIB) : CODECFLAGS += -O2 + endif else ifeq ($(ARCH),arch_m68k) $(CODECLIB) : CODECFLAGS += -O2 $(A52LIB) : CODECFLAGS += -O2 diff --git a/tools/buildzip.pl b/tools/buildzip.pl index 50611e6183..c72f70072a 100755 --- a/tools/buildzip.pl +++ b/tools/buildzip.pl @@ -424,6 +424,11 @@ sub buildzip { glob_mkdir("$temp_dir/libertas"); glob_copy("$ROOT/firmware/drivers/libertas/firmware/*", "$temp_dir/libertas/"); } + # add hbmenu shortcut's icon and 3dsx executable + if ($modelname =~ /ctru/) { + glob_copy("icon.icn", "$temp_dir/"); + glob_copy("rockbox.3dsx", "$temp_dir/"); + } glob_mkdir("$temp_dir/langs"); glob_mkdir("$temp_dir/rocks"); @@ -740,6 +745,18 @@ sub runone { move(".rockbox", $rbdir); print "mv .rockbox $rbdir\n" if $verbose; } + + # add hbmenu shortcut and cia file to zip file + if ($modelname =~ /ctru/) { + move("rockbox.cia", "3ds"); + copy("$ROOT/packaging/ctru/rockbox.xml", "3ds"); + + system("$ziptool -u $output 3ds/rockbox.xml $target >/dev/null"); + print "$ziptool $output $ROOT/packaging/ctru/rockbox.xml $target >/dev/null\n" if $verbose; + system("$ziptool -u $output 3ds/rockbox.cia $target >/dev/null"); + print "$ziptool $output rockbox.cia $target >/dev/null\n" if $verbose; + } + system("$ziptool $output $rbdir $target >/dev/null"); print "$ziptool $output $rbdir $target >/dev/null\n" if $verbose; rmtree("$rbdir"); diff --git a/tools/configure b/tools/configure index 2fbb27a334..24d509ce8e 100755 --- a/tools/configure +++ b/tools/configure @@ -1009,6 +1009,90 @@ rgnanocc () { rbdir="/FunKey/.rockbox" } +devkitarmcc () { + if [ -z "$DEVKITPRO" ]; then + echo "ERROR: You need a devkitPro toolchain and libraries installed" + echo "and have the DEVKITPRO environment variable point to the root" + echo "of the devkitPro installation." + echo "More info at https://devkitpro.org/wiki/Getting_Started" + exit + fi + + if [ -z "$DEVKITARM" ]; then + echo "ERROR: You need devkitARM toolchain installed and have the DEVKITARM" + echo "environment variable point to the root directory of the sdk." + exit + fi + + # check for additional dependencies + if [ ! -e "$DEVKITPRO/portlibs/3ds/lib/libCTRL.a" ]; then + echo "ERROR: You need to install libCTRL utility library." + echo "https://github.com/kynex7510/CTRL" + exit + fi + + if [ ! -e "$DEVKITPRO/portlibs/3ds/lib/libdl.a" ]; then + echo "ERROR: You need to install libdl implementation for 3ds (CTRDL)" + echo "https://github.com/kynex7510/CTRDL" + exit + fi + + if [ ! -n "`findtool makerom`" ]; then + echo "ERROR: makerom not found, please install and run configure again." + echo "https://github.com/3DSGuy/Project_CTR" + exit + fi + + if [ ! -n "`findtool bannertool`" ]; then + echo "ERROR: bannertool not found, please install and run configure again." + echo "https://github.com/carstene1ns/3ds-bannertool" + exit + fi + + arch="arm" + arch_version="6" + arch_profile="classic" + + CC=$DEVKITARM/bin/arm-none-eabi-gcc + CPP=$DEVKITARM/bin/arm-none-eabi-cpp + LD=$DEVKITARM/bin/arm-none-eabi-ld + AR=$DEVKITARM/bin/arm-none-eabi-gcc-ar + AS=$DEVKITARM/bin/arm-none-eabi-as + OC=$DEVKITARM/bin/arm-none-eabi-objcopy + WINDRES=windres + DLLTOOL=dlltool + DLLWRAP=dllwrap + RANLIB=$DEVKITARM/bin/arm-none-eabi-gcc-ranlib + + if [ "yes" = "$use_debug" ]; then + GCCOPTS=`echo $GCCOPTS | sed -e s/\ -Os/\ -Og/` + fi + + GCCOPTS="$GCCOPTS -fno-builtin -g -Wno-unused-result" + GCCOPTS="$GCCOPTS -I$DEVKITPRO/libctru/include -I$DEVKITPRO/portlibs/3ds/include" + GCCOPTS="$GCCOPTS -mword-relocations -ffunction-sections -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft" + GCCOPTS="$GCCOPTS -D_GNU_SOURCE=1 -D_REENTRANT -masm-syntax-unified" + + SHARED_LDFLAGS="-shared" + SHARED_CFLAGS="-fPIC -fvisibility=hidden" + + LDOPTS="-specs=3dsx.specs -L$DEVKITPRO/libctru/lib -L$DEVKITPRO/portlibs/3ds/lib -ldl -lCTRL -lctru -lm" + GLOBAL_LDOPTS="$GLOBAL_LDOPTS -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft" + + # let's allow building shared libraries even if unresolved symbols are found, + # CTRDL (libdl) implementation will use a custom resolver for resolve symbols at runtime. + # TODO: use ResGen command to automatically detect unresolved symbols. + GLOBAL_LDOPTS=`echo $GLOBAL_LDOPTS | sed -e s/\-Wl,-z,defs//` + + # devkitarm already defines getcwd + GLOBAL_LDOPTS="$GLOBAL_LDOPTS -Wl,-wrap,getcwd" + + ARG_PREFIX="romfs" + + extradefines="-D__3DS__" + rbdir="/3ds/.rockbox" +} + do_bootloader() { appsdir='$(ROOTDIR)/bootloader' @@ -1779,6 +1863,9 @@ cat < Date: Wed, 8 Oct 2025 19:30:37 -0600 Subject: [PATCH 2/2] 3ds: 3ds port sources. Second set of two. This commit adds new files written exclusively for the 3ds port. Additional comments: 1. Plugins works, but will be enabled in future commits. 2. The port has only been tested on the New 3DS. 3. Not all features of rockbox have been tested so there may be bugs or non-functional features. 4. There is a known issue where a random crash can occur when exiting the app. Change-Id: I122d0bea9aa604e04fca45ba8287cf79e6110769 --- apps/keymaps/keymap-ctru.c | 302 +++++++ firmware/drivers/audio/ctru.c | 92 +++ firmware/export/config/ctru.h | 102 +++ firmware/target/hosted/ctru/app/adc-target.h | 0 .../target/hosted/ctru/app/backlight-target.h | 32 + .../target/hosted/ctru/app/button-target.h | 54 ++ firmware/target/hosted/ctru/backlight-ctru.c | 114 +++ firmware/target/hosted/ctru/button-ctru.c | 184 +++++ firmware/target/hosted/ctru/button-ctru.h | 34 + firmware/target/hosted/ctru/buttonmap.h | 41 + firmware/target/hosted/ctru/filesystem-ctru.c | 73 ++ firmware/target/hosted/ctru/filesystem-ctru.h | 116 +++ firmware/target/hosted/ctru/kernel-ctru.c | 166 ++++ firmware/target/hosted/ctru/lc-ctru.c | 68 ++ .../target/hosted/ctru/lc-program-resolver.c | 53 ++ firmware/target/hosted/ctru/lcd-bitmap.c | 245 ++++++ firmware/target/hosted/ctru/lcd-bitmap.h | 31 + firmware/target/hosted/ctru/lcd-target.h | 34 + .../hosted/ctru/lib/bfile/bfile-internal.h | 99 +++ firmware/target/hosted/ctru/lib/bfile/bfile.c | 471 +++++++++++ firmware/target/hosted/ctru/lib/bfile/bfile.h | 37 + firmware/target/hosted/ctru/lib/cmap.h | 209 +++++ firmware/target/hosted/ctru/lib/cslice.h | 63 ++ firmware/target/hosted/ctru/lib/cvector.h | 549 +++++++++++++ firmware/target/hosted/ctru/lib/sys_dir.c | 403 +++++++++ firmware/target/hosted/ctru/lib/sys_file.c | 777 ++++++++++++++++++ firmware/target/hosted/ctru/lib/sys_file.h | 129 +++ firmware/target/hosted/ctru/lib/sys_thread.c | 403 +++++++++ firmware/target/hosted/ctru/lib/sys_thread.h | 88 ++ firmware/target/hosted/ctru/lib/sys_timer.c | 402 +++++++++ firmware/target/hosted/ctru/lib/sys_timer.h | 42 + firmware/target/hosted/ctru/luminance-ctru.c | 133 +++ firmware/target/hosted/ctru/luminance-ctru.h | 40 + firmware/target/hosted/ctru/pcm-ctru.c | 359 ++++++++ firmware/target/hosted/ctru/powermgmt-ctru.c | 107 +++ firmware/target/hosted/ctru/system-ctru.c | 145 ++++ firmware/target/hosted/ctru/system-ctru.h | 70 ++ firmware/target/hosted/ctru/system-target.h | 4 + firmware/target/hosted/ctru/thread-ctru.c | 503 ++++++++++++ firmware/target/hosted/ctru/thread-ctru.h | 32 + firmware/target/hosted/ctru/timer-ctru.c | 61 ++ firmware/target/hosted/ctru/timer-ctru_sys.c | 61 ++ packaging/ctru/ctru.make | 101 +++ packaging/ctru/res/app.rsf | 286 +++++++ packaging/ctru/res/banner.cgfx | Bin 0 -> 480504 bytes packaging/ctru/res/banner.png | Bin 0 -> 17841 bytes packaging/ctru/res/banner.wav | Bin 0 -> 228624 bytes packaging/ctru/res/banner_.cgfx | Bin 0 -> 512056 bytes packaging/ctru/res/icon.png | Bin 0 -> 2099 bytes packaging/ctru/res/icon_yellow.png | Bin 0 -> 6166 bytes packaging/ctru/rockbox.xml | 7 + 51 files changed, 7322 insertions(+) create mode 100644 apps/keymaps/keymap-ctru.c create mode 100644 firmware/drivers/audio/ctru.c create mode 100644 firmware/export/config/ctru.h create mode 100644 firmware/target/hosted/ctru/app/adc-target.h create mode 100644 firmware/target/hosted/ctru/app/backlight-target.h create mode 100644 firmware/target/hosted/ctru/app/button-target.h create mode 100644 firmware/target/hosted/ctru/backlight-ctru.c create mode 100644 firmware/target/hosted/ctru/button-ctru.c create mode 100644 firmware/target/hosted/ctru/button-ctru.h create mode 100644 firmware/target/hosted/ctru/buttonmap.h create mode 100644 firmware/target/hosted/ctru/filesystem-ctru.c create mode 100644 firmware/target/hosted/ctru/filesystem-ctru.h create mode 100644 firmware/target/hosted/ctru/kernel-ctru.c create mode 100644 firmware/target/hosted/ctru/lc-ctru.c create mode 100644 firmware/target/hosted/ctru/lc-program-resolver.c create mode 100644 firmware/target/hosted/ctru/lcd-bitmap.c create mode 100644 firmware/target/hosted/ctru/lcd-bitmap.h create mode 100644 firmware/target/hosted/ctru/lcd-target.h create mode 100644 firmware/target/hosted/ctru/lib/bfile/bfile-internal.h create mode 100644 firmware/target/hosted/ctru/lib/bfile/bfile.c create mode 100644 firmware/target/hosted/ctru/lib/bfile/bfile.h create mode 100644 firmware/target/hosted/ctru/lib/cmap.h create mode 100644 firmware/target/hosted/ctru/lib/cslice.h create mode 100644 firmware/target/hosted/ctru/lib/cvector.h create mode 100644 firmware/target/hosted/ctru/lib/sys_dir.c create mode 100644 firmware/target/hosted/ctru/lib/sys_file.c create mode 100644 firmware/target/hosted/ctru/lib/sys_file.h create mode 100644 firmware/target/hosted/ctru/lib/sys_thread.c create mode 100644 firmware/target/hosted/ctru/lib/sys_thread.h create mode 100644 firmware/target/hosted/ctru/lib/sys_timer.c create mode 100644 firmware/target/hosted/ctru/lib/sys_timer.h create mode 100644 firmware/target/hosted/ctru/luminance-ctru.c create mode 100644 firmware/target/hosted/ctru/luminance-ctru.h create mode 100644 firmware/target/hosted/ctru/pcm-ctru.c create mode 100644 firmware/target/hosted/ctru/powermgmt-ctru.c create mode 100644 firmware/target/hosted/ctru/system-ctru.c create mode 100644 firmware/target/hosted/ctru/system-ctru.h create mode 100644 firmware/target/hosted/ctru/system-target.h create mode 100644 firmware/target/hosted/ctru/thread-ctru.c create mode 100644 firmware/target/hosted/ctru/thread-ctru.h create mode 100644 firmware/target/hosted/ctru/timer-ctru.c create mode 100644 firmware/target/hosted/ctru/timer-ctru_sys.c create mode 100644 packaging/ctru/ctru.make create mode 100644 packaging/ctru/res/app.rsf create mode 100644 packaging/ctru/res/banner.cgfx create mode 100644 packaging/ctru/res/banner.png create mode 100644 packaging/ctru/res/banner.wav create mode 100644 packaging/ctru/res/banner_.cgfx create mode 100644 packaging/ctru/res/icon.png create mode 100644 packaging/ctru/res/icon_yellow.png create mode 100644 packaging/ctru/rockbox.xml diff --git a/apps/keymaps/keymap-ctru.c b/apps/keymaps/keymap-ctru.c new file mode 100644 index 0000000000..0461d03192 --- /dev/null +++ b/apps/keymaps/keymap-ctru.c @@ -0,0 +1,302 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: keymap-ctru.c 28704 2025-07-09 11:28:53Z gama $ + * + * Copyright (C) 2025 Mauricio Garrido + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +/* Button Code Definitions for Civic Type R (ctru) target */ + +#include +#include +#include + +#include "config.h" +#include "action.h" +#include "button.h" +#include "settings.h" + +/* + * The format of the list is as follows + * { Action Code, Button code, Prereq button code } + * if there's no need to check the previous button's value, use BUTTON_NONE + * Insert LAST_ITEM_IN_LIST at the end of each mapping + */ + +static const struct button_mapping button_context_standard[] = { + { ACTION_STD_PREV, BUTTON_UP, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_STD_CANCEL, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_BACK }, + + { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_STD_OK, BUTTON_RIGHT, BUTTON_NONE }, + + { ACTION_STD_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_STD_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_STD_CONTEXT, BUTTON_MENU|BUTTON_REL, BUTTON_NONE }, + + { ACTION_STD_KEYLOCK, BUTTON_USER|BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_standard */ + + +static const struct button_mapping button_context_mainmenu[] = { + { ACTION_TREE_WPS, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_TREE), +}; /* button_context_mainmenu */ + +static const struct button_mapping button_context_wps[] = { + { ACTION_WPS_PLAY, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_WPS_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_WPS_BROWSE, BUTTON_BACK|BUTTON_REL, BUTTON_BACK }, + { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + + + { ACTION_WPS_HOTKEY, BUTTON_USER|BUTTON_REL, BUTTON_USER }, + { ACTION_WPS_PITCHSCREEN, BUTTON_USER|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_STD_KEYLOCK, BUTTON_USER|BUTTON_POWER, BUTTON_NONE }, + + + { ACTION_WPS_CONTEXT, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT }, + { ACTION_WPS_QUICKSCREEN, BUTTON_MENU|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_WPS_SKIPPREV, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT }, + { ACTION_WPS_SEEKBACK, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_LEFT|BUTTON_REL, BUTTON_LEFT|BUTTON_REPEAT }, + + { ACTION_WPS_SKIPNEXT, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT }, + { ACTION_WPS_SEEKFWD, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_STOPSEEK, BUTTON_RIGHT|BUTTON_REL, BUTTON_RIGHT|BUTTON_REPEAT }, + + { ACTION_WPS_VOLUP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLUP, BUTTON_UP, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_WPS_VOLDOWN, BUTTON_DOWN, BUTTON_NONE }, + + LAST_ITEM_IN_LIST +}; /* button_context_wps */ + +static const struct button_mapping button_context_list[] = { + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_list */ + +static const struct button_mapping button_context_tree[] = { + { ACTION_TREE_WPS, BUTTON_USER|BUTTON_REPEAT, BUTTON_USER }, + { ACTION_TREE_STOP, BUTTON_POWER|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_TREE_HOTKEY, BUTTON_USER|BUTTON_REL, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST) +}; /* button_context_tree */ + +static const struct button_mapping button_context_settings[] = { + { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_TREE) +}; /* button_context_settings */ + +static const struct button_mapping button_context_settings_right_is_inc[] = { + { ACTION_SETTINGS_INC, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_settings_right_is_inc */ + +static const struct button_mapping button_context_yesno[] = { + { ACTION_YESNO_ACCEPT, BUTTON_SELECT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_settings_yesno */ + +static const struct button_mapping button_context_colorchooser[] = { //check + { ACTION_STD_OK, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT }, + { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), +}; /* button_context_colorchooser */ + +static const struct button_mapping button_context_eq[] = { + { ACTION_STD_CANCEL, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_SETTINGS_INC, BUTTON_RIGHT , BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_LEFT , BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_LEFT|BUTTON_REPEAT , BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS), +}; /* button_context_eq */ + +/** Bookmark Screen **/ +static const struct button_mapping button_context_bmark[] = { + { ACTION_BMS_DELETE, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST), +}; /* button_context_bmark */ + +static const struct button_mapping button_context_time[] = { + { ACTION_SETTINGS_INC, BUTTON_UP, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD), +}; /* button_context_time */ + +static const struct button_mapping button_context_quickscreen[] = { + { ACTION_QS_TOP, BUTTON_UP, BUTTON_NONE }, + { ACTION_QS_TOP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_QS_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_QS_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_QS_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_MENU, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_quickscreen */ + +static const struct button_mapping button_context_pitchscreen[] = { + { ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE }, + { ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, + + { ACTION_PS_RESET, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_PS_TOGGLE_MODE, BUTTON_USER, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_MENU|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_BACK|BUTTON_REL, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_pitchcreen */ + +static const struct button_mapping button_context_keyboard[] = { + { ACTION_KBD_UP, BUTTON_UP, BUTTON_NONE }, + { ACTION_KBD_UP, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_DOWN, BUTTON_NONE }, + { ACTION_KBD_DOWN, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_KBD_LEFT, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_KBD_RIGHT, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, + + { ACTION_KBD_SELECT, BUTTON_SELECT, BUTTON_NONE }, + { ACTION_KBD_ABORT, BUTTON_BACK|BUTTON_REL, BUTTON_BACK }, + { ACTION_KBD_DONE, BUTTON_MENU|BUTTON_REL, BUTTON_MENU }, + { ACTION_KBD_BACKSPACE, BUTTON_USER, BUTTON_NONE }, + { ACTION_KBD_PAGE_FLIP, BUTTON_POWER, BUTTON_NONE }, + + LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) +}; /* button_context_keyboard */ + +static const struct button_mapping button_context_radio[] = { + { ACTION_FM_MENU, BUTTON_SELECT | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_FM_PRESET, BUTTON_MENU | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_FM_STOP, BUTTON_POWER | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_FM_MODE, BUTTON_MENU | BUTTON_REL, BUTTON_MENU }, + { ACTION_FM_EXIT, BUTTON_BACK | BUTTON_REL, BUTTON_BACK }, + { ACTION_FM_PLAY, BUTTON_SELECT | BUTTON_REL, BUTTON_SELECT }, + { ACTION_FM_NEXT_PRESET, BUTTON_USER | BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_FM_PREV_PRESET, BUTTON_USER | BUTTON_LEFT, BUTTON_NONE }, + + /* Volume */ + { ACTION_SETTINGS_INC, BUTTON_UP | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_INCREPEAT, BUTTON_UP, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_DOWN | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_SETTINGS_DECREPEAT, BUTTON_DOWN, BUTTON_NONE }, + /* Tuning */ + { ACTION_STD_PREV, BUTTON_LEFT, BUTTON_NONE }, + { ACTION_STD_PREVREPEAT, BUTTON_LEFT | BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_RIGHT, BUTTON_NONE }, + { ACTION_STD_NEXTREPEAT, BUTTON_RIGHT | BUTTON_REPEAT, BUTTON_NONE }, +}; /* button_context_radio */ + +const struct button_mapping* target_get_context_mapping(int context) +{ + switch (context & ~CONTEXT_LOCKED) + { + case CONTEXT_STD: + return button_context_standard; + case CONTEXT_WPS: + return button_context_wps; + + case CONTEXT_LIST: + return button_context_list; + case CONTEXT_MAINMENU: + return button_context_mainmenu; + + case CONTEXT_TREE: + return button_context_tree; + + case CONTEXT_SETTINGS: + return button_context_settings; + + case CONTEXT_CUSTOM|CONTEXT_SETTINGS: + case CONTEXT_SETTINGS_RECTRIGGER: + return button_context_settings_right_is_inc; + + case CONTEXT_SETTINGS_COLOURCHOOSER: + return button_context_colorchooser; + case CONTEXT_SETTINGS_EQ: + return button_context_eq; + + case CONTEXT_SETTINGS_TIME: + return button_context_time; + + case CONTEXT_YESNOSCREEN: + return button_context_yesno; + case CONTEXT_FM: + return button_context_radio; + case CONTEXT_BOOKMARKSCREEN: + return button_context_bmark; + case CONTEXT_QUICKSCREEN: + return button_context_quickscreen; + case CONTEXT_PITCHSCREEN: + return button_context_pitchscreen; + case CONTEXT_KEYBOARD: + return button_context_keyboard; + } + return button_context_standard; +} diff --git a/firmware/drivers/audio/ctru.c b/firmware/drivers/audio/ctru.c new file mode 100644 index 0000000000..70a4170557 --- /dev/null +++ b/firmware/drivers/audio/ctru.c @@ -0,0 +1,92 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright © 2010 Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "config.h" +#include "sound.h" +#include "pcm_sampr.h" +#ifdef HAVE_SW_VOLUME_CONTROL +#include "pcm_sw_volume.h" +#include "fixedpoint.h" +#endif + +/** + * Audio Hardware api. Make some of them do nothing as we cannot properly + * simulate with SDL. if we used DSP we would run code that doesn't actually + * run on the target + **/ + +void audiohw_set_volume(int vol_l, int vol_r) +{ + (void)vol_l; (void)vol_r; +} + +#if defined(AUDIOHW_HAVE_BALANCE) +void audiohw_set_balance(int value) { (void)value; } +#endif +#ifndef HAVE_SW_TONE_CONTROLS +#if defined(AUDIOHW_HAVE_BASS) +void audiohw_set_bass(int value) { (void)value; } +#endif +#if defined(AUDIOHW_HAVE_TREBLE) +void audiohw_set_treble(int value) { (void)value; } +#endif +#endif /* HAVE_SW_TONE_CONTROLS */ +#if defined(AUDIOHW_HAVE_BASS_CUTOFF) +void audiohw_set_bass_cutoff(int value) { (void)value; } +#endif +#if defined(AUDIOHW_HAVE_TREBLE_CUTOFF) +void audiohw_set_treble_cutoff(int value){ (void)value; } +#endif +/* EQ-based tone controls */ +#if defined(AUDIOHW_HAVE_EQ) +void audiohw_set_eq_band_gain(unsigned int band, int value) + { (void)band; (void)value; } +#endif +#if defined(AUDIOHW_HAVE_EQ_FREQUENCY) +void audiohw_set_eq_band_frequency(unsigned int band, int value) + { (void)band; (void)value; } +#endif +#if defined(AUDIOHW_HAVE_EQ_WIDTH) +void audiohw_set_eq_band_width(unsigned int band, int value) + { (void)band; (void)value; } +#endif +#if defined(AUDIOHW_HAVE_DEPTH_3D) +void audiohw_set_depth_3d(int value) + { (void)value; } +#endif +#if defined(AUDIOHW_HAVE_LINEOUT) +void audiohw_set_lineout_volume(int vol_l, int vol_r) + { (void)vol_l; (void)vol_r; } +#endif +#if defined(AUDIOHW_HAVE_FILTER_ROLL_OFF) +void audiohw_set_filter_roll_off(int value) + { (void)value; } +#endif +#if defined(AUDIOHW_HAVE_POWER_MODE) +void audiohw_set_power_mode(int value) + { (void)value; } +#endif + +#ifdef CONFIG_SAMPR_TYPES +unsigned int pcm_sampr_to_hw_sampr(unsigned int samplerate, + unsigned int type) + { return samplerate; (void)type; } +#endif /* CONFIG_SAMPR_TYPES */ diff --git a/firmware/export/config/ctru.h b/firmware/export/config/ctru.h new file mode 100644 index 0000000000..0edaf145a5 --- /dev/null +++ b/firmware/export/config/ctru.h @@ -0,0 +1,102 @@ +/* + * This config file is for the N3DS hosted application + */ + +/* We don't run on hardware directly */ +#define CONFIG_PLATFORM (PLATFORM_HOSTED|PLATFORM_CTRU) +#define HAVE_FPU + +/* For Rolo and boot loader */ +#define MODEL_NUMBER 100s +#define MODEL_NAME "CTRU" + +#define USB_NONE + +#define CONFIG_CPU N10480H + +#define CPU_FREQ 268000000 + +/* Define this if you have adjustable CPU frequency */ +/* #define HAVE_ADJUSTABLE_CPU_FREQ */ + +/* define this if you have a colour LCD */ +#define HAVE_LCD_COLOR + +/* define this if you want album art for this target */ +#define HAVE_ALBUMART + +/* define this to enable bitmap scaling */ +#define HAVE_BMP_SCALING + +/* define this to enable JPEG decoding */ +#define HAVE_JPEG + +/* define this if you have access to the quickscreen */ +#define HAVE_QUICKSCREEN + +/* define this if you would like tagcache to build on this target */ +#define HAVE_TAGCACHE + +/* LCD dimensions */ +#define LCD_WIDTH 320 +#define LCD_HEIGHT 240 + +#define LCD_DEPTH 16 +#define LCD_PIXELFORMAT RGB565 + +#define LCD_OPTIMIZED_UPDATE +#define LCD_OPTIMIZED_UPDATE_RECT +#define LCD_OPTIMIZED_BLIT_YUV + +/* define this to indicate your device's keypad */ +#define HAVE_TOUCHSCREEN +#define HAVE_BUTTON_DATA + +/* define this if you have a real-time clock */ +#define CONFIG_RTC APPLICATION + +/* Power management */ +#define CONFIG_BATTERY_MEASURE PERCENTAGE_MEASURE +#define CONFIG_CHARGING CHARGING_MONITOR +#define HAVE_SW_POWEROFF + +/* The number of bytes reserved for loadable codecs */ +#define CODEC_SIZE 0x100000 + +/* The number of bytes reserved for loadable plugins */ +#define PLUGIN_BUFFER_SIZE 0x80000 + +#define AB_REPEAT_ENABLE + + +/* #define HAVE_SCROLLWHEEL */ +#define CONFIG_KEYPAD CTRU_PAD + +#define HAVE_CTRU_AUDIO +#define HAVE_HEADPHONE_DETECTION +/* #define HAVE_SW_VOLUME_CONTROL */ +/* #define PCM_SW_VOLUME_UNBUFFERED */ +/* #define PCM_SW_VOLUME_FRACBITS (16) */ + +/* Define this for LCD backlight available */ +#define HAVE_BACKLIGHT +#define HAVE_BACKLIGHT_BRIGHTNESS + +/* Main LCD backlight brightness range and defaults */ +#define MIN_BRIGHTNESS_SETTING 16 +#define MAX_BRIGHTNESS_SETTING 142 +#define BRIGHTNESS_STEP 5 +#define DEFAULT_BRIGHTNESS_SETTING 28 +#define CONFIG_BACKLIGHT_FADING BACKLIGHT_FADING_SW_SETTING + +#define CONFIG_LCD LCD_COWOND2 + +/* Define this if a programmable hotkey is mapped */ +#define HAVE_HOTKEY + +#define BOOTDIR "/" + +/* No special storage */ +#define CONFIG_STORAGE STORAGE_HOSTFS +#define HAVE_STORAGE_FLUSH + diff --git a/firmware/target/hosted/ctru/app/adc-target.h b/firmware/target/hosted/ctru/app/adc-target.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/firmware/target/hosted/ctru/app/backlight-target.h b/firmware/target/hosted/ctru/app/backlight-target.h new file mode 100644 index 0000000000..b29005f7e1 --- /dev/null +++ b/firmware/target/hosted/ctru/app/backlight-target.h @@ -0,0 +1,32 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2017 Marcin Bukat + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef _BACKLIGHT_TARGET_H_ +#define _BACKLIGHT_TARGET_H_ + +#include + +/* See backlight.c */ +bool backlight_hw_init(void); +void backlight_hw_on(void); +void backlight_hw_off(void); +void backlight_hw_brightness(int brightness); + +#endif diff --git a/firmware/target/hosted/ctru/app/button-target.h b/firmware/target/hosted/ctru/app/button-target.h new file mode 100644 index 0000000000..36fed8b59d --- /dev/null +++ b/firmware/target/hosted/ctru/app/button-target.h @@ -0,0 +1,54 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2007 by Rob Purchase + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef _BUTTON_TARGET_H_ +#define _BUTTON_TARGET_H_ + +/* Logical buttons key codes */ +#define BUTTON_UP 0x00000001 +#define BUTTON_DOWN 0x00000002 +#define BUTTON_LEFT 0x00000004 +#define BUTTON_RIGHT 0x00000008 +#define BUTTON_USER 0x00000010 +#define BUTTON_MENU 0x00000020 +#define BUTTON_BACK 0x00000040 +#define BUTTON_POWER 0x00000080 +#define BUTTON_SELECT 0x00000100 + +/* Touch Screen Area Buttons */ +#define BUTTON_TOPLEFT 0x00001000 +#define BUTTON_TOPMIDDLE 0x00002000 +#define BUTTON_TOPRIGHT 0x00004000 +#define BUTTON_MIDLEFT 0x00008000 +#define BUTTON_CENTER 0x00010000 +#define BUTTON_MIDRIGHT 0x00020000 +#define BUTTON_BOTTOMLEFT 0x00040000 +#define BUTTON_BOTTOMMIDDLE 0x00080000 +#define BUTTON_BOTTOMRIGHT 0x00100000 + +#define BUTTON_MAIN 0x1FFF + +/* Software power-off */ +#define POWEROFF_BUTTON BUTTON_POWER +/* About 3 seconds */ +#define POWEROFF_COUNT 10 + +#endif /* _BUTTON_TARGET_H_ */ diff --git a/firmware/target/hosted/ctru/backlight-ctru.c b/firmware/target/hosted/ctru/backlight-ctru.c new file mode 100644 index 0000000000..917db29405 --- /dev/null +++ b/firmware/target/hosted/ctru/backlight-ctru.c @@ -0,0 +1,114 @@ +/*************************************************************************** + * __________ __ ___ + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "config.h" +#include "backlight-target.h" +#include "sysfs.h" +#include "panic.h" +#include "lcd.h" +#include "debug.h" + +#include <3ds/services/gsplcd.h> +#include <3ds/result.h> +#include "luminance-ctru.h" + +/* TODO: To use calibrated values in rockbox, + MIN_BRIGHTNESS_SETTING (etc) would need to be + declared as constants in settings-list.c */ + +u32 ctru_min_lum = 16; +u32 ctru_max_lum = 142; +u32 ctru_luminance = 28; + +/* FIXME: After calling gspLcdInit() the home menu will no longer be + accesible, to fix this we have to call gspLcdInit/gspLcdExit as + a mutex lock/unlock when using gsplcd.h functions. */ +void lcd_mutex_lock(void) +{ + Result res = gspLcdInit(); + if (R_FAILED(res)) { + DEBUGF("backlight_hw_init: gspLcdInit failed.\n"); + } +} + +void lcd_mutex_unlock(void) +{ + gspLcdExit(); +} + +bool backlight_hw_init(void) +{ + /* read calibrated values */ + ctru_luminance = getCurrentLuminance(false); + ctru_min_lum = getMinLuminancePreset(); + ctru_max_lum = getMaxLuminancePreset(); + + backlight_hw_on(); + backlight_hw_brightness(DEFAULT_BRIGHTNESS_SETTING); + return true; +} + +static int last_bl = -1; + +void backlight_hw_on(void) +{ + lcd_mutex_lock(); + if (last_bl != 1) { +#ifdef HAVE_LCD_ENABLE + lcd_enable(true); +#endif + GSPLCD_PowerOnAllBacklights(); + last_bl = 1; + } + lcd_mutex_unlock(); +} + +void backlight_hw_off(void) +{ + lcd_mutex_lock(); + if (last_bl != 0) { + /* only power off rockbox ui screen */ + GSPLCD_PowerOffBacklight(GSPLCD_SCREEN_BOTTOM); +#ifdef HAVE_LCD_ENABLE + lcd_enable(false); +#endif + last_bl = 0; + } + lcd_mutex_unlock(); +} + +void backlight_hw_brightness(int brightness) +{ + /* cap range, just in case */ + if (brightness > MAX_BRIGHTNESS_SETTING) + brightness = MAX_BRIGHTNESS_SETTING; + if (brightness < MIN_BRIGHTNESS_SETTING) + brightness = MIN_BRIGHTNESS_SETTING; + + /* normalize level on both screens */ + lcd_mutex_lock(); + GSPLCD_SetBrightnessRaw(GSPLCD_SCREEN_TOP | GSPLCD_SCREEN_BOTTOM, (u32) brightness); + lcd_mutex_unlock(); +} diff --git a/firmware/target/hosted/ctru/button-ctru.c b/firmware/target/hosted/ctru/button-ctru.c new file mode 100644 index 0000000000..c28d7e56ae --- /dev/null +++ b/firmware/target/hosted/ctru/button-ctru.c @@ -0,0 +1,184 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2002 by Felix Arends + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include /* EXIT_SUCCESS */ +#include +#include "config.h" +#include "button.h" +#include "kernel.h" +#include "backlight.h" +#include "system.h" +#include "button-ctru.h" +#include "buttonmap.h" +#include "debug.h" +#include "powermgmt.h" +#include "storage.h" +#include "settings.h" +#include "sound.h" +#include "misc.h" + +#include "touchscreen.h" + +#include <3ds/types.h> +#include <3ds/services/apt.h> +#include <3ds/services/hid.h> +#include <3ds/services/mcuhwc.h> +#include <3ds/services/dsp.h> + +static u8 old_slider_level = 0; +static int last_y, last_x; + +static enum { + STATE_UNKNOWN = -1, + STATE_UP = 0, + STATE_DOWN = 1, +} last_touch_state = STATE_UNKNOWN; + +static double map_values(double n, double source_start, double source_end, double dest_start, double dest_end, int decimal_precision ) { + double delta_start = source_end - source_start; + double delta_end = dest_end - dest_start; + if(delta_start == 0.0 || delta_end == 0.0) { + return 1.0; + } + double scale = delta_end / delta_start; + double neg_start = -1.0 * source_start; + double offset = (neg_start * scale) + dest_start; + double final_number = (n * scale) + offset; + int calc_scale = (int) pow(10.0, decimal_precision); + return (double) round(final_number * calc_scale) / calc_scale; +} + +void update_sound_slider_level(void) +{ + /* update global volume based on sound slider level */ + u8 level; + MCUHWC_GetSoundSliderLevel(&level); + + if (level != old_slider_level) { + int volume = (int) map_values((double) level, + 0.0, /* min slider voslume */ + (double) 0x3f, /* max slider value */ + (double) sound_min(SOUND_VOLUME), + (double) sound_max(SOUND_VOLUME), + 0); + global_status.volume = volume; + setvol(); + old_slider_level = level; + } +} + +int button_read_device(int* data) +{ + int key = BUTTON_NONE; + + /* TODO: implement Home Menu button support */ + /* if (!aptMainLoop()) { + return true; + } */ + + 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(); + + /* rockbox will handle button repeats */ + kDown |= kHeld; + + /* Check for all the keys */ + if (kDown & KEY_A) { + key |= BUTTON_SELECT; + } + if (kDown & KEY_B) { + key |= BUTTON_BACK; + } + if (kDown & KEY_X) { + key |= BUTTON_MENU; + } + if (kDown & KEY_Y) { + key |= BUTTON_USER; + } + if (kDown & KEY_START) { + key |= BUTTON_POWER; + } + if (kDown & KEY_DRIGHT) { + key |= BUTTON_RIGHT; + } + if (kDown & KEY_DLEFT) { + key |= BUTTON_LEFT; + } + if (kDown & KEY_DUP) { + key |= BUTTON_UP; + } + if (kDown & KEY_DDOWN) { + key |= BUTTON_DOWN; + } + if (kDown & KEY_START) { + key |= BUTTON_POWER; + } + + touchPosition touch; + hidTouchRead(&touch); + + /* Generate UP and DOWN events */ + if (kDown & KEY_TOUCH) { + last_touch_state = STATE_DOWN; + } + else { + last_touch_state = STATE_UP; + } + + last_x = touch.px; + last_y = touch.py; + + int tkey = touchscreen_to_pixels(last_x, last_y, data); + if (last_touch_state == STATE_DOWN) { + key |= tkey; + } + + update_sound_slider_level(); + + return key; +} + +void button_init_device(void) +{ + hidInit(); +} + +#ifndef HAS_BUTTON_HOLD +void touchscreen_enable_device(bool en) +{ + (void)en; +} +#endif + +bool headphones_inserted(void) +{ + bool is_inserted; + DSP_GetHeadphoneStatus(&is_inserted); + return is_inserted; +} diff --git a/firmware/target/hosted/ctru/button-ctru.h b/firmware/target/hosted/ctru/button-ctru.h new file mode 100644 index 0000000000..637fcbf077 --- /dev/null +++ b/firmware/target/hosted/ctru/button-ctru.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2009 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + + +#ifndef __BUTTON_CTRU_H__ +#define __BUTTON_CTRU_H__ + +#include +#include "config.h" + +bool button_hold(void); +#undef button_init_device +void button_init_device(void); +int button_read_device(int *data); + +#endif /* __BUTTON_CTRU_H__ */ diff --git a/firmware/target/hosted/ctru/buttonmap.h b/firmware/target/hosted/ctru/buttonmap.h new file mode 100644 index 0000000000..b6fcaa2efc --- /dev/null +++ b/firmware/target/hosted/ctru/buttonmap.h @@ -0,0 +1,41 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Fred Bauer + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __BUTTONMAP_H__ +#define __BUTTONMAP_H__ +/* Button maps: simulated key, x, y, radius, name */ +/* Run sim with --mapping to get coordinates */ +/* or --debugbuttons to check */ +/* The First matching button is returned */ +struct button_map { + int button, x, y, radius; + char *description; +}; + +extern struct button_map bm[]; + +int xy2button( int x, int y); + +#ifdef HAVE_TOUCHSCREEN +int key_to_touch(int keyboard_button, unsigned int mouse_coords); +#endif + +#endif /* __BUTTONMAP_H__ */ diff --git a/firmware/target/hosted/ctru/filesystem-ctru.c b/firmware/target/hosted/ctru/filesystem-ctru.c new file mode 100644 index 0000000000..607a2e2ed6 --- /dev/null +++ b/firmware/target/hosted/ctru/filesystem-ctru.c @@ -0,0 +1,73 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#define RB_FILESYSTEM_OS +#include +#include +#include +#include +#include +#include "config.h" +#include "system.h" +#include "file.h" +#include "dir.h" +#include "mv.h" +#include "debug.h" +#include "pathfuncs.h" +#include "string-extra.h" + +#include <3ds/archive.h> + +void paths_init(void) +{ + /* is this needed in 3DS? */ +#if 0 + char config_dir[MAX_PATH]; + + const char *home = "/3ds"; + mkdir("/3ds/.rockbox" __MKDIR_MODE_ARG); + + snprintf(config_dir, sizeof(config_dir), "%s/.config", home); + mkdir(config_dir __MKDIR_MODE_ARG); + snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org", home); + mkdir(config_dir __MKDIR_MODE_ARG); + /* Plugin data directory */ + snprintf(config_dir, sizeof(config_dir), "%s/.config/rockbox.org/rocks.data", home); + mkdir(config_dir __MKDIR_MODE_ARG); +#endif +} + +/* only sdcard volume is accesible to the user */ +void volume_size(IF_MV(int volume,) sector_t *sizep, sector_t *freep) +{ + sector_t size = 0, free = 0; + + FS_ArchiveResource sdmcRSRC; + FSUSER_GetSdmcArchiveResource(&sdmcRSRC); + + size = (sdmcRSRC.totalClusters * sdmcRSRC.clusterSize) / sdmcRSRC.sectorSize; + free = (sdmcRSRC.freeClusters * sdmcRSRC.clusterSize) / sdmcRSRC.sectorSize; + + if (sizep) + *sizep = size; + + if (freep) + *freep = free; +} diff --git a/firmware/target/hosted/ctru/filesystem-ctru.h b/firmware/target/hosted/ctru/filesystem-ctru.h new file mode 100644 index 0000000000..a67c7b58a0 --- /dev/null +++ b/firmware/target/hosted/ctru/filesystem-ctru.h @@ -0,0 +1,116 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 by Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _FILESYSTEM_CTRU_H_ +#define _FILESYSTEM_CTRU_H_ + +#if defined(PLUGIN) || defined(CODEC) +#define FILEFUNCTIONS_DECLARED +#define FILEFUNCTIONS_DEFINED +#define DIRFUNCTIONS_DECLARED +#define DIRFUNCTIONS_DEFINED +#define OSFUNCTIONS_DECLARED +#endif /* PLUGIN || CODEC */ + +#ifndef OSFUNCTIONS_DECLARED +#define FS_PREFIX(_x_) ctru_ ## _x_ + +void paths_init(void); +#endif /* !OSFUNCTIONS_DECLARED */ +#endif /* _FILESYSTEM_CTRU_H_ */ + +#ifdef _FILE_H_ +#include + +#ifndef _FILESYSTEM_CTRU__FILE_H_ +#define _FILESYSTEM_CTRU__FILE_H_ + +#ifdef RB_FILESYSTEM_OS +#define FILEFUNCTIONS_DEFINED +#endif + +#ifndef FILEFUNCTIONS_DECLARED +#define __OPEN_MODE_ARG +#define __CREAT_MODE_ARG \ + , mode + +#include + +int ctru_open(const char *name, int oflag, ...); +int ctru_creat(const char *name, mode_t mode); +int ctru_close(int fildes); +int ctru_ftruncate(int fildes, off_t length); +int ctru_fsync(int fildes); +off_t ctru_lseek(int fildes, off_t offset, int whence); +ssize_t ctru_read(int fildes, void *buf, size_t nbyte); +ssize_t ctru_write(int fildes, const void *buf, size_t nbyte); +int ctru_remove(const char *path); +int ctru_rename(const char *old, const char *new); +int ctru_modtime(const char *path, time_t modtime); +off_t ctru_filesize(int fildes); +int ctru_fsamefile(int fildes1, int fildes2); +int ctru_relate(const char *path1, const char *path2); +bool ctru_file_exists(const char *path); +ssize_t ctru_readlink(const char *path, char *buf, size_t bufsiz); + +#endif /* !FILEFUNCTIONS_DECLARED */ + +#endif /* _FILESYSTEM_CTRU__FILE_H_ */ +#endif /* _FILE_H_ */ + +#ifdef _DIR_H_ +#ifndef _FILESYSTEM_CTRU__DIR_H_ +#define _FILESYSTEM_CTRU__DIR_H_ + +#define DIRENT dirent +struct dirent; + +struct dirinfo_native +{ + unsigned int attr; + off_t size; + uint16_t wrtdate; + uint16_t wrttime; +}; + +typedef struct {} DIR; + +#ifndef DIRFUNCTIONS_DECLARED +#define __MKDIR_MODE_ARG \ + , 0777 + +#ifdef RB_FILESYSTEM_OS +#define DIRFUNCTIONS_DEFINED +#endif + +DIR * ctru_opendir(const char *dirname); +struct dirent * ctru_readdir(DIR *dirp); +int ctru_readdir_r(DIR *dirp, struct dirent *entry, + struct dirent **result); +void ctru_rewinddir(DIR *dirp); +int ctru_closedir(DIR *dirp); +int ctru_mkdir(const char *path); +int ctru_rmdir(const char *path); +int ctru_samedir(DIR *dirp1, DIR *dirp2); +bool ctru_dir_exists(const char *dirname); +#endif /* !DIRFUNCTIONS_DECLARED */ + +#endif /* _FILESYSTEM_CTRU__DIR_H_ */ +#endif /* _DIR_H_ */ diff --git a/firmware/target/hosted/ctru/kernel-ctru.c b/firmware/target/hosted/ctru/kernel-ctru.c new file mode 100644 index 0000000000..e035af282d --- /dev/null +++ b/firmware/target/hosted/ctru/kernel-ctru.c @@ -0,0 +1,166 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include "system-ctru.h" +#include "thread-ctru.h" +#include "kernel.h" +#include "thread.h" +#include "panic.h" +#include "debug.h" + +static int tick_timer_id; +long start_tick; + +/* Condition to signal that "interrupts" may proceed */ +static sysCond *sim_thread_cond; +/* Mutex to serialize changing levels and exclude other threads while + * inside a handler */ +static RecursiveLock sim_irq_mtx; +/* Level: 0 = enabled, not 0 = disabled */ +static int volatile interrupt_level = HIGHEST_IRQ_LEVEL; +/* How many handers waiting? Not strictly needed because CondSignal is a + * noop if no threads were waiting but it filters-out calls to functions + * with higher overhead and provides info when debugging. */ +static int handlers_pending = 0; +/* 1 = executing a handler; prevents CondSignal calls in set_irq_level + * while in a handler */ +static int status_reg = 0; + +/* Nescessary logic: + * 1) All threads must pass unblocked + * 2) Current handler must always pass unblocked + * 3) Threads must be excluded when irq routine is running + * 4) No more than one handler routine should execute at a time + */ +int set_irq_level(int level) +{ + RecursiveLock_Lock(&sim_irq_mtx); + + int oldlevel = interrupt_level; + + if (status_reg == 0 && level == 0 && oldlevel != 0) + { + /* Not in a handler and "interrupts" are going from disabled to + * enabled; signal any pending handlers still waiting */ + if (handlers_pending > 0) + sys_cond_broadcast(sim_thread_cond); + } + + interrupt_level = level; /* save new level */ + + RecursiveLock_Unlock(&sim_irq_mtx); + return oldlevel; +} + +void sim_enter_irq_handler(void) +{ + RecursiveLock_Lock(&sim_irq_mtx); + handlers_pending++; + + /* Check each time before proceeding: disabled->enabled->...->disabled + * is possible on an app thread before a handler thread is ever granted + * the mutex; a handler can also leave "interrupts" disabled during + * its execution */ + while (interrupt_level != 0) + sys_cond_wait(sim_thread_cond, &sim_irq_mtx); + + status_reg = 1; +} + +void sim_exit_irq_handler(void) +{ + /* If any others are waiting, give the signal */ + if (--handlers_pending > 0) + sys_cond_signal(sim_thread_cond); + + status_reg = 0; + RecursiveLock_Unlock(&sim_irq_mtx); +} + +static bool sim_kernel_init(void) +{ + RecursiveLock_Init(&sim_irq_mtx); + sim_thread_cond = sys_cond_create(); + if (sim_thread_cond == NULL) + { + panicf("Cannot create sim_thread_cond\n"); + return false; + } + return true; +} + +void sim_kernel_shutdown(void) +{ + sys_remove_timer(tick_timer_id); + enable_irq(); + while(handlers_pending > 0) + sys_delay(10); + + sys_cond_destroy(sim_thread_cond); +} + +u32 tick_timer(u32 interval, void *param) +{ + long new_tick; + + (void) interval; + (void) param; + + new_tick = (sys_get_ticks() - start_tick) / (1000/HZ); + + while(new_tick != current_tick) + { + sim_enter_irq_handler(); + + /* Run through the list of tick tasks - increments tick + * on each iteration. */ + call_tick_tasks(); + + sim_exit_irq_handler(); + } + + return interval; +} + +void tick_start(unsigned int interval_in_ms) +{ + if (!sim_kernel_init()) + { + panicf("Could not initialize kernel!"); + exit(-1); + } + + if (tick_timer_id != 0) + { + sys_remove_timer(tick_timer_id); + tick_timer_id = 0; + } + else + { + start_tick = sys_get_ticks(); + } + + tick_timer_id = sys_add_timer(interval_in_ms, tick_timer, NULL); +} + diff --git a/firmware/target/hosted/ctru/lc-ctru.c b/firmware/target/hosted/ctru/lc-ctru.c new file mode 100644 index 0000000000..e65adbbf5a --- /dev/null +++ b/firmware/target/hosted/ctru/lc-ctru.c @@ -0,0 +1,68 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#define RB_FILESYSTEM_OS +#include +#include +#include +#include "system.h" +#include "load_code.h" +#include "filesystem-ctru.h" +#include "debug.h" + +void* programResolver(const char* sym, void *userData); +void * lc_open(const char *filename, unsigned char *buf, size_t buf_size) +{ + DEBUGF("dlopen(path=\"%s\")\n", filename); + + /* note: the 3ds dlopen implementation needs a custom resolver + for the unresolved symbols in shared objects */ + /* void *handle = dlopen(filename, RTLD_NOW | RTLD_LOCAL); */ + void *handle = ctrdlOpen(filename, + RTLD_NOW | RTLD_LOCAL, + programResolver, + NULL); + if (handle == NULL) + { + DEBUGF("%s(\"%s\") failed\n", __func__, filename); + DEBUGF(" lc_open error '%s'\n", dlerror()); + } + DEBUGF("handle = %p\n", handle); + + return handle; + (void) buf; (void) buf_size; +} + +void * lc_get_header(void *handle) +{ + void *symbol = dlsym(handle, "__header"); + if (!symbol) { + symbol = dlsym(handle, "___header"); + } + + return symbol; +} + +void lc_close(void *handle) +{ + if (handle) { + dlclose(handle); + } +} diff --git a/firmware/target/hosted/ctru/lc-program-resolver.c b/firmware/target/hosted/ctru/lc-program-resolver.c new file mode 100644 index 0000000000..5c504b1069 --- /dev/null +++ b/firmware/target/hosted/ctru/lc-program-resolver.c @@ -0,0 +1,53 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include "debug.h" + +#define RESOLVER_ENTRY(name) \ + if (!strcmp(symName, #name)) \ + return (void *)name; + +/* void* ctrdlProgramResolver(const char* symName) */ +void* programResolver(const char* symName, void *userData) +{ + DEBUGF("programResolver(name=\"%s\")\n", symName); + + /* codecs, etc */ + RESOLVER_ENTRY(abs); + RESOLVER_ENTRY(labs); + RESOLVER_ENTRY(llabs); + RESOLVER_ENTRY(printf); + + /* plugins */ + RESOLVER_ENTRY(_ctype_); + RESOLVER_ENTRY(__errno); + RESOLVER_ENTRY(longjmp); + RESOLVER_ENTRY(setjmp); + + return NULL; + (void) userData; +} diff --git a/firmware/target/hosted/ctru/lcd-bitmap.c b/firmware/target/hosted/ctru/lcd-bitmap.c new file mode 100644 index 0000000000..571857b9f3 --- /dev/null +++ b/firmware/target/hosted/ctru/lcd-bitmap.c @@ -0,0 +1,245 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Dan Everton + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include "debug.h" +#include "system.h" +#include "button-ctru.h" +#include "screendump.h" +#include "lcd-target.h" + +#include <3ds/gfx.h> +#include <3ds/allocator/linear.h> +#include <3ds/console.h> +#include <3ds/services/cfgu.h> + +/*#define LOGF_ENABLE*/ +#include "logf.h" + +fb_data *dev_fb = 0; + +static u8 system_model = CFG_MODEL_3DS; + +typedef struct +{ + int width, height; +} dimensions_t; + +int get_dest_offset(int x, int y, int dest_width) +{ + return dest_width - y - 1 + dest_width * x; +} + +int get_source_offset(int x, int y, int source_width) +{ + return x + y * source_width; +} + +void copy_framebuffer_16(u16 *dest, const dimensions_t dest_dim, const u16 *source, const dimensions_t source_dim) +{ + int rows = MIN(dest_dim.width, source_dim.height); + int cols = MIN(dest_dim.height, source_dim.width); + for (int y = 0; y < rows; ++y) { + for (int x = 0; x < cols; ++x) { + const u16 *s = source + get_source_offset(x, y, source_dim.width); + u16 *d = dest + get_dest_offset(x, y, dest_dim.width); + *d = *s; + } + } +} + +void copy_framebuffer_24(u8 *dest, const dimensions_t dest_dim, const u8 *source, const dimensions_t source_dim) +{ + int rows = MIN(dest_dim.width, source_dim.height); + int cols = MIN(dest_dim.height, source_dim.width); + for (int y = 0; y < rows; ++y) { + for (int x = 0; x < cols; ++x) { + const u8 *s = source + get_source_offset(x, y, source_dim.width) * 3; + u8 *d = dest + get_dest_offset(x, y, dest_dim.width) * 3; + d[0] = s[0]; + d[1] = s[1]; + d[2] = s[2]; + } + } +} + +void copy_framebuffer_32(u32 *dest, const dimensions_t dest_dim, const u32 *source, const dimensions_t source_dim) +{ + int rows = MIN(dest_dim.width, source_dim.height); + int cols = MIN(dest_dim.height, source_dim.width); + for (int y = 0; y < rows; ++y) { + for (int x = 0; x < cols; ++x) { + const u32 *s = source + get_source_offset(x, y, source_dim.width); + u32 *d = dest + get_dest_offset(x, y, dest_dim.width); + *d = *s; + } + } +} + +void update_framebuffer(void) +{ + u16 fb_width, fb_height; + u32 bufsize; + u8* fb = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, &fb_width, &fb_height); + bufsize = fb_width * fb_height * 2; + + /* lock_window_mutex() */ + + if (FB_DATA_SZ == 2) { + copy_framebuffer_16((void *)fb, (dimensions_t){ fb_width, fb_height }, + (u16 *)dev_fb, (dimensions_t){ LCD_WIDTH, LCD_HEIGHT }); + } + else if (FB_DATA_SZ == 3) { + copy_framebuffer_24((void *)fb, (dimensions_t){ fb_width, fb_height }, + (u8 *)dev_fb, (dimensions_t){ LCD_WIDTH, LCD_HEIGHT }); + } + else { + copy_framebuffer_32((void *)fb, (dimensions_t){ fb_width, fb_height }, + (u32 *)dev_fb, (dimensions_t){ LCD_WIDTH, LCD_HEIGHT }); + } + + // Flush and swap framebuffers + /* gfxFlushBuffers(); */ + GSPGPU_FlushDataCache(fb, bufsize); + gfxSwapBuffers(); + gspWaitForVBlank(); + + /* unlock_window_mutex() */ +} + +/* lcd-as-memframe.c */ +extern void lcd_copy_buffer_rect(fb_data *dst, const fb_data *src, + int width, int height); + +void lcd_update_rect(int x, int y, int width, int height) +{ + fb_data *dst, *src; + + if (x + width > LCD_WIDTH) + width = LCD_WIDTH - x; /* Clip right */ + if (x < 0) + width += x, x = 0; /* Clip left */ + if (width <= 0) + return; /* nothing left to do */ + + if (y + height > LCD_HEIGHT) + height = LCD_HEIGHT - y; /* Clip bottom */ + if (y < 0) + height += y, y = 0; /* Clip top */ + if (height <= 0) + return; /* nothing left to do */ + + dst = LCD_FRAMEBUF_ADDR(x, y); + src = FBADDR(x,y); + + /* Copy part of the Rockbox framebuffer to the second framebuffer */ + if (width < LCD_WIDTH) + { + /* Not full width - do line-by-line */ + lcd_copy_buffer_rect(dst, src, width, height); + } + else + { + /* Full width - copy as one line */ + lcd_copy_buffer_rect(dst, src, LCD_WIDTH*height, 1); + } + + update_framebuffer(); +} + +void lcd_update(void) +{ + /* update a full screen rect */ + lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT); +} + +void sys_console_init(void) +{ + gfxInit(GSP_BGR8_OES, GSP_RGB565_OES, false); + consoleInit(GFX_TOP, NULL); +} + +void lcd_init_device(void) +{ + gfxSetDoubleBuffering(GFX_BOTTOM, true); + + /* hidInit(); */ + + u16 fb_width, fb_height; + u8* fb = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, &fb_width, &fb_height); + u32 bufsize = fb_width * fb_height * 2; + + dev_fb = (fb_data *) linearAlloc(bufsize); + if (dev_fb == NULL) { + logf("could not allocate dev_fb size %d bytes\n", + bufsize); + exit(EXIT_FAILURE); + } + + memset(dev_fb, 0x00, bufsize); + + /* Set dpi value from system model */ + CFGU_GetSystemModel(&system_model); +} + +void lcd_shutdown(void) +{ + if (dev_fb) { + linearFree(dev_fb); + dev_fb = 0; + } + + /* hidExit(); */ + gfxExit(); +} + +int lcd_get_dpi(void) +{ + /* link: https://www.reddit.com/r/nintendo/comments/2uzk5y/informative_post_about_dpi_on_the_new_3ds/ */ + /* all values for bottom lcd */ + float dpi = 96.0f; + switch(system_model) { + case CFG_MODEL_3DS: + dpi = 132.45f; + break; + case CFG_MODEL_3DSXL: + dpi = 95.69f; + break; + case CFG_MODEL_N3DS: + dpi = 120.1f; + break; + case CFG_MODEL_2DS: + dpi = 132.45f; + break; + case CFG_MODEL_N3DSXL: + dpi = 95.69f; + break; + case CFG_MODEL_N2DSXL: + dpi = 95.69f; + break; + default: + break; + }; + return (int) roundf(dpi); +} + diff --git a/firmware/target/hosted/ctru/lcd-bitmap.h b/firmware/target/hosted/ctru/lcd-bitmap.h new file mode 100644 index 0000000000..ba3bcfcc70 --- /dev/null +++ b/firmware/target/hosted/ctru/lcd-bitmap.h @@ -0,0 +1,31 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __LCDBITMAP_H__ +#define __LCDBITMAP_H__ + +#include "lcd.h" + +void sim_lcd_init(void); +void sys_console_init(void); + +#endif /* #ifndef __LCDBITMAP_H__ */ + diff --git a/firmware/target/hosted/ctru/lcd-target.h b/firmware/target/hosted/ctru/lcd-target.h new file mode 100644 index 0000000000..4b1c1a4315 --- /dev/null +++ b/firmware/target/hosted/ctru/lcd-target.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef LCD_TARGET_H +#define LCD_TARGET_H + +#include "lcd.h" + +/* + Framebuffer device and framebuffer access. + See lcd-memframe.c +*/ +extern fb_data *dev_fb; +#define LCD_FRAMEBUF_ADDR(col, row) (dev_fb + row * LCD_WIDTH + col) + +#endif /* LCD_TARGET_H */ + diff --git a/firmware/target/hosted/ctru/lib/bfile/bfile-internal.h b/firmware/target/hosted/ctru/lib/bfile/bfile-internal.h new file mode 100644 index 0000000000..e274daf5f5 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/bfile/bfile-internal.h @@ -0,0 +1,99 @@ +#ifndef _BFILE_INTERNAL_H_ +#define _BFILE_INTERNAL_H_ + +#include +#include +#include +#include +#include +#include + +#include <3ds/gfx.h> +#include <3ds/svc.h> +#include <3ds/types.h> +#include <3ds/thread.h> +#include <3ds/result.h> +#include <3ds/services/fs.h> +#include <3ds/synchronization.h> + +/* #define MALLOC_DEBUG +#include "rmalloc/rmalloc.h" */ + +#include "cslice.h" +#include "cmap.h" + +#define nil NULL + +/* in go functions can return two values */ +#define two_type_value(type1, type2, name1, name2, type_name) \ +typedef struct { \ + type1 name1; \ + type2 name2; \ +} type_name##_t; + +/* single mutex implementation */ +#define sync_Mutex LightLock +static inline void sync_MutexInit(sync_Mutex* m) { + LightLock_Init(m); +} + +/* mutex unlock */ +static inline void sync_MutexLock(sync_Mutex* m) { + LightLock_Lock(m); +} + +/* mutex lock */ +static inline void sync_MutexUnlock(sync_Mutex* m) { + LightLock_Unlock(m); +} + +/* read_write mutex implementation */ +typedef struct { + sync_Mutex shared; + CondVar reader_q; + CondVar writer_q; + int active_readers; + int active_writers; + int waiting_writers; +} sync_RWMutex; + +void sync_RWMutexInit(sync_RWMutex *m); +void sync_RWMutexRLock(sync_RWMutex *m); +void sync_RWMutexRUnlock(sync_RWMutex *m); +void sync_RWMutexLock(sync_RWMutex *m); +void sync_RWMutexUnlock(sync_RWMutex *m); + +/* declare a two type value with name 'n_err_t' */ +two_type_value(int, const char*, n, err, int_error); +two_type_value(struct stat, const char*, fi, err, stat_error); +typedef const char* file_error_t; + +typedef struct page { + s64 num; + struct page* prev; + struct page* next; + u8* data; +} page; + +/* the two map types used by this library */ +cmap_declare(page, s64, struct page*); +cmap_declare(bool, s64, bool); + +typedef struct shard { + sync_Mutex mu; + cmap(page) pages; + cmap(bool) dirty; + struct page* head; + struct page* tail; +} shard; + +typedef struct Pager { + Handle file; + s64 pgsize; + s64 pgmax; + /* sync_RWMutex mu; */ + s64 size; + cslice(shard) shards; +} Pager; + +#endif /* _BFILE_INTERNAL_H_ */ diff --git a/firmware/target/hosted/ctru/lib/bfile/bfile.c b/firmware/target/hosted/ctru/lib/bfile/bfile.c new file mode 100644 index 0000000000..8542cf3ae0 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/bfile/bfile.c @@ -0,0 +1,471 @@ +/* + * This code is based on bfile.go by Josh Baker. + * Converted to C code by Mauricio G. + * Released under the MIT License. + */ + +/* IMPORTANT: this code only works for O_RDONLY and O_RDWR files. */ + +#include "bfile.h" + +/* note: for ease of reading and ease of comparing go code + with c implementation, function names are similar to the + go version */ + +/* note2: sync_RWMutex calls have been moved to rockbox sys_file + implementation. To use as standalone code please uncomment those calls. */ + +void sync_RWMutexInit(sync_RWMutex *m) { + LightLock_Init(&m->shared); + CondVar_Init(&m->reader_q); + CondVar_Init(&m->writer_q); + m->active_readers = 0; + m->active_writers = 0; + m->waiting_writers = 0; +} + +static inline LightLock *unique_lock(LightLock *lk) { + LightLock_Lock(lk); + return lk; +} + +void sync_RWMutexRLock(sync_RWMutex *m) { + LightLock *lk = unique_lock(&m->shared); + while (m->waiting_writers != 0) { + CondVar_Wait(&m->reader_q, lk); + } + ++m->active_readers; + LightLock_Unlock(lk); +} + +void sync_RWMutexRUnlock(sync_RWMutex *m) { + LightLock *lk = unique_lock(&m->shared); + --m->active_readers; + LightLock_Unlock(lk); + CondVar_Signal(&m->writer_q); +} + +void sync_RWMutexLock(sync_RWMutex *m) { + LightLock *lk = unique_lock(&m->shared); + ++m->waiting_writers; + while ((m->active_readers != 0) || (m->active_writers != 0)) { + CondVar_Wait(&m->writer_q, lk); + } + ++m->active_writers; + LightLock_Unlock(lk); +} + +void sync_RWMutexUnlock(sync_RWMutex *m) { + LightLock *lk = unique_lock(&m->shared); + --m->waiting_writers; + --m->active_writers; + if (m->waiting_writers > 0) { + CondVar_Signal(&m->writer_q); + } else { + CondVar_Broadcast(&m->reader_q); + } + LightLock_Unlock(lk); +} + +void s_init(shard* s); + +void s_push(shard* s, page* p) { + s->head->next->prev = p; + p->next = s->head->next; + p->prev = s->head; + s->head->next = p; +} + +void s_pop(shard* s, page* p) { + p->prev->next = p->next; + p->next->prev = p->prev; +} + +void s_bump(shard* s, page* p) { + s_pop(s, p); + s_push(s, p); +} + +/* page_pair_t destructor */ +/* page_pair_t type is defined by cmap_declare(page, s64, struct page*) */ +/* struct { + s64 key; + struct page* value; + } page_pair_t; +*/ +void page_pair_free(void* pair_ptr) { + if (pair_ptr) { + page_pair_t *pair = (page_pair_t*) pair_ptr; + struct page *p = pair->value; + if (p != nil) { + if (p->data != nil) { + free(p->data); + } + free(p); + } + } +} + +/* shard destructor */ +void s_free(void* s_ptr) { + if (s_ptr) { + shard *s = (shard*) s_ptr; + if (s->pages != nil) { + cmap_set_elem_destructor(s->pages, page_pair_free); + cmap_clear(page, s->pages); + cmap_clear(bool, s->dirty); + free(s->head); + free(s->tail); + } + } +} + +Pager* NewPager(Handle file) { + return NewPagerSize(file, 0, 0); +} + +Pager* NewPagerSize(Handle file, int pageSize, int bufferSize) { + if (pageSize <= 0) { + pageSize = defaultPageSize; + } else if ((pageSize & 4095) != 0) { + // must be a power of two + int x = 1; + while (x < pageSize) { + x *= 2; + } + pageSize = x; + } + + if (bufferSize <= 0) { + bufferSize = defaultBufferSize; + } else if (bufferSize < pageSize) { + bufferSize = pageSize; + } + + Pager* f = (Pager*) malloc(sizeof(Pager)); + f->file = file; + f->size = -1; + f->pgsize = (s64) pageSize; + + /* sync_RWMutexInit(&f->mu); */ + + // calculate the max number of pages across all shards + s64 pgmax = (s64) bufferSize / f->pgsize; + if (pgmax < minPages) { + pgmax = minPages; + } + + // calculate how many shards are needed, power of 2 + s64 nshards = (s64) ceil((double) pgmax / (double) pagesPerShard); + if (nshards > maxShards) { + nshards = maxShards; + } + s64 x = 1; + while (x < nshards) { + x *= 2; + } + nshards = x; + + // calculate the max number of pages per shard + f->pgmax = (s64) floor((double) pgmax / (double) nshards); + cslice_make(f->shards, nshards, (shard) { 0 }); + + // initialize sync mutex + size_t i; + for (i = 0; i < cslice_len(f->shards); i++) { + sync_MutexInit(&f->shards[i].mu); + } + return f; +} + +static int_error_t read_at(Handle file, u8 *data, size_t data_len, off_t off) +{ + u32 read_bytes = 0; + if (R_FAILED(FSFILE_Read(file, &read_bytes, (u64) off, data, (u32) data_len))) { + return (int_error_t) { -1, "I/O error" }; + } + + /* io.EOF */ + if (read_bytes == 0) { + return (int_error_t) { 0, "io.EOF" }; + } + + return (int_error_t) { (int) read_bytes, nil }; +} + +static int_error_t write_at(Handle file, u8 *data, size_t data_len, off_t off) +{ + u32 written = 0; + if (R_FAILED(FSFILE_Write(file, &written, (u64) off, data, (u32) data_len, FS_WRITE_FLUSH))) { + return (int_error_t) { -1, "I/O error" }; + } + + /* I/O error */ + if ((written == 0) || (written < (u32) data_len)) { + return (int_error_t) { -1, "I/O error" }; + } + + return (int_error_t) { (int) written, nil }; +} + +static stat_error_t file_stat(Handle file) +{ + u64 size = 0; + struct stat fi = { 0 }; + if (R_FAILED(FSFILE_GetSize(file, &size))) { + fi.st_size = 0; + return (stat_error_t) { fi, "I/O error" }; + } + + fi.st_size = (off_t) size; + return (stat_error_t) { fi, nil }; +} + +void s_init(shard* s) +{ + if (s->pages == nil) { + s->pages = cmap_make(/*s64*/page); + s->dirty = cmap_make(/*s64*/bool); + s->head = (page*) malloc(sizeof(page)); + s->tail = (page*) malloc(sizeof(page)); + s->head->next = s->tail; + s->tail->prev = s->head; + } +} + +file_error_t f_write(Pager* f, page* p) { + s64 off = p->num * f->pgsize; + s64 end = f->pgsize; + if ((off + end) > f->size) { + end = f->size - off; + } + int_error_t __err = write_at(f->file, p->data, end, off); + if (__err.err != nil) { + return __err.err; + } + return nil; +} + +file_error_t f_read(Pager* f, page* p) { + int_error_t __err = read_at(f->file, p->data, f->pgsize, p->num * f->pgsize); + if ((__err.err != nil) && strcmp(__err.err, "io.EOF")) { + return "I/O error"; + } + + return nil; +} + +const char* f_incrSize(Pager* f, s64 end, bool write) +{ +#define defer(m) \ + sync_RWMutexUnlock(&f->mu); \ + sync_RWMutexRLock(&f->mu); + + /* sync_RWMutexRUnlock(&f->mu); + sync_RWMutexLock(&f->mu); */ + + if (f->size == -1) { + stat_error_t fi_err = file_stat(f->file); + if (fi_err.err != nil) { + /* defer(&f->mu); */ + return nil; + } + f->size = fi_err.fi.st_size; + } + if (write && (end > f->size)) { + f->size = end; + } + + /* defer(&f->mu); */ + return nil; +} + +int_error_t f_pio(Pager *f, u8 *b, size_t len_b, s64 pnum, s64 pstart, s64 pend, bool write); +int_error_t f_io(Pager *f, u8 *b, size_t len_b, s64 off, bool write) { + if (f == nil) { + return (int_error_t) { 0, "invalid argument" }; + } + bool eof = false; + s64 start = off, end = off + len_b; + if (start < 0) { + return (int_error_t) { 0, "negative offset" }; + } + + // Check the upper bounds of the input to the known file size. + // Increase the file size if needed. + /* sync_RWMutexRLock(&f->mu); */ + if (end > f->size) { + file_error_t err = f_incrSize(f, end, write); + if (err != nil) { + /* sync_RWMutexRUnlock(&f->mu); */ + return (int_error_t) { 0, err }; + } + if (!write && (end > f->size)) { + end = f->size; + if ((end - start) < 0) { + end = start; + } + eof = true; + len_b = end-start; /* b = b[:end-start] */ + } + } + /* sync_RWMutexRUnlock(&f->mu); */ + + // Perform the page I/O. + int total = 0; + while (len_b > 0) { + s64 pnum = off / f->pgsize; + s64 pstart = off & (f->pgsize - 1); + s64 pend = pstart + (s64) len_b; + if (pend > f->pgsize) { + pend = f->pgsize; + } + + int_error_t result = f_pio(f, b, pend - pstart, pnum, pstart, pend, write); + if (result.err != nil) { + return (int_error_t) { total, result.err }; + } + + off += (s64) result.n; + total += result.n; + b = &b[result.n]; len_b -= result.n; /* b = b[n:] */ + } + if (eof) { + return (int_error_t) { total, "io.EOF" }; + } + + return (int_error_t) { total, nil }; +} + +int_error_t f_pio(Pager *f, u8 *b, size_t len_b, s64 pnum, s64 pstart, s64 pend, bool write) { + /* printf("pio(%p, %d, %lld, %lld, %lld, %s)\n", b, len_b, pnum, pstart, pend, write == true ? "true" : "false"); */ + shard *s = &f->shards[pnum & (s64) (cslice_len(f->shards) - 1)]; + sync_MutexLock(&s->mu); + s_init(s); + page *p = cmap_get_ptr(page, s->pages, pnum); + if (p == nil) { + // Page does not exist in memory. + // Acquire a new one. + if (cmap_len(s->pages) == f->pgmax) { + // The buffer is at capacity. + // Evict lru page and hang on to it. + p = s->tail->prev; + s_pop(s, p); + cmap_delete(page, s->pages, p->num); + if (cmap_get(bool, s->dirty, p->num)) { + // dirty page. flush it now + file_error_t err = f_write(f, p); + if (err != nil) { + sync_MutexUnlock(&s->mu); + return (int_error_t) { 0, err }; + } + cmap_delete(bool, s->dirty, p->num); + } + // Clear the previous page memory for partial page writes for + // pages that are being partially written to. + if (write && ((pend - pstart) < f->pgsize)) { + memset(p->data, 0, f->pgsize); + } + } else { + // Allocate an entirely new page. + p = (page *) malloc(sizeof(page)); + p->data = (u8 *) malloc(f->pgsize); + } + p->num = pnum; + // Read contents of page from file for all read operations, and + // partial write operations. Ignore for full page writes. + if (!write || ((pend-pstart) < f->pgsize)) { + file_error_t err = f_read(f, p); + if (err != nil) { + sync_MutexUnlock(&s->mu); + return (int_error_t) { 0, err }; + } + } + // Add the newly acquired page to the list. + cmap_set(page, s->pages, p->num, p); + s_push(s, p); + } else { + // Bump the page to the front of the list. + s_bump(s, p); + } + if (write) { + memcpy(p->data + pstart, b, pend - pstart); + cmap_set(bool, s->dirty, pnum, true); + } else { + memcpy(b, p->data + pstart, pend - pstart); + } + sync_MutexUnlock(&s->mu); + return (int_error_t) { len_b, nil }; +} + +// Flush writes any unwritten buffered data to the underlying file. +file_error_t PagerFlush(Pager *f) { + if (f == nil) { + return "invalid argument"; + } + + /* sync_RWMutexLock(&f->mu); */ + for (size_t i = 0; i < cslice_len(f->shards); i++) { + cmap_iterator(bool) pnum; + if (f->shards[i].dirty != nil) { + for (pnum = cmap_begin(f->shards[i].dirty); + pnum != cmap_end(f->shards[i].dirty); pnum++) { + if (pnum->value == true) { + page *p = cmap_get_ptr(page, f->shards[i].pages, pnum->key); + if (p != nil) { + file_error_t err = f_write(f, p); + if (err != nil) { + /* sync_RWMutexUnlock(&f->mu); */ + return err; + } + } + cmap_set(bool, f->shards[i].dirty, pnum->key, false); + } + } + } + } + /* sync_RWMutexUnlock(&f->mu); */ + return nil; +} + +// ReadAt reads len(b) bytes from the File starting at byte offset off. +int_error_t PagerReadAt(Pager *f, u8 *b, size_t len_b, off_t off) { + return f_io(f, b, len_b, off, false); +} + +// WriteAt writes len(b) bytes to the File starting at byte offset off. +int_error_t PagerWriteAt(Pager *f, u8 *b, size_t len_b, off_t off) { + return f_io(f, b, len_b, off, true); +} + +file_error_t PagerTruncate(Pager *f, off_t length) { + if (f == nil) { + return "invalid argument"; + } + + /* flush unwritten changes to disk */ + PagerFlush(f); + + /* sync_RWMutexRLock(&f->mu); */ + /* set new file size */ + Handle handle = f->file; + Result res = FSFILE_SetSize(handle, (u64) length); + if (R_FAILED(res)) { + return "I/O error"; + } + /* sync_RWMutexRUnlock(&f->mu); */ + + /* FIXME: truncate only required pages. Remove all for now */ + PagerClear(f); + f = NewPager(handle); + return nil; +} + +void PagerClear(Pager *f) { + if (f) { + cslice_set_elem_destructor(f->shards, s_free); + cslice_clear(f->shards); + free(f); + } +} + diff --git a/firmware/target/hosted/ctru/lib/bfile/bfile.h b/firmware/target/hosted/ctru/lib/bfile/bfile.h new file mode 100644 index 0000000000..870a9248d0 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/bfile/bfile.h @@ -0,0 +1,37 @@ +#ifndef _BFILE_H_ +#define _BFILE_H_ + +#include "bfile-internal.h" + +static const int defaultPageSize = 4096; // all pages are this size +static const int defaultBufferSize = 0x800000; // default buffer size, 8 MB +static const int minPages = 4; // minimum total pages per file +static const int pagesPerShard = 32; // ideal number of pages per shard +static const int maxShards = 128; // maximum number of shards per file + +// NewPager returns a new Pager that is backed by the provided file. +Pager* NewPager(Handle file); + +// NewPagerSize returns a new Pager with a custom page size and buffer size. +// The bufferSize is the maximum amount of memory dedicated to individual +// pages. Setting pageSize and bufferSize to zero will use their defaults, +// which are 4096 and 8 MB respectively. Custom values are rounded up to the +// nearest power of 2. +Pager* NewPagerSize(Handle file, int pageSize, int bufferSize); + +// ReadAt reads len(b) bytes from the File starting at byte offset off. +int_error_t PagerReadAt(Pager *f, u8 *b, size_t len_b, off_t off); + +// WriteAt writes len(b) bytes to the File starting at byte offset off. +int_error_t PagerWriteAt(Pager *f, u8 *b, size_t len_b, off_t off); + +// Flush writes any unwritten buffered data to the underlying file. +file_error_t PagerFlush(Pager *f); + +// Truncates pager to specified length +file_error_t PagerTruncate(Pager *f, off_t length); + +// Free all memory associated to a Pager file +void PagerClear(Pager *f); + +#endif /* _B_FILE_H_ */ diff --git a/firmware/target/hosted/ctru/lib/cmap.h b/firmware/target/hosted/ctru/lib/cmap.h new file mode 100644 index 0000000000..faa1eff9f3 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/cmap.h @@ -0,0 +1,209 @@ +#ifndef CMAP_H_ +#define CMAP_H_ + +#define CVECTOR_LINEAR_GROWTH +#include "cvector.h" + +/* note: for ease of porting go code to c, many functions (macros) names + remain similar to the ones used by go */ + +/* note2: this is a very basic map implementation. It does not do any sorting, and only works for basic types (and pointers) that can be compared with the equality operator */ + +#define nil NULL + +#define cmap_elem_destructor_t cvector_elem_destructor_t + +/** + * @brief cmap_declare - The map type used in this library + * @param name - The name associated to a map type. + * @param key_type - The map pair key type. + * @param val_type - The map pair value type. + * @param compare_func - The function used to compare for key_type. Should return value < 0 when a < b, 0 when a == b and value > 0 when a > b. + */ +#define cmap_declare(name, key_type, val_type) \ +typedef struct { \ + key_type key; \ + val_type value; \ +} name##_pair_t; \ +\ +typedef struct { \ + cvector(name##_pair_t) tree; \ + cmap_elem_destructor_t elem_destructor; \ +} name##_map_t; \ +\ +static inline val_type name##_get_( \ + name##_map_t *this, const key_type key) \ +{ \ + if (this) { \ + size_t i; \ + for (i = 0; i < cvector_size(this->tree); i++) { \ + if (key == this->tree[i].key) { \ + return this->tree[i].value; \ + } \ + } \ + } \ + return 0; \ +} \ +\ +static inline val_type name##_get_ptr_( \ + name##_map_t *this, const key_type key) \ +{ \ + if (this) { \ + size_t i; \ + for (i = 0; i < cvector_size(this->tree); i++) { \ + if (key == this->tree[i].key) { \ + return this->tree[i].value; \ + } \ + } \ + } \ + return nil; \ +} \ +\ +static inline void name##_set_( \ + name##_map_t *this, const key_type key, val_type value) \ +{ \ + if (this) { \ + size_t i; \ + for (i = 0; i < cvector_size(this->tree); i++) { \ + if (key == this->tree[i].key) { \ + this->tree[i].value = value; \ + return; \ + } \ + } \ + name##_pair_t new_pair = (name##_pair_t) { key, value }; \ + cvector_push_back(this->tree, new_pair); \ + } \ +} \ +\ +static inline void name##_delete_( \ + name##_map_t *this, const key_type key) \ +{ \ + if (this) { \ + size_t i; \ + for (i = 0; i < cvector_size(this->tree); i++) { \ + if (key == this->tree[i].key) { \ + cvector_erase(this->tree, i); \ + return; \ + } \ + } \ + } \ +} \ +\ +static inline name##_map_t* name##_map_make_(void) \ +{ \ + name##_map_t *map = (name##_map_t*) malloc(sizeof(name##_map_t)); \ + if (map) { \ + map->tree = nil; \ + cvector_init(map->tree, 0, nil); \ + return map; \ + } \ + return nil; \ +} \ +\ +static inline void name##_clear_(name##_map_t *this) \ +{ \ + if (this) { \ + cvector_free(this->tree); \ + free(this); \ + } \ +} \ +\ + + +/** + * @brief cmap - The map type used in this library + * @param name - The name associated to a map type. + */ +#define cmap(name) name##_map_t * + +/** + * @brief cmap_make - creates a new map. Automatically initializes the map. + * @param name - the name asociated to the map type + * @return a pointer to a new map. + */ +#define cmap_make(name) name##_map_make_() + +/** + * @brief cmap_size - gets the current size of the map + * @param map_ptr - the map pointer + * @return the size as a size_t + */ +#define cmap_len(map_ptr) cvector_size(map_ptr->tree) + +/** + * @brief cmap_get - gets value associated to a key. + * @param name - the name asociated to the map type + * @param map_ptr - the map pointer + * @param key - the key to search for + * @return the value associated to a key + */ +#define cmap_get(name, map_ptr, key) name##_get_(map_ptr, key) + +/** + * @brief cmap_get-ptr - gets ptr_value associated to a key. Use it to avoid assigning a ptr to 0. + * @param name - the name asociated to the map type + * @param map_ptr - the map pointer + * @param key - the key to search for + * @return the value associated to a key + */ +#define cmap_get_ptr(name, map_ptr, key) name##_get_ptr_(map_ptr, key) + + +/** + * @brief cmap_set - sets value associated to a key. + * @param name - the name asociated to the map type + * @param map_ptr - the map pointer + * @param key - the key to search for + * @param value - the new value + * @return void + */ +#define cmap_set(name, map_ptr, key, val) name##_set_(map_ptr, key, val) + +/** + * @brief cmap_delete - deletes map entry associated to a key. + * @param name - the name asociated to the map type + * @param map_ptr - the map pointer + * @param key - the key to search for + * @return void + */ +#define cmap_delete(name, map_ptr, key) name##_delete_(map_ptr, key) + +/** + * @brief cmap_set_elem_destructor - set the element destructor function + * used to clean up removed elements. The map must NOT be NULL for this to do anything. + * @param map_ptr - the map pointer + * @param elem_destructor_fn - function pointer of type cvector_elem_destructor_t used to destroy elements + * @return void + */ +#define cmap_set_elem_destructor(map_ptr, elem_destructor_fn) \ + cvector_set_elem_destructor(map_ptr->tree, elem_destructor_fn) + +/** + * @brief cmap_clear - deletes all map entries. And frees memory is an element destructor was set previously. + * @param name - the name asociated to the map type + * @param map_ptr - the map pointer + * @return void + */ +#define cmap_clear(name, map_ptr) name##_clear_(map_ptr) + +/** + * @brief cmap_iterator - The iterator type used for cmap + * @param type The type of iterator to act on. + */ +#define cmap_iterator(name) cvector_iterator(name##_pair_t) + +/** + * @brief cmap_begin - returns an iterator to first element of the vector + * @param map_ptr - the map pointer + * @return a pointer to the first element (or NULL) + */ +#define cmap_begin(map_ptr) ((map_ptr) ? cvector_begin(map_ptr->tree) : nil) + +/** + * @brief cmap_end - returns an iterator to one past the last element of the vector + * @param map_ptrs - the map pointer + * @return a pointer to one past the last element (or NULL) + */ +#define cmap_end(map_ptr) ((map_ptr) ? cvector_end(map_ptr->tree) : nil) + +#endif /* CMAP_H_ */ diff --git a/firmware/target/hosted/ctru/lib/cslice.h b/firmware/target/hosted/ctru/lib/cslice.h new file mode 100644 index 0000000000..36ec6d6faa --- /dev/null +++ b/firmware/target/hosted/ctru/lib/cslice.h @@ -0,0 +1,63 @@ +#ifndef CSLICE_H_ +#define CSLICE_H_ + +#define CVECTOR_LINEAR_GROWTH +#include "cvector.h" + +/* note: for ease of porting go code to c, many functions (macros) names + remain similar to the ones used by go */ + +#define nil NULL + +/** + * @brief cslice - The slice type used in this library + * @param type The type of slice to act on. + */ +#define cslice(type) cvector(type) + +/** + * @brief cslice_make - creates a new slice. Automatically initializes the slice. + * @param slice - the slice + * @param count - new size of the slice + * @param value - the value to initialize new elements with + * @return void + */ +#define cslice_make(slice, capacity, value) \ + do { \ + slice = nil; \ + cvector_init(slice, capacity, nil); \ + cvector_resize(slice, capacity, value); \ + } while(0) + +/** + * @brief cslice_size - gets the current size of the slice + * @param slice - the slice + * @return the size as a size_t + */ +#define cslice_len(slice) cvector_size(slice) + +/** + * @brief cslice_capacity - gets the current capacity of the slice + * @param slice - the slice + * @return the capacity as a size_t + */ +#define cslice_cap(slice) cvector_capacity(slice) + +/** + * @brief cslice_set_elem_destructor - set the element destructor function + * used to clean up removed elements. The vector must NOT be NULL for this to do anything. + * @param slice - the slice + * @param elem_destructor_fn - function pointer of type cslice_elem_destructor_t used to destroy elements + * @return void + */ +#define cslice_set_elem_destructor(slice, elem_destructor_fn) \ + cvector_set_elem_destructor(slice, elem_destructor_fn) + +/** + * @brief cslice_free - frees all memory associated with the slice + * @param slice - the slice + * @return void + */ +#define cslice_clear(slice) cvector_free(slice) + +#endif /* CSLICE_H_ */ diff --git a/firmware/target/hosted/ctru/lib/cvector.h b/firmware/target/hosted/ctru/lib/cvector.h new file mode 100644 index 0000000000..5045025c73 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/cvector.h @@ -0,0 +1,549 @@ +#ifndef CVECTOR_H_ +#define CVECTOR_H_ +/** + * @copyright Copyright (c) 2015 Evan Teran, + * License: The MIT License (MIT) + * @brief cvector heap implemented using C library malloc() + * @file cvector.h + */ + +/* in case C library malloc() needs extra protection, + * allow these defines to be overridden. + */ +/* functions for allocation and deallocation need to correspond to each other, fall back to C library functions if not all are overridden */ +#if !defined(cvector_clib_free) || !defined(cvector_clib_malloc) || !defined(cvector_clib_calloc) || !defined(cvector_clib_realloc) +#ifdef cvector_clib_free +#undef cvector_clib_free +#endif +#ifdef cvector_clib_malloc +#undef cvector_clib_malloc +#endif +#ifdef cvector_clib_calloc +#undef cvector_clib_calloc +#endif +#ifdef cvector_clib_realloc +#undef cvector_clib_realloc +#endif +#include +#define cvector_clib_free free +#define cvector_clib_malloc malloc +#define cvector_clib_calloc calloc +#define cvector_clib_realloc realloc +#endif +/* functions independent of memory allocation */ +#ifndef cvector_clib_assert +#include /* for assert */ +#define cvector_clib_assert assert +#endif +#ifndef cvector_clib_memcpy +#include /* for memcpy */ +#define cvector_clib_memcpy memcpy +#endif +#ifndef cvector_clib_memmove +#include /* for memmove */ +#define cvector_clib_memmove memmove +#endif + +/* NOTE: Similar to C's qsort and bsearch, you will receive a T* + * for a vector of Ts. This means that you cannot use `free` directly + * as a destructor. Instead if you have for example a cvector_vector_type(int *) + * you will need to supply a function which casts `elem_ptr` to an `int**` + * and then does a free on what that pointer points to: + * + * ex: + * + * void free_int(void *p) { free(*(int **)p); } + */ +typedef void (*cvector_elem_destructor_t)(void *elem_ptr); + +typedef struct cvector_metadata_t { + size_t size; + size_t capacity; + cvector_elem_destructor_t elem_destructor; +} cvector_metadata_t; + +/** + * @brief cvector_vector_type - The vector type used in this library + * @param type The type of vector to act on. + */ +#define cvector_vector_type(type) type * + +/** + * @brief cvector - Syntactic sugar to retrieve a vector type + * @param type The type of vector to act on. + */ +#define cvector(type) cvector_vector_type(type) + +/** + * @brief cvector_iterator - The iterator type used for cvector + * @param type The type of iterator to act on. + */ +#define cvector_iterator(type) cvector_vector_type(type) + +/** + * @note you can also safely pass a pointer to a cvector iterator to a function + * but you have to update the pointer at the end to update the original + * iterator. + * example: + * void function( cvector_vector_type( type ) * p_it ) + * { + * cvector_vector_type( type ) it = *p_it; + * it ++; + * + * ... + * + * *p_it = it; + * } + */ + +/** + * @brief cvector_vector_type_ptr - helper to make code more "readable" + * @param type - the vector type pointer + */ +#define cvector_ptr_type(type) \ + cvector_vector_type(type) * + +/** + * @brief cvector_vector_ptr_get_iterator/set - helpers to make code more "readable" + * @param it - the vector iterator + * @param ptr - the vector pointer + */ +#define cvector_ptr_get_iterator(ptr) \ + *(ptr) + +#define cvector_ptr_set(ptr, it) \ + *(ptr) = it + +/** + * @brief cvector_vector_container_declare - defined a vector container type + */ +#define cvector_vector_container_declare(name, type) \ +struct cvector_vector_container_##name { \ + cvector_vector_type(type) vector; \ +} + +/** + * @brief cvector_vector_container - used to pass a cvector wrapped inside a container as a function parameter + */ +#define cvector_vector_container(name) \ + struct cvector_vector_container_##name + + +/** + * @brief cvector_vec_to_base - For internal use, converts a vector pointer to a metadata pointer + * @param vec - the vector + * @return the metadata pointer of the vector + * @internal + */ +#define cvector_vec_to_base(vec) \ + (&((cvector_metadata_t *)(void *)(vec))[-1]) + +/** + * @brief cvector_base_to_vec - For internal use, converts a metadata pointer to a vector pointer + * @param ptr - pointer to the metadata + * @return the vector + * @internal + */ +#define cvector_base_to_vec(ptr) \ + ((void *)&((cvector_metadata_t *)(ptr))[1]) + +/** + * @brief cvector_capacity - gets the current capacity of the vector + * @param vec - the vector + * @return the capacity as a size_t + */ +#define cvector_capacity(vec) \ + ((vec) ? cvector_vec_to_base(vec)->capacity : (size_t)0) + +/** + * @brief cvector_size - gets the current size of the vector + * @param vec - the vector + * @return the size as a size_t + */ +#define cvector_size(vec) \ + ((vec) ? cvector_vec_to_base(vec)->size : (size_t)0) + +/** + * @brief cvector_elem_destructor - get the element destructor function used + * to clean up elements + * @param vec - the vector + * @return the function pointer as cvector_elem_destructor_t + */ +#define cvector_elem_destructor(vec) \ + ((vec) ? cvector_vec_to_base(vec)->elem_destructor : NULL) + +/** + * @brief cvector_empty - returns non-zero if the vector is empty + * @param vec - the vector + * @return non-zero if empty, zero if non-empty + */ +#define cvector_empty(vec) \ + (cvector_size(vec) == 0) + +/** + * @brief cvector_reserve - Requests that the vector capacity be at least enough + * to contain n elements. If n is greater than the current vector capacity, the + * function causes the container to reallocate its storage increasing its + * capacity to n (or greater). + * @param vec - the vector + * @param n - Minimum capacity for the vector. + * @return void + */ +#define cvector_reserve(vec, n) \ + do { \ + size_t cv_reserve_cap__ = cvector_capacity(vec); \ + if (cv_reserve_cap__ < (n)) { \ + cvector_grow((vec), (n)); \ + } \ + } while (0) + +/** + * @brief cvector_init - Initialize a vector. The vector must be NULL for this to do anything. + * @param vec - the vector + * @param capacity - vector capacity to reserve + * @param elem_destructor_fn - element destructor function + * @return void + */ +#define cvector_init(vec, capacity, elem_destructor_fn) \ + do { \ + if (!(vec)) { \ + cvector_reserve((vec), capacity); \ + cvector_set_elem_destructor((vec), (elem_destructor_fn)); \ + } \ + } while (0) + +/** + * @brief cvector_init_default - Initialize a vector with default value. The vector must be NULL for this to do anything. Does NOT work for struct types. + * @param vec - the vector + * @param capacity - vector capacity to reserve + * @param elem_destructor_fn - element destructor function + * @return void + */ +#define cvector_init_default(vec, capacity, default) \ + do { \ + if (!(vec)) { \ + cvector_reserve((vec), capacity); \ + cvector_set_elem_destructor((vec), (elem_destructor_fn)); \ + } \ + } while (0) + +/** + * @brief cvector_erase - removes the element at index i from the vector + * @param vec - the vector + * @param i - index of element to remove + * @return void + */ +#define cvector_erase(vec, i) \ + do { \ + if (vec) { \ + const size_t cv_erase_sz__ = cvector_size(vec); \ + if ((i) < cv_erase_sz__) { \ + cvector_elem_destructor_t cv_erase_elem_dtor__ = cvector_elem_destructor(vec); \ + if (cv_erase_elem_dtor__) { \ + cv_erase_elem_dtor__(&(vec)[i]); \ + } \ + cvector_set_size((vec), cv_erase_sz__ - 1); \ + cvector_clib_memmove( \ + (vec) + (i), \ + (vec) + (i) + 1, \ + sizeof(*(vec)) * (cv_erase_sz__ - 1 - (i))); \ + } \ + } \ + } while (0) + +/** + * @brief cvector_clear - erase all of the elements in the vector + * @param vec - the vector + * @return void + */ +#define cvector_clear(vec) \ + do { \ + if (vec) { \ + cvector_elem_destructor_t cv_clear_elem_dtor__ = cvector_elem_destructor(vec); \ + if (cv_clear_elem_dtor__) { \ + size_t cv_clear_i__; \ + for (cv_clear_i__ = 0; cv_clear_i__ < cvector_size(vec); ++cv_clear_i__) { \ + cv_clear_elem_dtor__(&(vec)[cv_clear_i__]); \ + } \ + } \ + cvector_set_size(vec, 0); \ + } \ + } while (0) + +/** + * @brief cvector_free - frees all memory associated with the vector + * @param vec - the vector + * @return void + */ +#define cvector_free(vec) \ + do { \ + if (vec) { \ + void *cv_free_p__ = cvector_vec_to_base(vec); \ + cvector_elem_destructor_t cv_free_elem_dtor__ = cvector_elem_destructor(vec); \ + if (cv_free_elem_dtor__) { \ + size_t cv_free_i__; \ + for (cv_free_i__ = 0; cv_free_i__ < cvector_size(vec); ++cv_free_i__) { \ + cv_free_elem_dtor__(&(vec)[cv_free_i__]); \ + } \ + } \ + cvector_clib_free(cv_free_p__); \ + } \ + } while (0) + +/** + * @brief cvector_begin - returns an iterator to first element of the vector + * @param vec - the vector + * @return a pointer to the first element (or NULL) + */ +#define cvector_begin(vec) \ + (vec) + +/** + * @brief cvector_end - returns an iterator to one past the last element of the vector + * @param vec - the vector + * @return a pointer to one past the last element (or NULL) + */ +#define cvector_end(vec) \ + ((vec) ? &((vec)[cvector_size(vec)]) : NULL) + +/* user request to use linear growth algorithm */ +#ifdef CVECTOR_LINEAR_GROWTH + +/** + * @brief cvector_compute_next_grow - returns an the computed size in next vector grow + * size is increased by 1 + * @param size - current size + * @return size after next vector grow + */ +#define cvector_compute_next_grow(size) \ + ((size) + 1) + +#else + +/** + * @brief cvector_compute_next_grow - returns an the computed size in next vector grow + * size is increased by multiplication of 2 + * @param size - current size + * @return size after next vector grow + */ +#define cvector_compute_next_grow(size) \ + ((size) ? ((size) << 1) : 1) + +#endif /* CVECTOR_LINEAR_GROWTH */ + +/** + * @brief cvector_push_back - adds an element to the end of the vector + * @param vec - the vector + * @param value - the value to add + * @return void + */ +#define cvector_push_back(vec, value) \ + do { \ + size_t cv_push_back_cap__ = cvector_capacity(vec); \ + if (cv_push_back_cap__ <= cvector_size(vec)) { \ + cvector_grow((vec), cvector_compute_next_grow(cv_push_back_cap__)); \ + } \ + (vec)[cvector_size(vec)] = (value); \ + cvector_set_size((vec), cvector_size(vec) + 1); \ + } while (0) + +/** + * @brief cvector_insert - insert element at position pos to the vector + * @param vec - the vector + * @param pos - position in the vector where the new elements are inserted. + * @param val - value to be copied (or moved) to the inserted elements. + * @return void + */ +#define cvector_insert(vec, pos, val) \ + do { \ + size_t cv_insert_cap__ = cvector_capacity(vec); \ + if (cv_insert_cap__ <= cvector_size(vec)) { \ + cvector_grow((vec), cvector_compute_next_grow(cv_insert_cap__)); \ + } \ + if ((pos) < cvector_size(vec)) { \ + cvector_clib_memmove( \ + (vec) + (pos) + 1, \ + (vec) + (pos), \ + sizeof(*(vec)) * ((cvector_size(vec)) - (pos))); \ + } \ + (vec)[(pos)] = (val); \ + cvector_set_size((vec), cvector_size(vec) + 1); \ + } while (0) + +/** + * @brief cvector_pop_back - removes the last element from the vector + * @param vec - the vector + * @return void + */ +#define cvector_pop_back(vec) \ + do { \ + cvector_elem_destructor_t cv_pop_back_elem_dtor__ = cvector_elem_destructor(vec); \ + if (cv_pop_back_elem_dtor__) { \ + cv_pop_back_elem_dtor__(&(vec)[cvector_size(vec) - 1]); \ + } \ + cvector_set_size((vec), cvector_size(vec) - 1); \ + } while (0) + +/** + * @brief cvector_copy - copy a vector + * @param from - the original vector + * @param to - destination to which the function copy to + * @return void + */ +#define cvector_copy(from, to) \ + do { \ + if ((from)) { \ + cvector_grow(to, cvector_size(from)); \ + cvector_set_size(to, cvector_size(from)); \ + cvector_clib_memcpy((to), (from), cvector_size(from) * sizeof(*(from))); \ + } \ + } while (0) + +/** + * @brief cvector_swap - exchanges the content of the vector by the content of another vector of the same type + * @param vec - the original vector + * @param other - the other vector to swap content with + * @param type - the type of both vectors + * @return void + */ +#define cvector_swap(vec, other, type) \ + do { \ + if (vec && other) { \ + cvector_vector_type(type) cv_swap__ = vec; \ + vec = other; \ + other = cv_swap__; \ + } \ + } while (0) + +/** + * @brief cvector_set_capacity - For internal use, sets the capacity variable of the vector + * @param vec - the vector + * @param size - the new capacity to set + * @return void + * @internal + */ +#define cvector_set_capacity(vec, size) \ + do { \ + if (vec) { \ + cvector_vec_to_base(vec)->capacity = (size); \ + } \ + } while (0) + +/** + * @brief cvector_set_size - For internal use, sets the size variable of the vector + * @param vec - the vector + * @param _size - the new capacity to set + * @return void + * @internal + */ +#define cvector_set_size(vec, _size) \ + do { \ + if (vec) { \ + cvector_vec_to_base(vec)->size = (_size); \ + } \ + } while (0) + +/** + * @brief cvector_set_elem_destructor - set the element destructor function + * used to clean up removed elements. The vector must NOT be NULL for this to do anything. + * @param vec - the vector + * @param elem_destructor_fn - function pointer of type cvector_elem_destructor_t used to destroy elements + * @return void + */ +#define cvector_set_elem_destructor(vec, elem_destructor_fn) \ + do { \ + if (vec) { \ + cvector_vec_to_base(vec)->elem_destructor = (elem_destructor_fn); \ + } \ + } while (0) + +/** + * @brief cvector_grow - For internal use, ensures that the vector is at least `count` elements big + * @param vec - the vector + * @param count - the new capacity to set + * @return void + * @internal + */ +#define cvector_grow(vec, count) \ + do { \ + const size_t cv_grow_sz__ = (count) * sizeof(*(vec)) + sizeof(cvector_metadata_t); \ + if (vec) { \ + void *cv_grow_p1__ = cvector_vec_to_base(vec); \ + void *cv_grow_p2__ = cvector_clib_realloc(cv_grow_p1__, cv_grow_sz__); \ + cvector_clib_assert(cv_grow_p2__); \ + (vec) = cvector_base_to_vec(cv_grow_p2__); \ + } else { \ + void *cv_grow_p__ = cvector_clib_malloc(cv_grow_sz__); \ + cvector_clib_assert(cv_grow_p__); \ + (vec) = cvector_base_to_vec(cv_grow_p__); \ + cvector_set_size((vec), 0); \ + cvector_set_elem_destructor((vec), NULL); \ + } \ + cvector_set_capacity((vec), (count)); \ + } while (0) + +/** + * @brief cvector_shrink_to_fit - requests the container to reduce its capacity to fit its size + * @param vec - the vector + * @return void + */ +#define cvector_shrink_to_fit(vec) \ + do { \ + if (vec) { \ + const size_t cv_shrink_to_fit_sz__ = cvector_size(vec); \ + cvector_grow(vec, cv_shrink_to_fit_sz__); \ + } \ + } while (0) + +/** + * @brief cvector_at - returns a reference to the element at position n in the vector. + * @param vec - the vector + * @param n - position of an element in the vector. + * @return the element at the specified position in the vector. + */ +#define cvector_at(vec, n) \ + ((vec) ? (((int)(n) < 0 || (size_t)(n) >= cvector_size(vec)) ? NULL : &(vec)[n]) : NULL) + +/** + * @brief cvector_front - returns a reference to the first element in the vector. Unlike member cvector_begin, which returns an iterator to this same element, this function returns a direct reference. + * @param vec - the vector + * @return a reference to the first element in the vector container. + */ +#define cvector_front(vec) \ + ((vec) ? ((cvector_size(vec) > 0) ? cvector_at(vec, 0) : NULL) : NULL) + +/** + * @brief cvector_back - returns a reference to the last element in the vector.Unlike member cvector_end, which returns an iterator just past this element, this function returns a direct reference. + * @param vec - the vector + * @return a reference to the last element in the vector. + */ +#define cvector_back(vec) \ + ((vec) ? ((cvector_size(vec) > 0) ? cvector_at(vec, cvector_size(vec) - 1) : NULL) : NULL) + +/** + * @brief cvector_resize - resizes the container to contain count elements. + * @param vec - the vector + * @param count - new size of the vector + * @param value - the value to initialize new elements with + * @return void + */ +#define cvector_resize(vec, count, value) \ + do { \ + if (vec) { \ + size_t cv_resize_count__ = (size_t)(count); \ + size_t cv_resize_sz__ = cvector_vec_to_base(vec)->size; \ + if (cv_resize_count__ > cv_resize_sz__) { \ + cvector_reserve((vec), cv_resize_count__); \ + cvector_set_size((vec), cv_resize_count__); \ + do { \ + (vec)[cv_resize_sz__++] = (value); \ + } while (cv_resize_sz__ < cv_resize_count__); \ + } else { \ + while (cv_resize_count__ < cv_resize_sz__--) { \ + cvector_pop_back(vec); \ + } \ + } \ + } \ + } while (0) + +#endif /* CVECTOR_H_ */ diff --git a/firmware/target/hosted/ctru/lib/sys_dir.c b/firmware/target/hosted/ctru/lib/sys_dir.c new file mode 100644 index 0000000000..0b9a0300fb --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_dir.c @@ -0,0 +1,403 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#define DIRFUNCTIONS_DEFINED +#include "config.h" +#include +#include +#include "debug.h" +#include "dir.h" +#include "pathfuncs.h" +#include "timefuncs.h" +#include "system.h" +#include "fs_defines.h" +#include "sys_file.h" + +#include <3ds/archive.h> +#include <3ds/util/utf.h> + +/* This file is based on firmware/common/dir.c */ + +/* Define LOGF_ENABLE to enable logf output in this file */ +// #define LOGF_ENABLE +#include "logf.h" + +/* structure used for open directory streams */ +static struct dirstr_desc +{ + struct filestr_base stream; /* basic stream info (first!) */ + struct dirent entry; /* current parsed entry information */ +} open_streams[MAX_OPEN_DIRS] = +{ + [0 ... MAX_OPEN_FILES-1] = { .stream = { .handle = 0 } } +}; + +extern FS_Archive sdmcArchive; + +/* check and return a struct dirstr_desc* from a DIR* */ +static struct dirstr_desc * get_dirstr(DIR *dirp) +{ + struct dirstr_desc *dir = (struct dirstr_desc *)dirp; + + if (!PTR_IN_ARRAY(open_streams, dir, MAX_OPEN_DIRS)) + dir = NULL; + else if (dir->stream.handle != 0) + return dir; + + int errnum; + + if (!dir) + { + errnum = EFAULT; + } + else + { + logf("dir #%d: dir not open\n", (int)(dir - open_streams)); + errnum = EBADF; + } + + errno = errnum; + return NULL; +} + +#define GET_DIRSTR(type, dirp) \ + ({ \ + file_internal_lock_##type(); \ + struct dirstr_desc *_dir = get_dirstr(dirp); \ + if (_dir) \ + FILESTR_LOCK(type, &_dir->stream); \ + else { \ + file_internal_unlock_##type(); \ +} \ + _dir; \ + }) + +/* release the lock on the dirstr_desc* */ +#define RELEASE_DIRSTR(type, dir) \ + ({ \ + FILESTR_UNLOCK(type, &(dir)->stream); \ + file_internal_unlock_##type(); \ + }) + + +/* find a free dir stream descriptor */ +static struct dirstr_desc * alloc_dirstr(void) +{ + for (unsigned int dd = 0; dd < MAX_OPEN_DIRS; dd++) + { + struct dirstr_desc *dir = &open_streams[dd]; + if (dir->stream.handle == 0) + return dir; + } + + logf("Too many dirs open\n"); + return NULL; +} + +u32 fs_error(void) { + u32 err; + FSUSER_GetSdmcFatfsError(&err); + return err; +} + +/* Initialize the base descriptor */ +static void filestr_base_init(struct filestr_base *stream) +{ + stream->cache = nil; + stream->handle = 0; + stream->size = 0; + LightLock_Init(&stream->mtx); +} + +/** POSIX interface **/ + +/* open a directory */ +DIR * ctru_opendir(const char *dirname) +{ + logf("opendir(dirname=\"%s\")\n", dirname); + + DIR *dirp = NULL; + file_internal_lock_WRITER(); + + int rc; + + struct dirstr_desc * const dir = alloc_dirstr(); + if (!dir) + FILE_ERROR(EMFILE, _RC); + + filestr_base_init(&dir->stream); + Result res = FSUSER_OpenDirectory(&dir->stream.handle, + sdmcArchive, + fsMakePath(PATH_ASCII, dirname)); + if (R_FAILED(res)) { + logf("Open failed: %lld\n", fs_error()); + FILE_ERROR(EMFILE, -1); + } + + dir->stream.size = 0; + dir->stream.flags = 0; + + /* we will use file path to implement ctru_samedir function */ + strcpy(dir->stream.path, dirname); + + dirp = (DIR *)dir; +file_error: + file_internal_unlock_WRITER(); + return dirp; +} + +/* close a directory stream */ +int ctru_closedir(DIR *dirp) +{ + int rc; + + file_internal_lock_WRITER(); + + /* needs to work even if marked "nonexistant" */ + struct dirstr_desc * const dir = (struct dirstr_desc *)dirp; + if (!PTR_IN_ARRAY(open_streams, dir, MAX_OPEN_DIRS)) + FILE_ERROR(EFAULT, -1); + + logf("closedir(dirname=\"%s\")\n", dir->stream.path); + + if (dir->stream.handle == 0) + { + logf("dir #%d: dir not open\n", (int)(dir - open_streams)); + FILE_ERROR(EBADF, -2); + } + + Result res = FSDIR_Close(dir->stream.handle); + if (R_FAILED(res)) + FILE_ERROR(ERRNO, -3); + + dir->stream.handle = 0; + dir->stream.path[0] = '\0'; + + rc = 0; +file_error: + file_internal_unlock_WRITER(); + return rc; +} + +void dirstr_entry_init(FS_DirectoryEntry *dirEntry, struct dirent *entry) +{ + /* clear */ + memset(entry, 0, sizeof(struct dirent)); + + /* attributes */ + if (dirEntry->attributes & FS_ATTRIBUTE_DIRECTORY) + entry->info.attr |= ATTR_DIRECTORY; + if (dirEntry->attributes & FS_ATTRIBUTE_HIDDEN) + entry->info.attr |= ATTR_HIDDEN; + if (dirEntry->attributes & FS_ATTRIBUTE_ARCHIVE) + entry->info.attr |= ATTR_ARCHIVE; + if (dirEntry->attributes & FS_ATTRIBUTE_READ_ONLY) + entry->info.attr |= ATTR_READ_ONLY; + + /* size */ + entry->info.size = dirEntry->fileSize; + + /* name */ + uint8_t d_name[0xA0 + 1]; + memset(d_name, '\0', 0xA0); + utf16_to_utf8(d_name, (uint16_t *) &dirEntry->name, 0xA0); + memcpy(entry->d_name, d_name, 0xA0); +} + +/* read a directory */ +struct dirent * ctru_readdir(DIR *dirp) +{ + struct dirstr_desc * const dir = GET_DIRSTR(READER, dirp); + if (!dir) + FILE_ERROR_RETURN(ERRNO, NULL); + + int rc; + struct dirent *res = NULL; + + logf("readdir(dirname=\"%s\")\n", dir->stream.path); + + u32 dataRead = 0; + FS_DirectoryEntry dirEntry; + Result result = FSDIR_Read(dir->stream.handle, + &dataRead, + 1, + &dirEntry); + if (R_FAILED(result)) + FILE_ERROR(EIO, _RC); + + if (dataRead == 0) { + /* directory end. return NULL value, no errno */ + res = NULL; + goto file_error; + } + + res = &dir->entry; + dirstr_entry_init(&dirEntry, res); + + /* time */ + char full_path[MAX_PATH+1]; + + if (!strcmp(PATH_ROOTSTR, dir->stream.path)) + snprintf(full_path, MAX_PATH, "%s%s", dir->stream.path, res->d_name); + else + snprintf(full_path, MAX_PATH, "%s/%s", dir->stream.path, res->d_name); + + u64 mtime; + archive_getmtime(full_path, &mtime); + + /* DEBUGF("archive_getmtime(%s): %lld\n", full_path, mtime); */ + + uint16_t dosdate, dostime; + dostime_localtime(mtime, &dosdate, &dostime); + res->info.wrtdate = dosdate; + res->info.wrttime = dostime; + +file_error: + RELEASE_DIRSTR(READER, dir); + return res; +} + +/* make a directory */ +int ctru_mkdir(const char *path) +{ + logf("mkdir(path=\"%s\")\n", path); + + int rc; + + file_internal_lock_WRITER(); + + Result res = FSUSER_CreateDirectory(sdmcArchive, + fsMakePath(PATH_ASCII, path), + 0); + if (R_FAILED(res)) + FILE_ERROR(ERRNO, -1); + + rc = 0; +file_error: + file_internal_unlock_WRITER(); + return rc; +} + +/* remove a directory */ +int ctru_rmdir(const char *name) +{ + logf("rmdir(name=\"%s\")\n", name); + + int rc; + + if (name) + { + /* path may not end with "." */ + const char *basename; + size_t len = path_basename(name, &basename); + if (basename[0] == '.' && len == 1) + { + logf("Invalid path; last component is \".\"\n"); + FILE_ERROR_RETURN(EINVAL, -9); + } + } + + file_internal_lock_WRITER(); + Result res = FSUSER_DeleteDirectory(sdmcArchive, + fsMakePath(PATH_ASCII, name)); + if (R_FAILED(res)) + FILE_ERROR(ERRNO, -1); + + rc = 0; +file_error: + file_internal_unlock_WRITER(); + return rc; +} + + +/** Extended interface **/ + +/* return if two directory streams refer to the same directory */ +int ctru_samedir(DIR *dirp1, DIR *dirp2) +{ + struct dirstr_desc * const dir1 = GET_DIRSTR(WRITER, dirp1); + if (!dir1) + FILE_ERROR_RETURN(ERRNO, -1); + + int rc = -2; + + struct dirstr_desc * const dir2 = get_dirstr(dirp2); + if (dir2) { + rc = strcmp(dir1->stream.path, dir2->stream.path) == 0 ? 1 : 0; + } + + RELEASE_DIRSTR(WRITER, dir1); + return rc; +} + +/* test directory existence (returns 'false' if a file) */ +bool ctru_dir_exists(const char *dirname) +{ + file_internal_lock_WRITER(); + + int rc; + + Handle handle; + Result res = FSUSER_OpenDirectory(&handle, + sdmcArchive, + fsMakePath(PATH_ASCII, dirname)); + if (R_FAILED(res)) { + logf("Directory not found: %ld\n", fs_error()); + FILE_ERROR(EMFILE, -1); + } + + rc = 0; +file_error: + if (rc == 0) { + FSDIR_Close(handle); + } + file_internal_unlock_WRITER(); + return rc == 0 ? true : false; +} + +/* get the portable info from the native entry */ +struct dirinfo dir_get_info(DIR *dirp, struct dirent *entry) +{ + int rc; + if (!dirp || !entry) + FILE_ERROR(EFAULT, _RC); + + if (entry->d_name[0] == '\0') + FILE_ERROR(ENOENT, _RC); + + if ((file_size_t)entry->info.size > FILE_SIZE_MAX) + FILE_ERROR(EOVERFLOW, _RC); + + return (struct dirinfo) + { + .attribute = entry->info.attr, + .size = entry->info.size, + .mtime = dostime_mktime(entry->info.wrtdate, entry->info.wrttime), + }; + +file_error: + return (struct dirinfo){ .attribute = 0 }; +} + +const char* ctru_root_realpath(void) +{ + /* Native only, for APP and SIM see respective filesystem-.c files */ + return PATH_ROOTSTR; /* rb_namespace.c */ +} diff --git a/firmware/target/hosted/ctru/lib/sys_file.c b/firmware/target/hosted/ctru/lib/sys_file.c new file mode 100644 index 0000000000..1df88282d6 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_file.c @@ -0,0 +1,777 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#define RB_FILESYSTEM_OS +#include "config.h" +#include "system.h" +#include +#include +#include +#include +#include +#include "file.h" +#include "debug.h" +#include "string-extra.h" +#include "fs_defines.h" +#include "sys_file.h" + +/* This file is based on firmware/common/file.c */ + +/* Define LOGF_ENABLE to enable logf output in this file */ +// #define LOGF_ENABLE +#include "logf.h" + +/** + * These functions provide a roughly POSIX-compatible file I/O API. + * Important: the bufferio I/O library (bfile) used in the 3ds does not work + * with write-only files due to an internal limitation. + * So all files will be opened with the read flag by default. + */ + +/* structure used for open file descriptors */ +static struct filestr_desc +{ + struct filestr_base stream; /* basic stream info (first!) */ + file_size_t offset; /* current offset for stream */ + u64 *sizep; /* shortcut to file size in fileobj */ +} open_streams[MAX_OPEN_FILES] = +{ + [0 ... MAX_OPEN_FILES-1] = { .stream = { .cache = nil, .flags = 0 } } +}; + +extern FS_Archive sdmcArchive; + +/* check and return a struct filestr_desc* from a file descriptor number */ +static struct filestr_desc * get_filestr(int fildes) +{ + struct filestr_desc *file = &open_streams[fildes]; + + if ((unsigned int)fildes >= MAX_OPEN_FILES) + file = NULL; + else if (file->stream.cache != nil) + return file; + + logf("fildes %d: bad file number\n", fildes); + errno = (file && (file->stream.cache == nil)) ? ENXIO : EBADF; + return NULL; +} + +#define GET_FILESTR(type, fildes) \ + ({ \ + file_internal_lock_##type(); \ + struct filestr_desc * _file = get_filestr(fildes); \ + if (_file) \ + FILESTR_LOCK(type, &_file->stream); \ + else { \ + file_internal_unlock_##type(); \ + }\ + _file; \ + }) + +/* release the lock on the filestr_desc* */ +#define RELEASE_FILESTR(type, file) \ + ({ \ + FILESTR_UNLOCK(type, &(file)->stream); \ + file_internal_unlock_##type(); \ + }) + +/* find a free file descriptor */ +static int alloc_filestr(struct filestr_desc **filep) +{ + for (int fildes = 0; fildes < MAX_OPEN_FILES; fildes++) + { + struct filestr_desc *file = &open_streams[fildes]; + if (file->stream.cache == nil) + { + *filep = file; + return fildes; + } + } + + logf("Too many files open\n"); + return -1; +} + +/* check for file existence */ +int test_stream_exists_internal(const char *path) +{ + int rc; + bool is_dir = false; + + Handle handle; + Result res = FSUSER_OpenFile(&handle, + sdmcArchive, + fsMakePath(PATH_ASCII, path), + FS_OPEN_READ, + 0); + if (R_FAILED(res)) { + /* not a file, try to open a directory */ + res = FSUSER_OpenDirectory(&handle, + sdmcArchive, + fsMakePath(PATH_ASCII, path)); + if (R_FAILED(res)) { + logf("File does not exist\n"); + FILE_ERROR(ERRNO, -1); + } + + is_dir = true; + } + + rc = 1; +file_error: + if (handle > 0) { + if (is_dir) + FSDIR_Close(handle); + else + FSFILE_Close(handle); + } + + return rc; +} + +/* set the file pointer */ +static off_t lseek_internal(struct filestr_desc *file, off_t offset, + int whence) +{ + off_t rc; + off_t pos; + + off_t size = MIN(*file->sizep, FILE_SIZE_MAX); + off_t file_offset = AtomicLoad(&file->offset); + + switch (whence) + { + case SEEK_SET: + if (offset < 0 || (off_t)offset > size) + FILE_ERROR(EINVAL, -1); + + pos = offset; + break; + + case SEEK_CUR: + if ((offset < 0 && (off_t)-offset > file_offset) || + (offset > 0 && (off_t)offset > size - file_offset)) + FILE_ERROR(EINVAL, -1); + + pos = file_offset + offset; + break; + + case SEEK_END: + if (offset > 0 || (off_t)-offset > size) + FILE_ERROR(EINVAL, -1); + + pos = size + offset; + break; + + default: + FILE_ERROR(EINVAL, -1); + } + + AtomicSwap(&file->offset, pos); + + return pos; +file_error: + return rc; +} + +/* read from or write to the file; back end to read() and write() */ +static ssize_t readwrite(struct filestr_desc *file, void *buf, size_t nbyte, + bool write) +{ +#ifndef LOGF_ENABLE /* wipes out log before you can save it */ + /* DEBUGF("readwrite(%p,%lx,%lu,%s)\n", + file, (long)buf, (unsigned long)nbyte, write ? "write" : "read"); */ +#endif + + const file_size_t size = *file->sizep; + size_t filerem; + + if (write) + { + /* if opened in append mode, move pointer to end */ + if (file->stream.flags & O_APPEND) + AtomicSwap(&file->offset, MIN(size, FILE_SIZE_MAX)); + + filerem = FILE_SIZE_MAX - AtomicLoad(&file->offset); + } + else + { + /* limit to maximum possible offset (EOF or FILE_SIZE_MAX) */ + filerem = MIN(size, FILE_SIZE_MAX) - AtomicLoad(&file->offset); + } + + if (nbyte > filerem) + { + nbyte = filerem; + if (nbyte > 0) + {} + else if (write) + FILE_ERROR_RETURN(EFBIG, -1); /* would get too large */ + else if (AtomicLoad(&file->offset) >= FILE_SIZE_MAX) + FILE_ERROR_RETURN(EOVERFLOW, -2); /* can't read here */ + } + + if (nbyte == 0) + return 0; + + int rc = 0; + int_error_t n_err; + + if (write) + n_err = PagerWriteAt(file->stream.cache, (u8 *) buf, nbyte, AtomicLoad(&file->offset)); + else + n_err = PagerReadAt(file->stream.cache, (u8 *) buf, nbyte, AtomicLoad(&file->offset)); + + if ((n_err.err != nil) && strcmp(n_err.err, "io.EOF")) { + FILE_ERROR(ERRNO, -3); + } + +file_error:; +#ifdef DEBUG + if (errno == ENOSPC) + logf("No space left on device\n"); +#endif + + size_t done = n_err.n; + if (done) + { + /* error or not, update the file offset and size if anything was + transferred */ + AtomicAdd(&file->offset, done); +#ifndef LOGF_ENABLE /* wipes out log before you can save it */ + /* DEBUGF("file offset: %lld\n", file->offset); */ +#endif + /* adjust file size to length written */ + if (write && AtomicLoad(&file->offset) > size) + *file->sizep = AtomicLoad(&file->offset); + + return done; + } + + return rc; +} + +/* initialize the base descriptor */ +static void filestr_base_init(struct filestr_base *stream) +{ + stream->cache = nil; + stream->handle = 0; + stream->size = 0; + LightLock_Init(&stream->mtx); +} + +int open_internal_inner2(Handle *handle, const char *path, u32 openFlags, u32 attributes) +{ + int rc; + Result res = FSUSER_OpenFile(handle, + sdmcArchive, + fsMakePath(PATH_ASCII, path), + openFlags, + attributes); + if (R_FAILED(res)) { + FILE_ERROR(ERRNO, -1); + } + + rc = 1; +file_error: + return rc; +} + +static int open_internal_inner1(const char *path, int oflag) +{ + int rc; + struct filestr_desc *file; + int fildes = alloc_filestr(&file); + if (fildes < 0) + FILE_ERROR_RETURN(EMFILE, -1); + + u32 openFlags = 0, attributes = 0; + + /* open for reading by default */ + openFlags = FS_OPEN_READ; + + if (oflag & O_ACCMODE) + { + if ((oflag & O_ACCMODE) == O_RDONLY) { + attributes |= FS_ATTRIBUTE_READ_ONLY; + } + if ((oflag & O_ACCMODE) == O_WRONLY) { + openFlags |= FS_OPEN_WRITE; + } + if ((oflag & O_ACCMODE) == O_RDWR) { + openFlags |= FS_OPEN_WRITE; + } + } + else if (oflag & O_TRUNC) + { + /* O_TRUNC requires write mode */ + logf("No write mode but have O_TRUNC\n"); + FILE_ERROR(EINVAL, -2); + } + + /* O_CREAT and O_APPEND are fine without write mode + * for the former, an empty file is created but no data may be written + * for the latter, no append will be allowed anyway */ + if (!(oflag & O_CREAT)) + oflag &= ~O_EXCL; /* result is undefined: we choose "ignore" */ + + filestr_base_init(&file->stream); + rc = open_internal_inner2(&file->stream.handle, path, openFlags, attributes); + + if (rc > 0) { + if (oflag & O_EXCL) + { + logf("File exists\n"); + FILE_ERROR(EEXIST, -4); + } + } + else if (oflag & O_CREAT) + { + /* not found; try to create it */ + openFlags |= FS_OPEN_CREATE; + rc = open_internal_inner2(&file->stream.handle, path, openFlags, attributes); + if (rc < 0) + FILE_ERROR(ERRNO, rc * 10 - 6); + } + else + { + logf("File not found\n"); + FILE_ERROR(ENOENT, -5); + } + + /* truncate file if requested */ + if (oflag & O_TRUNC) { + Result res = FSFILE_SetSize(file->stream.handle, 0); + if (R_FAILED(res)) { + FILE_ERROR(ERRNO, -6); + } + } + + /* we need to set file size here, or else lseek + will fail if no read or write has been done */ + u64 size = 0; + Result res = FSFILE_GetSize(file->stream.handle, &size); + if (R_FAILED(res)) { + FILE_ERROR(ERRNO, -8); + } + + int pageSize = 4096; /* 4096 bytes */ + int bufferSize = 512 * 1024; /* 512 kB */ + + /* streamed file formats like flac and mp3 need very large page + sizes to avoid stuttering */ + if (((oflag & O_ACCMODE) == O_RDONLY) && (size > 0x200000)) { + /* printf("open(%s)_BIG_pageSize\n", path); */ + pageSize = 32 * 1024; + bufferSize = MIN(size, defaultBufferSize); + } + + file->stream.cache = NewPagerSize(file->stream.handle, + pageSize, + bufferSize); + if (file->stream.cache == nil) { + FILE_ERROR(ERRNO, -7); + } + + file->stream.flags = oflag; + file->stream.size = size; + file->sizep = &file->stream.size; + AtomicSwap(&file->offset, 0); + + /* we will use file path to implement ctru_fsamefile function */ + strcpy(file->stream.path, path); + + return fildes; + +file_error: + if (fildes >= 0) { + if (file->stream.cache != nil) { + PagerFlush(file->stream.cache); + PagerClear(file->stream.cache); + file->stream.cache = nil; + } + + FSFILE_Close(file->stream.handle); + file->stream.handle = 0; + } + + return rc; +} + +static int open_internal_locked(const char *path, int oflag) +{ + file_internal_lock_WRITER(); + int rc = open_internal_inner1(path, oflag); + file_internal_unlock_WRITER(); + return rc; +} + +int ctru_open(const char *path, int oflag, ...) +{ + logf("open(path=\"%s\",oflag=%X)\n", path, (unsigned)oflag); + return open_internal_locked(path, oflag); +} + +int ctru_creat(const char *path, mode_t mode) +{ + logf("creat(path=\"%s\")\n", path); + return ctru_open(path, O_WRONLY|O_CREAT|O_TRUNC, mode); +} + +int ctru_close(int fildes) +{ + logf("close(fd=%d)\n", fildes); + + int rc; + + file_internal_lock_WRITER(); + + /* needs to work even if marked "nonexistant" */ + struct filestr_desc *file = &open_streams[fildes]; + if ((unsigned int)fildes >= MAX_OPEN_FILES || (file->stream.cache == nil)) + { + logf("filedes %d not open\n", fildes); + FILE_ERROR(EBADF, -2); + } + + if (file->stream.cache != nil) { + PagerFlush(file->stream.cache); + PagerClear(file->stream.cache); + file->stream.cache = nil; + } + + FSFILE_Close(file->stream.handle); + file->stream.handle = 0; + file->stream.path[0] = '\0'; + + rc = 0; +file_error: + file_internal_unlock_WRITER(); + return rc; +} + +/* truncate a file to a specified length */ +int ctru_ftruncate(int fildes, off_t length) +{ + logf("ftruncate(fd=%d,len=%ld)\n", fildes, (long)length); + + struct filestr_desc * const file = GET_FILESTR(READER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + int rc; + + if (file->stream.flags & O_RDONLY) + { + logf("Descriptor is read-only mode\n"); + FILE_ERROR(EBADF, -2); + } + + if (length < 0) + { + logf("Length %ld is invalid\n", (long)length); + FILE_ERROR(EINVAL, -3); + } + + file_error_t err = PagerTruncate(file->stream.cache, length); + if (err) { + FILE_ERROR(ERRNO, -11); + } + + *file->sizep = length; + + rc = 0; +file_error: + RELEASE_FILESTR(READER, file); + return rc; +} + +/* synchronize changes to a file */ +int ctru_fsync(int fildes) +{ + logf("fsync(fd=%d)\n", fildes); + + struct filestr_desc * const file = GET_FILESTR(WRITER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + int rc; + + if (file->stream.flags & O_RDONLY) + { + logf("Descriptor is read-only mode\n"); + FILE_ERROR(EINVAL, -2); + } + + /* flush all pending changes to disk */ + file_error_t err = PagerFlush(file->stream.cache); + if (err != nil) { + FILE_ERROR(ERRNO, -3); + } + + rc = 0; +file_error: + RELEASE_FILESTR(WRITER, file); + return rc; +} + +/* move the read/write file offset */ +off_t ctru_lseek(int fildes, off_t offset, int whence) +{ +#ifndef LOGF_ENABLE /* wipes out log before you can save it */ + /* DEBUGF("lseek(fd=%d,ofs=%ld,wh=%d)\n", fildes, (long)offset, whence); */ +#endif + struct filestr_desc * const file = GET_FILESTR(READER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + off_t rc = lseek_internal(file, offset, whence); + if (rc < 0) + FILE_ERROR(ERRNO, rc * 10 - 2); + +file_error: + RELEASE_FILESTR(READER, file); + return rc; +} + +/* read from a file */ +ssize_t ctru_read(int fildes, void *buf, size_t nbyte) +{ + struct filestr_desc * const file = GET_FILESTR(READER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + ssize_t rc; + + if (file->stream.flags & O_WRONLY) + { + logf("read(fd=%d,buf=%p,nb=%lu) - " + "descriptor is write-only mode\n", + fildes, buf, (unsigned long)nbyte); + FILE_ERROR(EBADF, -2); + } + + rc = readwrite(file, buf, nbyte, false); + if (rc < 0) + FILE_ERROR(ERRNO, rc * 10 - 3); + +file_error: + RELEASE_FILESTR(READER, file); + return rc; +} + +/* write on a file */ +ssize_t ctru_write(int fildes, const void *buf, size_t nbyte) +{ + struct filestr_desc * const file = GET_FILESTR(READER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + ssize_t rc; + + if (file->stream.flags & O_RDONLY) + { + logf("write(fd=%d,buf=%p,nb=%lu) - " + "descriptor is read-only mode\n", + fildes, buf, (unsigned long)nbyte); + FILE_ERROR(EBADF, -2); + } + + rc = readwrite(file, (void *)buf, nbyte, true); + if (rc < 0) + FILE_ERROR(ERRNO, rc * 10 - 3); + +file_error: + RELEASE_FILESTR(READER, file); + return rc; +} + +/* remove a file */ +int ctru_remove(const char *path) +{ + logf("remove(path=\"%s\")\n", path); + + int rc; + + file_internal_lock_WRITER(); + Result res = FSUSER_DeleteFile(sdmcArchive, + fsMakePath(PATH_ASCII, path)); + if (R_FAILED(res)) + FILE_ERROR(ERRNO, -1); + + rc = 0; +file_error: + file_internal_unlock_WRITER(); + return rc; +} + +/* rename a file */ +int ctru_rename(const char *old, const char *new) +{ + /* note: move by rename does not work in devkitARM toolchain */ + logf("rename(old=\"%s\",new=\"%s\")\n", old, new); + + int rc; + + /* if 'old' is a directory then 'new' is also required to be one if 'new' + is to be overwritten */ + bool are_dirs = false; + + file_internal_lock_WRITER(); + + if (!strcmp(new, old)) /* case-only is ok */ + { + logf("No name change (success)\n"); + rc = 0; + FILE_ERROR(ERRNO, _RC); + } + + /* open 'old'; it must exist */ + Handle open1rc; + Result res = FSUSER_OpenFile(&open1rc, + sdmcArchive, + fsMakePath(PATH_ASCII, old), + FS_OPEN_READ, + 0); + if (R_FAILED(res)) { + /* not a file, try to open a directory */ + res = FSUSER_OpenDirectory(&open1rc, + sdmcArchive, + fsMakePath(PATH_ASCII, old)); + if (R_FAILED(res)) { + logf("Failed opening old\n"); + FILE_ERROR(ERRNO, -1); + } + + are_dirs = true; + } + + if (are_dirs) { + /* rename directory */ + FSUSER_RenameDirectory(sdmcArchive, + fsMakePath(PATH_ASCII, old), + sdmcArchive, + fsMakePath(PATH_ASCII, new)); + } + else { + /* rename file */ + FSUSER_RenameFile(sdmcArchive, + fsMakePath(PATH_ASCII, old), + sdmcArchive, + fsMakePath(PATH_ASCII, new)); + } + + if (R_FAILED(res)) { + logf("Rename failed\n"); + FILE_ERROR(ERRNO, -2); + } + + rc = 0; +file_error: + /* for now, there is nothing to fail upon closing the old stream */ + if (open1rc > 0) { + if (are_dirs) + FSDIR_Close(open1rc); + else + FSFILE_Close(open1rc); + } + + file_internal_unlock_WRITER(); + return rc; +} + +/** Extensions **/ + +/* todo: utime does not work in devkitARM toolchain */ +int ctru_modtime(const char *path, time_t modtime) +{ + struct utimbuf times = + { + .actime = modtime, + .modtime = modtime, + }; + + return utime(path, ×); +} + +/* get the binary size of a file (in bytes) */ +off_t ctru_filesize(int fildes) +{ + struct filestr_desc * const file = GET_FILESTR(READER, fildes); + if (!file) + FILE_ERROR_RETURN(ERRNO, -1); + + off_t rc; + file_size_t size = *file->sizep; + + if (size > FILE_SIZE_MAX) + FILE_ERROR(EOVERFLOW, -2); + + rc = (off_t)size; +file_error: + RELEASE_FILESTR(READER, file); + return rc; +} + +/* test if two file descriptors refer to the same file */ +int ctru_fsamefile(int fildes1, int fildes2) +{ + struct filestr_desc * const file1 = GET_FILESTR(WRITER, fildes1); + if (!file1) + FILE_ERROR_RETURN(ERRNO, -1); + + int rc = -2; + + struct filestr_desc * const file2 = get_filestr(fildes2); + if (file2) + rc = strcmp(file1->stream.path, file2->stream.path) == 0 ? 1 : 0; + + RELEASE_FILESTR(WRITER, file1); + return rc; +} + +/* tell the relationship of path1 to path2 */ +int ctru_relate(const char *path1, const char *path2) +{ + /* FAT32 file system does not support symbolic links, + therefore, comparing the two full paths should be enough + to tell relationship */ + logf("relate(path1=\"%s\",path2=\"%s\")\n", path1, path2); + int rc = RELATE_DIFFERENT; + if (strcmp(path1, path2) == 0) + rc = RELATE_SAME; + return rc; +} + +/* test file or directory existence */ +bool ctru_file_exists(const char *path) +{ + file_internal_lock_WRITER(); + bool rc = test_stream_exists_internal(path) > 0; + file_internal_unlock_WRITER(); + return rc; +} + +/* note: no symbolic links support in devkitARM */ +ssize_t ctru_readlink(const char *path, char *buf, size_t bufsiz) +{ + return readlink(path, buf, bufsiz); +} + diff --git a/firmware/target/hosted/ctru/lib/sys_file.h b/firmware/target/hosted/ctru/lib/sys_file.h new file mode 100644 index 0000000000..cfed6017fc --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_file.h @@ -0,0 +1,129 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 by Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _SYS_FILE_H +#define _SYS_FILE_H + +#include "bfile.h" + +/* Include for file.h and dir.h because mkdir and friends may be here */ +#include + +#define strlcpy_from_os strlcpy + +#define AtomicLoad(ptr) __atomic_load_n((u32*)(ptr), __ATOMIC_SEQ_CST) +#define AtomicAdd(ptr, value) __atomic_add_fetch((u32*)(ptr), value, __ATOMIC_SEQ_CST) + +struct filestr_base { + Pager* cache; /* buffer IO implementation (cache) */ + Handle handle; /* file handle */ + u64 size; /* file size */ + int flags; /* stream flags */ + char path[MAX_PATH+1]; + + LightLock mtx; /* serialization for this stream */ +}; + +static inline void filestr_lock(struct filestr_base *stream) +{ + LightLock_Lock(&stream->mtx); +} + +static inline void filestr_unlock(struct filestr_base *stream) +{ + LightLock_Unlock(&stream->mtx); +} + +/* stream lock doesn't have to be used if getting RW lock writer access */ +#define FILESTR_WRITER 0 +#define FILESTR_READER 1 + +#define FILESTR_LOCK(type, stream) \ + ({ if (FILESTR_##type) filestr_lock(stream); }) + +#define FILESTR_UNLOCK(type, stream) \ + ({ if (FILESTR_##type) filestr_unlock(stream); }) + +/** Synchronization used throughout **/ + +/* acquire the filesystem lock as READER */ +static inline void file_internal_lock_READER(void) +{ + extern sync_RWMutex file_internal_mrsw; + sync_RWMutexRLock(&file_internal_mrsw); +} + +/* release the filesystem lock as READER */ +static inline void file_internal_unlock_READER(void) +{ + extern sync_RWMutex file_internal_mrsw; + sync_RWMutexRUnlock(&file_internal_mrsw); +} + +/* acquire the filesystem lock as WRITER */ +static inline void file_internal_lock_WRITER(void) +{ + extern sync_RWMutex file_internal_mrsw; + sync_RWMutexLock(&file_internal_mrsw); +} + +/* release the filesystem lock as WRITER */ +static inline void file_internal_unlock_WRITER(void) +{ + extern sync_RWMutex file_internal_mrsw; + sync_RWMutexUnlock(&file_internal_mrsw); +} + +#define ERRNO 0 /* maintain errno value */ +#define _RC 0 /* maintain rc value */ + +/* NOTES: if _errno is a non-constant expression, it must set an error + * number and not return the ERRNO constant which will merely set + * errno to zero, not preserve the current value; if you must set + * errno to zero, set it explicitly, not in the macro + * + * if _rc is constant-expression evaluation to 'RC', then rc will + * NOT be altered; i.e. if you must set rc to zero, set it explicitly, + * not in the macro + */ + +#define FILE_SET_CODE(_name, _keepcode, _value) \ + ({ __builtin_constant_p(_value) ? \ + ({ if ((_value) != (_keepcode)) _name = (_value); }) : \ + ({ _name = (_value); }); }) + +/* set errno and rc and proceed to the "file_error:" label */ +#define FILE_ERROR(_errno, _rc) \ + ({ FILE_SET_CODE(errno, ERRNO, (_errno)); \ + FILE_SET_CODE(rc, _RC, (_rc)); \ + goto file_error; }) + +/* set errno and return a value at the point of invocation */ +#define FILE_ERROR_RETURN(_errno, _rc...) \ + ({ FILE_SET_CODE(errno, ERRNO, _errno); \ + return _rc; }) + +/* set errno and return code, no branching */ +#define FILE_ERROR_SET(_errno, _rc) \ + ({ FILE_SET_CODE(errno, ERRNO, (_errno)); \ + FILE_SET_CODE(rc, _RC, (_rc)); }) + +#endif /* _SYS_FILE_H */ + diff --git a/firmware/target/hosted/ctru/lib/sys_thread.c b/firmware/target/hosted/ctru/lib/sys_thread.c new file mode 100644 index 0000000000..4d6ba2ff99 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_thread.c @@ -0,0 +1,403 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio Ga. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "sys_thread.h" +#include "sys_timer.h" +#include "debug.h" +#include "logf.h" + +bool _AtomicCAS(u32 *ptr, int oldval, int newval) +{ + int expected = oldval; + int desired = newval; + return __atomic_compare_exchange(ptr, &expected, &desired, false, + __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); +} + +bool _AtomicTryLock(int *lock) +{ + int result; + asm volatile( + "ldrex %0, [%2] \n" + "teq %0, #0 \n" + "strexeq %0, %1, [%2] \n" + : "=&r"(result) + : "r"(1), "r"(lock) + : "cc", "memory" + ); + return result == 0; +} + +#define CPUPauseInstruction() asm volatile("yield" ::: "memory") +void AtomicLock(int *lock) +{ + int iterations = 0; + while (!_AtomicTryLock(lock)) { + if (iterations < 32) { + iterations++; + CPUPauseInstruction(); + } else { + sys_delay(0); + } + } +} + +void AtomicUnlock(int *lock) +{ + *lock = 0; +} + +/* Convert rockbox priority value to libctru value */ +int get_ctru_thread_priority(int priority) +{ + if ((priority == PRIORITY_REALTIME_1) || (priority == PRIORITY_REALTIME_2) || + (priority == PRIORITY_REALTIME_3) || (priority == PRIORITY_REALTIME_4) || + (priority == PRIORITY_REALTIME)) + return 0x18; + else if (priority == PRIORITY_BUFFERING) + return 0x18; /* Highest */ + else if ((priority == PRIORITY_USER_INTERFACE) || (priority == PRIORITY_RECORDING) || + (priority == PRIORITY_PLAYBACK)) + return 0x30; + else if (priority == PRIORITY_PLAYBACK_MAX) + return 0x2F; + else if (priority == PRIORITY_SYSTEM) + return 0x30; + else if (priority == PRIORITY_BACKGROUND) + return 0x3F; /* Lowest */ + else + return 0x30; +} + +static size_t get_thread_stack_size(size_t requested_size) +{ + if (requested_size == 0) { + return (80 * 1024); /* 80 kB */ + } + + return requested_size; +} + +static void thread_entry(void *arg) +{ + sys_run_thread((sysThread *)arg); + threadExit(0); +} + +int wait_on_semaphore_for(LightSemaphore *sem, u32 timeout) +{ + u64 stop_time = sys_get_ticks64() + timeout; + u64 current_time = sys_get_ticks64(); + while (current_time < stop_time) { + if (LightSemaphore_TryAcquire(sem, 1) == 0) { + return 0; + } + /* 100 microseconds seems to be the sweet spot */ + svcSleepThread(100000LL); + current_time = sys_get_ticks64(); + } + + /* If we failed, yield to avoid starvation on busy waits */ + svcSleepThread(1); + return 1; +} + +int sys_sem_try_wait(LightSemaphore *sem) +{ + if (LightSemaphore_TryAcquire(sem, 1) != 0) { + /* If we failed, yield to avoid starvation on busy waits */ + svcSleepThread(1); + return 1; + } + + return 0; +} + +int sys_sem_wait_timeout(LightSemaphore *sem, u32 timeout) +{ + if (timeout == (~(u32)0)) { + LightSemaphore_Acquire(sem, 1); + return 0; + } + + if (LightSemaphore_TryAcquire(sem, 1) != 0) { + return wait_on_semaphore_for(sem, timeout); + } + + return 0; +} + +int sys_sem_wait(LightSemaphore *sem) +{ + return sys_sem_wait_timeout(sem, (~(u32)0)); +} + +u32 sys_sem_value(LightSemaphore *sem) +{ + return sem->current_count; +} + +int sys_thread_id(void) +{ + u32 thread_ID = 0; + svcGetThreadId(&thread_ID, CUR_THREAD_HANDLE); + return (int)thread_ID; +} + +void sys_run_thread(sysThread *thread) +{ + void *userdata = thread->userdata; + int(* userfunc)(void *) = thread->userfunc; + + int *statusloc = &thread->status; + + /* Get the thread id */ + thread->threadid = sys_thread_id(); + + /* Run the function */ + *statusloc = userfunc(userdata); + + /* Mark us as ready to be joined (or detached) */ + if (!AtomicCAS(&thread->state, THREAD_STATE_ALIVE, THREAD_STATE_ZOMBIE)) { + /* Clean up if something already detached us. */ + if (AtomicCAS(&thread->state, THREAD_STATE_DETACHED, THREAD_STATE_CLEANED)) { + free(thread); + } + } +} + +sysThread *sys_create_thread(int(*fn)(void *), const char *name, const size_t stacksize, + void *data IF_PRIO(, int priority) IF_COP(, unsigned int core)) +{ + sys_ticks_init(); + + /* Allocate memory for the thread info structure */ + sysThread *thread = (sysThread *) calloc(1, sizeof(sysThread)); + if (thread == NULL) { + DEBUGF("sys_create_thread: could not allocate memory\n"); + return NULL; + } + thread->status = -1; + AtomicSet(&thread->state, THREAD_STATE_ALIVE); + + /* Set up the arguments for the thread */ + thread->userfunc = fn; + thread->userdata = data; + thread->stacksize = stacksize; + + int cpu = -1; + if (name && (strncmp(name, "tagcache", 8) == 0) && R_SUCCEEDED(APT_SetAppCpuTimeLimit(30))) { + cpu = 1; + printf("thread: %s, running in cpu 1\n", name); + } + + thread->handle = threadCreate(thread_entry, + thread, + get_thread_stack_size(stacksize), + get_ctru_thread_priority(priority), + cpu, + false); + + if (!thread->handle) { + DEBUGF("sys_create_thread: threadCreate failed\n"); + free(thread); + thread = NULL; + } + + /* Everything is running now */ + return thread; +} + +void sys_wait_thread(sysThread *thread, int *status) +{ + if (thread) { + Result res = threadJoin(thread->handle, U64_MAX); + + /* + Detached threads can be waited on, but should NOT be cleaned manually + as it would result in a fatal error. + */ + if (R_SUCCEEDED(res) && AtomicGet(&thread->state) != THREAD_STATE_DETACHED) { + threadFree(thread->handle); + } + if (status) { + *status = thread->status; + } + free(thread); + } +} + +void sys_detach_thread(sysThread *thread) +{ + if (!thread) { + return; + } + + /* Grab dibs if the state is alive+joinable. */ + if (AtomicCAS(&thread->state, THREAD_STATE_ALIVE, THREAD_STATE_DETACHED)) { + threadDetach(thread->handle); + } else { + /* all other states are pretty final, see where we landed. */ + const int thread_state = AtomicGet(&thread->state); + if ((thread_state == THREAD_STATE_DETACHED) || (thread_state == THREAD_STATE_CLEANED)) { + return; /* already detached (you shouldn't call this twice!) */ + } else if (thread_state == THREAD_STATE_ZOMBIE) { + sys_wait_thread(thread, NULL); /* already done, clean it up. */ + } else { + assert(0 && "Unexpected thread state"); + } + } +} + +int sys_set_thread_priority(sysThread *thread, int priority) +{ + Handle h = threadGetHandle(thread->handle); + int old_priority = priority; + Result res = svcSetThreadPriority(h, get_ctru_thread_priority(priority)); + if (R_SUCCEEDED(res)) { + return priority; + } + + return old_priority; +} + +/* sysCond */ +sysCond *sys_cond_create(void) +{ + sysCond *cond; + + cond = (sysCond *)malloc(sizeof(sysCond)); + if (cond) { + RecursiveLock_Init(&cond->lock); + LightSemaphore_Init(&cond->wait_sem, 0, ((s16)0x7FFF)); + LightSemaphore_Init(&cond->wait_done, 0, ((s16)0x7FFF)); + cond->waiting = cond->signals = 0; + } else { + DEBUGF("sys_cond_create: out of memory.\n");; + } + return cond; +} + +/* Destroy a condition variable */ +void sys_cond_destroy(sysCond *cond) +{ + if (cond) { + free(cond); + } +} + +/* Restart one of the threads that are waiting on the condition variable */ +int sys_cond_signal(sysCond *cond) +{ + if (!cond) { + DEBUGF("sys_cond_signal: Invalid param 'cond'\n"); + return -1; + } + + /* If there are waiting threads not already signalled, then + signal the condition and wait for the thread to respond. + */ + RecursiveLock_Lock(&cond->lock); + if (cond->waiting > cond->signals) { + ++cond->signals; + LightSemaphore_Release(&cond->wait_sem, 1); + RecursiveLock_Unlock(&cond->lock); + LightSemaphore_Acquire(&cond->wait_done, 1); + } else { + RecursiveLock_Unlock(&cond->lock); + } + + return 0; +} + +/* Restart all threads that are waiting on the condition variable */ +int sys_cond_broadcast(sysCond *cond) +{ + if (!cond) { + DEBUGF("sys_cond_signal: Invalid param 'cond'\n"); + return -1; + } + + /* If there are waiting threads not already signalled, then + signal the condition and wait for the thread to respond. + */ + RecursiveLock_Lock(&cond->lock); + if (cond->waiting > cond->signals) { + int i, num_waiting; + + num_waiting = (cond->waiting - cond->signals); + cond->signals = cond->waiting; + for (i = 0; i < num_waiting; ++i) { + LightSemaphore_Release(&cond->wait_sem, 1); + } + /* Now all released threads are blocked here, waiting for us. + Collect them all (and win fabulous prizes!) :-) + */ + RecursiveLock_Unlock(&cond->lock); + for (i = 0; i < num_waiting; ++i) { + LightSemaphore_Acquire(&cond->wait_done, 1); + } + } else { + RecursiveLock_Unlock(&cond->lock); + } + + return 0; +} + +int sys_cond_wait(sysCond *cond, RecursiveLock *mutex) +{ + if (!cond) { + DEBUGF("sys_cond_signal: Invalid param 'cond'\n"); + return -1; + } + + RecursiveLock_Lock(&cond->lock); + ++cond->waiting; + RecursiveLock_Unlock(&cond->lock); + + /* Unlock the mutex, as is required by condition variable semantics */ + RecursiveLock_Unlock(mutex); + + /* Wait for a signal */ + LightSemaphore_Acquire(&cond->wait_sem, 1); + + RecursiveLock_Lock(&cond->lock); + if (cond->signals > 0) { + /* We always notify the signal thread that we are done */ + LightSemaphore_Release(&cond->wait_done, 1); + + /* Signal handshake complete */ + --cond->signals; + } + --cond->waiting; + RecursiveLock_Unlock(&cond->lock); + + /* Lock the mutex, as is required by condition variable semantics */ + RecursiveLock_Lock(mutex); + + return 0; +} + diff --git a/firmware/target/hosted/ctru/lib/sys_thread.h b/firmware/target/hosted/ctru/lib/sys_thread.h new file mode 100644 index 0000000000..c951668993 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_thread.h @@ -0,0 +1,88 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __SYSTHREAD_H__ +#define __SYSTHREAD_H__ + +#include "thread.h" + +#include <3ds/synchronization.h> +#include <3ds/thread.h> +#include <3ds/services/apt.h> + +/* Complementary atomic operations */ +bool _AtomicCAS(u32 *ptr, int oldval, int newval); +#define AtomicGet(ptr) __atomic_load_n((u32*)(ptr), __ATOMIC_SEQ_CST) +#define AtomicSet(ptr, value) AtomicSwap(ptr, value) +#define AtomicCAS(ptr, oldvalue, newvalue) _AtomicCAS((u32 *)(ptr), oldvalue, newvalue) +void AtomicLock(int *lock); +void AtomicUnlock(int *lock); + +/* This code was taken from SDL2 thread implementation */ + +enum thread_state_t +{ + THREAD_STATE_ALIVE, + THREAD_STATE_DETACHED, + THREAD_STATE_ZOMBIE, + THREAD_STATE_CLEANED, +}; + +typedef struct _thread +{ + int threadid; + Thread handle; + int status; + int state; + size_t stacksize; + int(* userfunc)(void *); + void *userdata; + void *data; +} sysThread; + +typedef struct _cond +{ + RecursiveLock lock; + int waiting; + int signals; + LightSemaphore wait_sem; + LightSemaphore wait_done; +} sysCond; + +int sys_sem_wait(LightSemaphore *sem); +int sys_sem_wait_timeout(LightSemaphore *sem, u32 timeout); +int sys_sem_try_wait(LightSemaphore *sem); +u32 sys_sem_value(LightSemaphore *sem); + +sysThread *sys_create_thread(int(*fn)(void *), const char *name, const size_t stacksize, + void *data IF_PRIO(, int priority) IF_COP(, unsigned int core)); +void sys_run_thread(sysThread *thread); +void sys_wait_thread(sysThread *thread, int *status); +int sys_thread_id(void); +int sys_set_thread_priority(sysThread *thread, int priority); + +sysCond *sys_cond_create(void); +void sys_cond_destroy(sysCond *cond); +int sys_cond_signal(sysCond *cond); +int sys_cond_broadcast(sysCond *cond); +int sys_cond_wait(sysCond *cond, RecursiveLock *mutex); +#endif /* #ifndef __SYSTHREAD_H__ */ + diff --git a/firmware/target/hosted/ctru/lib/sys_timer.c b/firmware/target/hosted/ctru/lib/sys_timer.c new file mode 100644 index 0000000000..a38d7ca032 --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_timer.c @@ -0,0 +1,402 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Dan Everton + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include "debug.h" +#include "logf.h" + +#include <3ds/os.h> +#include "sys_thread.h" +#include "sys_timer.h" + +#define CACHELINE_SIZE 128 + +static bool ticks_started = false; +static u64 start_tick; + +#define NSEC_PER_MSEC 1000000ULL + +void sys_ticks_init(void) +{ + if (ticks_started) { + return; + } + ticks_started = true; + + start_tick = svcGetSystemTick(); +} + +void sys_ticks_quit(void) +{ + ticks_started = false; +} + +u64 sys_get_ticks64(void) +{ + u64 elapsed; + if (!ticks_started) { + sys_ticks_init(); + } + + elapsed = svcGetSystemTick() - start_tick; + return elapsed / CPU_TICKS_PER_MSEC; +} + +u32 sys_get_ticks(void) +{ + return (u32)(sys_get_ticks64() & 0xFFFFFFFF); +} + +void sys_delay(u32 ms) +{ + svcSleepThread(ms * NSEC_PER_MSEC); +} + +typedef struct _timer +{ + int timerID; + timer_callback_ptr callback; + void *param; + u32 interval; + u32 scheduled; + int canceled; + struct _timer *next; +} sysTimer; + +typedef struct _timer_map +{ + int timerID; + sysTimer *timer; + struct _timer_map *next; +} timerMap; + +/* The timers are kept in a sorted list */ +typedef struct +{ + /* Data used by the main thread */ + Thread thread; + int nextID; + timerMap *timermap; + RecursiveLock timermap_lock; + + /* Padding to separate cache lines between threads */ + char cache_pad[CACHELINE_SIZE]; + + /* Data used to communicate with the timer thread */ + int lock; + LightSemaphore sem; + sysTimer *pending; + sysTimer *freelist; + int active; + + /* List of timers - this is only touched by the timer thread */ + sysTimer *timers; +} timerData; + +static timerData timer_data = { .active = 0 }; + +/* The idea here is that any thread might add a timer, but a single + * thread manages the active timer queue, sorted by scheduling time. + * + * Timers are removed by simply setting a canceled flag + */ + +static void add_timer_interval(timerData *data, sysTimer *timer) +{ + sysTimer *prev, *curr; + + prev = NULL; + for (curr = data->timers; curr; prev = curr, curr = curr->next) { + if ((s32)(timer->scheduled - curr->scheduled) < 0) { + break; + } + } + + /* Insert the timer here! */ + if (prev) { + prev->next = timer; + } else { + data->timers = timer; + } + timer->next = curr; +} + +static void timer_thread(void *_data) +{ + timerData *data = (timerData *)_data; + sysTimer *pending; + sysTimer *current; + sysTimer *freelist_head = NULL; + sysTimer *freelist_tail = NULL; + u32 tick, now, interval, delay; + + /* Threaded timer loop: + * 1. Queue timers added by other threads + * 2. Handle any timers that should dispatch this cycle + * 3. Wait until next dispatch time or new timer arrives + */ + for (;;) { + /* Pending and freelist maintenance */ + AtomicLock(&data->lock); + { + /* Get any timers ready to be queued */ + pending = data->pending; + data->pending = NULL; + + /* Make any unused timer structures available */ + if (freelist_head) { + freelist_tail->next = data->freelist; + data->freelist = freelist_head; + } + } + AtomicUnlock(&data->lock); + + /* Sort the pending timers into our list */ + while (pending) { + current = pending; + pending = pending->next; + add_timer_interval(data, current); + } + freelist_head = NULL; + freelist_tail = NULL; + + /* Check to see if we're still running, after maintenance */ + if (!AtomicGet(&data->active)) { + break; + } + + /* Initial delay if there are no timers */ + delay = (~(u32)0); + + tick = sys_get_ticks(); + + /* Process all the pending timers for this tick */ + while (data->timers) { + current = data->timers; + + if ((s32)(tick - current->scheduled) < 0) { + /* Scheduled for the future, wait a bit */ + delay = (current->scheduled - tick); + break; + } + + /* We're going to do something with this timer */ + data->timers = current->next; + + if (AtomicGet(¤t->canceled)) { + interval = 0; + } else { + interval = current->callback(current->interval, current->param); + } + + if (interval > 0) { + /* Reschedule this timer */ + current->interval = interval; + current->scheduled = tick + interval; + add_timer_interval(data, current); + } else { + if (!freelist_head) { + freelist_head = current; + } + if (freelist_tail) { + freelist_tail->next = current; + } + freelist_tail = current; + + AtomicSet(¤t->canceled, 1); + } + } + + /* Adjust the delay based on processing time */ + now = sys_get_ticks(); + interval = (now - tick); + if (interval > delay) { + delay = 0; + } else { + delay -= interval; + } + + /* Note that each time a timer is added, this will return + immediately, but we process the timers added all at once. + That's okay, it just means we run through the loop a few + extra times. + */ + sys_sem_wait_timeout(&data->sem, delay); + } +} + +int sys_timer_init(void) +{ + timerData *data = &timer_data; + + if (!AtomicGet(&data->active)) { + RecursiveLock_Init(&data->timermap_lock); + LightSemaphore_Init(&data->sem, 0, ((s16)0x7FFF)); + AtomicSet(&data->active, 1); + + /* Timer threads use a callback into the app, so we can't set a limited stack size here. */ + data->thread = threadCreate(timer_thread, + data, + 32 * 1024, + 0x28, + -1, + false); + if (!data->thread) { + sys_timer_quit(); + return -1; + } + + AtomicSet(&data->nextID, 1); + } + return 0; +} + +void sys_timer_quit(void) +{ + timerData *data = &timer_data; + sysTimer *timer; + timerMap *entry; + + if (AtomicCAS(&data->active, 1, 0)) { /* active? Move to inactive. */ + /* Shutdown the timer thread */ + if (data->thread) { + LightSemaphore_Release(&data->sem, 1); + Result res = threadJoin(data->thread, U64_MAX); + threadFree(data->thread); + data->thread = NULL; + } + + /* Clean up the timer entries */ + while (data->timers) { + timer = data->timers; + data->timers = timer->next; + free(timer); + } + while (data->freelist) { + timer = data->freelist; + data->freelist = timer->next; + free(timer); + } + while (data->timermap) { + entry = data->timermap; + data->timermap = entry->next; + free(entry); + } + } +} + +int sys_add_timer(u32 interval, timer_callback_ptr callback, void *param) +{ + timerData *data = &timer_data; + sysTimer *timer; + timerMap *entry; + + AtomicLock(&data->lock); + if (!AtomicGet(&data->active)) { + if (sys_timer_init() < 0) { + AtomicUnlock(&data->lock); + return 0; + } + } + + timer = data->freelist; + if (timer) { + data->freelist = timer->next; + } + AtomicUnlock(&data->lock); + + if (timer) { + sys_remove_timer(timer->timerID); + } else { + timer = (sysTimer *) malloc(sizeof(*timer)); + if (!timer) { + DEBUGF("sys_add_timer: out of memory\n"); + return 0; + } + } + timer->timerID = AtomicIncrement(&data->nextID); + timer->callback = callback; + timer->param = param; + timer->interval = interval; + timer->scheduled = sys_get_ticks() + interval; + AtomicSet(&timer->canceled, 0); + + entry = (timerMap *) malloc(sizeof(*entry)); + if (!entry) { + free(timer); + DEBUGF("sys_add_timer: out of memory\n"); + return 0; + } + entry->timer = timer; + entry->timerID = timer->timerID; + + RecursiveLock_Lock(&data->timermap_lock); + entry->next = data->timermap; + data->timermap = entry; + RecursiveLock_Unlock(&data->timermap_lock); + + /* Add the timer to the pending list for the timer thread */ + AtomicLock(&data->lock); + timer->next = data->pending; + data->pending = timer; + AtomicUnlock(&data->lock); + + /* Wake up the timer thread if necessary */ + LightSemaphore_Release(&data->sem, 1); + + return entry->timerID; +} + +bool sys_remove_timer(int id) +{ + timerData *data = &timer_data; + timerMap *prev, *entry; + bool canceled = false; + + /* Find the timer */ + RecursiveLock_Lock(&data->timermap_lock); + prev = NULL; + for (entry = data->timermap; entry; prev = entry, entry = entry->next) { + if (entry->timerID == id) { + if (prev) { + prev->next = entry->next; + } else { + data->timermap = entry->next; + } + break; + } + } + RecursiveLock_Unlock(&data->timermap_lock); + + if (entry) { + if (!AtomicGet(&entry->timer->canceled)) { + AtomicSet(&entry->timer->canceled, 1); + canceled = true; + } + free(entry); + } + return canceled; +} + diff --git a/firmware/target/hosted/ctru/lib/sys_timer.h b/firmware/target/hosted/ctru/lib/sys_timer.h new file mode 100644 index 0000000000..cccaab4fce --- /dev/null +++ b/firmware/target/hosted/ctru/lib/sys_timer.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __SYSTIMER_H__ +#define __SYSTIMER_H__ + +#include <3ds/svc.h> +#include "sys_thread.h" + +typedef u32 (* timer_callback_ptr) (u32 interval, void *param); + +void sys_ticks_init(void); +void sys_ticks_quit(void); +u32 sys_get_ticks(void); +u64 sys_get_ticks64(void); +void sys_delay(u32 ms); + +int sys_timer_init(void); +void sys_timer_quit(void); +int sys_add_timer(u32 interval, timer_callback_ptr callback, void *param); +bool sys_remove_timer(int id); + +#endif /* #ifndef __SYSTIMER_H__ */ + diff --git a/firmware/target/hosted/ctru/luminance-ctru.c b/firmware/target/hosted/ctru/luminance-ctru.c new file mode 100644 index 0000000000..7d1d0a3310 --- /dev/null +++ b/firmware/target/hosted/ctru/luminance-ctru.c @@ -0,0 +1,133 @@ +/* +* This file is part of Luma3DS +* Copyright (C) 2016-2020 Aurora Wright, TuxSH +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* Additional Terms 7.b and 7.c of GPLv3 apply to this file: +* * Requiring preservation of specified reasonable legal notices or +* author attributions in that material or in the Appropriate Legal +* Notices displayed by works containing it. +* * Prohibiting misrepresentation of the origin of that material, +* or requiring that modified versions of such material be marked in +* reasonable ways as different from the original version. +*/ + +/* This file is taken from Luma3DS project */ + +#include <3ds.h> +#include +#include "luminance-ctru.h" + +// For accessing physmem uncached (and directly) +#define PA_PTR(addr) (void *)((u32)(addr) | 1 << 31) + +#ifndef PA_FROM_VA_PTR +#define PA_FROM_VA_PTR(addr) PA_PTR(svcConvertVAToPA((const void *)(addr), false)) +#endif + +#define REG32(addr) (*(vu32 *)(PA_PTR(addr))) + + +extern bool is_n3ds; + +typedef struct BlPwmData +{ + float coeffs[3][3]; + u8 numLevels; + u8 unk; + u16 luminanceLevels[7]; + u16 brightnessMax; + u16 brightnessMin; +} BlPwmData; + +// Calibration, with (dubious) default values as fallback +static BlPwmData s_blPwmData = { + .coeffs = { + { 0.00111639f, 1.41412f, 0.07178809f }, + { 0.000418169f, 0.66567f, 0.06098654f }, + { 0.00208543f, 1.55639f, 0.0385939f } + }, + .numLevels = 5, + .unk = 0, + .luminanceLevels = { 20, 43, 73, 95, 117, 172, 172 }, + .brightnessMax = 512, + .brightnessMin = 13, +}; + +static inline float getPwmRatio(u32 brightnessMax, u32 pwmCnt) +{ + u32 val = (pwmCnt & 0x10000) ? pwmCnt & 0x3FF : 511; // check pwm enabled flag + return (float)brightnessMax / (val + 1); +} + +// nn's asm has rounding errors (originally at 10^-3) +static inline u32 luminanceToBrightness(u32 luminance, const float coeffs[3], u32 minLuminance, float pwmRatio) +{ + float x = (float)luminance; + float y = coeffs[0]*x*x + coeffs[1]*x + coeffs[2]; + y = (y <= minLuminance ? (float)minLuminance : y) / pwmRatio; + + return (u32)(y + 0.5f); +} + +static inline u32 brightnessToLuminance(u32 brightness, const float coeffs[3], float pwmRatio) +{ + // Find polynomial root of ax^2 + bx + c = y + + float y = (float)brightness * pwmRatio; + float a = coeffs[0]; + float b = coeffs[1]; + float c = coeffs[2] - y; + + float x0 = (-b + sqrtf(b*b - 4.0f*a*c)) / (a + a); + + return (u32)(x0 + 0.5f); +} + +static void readCalibration(void) +{ + static bool calibRead = false; + + if (!calibRead) { + cfguInit(); + calibRead = R_SUCCEEDED(CFG_GetConfigInfoBlk8(sizeof(BlPwmData), 0x50002, &s_blPwmData)); + cfguExit(); + } +} + +u32 getMinLuminancePreset(void) +{ + readCalibration(); + return s_blPwmData.luminanceLevels[0]; +} + +u32 getMaxLuminancePreset(void) +{ + readCalibration(); + return s_blPwmData.luminanceLevels[s_blPwmData.numLevels - 1]; +} + +u32 getCurrentLuminance(bool top) +{ + u32 regbase = top ? 0x10202200 : 0x10202A00; + + readCalibration(); + + const float *coeffs = s_blPwmData.coeffs[top ? (is_n3ds ? 2 : 1) : 0]; + u32 brightness = REG32(regbase + 0x40); + float ratio = getPwmRatio(s_blPwmData.brightnessMax, REG32(regbase + 0x44)); + + return brightnessToLuminance(brightness, coeffs, ratio); +} diff --git a/firmware/target/hosted/ctru/luminance-ctru.h b/firmware/target/hosted/ctru/luminance-ctru.h new file mode 100644 index 0000000000..148935b790 --- /dev/null +++ b/firmware/target/hosted/ctru/luminance-ctru.h @@ -0,0 +1,40 @@ +/* +* This file is part of Luma3DS +* Copyright (C) 2016-2020 Aurora Wright, TuxSH +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* Additional Terms 7.b and 7.c of GPLv3 apply to this file: +* * Requiring preservation of specified reasonable legal notices or +* author attributions in that material or in the Appropriate Legal +* Notices displayed by works containing it. +* * Prohibiting misrepresentation of the origin of that material, +* or requiring that modified versions of such material be marked in +* reasonable ways as different from the original version. +*/ + +#ifndef _LUMINANCE_CTRU_H_ +#define _LUMINANCE_CTRU_H_ + +#include <3ds/types.h> + +extern u32 ctru_min_lum; +extern u32 ctru_max_lum; +extern u32 ctru_luminance; + +u32 getMinLuminancePreset(void); +u32 getMaxLuminancePreset(void); +u32 getCurrentLuminance(bool top); + +#endif /* _LUMINANCE_CTRU_H_ */ diff --git a/firmware/target/hosted/ctru/pcm-ctru.c b/firmware/target/hosted/ctru/pcm-ctru.c new file mode 100644 index 0000000000..d7c9d36458 --- /dev/null +++ b/firmware/target/hosted/ctru/pcm-ctru.c @@ -0,0 +1,359 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 by Nick Lanham + * Copyright (C) 2010 by Thomas Martitz + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#include "autoconf.h" + +#include +#include +#include +#include "config.h" +#include "debug.h" +#include "sound.h" +#include "audiohw.h" +#include "system.h" +#include "panic.h" + +#ifdef HAVE_RECORDING +#include "audiohw.h" +#ifdef HAVE_SPDIF_IN +#include "spdif.h" +#endif +#endif + +#include "pcm.h" +#include "pcm-internal.h" +#include "pcm_sampr.h" +#include "pcm_mixer.h" + +#include <3ds/ndsp/ndsp.h> +#include <3ds/ndsp/channel.h> +#include <3ds/services/dsp.h> +#include <3ds/synchronization.h> +#include <3ds/allocator/linear.h> + +/*#define LOGF_ENABLE*/ +#include "logf.h" + +#ifdef DEBUG +extern bool debug_audio; +#endif + +extern const char *audiodev; + +/* Bytes left in the Rockbox PCM frame buffer. */ +static size_t _pcm_buffer_size = 0; + + +/* Rockbox PCM frame buffer. */ +static const void *_pcm_buffer = NULL; + +/* + 1: PCM thread suspended. + 0: PCM thread running. + These are used by pcm_play_[lock|unlock] or pcm_play_dma_[start|stop|pause]. These need to be + separated because of nested calls for suspending and stopping. +*/ +static volatile int _dsp_enabled = 1; +static volatile int _pcm_shutdown = 0; + + +/* Mutex for PCM thread suspend/unsuspend. */ +static RecursiveLock _pcm_lock_mtx; /* audio device mutex */ +static LightEvent _dsp_callback_event; /* dsp callback synchronization flag */ + +static Thread _pcm_thread; +static int _pcm_thread_id = -1; + +/* DSP wave buffers */ +static ndspWaveBuf _dsp_wave_bufs[3]; +static s16 *_dsp_audio_buffer = NULL; + +static inline bool is_in_audio_thread(int audio_thread_id) +{ + /* The device thread locks the same mutex, but not through the public API. + This check is in case the application, in the audio callback, + tries to lock the thread that we've already locked from the + device thread...just in case we only have non-recursive mutexes. */ + if ( (sys_thread_id() == audio_thread_id)) { + return true; + } + + return false; +} + +void pcm_play_lock(void) +{ + if (!is_in_audio_thread(_pcm_thread_id)) { + RecursiveLock_Lock(&_pcm_lock_mtx); + } +} + +void pcm_play_unlock(void) +{ + if (!is_in_audio_thread(_pcm_thread_id)) { + RecursiveLock_Unlock(&_pcm_lock_mtx); + } +} + +static void pcm_write_to_soundcard(const void *pcm_buffer, size_t pcm_buffer_size, ndspWaveBuf *dsp_buffer) +{ + s16 *buffer = dsp_buffer->data_pcm16; + memcpy(buffer, pcm_buffer, pcm_buffer_size); + + dsp_buffer->nsamples = pcm_buffer_size / 2 / sizeof(s16); + ndspChnWaveBufAdd(0, dsp_buffer); + DSP_FlushDataCache(buffer, pcm_buffer_size); +} + +bool fill_buffer(ndspWaveBuf *dsp_buffer) +{ + if(_pcm_buffer_size == 0) + { + /* Retrive a new PCM buffer from Rockbox. */ + if(!pcm_play_dma_complete_callback(PCM_DMAST_OK, &_pcm_buffer, &_pcm_buffer_size)) + { + /* DEBUGF("DEBUG %s: No new buffer.\n", __func__); */ + svcSleepThread(10000); + return false; + } + } + pcm_play_dma_status_callback(PCM_DMAST_STARTED); + + /* This relies on Rockbox PCM frame buffer size == ALSA PCM frame buffer size. */ + pcm_write_to_soundcard(_pcm_buffer, _pcm_buffer_size, dsp_buffer); + _pcm_buffer_size = 0; + + return true; +} + +void pcm_thread_run(void* nothing) +{ + (void) nothing; + + DEBUGF("DEBUG %s: Thread start.\n", __func__); + + _pcm_thread_id = sys_thread_id(); + + while(!AtomicGet(&_pcm_shutdown)) + { + RecursiveLock_Lock(&_pcm_lock_mtx); + for(size_t i = 0; i < ARRAY_SIZE(_dsp_wave_bufs); ++i) { + if(_dsp_wave_bufs[i].status != NDSP_WBUF_DONE) { + continue; + } + + if(!fill_buffer(&_dsp_wave_bufs[i])) { + continue; + } + } + RecursiveLock_Unlock(&_pcm_lock_mtx); + + // Wait for a signal that we're needed again before continuing, + // so that we can yield to other things that want to run + // (Note that the 3DS uses cooperative threading) + LightEvent_Wait(&_dsp_callback_event); + } + + DEBUGF("DEBUG %s: Thread end.\n", __func__); +} + +void dsp_callback(void *const nul_) { + (void)nul_; + + if(AtomicGet(&_pcm_shutdown)) { + return; + } + + LightEvent_Signal(&_dsp_callback_event); +} + +static void pcm_dma_apply_settings_nolock(void) +{ + ndspChnReset(0); + + ndspSetOutputMode(NDSP_OUTPUT_STEREO); + + ndspChnSetRate(0, pcm_sampr); + ndspChnSetFormat(0, NDSP_FORMAT_STEREO_PCM16); + /* ndspChnSetInterp(0, NDSP_INTERP_POLYPHASE); */ + /* ndspChnSetInterp(0, NDSP_INTERP_NONE); */ + ndspChnSetInterp(0, NDSP_INTERP_LINEAR); + + float mix[12]; + memset(mix, 0, sizeof(mix)); + mix[0] = 1.0; + mix[1] = 1.0; + ndspChnSetMix(0, mix); + + memset(_dsp_wave_bufs, 0, sizeof(_dsp_wave_bufs) * ARRAY_SIZE(_dsp_wave_bufs)); + + const size_t wave_buffer_size = MIX_FRAME_SAMPLES * 2 * sizeof(s16); + size_t buffer_size = wave_buffer_size * ARRAY_SIZE(_dsp_wave_bufs); + + _dsp_audio_buffer = (s16 *)linearAlloc(buffer_size); + + s16 *buffer = _dsp_audio_buffer; + for (unsigned i = 0; i < ARRAY_SIZE(_dsp_wave_bufs); i++) { + _dsp_wave_bufs[i].data_vaddr = buffer; + _dsp_wave_bufs[i].status = NDSP_WBUF_DONE; + + buffer += wave_buffer_size / sizeof(buffer[0]); + } + + ndspChnSetPaused(0, true); + ndspSetCallback(dsp_callback, NULL); + + AtomicSet(&_pcm_shutdown, 0); + AtomicSet(&_dsp_enabled, 1); + + // Start the thread, passing our opusFile as an argument. + _pcm_thread = threadCreate(pcm_thread_run, + NULL, + 32 * 1024, /* 32kB stack size */ + 0x18, /* high priority */ + -1, /* run on any core */ false); +} + +void pcm_play_dma_start(const void *addr, size_t size) +{ + _pcm_buffer = addr; + _pcm_buffer_size = size; + + RecursiveLock_Lock(&_pcm_lock_mtx); + ndspChnSetPaused(0, false); + RecursiveLock_Unlock(&_pcm_lock_mtx); +} + +void pcm_play_dma_stop(void) +{ + RecursiveLock_Lock(&_pcm_lock_mtx); + ndspChnSetPaused(0, true); + RecursiveLock_Unlock(&_pcm_lock_mtx); +} + +/* TODO: implement recording */ +#ifdef HAVE_RECORDING +void pcm_rec_lock(void) +{ +} + +void pcm_rec_unlock(void) +{ +} + +void pcm_rec_dma_init(void) +{ +} + +void pcm_rec_dma_close(void) +{ +} + +void pcm_rec_dma_start(void *start, size_t size) +{ + (void)start; + (void)size; + + +} + +void pcm_rec_dma_stop(void) +{ +} + +const void * pcm_rec_dma_get_peak_buffer(void) +{ + return NULL; +} + +void audiohw_set_recvol(int left, int right, int type) +{ + (void)left; + (void)right; + (void)type; +} + +#ifdef HAVE_SPDIF_IN +unsigned long spdif_measure_frequency(void) +{ + return 0; +} +#endif + +#endif /* HAVE_RECORDING */ + +void pcm_play_dma_init(void) +{ + Result ndsp_init_res = ndspInit(); + if (R_FAILED(ndsp_init_res)) { + if ((R_SUMMARY(ndsp_init_res) == RS_NOTFOUND) && (R_MODULE(ndsp_init_res) == RM_DSP)) { + logf("DSP init failed: dspfirm.cdc missing!"); + } else { + logf("DSP init failed. Error code: 0x%lX", ndsp_init_res); + } + return; + } + + RecursiveLock_Init(&_pcm_lock_mtx); + LightEvent_Init(&_dsp_callback_event, RESET_ONESHOT); +} + +void pcm_play_dma_postinit(void) +{ +} + +void pcm_dma_apply_settings(void) +{ + pcm_play_lock(); + pcm_dma_apply_settings_nolock(); + pcm_play_unlock(); +} + +void pcm_close_device(void) +{ + RecursiveLock_Lock(&_pcm_lock_mtx); + AtomicSet(&_pcm_shutdown, 1); + LightEvent_Signal(&_dsp_callback_event); + + threadJoin(_pcm_thread, UINT64_MAX); + threadFree(_pcm_thread); + _pcm_thread_id = -1; + RecursiveLock_Unlock(&_pcm_lock_mtx); + + ndspSetCallback(NULL, NULL); + + ndspChnReset(0); + if (_dsp_audio_buffer != NULL) { + linearFree(_dsp_audio_buffer); + _dsp_audio_buffer = NULL; + } + + ndspExit(); +} + +/* moved from drivers/audio/ctru.c */ +void audiohw_close(void) +{ + pcm_close_device(); +} diff --git a/firmware/target/hosted/ctru/powermgmt-ctru.c b/firmware/target/hosted/ctru/powermgmt-ctru.c new file mode 100644 index 0000000000..063abf7a7b --- /dev/null +++ b/firmware/target/hosted/ctru/powermgmt-ctru.c @@ -0,0 +1,107 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include + +#include "config.h" +#include "kernel.h" +#include "powermgmt.h" +#include "power.h" +#include "adc.h" +#include "system.h" +#include "debug.h" + +#include <3ds/types.h> +#include <3ds/result.h> +#include <3ds/services/mcuhwc.h> +#include <3ds/services/ptmu.h> + +void mcuhwc_init(void) +{ + Result result = mcuHwcInit(); + if (R_FAILED(result)) { + DEBUGF("mcuhwc_init: warning, mcuHwcInit failed\n"); + } + + result = ptmuInit(); + if (R_FAILED(result)) { + DEBUGF("mcuhwc_init: warning, ptmuInit failed\n"); + } +} + +void mcuhwc_close(void) +{ + mcuHwcExit(); + ptmuExit(); +} + +/* FIXME: what level should disksafe be?*/ +unsigned short battery_level_disksafe = 0; + +unsigned short battery_level_shutoff = 0; + +/* voltages (millivolt) of 0%, 10%, ... 100% when charging disabled */ +unsigned short percent_to_volt_discharge[11] = +{ +}; + +/* voltages (millivolt) of 0%, 10%, ... 100% when charging enabled */ +unsigned short percent_to_volt_charge[11] = +{ + 3450, 3670, 3721, 3751, 3782, 3821, 3876, 3941, 4034, 4125, 4200 +}; + +enum +{ + BATT_NOT_CHARGING = 0, + BATT_CHARGING, +}; + +static u8 charging_status = BATT_NOT_CHARGING; + +unsigned int power_input_status(void) +{ + unsigned status = POWER_INPUT_NONE; + PTMU_GetBatteryChargeState(&charging_status); + if (charging_status == BATT_CHARGING) + status = POWER_INPUT_MAIN_CHARGER; + return status; +} + +/* Returns battery voltage from MAX17040 VCELL ADC [millivolts steps], + * adc returns voltage in 1.25mV steps */ +/* + * TODO this would be interesting to be mixed with battery percentage, for information + * and completition purpouses + */ +int _battery_level(void) +{ + u8 level = 100; + MCUHWC_GetBatteryLevel(&level); + return level; +} + +bool charging_state(void) +{ + return (charging_status == BATT_CHARGING); +} + diff --git a/firmware/target/hosted/ctru/system-ctru.c b/firmware/target/hosted/ctru/system-ctru.c new file mode 100644 index 0000000000..a091e889c6 --- /dev/null +++ b/firmware/target/hosted/ctru/system-ctru.c @@ -0,0 +1,145 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 by Daniel Everton + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include +#include +#include +#include +#include "system.h" +#include "kernel.h" +#include "thread-ctru.h" +#include "system-ctru.h" +#include "button-ctru.h" +#include "lcd-bitmap.h" +#include "panic.h" +#include "debug.h" + +#include <3ds/types.h> +#include <3ds/allocator/linear.h> +#include <3ds/services/cfgu.h> +#include "bfile.h" + +const char *audiodev = NULL; + +#ifdef DEBUG +bool debug_audio = false; +#endif + +/* default main thread priority, low */ +s32 main_thread_priority = 0x30; +bool is_n3ds = false; + +/* filesystem */ +sync_RWMutex file_internal_mrsw; +FS_Archive sdmcArchive; + +void ctru_sys_quit(void) +{ + sys_poweroff(); +} + +void power_off(void) +{ + /* since sim_thread_shutdown() grabs the mutex we need to let it free, + * otherwise sys_wait_thread will deadlock */ + struct thread_entry* t = sim_thread_unlock(); + sim_thread_shutdown(); + + /* lock again before entering the scheduler */ + sim_thread_lock(t); + /* sim_thread_shutdown() will cause sim_do_exit() to be called via longjmp, + * but only if we let the sdl thread scheduler exit the other threads */ + while(1) yield(); +} + +void sim_do_exit() +{ + sim_kernel_shutdown(); + sys_timer_quit(); + /* TODO: quit_everything() */ + exit(EXIT_SUCCESS); +} + +uintptr_t *stackbegin; +uintptr_t *stackend; +void system_init(void) +{ + /* fake stack, OS manages size (and growth) */ + volatile uintptr_t stack = 0; + stackbegin = stackend = (uintptr_t*) &stack; + + /* disable sleep mode when lid is closed */ + aptSetSleepAllowed(false); + + sys_console_init(); + sys_timer_init(); + + svcGetThreadPriority(&main_thread_priority, CUR_THREAD_HANDLE); + if (main_thread_priority != 0x30) { + DEBUGF("warning, main_thread_priority = 0x%x\n", main_thread_priority); + } + + /* check for New 3DS model */ + s64 dummyInfo; + is_n3ds = svcGetSystemInfo(&dummyInfo, 0x10001, 0) == 0; + + /* filesystem */ + sync_RWMutexInit(&file_internal_mrsw); + Result res = FSUSER_OpenArchive(&sdmcArchive, + ARCHIVE_SDMC, + fsMakePath(PATH_ASCII, "")); + if (R_FAILED(res)) { + DEBUGF("FSUSER_OpenArchive failed\n"); + exit(-1); + } + + mcuhwc_init(); + cfguInit(); +} + + +void system_reboot(void) +{ + sim_thread_exception_wait(); +} + +void system_exception_wait(void) +{ + system_reboot(); +} + +int hostfs_init(void) +{ + /* stub */ + /* romfsInit(); */ + return 0; +} + +#ifdef HAVE_STORAGE_FLUSH +int hostfs_flush(void) +{ +#ifdef __unix__ + sync(); +#endif + return 0; +} +#endif /* HAVE_STORAGE_FLUSH */ + diff --git a/firmware/target/hosted/ctru/system-ctru.h b/firmware/target/hosted/ctru/system-ctru.h new file mode 100644 index 0000000000..23c63a3c0c --- /dev/null +++ b/firmware/target/hosted/ctru/system-ctru.h @@ -0,0 +1,70 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 by Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef _SYSTEM_SDL_H_ +#define _SYSTEM_SDL_H_ + +#include +#include +#include "config.h" +#include "gcc_extensions.h" + +#include <3ds/types.h> +#include <3ds/svc.h> +#include "sys_timer.h" + +#define HIGHEST_IRQ_LEVEL 1 + +int set_irq_level(int level); + +#define disable_irq() \ + ((void)set_irq_level(HIGHEST_IRQ_LEVEL)) + +#define enable_irq() \ + ((void)set_irq_level(0)) + +#define disable_irq_save() \ + set_irq_level(HIGHEST_IRQ_LEVEL) + +#define restore_irq(level) \ + ((void)set_irq_level(level)) + +#define wait_for_interrupt() + +#include "system-hosted.h" + +void sim_enter_irq_handler(void); +void sim_exit_irq_handler(void); +void sim_kernel_shutdown(void); +void sys_poweroff(void); +void sys_handle_argv(int argc, char *argv[]); +void gui_message_loop(void); +void sim_do_exit(void) NORETURN_ATTR; +void sdl_sys_quit(void); + +void mcuhwc_init(void); +void mcuhwc_close(void); + +extern bool background; /* True if the background image is enabled */ +extern bool showremote; +extern double display_zoom; +extern long start_tick; + +#endif /* _SYSTEM_SDL_H_ */ diff --git a/firmware/target/hosted/ctru/system-target.h b/firmware/target/hosted/ctru/system-target.h new file mode 100644 index 0000000000..79df842405 --- /dev/null +++ b/firmware/target/hosted/ctru/system-target.h @@ -0,0 +1,4 @@ +#include "system-ctru.h" + +#define NEED_GENERIC_BYTESWAPS + diff --git a/firmware/target/hosted/ctru/thread-ctru.c b/firmware/target/hosted/ctru/thread-ctru.c new file mode 100644 index 0000000000..675cb314be --- /dev/null +++ b/firmware/target/hosted/ctru/thread-ctru.c @@ -0,0 +1,503 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2006 Dan Everton + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#include "autoconf.h" + +#include +#include +#include +#include /* memset() */ +#include +#include "system-ctru.h" +#include "thread-ctru.h" +#include "sys_thread.h" +#include "../kernel-internal.h" +#include "core_alloc.h" + +/* Define this as 1 to show informational messages that are not errors. */ +#define THREAD_DEBUGF_ENABLED 0 + +#if THREAD_DEBUGF_ENABLED +#define THREAD_DEBUGF(...) DEBUGF(__VA_ARGS__) +static char __name[sizeof (((struct thread_debug_info *)0)->name)]; +#define THREAD_GET_NAME(thread) \ + ({ format_thread_name(__name, sizeof (__name), thread); __name; }) +#else +#define THREAD_DEBUGF(...) +#define THREAD_GET_NAME(thread) +#endif + +#define THREAD_PANICF(str...) \ + ({ fprintf(stderr, str); exit(-1); }) + +/* Jump buffers for graceful exit - kernel threads don't stay neatly + * in their start routines responding to messages so this is the only + * way to get them back in there so they may exit */ +static jmp_buf thread_jmpbufs[MAXTHREADS]; +/* this mutex locks out other Rockbox threads while one runs, + * that enables us to simulate a cooperative environment even if + * the host is preemptive */ +static RecursiveLock m; +#define THREADS_RUN 0 +#define THREADS_EXIT 1 +#define THREADS_EXIT_COMMAND_DONE 2 +static volatile int threads_status = THREADS_RUN; + +extern long start_tick; + +void sim_thread_shutdown(void) +{ + int i; + + /* This *has* to be a push operation from a thread not in the pool + so that they may be dislodged from their blocking calls. */ + + /* Tell all threads jump back to their start routines, unlock and exit + gracefully - we'll check each one in turn for it's status. Threads + _could_ terminate via thread_exit or multiple threads could exit + on each unlock but that is safe. */ + + /* Do this before trying to acquire lock */ + threads_status = THREADS_EXIT; + + /* Take control */ + RecursiveLock_Lock(&m); + + /* Signal all threads on delay or block */ + for (i = 0; i < MAXTHREADS; i++) + { + struct thread_entry *thread = __thread_slot_entry(i); + if (thread->context.s == NULL) + continue; + LightSemaphore_Release(thread->context.s, 1); + } + + /* Wait for all threads to finish and cleanup old ones. */ + for (i = 0; i < MAXTHREADS; i++) + { + struct thread_entry *thread = __thread_slot_entry(i); + sysThread *t = thread->context.t; + + if (t != NULL) + { + RecursiveLock_Unlock(&m); + /* Wait for it to finish */ + sys_wait_thread(t, NULL); + /* Relock for next thread signal */ + RecursiveLock_Lock(&m); + /* Already waited and exiting thread would have waited .told, + * replacing it with t. */ + thread->context.told = NULL; + } + else + { + /* Wait on any previous thread in this location-- could be one not + * quite finished exiting but has just unlocked the mutex. If it's + * NULL, the call returns immediately. + * + * See thread_exit below for more information. */ + sys_wait_thread(thread->context.told, NULL); + } + } + + RecursiveLock_Unlock(&m); + + /* Signal completion of operation */ + threads_status = THREADS_EXIT_COMMAND_DONE; +} + +void sim_thread_exception_wait(void) +{ + while (1) + { + sys_delay(HZ/10); + if (threads_status != THREADS_RUN) + thread_exit(); + } +} + +/* A way to yield and leave the threading system for extended periods */ +void sim_thread_lock(void *me) +{ + RecursiveLock_Lock(&m); + __running_self_entry() = (struct thread_entry *)me; + + if (threads_status != THREADS_RUN) + thread_exit(); +} + +void * sim_thread_unlock(void) +{ + struct thread_entry *current = __running_self_entry(); + RecursiveLock_Unlock(&m); + return current; +} + +void switch_thread(void) +{ + struct thread_entry *current = __running_self_entry(); + + enable_irq(); + + switch (current->state) + { + case STATE_RUNNING: + { + RecursiveLock_Unlock(&m); + /* Any other thread waiting already will get it first */ + RecursiveLock_Lock(&m); + break; + } /* STATE_RUNNING: */ + + case STATE_BLOCKED: + { + int oldlevel; + + RecursiveLock_Unlock(&m); + sys_sem_wait(current->context.s); + RecursiveLock_Lock(&m); + + oldlevel = disable_irq_save(); + current->state = STATE_RUNNING; + restore_irq(oldlevel); + break; + } /* STATE_BLOCKED: */ + + case STATE_BLOCKED_W_TMO: + { + int result, oldlevel; + + RecursiveLock_Unlock(&m); + result = sys_sem_wait_timeout(current->context.s, current->tmo_tick); + RecursiveLock_Lock(&m); + + oldlevel = disable_irq_save(); + + current->state = STATE_RUNNING; + + if (result == 1) + { + /* Other signals from an explicit wake could have been made before + * arriving here if we timed out waiting for the semaphore. Make + * sure the count is reset. */ + while (sys_sem_value(current->context.s) > 0) + sys_sem_try_wait(current->context.s); + } + + restore_irq(oldlevel); + break; + } /* STATE_BLOCKED_W_TMO: */ + + case STATE_SLEEPING: + { + RecursiveLock_Unlock(&m); + sys_sem_wait_timeout(current->context.s, current->tmo_tick); + RecursiveLock_Lock(&m); + current->state = STATE_RUNNING; + break; + } /* STATE_SLEEPING: */ + } + +#ifdef BUFLIB_DEBUG_CHECK_VALID + core_check_valid(); +#endif + __running_self_entry() = current; + + if (threads_status != THREADS_RUN) + thread_exit(); +} + +void sleep_thread(int ticks) +{ + struct thread_entry *current = __running_self_entry(); + int rem; + + current->state = STATE_SLEEPING; + + rem = (sys_get_ticks() - start_tick) % (1000/HZ); + if (rem < 0) + rem = 0; + + current->tmo_tick = (1000/HZ) * ticks + ((1000/HZ)-1) - rem; +} + +void block_thread_(struct thread_entry *current, int ticks) +{ + if (ticks < 0) + current->state = STATE_BLOCKED; + else + { + current->state = STATE_BLOCKED_W_TMO; + current->tmo_tick = (1000/HZ)*ticks; + } + + wait_queue_register(current); +} + +unsigned int wakeup_thread_(struct thread_entry *thread + IF_PRIO(, enum wakeup_thread_protocol proto)) +{ + switch (thread->state) + { + case STATE_BLOCKED: + case STATE_BLOCKED_W_TMO: + wait_queue_remove(thread); + thread->state = STATE_RUNNING; + LightSemaphore_Release(thread->context.s, 1); + return THREAD_OK; + } + + return THREAD_NONE; + (void) proto; +} + +void thread_thaw(unsigned int thread_id) +{ + struct thread_entry *thread = __thread_id_entry(thread_id); + + if (thread->id == thread_id && thread->state == STATE_FROZEN) + { + thread->state = STATE_RUNNING; + LightSemaphore_Release(thread->context.s, 1); + } +} + +int runthread(void *data) +{ + /* Cannot access thread variables before locking the mutex as the + data structures may not be filled-in yet. */ + RecursiveLock_Lock(&m); + + struct thread_entry *current = (struct thread_entry *)data; + __running_self_entry() = current; + + jmp_buf *current_jmpbuf = &thread_jmpbufs[THREAD_ID_SLOT(current->id)]; + + /* Setup jump for exit */ + if (setjmp(*current_jmpbuf) == 0) + { + /* Run the thread routine */ + if (current->state == STATE_FROZEN) + { + RecursiveLock_Unlock(&m); + sys_sem_wait(current->context.s); + RecursiveLock_Lock(&m); + __running_self_entry() = current; + } + + if (threads_status == THREADS_RUN) + { + current->context.start(); + THREAD_DEBUGF("Thread Done: %d (%s)\n", + THREAD_ID_SLOT(current->id), + THREAD_GET_NAME(current)); + /* Thread routine returned - suicide */ + } + + thread_exit(); + } + else + { + /* Unlock and exit */ + RecursiveLock_Unlock(&m); + } + + return 0; +} + +unsigned int create_thread(void (*function)(void), + void* stack, size_t stack_size, + unsigned flags, const char *name + IF_PRIO(, int priority) + IF_COP(, unsigned int core)) +{ + THREAD_DEBUGF("Creating thread: (%s)\n", name ? name : ""); + + struct thread_entry *thread = thread_alloc(); + if (thread == NULL) + { + DEBUGF("Failed to find thread slot\n"); + return 0; + } + + LightSemaphore *s = (LightSemaphore *) malloc(sizeof(LightSemaphore)); + if (s == NULL) + { + DEBUGF("Failed to create semaphore\n"); + return 0; + } + + LightSemaphore_Init(s, 0, 255); + + sysThread *t = sys_create_thread(runthread, + name, + stack_size, + thread + IF_PRIO(, priority) + IF_COP(, core)); + if (t == NULL) + { + DEBUGF("Failed to create thread\n"); + free(s); + return 0; + } + + thread->name = name; + thread->state = (flags & CREATE_THREAD_FROZEN) ? + STATE_FROZEN : STATE_RUNNING; + thread->context.start = function; + thread->context.t = t; + thread->context.s = s; + thread->priority = priority; + + THREAD_DEBUGF("New Thread: %lu (%s)\n", + (unsigned long)thread->id, + THREAD_GET_NAME(thread)); + + return thread->id; + (void)stack; +} + +void thread_exit(void) +{ + struct thread_entry *current = __running_self_entry(); + + int oldlevel = disable_irq_save(); + + sysThread *t = current->context.t; + LightSemaphore *s = current->context.s; + + /* Wait the last thread here and keep this one or ctru will leak it since + * it doesn't free its own library allocations unless a wait is performed. + * Such behavior guards against the memory being invalid by the time + * sys_wait_thread is reached and also against two different threads having + * the same pointer. It also makes sys_wait_thread a non-concurrent function. + * + * However, see more below about sys_kill_thread. + */ + sys_wait_thread(current->context.told, NULL); + + current->context.t = NULL; + current->context.s = NULL; + current->context.told = t; + + unsigned int id = current->id; + new_thread_id(current); + current->state = STATE_KILLED; + wait_queue_wake(¤t->queue); + + free(s); + + /* Do a graceful exit - perform the longjmp back into the thread + function to return */ + restore_irq(oldlevel); + + thread_free(current); + + longjmp(thread_jmpbufs[THREAD_ID_SLOT(id)], 1); + + /* This should never and must never be reached - if it is, the + * state is corrupted */ + THREAD_PANICF("thread_exit->K:*R (ID: %d)", id); + while (1); +} + +void thread_wait(unsigned int thread_id) +{ + struct thread_entry *current = __running_self_entry(); + struct thread_entry *thread = __thread_id_entry(thread_id); + + if (thread->id == thread_id && thread->state != STATE_KILLED) + { + block_thread(current, TIMEOUT_BLOCK, &thread->queue, NULL); + switch_thread(); + } +} + +int thread_set_priority(unsigned int thread_id, int priority) +{ + struct thread_entry *thread = __thread_id_entry(thread_id); + sysThread *t = thread->context.t; + thread->priority = sys_set_thread_priority(t, priority); + return thread->priority; +} + +int thread_get_priority(unsigned int thread_id) +{ + struct thread_entry *thread = __thread_id_entry(thread_id); + return thread->priority; +} + +/* Initialize threading */ +void init_threads(void) +{ + RecursiveLock_Init(&m); + RecursiveLock_Lock(&m); + + thread_alloc_init(); + + struct thread_entry *thread = thread_alloc(); + if (thread == NULL) + { + fprintf(stderr, "Main thread alloc failed\n"); + return; + } + + /* Slot 0 is reserved for the main thread - initialize it here and + then create the thread - it is possible to have a quick, early + shutdown try to access the structure. */ + thread->name = __main_thread_name; + thread->state = STATE_RUNNING; + thread->context.s = (LightSemaphore *) malloc(sizeof(LightSemaphore)); + LightSemaphore_Init(thread->context.s, 0, 255); + thread->context.t = NULL; /* NULL for the implicit main thread */ + __running_self_entry() = thread; + + if (thread->context.s == NULL) + { + fprintf(stderr, "Failed to create main semaphore\n"); + return; + } + + /* Tell all threads jump back to their start routines, unlock and exit + gracefully - we'll check each one in turn for it's status. Threads + _could_ terminate via thread_exit or multiple threads could exit + on each unlock but that is safe. */ + + /* Setup jump for exit */ + if (setjmp(thread_jmpbufs[THREAD_ID_SLOT(thread->id)]) == 0) + { + THREAD_DEBUGF("Main Thread: %lu (%s)\n", + (unsigned long)thread->id, + THREAD_GET_NAME(thread)); + return; + } + + RecursiveLock_Unlock(&m); + + /* Set to 'COMMAND_DONE' when other rockbox threads have exited. */ + while (threads_status < THREADS_EXIT_COMMAND_DONE) + sys_delay(10); + + /* We're the main thead - perform exit - doesn't return. */ + sim_do_exit(); +} + diff --git a/firmware/target/hosted/ctru/thread-ctru.h b/firmware/target/hosted/ctru/thread-ctru.h new file mode 100644 index 0000000000..89e2d121cb --- /dev/null +++ b/firmware/target/hosted/ctru/thread-ctru.h @@ -0,0 +1,32 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2025 Mauricio G. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __THREAD_CTRU_H__ +#define __THREAD_CTRU_H__ + +/* extra thread functions that only apply when running on hosting platforms */ +void sim_thread_lock(void *me); +void * sim_thread_unlock(void); +void sim_thread_exception_wait(void); +void sim_thread_shutdown(void); /* Shut down all kernel threads gracefully */ + +#endif /* #ifndef __THREAD_CTRU_H__ */ + diff --git a/firmware/target/hosted/ctru/timer-ctru.c b/firmware/target/hosted/ctru/timer-ctru.c new file mode 100644 index 0000000000..4c608b667b --- /dev/null +++ b/firmware/target/hosted/ctru/timer-ctru.c @@ -0,0 +1,61 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2025 Mauricio G. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ + +#include "sys_timer.h" +#include "timer.h" + +static int timer_prio = -1; +void (*global_timer_callback)(void); +int timerId; + +u32 _timer_callback(u32 interval, void *param){ + (void)param; + global_timer_callback(); + return(interval); +} + +#define cycles_to_miliseconds(cycles) \ + ((int)((1000*cycles)/TIMER_FREQ)) + +bool timer_register(int reg_prio, void (*unregister_callback)(void), + long cycles, void (*timer_callback)(void)) +{ + (void)unregister_callback; + if (reg_prio <= timer_prio || cycles == 0) + return false; + timer_prio=reg_prio; + global_timer_callback=timer_callback; + timerId=sys_add_timer(cycles_to_miliseconds(cycles), _timer_callback, 0); + return true; +} + +bool timer_set_period(long cycles) +{ + sys_remove_timer(timerId); + timerId=sys_add_timer(cycles_to_miliseconds(cycles), _timer_callback, 0); + return true; +} + +void timer_unregister(void) +{ + sys_remove_timer(timerId); + timer_prio = -1; +} diff --git a/firmware/target/hosted/ctru/timer-ctru_sys.c b/firmware/target/hosted/ctru/timer-ctru_sys.c new file mode 100644 index 0000000000..4c608b667b --- /dev/null +++ b/firmware/target/hosted/ctru/timer-ctru_sys.c @@ -0,0 +1,61 @@ +/*************************************************************************** +* __________ __ ___. +* Open \______ \ ____ ____ | | _\_ |__ _______ ___ +* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +* \/ \/ \/ \/ \/ +* $Id$ +* +* Copyright (C) 2025 Mauricio G. +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY +* KIND, either express or implied. +* +****************************************************************************/ + +#include "sys_timer.h" +#include "timer.h" + +static int timer_prio = -1; +void (*global_timer_callback)(void); +int timerId; + +u32 _timer_callback(u32 interval, void *param){ + (void)param; + global_timer_callback(); + return(interval); +} + +#define cycles_to_miliseconds(cycles) \ + ((int)((1000*cycles)/TIMER_FREQ)) + +bool timer_register(int reg_prio, void (*unregister_callback)(void), + long cycles, void (*timer_callback)(void)) +{ + (void)unregister_callback; + if (reg_prio <= timer_prio || cycles == 0) + return false; + timer_prio=reg_prio; + global_timer_callback=timer_callback; + timerId=sys_add_timer(cycles_to_miliseconds(cycles), _timer_callback, 0); + return true; +} + +bool timer_set_period(long cycles) +{ + sys_remove_timer(timerId); + timerId=sys_add_timer(cycles_to_miliseconds(cycles), _timer_callback, 0); + return true; +} + +void timer_unregister(void) +{ + sys_remove_timer(timerId); + timer_prio = -1; +} diff --git a/packaging/ctru/ctru.make b/packaging/ctru/ctru.make new file mode 100644 index 0000000000..288b4ac3bd --- /dev/null +++ b/packaging/ctru/ctru.make @@ -0,0 +1,101 @@ +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# $Id$ +# + +# 3ds_rules +export DEVKITARM ?= /opt/devkitpro/devkitARM +export DEVKITPRO ?= /opt/devkitpro + +PORTLIBS := $(DEVKITPRO)/portlibs/3ds + +CTRULIB ?= $(DEVKITPRO)/libctru + +export PATH := $(DEVKITPRO)/portlibs/3ds/bin:$(PATH) + +# base_rules +export SHELL := /usr/bin/env bash + +DEVKITPATH=$(shell echo "$(DEVKITPRO)" | sed -e 's/^\([a-zA-Z]\):/\/\1/') + +export PATH := $(DEVKITPATH)/tools/bin:$(DEVKITPATH)/devkitARM/bin:$(PATH) + +# 3DSX +VERSION_MAJOR := 1 +VERSION_MINOR := 0 +VERSION_MICRO := 0 + +APP_TITLE := rockbox +APP_DESCRIPTION := Open Source Jukebox Firmware +APP_AUTHOR := rockbox.org +APP_ICON := $(ROOTDIR)/packaging/ctru/res/icon.png + +# CIA +BANNER_AUDIO := $(ROOTDIR)/packaging/ctru/res/banner.wav +BANNER_IMAGE := $(ROOTDIR)/packaging/ctru/res/banner.cgfx +RSF_PATH := $(ROOTDIR)/packaging/ctru/res/app.rsf +#LOGO := $(ROOTDIR)/packaging/ctru/logo.lz11 +UNIQUE_ID := 0xCB001 +PRODUCT_CODE := CTR-ROCKBOX +ICON_FLAGS := nosavebackups,visible + +# CIA Configuration +USE_ON_SD := true +APP_ENCRYPTED := false +CATEGORY := Application +USE_ON_SD := true +MEMORY_TYPE := Application +SYSTEM_MODE := 64MB +SYSTEM_MODE_EXT := Legacy +CPU_SPEED := 268MHz +ENABLE_L2_CACHE := false + +.SECONDEXPANSION: # $$(OBJ) is not populated until after this + +MAKEROM ?= makerom +MAKEROM_ARGS := -elf "$(BINARY).elf" -rsf "$(RSF_PATH)" -banner "$(BUILDDIR)/banner.bnr" -icon "$(BUILDDIR)/icon.icn" -DAPP_TITLE="$(APP_TITLE)" -DAPP_PRODUCT_CODE="$(PRODUCT_CODE)" -DAPP_UNIQUE_ID="$(UNIQUE_ID)" -DAPP_ENCRYPTED="$(APP_ENCRYPTED)" -DAPP_SYSTEM_MODE="$(SYSTEM_MODE)" -DAPP_SYSTEM_MODE_EXT="$(SYSTEM_MODE_EXT)" -DAPP_CATEGORY="$(CATEGORY)" -DAPP_USE_ON_SD="$(USE_ON_SD)" -DAPP_MEMORY_TYPE="$(MEMORY_TYPE)" -DAPP_CPU_SPEED="$(CPU_SPEED)" -DAPP_ENABLE_L2_CACHE="$(ENABLE_L2_CACHE)" +MAKEROM_ARGS += -major $(VERSION_MAJOR) -minor $(VERSION_MINOR) -micro $(VERSION_MICRO) + +ifneq ($(strip $(LOGO)),) + MAKEROM_ARGS += -logo "$(LOGO)" +endif +ifneq ($(strip $(ROMFS)),) + MAKEROM_ARGS += -DAPP_ROMFS="$(ROMFS)" +endif + +BANNERTOOL ?= bannertool + +ifeq ($(suffix $(BANNER_IMAGE)),.cgfx) + BANNER_IMAGE_ARG := -ci +else + BANNER_IMAGE_ARG := -i +endif + +ifeq ($(suffix $(BANNER_AUDIO)),.cwav) + BANNER_AUDIO_ARG := -ca +else + BANNER_AUDIO_ARG := -a +endif + +# main binary +$(BUILDDIR)/$(BINARY): $$(OBJ) $(FIRMLIB) $(VOICESPEEXLIB) $(CORE_LIBS) +ifeq ($(UNAME), Darwin) + $(call PRINTS,LD $(BINARY))$(CC) -o $@ $^ $(LDOPTS) $(GLOBAL_LDOPTS) -Wl,$(LDMAP_OPT),$(BUILDDIR)/rockbox.map +else + $(call PRINTS,LD $(BINARY))$(CC) -o $@ -Wl,--start-group $^ -Wl,--end-group $(LDOPTS) $(GLOBAL_LDOPTS) \ + -Wl,$(LDMAP_OPT),$(BUILDDIR)/rockbox-.map + @mv $(BINARY) $(BINARY).elf + smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) "rockbox.smdh" + 3dsxtool $(BINARY).elf $(BINARY).3dsx --smdh="rockbox.smdh" + $(BANNERTOOL) makebanner $(BANNER_IMAGE_ARG) "$(BANNER_IMAGE)" $(BANNER_AUDIO_ARG) "$(BANNER_AUDIO)" -o "$(BUILDDIR)/banner.bnr" + $(BANNERTOOL) makesmdh -s "$(APP_TITLE)" -l "$(APP_DESCRIPTION)" -p "$(APP_AUTHOR)" -i "$(APP_ICON)" -f "$(ICON_FLAGS)" -o "$(BUILDDIR)/icon.icn" + $(MAKEROM) -f cia -o "$(BINARY).cia" -target t -exefslogo $(MAKEROM_ARGS) +ifndef DEBUG + $(SILENT)rm $(BINARY).elf +endif +endif + diff --git a/packaging/ctru/res/app.rsf b/packaging/ctru/res/app.rsf new file mode 100644 index 0000000000..e89849df48 --- /dev/null +++ b/packaging/ctru/res/app.rsf @@ -0,0 +1,286 @@ +BasicInfo: + Title : $(APP_TITLE) + ProductCode : $(APP_PRODUCT_CODE) + Logo : Homebrew + +RomFs: + RootPath: $(APP_ROMFS) + +TitleInfo: + Category : $(APP_CATEGORY) + UniqueId : $(APP_UNIQUE_ID) + +Option: + UseOnSD : $(APP_USE_ON_SD) # true if App is to be installed to SD + FreeProductCode : true # Removes limitations on ProductCode + MediaFootPadding : false # If true CCI files are created with padding + EnableCrypt : $(APP_ENCRYPTED) # Enables encryption for NCCH and CIA + EnableCompress : true # Compresses where applicable (currently only exefs:/.code) + +AccessControlInfo: + CoreVersion : 2 + + # Exheader Format Version + DescVersion : 2 + + # Minimum Required Kernel Version (below is for 4.5.0) + ReleaseKernelMajor : "02" + ReleaseKernelMinor : "33" + + # ExtData + UseExtSaveData : false # enables ExtData + #ExtSaveDataId : 0x300 # only set this when the ID is different to the UniqueId + + # FS:USER Archive Access Permissions + # Uncomment as required + FileSystemAccess: + - CategorySystemApplication + - CategoryHardwareCheck + - CategoryFileSystemTool + - Debug + - TwlCardBackup + - TwlNandData + - Boss + - DirectSdmc + - Core + - CtrNandRo + - CtrNandRw + - CtrNandRoWrite + - CategorySystemSettings + - CardBoard + - ExportImportIvs + - DirectSdmcWrite + - SwitchCleanup + - SaveDataMove + - Shop + - Shell + - CategoryHomeMenu + - SeedDB + IoAccessControl: + - FsMountNand + - FsMountNandRoWrite + - FsMountTwln + - FsMountWnand + - FsMountCardSpi + - UseSdif3 + - CreateSeed + - UseCardSpi + + # Process Settings + MemoryType : $(APP_MEMORY_TYPE) # Application/System/Base + SystemMode : $(APP_SYSTEM_MODE) # 64MB(Default)/96MB/80MB/72MB/32MB + IdealProcessor : 0 + AffinityMask : 1 + Priority : 16 + MaxCpu : 0x9E # Default + HandleTableSize : 0x200 + DisableDebug : false + EnableForceDebug : false + CanWriteSharedPage : true + CanUsePrivilegedPriority : false + CanUseNonAlphabetAndNumber : true + PermitMainFunctionArgument : true + CanShareDeviceMemory : true + RunnableOnSleep : false + SpecialMemoryArrange : true + + # New3DS Exclusive Process Settings + SystemModeExt : $(APP_SYSTEM_MODE_EXT) # Legacy(Default)/124MB/178MB Legacy:Use Old3DS SystemMode + CpuSpeed : $(APP_CPU_SPEED) # 268MHz(Default)/804MHz + EnableL2Cache : $(APP_ENABLE_L2_CACHE) # false(default)/true + CanAccessCore2 : true + + # Virtual Address Mappings + IORegisterMapping: + - 1ff00000-1ff7ffff # DSP memory + MemoryMapping: + - 1f000000-1f5fffff:r # VRAM + + # Accessible SVCs, : + SystemCallAccess: + ControlMemory: 1 + QueryMemory: 2 + ExitProcess: 3 + GetProcessAffinityMask: 4 + SetProcessAffinityMask: 5 + GetProcessIdealProcessor: 6 + SetProcessIdealProcessor: 7 + CreateThread: 8 + ExitThread: 9 + SleepThread: 10 + GetThreadPriority: 11 + SetThreadPriority: 12 + GetThreadAffinityMask: 13 + SetThreadAffinityMask: 14 + GetThreadIdealProcessor: 15 + SetThreadIdealProcessor: 16 + GetCurrentProcessorNumber: 17 + Run: 18 + CreateMutex: 19 + ReleaseMutex: 20 + CreateSemaphore: 21 + ReleaseSemaphore: 22 + CreateEvent: 23 + SignalEvent: 24 + ClearEvent: 25 + CreateTimer: 26 + SetTimer: 27 + CancelTimer: 28 + ClearTimer: 29 + CreateMemoryBlock: 30 + MapMemoryBlock: 31 + UnmapMemoryBlock: 32 + CreateAddressArbiter: 33 + ArbitrateAddress: 34 + CloseHandle: 35 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + SignalAndWait: 38 + DuplicateHandle: 39 + GetSystemTick: 40 + GetHandleInfo: 41 + GetSystemInfo: 42 + GetProcessInfo: 43 + GetThreadInfo: 44 + ConnectToPort: 45 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + OpenProcess: 51 + OpenThread: 52 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetThreadId: 55 + GetResourceLimit: 56 + GetResourceLimitLimitValues: 57 + GetResourceLimitCurrentValues: 58 + GetThreadContext: 59 + Break: 60 + OutputDebugString: 61 + ControlPerformanceCounter: 62 + CreatePort: 71 + CreateSessionToPort: 72 + CreateSession: 73 + AcceptSession: 74 + ReplyAndReceive1: 75 + ReplyAndReceive2: 76 + ReplyAndReceive3: 77 + ReplyAndReceive4: 78 + ReplyAndReceive: 79 + BindInterrupt: 80 + UnbindInterrupt: 81 + InvalidateProcessDataCache: 82 + StoreProcessDataCache: 83 + FlushProcessDataCache: 84 + StartInterProcessDma: 85 + StopDma: 86 + GetDmaState: 87 + RestartDma: 88 + DebugActiveProcess: 96 + BreakDebugProcess: 97 + TerminateDebugProcess: 98 + GetProcessDebugEvent: 99 + ContinueDebugEvent: 100 + GetProcessList: 101 + GetThreadList: 102 + GetDebugThreadContext: 103 + SetDebugThreadContext: 104 + QueryDebugProcessMemory: 105 + ReadProcessMemory: 106 + WriteProcessMemory: 107 + SetHardwareBreakPoint: 108 + GetDebugThreadParam: 109 + ControlProcessMemory: 112 + MapProcessMemory: 113 + UnmapProcessMemory: 114 + CreateCodeSet: 115 + CreateProcess: 117 + TerminateProcess: 118 + SetProcessResourceLimits: 119 + CreateResourceLimit: 120 + SetResourceLimitValues: 121 + AddCodeSegment: 122 + Backdoor: 123 + KernelSetState: 124 + QueryProcessMemory: 125 + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.6.0) + ServiceAccessControl: + - APT:U + - ac:u + - am:net + - boss:U + - cam:u + - cecd:u + - cfg:nor + - cfg:u + - csnd:SND + - dsp::DSP + - frd:u + - fs:USER + - gsp::Gpu + - gsp::Lcd + - hid:USER + - http:C + - ir:rst + - ir:u + - ir:USER + - mic:u + - mcu::HWC + - ndm:u + - news:s + - nwm::EXT + - nwm::UDS + - ptm:sysm + - ptm:u + - pxi:dev + - soc:U + - ssl:C + - y2r:u + + +SystemControlInfo: + SaveDataSize: 0KB # Change if the app uses savedata + RemasterVersion: $(APP_VERSION_MAJOR) + StackSize: 0x40000 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # : + Dependency: + ac: 0x0004013000002402 + #act: 0x0004013000003802 + am: 0x0004013000001502 + boss: 0x0004013000003402 + camera: 0x0004013000001602 + cecd: 0x0004013000002602 + cfg: 0x0004013000001702 + codec: 0x0004013000001802 + csnd: 0x0004013000002702 + dlp: 0x0004013000002802 + dsp: 0x0004013000001a02 + friends: 0x0004013000003202 + gpio: 0x0004013000001b02 + gsp: 0x0004013000001c02 + hid: 0x0004013000001d02 + http: 0x0004013000002902 + i2c: 0x0004013000001e02 + ir: 0x0004013000003302 + mcu: 0x0004013000001f02 + mic: 0x0004013000002002 + ndm: 0x0004013000002b02 + news: 0x0004013000003502 + #nfc: 0x0004013000004002 + nim: 0x0004013000002c02 + nwm: 0x0004013000002d02 + pdn: 0x0004013000002102 + ps: 0x0004013000003102 + ptm: 0x0004013000002202 + #qtm: 0x0004013020004202 + ro: 0x0004013000003702 + socket: 0x0004013000002e02 + spi: 0x0004013000002302 + ssl: 0x0004013000002f02 diff --git a/packaging/ctru/res/banner.cgfx b/packaging/ctru/res/banner.cgfx new file mode 100644 index 0000000000000000000000000000000000000000..e806a310bbbfa4b9d00f6083ca8daad648ba43fd GIT binary patch literal 480504 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 literal 0 HcmV?d00001 diff --git a/packaging/ctru/res/banner.png b/packaging/ctru/res/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..87c0ae0f66adabcb395ff28ece974887dc7e8b93 GIT binary patch literal 17841 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 U=)*XY%m4rY07*qoM6N<$f-+)uPyhe` literal 0 HcmV?d00001 diff --git a/packaging/ctru/res/banner.wav b/packaging/ctru/res/banner.wav new file mode 100644 index 0000000000000000000000000000000000000000..90d7b2c9ca4c6e8d77fc9f15df25c679fb0a77bd GIT binary patch literal 228624 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

>i-Grl+^?PMrE?jJFI4etSnyx(8G_V~h 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%0DZn#201x|(kgB|H1+X@}O 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 E578~*6#xJL literal 0 HcmV?d00001 diff --git a/packaging/ctru/res/banner_.cgfx b/packaging/ctru/res/banner_.cgfx new file mode 100644 index 0000000000000000000000000000000000000000..028c466d3febd921d139b55770bb4336ceef0e2e GIT binary patch literal 512056 zcmeFa2b>f|_b%MIX9meR2ultEl0n$rUXn;sl98MQl(?XRAPhl*AcBGlf`F0~6B&V> z2El|0QH+=n5wj$fAl&ElboHDWr+3%)zW09r`}?+=bLOejPn|jyy1I5|YG~c=+FLGP zDkkC3n;kSI1)xpK9xWTykt7*-9E5EBQljZj6_M~ch<}7#r*!SgKICl7ZQ8f)Q5)AO z|79HXDvr7ikfkp0s{ubONg1s>x9J3Ern0hl9?GIZb`X%lR!kg25=ETEBRgAm*SMc3 zk7CKl7j4&-S43m0QX-CBlPZZc`J*;01fepExdl^sz1(Y5UNjpFIIeZHEd5kbk{SV1`7*qGhjbU< zW)KCQ>H2WsYalAFpG0~#Fpfem0*m8A0NG6#47(=zL2#G5e5#+|nl6F8$oGIZD+jKd zU+xdym>jsQ-eJnu8hm=?ZB_*avL&_|*~D=@fC^UeiqSTUcC{iELb?a8QJZSiN=VcF zmJU&1xs)PFi-2)te3~LjhauS=TVvNVwgA5rODD~?Aa*@tHt>vCIw^lp?0Uuk;6AZ* zQhvI7JrKPbrk92((Q%I#XWUU+Rsn(9i`uXp8lA4uxT9Bb+ynxRb3H|p&H!Ie8PH}; zkuHWjosgz+-VNzSNcTosmO|19qrMOu9n45$PUC&qTVM zlwX>O^f;vFBb{F=AgPs5KGJKEE-w|7?nHVE(wC5~fEM}`=?{^<9qA%cVd<*MC?DxQ zNNZA2sXfxg(1^W|E(*r&NH;=y1k#12GSYOUdmud&=@L>&=_#bgAw2-;VzBH*dXbwh zj_Y3|y#?uExL#Z;EnP!qZ!QX105^r-(bNcTdz5z>=!{R-50 zBGNsOeiZ2f(v{LOq{kusB+^%+#zs|?kMuUA3!=uENN+*90NS{alp-BN`a`5~1cK!y zsXnAJgbtdw=s;HQDC}N?Ay5`rhUgIDa=ys(&6Qr(Knd{PNBS@%C4rA{oMR*7Q(3E! zUIVF@z*k-VRK_m={ure1f@CD{HJ9I&@$-S-66v;(E(!c-lSooU#t(pB80q4WehGY< zTj@AiF8T@`pmzBN>F*$;Vc_i}=GVQ9uYkW1>8+4(0^hyIrG<=t8F5TS`hLiQ1bz@{ zI{GvIMew^KeIsNguJL$6M8;7+#!op1enq5H5EqqCZAkqp+8$7nWBhO`cqhwB(s;a* zZ^}dcD%uiIdLP%_BfJ#6y+~h&*HSQ&fAURyF@9Dt{&(OlM7k7SsaWn`jGr+vzV z>BEqe1ipyBALCaCzYEf9AoUXXq7UjZel_q@kiH9&k-+!r%=lHo|GhNEKWtqR_@d7a z;<|eTs(`-->Eht`gOS%)jQ^F4Um5%bNPhCG)0>2;9TOr{Dz8L=*j9(G_ zdPv_7S&+aNF=fNzsADDZJC`iEXK z&_XnpTS83PX$iHO9B{@=e0J1ZK86Oh!cd~gymE9oze6|Vf=TkyCDCpUjVZDx9=Wwq zzW>>N2PIVP2-1Hg*pekb{^i#J$?QX3+T_kaaaY5XY6Iy<0LT1jFI=7~tq41YN{-G} zHN#chCMi8`aqbbl6Xs2EWCGVH=%m66#6S}l-B%2XaQExlbVE`v#PYUcm}jB!m+W}k zHP*vZe2;WPn38hBs5&WKF8GFb&CTGx94∾6eAAcn%82WnBBjy(Vnpm9G7s&9%Rh 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 V&bPhv*3KWE`r^)4bUTgT{|`_bjF$ia literal 0 HcmV?d00001 diff --git a/packaging/ctru/res/icon.png b/packaging/ctru/res/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d788de720538b28d61210c6731b5ee653eca10b9 GIT binary patch literal 2099 zcmV-32+a41P)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vXzU;qWgU;$R92@3!K00(qQO+^Rk2^0Vm99kM*jsO4$ ziAh93RA}DqT5C*HM-={~-Ngzh_*hU2YE?v91zcLe(u7he4^tHlRn#bj0&1Ep#->tH zW1=WTQ8A4L4MbZJpG8er6j9M)k#tdr3i42SXb~+g3Tt6ew?Br<+}V5YvY@Ro@gz4p z@0oMv%=ev{Y(GN*40waZ0&lpyRp52YyIkV24tU%q-pI+`^dR+3ZP}uc6=>sjG zYX{!30PF_?mNHu2t|#e1*1#Yu+K0bBW*$QU42A+2^0&eOh<^b}7_ROi?f73)HVlzL zY}=%07~0PW+ZqaBc%p_OexdZ(Nzt@Ce=FNJE{xXw@e?gK%Y{yt03K1)(ws#WZv@hF z*|w{81M4$@j!w3`qZ8QlE0B;WKK6|}rgtnci{@R&^zjVjUZ&}^6J&BRNz4KY%h<9D zrR*Y%<$kkt-C5o|abc`$^-6)I+o|NxGs|xLc7y}LMCJPk#r$}C3pn)w4JRp-cm<!t~_*j|!YgmpEb05hasA>StYA77?t^un&m=1liB>0N+E2PR_OIQ3cMG086(JOy|=)=ZmU2;{Msu3H)|}=0A2Jze!QFtn)cB1m6Hsk*$+GJO7m` zGZpY~2A0ky9Ka`##4Mnt4ftdt>z@bC5XMb8!UlblyTS~YQSA8Bz5`AclFuW`^jQe| zf@iEkGkGBSFtBVkplt<43}fpqmI9tGY?)Lv$&rs3{LWfq-eLBf$Qp3P*X+Gp{1CeX z2hRd`9{>tlHo`o432=7oIhN0ir{rVo3cZm*RwVr9@o(bYZTi{BY5q<*RP0O1@TH)#dj#!+54 zT>_NV@Xi1iv>D^`JU_sqA5e6igwT;eG(K9G0NC3BBU}@qQ4c|GC2%w|17(^bEDi)3 zn#d>RTKqE;83ZVu$s<5jgEU`wI8%T)coz7(r7QO8dTU{XZ>jQH=|h@vBo7LQ;Q)Xm z`_r*6ZO7|-nd8gE(ZF6cN&9-dAy12(sOAv%%)UsrZGsc<;5hK;36Ojc*rPT*;M@ff zu(lb9dkuBSS7%GMn;sm3k&dI#*7^j;4rKIM0f7r8MUyz_$29WVP}@ijt?OvuJxjo4 zvA7FWTq}js2jgI6WlaOU`;EAeuV!3pNlYyKXUvAJ-4M#odOd0?%Q0?(D`awVrMp#q z6RL<%!8|%$8&<2n#jVO4rtidd)+8)w(gHzKffI#9F)5ii$z4#Ua2SrzMUfb)a6s~g zIILWoh|j;AA!sL)%LV<%j(5S5m{<(3w&`9x0I0JMbuV620c|U#e~vA`2_{HU-_-M# z>U87&oj5TI7&**zn~&U-g0i6s2T2GumLWsw1S1`tm^!&!j%6#? zzTBn$#S7CB<+us12n%1v@Bw#t1rG#ERdDn4?#{<=N?~A?pXS8ZKbYww$pcbScZkFw z{M!>BpZNz=-=P0BVO%%mA*yUJ!SMmlVtX82# zOW!lUn!BKHE@Y0ld3wWLIhBD@DOnN|OE2~%#pLSA>swk<+zp#t+$2`_N)>n=^7gL= dZxwh+`4@Ru@46qjE^Gh*002ovPDHLkV1hp2*&YA@ literal 0 HcmV?d00001 diff --git a/packaging/ctru/res/icon_yellow.png b/packaging/ctru/res/icon_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..76c2f42b7f3570e66b368008d72fce7581112880 GIT binary patch literal 6166 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 I%q#YP0AC8soB#j- literal 0 HcmV?d00001 diff --git a/packaging/ctru/rockbox.xml b/packaging/ctru/rockbox.xml new file mode 100644 index 0000000000..0e01ecc6e7 --- /dev/null +++ b/packaging/ctru/rockbox.xml @@ -0,0 +1,7 @@ + + /3ds/.rockbox/rockbox.3dsx + .rockbox/icon.icn + rockbox + Open Source Jukebox Firmware + rockbox.org + \ No newline at end of file