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; }