From 540ad6ee5a52e42477f7ad90bfb6496bd1292143 Mon Sep 17 00:00:00 2001 From: Julian Uy Date: Thu, 16 Jul 2026 20:29:57 -0500 Subject: [PATCH 1/3] refactor: Use common libsdr definitions --- common/include/libsdr-common.h | 97 +++++++++++++++++++++++++++ iop/sound/sdrdrv/include/sdrdrv.h | 2 + iop/sound/sdrdrv/src/sdd_cb.c | 38 +++++------ iop/sound/sdrdrv/src/sdd_com.c | 107 +++++++++++++++--------------- iop/sound/sdrdrv/src/sdd_main.c | 2 +- iop/sound/sdrdrv/src/sdr_i.h | 15 +---- 6 files changed, 175 insertions(+), 86 deletions(-) create mode 100644 common/include/libsdr-common.h diff --git a/common/include/libsdr-common.h b/common/include/libsdr-common.h new file mode 100644 index 000000000000..54d2b3ae47ca --- /dev/null +++ b/common/include/libsdr-common.h @@ -0,0 +1,97 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +/** + * @file + * Common definitions for libsdr on the EE and IOP + */ + +#ifndef __LIBSDR_COMMON_H__ +#define __LIBSDR_COMMON_H__ + +#define sce_SDR_DEV 0x80000701 +#define sce_SDRST_CB 0x80000704 + +#define rSdInit 0x8000 +#define rSdSetParam 0x8010 +#define rSdGetParam 0x8020 +#define rSdSetSwitch 0x8030 +#define rSdGetSwitch 0x8040 +#define rSdSetAddr 0x8050 +#define rSdGetAddr 0x8060 +#define rSdSetCoreAttr 0x8070 +#define rSdGetCoreAttr 0x8080 +#define rSdNote2Pitch 0x8090 +#define rSdPitch2Note 0x80A0 +#define rSdProcBatch 0x80B0 +#define rSdProcBatchEx 0x80C0 +#define rSdVoiceTrans 0x80D0 +#define rSdBlockTrans 0x80E0 +#define rSdVoiceTransStatus 0x80F0 +#define rSdBlockTransStatus 0x8100 +#define rSdSetTransCallback 0x8110 +#define rSdSetIRQCallback 0x8120 +#define rSdSetEffectAttr 0x8130 +#define rSdGetEffectAttr 0x8140 +#define rSdClearEffectWorkArea 0x8150 +#define rSdSetTransIntrHandler 0x8160 +#define rSdSetSpu2IntrHandler 0x8170 +#define rSdStopTrans 0x8180 +#define rSdCleanEffectWorkArea 0x8190 +#define rSdSetEffectMode 0x81A0 +#define rSdSetEffectModeParams 0x81B0 +#define rSdProcBatch2 0x81C0 +#define rSdProcBatchEx2 0x81D0 +#define rSdChangeThreadPriority 0x8F10 +#define rSdUserCommand0 0x9000 +#define rSdUserCommand1 0x9010 +#define rSdUserCommand2 0x9020 +#define rSdUserCommand3 0x9030 +#define rSdUserCommand4 0x9040 +#define rSdUserCommand5 0x9050 +#define rSdUserCommand6 0x9060 +#define rSdUserCommand7 0x9070 +#define rSdUserCommand8 0x9080 +#define rSdUserCommand9 0x9090 +#define rSdUserCommandA 0x90A0 +#define rSdUserCommandB 0x90B0 +#define rSdUserCommandC 0x90C0 +#define rSdUserCommandD 0x90D0 +#define rSdUserCommandE 0x90E0 +#define rSdUserCommandF 0x90F0 +#define rSdUserCommandMin rSdUserCommand0 +#define rSdUserCommandMax rSdUserCommandF + +#define SDR_CMD_CB_INIT 0xE620 +#define SDR_CMD_CB_DEINIT 0xE630 + +#define SDR_CB_DMA0 (1 << 0) +#define SDR_CB_DMA1 (1 << 1) +#define SDR_CB_IRQ (1 << 2) +#define SDR_CB_DMA0INT (1 << 8) +#define SDR_CB_DMA1INT (1 << 9) +#define SDR_CB_IRQINT (1 << 10) + + +typedef struct SdrEECBData_ +{ + // cppcheck-suppress unusedStructMember + int mode; + // cppcheck-suppress unusedStructMember + int voice_bit; + // cppcheck-suppress unusedStructMember + int status; + // cppcheck-suppress unusedStructMember + int opt; + // cppcheck-suppress unusedStructMember + int pad[12]; +} SdrEECBData; + +#endif /* __LIBSDR_COMMON_H__ */ diff --git a/iop/sound/sdrdrv/include/sdrdrv.h b/iop/sound/sdrdrv/include/sdrdrv.h index 3802a39b3225..1fe4a0191eb5 100644 --- a/iop/sound/sdrdrv/include/sdrdrv.h +++ b/iop/sound/sdrdrv/include/sdrdrv.h @@ -11,6 +11,8 @@ #ifndef _SDRDRV_H #define _SDRDRV_H +#include + typedef int (*sceSdrUserCommandFunction)(unsigned int command, void *data, int size); extern int sceSdrChangeThreadPriority(int priority_main, int priority_cb); diff --git a/iop/sound/sdrdrv/src/sdd_cb.c b/iop/sound/sdrdrv/src/sdd_cb.c index 0a1b54ce1a7e..c1ba791bf5f3 100644 --- a/iop/sound/sdrdrv/src/sdd_cb.c +++ b/iop/sound/sdrdrv/src/sdd_cb.c @@ -36,34 +36,34 @@ static void sceSifCmdLoop2(SifRpcClientData_t *cd, SdrEECBInfo *cbi) while ( 1 ) { // Only the obsolete DMA0/DMA1/IRQ funcs (not implemented in libsdr 4.0.1) clashes - if ( mode_cur & (1 << 0) ) + if ( mode_cur & SDR_CB_DMA0 ) { - mode_cur &= ~(1 << 0); + mode_cur &= ~SDR_CB_DMA0; eeCBDataSend.mode = 1; } - else if ( mode_cur & (1 << 1) ) + else if ( mode_cur & SDR_CB_DMA1 ) { - mode_cur &= ~(1 << 1); + mode_cur &= ~SDR_CB_DMA1; eeCBDataSend.mode = 2; } - else if ( mode_cur & (1 << 2) ) + else if ( mode_cur & SDR_CB_IRQ ) { - mode_cur &= ~(1 << 2); + mode_cur &= ~SDR_CB_IRQ; eeCBDataSend.mode = 3; } - else if ( mode_cur & (1 << 8) ) + else if ( mode_cur & SDR_CB_DMA0INT ) { - mode_cur &= ~(1 << 8); + mode_cur &= ~SDR_CB_DMA0INT; eeCBDataSend.mode = 11; } - else if ( mode_cur & (1 << 9) ) + else if ( mode_cur & SDR_CB_DMA1INT ) { - mode_cur &= ~(1 << 9); + mode_cur &= ~SDR_CB_DMA1INT; eeCBDataSend.mode = 12; } - else if ( mode_cur & (1 << 10) ) + else if ( mode_cur & SDR_CB_IRQINT ) { - mode_cur &= ~(1 << 10); + mode_cur &= ~SDR_CB_IRQINT; eeCBDataSend.mode = 13; } else @@ -99,7 +99,7 @@ int _sce_sdrDMA0CallBackProc(void *data) { (void)data; - g_eeCBInfo.m_eeCBData.mode |= (1 << 0); + g_eeCBInfo.m_eeCBData.mode |= SDR_CB_DMA0; iWakeupThread(g_eeCBInfo.m_thid_cb); return 1; } @@ -108,7 +108,7 @@ int _sce_sdrDMA1CallBackProc(void *data) { (void)data; - g_eeCBInfo.m_eeCBData.mode |= (1 << 1); + g_eeCBInfo.m_eeCBData.mode |= SDR_CB_DMA1; iWakeupThread(g_eeCBInfo.m_thid_cb); return 1; } @@ -117,7 +117,7 @@ int _sce_sdrIRQCallBackProc(void *data) { (void)data; - g_eeCBInfo.m_eeCBData.mode |= (1 << 2); + g_eeCBInfo.m_eeCBData.mode |= SDR_CB_IRQ; iWakeupThread(g_eeCBInfo.m_thid_cb); return 1; } @@ -130,7 +130,7 @@ int _sce_sdrDMA0IntrHandler(int core, void *common) (void)core; cbi = (SdrEECBInfo *)common; - cbi->m_eeCBData.mode |= (1 << 8); + cbi->m_eeCBData.mode |= SDR_CB_DMA0INT; iWakeupThread(cbi->m_thid_cb); return 0; } @@ -142,7 +142,7 @@ int _sce_sdrDMA1IntrHandler(int core, void *common) (void)core; cbi = (SdrEECBInfo *)common; - cbi->m_eeCBData.mode |= (1 << 9); + cbi->m_eeCBData.mode |= SDR_CB_DMA1INT; iWakeupThread(cbi->m_thid_cb); return 0; } @@ -154,7 +154,7 @@ int _sce_sdrSpu2IntrHandler(int core_bit, void *common) (void)core_bit; cbi = (SdrEECBInfo *)common; - cbi->m_eeCBData.mode |= (1 << 10); + cbi->m_eeCBData.mode |= SDR_CB_IRQINT; cbi->m_eeCBData.voice_bit = core_bit; iWakeupThread(cbi->m_thid_cb); return 0; @@ -168,7 +168,7 @@ void sce_sdrcb_loop(void *arg) cbi = (SdrEECBInfo *)arg; cbi->m_eeCBData.mode = 0; - while ( sceSifBindRpc(&cd, 0x80000704, 0) >= 0 ) + while ( sceSifBindRpc(&cd, sce_SDRST_CB, 0) >= 0 ) { int i; diff --git a/iop/sound/sdrdrv/src/sdd_com.c b/iop/sound/sdrdrv/src/sdd_com.c index c08f8c38ce05..b7ea7871f665 100644 --- a/iop/sound/sdrdrv/src/sdd_com.c +++ b/iop/sound/sdrdrv/src/sdd_com.c @@ -47,10 +47,10 @@ void sce_sdr_loop(void *arg) si->m_rpc_sd = &rpc_sd; sceSifInitRpc(0); sceSifSetRpcQueue(&rpc_qd, GetThreadId()); - sceSifRegisterRpc(&rpc_sd, 0x80000701, sdrFunc, rpc_arg, 0, 0, &rpc_qd); + sceSifRegisterRpc(&rpc_sd, sce_SDR_DEV, sdrFunc, rpc_arg, 0, 0, &rpc_qd); // Unofficial: was inlined for ( i = 0; i < 16; i += 1 ) - sceSdrSetUserCommandFunction(0x9000 + (i * 0x10), NULL); + sceSdrSetUserCommandFunction(rSdUserCommandMin + (i * 0x10), NULL); sceSifRpcLoop(&rpc_qd); } @@ -156,51 +156,51 @@ static void *sdrFunc(int fno, void *buffer, int length) ret = StSetSeVol(*((u16 *)buffer + 2), *((u16 *)buffer + 4)); break; #endif - case 0x8000: + case rSdInit: ret = sceSdInit(*((u32 *)buffer + 1)); break; - case 0x8010: + case rSdSetParam: sceSdSetParam(*((u16 *)buffer + 2), *((u16 *)buffer + 4)); break; - case 0x8020: + case rSdGetParam: ret = sceSdGetParam(*((u16 *)buffer + 2)); break; - case 0x8030: + case rSdSetSwitch: sceSdSetSwitch(*((u16 *)buffer + 2), *((u32 *)buffer + 2)); break; - case 0x8040: + case rSdGetSwitch: ret = sceSdGetSwitch(*((u16 *)buffer + 2)); break; - case 0x8050: + case rSdSetAddr: sceSdSetAddr(*((u16 *)buffer + 2), *((u32 *)buffer + 2)); break; - case 0x8060: + case rSdGetAddr: ret = sceSdGetAddr(*((u16 *)buffer + 2)); break; - case 0x8070: + case rSdSetCoreAttr: sceSdSetCoreAttr(*((u16 *)buffer + 2), *((u16 *)buffer + 4)); break; - case 0x8080: + case rSdGetCoreAttr: ret = sceSdGetCoreAttr(*((u16 *)buffer + 2)); break; - case 0x8090: + case rSdNote2Pitch: ret = sceSdNote2Pitch(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u16 *)buffer + 6), *((u16 *)buffer + 8)); break; - case 0x80A0: + case rSdPitch2Note: ret = sceSdPitch2Note(*((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u16 *)buffer + 6)); break; - case 0x80B0: + case rSdProcBatch: ret = sceSdProcBatch(*((sceSdBatch **)buffer + 1), *((u32 **)buffer + 2), *((u32 *)buffer + 3)); break; - case 0x80C0: + case rSdProcBatchEx: ret = sceSdProcBatchEx( *((sceSdBatch **)buffer + 1), *((u32 **)buffer + 2), *((u32 *)buffer + 3), *((u32 *)buffer + 4)); break; - case 0x80D0: + case rSdVoiceTrans: ret = sceSdVoiceTrans( *((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 **)buffer + 4), *((u32 *)buffer + 5)); break; - case 0x80E0: + case rSdBlockTrans: #if SDRDRV_IMPLEMENT_AUTODMA { int i; @@ -281,86 +281,89 @@ static void *sdrFunc(int fno, void *buffer, int length) *((u16 *)buffer + 2), *((u16 *)buffer + 4), *((u8 **)buffer + 3), *((u32 *)buffer + 4), *((u32 *)buffer + 5)); #endif break; - case 0x80F0: + case rSdVoiceTransStatus: ret = sceSdVoiceTransStatus(*((u16 *)buffer + 2), *((u16 *)buffer + 4)); break; - case 0x8100: + case rSdBlockTransStatus: ret = sceSdBlockTransStatus(*((u16 *)buffer + 2), *((u16 *)buffer + 4)); break; #if SDRDRV_OBSOLETE_FUNCS - case 0x8110: + case rSdSetTransCallback: ret = (int)sceSdSetTransCallback( *((u32 *)buffer + 1) ? 1 : 0, *((u32 *)buffer + 2) ? (*((u32 *)buffer + 1) ? _sce_sdrDMA1CallBackProc : _sce_sdrDMA0CallBackProc) : 0); break; - case 0x8120: + case rSdSetIRQCallback: ret = (int)sceSdSetIRQCallback(*((u32 *)buffer + 1) ? _sce_sdrIRQCallBackProc : 0); break; #endif - case 0x8130: + case rSdSetEffectAttr: ret = sceSdSetEffectAttr(fno & 0xF, (sceSdEffectAttr *)buffer); break; - case 0x8140: + case rSdGetEffectAttr: sceSdGetEffectAttr(fno & 0xF, &g_sdrInfo.m_e_attr); return &g_sdrInfo.m_e_attr; - case 0x8150: + case rSdClearEffectWorkArea: ret = sceSdClearEffectWorkArea(*((u32 *)buffer + 1), *((u32 *)buffer + 2), *((u32 *)buffer + 3)); break; - case 0x8160: + case rSdSetTransIntrHandler: ret = (int)sceSdSetTransIntrHandler( *((u32 *)buffer + 1) ? 1 : 0, *((u32 *)buffer + 2) ? (*((u32 *)buffer + 1) ? _sce_sdrDMA1IntrHandler : 0) : _sce_sdrDMA0IntrHandler, &g_eeCBInfo); break; - case 0x8170: + case rSdSetSpu2IntrHandler: ret = (int)sceSdSetSpu2IntrHandler(*((u32 *)buffer + 1) ? _sce_sdrSpu2IntrHandler : 0, &g_eeCBInfo); break; - case 0x8180: + case rSdStopTrans: ret = sceSdStopTrans(*((u32 *)buffer + 1)); break; - case 0x8190: + case rSdCleanEffectWorkArea: ret = sceSdCleanEffectWorkArea(*((u32 *)buffer + 1), *((u32 *)buffer + 2), *((u32 *)buffer + 3)); break; - case 0x81A0: + case rSdSetEffectMode: ret = sceSdSetEffectMode(fno & 0xF, (sceSdEffectAttr *)buffer); break; - case 0x81C0: + case rSdSetEffectModeParams: + ret = sceSdSetEffectModeParams(fno & 0xF, (sceSdEffectAttr *)buffer); + break; + case rSdProcBatch2: ret = sceSdProcBatch((sceSdBatch *)buffer + 1, (u32 *)&g_sdrInfo.m_procbat_returns[1], *((u16 *)buffer + 1)); break; - case 0x81D0: + case rSdProcBatchEx2: ret = sceSdProcBatchEx( (sceSdBatch *)buffer + 1, (u32 *)&g_sdrInfo.m_procbat_returns[1], *((u16 *)buffer + 1), *((u32 *)buffer + 1)); break; - case 0x8F10: + case rSdChangeThreadPriority: ret = sceSdrChangeThreadPriority(*((u32 *)buffer + 1), *((u32 *)buffer + 2)); break; - case 0x9000: - case 0x9010: - case 0x9020: - case 0x9030: - case 0x9040: - case 0x9050: - case 0x9060: - case 0x9070: - case 0x9080: - case 0x9090: - case 0x90A0: - case 0x90B0: - case 0x90C0: - case 0x90D0: - case 0x90E0: - case 0x90F0: + case rSdUserCommand0: + case rSdUserCommand1: + case rSdUserCommand2: + case rSdUserCommand3: + case rSdUserCommand4: + case rSdUserCommand5: + case rSdUserCommand6: + case rSdUserCommand7: + case rSdUserCommand8: + case rSdUserCommand9: + case rSdUserCommandA: + case rSdUserCommandB: + case rSdUserCommandC: + case rSdUserCommandD: + case rSdUserCommandE: + case rSdUserCommandF: { ret = g_sdrInfo.m_sceSdr_vUserCommandFunction[(fno & 0xF0) >> 4] ? g_sdrInfo.m_sceSdr_vUserCommandFunction[(fno & 0xF0) >> 4](fno, buffer, length) : 0; break; } - case 0xE620: + case SDR_CMD_CB_INIT: { iop_thread_t thparam; - thparam.attr = 0x2000000; + thparam.attr = TH_C; thparam.thread = sce_sdrcb_loop; thparam.stacksize = 2048; thparam.option = 0; @@ -370,7 +373,7 @@ static void *sdrFunc(int fno, void *buffer, int length) Kprintf("SDR callback thread created\n"); break; } - case 0xE630: + case SDR_CMD_CB_DEINIT: { if ( g_eeCBInfo.m_thid_cb > 0 ) { @@ -394,7 +397,7 @@ sceSdrUserCommandFunction sceSdrSetUserCommandFunction(int command, sceSdrUserCo { sceSdrUserCommandFunction oldf; - if ( (command < 0x9000) || (command > 0x90F0) ) + if ( (command < rSdUserCommandMin) || (command > rSdUserCommandMax) ) return (sceSdrUserCommandFunction)-1; oldf = g_sdrInfo.m_sceSdr_vUserCommandFunction[(command & 0xF0) >> 4]; g_sdrInfo.m_sceSdr_vUserCommandFunction[(command & 0xF0) >> 4] = func; diff --git a/iop/sound/sdrdrv/src/sdd_main.c b/iop/sound/sdrdrv/src/sdd_main.c index 99e3412b1912..102c8b147ea2 100644 --- a/iop/sound/sdrdrv/src/sdd_main.c +++ b/iop/sound/sdrdrv/src/sdd_main.c @@ -75,7 +75,7 @@ static int module_start(int ac, char **av) g_eeCBInfo.m_initial_priority_cb); } } - thprarm.attr = 0x2000000; + thprarm.attr = TH_C; thprarm.thread = sce_sdr_loop; // Unofficial: original stack size was 2048 thprarm.stacksize = 4096; diff --git a/iop/sound/sdrdrv/src/sdr_i.h b/iop/sound/sdrdrv/src/sdr_i.h index ddc65f532f3b..3be1a3640abe 100644 --- a/iop/sound/sdrdrv/src/sdr_i.h +++ b/iop/sound/sdrdrv/src/sdr_i.h @@ -13,6 +13,7 @@ #include #include +#include #ifndef SDRDRV_OBSOLETE_FUNCS #define SDRDRV_OBSOLETE_FUNCS 0 @@ -27,20 +28,6 @@ #define SDRDRV_IMPLEMENT_LIBOSDS 0 #endif -typedef struct SdrEECBData_ -{ - // cppcheck-suppress unusedStructMember - int mode; - // cppcheck-suppress unusedStructMember - int voice_bit; - // cppcheck-suppress unusedStructMember - int status; - // cppcheck-suppress unusedStructMember - int opt; - // cppcheck-suppress unusedStructMember - int pad[12]; -} SdrEECBData; - typedef struct SdrEECBInfo_ { SdrEECBData m_eeCBData; From 092c33707a64238e22d152ff40ac0e97c1d11b7b Mon Sep 17 00:00:00 2001 From: Julian Uy Date: Thu, 16 Jul 2026 20:30:19 -0500 Subject: [PATCH 2/3] add: Add EE-side libsdr library for sdrdrv --- ee/rpc/sdr/Makefile | 14 +++ ee/rpc/sdr/include/libsdr.h | 31 ++++++ ee/rpc/sdr/src/erl-support.c | 21 +++++ ee/rpc/sdr/src/sdr_cb.c | 172 ++++++++++++++++++++++++++++++++++ ee/rpc/sdr/src/sdr_i.h | 16 ++++ ee/rpc/sdr/src/sdr_main.c | 176 +++++++++++++++++++++++++++++++++++ 6 files changed, 430 insertions(+) create mode 100644 ee/rpc/sdr/Makefile create mode 100644 ee/rpc/sdr/include/libsdr.h create mode 100644 ee/rpc/sdr/src/erl-support.c create mode 100644 ee/rpc/sdr/src/sdr_cb.c create mode 100644 ee/rpc/sdr/src/sdr_i.h create mode 100644 ee/rpc/sdr/src/sdr_main.c diff --git a/ee/rpc/sdr/Makefile b/ee/rpc/sdr/Makefile new file mode 100644 index 000000000000..797a24f0c6c5 --- /dev/null +++ b/ee/rpc/sdr/Makefile @@ -0,0 +1,14 @@ +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. + +EE_OBJS = sdr_cb.o sdr_main.o erl-support.o + +include $(PS2SDKSRC)/Defs.make +include $(PS2SDKSRC)/ee/Rules.lib.make +include $(PS2SDKSRC)/ee/Rules.make +include $(PS2SDKSRC)/ee/Rules.release diff --git a/ee/rpc/sdr/include/libsdr.h b/ee/rpc/sdr/include/libsdr.h new file mode 100644 index 000000000000..a59f5aa701ef --- /dev/null +++ b/ee/rpc/sdr/include/libsdr.h @@ -0,0 +1,31 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +/** + * @file + * Definitions for libsdr on the EE + */ + +#ifndef __LIBSDR_H__ +#define __LIBSDR_H__ + +#include +#include +#include + +extern int sceSdRemoteInit(void); +extern int sceSdTransToIOP(void *eeaddr, void *iopaddr, u32 size, u32 blocking); +extern SifRpcEndFunc_t sceSdCallBack(SifRpcEndFunc_t endfunc); +extern int sceSdRemote(int arg0, ...); + +extern int sceSdRemoteCallbackInit(int pri); +extern int sceSdRemoteCallbackQuit(void); + +#endif diff --git a/ee/rpc/sdr/src/erl-support.c b/ee/rpc/sdr/src/erl-support.c new file mode 100644 index 000000000000..135a4181af77 --- /dev/null +++ b/ee/rpc/sdr/src/erl-support.c @@ -0,0 +1,21 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# +# The erl-tags support +*/ + +#include + +char * erl_id = "libsdr"; + +char * erl_dependancies[] = { + "libkernel", + "libc", + 0 +}; diff --git a/ee/rpc/sdr/src/sdr_cb.c b/ee/rpc/sdr/src/sdr_cb.c new file mode 100644 index 000000000000..2a2b794eeef3 --- /dev/null +++ b/ee/rpc/sdr/src/sdr_cb.c @@ -0,0 +1,172 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +#include + +struct libsdr_cb_data +{ + int m_cb_thid; + char m_cb_thstack[4096] __attribute__((__aligned__(64))); + SifRpcServerData_t m_sd; + SifRpcDataQueue_t m_qd; + SdrEECBData m_eecb_data __attribute__((__aligned__(64))); + SdIntrCallback m_trans_intr_callback[2]; + SdIntrCallback m_irq_intr_callback; + sceSdTransIntrHandler m_trans_intr_handler[2]; + void *m_trans_intr_handler_userdata[2]; + sceSdSpu2IntrHandler m_spu2_intr_handler; + void *m_spu2_intr_handler_userdata; +}; + +extern struct libsdr_cb_data g_libsdr_cb_data; + +static void *sdr_cb_rpcproc(int fno, void *buf, int bufsz) +{ + SdrEECBData *cbdata; + + (void)fno; + (void)bufsz; + cbdata = (SdrEECBData *)buf; + if (cbdata->mode & SDR_CB_DMA0) + if (g_libsdr_cb_data.m_trans_intr_callback[0]) + g_libsdr_cb_data.m_trans_intr_callback[0](NULL); + if (cbdata->mode & SDR_CB_DMA1) + if (g_libsdr_cb_data.m_trans_intr_callback[1]) + g_libsdr_cb_data.m_trans_intr_callback[1](NULL); + if (cbdata->mode & SDR_CB_IRQ) + if (g_libsdr_cb_data.m_irq_intr_callback) + g_libsdr_cb_data.m_irq_intr_callback(NULL); + if (cbdata->mode & SDR_CB_DMA0INT) + if (g_libsdr_cb_data.m_trans_intr_handler[0]) + g_libsdr_cb_data.m_trans_intr_handler[0](0, g_libsdr_cb_data.m_trans_intr_handler_userdata[0]); + if (cbdata->mode & SDR_CB_DMA1INT) + if (g_libsdr_cb_data.m_trans_intr_handler[1]) + g_libsdr_cb_data.m_trans_intr_handler[1](1, g_libsdr_cb_data.m_trans_intr_handler_userdata[1]); + if (cbdata->mode & SDR_CB_IRQINT) + if (g_libsdr_cb_data.m_spu2_intr_handler) + g_libsdr_cb_data.m_spu2_intr_handler(cbdata->voice_bit, g_libsdr_cb_data.m_spu2_intr_handler_userdata); + return 0; +} + +static void sdr_cb_thproc(void *userdata) +{ + (void)userdata; + + sceSifInitRpc(0); + sceSifSetRpcQueue(&g_libsdr_cb_data.m_qd, GetThreadId()); + sceSifRegisterRpc(&g_libsdr_cb_data.m_sd, sce_SDRST_CB, &sdr_cb_rpcproc, &g_libsdr_cb_data.m_eecb_data, NULL, NULL, &g_libsdr_cb_data.m_qd); + sceSifRpcLoop(&g_libsdr_cb_data.m_qd); +} + +int sceSdRemoteCallbackInit(int pri) +{ + ee_thread_t thparam; + + if (HasIopRebootedSinceLastCall()) + sceSdRemoteCallbackQuit(); + + if (g_libsdr_cb_data.m_cb_thid > 0) + return -1; + + memset(&g_libsdr_cb_data, 0, sizeof(g_libsdr_cb_data)); + + sceSdRemote(1, SDR_CMD_CB_INIT); + + thparam.func = &sdr_cb_thproc; + thparam.stack = g_libsdr_cb_data.m_cb_thstack; + thparam.stack_size = sizeof(g_libsdr_cb_data.m_cb_thstack); + thparam.gp_reg = &_gp; + thparam.initial_priority = pri; + thparam.attr = 0; + thparam.option = 0; + + g_libsdr_cb_data.m_cb_thid = CreateThread(&thparam); + if (g_libsdr_cb_data.m_cb_thid <= 0) + return -1; + + if (StartThread(g_libsdr_cb_data.m_cb_thid, NULL) < 0) + return -1; + + return g_libsdr_cb_data.m_cb_thid; +} + +int sceSdRemoteCallbackQuit(void) +{ + int ret; + + if (g_libsdr_cb_data.m_cb_thid <= 0) + return -1; + + sceSdRemote(1, rSdSetIRQCallback, NULL); + sceSdRemote(1, rSdSetTransCallback, 0, NULL); + sceSdRemote(1, rSdSetTransCallback, 1, NULL); + sceSdRemote(1, rSdSetSpu2IntrHandler, NULL, NULL); + sceSdRemote(1, rSdSetTransIntrHandler, 0, NULL, NULL); + sceSdRemote(1, rSdSetTransIntrHandler, 1, NULL, NULL); + + sceSdRemote(1, SDR_CMD_CB_DEINIT); + + ret = 0; + if (!sceSifRemoveRpc(&g_libsdr_cb_data.m_sd, &g_libsdr_cb_data.m_qd)) + ret = -1; + if (!sceSifRemoveRpcQueue(&g_libsdr_cb_data.m_qd)) + ret = -1; + if (TerminateThread(g_libsdr_cb_data.m_cb_thid) < 0) + ret = -1; + if (DeleteThread(g_libsdr_cb_data.m_cb_thid) < 0) + ret = -1; + + memset(&g_libsdr_cb_data, 0, sizeof(g_libsdr_cb_data)); + return ret; +} + +SdIntrCallback SdrSetTransInterruptCallback(int idx, SdIntrCallback handler) +{ + SdIntrCallback old_handler; + + old_handler = g_libsdr_cb_data.m_trans_intr_callback[idx]; + g_libsdr_cb_data.m_trans_intr_callback[idx] = handler; + + return old_handler; +} + +SdIntrCallback SdrSetIRQInterruptCallback(SdIntrCallback handler) +{ + SdIntrCallback old_handler; + + old_handler = g_libsdr_cb_data.m_irq_intr_callback; + g_libsdr_cb_data.m_irq_intr_callback = handler; + + return old_handler; +} + +// cppcheck-suppress funcArgNamesDifferentUnnamed +sceSdTransIntrHandler SdrSetTransInterruptHandler(int idx, sceSdTransIntrHandler handler, void *handler_userdata) +{ + sceSdTransIntrHandler old_handler; + + old_handler = g_libsdr_cb_data.m_trans_intr_handler[idx]; + g_libsdr_cb_data.m_trans_intr_handler[idx] = handler; + g_libsdr_cb_data.m_trans_intr_handler_userdata[idx] = handler_userdata; + + return old_handler; +} + +// cppcheck-suppress funcArgNamesDifferentUnnamed +sceSdSpu2IntrHandler SdrSetIRQInterruptHandler(sceSdSpu2IntrHandler handler, void *handler_userdata) +{ + sceSdSpu2IntrHandler old_handler; + + old_handler = g_libsdr_cb_data.m_spu2_intr_handler; + g_libsdr_cb_data.m_spu2_intr_handler = handler; + g_libsdr_cb_data.m_spu2_intr_handler_userdata = handler_userdata; + + return old_handler; +} diff --git a/ee/rpc/sdr/src/sdr_i.h b/ee/rpc/sdr/src/sdr_i.h new file mode 100644 index 000000000000..0f756861d40c --- /dev/null +++ b/ee/rpc/sdr/src/sdr_i.h @@ -0,0 +1,16 @@ + +#ifndef __SDR_I_H__ +#define __SDR_I_H__ + +#include +#include +#include +#include +#include + +extern SdIntrCallback SdrSetTransInterruptCallback(int idx, SdIntrCallback handler); +extern SdIntrCallback SdrSetIRQInterruptCallback(SdIntrCallback handler); +extern sceSdTransIntrHandler SdrSetTransInterruptHandler(int idx, sceSdTransIntrHandler handler, void *handler_userdata); +extern sceSdSpu2IntrHandler SdrSetIRQInterruptHandler(sceSdSpu2IntrHandler handler, void *handler_userdata); + +#endif diff --git a/ee/rpc/sdr/src/sdr_main.c b/ee/rpc/sdr/src/sdr_main.c new file mode 100644 index 000000000000..f18b475907e1 --- /dev/null +++ b/ee/rpc/sdr/src/sdr_main.c @@ -0,0 +1,176 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright ps2dev - http://www.ps2dev.org +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +*/ + +#include + +struct libsdr_data +{ + int m_sbuff[16] __attribute__((__aligned__(64))); + SifRpcClientData_t m_cd __attribute__((__aligned__(64))); + SifRpcEndFunc_t m_endfunc; +}; + +static struct libsdr_data g_libsdr_data; + +int sceSdRemoteInit(void) +{ + if (HasIopRebootedSinceLastCall()) + memset(&g_libsdr_data.m_cd, 0, sizeof(g_libsdr_data.m_cd)); + for (;;) + { + if (sceSifBindRpc(&g_libsdr_data.m_cd, sce_SDR_DEV, 0) < 0) + return -1; + + if (g_libsdr_data.m_cd.server != NULL) + break; + + nopdelay(); + } + return 0; +} + +int sceSdTransToIOP(void *eeaddr, void *iopaddr, u32 size, u32 blocking) +{ + SifDmaTransfer_t dmat[1]; + int trid; + if (!blocking) + return -1; + + dmat[0].src = eeaddr; + dmat[0].dest = iopaddr; + dmat[0].size = size; + dmat[0].attr = 0; + + while (!(trid = sceSifSetDma(dmat, sizeof(dmat)/sizeof(dmat[0])))); + + if (blocking == 1) + while (sceSifDmaStat(trid) >= 0); + + return 0; +} + +SifRpcEndFunc_t sceSdCallBack(SifRpcEndFunc_t endfunc) +{ + SifRpcEndFunc_t old_endfunc; + + old_endfunc = g_libsdr_data.m_endfunc; + g_libsdr_data.m_endfunc = endfunc; + + return old_endfunc; +} + +int sceSdRemote(int arg0, ...) +{ + va_list ap; + int blocking; + int cmd; + SifRpcEndFunc_t endfunc; + int i; + int ret; + const void *old_handler; + + va_start(ap, arg0); + blocking = arg0; + cmd = va_arg(ap, int); + g_libsdr_data.m_sbuff[0] = (uiptr)g_libsdr_data.m_sbuff; + for (i = 1; i < 7; i += 1) + g_libsdr_data.m_sbuff[i] = va_arg(ap, int); + va_end(ap); + blocking = blocking ? 0 : SIF_RPC_M_NOWAIT; + endfunc = blocking ? g_libsdr_data.m_endfunc : NULL; + + switch (cmd) + { + case rSdSetTransCallback: + old_handler = SdrSetTransInterruptCallback(g_libsdr_data.m_sbuff[1] ? 1 : 0, (void *)(uiptr)g_libsdr_data.m_sbuff[2]); + break; + case rSdSetIRQCallback: + old_handler = SdrSetIRQInterruptCallback((void *)(uiptr)g_libsdr_data.m_sbuff[1]); + break; + case rSdSetTransIntrHandler: + old_handler = SdrSetTransInterruptHandler(g_libsdr_data.m_sbuff[1] ? 1 : 0, (void *)(uiptr)g_libsdr_data.m_sbuff[2], (void *)(uiptr)g_libsdr_data.m_sbuff[3]); + break; + case rSdSetSpu2IntrHandler: + old_handler = SdrSetIRQInterruptHandler((void *)(uiptr)g_libsdr_data.m_sbuff[1], (void *)(uiptr)g_libsdr_data.m_sbuff[2]); + break; + default: + old_handler = NULL; + break; + } + + ret = 0; + switch (cmd) + { + case rSdSetEffectAttr: + case rSdSetEffectMode: + case rSdSetEffectModeParams: + sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, (void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), endfunc, &g_libsdr_data.m_sbuff[0]); + ret = g_libsdr_data.m_sbuff[0]; + break; + case rSdGetEffectAttr: + sceSifCallRpc(&g_libsdr_data.m_cd, cmd | g_libsdr_data.m_sbuff[1], blocking, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), (void *)(uiptr)g_libsdr_data.m_sbuff[2], 64, endfunc, (void *)(uiptr)g_libsdr_data.m_sbuff[2]); + break; + case rSdProcBatch2: + case rSdProcBatchEx2: + { + sceSdBatch *batch_p; + int *retptr; + int retptr_sz; + batch_p = (sceSdBatch *)g_libsdr_data.m_sbuff[1]; + batch_p[0].entry = g_libsdr_data.m_sbuff[2]; + if (cmd == rSdProcBatchEx2) + batch_p[0].value = g_libsdr_data.m_sbuff[5]; + retptr = (void *)(uiptr)g_libsdr_data.m_sbuff[3]; + retptr_sz = retptr ? g_libsdr_data.m_sbuff[4] : (int)sizeof(ret); + if (!retptr) + retptr = &ret; + sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1], sizeof(sceSdBatch) * (g_libsdr_data.m_sbuff[2] + 1), retptr, retptr_sz, endfunc, &g_libsdr_data.m_sbuff[0]); + ret = *retptr; + break; + } + case rSdUserCommand0: + case rSdUserCommand1: + case rSdUserCommand2: + case rSdUserCommand3: + case rSdUserCommand4: + case rSdUserCommand5: + case rSdUserCommand6: + case rSdUserCommand7: + case rSdUserCommand8: + case rSdUserCommand9: + case rSdUserCommandA: + case rSdUserCommandB: + case rSdUserCommandC: + case rSdUserCommandD: + case rSdUserCommandE: + case rSdUserCommandF: + sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[1], g_libsdr_data.m_sbuff[2], &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]); + ret = g_libsdr_data.m_sbuff[0]; + break; + default: + sceSifCallRpc(&g_libsdr_data.m_cd, cmd, blocking, &g_libsdr_data.m_sbuff[0], sizeof(g_libsdr_data.m_sbuff), &g_libsdr_data.m_sbuff[0], 16, endfunc, &g_libsdr_data.m_sbuff[0]); + ret = g_libsdr_data.m_sbuff[0]; + break; + } + + switch (cmd) + { + case rSdSetTransCallback: + case rSdSetIRQCallback: + case rSdSetTransIntrHandler: + case rSdSetSpu2IntrHandler: + ret = (int)(uiptr)old_handler; + break; + default: + break; + } + + return ret; +} From c4dc3edfe376c3686ef8777baacb605634eebd85 Mon Sep 17 00:00:00 2001 From: Julian Uy Date: Thu, 16 Jul 2026 20:30:31 -0500 Subject: [PATCH 3/3] buildsystem: hook up newly added library to buildsystem --- ee/rpc/Makefile | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/ee/rpc/Makefile b/ee/rpc/Makefile index 50e37d284364..5ccdcc6dcade 100644 --- a/ee/rpc/Makefile +++ b/ee/rpc/Makefile @@ -6,23 +6,25 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -SUBDIRS = ahx -SUBDIRS += audsrv -SUBDIRS += camera -SUBDIRS += cdvd -SUBDIRS += filexio -SUBDIRS += hdd -SUBDIRS += keyboard -SUBDIRS += memorycard -SUBDIRS += mouse -SUBDIRS += multitap -SUBDIRS += pad -SUBDIRS += poweroff -SUBDIRS += ps2snd -SUBDIRS += remote -SUBDIRS += secr -SUBDIRS += sior -SUBDIRS += tcpips +SUBDIRS = \ + ahx \ + audsrv \ + camera \ + cdvd \ + filexio \ + hdd \ + keyboard \ + memorycard \ + mouse \ + multitap \ + pad \ + poweroff \ + ps2snd \ + remote \ + sdr \ + secr \ + sior \ + tcpips include $(PS2SDKSRC)/Defs.make include $(PS2SDKSRC)/Rules.make