Сборка USB hid под beaglebone

beaglebone

В данной статье будет приведен способ как собрать свою программу управления устройством через USB посредством HID протокола. За основу берется библиотека hidapi, затем приводится способ кросс-компиляции под linux beaglebone и сборка тестовой программы для работы с USB устройством.

Один из самых простых и надежных способов сделать управление по USB в linux - это испольщование бибилиотеки libusb-1.0. Hidapi же является "надстройкой" над libusb, и служит для легкого подключения hid-устройств к программируемому девайсу. Если вы собираете на "чистой" системе hidapi, то придется отдельно собирать libusb и только потом собирать hidapi. В этой статье рассмотрим сборку именно hidapi. Заглянув вперед, скажу, что android ndk отказалась собирать hidapi без вмешательства.

Для начала работы необходимо скачать библиотеку hidapi (http://www.signal11.us/oss/hidapi/) и распакавать в рабочую директорию. Я использовал дистрибутив linux mint для сборки и тестирования. В распакованой папке (у меня это hidapi-0.7.0) следует ознакомиться с инструкциями readme.txt.

Поскольку в beaglebone используется linux, то мы проходим в в папку hidapi-0.7.0/linux и встречаем там очередной файл readme.txt с инструкциями по сборке под линукс. Если котороко, то библиотека предлагает нам два варианта сборки: с использованием hid-libusb.c или hid.c, в первом случае используется библиотека libusb, которую необходимо доустановить в систему, во втором случае использует hidraw, требующая libudev-devel (адаптация этой версии под arm linux вызывает некоторые трудности, да и не нужно наверное, libusb отлично собирается и работает). Сразу замечу, что пробовал собрать под оба варианта, удачно собралась только hid-libusb.c, а hid.c давал ошибки в которых не очень отелось разбираться.

Далее нам предлагают поставить пакет libusb-1.0-0-dev или libudev-devel. Установив пакеты, можно собирать проект в папке linux, выполняем make, собирается проект hidapi-0.7.0/hidtest/, но собирается как раз в нашу папку hidapi-0.7.0/linux. В командной строке можно видеть команды компилятора.

Далее суть сборки под beaglebone заключается в подставлении кросс-компилятора вместо штатного gcc и g++ соответственно. Но есть одна тонкость, если взглянуть во внуь мейкфайла, то там можно увидеть строчки

LIBS      = `pkg-config libusb-1.0 libudev --libs` -lpthread
INCLUDES ?= -I../hidapi `pkg-config libusb-1.0 --cflags`

Эти строчки добавляют пути к библиотекам (includes) и задают ключи сборки библиотек (libs) динамически. Чтобы понять, что же подгружает скрипт в сборку, можно выполнить в консоли   `pkg-config libusb-1.0 libudev --libs` и `pkg-config libusb-1.0 --cflags`.  Далее при сборке софта под биглбон я пути к инклюдам не менял (там только файлы заголовков .h, причем кросс-платформенные), а либы прописывал напрямую без pkg-config, хотя это возможно не самое удачное решение, но все же рабочее.

INCLUDEPATH += /usr/include/libusb-1.0
LIBS    += -lusb-1.0 -ludev -g

hidapi.h добавить в папку с исходниками

gcc -Wall -g -c -I/usr/include/libusb-1.0  hid-libusb.c -o hid-libusb.o

Исправляем мейклфайл включением библиотек напрямую, прописываем кросс-компилятор и собираем программу под биглбон.