PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
librm.c
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, 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
16#include <stdio.h>
17#include <tamtypes.h>
18#include <sifrpc.h>
19#include <kernel.h>
20#include <string.h>
21#include "librm.h"
22
23static SifRpcClientData_t rmmanif __attribute__((aligned(64)));
24static struct rmRpcPacket buffer __attribute__((aligned(64)));
25static int rmman_type = 0;
26
28{
29 int opened;
30 struct rmEEData *rmData;
31};
32
33static struct port_state ports[2];
34
35static struct rmEEData *rmGetDmaStr(int port, int slot)
36{
37 struct rmEEData *pdata;
38
39 (void)slot;
40
41 pdata = ports[port].rmData;
42 SyncDCache(pdata, (u8 *)pdata + 256);
43
44 if (pdata[0].frame < pdata[1].frame)
45 {
46 return &pdata[1];
47 }
48 else
49 {
50 return &pdata[0];
51 }
52}
53
54int RMMan_Init(void)
55{
56 int i;
57
58 if (rmman_type)
59 {
60 printf("RMMan Library already initialised\n");
61 return 0;
62 }
63
64 {
65 SifRpcClientData_t rpciftmp[3] __attribute__((aligned(64)));
66 int rpc_ids[3] = {
67 RMMANX_RPC_ID,
68 RMMAN2_RPC_ID,
69 RMMAN_RPC_ID,
70 };
71
72 rmmanif.server = NULL;
73 for (i = 0; i < (int)(sizeof(rpc_ids)/sizeof(rpc_ids[0])); i += 1)
74 {
75 rpciftmp[i].server = NULL;
76 }
77
78 for (;;)
79 {
80 for (i = 0; i < (int)(sizeof(rpc_ids)/sizeof(rpc_ids[0])); i += 1)
81 {
82 if ((sceSifBindRpc(&rpciftmp[i], rpc_ids[i], 0) < 0))
83 {
84 return -1;
85 }
86 if (rpciftmp[i].server != NULL)
87 {
88 switch (rpc_ids[i])
89 {
90 case RMMANX_RPC_ID:
91 case RMMAN2_RPC_ID:
92 {
93 rmman_type = 2;
94 break;
95 }
96 case RMMAN_RPC_ID:
97 {
98 rmman_type = 1;
99 break;
100 }
101 default:
102 {
103 break;
104 }
105 }
106 memcpy(&rmmanif, &rpciftmp[i], sizeof(rmmanif));
107 break;
108 }
109 }
110 if (rmmanif.server != NULL)
111 {
112 break;
113 }
114 nopdelay();
115 }
116 }
117
118 if (rmman_type == 0)
119 {
120 return -1;
121 }
122
123 buffer.cmd.command = (rmman_type == 2) ? RMMAN2_RPCFUNC_INIT : RMMAN_RPCFUNC_INIT;
124
125 if (sceSifCallRpc(&rmmanif, 0, 0, &buffer, 128, &buffer, 128, NULL, NULL) < 0)
126 {
127 rmman_type = 0;
128 return -1;
129 }
130
131 for (i = 0; i < (int)(sizeof(ports)/sizeof(ports[0])); i += 1)
132 {
133 ports[i].opened = 0;
134 ports[i].rmData = NULL;
135 }
136
137 switch (rmman_type)
138 {
139 case 1:
140 return buffer.cmd.u.cmd1.result;
141 case 2:
142 return buffer.cmd.u.cmd2.result;
143 default:
144 return 0;
145 }
146}
147
149{
150 buffer.cmd.command = (rmman_type == 2) ? RMMAN2_RPCFUNC_VERSION : RMMAN_RPCFUNC_VERSION;
151
152 if (sceSifCallRpc(&rmmanif, 0, 0, &buffer, 128, &buffer, 128, NULL, NULL) < 0)
153 {
154 return 0;
155 }
156
157 switch (rmman_type)
158 {
159 case 1:
160 return buffer.cmd.u.cmd1.result;
161 case 2:
162 return buffer.cmd.u.cmd2.result;
163 default:
164 return 0;
165 }
166}
167
168int RMMan_Open(int port, int slot, void *pData)
169{
170 if ((port < 0) || (port > 1) || (slot != 0))
171 {
172 printf("Error, port must be 0 or 1 and slot set to 0\n");
173 return 0;
174 }
175
176 if ((u32)pData & 0x3F)
177 {
178 printf("Error, pData not aligned to 64byte boundary");
179 return 0;
180 }
181
182 if (rmman_type != 1 && port != 0)
183 {
184 port = 0;
185 }
186
187 buffer.cmd.command = (rmman_type == 2) ? RMMAN2_RPCFUNC_OPEN : RMMAN_RPCFUNC_OPEN;
188 switch (rmman_type)
189 {
190 case 1:
191 {
192 buffer.cmd.u.cmd1.port = port;
193 buffer.cmd.u.cmd1.slot = slot;
194 buffer.cmd.u.cmd1.data = pData;
195 break;
196 }
197 case 2:
198 {
199 buffer.cmd.u.cmd2.data = pData;
200 break;
201 }
202 default:
203 {
204 break;
205 }
206 }
207
208 if (sceSifCallRpc(&rmmanif, 0, 0, &buffer, 128, &buffer, 128, NULL, NULL) < 0)
209 {
210 return 0;
211 }
212
213 ports[port].opened = 1;
214 ports[port].rmData = pData;
215
216 switch (rmman_type)
217 {
218 case 1:
219 return buffer.cmd.u.cmd1.result;
220 case 2:
221 return buffer.cmd.u.cmd2.result;
222 default:
223 return 0;
224 }
225}
226
227int RMMan_End(void)
228{
229 buffer.cmd.command = (rmman_type == 2) ? RMMAN2_RPCFUNC_END : RMMAN_RPCFUNC_END;
230
231 if (sceSifCallRpc(&rmmanif, 0, 0, &buffer, 128, &buffer, 128, NULL, NULL) < 0)
232 {
233 return 0;
234 }
235
236 switch (rmman_type)
237 {
238 case 1:
239 return buffer.cmd.u.cmd1.result;
240 case 2:
241 return buffer.cmd.u.cmd2.result;
242 default:
243 return 0;
244 }
245}
246
247int RMMan_Close(int port, int slot)
248{
249 if ((port < 0) || (port > 1) || (slot != 0))
250 {
251 printf("Error, port must be 0 or 1 and slot set to 0\n");
252 return 0;
253 }
254
255 if (rmman_type != 1 && port != 0)
256 {
257 port = 0;
258 }
259
260 if (!ports[port].opened)
261 {
262 return 0;
263 }
264
265 buffer.cmd.command = (rmman_type == 2) ? RMMAN2_RPCFUNC_CLOSE : RMMAN_RPCFUNC_CLOSE;
266 switch (rmman_type)
267 {
268 case 1:
269 {
270 buffer.cmd.u.cmd1.port = port;
271 buffer.cmd.u.cmd1.slot = slot;
272 break;
273 }
274 default:
275 {
276 break;
277 }
278 }
279
280 if (sceSifCallRpc(&rmmanif, 0, 0, &buffer, 128, &buffer, 128, NULL, NULL) < 0)
281 {
282 return 0;
283 }
284
285 switch (rmman_type)
286 {
287 case 1:
288 return buffer.cmd.u.cmd1.result;
289 case 2:
290 return buffer.cmd.u.cmd2.result;
291 default:
292 return 0;
293 }
294}
295
296void RMMan_Read(int port, int slot, struct remote_data *data)
297{
298 const struct rmEEData *pdata;
299
300 if ((port < 0) || (port > 1) || (slot != 0))
301 {
302 printf("Error, port must be 0 or 1 and slot set to 0\n");
303 return;
304 }
305
306 if (rmman_type != 1 && port != 0)
307 {
308 port = 0;
309 }
310
311 pdata = rmGetDmaStr(port, slot);
312
313 if (rmman_type == 2)
314 {
315 int status;
316 int button;
317 status = RM_READY;
318 button = 0;
319 if (pdata->data[0] == 0x14)
320 {
321 status = RM_KEYPRESSED;
322 button = pdata->data[1] | (pdata->data[2] << 8) | (pdata->data[3] << 16);
323 }
324 data->status = status;
325 data->button = button;
326 }
327 else
328 {
329 memcpy(data, pdata->data, 8);
330 }
331}
typedef __attribute__
Definition tlbfunc.c:60
void RMMan_Read(int port, int slot, struct remote_data *data)
Read remote data.
Definition librm.c:296
int RMMan_End(void)
Ends all remote communication.
Definition librm.c:227
int RMMan_Close(int port, int slot)
Closes an opened port.
Definition librm.c:247
int RMMan_Init(void)
Initialise librm.
Definition librm.c:54
int RMMan_Open(int port, int slot, void *pData)
Definition librm.c:168
u32 RMMan_GetModuleVersion(void)
Returns the rmman.irx version.
Definition librm.c:148
RPC Interface for PS2 Remote Control Driver (RMMAN)