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 опознает класс устройства и подсовывает уже приготовленный драйвер.
Есть, конечно, и более хитрые варианты, но мы на них пока останавливаться не будем.
Наши 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)
LibUsbDotNet
Нет, вы только вдумайтесь: .NET-надстройка над библиотекой, портированной из линукса под win32!
Конечно, изврат извратом, но мне понравилось.
Именно при помощи этой либы я и написал программу из предыдущей статьи. Работать с ендпойнтами так же просто.
Ну а дальше реализуем небольшой протокол, пишем-читаем ендпойнты и радуемся мигающим светодиодам 🙂
Только не забываем одну тонкость: весь обмен с USB-девайсом происходит по инициативе хоста. Поэтому, данные не попадут в хост до тех пор пока хост сам не захочет их прочитать.
Вот и все.
Итого
Вот, в принципе, все необходимое для того чтобы создать на STM32 примитивный USB-девайс. Весь обмен сводится к чтению и записи в ендпойнты и разбору того, что же туда все-таки пришло и что с этим делать.
Лично мне кажется этот вариант проще, чем реализация на девайсе стандатного класса.
Как всегда, файлы с проектом находятся тут.
Ну а в следующий раз, когда дойдут руки, будем поднимать USB Mass Storage, причем поверх уже сделанного интерфейса для светодиодов, т.е. составное USB-устройство 🙂
WinDriver – инструмент разработки драйверов для устройств – PCI/USB/PCIe
WinDriver™ – инструмент, который позволяет просто и элегантно разрабатывать драйвера для PCI, PCIe и USB устройств на оперционных системах Windows и Linux.
Используя WinDriver, вся работа будет происходить в режиме пользователя, при этом не требуется иметь знания в программировании, в режиме ядра. За вас это сделает WinDriver!
Кому подходит использование WinDriver?
Разработчики оборудования – Использование Driver-Wizard для быстрого тестирования вашего оборудования
Разработчики програмного обеспечения – Использование Driver-Wizard для генерирования кода драйвера вашего устройства и управления им. Использовать инструменты WinDriver для тестирования и отладки кода драйвера.
Консультация нв русском языке:
Либо позвоните по телефону: +1-408-600-0851
Платформы Windows поддерживаемые WinDriver:
Основные функции WinDriver
Оптимизация производительности: используйте технологию WinDriver Kernel Plugin для разработки вашего драйвера в режиме пользователя, а затем выполните критические разделы производительности в режиме ядра (Ring 0) для достижения оптимальной производительности.
Продукты WinDriver сопровождаются подробными техническими рекомендациями, которые помогут вам на разных этапах процесса разработки. Если вы только начали оценивать или использовать WinDriver – вы можете найти наш Quick Start Guide. Если вам требуется более подробная информация или вы хотите узнать больше о технических аспектах WinDriver – обратитесь к нашему онлайн-руководству. Для других технических ресурсов, таких как часто задаваемые вопросы и технические документы, см. Страницу поддержки WinDriver
Партнеры
WinDriver предлагает набор готовых библиотек и функций доступа к элементам электронных устройств, которые обеспечивают расширенную поддержку нашим PCI / PCI Express и USB- партнерам электронных устройств
Jungo windriver что это
E-mail для связи: |
|




















