Forum: PC-Programmierung Wer hat LibUSB-Win32 USB Erfahrung?


von Ugene (Gast)


Lesenswert?

Tach Forum,

ich versuche seit 2 Tagen eine Anwendung(WindowsXP) für AT90USB via 
LibUSB-Win32 zu programmieren. Irgendwie gehen mir langsam die Kräfte 
aus, vorallem ich kann nicht 100%tig sagen, ob es an meiner Firmware 
liegt oder an PC Anwendung.

Kennt jemand das Problem:
1
LIBUSB_DLL: error: usb_control_msg: sending control message failed, win error: Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen.

Mit diesem Code versuche ich das Gerät anzusprechen:
1
#include "stdafx.h"
2
#include <windows.h>
3
#include <iostream> 
4
#include "usb.h"
5
#pragma comment(lib, "libusb.lib") 
6
7
#define VENDORID    0x03eb 
8
#define PRODUCTID   0x0001
9
10
#define EP_IN  0x01
11
#define EP_OUT  0x03
12
13
struct usb_device *device_init( unsigned int vendorid, unsigned int productid )
14
{
15
    struct usb_bus *usb_bus;
16
    struct usb_device *dev;
17
18
    /* Generic USB library bus structure traversal */
19
    usb_find_busses( );
20
    usb_find_devices( );
21
22
    /* Scan device tree for vendor ID/product ID match */
23
    for ( usb_bus = usb_get_busses( ); usb_bus; usb_bus = usb_bus -> next )
24
    {
25
        for ( dev = usb_bus -> devices; dev; dev = dev -> next )
26
        {
27
            if (( dev->descriptor.idVendor == vendorid ) &&
28
                ( dev->descriptor.idProduct == productid ) )
29
                    return dev;
30
        }
31
    }
32
33
    return NULL;
34
}
35
36
int main()
37
{
38
  struct usb_device *usb_dev;
39
  usb_dev_handle *handle;
40
41
  int ret;
42
43
    /* Config USB trace debug, 0: None, 1-255: Trace depth */ 
44
    usb_set_debug( 50 );
45
46
    /* Initialize USB library */
47
    usb_init( );
48
49
    /* Make initial connection */
50
    usb_dev = device_init( VENDORID, PRODUCTID );
51
    
52
  fprintf( stderr, "Initial connect --> " );
53
    if ( usb_dev == NULL )
54
    {
55
        fprintf( stderr, "Device not found\n" );
56
        printf( "\nPress any key to continue\n" );
57
    }
58
  else
59
    {
60
        fprintf( stderr, "Device found, VENDORID = %04x, PRODUCTID = %04x\n\n", VENDORID, PRODUCTID );
61
    handle = usb_open(usb_dev);
62
    if((ret=usb_set_configuration(handle, 1)) < 0)
63
      fprintf(stderr, "Error while trying to set configuration\n");
64
    else
65
      fprintf(stderr, "Successfully set configuration\n");
66
    
67
    if((ret=usb_claim_interface(handle, 0)) < 0)
68
    {
69
      fprintf(stderr, "Error while trying to claim interface\n");
70
      
71
    }
72
    else
73
    {
74
      char status = '1';
75
      if ((ret=usb_bulk_write(handle, 3, (char*) &status, 1, 2000)) < 0)
76
        fprintf(stderr, "Error while trying to set LED6\n");
77
78
      if((ret=usb_release_interface(handle, 0)) < 0)
79
        fprintf(stderr, "Error while trying to release Interface\n");
80
    }
81
    if ((ret=usb_close(handle)) < 0)
82
      fprintf(stderr, "Error while trying to close device\n");
83
    else 
84
      fprintf(stderr, "DEVICE CLOSED\n");
85
  }
86
  int a;
87
  fprintf(stderr, "Press x to exit\n" );
88
  while (std::cin >> a) 
89
  {    
90
    if (a == -1) break;
91
    std::cout << "You entered " << a << '\n';
92
  }
93
94
  return 0;
95
}
und das bekomme ich beim Ausführen:
1
LIBUSB_DLL: info: usb_os_init: dll version: 0.1.12.1
2
LIBUSB_DLL: info: usb_os_init: driver version: 0.1.12.1
3
LIBUSB_DLL: info: usb_os_find_busses: found bus-0
4
LIBUSB_DLL: info: usb_os_find_devices: found \\.\libusb0-0001--0x03eb-0x0001 on
5
bus-0
6
LIBUSB_DLL: error: usb_control_msg: sending control message failed, win error: D
7
er E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung ab
8
gebrochen.
9
Initial connect --> Device found, VENDORID = 03eb, PRODUCTID = 0001
10
LIBUSB_DLL: error: usb_set_configuration: could not set config 1: win error: Fal
11
scher Parameter.
12
Error while trying to set configuration
13
LIBUSB_DLL: error: usb_claim_interface: could not claim interface 0, invalid con
14
figuration 0
15
Error while trying to claim interface
16
DEVICE CLOSED
17
Press x to exit

bin dankbar für jeden Hinweis

von comicinker (Gast)


Lesenswert?

Hallo!

Ich habe leider auch das selbe Problem mit usblib-win32.

Meine Anwendung bleibt bei aufruf der Funktion
1
set_configuration(devh, 1)
einfach stehen, ich kann nichts mehr machen, nur noch den Computer neu 
starten, da sich der Prozess auch nicht beenden lässt.

Mein code entspricht zienlich genau dem Ablauf wie schon oben geposted.
Um den Controller handelt es sich um einen Chipcon cc2511.

Bitte um Hilfe, ich kämpfe auch bereits seit Tagen mit diesem Problem.

Danke!

von comicinker (Gast)


Lesenswert?

ALso ich habe jetzt noch ein wenig recherchiert. Offenbar gibt es 
Unterschiede bei Timeouts oder "zero length packets".
Als Quelle für diese Imformatin habe ich folgenden Link:

http://sourceforge.net/forum/message.php?msg_id=3924387

So weit ich mal zufällig auf der usb.org Website unter den FAQ etwas 
aufgeschnappt habe, gibt es keine Festgelegten Timeouts für 
set_configuration oder ähnliches.

Das Forum für libusb-win32 auf sourceforge.net scheint auf jeden Fall 
ein guter Anlauf zu sein.

Jedenfalls glaube ich das Problem liegt auch auf der Seite des 
Controllers. Die usb_set_configuration() funktioniert nämlich bei 
anderen USB Geräten (Getestet bei einem Memory stick). Ich werde 
zuschauen, das im Framework auch ja ein Acknowledge implementiert ist.

Viel Glück beim coden!

von Ugene (Gast)


Lesenswert?

> Jedenfalls glaube ich das Problem liegt auch auf der Seite des
> Controllers.

kann ich bestättigen. hab mit verschiedenen Firmwareversionen probiert 
und es ging.

von comicinker (Gast)


Lesenswert?

Und nochmal ich. Ein acknowledge wird offenbar nicht vom Framework 
generiert. Ich habe aber zu viel schiss das Framework zu ändern. Ich 
habe stattdessen etwas anderes ausprobiert:
1
usb_control_msg(devh, RT_STD_OUT, SET_CONFIGURATION, 0, 0, buf, 0, 10);
mit
1
#define RT_STD_OUT         0x00
2
#define SET_CONFIGURATION  0x09

Der Aufruf der Funktion glückt zwar, aber ich kann es ist irgendwie 
nicht das gleiche. Vor allem kann ich das Interface nicht besetzen, 
usb_claim_interface danach bringt eine Fehlermeldung.

Wie ich nun festgestellt habe, kann der controller nicht mit
1
usb_control_msg(devh, RT_STD_OUT, SET_CONFIGURATION, 1, 1, buf, 1, 10);
klar kommen. Es stetzt den Status des default Endpoints auf STALL und 
friert anscheinend dadurch meine Host-Anwendung ein.
da ich kein packe-sniffer habe, weis ich nicht was libusb-win32 mit dem 
aufruf von set_configuration übermittelt, es gibt da auch wieder ein 
Rattenschwanz an Parametern.

Jetzt muss ich Wohl oder Übel doch an das Framework ran.

von comicinker (Gast)


Lesenswert?

Also.... Die Funktion usb_set_configuration funktioniert in der libusb 
unter Linux einwandfrei...

Auch ein in das Framework integrierte Acknowledge in Form eines 
Zero-length packet auf EP0 hat kein positiven Effekt.

Kann mir jemand weiterhelfen?

von Andreas R. (imrazor)


Lesenswert?

Ich will ja keine alten Beiträge aufwärmen, aber hast du noch eine 
Lösung für dein Problem gefunden?

Ich habe nämlich genau das selbe Problem unter Linux mit libusb und 
einem AT90USB1287...

Ich habe auf dem Controller ein HID Keyboard laufen mit einem 
zusätzlichen OUT-Endpunkt, auf den ich Tastenbelegungsdaten schicken 
will.

Ich krieg im Endeffekt den selben Fehler bei usb_set_configuration und 
dann friert mir der µC ein...

von G. B. (geri)


Lesenswert?

Hallo

Ich habe ein ähnliches Problem mit usb_bulk_write. Es werden einfach 
keine Bulkdaten verschickt. Ich habe auch schon ausgiebig recherchiert, 
fand allerdings keinen hilfreichen Thread..

Mein Code (Delphi) sieht folgendermassen aus...:
1
  bus := usb_get_busses; // Return the list of USB busses found
2
3
  Writeln('bus/device  idVendor/idProduct');
4
  while Assigned(bus) do
5
    begin
6
      dev := bus^.devices;
7
      while Assigned(dev) do
8
        begin
9
          writeln(bus^.dirname, '/', dev^.filename,
10
                  '     ',
11
                  '0x' + IntToHex(dev^.descriptor.idVendor, 4),
12
                  '/',
13
                  '0x' + IntToHex(dev^.descriptor.idProduct, 4));
14
15
16
          udev := usb_open(dev);
17
          if Assigned(udev) then
18
            begin
19
              if dev^.descriptor.iManufacturer > 0 then
20
                begin
21
                  ret := usb_get_string_simple(udev,  dev^.descriptor.iManufacturer, S, sizeof(S));
22
                  if (ret > 0) then
23
                    begin
24
                      writeln('- Manufacturer : ', S);
25
                     if (S[0] = 'W') and (s[1] = 'e') then
26
                      Begin
27
                       len:=4;
28
                       TransResult:=usb_bulk_write(udev,myEndPoint,cmdBuf,len,0);
29
30
...snipp
31
...
32
...

Transresult liefert mir den Wert -22. Wenn ich in einem USB-Monitor den 
Datentransfer beobachte, dann sehe ich auch, dass keine Bulk-Daten 
geschickt werden. Habt ihr vielleicht eine Idee?

Der Manufacturer-String wird allerdings richtig ausgegeben.

Vielen Dank für eure Tipps

Geri

von Andreas R. (imrazor)


Lesenswert?

Hat eigentlich nichts mit dem ursprünglichen Thread zu tun oder?

Wär besser, wenn du nen eigenen Thread eröffnet hättest, da findet sich 
meistens schneller Hilfe...

von Mike J. (Gast)


Lesenswert?

@ comicinker
> ich kann nichts mehr machen, nur noch den Computer neu
> starten, da sich der Prozess auch nicht beenden lässt.

Kannst du nicht "STRG + ALT + Entf" drücken und den Prozess dann im 
Task-managen beenden?

von Stefan H. (dj-duck)


Lesenswert?

Hallo ... ich stehe genau so vor dem gleichen Problem ... hab auch als 
MC den CC2511 von Texas und würde nun gerne mit USB_CLAIM_INTERFACE() 
eine Verbindung aufbauen ... gibts vielleicht jemanden der mir dort 
weiterhelfen kann?

Gruß Stefan

von adx (Gast)


Lesenswert?

Schaut euch vielleicht mal den Quellcode von AVRDude an. In den mit 
"usb" beginnenden Dateien werden die ganzen Funktionen 
(usb_claim_interface, usb_bulk_write,...) verwendet.

von Stefan H. (dj-duck)


Lesenswert?

Da habe ich mich auch schon versucht durchzuwühlen.
Allerdings weiß ich auch nicht genau an welcher Stelle es genau harkt 
und daher ist das eher ein Henne-Ei-Problem.

von Domi (Gast)


Lesenswert?

Hi,

habe mir mit dem LibUSB-Inf-Wizard eine passende inf-Datei für mein 
Device erstellt. Im Geräte-Manager taucht das nun in einer Extra 
HW-Kategorie  "LibUsb-Win32 Devices" auf. Gibt es eine Möglichkeit, das 
mein USB-Gerät mit bei den normalen "USB-Controller"-Geräten aufgeführt 
wird? Ich vermute, dass ich etwas an der inf. abändern muss, konnte aber 
dazu keine Informationen finden.

von R. Stein (Gast)


Lesenswert?

Is zwar schon nen wenig her, aber ich schreibe das mit dem Device mal 
eben trotzdem, da ich gerade den USB Treiber für ein AT91SAM7S64 
erstellt habe und auch ein wenig modifiziert habe...

in der Ini datei gibt es einen Eintrag um die DeviceKlasse zu ändern
1
[libusb_class_install_add_reg]
2
HKR,,,,"LibUsb-Win32 Devices"
3
HKR,,Icon,,"-20"

hier muss man nur den text in den Anführungsstrichen ändern. Zusätzlich 
könnte man jetzt noch das Icon ändern.

Wenn man es zB in folgendes ändert:
1
[libusb_class_install_add_reg]
2
HKR,,,,"USB-Controller"
3
HKR,,Icon,,"-20"

erscheint das Gerät auch in der Sammelgruppe....


Wer den namen seines Treibers abändern möchte, kann dies nachträglich 
noch in der ini weiter unten machen, so wie ich hier nach C399010020
1
;--------------------------------------------------------------------------
2
; Devices
3
;--------------------------------------------------------------------------
4
5
[Devices]
6
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001
7
8
[Devices.NT]
9
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001
10
11
[Devices.NTAMD64]
12
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.