sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
ps2cam.c
Go to the documentation of this file.
1/*-----------------------------------------------------------------------
2- PSX2 OpenSource Project -
3- (C)2004 lion[PS2Dev] -
4- (C)2004 PS2Dev.org -
5-----------------------------------------------------------------------*/
6
11
12//(1) Please keep this file neat.
13//(2) This irx must always be backwards compatible.
14#include <stdio.h>
15#include <sysclib.h>
16#include <tamtypes.h>
17#include <thbase.h>
18#include <sifcmd.h>
19#include <sifrpc.h>
20#include <loadcore.h>
21#include <ioman.h>
22#include <usbd.h>
23#include <usbd_macro.h>
24#include <thsemap.h>
25#include <sysmem.h>
26
27
28#include "ps2cam.h"
29
30#define MODNAME "PS2 USB camera driver"
31
32IRX_ID(MODNAME, 1, 1);
33
34#define BIND_RPC_ID 0x00FD000 +2
35#define DRIVER_VERSON_MAJOR 1
36#define DRIVER_VERSON_MINOR 0
37
38#define MAX_CAM_DEVICE 2
39#define MAX_CAM_DEVICE_HANDLE 2
40
41
42static SifRpcDataQueue_t rpc_queue __attribute__((__aligned__(16)));
43static SifRpcServerData_t rpc_server __attribute__((__aligned__(16)));
44static int _rpc_buffer[1024] __attribute__((__aligned__(4)));
45//static int threadId;
46static int maintain_thread;
47sceUsbdLddOps cam_driver = {NULL,
48 NULL,
49 "ps2cam",
53 0, 0, 0, 0, 0, NULL };
54
55
56
57char campacket[896] __attribute__((__aligned__(16)));
58char irx_initialized = 0;
59int ps2cam_sema=0;
60CAMERA_DEVICE Camera[MAX_CAM_DEVICE];
61PS2CAM_DEVICE_HANDLE CamHandle[MAX_CAM_DEVICE_HANDLE];
62
63
64
65
66
67
68
69int _start( int argc, char *argv[])
70{
71 iop_thread_t param;
72 int th;
73
74 (void)argc;
75 (void)argv;
76
78
79
80 /*create thread*/
81 param.attr = TH_C;
82 param.thread = rpcMainThread;
83 param.priority = 40;
84 param.stacksize = 0x800;
85 param.option = 0;
86
87
88 th = CreateThread(&param);
89
90 if (th > 0)
91 {
92 StartThread(th,NULL);
93 return MODULE_RESIDENT_END;
94 }
95 else
96 {
97 return MODULE_NO_RESIDENT_END;
98 }
99}
100
101
102
103
104
105
106
107
110{
111 int i;
112 iop_sema_t sema;
113
114 printf("PS2 USB Camera Driver v.%d.%d ((C) www.ps2dev.org)\n",DRIVER_VERSON_MAJOR,DRIVER_VERSON_MINOR);
115
116
117 memset(&Camera[0], 0, sizeof(Camera));
118 memset(&CamHandle[0], 0, sizeof(CamHandle));
119
120 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
121 {
122 CamHandle[i].fd = i+1;
123 }
124
125 //setup sema
126
127
128 sema.initial= 1;
129 sema.max = 1;
130 sema.option = 0;
131 sema.attr = 0;
132 ps2cam_sema = CreateSema(&sema);
133
134
135 //connect to usb.irx
136 return sceUsbdRegisterLdd(&cam_driver);
137}
138
139
140
141
143int PS2CamProbe(int devId)
144{
145 static short count;
146 int i;
150
151
152 dev = sceUsbdScanStaticDescriptor(devId, NULL, USB_DT_DEVICE);
153 conf = sceUsbdScanStaticDescriptor(devId, dev, USB_DT_CONFIG);
154 intf = (UsbInterfaceDescriptor *) ((char *) conf + conf->bLength);
155
156
157
158
159 // check for a free device slot. if none just ignore new device
160 count=0;
161
162 for(i=0;i<MAX_CAM_DEVICE;i++)
163 {
164 if(Camera[i].status==0)count++;
165 }
166
167 if(count <= 0) return 0;
168
169
170 if(intf->bInterfaceClass == USB_CLASS_VENDOR_SPEC)
171 {
172 // eyetoy 1
173 if(dev->idVendor == PS2CAM_VEND_SONY && dev->idProduct == PS2CAM_PROD_EYETOY)
174 {
175 return 1;
176 }
177
178 // eyetoy 2
179 if(dev->idVendor == PS2CAM_VEND_SONY && dev->idProduct == PS2CAM_PROD_EYETOY2)
180 {
181 return 1;
182 }
183
184 // eyetoy 3
185 if(dev->idVendor == PS2CAM_VEND_SONY && dev->idProduct == PS2CAM_PROD_EYETOY3)
186 {
187 return 1;
188 }
189
190 // eyetoy 4
191 if(dev->idVendor == PS2CAM_VEND_SONY && dev->idProduct == PS2CAM_PROD_EYETOY4)
192 {
193 return 1;
194 }
195
196 // D-Link VisualStream DSB-C310
197 if(dev->idVendor == PS2CAM_VEND_DLINK && dev->idProduct == PS2CAM_PROD_VISUALSTREAM)
198 {
199 return 1;
200 }
201 }
202
203
204 return 0;
205}
206
207
208
209
210
211
213int PS2CamConnect(int devId)
214{
215
216 int i;
218
219 UsbInterfaceDescriptor *intf0,*intf1;
221 CAMERA_DEVICE *cam = NULL;
222 iop_thread_t param;
223
224
225 printf("camera was connected\n");
226
227
228
229 dev = sceUsbdScanStaticDescriptor(devId, NULL, USB_DT_DEVICE);
230
231 intf0 = sceUsbdScanStaticDescriptor(devId, dev, USB_DT_INTERFACE);
232 intf1 = sceUsbdScanStaticDescriptor(devId, intf0, USB_DT_INTERFACE);
233
234 endp1= (UsbEndpointDescriptor *) ((char *) intf1 + intf1->bLength);
235
236
237
238
239 //get a free device slot
240 for(i=0;i<MAX_CAM_DEVICE;i++)
241 {
242 if(Camera[i].status == 0)
243 {
244 cam = (CAMERA_DEVICE *)&Camera[i];
245
246 cam->status = CAM_STATUS_CONNECTED;
247 break;
248 }
249 }
250
251 if (cam == NULL)
252 {
253 return 0;
254 }
255
256
257 cam->device_id = devId;
258
259 cam->controll = sceUsbdOpenPipe(devId, NULL);
260 cam->stream = sceUsbdOpenPipe(devId, endp1);
261 cam->stream_pocket_size = (endp1->wMaxPacketSizeHB * 256 + endp1->wMaxPacketSizeLB);
262
263
264
265
266
267
268
269
270
271
272
273
274
275 /*create thread that will execute funtions that cant be called*/
276 /*in this funtion*/
277 param.attr = TH_C;
278 param.thread = (void *)PS2CamInitializeNewDevice;
279 param.priority = 40;
280 param.stacksize = 0x800;
281 param.option = 0;
282
283 maintain_thread = CreateThread(&param);
284
285
286 StartThread(maintain_thread, cam);
287
288 return 0;
289}
290
291
292
293
294
295
297int PS2CamDisconnect(int devId)
298{
299 int i;
300 CAMERA_DEVICE *cam = NULL;
301
302 printf("camera was unplugged\n");
303
304 //find device in slots and remove/clear/free it
305 for(i=0;i<MAX_CAM_DEVICE;i++)
306 {
307 if(Camera[i].device_id == devId)
308 {
309 cam = (CAMERA_DEVICE *)&Camera[i];
310
311 cam->status = CAM_STATUS_NOTCONNECTED;
312 break;
313 }
314 }
315
316
317
318 // inform any handle that is using this device
319
320 //find device handle and set the status
321 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
322 {
323 if(CamHandle[i].cam == cam)
324 {
325 CamHandle[i].status = -1;
326 }
327 }
328
329
330
331 // close endpoints
332 sceUsbdClosePipe(cam->controll);
333 sceUsbdClosePipe(cam->stream );
334
335 cam->status = CAM_STATUS_NOTCONNECTED;
336
337 return 0;
338}
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359/* SIF RPC SERVER FUNCTIONS */
360
361
362void rpcMainThread(void* param)
363{
364 //int ret=-1;
365 int tid;
366
367 (void)param;
368
369 sceSifInitRpc(0);
370 tid = GetThreadId();
371 sceSifSetRpcQueue(&rpc_queue, tid);
372 sceSifRegisterRpc(&rpc_server, BIND_RPC_ID, (void *) rpcCommandHandler, (u8 *) &_rpc_buffer, 0, 0, &rpc_queue);
373 sceSifRpcLoop(&rpc_queue);
374}
375
376/* CAMERA HIGH LEVEL FUNCTIONS */
377
378
379
380
383{
384 unsigned char *temp_str;
386
387
389
390 camStopStream(cam);
391 PS2CamSelectInterface(cam,0,0);
392 camStartStream(cam);
393
395
396/* camStopStream(dev);
397 setReg16(dev, 0x30, 384);
398 camStartStream(dev);
399*/
400 camStopStream(cam);
401 PS2CamSelectInterface(cam,0,EYETOY_ALTERNATE_SIZE_384);
402 camStartStream(cam);
403
404 cam->status = CAM_STATUS_CONNECTEDREADY;
405
406
407
408 // connected message (alloc som mem and get device string then print it and free the mem we alloced)
409 d = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
410 temp_str = AllocSysMemory(0, 128, 0);
411 temp_str[0]=0x00;
412 PS2CamGetDeviceSring(cam, d->iProduct, (char *)temp_str, 128);
413 printf("cam initialized(%s)\n",temp_str);
414 FreeSysMemory(temp_str);
415
416
417
418 DeleteThread(maintain_thread);
419
420 return;
421
422}
423
424
425
426
427
430{
431 int ret;
432
433
434 WaitSema(ps2cam_sema);
435
436 ret = sceUsbdSetConfiguration(dev->controll, id, PS2CamCallback, (void*)ps2cam_sema);
437
438 if(ret != USB_RC_OK)
439 {
440 printf("Usb: Error sending set_configuration\n");
441 }
442 else
443 {
444 WaitSema(ps2cam_sema);
445 }
446
447 SignalSema(ps2cam_sema);
448}
449
450
451
454{
455 //int i;
456 static int width,height;
457
458
459 camResetDevice(dev);
460
461 //stop cam before we change settings then start it back later
462 camStopStream(dev);
463
464 camEnableSystem(dev);
465
466 /*set red led pin to out before turning it on*/
467 setReg8(dev,EYETOY_GPIO_IO_CTRL0, 0xee);
468
469 camSetUsbInit(dev);
470
471
472 //turn red led off by default
473 camTurnOffRedLed(dev);
474
475
476
477
478
479
480
481
482 /* some info sent to cam while peeking at
483 the usb log under windows
484 */
485 setReg8(dev, EYETOY_CREG_PWDN, 0x03);
486 setReg8(dev, EYETOY_CREG_EN_CLK0, 0x9f);
487 setReg8(dev, EYETOY_CREG_EN_CLK1, 0x0f);
488 setReg8(dev, 0xa2, 0x20);
489 setReg8(dev, 0xa3, 0x18);
490 setReg8(dev, 0xa4, 0x04);
491 setReg8(dev, 0xa5, 0x28);
492
493 setReg8(dev, 0x37, 0x00);
494 setReg8(dev, EYETOY_CREG_AUDIO_CLK, 0x02);
495 setReg8(dev, EYETOY_IREG_FRAR, 0x1f);
496 setReg8(dev, 0x17, 0x50);
497 setReg8(dev, 0x37, 0x00);
498
499 setReg8(dev, 0x40, 0xff);
500 setReg8(dev, 0x46, 0x00);
501 setReg8(dev, EYETOY_CREG_CAMERA_CLK,0x04);
502// setReg8(dev, 0xff, 0x00 );
503
504
505
506
507
508
509
510 // my Y Enhancement
511 setReg8(dev, 0xa8, 0x00 );
512 setReg8(dev, 0xa9, 0x20 );
513 setReg8(dev, 0xaa, 0x00 );
514
515
516
517
518
519
520 /* Select 8-bit input mode */
521 setReg8Mask(dev, EYETOY_IREG_DFR, 0x10, 0x10);
522
523 // 320x240
524 width = 320;
525 height= 240;
526
527 //set rez
528 setReg8(dev, EYETOY_IREG_H_SIZE, width>>4);
529 setReg8(dev, EYETOY_IREG_V_SIZE, height>>3);
530 //set offset
531 setReg8(dev, EYETOY_IREG_X_OFFSETL, 0x00);
532 setReg8(dev, EYETOY_IREG_X_OFFSETH, 0x00);
533 setReg8(dev, EYETOY_IREG_Y_OFFSETL, 0x00);
534 setReg8(dev, EYETOY_IREG_Y_OFFSETH, 0x00);
535 //div & color
536 //setReg8(dev, EYETOY_IREG_DIVIDER, 0x11);
537 camSetDIVIDER(dev, 1, 0, 1, 0);
538 setReg8(dev, EYETOY_IREG_FORMAT, 0x03);
539 setReg8(dev, 0x26, 0x00);
540
541
542 // 30 fps
543 setReg8(dev, 0xa4, 0x0c);
544 setReg8(dev, 0x23, 0xff);
545
546
547
548 // start cam after changing settings
549 camStartStream(dev);
550
551}
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566/* CAMERA LOW LEVEL FUNCTIONS */
567
568
570void PS2CamCallback(int resultCode, int bytes, void *arg)
571{
572 if(resultCode !=0)
573 printf("callback: result= %d, bytes= %d, arg= %p \n", resultCode, bytes, arg);
574
575 SignalSema(ps2cam_sema);
576}
577
578
580int setReg8(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned char value)
581{
582 int ret;
583
584 WaitSema(ps2cam_sema);
585
586 ret = sceUsbdControlTransfer(dev->controll, USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, 0, (unsigned short)reg_id, 1, &value, PS2CamCallback, (void*)ps2cam_sema);
587
588 if(ret != USB_RC_OK)
589 {
590 printf("sceUsbdControlTransfer failed in 'setReg8'.\n");
591 ret = -1;
592 }
593 else
594 {
595 WaitSema(ps2cam_sema);
596 }
597
598 SignalSema(ps2cam_sema);
599 return ret;
600}
601
602
603
604
606int getReg8(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned char *value)
607{
608 int ret;
609
610 WaitSema(ps2cam_sema);
611
612 ret = sceUsbdControlTransfer(dev->controll,USB_DIR_IN|USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, 0,(unsigned short)reg_id, 1, value, PS2CamCallback, (void*)ps2cam_sema);
613
614 if(ret != USB_RC_OK)
615 {
616 printf("sceUsbdControlTransfer failed in 'getRegValue'.\n");
617 ret = -1;
618 }
619 else
620 {
621 WaitSema(ps2cam_sema);
622 }
623
624
625 SignalSema(ps2cam_sema);
626 return ret;
627}
628
629
630
631
633int setReg8Mask(CAMERA_DEVICE *dev,unsigned char reg_id, unsigned char value, unsigned char mask)
634{
635 int ret;
636 unsigned char current, final;
637
638 ret = getReg8(dev, reg_id, &current);
639
640 if (ret < 0) return -1;
641
642 current &= (~mask);
643 value &= mask;
644 final = current | value;
645
646 ret = setReg8(dev, reg_id, final);
647 return ret;
648}
649
650int setReg16(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned short value)
651{
652 int ret;
653
654 WaitSema(ps2cam_sema);
655
656 ret = sceUsbdControlTransfer(dev->controll,USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, 0, (unsigned short)reg_id, 2, &value, PS2CamCallback, (void*)ps2cam_sema);
657
658
659 if(ret != USB_RC_OK)
660 {
661 printf("Usb: setReg16 Error (%d)\n",ret);
662 }else
663 {
664 WaitSema(ps2cam_sema);
665 }
666
667 SignalSema(ps2cam_sema);
668 return 0;
669}
670
671
672
674void PS2CamGetDeviceSring(CAMERA_DEVICE* dev, int index, char *str, int strmax)
675{
676 static char buff[50];
678 int ret;
679
680
681 WaitSema(ps2cam_sema);
682
683
684 ret = sceUsbdControlTransfer(dev->controll, 0x80, USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) | index, 0, sizeof(buff), (char *)&buff[0], PS2CamCallback, (void*)ps2cam_sema);
685
686 if(ret != USB_RC_OK)
687 {
688 printf("Usb: Error getting string (%d)\n",ret);
689 }
690 else
691 {
692 int i;
693
694
695 WaitSema(ps2cam_sema);
696
697 sd = (UsbStringDescriptor *)&buff[0];
698 for(i=0;(i<(sd->bLength-4)/2 && i<strmax-1);i++)
699 {
700 str[i] = sd->wData[i] & 0xFF;
701 str[i+1] = 0x00;
702 }
703 }
704
705
706 SignalSema(ps2cam_sema);
707}
708
709
710
712int PS2CamSelectInterface(CAMERA_DEVICE* dev, int interface, int altSetting)
713{
714 int ret;
715 //int semh;
716 //iop_sema_t s;
717
718
719 WaitSema(ps2cam_sema);
720
721
722 ret = sceUsbdSetInterface(dev->controll, interface, altSetting, PS2CamCallback, (void*)ps2cam_sema);
723
724 if(ret != USB_RC_OK)
725 {
726 printf("Usb: PS2CamSelectInterface Error...\n");
727 }
728 else
729 {
730 WaitSema(ps2cam_sema);
731 }
732
733 SignalSema(ps2cam_sema);
734 return ret;
735}
736
737
738
739
740
741
744{
745 setReg8(dev,EYETOY_CREG_RESET1, 0x0f);
746 setReg8(dev,EYETOY_CREG_RESET1, 0x00);
747}
748
749
750void camEnableAutoLaunch(CAMERA_DEVICE *dev)
751{
752 setReg8(dev, EYETOY_CREG_SNAPSHOT, 23);
753}
754
755
756void camDisableAutoLaunch(CAMERA_DEVICE *dev)
757{
758 setReg8(dev, EYETOY_CREG_SNAPSHOT, 23);
759}
760
761
762void camClearSnapButton(CAMERA_DEVICE *dev)
763{
764 setReg8Mask(dev, EYETOY_CREG_SNAPSHOT, 03,02);
765}
766
767
768int camCheckAutoLaunch(CAMERA_DEVICE *dev)
769{
770 (void)dev;
771
772 //setReg8Mask(dev, EYETOY_CREG_SNAPSHOT, 10,10);
773 return 0;
774}
775
776
779{
780 setReg8(dev,0x5a, 0x6d);
781 setReg8(dev,0x53, 0x9b);
782 setReg8(dev,0x54, 0x0f);
783 setReg8(dev,0x5d, 0x03);
784 setReg8(dev,0x49, 0x01);
785 setReg8(dev,0x48, 0x00);
786}
787
788
791{
792 setReg8Mask(dev, EYETOY_CREG_EN_CLK0, 0x9b,0x9b);
793}
794
795
798{
799 setReg8(dev,0x51, 0x0f);
800 setReg8(dev,0x51, 0x00);
801}
802
803
806{
807 setReg8(dev,0x51, 0x0f);
808 setReg8(dev,0x51, 0x00);
809 setReg8(dev,0x22, 0x00);
810}
811
812
815{
816 setReg8(dev,0x51, 0x0f);
817 setReg8(dev,0x51, 0x00);
818 setReg8(dev,0x22, 0x1d);
819}
820
821
824{
825 setReg8Mask(dev, EYETOY_GPIO_DATA_OUT0, 0x01,0x01);
826}
827
828
831{
832 setReg8Mask(dev, EYETOY_GPIO_DATA_OUT0, 0x00,0x01);
833}
834
835
838{
839
840 setReg8(dev, EYETOY_CREG_RESET1, 0x00);
841}
842
843
844void camStopStream(CAMERA_DEVICE *dev)
845{
846
847 setReg8(dev, EYETOY_CREG_RESET1, 0x0f);
848}
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871int read_rslt;
872int read_byts;
873
874void PS2CamReadDataCallback(int resultCode, int bytes, void *arg)
875{
876 (void)arg;
877
878 //printf("read_data_callback: result= %d, bytes= %d, arg= %p \n", resultCode, bytes, arg);
879
880 read_rslt = resultCode;
881 read_byts = bytes;
882 SignalSema(ps2cam_sema);
883}
884
885
886
887
888int PS2CamReadData(CAMERA_DEVICE* dev, void *addr, int size)
889{
890 int ret;
891
892 WaitSema(ps2cam_sema);
893
894 ret = sceUsbdIsochronousTransfer(dev->stream, addr, size, 0, PS2CamReadDataCallback, (void*)ps2cam_sema);
895
896 if(ret != USB_RC_OK)
897 {
898 printf("Usb: Error sending sceUsbdIsochronousTransfer\n");
899 SignalSema(ps2cam_sema);
900 return -1;
901 }
902 else
903 {
904 WaitSema(ps2cam_sema);
905 }
906
907 SignalSema(ps2cam_sema);
908 return read_byts;
909}
910
911
912
913
914
915
916
917
918
919
920
921
922
923/* CAMERA MISC FUNTIONS */
924
925
926
927
928
929
930
931
932
933
934
935
936/* CAMERA RPC/EXPORTED FUNTIONS */
937
938
941{
942 static unsigned short ver[2];
943 int *ret;
944
945 ret = (int *)&ver[0];
946 ver[0] =DRIVER_VERSON_MAJOR;
947 ver[1] =DRIVER_VERSON_MINOR;
948
949 return *ret;
950}
951
952
953
955int PS2CamInit(int mode)
956{
957 (void)mode;
958
959 irx_initialized = 1;
960
961 return 0;
962}
963
964
965
968{
969 int i;
970 static int count;
971
972 if(! irx_initialized)
973 return CAM_ERROR_NOTINIT;
974
975
976 //scan device slots for camara(s)
977 for(i=0;i<MAX_CAM_DEVICE;i++)
978 {
979 if(Camera[i].status > 0)
980 {
981 count++;
982 }
983 }
984
985 return count;
986}
987
988
989
991int PS2CamOpenDevice(int device_index)
992{
993 int i;
994 CAMERA_DEVICE *cam = NULL;
995 PS2CAM_DEVICE_HANDLE *handle = NULL;
996 int index;
997
998 if(! irx_initialized)
999 return CAM_ERROR_NOTINIT;
1000
1001 //search for a connected camera
1002 for(i=0,index=0;i<MAX_CAM_DEVICE;i++)
1003 {
1004 if(Camera[i].status > 0)
1005 {
1006 if(index == device_index)
1007 {
1008 cam = &Camera[i];
1009 break;
1010 }
1011
1012 index++;
1013 }
1014
1015
1016 //see the error code to return
1017 if((i+1) == (MAX_CAM_DEVICE))
1018 {
1019 if(index == 0)return CAM_ERROR_NODEVICE;
1020 if(index < device_index)return CAM_ERROR_BADRANGE;
1021 return CAM_ERROR_UNKNOWN;
1022 }
1023 }
1024
1025
1026
1027 //find a free device handle slot for the device
1028 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
1029 {
1030 if(CamHandle[i].status == 0)
1031 {
1032 handle = &CamHandle[i];
1033 break;
1034 }
1035
1036
1037 //see error to return
1038 if((i+1)== MAX_CAM_DEVICE_HANDLE)
1039 {
1040 return CAM_ERROR_MAXHANDLE;
1041 }
1042 }
1043
1044 if (handle == NULL)
1045 {
1046 return CAM_ERROR_MAXHANDLE;
1047 }
1048
1049
1050 //now we point handle attribute to the camera
1051 handle->status = 1;
1052 handle->cam = cam;
1053
1054 return handle->fd;
1055}
1056
1057
1058
1060int PS2CamCloseDevice(int handle)
1061{
1062 int i;
1063
1064 if(! irx_initialized)
1065 return CAM_ERROR_NOTINIT;
1066
1067 //find device handle and clear the status
1068 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
1069 {
1070 if(CamHandle[i].fd == handle)
1071 {
1072 CamHandle[i].status=0;
1073 break;
1074 }
1075
1076
1077 //see error to return
1078 if((i+1)== MAX_CAM_DEVICE_HANDLE)
1079 {
1080 return CAM_ERROR_BADHANDLE;
1081 }
1082 }
1083
1084 return 0;
1085}
1086
1087
1088
1091{
1092 CAMERA_DEVICE *dev;
1093
1094
1095
1096 if(! irx_initialized)
1097 return CAM_ERROR_NOTINIT;
1098
1099 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1100 return CAM_ERROR_BADHANDLE;
1101
1102 if(CamHandle[handle-1].status == -1)
1104
1105 dev = CamHandle[handle-1].cam;
1106
1107
1108 return dev->status;
1109}
1110
1111
1112
1114int PS2CamGetDeviceInfo(int handle,int *info)
1115{
1116 static unsigned int size;
1119 PS2CAM_DEVICE_INFO *ptr;
1120 CAMERA_DEVICE *cam;
1121
1122 if(! irx_initialized)
1123 return CAM_ERROR_NOTINIT;
1124
1125 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1126 return CAM_ERROR_BADHANDLE;
1127
1128 if(CamHandle[handle-1].status == -1)
1130
1131 ptr = (PS2CAM_DEVICE_INFO *)info;
1132 size = ptr->ssize;
1133
1134
1135
1136 if(size > sizeof(PS2CAM_DEVICE_INFO))
1137 {
1138 size = sizeof(PS2CAM_DEVICE_INFO);
1139 }
1140
1141
1142
1143 cam = CamHandle[handle-1].cam;
1144
1145 //get descripters
1146 dev = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
1147
1148
1149 // now collect inf
1150 inf.ssize = size;
1151 inf.vendor_id = dev->idVendor;
1152 inf.product_id = dev->idProduct;
1153
1154 PS2CamGetDeviceSring(cam, dev->iManufacturer, (char *)&inf.vendor_name[0] , 32);
1155 PS2CamGetDeviceSring(cam, dev->iProduct, (char *)&inf.product_name[0], 32);
1156
1157
1158 if(dev->idProduct == PS2CAM_PROD_EYETOY)
1159 {
1160 strcpy((char *)&inf.model[0],"SLEH-00030\0");
1161 }
1162 else if(dev->idProduct == PS2CAM_PROD_EYETOY2)
1163 {
1164 strcpy((char *)&inf.model[0],"SLEH-00031\0");
1165 }
1166 else
1167 {
1168 strcpy((char *)&inf.model[0],"UNKNOWN\0");
1169 }
1170 /**/
1171 memcpy(info, &inf, size);
1172
1173 return 0;
1174}
1175
1176
1177
1179int PS2CamSetDeviceBandwidth(int handle, char bandwidth)
1180{
1181 int i;
1182 CAMERA_DEVICE *cam;
1183
1187
1188 if(! irx_initialized)
1189 return CAM_ERROR_NOTINIT;
1190
1191 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1192 return CAM_ERROR_BADHANDLE;
1193
1194 if(CamHandle[handle-1].status == -1)
1196
1197
1198 cam = CamHandle[handle-1].cam;
1199
1200 cam->bandwidth = bandwidth;
1201
1202
1203
1204 //search for enpoint to open
1205 dev = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
1206 intf = sceUsbdScanStaticDescriptor(cam->device_id, dev, USB_DT_INTERFACE);
1207
1208 for(i=0;i<cam->bandwidth;i++)
1209 {
1210 intf = sceUsbdScanStaticDescriptor(cam->device_id, intf, USB_DT_INTERFACE);
1211 }
1212
1213 endp= (UsbEndpointDescriptor *) ((char *) intf + intf->bLength);
1214
1215
1216 // close old endpoint and open new one
1217 sceUsbdClosePipe(cam->stream);
1218 cam->stream = sceUsbdOpenPipe(cam->device_id, endp);
1219
1220 cam->stream_pocket_size = (endp->wMaxPacketSizeHB * 256 + endp->wMaxPacketSizeLB);
1221 printf("bandwidth =%d\n",cam->stream_pocket_size);
1222
1223
1224
1225 camStopStream(cam);
1226
1227 switch(bandwidth)
1228 {
1229 case 0:
1231 break;
1232 case 1:
1233 PS2CamSelectInterface(cam,0,EYETOY_ALTERNATE_SIZE_384);
1234 break;
1235 case 2:
1236 PS2CamSelectInterface(cam,0,EYETOY_ALTERNATE_SIZE_512);
1237 break;
1238 case 3:
1239 PS2CamSelectInterface(cam,0,EYETOY_ALTERNATE_SIZE_768);
1240 break;
1241 case 4:
1242 PS2CamSelectInterface(cam,0,EYETOY_ALTERNATE_SIZE_896);
1243 break;
1244
1245 }
1246
1247 setReg8(cam, EYETOY_CREG_RESET1, 0x00);
1248
1249 return 0;
1250}
1251
1252
1253
1255int PS2CamReadPacket(int handle)
1256{
1257
1258 CAMERA_DEVICE *cam;
1259 int ret;
1260
1261
1262
1263 if(! irx_initialized)
1264 return CAM_ERROR_NOTINIT;
1265
1266 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1267 return CAM_ERROR_BADHANDLE;
1268
1269 if(CamHandle[handle-1].status == -1)
1271
1272
1273 cam = CamHandle[handle-1].cam;
1274
1275 if(cam == NULL) return CAM_ERROR_INVALIDDEVICE;
1276 if(cam->status < 2) return CAM_ERROR_DEVNOTREADY;
1277
1278
1279
1280
1281 switch(cam->bandwidth)
1282 {
1284 ret =0;
1285 break;
1286 case EYETOY_ALTERNATE_SIZE_384:
1287 ret = PS2CamReadData(cam, &campacket[0], 384);
1288 break;
1289 case EYETOY_ALTERNATE_SIZE_512:
1290 ret = PS2CamReadData(cam, &campacket[0], 512);
1291 break;
1292 case EYETOY_ALTERNATE_SIZE_768:
1293 ret = PS2CamReadData(cam, &campacket[0], 768);
1294 break;
1295 case EYETOY_ALTERNATE_SIZE_896:
1296 ret = PS2CamReadData(cam, &campacket[0], 896);
1297 break;
1298 default :
1299 ret = PS2CamReadData(cam, &campacket[0], 384);
1300 break;
1301 }
1302
1303 return ret;
1304}
1305
1306
1307
1309int PS2CamSetLEDMode(int handle, int mode)
1310{
1311 CAMERA_DEVICE *cam;
1312
1313 if(! irx_initialized)
1314 return CAM_ERROR_NOTINIT;
1315
1316 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1317 return CAM_ERROR_BADHANDLE;
1318
1319 if(CamHandle[handle-1].status == -1)
1321
1322
1323 cam = CamHandle[handle-1].cam;
1324
1325 if(cam == NULL) return CAM_ERROR_INVALIDDEVICE;
1326 if(cam->status < 2) return CAM_ERROR_DEVNOTREADY;
1327
1328
1329
1330 switch(mode)
1331 {
1332 case 0://off
1333 camTurnOffRedLed(cam);
1334 break;
1335 case 1://on
1336 camTurnOnRedLed(cam);
1337 break;
1338// case 2://flash
1339//
1340// break;
1341 default:
1342 camTurnOffRedLed(cam);
1343 break;
1344 }
1345
1346
1347 return 0;
1348}
1349
1350
1351
1352
1354int PS2CamSetDeviceConfig(int handle, void *config)
1355{
1356 CAMERA_DEVICE *cam;
1358
1359 if(! irx_initialized)
1360 return CAM_ERROR_NOTINIT;
1361
1362 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1363 return CAM_ERROR_BADHANDLE;
1364
1365 if(CamHandle[handle-1].status == -1)
1367
1368
1369 cam = CamHandle[handle-1].cam;
1370
1371 if(cam == NULL) return CAM_ERROR_INVALIDDEVICE;
1372 if(cam->status < 2) return CAM_ERROR_DEVNOTREADY;
1373
1374
1375
1376 cfg = (PS2CAM_DEVICE_CONFIG *)config;
1377
1378 // stop data
1379 camStopStream(cam);
1380
1381
1382 //set rez
1383 if(cfg->mask & CAM_CONFIG_MASK_DIMENSION)
1384 {
1385
1386 setReg8(cam, EYETOY_IREG_H_SIZE, cfg->width >>4);
1387 setReg8(cam, EYETOY_IREG_V_SIZE, cfg->height >>3);
1388 }
1389
1390 //set offset
1391 if(cfg->mask & CAM_CONFIG_MASK_OFFSET)
1392 {
1393 unsigned char *p;
1394
1395 p = (unsigned char *)&cfg->x_offset;
1396 setReg8(cam, EYETOY_IREG_X_OFFSETL, p[0]);
1397 setReg8(cam, EYETOY_IREG_X_OFFSETH, p[1]);
1398
1399 p = (unsigned char *)&cfg->y_offset;
1400 setReg8(cam, EYETOY_IREG_Y_OFFSETL, p[0]);
1401 setReg8(cam, EYETOY_IREG_Y_OFFSETH, p[1]);
1402 }
1403
1404 //set divider
1405 if(cfg->mask & CAM_CONFIG_MASK_DIVIDER)
1406 {
1407 if(cfg->h_divider > 4)cfg->h_divider = 4;
1408 if(cfg->v_divider > 4)cfg->v_divider = 4;
1409
1410 camSetDIVIDER(cam, cfg->h_divider, 0, cfg->v_divider, 0);
1411 }
1412
1413 //set framerate
1414 if(cfg->mask & CAM_CONFIG_MASK_FRAMERATE)
1415 {
1416
1417 switch(cfg->framerate)
1418 {
1419 case 5:
1420 setReg8(cam, 0xa4, 0x04);
1421 setReg8(cam, 0x23, 0x1b);
1422 break;
1423 case 10:
1424 setReg8(cam, 0xa4, 0x04);
1425 setReg8(cam, 0x23, 0x1f);
1426 break;
1427 case 15:
1428 setReg8(cam, 0xa4, 0x04);
1429 setReg8(cam, 0x23, 0xff);
1430 break;
1431 case 25:
1432 setReg8(cam, 0xa4, 0x0c);
1433 setReg8(cam, 0x23, 0x1f);
1434 break;
1435 case 30:
1436 setReg8(cam, 0xa4, 0x0c);
1437 setReg8(cam, 0x23, 0xff);
1438 break;
1439 default:
1440 setReg8(cam, 0xa4, 0x0c);
1441 setReg8(cam, 0x23, 0xff);
1442 break;
1443 }
1444 }
1445
1446
1447 // restart data
1448 camStartStream(cam);
1449
1450 return 0;
1451}
1452
1453
1454void *rpcCommandHandler(u32 command, void *buffer, int size)
1455{
1456 int* buf = (int*) buffer;
1457 //char* ptr = (char*) buffer;
1458 int ret = 0;
1459
1460 (void)size;
1461
1462 switch (command)
1463 {
1465 ret = PS2CamGetIRXVersion();
1466
1467 break;
1469 ret = PS2CamInit(buf[0]);
1470
1471 break;
1473 ret = PS2CamGetDeviceCount();
1474
1475 break;
1476 case PS2CAM_RPC_OPENDEVICE:
1477 ret = PS2CamOpenDevice(buf[0]);
1478
1479 break;
1480 case PS2CAM_RPC_CLOSEDEVICE:
1481 ret = PS2CamCloseDevice(buf[0]);
1482
1483 break;
1485 ret = PS2CamGetDeviceStatus(buf[0]);
1486
1487 break;
1489 ret = PS2CamGetDeviceInfo(buf[0],&buf[1]);
1490
1491 break;
1493 ret = PS2CamSetDeviceBandwidth(buf[0], buf[1]);
1494
1495 break;
1497 ret = PS2CamReadPacket(buf[0]);
1498
1499 //get mem address so i can access it from ee
1500 buf[1] = (int )&campacket[0];
1501
1502 break;
1503
1505 ret = PS2CamSetLEDMode(buf[0], buf[1]);
1506
1507 break;
1508 case PS2CAM_RPC_SETDEVCONFIG:
1509 ret = PS2CamSetDeviceConfig(buf[0], &buf[1]);
1510
1511 break;
1512 default:
1514
1515 break;
1516 }
1517
1518
1519 buf[0] = ret;
1520
1521
1522 return buffer;
1523}
1524
1525
1526
1527
1528
1529
1530/*EOF*/
void PS2CamSetDeviceConfiguration(CAMERA_DEVICE *dev, int id)
Definition ps2cam.c:429
#define PS2CAM_VEND_DLINK
Definition ps2cam.h:44
#define CAM_STATUS_CONNECTED
Definition ps2cam.h:113
#define CAM_ERROR_DISCONNECTED
Definition ps2cam.h:143
void camResetDevice(CAMERA_DEVICE *dev)
Definition ps2cam.c:743
#define CAM_ERROR_COMMUNKNOWN
Definition ps2cam.h:129
#define PS2CAM_RPC_GETDEVSTATUS
Definition ps2cam.h:28
void PS2CamCallback(int resultCode, int bytes, void *arg)
Definition ps2cam.c:570
int PS2CamDisconnect(int devId)
Definition ps2cam.c:297
#define CAM_ERROR_BADHANDLE
Definition ps2cam.h:141
void PS2CamInitializeNewDevice(CAMERA_DEVICE *argv)
Definition ps2cam.c:382
#define EYETOY_ALTERNATE_SIZE_0
Definition ps2cam.h:103
int getReg8(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned char *value)
Definition ps2cam.c:606
#define PS2CAM_RPC_SETDEVBANDWIDTH
Definition ps2cam.h:32
void camStartStream(CAMERA_DEVICE *dev)
Definition ps2cam.c:837
int PS2CamGetDeviceStatus(int device_id)
Definition ps2cam.c:1090
int PS2CamGetDeviceCount(void)
Definition ps2cam.c:967
int PS2CamSetLEDMode(int device_id, int mode)
Definition ps2cam.c:1309
#define CAM_ERROR_BADRANGE
Definition ps2cam.h:135
int PS2CamInitDriver()
Definition ps2cam.c:109
int PS2CamConnect(int devId)
Definition ps2cam.c:213
int PS2CamGetDeviceInfo(int handle, int *info)
Definition ps2cam.c:1114
int setReg8Mask(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned char value, unsigned char mask)
Definition ps2cam.c:633
int PS2CamInit(int mode)
Definition ps2cam.c:955
#define PS2CAM_RPC_GETIRXVERSION
Definition ps2cam.h:20
int PS2CamCloseDevice(int handle)
Definition ps2cam.c:1060
#define CAM_ERROR_UNKNOWN
Definition ps2cam.h:137
#define CAM_ERROR_MAXHANDLE
Definition ps2cam.h:139
int PS2CamProbe(int devId)
Definition ps2cam.c:143
void PS2CamSetDeviceDefaults(CAMERA_DEVICE *dev)
Definition ps2cam.c:453
void camTurnOffRedLed(CAMERA_DEVICE *dev)
Definition ps2cam.c:830
#define PS2CAM_PROD_EYETOY4
Definition ps2cam.h:56
int PS2CamSelectInterface(CAMERA_DEVICE *dev, int interface, int altSetting)
Definition ps2cam.c:712
int PS2CamSetDeviceBandwidth(int device_id, char bandwidth)
Definition ps2cam.c:1179
#define PS2CAM_RPC_GETDEVCOUNT
Definition ps2cam.h:24
#define PS2CAM_RPC_SETLEDMODE
Definition ps2cam.h:36
#define PS2CAM_RPC_GETDEVINFO
Definition ps2cam.h:30
#define PS2CAM_PROD_EYETOY
Definition ps2cam.h:50
void camResetUsb(CAMERA_DEVICE *dev)
Definition ps2cam.c:797
#define PS2CAM_RPC_INITIALIZE
Definition ps2cam.h:22
int PS2CamGetIRXVersion(void)
Definition ps2cam.c:940
void camDisableSystem(CAMERA_DEVICE *dev)
Definition ps2cam.c:790
void camEnableSystem(CAMERA_DEVICE *dev)
Definition ps2cam.c:778
#define CAM_ERROR_DEVNOTREADY
Definition ps2cam.h:131
void camTurnOnRedLed(CAMERA_DEVICE *dev)
Definition ps2cam.c:823
#define PS2CAM_VEND_SONY
Definition ps2cam.h:42
#define CAM_STATUS_NOTCONNECTED
Definition ps2cam.h:111
#define CAM_ERROR_NODEVICE
Definition ps2cam.h:133
void camSetUsbInit(CAMERA_DEVICE *dev)
Definition ps2cam.c:805
int PS2CamSetDeviceConfig(int handle, void *config)
Definition ps2cam.c:1354
#define CAM_STATUS_CONNECTEDREADY
Definition ps2cam.h:115
int PS2CamOpenDevice(int device_index)
Definition ps2cam.c:991
void PS2CamGetDeviceSring(CAMERA_DEVICE *dev, int index, char *str, int strmax)
Definition ps2cam.c:674
int PS2CamReadPacket(int device_id)
Definition ps2cam.c:1255
#define PS2CAM_PROD_VISUALSTREAM
Definition ps2cam.h:59
void camSetUsbWork(CAMERA_DEVICE *dev)
Definition ps2cam.c:814
#define PS2CAM_RPC_READPACKET
Definition ps2cam.h:34
#define PS2CAM_PROD_EYETOY2
Definition ps2cam.h:52
int setReg8(CAMERA_DEVICE *dev, unsigned char reg_id, unsigned char value)
Definition ps2cam.c:580
#define PS2CAM_PROD_EYETOY3
Definition ps2cam.h:54
unsigned short framerate
Definition ps2cam.h:200
unsigned short x_offset
Definition ps2cam.h:192
unsigned short width
Definition ps2cam.h:188
unsigned char v_divider
Definition ps2cam.h:198
unsigned int mask
Definition ps2cam.h:186
unsigned char h_divider
Definition ps2cam.h:196
unsigned short y_offset
Definition ps2cam.h:194
unsigned short height
Definition ps2cam.h:190
unsigned short vendor_id
Definition ps2cam.h:149
unsigned char vendor_name[32]
Definition ps2cam.h:151
unsigned int ssize
Definition ps2cam.h:148
unsigned short product_id
Definition ps2cam.h:150
unsigned char product_name[32]
Definition ps2cam.h:152
unsigned char model[16]
Definition ps2cam.h:153
#define USB_RC_OK
Definition usbd.h:239
struct _UsbDriver sceUsbdLddOps
u32 count
start sector of fragmented bd/file