Создано только 16 устройств ttyUSB для 32-портового USB-устройства с RS-232.

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

Я недавно приобрел Coolgear USB-32COM-RM 32-портовый адаптер RS-232 USB-serial, подключенный к Thinkpad T490s под управлением Mint 21.3. Вот некоторый вывод lsusb:

# lsusb
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 04f2:b681 Chicony Electronics Co., Ltd ThinkPad T490 Webcam
Bus 001 Device 118: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 117: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 116: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 115: ID 0403:6011 Future Technology Devices International, Ltd FT4232H Quad HS USB-UART/FIFO IC
Bus 001 Device 114: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 113: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 109: ID 2109:8887 VIA Labs, Inc. 40AN
Bus 001 Device 108: ID 045e:0047 Microsoft Corp. IntelliMouse Explorer 3.0
Bus 001 Device 112: ID 17ef:3083 Lenovo ThinkPad Thunderbolt 3 Dock USB Audio
Bus 001 Device 110: ID 17ef:3081 Lenovo USB2.0 HUB
Bus 001 Device 107: ID 17ef:3080 Lenovo USB2.0 Hub             
Bus 001 Device 106: ID 17ef:3080 Lenovo USB2.0 Hub             
Bus 001 Device 003: ID 8087:0aaa Intel Corp. Bluetooth 9460/9560 Jefferson Peak (JfP)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

# lsusb -t
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 10000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/12p, 480M
    |__ Port 2: Dev 106, If 0, Class=Hub, Driver=hub/5p, 480M
        |__ Port 1: Dev 107, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 1: Dev 110, If 0, Class=Hub, Driver=hub/2p, 480M
                |__ Port 2: Dev 112, If 2, Class=Audio, Driver=snd-usb-audio, 12M
                |__ Port 2: Dev 112, If 0, Class=Audio, Driver=snd-usb-audio, 12M
                |__ Port 2: Dev 112, If 3, Class=Human Interface Device, Driver=usbhid, 12M
                |__ Port 2: Dev 112, If 1, Class=Audio, Driver=snd-usb-audio, 12M
        |__ Port 4: Dev 108, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 5: Dev 109, If 0, Class=, Driver=, 480M
    |__ Port 4: Dev 113, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 2: Dev 114, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 3: Dev 117, If 2, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 3: Dev 117, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 3: Dev 117, If 3, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 3: Dev 117, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 1: Dev 115, If 3, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 1: Dev 115, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 1: Dev 115, If 2, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 1: Dev 115, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 4: Dev 118, If 3, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 4: Dev 118, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 4: Dev 118, If 2, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 4: Dev 118, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 2: Dev 116, If 2, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 2: Dev 116, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 2: Dev 116, If 3, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
            |__ Port 2: Dev 116, If 1, Class=Vendor Specific Class, Driver=ftdi_sio, 480M
    |__ Port 8: Dev 2, If 3, Class=Video, Driver=uvcvideo, 480M
    |__ Port 8: Dev 2, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 8: Dev 2, If 2, Class=Video, Driver=uvcvideo, 480M
    |__ Port 8: Dev 2, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 10: Dev 3, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 10: Dev 3, If 1, Class=Wireless, Driver=btusb, 12M

Несмотря на то, что это устройство на 32 порта, я вижу только 16 устройств /dev/ttyUSB:

# ls -ld /dev/ttyUSB*
crw-rw---- 1 root dialout 188,  0 Dec 12 23:02 /dev/ttyUSB0
crw-rw---- 1 root dialout 188,  1 Dec 12 23:02 /dev/ttyUSB1
crw-rw---- 1 root dialout 188, 10 Dec 12 23:02 /dev/ttyUSB10
crw-rw---- 1 root dialout 188, 11 Dec 12 23:02 /dev/ttyUSB11
crw-rw---- 1 root dialout 188, 12 Dec 12 23:02 /dev/ttyUSB12
crw-rw---- 1 root dialout 188, 13 Dec 12 23:02 /dev/ttyUSB13
crw-rw---- 1 root dialout 188, 14 Dec 12 23:02 /dev/ttyUSB14
crw-rw---- 1 root dialout 188, 15 Dec 12 23:02 /dev/ttyUSB15
crw-rw---- 1 root dialout 188,  2 Dec 12 23:02 /dev/ttyUSB2
crw-rw---- 1 root dialout 188,  3 Dec 12 23:02 /dev/ttyUSB3
crw-rw---- 1 root dialout 188,  4 Dec 12 23:02 /dev/ttyUSB4
crw-rw---- 1 root dialout 188,  5 Dec 12 23:02 /dev/ttyUSB5
crw-rw---- 1 root dialout 188,  6 Dec 12 23:02 /dev/ttyUSB6
crw-rw---- 1 root dialout 188,  7 Dec 12 23:02 /dev/ttyUSB7
crw-rw---- 1 root dialout 188,  8 Dec 12 23:02 /dev/ttyUSB8
crw-rw---- 1 root dialout 188,  9 Dec 12 23:02 /dev/ttyUSB9

Почему я вижу только 16 из 32 портов?

Я столкнулся с аналогичной проблемой несколько лет назад; чтобы все 32 порта были распознаны, мне пришлось пройти через несколько препятствий, снизив скорость USB-порта, к которому подключен адаптер.

Я явно не знаю, сработает ли это у вас, но вот что я сделал:

  • Правило udev
# /etc/udev/rules.d/40-set_usb2.rules
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1a40", ATTR{idProduct}=="0201", TAG+="systemd", ENV{SYSTEMD_WANTS}="set_usb2.service"
  • Скрипт оболочки
#!/bin/bash
# /usr/local/bin/set_usb2.sh
[ -h /sys/class/tty/ttyUSB0 ] || exit 1
pci_id=$( /usr/bin/realpath /sys/class/tty/ttyUSB0 | awk -F"https://unix.stackexchange.com/" '{print gensub(/....:(.*)/, "\\1","1",$5)}' )
usb_id=$( lspci -n| awk -v id="$pci_id" '$0 ~ id {print $3}' )
/usr/bin/setpci -H1 -d "$usb_id" d0.l=0
  • Файл юнита systemd
# /etc/systemd/system/set_usb2.service
[Unit]
Description=switch USB for serials to USB2

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/local/bin/set_usb2.sh

[Install]
WantedBy=multi-user.target

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

При подключении устройства Coolgear USB-32COM-RM 32-портового USB-to-Serial адаптера к ноутбуку ThinkPad T490s под управлением Linux Mint 21.3, проблема с нераспознаванием всех портов может быть связана с ограничениями, накладываемыми на USB-устройства, а также настройками системы.

Проблема

Согласно вашему описанию, система распознаёт только 16 из 32 доступных портов /dev/ttyUSB. Это может быть вызвано несколькими факторами:

  1. Ограничение USB: Некоторые USB-устройства могут иметь ограничения на количество одновременно активных виртуальных последовательных портов. Это связано с архитектурными ограничениями драйверов и самого USB-протокола.

  2. Драйверы: Основная причина может заключаться в том, что драйвер FTDI, используемый для работы с адаптером, не инициализирует все порты. Возможно, это связано с версией ядра, или драйвером, установленным в вашей системе.

  3. Конфликты с другими устройствами: Если на портах USB имеются конфликты, это также может вызвать проблемы с обнаружением устройств. Например, богатый набор других устройств, подключённых к USB-хабам, может негативно сказаться на работе адаптера.

Возможные Решения

  1. Проверьте скорость USB-порта: Как было предложено пользователем, можно попробовать установить скорость USB-порта, к которому подключен адаптер, на более низкую. Это можно сделать через udev-правила и системные скрипты.

  2. Создайте udev-правило:
    Вы можете создать правило в /etc/udev/rules.d/ для управления настройками подключения следующего вида:

    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6011", TAG+="systemd", ENV{SYSTEMD_WANTS}="set_usb2.service"
  3. Создайте shell-скрипт для переключения USB на USB 2.0:

    #!/bin/bash
    # /usr/local/bin/set_usb2.sh
    [ -h /sys/class/tty/ttyUSB0 ] || exit 1
    pci_id=$( /usr/bin/realpath /sys/class/tty/ttyUSB0 | awk -F"/" '{print $NF}' )
    usb_id=$( lspci -n | awk -v id="$pci_id" '$0 ~ id {print $3}' )
    /usr/bin/setpci -H1 -d "$usb_id" d0.l=0
  4. Настройка systemd-юнита:
    Создайте юнит файл в /etc/systemd/system/set_usb2.service для автоматизации выполнения скрипта:

    [Unit]
    Description=switch USB for serials to USB2
    
    [Service]
    Type=oneshot
    RemainAfterExit=no
    ExecStart=/usr/local/bin/set_usb2.sh
    
    [Install]
    WantedBy=multi-user.target

Заключение

Для полной функциональности вашего 32-портового адаптера в системе необходимо учесть как аппаратные, так и программные настройки. Следуйте предложенным рекомендациям и проверьте, могут ли они помочь вам в решении проблемы. Возможно, потребуется также обновить ядро или поменять драйверы, что иногда является решением для максимизации распознаваемых портов.

Если указанные шаги не приведут к успеху, вам может потребоваться обратиться за поддержкой к производителю устройства или на специализированные форумы сообщества Linux, чтобы получить дополнительную помощь.

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

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