19.11.2009

LibUSB

Библиотека libusb и ее аналог libusb-win32 обычно используются совместно с устройствами, основанными на V-USB. Конечно, жесткой зависимости тут нет - одно может существовать без другого и наоборот. Однако, если Вы не хотите ставить DDK под Windows и изучать азы написания драйверов USB, лучше все-таки воспользоваться этой библиотекой: сэкономите кучу времени. Кроме того, логику работы со стороны PC-хоста вы можете писать и отлаживать как обычное приложение, не ломая голову над тем, как распечатать из ядра отладочную информацию.

I. Windows

libusb-win32 существует в двух вариантах.

А. Фильтр

Для установки фильтра надо запустить  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:

[Files]
Source: "driver\*.sys"; DestDir: "{app}\driver"
Source: "driver\*.cat"; DestDir: "{app}\driver"
Source: "driver\*.dll"; DestDir: "{app}\driver"
Source: "driver\*.inf"; DestDir: "{app}\driver"
Source: "driver\*.dll"; DestDir: "{win}\system32"; FLags: replacesameversion restartreplace uninsneveruninstall

[Run]

; invoke libusb's DLL to install the .inf file
Filename: "rundll32"; Parameters: "libusb0.dll,usb_install_driver_np_rundll {app}\driver\MyCoolDevice.inf"; StatusMsg: "Installing driver (this may take a few seconds) ..."

Добавив эти строки в соответствующие секции любого готового скрипта Inno Setup, мы обеспечиваем установку драйверов в систему.

II. Linux

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

dpkg -l | grep libusb

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

sudo apt-get libusb-0.1-4

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


sudo apt-get libusb-dev



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

gcc -lusb myproject.c


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

Depends: libusb-0.1-4

Это вынудит менеджер пакетов ставить libusb с новым пакетом автоматически. Разумеется, потребуется правильно настроенный apt/sources.list.

Комментариев нет:

Отправить комментарий