Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

libusb1.0 Windows

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Всем привет.

Пытаюсь тут научиться работать с USB. Но что-то я не то делаю. libusb-1.0.20 (c SF брал).
Вот код:

#include <stdio.h>
#include <libusb-1.0/libusb.h>

int main(int argc, char *argv[])
{
	struct libusb_device **devs;
	struct libusb_device_descriptor info;
	unsigned count,i;

	int rv=0;
	if (libusb_init(NULL)<0)
	{
		printf("Can't open libusb\n");
		return 1;
	}
	libusb_set_debug(NULL, libusb_log_level::LIBUSB_LOG_LEVEL_INFO);

	count=libusb_get_device_list(NULL,&devs);
	if (count<=0)
	{
		printf("Error enumerating devices\n");
		return 2;
	}

	for (i=0;i<count;i++)
	{
		libusb_get_device_descriptor(devs[i],&info);
		printf("VID=%04x PID=%04x\n",info.idVendor,info.idProduct);
		if (info.idVendor==0x1915 && info.idProduct ==0x7777)
		{
			libusb_device_handle* hndl;
			libusb_open(devs[i], &hndl);
			if (hndl != NULL)
			{
				printf("Opened\n");
				rv = libusb_set_configuration(hndl, 1);
				if (rv != LIBUSB_SUCCESS)
					printf("Error libusb_set_configuration: %s\n", libusb_strerror(libusb_error(rv)));
				else
				{
					rv = libusb_claim_interface(hndl, 0);
					if (rv != LIBUSB_SUCCESS)
						printf("Error libusb_claim_interface: %s\n", libusb_strerror(libusb_error(rv)));
					else
					{
						printf("Claimed\n");
						libusb_release_interface(hndl, 0);
					}
				}
				libusb_close(hndl);
			}
		}
	}

	libusb_free_device_list(devs,1);
	libusb_exit(NULL);
	return rv;

}

И при попытке установить конфигурацию получаю следующее:

libusb: error [winusbx_claim_interface] could not access interface 0: [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 1 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 2 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 3 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 4 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 5 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 6 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 7 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 8 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 9 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 10 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 11 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 12 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 13 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 14 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 15 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 16 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 17 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 18 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 19 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 20 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 21 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 22 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 23 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 24 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 25 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 26 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 27 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 28 with WinUSB): [87VID=1002 PID=4397
VID=1002 PID=4399
VID=1002 PID=4397
VID=1002 PID=4397
VID=1002 PID=4396
VID=1002 PID=4396
VID=1002 PID=4396
VID=1106 PID=3483
VID=046d PID=c03e
VID=046d PID=c517
VID=0483 PID=5740
VID=05e3 PID=0608
VID=05e3 PID=0736
VID=08bb PID=2902
VID=0a12 PID=0001
VID=1915 PID=7777
Opened
Error libusb_set_configuration: Entity not found
VID=1d5c PID=2000
] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 29 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 30 with WinUSB): [87] The parameter is incorrect.
libusb: warning [winusbx_claim_interface] failed to auto-claim interface 0 (required to claim 31 with WinUSB): [87] The parameter is incorrect.
libusb: error [auto_claim] could not auto-claim any interface

Причем иногда код выше работает, а часто после какого-то момента перестает.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Не знаю, актуально ли еще, но у меня была точно такая же проблема (не могу сделать interface claim — код ошибки был 87). Решилось после установки libusbK, как описано вот здесь: github.com/…​ibusb/libusb/wiki/Windows

Libusb для виндовса по сути своей слегка не естественнен. На сколько я помню, в libusb1 есть слой совместимости с libusb0. По ошибкам в оригинальном посте такое ощущение что выбирается неверная конфигурация устройства. В pyusb если мне не изменяет память поддержка 3х бекендов.

Если хотите разобраться, то пишите в какой-то libusb-devel.

Так а что за железка у вас?

и что этот квадрик по задумке должен делать?

У меня на винде работал python-libusb1 (github.com/...vpelletier/python-libusb1) с драйвером libusbK. На C с libusb1 только хеллоуворды пробовал, но вроде тоже работало.

Вы просто не представляете, что было до того как появился libusb. Надо было на любой нестандартный девайс свои драйвера писать, так что не жалуйтесь. А по-поводу того, что никто не дает вам прямого ответа, так я не представляю даже как все это помнить. Я разбирался с libusb пару лет назад, уже все давно забылось.

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

Посмотрел их вики. Там свой интерфейс реализован — две конечные точки control и bulk. Виртуальный ком порт тут не вариант. Самый простой способ, все таки использовать libusb, от WinDDK вы будете плеваться еще сильней.

ну хоть кто-то начал технические топики создавать:)

Можете взяти за приклад цей проект:
github.com/...DiscoveryBidirectionalHID

девайс STM32F4Discovery, на PC Python скрипт який працює з libusb, я використовував цей проект під Windows 7, він був робочим.

„As a demonstration of the capabilities of this project, I have implemented two simple command/response sequences.

Sending the string ’test’ to the STM32F4Discovery from the included python program, you will get a response from the STM32F4Discovery stating ’Testing 1 2 3 . . .’

Sending the string ’led’ plus a number ’3′, ’4′, ’5′, or ’6′, the corresponding LED3/4/5/6 on the STM32F4Discovery will toggle and the STM32F4Discovery will also respond with text indicating such.

In addition, I have included a simple function to allow sending text via the HID protocol: void SendStrToUSB(uint8_t* str);”

Честно, очень не хочется лезть в исходники pyusb. Может кто подскажет здесь. Или я слишком многого хочу от местных программистов?
Я не смотрел новые версии libusb, но старые представляют программеру блокирующий интерфейс для записи и чтения без нормальной поддержки мультипайпового доступа, поэтому лично я поковырял немного её и отбросил, как поделку для простейших HID устройств, на большее она тянет. Добиться нормальной скорости на балк пайпах с ней увы у меня не получилось, пришлось затачиваться под нативные интерфейсы каждой ОС, где USB реализован по event-driven модели и мы имеем минимальное latency между посылками. Также libusb не поддерживает нормальный scatter-gather DMA для USB для организации chained packets, она слишком далеко от железа для серьёзного применения.
И еще один вопрос, какой нативный API для USB в линухе?
Более-менее простой. www.kernel.org/doc/htmldocs/usb

Единственное, что не бери эту тему нахрапом, если хочешь разабраться. Почитай спецификацию USB, и обязательно спецификацию EHCI или XHCI, чтобы знать, как оно устроено аппаратно на самой машине. Без этого понять USB невозможно.

Глубже лезть не планирую пока. А за ссылку спасибо. Она будет полезна, если придется от порта большего чего хотеть, чем libusb предлагает.
Для твоего свистка врядли понадобится больше, это как раз ниша libusb. А вот если делать поддержку USB дисплеев или USB-Ethernet, то там придётся не так раскорячиться...

Кстати, если хотите делать не говнокод, то зря вы решили использовать libusb 0.1. libusb.org говорит

Please use libusb-1.0 for all new development.
Только драйвер берите libusbk вместо libusb-win32.

вроде получается, что для windows и libusb-1.0 API других вариантов нет

Вики для этого девайса говорит использовать libusbk в случе проблем wiki.bitcraze.io/...dio:install_windows_zadig

Мне одному слух режет сочетание embedded и виндовс ? Венде — вендово, там же winsdk есть — старый добрый жопо-образный API и как-то работает. Оставь libusb для linux — СПО при портировании в это гавно всегда непредсказуемо. И дело тут в большинстве случаев не в самом СПО...

Я работал с libusb по семеркой — тогда она кажись была 1.2 версии. Походу у тебя или 10 или ты лоханулся с версией, потому что не читал доки/changelog’и. OpenCV — сравнение не равноценное — там девайсов кроме камеры нет нифига, а это на уровень выше. libsndfile — это вообще мимо кассы, она к девайсам отношения никогда не имела.

дык, так версия либы какая ? в посте заявлена 1.0, я так понимаю с семеркой работает >= 1.2.

Хмм, заходим:

www.libusb.org/wiki/libusb-win32

Читаем:

...
Vista/7 64 bit are supported from version 1.2.0.0 since a Microsoft KMCS accepted digital signature is embedded in the kernel driver libusb0.sys.
...

???

Hint: нет смысла читать changelog от libusb, пытаясь юзать libusb-win32

P.S. И эта: embedded — это не авианосец кузя, не паровоз, не intel и даже не nvidia. это то что помещается на руку, носится как минимум сутки, столько же работает и не греется. Чета тупорылый маркетинг, про#бавших embedded струю компаний (интел привет), моск людям конкретно поплющил... Да, и стоит < $100 в прыжке

P.S. И эта: embedded — это не авианосец кузя, не паровоз, не intel и даже не nvidia. это то что помещается на руку, носится как минимум сутки, столько же работает и не греется.
Слава богу у всего цивилизованного мира другое мнение.

ты опять путаешь великого себя и цивилизованный мир, понимаешь ли — цивилизованный мир таких свистунов на общие темы не сильно величает, за многие столетия как-то привык отсеивать зерна от плевел ;) так доложи нам конкретно про успехи, скажем, интел на embedded поприще, если конечно есть что сказать. Вот уважаемая пресса пишет что обосрался твой интел в очередной раз : www.ixbt.com/...-jetogo-napravlenija.html

Че так ? Откаты не прошли, как в первый раз с AMD ? Ччерт, вот незадача, а ?...

ты опять путаешь великого себя и цивилизованный мир, понимаешь ли — цивилизованный мир таких свистунов на общие темы не сильно величает, за многие столетия как-то привык отсеивать зерна от плевел ;)
Ну тебе из погреба, конечно же видней, чем дышит цивилизованный мир.
Вот уважаемая пресса пишет что обосрался твой интел в очередной раз : www.ixbt.com/...-jetogo-napravlenija.html
Хех, уважаемая пресса. Я уже год работаю на Apollo Lake, а уважаемая пресса даже не знает, что в апреле уже были пробные сэмплы на рынке.

www.intel.com/...apollo-lake/overview.html

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

-

Для справки: embedded — это и авианосец кузя тоже, и паровоз, и Intel и даже Nvidia, в том числе и то что на руку не помещается, вообще не носится, без внешнего питания не работает и греется как электрочайник.
Чего только «бортовые суперкомпьютеры» в новомодных автопилотных автоведрах стоят — чем не embedded?

Я вот свой системник в стол встроил, тоже в некотором смысле embedded получается.

А какую функцию он выполняет, кроме обогрева?

Выполняет программы в графической оболочке.

Как человек периодически вступающий в кучу под названием «драйвера для Виндовс» скажу — брось каку, на этом поскальзываются и закаленные бойцы.

В сам USB лезть не надо. Драйвер предоставит интерфейс конечного устройства — серийного, блочного, мультимедийного итп.
Если очень чешется помудохаться — утилиты SysInternals облегачт жизнь, насколько єто возможно.

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

В некоторых программах, которые используют usb, usb-порт называют com-порт. Mscomm может читать id подключенных к usb устройств. Как примере на Visual Basic.

С USB в винде из С работать можно?
Да, пиши драйвер %)
libusb1.0 работает?
Работает, вот только ты уверен, что не пытаешься работать с устройством, для которого уже стоят драйвера?
Или я где-то не правильно использую эту либу?
USB очень разнороден, тяжело сказать правильно ты используешь или нет не видя устройства.
С этим устройством прекрасно работает прога на Питоне через из пакет pyusb.
Так посмотри как они работают — это враппер поверх libusb. И портируй код на С/C++.
Вот и пытаюсь понять, либо я неправильно libusb юзаю, либо она кривая.
Возможно у тебя виндовый dll hell: ru.wikipedia.org/wiki/DLL_hell Питон юзает одну версию, ты другую.

А в коде там случайно сама структура

&info
не равна null иногда? Тогда в проверке условия
info.idVendor
будет возникать ошибка.

Может тогда дело в подключаемом устройстве? stackoverflow.com/...interface-already-claimed

ubuntuforums.org/showthread.php?t=1646565

Здесь в примере детач в самом начале программы

Ну что бы в такой последовательности, вначале детач, потом set_configuration

libusb_detach_kernel_driver(hndl, 0);
libusb_set_configuration(hndl, 1);
libusb_claim_interface(hndl, 0);

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


libusb_detach_kernel_driver(hndl, 0);
libusb_device_handle* hndl;
libusb_open(devs[i], &hndl);

После open сразу детач с нужным id. Если и это не работает то сделать либу с пайтона, если это возможно.

Ну по Delphi не особо много было инфы. В основном на компонент Tvcl ссылки. Для C++ libusb. В винде есть hid.dll все эти либы ее наверное и юзают.

Через mscomm компонент еще можно. Он в C++ должен быть.

Может попробовать после детач проверить libusb_kernel_driver_active? Вот еще примеры www.dreamincode.net/...ction-to-using-libusb-10

Может не та libusb dll? Может их несколько вариаций?

Вот удобное описание функций

www.cs.unm.edu/...d6eac7519bb94795659d2c971

Может для конкретной версии винды свои особенности?

Особенности для win7
stackoverflow.com/...g-libusb-1-0-on-windows-7

Пример C++ и avr
www.grigaitis.eu/?p=15

Можно попробовать на пайтоне под винду написать программу с окном — слушателя usb, в заголовке написать что нибудь типа initusb, на С++ написать прогу получающую список окон , по caption окна initusb запомнить его handle, затем в окне пайтона включить получение с usb , выводить данные в строку и записывать ее в caption окна, а на c++ считывать и парсить этот caption.

Может ошибка где-то в permission access девайса, т.е. может код на C c детач рабочий а само устройство не открывает доступ?

Может как здесь описывается, после каждого обращения драйвер устанавливать заново? Может драйвер отключается после каждого обращения?


stackoverflow.com/...-to-connected-usb-devices

The process that you can follow is:

Get the VID, PID for the device that you want to communicate using lsusb

Try to open the device and read the device descriptor

If you want name of the device use string descriptor to get that

Check if any kernel driver is attached. If it is, then detach it and do some raw data transfer

After getting the response again re-attach the driver.

На драйвер гнать не могу, ибо из питона к порту стукается без проблем.
может посмотреть исходники виндовой версии питона (ту часть кода, которая обеспецчивает нужную функциональность) и попробовать забацать (портрировать тобишь) тоже самое, но на плюсах?
В сборке для CrazyFlie bltn libusb1.pyc, lubusb0.pyc и openusb.pyc (это то, что инсталируется).
а самих исходников (тех, что с расширением *.py, а не *.pyc) нет? хотя думаю существуют всякие декомпиляторы для питоновского байткода. Декомпилировать, посмотреть, как оно там все реализовано на питоне

З.Ы. хотя ниже смотрю — вроде дан кусок питоновского кода, который за это отвечает. И вопрос: в чем проблема знающему с/с++ переписать этот питоновский код под плюсы?

-----

UPD:
ну и это — может все дело не конкретно в CrazyFlie, а в том. что этот CrazyFlie основывается на какой-то штуке, которая встроена в виндовую реализацию самого питона (без которой питоновский CrazyFlie нормально не фурычил бы).

Под виндой там тоже еще тот зоопарк. Инструкция по сборке на страницу. Причем я им один баг нашел в винде.
Просто я Питон не знаю настолько хорошо, чтобы в том проекте полностью разобраться, там конкретно наворочено многое, что мне нафиг не надо.
ясно. Ну тогда не знаю, как лучше поступать...
Может пробовать еще такое — micropython.org (есть туториал, как на винду установить micropython.org/...-Python-Windows-setup.pdf ) прикручивать туда, куда надо (он типа заточен под встраиваемость). Есть даже дперевод доки на русский — micropython-ru.readthedocs.io/ru/latest .
Правда не знаю — пойдет ли он на обычном компе или он под всякие распбери пай заточен...

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

Здесь в примерах
sourceforge.net/.../libusb/files/libusb-1.0
есть detach в fxload.c, xusb.c, но сразу так разобраться сложно что там к чему.

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

Там еще есть какой-то static libusb-1.0.a, может он еще где-то прописываться должен.

Может через вебсервер связать пайтон с C++?

Еще usb можно юзать как com порт, через mscomm компонент. И заюзать на Visual Basic том же.

Искал рабочий пример для delphi с libusb, но не нашел ни либы ни примера. Jvcl компонент с примером usb работает нормально. Можно попробовать поискать примеры на ассемблере windows, скомпилить dll и использовать в C++.

Теоретически у пайтона может быть другой механизм контроля ошибок и возможно он может не выдавать ошибку если проверять объект null с каким-то свойством которое тоже null и в результате проверки условия будет возвращено без ошибки null или false, не знаю, это так, гипотетически, а C может быть более чувствительным.

Підписатись на коментарі