Нет доступа к устройствам ttyUSBx

Ответить
Николай Савельев
Сообщения: 1
Зарегистрирован: 26 авг 2023, 09:21
Operating system: Rosa Linux R12

Нет доступа к устройствам ttyUSBx

Сообщение Николай Савельев » 26 авг 2023, 11:14

Для прошивки МК использую конвертер USB-UART на чипе PL2303. Система без проблем его определяет и создает устройство /dev/ttyUSB0

Код: Выделить всё

[Сб авг 26 10:31:11 2023] usb 3-1: pl2303 converter now attached to ttyUSB0
Однако, доступа к нему нет, даже под рутом permission denied.

Код: Выделить всё

lkcxa@192 ~/PRG/mcu805ide $ stcgal -p /dev/ttyUSB0 -b 9600 -P stc89 test_1.hex
Serial port error: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'
В группу dialout себя добавил:

Код: Выделить всё

lkcxa@192 ~/PRG/mcu805ide $ sudo usermod -a -G dialout lkcxa
[sudo] пароль для lkcxa: 
lkcxa@192 ~/PRG/mcu805ide $ 
Ещё пробовал так. При этом должна отправлятся строка, и это видно лог. анализатором, или на другом компе в UART терминале. Ну тут ничего не происходит.

Код: Выделить всё

lkcxa@192 ~/PRG/mcu805ide $ echo Hello world > /dev/ttyUSB0
bash: /dev/ttyUSB0: Отказано в доступе
lkcxa@192 ~/PRG/mcu805ide $ sudo echo Hello world > /dev/ttyUSB0
bash: /dev/ttyUSB0: Отказано в доступе


Система такая:

Код: Выделить всё

Операционная система: ROSA Fresh Desktop 2021.1
Версия KDE Plasma: 5.27.4
Версия KDE Frameworks: 5.105.0
Версия Qt: 5.15.5
Версия ядра: 5.10.184-generic-1rosa2021.1-x86_64 (64-бита)
Графическая платформа: X11
Процессоры: 4 × AMD A8-5600K APU with Radeon(tm) HD Graphics
Память: 7,0 ГиБ ОЗУ
Графический процессор: AMD ARUBA
Производитель: Gigabyte Technology Co., Ltd.
Материнка GA-F2A85X-UP4

Аватара пользователя
MikiLinux
Сообщения: 102
Зарегистрирован: 11 июн 2023, 21:41
Operating system: Rosa Linux 12.4
Откуда: Vicino Roma
Контактная информация:

Нет доступа к устройствам ttyUSBx

Сообщение MikiLinux » 26 авг 2023, 11:58

Hi,

for PL2303 chip no additional drivers are required(*). For your purpose try this procedure:

https://opensource.com/article/20/5/tio-linux

Tio program isn't in Rosa repository but you can try to request it here: https://forum.rosalinux.ru/viewtopic.ph ... start=1100 :)

(*) driver is in Linux kernel --> https://github.com/torvalds/linux/blob/ ... l/pl2303.c

#############à
ITALIANO
Il chip PL2303 non ncessita di alcun driver aggiuntivo in GNU/Linux(*). Per la tua prova segui questa procedura:

https://opensource.com/article/20/5/tio-linux

Il programma Tio non c'è nel repositorio di Rosa, ma puoi farne una richiesta qui affinché venga inserito nel repositorio: https://forum.rosalinux.ru/viewtopic.ph ... start=1100 :)

(*) Il driver è già nel kernel Linux ---> https://github.com/torvalds/linux/blob/ ... l/pl2303.c
Desktop: Rosa Linux 12.4 KDE/Plasma
PC Lab: Rosa Linux 12.4 XFCE
Portatile: Rosa Linux 12.4 LxQt

https://elettrolinux.com

ovk77
Сообщения: 1
Зарегистрирован: 31 авг 2023, 13:36
Operating system: ROSA Fresh Desktop 12.4 release 2021.1 for x86_64

Нет доступа к устройствам ttyUSBx

Сообщение ovk77 » 31 авг 2023, 13:40

У меня такая штука срабатывала
Sudo chmod 666 /dev/ttyUSB0

Survolog
Сообщения: 367
Зарегистрирован: 30 авг 2016, 22:30
Operating system: ROSA Fresh
Писать в Телеграм или ВК.

Нет доступа к устройствам ttyUSBx

Сообщение Survolog » 06 сен 2023, 23:58

Копипаста из ВК.
ln -s /dev/ttyS0 ~/wineprefix/dosdevices/com1
sudo chmod 666 ~/wineprefix/dosdevices/com1 - на случай, если ПО удаляет (!) симлинк перед попыткой подключения.
Но работает это только при поддержке ком-порта. Не важно, через RS-232 подключение или через USB.
При взаимодействии по USB это НЕ работает.

Я пробовал сделать так, чтобы это работало и с USB, но похоже, на разные устройства требуются разные драйвера.

Аватара пользователя
Raskaton
Сообщения: 37
Зарегистрирован: 05 ноя 2022, 03:45
Operating system: ROSA Fresh Desktop 2021.1

Нет доступа к устройствам ttyUSBx

Сообщение Raskaton » 23 окт 2023, 20:29

Всё не так. Советы вредные из прошлого века.

В современных Linux за права доступа к USB и USB-to-Serial устройствам отвечает systemd,
а именно udev (команда udevadm). Доступ основан на правилах и группах пользователей.

1) Найдём своё устройство. При подключении в USB порт udev автоматически создаёт ссылку на псевдофайл:

Код: Выделить всё

ls -l /dev/serial/by-id/
ls -l /dev/usb/by-id/
узнав правильное имя идём смотреть его права, а точнее группу пользователя:

Код: Выделить всё

ls -l /dev/ttyACM0
ls -l /dev/ttyUSB0
Нумерация даётся по порядку подключения и обработки в udev, т.е. случайно (поэтому нужны udev rules).

Код: Выделить всё

 ~ $ ls -l /dev/serial/by-id/
lrwxrwxrwx 1 root root 13 окт 23 19:45 usb-Klipper_stm32f103xe_50FF74067285495733320867-if00 -> ../../ttyACM0
 ~ $ ls -l /dev/ttyA*
crw-rw---- 1 root dialout 166, 0 окт 23 19:45 /dev/ttyACM0
По мимо основного имени, создаётся ссылка с удобочитаемым именем (задаётся в udev rules), например:

Код: Выделить всё

/dev/stm32 -> /dev/ttyACM0
У меня для одного устройства создаётся сразу несколько ссылок:

Код: Выделить всё

lrwxrwxrwx   1 root     root           7 окт 23 19:45 klipper -> ttyACM0
lrwxrwxrwx   1 root     root           7 окт 23 19:45 klipper0 -> ttyACM0
lrwxrwxrwx   1 root     root          15 окт 23 19:45 klipper2 -> bus/usb/001/004
lrwxrwxrwx   1 root     root           7 окт 23 19:45 stm32 -> ttyACM0
lrwxrwxrwx   1 root     root           7 окт 23 19:45 stm32_0 -> ttyACM0
lrwxrwxrwx   1 root     root          15 окт 23 19:45 stm32_2 -> bus/usb/001/004
это позволяет обратиться к устройству по "постоянному" имени, например:

Код: Выделить всё

myAppConnect -i /dev/klipper
в отличии от вечной беды Windows где нет возможности отличить COM1 от COM2.
Группы может быть два варианта (у ссылок просто root):

Код: Выделить всё

dialout - для USB-to-Serial устройств. Создаёт /dev/ttyACM*
uucp - для USB устройств. Создаёт /dev/ttyUSB*
группы типа tty, serial устаревшие - не используйте их.
Т.е. нужно добавить себя в две стандартные группы (и перезагрузить права). Можно сделать через GUI "Настройки системы",
управление пользователями -> редактировать, вкладка Стандартные Группы. Но перед этим:

2) Блокировка доступа.
Историческая проблема, что невозможно заблокировать одновременный доступ нескольких программ к одному Serial порту, т.е. к /dev/ttyACM0.
Для этого был придуман механизм Lock-файлов на устройства. Идея в том, что программа с привилегиями root может создать файл:

Код: Выделить всё

/var/lock/lockdev/ttyACM0.lock
запрещая тем самым другим программам подключиться к устройству.
Поэтому нам, возможно, потребуется добавить пользователя в третью стандартную группу в зависимости от задач настройки. Либо в своём программном обеспечении всегда указывать код выключения Lock-механизма.
Нужно понимать, что независимо о вхождении в эту группу, для создания lock-файла понадобится root или sudo.
Посмотрите права куда ссылается /var/lock
Если вы запускаете чужую программу, а в коде используется lock-механизм, то без sudo она не запустится. Т.к. перед подключением к Serial порту ей нужно создать файл в lock-директории.
Это по-другому в Windows, поэтому важно понимать эту специфику при кросс-платформенной разработке.
Важно понимать также, что удаление файла блокировки - обязанность программы клиента (как и в win). Если программа зависла или была прибита, то файл может остаться. А тогда вы не сможете подключиться к этому порту никак. Удалите lock-файл руками. Часто именно в нём проблемы с подключением.

3) Как правильно настроить права.
Идеология простая: USB устройства приписываются группам. Пользователи добавленные в группы автоматически получают доступ.
Но правила позволяют добавить не только в стандартные группы (dialout) для всех пользователей, но и исключительно для себя,
или для всех, или только для root.
Чтобы создать правила для устройства создайте файл(под root) в:

Код: Выделить всё

/etc/udev/rules.d/
и перечитайте правила командой:

Код: Выделить всё

udevadm control --reload
Тут много вариантов, можно "загуглить в яндексе". Вот пример моего файла для своего устройства:

Код: Выделить всё

# USB link on with Klipper firmware
#
SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Klipper", \
    GROUP:="dialout", \
    MODE:="0660", \
    SYMLINK+="klipper%n klipper"
Такое правило срабатывает для устройств которые сообщат параметр о себе manufacturer = "Klipper" (см. udevadm info /dev/ttyACM0).
Файл устройства "/dev/ttyACM*" будет добавлен в группу dialout с правом писать для группы.
Т.е. доступ получат все пользователи системы, которые добавлены в эту стандартную группу.
Так же будут созданны две ссылки "/dev/klipper" и "/dev/klipper0". Если устройств несколько, то совпадающая ссылка будет перезаписана последним устройством. А ссылки с %n это порядковый номер, как в ttyACM%n

Вот пример для адаптера ST-Link (на git открытый проект):

Код: Выделить всё

# STM32 nucleo boards, with onboard st/linkv2-1
# ie, STM32F0, STM32F4.
# STM32VL has st/linkv1, which is quite different

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374a", \
    MODE:="0666", \
    SYMLINK+="stlinkv2-1_%n stlink"

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", \
    MODE:="0666", \
    SYMLINK+="stlinkv2-1_%n stlink"

SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3752", \
    MODE:="0666", \
    SYMLINK+="stlinkv2-1_%n stlink"

# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.
Здесь используются широко известные VID/PID из данных USB-устройства. У некоторых UART адаптеров можно перепрошить VID/PID,
чтобы использовать его как часть своего устройства. Позволит не писать драйвер и сделать автоопределение (см. https://playground.arduino.cc/Linux/Udev/).

Итого:
а) добавить пользователя в три группы (+перезагрузить права!)
б) проверяйте подвисшие lock-файлы
в) настройте один раз нормально правило для устройства.
*) определитесь, нужно ли запускать вашу программу с sudo правами, т.е. использует ли она Lock-механизм.

Советы изменить просто права chmod на файл не будут работать, т.к. udev удалит файл устройства при его вынимании из порта. И создаст новый при подключении соответственно. Это всё припарки.

P.S. HID-устройства типа мышь и клавиатура в /dev/input/

Survolog
Сообщения: 367
Зарегистрирован: 30 авг 2016, 22:30
Operating system: ROSA Fresh
Писать в Телеграм или ВК.

Нет доступа к устройствам ttyUSBx

Сообщение Survolog » 01 ноя 2023, 16:05

Ну ОК.
Вот понадобится мне прошить программатором вундерчип программой через wine.
Во времена rosa2016.1 systemd был тоже.
Я бы сделал единожды (если это новый /home)
ln -s /dev/ttyS0 ~/wineprefix/dosdevices/com1
sudo chmod 666 ~/wineprefix/dosdevices/com1
И прошил.

Что набрать в качестве альтернативы этому? Текста много. В выводе команд никаких совсем.
Raskaton писал(а):
23 окт 2023, 20:29
Советы изменить просто права chmod на файл не будут работать, т.к. udev удалит файл устройства при его вынимании из порта. И создаст новый при подключении соответственно. Это всё припарки.
Подчеркну, что симлинк chmod применяется к файлу в префиксе, по сути, в конфиге пользователя. Udev его не удалит.
Raskaton писал(а):
23 окт 2023, 20:29
в) настройте один раз нормально правило для устройства.
Но ведь с правкой системы это придётся делать после каждой переустановки системы, в отличие от пары "вредных строк из прошлого века".

Аватара пользователя
Raskaton
Сообщения: 37
Зарегистрирован: 05 ноя 2022, 03:45
Operating system: ROSA Fresh Desktop 2021.1

Нет доступа к устройствам ttyUSBx

Сообщение Raskaton » 13 ноя 2023, 16:27

Survolog писал(а):
01 ноя 2023, 16:05
Я бы сделал единожды (если это новый /home)
ln -s /dev/ttyS0 ~/wineprefix/dosdevices/com1
sudo chmod 666 ~/wineprefix/dosdevices/com1
И прошил.
Можно использовать любой костыль, на то он и Linux :)
Но, если речь о Wine, то это просто не нужно. Указываем название устройства так же, как в Linux. Т.е. при подключении вместо COM1 прямо вписываем /dev/ttyS0 и всё должно подключиться. Wine внутри себя имена должен преобразовывать. Правда, сейчас попробовал своей программой в Wine8.12 к своему МК подключиться... оно подключилось, но данные не пошли почему-то (Lazarus/SynaSer).
Должно работать без всяких консолей и ln, просто тыкаем мышкой в GUI и добавляем юзера в три группы, и указываем устройство явно при подключении.
Если память не изменяет, то установлено жёсткое соответствие COM1=/dev/ttyS0, COM2=/dev/ttyS1, и т.д. И, даже можно просто по номеру 0,1,2... без COM.
Но это для железных устройств! /dev/ttyS0 получит встроенный в мат.плату COM-порт или подключенный в PCI слот. Воткнутое в USB USB-to-Serial устройство получит /dev/ttyACM0, а у него нет синонима в COM*.
Survolog писал(а):
01 ноя 2023, 16:05
Подчеркну, что симлинк chmod применяется к файлу в префиксе, по сути, в конфиге пользователя. Udev его не удалит.
Проблемы начинаются, когда у вас постоянно подключаемое N-ое количество устройств. Они будут получать разные имена в зависимости от порядка обнаружения. Это когда один железный COM-порт он всегда №0 - COM1 - /dev/ttyS0, а когда USB, то номера по порядку подключения/втыкания.
И в итоге ваша ссылка будет на разные устройства указывать. Даже для железных устройств НЕТ гарантии порядка нумерации. После очередной фазы луны, при перезагрузке, ваш ttyS0 станет ttyS1. И хорошо, если это не ИБП на атомной станции :)
Survolog писал(а):
01 ноя 2023, 16:05
Что набрать в качестве альтернативы этому? Текста много. В выводе команд никаких совсем.
О том и весь текст. Если не "дуть против ветра", можно вообще консоль не открывать. Совсем. Добавь себя в три группы (+удали лок-файл) прямо мышкой из интерфейса, и всё. Навсегда. Без процентов и переплат(с)

Понимание работы механизма спасёт от лютых проблем.
Например, самый распространённый/бюдежтный программатор ST-LINK с открытым драйвером и утилитами: https://github.com/stlink-org/stlink
Как это устроено?
Это USB устройство. Оно не является стандартным USB-to-Serial или USB-HID, поэтому драйвера/модуля для него в системе нет.
После установки rpm, установится драйвер и те самые правила udev.
Таким образом, при втыкании программатора, udev назначит ему драйвер, создаст псевдофайлы (/dev/*) согласно правилам и постоянные ссылки.
И тут начинается магия! Если вы добавили себя в группы, как положено, то у вас доступ автоматически заработает! Просто мышкой тыкнули в rpm, всё установится и утилитами из комплекта будет подключаться.
А потом вы установите второй программатор STLINK, новой версии. И у вас опять всё само заработает. Без консолей. Без гуглюжа.
И ссылка /dev/stlink всегда будет указывать именно на программатор. И даже для всех пользователей, сервисов/демонов.

А потом вы начнёте добавлять свои устройства, отлаживать целый зоопарк, а ссылки будут правильные даже при 10 занятых USB и парочке PCI-плат.

P.S. я прочитал много старых неверных советов, поэтому решил расписать как правильно. В своё время, мне бы месяц жизни пара таких постов сэкономило.

Survolog
Сообщения: 367
Зарегистрирован: 30 авг 2016, 22:30
Operating system: ROSA Fresh
Писать в Телеграм или ВК.

Нет доступа к устройствам ttyUSBx

Сообщение Survolog » 14 ноя 2023, 12:29

Да можно вообще же ничего не делать.
Но у вас оно не сработало, а у меня сработало. :D

Аватара пользователя
Raskaton
Сообщения: 37
Зарегистрирован: 05 ноя 2022, 03:45
Operating system: ROSA Fresh Desktop 2021.1

Нет доступа к устройствам ttyUSBx

Сообщение Raskaton » 25 ноя 2023, 20:11

:) И у меня прекрасно работает. Просто забыл, что постоянную ссылку делал на USB устройство, а мне нужно было Serial - оно вторым определяется.

Подытожу по поводу Wine и Serial-port:
1. В Wine можно/нужно использовать устройства именованные в UNIX-стиле. Прямо пишем /dev/ttyACM0 вместо COM*,
или заданную нами постоянную ссылку /dev/klipper0
из моего примера udev rule выше, ссылки
/dev/klipper - указывает на USB устройство, а
/dev/klipper0 - само Serial устройство, т.е. /dev/ttyACM0
т.е. для подключения по Serial нужно использовать именно то, которое указывает на tty,
а для работы с USB-стеком, которое указывает на bus/usb/*

Код: Выделить всё

~ $ ls -la /dev/klip*
lrwxrwxrwx 1 root root 15 ноя 25 20:42 /dev/klipper -> bus/usb/001/011
lrwxrwxrwx 1 root root  7 ноя 25 20:42 /dev/klipper0 -> ttyACM0
lrwxrwxrwx 1 root root 15 ноя 25 20:42 /dev/klipper2 -> bus/usb/001/011
это вывод для udev правила:

Код: Выделить всё

SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Klipper", \
    GROUP:="dialout", \
    MODE:="0660", \
    SYMLINK+="klipper%n klipper"
2. Ссылки COM порта:
Survolog писал(а):
01 ноя 2023, 16:05
ln -s /dev/ttyS0 ~/wineprefix/dosdevices/com1
sudo chmod 666 ~/wineprefix/dosdevices/com1
создаются АВТОМАТИЧЕСКИ после запуска wine! Проверил wine8.12. В моём случае для /dev/ttyACM0 автоматически создалась ссылка com33
Как я уже попинял, делать это в ручную "совет из прошлого века". Нужно просто заглянуть в папку, если надо.
У меня, например, прошивка умеет выполнять Сброс себя. Тогда требуется переподключиться к порту, а адрес в Linux будет уже другой /dev/ttyACM1 (/dev/klipper1).
Под виндой - адрес будет выдан тот же COM*. Так что иногда без правильной настройки правила с постоянной ссылкой никак.
И для моего примера выше нужно дополнять правило, чтобы получать постоянку и на само Serial устройство.

3. В документации wine, описанного мной нет:
https://wiki.winehq.org/index.php?title ... llel_Ports
но она старше мамонтов и официально в стадии правки.

P.S. а можно ещё из wine запускать linux программу и получить её вывод назад в свою win программу, искать по:
wineconsole start \unix "/opt/myapp -port /dev/ttyACM0"
и смотреть параметры команды start. "--backend=user" больше не нужен, к мамонтам.
пример
wineconsole start \unix /usr/bin/konsole

P.P.S. Для Lazarus/FreePascal библиотека SynaSer работает на win/linux/wine кроссплатформенно.

Ответить

Вернуться в «Обсуждение ROSA Fresh R12 (платформа 2021.1)»