LibUSB
Напишем простейшее приложение на стороне хоста, работающее с USB устройством. В качестве устройства, будем использовать мышь USB, хотя устройство может быть любым. Примеры программ для Windows и Linux. Для Windows программа создана в среде Microsoft Visual C++ 6.0 , а для Linux на С для GCС.
Проблема написания приложения для устройства USB, состоит в необходимости создания драйвера. Создание драйвера – задача не рядовая. Получается, что для изучения USB, требуется предварительно научиться писать драйвера для ОС.
Другой подход – это использовать существующие драйвера ОС. Уже говорилось о USB устройствах, имеющих архитектуру, относящуюся к определенным стандартизованным классам. Для большинства таких типов устройств уже имеются драйвера в составе установленной ОС. Например, мышь относится к классу HID , для нее имеются стандартные драйвера в ОС. Такой подход имеет право на жизнь. Через API, из своей программы обращаетесь к ОС, а она через драйвер к USB устройству. Но тогда создаваемое USB устройство должна поддерживать протокол HID. Это достаточно сложная надстройка над базовой функциональностью USB.
Оба этих метода не подходят для начинающих изучать USB. Так как быть? К счастью для новичков, имеется библиотека libusb. Первоначально она создавалась для Linux, теперь имеются порты и для Windows. Уже известная утилита lsusb использует библиотеку libusb. Эта библиотека позволяет писать прикладные программы, напрямую обращающиеся к USB устройству, устраняя необходимость использования специальных драйверов ОС.
Для работы нужно установить libusb-win32 для Windows. Эта библиотека в Windows может применяться в двух разных режимах, как обыкновенный драйвер устройства и как фильтрующий драйвер для уже установленных устройств.
В первом случае, необходимо удалить USB устройство, все его драйвера и скрытые записи об установке как описывалось ранее, если они конечно имелись. При подключении USB устройства Windows попросит драйвер, выдать ей файл INF , который заранее заготовили для этого устройства. В составе пакета поставляется нехитрый мастер, с помощью которого, легко создать требуемый INF файл. Теперь при всяком подключении разработанного устройства, она будет использовать libusb-win32 как полноценный драйвер. Из своей прикладной программы, обращаясь к libusb-win32, будете работать с разработанным USB устройством.
Второй вариант, как фильтрующий драйвер. В этом случае никаких файлов INF не нужно, в этом режиме можно работать с любым USB устройством, подключенным к хосту, выбирая их по кодам производителя. Эти устройства могут быть сконфигурированы, и иметь подключенные драйвера. Есть некоторые ограничения, нельзя менять конфигурацию этих USB устройств, но в этом необходимость возникает редко. Такой режим больше рекомендуется для экспериментов при разработке. Не исключена возможность нарушения работы системы.
С сайта sourceforge.net скачайте бинарный архив, в мо.м случае, это libusb-win32-bin-1.2.6.0.zip . Архив содержит все необходимое для установки библиотеки и для разработки, в том числе утилиты для тестирования и конфигурирования.
В подкаталоге bin архива, содержатся подкаталоги для всех основных архитектур Windows. У меня Windows XP SP3 , поэтому используем каталог x86. Файл libusb0_x86.dll переименовываем в libusb0.dll и копируем в %SystemRoot%\system32. Файл libusb0.sys копируем в %SystemRoot%\system32\drivers. Подключаем мышь USB, с которой будем экспериментировать, затем запускаем установщик фильтра install-filter-win.exe и выбираем нашу мышь из списка. Далее запускаем тестовую программу testlibusb-win.exe , если все правильно работает, должны увидеть в окне дескрипторы мыши. Устанавливать фильтр нужно единожды, сведения о USB устройствах, с которыми предполагается работать, запоминаются.
Рисунок 4 |
Создайте шаблонный, консольный проект «Hello, world!» в MSVC. Затем нужно настроить этот проект, подключить заголовочный файл и статическую библиотеку среды libusb-win32. В мо.м случае, архив распакован в C:\libusb-win32 , в подкаталоге include находится заголовочный файл lusb0_usb.h , а в подкаталоге C:\libusb-win32\lib\msvc находится файл библиотеки libusb.lib. Там же можно обнаружить каталоги с библиотеками для 64-разрядных платформ.
В главном меню выбирается, «Project -> Settings…» , вкладка C/C++ , в поле ввода «Additional include directories» , ввести путь к каталогу, где лежит заголовочный файл lusb0_usb.h .
На вкладке «Link» , в поле «Object/library modules» , через пробел добавить библиотеку libusb.lib , а в поле ввода «Additional library path», добавить путь к этой библиотеке.
Посмотрите коды производителя мыши USB и подставьте в текст программы, затем откомпилируйте. Программа открывает USB устройство по кодам производителя и продукта, считывает некоторые строковые дескрипторы и выводит на экран. Запускать из командной строки. Имея работающий шаблон легко создать программу с графическим интерфейсом.
Функции usb_find_busses и usb_find_devices находят все шины хоста и все устройства на шинах и сохраняют эти сведения во внутренних структурах данных. Функция usb_get_busses возвращает ссылку на глобальную структуру, где хранятся сведения о шинах, устройствах на шинах и дескрипторах этих устройств. Описание функций библиотеки libusb дано в приложении. На момент написания материала, существовали 2 версии библиотеки, версия 0.1 и версия 1.0 . Они достаточно сильно различаются, libusb-win32 перенесена из версии 0.1 для Linux.
На рисунке 4 приведены формы проекта MSVC, для настройки среды разработки с библиотекой libusb. С сайта vk.com/protocols можно скачать готовый проект для Visual C 6.0. для Windows.
В Ubuntu для программирования требуется установить пакет libusb-dev, или установить библиотеку из исходных кодов. Для понимания работы с библиотекой необходимо знание работы со структурами и со списками структур на языке C. Для компилирования необходимо иметь на машине компилятор GCC. На мо.м компьютере была установлена версия библиотеки libusb — 0.1.12. Утилитой lsusb, посмотрите коды производителя и продукта своей мыши или иного устройства, к которому нужно подключиться. Распакуйте архив с программой для Linux в любой доступный каталог. Откройте файл c.c любым редактором, измените эти коды на коды своего USB устройства в тексте программы. Из командной строки зайдите в каталог с makefile и выполните команду make all. Запуск компилированной программы осуществлять с правами суперпользователя.
Библиотека usb для windows
Здесь рассмотрено ПО хоста для взаимодействия с устройствами USB HID через одну из программных библиотек. Протокол USB очень сложен, и поэтому обычной практикой работы с ним является использование готовых библиотек подпрограмм (в виде DLL или исходного кода).
Один из вариантов использования интерфейса USB — применение стандартного класса устройств USB HID. Как известно, устройства USB HID очень удобны для подключения пользовательских устройств к компьютеру, так как не требуют написания драйвера, и максимальная скорость обмена с USB HID (64 килобайта/сек) в большинстве случаев оказывается достаточной.
[Краткий обзор библиотек]
Для наглядности библиотеки сведены в таблицу, далее более подробно рассмотрена каждая из библиотек.
Библиотека | Поддерживаемые OS | Автор | Доступность исходного кода | Предпочтительный язык программирования для использования в ПО хоста | Удобство использования по 5-бальной шкале | Ссылка на источник информации |
HID.dll | Windows | Microsoft | нет | C++ | 2 | MSDN |
AtUsbHid.dll | Windows 32-bit | Atmel | нет | C++, Java | 5 | doc7645.pdf |
HID API | Windows, Linux, Mac OS X | signaleleven, Alan Ott | да | GCC, C++ | 4 | hidapi |
LibUSB | Windows, Linux, FreeBSD, NetBSD, OpenBSD, Darwin, MacOS X | libusb.org | да | GCC, C++ | 4 | libusb |
USB HID Component for Windows C# | Windows | ?? | да | C# | 4 | USB HID C# |
JEDI Visual Component Library (JVCL) | Windows | jvcl.delphi-jedi.org | да | Delphi7 (Object Pascal) | 5 | JEDI Visual Component Library |
Processing HIDSerialMonitor example | Windows, Linux, MacOS X | rayshobby.net | Да | Processing | 4 | HID-class USB Serial Communication for AVRs using V-USB |
Все примеры программ, перечисленные в таблице, Вы можете скачать по ссылке [1].
[HID.dll]
Пример ПО хоста (см. скриншот), которое общается с USB HID через библиотеку HID.dll, имеется в Windows DDK (см., например c:\WINDDK2003\3790.1830\src\wdm\hid\hclient\ для Windows DDK 2003). Сама HID.dll находится в папке %windir%\system32\, и всегда доступна для доступа использующих её программ.
Статью, описывающую пример, см. в [2]. Для того, чтобы скомпилировать пример, Вам нужен Windows DDK любой версии. Писать программу с использованием примера удобнее всего в Visual Studio C++, однако если Вы умеете загружать в память библиотеки DLL и вызывать её функции, то язык и система программирования никакого значения не имеют. Пример ПО хоста не привязан к конкретному USB HID устройству, просто предоставляет интерфейс для получения информации по подключенным устройствам USB HID. Достоинство использования HID.dll в том, что на платформе Windows это наиболее «прямой» метод получения доступа к устройствам USB HID, тогда как остальные библиотеки просто являются обертками над вызовами HID.dll. Недостаток библиотеки — неудобный интерфейс API, отсутствие исходного кода, ограниченное использование — только на операционных системах Windows. Исходный код примера можно взять в Windows DDK или скачать по ссылке [1], см. папку HID.dll\hclient\.
[HID.dll / hidlibrary.h]
Заголовочный файл, написанный неким XANDER, предоставляющий упрощенный доступ к функциям HID.dll. Цитата из комментария к файлу: «Библиотека для работы с Hid. Написана с применением шаблонов. Она с помощью WINAPI функции LoadLibrary подгружает hid.dll, затем GetProcAddress — вычисляет адреса функций внутри hid.dll. Предоставляет удобный и простой интерфейс для работы с HID. Нашел на http://speleoastronomy.org/elektro/atmega/usingusb.html, дописал функцию IsConnectedDevice().«. Заголовочный файл может использоваться совместно Borland CBuilder, Embarcadero RAD studio XE C++ Builder и другими IDE, поддерживающими шаблоны на языке C++. Пример ПО хоста (автор Обрубов Виталий, [obruboff.ru]), работающий с поворотным энкодером, можно скачать по ссылке [1], см. папку HID.dll\usb-volume-control-USB-HID.
[AtUsbHid.dll]
Библиотека достаточно хорошо документирована, имеет простой интерфейс API для использования. Есть примеры GUI-программ, написанных на C++ и Java, а также пример консольной программы.
У этой библиотеки, к сожалению, есть очень большой недостаток — разработчик (компания Atmel) её давно забросил где-то с 2008 года, и исходного кода не предоставил. Есть поддержка только 32-bit версий Windows, 64-bit версии не поддерживаются.
Удобнее всего программировать в среде Visual Studio, однако если Вы умеете загружать в память библиотеки DLL и вызывать её функции, то язык и система программирования никакого значения не имеют. Демонстрационная программа ПО хоста рассчитана на подключение к USB HID, собранному на основе чипа AVR с аппаратным USB и прошитым соответствующим firmware (например, чип AT90USB162, который установлен на макетной плате AVR-USB162 или AVR-USB162MU). Обзор работы с примером можно найти в [3]. Firmware управляет светодиодами и читает состояние кнопок (светодиоды и кнопки подключены к ножкам чипа AT90USB162). С библиотекой AtUsbHid.dll необязательно использовать именно микроконтроллеры Atmel, можно управлять любыми устройствами USB HID. Достоинство AtUsbHid.dll — простота применения. Недостаток — вместе с программой нужно предоставлять библиотеку AtUsbHid.dll, а также ограниченное использование — только на операционных системах Windows. Исходный код примера ПО хоста (и скомпилированные рабочие бинарники) можно найти на сайте Atmel или скачать по ссылке [1], см. папку AtUsbHid.dll\. Код firmware USB HID (исходники и прошивки) можно найти в папке AtUsbHid.dll\firmware\AVR-USB162 и в папке AtUsbHid.dll\firmware\userial (firmware для макетных плат AVR-USB162 и userial соответственно) архива по ссылке [1]. Для указаний по компиляции и использования примеров firmware читайте соответствующие файлы readme.txt в папках AVR-USB162 и userial. Также см. на сайте Atmel апноут AVR328: USB Generic HID Implementation on megaAVR devices, и статью [14].
[HID API]
Кроссплатформенная библиотека с открытым исходным кодом, хорошо документированная. Самый лучший пример использования (ПО хоста и firmware USB HID для микроконтроллера AT90USB162), который мне удалось найти, это проект lightpack см. [5].
Исходный код примера ПО хоста (и скомпилированные рабочие бинарники) можно скачать по ссылке [1], см. папку hidapi-0.5.2 и папку lightpack. Чтобы скомпилировать ПО хоста lightpack, Вам понадобится среда программирования QT, а чтобы скомпилировать firmware USB HID (для чипа AT90USB162, макетная плата AVR-USB162), понадобится пакет WinAVR. Для указаний по компиляции и использования примеров firmware читайте соответствующие файлы readme.txt.
[LibUSB]
Широко известная кроссплатформенная библиотека, используется во многих коммерческих продуктах. Хорошо документирована, исходный код открыт, примеры кода ПО хоста на ней найти довольно легко. На мой взгляд, самые лучшие примеры есть в составе библиотеки V-USB (см. [6]), причем примеры ПО хоста libusb сопряжены с firmware устройства USB HID (на библиотеке V-USB). Т. е. у Вас есть готовые примеры ПО хоста и готовые примеры устройств USB HID, которые обмениваются с этим ПО хоста данными. Устройства USB HID в библиотеке V-USB рассчитаны на обычные чипы AVR, которые не имеют на борту аппаратного контроллера USB (т. е. протокол USB обрабатывается внутри AVR чипа программно), однако можно написать программу, которая будет работать с любым устройством USB. Примеры ПО хоста рассчитаны на GCC (язык C) или Visual Studio (язык C++), однако если Вы знаете, как загружать в память DLL и вызывать её функции, то нет проблем портировать примеры на любую другую среду программирования (см. [7]). Недостаток библиотеки libusb в том, что для ПО хоста, написанной на ней, под Windows нужна установка самой библиотеки, а также нужна привязка к устройству USB HID специального драйвера фильтра (filter driver). Этот драйвер фильтра устанавливается с помощью специальной утилиты, входящей в состав пакета библиотеки libusb.
Исходный код примеров ПО хоста (и скомпилированные рабочие бинарники) можно скачать по ссылке [1], см. папки libusb\examples\hid-custom-rq\commandline, hid-custom-rq\set-led-gui, hid-data\commandline. Имеется также удобная тест-программа (папка examples\usbtool), показывающая параметры всех подключенных к компьютеру устройств USB (для которых также установлен драйвер фильтра). Код firmware USB HID (исходники и прошивки) можно найти в папках hid-custom-rq\firmware-mega, hid-custom-rq\firmware-tiny, hid-data\firmware, hid-mouse\firmware. Примеры firmware удобно запускать на макетных платах AVR-USB-MEGA16 (микроконтроллер ATmega32). Чтобы скомпилировать ПО хоста, Вам необходим компилятор GCC и набор утилит MinGW (см. [8]), или (для примера hid-custom-rq\set-led-gui) Visual Studio C++. Для указаний по компиляции и использования примеров firmware и ПО хоста читайте соответствующие файлы readme.txt, или см. информацию вики LibUSB [9]. Бинарники LibUSB, достаточные для запуска приложений Windows (в том числе и драйвер фильтра filter driver и мастер по его установке) можно скачать по ссылке [11], см файл с названием наподобие libusb-win32-devel-filter-1.2.5.0.exe (цифры версии могут отличаться).
[USB HID Component for Windows C#]
Библиотека с открытым исходным кодом, хорошо документированная (имеется специальный файл подсказки *.CHM), можно использовать только в среде Windows, и удобна только для программ, написанных на C#. Библиотека хороша тем, что к извлечению устройства USB и к моментам передачи данных можно привязать события программы. Библиотеку можно скачать по ссылке [1], см. папку UsbLibraryC#. Для компиляции нужен Visual Studio (хорошо подходит Visual Studio C# 2010 Express, который можно скачать и бесплатно использовать в некоммерческих целях).
См. также описание HID USB Driver / Library for .Net / C# (DLL) [12] для использования в проектах Visual Studio. DLL написана на C#, легко интегрируется в проекты Visual Studio, и имеет простой и понятный программный интерфейс.
[JEDI Visual Component Library (JVCL)]
Библиотека визуальных и невизуальных компонентов для популярной среды разработки Delphi. Пользоваться библиотекой довольно просто, хороший пример использования — конфигуратор устройства USB HID для управления частотой вращения вентиляторов системного блока в зависимости от температуры [15].
Здесь приведен только краткий обзор классов и компонентов JVCL, относящийся к управлению устройствами USB HID.
TJvHidDeviceController предоставляет доступ списку USB контроллеров, отслеживает изменение состояния контроллеров, подключение/отключение устройств.
TJvHidDeviceController:OnDeviceChange — обработчик подключения/отключения устройств.
TJvHidDeviceController:OnEnumerate — получение списка устройств.
TJvHidDevice — предоставляет доступ к конечному USB устройству. В конфигураторе используются только два метода для получения и отправки пакета данных.
TJvHidDevice:GetFeature — получение пакета данных (прием данных от устройства).
TJvHidDevice:SetFeature — отправка пакета данных (передача данных в устройство).
[Processing]
Пример работы с устройством HID (HIDSerialMonitor) предназначен для плат Arduino и USnooBie. В репозитории на GitHub [16] можно найти как готовые скомпилированные бинарники для Linux (32-бит, 64-бит) и для Windows, так и исходный код на языке Processing. Код использует вызовы библиотеки hidapi. Скомпилированные программы и отдельные приложения не требуют никакого дополнительного программного обеспечения.
Программа HIDSerialMonitor нужна как альтернатива Serial Monitor в среде разработки Arduino, это позволяет освободить порт UART микроконтроллера.
Чтобы скомпилировать код самостоятельно, Вам нужно установить Processing (см. сайт processing.org), и скопировать библиотеки (G4P и hiddapi) в папку библиотек Processing. Затем загрузите HIDSerialMonitor.pde в среде разработки Processing и кликните «Run».
[Что нужно, чтобы попробовать]
При таком разнообразии вариантов реализации обмена с устройством USB HID сначала надо определиться с платформой разработки. Например, если Вы пишете на Java, то лучше всего подойдет библиотека Atmel. Если Вы программируете на C#, то лучше выбрать компонент USB HID C#. Больше всего вариантов для выбора у разработчиков, которые программируют на Visual C++.
Затем нужно определиться с выбором устройства USB HID (если еще его у Вас нет). Дешевый и удобный вариант, для которых есть готовые примеры firmware USB HID — это макетные платы AVR-USB162, AVR-USB162MU, AVR-USB-MEGA16 (см. [4]). Для заливки прошивки firmware в эти платы не нужен программатор, firmware заливается в память чипа через USB бутлоадер. Для макетных плат AVR-USB162 и AVR-USB162MU можно взять готовые примеры кода USB HID от Atmel и из библиотеки LUFA (см. [10]), а для макетной платы AVR-USB-MEGA16 — из библиотеки V-USB (см. [6]).
[Ссылки]
1. 130330USBHID.zip — примеры исходного кода, бинарники (.exe) и прошивки firmware, связанные с использованием описанных в статье библиотек.
2. Пример работы с USB HID из Windows DDK.
3. AVR-USB162: где найти рабочие примеры кода firmware и ПО хоста.
4. Макетные платы с интерфейсом USB.
5. Lightpack: система AMBILIGHT на мониторе домашнего компьютера.
6. V-USB, википедия site:ru.wikipedia.org .
7. AVR-USB-MEGA16: управление устройством USB из GCC, Visual Studio CPP, VB6, Python, Delphi.
8. Разработка устройства USB — как начать работу с библиотеками AVR USB (V-USB) и libusb.
9. LibUSB wiki site:libusb.org .
10. LUFA — бесплатная библиотека USB для микроконтроллеров Atmel AVR.
11. libusb-win32 site:sourceforge.net — ссылки на закачку релизов библиотеки libusb.
12. Библиотека HID USB Library для Visual Studio .Net (C#, Visual Basic).
13. LibUsbDotNet site:libusbdotnet.sourceforge.net — порт библиотеки libusb, оформленный в виде классов C# (специально для использования совместно с Microsoft .NET).
14. Работа с Generic HID Class на платформе Windows PC.
15. USB HID регулятор вращения для компьютерных вентиляторов.
16. Rayshobby HIDSerialMonitor Processing host software site:github.com .
Комментарии
Не получается скомпилировать lightpack, установил qt sdk и qt creator. Если сможете опишите процесс компиляции подробнее.
microsin: давно дело было, поэтому попробовать и описать подробно не выйдет. Но поверьте, там описывать нечего — тупо открыл готовый проект и тупо нажал на кнопку компиляции. Даже настройки никакие не менял и не смотрел. Почитайте доку к лайтпаку, там должен быть расписан процесс получения бинарников, и его подводные камни. По крайней мере во всех уважающих себя Open Source проектах так обычно делают.