Дополнительный созданный / dev / ttyUSB блокирует использование пользовательского файла настроек, сконфигурированного для udev

363
Pjotr133

Я аквалангист и гордый владелец 2 компьютеров для дайвинга. Эти два устройства могут быть подключены к USB-порту, и с помощью программы Linus SubSurface divinglog я могу импортировать из них журнал погружений. Один из них - атомный водный кобальт, а другой - Suunto D4i. Теперь я хочу создать dev-файлы с udev для каждого из них, чтобы я мог подключить их к любому USB-порту и при этом использовать тот же dev-файл в программном обеспечении для ведения журналов. (Например, / dev / my_cobalt и / dev / my_d4i)

Одна и та же (вид) конфигурация используется для обоих.
Для D4i использование dev-файла блокируется автоматически созданным / dev / ttyUSB0.
Для обоих дайвинг-компьютеров создается файл dev, а для Cobalt все работает, как хотелось, но не для D4i.
Я могу использовать / dev / ttyUSB0, но не / dev / my_d4i.

Почему-то кажется (я не уверен), что это вызвано различием в том, как они представляются на USB-шине. Смотрите вывод команды lsusb ниже.

Если кто-нибудь может сказать мне, что вызывает эту разницу и / или как решить эту проблему, я буду очень признателен. (Почему при подключении d4i также создается dev-файл ttyUSB?)

Ниже приведена некоторая информация о выводах / настройках.

/etc/udev/rules.d/dive-computers.rules

# My Cobalt2 DiveComputer SUBSYSTEM=="usb", ATTR=="0471", ATTR=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660" # My Suunto D4i DiveComputer SUBSYSTEM=="usb", ATTR=="0403", ATTR=="6001", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660" 

dev-файлы после подключения кобальта

lrwxrwxrwx 1 root root 15 mei 16 23:13 my_cobalt -> bus/usb/003/007 # no ttyUSB0 created 

dev-файлы после подключения d4i

lrwxrwxrwx 1 root root 15 mei 16 23:15 my_d4i -> bus/usb/003/009 crw-rw---- 1 root dialout 188, 0 mei 16 23:15 ttyUSB0 

lsusb -v -D / dev / bus / usb / 003/007 (Cobalt)

Прибор: ID 0471: 0888 Philips (или NXP) Hantek DDS-3005 Генератор сигналов произвольной формы Дескриптор устройства: Длина 18 bDescriptorType 1 bcdUSB 2.00 Диагностика bDeviceClass 220 bDeviceSubClass 1 перепрограммируемая диагностика Соответствие bDeviceProtocol 1 USB2 bMaxPacketSize0 16 idVendor 0x0471 Philips (или NXP) idProduct 0x0888 Hantek DDS-3005 Генератор сигналов произвольной формы bcdDevice 0.02 iManufacturer 1 АТОМНАЯ АКВАТИКА iProduct 2 КОБАЛЬТ iSerial 3 123456789ABCDEF bNumConfigurations 1 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 39 bNumInterfaces 1 bConfigurationValue 1 Консоль iConfiguration 4 bmAttributes 0xe0 Самостоятельное питание Удаленное пробуждение MaxPower 500 мА Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 Диагностика bInterfaceClass 220 bInterfaceSubClass 160  bInterfaceProtocol 176  iInterface 0  Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Тип использования данных wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Тип использования данных wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Тип использования данных wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Состояние устройства: 0x0101 Самостоятельное питание 

lsusb -v -D / dev / bus / usb / 003/009 (D4i)

Устройство: ID 0403: 6001 Future Technology Devices International, Ltd FT232 USB-последовательная (UART) ИС Дескриптор устройства: Длина 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (определен на уровне интерфейса) bDeviceSubClass 0  bDeviceProtocol 0  bMaxPacketSize0 8 idVendor 0x0403 Future Technology Devices International, Ltd idProduct 0x6001 FT232 USB-Serial (UART) IC bcdDevice 6.00 iManufacturer 1 Smartinterface iProduct 2 USB последовательный кабель iSerial 3 DiYISDGK bNumConfigurations 1 Дескриптор конфигурации: Длина 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0  bmAttributes 0xa0 (Питание от шины) Удаленное пробуждение MaxPower 500 мА Дескриптор интерфейса: Длина 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 Определенный класс поставщика bInterfaceSubClass 255 Специальный подкласс поставщика bInterfaceProtocol 255 Специальный протокол поставщика iInterface 2 USB последовательный кабель Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Тип использования данных wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Описатель конечной точки: Длина 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Тип передачи Массовая Тип синхронизации Нет Тип использования данных wMaxPacketSize 0x0040 1x 64 байта bInterval 0 Состояние устройства: 0x0000 (Питание от шины) 

регистрация программного обеспечения (для чего оно стоит)

Начальная загрузка из / dev / my_d4i Начало потока 0 [0.000126] ОШИБКА: неподходящий ioctl для устройства (25) [in ../../src/serial_posix.c:308 (dc_serial_open)] [0.000156] ОШИБКА: не удалось открыть последовательный порт. [in ../../src/suunto_d9.c:155 (suunto_d9_device_open)] ИНФОРМАЦИЯ: dc_deveice_open значение ошибки -6 Завершение потока Невозможно открыть% s% s (% s) погружений загружено 0 Начальная загрузка из / dev / ttyUSB0 Начало потока 0 ИНФОРМАЦИЯ: dc_deveice_open значение ошибки 0 Завершая тема погружений, скачанных 0  
0
Вы делаете символическую ссылку на необработанное USB-устройство вместо tty. Я уже отвечал на практически аналогичный вопрос и здесь, или на unix.stackexchange, но сейчас не могу его найти. По сути, вам нужно изменить правило udev для правильной подсистемы и использовать ATTRS вместо ATTR для сопоставления по всему пути устройства. Подробности в ответе когда найду. dirkt 5 лет назад 0

1 ответ на вопрос

0
Pjotr133

Итак, Диркт дал комментарий, который заставил меня задуматься, и я снова проверил некоторые факты. С помощью udevadm monitor и последующего подключения устройств я получил следующее:

Кобальт :

KERNEL[25393.161856] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) KERNEL[25393.165873] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) KERNEL[25393.165941] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) UDEV [25393.183044] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) UDEV [25393.185175] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) UDEV [25393.186958] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) 

D4i

KERNEL[24333.615580] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) KERNEL[24333.618406] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) KERNEL[24333.618444] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial) KERNEL[24333.618615] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty) KERNEL[24333.618644] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial) KERNEL[24333.618685] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) KERNEL[24333.618729] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) UDEV [24333.637591] add /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) UDEV [24333.639773] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) UDEV [24333.641366] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial) UDEV [24333.648159] add /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0/tty/ttyUSB0 (tty) UDEV [24333.648969] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0/ttyUSB0 (usb-serial) UDEV [24333.649799] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8/3-8:1.0 (usb) UDEV [24333.650906] bind /devices/pci0000:00/0000:00:14.0/usb3/3-8 (usb) 

При этом я догадался, что правильные udev-подсистемы должны быть:

  • d4i -> tty
  • кобальт -> usb

И, как упоминалось в dirkt, используйте ATTRS вместо ATTR для сопоставления во всем пути устройства. Поэтому я изменил правила udev:

# My Cobalt2 DiveComputer SUBSYSTEM=="usb", ATTR=="0471", ATTR=="0888", SYMLINK+="my_cobalt", GROUP="dialout", MODE="0660" # My Suunto D4i DiveComputer SUBSYSTEM=="tty", ATTRS=="0403", ATTRS=="6001", ATTRS=="DiYISDGK", SYMLINK+="my_d4i", GROUP="dialout", MODE="0660" 

После перезапуска udev и повторного подключения устройства я получил:

ls -l / dev / tty_d4i

lrwxrwxrwx 1 root root 7 mei 22 00:43 tty_d4i -> ttyUSB0 

И это заставило его работать так, как я хотел. Я все еще не уверен на 100%, почему, но это мое ограниченное знание udev. Я буду продолжать расследование Udev, но пока это кажется решенным. Так что спасибо Dirkt за подсказку.

Для справки:

sudo udevadm info -a -n / dev / ttyUSB0

Информация Udevadm начинается с устройства, указанного devpath, а затем идет вверх по цепочке родительских устройств. Он печатает для каждого устройства найдено все возможные атрибуты в формате ключей правил udev. Правило для сопоставления, может быть составлено из атрибутов устройства и атрибуты от одного родительского устройства.  глядя на устройство '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0/tty/ttyUSB0': KERNEL == "ttyUSB0" SUBSYSTEM == "терминал" DRIVER == ""  глядя на родительское устройство '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0/ttyUSB0': KERNELS == "ttyUSB0" SUBSYSTEMS == "usb-серийный" DRIVERS == "ftdi_sio" ATTRS == "16" ATTRS == "0"  глядя на родительское устройство '/devices/pci0000:00/0000:00:14.0/usb3/3-7/3-7:1.0': KERNELS == "3-7: 1,0" SUBSYSTEMS == "USB" DRIVERS == "ftdi_sio" ATTRS == "1" ATTRS == "0" ATTRS == "FF" ATTRS == "00" ATTRS == "FF" ATTRS == "FF" ATTRS == "02" ATTRS == "USB Serial Cable" ATTRS == "1"  глядя на родительское устройство '/devices/pci0000:00/0000:00:14.0/usb3/3-7': KERNELS == "3-7" SUBSYSTEMS == "USB" DRIVERS == "USB" ATTRS == "1" ATTRS == "0" ATTRS == "1" ATTRS == "00" ATTRS == "00" ATTRS == "00" ATTRS == "8" ATTRS == "500mA" ATTRS == "1" ATTRS == "1" ATTRS == "0600" ATTRS == "a0" ATTRS == "3" ATTRS == "" ATTRS == "14" ATTRS == "7" ATTRS == "6001" ATTRS == "0403" ATTRS == "нет" ATTRS == "Smartinterface" ATTRS == "0" ATTRS == "USB Serial Cable" AttrS == "0x0" ATTRS == "съемный" ATTRS == "DiYISDGK" ATTRS == "12" ATTRS == "15" ATTRS == "2,00"  глядя на родительское устройство '/devices/pci0000:00/0000:00:14.0/usb3': KERNELS == "usb3" SUBSYSTEMS == "USB" DRIVERS == "USB" ATTRS == "1" ATTRS == "1" ATTRS == "0" ATTRS == "1" ATTRS == "09" ATTRS == "01" ATTRS == "00" ATTRS == "64" ATTRS == "0mA" ATTRS == "1" ATTRS == "1" ATTRS == "0415" ATTRS == "e0" ATTRS == "3" ATTRS == "" ATTRS == "1" ATTRS == "0" ATTRS == "0002" ATTRS == "1d6b" ATTRS == "1" ATTRS == "нет" ATTRS == "Linux 4.15.0-20-generic xhci-hcd" ATTRS == "15" ATTRS == "Хост-контроллер xHCI" AttrS == "0x0" ATTRS == "неизвестный" ATTRS == "0000: 00: 14.0" ATTRS == "480" ATTRS == "264" ATTRS == "2,00"  глядя на родительское устройство '/devices/pci0000:00/0000:00:14.0': KERNELS == "0000: 00: 14.0" SUBSYSTEMS == "PCI" DRIVERS == "xhci_hcd" ATTRS == "0" ATTRS == "0x0c0330" ATTRS == "64" ATTRS == "1" ATTRS == "отключено" ATTRS == "0x8d31" ATTRS == "64" ATTRS == "(нуль)" ATTRS == "1" ATTRS == "19" ATTRS == "0-11" ATTRS == "FFF" ATTRS == "1" ATTRS == "0" ATTRS == "0x05" ATTRS == "0x7a54" ATTRS == "0x1462" ATTRS == "0x8086"  глядя на родительское устройство '/ devices / pci0000: 00': KERNELS == "pci0000: 00" SUBSYSTEMS == "" DRIVERS == ""