30 #define MODNAME "PS2 USB camera driver"
32 IRX_ID(MODNAME, 1, 1);
34 #define BIND_RPC_ID 0x00FD000 +2
35 #define DRIVER_VERSON_MAJOR 1
36 #define DRIVER_VERSON_MINOR 0
38 #define MAX_CAM_DEVICE 2
39 #define MAX_CAM_DEVICE_HANDLE 2
46 static int maintain_thread;
53 0, 0, 0, 0, 0, NULL };
58 char irx_initialized = 0;
69 int _start(
int argc,
char *argv[])
82 param.thread = rpcMainThread;
84 param.stacksize = 0x800;
88 th = CreateThread(¶m);
93 return MODULE_RESIDENT_END;
97 return MODULE_NO_RESIDENT_END;
114 printf(
"PS2 USB Camera Driver v.%d.%d ((C) www.ps2dev.org)\n",DRIVER_VERSON_MAJOR,DRIVER_VERSON_MINOR);
117 memset(&Camera[0], 0,
sizeof(Camera));
118 memset(&CamHandle[0], 0,
sizeof(CamHandle));
120 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
122 CamHandle[i].fd = i+1;
132 ps2cam_sema = CreateSema(&sema);
136 return sceUsbdRegisterLdd(&cam_driver);
152 dev = sceUsbdScanStaticDescriptor(devId, NULL, USB_DT_DEVICE);
153 conf = sceUsbdScanStaticDescriptor(devId, dev, USB_DT_CONFIG);
162 for(i=0;i<MAX_CAM_DEVICE;i++)
164 if(Camera[i].status==0)
count++;
167 if(
count <= 0)
return 0;
170 if(intf->bInterfaceClass == USB_CLASS_VENDOR_SPEC)
225 printf(
"camera was connected\n");
229 dev = sceUsbdScanStaticDescriptor(devId, NULL, USB_DT_DEVICE);
231 intf0 = sceUsbdScanStaticDescriptor(devId, dev, USB_DT_INTERFACE);
232 intf1 = sceUsbdScanStaticDescriptor(devId, intf0, USB_DT_INTERFACE);
240 for(i=0;i<MAX_CAM_DEVICE;i++)
242 if(Camera[i].status == 0)
257 cam->device_id = devId;
259 cam->
controll = sceUsbdOpenPipe(devId, NULL);
260 cam->
stream = sceUsbdOpenPipe(devId, endp1);
261 cam->stream_pocket_size = (endp1->wMaxPacketSizeHB * 256 + endp1->wMaxPacketSizeLB);
280 param.stacksize = 0x800;
283 maintain_thread = CreateThread(¶m);
286 StartThread(maintain_thread, cam);
302 printf(
"camera was unplugged\n");
305 for(i=0;i<MAX_CAM_DEVICE;i++)
307 if(Camera[i].device_id == devId)
321 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
323 if(CamHandle[i].cam == cam)
325 CamHandle[i].status = -1;
333 sceUsbdClosePipe(cam->
stream );
362 void rpcMainThread(
void* param)
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);
384 unsigned char *temp_str;
409 d = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
410 temp_str = AllocSysMemory(0, 128, 0);
413 printf(
"cam initialized(%s)\n",temp_str);
414 FreeSysMemory(temp_str);
418 DeleteThread(maintain_thread);
434 WaitSema(ps2cam_sema);
440 printf(
"Usb: Error sending set_configuration\n");
444 WaitSema(ps2cam_sema);
447 SignalSema(ps2cam_sema);
456 static int width,height;
467 setReg8(dev,EYETOY_GPIO_IO_CTRL0, 0xee);
485 setReg8(dev, EYETOY_CREG_PWDN, 0x03);
486 setReg8(dev, EYETOY_CREG_EN_CLK0, 0x9f);
487 setReg8(dev, EYETOY_CREG_EN_CLK1, 0x0f);
494 setReg8(dev, EYETOY_CREG_AUDIO_CLK, 0x02);
495 setReg8(dev, EYETOY_IREG_FRAR, 0x1f);
501 setReg8(dev, EYETOY_CREG_CAMERA_CLK,0x04);
528 setReg8(dev, EYETOY_IREG_H_SIZE, width>>4);
529 setReg8(dev, EYETOY_IREG_V_SIZE, height>>3);
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);
537 camSetDIVIDER(dev, 1, 0, 1, 0);
538 setReg8(dev, EYETOY_IREG_FORMAT, 0x03);
573 printf(
"callback: result= %d, bytes= %d, arg= %p \n", resultCode, bytes, arg);
575 SignalSema(ps2cam_sema);
584 WaitSema(ps2cam_sema);
586 ret = sceUsbdControlTransfer(dev->
controll, USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, 0, (
unsigned short)reg_id, 1, &value,
PS2CamCallback, (
void*)ps2cam_sema);
590 printf(
"sceUsbdControlTransfer failed in 'setReg8'.\n");
595 WaitSema(ps2cam_sema);
598 SignalSema(ps2cam_sema);
610 WaitSema(ps2cam_sema);
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);
616 printf(
"sceUsbdControlTransfer failed in 'getRegValue'.\n");
621 WaitSema(ps2cam_sema);
625 SignalSema(ps2cam_sema);
636 unsigned char current,
final;
638 ret =
getReg8(dev, reg_id, ¤t);
640 if (ret < 0)
return -1;
644 final = current | value;
646 ret =
setReg8(dev, reg_id,
final);
650 int setReg16(
CAMERA_DEVICE *dev,
unsigned char reg_id,
unsigned short value)
654 WaitSema(ps2cam_sema);
656 ret = sceUsbdControlTransfer(dev->
controll,USB_TYPE_VENDOR | USB_RECIP_DEVICE, 1, 0, (
unsigned short)reg_id, 2, &value,
PS2CamCallback, (
void*)ps2cam_sema);
661 printf(
"Usb: setReg16 Error (%d)\n",ret);
664 WaitSema(ps2cam_sema);
667 SignalSema(ps2cam_sema);
676 static char buff[50];
681 WaitSema(ps2cam_sema);
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);
688 printf(
"Usb: Error getting string (%d)\n",ret);
695 WaitSema(ps2cam_sema);
698 for(i=0;(i<(sd->bLength-4)/2 && i<strmax-1);i++)
700 str[i] = sd->wData[i] & 0xFF;
706 SignalSema(ps2cam_sema);
719 WaitSema(ps2cam_sema);
726 printf(
"Usb: PS2CamSelectInterface Error...\n");
730 WaitSema(ps2cam_sema);
733 SignalSema(ps2cam_sema);
745 setReg8(dev,EYETOY_CREG_RESET1, 0x0f);
746 setReg8(dev,EYETOY_CREG_RESET1, 0x00);
752 setReg8(dev, EYETOY_CREG_SNAPSHOT, 23);
758 setReg8(dev, EYETOY_CREG_SNAPSHOT, 23);
825 setReg8Mask(dev, EYETOY_GPIO_DATA_OUT0, 0x01,0x01);
832 setReg8Mask(dev, EYETOY_GPIO_DATA_OUT0, 0x00,0x01);
840 setReg8(dev, EYETOY_CREG_RESET1, 0x00);
847 setReg8(dev, EYETOY_CREG_RESET1, 0x0f);
874 void PS2CamReadDataCallback(
int resultCode,
int bytes,
void *arg)
880 read_rslt = resultCode;
882 SignalSema(ps2cam_sema);
892 WaitSema(ps2cam_sema);
894 ret = sceUsbdIsochronousTransfer(dev->
stream, addr, size, 0, PS2CamReadDataCallback, (
void*)ps2cam_sema);
898 printf(
"Usb: Error sending sceUsbdIsochronousTransfer\n");
899 SignalSema(ps2cam_sema);
904 WaitSema(ps2cam_sema);
907 SignalSema(ps2cam_sema);
942 static unsigned short ver[2];
945 ret = (
int *)&ver[0];
946 ver[0] =DRIVER_VERSON_MAJOR;
947 ver[1] =DRIVER_VERSON_MINOR;
972 if(! irx_initialized)
973 return CAM_ERROR_NOTINIT;
977 for(i=0;i<MAX_CAM_DEVICE;i++)
979 if(Camera[i].status > 0)
998 if(! irx_initialized)
999 return CAM_ERROR_NOTINIT;
1002 for(i=0,index=0;i<MAX_CAM_DEVICE;i++)
1004 if(Camera[i].status > 0)
1006 if(index == device_index)
1017 if((i+1) == (MAX_CAM_DEVICE))
1028 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
1030 if(CamHandle[i].status == 0)
1032 handle = &CamHandle[i];
1038 if((i+1)== MAX_CAM_DEVICE_HANDLE)
1064 if(! irx_initialized)
1065 return CAM_ERROR_NOTINIT;
1068 for(i=0;i<MAX_CAM_DEVICE_HANDLE;i++)
1070 if(CamHandle[i].fd == handle)
1072 CamHandle[i].status=0;
1078 if((i+1)== MAX_CAM_DEVICE_HANDLE)
1096 if(! irx_initialized)
1097 return CAM_ERROR_NOTINIT;
1099 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1102 if(CamHandle[handle-1].status == -1)
1105 dev = CamHandle[handle-1].cam;
1116 static unsigned int size;
1122 if(! irx_initialized)
1123 return CAM_ERROR_NOTINIT;
1125 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1128 if(CamHandle[handle-1].status == -1)
1143 cam = CamHandle[handle-1].cam;
1146 dev = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
1160 strcpy((
char *)&inf.
model[0],
"SLEH-00030\0");
1164 strcpy((
char *)&inf.
model[0],
"SLEH-00031\0");
1168 strcpy((
char *)&inf.
model[0],
"UNKNOWN\0");
1171 memcpy(
info, &inf, size);
1188 if(! irx_initialized)
1189 return CAM_ERROR_NOTINIT;
1191 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1194 if(CamHandle[handle-1].status == -1)
1198 cam = CamHandle[handle-1].cam;
1200 cam->bandwidth = bandwidth;
1205 dev = sceUsbdScanStaticDescriptor(cam->device_id, NULL, USB_DT_DEVICE);
1206 intf = sceUsbdScanStaticDescriptor(cam->device_id, dev, USB_DT_INTERFACE);
1208 for(i=0;i<cam->bandwidth;i++)
1210 intf = sceUsbdScanStaticDescriptor(cam->device_id, intf, USB_DT_INTERFACE);
1217 sceUsbdClosePipe(cam->
stream);
1218 cam->
stream = sceUsbdOpenPipe(cam->device_id, endp);
1220 cam->stream_pocket_size = (endp->wMaxPacketSizeHB * 256 + endp->wMaxPacketSizeLB);
1221 printf(
"bandwidth =%d\n",cam->stream_pocket_size);
1247 setReg8(cam, EYETOY_CREG_RESET1, 0x00);
1263 if(! irx_initialized)
1264 return CAM_ERROR_NOTINIT;
1266 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1269 if(CamHandle[handle-1].status == -1)
1273 cam = CamHandle[handle-1].cam;
1275 if(cam == NULL)
return CAM_ERROR_INVALIDDEVICE;
1281 switch(cam->bandwidth)
1286 case EYETOY_ALTERNATE_SIZE_384:
1287 ret = PS2CamReadData(cam, &campacket[0], 384);
1289 case EYETOY_ALTERNATE_SIZE_512:
1290 ret = PS2CamReadData(cam, &campacket[0], 512);
1292 case EYETOY_ALTERNATE_SIZE_768:
1293 ret = PS2CamReadData(cam, &campacket[0], 768);
1295 case EYETOY_ALTERNATE_SIZE_896:
1296 ret = PS2CamReadData(cam, &campacket[0], 896);
1299 ret = PS2CamReadData(cam, &campacket[0], 384);
1313 if(! irx_initialized)
1314 return CAM_ERROR_NOTINIT;
1316 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1319 if(CamHandle[handle-1].status == -1)
1323 cam = CamHandle[handle-1].cam;
1325 if(cam == NULL)
return CAM_ERROR_INVALIDDEVICE;
1359 if(! irx_initialized)
1360 return CAM_ERROR_NOTINIT;
1362 if(handle > MAX_CAM_DEVICE_HANDLE || handle <= 0 || CamHandle[handle-1].status == 0)
1365 if(CamHandle[handle-1].status == -1)
1369 cam = CamHandle[handle-1].cam;
1371 if(cam == NULL)
return CAM_ERROR_INVALIDDEVICE;
1383 if(cfg->
mask & CAM_CONFIG_MASK_DIMENSION)
1391 if(cfg->
mask & CAM_CONFIG_MASK_OFFSET)
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]);
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]);
1405 if(cfg->
mask & CAM_CONFIG_MASK_DIVIDER)
1414 if(cfg->
mask & CAM_CONFIG_MASK_FRAMERATE)
1454 void *rpcCommandHandler(u32 command,
void *buffer,
int size)
1456 int* buf = (
int*) buffer;
1476 case PS2CAM_RPC_OPENDEVICE:
1480 case PS2CAM_RPC_CLOSEDEVICE:
1500 buf[1] = (int )&campacket[0];
1508 case PS2CAM_RPC_SETDEVCONFIG: