I am attempting to access a PCM2904 audio codec using the USB host on a Fez Domino. The chip presents a single configuration with 4 interfaces (control, streaming audio in, streaming audio out, HID). A portion of the constructor I’ve written is shown below.
public PCM2904(USBH_Device device)
{
// Cast the device.
rawDevice = new USBH_RawDevice(device);
// Get the configuration descriptor. There is only one so set
// the configuration to the configuration value given in the
// descriptor.
USBH_Descriptors.Configuration configDescriptor =
rawDevice.GetConfigurationDescriptors(0);
rawDevice.SendSetupTransfer(
0x00, 0x09, configDescriptor.bConfigurationValue, 0x00);
// Locate each of the interfaces.
for (int i = 0; i < configDescriptor.interfaces.Length; i++)
{
// Check each of the interfaces in the list.
USBH_Descriptors.Interface descInterface =
configDescriptor.interfaces[i];
if (descInterface.bInterfaceNumber == 0)
{
// Control interface.
if (descInterface.bAlternateSetting == 0)
controlInterfaceIndex = i;
}
else if (descInterface.bInterfaceNumber == 1)
{
// Audio streaming data out interface.
if (descInterface.bAlternateSetting == 0)
streamingOutInterfaceIndex = i;
}
else if (descInterface.bInterfaceNumber == 2)
{
// Audio streaming data in interface.
if (descInterface.bAlternateSetting == 0)
streamingInInterfaceIndex = i;
}
else if (descInterface.bInterfaceNumber == 3)
{
// HID interface.
if (descInterface.bAlternateSetting == 0)
{
// There is only the one interface with a single endpoint so configure it.
hidInterfaceIndex = i;
// Set up the endpoint and pipe.
hidEndpoint = descInterface.endpoints[0];
hidPipe = rawDevice.OpenPipe(hidEndpoint);
hidPipe.TransferTimeout = 0;
// Set up a thread to read the data.
hidThread = new Thread(HidThread);
hidThread.Priority = ThreadPriority.Highest;
hidThread.Start();
}
}
}
}
To begin with I am attempting to only access the HID (interface #3) and read the state of button presses. The code is based upon the USBH_RawDevice example. However, when I attempt to open a pipe using the HID endpoint I get an exception:
rawDevice.OpenPipe(hidEndpoint)
#### Exception System.ArgumentException - 0xfd000000 (4) ####
#### Message:
#### GHIElectronics.NETMF.USBHost.USBH_RawDevice+Pipe::Pipe_Helper [IP: 0000] ####
#### GHIElectronics.NETMF.USBHost.USBH_RawDevice+Pipe::.ctor [IP: 001f] ####
#### GHIElectronics.NETMF.USBHost.USBH_RawDevice::OpenPipe [IP: 0009] ####
I suspect I am not initializing the device correctly but cannot seem to find examples of USB host dealing with multiple interfaces. If anyone can point me to an example or suggest what I may be doing incorrectly above I would appreciate it.
Thanks,
Joseph