int mass_stor_disconnect(int devId) { mass_dev* dev; dev = mass_stor_findDevice(devId, 0); printf("USBHDFSD: disconnect: devId=%i\n", devId); if (dev == NULL) { printf("USBHDFSD: Error - disconnect: no device storage!\n"); return 0; } if (dev->status & USBMASS_DEV_STAT_CONN) { mass_stor_release(dev); part_disconnect(dev); scache_kill(dev->cache); dev->cache = NULL; dev->devId = -1; DeleteSema(dev->ioSema); if(dev->callback != NULL) dev->callback(USBMASS_DEV_EV_DISCONN); } return 0; }
int mass_stor_probe(int devId) { UsbDeviceDescriptor *device = NULL; UsbConfigDescriptor *config = NULL; UsbInterfaceDescriptor *intf = NULL; XPRINTF("USBHDFSD: probe: devId=%i\n", devId); mass_dev* mass_device = mass_stor_findDevice(devId, 0); /* only one device supported */ if ((mass_device != NULL) && (mass_device->status & USBMASS_DEV_STAT_CONN)) { printf("USBHDFSD: Error - only one mass storage device allowed ! \n"); return 0; } /* get device descriptor */ device = (UsbDeviceDescriptor*)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE); if (device == NULL) { XPRINTF("USBHDFSD: Error - Couldn't get device descriptor\n"); return 0; } /* Check if the device has at least one configuration */ if (device->bNumConfigurations < 1) { return 0; } /* read configuration */ config = (UsbConfigDescriptor*)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG); if (config == NULL) { XPRINTF("USBHDFSD: Error - Couldn't get configuration descriptor\n"); return 0; } /* check that at least one interface exists */ XPRINTF("USBHDFSD: bNumInterfaces %d\n", config->bNumInterfaces); if ((config->bNumInterfaces < 1) || (config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) { XPRINTF("USBHDFSD: Error - No interfaces available\n"); return 0; } /* get interface */ intf = (UsbInterfaceDescriptor *) ((char *) config + config->bLength); /* Get first interface */ XPRINTF("USBHDFSD: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n", intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol); if ((intf->bInterfaceClass != USB_CLASS_MASS_STORAGE) || (intf->bInterfaceSubClass != USB_SUBCLASS_MASS_SCSI && intf->bInterfaceSubClass != USB_SUBCLASS_MASS_SFF_8070I) || (intf->bInterfaceProtocol != USB_PROTOCOL_MASS_BULK_ONLY) || (intf->bNumEndpoints < 2)) { //one bulk endpoint is not enough because return 0; //we send the CBW to te bulk out endpoint } return 1; }
int mass_stor_disconnect(int devId) { mass_dev* dev; dev = mass_stor_findDevice(devId, 0); printf("USBHDFSD: disconnect: devId=%i\n", devId); if (dev == NULL) { printf("USBHDFSD: Error - disconnect: no device storage!\n"); return 0; } if ((dev->status & DEVICE_DETECTED) && devId == dev->devId) { mass_stor_release(dev); part_disconnect(dev); scache_kill(dev->cache); dev->cache = NULL; dev->devId = -1; } 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; }