Почему у меня несколько идентификаторов продуктов и поставщиков? - PullRequest
0 голосов
/ 17 октября 2018

ЦЕЛЬ: Я пытаюсь подключить 4 считывателя RFID к Pi, и мне нужно различать порт каждого из них.

ЧТО Я СДЕЛАН: Iввел lsusb в терминал, к которому подключен только один считыватель. Возвращает:

Bus 001 Device 004: ID 0c27:232a RFIDeas, Inc

Это мой читатель.Таким образом, мой идентификатор поставщика должен быть 0c27, а мой идентификатор продукта должен быть 232a Теперь мне нужен серийный номер #, поскольку все мои читатели показывают одинаковые идентификаторы поставщика и продукта.

Мое устройство подключено к порту ttyACM0, поэтому в терминале я ищу серийный атрибут, а также проверяю свой идентификатор продукта и идентификатор поставщика, набирая:

udevadm info --name=ttyACM0 --attribute-walk | grep -i "serial" -e "product" -e "vendor"

Это возвращает:

ATTRS{idProduct}=="232a"
ATTRS{idVendor}=="0c27"
ATTRS{product}=="USB Serial"
ATTRS{idProduct}=="9514"
ATTRS{idVendor}=="0424"
ATTRS{idProduct}=="0002"
ATTRS{idVendor}=="1d6b"
ATTRS{product}=="DWC OTG Controller"
ATTRS{serial}=="3f980000.usb"

ПРОБЛЕМА: 3 идентификатора продукта и 3 идентификатора поставщика возвращаются.В то время как возвращается только один серийный #.

ВОПРОСЫ:

  1. Почему это возвращает 3 идентификатора продукта и 3 идентификатора поставщика, когда имеется только одно устройствоподключен?

  2. Какие из них я должен использовать в правилах udev для создания постоянного имени устройства?

Если я что-то оставляюпожалуйста, дайте мне знать, чтобы я мог обновить вопрос.

РЕДАКТИРОВАТЬ: Я успешно создал правило udev, используя первый упомянутый идентификатор продукта и идентификатор поставщика:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0c27", ATTRS{idProduct}=="232a", SYMLINK+="reader1"

Это создает рабочее правило udev, НО, когда ядобавьте серийный номер ATTRS{serial}=="3f980000.usb", он перестает работать.Мне нужен уникальный идентификатор.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Мне удалось создать правило udev, добавив следующее:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1d6b", ATTRS{idProduct}=="0002", ATTRS{serial}=="3f980000.usb", SYMLINK+="reader1"

Причина нескольких идентификаторов продуктов и поставщиков объясняется приведенным ниже ответом Дэвида Грейсона.Это то, что привело меня к решению.

Хотя с вашей точки зрения вы просто подключили одно устройство к компьютеру, ядро ​​Linux имеет более сложное представление о том, что происходит.Ядро отслеживает иерархию устройств, каждое из которых имеет свои собственные атрибуты, драйверы и дочерние устройства.Корнем иерархии обычно является какое-то корневое устройство, представляющее ваш ЦП, которое затем подключается (возможно, косвенно) к устройству контроллера USB, которое подключается к «корневому концентратору», который затем подключается к физическому USB-устройству, которое вы используете.подключен, что, в свою очередь, может иметь дочерние устройства для каждой функции / интерфейса, предоставляемой устройством USB.

Вы можете запустить man udevadm, чтобы узнать больше о том, что делает команда.В нем говорится:

-a, --attribute-walk Вывести все свойства sysfs указанного устройства, которые могут использоваться в правилах udev для соответствия указанному устройству.Он печатает все устройства в цепочке, вплоть до корня sysfs, который можно использовать в правилах udev.Таким образом, существует эта цепочка устройств, начиная с ttyACM0 (функция вашего USB-устройства) и переходя к физическому USB-устройству, затем к корневому концентратору и затем к USB-контроллеру, пока он не достигнет корня иерархии.Опция --attribute-walk идет по этой цепочке и распечатывает атрибуты каждого устройства по пути.

Вы передаете вывод этой команды в grep, поэтому вы не видите полный вывод, ичто это, наверное, почему ты запутался.Полный вывод команды на самом деле очень информативен: она выводит хороший абзац, объясняющий, что она делает, и есть полезные предложения, чтобы прояснить ее при переходе от печати атрибутов одного устройства к печати атрибута его родителя.Вот некоторые из выводов, которые я получаю при проверке USB-устройства на моем Raspberry Pi:

$ udevadm info --name = sda2 --attribute-walk

Информация Udevadm начинается с указанного устройствапо devpath, а затем идет вверх по цепочке родительских устройств.Он печатает для каждого найденного устройства все возможные атрибуты в формате ключей правил udev.Соответствующее правило может быть составлено из атрибутов устройства и атрибутов из одного родительского устройства.

глядя на устройство '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2 / 1-1.2.1 / 1-1.2.1: 1.0 / host0 / target0: 0: 0/0: 0: 0: 0 / block / sda / sda2 ': KERNEL == "sda2" SUBSYSTEM =="block" [snip]

глядя на родительское устройство '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0 / host0 / target0: 0: 0/0: 0: 0: 0 / block / sda ': KERNELS == "sda" SUBSYSTEMS == "block" [snip]

глядя на родительское устройство' /devices / platform / soc / 3f980000.usb / usb1 / 1-1 / 1-1.2 / 1-1.2.1 / 1-1.2.1: 1.0 / host0 / target0: 0: 0 ': KERNELS == "target0: 0: 0 "SUBSYSTEMS ==" scsi "[snip]

глядя на родительское устройство '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1: 1.0 ': KERNELS == "1-1.2.1: 1.0" SUBSYSTEMS == "usb" [snip]

глядя на родительское устройство' / devices / platform / soc / 3f980000.usb / usb1 / 1-1 / 1-1.2 / 1-1.2.1 ': KERNELS == "1-1.2.1" SUBSYSTEMS == "usb" [snip]

[... и т. д.на докорневое устройство] "

0 голосов
/ 17 октября 2018

Хотя с вашей точки зрения вы только что подключили одно устройство к вашему компьютеру, ядро ​​Linux имеет более сложное представление о том, что происходит.Ядро отслеживает иерархию устройств, каждое из которых имеет свои собственные атрибуты, драйверы и дочерние устройства.Корнем иерархии обычно является какое-то корневое устройство, представляющее ваш ЦП, которое затем подключается (возможно, косвенно) к устройству контроллера USB, которое подключается к «корневому концентратору», который затем подключается к физическому USB-устройству, которое вы используете.подключен, что, в свою очередь, может иметь дочерние устройства для каждой функции / интерфейса, предоставляемой устройством USB.

Вы можете запустить man udevadm, чтобы узнать больше о действиях команды.Там написано:

   -a, --attribute-walk
       Print all sysfs properties of the specified device that can be used
       in udev rules to match the specified device. It prints all devices
       along the chain, up to the root of sysfs that can be used in udev
       rules.

Итак, есть эта цепочка устройств, начиная с ttyACM0 (функция вашего USB-устройства) и заканчивая физическим USB-устройством, затем корневым концентратором, а затем USB-портом.контроллер, пока он не достигнет корня иерархии.Опция --attribute-walk проходит по этой цепочке и распечатывает атрибуты каждого из устройств по пути.

Вы передаете вывод этой команды в grep, поэтому вы не видите полный вывод, ичто это, наверное, почему ты запутался.Полный вывод команды на самом деле очень информативен: она выводит хороший абзац, объясняющий, что она делает, и есть полезные предложения, чтобы прояснить ее при переходе от печати атрибутов одного устройства к печати атрибута его родителя.Вот некоторые из выводов, которые я получаю при проверке устройства USB на моем Raspberry Pi:

$ udevadm info --name=sda2 --attribute-walk

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda2':
    KERNEL=="sda2"
    SUBSYSTEM=="block"
    [snip]

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/host0/target0:0:0/0:0:0:0/block/sda':
    KERNELS=="sda"
    SUBSYSTEMS=="block"
    [snip]

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    [snip]

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0':
    KERNELS=="1-1.2.1:1.0"
    SUBSYSTEMS=="usb"
    [snip]

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2.1':
    KERNELS=="1-1.2.1"
    SUBSYSTEMS=="usb"
    [snip]

  [... and so on, up to the root device]

К сожалению, из вывода вашей команды udevadm похоже, что ваш RFID-адаптер не имеет USBСерийный номер, поэтому отличить его от других устройств той же модели может быть хитрым.Чтобы подтвердить, что у него нет серийного номера, я рекомендую запустить lsusb -v -d 0c27:232a | grep iSerial.Если число после iSerial равно 0, это означает, что серийный номер отсутствует.

Я рекомендую просмотреть символические ссылки, которые Linux создает для вас в /dev/serial/by-id;возможно, в этих символических ссылках будет достаточно деталей в их именах, чтобы вам не нужно было создавать новое правило udev.(Подсказка: запустите ls -lR /dev/serial/by-id.)

Если вам по-прежнему нужна дополнительная помощь в поиске или создании стабильных символических ссылок, я думаю, вам следует подключить все четыре считывателя RFID и затем опубликовать полный вывод каждой из этих команд:

ls -lR /dev/serial/by-id
ls /dev/ttyACM*
udevadm info --name=ttyACM0 --attribute-walk
...