PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
sdd_cb.c
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#include <sdr_i.h>
12
13// Unofficial: argument
14static void sceSifCmdLoop2(SifRpcClientData_t *cd, SdrEECBInfo *cbi)
15{
16 while ( 1 )
17 {
18 int state;
19 // Unofficial: make local variable
20 SdrEECBData eeCBDataSend;
21
22 while ( !cbi->m_eeCBData.mode )
23 SleepThread();
24 CpuSuspendIntr(&state);
25 // Unofficial: was inlined
26 memcpy(&eeCBDataSend, &cbi->m_eeCBData, sizeof(eeCBDataSend));
27 CpuResumeIntr(state);
28#if SDRDRV_EECB_COMPAT
29 if ( eeCBDataSend.mode )
30 {
31 int mode_tmp;
32 int mode_cur;
33
34 mode_tmp = eeCBDataSend.mode;
35 mode_cur = mode_tmp;
36 while ( 1 )
37 {
38 // Only the obsolete DMA0/DMA1/IRQ funcs (not implemented in libsdr 4.0.1) clashes
39 if ( mode_cur & (1 << 0) )
40 {
41 mode_cur &= ~(1 << 0);
42 eeCBDataSend.mode = 1;
43 }
44 else if ( mode_cur & (1 << 1) )
45 {
46 mode_cur &= ~(1 << 1);
47 eeCBDataSend.mode = 2;
48 }
49 else if ( mode_cur & (1 << 2) )
50 {
51 mode_cur &= ~(1 << 2);
52 eeCBDataSend.mode = 3;
53 }
54 else if ( mode_cur & (1 << 8) )
55 {
56 mode_cur &= ~(1 << 8);
57 eeCBDataSend.mode = 11;
58 }
59 else if ( mode_cur & (1 << 9) )
60 {
61 mode_cur &= ~(1 << 9);
62 eeCBDataSend.mode = 12;
63 }
64 else if ( mode_cur & (1 << 10) )
65 {
66 mode_cur &= ~(1 << 10);
67 eeCBDataSend.mode = 13;
68 }
69 else
70 {
71 break;
72 }
73 sceSifCallRpc(cd, 0, 0, &eeCBDataSend, sizeof(eeCBDataSend), 0, 0, 0, 0);
74 }
75 eeCBDataSend.mode = mode_tmp;
76 }
77 // Set the high bit to make libsdr 2.0.0 and lower not process it
78 eeCBDataSend.mode |= ((u32)1 << 31);
79#endif
80 sceSifCallRpc(cd, 0, 0, &eeCBDataSend, sizeof(eeCBDataSend), 0, 0, 0, 0);
81#if SDRDRV_EECB_COMPAT
82 eeCBDataSend.mode &= ~((u32)1 << 31);
83#endif
84 CpuSuspendIntr(&state);
85 if ( cbi->m_eeCBData.mode == eeCBDataSend.mode )
86 {
87 cbi->m_eeCBData.mode = 0;
88 iCancelWakeupThread(0);
89 CpuResumeIntr(state);
90 break;
91 }
92 cbi->m_eeCBData.mode &= ~eeCBDataSend.mode;
93 CpuResumeIntr(state);
94 }
95}
96
97#if SDRDRV_OBSOLETE_FUNCS
98int _sce_sdrDMA0CallBackProc(void *data)
99{
100 (void)data;
101
102 g_eeCBInfo.m_eeCBData.mode |= (1 << 0);
103 iWakeupThread(g_eeCBInfo.m_thid_cb);
104 return 1;
105}
106
107int _sce_sdrDMA1CallBackProc(void *data)
108{
109 (void)data;
110
111 g_eeCBInfo.m_eeCBData.mode |= (1 << 1);
112 iWakeupThread(g_eeCBInfo.m_thid_cb);
113 return 1;
114}
115
116int _sce_sdrIRQCallBackProc(void *data)
117{
118 (void)data;
119
120 g_eeCBInfo.m_eeCBData.mode |= (1 << 2);
121 iWakeupThread(g_eeCBInfo.m_thid_cb);
122 return 1;
123}
124#endif
125
126int _sce_sdrDMA0IntrHandler(int core, void *common)
127{
128 SdrEECBInfo *cbi;
129
130 (void)core;
131
132 cbi = (SdrEECBInfo *)common;
133 cbi->m_eeCBData.mode |= (1 << 8);
134 iWakeupThread(cbi->m_thid_cb);
135 return 0;
136}
137
138int _sce_sdrDMA1IntrHandler(int core, void *common)
139{
140 SdrEECBInfo *cbi;
141
142 (void)core;
143
144 cbi = (SdrEECBInfo *)common;
145 cbi->m_eeCBData.mode |= (1 << 9);
146 iWakeupThread(cbi->m_thid_cb);
147 return 0;
148}
149
150int _sce_sdrSpu2IntrHandler(int core_bit, void *common)
151{
152 SdrEECBInfo *cbi;
153
154 (void)core_bit;
155
156 cbi = (SdrEECBInfo *)common;
157 cbi->m_eeCBData.mode |= (1 << 10);
158 cbi->m_eeCBData.voice_bit = core_bit;
159 iWakeupThread(cbi->m_thid_cb);
160 return 0;
161}
162
163void sce_sdrcb_loop(void *arg)
164{
165 SdrEECBInfo *cbi;
166 // Unofficial: make local
168
169 cbi = (SdrEECBInfo *)arg;
170 cbi->m_eeCBData.mode = 0;
171 while ( sceSifBindRpc(&cd, 0x80000704, 0) >= 0 )
172 {
173 int i;
174
175 for ( i = 0; i < 10000; i += 1 )
176 ;
177 if ( cd.server )
178 sceSifCmdLoop2(&cd, cbi);
179 }
180 Kprintf("error \n");
181 while ( 1 )
182 ;
183}
int CpuResumeIntr(int state)
Definition intrman.c:227
int CpuSuspendIntr(int *state)
Definition intrman.c:205