Teensy 4.0 USBHost_t36 - Won't Recognize USB Hub

grub

Member
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/2021/04/midi-usb-host-to-and-from-midi-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?psc=1&ref=ppx_yo2ov_dt_b_product_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);
  }
}
 
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.
 
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.
 
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
 
@ Paul Thank you for the quick response! I tried both of those things and it did not make a difference.
 
@defragster Is the debug you're referring to #define USBHOST_PRINT_DEBUG in the USBHost_t36.h file?
 
@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
 
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?
 
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.
 
I’m excited to see what you guys find out about this hub. Thanks for the help and interest in my issue!
 
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?
 
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.
 
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/6925...yboard-Problem?p=311207&viewfull=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>
 
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?
 
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-USBHost-not-identify-Device-PID-VID-but-Rather-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 ;)
 
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.
 
Ok, I have it on my workbench now with 1 USB MIDI device. So far I'm not seeing anything wrong.

midi.jpg

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();
    [COLOR="#FF0000"]Serial.printf("USB MIDI: %02x %02x %02x\n", type, data1, data2);[/COLOR]
    sendToMIDI(type, data1, data2, channel, sys);

    activity = true;
  }

Everything seems to work fine.

screenshot.jpg

Do I need to plug multiple devices into the hub? Or any suggestions on other things I should try to reproduce the problem?
 
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.
 
Back
Top