GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener información del proveedor y del producto USB mediante programación en Linux?

No lo he probado yo mismo , pero debería ser udev_device_get_property_value de libudev; se usa en udev-util.c de pulseaudio como udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) .

Aquí hay un pequeño ejemplo que acabo de armar, basado en udev-util.c - tenga en cuenta que he usado un Arduino Duemillanove con chip FTDI FT232, cuya ruta udev encuentro usando udevadm (vea los comentarios en el código a continuación), y luego lo codifiqué en el programa a continuación, udevl.c :

// sudo apt-get install libudev-dev
// build with: gcc -o udevl -ludev -Wall -g udevl.c

#include <stdio.h>

#include <libudev.h>

int main( int argc, char **argv )
{
  const char *v;
  char t[256];
  struct udev *udev;
  struct udev_device *card = NULL;

  if (!(udev = udev_new())) {
      fprintf(stderr, "Failed to allocate udev context.\n");
      return -1;
  }

  // $ lsusb | grep FT232
  // Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC    
  // $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep "looking at device"
  // looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0'
  // (that one is under /sys)
  // hardcode that path below:

  // udev_get_sys_path(udev) for me: '/sys'
  sprintf(t, "%s/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0", udev_get_sys_path(udev));
  fprintf(stdout, " path: %s\n", t);

  card = udev_device_new_from_syspath(udev, t);
  fprintf(stdout, " udev_device: 0x%08X\n", (unsigned int)card);

  if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) )
    fprintf(stdout, "got ID_MODEL_FROM_DATABASE: %s\n", v);
  else
    fprintf(stdout, "failed getting ID_MODEL_FROM_DATABASE: %s\n", v);

  fprintf(stdout, "Done.\n");

  if (card)
    udev_device_unref(card);

  if (udev)
    udev_unref(udev);

  return 0;
}

Este programa (con el Arduino adjunto) genera:

$ ./udevl 
 path: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0
 udev_device: 0x09FBF080
got ID_MODEL_FROM_DATABASE: FT232 USB-Serial (UART) IC
Done.

... y "FT232 USB-Serial (UART) IC" es la entrada correcta para VID:PID 0403:6001 en usb.ids.

Espero que esto ayude,
¡Salud!


lsusb El comando consulta información sobre los dispositivos USB conectados actualmente. Puedes usar su -d opción para consultar un determinado proveedor/producto (pero parece que solo funciona para los dispositivos actualmente conectados):

$ lsusb -d 0e21:0750
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.

Puede mostrar información para todos los dispositivos:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0421:01c7 Nokia Mobile Phones
Bus 001 Device 003: ID 0bda:8187 Realtek Semiconductor Corp. RTL8187 Wireless Adapter
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 046d:c01b Logitech, Inc. MX310 Optical Mouse
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

También puede hacer que sea detallado (lsusb -v ) e imprimiendo mucho de cosas.

Tenga en cuenta que al acceder a la información sobre el sistema en el sistema operativo Linux, es preferible hacerlo a través de comandos de shell (como lsusb ) que analizar directamente los archivos del sistema a los que acceden estos comandos.


Linux
  1. Linux:¿cómo volver a conectar un dispositivo USB desconectado lógicamente?

  2. ¿Cómo obtener el nombre y la versión de la distribución de Linux?

  3. Desconecte y vuelva a conectar ttyUSB0 mediante programación en Linux

  4. ¿Cómo obtener información del sistema operativo de la instancia Amazon EC2?

  5. ¿Cómo montar un dispositivo en Linux?

Lanzamiento de Linux Mint 19.2 "Tina":esto es lo nuevo y cómo obtenerlo

Cómo hacer un USB de arranque múltiple en Linux y Windows

Cómo encontrar el uso de ancho de banda del dispositivo USB en Linux

Cómo realizar un arranque dual de cualquier distribución de Linux con Windows y deshacerse de ella cuando sea necesario

Cómo formatear un disco USB como exFAT en Linux [Gráficamente y línea de comandos]

Cómo detectar y administrar dispositivos en Linux