Hi,
Supposedly, VBox probably starts out with a controller in the state as if it was just reset, unlike real hardware. So, and as with other emulators, your code should still work even though you haven't reset the controller. However, without resetting the controller and making sure the Run bit is clear *and* the HcHalted bit is set, there is no need to proceed any further. The assumption that the emulator will start the controller in a known state is just that, an assumption.
Bochs calls the Controller Reset code at initialization time as if you reset the controller yourself. With the code you sent me, and the binary image, Bochs still didn't receive TD requests. This means you still have something wrong with your TD set up.
However, and I can't express this enough, if you haven't got the controller in a known state, a state that your driver knows, there is no need to try to fix the TD setup. Controller reset is a must. There is no idea or standard that says the BIOS must leave it in a certain state.
To move on to your question, I don't know nor have I ever used the Log part of VBox, but the following:
Code: Select all
VBoxDbg> info ehci
USBCMD: 80031
EHCI_CMD_RUN
EHCI_CMD_PERIODIC_SCHED_ENABLE
EHCI_CMD_ASYNC_SCHED_ENABLE
This tells me that the controller is in the run state, with the two schedules enabled, right off the bat. You must not initialize the controller when it is in the Run state.
Also, something else jumps out:
Code: Select all
USBINTR: 0
FRINDEX: 4a5800
CTRLDSSEGMENT: 0
How can the Frame Index register be at that point? The highest value it can have is 0x1FFF, not counting the SOFV write-through.
Code: Select all
1024 * 8 (0x400 * 0x008) = 8192 - 1 (0x2000 - 1)
Last frame is 1023, with last micro-frame as 7:
i.e.: There cannot be more than 14 bits used, bits 13:0 only.
There is a definite error in VBox to even display that value, as well as probably an error letting it get to that value. However, since my code and most likely most all other code works just fine in VBox, there must be something within your code writing to this register, and as stated before, the specifications specifically state that writing to this register in the Run State will produce undefined results...
Ben
-
http://www.fysnet.net/the_universal_serial_bus.htm