Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 97 additions & 0 deletions common/include/libsdr-common.h
Original file line number Diff line number Diff line change
@@ -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__ */
36 changes: 19 additions & 17 deletions ee/rpc/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
14 changes: 14 additions & 0 deletions ee/rpc/sdr/Makefile
Original file line number Diff line number Diff line change
@@ -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
31 changes: 31 additions & 0 deletions ee/rpc/sdr/include/libsdr.h
Original file line number Diff line number Diff line change
@@ -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 <libsd-common.h>
#include <libsdr-common.h>
#include <sifrpc.h>

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
21 changes: 21 additions & 0 deletions ee/rpc/sdr/src/erl-support.c
Original file line number Diff line number Diff line change
@@ -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 <erl.h>

char * erl_id = "libsdr";

char * erl_dependancies[] = {
"libkernel",
"libc",
0
};
172 changes: 172 additions & 0 deletions ee/rpc/sdr/src/sdr_cb.c
Original file line number Diff line number Diff line change
@@ -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 <sdr_i.h>

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;
}
16 changes: 16 additions & 0 deletions ee/rpc/sdr/src/sdr_i.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

#ifndef __SDR_I_H__
#define __SDR_I_H__

#include <string.h>
#include <kernel.h>
#include <sifrpc.h>
#include <libsdr.h>
#include <iopcontrol.h>

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
Loading
Loading