Пакет драйверов windows libusb win32 что это

Обновлено: 04.07.2024

Напишем простейшее приложение на стороне хоста, работающее с 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 устройств, но в этом необходимость возникает редко. Такой режим больше рекомендуется для экспериментов при разработке. Не исключена возможность нарушения работы системы.

В подкаталоге 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 устройствах, с которыми предполагается работать, запоминаются.


Создайте шаблонный, консольный проект «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.

В Ubuntu для программирования требуется установить пакет libusb-dev, или установить библиотеку из исходных кодов. Для понимания работы с библиотекой необходимо знание работы со структурами и со списками структур на языке C. Для компилирования необходимо иметь на машине компилятор GCC. На мо.м компьютере была установлена версия библиотеки libusb - 0.1.12. Утилитой lsusb, посмотрите коды производителя и продукта своей мыши или иного устройства, к которому нужно подключиться. Распакуйте архив с программой для Linux в любой доступный каталог. Откройте файл c.c любым редактором, измените эти коды на коды своего USB устройства в тексте программы. Из командной строки зайдите в каталог с makefile и выполните команду make all. Запуск компилированной программы осуществлять с правами суперпользователя.

Программирование Arduino, оживление микроэвм Электроника МК-90, аппаратный хакинг.

19.11.2009

LibUSB

Библиотека libusb и ее аналог libusb-win32 обычно используются совместно с устройствами, основанными на V-USB. Конечно, жесткой зависимости тут нет - одно может существовать без другого и наоборот. Однако, если Вы не хотите ставить DDK под Windows и изучать азы написания драйверов USB, лучше все-таки воспользоваться этой библиотекой: сэкономите кучу времени. Кроме того, логику работы со стороны PC-хоста вы можете писать и отлаживать как обычное приложение, не ломая голову над тем, как распечатать из ядра отладочную информацию.
Для установки фильтра надо запустить libusb-win32-filter-bin-x.x.x.x.exe . Инсталляция выглядит довольно стрёмно: либа добавляется в цепочку обработчиков USB, и на некоторое время все USB-устройства в системе отваливаются. Именно поэтому никогда не пытайтесь установить фильтр с файловой системы, расположенной на USB-устройстве. В Vista надо перед установкой открыть свойства и указать режим совместимости с Windows XP. Перезагрузка не требуется.
Когда аппаратное устройство отлажено, более разумным выглядит инсталляция в виде драйвера. Для установки потребуются привилегии администратора, но зато и никакого подвисания в процессе инсталляции не будет. Драйвер оседает в системе в виде inf-фала, особой процедуры удаления не предусмотрено.
Кстати, так будет нагляднее при просмотре диспетчера устройств: можно прописать соответствующие текстовые строки. В противоположность этому, при подключении нескольких устройств на V-USB в режиме фильтра, они будут выглядеть одинаково. Чтобы отличить их одно от другого, придется хитрить ;)
Собственно, про все это я уже вскользь упоминал, и теперь хотел бы остановиться на втором методе более подробно.
Итак, качайте и распаковывайте файл libusb-win32-device-bin-x.x.x.x.tar.gz . В каталоге bin есть inf-wizard.exe , он поможет нам создать персональный inf-файл для нашего устройства (получается, что libusb0.sys/dll едины для всех, а вот inf-файлов может быть сколь угодно много). Чтобы не вводить руками VID, PID и имя устройства, перед запуском мастера подключите его к USB:



При использовании кода V-USB на условиях бесплатной лицензии, VID и PID одинаковы у всех разработчиков, зато Description должен быть уникальный. За деньги, естественно, вам выделят персональные VID/PID, не вопрос ;)
  • *.inf - файл описания установки драйвера
  • *.cat и *_x64.cat - здесь должны быть цифровые подписи драйверов, но для этого надо быть сертифицированным Micro$oft-ом. А без этого придется увидеть предупреждение о том, что Windows "с камнем на сердце так и быть, заинсталлирует какой-то непонятный драйвер без подписи".
Надо добавить в этот же каталог файлы libusb0.dll , libusb0.sys , libusb0_x64.dll и libusb0_x64.sys . После этого на него можно ссылаться в ответ на вопрос мастера установки драйверов, где же стоит пошукать драйвер "для неизвестного устройтва" или даже провести установку заранее - на *.inf по правой кнопке вызвать контекстное меню и выбрать "Установить".
Если надо позаботиться о пользователе, который программы запускает исключительно через ярлыки, а слово "распаковать" приводит его в суеверный ужас ;) можно сделать и полноценный инсталлятор. Рекомендую пользоваться надежной и при этом абсолютно бесплатной программой Inno Setup . Авторы libusb позаботились о таком развитии сюжета и положили в архив файл examples\install_driver_template.iss - это кусочек скрипта инсталляции файлов драйвера на языке Inno Setup. Предположим, выделенный каталог называется drivers , а inf-файл - MyCoolDevice.inf :
Добавив эти строки в соответствующие секции любого готового скрипта Inno Setup, мы обеспечиваем установку драйверов в систему.

В linux все выглядит схожим образом, но немного проще. Проверьте в вашем менеджере пакетов, установлен ли libusb, например для Debian/Ubuntu/etc:

dpkg -l | grep libusb

Если нет, можно поставить:

sudo apt-get libusb-0.1-4

Для разработки программ потребуется установить девелоперский пакет libusb-dev:

После этого можно компилять, указывая необходимость линковки с libusb:

gcc -lusb myproject.c


Для разработчиков пакетов надо позаботиться о зависимости, например в файл debian/control добавить правило Depends:

Библиотека LibUSB [1] очень важна для использования со многими бесплатными программами. Например, для программ, которые переводят iPhone в режим восстановления (recovery mode), или выводят его из режима восстановления одним кликом (см. программы Recboot и EasyiRecovery). Многие примеры программ (ПО хоста USB), которые работают с самодельными устройствами USB (изготовленными на микроконтроллерах Atmel AVR на основе библиотек V-USB или LUFA), также написаны с использованием LibUSB. Можно еще привести пример популярной системы отладки OpenOCD для микроконтроллеров ARM, она также требует использования библиотеки LibUSB вместе с многими JTAG-адаптерами.

Установка LibUSB на 32-разрядных системах Windows проста, но многие пользователи 64-битных версий Windows сталкиваются с проблемами при установке LibUSB. В этой статье будет рассмотрена установка LibUSB на 64-битных редакциях Windows 7 и Windows Vista (перевод статьи [2]). Принципиальных отличий в установке LibUSB под операционной системой Windows 8 нет.

[Установка драйвера фильтра LibUSB на 64-битных Windows 7 и Windows Vista по шагам]

Установка библиотеки LibUSB для получения доступа для программ ПО хоста (программ, которые написаны в расчете на использование LibUSB) к устройствам USB на Windows обычно заключается в установке так называемого драйвера фильтра. Драйвер фильтра можно установить с помощью удобного GUI-инсталлятора (так называемого Мастера Установки Фильтра, Filter Wizard), и это самый лучший способ установки. Он просто пытается подключить драйвер фильтра к обнаруженному в системе устройству USB, которое выберет пользователь. Однако для установки драйвера класса все еще нужно использовать утилиту командной строки install-filter.exe (но это не рекомендуется делать).

Важно: перед началом установки войдите в систему под пользователем, у кого есть права администратора.

1. Скачайте дистрибутив библиотеки LibUSB, см. [1]. Пожалуйста, при загрузке выбирайте самый последний релиз дистрибутива библиотеки. Версии до 0.1.12.2 имели серьезные ошибки в реализации драйверов фильтра при работе под Windows Vista, Windows 7, и некоторыми инсталляциями Windows XP, так что используйте последние версии (1.1.14.0 и более новые). Для 64-битных Windows Vista/7/2008/2008R2 версия должна быть 1.2.0.0 или более свежая.

Загруженный файл будет называться наподобие libusb-win32-devel-filter-x.x.x.x.zip или libusb-win32-bin-x.x.x.x.zip. Не обращайте внимания, что в имени архива присутствует win32, в нем есть средства для установки драйвера и на 64-битной системе. Распакуйте его в любое место на диске (например, во временную папку C:\TEMP).

2. Подключите устройство USB, для которого Вы собираетесь установить драйвер фильтра, к компьютеру. Операционная система Windows должна его обнаружить. Чтобы убедиться в этом, откройте Диспетчер Устройств. Если устройство обнаружено, но для него система не смогла найти драйвер, то см. другой раздел "Использование INFWizard - генерация драйвера для неизвестного устройства USB".

Закройте все программы, которые могли бы использовать Ваше устройство USB.

3. Если у Вас процессор AMD, то запустите bin\amd64\install-filter-win.exe, если Intel, то запустите bin\ia64\install-filter-win.exe (для 32-разрядной системы запустите bin\x86\install-filter-win.exe). Тип процессора можно узнать через Свойства системы (Панель управления -> Система).

Windows-System-Properties

Появится стартовое окно мастера установки фильтра:

libusb-Filter-Wizard-dialog01

Удостоверьтесь, что выбран вариант для установки драйвера фильтра (Install a device filter), и нажмите Next.

4. Появится список устройств, которые система Windows распознала, и для которых установлены уже драйвера, но к которым пока не привязан драйвер фильтра библиотеки LibUSB:

libusb-Filter-Wizard-dialog02

libusb-Filter-Wizard-dialog03

Нажмите OK, и закройте программу Filter Wizard. Установка драйвера фильтра успешно завершена.

[Использование INFWizard - генерация драйвера для неизвестного устройства USB]

Утилита для генерации драйвера INFWizard может понадобиться для того случая, когда операционная система не может сама подобрать драйвер для устройства. В Диспетчере Устройств такое устройство USB отображается как проблемное, для которого не установлен драйвер.

В этом случае можно сгенерировать новый драйвер с помощью утилиты bin/inf-wizard.exe. Далее описан процесс создания такого дистрибутива драйвера по шагам. Этот драйвер полностью заменит и драйвер устройства, и драйвер фильтра.

1. Запустите утилиту bin/inf-wizard.exe, откроется стартовое окно, где нужно сразу просто нажать Next.

libusb-Inf-Wizard-dialog01

2. В следующем окне нужно выбрать устройство USB, для которого будет генерироваться драйвер, и нажать Next.

libusb-Inf-Wizard-dialog02

3. Откроется окно, где можно отредактировать значения для VID (Vendor ID, идентификатор вендора в HEX-виде), PID (Product ID, идентификатор продукта в HEX-виде), индекс производителя MI (в HEX-виде), имя производителя, имя устройства.

libusb-Inf-Wizard-dialog03

Все параметры можно оставить как есть, ничего не изменяя, и просто нажать Next.

4. Откроется диалог для сохранения inf-файла, выберите имя файла (можно оставить его по умолчанию), выберите любую пустую папку для сохранения и нажмите Сохранить. В результате в выбранной папке появится inf-файл, инсталляторы installer_x64.exe, installer_x86.exe, и будут автоматически созданы подпапки amd64, ia64, x86, в которых содержатся системные файлы библиотеки LibUSB. Откроется окно диалога, в котором будут 2 кнопки: Install Now. (установить драйвер прямо сейчас) и Done (завершить).

libusb-Inf-Wizard-dialog04

Можно нажать Install Now. и установить вновь сгенерированный драйвер, а можно установку отложить, нажав Done.

5. Предположим, что Вы ранее нажали Done. Теперь собственно нужно установить только что сгенерированный драйвер. Для этого запустите Мастер Установки нового оборудования. Это можно сделать, если набрать в командной строке hdwwiz и нажать Enter. Или можно в Диспетчере Устройств выбрать в меню Действие -> Установить старое устройство. Откроется начальное окно мастера установки оборудования, нажмите кнопку Далее.

Windows-Device-Wizard-dialog01

6. В следующем окне выберите "Установка оборудования, выбранного из списка вручную" и нажмите Далее.

Windows-Device-Wizard-dialog02

7. В следующем окне выберите "Показать все устройства" и нажмите Далее.

Windows-Device-Wizard-dialog03

Windows-Device-Wizard-dialog04

Откроется окно, в котором нужно выбрать место расположения драйвера. Выберите папку, в которую Вы сохранили драйвер на шаге 4, выберите inf-файл, и нажмите Открыть:

Windows-Device-Wizard-dialog05

Затем нажмите OK:

Windows-Device-Wizard-dialog06

9. Отобразится окно с описанием драйвера, и предупреждение, что драйвер без цифровой подписи. Просто нажмите Далее.

Windows-Device-Wizard-dialog07

10. Появится окно, которое сообщает о готовности к установке драйвера. Просто нажмите Далее.

Windows-Device-Wizard-dialog08

11. Появится окно "Безопасность Windows", где еще раз сообщается о том, что у драйвера нет сертификата. Это окно позволяет отказаться от установки драйвера, или установить драйвер. Выберите второй вариант, "Все равно установить этот драйвер".

Windows-Device-Wizard-dialog09

Установка драйвера завершена.

[Удаление драйвера фильтра LibUSB]

Удаление драйвера фильтра LibUSB может понадобиться, если нужно восстановить доступ к устройству USB для обычных программ, которые не используют библиотеку LibUSB. Например, мне понадобилось удалить драйвер LibUSB для адаптера J-Link после экспериментов с OpenOCD, когда мне нужно было продолжить отладку через драйвера SEGGER в среде IAR.

1. Запустите мастер установки драйвера фильтра Filter Wizard - в зависимости от типа процессора это либо bin\amd64\install-filter-win.exe, либо bin\ia64\install-filter-win.exe, либо для 32-разрядной системы bin\x86\install-filter-win.exe. В первом окне мастера выберите вариант удаления драйвера фильтра (Remove a device filter), нажмите Next.

libusb-Filter-Wizard-dialog04

2. Выберите в списке устройство, для которого нужно удалить драйвер фильтра, и нажмите Remove.

libusb-Filter-Wizard-dialog05

libusb-Filter-Wizard-dialog06

Нажмите OK, и закройте программу Filter Wizard. Удаление драйвера фильтра для устройства USB завершено.

[Удаление драйвера устройства LibUSB]

Чтобы удалить драйвер фильтра, воспользуйтесь GUI-утилитой (install-filter-win.exe), см. предыдущий раздел "Удаление драйвера фильтра LibUSB". Сам драйвер и его файлы удалить не так просто, но можно сделать либо откат состояния системы (Панель управления -> Восстановление), либо попробовать утилиту usbdeview [3]. В операционных системах Windows Vista и Windows 7 можно использовать системную утилиту командной строки pnputil для удаления пакета драйвера.

[Обновление драйвера фильтра LibUSB]

Сначала удалите старую версию драйвера фильтра, см. раздел "Удаление драйвера фильтра LibUSB". Затем установите новую версию драйвера фильтра, как это описано в разделе "Установка драйвера фильтра LibUSB на 64-битных Windows 7 и Windows Vista по шагам".

В прошлой части я рассказал как примерно должен выглядеть проект-заготовка для Keil девайса с USB, дал ссылку на мой проект и рассказал как его настроить под практически любую плату с STM32.

В проекте был реализован интерфейс с двумя bulk-ендпойнтами (in и out), с моим «кастомным» протоколом, при помощи которого можно включать, выключать и заставлять светоиоды мигать с нужными временами горения/не горения.

Ну и выложил небольшую программу для всего этого:


Пользователь Vga в комментариях справедливо заметил, что разработка своего драйвера под Windows — задача далеко не тривиальная, и что проще реализовать стандартный класс, например HID, под который драйверы есть.

В этой статье я проведу небольшой обзор средств, которыми можно воспользоваться, чтобы сильно упростить себе жизнь.

Итак, у нас на повестке следующие варианты:

1) Написать драйвер самому. Задача сложная, неблагодарная, долгая. Тут сразу можно отсылать, например к Windows Driver Foundation. Есть куча примеров, которые можно расковырять и адаптировать под свои задачи.
Несомненный плюс этого варианта — решение получится красивое и компактное. Но стоит ли это потраченного времени…
Извините, если разочаровал тех, кто полагал, что я опишу именно этот вариант :)

2) Реализовать на девайсе один из стандартных классов, например тот же HID.
Но давайте предположим что мы вот буквально вчера наконец-то заставили наш девайс определяться по USB как самостоятельное устройство, и все что мы умеем — это читать и писать в ендпойнты. Нам нужно что-то еще проще.

3) Использовать готовые средства. Вот на этом «варианте для начинающих и не только» мы остановимся.

Но вначале небольшое отступление.

Как Windows опознает наши USB-устройства?
В большинстве случаев это «зашитые» в девайс VID (Vendor ID) и PID (Product ID). Есть исключения, например HID и Mass Storage, там Windows опознает класс устройства и подсовывает уже приготовленный драйвер.

Если мы воткнем наш девайс в компьютер, система определит его, но, очевидно, будет ругаться на отсутствие драйвера, и предложит выбрать .inf- файл.
Именно в этом файле и прописываются, помимо прочего, наши VID и PID, а также путь к драйверу.

Есть, конечно, и более хитрые варианты, но мы на них пока останавливаться не будем.
Наши VID и PID можно подсмотреть в файле usb_desc.c проекта. И обязательно прочтите комментарий ;-)

Итак, встречаем: libusb-win32 и Jungo WinDriver.

Jungo WinDriver


Весьма удобная штука.
Запускаем Wizard, выбираем по VID-PID наш девайс:


Генерим inf-файл, сохраняем, устанавливаем тут же драйвер, и вуаля. Вот они наши два bulk-ендпойнта + управляющий, нулевой ендпойнт:


А вот наш девайс определился в диспетчере устройств:


Но и это не все. Жмем на волшебную кнопку Generate Code:


И получаем воистину огромный набор вариантов на любой вкус:


Генерим проект, запускаем. Вот — готовая программа для работы с нашим девайсом:

Можем отправлять данные в ендпойнты и читать их оттуда.
Например, отправка пакета на скриншоте согласно моему протоколу зажжет светодиод номер два. (См protocol.txt в проекте Keil)

Ну а теперь поговорим о недостатках.
1) Jungo WinDriver — штука очень уж платная. Кто хочет расстроиться — цены лежат тут.
2) У некоторых USB-девайсов бывает несколько конфигураций. Такое встречается редко, но встречается.
WinDriver с такими работать не умеет, а функция смены конфигурации помечена как Not Implemented Yet.

libusb-win32


Распаковываем и в папочке bin лежит программка inf-wizard.exe. Тоже визард для генерации инф-файла, а заодно и всех остальных файлов, необходимых для установки драйвера.
Запускаем, выбираем наш девайс, сохраняем inf и прочее в отдельную папочку:


Ну и сразу инсталлируем.

Теперь, чтобы создать свой проект, необходимо собрать все нужные от libusb файлы в папках lib, include, подсмотреть как работать с устройством, в папке exampes. А работать — проще простого (см bulk.c)

LibUsbDotNet

Именно при помощи этой либы я и написал программу из предыдущей статьи. Работать с ендпойнтами так же просто.


Ну а дальше реализуем небольшой протокол, пишем-читаем ендпойнты и радуемся мигающим светодиодам :)
Только не забываем одну тонкость: весь обмен с USB-девайсом происходит по инициативе хоста. Поэтому, данные не попадут в хост до тех пор пока хост сам не захочет их прочитать.
Вот и все.

Итого

Вот, в принципе, все необходимое для того чтобы создать на STM32 примитивный USB-девайс. Весь обмен сводится к чтению и записи в ендпойнты и разбору того, что же туда все-таки пришло и что с этим делать.
Лично мне кажется этот вариант проще, чем реализация на девайсе стандатного класса.

Как всегда, файлы с проектом находятся тут.

Ну а в следующий раз, когда дойдут руки, будем поднимать USB Mass Storage, причем поверх уже сделанного интерфейса для светодиодов, т.е. составное USB-устройство :)

Читайте также: