// pipes are one based, since zero is the default control pipe
for (i=1; i <= numPipes; i++)
{
err = (*intf)->GetPipeProperties(intf, i, &direction, &number, &transferType, &maxPacketSize, &interval);
if (err)
{
printf("dealWithPipes: unable to get pipe properties for pipe %d, err = %08x\n", i, err);
return;
}
if (transferType != kUSBBulk)
{
printf("dealWithPipes: skipping pipe %d because it is not a bulk pipe\n", i);
continue;
}
if ((direction == kUSBIn) && !inPipeRef)
{
printf("dealWithPipes: grabbing BULK IN pipe index %d, number %d\n",i, number);
inPipeRef = i;
}
if ((direction == kUSBOut) && !outPipeRef)
{
printf("dealWithPipes: grabbing BULK OUT pipe index %d, number %d\n", i, number);
outPipeRef = i;
}
}
// if (inPipeRef && outPipeRef)
// transferData(intf, inPipeRef, outPipeRef);
}
err = IOCreatePlugInInterfaceForService(usbInterfaceRef, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score);
err = IOObjectRelease(usbInterfaceRef);
if (err || !iodev)
{
printf("dealWithInterface: unable to create plugin. ret = %08x, iodev = %p\n", err, iodev);
return;
}
err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), (LPVOID)&intf);
err = IODestroyPlugInInterface(iodev); // done with this
//err = (*iodev)->Release(iodev);
if (err || !intf)
{
printf("dealWithInterface: unable to create a device interface. ret = %08x, intf = %p\n", err, intf);
return;
}
//doLockUnlockMedia(1);
/*err = (*intf)->USBInterfaceClose(intf);
if (err)
{
printf("dealWithInterface: unable to close interface. ret = %08x\n", err);
return;
}
*/
err = (*intf)->GetInterfaceClass(intf, &interfaceClass);
err = (*intf)->GetInterfaceSubClass(intf, &interfaceSubClass);
err = (*intf)->USBInterfaceOpen(intf); //就是在这里出错的。
if (err != kIOReturnSuccess)
{
printf("dealWithInterface: unable to open interface. ret = %08x\n", err);
(void)(*intf)->Release(intf);
return;
}
err = (*intf)->GetNumEndpoints(intf, &numPipes);
if (err)
{
printf("dealWithInterface: unable to get number of endpoints. ret = %08x\n", err);
(*intf)->USBInterfaceClose(intf);
(*intf)->Release(intf);
return;
}
printf("dealWithInterface: found %d pipes\n", numPipes);
if (numPipes == 0)
{
// try alternate setting 1
err = (*intf)->SetAlternateInterface(intf, 1);
if (err)
{
printf("dealWithInterface: unable to set alternate interface 1. ret = %08x\n", err);
(*intf)->USBInterfaceClose(intf);
(*intf)->Release(intf);
return;
}
err = (*intf)->GetNumEndpoints(intf, &numPipes);
if (err)
{
printf("dealWithInterface: unable to get number of endpoints - alt setting 1. ret = %08x\n", err);
(*intf)->USBInterfaceClose(intf);
(*intf)->Release(intf);
return;
}
numPipes = 13; // workaround. GetNumEndpoints does not work after SetAlternateInterface
}
if (numPipes)
dealWithPipes(intf, numPipes);
err = (*intf)->USBInterfaceClose(intf);
if (err)
{
printf("dealWithInterface: unable to close interface. ret = %08x\n", err);
return;
}
err = (*intf)->Release(intf);
if (err)
{
printf("dealWithInterface: unable to release interface. ret = %08x\n", err);
return;
}
}
err = IOCreatePlugInInterfaceForService(usbDeviceRef, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score);
if (err || !iodev)
{
printf("dealWithDevice: unable to create plugin. ret = %08x, iodev = %p\n", err, iodev);
return;
}
err = (*iodev)->QueryInterface(iodev, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID), (LPVOID)&dev);
IODestroyPlugInInterface(iodev); // done with this
if (err || !dev)
{
printf("dealWithDevice: unable to create a device interface. ret = %08x, dev = %p\n", err, dev);
return;
}
err = (*dev)->ResetDevice(dev);//(*iodev)->
err = (*dev)->USBDeviceOpen(dev);
if (err)
{
printf("dealWithDevice: unable to open device. ret = %08x\n", err);
return;
}
if (err)
{
printf("dealWithDevice: unable to reset device. ret = %08x\n", err);
//return;
}
err = (*dev)->GetNumberOfConfigurations(dev, &numConf);
if (err || !numConf)
{
printf("dealWithDevice: unable to obtain the number of configurations. ret = %08x\n", err);
(*dev)->USBDeviceClose(dev);
(*dev)->Release(dev);
return;
}
printf("dealWithDevice: found %d configurations\n", numConf);
err = (*dev)->GetConfigurationDescriptorPtr(dev, 0, &confDesc); // get the first config desc (index 0)
if (err)
{
printf("dealWithDevice:unable to get config descriptor for index 0\n");
(*dev)->USBDeviceClose(dev);
(*dev)->Release(dev);
return;
}/*
err = (*dev)->SetConfiguration(dev, confDesc->bConfigurationValue);
if (err)
{
printf("dealWithDevice: unable to set the configuration\n");
(*dev)->USBDeviceClose(dev);
(*dev)->Release(dev);
return;
}*/
err = (*dev)->CreateInterfaceIterator(dev, &interfaceRequest, &iterator);
if (err)
{
printf("dealWithDevice: unable to create interface iterator\n");
(*dev)->USBDeviceClose(dev);
(*dev)->Release(dev);
return;
}
while ( (usbInterfaceRef = IOIteratorNext(iterator)) )
{
printf("found interface: %p\n", (void*)usbInterfaceRef);
dealWithInterface(usbInterfaceRef);
//IOObjectRelease(usbInterfaceRef); // no longer need this reference
}
err = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
matchingDictionary = 0; // this was consumed by the above call
while ( (usbDeviceRef = IOIteratorNext(iterator)) )
{
printf("Found device %p\n", (void*)usbDeviceRef);
dealWithDevice(usbDeviceRef);
IOObjectRelease(usbDeviceRef); // no longer need this reference
}