int usb_connect(int devId) { UsbDeviceDescriptor *dev; UsbConfigDescriptor *conf; dev = UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); conf = UsbGetDeviceStaticDescriptor(devId, dev, USB_DT_CONFIG); controlEndp = UsbOpenEndpoint(devId, NULL); int slot = 0; if (ds3_list[0].connected) slot = 1; ds3_list[slot].endp = controlEndp; ds3_list[slot].connected = 1; ds3_list[slot].devID = devId; UsbSetDevicePrivateData(devId, NULL); UsbSetDeviceConfiguration(controlEndp, conf->bConfigurationValue, config_set, (void*)slot); return 0; }
/** this is executed when a compatible camera is detected */ int PS2CamConnect(int devId) { int i; UsbDeviceDescriptor *dev; UsbInterfaceDescriptor *intf0,*intf1; UsbEndpointDescriptor *endp1; CAMERA_DEVICE *cam = NULL; iop_thread_t param; printf("camera was connected\n"); dev = UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); intf0 = UsbGetDeviceStaticDescriptor(devId, dev, USB_DT_INTERFACE); intf1 = UsbGetDeviceStaticDescriptor(devId, intf0, USB_DT_INTERFACE); endp1= (UsbEndpointDescriptor *) ((char *) intf1 + intf1->bLength); //get a free device slot for(i=0;i<MAX_CAM_DEVICE;i++) { if(Camera[i].status == 0) { cam = (CAMERA_DEVICE *)&Camera[i]; cam->status = CAM_STATUS_CONNECTED; break; } } cam->device_id = devId; cam->controll = UsbOpenEndpoint(devId, NULL); cam->stream = UsbOpenEndpoint(devId, endp1); cam->stream_pocket_size = (endp1->wMaxPacketSizeHB * 256 + endp1->wMaxPacketSizeLB); /*create thread that will execute funtions that cant be called*/ /*in this funtion*/ param.attr = TH_C; param.thread = (void *)PS2CamInitializeNewDevice; param.priority = 40; param.stacksize = 0x800; param.option = 0; maintain_thread = CreateThread(¶m); StartThread(maintain_thread, cam); return 0; }
int ps2kbd_connect(int devId) { /* Assume we can only get here if we have already checked the device is kosher */ UsbDeviceDescriptor *dev; UsbConfigDescriptor *conf; UsbInterfaceDescriptor *intf; UsbEndpointDescriptor *endp; kbd_dev *currDev; int devLoop; //printf("PS2Kbd_connect devId %d\n", devId); dev = UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); /* Get device descriptor */ if(!dev) { printf("ERROR: Couldn't get device descriptor\n"); return 1; } conf = UsbGetDeviceStaticDescriptor(devId, dev, USB_DT_CONFIG); if(!conf) { printf("ERROR: Couldn't get configuration descriptor\n"); return 1; } intf = (UsbInterfaceDescriptor *) ((char *) conf + conf->bLength); /* Get first interface */ endp = (UsbEndpointDescriptor *) ((char *) intf + intf->bLength); endp = (UsbEndpointDescriptor *) ((char *) endp + endp->bLength); /* Go to the data endpoint */ for(devLoop = 0; devLoop < PS2KBD_MAXDEV; devLoop++) { if(devices[devLoop] == NULL) { break; } } if(devLoop == PS2KBD_MAXDEV) { /* How the f*** did we end up here ??? */ printf("ERROR: Device Weirdness!!\n"); return 1; } currDev = (kbd_dev *) AllocSysMemory(0, sizeof(kbd_dev), NULL); if(!currDev) { printf("ERROR: Couldn't allocate a device point for the kbd\n"); return 1; } devices[devLoop] = currDev; memset(currDev, 0, sizeof(kbd_dev)); currDev->configEndp = UsbOpenEndpoint(devId, NULL); currDev->dataEndp = UsbOpenEndpoint(devId, endp); currDev->packetSize = endp->wMaxPacketSizeLB | ((int) endp->wMaxPacketSizeHB << 8); currDev->eventmask = (1 << devLoop); if(currDev->packetSize > sizeof(kbd_data_recv)) { currDev->packetSize = sizeof(kbd_data_recv); } if(dev->iManufacturer != 0) { usb_getstring(currDev->configEndp, dev->iManufacturer, "Keyboard Manufacturer"); } if(dev->iProduct != 0) { usb_getstring(currDev->configEndp, dev->iProduct, "Keyboard Product"); } currDev->devId = devId; currDev->interfaceNo = intf->bInterfaceNumber; currDev->ledStatus = 0; UsbSetDevicePrivateData(devId, currDev); /* Set the index for the device data */ //printf("Configuration value %d\n", conf->bConfigurationValue); UsbSetDeviceConfiguration(currDev->configEndp, conf->bConfigurationValue, ps2kbd_config_set, currDev); dev_count++; /* Increment device count */ printf("PS2KBD: Connected device\n"); return 0; }
int mass_stor_connect(int devId) { int i; int epCount; UsbDeviceDescriptor *device; UsbConfigDescriptor *config; UsbInterfaceDescriptor *interface; UsbEndpointDescriptor *endpoint; iop_sema_t SemaData; mass_dev* dev; printf("USBHDFSD: connect: devId=%i\n", devId); dev = mass_stor_findDevice(devId, 1); if (dev == NULL) { printf("USBHDFSD: Error - unable to allocate space!\n"); return 1; } /* only one mass device allowed */ if (dev->devId != -1) { printf("USBHDFSD: Error - only one mass storage device allowed !\n"); return 1; } dev->status = 0; dev->sectorSize = 0; dev->bulkEpI = -1; dev->bulkEpO = -1; /* open the config endpoint */ dev->controlEp = UsbOpenEndpoint(devId, NULL); device = (UsbDeviceDescriptor*)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); config = (UsbConfigDescriptor*)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); interface = (UsbInterfaceDescriptor *) ((char *) config + config->bLength); /* Get first interface */ // store interface numbers dev->interfaceNumber = interface->bInterfaceNumber; dev->interfaceAlt = interface->bAlternateSetting; epCount = interface->bNumEndpoints; endpoint = (UsbEndpointDescriptor*)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); usb_bulk_probeEndpoint(devId, dev, endpoint); for (i = 1; i < epCount; i++) { endpoint = (UsbEndpointDescriptor*) ((char *) endpoint + endpoint->bLength); usb_bulk_probeEndpoint(devId, dev, endpoint); } // Bail out if we do NOT have enough bulk endpoints. if (dev->bulkEpI < 0 || dev->bulkEpO < 0) { mass_stor_release(dev); printf("USBHDFSD: Error - connect failed: not enough bulk endpoints! \n"); return -1; } SemaData.initial = 0; SemaData.max = 1; SemaData.option = 0; SemaData.attr = 0; if((dev->ioSema = CreateSema(&SemaData)) <0){ printf("USBHDFSD: Failed to allocate I/O semaphore.\n"); return -1; } /*store current configuration id - can't call set_configuration here */ dev->devId = devId; dev->configId = config->bConfigurationValue; dev->status = USBMASS_DEV_STAT_CONN; XPRINTF("USBHDFSD: connect ok: epI=%i, epO=%i \n", dev->bulkEpI, dev->bulkEpO); if(dev->callback != NULL) dev->callback(USBMASS_DEV_EV_CONN); return 0; }
int mass_stor_connect(int devId) { int i; int epCount; UsbDeviceDescriptor *device; UsbConfigDescriptor *config; UsbInterfaceDescriptor *interface; UsbEndpointDescriptor *endpoint; mass_dev* dev; //wait_for_connect = 0; printf("USBHDFSD: connect: devId=%i\n", devId); dev = mass_stor_findDevice(devId, 1); if (dev == NULL) { printf("USBHDFSD: Error - unable to allocate space!\n"); return 1; } /* only one mass device allowed */ if (dev->devId != -1) { printf("USBHDFSD: Error - only one mass storage device allowed !\n"); return 1; } dev->status = 0; dev->sectorSize = 0; dev->bulkEpI = -1; dev->bulkEpO = -1; /* open the config endpoint */ dev->controlEp = UsbOpenEndpoint(devId, NULL); device = (UsbDeviceDescriptor*)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); config = (UsbConfigDescriptor*)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); interface = (UsbInterfaceDescriptor *) ((char *) config + config->bLength); /* Get first interface */ // store interface numbers dev->interfaceNumber = interface->bInterfaceNumber; dev->interfaceAlt = interface->bAlternateSetting; epCount = interface->bNumEndpoints; endpoint = (UsbEndpointDescriptor*) UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_ENDPOINT); usb_bulk_probeEndpoint(devId, dev, endpoint); for (i = 1; i < epCount; i++) { endpoint = (UsbEndpointDescriptor*) ((char *) endpoint + endpoint->bLength); usb_bulk_probeEndpoint(devId, dev, endpoint); } /* we do NOT have enough bulk endpoints */ if (dev->bulkEpI < 0 /* || dev->bulkEpO < 0 */ ) { /* the bulkOut is not needed now */ if (dev->bulkEpI >= 0) { UsbCloseEndpoint(dev->bulkEpI); } if (dev->bulkEpO >= 0) { UsbCloseEndpoint(dev->bulkEpO); } printf("USBHDFSD: Error - connect failed: not enough bulk endpoints! \n"); return -1; } /*store current configuration id - can't call set_configuration here */ dev->devId = devId; dev->configId = config->bConfigurationValue; dev->status = DEVICE_DETECTED; XPRINTF("USBHDFSD: connect ok: epI=%i, epO=%i \n", dev->bulkEpI, dev->bulkEpO); return 0; }