libusb-win32 is a port of the USB library libusb-0.1 (http://sf.net/projects/libusb/) to 32/64bit Windows. The library allows user space applications to access many USB device on Windows.
Development of libusb-win32 is now at github https://github.com/mcuee/libusb-win32. Please use github if you need to report issues or submit patches.
Features
- libusb-win32 device driver and filter driver
- KMCS digital signed kernel driver libusb0.sys
- User space library libusb0.dll
- 32bit/64bit Windows support
Project Samples
License
GNU General Public License version 3.0 (GPLv3), GNU Library or Lesser General Public License version 3.0 (LGPLv3)
Nevis lets you wow your customers, partners, and employees with excellent authentication and authorization convenience. Nevis offers a single, all-encompassing identity and access management solution for all your identity use cases. With its comprehensive CIAM functions, you can offer your privacy-minded consumers an exceptional user experience, personalized interactions, and the level of secure access to your services that is essential for today’s disruptive, digital transformation demands.
User Ratings
4.5
out of 5 stars
★★★★★
★★★★
★★★
★★
★
ease
1 of 5
2 of 5
3 of 5
4 of 5
5 of 5
4 / 5
features
1 of 5
2 of 5
3 of 5
4 of 5
5 of 5
5 / 5
design
1 of 5
2 of 5
3 of 5
4 of 5
5 of 5
4 / 5
support
1 of 5
2 of 5
3 of 5
4 of 5
5 of 5
4 / 5
User Reviews
- All
- ★★★★★
- ★★★★
- ★★★
- ★★
- ★
-
Do I really need to write a review in order to submit a star rating?
-
what time this project will support in win10 system ……..
-
I tried to compile the libusb-sys v1.2.6.0 project with Visual Studio community 2013 and WinDDK v7600.16385.1.
and get two error messages as below:
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.MakeFile.Targets(38,5): error MSB3073: The command «CD «D:LibUSB1260libusb-win32-src-1.2.6.0projects..ddk_make»
1>C:Program Files (x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.MakeFile.Targets(38,5): error MSB3073: CMD /C make.cmd «arch=x86» «app=driver» «noclean=true» «outdir=D:LibUSB1260libusb-win32-src-1.2.6.0projectsWin32Debuglibusb-sys» «DIR_INTERMEDIATE=D:LibUSB1260libusb-win32-src-1.2.6.0projectsWin32Debuglibusb-sys» «debugmode=true»» exited with code 1.
By the way, I had modified the make.cfg file and NMake Including Search Path setting based on my environment.1 user found this review helpful.
-
very good and easy to use
1 user found this review helpful.
-
Thanks for Libusb-win32, it’s excellent!
1 user found this review helpful.
Read more reviews >
Additional Project Details
Languages
English
Intended Audience
Developers
User Interface
Win32 (MS Windows)
Programming Language
C
Table of Contents
-
Overview
- About
- Binary Snapshots
- vcpkg port
- msys2 MinGW-w64 32bit/64bit package
- Build from Source
-
Supported Environments
- USB 3.x Support
- .NET support
-
How to use libusb on Windows
- Driver Installation
- Development Considerations
- Known Restrictions
- Development Links
Overview
About
This page details the specifics of the Windows backend part of libusb, which helps developers easily communicate with USB devices on Windows.
Currently it supports the WinUSB and HID drivers for generic USB device access as well as the libusb-win32 and libusbK drivers.
Please note that libusb-win32 and libusbK are separate projects. libusb-win32 is a Windows-only project which provides a libusb-0.1 API compatible library for Windows and the associated kernel driver libusb0.sys. libusbK is a Windows only project which provides a new set of API for Windows (supporting WinUSB, libusb0.sys and libusbk.sys) and kernel driver libusbK.sys.
Binary Snapshots
Pre-built binary snapshots are provided in the Sourceforge files directory along with the source code archive. Since 1.0.21 release, they are also at the GitHub release page.
The pre-built Windows binaries are provided AS IS for your convenience, generated for the following environments:
- Microsoft Visual Studio; MS32 (32 bit) and MS64 (64 bit) directories
- MinGW -> MinGW32 (32 bit) and MinGW64 (64 bit) directories.
Note that these archives are provided in the 7z
format so you may have to install 7-zip.
vcpkg port
vcpkg now includes libusb ports.
Installing and building libusb via vcpkg:
You can download and install libusb using the vcpkg dependency manager:
git clone https://github.com/Microsoft/vcpkg.git cd vcpkg .bootstrap-vcpkg.bat .vcpkg integrate install .vcpkg install libusb
The libusb port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please create an issue or pull request on the vcpkg repository.
msys2 MinGW-w64 32bit/64bit package
msys2 has a libusb package. Please contact the msys2 project if you encountered issues with the msys2 package. It is recommended to use pkg-config (libusb-1.0.pc) on MSYS2 or other MinGW-w64 distributions.
Reference: how to use libusb under MinGW-w64?
Build from Source
You may want to build from source if you encounter compatibility issues with the pre-built binaries. We recommend either Visual Studio or a MinGW-w64 based toolchain like MSYS2.
Note that the MinGW.org toolchain is not supported. clang support patches are welcome. Patches to add support for other toolchains (including MinGW.org) may be accepted after review even though these toolchains are not officially supported.
Supported Environments
Supported systems are all Windows platforms, starting with Windows Vista, and including 64 bit versions. Windows XP support was dropped in libusb 1.0.24.
USB 3.x Support
libusb supports USB 3.x controllers and devices on Windows. Proprietary vendor controller drivers for Windows 7 and earlier as well as the Microsoft controller xHCI driver for Windows 8/8.1/10 are supported. If you are are using Windows 7 or earlier version, you will be using vendor driver. Make sure you upgrade to the latest version of the driver if you encounter problems.
.NET support
A .NET
version of libusb, called LibUsbDotNet, based on libusb 1.0. If you plan to use libusb in a .NET
project, make sure you check out the latest release at github.
How to use libusb on Windows
Driver Installation
If your target device is not HID, and your device is not using WinUSB driver, you must install a driver before you can communicate with it using libusb. Currently, this means installing one of Microsoft’s WinUSB
, libusb-win32 or libusbK drivers. Two options are available:
-
Recommended: Use the most recent version of Zadig, an Automated Driver Installer GUI application for
WinUSB (recommended)
,libusb-win32 (please use device driver mode if you really need to use it as the filter driver mode is not well supported)
andlibusbK (only if you hit WinUSB limitations)
. - For version 1.0.21 or later, you can also use the usbdk backend. usbdk provides another driver option for libusb Windows backend. For 1.0.21, usbdk is a compile-time option, but it becomes a runtime option from version 1.0.22 onwards, so you need to specify the usbdk backend using something like the following.
libusb_context * ctx = NULL;
libusb_init(&ctx);
libusb_set_option(ctx, LIBUSB_OPTION_USE_USBDK);
Note that if your device is using libusb-win32 driver (libusb0.sys), you will also need to install the libusbK DLL, as all libusb0.sys accesses are done through it. One way to install/update libusbK.dll is to install libusbk development kit (libusbK-x.x.x.x-setup.exe from Sourceforge site and choose to update the system files during the installation. However the support of libusb-win32/libusb0.sys filter driver mode is not good, please use the device driver mode when you have to use libusb0.sys.
Development Considerations
The handling of composite devices under Windows is done with multiple drivers, that are children of the usbccgp.sys
driver (Composite Generic Parent), as this is the default for the OS. If needed, it is also possible to replace the composite parent driver to access the device. Zadig can be used for this purpose.
Because Windows does not provide a native poll()
function, and cygwin is the only development environment that provides such a call, the use of libusb file descriptors with poll()
on cygwin is NOT supported. In a future version of libusb, we should provide better handling of native Windows events, but this will require a redesign of the libusb API, so it probably won’t occur before libusb 2.0.
Known Restrictions
-
WinUSB
cannot be used to send an actual reset command to an USB device. This is a limitation of WinUSB. -
WinUSB
andlibusbK
cannot be used to set a device configuration that is different from the first one. This is a limitation of KMDF USB I/O Target. -
WinUSB
does not support multiple concurrent applications (as per the Microsoft Windows Hardware Drivers documentation).libusbk
driver allows this but it may have the limitation that you can claim the interface multiple times (https://github.com/libusb/libusb/issues/807).libusb-win32
driver will also allow this but it is not recommended to be used due to multiple issues reported. -
WinUSB
does not support isochronous transfers under Windows XP/Vista/7/8. WinUSB under Windows 8.1 or later supports isochronous transfer. libusb Windows supports isochronous transfer using the usbdk backend from version 1.0.21. libusb-1.0.22 adds isochronous support using libsubK driver. libusb-1.0.23 adds isochronous transfer support for WinUSB (Windows 8.1/10 or later) but the support may not be that mature. -
WinUSB
allows setting up different pipe policy and RAW_IO can be useful in some use cases. Unfortunately it will make the WinUSB backend pretty complicated so this is not supported. why not WinUSB RAW_IO pipe policy? - With
WinUSB
, whenLIBUSB_RECIPIENT_INTERFACE
is used for the transfer, theWinUSB
DLL forces the low byte ofwIndex
to the interface number, regardless of what you set it to.- This is not a real limitation though, please refer to the OSR threads. From Tim Roberts answer in that thread:
- One can also argue that this is a security measure. The USB spec requires that the low byte of wIndex be set to the interface number when the recipient is set to «interface». Devices that use that field for other purposes are broken.
- HID keyboards and mice cannot be accessed using the native HID driver as Windows reserves exclusive access to them.
- Multiple HID top level collections are currently not supported (only the first top level collection will be used).
- The HID Report Descriptors provided by libusb are recomposed and may present minor differences from the actual ones, as the Windows HID API does not allow to read them directly from the device.
- Windows HID API does not support custom Control Transfer, everything needs to be done through report. Please check out the discussion here.
- Because there is no native
poll()
on Windows, the ability to return externally pollable file descriptors on Windowslibusb_get_pollfd()
returns an error. - If you use a composite device, and plan to install a libusb compatible driver for any of the interfaces, you should ensure that your driver package adds a Device Interface GUID in the registry, as proper enumeration of composite devices in libusb depends on it. This is typically achieved by adding something like the following in your inf:
HKR,,DeviceInterfaceGUIDs,0x00010000,{12345678-1234-1234-1234-123456789ABC}
This is in particular a problem with libusb-win32’s inf-wizard which will be deprecated by libusb-win32 project. Please use Zadig instead. -
libusb0.sys and libusbk.sys
access is done through the libusbK DLL, therefore, if you plan to use the libusb-win32/libusb0.sys or libusbK/libusbk.sys driver in libusb, you must have that library installed. If using a recent version of Zadig, you should not have to do anything, at it will install the library for you. - libusb0.sys: the support of libusb0.sys filter driver has quite some issues, you should use the device driver mode if you really need to use libusb0.sys.
- libusb0.sys: cannot send libusb_control_transfer with zero wLength with libusb0.sys 1.2.6.0 version. Please use libusb0.sys 1.2.7.3 snapshot release or later.
- uhubctl will not work under Windows. Please refer to Issue #391 due to limitation of the underlying drivers (libusb0.sys, libusbk.sys, usbdk and WinUSB) with regard to USB Hubs.
Development Links
-
How to Use WinUSB to Communicate with a USB Device & WinUSB (Winusb.sys) Installation.
Note that the inf file given in the howto has a typo. If you don’t changeSourceDisksFiles.NTamd64
toSourceDisksFiles.amd64
, the driver installation will fail to copy the required DLLs on 64 bit systems… - Using WinUSB for User-Mode to USB Device Communication
- WinUSB User-Mode Client Support Routines
- Microsoft’s USB Core Team Blog
- Microsoft HW Development Center — USB
- additional information about Windows Co-Installers
- Finding Memory Leaks Using the CRT Library
- libusbK documentation
- libwdi/Zadig Wiki
- Microsoft Devcon source code
- Microsoft USBView source code
1.Libusb Win32 Эффекты и шаги установки.
Libusb-win32 — универсальный драйвер USB-устройства для операционных систем Windows (Win98SE, WinMe, Win2K и WinXP, Vista, Win7 и т. Д.). Драйвер позволяет пользователю получать доступ к любому USB-устройству в системе Windows без записи любой строки основного драйвера, со следующими функциями:
Может общаться с любым установленным USB-устройством
Водитель для USB-устройств, разработанных самим собой
Поддержка массовых и прерываний
Поддержите все стандартные запросы устройства, определенные в спецификации USB
Поддержка пользовательских запросов для производителей устройства USB
Метод установки водителя Libusb-Win32-Bin-1.2.6.0
Этот диск является драйвером в системе Windows (включая основные окна XP, Windows7), официальный URL,http://sourceforge.net/apps/trac/libusb-win32/wikiВы также можете найти обзор Libusb-Win32.
2.Libusb Win32 Среда компиляции и используйте Libusb в операционной системе Windows
Инструмент компиляции:
VS2010: Динамическая библиотека ссылок, используемая для компиляции libusb-win32, связанных с ними инструментами и демонстрационными программами.
Winddk: для компиляции USB-драйверов, генерируйте файлы libusb0.sys.
Загрузка кода исходного кода:http://sourceforge.net/projects/libusb-win32/files/
INF-MAPARD — привод устройства Установите информацию об информационном файле Generate Wizard. Этот мастер может отсканировать USB-устройство на вашем компьютере и получите VID и PID сгенерированные файлы INF из выбранного вами устройства.
Установка-фильтр — Установка фильтра. FilterDriver — это управляемое высокоуровневое царство, антивирусное программное обеспечение, брандмауэр и ноутбук многофункциональные кнопки и т. Д.
Libusb-dll — динамическая библиотека ссылок генерирует libusb0.dll. Функция Core Libusb, которая будет сказана, будет упакована здесь. В то же время генерируются файлы libusb0.lib, а ссылка процедуры реализована для реализации libusb0.dll загрузки.
Libusb-sys — USB-драйвер, генерируя файл драйвера libusb0.sys. Обратите внимание, что это проект Makefile.
Простой случай TestBulk — LibusB-Win32 передает «Hello World!».
TESTLIBUSB — реализовать обход в LibusB-Win32-приводных устройств и печатает часть информации о описании устройства.
TestLibusb-Win — WinForm версию TEXTLIBUSB.
После составления проекта нет файла libusb0.sys в каталоге SIBUSB-SYS GENITOR. (Libusb-sys основан на Winddk для компиляции связей)
Таким образом, вам необходимо просмотреть страницу свойств Project для LibusB-Sys, в столбце [Свойства конфигурации], просмотреть «Создать командную строку», проверьте файл make.cfg в каталоге
; DefaultWinDDKdirectory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=Z:WinDDK
WINDDK_DIR=!WINDDK_BASE!7600.16385.0
;
; (optional)
WINDDK_W2K_DIR=!WINDDK_BASE!6001.18002 //
Измените нашего пользовательского пути установки Winddk, например.
; DefaultWinDDKdirectory(s) Adjust these values to match your environment
; (REQUIRED)
WINDDK_BASE=D:WinDDK
WINDDK_DIR=!WINDDK_BASE!7600.16385.1
Затем перекомпилируйте Libusb-Sys на VS2010.
3.api Функция Введение
В LibusB0.1 функция имеет два значения возврата, ручку ручки устройства, которая открыта для функции USB_OPEN, вторая — тип INT, когда возвращаемое значение больше или равно 0, возвращаемое значение меньше 0 означает неудачу
Сообщить о коде ошибки в файле WDK CRT_ERRNO.H стандартный код ошибки и некоторые инструкции MINGW следующие:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No entry, ENOFILE, no such file ordirectory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted function call */
#define EIO 5 /* Input/output error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Arg list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file descriptor */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Resource temporarily unavailable */
#define ENOMEM 12 /* Not enough space */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define EBUSY 16 /* strerror reports «Resourcedevice» */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Improper link (cross-device link?) */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
#define EINVAL 22 /* Invalid argument */
#define ENFILE 23 /* Too many open files in system */
#define EMFILE 24 /* Too many open files */
#define ENOTTY 25 /* Inappropriate I/O control operation*/
#define EFBIG 27 /* File too large */
#define ENOSPC 28 /* No space left on device */
#define ESPIPE 29 /* Invalid seek (seek on a pipe?) */
#define EROFS 30 /* Read-only file system */
#define EMLINK 31 /* Too many links */
#define EPIPE 32 /* Broken pipe */
#define EDOM 33 /* Domain error (math functions) */
#define ERANGE 34 /* Result too large (possibly toosmall) */
#define EDEADLK 36 /* Resource deadlock avoided */
#define ENAMETOOLONG 38 /* Filename too long */
#define ENOLCK 39 /* No locks available */
#define ENOSYS 40 /* Function not implemented */
#define ENOTEMPTY 41 /* Directory not empty */
III.Functions
1.Core
void usb_init(void);
Инициализацияlibusb,USB_INIT устанавливает некоторые внутренние структуры. USB_INIT должен быть вызван перед другими функциональными функциями Libusb.
int usb_find_busses(void);
Ищите все USB-шины в системе, возвращает количество изменений, произошедших с момента последнего вызова (общее количество новых автобусов и автобусов).
int usb_find_devices(void);
Эта функция сканирует на каждомusbВсе устройства в автобусе и должныusb_find_busses()После того, как функция называется, вернитесь к количеству изменений в том, что эта функция зависит от последнего времени (Все новые устройства и удаленные устройства)。
struct usb_bus *usb_get_busses(void);
Это для тех, которые поддерживают C CONSTS, и могут использовать общие библиотеки, но не поддерживать Cl Global Vimble, вернуть значение глобальной переменной USB_BUSSES.
void usb_set_debug(int level);
Эта функция устанавливает уровень информации об отладке информации, установленную на 4, чтобы получить информацию о отладке информации.
0 LOG_OFF, 1 LOG_ERROR, 2 LOG_WARNING, 3 LOG_INFO, 4LOG_DEBUG
2. Device operations:
Функция группы в основном связана с устройством, таким как открытие, закрывающее устройство и т. Д. Некоторые стандарты USB: настройка конфигурации, альтернативные настройки, очистки остатков и перезапуская устройства. В то же время уровень операционной системы также доступен, такой как утверждения и интерфейсы выпуска.
usb_dev_handle *usb_open(struct *usb_device dev);
Откройте USB-устройство, откройте устройство успешно возвращает ручку, а затем программа может взаимодействовать с устройством через ручку.
int usb_close(usb_dev_handle *dev);
Закрыть USB-устройство
Возвращение 0: Успешно выключение устройства
Менее 0: OFF Устройство не удалось
int usb_set_configuration(usb_dev_handle *dev, intconfiguration);
Настройка Включить USB-устройства на основе дескриптора конфигурации BConfigurationValue.
Вернуться 0: Установить успех
Менее 0: сбой настроек
int usb_set_altinterface(usb_dev_handle *dev, intalternate);
Установите выбираемую настройку текущего интерфейса
int usb_resetep(usb_dev_handle *dev, unsigned int ep);
Сброс указанного адреса BendPointDress конечной точки все статус
int usb_clear_halt(usb_dev_handle *dev, unsigned intep);
Очистить указанный адрес остановить конечную точку состояния.
int usb_reset(usb_dev_handle *dev);
Отправьте сброс, чтобы перезапустить определенное устройство, которое подключается к порту, желая порта нисходящей линии связи.
Возврат 0: Сброс успеха
Менее 0: сброс не удалось
Когда вызывается устройство USB_RESET, устройство перенесет в новое устройство и откроет новую ручку.
int usb_claim_interface(usb_dev_handle *dev, intinterface);
Объявите интерфейс с операционной системой, параметры интерфейса указаны в поле BinterfaceNumber в дескрипторе.
Примечание: USB_CLAIM_INTERFACE должен сначала звонить (например, USB_SET_LTITINTINTERFace, USB_BULK_WRITINTERINTERFACE, USB_BULK_WRITEINTERINTERFACE, USB_BULK_WRITE и т. Д.
Возвращаемое значение:
Ebusy: интерфейс недоступен
Enomem: не хватает памяти доступной
int usb_release_interface(usb_dev_handle *dev, intinterface);
Отпустите интерфейс для предыдущего объявления USB_CLAM_INTERFACE
3. Control Transfers
Основная функция этой группы группы состоит в том, чтобы позволить приложениям отправлять сообщения на конвейер управления по умолчанию.
int usb_control_msg(usb_dev_handle *dev, intrequesttype, int request, int value, int index, char *bytes, int size, inttimeout);
Отправить управляющее сообщение на устройство
int usb_get_string(usb_dev_handle *dev, int index, intlangid, char *buf, size_t buflen);
Получите дескрипторы строки из устройства USB через индекс и Langid и верните количество байтов в Buf.
int usb_get_string_simple(usb_dev_handle *dev, intindex, char *buf, size_t buflen);
Эта функция является пакетом USB_GET_STRING (), повторно приобретена с устройстваДескриптор устройстваИ преобразовать его в формат языка CASCII。
usb_get_descriptor()
Повторное приобретение устройства по умолчанию по умолчаниюДескриптор устройства。
usb_get_descriptor_by_endpoint()
От идентификации конечной точкиКонтрольная трубаИдите, чтобы получить дескриптор устройства.
4. Bulk Transfers
Эта группа группы позволяет приложению отправлять информацию на устройство через пакетную передачую трубы
int usb_bulk_write(usb_dev_handle *dev, int ep, char*bytes, int size, int timeout);
Напишите данные на конечную точку пакетной передачи
int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes,int size, int timeout);
Прочитайте данные на устройство к конечной точке пакетной передачи
5. Interrupt Transfers
Эта группа группы позволяет приложению отправлять и принимать данные на устройство через канал передачи прерывания.
int usb_interrupt_write(usb_dev_handle *dev, int ep, char*bytes, int size, int timeout);
Напишите данные на конечную точку прерывания. Эта функция инициирует запрос на запись прерывания на указанную конечную точку.
int usb_interrupt_read(usb_dev_handle *dev, int ep, char*bytes, int size, int timeout);
Напишите данные на конечную точку прерывания. Эта функция инициирует запрос прерываний на указанную конечную точку.
6. Asynchronous API and Isochronous Transfer
Libusb-win32 поддерживает асинхронную передачу асинхронной API. LibusB-Win32 Asynchronous API асинхронной передачи также поддерживает другие типы передачи: управление передачей, трансмиссия прерывания, объемная передача и т. Д.
int usb_isochronous_setup_async(usb_dev_handle *dev, void **context, unsigned char ep, int pktsize);
Назначьте запрос асинхронной передачи для конечной точки EP.
int usb_bulk_setup_async(usb_dev_handle *dev, void**context, unsigned char ep);
int usb_bulk_setup_async(usb_dev_handle *dev, void **context,unsigned char ep);
int usb_submit_async(void *context, char *bytes, intsize);
Int usb_reap_async (void * context, int timeout); ждут запроса на завершение, вернуть количество байтов успеха чтения или возвращаемого значения неисправности.
int usb_reap_async_nocancel(void *context, inttimeout);
Int usb_cancel_async (пустота * контекст); отмена
int usb_free_async(void **context);
4. Рутина передачи блока
#include <stdio.h>
#include <string.h>
#include <iostream>
#include «conio.h»
#include «lusb0_usb.h»
#pragma comment(lib, «libusb.lib»)
#define m_dev_VID<spanstyle=»white-space:pre;»> </span>0x1483 /* Vendor ID of the m_dev */
#define m_dev_PID<spanstyle=»white-space:pre;»> </span>0x5751 /* Product ID of the m_dev */
#define ep1_out_size 63 <spanstyle = «Белое пространство: pre;»> </ span> // Может изменять размер в соответствии с устройством
#define EP1_IN_SIZE 63
int main(int argc, char *argv[])
{
structusb_device * m_dev = NULL;
structusb_dev_handle *m_dev_handle;
charstr[64];
memset(str,0,sizeof(str));
usb_init();
usb_find_busses();
usb_find_devices();
struct usb_bus*bus;
for(bus =usb_get_busses(); bus; bus = bus->next)
{
struct usb_device *dev;
for(dev = bus->devices; dev; dev = dev->next)
{
if(dev->descriptor.idVendor == m_dev_VID &&dev->descriptor.idProduct == m_dev_PID)
m_dev=dev;
}
}
if(!m_dev)
{
printf(«m_dev not foundn»);
return 1;
}
m_dev_handle = usb_open(m_dev);
if(!m_dev_handle)
{
printf(«Couldnot open m_devn»);
return 1;
}
Printf («Устройство открывает успех! N»);
if(usb_set_configuration(m_dev_handle, 1) < 0)
{
printf(«Could not set configurationn»);
usb_close(m_dev_handle);
return 1;
}
Если (usb_claim_interface (m_dev_handle, 0) <0) // prect_interface 0 Регистрация с интерфейсом 0 Связь с операционной системой
{
printf(«Couldnot claim interfacen»);
usb_close(m_dev_handle);
return 1;
}
// —— Получите адрес конечной точки ——————————-
int ep =m_dev->config->interface->altsetting->endpoint->bEndpointAddress;
int EP_IN = 0;
int EP_OUT = 0;
if (ep >0x0f)
{
EP_IN = ep;
EP_OUT = ep -0x80;
}
else
{
EP_OUT = ep;
EP_IN = ep +0x80;
}
printf(«EP_IN:0x%02x , EP_OUT: 0x%02x n», EP_IN, EP_OUT);
//————————————————————
charWriteTestData[2048] = {0};
charReadTestData[2048] = {0};
for(int i = 0;i< 2048; i++)
{
WriteTestData[i]= i;
}
// Конечная точка 1 запись данных
int ret;
ret =usb_bulk_write(m_dev_handle, EP_OUT, WriteTestData, EP1_OUT_SIZE, 500);
if(ret !=EP1_OUT_SIZE)
{
PrintF («Конечная точка 1 данные записи не удалось!% D n», RET);
return 1;
}
else
{
Printf («Конечная точка 1 написана в данных успеха! N»);
}
// конечная точка 1 чтение данных
ret =usb_bulk_read(m_dev_handle, EP_IN, ReadTestData, EP1_IN_SIZE, 500);
if(ret !=EP1_IN_SIZE)
{
Printf («Конечная точка 1 чтение данных не удалось!% D n», RET);
return 1;
}
else
{
Printf («Конечная точка 1 чтение данных успеха! N»);
for (int i =0; i < EP1_IN_SIZE; i++)
{
printf(«%02X», ReadTestData[i]);
if(((i +1) % 16) == 0)
{
printf(«n»);
}
}
printf(«n»);
}
/**************************************************************************/
USB_RELEASE_INTERFACE (M_DEV_HANDLE, 0); // Интерфейс выхода, выпуск ресурсов и USB_CLAIM_INTERFACE.
usb_close(m_dev_handle);
Printf (» n Устройство вне n»);
return 0;
}
Содержание
- libusb0.dll
- Пути устранения ошибки с libusb0.dll
- Как установить libusb на windows 10
- libusb0 dll не был найден
- Всё равно выдаёт ошибку libusb0.dll не был найден?
- Нужна помощь в установке libusb0.dll?
- Ошибки libusb0.dll
- Пути устранения ошибки с libusb0.dll
- Скачать libusb0.dll
- Как исправить ошибку?
- Способ 1.
- Способ 2.
- Русские Блоги
- Один, загрузка libusb
- Во-вторых, установка libusb
- Три, тест libusb
libusb0.dll
Файл 0.dll — это файл динамически подключаемой библиотеки. Если быть точным, это компонент библиотеки LibUSB, которая отвечает за работу так называемого «ПО хоста USB», например, за работу программ, обеспечивающих взаимодействие ОС смартфона с операционной системой Вашего персонального компьютера. Ошибка в работе этих программ, сопровождающаяся соответствующим системным сообщением, нередко вызвана отсутствием этого файла.
В чем причина того, что отсутствует файл? Причин может быть много. Сюда входит как неправильная установка LibUSB, так и сбой в работе библиотеки при экстренной остановке компьютера, а также многие другие причины, которых насчитывается в общей сложности более десяти. Результат же всегда один — отсутствие файла не дает Вам работать с любимым приложением и Вы не можете, например, перевести Ваш iPhone с помощью ПО на компьютере в режим восстановления. Что делать, если файл не найден?
Пути устранения ошибки с libusb0.dll
Многие пользователи пытаются сразу скачать libusb0.dll бесплатно для Windows и установить его вручную. Более правильным однако является первый вариант действий — переустановить весь пакет библиотеки LibUSB. Последнее сделать несложно, пакет доступен для скачивания в Сети, а его установка предполагает лишь следование подсказкам Мастера установки приложений.
Однако нередко бывает так, что после полной переустановки пакета сообщение об ошибке никуда не девается: файл все также отсутствует. В этом случае логичнее всего прибегнуть ко второму варианту: скачать libusb0.dll и установить его в ручную в необходимую системную папку. Еще один вариант развития событий — это случай, когда файл наличествует, но система постоянно сообщает об его отсутствии. Скорее всего, файл поврежден, а его замена на работоспособный также легко исправит данную ситуацию.
Как установить DLL файл вы можете прочитать на страницы, в которой максимально подробно описан данный процесс.
Источник
Как установить libusb на windows 10
Сначала немного общих слов о пакете (библиотеке) V-USB (старое название AVR USB) компании Objective Development, и библиотеке libusb.
2. Скачайте пакет библиотеки V-USB со странички [2], ищите там кнопку Download. Версия пакета была представлена под именем avrusb-YYYYMMDD.zip. Скачивайте самую последнюю версию. 24 сентября 2008 года я скачал avrusb-20080418.zip размером в 424594 байт.
3. Распакуйте в любое место папку, содержащуюся в архиве. В моем архиве была папка avrusb-20080418, я её распаковал в папку c:avrprj.
Для компиляции firmware и ПО хоста нужны специальные программные пакеты, установку и использование которых рассмотрим далее.
6. Откомпилируем firmware из папки c:avrprjavrusb-20080418exampleshid-custom-rqfirmware. Запустим cmd, перейдем в эту папку (cd c:avrprjavrusb-20080418exampleshid-custom-rqfirmware). Введем команду make, которая откроет файл Makefile в текущей папке и выполнит имеющиеся там команды. Makefile в текущей папке сделан так, что если ввести просто make без параметров, то выведется подсказка:
Для компиляции firmware нужно ввести make hex, что и сделаем:
В результате в текущей папке получим файл main.hex, который и является прошивкой для микроконтроллера. Если у Вас подключен программатор avrdude (Makefile настроен на него), то для программирования кристалла просто введите make program.
Опишу установку драйверов поподробнее, потому что иногда у пользователей библиотеки бывают с этим проблемы, особенно когда они подключают новое USB-устройство к компьютеру, с другими VID и PID (даже если на нем уже ранее была установлена библиотека libusb). Проблема заключается в том, что новому устройству USB (с новыми VID и PID) требуется новый так называемый драйвер фильтра (filter driver). В процессе установки libusb-win32-devel-filter-X.X.X.X как раз и будет предложено установить драйвер фильтра на все обнаруженные USB устройства, а Ваша задача выбрать именно то устройство, которое нужно, и установить драйвер фильтра именно на него. Итак, скачиваем libusb-win32-devel-filter, например libusb-win32-devel-filter-1.2.2.0.exe, и запускаем. На запрос подтверждения запуска (если нельзя проверить издателя) щелкните на кнопку «Выполнить»:
На приветствии визарда установки библиотеки LibUSB-Win32 тупо жмем Next:
На запрос подтверждения принятия лицензии выбираем как обычно «I accept the agreement» и жмем Next:
На окошке «важной информации» тупо жмем Next:
Дальше предложат поменять путь и название папки, в которую будет установлена библиотека. Ничего менять не надо, тупо жмем Next:
Дальше предложат поменять путь и название папки, в которой будут лежать ярлычки. Ничего менять не надо, тупо жмем Next:
На этом установка библиотеки LibUSB завершена. Если оставить галочку «Launch filter installer wizard» и нажать кнопку Finish, то запустится мастер установки драйвера фильтра на найденные USB-устройства. Это важный шаг, который я решил вынести в отдельный раздел 8a.
Теперь должны нормально компилироваться примеры ПО хоста командной строки, предназначенные для GCC. Если компиляция идет с ошибками, то возможно, что у Вас в папке C:Program FilesLibUSB-Win32 не хватает папок include и lib. Можете скачать установленный каталог LibUSB-Win32 полностью по ссылке [9].
8a. Установка драйвера фильтра. Как я уже упоминал, программы ПО хоста, написанные с использованием библиотеки libusb, на платформе Windows общаются с устройствами USB через так называемый драйвер фильтра. Если драйвер фильтра USB-устройства не установлен, то при попытке обращения к USB-устройству Вы можете получить сообщения типа «Could not find USB device «hardctrl-HID» with vid=0x16c0 pid=0x5df» (в этом примере отображены параметры «hardctrl-HID», vid=0x16c0, pid=0x5df, задаваемые в файле usbconfig.h, макросы USB_CFG_DEVICE_NAME, USB_CFG_VENDOR_ID, USB_CFG_DEVICE_ID соответственно). Проблема устраняется установкой драйвера фильтра на устройство. Визард установки драйвера фильтра запускается в процессе установки библиотеки libusb (процесс описан на предыдущем шаге), но можно также запустить визард драйвера фильтра (Filter Wizard) и отдельно из меню запуска программ:
Далее появится окошко, в котором визард отобразит все найденные USB-устройства, на которые можно установить драйвер фильтра библиотеки libusb. Нужно по значениям VID и PID найти в списке наше проблемное USB-устройство, выбрать его и нажать кнопку Install.
Далее произойдет быстрая процедура установки драйвера фильтра:
По окончании установки драйвера фильтра получим соответствующее сообщение. Теперь проблем с обращением к USB-устройству через библиотеку libusb не будет.
9. Попробуем откомпилировать c:avrprjavrusb-20080418exampleshid-custom-rqcommandline (это ПО хоста, которое может управлять нашим устройством USB). Сначала отредактируем файл c:asmavrusb-20080513exampleshid-custom-rqcommandlineMakefile. Эти 2 строки надо закомментировать (комментарий начинается с символа # в начале строки):
далее, нужно изменить пути до файлов библиотеки. Было так:
теперь должно быть так (не спрашивайте меня, почему. Это мне стоило нескольких часов «плясок с бубном»):
Все, теперь можно компилировать. Как обычно, запускаем cmd и переходим в нашу папку (cd c:avrprjavrusb-20080418exampleshid-custom-rqcommandline). Вводим make, без параметров:
10. Теперь нужно собрать USB устройство по одной из схем в папке c:avrprjavrusb-20080418circuits. Можно купить готовую плату AVR-USB-MEGA16 или metaboard, см. [1].
11. Теперь нужно прошить программу в микроконтроллер (прошивку c:avrprjavrusb-20080418exampleshid-custom-rqfirmwaremain.hex). Как это делать, рассказывать не буду, в Интернете полно информации по теме. Ищите по ключевым словам ISP, avrdude, PonyProg, ITAJICE mkII.
12. Подключите Ваше устройство к компьютеру. Если Вы его собрали и прошили правильно, то появится сообщение, что обнаружено новое устройство LEDCtlHID:
а потом еще одно, USB Human Interface Device:
Если посмотреть в Диспетчере Устройств, то в папке Human Interface Devices появится 2 новых устройства:
Если посмотреть свойства USB Human Interface Device, то мы увидим имя LEDCtlHID, которое было задано в макросе USB_CFG_DEVICE_NAME (файл c:avrprjavrusb-20080513exampleshid-custom-rqfirmwareusbconfig.h):
13. Теперь попробуем поуправлять устройством. Сначала запустим set-led.exe без параметров, выведется подсказка:
Теперь мы можем командой «set-led.exe on» зажечь светодиод на макетной плате, а командой «set-led.exe off» его погасить. Наше устройство работает!
На этом все! Остается только изучать пробовать примеры один за другим (примеры описаны на шаге 4), изучать их код, а еще лучше на основе примера сделать собственное USB-устройство и программу для него.
[Устранение проблем]
8. Решение многих проблем описано в статье FAQ [10].
9. Трудности с поиском и закачкой программного обеспечения (MinGW, WinAVR, LibUSB, V-USB)? См. [16].
Источник
libusb0 dll не был найден
Первым делом:
Скачайте библиотеку — скачать libusb0.dll
Затем:
Поместите libusb0.dll в одну из следующих папок:
Если у вас 64-битная версия Windows, то поместите файл в:
«C:WindowsSysWOW64»
Если у вас 32-битная версия Windows, то поместите файл в:
«C:WindowsSystem32»
После этого
Перезагрузите компьютер, чтобы изменения вступили в силу.
Всё равно выдаёт ошибку libusb0.dll не был найден?
Тогда придётся установить этот файл вручную. Для этого:
Зайдите в меню «Пуск».
В строчке поиска введите «cmd». И запустите найденную программу от имени администратора.
В открывшемся окне введите «regsvr32 libusb0.dll «.
После этого снова перезагрузите компьютер. Теперь ошибка должна быть исправлена.
Если что-то не понятно прочитайте более подробную инструкцию — как установить dll файл. скачать dle 11.3
Описание
Автор
Architecture
Название
Размер
: 42496 Byte ( 41.5 KB )
Скачал сам поделись с друзьями. Поддержи сайт.
Нужна помощь в установке libusb0.dll?
Администрация сайта не несет ответственности за ваши действия
В Windows x64 необходимо поместить файл в директорию C:WindowsSysWOW64
Ошибки libusb0.dll
Наиболее распространенные ошибки связанные с файлом.
Файл 0.dll — это файл динамически подключаемой библиотеки. Если быть точным, это компонент библиотеки LibUSB, которая отвечает за работу так называемого «ПО хоста USB», например, за работу программ, обеспечивающих взаимодействие ОС смартфона с операционной системой Вашего персонального компьютера. Ошибка в работе этих программ, сопровождающаяся соответствующим системным сообщением, нередко вызвана отсутствием этого файла.
В чем причина того, что отсутствует файл? Причин может быть много. Сюда входит как неправильная установка LibUSB, так и сбой в работе библиотеки при экстренной остановке компьютера, а также многие другие причины, которых насчитывается в общей сложности более десяти. Результат же всегда один — отсутствие файла не дает Вам работать с любимым приложением и Вы не можете, например, перевести Ваш iPhone с помощью ПО на компьютере в режим восстановления. Что делать, если файл не найден?
Пути устранения ошибки с libusb0.dll
Многие пользователи пытаются сразу скачать libusb0.dll бесплатно для Windows и установить его вручную. Более правильным однако является первый вариант действий — переустановить весь пакет библиотеки LibUSB. Последнее сделать несложно, пакет доступен для скачивания в Сети, а его установка предполагает лишь следование подсказкам Мастера установки приложений.
Однако нередко бывает так, что после полной переустановки пакета сообщение об ошибке никуда не девается: файл все также отсутствует. В этом случае логичнее всего прибегнуть ко второму варианту: скачать libusb0.dll и установить его в ручную в необходимую системную папку. Еще один вариант развития событий — это случай, когда файл наличествует, но система постоянно сообщает об его отсутствии. Скорее всего, файл поврежден, а его замена на работоспособный также легко исправит данную ситуацию.
Как установить DLL файл вы можете прочитать на страницы, в которой максимально подробно описан данный процесс.
Источник
Скачать libusb0.dll
Указанная библиотека реализована на языке программирования Си. Входит в пакет LibUsb. Функции библиотеки предназначены для обеспечения взаимодействия приложений с внешними устройствами по протоколу USB. Первая версия библиотеки разработана под Linux. В последствии появилась реализация под Windows. Библиотека находится в свободном доступе и используется программистами для подключения вышеназванных функции при написании офисных либо служебных приложений.
Ошибка может возникнуть по различным причинам. Файл может быть удален либо некорректно распакован в процессе установки приложения. Как правило, отсутствует файл при некорректном завершении процесса установки приложения. Либо при перезагрузке, связанной с внезапным отключением питания компьютера. Удаление файла могло произойти благодаря аппаратным сбоям, например, наличию поврежденных секторов на жестком диске, программным либо иным воздействиям. Могла быть вызвана в результате некорректной очистки реестра неопытным пользователем.
Для устранения ошибки следует либо установить пакет LibUsb либо скачать libusb0.dll и импортировать его в реестр. Следует убедиться, что библиотека будет корректно работать. Для этого необходимо скачать libusb0.dll бесплатно для Windows либо для иной операционной системы. Вариант переустановки приложения рассматривать не стоит, так как высока вероятность того, что в инсталляционном пакете искомый файл отсутствует. В этом случае переустановка попусту отнимет время, не приведя к желаемому результату. Файл библиотеки будет не найден.
Как исправить ошибку?
Способ 1.
Способ 2.
Это дополнительный вариант исправление данной ошибки, в котором добавляется файлы вручную и производиться их регистрация в системе.
Источник
Русские Блоги
Один, загрузка libusb
На официальном сайте http://libusb.info/ Его можно скачать, как показано ниже:
Загрузите libusb-1.0.22.tar.bz2 внутри
Во-вторых, установка libusb
1. Среда Ubuntu 16.04
2. Установка в основном делится на 3 этапа, а именно:
B: Выполните make для компиляции установочного пакета.
C: выполнить make install для установки
3. Конкретный рабочий процесс:
1) В домашнем каталоге создайте новый каталог libusb (mkdir libusb), как показано ниже:
Разархивируйте libusb-1.0.22.tar.bz2: tar xjvf libusb-1.0.22.tar.bz2
Каталог после распаковки выглядит следующим образом:
Выполните команду, вы обнаружите ошибку выполнения, configure: error: udev support requested but libudev header not installed
—build = i686-linux указать платформу компиляции программного обеспечения
—host = arm-linux Укажите операционную платформу программного обеспечения
—prefix Укажите каталог установки программного обеспечения
Если в Платформа встроенного процессора руки Application, то вам необходимо настроить следующее:
Если он используется на локальном ПК, требуется следующая конфигурация:
5. Выполните команду make install, как показано ниже:
Обычно он может работать нормально, но если текущий пользователь системы является обычным пользователем, будет сообщено об ошибке, как показано ниже:
Сообщение об ошибке заключается в том, что разрешения нет, поэтому вам нужно добавить sudo, поэтому выполните команду, sudo make install
Импорт завершен, как показано ниже:
Libraries have been installed in:
На этом этапе libusb успешно установлен.
Три, тест libusb
В исходном каталоге libusb есть пример папки, в которой содержится исходный файл тестовой программы listdev.c, предоставленный libusb (список устройств USB)
При компиляции мы можем использовать встроенный make-файл для создания исполняемых файлов или использовать следующие операции:
Если во время работы вы столкнетесь со следующими проблемами, решения следующие:
Источник
Toggle the table of contents
From Wikipedia, the free encyclopedia
Initial release | 2007[1] |
---|---|
Stable release |
1.0.26[2] |
Repository | github.com/libusb/libusb.git |
Written in | C |
Type |
|
License | LGPL 2.1 |
Website | libusb.info |
libusb is a library that provides applications with access for controlling data transfer to and from USB devices on Unix and non-Unix systems, without the need for kernel-mode drivers.
Availability[edit]
libusb is currently available for Linux, the BSDs, Solaris, OS X, Windows, Android, and Haiku.[5] It is written in C.
Amongst other applications, the library is used by SANE, the Linux scanner project, in preference to the kernel scanner
module, which is restricted to Linux kernel 2.4.
See also[edit]
- Linux API
- udev
- Video4Linux
References[edit]
- ^ «Initial commit · libusb/Libusb@852bba4». GitHub.
- ^ «Release libusb 1.0.26».
- ^ «ControlGroupInterface». freedesktop.org.
- ^ «libevdev». freedesktop.org.
- ^ «Haiku: Add Haiku support · libusb/Libusb@dc97425». GitHub.
External links[edit]
- Official website
Toggle the table of contents
From Wikipedia, the free encyclopedia
Initial release | 2007[1] |
---|---|
Stable release |
1.0.26[2] |
Repository | github.com/libusb/libusb.git |
Written in | C |
Type |
|
License | LGPL 2.1 |
Website | libusb.info |
libusb is a library that provides applications with access for controlling data transfer to and from USB devices on Unix and non-Unix systems, without the need for kernel-mode drivers.
Availability[edit]
libusb is currently available for Linux, the BSDs, Solaris, OS X, Windows, Android, and Haiku.[5] It is written in C.
Amongst other applications, the library is used by SANE, the Linux scanner project, in preference to the kernel scanner
module, which is restricted to Linux kernel 2.4.
See also[edit]
- Linux API
- udev
- Video4Linux
References[edit]
- ^ «Initial commit · libusb/Libusb@852bba4». GitHub.
- ^ «Release libusb 1.0.26».
- ^ «ControlGroupInterface». freedesktop.org.
- ^ «libevdev». freedesktop.org.
- ^ «Haiku: Add Haiku support · libusb/Libusb@dc97425». GitHub.
External links[edit]
- Official website
Содержание
- Способ 1: Самостоятельная загрузка libusb0.dll
- Способ 2: Обновление драйверов Windows
- Способ 3: Установка последней версии сборки LibUSB
- Способ 4: Ручная регистрация libusb0.dll
- Способ 5: Восстановление системных файлов Windows
- Способ 6: Использование исходников libusb
- Вопросы и ответы
Динамически подключаемая библиотека libusb0.dll не является известной в кругах начинающих пользователей, поскольку практически никто не сталкивается с ней в ходе своего обычного взаимодействия с операционной системой. Большинство узнает об этом файле только при запуске стороннего программного обеспечения, когда на экране появляется уведомление об его отсутствии. В рамках сегодняшнего материала мы бы хотели рассказать все о данном файле и рассмотреть доступные методы решения возникшей неполадки.
Изначально небольшая утилита с графическим интерфейсом под названием LibUSB была предназначена исключительно для формирования файлов форматов INF из информации подключенных USB-устройств. Это помогало пользователям обмениваться драйверами, генерировать их особенные копии или даже использовать в текущей операционной системе. Позже сторонние разработчики начали добавлять элементы этого компонента в свои продукты, переделав функционирование утилиты под формат DLL. Теперь это ПО не пользуется популярностью, однако многие до сих пор задействуют его в своем софте, назначая этому компоненту выполнение определенных опций.
Если по каким-то причинам файл действительно отсутствует, вы можете как найти его самостоятельно в исходниках (Способ 6), так и скачать его отдельно, например, с нашего сайта.
Скачать libusb0.dll
Полученную библиотеку необходимо переместить в основную папку приложения, которое сообщает об отсутствии DLL, или в системную директорию C:WindowsSystem32
или C:WindowsSysWOW64
(отталкивайтесь от разрядности ОС). Возможно, при повторном появлении ошибки, понадобится провести регистрацию файла (Способ 4).
Способ 2: Обновление драйверов Windows
Если вы пропустили предыдущий вариант, обратите внимание не на сам рассматриваемый файл, а на актуальность абсолютно всех драйверов операционной системы, обязательно включая в этот список и периферийные устройств, которые соединяются через USB. Виндовс иногда некорректно понимает ошибку библиотеки, интерпретировав ее по-своему, однако на самом деле файл все это время присутствовал, а его нормальное функционирование невозможно из-за конфликта с другими объектами. Потому вам следует выбрать оптимальный метод и с его помощью проверить наличие апдейтов для каждого оборудования. Детальнее об этом читайте в инструкции далее.
Подробнее: Обновление драйверов в Windows
Способ 3: Установка последней версии сборки LibUSB
Этот вариант подойдет только тем юзерам, кто использует программу LibUSB. Как уже было сказано ранее, ее основное предназначение заключается в создании файлов-драйверов для подключенных USB-устройств. Использование устаревшей версии данного софта может привести к тому, что во время обращения к нему на экране появится уведомление об отсутствии рассматриваемой динамически подключаемой библиотеки. Поэтому обязательным условием использования LibUSB является загрузка последней версии. Сделать это можно на официальном сайте, что выглядит следующим образом:
Скачать LibUSB с официального сайта
- Перейдите по ссылке выше, где нажмите на кнопку «Скачать».
- Загрузка архива начнется автоматически. По завершении его нужно будет распаковать через любой удобный соответствующий софт.
- Для дальнейшего запуска программы требуется перейти в папку «bin».
- Дважды кликните левой кнопкой мыши по находящемуся там исполняемому файлу.
- Ознакомьтесь с информацией о программе и переходите далее, кликнув по кнопке «Next».
- Если уже на этом этапе не возникло никаких неполадок, скорее всего, инсталляция последней версии LibUSB помогла решить существующие неполадки, а значит, можно смело приступать к созданию INF-файлов.
Если вы не ставите перед собой цель работать с рассмотренным софтом, все равно рекомендуется установить его. В некоторых случаях это помогает избавиться от существующей проблемы, однако нет абсолютно никаких гарантий действенности такого варианта.
Способ 4: Ручная регистрация libusb0.dll
Давайте теперь рассмотрим ту ситуацию, когда при инсталляции стороннего софта стандартная процедура регистрации libusb0.dll не произошла или что-то спровоцировало ее сброс. Встречается такое довольно редко, но не стоит исключать возможность появления подобной трудности. Справиться с ней можно самостоятельно, проверив регистрацию и произведя ее заново, что осуществляется путем ввода соответствующих команд в стандартной консоли.
- Запустите «Командную строку» через меню «Пуск». Обязательно делайте это от имени администратора, чтобы не получить уведомление об отсутствии прав для запуска системных утилит.
- После появления привычного окна консоли введите туда команду
regsvr32 /u libusb0.dll
, активировав ее нажатием по клавише Enter. Это действие отменит текущую регистрацию, о чем будет свидетельствовать всплывающее окно. Закройте его и переходите к следующему шагу. - Осталось только написать команду
regsvr32 /i libusb0.dll
, которая создаст повторную регистрацию для динамически подключаемой библиотеки.
После этого рекомендуется сразу же перейти к проверке эффективности способа, поскольку перезагрузка компьютера в этом случае не требуется и изменения вступают в силу сразу же после активации команд. Если это не принесло никакого результата, переходите к рассмотрению следующих инструкций.
Способ 5: Восстановление системных файлов Windows
Существует небольшая вероятность того, что при работе операционной системой произошел какой-либо сбой, вызвавший нарушение целостности важных файлов. Это может привести не только к проблемам с объектом libusb0.dll, но и вызвать более глобальные трудности. К счастью, проверить ОС на подобные повреждения очень просто, ведь все действия за пользователя осуществляют утилиты SFC и DISM. Первая производит исправление системных файлов, а если появляется ошибка, свидетельствующая о повреждении резервного хранилища, следует запустить DISM для его восстановления, а потом уже возвращаться к SFC. Обо всем этом в максимально развернутом виде читайте в руководстве далее.
Подробнее: Использование и восстановление проверки целостности системных файлов в Windows
Способ 6: Использование исходников libusb
На последнее место мы поставили способ, подходящий исключительно для разработчиков программного обеспечения. Его суть заключается в том, чтобы рассказать опытным юзерам о доступности исходников библиотек от libusb. Если во время тестирования софта у вас возникли проблемы с рассматриваемым сегодня файлом, рекомендуем обратить внимание именно на этот пакет последней версии. Сейчас мы не будем останавливаться на правильном его применении в своем проекте, а лишь продемонстрируем банальную процедуру скачивания.
Скачать libusb с GitHub
- Переместитесь на официальный ресурс GitHub, кликнув по ссылке выше. Выберите один из предложенных вариантов загрузки.
- Ознакомьтесь с полным содержимым каталога и нажмите на зеленую кнопку «Clone or download».
- Кликните по «Download ZIP».
- Ожидайте окончания скачивания каталога, а затем откройте его через любой удобный архиватор.
- Теперь вы можете ознакомиться с содержанием пакета и использовать необходимые его элементы при взаимодействии со своим проектом.
Выше мы предложили вашему вниманию шесть возможных вариантов решения неполадки с отсутствием libusb0.dll в Виндовс. Как видите, алгоритм выполнения каждого способа абсолютно разный, поэтому вам следует начать с самого первого и эффективного, постепенно переходя к следующим, если положительного эффекта не будет наблюдаться.
В двух предыдущих статьях мы сделали USB 3.0 систему на базе контроллера FX3. Пришла пора научиться работать с нею из своих программ для PC. Ну, и попутно понять, насколько получившаяся система пригодна для практического применения. Действительно ли ширины канала хватает на весь поток? И не теряются ли единичные байты из потока? Кто хоть немного поработал тестировщиком, не поверит в то, что если система в принципе работает, значит, работает и в деталях. А я на этой должности проработал лет пять, не меньше, поэтому привык проверять всё на практике. В общем, приступаем.
1 Теория о методах доступа к USB
1.1 Windows
Когда новое, доселе неизвестное системе USB-устройство впервые вставлено в ЭВМ, работающую под управлением Windows, оно отображается в диспетчере устройств с жёлтым знаком вопроса. Это связано с тем, что Windows обязательно нужен драйвер для работы с ним. Давайте я немного порассуждаю про эти драйверы, но не с научной точки зрения, а как инженер, раскрыв чисто практические аспекты, но несколько упростив теорию. Потому что мне не нужно, чтобы все уснули. Мне нужно, чтобы суть была понятна, так что ряд скучных деталей придётся опустить.
1.1.1 Драйверы, работающие на функциональном уровне
Что такое USB-устройство? Это набор конечных точек. Но прикладному программисту, если честно, эти точки не интересны. Давным-давно, ещё в прошлом тысячелетии, когда последовательные порты делались на микросхеме UART16550, под неё был сделан функциональный драйвер для Windows, и все прикладные программисты привыкли работать с абстракциями именно этого драйвера. И с этой привычкой трудно спорить. Представим на минутку, что с переходником USB-COM придётся работать в USB-шном стиле, на уровне конечных точек. Есть идеология CDC: две конечных точки туда-обратно, одна точка статуса в режиме прерываний и определённый набор команд, подаваемых через конечную точку EP0. Это всё описано в стандартах, относящихся к USB.
Всё? Нет, некоторым этого мало! Prolific сделала свой набор команд для точки EP0, не совместимый с CDC. А FTDI – свой. Он не совместим ни с CDC, ни с Prolific. Так что, если бы прикладной программист работал бы с переходниками USB-COM на уровне конечных точек, ему пришлось бы нелегко. К счастью, Prolific и FTDI предоставляют функциональные драйверы для своих чипов, а для CDC функциональный драйвер разработала сама Microsoft и прилагает его в составе Windows. Поэтому прикладной программист понятия не имеет, как работать с конкретным переходником (помню, мы целый NDA лет 15 назад с FTDI подписывали, чтобы получить от них руководство по их командам, причём я сразу же им послал информацию об ошибке в документе, так как пока работали бюрократы, я через дизассемблер всё сам уже успел изучить, так что сразу нашёл несовпадение их описания с моим). На прикладном уровне драйверы всех упомянутых производителей дают интерфейс такой же, как и при работе со старым добрым UART16550.
То же касается и USB-накопителей. Мало кто знает, что физически там две конечных точки. Почти никому не интересно, как там надо гонять пакеты, чтобы посылать команды и данные. Как разруливать ошибки, знает ещё меньше людей. Все работают через драйвер usbstor.sys, предоставляемый Microsoft, который обеспечивает работу точно так же, как и с дисками, подключёнными через локальную шину материнской платы.
Удобно? Однозначно! Но вот мы сделали своё устройство, не совместимое по логике работы ни с каким из стандартных. И что нам теперь, всенепременно писать для него персональный драйвер?
Не обязательно. Если нас устраивает работа на прикладном уровне через конечные точки, то уже имеется целый ряд готовых драйверов, которые позволяют общаться с устройством через них. Некоторые из них мы сейчас и рассмотрим.
1.1.2 CyUSB
С этим драйвером я познакомился раньше других. Было это 12 лет назад. Вот с него и начну рассказ. Правда, скажу лишь вскользь. Фирма Cypress, выпуская замечательные контроллеры FX2LP, просто обязана была сделать драйвер, работающий на уровне конечных точек, чтобы облегчить жизнь своим клиентам. И она его сделала. Кому интересно – ищите по слову CyAPI. Это DLL-ка, предоставляющая ряд функций для прикладного программиста. Я как системщик старался обойтись без DLL, поэтому сделал себе библиотеку, работающую с драйвером на уровне IOCTL запросов.
Главный недостаток данной библиотеки заключается в её лицензионном соглашении. Её можно использовать только с контроллерами Cypress. А чтобы всё было убедительнее, начиная с некоторых версий, драйвер стал просто зависать, если он работает с контроллерами других производителей. По крайней мере, старые версии с AT90USB работали, а более свежие – нет. Поэтому я решил, что не буду пользоваться данным драйвером. Даже написал свой… Но вскоре обнаружился замечательный готовый вариант от Microsoft, и я перешёл на него.
1.1.3 WinUSB
Этот драйвер уходит своими корнями в инфраструктуру UMDF. Когда фирма Microsoft работала над возможностью запускать драйверы на пользовательском уровне защиты, они сделали специальный драйвер-прослойку WinUSB. Но через этот же драйвер можно работать и из обычных прикладных программ, а не только из UMDF-драйверов. Кому интересно – вбейте в поиск WinUSB API. Через эту функциональность можно делать то же самое, что и через CyUSB, но с контроллерами любых производителей.
Сам драйвер входит в состав Windows, поэтому в Win7 его можно было вообще ставить без каких-либо проблем с подписыванием. Можно было создать по инструкции от Microsoft или найти и скачать готовый inf файл, поменять в нём VID/PID на свои и установить. К сожалению, начиная с WIN8, обязательно надо подписывать не только сам драйвер, но и INF файл. Однако никто не мешает поправить VID/PID у устройства на тот, который будет найден. Вот у меня есть вот такой подписанный inf файл.
Посмотреть inf файл
;
; Android WinUsb driver installation.
;
[Version]
Signature = "$Windows NT$"
Class = AndroidUsbDeviceClass
ClassGuid = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider = %ProviderName%
DriverVer = 06/06/2017,2.0.0010.00003
CatalogFile.NTx86 = MT16_x86.cat
CatalogFile.NTamd64 = MT16_x64.cat
;
; This section seems to be required for WinUsb driver installation.
; If this section is removed the installer will report an error
; "Required section not found in INF file".
;
[ClassInstall32]
Addreg = AndroidWinUsbClassReg
[AndroidWinUsbClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,"-26"
[Manufacturer]
%ProviderName% = Google, NTx86, NTamd64
[Google.NTx86]
%CompositeAdbInterface1% = USB_Install, USBVID_1234&PID_0001
%CompositeAdbInterface2% = USB_Install, USBVID_1234&PID_0002
%CompositeAdbInterface3% = USB_Install, USBVID_1234&PID_0003
%CompositeAdbInterface5% = USB_Install, USBVID_1234&PID_0005
%OldBox% = USB_Install, USBVID_4844&PID_8816
%HIDkey% = USB_Install, USBVID_A1A2&PID_2001
[Google.NTamd64]
%CompositeAdbInterface1% = USB_Install, USBVID_1234&PID_0001
%CompositeAdbInterface2% = USB_Install, USBVID_1234&PID_0002
%CompositeAdbInterface3% = USB_Install, USBVID_1234&PID_0003
%CompositeAdbInterface5% = USB_Install, USBVID_1234&PID_0005
%OldBox% = USB_Install, USBVID_4844&PID_8816
%HIDkey% = USB_Install, USBVID_A1A2&PID_2001
[USB_Install]
Include = winusb.inf
Needs = WINUSB.NT
[USB_Install.Services]
Include = winusb.inf
AddService = WinUSB,0x00000002,WinUSB_ServiceInstall
[WinUSB_ServiceInstall]
DisplayName = %WinUSB_SvcDesc%
ServiceType = 1
StartType = 3
ErrorControl = 1
ServiceBinary = %12%WinUSB.sys
[USB_Install.Wdf]
KmdfService = WINUSB, WinUSB_Install
[WinUSB_Install]
KmdfLibraryVersion = 1.7
[USB_Install.HW]
AddReg = Dev_AddReg
[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"
[USB_Install.CoInstallers]
AddReg = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles
[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"
[CoInstallers_CopyFiles]
WinUSBCoInstaller2.dll
WdfCoInstaller01009.dll
[DestinationDirs]
CoInstallers_CopyFiles=11
[SourceDisksNames]
1 = %DISK_NAME%,,,i386
2 = %DISK_NAME%,,,amd64
[SourceDisksFiles.x86]
WinUSBCoInstaller2.dll = 1
WdfCoInstaller01009.dll = 1
[SourceDisksFiles.amd64]
WinUSBCoInstaller2.dll = 2
WdfCoInstaller01009.dll = 2
[Strings]
ProviderName = "GM Software"
CompositeAdbInterface1 = "MT16 Device"
CompositeAdbInterface2 = "MT16 Ports 1-5"
CompositeAdbInterface3 = "MT16 Ports 12-16"
CompositeAdbInterface5 = "TBR Flasher"
OldBox = "Old MT16 Box"
HIDkey = "HID Dongle via WinUSB"
WinUSB_SvcDesc = "MT16 COM Ports"
DISK_NAME = "MT16 Driver Installation Directory"
ClassName = "MT16 USB Devices"
Раньше таких inf файлов на просторах сети было много. Андроид-телефоны через них подключались. Сейчас надо искать по слову WinUSB.sys внутри. Ну, или «ServiceBinary = %12%WinUSB.sys».
Я поправил «Прошивку» для FX3 вот так:
То же самое текстом.
const uint8_t CyFxUSB30DeviceDscr[] __attribute__ ((aligned (32))) =
{
0x12, /* Descriptor size */
CY_U3P_USB_DEVICE_DESCR, /* Device descriptor type */
0x00,0x03, /* USB 3.0 */
0x00, /* Device class */
0x00, /* Device sub-class */
0x00, /* Device protocol */
0x09, /* Maxpacket size for EP0 : 2^9 */
#ifdef CY_VID_PID
0xB4,0x04, /* Vendor ID */
0xF1,0x00, /* Product ID */
#else
0x34,0x12, /* Vendor ID */
0x05,0x00, /* Product ID */
#endif
…
И теперь могу собирать варианты хоть под CyUSB, хоть под WinUSB с привязкой к имеющемуся у меня inf файлу. А так — можно перевести ОС в режим, не требующий подписывания драйверов, хоть это и не очень удобно.
1.1.4 Библиотека libusb
Вариант с WinUSB отличный, но не кроссплатформенный. Насколько мне известно, под Linux нет точно такого же API, который предоставляет Microsoft для Windows. Кроссплатформенный вариант – это использование библиотеки libusb. Причём под Windows эта библиотека по умолчанию опирается на всё тот же драйвер WinUSB. Нашли драйвер, накатили его на устройство. Скачали библиотеку, начали через неё работать с этим драйвером. Надо будет – через неё же можно будет работать и под Linux. Замечательно? Да. Особенно если мы разработали полностью своё устройство. Но, увы, я просто обязан указать недостаток данного метода для общего случая.
Когда мы устанавливаем на устройство драйвер WinUSB, мы убираем оригинальный драйвер. В рамках данного блока статей мы теряем возможность общаться с нашим устройством при помощи утилиты ControlCenter. Ну, и я не упоминал в статьях про утилиту Streamer, позволяющую измерять скорость устройства… В общем, ею мы тоже не сможем пользоваться, если заменим штатный драйвер на WinUSB.
В рамках другой задачи мне надо было экспериментировать с аудиоустройствами из своего приложения. При этом я не хотел постигать все тонкости работы с ними. Я хотел только некоторые команды подавать, а чтобы всё остальное за меня делала сама операционка. Но если бы я посадил устройства на WinUSB, ОС бы потеряла контроль над ними и не могла бы оказывать мне всемерное содействие.
Можно ли работать из прикладной программы с устройствами, не пересаживая их на специальный драйвер? В принципе, да (правда, это очень аккуратное утверждение). Давайте я покажу этот метод… Правда, в конце — сильно раскритикую его.
1.1.5 Драйвер UsbDk
Библиотека libusb существует в двух версиях. Версия 0.1 и версия 1.0. Обе версии в настоящее время развиваются, создавая некоторую путаницу. И вот версия 1.0 может работать не только через драйвер WinUSB, но и через драйвер UsbDk. Последний является фильтр-драйвером. Что такое фильтр-драйверы? Вспоминаем детство, сказку о царе Салтане:
Собственно, фильтр-драйвер встаёт на пути IRP-пакетов от прикладной программы к основному драйверу и обратно. IRP — это гонцы, которые бегают туда-сюда. А фильтр-драйвер может их пропустить, не изменяя, а может подменить их содержимое. Он придуман для исправления ошибок, чтобы не менять основной драйвер, а просто немножко подправить пакеты, дабы те не вызывали проблем. Их можно править на прямом и на обратном пути. Но в целом, никто не мешает через этот фильтр-драйвер запустить в основной драйвер запросы от приложения, которое общается именно с фильтром. И UsbDk этим и занимается.
Очень схематично, опустив ряд неважных подробностей, это можно показать так:
Вот тут мы видим, что фильтр-драйвер UsbDK подсел на пути пакетов к нашему устройству (на самом деле, он подсел на пути ко всем USB-устройствам, так как прицепился к драйверу класса USB):
Если при открытии библиотеки libusb 1.0 сказать:
libusb_init(&m_ctx);
libusb_set_option(m_ctx, LIBUSB_OPTION_USE_USBDK);
то она будет использовать в качестве основы не WinUSB, а UsbDk. Ура? Не совсем. Приведу минимум две проблемы, создаваемые при использовании данного пути.
Первая проблема организационная. Если мы запустили программу, поработали, вышли, то всё будет хорошо. Но вот мы запустили программу, начали работать, а потом почему-то прервались. Да хоть у меня стояла точка останова, исполнение прервалось, я осмотрел переменные, увидел, что программа работает неверно, и завершил её. Могу я так сделать? Дело-то житейское при разработке программы. Или просто зациклилась она. В общем, мы её прервали. Снова запускаем – устройство уже не открывается. Смотрим код ошибки – он очень интересный.
Driver file operation error. DeviceIoControl failed (Cannot create a file when that file already exists. Error code = 183)
Cannot Open USB Device
И всё. Выдёргивать-вставлять USB-кабель – бесполезно. Только полная перезагрузка Windows спасёт Отца Русской Демократии. Когда перезапускаешься третий-четвёртый раз за час – это начинает несколько раздражать. Поиск в сети не дал никаких результатов. Попытка бегло осмотреть исходники UsbDk – тоже, а на детальные разбирательства нет времени. Может, кто в комментариях чего подскажет…
Но на самом деле, эта проблема раздражает, но не является фатальной. Вторая проблема более серьёзная. Вот я поставил VirtualBox. Я просто запустил виртуальную машину и хочу подключить к ней, скажем, бластер. И что получаю?
Аналогично – любое другое устройство.
Поиск по сети даёт много вариантов типа: «У меня всё заработало после того, как я потёр заячьей лапкой по бубну из кожи тушканчика, спрыснутому кровью семидесятидвухлетней девственницы, полученной…» … Что там дальше в рецепте — сейчас уже не помню… Тем более, мне он не помог… Более осмысленные рекомендации требуют сносить фильтр-драйверы USB, пока не полегчает. Проблема уходит, когда сносишь именно UsbDK. Ну, значится, так тому и быть. Хотя для экспериментов с аудио, других приемлемых вариантов я не нашёл. Так что драйвер я снёс, но дистрибутив – оставил. Пригодится. Именно поэтому описываю эту методику. Ну, и вдруг кто в комментариях подскажет, как обходить эти две проблемы. Тогда станет совсем здорово.
1.1.6 Итого
Итого, сегодня мы будем работать через библиотеку libusb, посадив устройство на драйвер WinUSB. Да, мы потеряем возможность работать с устройством через стандартные приложения от Cypress. Зато всё будет стабильно и хорошо.
1.2 Linux
1.2.1 Драйвер
Я уже много раз писал, что не очень сильно разбираюсь в уходе за пингвинами, поэтому просто перескажу слова своего начальника, опрошенного специально для написания данной статьи.
Некоторые устройства уже поддержаны в Линуксе по классу, либо по VID/PID. Вот, скажем, я подключил макетную плату ICE40 с ПЛИС Latice и подал сначала команду lsusb, чтобы увидеть USB устройства, а затем – уже полюбившуюся нам по прошлым статьям команду:
ls –l /dev/serial/by-path, чтобы увидеть, что мост фирмы FTDI сам прикинулся двумя последовательными портами.
С такими устройствами, если ничего не предпринимать, можно работать только на функциональном уровне. Однако, если функциональный драйвер не подключился, как уверяет начальник, в отличие от Windows такие устройства не станут неизвестными (а потому недоступными). Напротив, с ними можно сразу и без какой-либо подготовки работать через библиотеку libusb. А разработанное нами устройство относится к таковым. Поэтому никакой подготовки для начала работы не требуется. Надеюсь, начальник меня не обманул.
Правда, есть чисто организационная подготовка, которую мы вынесем в собственный раздел.
1.2.2 Отключение требований прав администратора при работе с USB-устройствами
Главная особенность USB-устройств в Linux состоит в том, что по умолчанию для доступа к ним надо обладать правами администратора. То есть, для сборки «прошивки» для ПЛИС ICE40 (к теме статьи они не относятся, но по проекту я сейчас их осваиваю, причём под Linux, так что скриншоты готовить проще для них) мне достаточно набрать make, а вот если для «прошивки» я наберу make prog, то получу такое сообщение:
Не хватает прав. Надо набирать sudo make prog.
Чтобы понизить требуемые права, надо прописать правила. А чтобы быстро выяснить, как их прописать, я обычно даю такой запрос Гуглю:
Usb blaster Linux
Ссылок будет много, все они разной степени шаманства. Вот более-менее подробная ссылка:
Using USB Blaster / USB Blaster II under Linux | Documentation | RocketBoards.org
Что сразу бросается в глаза: имена файлов с правилами для Debian и для Ubuntu разные.
/etc/udev/rules.d/92-usbblaster.rules и /etc/udev/rules.d/51-usbblaster.rules, соответственно.
Всё тот же начальник, а по совместительству – любитель Линукса, объяснил, что если в нескольких файлах есть правила для одного и того же устройства, число задаёт приоритет разбора файлов. Собственно, документ также говорит, что число 92 базируется на том, что в системе имеется файл /lib/udev/rules.d/91-permissions.rules.
Вообще, мне стало интересно, и я вбил в Гугля строку поиска
/etc/udev/rules.d/
Он нашёл мне много статей про udev. Некоторые более теоретические. Некоторые слишком практические. Пересказывать их не вижу смысла. При желании вы можете погуглить сами. Дам только ссылку на статью, которая мне кажется хорошо сбалансированной по теории и практике:
Igorka: Знакомство с udev в ubuntu
Итак. Иду в каталог /etc/udev/rules.d. Вижу файл 70-snap.snapd.rules, в котором есть правило, относящееся ко всем FTDI чипам:
FTDI-based serial adapters:
# FTDI does USB to serial converter ICs; and it's very likely that they'll
# never do modems themselves, so it should be safe to add a rule only based
# on the vendor Id.
ATTRS{idVendor}=="0403", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1"
Не понимая до конца, что творю, запускаю не просто mc, а sudo mc и в его редакторе создаю файл /etc/udev/rules.d /71-ice40.rules со следующим содержимым:
#FTDI Programmer for latice
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666"
Закрываю терминал с админскими правами, открываю новый, с правами обычными. Отключаю-включаю устройство, и… Вуаля! Оно уже доступно без прав администратора!
Поэтому можете просто повторить мои шаманства, можете – почитать теорию по ссылкам, после чего у вас всё получится уже с пониманием физики процесса. А так – в рамках данной статьи я буду работать только через Windows, но через кроссплатформенную библиотеку libusb версии 1.0 (не путать с 0.1). Поэтому в Линуксе прописывать правила для устройства FX3 не буду.
2 Практика
Ох, и огромный сегодня получился теоретический раздел! Но наконец, мы владеем достаточным количеством знаний, чтобы приступить к опытам. Напомню, я буду работать в ОС Windows, пользуясь библиотекой libusb 1.0, опираясь на драйвер WinUSB. Я сейчас осваиваю работу с кроссплатформенной библиотекой Qt, поэтому буду разрабатывать код под неё.
2.1 Добавляем libusb в проект
Я скачал библиотеку libusb и распаковал её в каталог своего проекта. Чтобы подключить её к проекту, в файл *.pro пришлось добавить блок:
win32:{
LIBS += D:/Work/AS/2020/teensy/Qt/UsbSpeedTest/LibUSB/MinGW64/static/libusb-1.0.a
}
Кто сказал, что абсолютные пути – зло? Золотые слова! Я тоже так считаю. Но я уйму времени убил на эксперименты с относительными путями в этом месте. Ничего не получалось. Поэтому пока сделал так. Если кто-то знает тайну, как в проект добавляются относительные пути, да ещё так, чтобы работали, буду премного благодарен за разъяснения. А пока – отмечаю, что такой вариант работает, но однозначно является злом, так как он работает только у меня и только, пока я не соберусь перенести проект куда-то. Собственно, всё. Библиотека добавлена и готова к работе.
2.2 Класс для доступа к библиотеке
Обычно примеры для статей я пишу в слитном стиле. Но сегодняшний код получился несколько запутанным, поэтому пришлось вынести работу с платой FX3 в примитивный класс. Вот его интерфейсная часть:
#ifndef CUSBTESTER_H
#define CUSBTESTER_H
#include "./LibUSB/libusb.h"
class CUsbTester
{
public:
CUsbTester();
~CUsbTester();
virtual bool ConnectToDevice();
virtual void DisconnectFromDevice();
libusb_device_handle* m_hUsb;
protected:
libusb_context * m_ctx = NULL;
};
#endif // CUSBTESTER_H
По функциям мы ещё пройдёмся, а пока я отмечу то, что у класса есть переменная-член, хранящая указатель на контекст, который будет нужен для вызова некоторых функций тонкой настройки библиотеки, и манипулятор (в простонародии — хэндл) устройства, необходимый для обращения к устройству.
В конструкторе происходит инициализация и тонкая настройка библиотеки:
//#define CY_VID_PID
CUsbTester::CUsbTester()
{
libusb_init(&m_ctx);
#ifdef CY_VID_PID
libusb_set_option(m_ctx, LIBUSB_OPTION_USE_USBDK);
#endif
libusb_set_option(m_ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
m_hUsb = 0;
}
Как видим, возможна работа библиотеки через драйвер CyUSB и фильтр UsbDk, но сейчас она отключена. И мы включаем расширенную диагностику работы библиотеки. Все сообщения о проблемах будут сыпаться в окно отладочного вывода. Помните, я показывал сообщение об ошибке при работе UsbDk? Без этой опции никто бы ничего не узнал. Ошибка и ошибка.
Деструктор, соответственно, всё деинициализирует. Класс тестовый, заботиться о наличии дополнительных пользователей библиотекой нет смысла. Так что просто деинициализируем и всё.
CUsbTester::~CUsbTester()
{
DisconnectFromDevice();
libusb_exit(m_ctx);
}
Подключение к устройству интересно лишь тем, что может работать по разным парам VID/PID. Как я уже говорил, я могу собирать «прошивку» под штатные VID/PID от Cypress, если идёт работа через UsbDk, и под те, на которые у меня нашёлся inf-файл, устанавливающий драйвер WinUSB. В остальном, ничем не примечательные типовые вызовы функции библиотеки libusb:
bool CUsbTester::ConnectToDevice()
{
#ifdef CY_VID_PID
m_hUsb = libusb_open_device_with_vid_pid(m_ctx,0x4b4,0xf1);
#else
m_hUsb = libusb_open_device_with_vid_pid(m_ctx,0x1234,0x0005);
#endif
if (m_hUsb == 0)
{
qDebug()<<"Cannot Open USB Device";
return false;
}
int res = libusb_claim_interface(m_hUsb,0);
if (res != 0)
{
qDebug()<<"Cannot claim interface - "<<libusb_error_name(res);
}
return true;
}
Ну, и отключаемся от устройства тоже типовым методом:
void CUsbTester::DisconnectFromDevice()
{
if (m_hUsb != 0)
{
libusb_release_interface(m_hUsb,0);
libusb_close(m_hUsb);
m_hUsb = 0;
}
}
Собственно, всё. Функцию чтения из устройства я буду вызывать напрямую. Это противоречит принципам проектирования классов, но для опытов сойдёт. Я просто заметил, что код инициализации сильно разросся и отделил его от основного кода, вынеся в класс. А чтение — оно в одну строку выполняется, его отделять было не нужно.
2.3 Тестовая программа
Программа состоит из функции main() и тестовой функции.
Тестовая функция делится на две части. Первая часть измеряет скорость передачи данных. Вторая — проверяет то, что данные из счётчика приходят с инкрементом. При обнаружении разрыва – сведения об этом выдаются в консоль отладочного вывода. Собственно, вот текст функции:
bool TestStep(CUsbTester& tester,uint16_t* pData, const int bytesCnt)
{
bool bResult = true;
qDebug() << "Testing...";
QElapsedTimer timer;
timer.start();
int actualLength;
int res = libusb_bulk_transfer(tester.m_hUsb,0x81,(uint8_t*)pData,bytesCnt,&actualLength,10000);
if (res != 0)
{
qDebug() << libusb_error_name(res);
return false;
}
quint64 after = timer.elapsed();
qDebug() << "Read Result = " << res;
qDebug() << "Actual Length = " << actualLength;
qDebug() << "Time = " << after;
double speed = bytesCnt/after;
qDebug() << speed << "Bytes / Sec";
uint16_t prevData = pData[0];
for (int i=1;i<bytesCnt/2;i++)
{
if (pData[i] != ((prevData + 1)&0xffff))
{
qDebug() << Qt::hex << i << " : " << prevData << ", " << pData[i];
}
prevData = pData[i];
}
return bResult;
}
В будущем я планирую вызывать эту функцию многократно, но пока — функция main() вызывает её один раз:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
CUsbTester tester;
if (tester.ConnectToDevice())
{
QByteArray ar1;
ar1.resize(128*1024*1024);
for (int i=0;i<1;i++)
{
TestStep (tester,(uint16_t*)ar1.constData(),ar1.size());
}
tester.DisconnectFromDevice();
}
return a.exec();
}
Собственно, и вся программа.
2.4 Результат тестового прогона
2.4.1 Скорость
При тестовом прогоне мы видим, что скорость близка к требуемой. Напомню, что источник гонит 16-битные данные на скорости 60 МГц, так что нам требуется поток 120 миллионов байт в секунду. Когда на временных диаграммах наблюдался огромный дефицит колбасы, скорость была всего 30 Мегабайт в секунду. Даже меньше, чем практически достижимая скорость на шине USB 2.0. Так что текущие результаты вполне приемлемые.
Правда, чтобы окончательно успокоиться, я решил немного поэкспериментировать со скоростью. Чаще всего она была равна 119 0XX XXX байт в секунду. Изредка – 119 4XX XXX. Ну, и совсем редко – промежуточные значения, похожие на указанные выше. Сначала я решил, что это могут быть ошибки округления. У нас идёт округление показаний таймера, и возникают округления при делении. Тогда я переписал вычисление скорости так (перешёл на наносекунды и стал умножать перед делением, чтобы минимизировать ошибку округления):
QElapsedTimer timer;
int actualLength;
timer.start();
int res = libusb_bulk_transfer(tester.m_hUsb,0x81,(uint8_t*)pData,bytesCnt,&actualLength,10000);
quint64 after = timer.nsecsElapsed();
if (res != 0)
{
qDebug() << libusb_error_name(res);
return false;
}
qDebug() << "Read Result = " << res;
qDebug() << "Actual Length = " << actualLength;
qDebug() << "Time = " << after;
quint64 size = bytesCnt;
size *= 1000000000;
quint64 speed = size/after;
qDebug() << speed << "Bytes / Sec";
Результат ничуть не изменился. Следующее подозрение было, что источник имеет некоторую ошибку кварцевого резонатора и шлёт данные чуть медленнее, чем надо. Но другая плата даёт точно такие же показания! Значит, дело не в экземпляре. Мало того, осциллограф (правда, весьма дешёвый китайский) говорит, что тактовая частота нисколько не занижена, даже чуть завышена.
Тогда я полез в исходники библиотеки libusb и просто-таки утонул в коде, который исполняется при ожидании конца передачи данных. Там такая цепочка функций – просто закачаешься! И много, где может возникать задержка. Но давайте прикинем, какова задержка.
120 мегабайт в секунду… Округлим до ста. Это 1 мегабайт в 10 миллисекунд. А у нас просадка как раз на 1 мегабайт. Неужели начало и конец прокачки съедают так много времени? Как бы проверить хотя бы начерно? Я решил переписать на пробу код под прямой вызов WinUSB API. Полностью объяснять я его не стану, там устройство открывается хитро, через SetupDi API. Я просто воспользовался готовыми своими старыми классами, поэтому всё было сделано под Visual Studio. Но вместо страшных километровых текстов ожидания завершения библиотеки WinUSB, моя функция чтения выглядит вполне канонически:
int CWinUSBConnector::ReadViaBulk (void* pData,int count,int timeOut)
{
DWORD dwRead;
ResetEvent (m_hEvRead);
if ((!WinUsb_ReadPipe (m_hUsbDrive,m_nReadEP,(BYTE*)pData,count,&dwRead,&m_ovRead)) && (GetLastError() != ERROR_IO_PENDING))
{
return -1;
}
if (WaitForSingleObject(m_hEvRead,timeOut)!=WAIT_OBJECT_0)
{
WinUsb_AbortPipe (m_hUsbDrive,m_nReadEP);
return -2;
} else
{
WinUsb_GetOverlappedResult (m_hUsbDrive,&m_ovRead,&dwRead,FALSE);
}
return dwRead;
}
А тест теперь выглядит так:
#include <iostream>
#include <windows.h>
#include "./USB/WinUSBConnector.h"
CWinUSBConnector m_connector;
int main()
{
std::cout << "Hello World!n";
if (m_connector.Open() != 0)
{
std::cerr << "Cannot Open Driven";
return 1;
}
LARGE_INTEGER Frequency;
QueryPerformanceFrequency(&Frequency);
static const UINT64 cnt = 128 * 1024 * 1024;
BYTE* pData = new BYTE [cnt];
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
QueryPerformanceCounter(&StartingTime);
UINT64 realSize = m_connector.ReadViaBulk(pData, (int)cnt, 10000);
QueryPerformanceCounter(&EndingTime);
if (realSize != cnt)
{
std::cerr << "Cannot Read Datan";
return 2;
}
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
UINT64 bytesPerSeconds = (cnt*1000000LL) / ElapsedMicroseconds.QuadPart;
std::cout << "Test Finished! " << bytesPerSeconds << " Bytes per second n";
delete[] pData;
return 0;
}
Теперь скорость стабильно находится в районе 119 2XX XXX байт в секунду. Вот какой красивый результат я подловил для красного словца:
А вот результат нескольких прогонов подряд:
В общем, никто не запрещает просадке возникать и на входе-выходе в функцию чтения. Если разрывов в показаниях счётчика не будет, то и ладно.
2.4.2 Пропуски в показаниях счётчика
Но на тему разрывов у нас тоже имеется пара строк в выводе основной тестовой программы:
Имеется два нарушения последовательности счёта. Неужели мы нарвались на выпадение данных? К счастью, всё в порядке. Множественные прогоны говорят, что проблемы всегда в одном и том же месте. И мы с таким уже сталкивались в одной из старых статей. У нас есть две точки буферизации данных: буфер контроллера и FIFO в ПЛИС. Готовы ли мы принимать данные или нет, они с выхода счётчика будут заливаться в буфер FX3. Когда тот переполнится, заливка остановится. Кроме буфера FX3, есть ещё FIFO в ПЛИС. Вот у нас и имеется две ёмкости, которые заполнились, но счётчик продолжил работу. При чтении мы увидели разрывы в счёте.
Соответственно, мы наблюдаем явление переходных процессов. При реальной работе надо будет настроить источник так, чтобы он не заполнял буфер данными, пока мы не готовы их принимать (собственно, в статье про голову USB-Анализатора мы уже делали такую функцию через добавление бита «Go»), а пока – просто будем игнорировать ошибки в этой области. Считаем, что это – не баги, а фичи. Меняем проверку разрывов на такую:
То же самое текстом.
int from = 0xc001;
uint16_t prevData = pData[from];
for (int i=from+1;i<bytesCnt/2;i++)
{
if (pData[i] != ((prevData + 1)&0xffff))
{
qDebug() << Qt::hex << i << " : " << prevData << ", " << pData[i];
}
prevData = pData[i];
}
Делаем массовый прогон для такого варианта… И тут я понял, кто даёт задержку… Отладочный вывод!!! Вот так всё выглядит:
Масса вспомогательных текстов, выдаваемых библиотекой. Ну и отлично. Закомментируем в конструкторе класса, обслуживающего libusb, строку:
// libusb_set_option(m_ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
Получаем красоту, ничем не отличимую от того, что мы получали при прямом вызове WinUSB API (жаль только, что не идеальный результат):
Но главное – нет сообщений про разрывы в показаниях счётчика (известные точки разрывов мы игнорируем).
А что там нам про таймауты промежуточные говорили? Попробуем читать не 128, а 32 мегабайта! Получаем уже скорость вплоть до 119 8XX XXX мегабайт в секунду!
В общем, всё хорошо… Кроме одного. Я нашёл такой нестандартный вариант теста, при котором штатная «прошивка» FX3 подвисает. Но статья получилась такой большой, что как это найти, а главное – как исправить, я расскажу в следующий раз.
3 Заключение
Мы познакомились с теоретическими особенностями работы с USB устройствами в ОС Windows и Linux, а также получили практический навык работы с кроссплатформенной библиотекой libusb. Начерно, разработанное USB 3.0 устройство на базе контроллера FX обеспечивает требуемый поток данных для приёма данных из микросхемы ULPI без промежуточного их сохранения в SDRAM. В потоке не выявлено разрывов, то есть, протокол передачи с виду устойчивый. Автор утверждает, что выявил принципиальную проблему в системе, но выносит её обсуждение в следующую статью.