Main Site Documentation

Cannot open pipe to raw device HID interface


#1

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


#2

Maybe you skipped some previous audio interface?
Print the descriptors/interfaces and post them here. See this:
http://code.tinyclr.com/project/164/usb-discovery-helper/

Also, print hidEndpoint to make sure you have the correct one.


#3

Mike,

Thanks for the suggestion, the class is coming in handy. Making progress, but I’m definitely going to have to write down what I’m learning here so I don’t forget it.

Joe