Arbeitet jemand mit der LibUsb-1.0 Library?

Hallo,

arbeitet jemand mit der LibUsb-1.0 Library?
Ich habe für ein Tool die LibUsb-0 verwendet, dass hat mit Windows, OS X und Linux funktioniert. Aus Interesse will ich jetzt die aktuelle LibUsb-1.0 verwenden. Ich habe die DLL für Windows mit MS Visual C++ 6 kompiliert, und am Mac unter 10.6.8 mit Anleitung die .dylib erstellt.
Unter Windows funktionieren die Funktionen die ich bisher erstellt habe, unter OS X aber nur teilweise und ich verstehe nicht warum.
z.B. liefert die Funktion ‘libusb_get_device_descriptor’ richtige Werte. Lasse ich mir aber die Werte von der Struktur ‘libusb_device’ zu einem Gerät anzeigen, die ebenfalls Werte zum Descriptor enthält, stimmten die Ausgaben nicht.
Falls jemand Interesse hat, ich kann das Xojo-Projekt zum Testen bereitstellen. Verwendet habe ich die libusbx-1.0.16-rc1 von www.libusb.org

Peter

Ich hab libusb mit beim USB Plugin drin für Linux, glaub ich.
Vielleicht ist deine Strukturdefinition nur falsch.

Hallo Christian,

ja kann sein, nur warum funktioniert es unter Windows mit der gleichen Struktur?
StructureAlignment habe ich schon mit 1, 2, 4, 8 ausprobiert, die Werte stimmen am Mac nie.
Ich habe den Verdacht das irgendwelche Parameter beim Kompilieren fehlen. Allerdings kann ich die Version, Beschreibungen der Fehlernummern und -texte richtig ausgeben und die Abfrage eines Device-Descriptor stimmt auch.
Die Strukturen für Device und Descripten sehen so aus:

[code]StructLibUsbDevice (Attribut: StructureAlignment = 4, Size: 68)
iLock As Int32
iRefCnt As Int32
ptrContext As Ptr ’ StructLibUsbContext
iBusNumber As UInt8
iPortNumber As UInt8
ptrParentDev As Ptr ’ StructLibUsbDevice
iDeviceAddress As UInt8
iNumConfigurations As UInt8
iSpeed As Int32
uList As StructLibUsbListHead
iSessionData As UInt32
uDeviceDescriptor As StructLibUsbDeviceDescriptor
iAttached As Int32
iOSpriv As UInt8

StructLibUsbDeviceDescriptor (Attribut: StructureAlignment = 4, Size: 20)
iLength As UInt8
iDescriptorType As UInt8
iBcdUsb As UInt16
iDeviceClass As UInt8
iDeviceSubClass As UInt8
iDeviceProtocol As UInt8
iMaxPacketSize As UInt8
iVendorID As UInt16
iProductID As UInt16
iBcdDevice As UInt16
iManufacturer As UInt8
iProduct As UInt8
iSerialNumber As UInt8
iNumConfigurations As UInt8

StructLibUsbListHead
ptrPrev As Ptr
ptrNext As Ptr
[/code]

Kompiliert habe ich am Mac so:

$ tar xvfj libusbx-1.0.16-rc1.tar.bz2 $ cd libusbx-1.0.16-rc1/ $ export CFLAGS="-arch i386" $ ./configure --disable-dependency-tracking $ make $ sudo make install

Peter

Du könntest in C ein kleines Tool kompilieren und dir sizeof() und offsets ausgeben lassen. Dann vergleichen zum Xojo.
Oder einfach mal in die Daten als Memoryblock schauen und mal sehen, ob ein bestimmter Wert woanders steht.

Hallo Christian,

danke, das mit dem Memoryblock habe ich schon gemacht, finde aber keinen Zusammenhang mit den falschen Werten.
Bei LibUsb ist ein kleines Bespielprogramm ‘listdevs.c’ dabei, das funktioniert. Habe es aber noch nicht geschafft es passend zu ndern und zu kompilieren.

Peter

Bitte verzahlen zum english. Diese topic ist zehr informatif.

Gruss aus holland

Hallo Derk,

ich verstehe nicht was du meinst.
Falls du Interesse an der LibUsb hast, die Version LibUsb0 habe ich in meinem DSO-USB-Tool verwendet ‘ModuleLibUsb’:
DSO-USB-Tool

Und hier ist mein Versuch mit der aktuellen LibUsbX-1.0.16:
LibUSB1_2013r1_20130625a.zip (170 KB)

Peter

Wo stimmt denn in dem Projekt was nicht?p
Irgendwo müsste man ja einen Fehler sehen in den vielen Debugausgaben!?

Hallo Christian,

die Daten in der Struktur ‘StructLibUsbDecive’ sind am Mac nicht richtig.
Bei der Ausgabe sollten die Daten zum Descriptor identisch sein. Bei den Daten z.B. zum ersten Gert, sollten die folgenden Daten ab Zeile 91 und 108 identisch sein. Die Struktur ‘StructLibUsbDecive’ enthlt ja auch die Struktur ‘StructLibUsbDeviceDescriptor’. Bei Zeile 108 wurden die Daten nur mit einer anderen Funktion abgefragt und sind richtig

Die Ausgabe ist von Windows und gekrzt wo statt Zeilennummern die ‘…’ stehen.

...
0072 ------------------------------------------------------------
0073 Gerteliste abgefragt, Anzahl: 9
0074 ------------------------------------------------------------
0075 Information von Device 1 - Pointer: 0x0041D098
0076 StructLibUsbDevice:
0077   iLock (Int32): 548
0078   iRefCnt (Int32): 2
...
...
0089   iAttached (Int32): 1
0090   iOSpriv (UInt8): 0
0091 StructLibUsbDeviceDescriptor:
0092   iLength (UInt8): 18         <- ALLES AB HIER UND ...
0093   iDescriptorType (UInt8): 0x01
...
...
0104   iSerialNumber (UInt8): 0
0105   iNumConfigurations (UInt8): 1
0106 mbStructDevice:
0107 
00000| 24 02 00 00 02 00 00 00 80 9A 41 00 01 00 00 00 |$.........A.....|
...
...
0108 Descriptor von Device 1
0109   iLength (UInt8): 18          <- HIER SOLLTE IDENTISCH SEIN.
0110   iDescriptorType (UInt8): 0x01
...
...
0121   iSerialNumber (UInt8): 0
0122   iNumConfigurations (UInt8): 1
0123 ------------------------------------------------------------

Vielleicht hat es auch etwas mit 32/64 Bit zu tun beim Kompilieren. StructLibUsbDecive enthlt ‘long’-Werte, die StructLibUsbDeciveDescriptor nicht. Das bin ich gerade dabei zu testen.

Peter

Hallo,

also die Angabe von “-arch i386” sollte stimmen, ein long-Wert wird 4 Bytes und ohne der Angabe 8 Bytes.
Die .dylib müsste richtig für 32 Bit kompiliert sein. Die Ausgabe von “file libusb-1.0.0.dylib” ergibt:
libusb-1.0.0.dylib: Mach-O dynamically linked shared library i386

Peter

Ich glaube, Derk wollte das Thema auf englisch fortgeführt sehen. Sein Deutsch ist nicht so gut :slight_smile:

Hallo Beatrix,

danke, ich habe es mir schon gedacht, aber mein englisch reicht leider nur zum Lesen.

brigens habe ich das ‘listdevs.c’ Beispiel erfolgreich ndern und kompilieren knnen. Auch dort werden z.B. die Vendor/Product-ID falsch ausgegeben, wenn man direkt auf die libusb_device-Struktur zugreift. Knnte also wirklich ein dylib bzw. OS X-Problem sein.
Die Gre der Strukturen ist unter Windos und OS X auch gleich, libusb_device hat 64 Byte und libusb_device_descriptor hat 18 Byte.

Peter

Hallo,

nur der Info wegen. Ich glaube die Funktion ‘get_device_list’ ist für OS X gar nicht implementiert. Darum sind die Werte in der ‘libusb_device’-Struktur ungültig. Wenn man die Daten mit den eigens zuständigen Funktionen abruft stimmt alles.
Gefunden habe ich in der Datei ‘darwin_usb.c’ folgendes, es gibt anscheinden keinen Funktionszeiger oder so für ‘get_device_list’:

const struct usbi_os_backend darwin_backend = { .name = "Darwin", .caps = 0, .init = darwin_init, .exit = darwin_exit, .get_device_list = NULL, /* not needed */ .get_device_descriptor = darwin_get_device_descriptor, .get_active_config_descriptor = darwin_get_active_config_descriptor, .get_config_descriptor = darwin_get_config_descriptor, ...
Also im Moment schaut es mit Xojo und LibUsb1 ganz gut aus.

Peter

Deutsch kanst ich nicht so guth ja.

Hallo,

ich habe ein Seite für ein Testprojekt zum Download eingerichtet: libusb1

Peter