STM32 и USB. Часть 2. Немного о драйверах и софте.
В прошлой части я рассказал как примерно должен выглядеть проект-заготовка для 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)
Я сгенерил проект для C# (.NET) и мне он выдал солюшен с двумя проектами: Собственно сама программа и либа для работы с девайсом по USB. В последней есть все необходимое, вплоть до событий подключения-отключения девайса. А вообще если не заморачиваться, то все можно свести к обычному чтению-записи в ендпойнты.
Дальше сами справитесь? 😉
Ну а теперь поговорим о недостатках.
1) Jungo WinDriver — штука очень уж платная. Кто хочет расстроиться — цены лежат тут.
2) У некоторых USB-девайсов бывает несколько конфигураций. Такое встречается редко, но встречается.
WinDriver с такими работать не умеет, а функция смены конфигурации помечена как Not Implemented Yet.
libusb-win32
Распаковываем и в папочке bin лежит программка inf-wizard.exe. Тоже визард для генерации инф-файла, а заодно и всех остальных файлов, необходимых для установки драйвера.
Запускаем, выбираем наш девайс, сохраняем inf и прочее в отдельную папочку:
Ну и сразу инсталлируем.
Теперь, чтобы создать свой проект, необходимо собрать все нужные от libusb файлы в папках lib, include, подсмотреть как работать с устройством, в папке exampes. А работать — проще простого (см bulk.c)
Но и этого мне показалось мало. Поскольку меня в свое время подсадили на тяжелый наркотик, именуемый C# + .NET, я стал искать решения, такие же простые, как и Jungo WinDriver.
И нашел следующее:
LibUsbDotNet
Нет, вы только вдумайтесь: .NET-надстройка над библиотекой, портированной из линукса под win32!
Конечно, изврат извратом, но мне понравилось.
Именно при помощи этой либы я и написал программу из предыдущей статьи. Работать с ендпойнтами так же просто.
Ну а дальше реализуем небольшой протокол, пишем-читаем ендпойнты и радуемся мигающим светодиодам 🙂
Только не забываем одну тонкость: весь обмен с USB-девайсом происходит по инициативе хоста. Поэтому, данные не попадут в хост до тех пор пока хост сам не захочет их прочитать.
Вот и все.
Итого
Вот, в принципе, все необходимое для того чтобы создать на STM32 примитивный USB-девайс. Весь обмен сводится к чтению и записи в ендпойнты и разбору того, что же туда все-таки пришло и что с этим делать.
Лично мне кажется этот вариант проще, чем реализация на девайсе стандатного класса.
Как всегда, файлы с проектом находятся тут.
Ну а в следующий раз, когда дойдут руки, будем поднимать USB Mass Storage, причем поверх уже сделанного интерфейса для светодиодов, т.е. составное USB-устройство 🙂
Libusb win32 devices windows 10 что это
Библиотека 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 нет.
Важное замечание: не выполняйте шаги из этого руководства, если пытаетесь выбить Ваше iDevice из цикла recovery mode, и Вы хотите использовать Recboot или EasyiRecovery. По некоторым причинам LibUSB запретит Вашу клавиатуру и мышь при следующей загрузке, и чтобы это исправить, понадобится деинсталлировать LibUSB через загрузку в безопасный режим safe mode (либо придется воспользоваться откатом состояния системы). Поскольку программа TinyUmbrella не требует установки LibUSB, именно её рекомендуется использовать для манипуляций с рутингом Ваших устройств.
[Установка драйвера фильтра 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). Тип процессора можно узнать через Свойства системы (Панель управления -> Система).
Появится стартовое окно мастера установки фильтра:
Удостоверьтесь, что выбран вариант для установки драйвера фильтра (Install a device filter), и нажмите Next.
4. Появится список устройств, которые система Windows распознала, и для которых установлены уже драйвера, но к которым пока не привязан драйвер фильтра библиотеки LibUSB:
Выберите в списке нужное устройство (к которому Вы хотите привязать драйвер фильтра), и нажмите Install. Через несколько секунд появится сообщение, что драйвер фильтра успешно установлен для выбранного устройства.
Нажмите OK, и закройте программу Filter Wizard. Установка драйвера фильтра успешно завершена.
[Использование INFWizard — генерация драйвера для неизвестного устройства USB]
Утилита для генерации драйвера INFWizard может понадобиться для того случая, когда операционная система не может сама подобрать драйвер для устройства. В Диспетчере Устройств такое устройство USB отображается как проблемное, для которого не установлен драйвер.
В этом случае можно сгенерировать новый драйвер с помощью утилиты bin/inf-wizard.exe. Далее описан процесс создания такого дистрибутива драйвера по шагам. Этот драйвер полностью заменит и драйвер устройства, и драйвер фильтра.
1. Запустите утилиту bin/inf-wizard.exe, откроется стартовое окно, где нужно сразу просто нажать Next.
2. В следующем окне нужно выбрать устройство USB, для которого будет генерироваться драйвер, и нажать Next.
3. Откроется окно, где можно отредактировать значения для VID (Vendor ID, идентификатор вендора в HEX-виде), PID (Product ID, идентификатор продукта в HEX-виде), индекс производителя MI (в HEX-виде), имя производителя, имя устройства.
Все параметры можно оставить как есть, ничего не изменяя, и просто нажать Next.
4. Откроется диалог для сохранения inf-файла, выберите имя файла (можно оставить его по умолчанию), выберите любую пустую папку для сохранения и нажмите Сохранить. В результате в выбранной папке появится inf-файл, инсталляторы installer_x64.exe, installer_x86.exe, и будут автоматически созданы подпапки amd64, ia64, x86, в которых содержатся системные файлы библиотеки LibUSB. Откроется окно диалога, в котором будут 2 кнопки: Install Now. (установить драйвер прямо сейчас) и Done (завершить).
Можно нажать Install Now. и установить вновь сгенерированный драйвер, а можно установку отложить, нажав Done.
5. Предположим, что Вы ранее нажали Done. Теперь собственно нужно установить только что сгенерированный драйвер. Для этого запустите Мастер Установки нового оборудования. Это можно сделать, если набрать в командной строке hdwwiz и нажать Enter. Или можно в Диспетчере Устройств выбрать в меню Действие -> Установить старое устройство. Откроется начальное окно мастера установки оборудования, нажмите кнопку Далее.
6. В следующем окне выберите «Установка оборудования, выбранного из списка вручную» и нажмите Далее.
7. В следующем окне выберите «Показать все устройства» и нажмите Далее.
8. Появится окно выбора драйвера для устройства. Нажмите кнопку «Установить с диска. «
Откроется окно, в котором нужно выбрать место расположения драйвера. Выберите папку, в которую Вы сохранили драйвер на шаге 4, выберите inf-файл, и нажмите Открыть:
Затем нажмите OK:
9. Отобразится окно с описанием драйвера, и предупреждение, что драйвер без цифровой подписи. Просто нажмите Далее.
10. Появится окно, которое сообщает о готовности к установке драйвера. Просто нажмите Далее.
11. Появится окно «Безопасность Windows», где еще раз сообщается о том, что у драйвера нет сертификата. Это окно позволяет отказаться от установки драйвера, или установить драйвер. Выберите второй вариант, «Все равно установить этот драйвер».
12. После этого несколько секунд будет отображаться прогресс копирования файлов драйвера, и затем появится сообщения о завершении установки драйвера.
Установка драйвера завершена.
[Удаление драйвера фильтра 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.
2. Выберите в списке устройство, для которого нужно удалить драйвер фильтра, и нажмите Remove.
3. Через несколько секунд появится сообщение об успешном удалении драйвера фильтра:
Нажмите 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 по шагам».
[Обновление драйвера устройства LibUSB]