Эта статья выросла из заметки 2010 года, которая была каталогом ссылок на драйверные сайты. Переписана она по одной причине: в Linux драйвер для ARK3116 уже в ядре, и ничего скачивать не нужно — а установка «драйвера» с сайта-агрегатора сегодня означает загрузку неизвестного исполняемого файла на машину, где, возможно, лежат ключи и пароли. Ниже — как USB-UART адаптер на ARK3116 опознаётся по идентификаторам, что именно делает встроенный драйвер, чем это проверяется на живом Debian 12 и какие грабли ждут при подключении к консоли сетевого оборудования.

TL;DR: что это и как проверить за десять минут
- Что это. Микросхема-преобразователь USB в последовательный порт (UART) от ArkMicroChips; в системе выглядит как
/dev/ttyUSB0. - Опознание. Vendor ID
0x6547, Product ID0x0232— плюс второй идентификатор0x18EC:0x3118в таблице драйвера. - Драйвер. В Linux это модуль ядра
ark3116(CONFIG_USB_SERIAL_ARK3116=m), в FreeBSD —uark(4). Ставить ничего не нужно. - Права. Порт открывает только root или член группы
dialout; после добавления в группу нужен новый вход. - Главный риск. Драйверы с сайтов-агрегаторов и несовпадение уровней TTL (5 В против 3,3 В) — два способа испортить и машину, и подключаемое устройство.
lsusb | grep -i 6547 # 6547:0232 — адаптер виден
modinfo ark3116 | head -6 # драйвер есть в ядре
dmesg | tail -5 # драйвер привязался к устройству
ls -l /dev/ttyUSB* # появился порт
Проблема, которую это решает
Ситуация типовая: у сетевого оборудования, промышленного контроллера или отладочной платы есть последовательный порт, а на ноутбуке его нет уже полтора десятилетия. Нужен переходник USB → UART, и ARK3116 — один из самых дешёвых вариантов.
Дальше начинается путаница, из-за которой и появляются статьи-каталоги драйверов. На Windows производитель действительно требовал отдельный драйвер, и в интернете осел десяток сайтов с файлами вида ARK3116.zip, ark3116.exe и «драйвер для VID_6547&PID_0232». Часть этих файлов — переупакованные старые драйверы, часть — сомнительные сборки с рекламными модулями, а некоторые просто содержат посторонний код. Проверить происхождение файла без подписи невозможно.
В Linux и FreeBSD ситуация обратная: драйвер десятилетиями живёт в основном дереве ядра, поддерживается сообществом и подписан вместе с ядром. Скачивать нечего, и это не мелочь, а принципиальная разница в модели доверия.
Отсюда и структура статьи: сначала опознание устройства, потом проверка встроенного драйвера, потом настройка порта — и только в конце разговор о Windows, где честный ответ звучит как «проверяйте на своей сборке, а не берите первый файл из поиска».
Что такое ARK3116 и как он опознаётся
ARK3116 — высокоинтегрированный контроллер, который преобразует USB Full-Speed (12 Мбит/с) в последовательный порт UART. Внешне это обычно маленькая плата в прозрачной термоусадке с USB-разъёмом с одной стороны и четырьмя-пятью проводами с другой, либо законченный кабель.
| Параметр | Значение | Чем подтверждается |
|---|---|---|
| Производитель | ArkMicroChips (Arkmicro Technologies) | описание модуля ядра |
| Vendor ID | 0x6547 |
modinfo ark3116 → alias usb:v6547p0232d* |
| Product ID | 0x0232 |
там же |
| Второй идентификатор | 0x18EC:0x3118 |
alias usb:v18ECp3118d* в том же модуле |
| Интерфейс | USB Full-Speed, 12 Мбит/с | документация на контроллер |
| Что эмулирует | последовательный порт UART, в том числе для IrDA | описание модуля: «serial/IrDA driver» |
| Драйвер Linux | ark3116.ko, автор Bart Hartgers, лицензия GPL, внутри дерева ядра |
modinfo |
| Драйвер FreeBSD | uark(4) |
документация FreeBSD |
| Лицензия драйвера | GPL | modinfo |
Идентификаторы — первое, что нужно знать: по ним устройство опознаётся в lsusb, по ним же пишется правило udev и фильтр в системе инвентаризации. Второй идентификатор (18EC:3118) в статье 2010 года не упоминался, а он есть в таблице драйвера — производитель выпускал устройства под двумя наборами VID/PID.
Отдельно про варианты исполнения. Старая заметка перечисляла ARK3116, ARK3116T и ARK3116S как разные версии с разными возможностями. Проверить это по документации сейчас не удалось, поэтому в статье нет утверждений о различиях между ними: для драйвера важен идентификатор, а не буква в названии. Различия в обвязке — уровни TTL, наличие развязки, распиновка — определяются конкретной платой, а не маркировкой чипа.
Возможности: что адаптер умеет и чего не умеет
Таблицы ниже описывают не «возможности микросхемы из даташита», а то, с чем администратор сталкивается на практике.
| Со стороны USB | Со стороны UART |
|---|---|
| опознаётся по VID/PID без внешней утилиты | создаёт устройство /dev/ttyUSB* |
| питание от шины, отдельный блок питания не нужен | уровни TTL: 5 В или 3,3 В — зависит от платы |
| работает через любой USB-порт, включая хаб | поддерживает стандартные скорости от 9600 до 115200 и выше |
| не требует загрузки прошивки при включении | управление потоком RTS/CTS — по возможностям платы |
| Что нужно | Подходит ли ARK3116 | Оговорка |
|---|---|---|
| Консоль маршрутизатора или коммутатора | да, самая частая задача | уровни и распиновка — по паспорту оборудования |
| Отладочный порт микроконтроллера | да | 3,3 В против 5 В: несовпадение выводит порт из строя |
| Промышленный контроллер по RS-232 | да, при наличии преобразователя уровней | сам чип выдаёт TTL, а не ±12 В |
| IrDA-приёмник или передатчик | да, заявлено в описании драйвера | нужен сам модуль IrDA |
| Модем или телефон старого поколения | исторически да | современные кабели для мобильных давно ушли в USB |
| Скорости выше 1 Мбит/с | нет | это Full-Speed USB и UART без внешнего потока |
Есть и третья категория — устройства, где адаптер не нужен вовсе. Если у оборудования есть сетевой порт и SSH, консольный кабель остаётся аварийным средством, а не ежедневным инструментом. Покупать его стоит именно в этом качестве: однажды он понадобится в момент, когда сеть не поднимается, и тогда важно, чтобы он был в ящике, а не «заказан и едет».
Важная оговорка про «RS-232». Чип работает с логическими уровнями (TTL), а промышленный стандарт RS-232 предполагает двухполярные сигналы ±12 В. Платы, которые продаются как «USB-RS232 на ARK3116», содержат дополнительный преобразователь уровней; если его нет, а вы подключились к настоящему COM-порту оборудования, ничего не заработает — и хорошо, если не сгорит.
Драйвер в Linux: что уже есть в ядре
Проверка делалась на живом хосте: Debian 12, ядро 6.1.0-54-amd64. Ниже — фактический вывод, а не пересказ.
| Что проверялось | Результат |
|---|---|
| Модуль на месте | /lib/modules/6.1.0-54-amd64/kernel/drivers/usb/serial/ark3116.ko |
| Описание | USB ARK3116 serial/IrDA driver |
| Автор | Bart Hartgers <bart.hartgers+ark3116@gmail.com> |
| Лицензия | GPL |
| Зависимости | usbserial, usbcore |
| В дереве ядра | intree: Y |
| Алиасы устройств | usb:v18ECp3118d*… и usb:v6547p0232d*… |
| Конфигурация ядра | CONFIG_USB_SERIAL_ARK3116=m |
flowchart LR
HOST["USB-хост: xHCI и usbcore"] --> MATCH{"совпал ли VID/PID?"}
MATCH -- "6547:0232" --> DRV["ark3116.ko: usb-serial драйвер"]
MATCH -- "18EC:3118" --> DRV
MATCH -- "другой" --> OTHER["другой драйвер или «устройство не опознано»"]
DRV --> TTY["/dev/ttyUSB0: line discipline, termios"]
TTY --> APP["picocom, screen, minicom, своя программа"]
UDEV["правило udev: стабильное имя"] -.-> TTY
GRP["группа dialout"] -.-> APPДля сравнения: в том же каталоге ядра Debian лежат 53 модуля USB-serial, включая ftdi_sio, cp210x, pl2303, ch341, mct_u232, ftdi_sio и другие. Все они — модули (=m), то есть подгружаются при появлении устройства или вручную. Ни один из них на проверяемом хосте не был загружен (lsmod пусто по этим именам), потому что устройств не подключено: модуль появляется в системе, когда он нужен.
| Микросхема | Модуль в ядре Debian 12 | Описание из modinfo |
|---|---|---|
| ARK3116 | ark3116 |
USB ARK3116 serial/IrDA driver |
| FTDI FT232 | ftdi_sio |
USB FTDI Serial Converters Driver |
| Silicon Labs CP210x | cp210x |
Silicon Labs CP210x RS232 serial adaptor driver |
| Prolific PL2303 | pl2303 |
Prolific PL2303 USB to serial adaptor driver |
| CH340/CH341 | ch341 |
описание пустое даже в свежем ядре |
Строка про ch341 — не придирка: у этого модуля нет описания в modinfo, и в инвентаризации по описанию он не найдётся. Мелочь, которая ломает автоматику, если она ищет адаптеры по тексту.
Как это устроено внутри
Путь от разъёма до приложения состоит из четырёх звеньев, и ломается он тоже по звеньям — что удобно для диагностики.
flowchart TD
PLUG["вставили адаптер"] --> LS{"lsusb видит 6547:0232?"}
LS -- нет --> P1["проблема кабеля, порта или питания"]
LS -- да --> DM{"dmesg: драйвер привязался?"}
DM -- нет --> P2["модуль не загружен или VID не в таблице"]
DM -- да --> DEV{"появился /dev/ttyUSB*?"}
DEV -- нет --> P3["нет модуля usbserial или конфликт с brltty"]
DEV -- да --> OPEN{"порт открывается без прав root?"}
OPEN -- нет --> P4["добавить пользователя в dialout, перелогиниться"]
OPEN -- да --> RUN["работа: stty, затем терминал"]- USB-хост. Контроллер xHCI опрашивает устройство и читает дескрипторы: производитель, продукт, класс.
- Сопоставление. Ядро сверяет пару VID/PID с таблицами всех usb-serial драйверов. Для
6547:0232совпадение даётark3116. - Драйвер usb-serial.
ark3116.koрегистрируется как tty-драйвер поверхusbserial: он превращает USB-передачу в поток байт и обратно. - Слой tty. Появляется
/dev/ttyUSB0; дальше работают обычные механизмы:termios(скорость, биты, чётность), управление потоком, права доступа.
| Звено | Чем проверяется | Типичная причина отказа |
|---|---|---|
| USB-хост | lsusb |
кабель только для зарядки, мёртвый порт, нехватка питания |
| Сопоставление | dmesg |
модуль не загружен, VID не в таблице |
| usb-serial | ls /dev/ttyUSB* |
нет usbserial, конфликт с brltty |
| tty и права | stty -F, id |
нет группы dialout, SELinux/AppArmor |
Установка
В Linux устанавливать нечего — это главный вывод статьи. Проверка сводится к трём командам, и только если модуль отсутствует, начинается разговор о пакетах.
# 1. есть ли модуль в ядре
modinfo ark3116 | head -6
# 2. загружен ли он сейчас и что говорит журнал ядра
lsmod | grep ark3116
dmesg | tail -20
# 3. при необходимости загрузить вручную
sudo modprobe ark3116
Если modinfo отвечает «Module ark3116 not found», это значит, что ядро собрано без этого драйвера — например, это не дистрибутивное ядро, а самосборное с урезанной конфигурацией. Тогда вариантов два: поставить дистрибутивное ядро или пересобрать своё с CONFIG_USB_SERIAL_ARK3116=m. Скачивать драйвер отдельным файлом не нужно и не следует.
Права доступа — второй шаг, и именно на нём спотыкаются чаще всего:
# кто вы и в каких группах
id
# добавить себя в dialout и перелогиниться (иначе группа не применится)
sudo usermod -aG dialout "$USER"
Постоянное имя порта — третья полезная настройка. Без неё при двух подключённых адаптерах /dev/ttyUSB0 и /dev/ttyUSB1 могут поменяться местами после перезагрузки, и скрипт однажды запишет в чужое устройство.
# /etc/udev/rules.d/99-ark3116.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="6547", ATTRS{idProduct}=="0232", SYMLINK+="ttyARK0"
sudo udevadm control --reload-rules && sudo udevadm trigger
ls -l /dev/ttyARK0
Windows: честный порядок
Здесь старая заметка обещала автоматическую установку встроенного драйвера на Windows 7–11. Проверить это на парке машин в рамках этой статьи не удалось, поэтому порядок такой: сначала посмотреть, опознала ли система устройство сама (Диспетчер устройств → Порты (COM и LPT)), и только потом искать драйвер.
| Шаг | Что делать | Чего не делать |
|---|---|---|
| 1 | Посмотреть, появился ли COM-порт в диспетчере устройств | не ставить «драйвер» до проверки |
| 2 | Если устройство с восклицательным знаком — узнать его VID/PID в свойствах | не брать первый файл из поиска |
| 3 | Проверить подпись исполняемого файла, если он всё же нужен | не запускать файлы без цифровой подписи |
| 4 | По возможности использовать хост с Linux для консольных задач | не ставить драйвер на машину с секретами «на пробу» |
Настройка
Настройка — это параметры линии и терминал. По умолчанию newer tty создаётся с параметрами 9600 8N1; для консоли сетевого оборудования обычно нужно 115200 8N1.
flowchart LR SPEED["скорость: 9600, 115200, 230400"] --> CONF["параметры линии: 8N1, без управления потоком"] FLOW["управление потоком: none, rtscts"] --> CONF LVL["уровни TTL: 5 В или 3,3 В"] --> RISK["несовпадение уровней: порт устройства выходит из строя"] ISO["гальваническая развязка"] --> RISK CONF --> TERM["терминал или скрипт"]
# параметры линии: 115200 бод, 8 бит, без чётности, 1 стоп-бит, без управления потоком
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts
# интерактивно: picocom (выход Ctrl+A, Ctrl+X) или screen (выход Ctrl+A, K)
picocom -b 115200 /dev/ttyUSB0
screen /dev/ttyUSB0 115200
# minicom: создать профиль и не сохранять настройки в системный файл
minicom -D /dev/ttyUSB0 -b 115200
| Параметр | Типичное значение | Когда меняют |
|---|---|---|
| Скорость | 115200 для сетевого оборудования, 9600 для старой промышленной электроники | по паспорту устройства |
| Биты и чётность | 8N1 | 7E1 встречается у старого промышленного ПО |
| Управление потоком | выключено | включают, если оборудование требует RTS/CTS |
| DTR/RTS | по умолчанию подняты | некоторые устройства требуют их снятия, иначе не отвечают |
| Таймаут чтения | не задаётся | в скриптах задаётся на уровне termios или опроса |
Скриптовая работа с портом — не редкость: снять вывод консоли при загрузке, отправить команду, дождаться ответа. Здесь помогает python3 -m serial.tools.miniterm или собственный код на pyserial; для разовых задач хватает timeout 5 cat /dev/ttyUSB0.
Есть и обратная сторона удобства: /dev/ttyUSB0 — это файл, и запись в него ничем не защищена. Если в системе два адаптера, а скрипт обращается к имени по умолчанию, однажды команда уйдёт не в тот порт. Поэтому в сценариях, которые что-то меняют на устройстве, имя порта лучше брать из стабильного символьного имени, а перед записью проверять, что устройство то: сравнивать idVendor и idProduct через udevadm info -q property -n /dev/ttyARK0. Это две секунды работы и снятый целый класс инцидентов.
Третий приём, который экономит часы при разборе: держать порт открытым в picocom с включённым журналом (-g файл). Тогда всё, что устройство сказало при загрузке, оказывается в файле, и разбор идёт по тексту, а не по памяти.
Замеры и цифры
| Что измерено | Значение | Как измерено |
|---|---|---|
| Ядро проверяемого хоста | 6.1.0-54-amd64 | uname -r |
| Модуль драйвера | ark3116.ko |
modinfo ark3116 |
| Алиасов устройств в драйвере | 2 | modinfo -F alias |
| Модулей USB-serial в ядре | 53 | ls /lib/modules/*/kernel/drivers/usb/serial/ |
| Загруженных USB-serial модулей | 0 | lsmod |
| Конфигурация ядра | CONFIG_USB_SERIAL_ARK3116=m |
/boot/config-$(uname -r) |
| Лицензия драйвера | GPL, внутри дерева ядра | modinfo |
Оговорка о границах измерения: проверялся один хост и одно ядро. На других дистрибутивах и версиях ядра набор usb-serial модулей отличается, а на самосборных ядрах драйвер может отсутствовать вовсе. Утверждение «драйвер встроен» относится к дистрибутивным ядрам, а не к любому ядру Linux.
Почему это круто
- Драйвер уже стоит. В дистрибутивном ядре
ark3116есть как модуль, подписанный вместе с ядром: ничего скачивать и «устанавливать» не нужно. - Опознание по двум идентификаторам.
6547:0232и18EC:3118— этого достаточно для инвентаризации и правил udev. - Стабильное имя порта. Одно правило udev убирает целый класс ошибок «записал не в то устройство».
- Работает без прошивки. Чип не требует загрузки firmware при включении, поэтому не бывает «устройство есть, порта нет».
- Дешёвый расходник. Для консольного кабеля, который теряется и ломается, это важнее характеристик.
- Прозрачен для приложений. После
/dev/ttyUSB0работают все обычные инструменты:picocom,screen,minicom,pyserial. - История в upstream. Драйвер поддерживается в основном дереве ядра, а не в вендорском установщике, который перестал обновляться.
- Диагностика по звеньям. Четыре шага
lsusb→dmesg→/dev→ права дают ответ за минуту.
Подводные камни
- Уровни TTL не совпадают молча. Плата на 5 В, подключённая к порту 3,3 В, выводит порт из строя — и обычно это замечают уже после. Проверять по паспорту платы до подключения.
- RS-232 и TTL — разные вещи. Без преобразователя уровней адаптер не заработает с настоящим COM-портом, а в худшем случае повредит его.
brlttyперехватывает устройство. На части дистрибутивов служба для дисплеев Брайля забирает6547:0232себе, и порт не появляется. Лечится исключением в конфигурацииbrlttyили отключением службы.- Группа
dialoutприменяется после входа. Добавление в группу не действует на текущую сессию — нужен новый вход илиnewgrp dialout. - Порты меняются местами. Два одинаковых адаптера дают
/dev/ttyUSB0и/dev/ttyUSB1в порядке, который не гарантирован; без правила udev скрипт может обратиться не к тому устройству. - Драйверы с сайтов-агрегаторов. Файл без подписи проверить нечем; для Linux он не нужен вовсе, а для Windows это единственный реальный риск заражения в этой задаче.
- Клоны ведут себя иначе. Один и тот же VID/PID встречается у разных плат с разной обвязкой, поэтому «работает у коллеги» ничего не гарантирует.
- Управление потоком по умолчанию выключено. Если оборудование требует RTS/CTS, а линия настроена без него, обмен будет терять байты без внятной ошибки.
Чек-лист внедрения
- Проверить идентификаторы:
lsusb | grep -i 6547— устройство должно быть видно как6547:0232. - Убедиться, что драйвер есть в ядре:
modinfo ark3116. - Посмотреть
dmesgпосле подключения: драйвер должен привязаться и назвать порт. - Проверить права:
id, при необходимости добавить пользователя вdialoutи перелогиниться. - Задать стабильное имя правилом udev, если адаптеров больше одного.
- Настроить линию: скорость и формат по паспорту устройства, управление потоком осознанно.
- Сверить уровни и распиновку до первого подключения к оборудованию — это единственная ошибка, которая стоит денег.
Критерий «работает»: порт открывается без sudo, stty -F показывает заданную скорость, терминал отвечает на ввод, а после перезагрузки имя порта не изменилось.
FAQ
Нужно ли ставить драйвер ARK3116 в Linux?
Нет, если ядро дистрибутивное: драйвер ark3116 входит в него модулем. modinfo ark3116 покажет описание, автора и лицензию — это и есть доказательство, что он есть.
Как узнать, что передо мной именно ARK3116, а не другой переходник?
По паре идентификаторов в lsusb: 6547:0232 либо 18EC:3118. Название на корпусе и надпись на плате ничего не гарантируют — встречаются перемаркированные клоны.
Порт не появляется, хотя lsusb устройство видит. Что проверять?
Три вещи по порядку: загружен ли модуль (lsmod), что говорит dmesg, и не перехватила ли устройство служба brltty. Если драйвер привязался, а /dev/ttyUSB* нет, проблема в слое usb-serial, а не в железе.
Почему порт открывается только под root?
Потому что устройство принадлежит группе dialout с правами rw для группы. Добавление пользователя в группу действует только после нового входа в систему; проверяется командой id.
Можно ли использовать этот адаптер для настоящего RS-232?
Только если на плате есть преобразователь уровней. Сам чип работает с логическими уровнями TTL, а RS-232 — двухполярный сигнал; подключение «напрямую» опасно для оборудования.
Чем ARK3116 хуже FTDI FT232?
Исторически FTDI считался стабильнее, и в ядре он поддержан тем же способом (ftdi_sio). Разница в цене кратная, а для консольного кабеля, который таскают в кармане, дешёвый вариант часто разумнее. Выбирать стоит по задаче, а не по репутации чипа.
Что делать на Windows, если система не опознала устройство?
Сначала посмотреть VID/PID в свойствах неизвестного устройства и поискать драйвер по этому идентификатору у вендора оборудования, а не на сайте-агрегаторе. Файл без цифровой подписи лучше не запускать: проверить его происхождение нечем.
Итог
Старая заметка была полезна в 2010 году и опасна сегодня: она вела читателя скачивать драйвер там, где в Linux драйвер уже в ядре, а на Windows предлагала файлы неизвестного происхождения. Проверка на живом Debian 12 показывает простую картину: модуль ark3116 на месте, поддерживается в upstream, опознаёт устройство по двум парам идентификаторов и требует от администратора ровно трёх действий — убедиться в наличии модуля, дать права и настроить линию. Всё остальное — аккуратность с уровнями TTL и стабильные имена портов.
Цитата: Лучший драйвер для USB-UART — тот, что уже подписан вместе с ядром; всё, что нужно скачать отдельным файлом, требует отдельного доверия.
Связанные материалы
- Драйвер ark3116 в ядре Linux — источник — код драйвера в upstream-дереве.
- uark(4) — документация FreeBSD — драйвер ARK3116 для FreeBSD.
- Обзор стандарта RS-232 — электрические уровни и почему TTL с RS-232 несовместим напрямую.
- Горячие клавиши Windows — справочник по сочетаниям, полезный при работе с консолью.
- CVE-2026-111497: аудит Brotli тремя скриптами — пример проверки версий и подписей перед установкой.
LLM Summary
- Тема: ARK3116 — микросхема USB-UART от ArkMicroChips; статья переписана из заметки 2010 года, которая была каталогом драйверных сайтов.
- Идентификаторы: Vendor ID
0x6547, Product ID0x0232; второй набор0x18EC:0x3118присутствует в таблице драйвера. - Драйвер Linux: модуль
ark3116(CONFIG_USB_SERIAL_ARK3116=m), автор Bart Hartgers, лицензия GPL,intree: Y, зависимостиusbserialиusbcore. - Проверка на живом хосте: Debian 12, ядро 6.1.0-54-amd64; модуль на месте, 53 модуля USB-serial в дереве, ни один не загружен без устройства.
- Порядок диагностики:
lsusb→dmesg→/dev/ttyUSB*→ права группыdialout. - Настройка:
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts, затемpicocom,screenилиminicom; стабильное имя — правилом udev по VID/PID. - Отличия от RS-232: чип работает с уровнями TTL (5 В или 3,3 В в зависимости от платы), двухполярный RS-232 требует преобразователя уровней.
- Риски: несовпадение уровней TTL выводит порт из строя; драйверы с сайтов-агрегаторов для Linux не нужны и опасны для Windows; служба
brlttyможет перехватить устройство. - Ограничения: замер сделан на одном ядре и одном дистрибутиве; варианты ARK3116T и ARK3116S в статье не различаются — это требует проверки по документации производителя.
Промт для агента (установка и настройка)
Готовый промт для AI-агента: скопируйте блок целиком кнопкой и отдайте своему ассистенту. Готового AGENTS.md у темы нет — источник шагов: документация драйвера в дереве ядра Linux (drivers/usb/serial/ark3116.c) и страница uark(4) FreeBSD из раздела «Связанные материалы»; проверки взяты из разделов «Установка» и «Замеры и цифры».
Задача: подключить USB-UART адаптер на ARK3116 к Linux-хосту и настроить порт так, чтобы он работал без root и с постоянным именем.
Материалы:
- код драйвера в upstream: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/serial/ark3116.c
- драйвер FreeBSD: https://man.freebsd.org/cgi/man.cgi?query=uark&sektion=4
- правило: драйвер для Linux из интернета не скачивать, он входит в дистрибутивное ядро
Шаг 1. Опознание устройства:
lsusb | grep -i 6547 # ожидается 6547:0232
lsusb | grep -i 18EC # либо 18EC:3118
Шаг 2. Проверка драйвера:
modinfo ark3116 | head -6 # описание "USB ARK3116 serial/IrDA driver", GPL, intree: Y
grep -i ARK3116 /boot/config-$(uname -r) # ожидается CONFIG_USB_SERIAL_ARK3116=m
Шаг 3. Подключение и проверка привязки:
dmesg | tail -20 # драйвер назвал порт
ls -l /dev/ttyUSB* # появился /dev/ttyUSB0
Шаг 4. Права:
id # есть ли группа dialout
sudo usermod -aG dialout "$USER" # затем новый вход в систему
Шаг 5. Постоянное имя (если адаптеров больше одного):
/etc/udev/rules.d/99-ark3116.rules:
SUBSYSTEM=="tty", ATTRS{idVendor}=="6547", ATTRS{idProduct}=="0232", SYMLINK+="ttyARK0"
sudo udevadm control --reload-rules && sudo udevadm trigger
Шаг 6. Параметры линии и проверка обмена:
stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb -crtscts
picocom -b 115200 /dev/ttyUSB0
timeout 5 cat /dev/ttyUSB0 # после нажатия Enter на устройстве должны прийти байты
Запрещено:
- скачивать и устанавливать "драйвер ARK3116" для Linux: он уже в ядре, файл из поиска проверить нечем;
- подключать адаптер к порту оборудования, не сверив уровни TTL (5 В против 3,3 В) и распиновку;
- считать, что TTL-адаптер совместим с настоящим RS-232 без преобразователя уровней;
- проверять работу на машине с секретами, если есть подозрение на перехват устройства службой brltty;
- оставлять двум одинаковым адаптерам имена по умолчанию, если от них зависит скрипт.
Что считать успехом: lsusb показывает 6547:0232, modinfo находит ark3116, порт открывается без sudo, stty подтверждает скорость и формат линии, после перезагрузки имя порта не изменилось.
1 комментарий