USB ansprechen unter Ubuntu per lazarus ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Beitrag von mschnell »

Nur so nebenbei (AFAIK):

USB ist ein Bussystem. An dem Bus sind Geräte angekoppelt. In Linux (und auch in Windows) braucht man für Geräte jeweils einen Treiber. Die Treiber-Programme sind in Linux "Kernel device driver", laufen nicht im User- sondern im Kernel-Mode und können (vermutlich) nicht in Lazarus programmiert werden.

Also sollte ein User-Programm von USB überhaupt nichts sehen (außer vielleicht Support-Programme zur Installation der Geräte-Treiber), sondern die API des Device-Drivers (in Linux immer eine virtuelle Datei) verwenden. Was Du brauchst it also ein Linux-Treiber für diene USB-Fernsteuerung. Dann sollte alles ganz einfach sein.

Es ist denkbar, dass man über einen Neben-Pfad auch im User-mode (mit Lazarus-Programm) an die Schnittstelle vom USB-Subsystem zum (potentiellen) Device-Treiber des Gerätes herankommt. Das ist aber in Linux ein "evel hack".

Wenn für die Fernsteuerung nur ein Windows- aber kein Linux-Treiber existiert, ist die Schnittstelle der Hardware - also die Protokolle, die über die oberen Schichten der USB Kommunikation laufen - möglicherweise vom Hersteller überhaupt nicht dokumentiert. Dan geht das Hacken erst richtig los :).

-Michael

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

michael, stimmt für usb nicht ganz es gibt eine linusb die alle standart usb klassen ansprechen kann da es dort ja standartklassen gibt (massstorage,sound,...) geht das dort über die kann man alle usb geräte enumerieren und auch ansprechen von daher stimmt das schon alles nur muss sich pluto mal selbst damit auseinandersetzen wie man hid geräte anspricht das kann ihm keiner abnehmen
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

habe ich schon versucht !
A: ich finde keine passende constante wo meine Fernbediegung drunter fällt
B: ich weiß nicht wie ich eine USB-Gerät öffnen kann bzw. das Signal rauß bekomme !

Kennt einer von euch ein beispiel was ich mir evtl. ansehen kann ?
ich möchte ja nicht da ihr die ganze arbeit macht !
Verstehen möchte ich das ja auch wie das alles geht !
Nur ohne einen ansatzt ist das ziemlich schwer !
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Von uns weiss das aber keiner und ich denk nicht das sich jemand für dich damit beschäftigen möchte du wirst dir wohl oder übel c code beispiele suchen müssen und evrsuchen zu verstehen wenn du mir auschnitte aus diesen vorwirfst werd ich dich sicher auch helfen so gut es geht aber den anfang machen und grundlagen rausfinden musst schon alleine
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Dann bleibt mir wohl nichts anders übrig als das Projekt erstmal auf eis zu legen !
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich habe heute noch mal 4 stunden da nach gesucht.
mein message log sieht so auss:
Receiver as /class/input/input15
Apr 5 16:01:36 pegasus kernel: [17198960.548000] input: USB HID v1.10 Device [Formosa21 IR507 USB IR Receiver] on usb-0000:00:10.3-3.1
IR507 USB IR Receiver
wenn ich das Teil rein stecke... leider bringt mich das überhaupt nicht weiter :(
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Hast du dir denn die libusb schon mal angeschaut ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ja schon öfter... komme einfach nicht weiter.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Was hast du denn schon geschafft ?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

leider nicht viel. Eigentlich gar nichts.

Die units werden eingebunden und können Kompliert werden aber das mehr nicht.

ich wollte das C beispiel übersetzten:

Code: Alles auswählen

struct usb_bus *busses;
 
	usb_init();
	usb_find_busses();
	usb_find_devices();
 
	busses = usb_get_busses();
 
	struct usb_bus *bus;
	int c, i, a;
	for (bus = busses; bus; bus = bus->next) {
		struct usb_device *dev;
 
		for (dev = bus->devices; dev; dev = dev->next) {
			/* Check if this device is a printer */
			if (dev->descriptor.bDeviceClass == 7) {
				/* Open the device, claim the interface and do your processing */
				...
			}
 
			/* Loop through all of the configurations */
			for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {
				/* Loop through all of the interfaces */
				for (i = 0; i < dev->config[c].bNumInterfaces; i++) {
					/* Loop through all of the alternate settings */
					for (a = 0; a < dev->config[c].interface[i].num_altsetting; a++) {
						/* Check if this interface is a printer */
						if (dev->config[c].interface[i].altsetting[a].bInterfaceClass == 7) {
							/* Open the device, set the alternate setting, claim the interface and do your processing */
							...
						}
					}
				}
			}
		}
	}
allerdings bin ich nur bis zur for schleife gekommen.
ich weiß nicht wo diese Variablen Definiert werden.
Zuletzt geändert von pluto am Fr 6. Apr 2007, 12:04, insgesamt 1-mal geändert.
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Welche Variablen? Im Übrigen würde ich dir empfehlen das xml-Getöse da mal rauszunehmen, das macht das ganze etwas übersichtlicher.

Irgendwo gibt es eine Struct usb_device, das entspricht etwa einem PASCAL-Record, dort sind die Felder definiert die mit dev-> referenziert werden. Die Werte werden vom jeweiligen Device eingetragen, das gefunden wird.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ich meine die in der For schleife in der ersten. Das müssten ja Integer sein.... oder nicht ?
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

wenn ich es so versuche bekomme ich nur -25:

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  busses:PUSBBus;
  c, i, a:Integer;
  test:PUSBDevHandle;
  Device:PUSBDevice;
  t:PChar;
begin
  usb_init();
 
  busses := usb_get_busses();
  test:=usb_open(usb_device(test));
  t:='IR507';
  Caption:=IntTostr(usb_bulk_read(test,0,t,10,600));
  ShowMEssage(t);
 
 
end;
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Was soll denn dieser code bitteschön machen ist ja auch total sinnlos.

test := usb_open(test);

was solln der schwachsinn welches usb gerät soll er denn öffnen ?
test ist nicht initialisiert...

Code: Alles auswählen

var
  busses : ^usb_bus;
  usb_bus : ^usb_bus;
  c, i, a : Integer;
  dev : ^usb_device;
begin
    usb_init();
    usb_find_busses();
    usb_find_devices();
 
    busses = usb_get_busses();
 
    bus := busses;
    while Assigned(bus) do
      begin
        dev := bus^.devices;
        while Assigned(dev) do
          begin
             //hier musst du prüfen ob das das richtige gerät ist ...
             dev := dev^.next;
          end;
        bus = bus^.next
      end;
end;
So jetzt hab ich mir garantier selber wieder Arbeit aufgehalst die ich eigentlich gar nicht machen will
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

VIELEN DANK für DEINE MÜHE.

Code: Alles auswählen

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  busses,bus : PUSBBus;
  usb_bus : pusbbus;
  c, i, a : Integer;
  dev : ^usbdevice;
  t:String;
  pc:PUSBDevHandle;
  l:PChar;
begin
  usb_init();
  usb_find_busses();
  usb_find_devices();
  busses:= usb_get_busses();
 
  bus := busses;
  while Assigned(bus) do begin
    dev := bus^.devices;
    while Assigned(dev) do begin
      //hier musst du prüfen ob das das richtige gerät ist ...
      dev := dev^.next;
      if Assigned(dev) then begin
        t:=dev^.bus^.devices^.filename;
        if t = '010' then begin
          pc:=usb_open(dev);
          writeln(usb_bulk_read(pc,0,l,10,200));
        end;
      end;
    end;
    bus := bus^.next;
  end;
end;
jedoch gibt er mir jetzt -1 aus ich weiß auch nicht die Bedeutung von usb_bulk_read den aufrufe Parameter wie ep und so.
MFG
Michael Springwald

Antworten