14 июля 2012 г.

Решаем проблему с правами для USBasp в Ubuntu

Все люди, работающие со связкой Eclipse + AVR-plugin + USBasp или avrdude + USBasp для программирования AVR-контроллеров из-под Linux сталкиваются с вот такой проблемой:
avrdude: usb_open(): cannot read serial number "error sending control message: Operation not permitted"
Некоторые товарищи советуют решать ее запуском Eclipse или, соответственно, avrdude от рута, что лично у меня вызывает жуткие батхёрты. Есть куда более элегантное решение.


Суть этой ошибки в том, что udev, линуксовый менеджер устройств, не дает кому попало писать на какое попало устройство. Нам нужно подружить USBasp с udevом, рассказав udevу, какой USBasp хороший программатор, и что обязательно нужно разрешить с ним играть.
Найдем USBasp в списке подключенных устройств командой lsusb. (свой список я намеренно сократил):
~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 003: ID 046d:c52f Logitech, Inc. Wireless Mouse M305
Bus 003 Device 025: ID 16c0:05dc VOTI shared ID for use with libusb
Последняя строка - наша цель. 16с0 - это код производителя, а 05dc - это код устройства. Запомним эти данные для дальнейшего использования.  Создадим файл с правилом для udev:
sudo gedit /etc/udev/rules.d/10-usbasp.rules
И запишем в него такую строку:
SUBSYSTEM=="usb", SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", GROUP="users", MODE="0666"
Она означает, что мы дали пользователям, входящим в группу users, права доступа 666 (запись и чтение) к устройству 16c0:05dc. Чтобы проверить, входите ли вы сами в группу users, воспользуйтесь командой groups, которая выводит список всех групп, в которых вы состоите. Если в users вас нет, сделайте так:
useradd -G users your_name
Впрочем, вместо users в правиле вы можете прописать любую другую группу, в которой вы уже состоите, например adm, или специально создать новую. 
Собственно, все. Отсоедините USBasp от порта, выйдите из учетки, потом зайдите и подсоедините снова. Все должно работать.