Серийное устройство (/dev/serial/) не отображается на Android

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

Пробую подключить последовательное устройство (3D-принтер) через USB-порт, чтобы установить с ним связь (прошивка klipper) на Android-устройстве (LOS 18.1/Android 11, ядро 3.18). Но я не могу найти его в /dev/serial/, он отображается только как /dev/ttyUSB0 и /dev/bus/usb/001/00[^1], и я не могу установить с ним связь через эти порты. Я скомпилировал ядро с драйвером ch341.c. ‘lsusb -v’ из chrooted Debian через Linux deploy выдает следующий вывод, интересующее устройство называется ‘QinHeng Electronics CH340…’:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               3.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0
  bDeviceProtocol         3
  bMaxPacketSize0         9
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0003 3.0 root hub
  bcdDevice            3.18
  iManufacturer           3 Linux 3.18.140-Swan-gcb3e40e597b0-dirty xhci-hcd
  iProduct                2 xHCI Host Controller
  iSerial                 1 xhci-hcd.0.auto
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x001f
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Самостоятельное питание
      Удалённое пробуждение
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0
      bInterfaceProtocol      0 Полная скорость (или коренной) хаб
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Тип передачи            Прерывание
          Тип синхронизации      Нет
          Тип использования       Данные
        wMaxPacketSize     0x0004  1x 4 байта
        bInterval              12
        bMaxBurst               0
Hub Descriptor:
  bLength              12
  bDescriptorType      42
  nNbrPorts             1
  wHubCharacteristic 0x000a
    Без переключения питания (usb 1.0)
    Защита от перегрузки по порту
  bPwrOn2PwrGood       10 * 2 миллисекунд
  bHubContrCurrent      0 миллиампер
  bHubDecLat          0.0 микросекунд
  wHubDelay             0 наносекунд
  DeviceRemovable    0x00
 Hub Port Status:
   Port 1: 0000.02a0 5Gbps power Rx.Detect
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x000f
  bNumDeviceCaps          1
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x02
      Поддерживаются сообщения о допустимости задержки (LTM)
    wSpeedsSupported   0x0008
      Устройство может работать на SuperSpeed (5Gbps)
    bFunctionalitySupport   3
      Наименьшая полностью функциональная скорость устройства - SuperSpeed (5Gbps)
    bU1DevExitLat           0 микросекунд
    bU2DevExitLat           0 микросекунд
невозможно получить дескриптор отладки: Ресурс временно недоступен
Device Status:     0x0001
  Самостоятельное питание

Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 последовательный конвертер
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass          255 Специфический класс поставщика
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x1a86 QinHeng Electronics
  idProduct          0x7523 CH340 последовательный конвертер
  bcdDevice            2.64
  iManufacturer           0
  iProduct                2 USB Serial
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0027
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Питается от шины)
    MaxPower               98mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Специфический класс поставщика
      bInterfaceSubClass      1
      bInterfaceProtocol      2
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Тип передачи            Объемный
          Тип синхронизации      Нет
          Тип использования       Данные
        wMaxPacketSize     0x0020  1x 32 байта
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Тип передачи            Объемный
          Тип синхронизации      Нет
          Тип использования       Данные
        wMaxPacketSize     0x0020  1x 32 байта
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Тип передачи            Прерывание
          Тип синхронизации      Нет
          Тип использования       Данные
        wMaxPacketSize     0x0008  1x 8 байта
        bInterval               1
невозможно получить дескриптор отладки: Ресурс временно недоступен
Device Status:     0x0000
  (Питается от шины)

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0
  bDeviceProtocol         1 Один TT
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            3.18
  iManufacturer           3 Linux 3.18.140-Swan-gcb3e40e597b0-dirty xhci-hcd
  iProduct                2 xHCI Host Controller
  iSerial                 1 xhci-hcd.0.auto
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0019
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Самостоятельное питание
      Удалённое пробуждение
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0
      bInterfaceProtocol      0 Полная скорость (или коренной) хаб
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Тип передачи            Прерывание
          Тип синхронизации      Нет
          Тип использования       Данные
        wMaxPacketSize     0x0004  1x 4 байта
        bInterval              12
Hub Descriptor:
  bLength               9
  bDescriptorType      41
  nNbrPorts             1
  wHubCharacteristic 0x000a
    Без переключения питания (usb 1.0)
    Защита от перегрузки по порту
    Время задержки TT 8 FS бит
  bPwrOn2PwrGood       10 * 2 миллисекунд
  bHubContrCurrent      0 миллиампер
  DeviceRemovable    0x00
  PortPwrCtrlMask    0xff
 Hub Port Status:
   Port 1: 0000.0103 питание включено соединение
невозможно получить квалификатор устройства: Ресурс временно недоступен
невозможно получить дескриптор отладки: Ресурс временно недоступен
Device Status:     0x0001
  Самостоятельное питание

Как я могу установить связь с последовательным устройством? Есть ли какие-либо другие модули ядра, которые мне нужно скомпилировать? Обрабатывает ли новая версия Android последовательные устройства иначе, чем Linux? Я видел, как другие люди запускали эту прошивку на Android в chrooted Linux, например, здесь, здесь, здесь. Так что это возможно, я просто, похоже, что-то упустил. Я с радостью размещу другую отладочную информацию/логи.

/dev/ttyUSB0 будет именем по умолчанию для большинства USB-to-serial конвертеров в ядре Linux, в то время как /dev/serial/* вероятно является псевдонимом, созданным какой-то udev правилом. Если ваша Android-система имеет минимизированный набор правил udev, в ней может не быть правила для генерации псевдонимов /dev/serial/*.

/dev/ttyUSB0 (и любые его псевдонимы, если они существуют) – это интерфейс устройства Unix TTY (по сути, последовательный порт + много дополнительных функций для работы с устаревшими последовательными терминалами) для USB-to-serial конвертера. Если между чипом конвертера и фактическим 3D-принтером действительно ведётся последовательная связь RS-232, вам может потребоваться установить правильные параметры последовательного порта, прежде чем вы сможете успешно установить связь. Даже минимальная программа-эмулятор терминала, такая как picocom, может здесь очень помочь, хотя, вероятно, вы можете использовать stty, чтобы сделать настройки, если это необходимо.

С другой стороны, устройства /dev/bus/usb/*/* ожидают, что программа, использующая их, будет осведомлена о функциональности USB-шины. На практике программа, скорее всего, будет использовать библиотеку libusb для работы с этими устройствами.

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

Проблема связи с последовательным устройством (в данном случае 3D-принтером) через USB-порт на устройстве под управлением Android может быть осложнена несколькими факторами. Давайте проанализируем ситуацию подробнее и предложим возможные решения.

1. Описание Проблемы

Вы хотите подключить через USB последовательное устройство (3D-принтер) к Android-устройству, и оно отображается в /dev/ttyUSB0, но не появляется в /dev/serial/. Это может указывать на недостаточную поддержку драйверов либо проблемы с настройками устройства.

2. Понимание Структуры Устройств Linux

/dev/ttyUSB0 является стандартным именем для USB-to-serial конвертеров в Linux, это интерфейс, который работает с последовательными портами. В то время как /dev/serial/* может быть создано с помощью правил udev, которые могут отсутствовать в вашей сборке Android. Следовательно, если Android имеет минимальный набор правил udev, это может объяснить, почему /dev/serial/ не отображается.

3. Подключение к Устройству

Чтобы установить связь с 3D-принтером через /dev/ttyUSB0, вам необходимо убедиться, что вы правильно настроили параметры последовательного порта, такие как скорость передачи данных, биты данных, четность, и стоп-биты. Это можно сделать с использованием утилиты stty или через простые терминальные эмуляторы, такие как picocom.

Пример команды настройки порта:

stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb

Где 115200 – это скорость, cs8 – 8 бит данных, -cstopb – 1 стоп-бит, -parenb – без четности.

4. Использование библиотек

Запросы к /dev/bus/usb/*/* требуют понимания функционала шины USB, для чего вам потребуется использовать такие библиотеки, как libusb. Однако для простого общения с 3D-принтером использование /dev/ttyUSB0 будет более подходящим.

5. Модули Ядра и Поддержка

Убедитесь, что нужные модули ядра загружены. Вы уже упомянули об использовании драйвера ch341.c. Если у вас есть доступ к исходному коду ядра Android, убедитесь, что этот драйвер правильно скомпилирован и включен в вашу сборку. Возможно, также стоит проверить наличие других драйверов для USB-to-serial устройств, таких как ftdi_sio и pl2303.

6. Проблемы Конфликтов

Также стоит проверить, не возникает ли конфликтов между драйверами. Убедитесь, что другие драйверы или устройства не блокируют доступ к порту.

7. Альтернативные Способы

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

Заключение

Таким образом, для успешного взаимодействия с вашим 3D-принтером необходимо уделить внимание правильной настройке последовательного порта и загрузке нужных модулей ядра. Если предложение о работе с chroot-средой вам подходит, это может оказаться эффективным решением. Не стесняйтесь задавать дополнительные вопросы о проблемах или потребностях в отладке, чтобы найти оптимальное решение.

Каждый из этих шагов несет важность в контексте диагностики и настройки вашего устройства, так что исследуйте каждый из них внимательно.

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

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