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

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

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

Сразу отметим, что мы попробовали собрать оба варианта; удачно собралась только 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`. При сборке софта под BeagleBone мы не меняли пути к include (там только файлы заголовков .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`

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

Комментарии (6)


  1. EighthMayer
    09.08.2015 14:11

    Где кат?.. Пихать всю статью целиком в ленту — очень и очень плохо.


    1. Garrett
      09.08.2015 15:17
      -1

      Для сообщений такого рода всегда был и будет приват…


    1. grabelu
      09.08.2015 15:42
      +2

      Первая публикация, извиняемся, и исправили.


  1. Vooon
    10.08.2015 08:19

    На мой взгляд лучше использовать rawhid вариант. Меньше наслоений, нужен только libudev.


    1. grabelu
      10.08.2015 10:12

      Ну я так понимаю вопрос скорее холиварный, но тут несколько причин за libusb. 1) мы уже использовали ее ранее, поэтому она в приоритете. 2) где-то в инете видел, что проблема с кросс-клмпилляцией hidraw, да и у самого сходу не получиломь. Кстати под андройд собрался именно либусб, что тоже было важно… И потом, это ж линукс, можно собирать свой лунопарк всеми доступными ноавящимеся способами


      1. Vooon
        10.08.2015 14:10

        Проблем с кросскомпиляцией не видел, собирал под OpenWRT на мипсе.
        Это при том, что библиотеку использовал из Vala.

        Единственная проблема, не смог получить доступ к клавиатуре, но свой hid-device заработал «с пол пинка».


  1. EighthMayer
    09.08.2015 14:11

    Где кат?.. Пихать всю статью целиком в ленту — очень и очень плохо.


    1. Garrett
      09.08.2015 15:17
      -1

      Для сообщений такого рода всегда был и будет приват…


    1. grabelu
      09.08.2015 15:42
      +2

      Первая публикация, извиняемся, и исправили.


  1. Vooon
    10.08.2015 08:19

    На мой взгляд лучше использовать rawhid вариант. Меньше наслоений, нужен только libudev.


    1. grabelu
      10.08.2015 10:12

      Ну я так понимаю вопрос скорее холиварный, но тут несколько причин за libusb. 1) мы уже использовали ее ранее, поэтому она в приоритете. 2) где-то в инете видел, что проблема с кросс-клмпилляцией hidraw, да и у самого сходу не получиломь. Кстати под андройд собрался именно либусб, что тоже было важно… И потом, это ж линукс, можно собирать свой лунопарк всеми доступными ноавящимеся способами


      1. Vooon
        10.08.2015 14:10

        Проблем с кросскомпиляцией не видел, собирал под OpenWRT на мипсе.
        Это при том, что библиотеку использовал из Vala.

        Единственная проблема, не смог получить доступ к клавиатуре, но свой hid-device заработал «с пол пинка».