Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 21 of 21

Thread: Teensy 4.0 USBHost_t36 - Won't Recognize USB Hub

  1. #1
    Junior Member
    Join Date
    Jun 2022
    Posts
    6

    Teensy 4.0 USBHost_t36 - Won't Recognize USB Hub

    Hello! I tried to look through all the other forum posts about this before creating another of my own, but I haven't been able to solve my issue. I am making a MIDI USB Host like this one https://little-scale.blogspot.com/20...idi-5-pin.html. The only difference is I'm using a Teensy 4.0. I'm trying to connect a Novation Launch Control XL and Launchkey Mini through this hub: https://www.amazon.com/dp/B00BWF5U0M...roduct_details. Both controllers work fine when connected to the Teensy USB Host port without the hub. But with the hub it's not working properly, it's only passing power. When I run the HIDDeviceInfo example project I am able to see the information of the 2 controllers when they are plugged in individually (without the hub), but there is no information when the USB Hub is plugged in. I have tested the USB hub with my Macbook Pro and it works as it should. I'm a beginner when it comes to code so I could be missing something obvious. I tried running the other MIDI examples projects where there are more hubs and devices setup, but the hub isn't recognized with those projects either. Thanks in advance for any help!

    Arduino 1.8.19
    Teensyduino 1.56
    MacOS Mojave

    Code:
    #include <MIDI.h>        // access to serial (5 pin DIN) MIDI
    #include <USBHost_t36.h> // access to USB MIDI devices (plugged into 2nd USB port)
    
    MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI1);
    
    USBHost myusb;
    USBHub hub1(myusb);
    
    MIDIDevice midi01(myusb);
    
    elapsedMillis ledOnMillis;
    
    void setup() {
      pinMode(13, OUTPUT); // LED pin
      digitalWrite(13, LOW);
      MIDI1.begin(MIDI_CHANNEL_OMNI);
    
      delay(1500);
      delay(10);
      myusb.begin();
    }
    
    void loop() {
      bool activity = false;
    
      if (MIDI1.read()) { // 5 pin DIN to USB Host
        sendToHost(MIDI1.getType(), MIDI1.getData1(), MIDI1.getData2(), MIDI1.getChannel(), MIDI1.getSysExArray());
        activity = true;
      }
    
      if (midi01.read()) { // USB Host to 5 pin DIN
        uint8_t type =       midi01.getType();
        uint8_t data1 =      midi01.getData1();
        uint8_t data2 =      midi01.getData2();
        uint8_t channel =    midi01.getChannel();
        const uint8_t *sys = midi01.getSysExArray();
        sendToMIDI(type, data1, data2, channel, sys);
    
        activity = true;
      }
    
      if (activity) {
        digitalWriteFast(13, HIGH); // LED on
        ledOnMillis = 0;
      }
      if (ledOnMillis > 15) {
        digitalWriteFast(13, LOW);  // LED off
      }
    
    }
    
    void sendToMIDI(byte type, byte data1, byte data2, byte channel, const uint8_t *sysexarray)
    {
      if (type != midi::SystemExclusive) {
        MIDI1.send(type, data1, data2, channel);
      } else {
        unsigned int SysExLength = data1 + data2 * 256;
        MIDI1.sendSysEx(SysExLength, sysexarray, true);
      }
    }
    
    void sendToHost(byte type, byte data1, byte data2, byte channel, const uint8_t *sysexarray)
    {
      if (type != midi::SystemExclusive) {
        midi01.send(type, data1, data2, channel);
      } else {
        unsigned int SysExLength = data1 + data2 * 256;
        midi01.sendSysEx(SysExLength, sysexarray, true);
      }
    }

  2. #2
    Senior Member+ defragster's Avatar
    Join Date
    Feb 2015
    Posts
    17,140
    That looks to be an unpowered hub?

    With T_4.0 connection wires had to be soldered to the bottom Host D+ and D- pins, those lines have to be done well. Good sign both devices work individually.

    The T_4.0 unlike the T_4.1 doesn't have an onboard current control chip and the hub and device(s) may be stunning the T_4.0?
    Without external power beyond the computer the power is limited to and through the Teensy.

    Using a powered hub may give better results.
    There is a DEBUG #define under comment in the Host.c file that will provide generous Serial output of any events as they happen. Enabling that may show signs of activity.

  3. #3
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,986
    Two quick things to try...

    1: replace MIDIDevice with MIDIDevice_BigBuffer.

    2: edit ehci.cpp to uncomment this line:

    Code:
            //USBHS_PORTSC1 |= USBHS_PORTSC_PFSC; // force 12 Mbit/sec
    To be honest, I'm skeptical either of these will make a difference. But they're easy to try, so I'm hoping you can check whether the buffer size or USB high speed mode are a factor before I order this particular USB hub and put this on the list of issues to investigate.

  4. #4
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    The Amazon page said I ordered one of these 5 years ago... Don't remember it, but will look around and see if I find it

  5. #5
    Junior Member
    Join Date
    Jun 2022
    Posts
    6
    @ Paul Thank you for the quick response! I tried both of those things and it did not make a difference.

  6. #6
    Junior Member
    Join Date
    Jun 2022
    Posts
    6
    @defragster Is the debug you're referring to #define USBHOST_PRINT_DEBUG in the USBHost_t36.h file?

  7. #7
    Senior Member+ defragster's Avatar
    Join Date
    Feb 2015
    Posts
    17,140
    Quote Originally Posted by grub View Post
    @defragster Is the debug you're referring to #define USBHOST_PRINT_DEBUG in the USBHost_t36.h file?
    Yes, sorry - indeed, in that .h file : ...\USBHost_t36\USBHost_t36.h

    Code:
    // Uncomment this line to see lots of debugging info!
    //#define USBHOST_PRINT_DEBUG

  8. #8
    Junior Member
    Join Date
    Jun 2022
    Posts
    6
    I uncommented that out, but after doing so I don't see anything in the Serial Monitor when I'm running my original program. I'm not too familiar with this process, I'm assuming where the debug information would be is in the Serial Monitor, is that correct?

  9. #9
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,986
    I ordered this hub today. Or really, Robin did

  10. #10
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    I also have one on order... I found the other hub, that I ordered back then

  11. #11
    Senior Member+ defragster's Avatar
    Join Date
    Feb 2015
    Posts
    17,140
    Quote Originally Posted by grub View Post
    I uncommented that out, but after doing so I don't see anything in the Serial Monitor when I'm running my original program. I'm not too familiar with this process, I'm assuming where the debug information would be is in the Serial Monitor, is that correct?
    Yes, that part of p#2was correct: "will provide generous Serial output of any events as they happen"

    With that enabled, remove the HUB and try a device individually and that should then show since the device connects in that case.

  12. #12
    Junior Member
    Join Date
    Jun 2022
    Posts
    6
    I’m excited to see what you guys find out about this hub. Thanks for the help and interest in my issue!

  13. #13
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    Just an FYI - This hub has been mentioned before as working back in 2017 in the thread:
    https://forum.pjrc.com/threads/42505...l=1#post135868

    And there was talk about Multi-TT...

  14. #14
    Junior Member
    Join Date
    Jun 2022
    Posts
    6
    I looked through that thread and it’s talking about using the USB Hub to connect the Teensy to a PC. I’m trying to use mine standalone, not connected to PC. Sorry if I’m not understanding what’s being discussed in that thread correctly. So has this been tested as working in the same way I’m using it? Connected to the Teensy’s USB Host port?

  15. #15
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    Yes some/most of that may have been mentioning about The teensy was plugged into one of these. But I mentioned it because maybe Paul had one around... Or maybe more information in the thread about the hub that might give some indication.

    Note: My new one did arrive, and for example I ran it connected to the USB Host on a Teensy MicroMod running the Mouse USBHost example sketch.

    And so far everything appears to be working.

    Code:
    
    USB Host Testing
    960
    *** Device Hub1 5e3:608 - connected ***
      product: USB2.0 Hub
    *** Device HID1 46d:c063 - connected ***
      manufacturer: DELL
      product: DELL USB Laser Mouse
    *** HID Device Mouse1 46d:c063 - connected ***
      manufacturer: DELL
      product: DELL USB Laser Mouse
    *** Device HID2 4ca:27 - connected ***
      manufacturer: Lite-On Technology Corp.
      product: USB Multimedia Keyboard
    *** Device KB1 4ca:27 - connected ***
      manufacturer: Lite-On Technology Corp.
      product: USB Multimedia Keyboard
    key 'i'  105 MOD: 0 OEM: C LEDS: 0
    key 'f'  102 MOD: 0 OEM: 9 LEDS: 0
    key 'a'  97 MOD: 0 OEM: 4 LEDS: 0
    key 't'  116 MOD: 0 OEM: 17 LEDS: 0
    key ' '  32 MOD: 0 OEM: 2C LEDS: 0key 'r'  114 MOD: 0 OEM: 15 LEDS: 0
    key 's'  115 MOD: 0 OEM: 16 LEDS: 0
    key 't'  116 MOD: 0 OEM: 17 LEDS: 0
    Mouse: buttons = 0,  mouseX = -2,  mouseY = 0,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -8,  mouseY = 5,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -8,  mouseY = 3,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -10,  mouseY = 4,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -11,  mouseY = 6,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -12,  mouseY = 6,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -12,  mouseY = 7,  wheel = 0,  wheelH = 0
    Mouse: buttons = 0,  mouseX = -13,  mouseY = 6,  wheel = 0,  wheelH = 0
    Note: I don't have a midi, so can not test that part...

    On your test case, have you tried adding another HUB object to your sketch:
    USBHub hub2(myusb);

    And see if that helps.
    The reason I suggest that is some devices have a built in USB Hub. I have a few keyboards that are built that way. And if there is not a HUB object available, it won't then talk to the actual device, in my case a keyboard.

  16. #16
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    Paul,

    I am not sure if you had a chance to play with this HUB yet?

    But I am getting a good HANG with this one. It depends on order of when devices are added.

    Trying to debug Logictech G Pro Mouse with keyboard (other thread)
    https://forum.pjrc.com/threads/69258...l=1#post311207

    Now if I start up a test sketch (Posted in other thread)

    If I start up the sketch with lets say all of the usb ports turned off.

    If I startup keyboard first and then Wireless receiver it appears to work ok.

    If however, I startup the wireless receiver first and then keyboard will totally hang. I turned on the USBHost_t36 debug stuff, and uncommented lots of stuff in ehci...

    We are getting chains in the loop. The loop detection code on printing was not finding it and infinite print. So, I hacked it up to look for any loops as it was not looping back to start:
    Code:
    void USBHost::print_qh_list(const Pipe_t *list)
    {
    	if (!list) {
    		USBHDBGSerial.println("(empty)");
    		return;
    	}
    	const Pipe_t *node = list;
    	uint8_t max_print = 32; // max number of items..
    	while (1) {
    		USBHDBGSerial.print((uint32_t)node, HEX);
    		const Pipe_t *next_node = (const Pipe_t *)(node->qh.horizontal_link & 0xFFFFFFE0);
    		if (!next_node) break;
    		// Lets check for loops
    		const Pipe_t *nt = list;
    		while (nt != node) {
    			if (nt == next_node) break;
    			nt = (const Pipe_t *)(nt->qh.horizontal_link & 0xFFFFFFE0);
    		}
    
    		if (nt != node) {
    			USBHDBGSerial.print(" -> (loops) ");
    			USBHDBGSerial.print((uint32_t)next_node, HEX);
    			break;
    		}	
    		node = next_node;
    
    		if (!max_print--) {
    			USBHDBGSerial.print(" (Probable Loop)");
    			break;
    		}
    		USBHDBGSerial.print(" -> ");
    	}
    	USBHDBGSerial.println();
    }
    A run that hung...
    Code:
    USB Mouse and Keyboard forwarder
    USB2 PLL running
     reset waited 6
    USBHS_ASYNCLISTADDR = 0
    USBHS_PERIODICLISTBASE = 20005000
    periodictable = 20005000
    port change: 10001803
        connect
      begin reset
    port change: 18001205
      port enabled
      end recovery
    new_Device: 480 Mbit/sec
    new_Pipe
      After endpoint > 0
      After capabilities
      first in async list
      return new_Pipe: 20005080
    enumeration:
    enumeration:
    enumeration:
    Device Descriptor:
      12 01 00 02 09 00 01 40 E3 05 08 06 36 85 00 01 00 01 
        VendorID = 05E3, ProductID = 0608, Version = 8536
        Class/Subclass/Protocol = 9(Hub) / 0 / 1(Single-TT)
        Number of Configurations = 1
    enumeration:
    enumeration:
    Product: USB2.0 Hub
    enumeration:
    Config data length = 25
    enumeration:
    Configuration Descriptor:
      09 02 19 00 01 01 00 E0 32 
        NumInterfaces = 1
        ConfigurationValue = 1
      09 04 00 00 01 09 00 00 00 
        Interface = 0
        Number of endpoints = 1
        Class/Subclass/Protocol = 9(Hub) / 0 / 0
      07 05 81 03 01 00 0C 
        Endpoint = 1 IN
        Type = Interrupt
        Max Size = 1
        Polling Interval = 12
    enumeration:
    USBHub memory usage = 960
    USBHub claim_device this=20006CE0
    found possible interface, altsetting=0
    number of interfaces found = 1
    USBHub control callback
    09 29 04 E0 00 32 64 00 FF 00 00 00 00 00 00 00 
    Hub ports = 4
    USBHub control callback
    USBHub control callback
    USBHub control callback
    USBHub control callback
    power turned on to all ports
    device addr = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
      ep interval = 12
      interval = 256
     best_bandwidth = 2, at offset = 0
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006AC0
      interval = 32
      offset =   0
        old slot 0: (empty)
      add to slot 0
        new slot 0: 20006AC0
    Periodic Schedule:
     0: 20006AC0
     1: (empty)
     2: (empty)
     3: (empty)
     4: (empty)
     5: (empty)
     6: (empty)
     7: (empty)
     8: (empty)
     9: (empty)
    10: (empty)
    11: (empty)
    12: (empty)
    13: (empty)
    14: (empty)
    15: (empty)
    16: (empty)
    17: (empty)
    18: (empty)
    19: (empty)
    20: (empty)
    21: (empty)
    22: (empty)
    23: (empty)
    24: (empty)
    25: (empty)
    26: (empty)
    27: (empty)
    28: (empty)
    29: (empty)
    30: (empty)
    31: (empty)
      return new_Pipe: 20006AC0
    pipe cap1 = F0012101
    HUB Callback (member)
    status = 10
    getstatus, port = 4
    USBHub control callback
    01 01 01 00 
    New Port Status
      status=10101  port=4
      state=0
      Device is present: 
      Has Power
    USBHub control callback
    Port Status Cleared, port=4
    timer event (19999 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=2
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=3
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=4
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=5
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=6
      Device is present: 
      Has Power
    sending reset
    send_setreset
    USBHub control callback
    unhandled setup, message = 40323
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 0
    HUB Callback (member)
    status = 10
    getstatus, port = 4
    USBHub control callback
    03 01 10 00 
    New Port Status
      status=100103  port=4
      state=7
      Device is present: 
      Enabled, speed = 12 Mbit/sec
      Has Power
    USBHub control callback
    unhandled setup, message = 140123
    timer event (25000 us): Hello, I'm resettimer, this = 20006CE0, timer = 20007018
    port_doing_reset = 4
    PORT_RECOVERY
    new_Device: 12 Mbit/sec
    new_Pipe
      After endpoint > 0
      After capabilities
      added to async list
      return new_Pipe: 20006A60
    enumeration:
    enumeration:
    enumeration:
    Device Descriptor:
      12 01 00 02 00 00 00 40 6D 04 47 C5 02 04 01 02 00 01 
        VendorID = 046D, ProductID = C547, Version = 0402
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    enumeration:
    enumeration:
    Manufacturer: Logitech
    enumeration:
    Product: USB Receiver
    enumeration:
    Config data length = 84
    enumeration:
    Configuration Descriptor:
      09 02 54 00 03 01 04 A0 31 
        NumInterfaces = 3
        ConfigurationValue = 1
      09 04 00 00 01 03 01 02 00 
        Interface = 0
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 1(Boot) / 2(Mouse)
      09 21 11 01 00 01 22 53 00 
        HID, 1 report descriptor
      07 05 81 03 40 00 01 
        Endpoint = 1 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
      09 04 01 00 01 03 01 01 00 
        Interface = 1
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 1(Boot) / 1(Keyboard)
      09 21 11 01 00 01 22 85 00 
        HID, 1 report descriptor
      07 05 82 03 40 00 01 
        Endpoint = 2 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
      09 04 02 00 01 03 00 00 00 
        Interface = 2
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 0 / 0
      09 21 11 01 00 01 22 36 00 
        HID, 1 report descriptor
      07 05 83 03 40 00 01 
        Endpoint = 3 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
    enumeration:
    USBHub memory usage = 960
    USBHub claim_device this=200070A0
    KeyboardController claim this=20007460
    KeyboardController claim this=20007700
    HIDParser claim this=200051E0
    HIDParser claim this=200058A0
    HIDParser claim this=20005F60
    HIDParser claim this=20006620
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007460
    09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    KeyboardController claim this=20007700
    09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    HIDParser claim this=200051E0
     bInterfaceNumber =   0
     bInterfaceClass =    3
     bInterfaceSubClass = 1
     bInterfaceProtocol = 2
    HID Parser Claim: 09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    report descriptor size = 83
    Single endpoint HID:
      endpoint = 81
       size = 64
       interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 5, at offset = 0, shift= 0
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006A00
      interval = 1
      offset =   0
        old slot 0: 20006AC0
      traverse list 0
      num 20006AC2  node 20006AC0->1
      adding at node 20006AC0, num=20006AC2, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00
        old slot 1: (empty)
      add to slot 1
        new slot 1: 20006A00
        old slot 2: (empty)
      add to slot 2
        new slot 2: 20006A00
        old slot 3: (empty)
      add to slot 3
        new slot 3: 20006A00
        old slot 4: (empty)
      add to slot 4
        new slot 4: 20006A00
        old slot 5: (empty)
      add to slot 5
        new slot 5: 20006A00
        old slot 6: (empty)
      add to slot 6
        new slot 6: 20006A00
        old slot 7: (empty)
      add to slot 7
        new slot 7: 20006A00
        old slot 8: (empty)
      add to slot 8
        new slot 8: 20006A00
        old slot 9: (empty)
      add to slot 9
        new slot 9: 20006A00
        old slot 10: (empty)
      add to slot 10
        new slot 10: 20006A00
        old slot 11: (empty)
      add to slot 11
        new slot 11: 20006A00
        old slot 12: (empty)
      add to slot 12
        new slot 12: 20006A00
        old slot 13: (empty)
      add to slot 13
        new slot 13: 20006A00
        old slot 14: (empty)
      add to slot 14
        new slot 14: 20006A00
        old slot 15: (empty)
      add to slot 15
        new slot 15: 20006A00
        old slot 16: (empty)
      add to slot 16
        new slot 16: 20006A00
        old slot 17: (empty)
      add to slot 17
        new slot 17: 20006A00
        old slot 18: (empty)
      add to slot 18
        new slot 18: 20006A00
        old slot 19: (empty)
      add to slot 19
        new slot 19: 20006A00
        old slot 20: (empty)
      add to slot 20
        new slot 20: 20006A00
        old slot 21: (empty)
      add to slot 21
        new slot 21: 20006A00
        old slot 22: (empty)
      add to slot 22
        new slot 22: 20006A00
        old slot 23: (empty)
      add to slot 23
        new slot 23: 20006A00
        old slot 24: (empty)
      add to slot 24
        new slot 24: 20006A00
        old slot 25: (empty)
      add to slot 25
        new slot 25: 20006A00
        old slot 26: (empty)
      add to slot 26
        new slot 26: 20006A00
        old slot 27: (empty)
      add to slot 27
        new slot 27: 20006A00
        old slot 28: (empty)
      add to slot 28
        new slot 28: 20006A00
        old slot 29: (empty)
      add to slot 29
        new slot 29: 20006A00
        old slot 30: (empty)
      add to slot 30
        new slot 30: 20006A00
        old slot 31: (empty)
      add to slot 31
        new slot 31: 20006A00
    Periodic Schedule:
     0: 20006AC0 -> 20006A00
     1: 20006A00
     2: 20006A00
     3: 20006A00
     4: 20006A00
     5: 20006A00
     6: 20006A00
     7: 20006A00
     8: 20006A00
     9: 20006A00
    10: 20006A00
    11: 20006A00
    12: 20006A00
    13: 20006A00
    14: 20006A00
    15: 20006A00
    16: 20006A00
    17: 20006A00
    18: 20006A00
    19: 20006A00
    20: 20006A00
    21: 20006A00
    22: 20006A00
    23: 20006A00
    24: 20006A00
    25: 20006A00
    26: 20006A00
    27: 20006A00
    28: 20006A00
    29: 20006A00
    30: 20006A00
    31: 20006A00
      return new_Pipe: 20006A00
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007460
    09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    ep = 82
    packet size = 64
    polling interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 7, at offset = 0, shift= 3
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006400
      interval = 1
      offset =   0
        old slot 0: 20006AC0 -> 20006A00
      traverse list 0
      num 20006AC2  node 20006AC0->20006A02
      num 20006A02  node 20006A00->1
      adding at node 20006A00, num=20006A02, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00 -> 20006400
        old slot 1: 20006A00 -> 20006400
      traverse list 1
      num 20006A02  node 20006A00->20006402
        new slot 1: 20006A00 -> 20006400
        old slot 2: 20006A00 -> 20006400
      traverse list 2
      num 20006A02  node 20006A00->20006402
        new slot 2: 20006A00 -> 20006400
        old slot 3: 20006A00 -> 20006400
      traverse list 3
      num 20006A02  node 20006A00->20006402
        new slot 3: 20006A00 -> 20006400
        old slot 4: 20006A00 -> 20006400
      traverse list 4
      num 20006A02  node 20006A00->20006402
        new slot 4: 20006A00 -> 20006400
        old slot 5: 20006A00 -> 20006400
      traverse list 5
      num 20006A02  node 20006A00->20006402
        new slot 5: 20006A00 -> 20006400
        old slot 6: 20006A00 -> 20006400
      traverse list 6
      num 20006A02  node 20006A00->20006402
        new slot 6: 20006A00 -> 20006400
        old slot 7: 20006A00 -> 20006400
      traverse list 7
      num 20006A02  node 20006A00->20006402
        new slot 7: 20006A00 -> 20006400
        old slot 8: 20006A00 -> 20006400
      traverse list 8
      num 20006A02  node 20006A00->20006402
        new slot 8: 20006A00 -> 20006400
        old slot 9: 20006A00 -> 20006400
      traverse list 9
      num 20006A02  node 20006A00->20006402
        new slot 9: 20006A00 -> 20006400
        old slot 10: 20006A00 -> 20006400
      traverse list 10
      num 20006A02  node 20006A00->20006402
        new slot 10: 20006A00 -> 20006400
        old slot 11: 20006A00 -> 20006400
      traverse list 11
      num 20006A02  node 20006A00->20006402
        new slot 11: 20006A00 -> 20006400
        old slot 12: 20006A00 -> 20006400
      traverse list 12
      num 20006A02  node 20006A00->20006402
        new slot 12: 20006A00 -> 20006400
        old slot 13: 20006A00 -> 20006400
      traverse list 13
      num 20006A02  node 20006A00->20006402
        new slot 13: 20006A00 -> 20006400
        old slot 14: 20006A00 -> 20006400
      traverse list 14
      num 20006A02  node 20006A00->20006402
        new slot 14: 20006A00 -> 20006400
        old slot 15: 20006A00 -> 20006400
      traverse list 15
      num 20006A02  node 20006A00->20006402
        new slot 15: 20006A00 -> 20006400
        old slot 16: 20006A00 -> 20006400
      traverse list 16
      num 20006A02  node 20006A00->20006402
        new slot 16: 20006A00 -> 20006400
        old slot 17: 20006A00 -> 20006400
      traverse list 17
      num 20006A02  node 20006A00->20006402
        new slot 17: 20006A00 -> 20006400
        old slot 18: 20006A00 -> 20006400
      traverse list 18
      num 20006A02  node 20006A00->20006402
        new slot 18: 20006A00 -> 20006400
        old slot 19: 20006A00 -> 20006400
      traverse list 19
      num 20006A02  node 20006A00->20006402
        new slot 19: 20006A00 -> 20006400
        old slot 20: 20006A00 -> 20006400
      traverse list 20
      num 20006A02  node 20006A00->20006402
        new slot 20: 20006A00 -> 20006400
        old slot 21: 20006A00 -> 20006400
      traverse list 21
      num 20006A02  node 20006A00->20006402
        new slot 21: 20006A00 -> 20006400
        old slot 22: 20006A00 -> 20006400
      traverse list 22
      num 20006A02  node 20006A00->20006402
        new slot 22: 20006A00 -> 20006400
        old slot 23: 20006A00 -> 20006400
      traverse list 23
      num 20006A02  node 20006A00->20006402
        new slot 23: 20006A00 -> 20006400
        old slot 24: 20006A00 -> 20006400
      traverse list 24
      num 20006A02  node 20006A00->20006402
        new slot 24: 20006A00 -> 20006400
        old slot 25: 20006A00 -> 20006400
      traverse list 25
      num 20006A02  node 20006A00->20006402
        new slot 25: 20006A00 -> 20006400
        old slot 26: 20006A00 -> 20006400
      traverse list 26
      num 20006A02  node 20006A00->20006402
        new slot 26: 20006A00 -> 20006400
        old slot 27: 20006A00 -> 20006400
      traverse list 27
      num 20006A02  node 20006A00->20006402
        new slot 27: 20006A00 -> 20006400
        old slot 28: 20006A00 -> 20006400
      traverse list 28
      num 20006A02  node 20006A00->20006402
        new slot 28: 20006A00 -> 20006400
        old slot 29: 20006A00 -> 20006400
      traverse list 29
      num 20006A02  node 20006A00->20006402
        new slot 29: 20006A00 -> 20006400
        old slot 30: 20006A00 -> 20006400
      traverse list 30
      num 20006A02  node 20006A00->20006402
        new slot 30: 20006A00 -> 20006400
        old slot 31: 20006A00 -> 20006400
      traverse list 31
      num 20006A02  node 20006A00->20006402
        new slot 31: 20006A00 -> 20006400
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20006400
     1: 20006A00 -> 20006400
     2: 20006A00 -> 20006400
     3: 20006A00 -> 20006400
     4: 20006A00 -> 20006400
     5: 20006A00 -> 20006400
     6: 20006A00 -> 20006400
     7: 20006A00 -> 20006400
     8: 20006A00 -> 20006400
     9: 20006A00 -> 20006400
    10: 20006A00 -> 20006400
    11: 20006A00 -> 20006400
    12: 20006A00 -> 20006400
    13: 20006A00 -> 20006400
    14: 20006A00 -> 20006400
    15: 20006A00 -> 20006400
    16: 20006A00 -> 20006400
    17: 20006A00 -> 20006400
    18: 20006A00 -> 20006400
    19: 20006A00 -> 20006400
    20: 20006A00 -> 20006400
    21: 20006A00 -> 20006400
    22: 20006A00 -> 20006400
    23: 20006A00 -> 20006400
    24: 20006A00 -> 20006400
    25: 20006A00 -> 20006400
    26: 20006A00 -> 20006400
    27: 20006A00 -> 20006400
    28: 20006A00 -> 20006400
    29: 20006A00 -> 20006400
    30: 20006A00 -> 20006400
    31: 20006A00 -> 20006400
      return new_Pipe: 20006400
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007700
    09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    HIDParser claim this=200058A0
     bInterfaceNumber =   2
     bInterfaceClass =    3
     bInterfaceSubClass = 0
     bInterfaceProtocol = 0
    HID Parser Claim: 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    report descriptor size = 54
    Single endpoint HID:
      endpoint = 83
       size = 64
       interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 9, at offset = 0, shift= 3
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 200063A0
      interval = 1
      offset =   0
        old slot 0: 20006AC0 -> 20006A00 -> 20006400
      traverse list 0
      num 20006AC2  node 20006AC0->20006A02
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->1
      adding at node 20006400, num=20006402, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00 -> 20006400 -> 200063A0
        old slot 1: 20006A00 -> 20006400 -> 200063A0
      traverse list 1
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 1: 20006A00 -> 20006400 -> 200063A0
        old slot 2: 20006A00 -> 20006400 -> 200063A0
      traverse list 2
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 2: 20006A00 -> 20006400 -> 200063A0
        old slot 3: 20006A00 -> 20006400 -> 200063A0
      traverse list 3
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 3: 20006A00 -> 20006400 -> 200063A0
        old slot 4: 20006A00 -> 20006400 -> 200063A0
      traverse list 4
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 4: 20006A00 -> 20006400 -> 200063A0
        old slot 5: 20006A00 -> 20006400 -> 200063A0
      traverse list 5
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 5: 20006A00 -> 20006400 -> 200063A0
        old slot 6: 20006A00 -> 20006400 -> 200063A0
      traverse list 6
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 6: 20006A00 -> 20006400 -> 200063A0
        old slot 7: 20006A00 -> 20006400 -> 200063A0
      traverse list 7
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 7: 20006A00 -> 20006400 -> 200063A0
        old slot 8: 20006A00 -> 20006400 -> 200063A0
      traverse list 8
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 8: 20006A00 -> 20006400 -> 200063A0
        old slot 9: 20006A00 -> 20006400 -> 200063A0
      traverse list 9
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 9: 20006A00 -> 20006400 -> 200063A0
        old slot 10: 20006A00 -> 20006400 -> 200063A0
      traverse list 10
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 10: 20006A00 -> 20006400 -> 200063A0
        old slot 11: 20006A00 -> 20006400 -> 200063A0
      traverse list 11
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 11: 20006A00 -> 20006400 -> 200063A0
        old slot 12: 20006A00 -> 20006400 -> 200063A0
      traverse list 12
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 12: 20006A00 -> 20006400 -> 200063A0
        old slot 13: 20006A00 -> 20006400 -> 200063A0
      traverse list 13
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 13: 20006A00 -> 20006400 -> 200063A0
        old slot 14: 20006A00 -> 20006400 -> 200063A0
      traverse list 14
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 14: 20006A00 -> 20006400 -> 200063A0
        old slot 15: 20006A00 -> 20006400 -> 200063A0
      traverse list 15
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 15: 20006A00 -> 20006400 -> 200063A0
        old slot 16: 20006A00 -> 20006400 -> 200063A0
      traverse list 16
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 16: 20006A00 -> 20006400 -> 200063A0
        old slot 17: 20006A00 -> 20006400 -> 200063A0
      traverse list 17
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 17: 20006A00 -> 20006400 -> 200063A0
        old slot 18: 20006A00 -> 20006400 -> 200063A0
      traverse list 18
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 18: 20006A00 -> 20006400 -> 200063A0
        old slot 19: 20006A00 -> 20006400 -> 200063A0
      traverse list 19
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 19: 20006A00 -> 20006400 -> 200063A0
        old slot 20: 20006A00 -> 20006400 -> 200063A0
      traverse list 20
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 20: 20006A00 -> 20006400 -> 200063A0
        old slot 21: 20006A00 -> 20006400 -> 200063A0
      traverse list 21
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 21: 20006A00 -> 20006400 -> 200063A0
        old slot 22: 20006A00 -> 20006400 -> 200063A0
      traverse list 22
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 22: 20006A00 -> 20006400 -> 200063A0
        old slot 23: 20006A00 -> 20006400 -> 200063A0
      traverse list 23
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 23: 20006A00 -> 20006400 -> 200063A0
        old slot 24: 20006A00 -> 20006400 -> 200063A0
      traverse list 24
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 24: 20006A00 -> 20006400 -> 200063A0
        old slot 25: 20006A00 -> 20006400 -> 200063A0
      traverse list 25
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 25: 20006A00 -> 20006400 -> 200063A0
        old slot 26: 20006A00 -> 20006400 -> 200063A0
      traverse list 26
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 26: 20006A00 -> 20006400 -> 200063A0
        old slot 27: 20006A00 -> 20006400 -> 200063A0
      traverse list 27
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 27: 20006A00 -> 20006400 -> 200063A0
        old slot 28: 20006A00 -> 20006400 -> 200063A0
      traverse list 28
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 28: 20006A00 -> 20006400 -> 200063A0
        old slot 29: 20006A00 -> 20006400 -> 200063A0
      traverse list 29
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 29: 20006A00 -> 20006400 -> 200063A0
        old slot 30: 20006A00 -> 20006400 -> 200063A0
      traverse list 30
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 30: 20006A00 -> 20006400 -> 200063A0
        old slot 31: 20006A00 -> 20006400 -> 200063A0
      traverse list 31
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 31: 20006A00 -> 20006400 -> 200063A0
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20006400 -> 200063A0
     1: 20006A00 -> 20006400 -> 200063A0
     2: 20006A00 -> 20006400 -> 200063A0
     3: 20006A00 -> 20006400 -> 200063A0
     4: 20006A00 -> 20006400 -> 200063A0
     5: 20006A00 -> 20006400 -> 200063A0
     6: 20006A00 -> 20006400 -> 200063A0
     7: 20006A00 -> 20006400 -> 200063A0
     8: 20006A00 -> 20006400 -> 200063A0
     9: 20006A00 -> 20006400 -> 200063A0
    10: 20006A00 -> 20006400 -> 200063A0
    11: 20006A00 -> 20006400 -> 200063A0
    12: 20006A00 -> 20006400 -> 200063A0
    13: 20006A00 -> 20006400 -> 200063A0
    14: 20006A00 -> 20006400 -> 200063A0
    15: 20006A00 -> 20006400 -> 200063A0
    16: 20006A00 -> 20006400 -> 200063A0
    17: 20006A00 -> 20006400 -> 200063A0
    18: 20006A00 -> 20006400 -> 200063A0
    19: 20006A00 -> 20006400 -> 200063A0
    20: 20006A00 -> 20006400 -> 200063A0
    21: 20006A00 -> 20006400 -> 200063A0
    22: 20006A00 -> 20006400 -> 200063A0
    23: 20006A00 -> 20006400 -> 200063A0
    24: 20006A00 -> 20006400 -> 200063A0
    25: 20006A00 -> 20006400 -> 200063A0
    26: 20006A00 -> 20006400 -> 200063A0
    27: 20006A00 -> 20006400 -> 200063A0
    28: 20006A00 -> 20006400 -> 200063A0
    29: 20006A00 -> 20006400 -> 200063A0
    30: 20006A00 -> 20006400 -> 200063A0
    31: 20006A00 -> 20006400 -> 200063A0
      return new_Pipe: 200063A0
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    control callback (hid)
    05 01 09 02 A1 01 09 01 A1 00 95 10 75 01 15 00 25 01 05 09 19 01 29 10 81 02 95 02 75 10 16 01 80 26 FF 7F 05 01 09 30 09 31 81 06 95 01 75 08 15 81 25 7F 09 38 81 06 95 01 05 0C 0A 38 02 81 06 C0 06 00 FF 09 F1 75 08 95 05 15 00 26 FF 00 81 00 C0 
      mesg = 22000681
      got report descriptor
    Found top level collection 10002
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    control callback (keyboard)
      mesg = A21
    control callback (hid)
    06 00 FF 09 01 A1 01 85 10 95 06 75 08 15 00 26 FF 00 09 01 81 00 09 01 91 00 C0 06 00 FF 09 02 A1 01 85 11 95 13 75 08 15 00 26 FF 00 09 02 81 00 09 02 91 00 C0 
      mesg = 22000681
      got report descriptor
    Found top level collection FF000001
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    No Driver claimed topusage: FF000001
    Found top level collection FF000002
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    No Driver claimed topusage: FF000002
    KeyboardController Callback (member)
      KB Data: 01 00 00 00 00 00 00 00 
    ERROR Followup
    
    
    USB Mouse and Keyboard forwarder
    USB2 PLL running
     reset waited 6
    USBHS_ASYNCLISTADDR = 0
    USBHS_PERIODICLISTBASE = 20005000
    periodictable = 20005000
    port change: 10001803
        connect
      begin reset
    port change: 18001205
      port enabled
      end recovery
    new_Device: 480 Mbit/sec
    new_Pipe
      After endpoint > 0
      After capabilities
      first in async list
      return new_Pipe: 20005080
    enumeration:
    enumeration:
    enumeration:
    Device Descriptor:
      12 01 00 02 09 00 01 40 E3 05 08 06 36 85 00 01 00 01 
        VendorID = 05E3, ProductID = 0608, Version = 8536
        Class/Subclass/Protocol = 9(Hub) / 0 / 1(Single-TT)
        Number of Configurations = 1
    enumeration:
    enumeration:
    Product: USB2.0 Hub
    enumeration:
    Config data length = 25
    enumeration:
    Configuration Descriptor:
      09 02 19 00 01 01 00 E0 32 
        NumInterfaces = 1
        ConfigurationValue = 1
      09 04 00 00 01 09 00 00 00 
        Interface = 0
        Number of endpoints = 1
        Class/Subclass/Protocol = 9(Hub) / 0 / 0
      07 05 81 03 01 00 0C 
        Endpoint = 1 IN
        Type = Interrupt
        Max Size = 1
        Polling Interval = 12
    enumeration:
    USBHub memory usage = 960
    USBHub claim_device this=20006CE0
    found possible interface, altsetting=0
    number of interfaces found = 1
    USBHub control callback
    09 29 04 E0 00 32 64 00 FF 00 00 00 00 00 00 00 
    Hub ports = 4
    USBHub control callback
    USBHub control callback
    USBHub control callback
    USBHub control callback
    power turned on to all ports
    device addr = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
      ep interval = 12
      interval = 256
     best_bandwidth = 2, at offset = 0
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006AC0
      interval = 32
      offset =   0
        old slot 0: (empty)
      add to slot 0
        new slot 0: 20006AC0
    Periodic Schedule:
     0: 20006AC0
     1: (empty)
     2: (empty)
     3: (empty)
     4: (empty)
     5: (empty)
     6: (empty)
     7: (empty)
     8: (empty)
     9: (empty)
    10: (empty)
    11: (empty)
    12: (empty)
    13: (empty)
    14: (empty)
    15: (empty)
    16: (empty)
    17: (empty)
    18: (empty)
    19: (empty)
    20: (empty)
    21: (empty)
    22: (empty)
    23: (empty)
    24: (empty)
    25: (empty)
    26: (empty)
    27: (empty)
    28: (empty)
    29: (empty)
    30: (empty)
    31: (empty)
      return new_Pipe: 20006AC0
    pipe cap1 = F0012101
    HUB Callback (member)
    status = 10
    getstatus, port = 4
    USBHub control callback
    01 01 01 00 
    New Port Status
      status=10101  port=4
      state=0
      Device is present: 
      Has Power
    USBHub control callback
    Port Status Cleared, port=4
    timer event (19999 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=2
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=3
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=4
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=5
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 10
    getstatus, port = 4
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=4
      state=6
      Device is present: 
      Has Power
    sending reset
    send_setreset
    USBHub control callback
    unhandled setup, message = 40323
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 0
    HUB Callback (member)
    status = 10
    getstatus, port = 4
    USBHub control callback
    03 01 10 00 
    New Port Status
      status=100103  port=4
      state=7
      Device is present: 
      Enabled, speed = 12 Mbit/sec
      Has Power
    USBHub control callback
    unhandled setup, message = 140123
    timer event (25000 us): Hello, I'm resettimer, this = 20006CE0, timer = 20007018
    port_doing_reset = 4
    PORT_RECOVERY
    new_Device: 12 Mbit/sec
    new_Pipe
      After endpoint > 0
      After capabilities
      added to async list
      return new_Pipe: 20006A60
    enumeration:
    enumeration:
    enumeration:
    Device Descriptor:
      12 01 00 02 00 00 00 40 6D 04 47 C5 02 04 01 02 00 01 
        VendorID = 046D, ProductID = C547, Version = 0402
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    enumeration:
    enumeration:
    Manufacturer: Logitech
    enumeration:
    Product: USB Receiver
    enumeration:
    Config data length = 84
    enumeration:
    Configuration Descriptor:
      09 02 54 00 03 01 04 A0 31 
        NumInterfaces = 3
        ConfigurationValue = 1
      09 04 00 00 01 03 01 02 00 
        Interface = 0
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 1(Boot) / 2(Mouse)
      09 21 11 01 00 01 22 53 00 
        HID, 1 report descriptor
      07 05 81 03 40 00 01 
        Endpoint = 1 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
      09 04 01 00 01 03 01 01 00 
        Interface = 1
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 1(Boot) / 1(Keyboard)
      09 21 11 01 00 01 22 85 00 
        HID, 1 report descriptor
      07 05 82 03 40 00 01 
        Endpoint = 2 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
      09 04 02 00 01 03 00 00 00 
        Interface = 2
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 0 / 0
      09 21 11 01 00 01 22 36 00 
        HID, 1 report descriptor
      07 05 83 03 40 00 01 
        Endpoint = 3 IN
        Type = Interrupt
        Max Size = 64
        Polling Interval = 1
    enumeration:
    USBHub memory usage = 960
    USBHub claim_device this=200070A0
    KeyboardController claim this=20007460
    KeyboardController claim this=20007700
    HIDParser claim this=200051E0
    HIDParser claim this=200058A0
    HIDParser claim this=20005F60
    HIDParser claim this=20006620
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007460
    09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    KeyboardController claim this=20007700
    09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    HIDParser claim this=200051E0
     bInterfaceNumber =   0
     bInterfaceClass =    3
     bInterfaceSubClass = 1
     bInterfaceProtocol = 2
    HID Parser Claim: 09 04 00 00 01 03 01 02 00 09 21 11 01 00 01 22 53 00 07 05 81 03 40 00 01 09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    report descriptor size = 83
    Single endpoint HID:
      endpoint = 81
       size = 64
       interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 5, at offset = 0, shift= 0
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006A00
      interval = 1
      offset =   0
        old slot 0: 20006AC0
      traverse list 0
      num 20006AC2  node 20006AC0->1
      adding at node 20006AC0, num=20006AC2, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00
        old slot 1: (empty)
      add to slot 1
        new slot 1: 20006A00
        old slot 2: (empty)
      add to slot 2
        new slot 2: 20006A00
        old slot 3: (empty)
      add to slot 3
        new slot 3: 20006A00
        old slot 4: (empty)
      add to slot 4
        new slot 4: 20006A00
        old slot 5: (empty)
      add to slot 5
        new slot 5: 20006A00
        old slot 6: (empty)
      add to slot 6
        new slot 6: 20006A00
        old slot 7: (empty)
      add to slot 7
        new slot 7: 20006A00
        old slot 8: (empty)
      add to slot 8
        new slot 8: 20006A00
        old slot 9: (empty)
      add to slot 9
        new slot 9: 20006A00
        old slot 10: (empty)
      add to slot 10
        new slot 10: 20006A00
        old slot 11: (empty)
      add to slot 11
        new slot 11: 20006A00
        old slot 12: (empty)
      add to slot 12
        new slot 12: 20006A00
        old slot 13: (empty)
      add to slot 13
        new slot 13: 20006A00
        old slot 14: (empty)
      add to slot 14
        new slot 14: 20006A00
        old slot 15: (empty)
      add to slot 15
        new slot 15: 20006A00
        old slot 16: (empty)
      add to slot 16
        new slot 16: 20006A00
        old slot 17: (empty)
      add to slot 17
        new slot 17: 20006A00
        old slot 18: (empty)
      add to slot 18
        new slot 18: 20006A00
        old slot 19: (empty)
      add to slot 19
        new slot 19: 20006A00
        old slot 20: (empty)
      add to slot 20
        new slot 20: 20006A00
        old slot 21: (empty)
      add to slot 21
        new slot 21: 20006A00
        old slot 22: (empty)
      add to slot 22
        new slot 22: 20006A00
        old slot 23: (empty)
      add to slot 23
        new slot 23: 20006A00
        old slot 24: (empty)
      add to slot 24
        new slot 24: 20006A00
        old slot 25: (empty)
      add to slot 25
        new slot 25: 20006A00
        old slot 26: (empty)
      add to slot 26
        new slot 26: 20006A00
        old slot 27: (empty)
      add to slot 27
        new slot 27: 20006A00
        old slot 28: (empty)
      add to slot 28
        new slot 28: 20006A00
        old slot 29: (empty)
      add to slot 29
        new slot 29: 20006A00
        old slot 30: (empty)
      add to slot 30
        new slot 30: 20006A00
        old slot 31: (empty)
      add to slot 31
        new slot 31: 20006A00
    Periodic Schedule:
     0: 20006AC0 -> 20006A00
     1: 20006A00
     2: 20006A00
     3: 20006A00
     4: 20006A00
     5: 20006A00
     6: 20006A00
     7: 20006A00
     8: 20006A00
     9: 20006A00
    10: 20006A00
    11: 20006A00
    12: 20006A00
    13: 20006A00
    14: 20006A00
    15: 20006A00
    16: 20006A00
    17: 20006A00
    18: 20006A00
    19: 20006A00
    20: 20006A00
    21: 20006A00
    22: 20006A00
    23: 20006A00
    24: 20006A00
    25: 20006A00
    26: 20006A00
    27: 20006A00
    28: 20006A00
    29: 20006A00
    30: 20006A00
    31: 20006A00
      return new_Pipe: 20006A00
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007460
    09 04 01 00 01 03 01 01 00 09 21 11 01 00 01 22 85 00 07 05 82 03 40 00 01 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    ep = 82
    packet size = 64
    polling interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 7, at offset = 0, shift= 3
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20006400
      interval = 1
      offset =   0
        old slot 0: 20006AC0 -> 20006A00
      traverse list 0
      num 20006AC2  node 20006AC0->20006A02
      num 20006A02  node 20006A00->1
      adding at node 20006A00, num=20006A02, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00 -> 20006400
        old slot 1: 20006A00 -> 20006400
      traverse list 1
      num 20006A02  node 20006A00->20006402
        new slot 1: 20006A00 -> 20006400
        old slot 2: 20006A00 -> 20006400
      traverse list 2
      num 20006A02  node 20006A00->20006402
        new slot 2: 20006A00 -> 20006400
        old slot 3: 20006A00 -> 20006400
      traverse list 3
      num 20006A02  node 20006A00->20006402
        new slot 3: 20006A00 -> 20006400
        old slot 4: 20006A00 -> 20006400
      traverse list 4
      num 20006A02  node 20006A00->20006402
        new slot 4: 20006A00 -> 20006400
        old slot 5: 20006A00 -> 20006400
      traverse list 5
      num 20006A02  node 20006A00->20006402
        new slot 5: 20006A00 -> 20006400
        old slot 6: 20006A00 -> 20006400
      traverse list 6
      num 20006A02  node 20006A00->20006402
        new slot 6: 20006A00 -> 20006400
        old slot 7: 20006A00 -> 20006400
      traverse list 7
      num 20006A02  node 20006A00->20006402
        new slot 7: 20006A00 -> 20006400
        old slot 8: 20006A00 -> 20006400
      traverse list 8
      num 20006A02  node 20006A00->20006402
        new slot 8: 20006A00 -> 20006400
        old slot 9: 20006A00 -> 20006400
      traverse list 9
      num 20006A02  node 20006A00->20006402
        new slot 9: 20006A00 -> 20006400
        old slot 10: 20006A00 -> 20006400
      traverse list 10
      num 20006A02  node 20006A00->20006402
        new slot 10: 20006A00 -> 20006400
        old slot 11: 20006A00 -> 20006400
      traverse list 11
      num 20006A02  node 20006A00->20006402
        new slot 11: 20006A00 -> 20006400
        old slot 12: 20006A00 -> 20006400
      traverse list 12
      num 20006A02  node 20006A00->20006402
        new slot 12: 20006A00 -> 20006400
        old slot 13: 20006A00 -> 20006400
      traverse list 13
      num 20006A02  node 20006A00->20006402
        new slot 13: 20006A00 -> 20006400
        old slot 14: 20006A00 -> 20006400
      traverse list 14
      num 20006A02  node 20006A00->20006402
        new slot 14: 20006A00 -> 20006400
        old slot 15: 20006A00 -> 20006400
      traverse list 15
      num 20006A02  node 20006A00->20006402
        new slot 15: 20006A00 -> 20006400
        old slot 16: 20006A00 -> 20006400
      traverse list 16
      num 20006A02  node 20006A00->20006402
        new slot 16: 20006A00 -> 20006400
        old slot 17: 20006A00 -> 20006400
      traverse list 17
      num 20006A02  node 20006A00->20006402
        new slot 17: 20006A00 -> 20006400
        old slot 18: 20006A00 -> 20006400
      traverse list 18
      num 20006A02  node 20006A00->20006402
        new slot 18: 20006A00 -> 20006400
        old slot 19: 20006A00 -> 20006400
      traverse list 19
      num 20006A02  node 20006A00->20006402
        new slot 19: 20006A00 -> 20006400
        old slot 20: 20006A00 -> 20006400
      traverse list 20
      num 20006A02  node 20006A00->20006402
        new slot 20: 20006A00 -> 20006400
        old slot 21: 20006A00 -> 20006400
      traverse list 21
      num 20006A02  node 20006A00->20006402
        new slot 21: 20006A00 -> 20006400
        old slot 22: 20006A00 -> 20006400
      traverse list 22
      num 20006A02  node 20006A00->20006402
        new slot 22: 20006A00 -> 20006400
        old slot 23: 20006A00 -> 20006400
      traverse list 23
      num 20006A02  node 20006A00->20006402
        new slot 23: 20006A00 -> 20006400
        old slot 24: 20006A00 -> 20006400
      traverse list 24
      num 20006A02  node 20006A00->20006402
        new slot 24: 20006A00 -> 20006400
        old slot 25: 20006A00 -> 20006400
      traverse list 25
      num 20006A02  node 20006A00->20006402
        new slot 25: 20006A00 -> 20006400
        old slot 26: 20006A00 -> 20006400
      traverse list 26
      num 20006A02  node 20006A00->20006402
        new slot 26: 20006A00 -> 20006400
        old slot 27: 20006A00 -> 20006400
      traverse list 27
      num 20006A02  node 20006A00->20006402
        new slot 27: 20006A00 -> 20006400
        old slot 28: 20006A00 -> 20006400
      traverse list 28
      num 20006A02  node 20006A00->20006402
        new slot 28: 20006A00 -> 20006400
        old slot 29: 20006A00 -> 20006400
      traverse list 29
      num 20006A02  node 20006A00->20006402
        new slot 29: 20006A00 -> 20006400
        old slot 30: 20006A00 -> 20006400
      traverse list 30
      num 20006A02  node 20006A00->20006402
        new slot 30: 20006A00 -> 20006400
        old slot 31: 20006A00 -> 20006400
      traverse list 31
      num 20006A02  node 20006A00->20006402
        new slot 31: 20006A00 -> 20006400
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20006400
     1: 20006A00 -> 20006400
     2: 20006A00 -> 20006400
     3: 20006A00 -> 20006400
     4: 20006A00 -> 20006400
     5: 20006A00 -> 20006400
     6: 20006A00 -> 20006400
     7: 20006A00 -> 20006400
     8: 20006A00 -> 20006400
     9: 20006A00 -> 20006400
    10: 20006A00 -> 20006400
    11: 20006A00 -> 20006400
    12: 20006A00 -> 20006400
    13: 20006A00 -> 20006400
    14: 20006A00 -> 20006400
    15: 20006A00 -> 20006400
    16: 20006A00 -> 20006400
    17: 20006A00 -> 20006400
    18: 20006A00 -> 20006400
    19: 20006A00 -> 20006400
    20: 20006A00 -> 20006400
    21: 20006A00 -> 20006400
    22: 20006A00 -> 20006400
    23: 20006A00 -> 20006400
    24: 20006A00 -> 20006400
    25: 20006A00 -> 20006400
    26: 20006A00 -> 20006400
    27: 20006A00 -> 20006400
    28: 20006A00 -> 20006400
    29: 20006A00 -> 20006400
    30: 20006A00 -> 20006400
    31: 20006A00 -> 20006400
      return new_Pipe: 20006400
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007700
    09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    HIDParser claim this=200058A0
     bInterfaceNumber =   2
     bInterfaceClass =    3
     bInterfaceSubClass = 0
     bInterfaceProtocol = 0
    HID Parser Claim: 09 04 02 00 01 03 00 00 00 09 21 11 01 00 01 22 36 00 07 05 83 03 40 00 01 
    report descriptor size = 54
    Single endpoint HID:
      endpoint = 83
       size = 64
       interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 9, at offset = 0, shift= 3
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 200063A0
      interval = 1
      offset =   0
        old slot 0: 20006AC0 -> 20006A00 -> 20006400
      traverse list 0
      num 20006AC2  node 20006AC0->20006A02
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->1
      adding at node 20006400, num=20006402, node->qh.horizontal_link=1
        new slot 0: 20006AC0 -> 20006A00 -> 20006400 -> 200063A0
        old slot 1: 20006A00 -> 20006400 -> 200063A0
      traverse list 1
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 1: 20006A00 -> 20006400 -> 200063A0
        old slot 2: 20006A00 -> 20006400 -> 200063A0
      traverse list 2
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 2: 20006A00 -> 20006400 -> 200063A0
        old slot 3: 20006A00 -> 20006400 -> 200063A0
      traverse list 3
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 3: 20006A00 -> 20006400 -> 200063A0
        old slot 4: 20006A00 -> 20006400 -> 200063A0
      traverse list 4
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 4: 20006A00 -> 20006400 -> 200063A0
        old slot 5: 20006A00 -> 20006400 -> 200063A0
      traverse list 5
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 5: 20006A00 -> 20006400 -> 200063A0
        old slot 6: 20006A00 -> 20006400 -> 200063A0
      traverse list 6
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 6: 20006A00 -> 20006400 -> 200063A0
        old slot 7: 20006A00 -> 20006400 -> 200063A0
      traverse list 7
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 7: 20006A00 -> 20006400 -> 200063A0
        old slot 8: 20006A00 -> 20006400 -> 200063A0
      traverse list 8
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 8: 20006A00 -> 20006400 -> 200063A0
        old slot 9: 20006A00 -> 20006400 -> 200063A0
      traverse list 9
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 9: 20006A00 -> 20006400 -> 200063A0
        old slot 10: 20006A00 -> 20006400 -> 200063A0
      traverse list 10
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 10: 20006A00 -> 20006400 -> 200063A0
        old slot 11: 20006A00 -> 20006400 -> 200063A0
      traverse list 11
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 11: 20006A00 -> 20006400 -> 200063A0
        old slot 12: 20006A00 -> 20006400 -> 200063A0
      traverse list 12
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 12: 20006A00 -> 20006400 -> 200063A0
        old slot 13: 20006A00 -> 20006400 -> 200063A0
      traverse list 13
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 13: 20006A00 -> 20006400 -> 200063A0
        old slot 14: 20006A00 -> 20006400 -> 200063A0
      traverse list 14
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 14: 20006A00 -> 20006400 -> 200063A0
        old slot 15: 20006A00 -> 20006400 -> 200063A0
      traverse list 15
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 15: 20006A00 -> 20006400 -> 200063A0
        old slot 16: 20006A00 -> 20006400 -> 200063A0
      traverse list 16
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 16: 20006A00 -> 20006400 -> 200063A0
        old slot 17: 20006A00 -> 20006400 -> 200063A0
      traverse list 17
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 17: 20006A00 -> 20006400 -> 200063A0
        old slot 18: 20006A00 -> 20006400 -> 200063A0
      traverse list 18
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 18: 20006A00 -> 20006400 -> 200063A0
        old slot 19: 20006A00 -> 20006400 -> 200063A0
      traverse list 19
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 19: 20006A00 -> 20006400 -> 200063A0
        old slot 20: 20006A00 -> 20006400 -> 200063A0
      traverse list 20
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 20: 20006A00 -> 20006400 -> 200063A0
        old slot 21: 20006A00 -> 20006400 -> 200063A0
      traverse list 21
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 21: 20006A00 -> 20006400 -> 200063A0
        old slot 22: 20006A00 -> 20006400 -> 200063A0
      traverse list 22
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 22: 20006A00 -> 20006400 -> 200063A0
        old slot 23: 20006A00 -> 20006400 -> 200063A0
      traverse list 23
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 23: 20006A00 -> 20006400 -> 200063A0
        old slot 24: 20006A00 -> 20006400 -> 200063A0
      traverse list 24
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 24: 20006A00 -> 20006400 -> 200063A0
        old slot 25: 20006A00 -> 20006400 -> 200063A0
      traverse list 25
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 25: 20006A00 -> 20006400 -> 200063A0
        old slot 26: 20006A00 -> 20006400 -> 200063A0
      traverse list 26
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 26: 20006A00 -> 20006400 -> 200063A0
        old slot 27: 20006A00 -> 20006400 -> 200063A0
      traverse list 27
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 27: 20006A00 -> 20006400 -> 200063A0
        old slot 28: 20006A00 -> 20006400 -> 200063A0
      traverse list 28
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 28: 20006A00 -> 20006400 -> 200063A0
        old slot 29: 20006A00 -> 20006400 -> 200063A0
      traverse list 29
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 29: 20006A00 -> 20006400 -> 200063A0
        old slot 30: 20006A00 -> 20006400 -> 200063A0
      traverse list 30
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 30: 20006A00 -> 20006400 -> 200063A0
        old slot 31: 20006A00 -> 20006400 -> 200063A0
      traverse list 31
      num 20006A02  node 20006A00->20006402
      num 20006402  node 20006400->200063A2
        new slot 31: 20006A00 -> 20006400 -> 200063A0
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20006400 -> 200063A0
     1: 20006A00 -> 20006400 -> 200063A0
     2: 20006A00 -> 20006400 -> 200063A0
     3: 20006A00 -> 20006400 -> 200063A0
     4: 20006A00 -> 20006400 -> 200063A0
     5: 20006A00 -> 20006400 -> 200063A0
     6: 20006A00 -> 20006400 -> 200063A0
     7: 20006A00 -> 20006400 -> 200063A0
     8: 20006A00 -> 20006400 -> 200063A0
     9: 20006A00 -> 20006400 -> 200063A0
    10: 20006A00 -> 20006400 -> 200063A0
    11: 20006A00 -> 20006400 -> 200063A0
    12: 20006A00 -> 20006400 -> 200063A0
    13: 20006A00 -> 20006400 -> 200063A0
    14: 20006A00 -> 20006400 -> 200063A0
    15: 20006A00 -> 20006400 -> 200063A0
    16: 20006A00 -> 20006400 -> 200063A0
    17: 20006A00 -> 20006400 -> 200063A0
    18: 20006A00 -> 20006400 -> 200063A0
    19: 20006A00 -> 20006400 -> 200063A0
    20: 20006A00 -> 20006400 -> 200063A0
    21: 20006A00 -> 20006400 -> 200063A0
    22: 20006A00 -> 20006400 -> 200063A0
    23: 20006A00 -> 20006400 -> 200063A0
    24: 20006A00 -> 20006400 -> 200063A0
    25: 20006A00 -> 20006400 -> 200063A0
    26: 20006A00 -> 20006400 -> 200063A0
    27: 20006A00 -> 20006400 -> 200063A0
    28: 20006A00 -> 20006400 -> 200063A0
    29: 20006A00 -> 20006400 -> 200063A0
    30: 20006A00 -> 20006400 -> 200063A0
    31: 20006A00 -> 20006400 -> 200063A0
      return new_Pipe: 200063A0
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    control callback (hid)
    05 01 09 02 A1 01 09 01 A1 00 95 10 75 01 15 00 25 01 05 09 19 01 29 10 81 02 95 02 75 10 16 01 80 26 FF 7F 05 01 09 30 09 31 81 06 95 01 75 08 15 81 25 7F 09 38 81 06 95 01 05 0C 0A 38 02 81 06 C0 06 00 FF 09 F1 75 08 95 05 15 00 26 FF 00 81 00 C0 
      mesg = 22000681
      got report descriptor
    Found top level collection 10002
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    control callback (keyboard)
      mesg = A21
    control callback (hid)
    06 00 FF 09 01 A1 01 85 10 95 06 75 08 15 00 26 FF 00 09 01 81 00 09 01 91 00 C0 06 00 FF 09 02 A1 01 85 11 95 13 75 08 15 00 26 FF 00 09 02 81 00 09 02 91 00 C0 
      mesg = 22000681
      got report descriptor
    Found top level collection FF000001
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    No Driver claimed topusage: FF000001
    Found top level collection FF000002
    find_driver
      driver 2000746C
      driver 2000770C
      driver 20008830
    No Driver claimed topusage: FF000002
    KeyboardController Callback (member)
      KB Data: 01 00 00 00 00 00 00 00 
    ERROR Followup
    HUB Callback (member)
    status = 4
    getstatus, port = 2
    USBHub control callback
    01 01 01 00 
    New Port Status
      status=10101  port=2
      state=0
      Device is present: 
      Has Power
    USBHub control callback
    Port Status Cleared, port=2
    timer event (19999 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 4
    getstatus, port = 2
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=2
      state=2
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 4
    getstatus, port = 2
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=2
      state=3
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 4
    getstatus, port = 2
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=2
      state=4
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 4
    getstatus, port = 2
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=2
      state=5
      Device is present: 
      Has Power
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 4
    getstatus, port = 2
    USBHub control callback
    01 01 00 00 
    New Port Status
      status=101  port=2
      state=6
      Device is present: 
      Has Power
    sending reset
    send_setreset
    USBHub control callback
    unhandled setup, message = 40323
    timer event (20000 us): Debounce Timer, this = 20006CE0, timer = 20006FF8
    ports in use bitmask = 0
    HUB Callback (member)
    status = 4
    getstatus, port = 2
    USBHub control callback
    03 01 10 00 
    New Port Status
      status=100103  port=2
      state=7
      Device is present: 
      Enabled, speed = 12 Mbit/sec
      Has Power
    USBHub control callback
    unhandled setup, message = 140123
    timer event (25000 us): Hello, I'm resettimer, this = 20006CE0, timer = 20007018
    port_doing_reset = 2
    PORT_RECOVERY
    new_Device: 12 Mbit/sec
    new_Pipe
      After endpoint > 0
      After capabilities
      added to async list
      return new_Pipe: 20006340
    enumeration:
    enumeration:
    enumeration:
    Device Descriptor:
      12 01 00 02 00 00 00 08 D9 04 6B A0 02 03 01 02 00 01 
        VendorID = 04D9, ProductID = A06B, Version = 0302
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    ERROR Followup
        remove from followup list
        remove from followup list
        stray halted 20006C20
      qtd: 20006C20, token=80008080, next=20005160
      dummy halt: 20005160
    enumeration:
    enumeration:
    Config data length = 84
    enumeration:
    Configuration Descriptor:
      09 02 54 00 03 01 00 A0 32 
        NumInterfaces = 3
        ConfigurationValue = 1
      09 04 00 00 01 03 01 01 00 
        Interface = 0
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 1(Boot) / 1(Keyboard)
      09 21 10 01 00 01 22 3B 00 
        HID, 1 report descriptor
      07 05 81 03 08 00 08 
        Endpoint = 1 IN
        Type = Interrupt
        Max Size = 8
        Polling Interval = 8
      09 04 01 00 01 03 00 00 00 
        Interface = 1
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 0 / 0
      09 21 10 01 00 01 22 51 00 
        HID, 1 report descriptor
      07 05 82 03 10 00 08 
        Endpoint = 2 IN
        Type = Interrupt
        Max Size = 16
        Polling Interval = 8
      09 04 02 00 01 03 00 00 00 
        Interface = 2
        Number of endpoints = 1
        Class/Subclass/Protocol = 3(HID) / 0 / 0
      09 21 10 01 00 01 22 25 00 
        HID, 1 report descriptor
      07 05 83 03 10 00 01 
        Endpoint = 3 IN
        Type = Interrupt
        Max Size = 16
        Polling Interval = 1
    enumeration:
    USBHub memory usage = 960
    USBHub claim_device this=200070A0
    KeyboardController claim this=20007700
    HIDParser claim this=20005F60
    HIDParser claim this=20006620
    Descriptor 4 = INTERFACE
    KeyboardController claim this=20007700
    09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 3B 00 07 05 81 03 08 00 08 09 04 01 00 01 03 00 00 00 09 21 10 01 00 01 22 51 00 07 05 82 03 10 00 08 09 04 02 00 01 03 00 00 00 09 21 10 01 00 01 22 25 00 07 05 83 03 10 00 01 
    ep = 81
    packet size = 8
    polling interval = 8
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 11, at offset = 0, shift= 2
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20005D40
      interval = 8
      offset =   0
        old slot 0: 20006AC0 -> 20006A00 -> 20006400 -> 200063A0
      traverse list 0
      num 20006AC2  node 20006AC0->20006A02
      adding at node 20006A00, num=20006A02, node->qh.horizontal_link=20006402
        new slot 0: 20006AC0 -> 20006A00 -> 20005D40 -> 20006400 -> 200063A0
        old slot 8: 20006A00 -> 20005D40 -> 20006400 -> 200063A0
      add to slot 8
        new slot 8: 20005D40 -> 20006A00 -> (loops) 20005D40
        old slot 16: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 16
        new slot 16: 20005D40 -> 20006A00 -> (loops) 20005D40
        old slot 24: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 24
        new slot 24: 20005D40 -> 20006A00 -> (loops) 20005D40
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
     1: 20006A00 -> 20005D40 -> (loops) 20006A00
     2: 20006A00 -> 20005D40 -> (loops) 20006A00
     3: 20006A00 -> 20005D40 -> (loops) 20006A00
     4: 20006A00 -> 20005D40 -> (loops) 20006A00
     5: 20006A00 -> 20005D40 -> (loops) 20006A00
     6: 20006A00 -> 20005D40 -> (loops) 20006A00
     7: 20006A00 -> 20005D40 -> (loops) 20006A00
     8: 20005D40 -> 20006A00 -> (loops) 20005D40
     9: 20006A00 -> 20005D40 -> (loops) 20006A00
    10: 20006A00 -> 20005D40 -> (loops) 20006A00
    11: 20006A00 -> 20005D40 -> (loops) 20006A00
    12: 20006A00 -> 20005D40 -> (loops) 20006A00
    13: 20006A00 -> 20005D40 -> (loops) 20006A00
    14: 20006A00 -> 20005D40 -> (loops) 20006A00
    15: 20006A00 -> 20005D40 -> (loops) 20006A00
    16: 20005D40 -> 20006A00 -> (loops) 20005D40
    17: 20006A00 -> 20005D40 -> (loops) 20006A00
    18: 20006A00 -> 20005D40 -> (loops) 20006A00
    19: 20006A00 -> 20005D40 -> (loops) 20006A00
    20: 20006A00 -> 20005D40 -> (loops) 20006A00
    21: 20006A00 -> 20005D40 -> (loops) 20006A00
    22: 20006A00 -> 20005D40 -> (loops) 20006A00
    23: 20006A00 -> 20005D40 -> (loops) 20006A00
    24: 20005D40 -> 20006A00 -> (loops) 20005D40
    25: 20006A00 -> 20005D40 -> (loops) 20006A00
    26: 20006A00 -> 20005D40 -> (loops) 20006A00
    27: 20006A00 -> 20005D40 -> (loops) 20006A00
    28: 20006A00 -> 20005D40 -> (loops) 20006A00
    29: 20006A00 -> 20005D40 -> (loops) 20006A00
    30: 20006A00 -> 20005D40 -> (loops) 20006A00
    31: 20006A00 -> 20005D40 -> (loops) 20006A00
      return new_Pipe: 20005D40
    SET_PROTOCOL Boot
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    HIDParser claim this=20005F60
     bInterfaceNumber =   1
     bInterfaceClass =    3
     bInterfaceSubClass = 0
     bInterfaceProtocol = 0
    HID Parser Claim: 09 04 01 00 01 03 00 00 00 09 21 10 01 00 01 22 51 00 07 05 82 03 10 00 08 09 04 02 00 01 03 00 00 00 09 21 10 01 00 01 22 25 00 07 05 83 03 10 00 01 
    report descriptor size = 81
    Single endpoint HID:
      endpoint = 82
       size = 16
       interval = 8
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 11, at offset = 1, shift= 2
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20005CE0
      interval = 8
      offset =   1
        old slot 1: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 1
        new slot 1: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
        old slot 9: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 9
        new slot 9: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
        old slot 17: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 17
        new slot 17: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
        old slot 25: 20006A00 -> 20005D40 -> (loops) 20006A00
      add to slot 25
        new slot 25: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
    Periodic Schedule:
     0: 20006AC0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
     1: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
     2: 20006A00 -> 20005D40 -> (loops) 20006A00
     3: 20006A00 -> 20005D40 -> (loops) 20006A00
     4: 20006A00 -> 20005D40 -> (loops) 20006A00
     5: 20006A00 -> 20005D40 -> (loops) 20006A00
     6: 20006A00 -> 20005D40 -> (loops) 20006A00
     7: 20006A00 -> 20005D40 -> (loops) 20006A00
     8: 20005D40 -> 20006A00 -> (loops) 20005D40
     9: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
    10: 20006A00 -> 20005D40 -> (loops) 20006A00
    11: 20006A00 -> 20005D40 -> (loops) 20006A00
    12: 20006A00 -> 20005D40 -> (loops) 20006A00
    13: 20006A00 -> 20005D40 -> (loops) 20006A00
    14: 20006A00 -> 20005D40 -> (loops) 20006A00
    15: 20006A00 -> 20005D40 -> (loops) 20006A00
    16: 20005D40 -> 20006A00 -> (loops) 20005D40
    17: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
    18: 20006A00 -> 20005D40 -> (loops) 20006A00
    19: 20006A00 -> 20005D40 -> (loops) 20006A00
    20: 20006A00 -> 20005D40 -> (loops) 20006A00
    21: 20006A00 -> 20005D40 -> (loops) 20006A00
    22: 20006A00 -> 20005D40 -> (loops) 20006A00
    23: 20006A00 -> 20005D40 -> (loops) 20006A00
    24: 20005D40 -> 20006A00 -> (loops) 20005D40
    25: 20005CE0 -> 20006A00 -> 20005D40 -> (loops) 20006A00
    26: 20006A00 -> 20005D40 -> (loops) 20006A00
    27: 20006A00 -> 20005D40 -> (loops) 20006A00
    28: 20006A00 -> 20005D40 -> (loops) 20006A00
    29: 20006A00 -> 20005D40 -> (loops) 20006A00
    30: 20006A00 -> 20005D40 -> (loops) 20006A00
    31: 20006A00 -> 20005D40 -> (loops) 20006A00
      return new_Pipe: 20005CE0
    Descriptor 33 = HID
    Descriptor 5 = ENDPOINT
    Descriptor 4 = INTERFACE
    HIDParser claim this=20006620
     bInterfaceNumber =   2
     bInterfaceClass =    3
     bInterfaceSubClass = 0
     bInterfaceProtocol = 0
    HID Parser Claim: 09 04 02 00 01 03 00 00 00 09 21 10 01 00 01 22 25 00 07 05 83 03 10 00 01 
    report descriptor size = 37
    Single endpoint HID:
      endpoint = 83
       size = 16
       interval = 1
    new_Pipe
    allocate_interrupt_pipe_bandwidth
     best_bandwidth = 11, at offset = 2, shift= 2
    return from: allocate_interrupt_pipe_bandwidth
      After endpoint > 0
      After capabilities
      before add_qh_to_periodic_schedule
    add_qh_to_periodic_schedule: 20005C80
      interval = 1
      offset =   2
        old slot 2: 20006A00 -> 20005D40 -> (loops) 20006A00
      traverse list 2
      num 20006A02  node 20006A00->20005D42
      num 20005D42  node 20005D40->20006A02
      num 20006A02  node 20006A00->20005D42
      num 20005D42  node 20005D40->20006A02
      num 20006A02  node 20006A00->20005D42
    
    <Repeated until I powered off>

  17. #17
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,986
    Quote Originally Posted by KurtE View Post
    I am not sure if you had a chance to play with this HUB yet?
    Nope, not yet. It's been sitting on my desk, still inside the original box.

    We're just today catching up to backlog of Teensy 4.0 orders (mostly for distributors) but I have a huge pile of stuff on my workbench. Should I move this hub up in priority?

  18. #18
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    As for priority hard to say... It may not be fully related to this hub... But simply order of what things stings startup in what order

    I will try to take a look on why when it Starts in certain order it ends up ending up with all looped QH... Almost like it is adding the same item twice.

    That is an area of the USBHost stuff, that I probably need to learn better.

    Another other interesting USBHost_t36 host thing with a Tablet that @mjs513 has that for example reports a different VID/PID on T4.x than it does on T3.6 or Windows/Linus/RPI.
    https://forum.pjrc.com/threads/70855...-a-USB-VID-PID

    I think it is some form of composite device? Whatever that means.
    We see it as:
    Code:
    Device Descriptor:
      12 01 10 01 00 00 00 40 16 04 00 3F 00 00 01 02 00 01 
        VendorID = 0416, ProductID = 3F00, Version = 0000
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    enumeration:
    enumeration:
    Manufacturer: Nuvoton
    enumeration:
    Product: WPM USB
    Others see it as a different ID... And T3.6 goes through both:
    Extracted from the other thread:

    Code:
    USB HID Device Info Program
    
    This Sketch shows information about plugged in HID devices
    ...
    Device Descriptor:
      12 01 10 01 00 00 00 40 16 04 00 3F 00 00 01 02 00 01 
        VendorID = 0416, ProductID = 3F00, Version = 0000
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    enumeration:
    enumeration:
    Manufacturer: Nuvoton
    enumeration:
    Product: WPM USB
    
    
    
    ** Lots of stuff ** then
    
    removed Device_t from devlist
      disable
    *** HID Device hdc1 - disconnected ***
    *** Device HID1 - disconnected ***
    port change: 10001803
        connect
      begin reset
    port change: 10001005
      port enabled
      end recovery
    new_Device: 12 Mbit/sec
    new_Pipe
    enumeration:
    Device Descriptor:
      12 01 10 01 00 00 00 08 6C 25 6D 00 00 00 05 06 00 01 
        VendorID = 256C, ProductID = 006D, Version = 0000
        Class/Subclass/Protocol = 0 / 0 / 0
        Number of Configurations = 1
    enumeration:
    ERROR Followup
        remove from followup list
        remove from followup list
        stray halted 1FFFAAC0
      qtd: 1FFFAAC0, token=80008080, next=1FFFAB40
      dummy halt: 1FFFAB40
    enumeration:
    Manufacturer: Љ
    ERROR Followup
        remove from followup list
        remove from followup list
        stray halted 1FFFAB00
      qtd: 1FFFAB00, token=80008080, next=1FFF74E0
      dummy halt: 1FFF74E0
    ...
    *** HID Device hdc2 256c: 6d - connected ***
    Again beyond my pay grade

  19. #19
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    Paul and all,

    On the HUB and the like... I don't have the MIDI, but running into the issue as mentioned in the other thread mentioned in #16

    But I wonder if it may be related to the earlier in the posting above, when
    the Mouse Wireless controller is detected and devices claimed, and the like:
    The Wireless controller appears to be setup to handle both a Mouse and a Keyboard, but the one I purchased has no keyboard.
    But it will claim one. At the end of it with USBHost Debug turned on, we see an ERROR Followup message.

    I have turned on more debug stuff and hacked in some additional debug output.
    Code:
    ISR: CC08B
     USB Error
     USB Async
     USB Periodic
    Async Followup
    Transfer Followup List 0 to 0
        forward:
        backward:
    Transfer Followup List 0 to 0
        forward:
        backward:
    Periodic Followup
      Followup 20006BA0    token=18180
      Followup 20006560    token=88150
    KeyboardController Callback (member)
      KB Data: 01 00 00 00 00 00 00 00 
        completed
      Followup 20006BE0    token=408180
      Followup 20006B20    token=408180
      Followup 20006460    token=408180
      Followup 20005E20    token=408180
      Followup 20006520    token=88180
    ERROR Followup: Async:0 Periodic:20006BA0
      Walk Periodic:
        20006BA0  Followup 20006BA0    token=18180
        20006BE0  Followup 20006BE0    token=408180
        20006B20  Followup 20006B20    token=408180
        20006460  Followup 20006460    token=408180
        20005E20  Followup 20005E20    token=408180
        20006520  Followup 20006520    token=88180
    The Async follow up list was NULL, so nothing happened here.
    Some of the last is garbage, there was a TODO to handle periodic, so thought I would at least do quick and dirty print out the list.

    So then went back and looked at the Keyboard callback stuff:

    The Token is 88150:the 0x8000 bit was set so Completed and as such we do the callback with the data shown:
    But if I am looking correctly, the low byte is status? 0x50 so bits 4 and 6 (Halted, Babble) ?

    Again, not sure if this is related to the creation of loops in the linked list?
    Where it looked like we were adding the same QTD that already existed in the list.

  20. #20
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    27,986
    Ok, I have it on my workbench now with 1 USB MIDI device. So far I'm not seeing anything wrong.

    Click image for larger version. 

Name:	midi.jpg 
Views:	8 
Size:	113.7 KB 
ID:	29215

    I added this so I can see the incoming MIDI messages as I turn the knobs or touch the drum pads.

    Code:
      if (midi01.read()) { // USB Host to 5 pin DIN
        uint8_t type =       midi01.getType();
        uint8_t data1 =      midi01.getData1();
        uint8_t data2 =      midi01.getData2();
        uint8_t channel =    midi01.getChannel();
        const uint8_t *sys = midi01.getSysExArray();
        Serial.printf("USB MIDI: %02x %02x %02x\n", type, data1, data2);
        sendToMIDI(type, data1, data2, channel, sys);
    
        activity = true;
      }
    Everything seems to work fine.

    Click image for larger version. 

Name:	screenshot.jpg 
Views:	8 
Size:	53.3 KB 
ID:	29216

    Do I need to plug multiple devices into the hub? Or any suggestions on other things I should try to reproduce the problem?

  21. #21
    Senior Member+ KurtE's Avatar
    Join Date
    Jan 2014
    Posts
    11,657
    When I have been able to cause the issues in previous posts, it took at least two things plugged in.

    I was doing with Mouse and keyboard. And it appeared like what those devices were and maybe order they were enumerated mattered.
    And not sure but maybe which slots.

    For example, I had the Logitech G Super light wireless controller plugged into the 3rd slot. Where first is the one nearest the wire.
    I had a keyboard plugged into the 1st or 2nd slot. (I actually had two keyboards plugged in) where 1st was Gigabyte (another problem child) and 2nd some simple Dell keyboard.

    I would reproduce the issue by first turning on the power or starting up with power on the logitech wireless mouse.
    Again, Mouse controller has both Mouse and Keyboard, Note I did not buy mine with keyboard. Keyboard was sending 64 byte messages.

    Then I would turn on one of the keyboards and system dead. Post #16 shows full debug where when the keyboard was created it ended up creating loops.

    I changed the printing of loop detecting slightly as the loops was not back to the start of the list, but back to 2nd item.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •