Как сопоставить физический USB-порт с номером USB-устройства

Вопрос или проблема

Я использую Ubuntu 12.04.

Мне нужно отправить команду устройству, которое я подключил к порту моего ПК. Я могу отправить команду, узнав, каковы номер шины и номер устройства.

Например, команда lsusb скажет мне, что у меня есть устройство, подключенное на шине 007 и устройстве 003.

“Bus 007 Device 003: ID 045e:00cb Google Inc.”

Однако номер устройства изменится, если я перезагружу устройство.

“Bus 007 Device 004: ID 045e:00cb Google Inc.”

Существует ли способ убедиться, что я могу отправлять команды на этот USB-порт ПК? Связывая номер устройства с этим физическим USB-портом? Или есть другие решения и способы обойти эту проблему?

Одно из решений — проверить текущую конфигурацию шины/устройства для вашего устройства, так как она также будет переносимой, и я думаю, что контроллер USB выделяет эти номера динамически. Вот как с помощью awk вы можете получить текущую шину и устройство

    lsusb | grep "045e:00cb" | tr -d ':'| awk '{print "Bus="$2 " Device="$4}' 

Вы можете использовать $2 и $4 любым способом, например: ls -l /dev/bus/usb/$2/$4

Ответ или решение

Для решения задачи ассоциации физического USB-порта с номером устройства USB в операционной системе Ubuntu 12.04, необходимо учитывать несколько важных аспектов. USB-устройства действительно могут менять свои номера Bus и Device при перезагрузке, так как они назначаются динамически хост-контроллером USB. Однако, существуют методы для более постоянной привязки устройств.

Шаги для ассоциации USB устройства с физическим портом

  1. Использование lsusb для определения устройства:
    Как вы уже упомянули, команда lsusb предоставляет информацию о подключенных USB-устройствах, включая Bus и Device номер. Эта информация полезна для идентификации вашего устройства на данный момент.

    lsusb
  2. Выявление идентификатора устройства:
    Каждый USB-устройство имеет уникальный идентификатор в формате ID vendor:product, например 045e:00cb. Этот идентификатор можно использовать для поиска информации о текущем Bus и Device. Вы можете воспользоваться следующей командой для получения текущих параметров:

    lsusb | grep "045e:00cb" | tr -d ':' | awk '{print "Bus="$2 ", Device="$4}'

    Данная команда извлекает Bus и Device номер из вывода lsusb, что позволяет вам динамически определять текущие значения.

  3. Использование udev для статической привязки:
    Чтобы избежать изменения номер Bus и Device, можно использовать udev для создания статических правил. Прежде всего, создайте файл правил в /etc/udev/rules.d/, например, 99-usb.rules:

    sudo nano /etc/udev/rules.d/99-usb.rules

    В этом файле вы можете указать правила, основанные на идентификаторе вашего устройства. Пример правила:

    SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="00cb", SYMLINK+="my_usb_device"

    Это правило создаст символическую ссылку /dev/my_usb_device, которая всегда будет указывать на ваше устройство, независимо от назначения номера Bus и Device.

  4. Использование символической ссылки:
    После создания правила, вы можете использовать эту символическую ссылку в своих скриптах, чтобы взаимодействовать с устройством, не задумываясь о том, какой Bus и Device номер у него в текущий момент:

    ls -l /dev/my_usb_device
  5. Тестирование и проверка:
    После добавления правил вам нужно перезапустить службу udev, чтобы изменения вступили в силу:

    sudo service udev restart

    Затем подключите или отключите устройство, чтобы убедиться, что символическая ссылка создаётся корректно.

Заключение

Используя описанные методы, вы сможете ассоциировать физический USB-порт вашего устройства с уникальным идентификатором, что значительно упростит взаимодействие с устройством независимо от его текущих номеров Bus и Device. Такой подход обеспечит более стабильную работу вашего программного обеспечения при взаимодействии с USB-устройствами на Ubuntu 12.04.

Оцените материал
Добавить комментарий

Капча загружается...