У меня есть одноплатный компьютер с портом JTAG, обслуживаемым аппаратными средствами FTDI, но они не соединяются с системой разработки (Xilinx Vivado), и я пытаюсь диагностировать проблему. Команда sudo lsusb -v -D /dev/ttyUSB0
отчеты Cannot open /dev/ttyUSB0
, даже при том, что я установил полномочия на 777 в настоящий момент. Я работал sudo usb-devices
с и без кабеля, соединенного, чтобы быть уверенным, я смотрел на правильное устройство и здесь - то, что я получил (порядковый номер, запутываемый мной):
T: Bus=01 Lev=03 Prnt=04 Port=01 Cnt=01 Dev#= 9 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0403 ProdID=6014 Rev=09.00
S: Manufacturer=Digilent
S: Product=Digilent USB Device
S: SerialNumber=000000000000
C: #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=0mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio
Я выполняю новую установку 18.04.2 только вчера обновленный к 18.04.4; переустанавливание было запрошено требованием решить эту проблему, и я хотел удостовериться, что устаревшее программное обеспечение не было причиной.
Я думаю неспособность Vivado видеть, что устройство может быть связано с неспособностью инструмента общей системы, такого как lsusb для открытия устройства. Любая справка ценилась бы.
Хорошо, это не имеет никакого отношения к главным числам, как я думал. Cannot open /dev/ttyUSB0
сообщение печатается в dump_one_device()
если указатель, возвращенный get_usb_device()
является ПУСТЫМ. Эта функция в свою очередь звонит libusb_get_device_list()
это возвращает список USB-устройств вместе с их номерами шины и номерами устройств, которые извлечены с помощью libusb_get_bus_number()
и libusb_get_device_address()
и связанный с "/dev/bus/usb"
. Можно проверить его с gdb
(Я использовал сегодняшнюю основную фиксацию c92f1962892d709cb9bad3aac2440932dd9684f6 от https://github.com/gregkh/usbutils):
$ gdb --args ./lsusb -vD /dev/ttyUSB0
Reading symbols from ./lsusb...done.
(gdb) break usbutils/usbmisc.c:134
Breakpoint 1 at 0x40b827: file usbmisc.c, line 134.
(gdb) run
Starting program: /media/data/usbutils/lsusb -vD /dev/ttyUSB0
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff6d44700 (LWP 4621)]
Thread 1 "lsusb" hit Breakpoint 1, get_usb_device (ctx=<optimized out>, path=path@entry=0x7fffffffddab "/dev/ttyUSB0") at usbmisc.c:134
134 if (!strcmp(device_path, absolute_path)) {
(gdb) print device_path
$1 = "/dev/bus/usb/002/002", '\000' <repeats 4076 times>
(gdb) continue
Continuing.
Thread 1 "lsusb" hit Breakpoint 1, get_usb_device (ctx=<optimized out>, path=path@entry=0x7fffffffddab "/dev/ttyUSB0") at usbmisc.c:134
134 if (!strcmp(device_path, absolute_path)) {
(gdb) print device_path
$2 = "/dev/bus/usb/002/001", '\000' <repeats 4076 times>
(gdb) continue
Continuing.
Thread 1 "lsusb" hit Breakpoint 1, get_usb_device (ctx=<optimized out>, path=path@entry=0x7fffffffddab "/dev/ttyUSB0") at usbmisc.c:134
134 if (!strcmp(device_path, absolute_path)) {
(gdb) print device_path
$3 = "/dev/bus/usb/001/002", '\000' <repeats 4076 times>
(gdb) continue
Continuing.
Thread 1 "lsusb" hit Breakpoint 1, get_usb_device (ctx=<optimized out>, path=path@entry=0x7fffffffddab "/dev/ttyUSB0") at usbmisc.c:134
134 if (!strcmp(device_path, absolute_path)) {
(gdb) print device_path
$4 = "/dev/bus/usb/001/001", '\000' <repeats 4076 times>
(...)
и так далее до device_path
равно входному параметру. Конечно, /dev/ttyUSB0
никогда не будет соответствовать.
Хорошо, что можно также измениться на/dev/bus/usb и передать относительный адрес устройства:
$ cd /dev/bus/usb/
$ lsusb -D 001/001
Device: ID 1d6b:0002 Linux Foundation 2.0 root hub
(...)