mikrocontroller.net

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


Autor: Ugene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
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:
#include "stdafx.h"
#include <windows.h>
#include <iostream> 
#include "usb.h"
#pragma comment(lib, "libusb.lib") 

#define VENDORID    0x03eb 
#define PRODUCTID   0x0001

#define EP_IN  0x01
#define EP_OUT  0x03

struct usb_device *device_init( unsigned int vendorid, unsigned int productid )
{
    struct usb_bus *usb_bus;
    struct usb_device *dev;

    /* Generic USB library bus structure traversal */
    usb_find_busses( );
    usb_find_devices( );

    /* Scan device tree for vendor ID/product ID match */
    for ( usb_bus = usb_get_busses( ); usb_bus; usb_bus = usb_bus -> next )
    {
        for ( dev = usb_bus -> devices; dev; dev = dev -> next )
        {
            if (( dev->descriptor.idVendor == vendorid ) &&
                ( dev->descriptor.idProduct == productid ) )
                    return dev;
        }
    }

    return NULL;
}

int main()
{
  struct usb_device *usb_dev;
  usb_dev_handle *handle;

  int ret;

    /* Config USB trace debug, 0: None, 1-255: Trace depth */ 
    usb_set_debug( 50 );

    /* Initialize USB library */
    usb_init( );

    /* Make initial connection */
    usb_dev = device_init( VENDORID, PRODUCTID );
    
  fprintf( stderr, "Initial connect --> " );
    if ( usb_dev == NULL )
    {
        fprintf( stderr, "Device not found\n" );
        printf( "\nPress any key to continue\n" );
    }
  else
    {
        fprintf( stderr, "Device found, VENDORID = %04x, PRODUCTID = %04x\n\n", VENDORID, PRODUCTID );
    handle = usb_open(usb_dev);
    if((ret=usb_set_configuration(handle, 1)) < 0)
      fprintf(stderr, "Error while trying to set configuration\n");
    else
      fprintf(stderr, "Successfully set configuration\n");
    
    if((ret=usb_claim_interface(handle, 0)) < 0)
    {
      fprintf(stderr, "Error while trying to claim interface\n");
      
    }
    else
    {
      char status = '1';
      if ((ret=usb_bulk_write(handle, 3, (char*) &status, 1, 2000)) < 0)
        fprintf(stderr, "Error while trying to set LED6\n");

      if((ret=usb_release_interface(handle, 0)) < 0)
        fprintf(stderr, "Error while trying to release Interface\n");
    }
    if ((ret=usb_close(handle)) < 0)
      fprintf(stderr, "Error while trying to close device\n");
    else 
      fprintf(stderr, "DEVICE CLOSED\n");
  }
  int a;
  fprintf(stderr, "Press x to exit\n" );
  while (std::cin >> a) 
  {    
    if (a == -1) break;
    std::cout << "You entered " << a << '\n';
  }

  return 0;
}
und das bekomme ich beim Ausführen:
LIBUSB_DLL: info: usb_os_init: dll version: 0.1.12.1
LIBUSB_DLL: info: usb_os_init: driver version: 0.1.12.1
LIBUSB_DLL: info: usb_os_find_busses: found bus-0
LIBUSB_DLL: info: usb_os_find_devices: found \\.\libusb0-0001--0x03eb-0x0001 on
bus-0
LIBUSB_DLL: error: usb_control_msg: sending control message failed, win error: D
er E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung ab
gebrochen.
Initial connect --> Device found, VENDORID = 03eb, PRODUCTID = 0001
LIBUSB_DLL: error: usb_set_configuration: could not set config 1: win error: Fal
scher Parameter.
Error while trying to set configuration
LIBUSB_DLL: error: usb_claim_interface: could not claim interface 0, invalid con
figuration 0
Error while trying to claim interface
DEVICE CLOSED
Press x to exit

bin dankbar für jeden Hinweis

Autor: comicinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

Meine Anwendung bleibt bei aufruf der Funktion
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!

Autor: comicinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Ugene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: comicinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
usb_control_msg(devh, RT_STD_OUT, SET_CONFIGURATION, 0, 0, buf, 0, 10);
mit
#define RT_STD_OUT         0x00
#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
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.

Autor: comicinker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht 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...:
  bus := usb_get_busses; // Return the list of USB busses found

  Writeln('bus/device  idVendor/idProduct');
  while Assigned(bus) do
    begin
      dev := bus^.devices;
      while Assigned(dev) do
        begin
          writeln(bus^.dirname, '/', dev^.filename,
                  '     ',
                  '0x' + IntToHex(dev^.descriptor.idVendor, 4),
                  '/',
                  '0x' + IntToHex(dev^.descriptor.idProduct, 4));


          udev := usb_open(dev);
          if Assigned(udev) then
            begin
              if dev^.descriptor.iManufacturer > 0 then
                begin
                  ret := usb_get_string_simple(udev,  dev^.descriptor.iManufacturer, S, sizeof(S));
                  if (ret > 0) then
                    begin
                      writeln('- Manufacturer : ', S);
                     if (S[0] = 'W') and (s[1] = 'e') then
                      Begin
                       len:=4;
                       TransResult:=usb_bulk_write(udev,myEndPoint,cmdBuf,len,0);

...snipp
...
...                  
  

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

Autor: Andreas R. (imrazor)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Mike J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: adx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Hänsch (dj-duck)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Domi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: R. Stein (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
[libusb_class_install_add_reg]
HKR,,,,"LibUsb-Win32 Devices"
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:
[libusb_class_install_add_reg]
HKR,,,,"USB-Controller"
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
;--------------------------------------------------------------------------
; Devices
;--------------------------------------------------------------------------

[Devices]
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001

[Devices.NT]
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001

[Devices.NTAMD64]
"C399010020"=LIBUSB_DEV, USB\VID_0100&PID_0001

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.