PS2SDK
PS2 Homebrew Libraries
ps2cam_rpc.c
Go to the documentation of this file.
1 /*
2  _____ ___ ____
3  ____| | ____| PSX2 OpenSource Project
4  | ___| |____ (c) 2004-2005 Lion | (psxdever@hotmail.com)
5 */
6 
12 #include <tamtypes.h>
13 #include <kernel.h>
14 #include <sifrpc.h>
15 #include <stdio.h>
16 #include <string.h>
17 #include <iopcontrol.h>
18 #include "../include/ps2cam_rpc.h"
19 
20 
21 
22 #define PS2_CAM_RPC_ID 0x00FD000 +2
23 
24 
25 
26 static SifRpcClientData_t cdata __attribute__((aligned(64)));
27 static char data[1024] __attribute__((aligned(64)));
28 static char campacket[896] __attribute__((aligned(64)));
29 
30 ee_sema_t compSema;
31 
32 int sem;
33 
34 
35 
36 
37 int PS2CamInit(int mode)
38 {
39  int ret=0;
40  int *buf;
41  // unsigned int i;
42  // int timeout = 100000;
43 
45  memset(&cdata, 0, sizeof(cdata));
46  if (cdata.server)
47  return 0;
48 
49  sceSifInitRpc(0);
50 
51  while (((ret = sceSifBindRpc(&cdata, PS2_CAM_RPC_ID, 0)) >= 0) && (cdata.server == NULL))
52  nopdelay();
53 
54  nopdelay();
55 
56 
57 
58  if (ret < 0)return ret;
59 
60 
61 
62  buf = (int *)&data[0];
63  buf[0] = mode;
64 
65  printf("bind done\n");
66 
67  sceSifCallRpc(&cdata, PS2CAM_RPC_INITIALIZE, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
68  nopdelay();
69 
70 printf("init done\n");
71 
72 
73  compSema.init_count = 1;
74  compSema.max_count = 1;
75  compSema.option = 0;
76  sem = CreateSema(&compSema);
77 
78 printf("sema done\n");
79 
80  return buf[0];
81 }
82 
83 
84 
85 
86 
88 {
89  int *ret;
90 
91  ret = (int *)&data[0];
92 
93  sceSifCallRpc(&cdata, PS2CAM_RPC_GETIRXVERSION, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
94  nopdelay();
95 
96  return ret[0];
97 }
98 
99 
100 
101 
102 
104 {
105  int *ret;
106 
107  ret = (int *)&data[0];
108 
109  sceSifCallRpc(&cdata, PS2CAM_RPC_GETDEVCOUNT, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
110  nopdelay();
111 
112  return ret[0];
113 }
114 
115 
116 
117 
118 
119 int PS2CamOpenDevice(int device_index)
120 {
121  int *ret;
122 
123  ret = (int *)&data[0];
124 
125  ret[0] = device_index;
126 
127  sceSifCallRpc(&cdata, PS2CAM_RPC_OPENDEVICE, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
128 
129  return ret[0];
130 }
131 
132 
133 
134 
135 int PS2CamCloseDevice(int handle)
136 {
137  int *ret;
138 
139  ret = (int *)&data[0];
140 
141  ret[0] = handle;
142 
143  sceSifCallRpc(&cdata, PS2CAM_RPC_CLOSEDEVICE, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
144 
145  return ret[0];
146 }
147 
148 
149 
150 
151 
152 int PS2CamGetDeviceStatus(int handle)
153 {
154  int *ret;
155 
156 
157  ret = (int *)&data[0];
158 
159  ret[0] = handle;
160 
161 
162  sceSifCallRpc(&cdata, PS2CAM_RPC_GETDEVSTATUS, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
163  nopdelay();
164 
165  return ret[0];
166 }
167 
168 
169 
170 
171 int PS2CamGetDeviceInfo(int handle, PS2CAM_DEVICE_INFO *info)
172 {
173  int *ret;
174  PS2CAM_DEVICE_INFO *iop_info;
175 
176  ret = (int *)&data[0];
177  iop_info = (PS2CAM_DEVICE_INFO *)&ret[1];
178 
179  ret[0] = handle;
180 
181  memcpy(iop_info, info, info->ssize);
182 
183  sceSifCallRpc(&cdata, PS2CAM_RPC_GETDEVINFO, 0, (void*)(&data[0]),info->ssize+4,(void*)(&data[0]),info->ssize+4,0,0);
184  nopdelay();
185 
186  memcpy(info, iop_info, iop_info->ssize);
187 
188  return ret[0];
189 }
190 
191 
192 
193 
194 
195 int PS2CamSetDeviceBandwidth(int handle, char bandwidth)
196 {
197  int *ret;
198 
199  ret = (int *)&data[0];
200 
201  ret[0] = handle;
202  ret[1] = bandwidth;
203 
204 
205 
206  sceSifCallRpc(&cdata, PS2CAM_RPC_SETDEVBANDWIDTH, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
207  nopdelay();
208 
209  return ret[0];
210 }
211 
212 
213 
214 
215 
216 
217 int PS2CamReadPacket(int handle)
218 {
219  int *ret;
220  SifRpcReceiveData_t rdata;
221 
222  WaitSema(sem);
223 
224  ret = (int *)&data[0];
225 
226  ret[0] = handle;
227 
228  sceSifCallRpc(&cdata, PS2CAM_RPC_READPACKET, 0, (void*)(&data[0]),4,(void*)(&data[0]),4*2,0,0);
229 
230 
231  if(ret[0] < 0) return ret[0];
232 
233  SyncDCache(campacket, (u8 *)(&campacket[0]) + sizeof(campacket));
234  if (sceSifGetOtherData(&rdata, (void *)ret[1], &campacket[0], sizeof(campacket), 0) < 0)
235  return -1;
236 
237  //if i add a printf here, the ps2 will exit to sony's explorer
238  SignalSema(sem);
239  return ret[0];
240 }
241 
242 
243 
244 
245 int PS2CamSetLEDMode(int handle, int mode)
246 {
247  int *ret;
248 
249  ret = (int *)&data[0];
250 
251  ret[0] = handle;
252  ret[1] = mode;
253 
254  sceSifCallRpc(&cdata, PS2CAM_RPC_SETLEDMODE, 0, (void*)(&data[0]),4,(void*)(&data[0]),4,0,0);
255 
256  return ret[0];
257 }
258 
259 
260 
261 int PS2CamSetDeviceConfig(int handle, PS2CAM_DEVICE_CONFIG *cfg)
262 {
263  int *ret;
264 
265  ret = (int *)&data[0];
266 
267  ret[0] = handle;
268 
269  memcpy(&ret[1], cfg, cfg->ssize);
270 
271  sceSifCallRpc(&cdata, PS2CAM_RPC_SETDEVCONFIG, 0, (void*)(&data[0]), 4+cfg->ssize,(void*)(&data[0]),4+cfg->ssize,0,0);
272 
273  return ret[0];
274 }
275 
276 
277 
278 int PS2CamExtractFrame(int handle, char *buffer, int bufsize)
279 {
280  static int capturing;
281  static int pos;
282  static int pic_size;
283 
284  (void)bufsize;
285 
286  pos = 0;
287  capturing = 0;
288 
289 
290 
291  while(1)
292  {
293  static EYETOY_FRAME_HEAD *head;
294  static int ret;
295 
296  ret = PS2CamReadPacket(handle);
297 
298  // printf("packet =%d\n",ret);
299  //if read has a error return it
300  if(ret < 0) return ret;
301 
302  head = (EYETOY_FRAME_HEAD *)UNCACHED_SEG(&campacket[0]);
303 
304  if(head->magic2==0xff && head->magic3==0xff && ret!=0)
305  {
306  if(head->type==0x50 && head->frame==0x00)
307  {
308  // start of frame
309  // printf("SOF(%d)\n",ret);
310  if(capturing == 1)
311  {
312  return 0;
313  }
314 
315  memcpy(&buffer[pos], UNCACHED_SEG(&campacket[16]), ret-16 );
316  pos += (ret-16);
317  capturing = 1;
318 
319  }
320  else if(head->type==0x50 && head->frame==0x01)
321  {
322  // frame head with no data
323  // so do nothing
324 
325  }
326  else if(head->type==0x51 && capturing==1)
327  {
328  //end of frame
329  // printf("EOF(%d)\n",ret);
330  pic_size = (int)(((head->Lo) + ((int)(head->Hi)<<8))<<3);
331 
332 
333  if(pos != pic_size)
334  {
335  return 0;
336  }
337  else
338  {
339  return pic_size;
340  }
341  }
342  else
343  {
344  //if it doesnt fit in those pos then it must be data
345  if(capturing==1)
346  {
347  memcpy(&buffer[pos], UNCACHED_SEG(&campacket[0]), ret );
348  pos += (ret);
349  }
350  }
351  }
352  else
353  {
354  // it must be data
355  if(capturing==1 && ret !=0)
356  {
357  memcpy(&buffer[pos], UNCACHED_SEG(&campacket[0]), ret );
358  pos += (ret);
359  }
360  }
361  }
362 
363 }
364 
365 
366 
367 
kernel.h
PS2CAM_RPC_GETDEVCOUNT
#define PS2CAM_RPC_GETDEVCOUNT
Definition: ps2cam_rpc.h:20
PS2CAM_RPC_GETIRXVERSION
#define PS2CAM_RPC_GETIRXVERSION
Definition: ps2cam_rpc.h:16
PS2CamGetDeviceStatus
int PS2CamGetDeviceStatus(int handle)
Definition: ps2cam_rpc.c:152
PS2CAM_RPC_INITIALIZE
#define PS2CAM_RPC_INITIALIZE
Definition: ps2cam_rpc.h:18
PS2CamOpenDevice
int PS2CamOpenDevice(int device_index)
Definition: ps2cam_rpc.c:119
s_info
Definition: xprintf.c:78
EYETOY_FRAME_HEAD::type
unsigned char type
Definition: ps2cam_rpc.h:86
PS2CAM_DEVICE_INFO::ssize
unsigned int ssize
Definition: ps2cam_rpc.h:107
PS2CamSetDeviceBandwidth
int PS2CamSetDeviceBandwidth(int handle, char bandwidth)
Definition: ps2cam_rpc.c:195
PS2CAM_RPC_READPACKET
#define PS2CAM_RPC_READPACKET
Definition: ps2cam_rpc.h:30
EYETOY_FRAME_HEAD::frame
unsigned char frame
Definition: ps2cam_rpc.h:93
t_SifRpcReceiveData
Definition: sifrpc-common.h:145
PS2CamSetLEDMode
int PS2CamSetLEDMode(int handle, int mode)
Definition: ps2cam_rpc.c:245
iopcontrol.h
t_ee_sema
Definition: kernel.h:193
EYETOY_FRAME_HEAD::magic2
unsigned char magic2
Definition: ps2cam_rpc.h:82
EYETOY_FRAME_HEAD::Hi
unsigned char Hi
Definition: ps2cam_rpc.h:101
PS2CAM_DEVICE_INFO
Definition: ps2cam_rpc.h:104
PS2CamCloseDevice
int PS2CamCloseDevice(int handle)
Definition: ps2cam_rpc.c:135
PS2CamInit
int PS2CamInit(int mode)
Definition: ps2cam_rpc.c:37
EYETOY_FRAME_HEAD::Lo
unsigned char Lo
Definition: ps2cam_rpc.h:99
PS2CAM_RPC_SETLEDMODE
#define PS2CAM_RPC_SETLEDMODE
Definition: ps2cam_rpc.h:32
tamtypes.h
HasIopRebootedSinceLastCall
static int HasIopRebootedSinceLastCall(void)
Definition: iopcontrol.h:47
stdio.h
EYETOY_FRAME_HEAD
Definition: ps2cam_rpc.h:77
PS2CAM_DEVICE_CONFIG
Definition: ps2cam_rpc.h:121
PS2CAM_RPC_GETDEVINFO
#define PS2CAM_RPC_GETDEVINFO
Definition: ps2cam_rpc.h:26
PS2CamReadPacket
int PS2CamReadPacket(int handle)
Definition: ps2cam_rpc.c:217
PS2CAM_RPC_SETDEVBANDWIDTH
#define PS2CAM_RPC_SETDEVBANDWIDTH
Definition: ps2cam_rpc.h:28
t_SifRpcClientData
Definition: sifrpc-common.h:134
__attribute__
Definition: gif_registers.h:38
PS2CAM_RPC_GETDEVSTATUS
#define PS2CAM_RPC_GETDEVSTATUS
Definition: ps2cam_rpc.h:24
EYETOY_FRAME_HEAD::magic3
unsigned char magic3
Definition: ps2cam_rpc.h:84
PS2CAM_DEVICE_CONFIG::ssize
unsigned int ssize
Definition: ps2cam_rpc.h:124
PS2CamGetDeviceCount
int PS2CamGetDeviceCount(void)
Definition: ps2cam_rpc.c:103
PS2CamGetIRXVersion
int PS2CamGetIRXVersion(void)
Definition: ps2cam_rpc.c:87