tags:

views:

230

answers:

2

Is there an easy way to programmatically determine the speed (or version) of a USB port? I'm looking to control the speed of data sent to a usb port based its maximum bandwidth.

+3  A: 

If you need a solution for Windows this should be a good start:

http://msdn.microsoft.com/en-us/library/ms793313.aspx

Basically you should try this:

  1. Enumerate the USB devices and the symbolic names to their drivers
  2. Open a handle to the USB device driver through its symbolic name via CreateFile
  3. Perform a DeviceIoControl on the driver handle with the control code IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX. This will have you returned the structure USB_NODE_CONNECTION_INFORMATION_EX. There you have a member there called Speed of the type USB_DEVICE_SPEED.
  4. (Close the driver handle)

This could also be interesting for you: CodeProject: Enumerate Properties of an Installed Device

Robert
Thanks for the extra details here Robert
SwDevMan81
A: 

To answer your question, I'm sure that there are ways of getting the information you need. I don't know the answer for windows, but Linux has files you can read within the sysfs directory structure.

Speed control is usually taken care of by the drivers and the hardware controlling the bus. Most modern USB controllers really have 2 controllers per port connected. 1 for the slower speed 12Mbps USB 1.0, and another for the higher pseed 480Mbps USB 2.0. There is a magic switch inside that connects it properly. The driver itself makes sure that everything is enumerated properly, controls the flow, etc. A higher level "user-space" application typically doesn't need to worry about these things.

Also, if you have a device that is capable of running at faster than 12Mbps, and you plug it into a 12Mbps port, it'll get dragged down to 12Mbps whether you like it or not. Is it that you want to know that is got dragged down?

KFro