libreria devel linux path usb device libusb

linux - libreria - libusb devel



linux/libusb obtener la ruta del dispositivo usb (3)

Es posible, como aquí .

Simplemente escanee todos los dispositivos USB en todos los buses. Cuando encuentre el VID / PID necesario, ese es su dispositivo.

O puede hacerlo más simple: escriba una regla udev que crearía un enlace simbólico como / dev / thermoX cuando conecte su dispositivo. Todo lo que necesita después es abrir / dev / thermoX necesario.

Uso libusb para enumerar algunos dispositivos usb. Ahora me gusta obtener la "ruta del dispositivo". Creo que no se llama dispositivo-ruta USB, porque no tuve éxito con Google.

Si conecto un dispositivo usb con Linux, aparece un mensaje en dmesg , aquí hay algunos ejemplos para una "ruta de dispositivo" con un sensor de temperatura usb (algo como esto ):

Directamente a un puerto usb: [68448.099682] generic-usb 0003:0C45:7401.0056: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.0-1/input0 => 12.0- 1

Directamente a otro puerto: [68560.853108] generic-usb 0003:0C45:7401.0058: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:13.0-1/input0 => 13.0-1

Para un concentrador usb en el primer puerto usado: [68600.245809] generic-usb 0003:0C45:7401.005A: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4/input0 => 12.2-1.4

A otro puerto en el mismo concentrador usb: [68647.925092] generic-usb 0003:0C45:7401.005C: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.3/input0 => 12.2-1.3

Ahora a un concentrador usb en el concentrador usb utilizado anteriormente: [68740.715518] generic-usb 0003:0C45:7401.005E: input,hidraw1: USB HID v1.10 Keyboard [RDing TEMPer1V1.2] on usb-0000:00:12.2-1.4.4/input0 => 12.2-1.4.4

Para resumir: el mensaje del kernel siempre contiene una ruta única para la ubicación física del dispositivo usb (ver el texto en negrita antes). ¿Es posible obtener esta "ruta" en el espacio de usuario a través de libusb? Intenté muchas cosas con struct usb_bus y struct usb_device , pero siempre lo struct usb_bus sin éxito.

Necesito esto para identificar varios de estos termómetros usb, ya que no tienen un número de serie único y, a veces, simplemente se "reconectan" en tiempo de ejecución, por lo que obtienen diferentes identificadores usb. Así que creo que la única forma de identificarlos es a través de la ubicación física.

Gracias por la ayuda,

Saludos cordiales Kevin M.

-editar-

Actualmente uso el siguiente código para buscar en mi dispositivo usb:

usb_dev_handle *find_lvr_winusb() { struct usb_bus *bus; struct usb_device *dev; for (bus = usb_busses; bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { if (dev->descriptor.idVendor == VENDOR_ID && dev->descriptor.idProduct == PRODUCT_ID ) { usb_dev_handle *handle; if(debug) { printf("lvr_winusb with Vendor Id: %x and Product Id: %x found./n", VENDOR_ID, PRODUCT_ID); printf("INFO: %d/n", dev->bus->location); printf("INFO: %d %s/n", bus->location, bus->dirname); } if (!(handle = usb_open(dev))) { printf("Could not open USB device/n"); return NULL; } return handle; } } } return NULL; }

Pero con este código no puedo obtener una identificación de posición física única. La bus->location devuelve un número entero (bus-> dirname contiene lo mismo, pero como cadena), que no es único. Sé que usb tiene una jerarquía y en dmesg puedo ver la ruta de esta jerarquía.

Con libusb solo puedo obtener el ID de bus (?) Y algunas ID de dispositivo. Pero no me ayudan, porque necesito identificar dos o más de estos sensores de temperatura. La identificación del dispositivo siempre cambia cuando el sensor de temperatura reinicia la conexión (cada 5 a 60 segundos) y la identificación del bus no es única. Lamentablemente, el sensor de temperatura no tiene una identificación de serie única.

Así que creo que la ruta física es la única forma de identificar el dispositivo.

Saludos cordiales Kevin M.


Desde libusb 1.0.12, han introducido libusb_get_port_path (), y en 1.0.16 lo reemplazaron con libusb_get_port_numbers () que le permite consultar la topología del bus.


Resumen general de la ruta de la estructura sysfs:

1-1.3:1.0 |_usb root hub - bus number - 1 |_ port number - 1 of root hub |_port number - 3 of intermediate hub |_current configuration number - 1 |_ current interface number - 0

Más información aquí