Вопрос или проблема
Пробую подключить последовательное устройство (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-средой вам подходит, это может оказаться эффективным решением. Не стесняйтесь задавать дополнительные вопросы о проблемах или потребностях в отладке, чтобы найти оптимальное решение.
Каждый из этих шагов несет важность в контексте диагностики и настройки вашего устройства, так что исследуйте каждый из них внимательно.