This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Reliable speed arbitration C6748 of a USB2.0 OTG peripheral

Hello,

I have been developing firmware for the C6748 which operates the USB 2.0 (OTG) in peripheral mode. We require the C6748 to register as a high speed device with an embedded Linux host. The current state of affairs is that about 70% of the time enumeration (and further operations) in high speed mode happen without any problems. The remaining 30% of the time, however, the C6748 registers as a full speed device.

I would be very keen in any advice anyone could offer in resolving the issue. I'll post some code below. The remainder of this post just just some questions I have encountered in trying to solve the problem and may not be related to the actual cause!

  • One possible avenue of investigation for me is the mention of extraneous reset interrupts in the C6748's sillicon errata (see advisory 2.1.3 of sprz303d). By adding various logs throughout our driver I've observed that I indeed get quite a few reset interrupts. Remarkably, upon receiving any of these interrupts, POWER[RESET] is actually low (see 4.22 of sprufm9h), indicating reset signalling is no longer present. I was under the impression that reset signalling was in the order of tens of milliseconds, so I am a little surprised at this result. Any clues as to what is going on would be appreciated.
  • Is it possible other code could interfere with the enumeration. That is, what happens if some other code disables interrupts, or if some other interrupt preempts the USB0 interrupt. I tried to eliminate these causes in our firmware.
  • The documentation mentions a high-speed device should first register as a full speed device. When I set HSEN to 1, the first time the device is reset, it registers as a high-speed device. Is this the correct course of action?
  • The documentation isn't very clear what should happen when I receive a "RESET_BABBLE" interrupt; is there a problem in this part of the code?
    Not in regards to the problem above, could compiler optimisation cause the code below the malfunction? The problem above occurs without optimisations, but if optimisations could cause a problem in the future I'd like to be aware of it.
  • Could the problem be related to the memory/cache configuration? Currently this code is located in external memory and is cached. I noticed that sometimes I get an endpoint 0 interrupt in IDLE mode where neither SETUPEND,  SENTSTALL, RXPKTRDY or TYPKTRDY is true (this should not happen according to 2.7.1.1.5 of sprufm9h). Yet if I put a breakpoint there and look at the register values, it seems RXPKTRDY *is* set.

Any help is appreciated!

Kind regards,

Mark


    namespace Model
    {
    UsbPeripheralCommsDriver::UsbPeripheralCommsDriver(const std::string& firmwareVersion, PTR(IFaultReporter) faultReporterPtr)
    :
    Task(USB_PERIPHERAL_COMMS_DRIVER_TASK_NAME),
    ISender(),
    m_state(eDEFAULT),
    m_operatingSpeed(eHIGH_SPEED),
    m_endpoint0State(eIDLE),
    m_endpoint1InState(eNORMAL),
    m_endpoint1OutState(eNORMAL),
    m_lastReceived_bRequest(0u),
    m_lastReceived_bmRequestType(0u),
    m_lastReceived_wValue(0u),
    m_lastReceived_wIndex(0u),
    m_lastReceived_wLength(0u),
    m_lastReceived_bmRequestType_transferDirection(0u),
    m_lastReceived_bmRequestType_type(0u),
    m_lastReceived_bmRequestType_recipient(0u),
    m_isFirstReset(true),
    m_nextInterruptIsStatusStage(false),
    m_resetSignallingPresent(false),
    m_mustSendShortPacket(false),
    m_bytesToSendPtr(0),
    m_bytesLeftToSend(0),
    m_bytesLeftToReceive(0),
    m_currentDeviceConfiguration(0u),
    m_currentAlternateSettingIndexForMessageExchangeInterface(MESSAGE_EXCHANGE_ALTERNATE_SETTING_INDEX),
    m_endpoint1OutDataBuffer(0u),
    m_receiveMailboxDataBuffer(0u),
    m_endpoint1InDataBuffer(0u),
    m_transmitMailboxDataBuffer(0u),
    m_endpoint0DataBuffer(0u),
    m_receiveMailboxHandle(0),
    m_transmitMailboxHandle(0),
    m_transmitMutex(),
    m_receiverPtr(0),
    m_messageSplitterPtr(0),
    m_faultReporterPtr(GET_RAW_PTR(faultReporterPtr))
    {
        m_receiveMailboxHandle  = MBX_create(RECEIVE_MAILBOX_BUFFER_SIZE,
                                             RECEIVE_MAILBOX_NUM_BUFFERS,
                                             &MBX_ATTRS);
        m_transmitMailboxHandle = MBX_create(TRANSMIT_MAILBOX_BUFFER_SIZE,
                                             TRANSMIT_MAILBOX_NUM_BUFFERS,
                                             &MBX_ATTRS);
                                                
        m_endpoint1OutDataBuffer    = new uint8_t[ENDPOINT_1_OUT_DATA_BUFFER_SIZE];
        m_receiveMailboxDataBuffer  = new uint8_t[ENDPOINT_1_OUT_DATA_BUFFER_SIZE];
        m_endpoint1InDataBuffer     = new uint8_t[ENDPOINT_1_IN_DATA_BUFFER_SIZE];
        m_transmitMailboxDataBuffer = new uint8_t[ENDPOINT_1_IN_DATA_BUFFER_SIZE];
        m_endpoint0DataBuffer       = new uint8_t[ENDPOINT_0_DATA_BUFFER_SIZE];   
       
        initialiseHardware();
        initialiseUSB();
        initialiseEndpoints();
       
        unsigned char * productStringPtr = PRODUCT_STRING_DESCRIPTOR + PRODUCT_STRING_VERSION_OFFSET;
        unsigned char * closingBracketPositionInProductStringPtr = productStringPtr;
           
        for (size_t c = 0; c < PRODUCT_STRING_VERSION_EXPECTED_LENGTH; ++c)
        {
            const char CHARACTER = (c < firmwareVersion.length())
                ? firmwareVersion[c]
                : ' ';
                  
            *productStringPtr = CHARACTER;
            productStringPtr += sizeof(uint16_t);
           
            if (CHARACTER != ' ')
            {
                closingBracketPositionInProductStringPtr = productStringPtr;
            }
            // else do nothing.
        }
       
        *(closingBracketPositionInProductStringPtr) = ')';
    }
   
    UsbPeripheralCommsDriver::~UsbPeripheralCommsDriver()
    {
        MBX_delete(m_receiveMailboxHandle);
        MBX_delete(m_transmitMailboxHandle);
       
        delete[] (m_endpoint1OutDataBuffer);
        delete[] (m_receiveMailboxDataBuffer);
        delete[] (m_endpoint1InDataBuffer);
        delete[] (m_transmitMailboxDataBuffer);
        delete[] (m_endpoint0DataBuffer);
    }
   
    void UsbPeripheralCommsDriver::serviceInterrupt()
    {
        const Uint32 interruptSourceRegister = USB0_REGS_PTR->INTMASKEDR;
       
        // Clear interrupt.
        USB0_REGS_PTR->INTCLRR = interruptSourceRegister;
   
        //if (interruptSourceRegister != 2u)
        //{
        //    LOG_printf(&usbOtgLog, "BEG ISR USB0 0x%x", interruptSourceRegister);
        //}
   
        if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_RESET_BABBLE))
        {
            /**
             * NOTE: Due to bugs in the C6748 we may receive many reset interrupts during
             * reset signalling and we must assert all of them. See advisory 2.1.4 in the
             * sillicon errata.
             */
   
            if (m_resetSignallingPresent)
            {
                LOG_printf(&usbOtgLog, "WARNING: Extraneous RESET interrupt received.");
            }
            else
            {
                LOG_printf(&usbOtgLog, "Start of RESET signalling detected.");
               
               
                for (size_t i = 0; i < 100; i++)
                {
                    if (CSL_FEXT(USB0_REGS_PTR->POWER, USB_OTG_POWER_RESET))
                    {
                        LOG_printf(&usbOtgLog, "RESSIG: 1" );
                    }
                    else
                    {
                        LOG_printf(&usbOtgLog, "RESSIG: 0" );
                        break;
                    }
                }
               
               
                m_resetSignallingPresent = true;
            }
        }
        // else do nothing.
   
        if (!m_resetSignallingPresent)
        {
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_RESUME))
            {
                serviceResumeInterrupt();
            }
            //else do nothing
   
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_EP0))
            {
                serviceEndpoint0Interrupt();
            }    
            //else do nothing
           
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_EP1RX))
            {
                serviceEndpoint1OutInterrupt();
            }
            //else do nothing
           
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_EP1TX))
            {
                serviceEndpoint1InInterrupt();
            }
            //else do nothing
           
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_SOF))
            {
                serviceResumeInterrupt();
            }
            //else do nothing
           
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_DISCONNECT))
            {
                serviceDisconnectInterrupt();
            }
            //else do nothing
           
            if (CSL_FEXT(interruptSourceRegister, USB_OTG_INTSRCR_SUSPEND))
            {
                serviceSuspendInterrupt();
            }
            //else do nothing
        }
        else
        {
            if (interruptSourceRegister != CSL_USB_OTG_INTSRCR_RESET_BABBLE_MASK)
            {
                LOG_printf(&usbOtgLog, "WARNING: Ignoring interrupt due to presence of RESET signalling (0x%x).", interruptSourceRegister);
            }   
            // else do nothing.
        }
       
   
        // Unassert interrupt.
        USB0_REGS_PTR->EOIR    = 0x00;
       
        //if (interruptSourceRegister != 2u)
        //{
        //    LOG_printf(&usbOtgLog, "END ISR USB0 0x%x", interruptSourceRegister);
        //}    
    }
   
    void UsbPeripheralCommsDriver::setup(PTR(IReceiver) receiverPtr, PTR(IMessageSplitter) messageSplitterPtr)
    {
        m_receiverPtr = receiverPtr;
        m_messageSplitterPtr = GET_RAW_PTR(messageSplitterPtr);;
    }
   
    void UsbPeripheralCommsDriver::serviceResetInterrupt()
    {
        m_state = eDEFAULT;
       
        m_endpoint0State = eIDLE;
        m_endpoint1InState = eNORMAL;
        m_endpoint1OutState = eNORMAL;
        m_nextInterruptIsStatusStage = false;
       
        extractOperatingSpeed();
       
        /**
         * There are posts on the TI forum that suggest the following statements
         * should be there. Also the user guide suggests that many registers are cleared
         * during reset [see Sect. 2.7.1].
         */
        initialiseUSB();
        initialiseEndpoints();
       
    #ifdef ENABLE_ADDITIONAL_LOGGING
        LOG_printf(&usbOtgLog, "Handled RESET interrupt.");
       
    #ifdef ENABLE_ADDITIONAL_LOGGING
        if (m_operatingSpeed == eHIGH_SPEED)
        {
            LOG_printf(&usbOtgLog, "Peripheral operating at HIGH speed.");
        }
        else
        {
            LOG_printf(&usbOtgLog, "WARNING: Peripheral operating at FULL speed (reliable operation requires HIGH speed).");
        }
    #endif
       
    #endif
    }
   
    void UsbPeripheralCommsDriver::serviceResumeInterrupt()
    {
       // Do nothing (logging will yield many entries).
    }
   
    void UsbPeripheralCommsDriver::serviceSuspendInterrupt()
    {
    #ifdef ENABLE_ADDITIONAL_LOGGING
        // Just log it.
        LOG_printf(&usbOtgLog, "Handled SUSPEND interrupt.");    
    #endif
    }
   
    void UsbPeripheralCommsDriver::serviceDisconnectInterrupt()
    {
    #ifdef ENABLE_ADDITIONAL_LOGGING
        // Just log it.
        LOG_printf(&usbOtgLog, "Handled DISCONNECT interrupt.");   
    #endif
    }
   
   
    void UsbPeripheralCommsDriver::serviceEndpoint0Interrupt()
    {
        USB0_REGS_PTR->INDEX = 0u;
       
        const bool CONTROL_TRANSFER_STALLED           = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SENTSTALL);
        const bool CONTROL_TRANSFER_ENDED_PREMATURELY = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SETUPEND);
        const bool RXPKTRDY                           = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_RXPKTRDY);
        const bool TXPKTRDY                           = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_TXPKTRDY);
               
        if (CONTROL_TRANSFER_STALLED)
        {
            // Clear the stall bit.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SENTSTALL, 0);
           
            // Set the state of Ep0 to IDLE
            m_endpoint0State = eIDLE;
           
            // Current transfer is aborted.
            m_nextInterruptIsStatusStage = false;
           
    #ifdef ENABLE_ADDITIONAL_LOGGING
            // Log the event.
            LOG_printf(&usbOtgLog, "Control transfer ended due to STALL condition.");
    #endif
        }
        // else do nothing
           
        if (CONTROL_TRANSFER_ENDED_PREMATURELY)
        {          
            // Clear the setupend bit.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_SETUPEND, 1);
           
            // Set the state of Ep0 to IDLE
            m_endpoint0State = eIDLE;
                   
            // Current transfer is aborted.
            m_nextInterruptIsStatusStage = false;
           
    #ifdef ENABLE_ADDITIONAL_LOGGING
            // Log this event.      
            LOG_printf(&usbOtgLog, "Control transfer ended prematurely.");
    #endif
        }
        // else do nothing
       
        if (m_nextInterruptIsStatusStage)
        {
    #ifdef LOG_EP0_INTERRUPT_STAGE
            LOG_printf(&usbOtgLog, "Handling EP0 interrupt in STATUS mode.");
    #endif       
            serviceEndpoint0InterruptStatusStage();
           
            // Current transfer is complete now.
            m_nextInterruptIsStatusStage = false;
        }
        else
        {       
            if (m_endpoint0State == eIDLE)
            { 
    #ifdef LOG_EP0_INTERRUPT_STAGE           
                LOG_printf(&usbOtgLog, "Handling EP0 interrupt in IDLE mode RXPKTRDY=%d, TXPKTRDY=%d.", RXPKTRDY, TXPKTRDY);
    #endif             
                serviceEndpoint0InterruptIdleMode();
            }
            // else do nothing
           
            if (m_endpoint0State == eRX)
            {
    #ifdef LOG_EP0_INTERRUPT_STAGE           
                LOG_printf(&usbOtgLog, "Handling EP0 interrupt in RX mode.");
    #endif           
                serviceEndpoint0InterruptRxMode();
            }
            // else do nothing
           
            if (m_endpoint0State == eTX)
            {
    #ifdef LOG_EP0_INTERRUPT_STAGE           
                LOG_printf(&usbOtgLog, "Handling EP0 interrupt in TX mode.");
    #endif           
                serviceEndpoint0InterruptTxMode();
            }
            // else do nothing
        }
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint0InterruptIdleMode()
    {
        const bool RECEIVED_PACKET = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_RXPKTRDY);
       
        if (RECEIVED_PACKET)
        {
            /**
             * NOTE: The ONLY valid reason for an interrupt to be generated in IDLE mode
             * is after the SETUP stage of a control transfer has been completed.
             */
                          
            const uint16_t DATA_PACKET_SIZE = USB0_REGS_PTR->COUNT.COUNT0;
            bool commandRecognised = false;
           
            if (DATA_PACKET_SIZE == DATA_PACKET_SIZE_FOR_SETUP_PACKET)
            {
                // Unload FIFO
                readEndpoint0FIFO(DATA_PACKET_SIZE, m_endpoint0DataBuffer);
               
                // Extract transfer setup information from data.
                serviceEndpoint0InterruptExtractSetupData();
               
                if (m_lastReceived_bmRequestType_type == REQUEST_TYPE_TRANSFER_TYPE_STANDARD)
                {
                    if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                        (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                        (m_lastReceived_bRequest                        == REQUEST_GET_DESCRIPTOR                        ))
                    {
                        /* GET_DESCRIPTOR */
                       
                        /**
                         * NOTE: The USB specification allows for a mismatch between
                         * wLength and the descriptor size.
                         */
       
                        const uint8_t REQUESTED_DESCRIPTOR_TYPE  = static_cast<uint8_t>((m_lastReceived_wValue >> BITS_IN_BYTE) & UINT16_MASK_BYTE_0);
                        const uint8_t REQUESTED_DESCRIPTOR_INDEX = static_cast<uint8_t>((m_lastReceived_wValue                ) & UINT16_MASK_BYTE_0);
                                           
                        if ((REQUESTED_DESCRIPTOR_TYPE  == DESCRIPTOR_TYPE_DEVICE) &&
                            (REQUESTED_DESCRIPTOR_INDEX == 0))
                        {
                            commandRecognised = true;
                            m_bytesToSendPtr  = DEVICE_DESCRIPTOR;
                            m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(DEVICE_DESCRIPTOR)), m_lastReceived_wLength);                       
                        }
                        else if ((REQUESTED_DESCRIPTOR_TYPE  == DESCRIPTOR_TYPE_CONFIGURATION) &&
                                 (REQUESTED_DESCRIPTOR_INDEX == 0))
                        {
                            commandRecognised = true;
                           
                            if (m_operatingSpeed == eFULL_SPEED)
                            {                       
                                m_bytesToSendPtr  = CONFIGURATION_DESCRIPTOR_FULL_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(CONFIGURATION_DESCRIPTOR_FULL_SPEED)), m_lastReceived_wLength);                       
                            }
                            else if (m_operatingSpeed == eHIGH_SPEED)
                            {
                                m_bytesToSendPtr  = CONFIGURATION_DESCRIPTOR_HIGH_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(CONFIGURATION_DESCRIPTOR_HIGH_SPEED)), m_lastReceived_wLength);                       
                            }
                        }
                        else if ((REQUESTED_DESCRIPTOR_TYPE  == DESCRIPTOR_TYPE_OTHER_SPEED_CONFIGURATION) &&
                                 (REQUESTED_DESCRIPTOR_INDEX == 0))
                        {
                            commandRecognised = true;
                           
                            if (m_operatingSpeed == eFULL_SPEED)
                            {
                                m_bytesToSendPtr  = OTHER_SPEED_CONFIGURATION_DESCRIPTOR_WHEN_IN_FULL_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(OTHER_SPEED_CONFIGURATION_DESCRIPTOR_WHEN_IN_FULL_SPEED)), m_lastReceived_wLength);
                            }
                            else if (m_operatingSpeed == eHIGH_SPEED)
                            {
                                m_bytesToSendPtr  = OTHER_SPEED_CONFIGURATION_DESCRIPTOR_WHEN_IN_HIGH_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(OTHER_SPEED_CONFIGURATION_DESCRIPTOR_WHEN_IN_HIGH_SPEED)), m_lastReceived_wLength);                       
                            }       
                        }
                        else if (REQUESTED_DESCRIPTOR_TYPE  == DESCRIPTOR_TYPE_STRING)
                        {           
                            if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_LANG)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = LANG_STRING_DESCRIPTOR;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(LANG_STRING_DESCRIPTOR)), m_lastReceived_wLength); 
                            }
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_MANUFACTURER)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = MANUFACTURER_STRING_DESCRIPTOR;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(MANUFACTURER_STRING_DESCRIPTOR)), m_lastReceived_wLength);
                            }
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_PRODUCT)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = PRODUCT_STRING_DESCRIPTOR;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(PRODUCT_STRING_DESCRIPTOR)), m_lastReceived_wLength);                            
                            }
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_SERIAL)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = SERIAL_STRING_DESCRIPTOR;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(SERIAL_STRING_DESCRIPTOR)), m_lastReceived_wLength);                            
                            }
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_CONFIGURATION_FULL_SPEED)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = CONFIGURATION_STRING_DESCRIPTOR_FULL_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(CONFIGURATION_STRING_DESCRIPTOR_FULL_SPEED)), m_lastReceived_wLength);                            
                            }
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_CONFIGURATION_HIGH_SPEED)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = CONFIGURATION_STRING_DESCRIPTOR_HIGH_SPEED;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(CONFIGURATION_STRING_DESCRIPTOR_HIGH_SPEED)), m_lastReceived_wLength);                            
                            }                       
                            else if (REQUESTED_DESCRIPTOR_INDEX == STRING_DESCRIPTOR_INDEX_INTERFACE)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = INTERFACE_STRING_DESCRIPTOR;
                                m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(INTERFACE_STRING_DESCRIPTOR)), m_lastReceived_wLength);
                            }
                            // else do nothing                       
                        }
                        else if ((REQUESTED_DESCRIPTOR_TYPE  == DESCRIPTOR_TYPE_DEVICE_QUALIFIER) &&
                                 (REQUESTED_DESCRIPTOR_INDEX == 0))
                        {
                            commandRecognised = true;
                            m_bytesToSendPtr  = DEVICE_QUALIFIER_DESCIPTOR;
                            m_bytesLeftToSend = std::min(static_cast<uint16_t>(sizeof(DEVICE_QUALIFIER_DESCIPTOR)), m_lastReceived_wLength);
                        }
                        // else do nothing.
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                             (m_lastReceived_bRequest                        == REQUEST_GET_CONFIGURATION                     ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_CONFIGURATION              ))
                    {
                        /* GET_CONFIGURATION */
                                           
                        if (m_state != eDEFAULT)
                        {
                            commandRecognised = true;
                            m_bytesToSendPtr  = &m_currentDeviceConfiguration;
                            m_bytesLeftToSend = 1u;
                        }
                        // else device behaviour undefined
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_INTERFACE     ) &&
                             (m_lastReceived_bRequest                        == REQUEST_GET_INTERFACE                         ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_INTERFACE                  ))
                    {
                        /* GET_INTERFACE */
                       
                        if (m_state == eCONFIGURED)
                        {
                            const uint8_t INTERFACE_INDEX = m_lastReceived_wIndex;
                           
                            if (INTERFACE_INDEX == MESSAGE_EXCHANGE_INTERFACE_INDEX)
                            {
                                commandRecognised = true;
                                m_bytesToSendPtr  = &m_currentAlternateSettingIndexForMessageExchangeInterface;
                                m_bytesLeftToSend = 1u;
                            }  
                            // else it is not a valid request.
                        }
                        // else give request error.
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                             (m_lastReceived_bRequest                        == REQUEST_GET_STATUS                            ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_STATUS                     ))
                    {
                        /* GET_STATUS */
                                           
                        if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE)
                        {
                            commandRecognised = true;
                            m_bytesToSendPtr  = DEVICE_STATUS;
                            m_bytesLeftToSend = 2u;                         
                        }
                        else if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_INTERFACE)
                        {
                            if (m_state == eCONFIGURED)
                            {
                                const uint8_t REQUESTED_INTERFACE_INDEX = m_lastReceived_wIndex;
                           
                                if (REQUESTED_INTERFACE_INDEX == MESSAGE_EXCHANGE_INTERFACE_INDEX)
                                {                                               
                                    commandRecognised = true;
                                    m_bytesToSendPtr  = INTERFACE_STATUS;
                                    m_bytesLeftToSend = 2u; 
                                }
                                // else do nothing.
                            }
                            // else do nothing.
                        }
                        else if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT)
                        {
                            if (m_state != eDEFAULT)
                            {
                                const uint8_t REQUESTED_ENDPOINT_INDEX = m_lastReceived_wIndex;
                               
                                if (REQUESTED_ENDPOINT_INDEX == 0u)
                                {
                                    // Endpoint 0 never halts (USB specification says it is not required nor recommended).
                                    commandRecognised = true;
                                    m_bytesToSendPtr  = ENDPOINT_STATUS_NORMAL;
                                    m_bytesLeftToSend = 2u; 
                                }
                                else if (REQUESTED_ENDPOINT_INDEX == ENDPOINT_1_IN_ADDRESS)
                                {
                                    // Only respond when configured.
                                    if (m_state == eCONFIGURED)
                                    {
                                        commandRecognised = true;                                   
                                        m_bytesLeftToSend = 2u;
                                       
                                        if (m_endpoint1InState == eNORMAL)
                                        {
                                            m_bytesToSendPtr = ENDPOINT_STATUS_NORMAL;
                                        }
                                        else // if (m_endpoint1InState == eHALTED)
                                        {
                                            m_bytesToSendPtr = ENDPOINT_STATUS_HALTED;
                                        }
                                    }
                                    // else do nothing
                                }
                                else if (REQUESTED_ENDPOINT_INDEX == ENDPOINT_1_OUT_ADDRESS)
                                {
                                    // Only respond when configured.
                                    if (m_state == eCONFIGURED)
                                    {
                                        commandRecognised = true;                                   
                                        m_bytesLeftToSend = 2u;
                                       
                                        if (m_endpoint1OutState == eNORMAL)
                                        {
                                            m_bytesToSendPtr = ENDPOINT_STATUS_NORMAL;
                                        }
                                        else // if (m_endpoint1OutState == eHALTED)
                                        {
                                            m_bytesToSendPtr = ENDPOINT_STATUS_HALTED;
                                        }
                                    }
                                    // else do nothing
                                }
                                // else do nothing
                            }
                        }
                        // else do nothing   
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                             (m_lastReceived_bRequest                        == REQUEST_SET_ADDRESS                           ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_ADDRESS                    ))
                    {
                        /* SET_ADDRESS */
                       
                        /**
                         * NOTE: This is the standard device request SET_ADDRESS. We do not
                         * change the device's address here. For a justification of this see
                         * Section 9.4.6 of the USB 2.0 specification.
                         */
                      
                        if (m_state != eCONFIGURED)
                        {
                            commandRecognised = true;
                        }
                        // else do nothing
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                             (m_lastReceived_bRequest                        == REQUEST_SET_CONFIGURATION                     ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_CONFIGURATION              ))
                    {
                        /* SET_CONFIGURATION */
                       
                        if (m_state != eDEFAULT)
                        {
                            const uint8_t REQUESTED_CONFIGURATION_INDEX = m_lastReceived_wValue;
                           
                            if ((REQUESTED_CONFIGURATION_INDEX == 0u) ||
                                (REQUESTED_CONFIGURATION_INDEX == CONFIGURATION_INDEX))
                            {
                                commandRecognised = true;
                            }
                            // else this is not a valid configuration number.
                        }
                        // else device behaviour unspecified when no address has been assigned.
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                             (m_lastReceived_bRequest                        == REQUEST_SET_FEATURE                           ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_FEATURE                    ))
                    {
                        /* SET_FEATURE */
                                 
                        /**
                         * NOTE: We do NOT support TEST_MODE (used only for compliance testing).
                         */
                                           
                        if (m_state == eCONFIGURED)
                        {
       
                           
                            if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT)
                            {
                                const uint8_t REQUESTED_FEATURE_SELECTOR = m_lastReceived_wValue;
                                const uint8_t REQUESTED_ENDPOINT_ADDRESS = m_lastReceived_wIndex;
                               
                                if (REQUESTED_FEATURE_SELECTOR == FEATURE_SELECTOR_ENDPOINT_HALT)
                                {
                                    if ((REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_IN_ADDRESS) ||
                                        (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_OUT_ADDRESS))
                                    {
                                        /**
                                         * NOTE: We do not clear the feature here but wait for the status
                                         * stage of this control transfer.
                                         */
                                       
                                        commandRecognised = true;                             
                                    }
                                }
                                // else do nothing
                            }
                            // else do nothing
                        }
                        // else do nothing  
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                             (m_lastReceived_bRequest                        == REQUEST_CLEAR_FEATURE                         ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_CLEAR_FEATURE                  ))
                    {
                        /* CLEAR_FEATURE */
                       
                        if (m_state == eCONFIGURED)
                        {
                            if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT)
                            {
                                const uint8_t REQUESTED_FEATURE_SELECTOR = m_lastReceived_wValue;
                                const uint8_t REQUESTED_ENDPOINT_ADDRESS = m_lastReceived_wIndex;
                               
                                if (REQUESTED_FEATURE_SELECTOR == FEATURE_SELECTOR_ENDPOINT_HALT)
                                {
                                    if ((REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_IN_ADDRESS) ||
                                        (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_OUT_ADDRESS))
                                    {
                                        /**
                                         * NOTE: We do not clear the feature here but wait for the status
                                         * stage of this control transfer.
                                         */
                                       
                                        commandRecognised = true;                             
                                    }
                                }
                                // else do nothing
                            }
                            // else do nothing
                        }
                        // else do nothing  
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_INTERFACE     ) &&
                             (m_lastReceived_bRequest                        == REQUEST_SET_INTERFACE                         ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_INTERFACE                  ))
                    {
                        /* SET_INTERFACE */
                       
                        if (m_state == eCONFIGURED)
                        {
                            const uint8_t INTERFACE_INDEX = m_lastReceived_wIndex;
                            const uint8_t REQUESTED_ALTERNATE_SETTING_INDEX = m_lastReceived_wValue;
                           
                            if (INTERFACE_INDEX == MESSAGE_EXCHANGE_INTERFACE_INDEX)
                            {
                                if (REQUESTED_ALTERNATE_SETTING_INDEX == MESSAGE_EXCHANGE_ALTERNATE_SETTING_INDEX)
                                {
                                    commandRecognised = true;
                                }
                                // else this is not a valid alternate setting for this interface
                            }
                            // else this is not a valid interface
                        }
                        // else this is not a valid request
                    }
                    else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                             (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT      ) &&
                             (m_lastReceived_bRequest                        == REQUEST_SYNCH_FRAME                           ) &&
                             (m_lastReceived_wLength                         == REQUEST_LENGTH_SYNCH_FRAME                    ))
                    {
                        /* SYNCH_FRAME */
                       
                        /**
                         * NOTE: We do not respond to SYNCH_FRAME because we do not use isochronous transfers.
                         */
                    }
                    // else do nothing
                }
                // else do nothing
            }
            else
            {
    #ifdef ENABLE_ADDITIONAL_LOGGING
                LOG_printf(&usbOtgLog, "Controller received a setup transaction that is not 8 bytes.");
    #endif
            }
           
            // Service the hardware, set the appropriate state.
            if (commandRecognised)
            {
                const bool COMMAND_HAS_DATA_PHASE = (m_lastReceived_wLength > 0);
               
                if (COMMAND_HAS_DATA_PHASE)
                {
                    // Service the RXPKTRDY bit.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_RXPKTRDY, 1);
       
                    // Proceed to state RX or TX in anticipation of the data phase.
                    if (m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE)
                    {
                        m_endpoint0State = eRX;
                        m_bytesLeftToReceive = m_lastReceived_wLength;
                       
                        LOG_printf(&usbOtgLog, "Receive phase anticipated -- 0x%x bytes to receive.", m_bytesLeftToReceive);
                    }
                    else
                    {
                        m_endpoint0State = eTX;
                       
                        /**
                         * NOTE: In my interpretation of USB 2.0 Specification, Section 8.5.3.2, if we
                         * are sending less data than requested by the host, we should send a zero-length
                         * packet if the amount of data we are sending is an exact multiple of the maximum
                         * packet size. This variable flags this condition.
                         */
                        m_mustSendShortPacket = (m_bytesLeftToSend < m_lastReceived_wLength);
                       
                        LOG_printf(&usbOtgLog, "Transmit phase anticipated -- 0x%x bytes to send.", m_bytesLeftToSend);
                    }
                }
                else // if (!COMMAND_HAS_DATA_PHASE)
                {
                    // Service the RXPKTRDY bit.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_RXPKTRDY, 1);
                   
                    // Indicate there will be no further data.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_DATAEND, 1);
                   
                    // Remain in state IDLE
                    m_endpoint0State = eIDLE;
                   
                    // The next interrupt should be a status stage interrupt.
                    m_nextInterruptIsStatusStage = true;        
                       
    #ifdef ENABLE_ADDITIONAL_LOGGING
                    LOG_printf(&usbOtgLog, "No data phase -- anticipating status stage to follow immediately.");
    #endif
                }
                   
            }
            else // command was not recognised.
            {
                // Service the RXPKTRDY bit.
                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_RXPKTRDY, 1);
               
                // Tell the controller to send a STALL during the status phase.
                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SENDSTALL, 1);
                   
    #ifdef ENABLE_ADDITIONAL_LOGGING
                    // Log the occurrance.
                LOG_printf(&usbOtgLog, "Unrecognised SETUP packet received in IDLE mode: bmRequestType=%x, bRequest=%x, ...",
                      m_lastReceived_bmRequestType,
                      m_lastReceived_bRequest);
                LOG_printf(&usbOtgLog, "            ... wValue=%x, wIndex=%x, ...",
                      m_lastReceived_wValue,
                      m_lastReceived_wIndex);     
                LOG_printf(&usbOtgLog, "            ... wLength=%x.",
                          m_lastReceived_wLength);
    #endif
            }
        }
        else
        {
            LOG_printf(&usbOtgLog, "WARNING: EP0 interrupt received in IDLE mode but no packet was received.");
           
                bool receivedPacket = false;
               
    #if 0
                while (!receivedPacket)
                {
                    const uint32_t PERI_CSR0 = USB0_REGS_PTR->TXCSR.PERI_CSR0;
                    LOG_printf(&usbOtgLog, "PERI_CSR0 = 0x%x.", PERI_CSR0);
                   
                    receivedPacket = CSL_FEXT(PERI_CSR0, USB_OTG_PERI_CSR0_RXPKTRDY);
                }
   
                LOG_printf(&usbOtgLog, "OK then...");
    #endif           
        }
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint0InterruptRxMode()
    {
        const bool RX_PACKET_READY = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_RXPKTRDY);
       
        if (RX_PACKET_READY)
        {
            // Check how many bytes we are receiving.
            const uint16_t BYTES_RECEIVED = USB0_REGS_PTR->COUNT.COUNT0;
           
            // Unload the FIFO.
            readEndpoint0FIFO(BYTES_RECEIVED, m_endpoint0DataBuffer);
                  
            // TODO: Handle the data.
           
            if (BYTES_RECEIVED > m_bytesLeftToReceive)
            {
                // TODO: According to USB 2.0 Specification, Section 5.5.3, we should stall the pipe
                // if we receive more data than we expect.
            }
            else
            {
                // According to USB 2.0 Specification, Section 5.5.3, the host does not send a
                // zero-length packet if the amount of data being received is a multiple of maxPacketSize.
                const bool IS_LAST_PACKET =
                    (BYTES_RECEIVED < ENDPOINT_0_MAX_PACKET_SIZE) ||
                    (BYTES_RECEIVED == m_bytesLeftToReceive);
           
                if (IS_LAST_PACKET)
                {
                    // Service the RXPKTRDY bit.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_RXPKTRDY, 1);
                   
                    // Indicate there will be no further data.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_DATAEND, 1);
                   
                    // Transition to state IDLE
                    m_endpoint0State = eIDLE;
                   
                    // The next interrupt should be a status stage interrupt.
                    m_nextInterruptIsStatusStage = true;  
                }
                else
                {
                    // Service the RXPKTRDY bit.
                    CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_SERV_RXPKTRDY, 1);
               
                    // Do nothing.
                    m_bytesLeftToReceive -= BYTES_RECEIVED;
                }
            }
        }
        // else do nothing   
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint0InterruptTxMode()
    {
        // Determine how many bytes we should write.
        const uint16_t BYTES_SENT = std::min<uint16_t>(m_bytesLeftToSend, ENDPOINT_0_MAX_PACKET_SIZE);
       
        // Load the FIFO.
        writeEndpoint0FIFO(BYTES_SENT, m_bytesToSendPtr);
       
        // According to USB 2.0 Specification [Section 5.5.3] we do not need to send a zero-length
        // packet if the amount of data we are sending is a multiple of maxPacketSize unless the host
        // requested more data than we are actually sending [Section 8.5.3.2].
       
        bool isLastPacket = false;
           
        if (BYTES_SENT != ENDPOINT_0_MAX_PACKET_SIZE)
        {  
            // Assert that we sent all data.
            assert(BYTES_SENT == m_bytesLeftToSend);
           
            // We sent a short packet.
            isLastPacket = true;
        }
        else // we are not sending a short packet.
        {
            if (BYTES_SENT == m_bytesLeftToSend)
            {
                // We are finished unless we require a short packet.
                isLastPacket = !m_mustSendShortPacket;           
            }
            else // we did not send all the data.
            {
                // We have not sent all the data.
                isLastPacket = false;
            }
        }       
       
        if (isLastPacket)
        {
            // Service the TXPKTRDY bit.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_TXPKTRDY, 1);
                   
            // Indicate there will be no further data.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_DATAEND, 1);
           
            LOG_printf(&usbOtgLog, "DATAEND written.");
           
            // Transition to state IDLE
            m_endpoint0State = eIDLE;
           
            // The next interrupt should be a status stage interrupt.
            m_nextInterruptIsStatusStage = true;
        }
        else
        {
            // Service the TXPKTRDY bit.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_CSR0, USB_OTG_PERI_CSR0_TXPKTRDY, 1);
           
            // Update data window.
            m_bytesLeftToSend -= BYTES_SENT;
            m_bytesToSendPtr  += BYTES_SENT;
        }
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint0InterruptStatusStage()
    {
        /**
         * NOTE: This function gets called when a control transfer has got to the status stage. It
         * is only here where we should actually perform any actions.
         */
       
        if (m_lastReceived_bmRequestType_type == REQUEST_TYPE_TRANSFER_TYPE_STANDARD)
        {
            if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                (m_lastReceived_bRequest                        == REQUEST_GET_DESCRIPTOR                        ))
            {
                const uint8_t REQUESTED_DESCRIPTOR_TYPE  = static_cast<uint8_t>((m_lastReceived_wValue >> BITS_IN_BYTE) & UINT16_MASK_BYTE_0);
                const uint8_t REQUESTED_DESCRIPTOR_INDEX = static_cast<uint8_t>((m_lastReceived_wValue)                 & UINT16_MASK_BYTE_0);
               
    #ifdef ENABLE_ADDITIONAL_LOGGING
                LOG_printf(&usbOtgLog, "Handled GET_DESCRIPTOR (DescriptorType=%x, DescriptorIndex=%x, ...",
                    REQUESTED_DESCRIPTOR_TYPE,
                    REQUESTED_DESCRIPTOR_INDEX);
                LOG_printf(&usbOtgLog, "            ... Length=0x%x) [Returned=...].",
                    m_lastReceived_wLength);
    #endif
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                      (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                      (m_lastReceived_bRequest                        == REQUEST_GET_CONFIGURATION                     ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_CONFIGURATION              ))
            {
    #ifdef ENABLE_ADDITIONAL_LOGGING
                LOG_printf(&usbOtgLog, "Handled GET_CONFIGURATION [Returned=%x].",
                    m_currentDeviceConfiguration);
    #endif
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                      (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_INTERFACE     ) &&
                      (m_lastReceived_bRequest                        == REQUEST_GET_INTERFACE                         ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_INTERFACE                  ))
            {
                const uint8_t INTERFACE_INDEX = m_lastReceived_wIndex;
   
    #ifdef ENABLE_ADDITIONAL_LOGGING
                LOG_printf(&usbOtgLog, "Handled GET_INTERFACE (Interface=%x) [Returned=%x].",
                    INTERFACE_INDEX,
                    m_currentAlternateSettingIndexForMessageExchangeInterface);
    #endif
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_DEVICE_TO_HOST) &&
                      (m_lastReceived_bRequest                        == REQUEST_GET_STATUS                            ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_GET_STATUS                     ))
            {
    #ifdef ENABLE_ADDITIONAL_LOGGING
                LOG_printf(&usbOtgLog, "Handled GET_STATUS.");
    #endif
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                      (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                      (m_lastReceived_bRequest                        == REQUEST_SET_ADDRESS                           ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_ADDRESS                    ))
            {
                const uint8_t REQUESTED_ADDRESS  = m_lastReceived_wValue;
                           
                // Only now do we indicate to the controller that the address has changed.
                USB0_REGS_PTR->FADDR = REQUESTED_ADDRESS;
               
                if (REQUESTED_ADDRESS == 0u)
                {
                    // We were assigned the default address.
                    m_state = eDEFAULT;
                }
                else
                {
                    // The address is a non-default one.
                    m_state = eADDRESS;               
                }
   
    #ifdef ENABLE_ADDITIONAL_LOGGING
                // We no longer have an address.
                LOG_printf(&usbOtgLog, "Handled SET_ADDRESS (Address=%x).", REQUESTED_ADDRESS);
    #endif
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                      (m_lastReceived_bmRequestType_recipient         == REQUEST_TYPE_TRANSFER_RECIPIENT_DEVICE        ) &&
                      (m_lastReceived_bRequest                        == REQUEST_SET_CONFIGURATION                     ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_CONFIGURATION              ))
            {
                if (m_state != eDEFAULT)
                {
                    const uint8_t REQUESTED_CONFIGURATION_INDEX = m_lastReceived_wValue;
                   
                    m_currentDeviceConfiguration = REQUESTED_CONFIGURATION_INDEX;
                   
                    if (REQUESTED_CONFIGURATION_INDEX == 0u)                   
                    {
                        // Unconfigure device
                        m_state = eADDRESS;    
                    }
                    else if (REQUESTED_CONFIGURATION_INDEX == CONFIGURATION_INDEX)
                    {
                        // Unconfigure device
                        m_state = eCONFIGURED;
                       
                        // Set alternate settings [for clarification only, we only have one alternate setting, really]
                        m_currentAlternateSettingIndexForMessageExchangeInterface = MESSAGE_EXCHANGE_ALTERNATE_SETTING_INDEX;
                       
                        // Reinitialise endpoints (ensures data toggle bit is correctly set).
                        initialiseEndpoints();
                    }
   
    #ifdef ENABLE_ADDITIONAL_LOGGING
                    // We no longer have an address.
                    LOG_printf(&usbOtgLog, "Handled SET_CONFIGURATION (Configuration=%x).",
                        REQUESTED_CONFIGURATION_INDEX);
    #endif
                }
                // else we may not configure the device in the default state.
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                      (m_lastReceived_bmRequestType_recipient          == REQUEST_TYPE_TRANSFER_RECIPIENT_INTERFACE     ) &&
                      (m_lastReceived_bRequest                         == REQUEST_SET_INTERFACE                         ) &&
                      (m_lastReceived_wLength                          == REQUEST_LENGTH_SET_INTERFACE                  ))
            {
                if (m_state == eCONFIGURED)
                {
                    const uint8_t INTERFACE_INDEX = m_lastReceived_wIndex;
                    const uint8_t REQUESTED_ALTERNATE_SETTING_INDEX = m_lastReceived_wValue;
                       
                    if (INTERFACE_INDEX == MESSAGE_EXCHANGE_INTERFACE_INDEX)
                    {
                        // Set alternate setting!
                        m_currentAlternateSettingIndexForMessageExchangeInterface = REQUESTED_ALTERNATE_SETTING_INDEX;
                       
                        // Reinitialise endpoints (ensures data toggle bit is correctly set).
                        initialiseEndpoints();
   
    #ifdef ENABLE_ADDITIONAL_LOGGING
                        LOG_printf(&usbOtgLog, "Handled SET_INTERFACE (Interface=%x, AlternateSetting=%x).",
                            INTERFACE_INDEX,
                            REQUESTED_ALTERNATE_SETTING_INDEX);
    #endif
                    }
                    // else do nothing
                }
                // else we may not select an alternate setting without being configured.
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                      (m_lastReceived_bRequest                        == REQUEST_SET_FEATURE                           ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_SET_FEATURE                    ))
            {
                /* SET_FEATURE */
                                    
                if (m_state == eCONFIGURED)
                {              
                    if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT)
                    {
                        const uint8_t REQUESTED_FEATURE_SELECTOR = m_lastReceived_wValue;
                        const uint8_t REQUESTED_ENDPOINT_ADDRESS = m_lastReceived_wIndex;
                       
                        if (REQUESTED_FEATURE_SELECTOR == FEATURE_SELECTOR_ENDPOINT_HALT)
                        {
                            if (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_IN_ADDRESS)                         
                            {
                                m_endpoint1InState = eHALTED;
                               
                                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_SENDSTALL, 0u);
    #ifdef ENABLE_ADDITIONAL_LOGGING
                                LOG_printf(&usbOtgLog, "Handled SET_FEATURE (FeatureSelector=HALT, Endpoint=\"EP1 (IN)\").");
    #endif
                            }
                            else if (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_OUT_ADDRESS)
                            {
                                m_endpoint1OutState = eHALTED;
                               
                                CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_SENDSTALL, 0u);
    #ifdef ENABLE_ADDITIONAL_LOGGING
                                LOG_printf(&usbOtgLog, "Handled SET_FEATURE (FeatureSelector=HALT, Endpoint=\"EP1 (OUT)\").");
    #endif
                            }
                            // else do nothing                       
                        }
                        // else do nothing
                    }
                    // else do nothing
                }
                // else do nothing  
            }
            else if ((m_lastReceived_bmRequestType_transferDirection == REQUEST_TYPE_TRANSFER_DIRECTION_HOST_TO_DEVICE) &&
                      (m_lastReceived_bRequest                        == REQUEST_CLEAR_FEATURE                         ) &&
                      (m_lastReceived_wLength                         == REQUEST_LENGTH_CLEAR_FEATURE                  ))
            {
                /* CLEAR_FEATURE */
               
                if (m_state == eCONFIGURED)
                {
                    if (m_lastReceived_bmRequestType_recipient == REQUEST_TYPE_TRANSFER_RECIPIENT_ENDPOINT)
                    {
                        const uint8_t REQUESTED_FEATURE_SELECTOR = m_lastReceived_wValue;
                        const uint8_t REQUESTED_ENDPOINT_ADDRESS = m_lastReceived_wIndex;
                       
                        if (REQUESTED_FEATURE_SELECTOR == FEATURE_SELECTOR_ENDPOINT_HALT)
                        {
                            if (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_IN_ADDRESS)                         
                            {
                                // Set the state.
                                m_endpoint1InState = eNORMAL;
                               
                                // Clear the stall bit.
                                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_SENDSTALL, 1u);
                               
                                // Reset the data toggle.
                                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_CLRDATATOG, 1);
                               
    #ifdef ENABLE_ADDITIONAL_LOGGING
                                LOG_printf(&usbOtgLog, "Handled CLEAR_FEATURE (FeatureSelector=HALT, Endpoint=\"EP1 (IN)\").");
    #endif
                            }
                            else if (REQUESTED_ENDPOINT_ADDRESS == ENDPOINT_1_OUT_ADDRESS)
                            {
                                // Set the state.
                                m_endpoint1OutState = eNORMAL;
                               
                                // Clear the stall bit.
                                CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_SENDSTALL, 1u);
                               
                               // Reset the data toggle.
                                CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_CLRDATATOG, 1);
                               
    #ifdef ENABLE_ADDITIONAL_LOGGING
                                LOG_printf(&usbOtgLog, "Handled CLEAR_FEATURE (FeatureSelector=HALT, Endpoint=\"EP1 (OUT)\").");
    #endif
                            }
                            // else do nothing                          
                        }
                        // else do nothing
                    }
                    // else do nothing
                }
                // else do nothing  
            }
            // else do nothing
        }
        // else do nothing
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint0InterruptExtractSetupData()
    {
        m_lastReceived_bmRequestType = *(((uint8_t  *)m_endpoint0DataBuffer) + 0);  // bmRequestType
        m_lastReceived_bRequest      = *(((uint8_t  *)m_endpoint0DataBuffer) + 1);  // bRequest
        m_lastReceived_wValue        = *(((uint16_t *)m_endpoint0DataBuffer) + 1);  // wValue
        m_lastReceived_wIndex        = *(((uint16_t *)m_endpoint0DataBuffer) + 2);  // wIndex
        m_lastReceived_wLength       = *(((uint16_t *)m_endpoint0DataBuffer) + 3);  // wLength
       
        // Further extract data from the bmRequestType field.
        m_lastReceived_bmRequestType_transferDirection
            = (m_lastReceived_bmRequestType & REQUEST_TYPE_TRANSFER_DIRECTION_MASK) >> REQUEST_TYPE_TRANSFER_DIRECTION_SHIFT;
        m_lastReceived_bmRequestType_type 
            = (m_lastReceived_bmRequestType & REQUEST_TYPE_TRANSFER_TYPE_MASK) >> REQUEST_TYPE_TRANSFER_TYPE_SHIFT;
        m_lastReceived_bmRequestType_recipient
            = (m_lastReceived_bmRequestType & REQUEST_TYPE_TRANSFER_RECIPIENT_MASK) >> REQUEST_TYPE_TRANSFER_RECIPIENT_SHIFT;
    }
   
    void UsbPeripheralCommsDriver::readEndpoint0FIFO(int uNumBytes, uint8_t* pData)
    {
        int i;
   
        if (uNumBytes)
        {
            // Unload <NumBytes> from the selected FIFO
            for(i=0; i<uNumBytes; i++)
            {
                pData[i] = *((unsigned char*)(&USB0_REGS_PTR->FIFO0));
            }
        }
    }
   
    void UsbPeripheralCommsDriver::writeEndpoint0FIFO(int uNumBytes, const uint8_t* pData)
    {
        int i;
        if (uNumBytes>0)
        {
            for(i=0; i<uNumBytes; i++)
            {
                *((unsigned char*)(&USB0_REGS_PTR->FIFO0)) = pData[i];
            }
        }
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint1InInterrupt()
    {
        USB0_REGS_PTR->INDEX = 1u;
       
        const bool UNDERRUN = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_UNDERRUN);
           
        if (UNDERRUN)
        {
            // Clear the underrun bit.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_UNDERRUN, 0u);
           
    #ifdef ENABLE_ADDITIONAL_LOGGING
            LOG_printf(&usbOtgLog, "%s: EP1 (IN) was underrun (i.e. data not written fast enough).",
                        FIRMWARE_ERROR_USB_CONTROLLER_UNDERRUN);
    #else
            LOG_printf(&usbOtgLog, "%s", DSP::FIRMWARE_ERROR_USB_CONTROLLER_UNDERRUN);
    #endif
        }
        // else do nothing.
       
        if (m_endpoint1InState == eHALTED)
        {
            // Stall the pipe.
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_SENDSTALL, 1u);
        }
        else
        {
            const bool TRANSFER_STALLED = CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_SENTSTALL);
              
            if (TRANSFER_STALLED)
            {
                // Clear the stall bit when we are not halted.
                CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_SENDSTALL, 0u);
            }
            // else do nothing
           
            const bool MAILBOX_PEND_RESULT = MBX_pend(m_transmitMailboxHandle,
                                                      m_endpoint1InDataBuffer,
                                                      0u);
            if (MAILBOX_PEND_RESULT)
            {
                size_t messageSize = (m_endpoint1InDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_LO_INDEX]                ) +
                                     (m_endpoint1InDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_HI_INDEX] << BITS_IN_BYTE);
                           
                writeEndpoint1InFIFO(messageSize, m_endpoint1InDataBuffer);
               
    #ifdef LOG_COMMUNICATION
                LOG_printf(&usbOtgLog, "DSP-to-Core: %d-byte message.", messageSize);
    #endif
            }
            else
            {
                 // write nothing  
            }
        }
       
        // Set the TXPKTRDY bit.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_TXPKTRDY, 1u);
    }
   
    void UsbPeripheralCommsDriver::writeEndpoint1InFIFO(int uNumBytes, const uint8_t* pData)
    {
        int i;
        if (uNumBytes>0)
        {
            for(i=0; i<uNumBytes; i++)
            {
                *((unsigned char*)(&USB0_REGS_PTR->FIFO1)) = pData[i];
            }
        }
    }
   
    void UsbPeripheralCommsDriver::serviceEndpoint1OutInterrupt()
    {
        USB0_REGS_PTR->INDEX = 1u;
       
        const bool OVERRUN = CSL_FEXT(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_OVERRUN);
           
        if (OVERRUN)
        {
            // Clear the overrun bit.
            CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_OVERRUN, 0u);
   
    #ifdef ENABLE_ADDITIONAL_LOGGING
            LOG_printf(&usbOtgLog, "%s: EP1 (OUT) was overrun (i.e. data not read fast enough).",
                        FIRMWARE_ERROR_USB_CONTROLLER_OVERRUN);
    #else
            LOG_printf(&usbOtgLog, "%s", DSP::FIRMWARE_ERROR_USB_CONTROLLER_OVERRUN);
    #endif
        }
        // else do nothing.
       
        if (CSL_FEXT(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_RXPKTRDY))
        {
            if (m_endpoint1OutState == eHALTED)
            {
                // Stall the pipe.
                CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_SENDSTALL, 1u);
            }
            else
            {
                const bool TRANSFER_STALLED = CSL_FEXT(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_SENTSTALL);
                  
                if (TRANSFER_STALLED)
                {
                    // Clear the stall bit when we are not halted.
                    CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_SENDSTALL, 0u);
                }
                // else do nothing
                     
                const uint16_t BYTES_RECEIVED = USB0_REGS_PTR->COUNT.RXCOUNT;
               
                if (BYTES_RECEIVED > 0)
                {               
                    readEndpoint1OutFIFO(BYTES_RECEIVED, m_endpoint1OutDataBuffer);
                  
                    m_endpoint1OutDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_LO_INDEX] = static_cast<uint8_t>(BYTES_RECEIVED & UINT16_MASK_BYTE_0);
                    m_endpoint1OutDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_HI_INDEX] = static_cast<uint8_t>((BYTES_RECEIVED >> BITS_IN_BYTE) & UINT16_MASK_BYTE_0);
                                                           
                    const bool MAILBOX_POST_RESULT = MBX_post(m_receiveMailboxHandle,
                                                              m_endpoint1OutDataBuffer,
                                                              0u);
   
                    if (!MAILBOX_POST_RESULT)
                    {
                       
    #ifdef ENABLE_ADDITIONAL_LOGGING
                        LOG_printf(&usbOtgLog, "%s: Failed to post data in receive mailbox. Data was lost.",
                                    FIRMWARE_ERROR_USB_RECEIVE_MAILBOX_FULL);
    #else
                        LOG_printf(&usbOtgLog, "%s", DSP::FIRMWARE_ERROR_USB_RECEIVE_MAILBOX_FULL);
    #endif
                    }
                    // else do nothing.
   
                }
                // else do nothing.            
               
                /* END: Write data using writeEndpoint1InFIFO */
            }
        }
        // else do nothing.
       
        // Clear the RXPKTRDY bit.
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_RXPKTRDY, 0u);
    }
   
    void UsbPeripheralCommsDriver::readEndpoint1OutFIFO(int uNumBytes, uint8_t* pData)
    {
        int i;
   
        if (uNumBytes)
        {
            // Unload <NumBytes> from the selected FIFO
            for(i=0; i<uNumBytes; i++)
            {
                pData[i] = *((unsigned char*)(&USB0_REGS_PTR->FIFO1));
            }
        }
    }
   
    void UsbPeripheralCommsDriver::initialiseHardware()
    {
        volatile uint16_t i;
        volatile Uint32 value =0;
   
        // **************************************************************************
        // Configure DRVVBUS Pin to be used for USB; Muxed with GPIO4[15]=Bank4 GP15
        // PINMUX9[4]=1 and PINMUX9[7]=0
        // **************************************************************************
        // MAKE SURE WRITE ACCESS KEY IS INITIALIZED PRIOR TO ACCESSING ANY OF THE
        // SYS_CFG_REGS_PTR REGISTERS.
        SYS_CFG_REGS_PTR->KICK0R = 0x83e70b13; // Write Access Key 0
        SYS_CFG_REGS_PTR->KICK1R = 0x95A4F1E0; // Write Access Key 1
   
        // Reset the USB controller:
        USB0_REGS_PTR->CTRLR |= CSL_USB_OTG_CTRLR_RESET_MASK;
   
        //Wait until controller is finished with Reset. When done, it will clear the RESET bit field.
        while ((USB0_REGS_PTR->CTRLR & CSL_USB_OTG_CTRLR_RESET_MASK) == 1)
            ;
   
        // RESET: Hold PHY in Reset
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_RESET_MASK; // Hold PHY in Reset
   
        for (i=0; i < 50; i++)
            ; // Drive Reset for a few clock cycles
   
        // RESET: Release PHY from Reset
        SYS_CFG_REGS_PTR->CFGCHIP2 &= ~CSL_SYSCFG_CFGCHIP2_RESET_MASK; // Release PHY from Reset
   
        // Configure PHY with the Desired Operation
        // OTGMODE  0x02 => Override PHY Values act as device
        SYS_CFG_REGS_PTR->CFGCHIP2 &= ~CSL_SYSCFG_CFGCHIP2_USB0OTGMODE_MASK; // 00= > Do Not Override PHY Values
        SYS_CFG_REGS_PTR->CFGCHIP2 |= (CSL_SYSCFG_CFGCHIP2_USB0OTGMODE_USB_DEVICE <<
                              CSL_SYSCFG_CFGCHIP2_USB0OTGMODE_SHIFT); // 02= > Override PHY Values act as device
   
        // PHYPWDN
        SYS_CFG_REGS_PTR->CFGCHIP2 &= ~CSL_SYSCFG_CFGCHIP2_USB0PHYPWDN_MASK; // 1/0 = > PowerdDown/ NormalOperation
   
        // OTGPWRDN
        SYS_CFG_REGS_PTR->CFGCHIP2 &= ~CSL_SYSCFG_CFGCHIP2_USB0OTGPWRDN_MASK; // 1/0 = > PowerDown/ NormalOperation
   
        // DATAPOL
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_USB0DATPOL_MASK; // 1/0 = > Normal/ Reversed
   
        // SESNDEN
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_USB0SESNDEN_MASK; // 1/0 = > NormalOperation/ SessionEnd
   
        // VBDTCTEN
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_USB0VBDTCTEN_MASK; // 1/0 = > VBUS Comparator Enable/ Disable * Configure PHY PLL use and Select Source */
   
        // REF_FREQ[3:0]
        SYS_CFG_REGS_PTR->CFGCHIP2 |= 0x2u; // 0x2 = > 24MHz Input Source
   
        // USB2PHYCLKMUX: Select Internal Source
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_USB0PHYCLKMUX_MASK; // 1/0 = > Internal/External(Pin)
        //SYS_CFG_REGS_PTR->CFGCHIP2 &= ~CSL_SYSCFG_CFGCHIP2_USB0PHYCLKMUX_MASK; // 1/0 = > Internal/External(Pin)
   
        // PHY_PLLON: On Simulation PHY PLL is OFF (also necessary as USB1 uses this clock even when USB0 is suspended)
        SYS_CFG_REGS_PTR->CFGCHIP2 |= CSL_SYSCFG_CFGCHIP2_USB0PHY_PLLON_MASK; // 1/0 = > On/ Off
   
        /* Wait Until PHY Clock is Good */
        while ((SYS_CFG_REGS_PTR->CFGCHIP2 & CSL_SYSCFG_CFGCHIP2_USB0PHYCLKGD_MASK) == 0)
            ; // Wait Until PHY Clock is Good.
    }
   
    void UsbPeripheralCommsDriver::initialiseUSB()
    {
        // Enable high-speed
        CSL_FINS(USB0_REGS_PTR->POWER, USB_OTG_POWER_HSEN, 1u);
       
        // Enable Interrupts
        // Enable interrupts in OTG block
        USB0_REGS_PTR->CTRLR &= ~CSL_USB_OTG_CTRLR_UINT_MASK; // Enable PDR2.0 Interrupt
        // Enable All Core Tx Endpoints Interrupts + EP0 Tx/Rx interrupt
        USB0_REGS_PTR->INTRTXE = (
                               CSL_USB_OTG_INTRTXE_EP4TX_MASK
                               | CSL_USB_OTG_INTRTXE_EP3TX_MASK
                               | CSL_USB_OTG_INTRTXE_EP2TX_MASK
                               | CSL_USB_OTG_INTRTXE_EP1TX_MASK
                               | CSL_USB_OTG_INTRTXE_EP0_MASK);
        // Enable All Core Rx Endpoints Interrupts
        USB0_REGS_PTR->INTRRXE = (
                               CSL_USB_OTG_INTRRXE_EP4RX_MASK
                               | CSL_USB_OTG_INTRRXE_EP3RX_MASK
                               | CSL_USB_OTG_INTRRXE_EP2RX_MASK
                               | CSL_USB_OTG_INTRRXE_EP1RX_MASK);
   
        // Enable all interrupts in OTG block
        USB0_REGS_PTR->INTMSKSETR = 0x01F71E1F;
   
        // Enable all USB interrupts in MUSBMHDRC
        USB0_REGS_PTR->INTRUSBE = 0xF7;
   
        // Enable SUSPENDM so that suspend can be seen UTMI signal
        CSL_FINS(USB0_REGS_PTR->POWER, USB_OTG_POWER_ENSUSPM, 1);
   
        // Clear all pending interrupts
        USB0_REGS_PTR->INTCLRR = USB0_REGS_PTR->INTSRCR;
       
        // NOTE: Acknowledge completion of any previous interrupts. We do not
        // need to do this after a cold start but in all other cases the
        // firmware will not work without this acknowledgment.   
        USB0_REGS_PTR->EOIR = 0u;
       
        // Set softconn bit
        CSL_FINS(USB0_REGS_PTR->POWER, USB_OTG_POWER_SOFTCONN, 1);
   
        while ((USB0_REGS_PTR->DEVCTL & CSL_USB_OTG_DEVCTL_SESSION_MASK) == 0)
            ; //Stay here until controller goes in Session.
    }
   
    void UsbPeripheralCommsDriver::initialiseEndpoints()
    {
        uint16_t endpoint1InMaxPacketSize = 0;
        uint16_t endpoint1OutMaxPacketSize = 0;
       
        if (m_operatingSpeed == eFULL_SPEED)
        {
            endpoint1InMaxPacketSize  = ENDPOINT_1_IN_MAX_PACKET_SIZE_FULL_SPEED;
            endpoint1OutMaxPacketSize = ENDPOINT_1_OUT_MAX_PACKET_SIZE_FULL_SPEED;
           
            if (m_messageSplitterPtr!=0)
            {
                m_messageSplitterPtr->setMaxMessageLength(ENDPOINT_1_OUT_MAX_PACKET_SIZE_FULL_SPEED);
            }
            //else do nothing
           
            if (m_faultReporterPtr!=0)
            {
                m_faultReporterPtr->faultChanged(FaultTypes::eLOW_USB_SPEED, true);
            }
            //else do nothing
        }
        else // (m_operatingSpeed == eHIGH_SPEED)
        {
            endpoint1InMaxPacketSize  = ENDPOINT_1_IN_MAX_PACKET_SIZE_HIGH_SPEED;
            endpoint1OutMaxPacketSize = ENDPOINT_1_OUT_MAX_PACKET_SIZE_HIGH_SPEED;
           
            if (m_messageSplitterPtr!=0)
            {
                m_messageSplitterPtr->setMaxMessageLength(ENDPOINT_1_OUT_MAX_PACKET_SIZE_HIGH_SPEED);
            }
            //else do nothing
   
            if (m_faultReporterPtr!=0)
            {
                m_faultReporterPtr->faultChanged(FaultTypes::eLOW_USB_SPEED, false);
            }
            //else do nothing
        }
       
        // Select the right endpoint.
        USB0_REGS_PTR->INDEX = 1u;
       
        // Set the FIFO for this endpoint.
        USB0_REGS_PTR->TXFIFOSZ   = ENDPOINT_1_IN_FIFO_SIZE_FOR_REGISTER;
        USB0_REGS_PTR->TXFIFOADDR = ENDPOINT_1_IN_FIFO_OFFSET_FOR_ADDRESS;
        USB0_REGS_PTR->RXFIFOSZ   = ENDPOINT_1_OUT_FIFO_SIZE_FOR_REGISTER;
        USB0_REGS_PTR->RXFIFOADDR = ENDPOINT_1_OUT_FIFO_OFFSET_FOR_ADDRESS;
       
        // Set maximum packet size.
        USB0_REGS_PTR->TXMAXP = endpoint1InMaxPacketSize;
        USB0_REGS_PTR->RXMAXP = endpoint1OutMaxPacketSize;
       
        // Clear to enable interrupt (or bulk) mode.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_ISO, 0);
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_ISO, 0);
       
        // Enable Rx/Tx mode (should only be necessary when sharing FIFOs).
        // CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_MODE, 1);
        
        // Disable DMA.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_DMAEN, 0);
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_DMAEN, 0);
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_DMAMODE, 0);
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_DMAMODE, 0);
       
        // Normal data toggle operation.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_FRCDATATOG, 0);
       
        // Reset data toggle.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_CLRDATATOG, 1);
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_CLRDATATOG, 1);
       
        // Disable NYET handshakes (see sprofm9h.pdf, Sect. 2.7.1.3).
        CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_DISNYET, 0);
       
        // Check if there is data in the buffer.
        if (CSL_FEXT(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_FIFONOTEMPTY))
        {
            // Flush the FIFO (only once as we are not using double buffering).
            CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_FLUSHFIFO, 1);
           
            // The user guide hints at setting this bit but the forum subtly suggests not to.
            // CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_FIFONOTEMPTY, 0);
        }
        // else do nothing    
       
        // Check if there is data in the buffer.
        if (CSL_FEXT(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_RXPKTRDY))
        {
            // Flush the FIFO (only once as we are not using double buffering).
            CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_FLUSHFIFO, 1);
           
            // The user guide hints at setting this bit but the forum subtly suggests not to.
            // CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_TXCSR, USB_OTG_PERI_RXCSR_FIFONOTEMPTY, 0);
           
            // Clear the bit to enable interrupts.
            CSL_FINS(USB0_REGS_PTR->RXCSR.PERI_RXCSR, USB_OTG_PERI_RXCSR_RXPKTRDY, 0); 
        }
        // else do nothing 
          
        // Send empty data to prevent underrun and to enable interrupt.
        CSL_FINS(USB0_REGS_PTR->TXCSR.PERI_TXCSR, USB_OTG_PERI_TXCSR_TXPKTRDY, 1);   
    }
   
    void UsbPeripheralCommsDriver::performInitialization(void)
    {
    }
   
    void UsbPeripheralCommsDriver::performTask(void)
    {
        /**
         * NOTE: This method is called by the kernel thread. We must retrieve
         * the messages intercepted by the interrupt service routine in a thread-safe manner.
         */
       
        // Clear receive Mailbox (clear the mailbox at most once to prevent livelock).   
        for (uint32_t index = 0; index < RECEIVE_MAILBOX_NUM_BUFFERS; ++index)
        {
            const bool MAILBOX_PEND_RESULT = MBX_pend(m_receiveMailboxHandle,
                                                      m_receiveMailboxDataBuffer,
                                                      0u);
            if (MAILBOX_PEND_RESULT)
            {
                size_t messageSize = (m_receiveMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_LO_INDEX]                ) +
                                     (m_receiveMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_HI_INDEX] << BITS_IN_BYTE);
                                    
    #ifdef LOG_COMMUNICATION
                LOG_printf(&usbOtgLog, "Core-to-DSP: %d-byte message.", messageSize);
    #endif
   
                if (m_receiverPtr != 0)
                {
                    FastDataPacket data(m_receiveMailboxDataBuffer, messageSize);
                    m_receiverPtr->receive(data);
                }
                // else do nothing
            }
            else
            {
                // There is no more post.
                break;
            }
        }
    }
   
    void UsbPeripheralCommsDriver::performTaskWhichCanSuspend()
    {
        // I am called from a TSK context every so often.
   
        if (m_resetSignallingPresent)
        {
            if (!CSL_FEXT(USB0_REGS_PTR->POWER, USB_OTG_POWER_RESET))
            {
                LOG_printf(&usbOtgLog, "End of RESET signalling detected.");
                serviceResetInterrupt();
                m_resetSignallingPresent = false;
            }
            else
            {
                LOG_printf(&usbOtgLog, "Still observing RESET signalling.");
            }
            // else do nothing.
        }
        // else do nothing.
   
        //This method should be called from the active object that inherits from this class
       
        // Clear receive Mailbox (clear the mailbox at most once to prevent livelock).   
        const bool MAILBOX_PEND_RESULT = MBX_pend(m_receiveMailboxHandle,
                                                  m_receiveMailboxDataBuffer,
                                                  RECEIVE_SLEEP_PERIOD_MS);
        if (MAILBOX_PEND_RESULT)
        {
            size_t messageSize = (m_receiveMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_LO_INDEX]                ) +
                                 (m_receiveMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_HI_INDEX] << BITS_IN_BYTE);
                                
    #ifdef LOG_COMMUNICATION
            LOG_printf(&usbOtgLog, "Core-to-DSP: %d-byte message.", messageSize);
    #endif
   
            if (m_receiverPtr != 0)
            {
                FastDataPacket data(m_receiveMailboxDataBuffer, messageSize);
                m_receiverPtr->receive(data);
            }
            // else do nothing
        }
        //else do nothing
    }
   
    bool UsbPeripheralCommsDriver::isConnected() const
    {
        /**
         * NOTE: This is a little bit iffy as the interrupt service routine may
         * preempt this kernel thread method. However, we do not want to enforce exclusive
         * access to m_state because this would mean blocking the interrupt
         * service routine!
         */
        return (m_state == eCONFIGURED);
    }
   
    bool UsbPeripheralCommsDriver::isFull() const
    {
        return false;
    }
   
    bool UsbPeripheralCommsDriver::isEmpty() const
    {
        Logger::logSoftwareException(
            MODULE_NAME,
            "isEmpty",
            "Invalid use");
   
        return false;
    }
   
    bool UsbPeripheralCommsDriver::send(const FastDataPacket& messageData)
    {
        /**
         * NOTE: This method is called by the kernel thread. We must pass
         * the message to the interrupt service routine in a safe manner.
         */
       
        bool result = false;
   
        uint16_t endpoint1InMaxPacketSize = 0;
       
        if (m_operatingSpeed == eFULL_SPEED)
        {
            endpoint1InMaxPacketSize  = ENDPOINT_1_IN_MAX_PACKET_SIZE_FULL_SPEED;       
        }
        else // (m_operatingSpeed == eHIGH_SPEED)
        {
            endpoint1InMaxPacketSize  = ENDPOINT_1_IN_MAX_PACKET_SIZE_HIGH_SPEED;       
        }
       
        /**
         * NOTE: Any method to broadcast messages larger than endpoint1InMaxPacketSize through
         * sending multiple messages should be implemented here.
         * Note that when doing this the mailbox size should probably be increased to at least 1024 x 64.
         */   
       
        const size_t MESSAGE_LENGTH = messageData.length();
        if (MESSAGE_LENGTH <= endpoint1InMaxPacketSize)
        {  
            const uint16_t BYTES_TO_SEND = static_cast<uint16_t>(MESSAGE_LENGTH);
   
            Lock lock(m_transmitMutex);
           
            m_transmitMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_LO_INDEX] = static_cast<uint8_t>((BYTES_TO_SEND                ) & UINT16_MASK_BYTE_0);
            m_transmitMailboxDataBuffer[MAILBOX_MESSAGE_LENGTH_FIELD_HI_INDEX] = static_cast<uint8_t>((BYTES_TO_SEND >> BITS_IN_BYTE) & UINT16_MASK_BYTE_0);
   
            const unsigned char* restrict messageDataDataPtr = messageData.data();
            unsigned char* restrict transmitMailboxDataBufferPtr = m_transmitMailboxDataBuffer;
            for (size_t index = 0; index < MESSAGE_LENGTH; ++index)
            {
                *transmitMailboxDataBufferPtr++ = *messageDataDataPtr++;
            }
                                                   
            const bool MAILBOX_POST_RESULT = MBX_post(m_transmitMailboxHandle,
                                                      m_transmitMailboxDataBuffer,
                                                      SYS_FOREVER);
                                                     
            if (!MAILBOX_POST_RESULT)
            {
                LOG_printf(&usbOtgLog, "%s", FIRMWARE_ERROR_USB_TRANSMIT_MAILBOX_FULL);
            }
            //else do nothing
   
            result = MAILBOX_POST_RESULT;   
        }
        else
        {
            result = false;
    #if !defined (LOGGER_DISABLED)
            Logger::logSoftwareException(
                MODULE_NAME,
                "transmitMessage",
                "Sending messages larger than wMaxPacketSize (EP1 IN) for the current operating speed, is currently not supported.");
    #endif
        }
       
        return result;
    }
   
    bool UsbPeripheralCommsDriver::send(std::auto_ptr<FastDataPacket> messageData)
    {
        Logger::logSoftwareException(
            MODULE_NAME,
            "send(auto_ptr)",
            "Invalid use");
   
        return false;
    }
   
    bool UsbPeripheralCommsDriver::sendASAP(const FastDataPacket& messageData)
    {
        return send(messageData);
    }
   
    bool UsbPeripheralCommsDriver::sendASAP(std::auto_ptr<FastDataPacket> messageData)
    {
        Logger::logSoftwareException(
            MODULE_NAME,
            "sendasap(auto_ptr)",
            "Invalid use");
   
        return false;
    }
   
    void UsbPeripheralCommsDriver::performShutdown(void)
    {
    }
   
    void UsbPeripheralCommsDriver::extractOperatingSpeed()
    {
        if (CSL_FEXT(USB0_REGS_PTR->POWER, USB_OTG_POWER_HSMODE))
        {
            m_operatingSpeed = eHIGH_SPEED;     
        }
        else
        {
            m_operatingSpeed = eFULL_SPEED;
        }
    }
   
    }
   
    extern "C" void serviceUsb0Interrupt(void)
    {
        LOG_printf(&trace, "BEG ISR USB0");
   
        usb0InterruptCounter++;
           
        Model::UsbPeripheralCommsDriver* activeUsbPeripheralCommsDriverPtr =
            Model::Model::getUsbPeripheralCommsDriverInstancePtr();
           
        if (activeUsbPeripheralCommsDriverPtr!=0)
        {
            activeUsbPeripheralCommsDriverPtr->serviceInterrupt();
        }
        //else do nothing
   
        LOG_printf(&trace, "END ISR USB0");
    }

  • Note that I have added a minor modification to the code which ignores any RESET_BABBLE interrupt except the first one and with this the device is able to enumerate without any problems in high-speed. Clearly this makes the first itemised point of my previous point all the more relevant, i.e.:

    Mark K said:
    One possible avenue of investigation for me is the mention of extraneous reset interrupts in the C6748's sillicon errata (see advisory 2.1.3 of sprz303d). By adding various logs throughout our driver I've observed that I indeed get quite a few reset interrupts. Remarkably, upon receiving any of these interrupts, POWER[RESET] is actually low (see 4.22 of sprufm9h), indicating reset signalling is no longer present. I was under the impression that reset signalling was in the order of tens of milliseconds, so I am a little surprised at this result. Any clues as to what is going on would be appreciated.

    Obviously the "hack" of not responding to resets interrupts is not great because genuine resets may arrive at any point in time. I would appreciate it if someone could clarify Advisory 2.1.3 of sprz303d, preferably in relation to my code and preferably bearing in mind that upon receiving any RESET_BABBLE interrupt the POWER[RESET] is 0! This seems in direct contradiction with the advisory!

    Kind regards,

    Mark

  • Mark,

          Have you analyzed the USB traffic with an protocol analyzer? If so - can you include the capture?

  • Hi Draw,

    I don't have a proper (hardware) analyser available to me, nor can I run, say, wireshark on the host because of the limited nature of the embedded version of Linux we are running. I may be able to provide wireshark logs with an alternative host if it helps.

    Kind regards,

    Mark

  • Here is a Wireshark log for a normal run (resulting in high speed). There seem to be many PORT_RESET's:


    No.     Time        Source                Destination           Protocol Info   
          1 0.000000    1.1                   host                  USB      URB_INTERRUPT out   
       
    Frame 1: 50 bytes on wire (400 bits), 50 bytes captured (400 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.944712000 GMT   
        Epoch Time: 1321352908.944712000 seconds   
        [Time delta from previous captured frame: 0.000000000 seconds]   
        [Time delta from previous displayed frame: 0.000000000 seconds]   
        [Time since reference or first frame: 0.000000000 seconds]   
        Frame Number: 1   
        Frame Length: 50 bytes (400 bits)   
        Capture Length: 50 bytes (400 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xffffffffc2943840   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_INTERRUPT out (0x01)   
        Endpoint: 0x81   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352908   
        URB usec: 944712   
        URB status: Success (0)   
        URB length [bytes]: 2   
        Data length [bytes]: 2   
        Leftover Capture Data: 8000   
       
    No.     Time        Source                Destination           Protocol Info   
          2 0.003063    host                  1.1                   USB      URB_INTERRUPT out[Packet size limited during capture]   
       
    Frame 2: 50 bytes on wire (400 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947775000 GMT   
        Epoch Time: 1321352908.947775000 seconds   
        [Time delta from previous captured frame: 0.003063000 seconds]   
        [Time delta from previous displayed frame: 0.003063000 seconds]   
        [Time since reference or first frame: 0.003063000 seconds]   
        Frame Number: 2   
        Frame Length: 50 bytes (400 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xffffffffc2943840   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_INTERRUPT out (0x01)   
        Endpoint: 0x81   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 947775   
        URB status: Success (0)   
        URB length [bytes]: 2   
        Data length [bytes]: 0   
        [Response in: 19]   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
          3 0.003072    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 3: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947784000 GMT   
        Epoch Time: 1321352908.947784000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 0.003072000 seconds]   
        Frame Number: 3   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abd40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 947784   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 4]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
          4 0.003084    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 4: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947796000 GMT   
        Epoch Time: 1321352908.947796000 seconds   
        [Time delta from previous captured frame: 0.000012000 seconds]   
        [Time delta from previous displayed frame: 0.000012000 seconds]   
        [Time since reference or first frame: 0.003084000 seconds]   
        Frame Number: 4   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abd40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352908   
        URB usec: 947796   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 3]   
        [Time from request: 0.000012000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
          5 0.003092    host                  1.0                   USBHUB   CLEAR_FEATURE Request   
       
    Frame 5: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947804000 GMT   
        Epoch Time: 1321352908.947804000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 0.003092000 seconds]   
        Frame Number: 5   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abd40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 947804   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 6]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: CLEAR_FEATURE (0x01)   
        wValue: 0x0010   
            PortFeatureSelector: C_PORT_CONNECTION (16)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
       
    No.     Time        Source                Destination           Protocol Info   
          6 0.003100    1.0                   host                  USBHUB   CLEAR_FEATURE Response   
       
    Frame 6: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947812000 GMT   
        Epoch Time: 1321352908.947812000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 0.003100000 seconds]   
        Frame Number: 6   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abd40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 947812   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 5]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
          7 0.003107    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 7: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947819000 GMT   
        Epoch Time: 1321352908.947819000 seconds   
        [Time delta from previous captured frame: 0.000007000 seconds]   
        [Time delta from previous displayed frame: 0.000007000 seconds]   
        [Time since reference or first frame: 0.003107000 seconds]   
        Frame Number: 7   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab2c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 947819   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 8]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
          8 0.003115    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 8: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.947827000 GMT   
        Epoch Time: 1321352908.947827000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 0.003115000 seconds]   
        Frame Number: 8   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab2c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352908   
        URB usec: 947827   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 7]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
          9 0.027978    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 9: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.972690000 GMT   
        Epoch Time: 1321352908.972690000 seconds   
        [Time delta from previous captured frame: 0.024863000 seconds]   
        [Time delta from previous displayed frame: 0.024863000 seconds]   
        [Time since reference or first frame: 0.027978000 seconds]   
        Frame Number: 9   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 972690   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 10]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         10 0.027987    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 10: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.972699000 GMT   
        Epoch Time: 1321352908.972699000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 0.027987000 seconds]   
        Frame Number: 10   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352908   
        URB usec: 972699   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 9]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         11 0.053970    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 11: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.998682000 GMT   
        Epoch Time: 1321352908.998682000 seconds   
        [Time delta from previous captured frame: 0.025983000 seconds]   
        [Time delta from previous displayed frame: 0.025983000 seconds]   
        [Time since reference or first frame: 0.053970000 seconds]   
        Frame Number: 11   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352908   
        URB usec: 998682   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 12]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         12 0.053979    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 12: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:28.998691000 GMT   
        Epoch Time: 1321352908.998691000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 0.053979000 seconds]   
        Frame Number: 12   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352908   
        URB usec: 998691   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 11]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         13 0.079966    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 13: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.024678000 GMT   
        Epoch Time: 1321352909.024678000 seconds   
        [Time delta from previous captured frame: 0.025987000 seconds]   
        [Time delta from previous displayed frame: 0.025987000 seconds]   
        [Time since reference or first frame: 0.079966000 seconds]   
        Frame Number: 13   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352909   
        URB usec: 24678   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 14]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         14 0.081055    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 14: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.025767000 GMT   
        Epoch Time: 1321352909.025767000 seconds   
        [Time delta from previous captured frame: 0.001089000 seconds]   
        [Time delta from previous displayed frame: 0.001089000 seconds]   
        [Time since reference or first frame: 0.081055000 seconds]   
        Frame Number: 14   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab6c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352909   
        URB usec: 25767   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 13]   
        [Time from request: 0.001089000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         15 0.106222    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 15: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.050934000 GMT   
        Epoch Time: 1321352909.050934000 seconds   
        [Time delta from previous captured frame: 0.025167000 seconds]   
        [Time delta from previous displayed frame: 0.025167000 seconds]   
        [Time since reference or first frame: 0.106222000 seconds]   
        Frame Number: 15   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff06df140   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352909   
        URB usec: 50934   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 16]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         16 0.106234    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 16: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.050946000 GMT   
        Epoch Time: 1321352909.050946000 seconds   
        [Time delta from previous captured frame: 0.000012000 seconds]   
        [Time delta from previous displayed frame: 0.000012000 seconds]   
        [Time since reference or first frame: 0.106234000 seconds]   
        Frame Number: 16   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff06df140   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352909   
        URB usec: 50946   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 15]   
        [Time from request: 0.000012000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         17 0.106242    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 17: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.050954000 GMT   
        Epoch Time: 1321352909.050954000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 0.106242000 seconds]   
        Frame Number: 17   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff06df140   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352909   
        URB usec: 50954   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 18]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 8   
            Port: 8   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         18 0.106250    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 18: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:29.050962000 GMT   
        Epoch Time: 1321352909.050962000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 0.106250000 seconds]   
        Frame Number: 18   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff06df140   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352909   
        URB usec: 50962   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 17]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         19 6.499101    1.1                   host                  USB      URB_INTERRUPT out   
       
    Frame 19: 50 bytes on wire (400 bits), 50 bytes captured (400 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443813000 GMT   
        Epoch Time: 1321352915.443813000 seconds   
        [Time delta from previous captured frame: 6.392851000 seconds]   
        [Time delta from previous displayed frame: 6.392851000 seconds]   
        [Time since reference or first frame: 6.499101000 seconds]   
        Frame Number: 19   
        Frame Length: 50 bytes (400 bits)   
        Capture Length: 50 bytes (400 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xffffffffc2943840   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_INTERRUPT out (0x01)   
        Endpoint: 0x81   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 443813   
        URB status: Success (0)   
        URB length [bytes]: 2   
        Data length [bytes]: 2   
        [Request in: 2]   
        [Time from request: 6.496038000 seconds]   
        Leftover Capture Data: 8000   
       
    No.     Time        Source                Destination           Protocol Info   
         20 6.499140    host                  1.1                   USB      URB_INTERRUPT out[Packet size limited during capture]   
       
    Frame 20: 50 bytes on wire (400 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443852000 GMT   
        Epoch Time: 1321352915.443852000 seconds   
        [Time delta from previous captured frame: 0.000039000 seconds]   
        [Time delta from previous displayed frame: 0.000039000 seconds]   
        [Time since reference or first frame: 6.499140000 seconds]   
        Frame Number: 20   
        Frame Length: 50 bytes (400 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xffffffffc2943840   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_INTERRUPT out (0x01)   
        Endpoint: 0x81   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 443852   
        URB status: Success (0)   
        URB length [bytes]: 2   
        Data length [bytes]: 0   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         21 6.499148    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 21: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443860000 GMT   
        Epoch Time: 1321352915.443860000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.499148000 seconds]   
        Frame Number: 21   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 443860   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 22]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         22 6.499157    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 22: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443869000 GMT   
        Epoch Time: 1321352915.443869000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.499157000 seconds]   
        Frame Number: 22   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 443869   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 21]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         23 6.499165    host                  1.0                   USBHUB   CLEAR_FEATURE Request   
       
    Frame 23: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443877000 GMT   
        Epoch Time: 1321352915.443877000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.499165000 seconds]   
        Frame Number: 23   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 443877   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 24]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: CLEAR_FEATURE (0x01)   
        wValue: 0x0010   
            PortFeatureSelector: C_PORT_CONNECTION (16)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
       
    No.     Time        Source                Destination           Protocol Info   
         24 6.499173    1.0                   host                  USBHUB   CLEAR_FEATURE Response   
       
    Frame 24: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443885000 GMT   
        Epoch Time: 1321352915.443885000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.499173000 seconds]   
        Frame Number: 24   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 443885   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 23]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         25 6.499180    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 25: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443892000 GMT   
        Epoch Time: 1321352915.443892000 seconds   
        [Time delta from previous captured frame: 0.000007000 seconds]   
        [Time delta from previous displayed frame: 0.000007000 seconds]   
        [Time since reference or first frame: 6.499180000 seconds]   
        Frame Number: 25   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 443892   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 26]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         26 6.499188    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 26: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.443900000 GMT   
        Epoch Time: 1321352915.443900000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.499188000 seconds]   
        Frame Number: 26   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 443900   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 25]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         27 6.525081    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 27: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.469793000 GMT   
        Epoch Time: 1321352915.469793000 seconds   
        [Time delta from previous captured frame: 0.025893000 seconds]   
        [Time delta from previous displayed frame: 0.025893000 seconds]   
        [Time since reference or first frame: 6.525081000 seconds]   
        Frame Number: 27   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 469793   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 28]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         28 6.525091    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 28: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.469803000 GMT   
        Epoch Time: 1321352915.469803000 seconds   
        [Time delta from previous captured frame: 0.000010000 seconds]   
        [Time delta from previous displayed frame: 0.000010000 seconds]   
        [Time since reference or first frame: 6.525091000 seconds]   
        Frame Number: 28   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 469803   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 27]   
        [Time from request: 0.000010000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         29 6.551083    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 29: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.495795000 GMT   
        Epoch Time: 1321352915.495795000 seconds   
        [Time delta from previous captured frame: 0.025992000 seconds]   
        [Time delta from previous displayed frame: 0.025992000 seconds]   
        [Time since reference or first frame: 6.551083000 seconds]   
        Frame Number: 29   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 495795   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 30]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         30 6.551093    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 30: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.495805000 GMT   
        Epoch Time: 1321352915.495805000 seconds   
        [Time delta from previous captured frame: 0.000010000 seconds]   
        [Time delta from previous displayed frame: 0.000010000 seconds]   
        [Time since reference or first frame: 6.551093000 seconds]   
        Frame Number: 30   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 495805   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 29]   
        [Time from request: 0.000010000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         31 6.577080    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 31: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.521792000 GMT   
        Epoch Time: 1321352915.521792000 seconds   
        [Time delta from previous captured frame: 0.025987000 seconds]   
        [Time delta from previous displayed frame: 0.025987000 seconds]   
        [Time since reference or first frame: 6.577080000 seconds]   
        Frame Number: 31   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 521792   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 32]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         32 6.577090    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 32: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.521802000 GMT   
        Epoch Time: 1321352915.521802000 seconds   
        [Time delta from previous captured frame: 0.000010000 seconds]   
        [Time delta from previous displayed frame: 0.000010000 seconds]   
        [Time since reference or first frame: 6.577090000 seconds]   
        Frame Number: 32   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 521802   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 31]   
        [Time from request: 0.000010000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         33 6.603085    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 33: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.547797000 GMT   
        Epoch Time: 1321352915.547797000 seconds   
        [Time delta from previous captured frame: 0.025995000 seconds]   
        [Time delta from previous displayed frame: 0.025995000 seconds]   
        [Time since reference or first frame: 6.603085000 seconds]   
        Frame Number: 33   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 547797   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 34]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         34 6.603094    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 34: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.547806000 GMT   
        Epoch Time: 1321352915.547806000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.603094000 seconds]   
        Frame Number: 34   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 547806   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 33]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         35 6.603101    host                  1.0                   USBHUB   SET_FEATURE Request   
       
    Frame 35: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.547813000 GMT   
        Epoch Time: 1321352915.547813000 seconds   
        [Time delta from previous captured frame: 0.000007000 seconds]   
        [Time delta from previous displayed frame: 0.000007000 seconds]   
        [Time since reference or first frame: 6.603101000 seconds]   
        Frame Number: 35   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 547813   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 36]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: SET_FEATURE (0x03)   
        wValue: 0x0004   
            PortFeatureSelector: PORT_RESET (4)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
       
    No.     Time        Source                Destination           Protocol Info   
         36 6.603109    1.0                   host                  USBHUB   SET_FEATURE Response   
       
    Frame 36: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.547821000 GMT   
        Epoch Time: 1321352915.547821000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.603109000 seconds]   
        Frame Number: 36   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 547821   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 35]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         37 6.654347    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 37: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.599059000 GMT   
        Epoch Time: 1321352915.599059000 seconds   
        [Time delta from previous captured frame: 0.051238000 seconds]   
        [Time delta from previous displayed frame: 0.051238000 seconds]   
        [Time since reference or first frame: 6.654347000 seconds]   
        Frame Number: 37   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 599059   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 38]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         38 6.654357    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 38: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.599069000 GMT   
        Epoch Time: 1321352915.599069000 seconds   
        [Time delta from previous captured frame: 0.000010000 seconds]   
        [Time delta from previous displayed frame: 0.000010000 seconds]   
        [Time since reference or first frame: 6.654357000 seconds]   
        Frame Number: 38   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 599069   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 37]   
        [Time from request: 0.000010000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         39 6.705093    host                  1.0                   USBHUB   CLEAR_FEATURE Request   
       
    Frame 39: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649805000 GMT   
        Epoch Time: 1321352915.649805000 seconds   
        [Time delta from previous captured frame: 0.050736000 seconds]   
        [Time delta from previous displayed frame: 0.050736000 seconds]   
        [Time since reference or first frame: 6.705093000 seconds]   
        Frame Number: 39   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 649805   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 40]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: CLEAR_FEATURE (0x01)   
        wValue: 0x0014   
            PortFeatureSelector: C_PORT_RESET (20)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
           
    No.     Time        Source                Destination           Protocol Info   
         40 6.705102    1.0                   host                  USBHUB   CLEAR_FEATURE Response   
       
    Frame 40: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649814000 GMT   
        Epoch Time: 1321352915.649814000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.705102000 seconds]   
        Frame Number: 40   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 649814   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 39]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         41 6.705109    host                  0.0                   USB      GET DESCRIPTOR Request DEVICE[Packet size limited during capture]   
       
    Frame 41: 112 bytes on wire (896 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649821000 GMT   
        Epoch Time: 1321352915.649821000 seconds   
        [Time delta from previous captured frame: 0.000007000 seconds]   
        [Time delta from previous displayed frame: 0.000007000 seconds]   
        [Time since reference or first frame: 6.705109000 seconds]   
        Frame Number: 41   
        Frame Length: 112 bytes (896 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 0   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 649821   
        URB status: Success (0)   
        URB length [bytes]: 64   
        Data length [bytes]: 0   
        [Response in: 42]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: DEVICE (1)   
            Language Id: no language specified (0x0000)   
            wLength: 64   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         42 6.705227    0.0                   host                  USB      GET DESCRIPTOR Response DEVICE   
       
    Frame 42: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649939000 GMT   
        Epoch Time: 1321352915.649939000 seconds   
        [Time delta from previous captured frame: 0.000118000 seconds]   
        [Time delta from previous displayed frame: 0.000118000 seconds]   
        [Time since reference or first frame: 6.705227000 seconds]   
        Frame Number: 42   
        Frame Length: 66 bytes (528 bits)   
        Capture Length: 66 bytes (528 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 0   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 649939   
        URB status: Success (0)   
        URB length [bytes]: 18   
        Data length [bytes]: 18   
        [Request in: 41]   
        [Time from request: 0.000118000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
        DEVICE DESCRIPTOR   
            bLength: 18   
            bDescriptorType: DEVICE (1)   
            bcdUSB: 0x0200   
            bDeviceClass: 0   
            bDeviceSubClass: 0   
            bDeviceProtocol: 0   
            bMaxPacketSize0: 64   
            idVendor: 0x04d8   
            idProduct: 0xfc99   
            bcdDevice: 0x0000   
            iManufacturer: 1   
            iProduct: 2   
            iSerialNumber: 3   
            bNumConfigurations: 1   
       
    No.     Time        Source                Destination           Protocol Info   
         43 6.705235    host                  1.0                   USBHUB   SET_FEATURE Request   
       
    Frame 43: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649947000 GMT   
        Epoch Time: 1321352915.649947000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.705235000 seconds]   
        Frame Number: 43   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 649947   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 44]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: SET_FEATURE (0x03)   
        wValue: 0x0004   
            PortFeatureSelector: PORT_RESET (4)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
       
    No.     Time        Source                Destination           Protocol Info   
         44 6.705243    1.0                   host                  USBHUB   SET_FEATURE Response   
       
    Frame 44: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.649955000 GMT   
        Epoch Time: 1321352915.649955000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.705243000 seconds]   
        Frame Number: 44   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 649955   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 43]   
        [Time from request: 0.000008000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         45 6.756346    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 45: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.701058000 GMT   
        Epoch Time: 1321352915.701058000 seconds   
        [Time delta from previous captured frame: 0.051103000 seconds]   
        [Time delta from previous displayed frame: 0.051103000 seconds]   
        [Time since reference or first frame: 6.756346000 seconds]   
        Frame Number: 45   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 701058   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 46]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 7   
            Port: 7   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         46 6.756355    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 46: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.701067000 GMT   
        Epoch Time: 1321352915.701067000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.756355000 seconds]   
        Frame Number: 46   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 701067   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 45]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         47 6.807087    host                  1.0                   USBHUB   CLEAR_FEATURE Request   
       
    Frame 47: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.751799000 GMT   
        Epoch Time: 1321352915.751799000 seconds   
        [Time delta from previous captured frame: 0.050732000 seconds]   
        [Time delta from previous displayed frame: 0.050732000 seconds]   
        [Time since reference or first frame: 6.807087000 seconds]   
        Frame Number: 47   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 751799   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 48]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x23   
                0... .... = Direction: Host-to-device   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: CLEAR_FEATURE (0x01)   
        wValue: 0x0014   
            PortFeatureSelector: C_PORT_RESET (20)   
        wIndex: 7   
            Port: 7   
            PortSelector: 0   
        wLength: 0   
            (zero): 0   
       
    No.     Time        Source                Destination           Protocol Info   
         48 6.807096    1.0                   host                  USBHUB   CLEAR_FEATURE Response   
       
    Frame 48: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.751808000 GMT   
        Epoch Time: 1321352915.751808000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.807096000 seconds]   
        Frame Number: 48   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 751808   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 47]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         49 6.807103    host                  0.0                   USB      SET ADDRESS Request   
       
    Frame 49: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.751815000 GMT   
        Epoch Time: 1321352915.751815000 seconds   
        [Time delta from previous captured frame: 0.000007000 seconds]   
        [Time delta from previous displayed frame: 0.000007000 seconds]   
        [Time since reference or first frame: 6.807103000 seconds]   
        Frame Number: 49   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 0   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 751815   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 50]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0x00   
                0... .... = Direction: Host-to-device   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: SET ADDRESS (5)   
            Device: 22   
            wIndex: 0   
            wLength: 0   
       
    No.     Time        Source                Destination           Protocol Info   
         50 6.807205    0.0                   host                  USB      SET ADDRESS Response   
       
    Frame 50: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.751917000 GMT   
        Epoch Time: 1321352915.751917000 seconds   
        [Time delta from previous captured frame: 0.000102000 seconds]   
        [Time delta from previous displayed frame: 0.000102000 seconds]   
        [Time since reference or first frame: 6.807205000 seconds]   
        Frame Number: 50   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 0   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 751917   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 49]   
        [Time from request: 0.000102000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         51 6.819080    host                  22.0                  USB      GET DESCRIPTOR Request DEVICE[Packet size limited during capture]   
       
    Frame 51: 66 bytes on wire (528 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.763792000 GMT   
        Epoch Time: 1321352915.763792000 seconds   
        [Time delta from previous captured frame: 0.011875000 seconds]   
        [Time delta from previous displayed frame: 0.011875000 seconds]   
        [Time since reference or first frame: 6.819080000 seconds]   
        Frame Number: 51   
        Frame Length: 66 bytes (528 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 763792   
        URB status: Success (0)   
        URB length [bytes]: 18   
        Data length [bytes]: 0   
        [Response in: 52]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: DEVICE (1)   
            Language Id: no language specified (0x0000)   
            wLength: 18   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         52 6.819205    22.0                  host                  USB      GET DESCRIPTOR Response DEVICE   
       
    Frame 52: 66 bytes on wire (528 bits), 66 bytes captured (528 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.763917000 GMT   
        Epoch Time: 1321352915.763917000 seconds   
        [Time delta from previous captured frame: 0.000125000 seconds]   
        [Time delta from previous displayed frame: 0.000125000 seconds]   
        [Time since reference or first frame: 6.819205000 seconds]   
        Frame Number: 52   
        Frame Length: 66 bytes (528 bits)   
        Capture Length: 66 bytes (528 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 763917   
        URB status: Success (0)   
        URB length [bytes]: 18   
        Data length [bytes]: 18   
        [Request in: 51]   
        [Time from request: 0.000125000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        DEVICE DESCRIPTOR   
            bLength: 18   
            bDescriptorType: DEVICE (1)   
            bcdUSB: 0x0200   
            bDeviceClass: 0   
            bDeviceSubClass: 0   
            bDeviceProtocol: 0   
            bMaxPacketSize0: 64   
            idVendor: 0x04d8   
            idProduct: 0xfc99   
            bcdDevice: 0x0000   
            iManufacturer: 1   
            iProduct: 2   
            iSerialNumber: 3   
            bNumConfigurations: 1   
       
    No.     Time        Source                Destination           Protocol Info   
         53 6.819214    host                  22.0                  USB      GET DESCRIPTOR Request CONFIGURATION[Packet size limited during capture]   
       
    Frame 53: 57 bytes on wire (456 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.763926000 GMT   
        Epoch Time: 1321352915.763926000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.819214000 seconds]   
        Frame Number: 53   
        Frame Length: 57 bytes (456 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 763926   
        URB status: Success (0)   
        URB length [bytes]: 9   
        Data length [bytes]: 0   
        [Response in: 54]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: CONFIGURATION (2)   
            Language Id: no language specified (0x0000)   
            wLength: 9   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         54 6.819327    22.0                  host                  USB      GET DESCRIPTOR Response CONFIGURATION   
       
    Frame 54: 57 bytes on wire (456 bits), 57 bytes captured (456 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764039000 GMT   
        Epoch Time: 1321352915.764039000 seconds   
        [Time delta from previous captured frame: 0.000113000 seconds]   
        [Time delta from previous displayed frame: 0.000113000 seconds]   
        [Time since reference or first frame: 6.819327000 seconds]   
        Frame Number: 54   
        Frame Length: 57 bytes (456 bits)   
        Capture Length: 57 bytes (456 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764039   
        URB status: Success (0)   
        URB length [bytes]: 9   
        Data length [bytes]: 9   
        [Request in: 53]   
        [Time from request: 0.000113000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        CONFIGURATION DESCRIPTOR   
            bLength: 9   
            bDescriptorType: CONFIGURATION (2)   
            wTotalLength: 32   
            bNumInterfaces: 1   
            bConfigurationValue: 1   
            iConfiguration: 5   
            Configuration bmAttributes: 0xc0  SELF-POWERED  NO REMOTE-WAKEUP   
                1... .... = Must be 1: Must be 1 for USB 1.1 and higher   
                .1.. .... = Self-Powered: This device is SELF-POWERED   
                ..0. .... = Remote Wakeup: This device does NOT support remote wakeup   
            bMaxPower: 50  (100mA)   
       
    No.     Time        Source                Destination           Protocol Info   
         55 6.819335    host                  22.0                  USB      GET DESCRIPTOR Request CONFIGURATION[Packet size limited during capture]   
       
    Frame 55: 80 bytes on wire (640 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764047000 GMT   
        Epoch Time: 1321352915.764047000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.819335000 seconds]   
        Frame Number: 55   
        Frame Length: 80 bytes (640 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764047   
        URB status: Success (0)   
        URB length [bytes]: 32   
        Data length [bytes]: 0   
        [Response in: 56]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: CONFIGURATION (2)   
            Language Id: no language specified (0x0000)   
            wLength: 32   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         56 6.819453    22.0                  host                  USB      GET DESCRIPTOR Response CONFIGURATION   
       
    Frame 56: 80 bytes on wire (640 bits), 80 bytes captured (640 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764165000 GMT   
        Epoch Time: 1321352915.764165000 seconds   
        [Time delta from previous captured frame: 0.000118000 seconds]   
        [Time delta from previous displayed frame: 0.000118000 seconds]   
        [Time since reference or first frame: 6.819453000 seconds]   
        Frame Number: 56   
        Frame Length: 80 bytes (640 bits)   
        Capture Length: 80 bytes (640 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abf40   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764165   
        URB status: Success (0)   
        URB length [bytes]: 32   
        Data length [bytes]: 32   
        [Request in: 55]   
        [Time from request: 0.000118000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        CONFIGURATION DESCRIPTOR   
            bLength: 9   
            bDescriptorType: CONFIGURATION (2)   
            wTotalLength: 32   
            bNumInterfaces: 1   
            bConfigurationValue: 1   
            iConfiguration: 5   
            Configuration bmAttributes: 0xc0  SELF-POWERED  NO REMOTE-WAKEUP   
                1... .... = Must be 1: Must be 1 for USB 1.1 and higher   
                .1.. .... = Self-Powered: This device is SELF-POWERED   
                ..0. .... = Remote Wakeup: This device does NOT support remote wakeup   
            bMaxPower: 50  (100mA)   
        INTERFACE DESCRIPTOR   
            bLength: 9   
            bDescriptorType: INTERFACE (4)   
            bInterfaceNumber: 0   
            bAlternateSetting: 0   
            bNumEndpoints: 2   
            bInterfaceClass: VENDOR_SPECIFIC (0xff)   
            bInterfaceSubClass: 0xff   
            bInterfaceProtocol: 0xff   
            iInterface: 6   
        ENDPOINT DESCRIPTOR   
            bLength: 7   
            bDescriptorType: ENDPOINT (5)   
            bEndpointAddress: 0x81  IN  Endpoint:1   
                1... .... = Direction: IN Endpoint   
                .... 0001 = Endpoint Number: 0x01   
            bmAttributes: 0x03   
                .... ..11 = Transfertype: Interrupt-Transfer (0x03)   
                .... 00.. = Synchronisationtype: No Sync (0x00)   
                ..00 .... = Behaviourtype: Data-Endpoint (0x00)   
            wMaxPacketSize: 1024   
            bInterval: 4   
        ENDPOINT DESCRIPTOR   
            bLength: 7   
            bDescriptorType: ENDPOINT (5)   
            bEndpointAddress: 0x01  OUT  Endpoint:1   
                0... .... = Direction: OUT Endpoint   
                .... 0001 = Endpoint Number: 0x01   
            bmAttributes: 0x03   
                .... ..11 = Transfertype: Interrupt-Transfer (0x03)   
                .... 00.. = Synchronisationtype: No Sync (0x00)   
                ..00 .... = Behaviourtype: Data-Endpoint (0x00)   
            wMaxPacketSize: 1024   
            bInterval: 1   
       
    No.     Time        Source                Destination           Protocol Info   
         57 6.819462    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 57: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764174000 GMT   
        Epoch Time: 1321352915.764174000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.819462000 seconds]   
        Frame Number: 57   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764174   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 58]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: STRING (3)   
            Language Id: no language specified (0x0000)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         58 6.819576    22.0                  host                  USB      GET DESCRIPTOR Response STRING   
       
    Frame 58: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764288000 GMT   
        Epoch Time: 1321352915.764288000 seconds   
        [Time delta from previous captured frame: 0.000114000 seconds]   
        [Time delta from previous displayed frame: 0.000114000 seconds]   
        [Time since reference or first frame: 6.819576000 seconds]   
        Frame Number: 58   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764288   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 57]   
        [Time from request: 0.000114000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 4   
            bDescriptorType: STRING (3)   
            wLANGID: English (United Kingdom) (0x0809)   
       
    No.     Time        Source                Destination           Protocol Info   
         59 6.819584    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 59: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764296000 GMT   
        Epoch Time: 1321352915.764296000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.819584000 seconds]   
        Frame Number: 59   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764296   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 60]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x02   
            bDescriptorType: STRING (3)   
            Language Id: English (United Kingdom) (0x0809)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         60 6.819703    22.0                  host                  USB      GET DESCRIPTOR Response STRING[Packet size limited during capture]   
       
    Frame 60: 138 bytes on wire (1104 bits), 80 bytes captured (640 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764415000 GMT   
        Epoch Time: 1321352915.764415000 seconds   
        [Time delta from previous captured frame: 0.000119000 seconds]   
        [Time delta from previous displayed frame: 0.000119000 seconds]   
        [Time since reference or first frame: 6.819703000 seconds]   
        Frame Number: 60   
        Frame Length: 138 bytes (1104 bits)   
        Capture Length: 80 bytes (640 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764415   
        URB status: Success (0)   
        URB length [bytes]: 90   
        Data length [bytes]: 32   
        [Request in: 59]   
        [Time from request: 0.000119000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 90   
            bDescriptorType: STRING (3)   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         61 6.819712    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 61: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764424000 GMT   
        Epoch Time: 1321352915.764424000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.819712000 seconds]   
        Frame Number: 61   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764424   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 62]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x01   
            bDescriptorType: STRING (3)   
            Language Id: English (United Kingdom) (0x0809)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         62 6.819829    22.0                  host                  USB      GET DESCRIPTOR Response STRING[Packet size limited during capture]   
       
    Frame 62: 96 bytes on wire (768 bits), 80 bytes captured (640 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764541000 GMT   
        Epoch Time: 1321352915.764541000 seconds   
        [Time delta from previous captured frame: 0.000117000 seconds]   
        [Time delta from previous displayed frame: 0.000117000 seconds]   
        [Time since reference or first frame: 6.819829000 seconds]   
        Frame Number: 62   
        Frame Length: 96 bytes (768 bits)   
        Capture Length: 80 bytes (640 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764541   
        URB status: Success (0)   
        URB length [bytes]: 48   
        Data length [bytes]: 32   
        [Request in: 61]   
        [Time from request: 0.000117000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 48   
            bDescriptorType: STRING (3)   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         63 6.819837    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 63: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764549000 GMT   
        Epoch Time: 1321352915.764549000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.819837000 seconds]   
        Frame Number: 63   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764549   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 64]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x03   
            bDescriptorType: STRING (3)   
            Language Id: English (United Kingdom) (0x0809)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         64 6.819952    22.0                  host                  USB      GET DESCRIPTOR Response STRING   
       
    Frame 64: 64 bytes on wire (512 bits), 64 bytes captured (512 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764664000 GMT   
        Epoch Time: 1321352915.764664000 seconds   
        [Time delta from previous captured frame: 0.000115000 seconds]   
        [Time delta from previous displayed frame: 0.000115000 seconds]   
        [Time since reference or first frame: 6.819952000 seconds]   
        Frame Number: 64   
        Frame Length: 64 bytes (512 bits)   
        Capture Length: 64 bytes (512 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764664   
        URB status: Success (0)   
        URB length [bytes]: 16   
        Data length [bytes]: 16   
        [Request in: 63]   
        [Time from request: 0.000115000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 16   
            bDescriptorType: STRING (3)   
            bString: 1234567   
       
    No.     Time        Source                Destination           Protocol Info   
         65 6.820013    host                  22.0                  USB      SET CONFIGURATION Request   
       
    Frame 65: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764725000 GMT   
        Epoch Time: 1321352915.764725000 seconds   
        [Time delta from previous captured frame: 0.000061000 seconds]   
        [Time delta from previous displayed frame: 0.000061000 seconds]   
        [Time since reference or first frame: 6.820013000 seconds]   
        Frame Number: 65   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764725   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Response in: 66]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x00   
                0... .... = Direction: Host-to-device   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: SET CONFIGURATION (9)   
            bConfigurationValue: 1   
            wIndex: 0   
            wLength: 0   
       
    No.     Time        Source                Destination           Protocol Info   
         66 6.820124    22.0                  host                  USB      SET CONFIGURATION Response   
       
    Frame 66: 48 bytes on wire (384 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764836000 GMT   
        Epoch Time: 1321352915.764836000 seconds   
        [Time delta from previous captured frame: 0.000111000 seconds]   
        [Time delta from previous displayed frame: 0.000111000 seconds]   
        [Time since reference or first frame: 6.820124000 seconds]   
        Frame Number: 66   
        Frame Length: 48 bytes (384 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x00   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764836   
        URB status: Success (0)   
        URB length [bytes]: 0   
        Data length [bytes]: 0   
        [Request in: 65]   
        [Time from request: 0.000111000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         67 6.820132    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 67: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764844000 GMT   
        Epoch Time: 1321352915.764844000 seconds   
        [Time delta from previous captured frame: 0.000008000 seconds]   
        [Time delta from previous displayed frame: 0.000008000 seconds]   
        [Time since reference or first frame: 6.820132000 seconds]   
        Frame Number: 67   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 764844   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 68]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x05   
            bDescriptorType: STRING (3)   
            Language Id: English (United Kingdom) (0x0809)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         68 6.820205    22.0                  host                  USB      GET DESCRIPTOR Response STRING[Packet size limited during capture]   
       
    Frame 68: 98 bytes on wire (784 bits), 80 bytes captured (640 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.764917000 GMT   
        Epoch Time: 1321352915.764917000 seconds   
        [Time delta from previous captured frame: 0.000073000 seconds]   
        [Time delta from previous displayed frame: 0.000073000 seconds]   
        [Time since reference or first frame: 6.820205000 seconds]   
        Frame Number: 68   
        Frame Length: 98 bytes (784 bits)   
        Capture Length: 80 bytes (640 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 764917   
        URB status: Success (0)   
        URB length [bytes]: 50   
        Data length [bytes]: 32   
        [Request in: 67]   
        [Time from request: 0.000073000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 50   
            bDescriptorType: STRING (3)   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         69 6.820436    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 69: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.765148000 GMT   
        Epoch Time: 1321352915.765148000 seconds   
        [Time delta from previous captured frame: 0.000231000 seconds]   
        [Time delta from previous displayed frame: 0.000231000 seconds]   
        [Time since reference or first frame: 6.820436000 seconds]   
        Frame Number: 69   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 765148   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [Response in: 70]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x06   
            bDescriptorType: STRING (3)   
            Language Id: English (United Kingdom) (0x0809)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         70 6.820580    22.0                  host                  USB      GET DESCRIPTOR Response STRING[Packet size limited during capture]   
       
    Frame 70: 84 bytes on wire (672 bits), 80 bytes captured (640 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.765292000 GMT   
        Epoch Time: 1321352915.765292000 seconds   
        [Time delta from previous captured frame: 0.000144000 seconds]   
        [Time delta from previous displayed frame: 0.000144000 seconds]   
        [Time since reference or first frame: 6.820580000 seconds]   
        Frame Number: 70   
        Frame Length: 84 bytes (672 bits)   
        Capture Length: 80 bytes (640 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 765292   
        URB status: Success (0)   
        URB length [bytes]: 36   
        Data length [bytes]: 32   
        [Request in: 69]   
        [Time from request: 0.000144000 seconds]   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        STRING DESCRIPTOR   
            bLength: 36   
            bDescriptorType: STRING (3)   
    [Packet size limited during capture: USB truncated]   
       
    No.     Time        Source                Destination           Protocol Info   
         71 6.820636    host                  1.0                   USBHUB   GET_STATUS Request   
       
    Frame 71: 52 bytes on wire (416 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.765348000 GMT   
        Epoch Time: 1321352915.765348000 seconds   
        [Time delta from previous captured frame: 0.000056000 seconds]   
        [Time delta from previous displayed frame: 0.000056000 seconds]   
        [Time since reference or first frame: 6.820636000 seconds]   
        Frame Number: 71   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352915   
        URB usec: 765348   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 0   
        [Response in: 72]   
        [bInterfaceClass: Unknown (0xffff)]   
        URB setup   
            bmRequestType: 0xa3   
                1... .... = Direction: Device-to-host   
                .01. .... = Type: Class (0x01)   
                ...0 0011 = Recipient: Unknown (0x03)   
        bRequest: GET_STATUS (0x00)   
        wValue: 0x0000   
            (zero): 0   
        wIndex: 8   
            Port: 8   
        wLength: 4   
       
    No.     Time        Source                Destination           Protocol Info   
         72 6.820645    1.0                   host                  USBHUB   GET_STATUS Response   
       
    Frame 72: 52 bytes on wire (416 bits), 52 bytes captured (416 bits)   
        Arrival Time: Nov 15, 2011 10:28:35.765357000 GMT   
        Epoch Time: 1321352915.765357000 seconds   
        [Time delta from previous captured frame: 0.000009000 seconds]   
        [Time delta from previous displayed frame: 0.000009000 seconds]   
        [Time since reference or first frame: 6.820645000 seconds]   
        Frame Number: 72   
        Frame Length: 52 bytes (416 bits)   
        Capture Length: 52 bytes (416 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb:usbhub]   
    USB URB   
        URB id: 0xfffffffff02ab0c0   
        URB type: URB_COMPLETE ('C')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 1   
        URB bus id: 1   
        Device setup request: not relevant ('.')   
        Data: present (0)   
        URB sec: 1321352915   
        URB usec: 765357   
        URB status: Success (0)   
        URB length [bytes]: 4   
        Data length [bytes]: 4   
        [Request in: 71]   
        [Time from request: 0.000009000 seconds]   
        [bInterfaceClass: Unknown (0xffff)]   
       
    No.     Time        Source                Destination           Protocol Info   
         73 7.117414    host                  22.0                  USB      GET DESCRIPTOR Request STRING[Packet size limited during capture]   
       
    Frame 73: 303 bytes on wire (2424 bits), 48 bytes captured (384 bits)   
        Arrival Time: Nov 15, 2011 10:28:36.062126000 GMT   
        Epoch Time: 1321352916.062126000 seconds   
        [Time delta from previous captured frame: 0.296769000 seconds]   
        [Time delta from previous displayed frame: 0.296769000 seconds]   
        [Time since reference or first frame: 7.117414000 seconds]   
        Frame Number: 73   
        Frame Length: 303 bytes (2424 bits)   
        Capture Length: 48 bytes (384 bits)   
        [Frame is marked: False]   
        [Frame is ignored: False]   
        [Protocols in frame: usb]   
    USB URB   
        URB id: 0xfffffffff02abec0   
        URB type: URB_SUBMIT ('S')   
        URB transfer type: URB_CONTROL out (0x02)   
        Endpoint: 0x80   
        Device: 22   
        URB bus id: 1   
        Device setup request: relevant (0)   
        Data: not present ('.')   
        URB sec: 1321352916   
        URB usec: 62126   
        URB status: Success (0)   
        URB length [bytes]: 255   
        Data length [bytes]: 0   
        [bInterfaceClass: VENDOR_SPECIFIC (0xff)]   
        URB setup   
            bmRequestType: 0x80   
                1... .... = Direction: Device-to-host   
                .00. .... = Type: Standard (0x00)   
                ...0 0000 = Recipient: Device (0x00)   
            bRequest: GET DESCRIPTOR (6)   
            Descriptor Index: 0x00   
            bDescriptorType: STRING (3)   
            Language Id: no language specified (0x0000)   
            wLength: 255   
    [Packet size limited during capture: USB truncated]   

     

  • Mark,

     

       I'm not sure how to interpret this log. Does this log start at the very beginning of the application? I ask this because usually GET_DESCRIPTOR is one of the first USB standard requests that the host sends to understand what type of device it's talking to. I see the your logs that this is not the case.

     

    Also - some logs are showing that the device has only one configuration. For High Speed, at least two configurations are needed. One for Full speed during enumeration, and the other for High Speed. This has me confused. Do you have more than one device connected to the root hub?

     

     

  • Hi Drew,

    Yes this is logged from the beginning of the program. Note that the log includes transfers between the host and the root hub. The GET_DESCRIPTOR is the first request I see in the firmware.

    With regards to the number of configurations, perhaps I am misinterpreting the USB specification here. I do have two different configuration descriptors, one for high and one for full speed but, as you observed, only the one for the current speed is returned when a configuration descriptor is requested. The other one is returned when asked for the "Other_Speed_Configuration" descriptor (see USB 2.0 specification).  

    Are you suggesting I have two different configurations, one for full speed and one for high speed and advertise both configurations in both full and high speed -- I am not sure how this would work?

    A related question is, should the device always first arbitrate for full speed, let the device enumerate and, assuming the host will issue another reset, ask to be run in high speed upon the next reset? Currently I always ask to be run in high speed.

    Kind regards,

    Mark

     

     

  • Mark,

       Thanks for the clarifications. I understand the order of the log now.

     

    Mark K said:
    Are you suggesting I have two different configurations, one for full speed and one for high speed and advertise both configurations in both full and high speed -- I am not sure how this would work?

       No. You're understanding is correct. Only one configuration can be operational at a time.

     

    Mark K said:
    A related question is, should the device always first arbitrate for full speed, let the device enumerate and, assuming the host will issue another reset, ask to be run in high speed upon the next reset? Currently I always ask to be run in high speed.

      High Speed Capable devices must always first enumerate as a full-speed device by asserting the Pull Up on D+. A high-speed capable device will negotiate with the host for high speed using a 'High Speed Chirp' following a SE0 is detected on the bus. (USB 2.0 Spec: 7.1.7.5 is a reference for how how this is implemented). If the negotiation is successful the device can operate as a High Speed device, else needs to continue on as a Full Speed device.

    Following reception of the High Speed Chirp by the root hub, the device needs to detect a response from the hub with alternating J/K's. If it sees this within the time bounds, the pull up on D+ needs to be disabled to transition to the High Speed Signaling Level.

    Can you verify that the device firmware is always seeing the response from the root hub? This would be a checkpoint to see if this is always true, and would help narrow down where in the sequence the device is (sometimes) failing to transition to high speed.

     

     

     

     

  • Hi Drew,

    Could you please clarify what you mean with "first enumerate as a full-speed device"? Do you mean 1) I have to go through the whole GET_DESCRIPTOR / SET_CONFIGURATION / SET_ADDRESS sequence in full speed and then again for high speed or do you mean 2) I have to respond to a reset as if I am a full speed device and, during reset,  try to negotiate high speed through chirps and then go through the whole GET_DESCRIPTOR/SET_CONFIGURATION/SET_ADDRESS sequence with whatever speed was negotiated?

    With regards to your last paragraph... I am not entirely sure how I can verify this hardware-level condition within the firmware. Within the context of the C6748 the OTG's physical controller will do the speed negatiation for me. I check the current speed upon "coming out of reset" as follows:

    if (CSL_FEXT(USB0_REGS_PTR->POWER, USB_OTG_POWER_HSMODE)) {

    m_operatingSpeed = eHIGH_SPEED;

    }

    else {

    m_operatingSpeed = eFULL_SPEED;

    }

     

    When I say "coming out of reset" I mean every time we service a reset interrupt. On each reset interrupt we wait until the RESET bit in POWER is cleared and then we execute the code above. This is exactly why I ask about the extraneous reset interrupts in my initial post because what if I execute this code upon an extraneous interrupt? I'd like to know how to implement it properly.

    Kind regards,

    Mark

  • Mark,

    Mark K said:
    Could you please clarify what you mean with "first enumerate as a full-speed device"?

    Sorry - this was very unclear after re-reading it. A full speed capable device must assert the USB D+ pull up as act as though it will enumerate at full speed. When the hub detects that a Full Speed device is attached, it will assert a reset condition (SE0) out onto the bus. During this reset period the device must keep the D+ enabled, and issue the High Speed Chirp to alert the Hub that it is a high speed capable device. The hub will then acknowledge this with a series of JKs in response. Once the high speed capable device detects the JK response, it must de-assert the pull up on D+ and continue on with high speed signaling. If the device doesn't detect the response from the hub, it should assume full speed, and keep the D+ enabled.

    The descriptors will be read at high speed only - or - full speed only, (but not twice).

     

    Mark K said:
    With regards to your last paragraph... I am not entirely sure how I can verify this hardware-level condition within the firmware.

     I'm referring to hooking up an o-scope and looking at the traffic on the D- to see if the chirps are present. Now by doing this, you'll have to be careful because your adding an additional load onto the D- line, and the high speed transceivers may not like that - but you should be able to at least capture the SE0 reset condition, and the chirps before the enumeration process breaks. 

    Yes, the controller does do the hardware negotiation for you, but this is one simple way to confirm if the controller is actually doing what you think it is doing - or not. If the root hub, doesn't see the High Speed Chirp, or the USB device doesn't see the JK response from the root hub, the controller is supposed to continue on as a full speed device, and thus firmware detection will be to late in the process.

     

    Regarding the errata implementation, it sounds like you've implemented it per the work around. If my interpretation of the errata is correct, then once the POWER[RESET] bit is cleared, there is no chance of an extraneous interrupt getting generated, so your code should then work fine.

     

     

     

     

  • Hi Drew, 

    Thank you for the clarification -- I am just checking my understanding of the process is correct. To clarify, from observing the firmware on average the controller does negotiate high speed most of the time but would occasionally not be able to do it and fall back to full speed (say 25% of the time) -- the chirps must be working some of the time.

    I will see what I can do on the oscilloscope front.

    I am not as sure regarding the erratum; I am waiting for POWER[RESET] to be cleared inside the HWI that services the reset interrupt. It could be another (extraneous) reset interrupt arrives while executing this interrupt. I believe my dispatcher is set so that such an interrupt will fire right after the HWI finishes and hence after the POWER[RESET] is cleared.

    That said, I implemented an alternative solution in which I wait for reset completion in a task context and ignore any further reset interrupts until POWER[RESET] is cleared but this doesn't seem to resolve the issue. Hence my original question!

    Kind regards,

    Mark

  • Mark,

       Here's a thought (though I don't know if it'll work or not). What if in the context of the USB reset ISR, the first thing you do is disable the USB reset Interrupt, run your ISR, then at the very end of the ISR, wait for the POWER[RESET] bit to be come clear before re-enabling the USB RESET ISR.

     I'll have to confer with the engineer who originally worked on the bug, but in theory, this should gate a USB RESET from being recognized by the dispatcher more than once (even though the usb controller may erroneously generate one). If I'm thinking through this correctly, then your software doesn't have to worry multiple reset ISR from the same USB SE0 reset condition.

    Thoughts?

  • Hello again, 

    I've finally had chance to inspect the problem with an oscilloscope. When the firmware starts I can consistently see D+ being pulled up on a soft connect followed by it being pulled low (presumably by the host to start a reset). This is then very quickly followed by about 50ms of J/K chirps (~50us each). After these chirps I can see high-speed communication commence: no sign of any problems this far.

    However, after about another ~50-100ms of high speed communication (and also after another ~150-200ms) I can see more chirps. That is, in total I usually see about three periods of chirps at the start of the program. I guess the controller would only generate such chirps when it sees reset signalling however I am not convinced I can see the reset on the oscilloscope. Reading the USB 2.0 specification I am under the impression reset signalling is a SE0 signal that lasts for at least 10ms. I definitely do not see an SE0 of this kind of duration priod to the second and third bursts of chirps [edit: I do see SE0 signalling for about 5ms; perhaps that does constitute a reset]. I do see a very brief SE0 signal followed by a brief large (3.3v [edit: 1v]) spike in D- and D+. If anyone can elaborate whether this kind of behaviour is expected or not that would be helpful [edit: I think this is actually the device's initial K chirps following a reset, judging from 7.1.7.5 item 4 of the USB 2.0 specification; it just looked like a spike when zoomed out on the oscilloscope].

    Finally, in the scenario when I end up in full speed mode I can see D+ being pulled up after the third period of chirps. After it comes back down, full speed communication commences. No chirps here. I can't understand why D+ is being pulled up again as I do not change soft connect after start-up... does this mean the host left it floating? If so, I think what happens is that on the host side (embedded linux) the high-speed capable EHCI host controller failed to enumerate our device and lets a OHCI host controller take over (which is not high-speed capable). Recall this full-speed issue happens only, say, 20% of the time... perhaps the real question is, why does enumeration with high-speed fail *sometimes*?

    Any ideas would be much appreciated!

    Kind regards,

    Mark

     

  • Hi again, 

    I believe the reason that I go full speed is because Linux's ehci_hcd driver fails to read some descriptors and lets the ohci_hcd driver take over. On a normal Linux desktop the descriptors also sometimes fail but the ehci_hcd driver persists. In any case I think the root cause of my problem is the failure to sometimes satisfy the GET_DESCRIPTOR request. 

    To analyse the issue the company I work for has bought a USB analyzer; here's the trace (through lack of a working export function I'll provide a screenshot):

    The problem seems to be with the inability to complete the three GET_DESCRIPTOR requests in the middle. Note that the analyzer only spotted two SE0 (reset) conditions. Yet in the log of my firmware I see I get MANY reset interrupts:

     

    1,1,TRC,******** Handled RESET interrupt.,,usbOtgLog
    2,2,TRC,Peripheral operating at HIGH speed.,,usbOtgLog
    3,3,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    4,4,TRC,"Received GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    5,5,TRC,            ... Length=0x40) [Returned=...].,,usbOtgLog
    6,6,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    7,7,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    8,8,TRC,"Handled GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    9,9,TRC,            ... Length=0x40) [Returned=...].,,usbOtgLog
    10,10,TRC,******** Handled RESET interrupt.,,usbOtgLog
    11,11,TRC,Peripheral operating at HIGH speed.,,usbOtgLog
    12,12,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    13,13,TRC,Received SET_ADDRESS,,usbOtgLog
    14,14,TRC,******** Handled RESET interrupt.,,usbOtgLog
    15,15,TRC,Peripheral operating at HIGH speed.,,usbOtgLog
    16,16,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    17,17,TRC,"Received GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    18,18,TRC,            ... Length=0x40) [Returned=...].,,usbOtgLog
    19,19,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    20,20,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    21,21,TRC,"Handled GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    22,22,TRC,            ... Length=0x40) [Returned=...].,,usbOtgLog
    23,23,TRC,******** Handled RESET interrupt.,,usbOtgLog
    24,24,TRC,Peripheral operating at HIGH speed.,,usbOtgLog
    25,25,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    26,26,TRC,Received SET_ADDRESS,,usbOtgLog
    27,27,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    28,28,TRC,Device has been given an address and is now in the "ADDRESS" state.,,usbOtgLog
    29,29,TRC,Handled SET_ADDRESS (Address=15).,,usbOtgLog
    30,30,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    31,31,TRC,"Received GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    32,32,TRC,            ... Length=0x12) [Returned=...].,,usbOtgLog
    33,33,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    34,34,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    35,35,TRC,"Handled GET_DESCRIPTOR (DescriptorType=1, DescriptorIndex=0, ...",,usbOtgLog
    36,36,TRC,            ... Length=0x12) [Returned=...].,,usbOtgLog
    37,37,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    38,38,TRC,"Received GET_DESCRIPTOR (DescriptorType=2, DescriptorIndex=0, ...",,usbOtgLog
    39,39,TRC,            ... Length=0x9) [Returned=...].,,usbOtgLog
    40,40,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    41,41,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    42,42,TRC,"Handled GET_DESCRIPTOR (DescriptorType=2, DescriptorIndex=0, ...",,usbOtgLog
    43,43,TRC,            ... Length=0x9) [Returned=...].,,usbOtgLog
    44,44,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    45,45,TRC,WARNING: EP0 interrupt received in IDLE mode but no packet was received.,,usbOtgLog
    46,46,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    47,47,TRC,"Received GET_DESCRIPTOR (DescriptorType=2, DescriptorIndex=0, ...",,usbOtgLog
    48,48,TRC,            ... Length=0x20) [Returned=...].,,usbOtgLog
    49,49,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    50,50,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    51,51,TRC,"Handled GET_DESCRIPTOR (DescriptorType=2, DescriptorIndex=0, ...",,usbOtgLog
    52,52,TRC,            ... Length=0x20) [Returned=...].,,usbOtgLog
    53,53,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    54,54,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=0, ...",,usbOtgLog
    55,55,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    56,56,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    57,57,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    58,58,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=0, ...",,usbOtgLog
    59,59,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    60,60,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    61,61,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=2, ...",,usbOtgLog
    62,62,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    63,63,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    64,64,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    65,65,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    66,66,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=2, ...",,usbOtgLog
    67,67,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    68,68,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    69,69,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=1, ...",,usbOtgLog
    70,70,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    71,71,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    72,72,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    73,73,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=1, ...",,usbOtgLog
    74,74,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    75,75,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    76,76,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=3, ...",,usbOtgLog
    77,77,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    78,78,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    79,79,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    80,80,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=3, ...",,usbOtgLog
    81,81,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    82,82,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    83,83,TRC,Received SET_CONFIGURATION,,usbOtgLog
    84,84,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    85,85,TRC,Device has been configured and is now in the "CONFIGURED" state.,,usbOtgLog
    86,86,TRC,Handled SET_CONFIGURATION (Configuration=1).,,usbOtgLog
    87,87,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    88,88,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=5, ...",,usbOtgLog
    89,89,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    90,90,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    91,91,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    92,92,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=5, ...",,usbOtgLog
    93,93,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    94,94,TRC,Handling EP0 interrupt in IDLE mode,,usbOtgLog
    95,95,TRC,"Received GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=6, ...",,usbOtgLog
    96,96,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    97,97,TRC,Handling EP0 interrupt in TX mode.,,usbOtgLog
    98,98,TRC,Handling EP0 interrupt in STATUS mode.,,usbOtgLog
    99,99,TRC,"Handled GET_DESCRIPTOR (DescriptorType=3, DescriptorIndex=6, ...",,usbOtgLog
    100,100,TRC,            ... Length=0xff) [Returned=...].,,usbOtgLog
    

    I can therefore only think the errata regarding spurious reset interrupts is the culprit here. To recap, I do wait after each reset interrupt until the POWER[RESET] bit is cleared and only then assert the interrupt but it seems as though POWER[RESET] is never set in my firmware.

    [EDIT: I forgot to mention that on an oscilloscope I can see four distinct periods of chirps for this trace. Whether or not each of them is preceded by SE0 signalling is difficult to see on the oscilloscope but I would suggest that in all likelihood the analyzer is correct and this is not the case. This would lead me to believe that perhaps the C6748's physical USB 2.0 controller somehow *thinks* it is being reset although it is not?]

    Any help is appreciated!

    Kind regards,

    Mark

     

  • Mark,

        The Elysis capture you posted above shows that the high-speed handshake was successful and the device is communicating via High Speed Transactions. Can you try and capture one where it fails and enumerates at full speed?

         I'm not sure why the GET_DESCRIPTOR request is failing once the device is received it's address form the host, though it looks like it was successful using endpoint 0.

  • dabuan said:

        The Elysis capture you posted above shows that the high-speed handshake was successful and the device is communicating via High Speed Transactions. Can you try and capture one where it fails and enumerates at full speed?

    This is because the capture was taken using a linux desktop as a host (and the C6748 as a device). On the host we will use in production the failure of the GET_DESCRIPTOR requests causes the high-speed capable EHCI driver on the host to give up and a OHCI driver to take over -- resulting in full speed. Hence, I think my real problem is the failure of those requests. 

     

    dabuan said:

         I'm not sure why the GET_DESCRIPTOR request is failing once the device is received it's address form the host, though it looks like it was successful using endpoint 0.

     

    In the logs of our firmware I see that, for the same trace, the C6748 fired many reset interrupts even though only two happened according to the USB analyzer. I am thinking that if such an extraneous reset interrupts happen at an unfortunate time then I am not surprised that the transactions fail. 

    Perhaps you could clarify how TI is advising to deal with reset interrupts (in terms of which registers should be repopulated etc.). My implementation is going by the official USB 2.0 OTG user guide but it is not very clear on how to behave on reset.

    I am especially interested in the errata published for the C6748 because this mentions you can get spurious reset interrupts for USB0 (which seems to be happening). I have tried masking out reset interrupts for the duration of reset signalling but, crucially, I don't seem to be able to detect the end of the reset signalling. That is, it is supposed to be the case that POWER[RESET] is set during reset signalling and is cleared when it has finished but this bit is always cleared whenever I get a reset interrupt. 

    Kind regards, 

    Mark