Мне нужно иметь возможность идентифицировать подключенное USB-устройство (USB3 и/или USB2) и какой порт подключен к концентратору из программы C. Я работаю над встроенной системой Linux на основе Yocto.
Я могу получить эту информацию из командной строки с помощью lsusb. Например. Я подключил две USB-камеры, одну USB3 и другую USB2, и если я запущу lsusb -t
, я увижу дерево соединений портов:
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M
|__ Port 1: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 4: Dev 6, If 0, Class=Miscellaneous Device, Driver=, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
|__ Port 3: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
|__ Port 3: Dev 3, If 2, Class=Human Interface Device, Driver=usbhid, 480M
При этом я легко знаю, что камера USB3 подключена к порту 4, а камера USB2 - к порту 3 (используя концентратор с 4 портами). Если я запустил только lsusb
, получил идентификаторы и имена:
Bus 002 Device 006: ID 20f7:3001 USB3 Camera with CMOS sensor [MQ]
Bus 001 Device 003: ID 0403:de37 Future Technology Devices International, Ltd
Bus 001 Device 002: ID 04b4:650a Cypress Semiconductor Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 04b4:6508 Cypress Semiconductor Corp.
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Как я могу легко сканировать порты концентратора и видеть, какое устройство (имя или идентификатор) подключено к чему (номер порта концентратора) из приложения C?
Извините, если это уже ответ где-то, но я не смог найти конкретный ответ.
Заранее спасибо.
libusb
библиотек на образ Yocto. Быстрый поиск в Google показывает, что для этих библиотек есть доступные рецепты. Если вы хотите сгенерировать вывод, аналогичныйlsusb -t
, и получить номера портов концентратора, вы можете установитьlibusb1
, иначеlibusb-compat
должен выполнить эту работу. - person Storm   schedule 18.06.2020