[Gelöst] Usb mit libusb

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Hallo,
die gewünschten Dateien.
Dateianhänge
Libusbdatien.tar.gz
(12.89 KiB) 171-mal heruntergeladen

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

Moin ihr beiden...

Wie ich sehe arbeitet ihr genau an dem Thema, so nun auch ich hänge.
habe ihr da eine gute Anleitung mit gefunden?

Wenn nein, dürfte ich euch um hilfe bitten, folgendes Device via Lazarus ausfindig zu machen?

Code: Alles auswählen

Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  9 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0403 ProdID=d8f8 Rev=06.00
S:  Manufacturer=ELECTRONIC ASSEMBLY
S:  Product=eDIP Programmer
S:  SerialNumber=EA9777-1
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=0mA
I:  If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=(none)
hätte ich im dir /dev ein entsprechendes TTY-Port wäre es kein Thema, aber dies habe ich leioder nicht.
So muß ich wohl von hinten an das Device ran.

EDIT:Bin gerade mal mit der hier geposteten LibUsb zu gange aber komme leider mit der Bezeichnung

Code: Alles auswählen

Type
  Plibusb_context = ^libusb_context;
  libusb_context = record
    (*undefined structure*)
  end;
nicht zu rande...

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Ich habe auch eine Weile gebraucht um das zu verstehen.

In den alten Versionen wurden die Struktur von den Records direkt nachgebildet und damit konnte man auf die Elemente direkt zugreifen.

Jetzt ist alles anders. Du erhältst nur noch Pointer auf Strukturen, die unbekannt bleiben. Damit greifst Du nicht mehr direkt auf den Record zu, sondern über Descriptoren. Im Prinzip sind nur noch die Strukturen der Descriptoren öffentlich.

Zu deinem Programm:

var
ctx:Plibusb_context;
list:PPlibusb_device;
dev: Plibusb_device;
Ha : Plibusb_device_handle;

i := libusb_init(ctx); // ohne libusb_init(ctx) geht gar nichts !
i := libusb_get_device_list(ctx, list); // i = Anzahl der gefundenen devices in list

dev := list[x]; // gibt das device auf Position x zurück

Wenn Du Vendor=0403 und ProdID=d8f8 hast, und Dich nur für das eine Dev interessierst, solltest Du direkt verwenden :

libusb_init(ctx);
Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);


Ich denke das hilft

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

aro hat geschrieben:
Mi 11. Nov 2020, 10:11
Ich habe auch eine Weile gebraucht um das zu verstehen.

In den alten Versionen wurden die Struktur von den Records direkt nachgebildet und damit konnte man auf die Elemente direkt zugreifen.

Jetzt ist alles anders. Du erhältst nur noch Pointer auf Strukturen, die unbekannt bleiben. Damit greifst Du nicht mehr direkt auf den Record zu, sondern über Descriptoren. Im Prinzip sind nur noch die Strukturen der Descriptoren öffentlich.

Zu deinem Programm:

Code: Alles auswählen

var
  ctx:Plibusb_context; 
  list:PPlibusb_device;
  dev:     Plibusb_device;
  Ha : Plibusb_device_handle;  

  i := libusb_init(ctx);  // ohne libusb_init(ctx) geht gar nichts !  
  i := libusb_get_device_list(ctx, list); // i = Anzahl der gefundenen devices in list

  dev := list[x]; //  gibt das device auf Position x zurück


Wenn Du Vendor=0403 und ProdID=d8f8 hast, und Dich nur für das eine Dev interessierst, solltest Du direkt verwenden :

Code: Alles auswählen

libusb_init(ctx);

Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);


Ich denke das hilft
Das schaut schon mal vielversprechend aus.
melde mich gegen ca. 19 Uhr nochmal, mit weiterem Feedback.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

aro hat geschrieben:
Mi 11. Nov 2020, 10:11

Code: Alles auswählen

libusb_init(ctx);

Ha := libusb_open_device_with_vid_pid(ctx, $0403, $d8f8);


Ich denke das hilft
soweit funktioniert es sehr gut.

habe auch meine Auswertung hinbekommen :green: (erste Handleauswertung)

Code: Alles auswählen

procedure TTray_Form.SpeedButton1Click(Sender: TObject);
begin
  libusb_init(eDip.ctx);
  with Memo1.Lines do begin
    Add('Suche USB-Geräte: ' + IntToStr(libusb_get_device_list(eDip.ctx, eDip.list)));
    try
      try
        libusb_open_device_with_vid_pid(eDip.ctx, _eDip.VID, _eDip.PID);
        Add('Das Gerät mit dem Vendor 0403 und der $d8f8 wurde gefunden: ');
      except
        Add('Das Gerät mit dem Vendor 0403 und der $d8f8 wurde nicht gefunden: ');
        end;
      finally
        libusb_exit(eDip.ctx);
        end;
    end;
end;
für Verbesserungen auch zwecks Lesbarkeit in einigen Monden bin ich immer offen.
Zumindest habe ich jetzt für dieses WE eine Lohnenswerte Arbeit ;)

Class; Package.
USB, und im Dez. RS232, I²C & SPI

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Vergiss es, das ist nicht der richtige Weg !!!!!.

Prüfe, ob try - except wirklich erkennt, ob das Gerät auch angeschlossen wurde.
Normalerweise speichert man das Handle und überprüft ob ein gültiges Handle zurückgegeben wird!
Die meisten Funktionen erwarten dieses Handle als Parameter !
Wie willst Du später diese Funktionen, die das Handle benötigen, aufrufen, wenn Du es nicht abfängst und speicherst ?

eDip.ctx ist ein Verweis auf die Instanz von libusb aber kein Handle !
Wenn Du in dem Programm libusb_init(ctx) nicht mehrfach aufrufst,
musst Du ctx nicht speichern, und kannst deshalb für alle weiteren Funktionen, die ctx erfordern, eDip.ctx durch Nil ersetzen.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

aro hat geschrieben:
Fr 13. Nov 2020, 10:49
eDip.ctx ist ein Verweis auf die Instanz von libusb aber kein Handle !
Wenn Du in dem Programm libusb_init(ctx) nicht mehrfach aufrufst,
musst Du ctx nicht speichern, und kannst deshalb für alle weiteren Funktionen, die ctx erfordern, eDip.ctx durch Nil ersetzen.
eDip ist Type, welcher wie folgt definiert ist

Code: Alles auswählen

Type
  TeDipUSB                        = record
    list                          : PPlibusb_device;
    dev                           : Plibusb_device;
    Ha                            : Plibusb_device_handle;
    end;
    
    const
  _eDip                           : record
    VID, PID                      : longint;
    end                           = (VID:   ($0403);
                                     PID:   ($d8f8));
  ctx                             : Plibusb_context = NIL;
eine Kontrolle zeigt, das die Rückgabe von libUsb_init(eDip_ctx) immer 0 ist speichere ich ihn so oder so nicht.
aro hat geschrieben:
Fr 13. Nov 2020, 10:49
Vergiss es, das ist nicht der richtige Weg !!!!!.

Prüfe, ob try - except wirklich erkennt, ob das Gerät auch angeschlossen wurde.
Normalerweise speichert man das Handle und überprüft ob ein gültiges Handle zurückgegeben wird!
Die meisten Funktionen erwarten dieses Handle als Parameter !
Wie willst Du später diese Funktionen, die das Handle benötigen, aufrufen, wenn Du es nicht abfängst und speicherst ?
habe mir auch mal via "Breakpoint" den Inhalt von eDip angeschaut.

Code: Alles auswählen

eDip nicht USB angeschlossen
    list                          : PPlibusb_device;            = $6b15d0
    dev                           : Plibusb_device;             = $0
    Ha                            : Plibusb_device_handle;      = $0

Code: Alles auswählen

eDip via USB angeschlossen
    list                          : PPlibusb_device;            = $6b0d18
    dev                           : Plibusb_device;             = $0
    Ha                            : Plibusb_device_handle;      = $0
da ja die list sich ändert erwarte ich ja auch bei dem Aufruf von

Code: Alles auswählen

 eDip.Ha                   := libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID); 
eine änderung des in der Definivion eDip.Ha

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Warum denn einfach, wenn es auch umständlich geht ? Da kann mann vortrefflich darüber diskutieren, warum es nicht funktioniert, wenn man es nicht so macht, wie es vorgesehen ist. Ich helfe gerne, wenn jemand Probleme hat oder sinnvolle Fragen stellt, aber für sinnlose Diskussionen mit Besserwissern ist mir meine Zeit zu schade !

1. es macht überhaupt keinen Sinn Werte, die man ein einziges mal benötigt in einen Record zu packen und die ganze Zeit mit rum zuschleppen!

ctx - benötigst Du nur ein mal. Das Ergebnis ist vollkommen uninteressant und nutzlos.
VID und PID - musst du ein einziges mal übergeben.
list - verwendest Du nie, wenn libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID); anwendest - weshalb also im Record?

Sinnvoll bleibt doch nur dev : Plibusb_device; und Ha : Plibusb_device_handle; übrig !

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

aro hat geschrieben:
Sa 14. Nov 2020, 14:04
Warum denn einfach, wenn es auch umständlich geht ? Da kann mann vortrefflich darüber diskutieren, warum es nicht funktioniert, wenn man es nicht so macht, wie es vorgesehen ist. Ich helfe gerne, wenn jemand Probleme hat oder sinnvolle Fragen stellt, aber für sinnlose Diskussionen mit Besserwissern ist mir meine Zeit zu schade !

1. es macht überhaupt keinen Sinn Werte, die man ein einziges mal benötigt in einen Record zu packen und die ganze Zeit mit rum zuschleppen!

ctx - benötigst Du nur ein mal. Das Ergebnis ist vollkommen uninteressant und nutzlos.
Gerne würde ich den Aufruf

Code: Alles auswählen

  libusb_init(Nil);
verwenden, jedoch hindert folgende Fehlermeldung mich daran.
Kompiliere Package EVALeDIPTFT 0.0: Erfolg
Projekt kompilieren, Ziel: VeeJee: Exit code 1, Fehler: 1
trayform.pas(121,18) Error: Can't assign values to an address


ergo. das ich mir in diesem fall eine Constante wie folgt anlege

Code: Alles auswählen

  ctx                             : Plibusb_context = NIL;
um dieses Problem zu beheben, liegt wohl logisch auf der Hand.
aro hat geschrieben:
Sa 14. Nov 2020, 14:04

VID und PID - musst du ein einziges mal übergeben.
list - verwendest Du nie, wenn libusb_open_device_with_vid_pid(ctx, _eDip.VID, _eDip.PID); anwendest - weshalb also im Record?

Sinnvoll bleibt doch nur dev : Plibusb_device; und Ha : Plibusb_device_handle; übrig !
bei dem Test gebe ich dir recht.
Ob ich im weiteren verlauf jedoch noch öfters diese Werte benötige, kann/will/werde ich bis jetzt weder bestätigen, noch abstreiten.

Sollte es darauf hinauslaufen, das ich nur ein einziges mal die Parameter benötdigen, lass ich gerne die Zeil

Code: Alles auswählen

eDip.Ha                   := libusb_open_device_with_vid_pid(NIL, $0403, $d8f8);
bestehen, andernfalls werde ich diese aus dem Kontext das record wieder freischalten, da ich mir diese Struktur eher merke als die Hex-werte:

Warum jedoch in diesen Funktionen der Parameter "libusb_open_device_with_vid_pid(ctx:Plibusb_context; x; y)" mit NIL direkt geschrieben werden kann, im Gegensatz
libusb_init(out ctx:Plibusb_context) kann ich mir nur dadurch erklären, das es sich bei dem Init um ein _out_ handelt.

Leider sind selbst nach diesen Änderungen, welche aus Gründen der allgemeinen Lesbarkeit und Einfachen Arbeit für alle immer noch nicht die gewünschten Ergebnisse eingetreten, welche ich mir erwünscht hätte.

Habe ja auch versucht mit dem USB Tester V0.0.8B15 von Markus Müller alle meine USB-Geräte zu finden, aber mit Bulk und Interrupt Jeweils 0 bis 15 kann ich alsolut nichts finden. sonst würde ich mir darüber einen Ansatz suchen.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Wenn Du mal schauen würdest wie libusb_init() deklariert wurde, müsstest Du die Antwort sofort selber sehen.

Kommunikation mit USB - Geräten ist definitiv nichts für ein Anfängerwerk!

Übe erst mal einige Nummern kleiner ! Und wenn Du dann einige Wissenslücken geschlossen hast, dann gibt es noch einen guten Rat.

Wenn man wenig Erfahrung hat und etwas ganz neues anfängt, dann verwendet man als erstes mal den Quelltext, der andere zum Ziel gebracht hat.
Und wenn Du dann das Project erstmal zum laufen gebracht hast, und erkannt hast und nachvollziehen kannst was wie funktioniert, kannst Du es immer noch anpassen oder anderweitig verschlimmbessern.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: [Gelöst] Usb mit libusb

Beitrag von Maik81SE »

aro hat geschrieben:
Sa 14. Nov 2020, 19:55
Wenn Du mal schauen würdest wie libusb_init() deklariert wurde, müsstest Du die Antwort sofort selber sehen.

Kommunikation mit USB - Geräten ist definitiv nichts für ein Anfängerwerk!

Übe erst mal einige Nummern kleiner ! Und wenn Du dann einige Wissenslücken geschlossen hast, dann gibt es noch einen guten Rat.

Wenn man wenig Erfahrung hat und etwas ganz neues anfängt, dann verwendet man als erstes mal den Quelltext, der andere zum Ziel gebracht hat.
Und wenn Du dann das Project erstmal zum laufen gebracht hast, und erkannt hast und nachvollziehen kannst was wie funktioniert, kannst Du es immer noch anpassen oder anderweitig verschlimmbessern.
und schon stellt sich eine Frage bezüglich der libusb_init()

in dem Testprogramm V8_Test_USB_FPC_D7 mit welchem du den Eingangspost gestartet hast lautet der entsprechende Quelltext wie folgt:

Code: Alles auswählen

Procedure usb_init(); 
der die Deklaration dazu lautet:

Code: Alles auswählen

Procedure usb_init();
Begin
   If LibUSBLoaded And Assigned(_usb_init) Then
	   _usb_init();
End;
soweit kann ich auch deinem berechtigtem einwand "USB_init(Nil) zu verwenden auch nachvollziehen.

dagegen steht aber auch deine Vorgeschlagene LibUSB, welche sich total von der anderen Unterscheidet.

Code: Alles auswählen

function libusb_init(out ctx:Plibusb_context):cint;extdecl;external;
Von daher sei es mir bitte verziehen, wenn es in folge dessen zur Verwirrungen kommt und man in folgen dessen aneinander vorbeiredet.

Belese mich zudem auch auf der wiki von libusb.info und schlagartig kommt mir der Gedanke, und diesen halte ich für ehrlich gesagt absurt ist mei Pi4 mit 32 BIT ungeeingnet.
ABer wie gesagt.
Das halte ich für Absurt.

Also werde ich wohl nicht drumrum kommen und das Thema erst mal nach hinten zu scheiben, bzw in einem anderen Programm zu ergründen, damit ich mit meinem eigentlichen Programm weiterkomme...

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

aro
Beiträge: 130
Registriert: Di 26. Jul 2011, 19:58
OS, Lazarus, FPC: Deepin 20.2; Lazarus 2.0.0 + dfsg-2
CPU-Target: 64Bit

Re: [Gelöst] Usb mit libusb

Beitrag von aro »

Ich bin mit meinem Latein allmählich am Ende.

Ich habe als Eingang geschrieben, das die Datei V8_Test_USB_FPC_D7 nicht funktioniert und nachgefragt ob jemand zusammen passenden Versionen kennt!

Dann habe ich eine Lösung gefunden und aufgezeigt die funktioniert und die Dateien dazu geschickt.

Anstatt endlich die Quelle zu verwenden, die bei mir funktioniert haben, und auf die ich mich beziehe, reitest Du auf veralteten Quellen rum, von denen bekannt ist, das sie nicht mehr funktionieren. Und erwartest für diesen Unsinn ernsthafte Hilfe ?

Versuch es mal mit Töpfern oder Drechseln.

Antworten