16

How can i get USB device file path correctly in Linux. I used command: find / -iname "usb" and got the result as below:

/dev/bus/usb
/sys/bus/usb
/sys/bus/usb/drivers/usb
/sys/kernel/debug/usb

Under /dev/bus/usb i see:

001  002  003  004  005  006

But I think they aren't files as i need.

Under /sys/bus/usb/devices/:

sh-3.2# ls /sys/bus/usb/devices/
1-0:1.0  1-1:1.0  3-0:1.0  5-0:1.0  usb1     usb3     usb5
1-1      2-0:1.0  4-0:1.0  6-0:1.0  usb2     usb4     usb6

And Under /sys/bus/scsi/devices/ when i pluged an USB i see:

2:0:0:0      host0        host2        target2:0:0

And when i removed USB i see:

sh-3.2# ls
host0

So which device file is used for USB? How can i indentify it? I need to make a C program with USB device file...

Further more, could you explain to me the number 1-1:1.0? What does it mean?

Thank you.

Tiktac
  • 966
  • 1
  • 12
  • 32
  • What do you need the device file for? – CL. Oct 15 '15 at 08:19
  • 1
    I need to check informations which related to USB device. So i think i will send ioctl to USB device file and read the feedback data? Is this possible? – Tiktac Oct 15 '15 at 08:28
  • What kind of information? – CL. Oct 15 '15 at 10:33
  • 1
    Read/write verification to USB device, and get USB device's information such as: speed, name, ... – Tiktac Oct 20 '15 at 04:44
  • What do you mean with "read/write verification"? Is this for some specific device? Or are you trying to duplicate `lsusb`? – CL. Oct 20 '15 at 09:31

3 Answers3

31

So which device file is used for USB? How can i indentify it?

What you see behind /sys/ is mainly configuration/information about devices. /dev/bus/usb is what you are looking for. I think that the following article can help you

http://www.linuxjournal.com/article/7466?page=0,0

Is quite old, but still it can help you. (In the article they speak about /proc/bus/usb, today we have /dev/bus/usb)

Further more, could you explain to me the number 1-1:1.0? What does it mean?

The generic form is

X-Y.Z:A.B

Each field identify the connection point of your device. The first two field are mandatory:

  • X is the USB bus of your motherboard where is connected the USB system.
  • Y is the port in use on the bus system

So the USB device identified with the string 3-3 is the device connected on the port 3 of the bus 3.

If you connect an USB hub, you are extending the connection capability of a single USB port. The Linux kernel identify this situation by appending the Z field.

  • Z is the port is use on an hub

So, the USB device identified with the string 1-2.5 is the device connected on the port 5 of the hub connected on the port 2 of the bus 1.

USB specification allow you to connect in cascade more then one USB hub, so the Linux kernel continue to append the port in use on the different hubs. So, the USB device identified with the string 1-2.1.1 is the device connected on the port 1 of the hub connected on the port 1 of the hub connected to the port 2 of the bus 1.

A fast way to retrieve these information is to read the kernel messages (if you can).

$ dmesg | grep usb
[... snip ...]
[ 2.047950] usb 4-1: new full-speed USB device number 2 using ohci_hcd
[ 2.202628] usb 4-1: New USB device found, idVendor=046d, idProduct=c318
[ 2.202638] usb 4-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 2.202643] usb 4-1: Product: Logitech Illuminated Keyboard
[ 2.202648] usb 4-1: Manufacturer: Logitech
[... snip ...]

Then, the last two fields of the pattern (after colon) identify an internal section of an USB device :

  • A is the configuration number of the device
  • B is the interface number of a configuration

So, the string 4-1:1.1 means: the interface 1, on configuration 1 that is connected on the port 1 of the bus 4.

You can retrieve these information with the command lsusb.

Federico
  • 3,782
  • 32
  • 46
  • This is very helpful to me. But i still don't know which file can i send USB ioctl to it to get some informations... – Tiktac Oct 15 '15 at 08:23
  • Maybe you should have a look at libusb. It will abstract most of the work for you. – Alexandre Belloni Oct 15 '15 at 10:18
  • As I wrote in the answer, `/dev/bus/usb` is the directory where you have to look. Which file *exactly*? It depends on where you connected the USB device. It's explained in the article and in the answer. Then as Alexandre said and suggested by the article, use `libusb` – Federico Oct 15 '15 at 15:06
  • Are these ports unique over multiple hubs? – jaques-sam Nov 04 '22 at 13:13
0

I know this is an old question that has been answered a long time ago, but I keep stumbling upon it when looking for the command below. It might not be what OP asked for, but its possible that I'm not the only one who gets directed to this page when looking for this:

ls -l /dev/serial/by-id/

I'm a Linux noob and could not find any other command that gives me a list of serial devices with both device names and paths (e.g. /dev/ttyUSB0). For expample dmesg | grep usb does not give me the path that I need.

Martijn
  • 739
  • 9
  • 26
0

Use ls /sys/bus/usb/devices/2* and cat /sys/bus/usb/devices/2*/manufacturer and progressively add numbers to the 2* part.. like 2-3:*, 2-3:2.* until you can match the name from lsusb, or use idProduct or idVendor instead of manufacturer.

alchemy
  • 954
  • 10
  • 17