16 char m_cb_thstack[4096] __attribute__((__aligned__(64)));
17 SifRpcServerData_t m_sd;
18 SifRpcDataQueue_t m_qd;
19 SdrEECBData m_eecb_data __attribute__((__aligned__(64)));
20 SdIntrCallback m_trans_intr_callback[2];
21 SdIntrCallback m_irq_intr_callback;
22 sceSdTransIntrHandler m_trans_intr_handler[2];
23 void *m_trans_intr_handler_userdata[2];
24 sceSdSpu2IntrHandler m_spu2_intr_handler;
25 void *m_spu2_intr_handler_userdata;
30static void *sdr_cb_rpcproc(
int fno,
void *buf,
int bufsz)
36 cbdata = (SdrEECBData *)buf;
37 if (cbdata->mode & SDR_CB_DMA0)
38 if (g_libsdr_cb_data.m_trans_intr_callback[0])
39 g_libsdr_cb_data.m_trans_intr_callback[0](NULL);
40 if (cbdata->mode & SDR_CB_DMA1)
41 if (g_libsdr_cb_data.m_trans_intr_callback[1])
42 g_libsdr_cb_data.m_trans_intr_callback[1](NULL);
43 if (cbdata->mode & SDR_CB_IRQ)
44 if (g_libsdr_cb_data.m_irq_intr_callback)
45 g_libsdr_cb_data.m_irq_intr_callback(NULL);
46 if (cbdata->mode & SDR_CB_DMA0INT)
47 if (g_libsdr_cb_data.m_trans_intr_handler[0])
48 g_libsdr_cb_data.m_trans_intr_handler[0](0, g_libsdr_cb_data.m_trans_intr_handler_userdata[0]);
49 if (cbdata->mode & SDR_CB_DMA1INT)
50 if (g_libsdr_cb_data.m_trans_intr_handler[1])
51 g_libsdr_cb_data.m_trans_intr_handler[1](1, g_libsdr_cb_data.m_trans_intr_handler_userdata[1]);
52 if (cbdata->mode & SDR_CB_IRQINT)
53 if (g_libsdr_cb_data.m_spu2_intr_handler)
54 g_libsdr_cb_data.m_spu2_intr_handler(cbdata->voice_bit, g_libsdr_cb_data.m_spu2_intr_handler_userdata);
58static void sdr_cb_thproc(
void *userdata)
63 sceSifSetRpcQueue(&g_libsdr_cb_data.m_qd, GetThreadId());
64 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);
65 sceSifRpcLoop(&g_libsdr_cb_data.m_qd);
68int sceSdRemoteCallbackInit(
int pri)
72 if (HasIopRebootedSinceLastCall())
73 sceSdRemoteCallbackQuit();
75 if (g_libsdr_cb_data.m_cb_thid > 0)
78 memset(&g_libsdr_cb_data, 0,
sizeof(g_libsdr_cb_data));
80 sceSdRemote(1, SDR_CMD_CB_INIT);
82 thparam.func = &sdr_cb_thproc;
83 thparam.stack = g_libsdr_cb_data.m_cb_thstack;
84 thparam.stack_size =
sizeof(g_libsdr_cb_data.m_cb_thstack);
85 thparam.gp_reg = &_gp;
86 thparam.initial_priority = pri;
90 g_libsdr_cb_data.m_cb_thid = CreateThread(&thparam);
91 if (g_libsdr_cb_data.m_cb_thid <= 0)
94 if (StartThread(g_libsdr_cb_data.m_cb_thid, NULL) < 0)
97 return g_libsdr_cb_data.m_cb_thid;
100int sceSdRemoteCallbackQuit(
void)
104 if (g_libsdr_cb_data.m_cb_thid <= 0)
107 sceSdRemote(1, rSdSetIRQCallback, NULL);
108 sceSdRemote(1, rSdSetTransCallback, 0, NULL);
109 sceSdRemote(1, rSdSetTransCallback, 1, NULL);
110 sceSdRemote(1, rSdSetSpu2IntrHandler, NULL, NULL);
111 sceSdRemote(1, rSdSetTransIntrHandler, 0, NULL, NULL);
112 sceSdRemote(1, rSdSetTransIntrHandler, 1, NULL, NULL);
114 sceSdRemote(1, SDR_CMD_CB_DEINIT);
117 if (!sceSifRemoveRpc(&g_libsdr_cb_data.m_sd, &g_libsdr_cb_data.m_qd))
119 if (!sceSifRemoveRpcQueue(&g_libsdr_cb_data.m_qd))
121 if (TerminateThread(g_libsdr_cb_data.m_cb_thid) < 0)
123 if (DeleteThread(g_libsdr_cb_data.m_cb_thid) < 0)
126 memset(&g_libsdr_cb_data, 0,
sizeof(g_libsdr_cb_data));
130SdIntrCallback SdrSetTransInterruptCallback(
int idx, SdIntrCallback handler)
132 SdIntrCallback old_handler;
134 old_handler = g_libsdr_cb_data.m_trans_intr_callback[idx];
135 g_libsdr_cb_data.m_trans_intr_callback[idx] = handler;
140SdIntrCallback SdrSetIRQInterruptCallback(SdIntrCallback handler)
142 SdIntrCallback old_handler;
144 old_handler = g_libsdr_cb_data.m_irq_intr_callback;
145 g_libsdr_cb_data.m_irq_intr_callback = handler;
151sceSdTransIntrHandler SdrSetTransInterruptHandler(
int idx, sceSdTransIntrHandler handler,
void *handler_userdata)
153 sceSdTransIntrHandler old_handler;
155 old_handler = g_libsdr_cb_data.m_trans_intr_handler[idx];
156 g_libsdr_cb_data.m_trans_intr_handler[idx] = handler;
157 g_libsdr_cb_data.m_trans_intr_handler_userdata[idx] = handler_userdata;
163sceSdSpu2IntrHandler SdrSetIRQInterruptHandler(sceSdSpu2IntrHandler handler,
void *handler_userdata)
165 sceSdSpu2IntrHandler old_handler;
167 old_handler = g_libsdr_cb_data.m_spu2_intr_handler;
168 g_libsdr_cb_data.m_spu2_intr_handler = handler;
169 g_libsdr_cb_data.m_spu2_intr_handler_userdata = handler_userdata;