avrdude: проблема с изменением разрешений для /dev/ttyACM0

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

Я использовал Arduino IDE на своем ноутбуке с Arch Linux без проблем, но через какое-то время/месяцы я не могу загрузить скетч из-за проблем с правами доступа:

avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied

Я могу получить доступ и записать на устройство с помощью minicom без проблем, так как права доступа корректны:

crw-rw-rw- 1 root uucp

Мой пользователь находится в группе uucp. Но когда я начинаю загружать скетч, согласно dmesg, USB-устройство переподключается, и в этот момент я вижу другие права доступа:

rw------- 1 root root

И через какое-то время (секунды) права доступа возвращаются к исходному состоянию. Вывод dmesg здесь:

[  313.042695] usb 2-1.2: USB disconnect, device number 3
[  313.253085] usb 2-1.2: new full-speed USB device number 4 using ehci-pci
[  313.352387] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device
[  321.234517] usb 2-1.2: USB disconnect, device number 4
[  321.439445] usb 2-1.2: new full-speed USB device number 5 using ehci-pci
[  321.541392] cdc_acm 2-1.2:1.0: ttyACM0: USB ACM device
...

Я пытался решить эту проблему с помощью нескольких пользовательских правил udev, но безуспешно:

SUBSYSTEMS="usb", ATTRS{idVendor}== "2341", GROUP="uucp", MODE="0666"
KERNEL=="ttyACM[0-9]*", SYMLINK+="%k", GROUP="uucp", MODE="0666"

Как заставить устанавливаться группу или режим с момента, когда устройство появляется в системе? Надеюсь, это не просто ошибка в Arduino 1.8.3. Версия ядра 4.11.9-1-ARCH.

ИЗМЕНЕНИЕ #1:

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

Видеозапись здесь

ИЗМЕНЕНИЕ #2:

Через некоторое время я вернулся к этой проблеме и обнаружил, что у меня проблемы только с ttyACM0 (Yun/Micro и др., подключенные с помощью microUSB-кабеля) и ttyUSB0 (Uno, подключенный с USB-B) работает нормально. Но даже это интересная подсказка, я не могу разобраться.

Я отслеживаю права на устройствах tty:

watch -n 0.1 'ls -la /dev/ttyUSB* /dev/ttyACM*'
  • при загрузке на ttyUSB0 меняется только дата/время, и все работает
  • при загрузке на ttyACM0 устройство на мгновение исчезает, затем создается новое с неправильными правами (и root:root), загрузка не удалась, и затем правильные права задаются с помощью udev (с root:uucp) … и затем снова цикл (исчезновение-неправильные-правильные)

Мой пользователь находится в группах lock и uucp, я пытался добавить некоторые правила udev или отключить их, но безуспешно …

Я на 99% уверен, что это что-то происходит до того, как правило udev коснется его.

У меня была такая же проблема, я удалил пакет tlp, и эта проблема исчезла.

.

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

Если вы столкнулись с ошибкой "avrdude: ser_open(): can’t open device "/dev/ttyACM0": Permission denied" при использовании Arduino IDE на Arch Linux, это, скорее всего, связано с проблемами прав доступа в момент переподключения USB-устройства. Ваша ситуация интересна тем, что устройство временно отключается и повторно подключается, меняя права доступа на "rw——- 1 root root", что препятствует вашему пользователю в группе "uucp" доступ к устройству.

Основные аспекты проблемы

  1. Переподключение устройства: Как видно из вывода dmesg, устройство временно отключается и подключается обратно, что меняет права доступа. Это происходит, вероятно, из-за особенности работы Linux с USB-устройствами и, возможно, связано с особенностью драйвера или программы, запускающейся при подключении.

  2. Правила udev: Вы пробовали создать пользовательские правила для udev, но они не срабатывают вовремя, чтобы задать корректные права доступу на этапе подключения.

  3. Сравнение с ttyUSB0: Интересно, что проблема проявляется только для устройств типа ttyACM0, но не ttyUSB0, что может указывать на различия в обработке этих типов устройств в системе.

  4. Роль пакета tlp: Последнее обновление предполагает, что программа tlp может быть связана с управлением энергопотреблением USB-портов, что может приводить к переподключению устройства и, соответственно, к изменению прав. Удаление пакета tlp, как указано, решило проблему у некоторых пользователей.

Решение

Для решения проблемы можете попробовать следующие шаги:

  1. Удаление TLP: Если вы используете пакет tlp для управления энергопотреблением, попробуйте его удалить. Возможно, это решит проблему с непредсказуемым поведением USB-портов.

    sudo pacman -R tlp
  2. Настройка udev: Убедитесь, что правила udev продолжают применяться корректно. Добавьте отладочный вывод, чтобы убедиться, что они работают так, как ожидается:

    Создайте файл /etc/udev/rules.d/99-usb-serial.rules с содержимым:

    SUBSYSTEM=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", GROUP="uucp", MODE="0666"
    ACTION=="add", KERNEL=="ttyACM[0-9]*", RUN+="/bin/sh -c 'chown root:uucp /dev/%k'"
  3. Перезапуск udev и приложения: После изменения правил перезапустите демона udev и попробуйте снова.

    sudo udevadm control --reload-rules
    sudo udevadm trigger
  4. Проверка прав: Используйте watch для проверки прав устройства в течение всего процесса загрузки скетча:

    watch -n 0.1 'ls -la /dev/ttyACM*'
  5. Альтернативные подходы: Если ни один из вышеуказанных методов не работает, рассмотрите использование udev-notify для обработки событий устройства более эффективно.

Рассмотренные выше предложения помогут эффективно диагностировать и устранить проблему с правами доступа к устройству /dev/ttyACM0. Однако также важно постоянно следить за обновлениями ОС и других используемых пакетов, так как обновления могут содержать исправления известных проблем или изменения в обработке USB-устройств.

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

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