ДО курс по робототехнике

5 апреля 2013 г.

Подключаем NXT блок по USB в Linux

(C)
Хотя операционные системы на базе ядра Linux шагнули уже далеко вперед в плане пользовательского удобства и автоматической настройки, что называется, из коробки, но все же некоторые вопросы еще приходится решать по старинке - в ручную изменяя конфигурационные файлы и исследуя журналы работы системы (в обычной речи ITшников - логи).

К сожалению, подключение NXT блока для его программирования, не происходит автоматически в удобном для пользователя виде, за исключением специализированных Linux дистрибутивов таких как nxcEditor LiveCD Но это компенсируется тем, что добиться этого можно с минимальным количеством изменения стандартных настроек системы.

Ниже рассматривается пошаговая инструкция настройки подключения NXT блока через USB.

Итак, первое что нужно сделать после подключения USB кабеля к блоку и компьютеру/ноутбуку, - это убедиться что система увидела блок. Для этого нужно посмотреть в файл /var/log/messages (или запустить команду dmesg) и убедиться, что существуют строчки подобные этим:
от рута:
Jun  9 00:35:00 mybox kernel: [  245.767163] usb 2-2: new full speed USB device number 3 using ohci_hcd
Jun  9 00:35:00 mybox kernel: [  246.216417] usb 2-2: New USB device found, idVendor=0694, idProduct=0002
Jun  9 00:35:00 mybox kernel: [  246.216428] usb 2-2: New USB device strings: Mfr=0, Product=0, SerialNumber=1
Jun  9 00:35:00 mybox kernel: [  246.216436] usb 2-2: SerialNumber: 0016530D7AB9
Здесь следует обратить на такие параметры устройства, как idVendor иidProduct, а также на номер устройства (device number). Именно idVendorравное "0694" и idProduct равное "0002" определяют, что мы имеем дело с NXT блоком.

Но если теперь попытаться от имени текущего пользователя (который, конечно же не суперпользовател - root, иначе это потенциальная дыра в безопасности системы) загрузить программу на блок
nbc -d -S=usb struct.nxc
То программа скомпилируется, но не загрузиться. Хотя если же запускать ровно такую же команду от суперпользователя root, то загрузка произойдет успешно.

Это объясняется тем, что файл, ответственный за доступ к этому устройству доступен на запись только пользователю root.
# ls -l /dev/bus/usb/002/
total 0
crw-rw-r--. 1 root root 189, 128 Jun  8 21:15 001
crw-rw-r--. 1 root root 189, 129 Jun  8 21:15 002
crw-rw-r--. 1 root root 189, 130 Jun  9 00:38 003
Т.е. когда непривилегированный пользователь пытается работать с этим файлом, то ему, естественно, возвращается ошибка доступа к этому файлу.

Для того, чтобы исправить такое поведение, а именно автоматическое создание файла устройства, но только теперь с нужным правами доступа нужно создать специальный конфигурационный файл для подсистемы динамического управления устройствами. Все файлы этой подсистемы, предназначенные для редактирования, лежат в данной директории: 
# ls -l /etc/udev/rules.d/
total 16
-rw-r--r--. 1 root root 134 Jun  8 10:34 60-vboxadd.rules
-rw-r--r--. 1 root root 535 Jun  8 06:23 70-persistent-cd.rules
-rw-r--r--. 1 root root 771 Jun 10  2011 90-alsa-tools-firmware.rules
-rw-r--r--. 1 root root  53 Oct 27  2011 91-drm-modeset.rules
Сюда же нужно положить новый файл для автоматической конфигурации файлов доступа к NXT блоку (изменять содержимое директории сможет толькоroot - суперпользователь).
# cat > /etc/udev/rules.d/80-nxt.rules
SUBSYSTEM=="usb_device", ACTION=="add", SYSFS{idVendor}=="0694", SYSFS{idProduct}=="0002", SYMLINK+="nxt-%k", MODE="0666"
Если после этого в логах появляется такая вот ошибка
Jun  9 00:51:55 fedora-vbox udevd[342]: SYSFS{}= will be removed in a future udev version, please use ATTR{}= to match the event device, or ATTRS{}= to match a parent device, in /etc/udev/rules.d/80-nxt.rules:1
Это значит, что здесь запущена более новая версия подсистемы и по этому нужно использовать немного другой конфигурационный файл. 
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="0694", ATTRS{idProduct}=="0002", SYMLINK+="nxt-%k", MODE="0666"
После этого можно отсоединить USB кабель (или выключить блок)
Jun  9 00:58:05 mybox kernel: [ 1631.153201] usb 2-2: USB disconnect, device number 3
А затем снова подсоединить или включить блок. После, в логах появятся ровно такие же сообщения как и приведенные в самом начале заметки, только номер устройства (device number)будет отличаться.

Теперь, если взглянуть на директорию с файлами доступа к USB устройствам, то видно, что новый созданный файл обладает именно теми свойствами, которые были указаны в конфигурационном файле: 
# ls -l /dev/bus/usb/002/
total 0
crw-rw-r--. 1 root root 189, 128 Jun  8 21:15 001
crw-rw-r--. 1 root root 189, 129 Jun  8 21:15 002
crw-rw-rw- 1 root root 189, 131 Jun  9 01:31 004
К тому же, для более простого доступа к NXT блоку, создалась специальная символьная ссылка.
# ls -l /dev/nxt*
lrwxrwxrwx. 1 root root 15 Jun  9 01:28 /dev/nxt-2-2 -> bus/usb/002/004
Если получившиеся результаты такие же, как это показано выше, то это на означает, что работать с NXT блоком, можно будет любому непривилегированному пользователю. И теперь эта команда и скомпилирует программу, на языке NXC, и загрузит ее на блок.
nbc -d -S=usb struct.nxc

Комментариев нет:

Отправить комментарий