Forum: FPGA, VHDL & Co. Von Linux auf eigene IP-Cores zugreifen


von Misha M. (Gast)


Lesenswert?

Hallo,

wollte mal nachfragen ob sich einer schon damit beschäftigt hat, wie man 
eigene IP-Cores von Linux, der auf Powepc läuft, zugegriffen werden 
kann.

Die IP-Cores sind über PLB mit powerpc verbunden.

Aber kann ich diese read/write-reg von PLB-Interface benutzen, wenn ja 
wie muss ich diese dann kompilieren dasss die auch auf powerpc-Linux 
laufen.

vorab schon mal Danke.

von Misha M. (Gast)


Lesenswert?

Habe glaube ich was gefunden, leider funkt der beispiel nicht mit EDK 
12.1, muss mir jetzt erst ein älteres intsallieren:

http://www.xilinx.com/support/documentation/application_notes/xapp1129.pdf

hatt jemand schon damit gearbeitet?

von A. M. (am85)


Lesenswert?

Ich kann dir leider nicht helfen, wenn du aber irgendwelche Antworten 
gefunden haben solltest, wäre es klasse, wenn du sie hier posten 
könntest. Das Thema interessiert mich auch.

von sepp (Gast)


Lesenswert?

Du must dir einen Linux Kernel Treiber schreiben, damit du auf die IP 
zugreifen kannst. Bzw. einen Kernel Treiber verwenden der dir den 
Address bereich der IP auch im User Mode sichtbar / zugreibar macht.

Vielleicht hilft dir folgende Lektüre weiter:
http://lwn.net/Kernel/LDD3/

Über welchen Bus die IP an den PPC angebunden ist in diesem Fall 
eigentlich egal.

von Misha M. (Gast)


Lesenswert?

Wie gesagt habe bis jetzt die Lösung (Beispiel) mit LocalLinkt gefunden:

http://www.xilinx.com/support/documentation/application_notes/xapp1129.pdf

weiss aber nicht ob ich jetzt mein IP undbedingt zum LocalLinkt umbauen 
soll, gehe grad den beispiel durch, scheisse nur das der EDK-design im 
Beispiel mit EKD 11.1 erstellt wurde, ist aber nicht mit EDK 12.1 
kompatile :-/, man man man so viel Kohle für die Software verlangen aber 
dann trotzdem nur Scheisse produzieren

von David E. (it-web)


Lesenswert?

IP Cores mit Busanbindung (PLB, OPB, ...) haben Register die über diesen 
Bus zugreifbar sind. Aus Sicht des Prozessors bzw Linux/Standalone 
Programm sind sie daher über Speicherzugriffe zu erreichen, genau wie 
auch das RAM.

Unter Linux kommt man entweder aus dem Userspace per /dev/mem an diese 
Register, was aber eher zum schnellen Test der Hardware zu gebrauchen 
ist, oder man schreibt einen Treiber für den Kernel.
Eigtl kann man sich da jeden Treiber anschaun, auch von Xilinx gibt es 
einige im Mainline Kernel, z.B. 
http://lxr.linux.no/#linux+v2.6.34/drivers/gpio/xilinx_gpio.c
Der Zugriff auf die Register findet über out_be32 statt nachdem der 
Speicherbereich entsprechend gemappt wurde.

von Misha M. (Gast)


Lesenswert?

Danke, auch wenn der Treiber für mich noch leicht verwirend ist.

Muss ich eigentlich ein Treiber schreiben, oder kann ich direkt eine 
Linux-Anwendung schreiben wo ich auch mein VHDL-Core zugreife (mit 
out_be32 o.ä.)???

ist die Adresse vom IP-Core die ich in Linux verwenden muss, die auch 
xparameters.h bzw. die die EDK die baseadress ist???

von David E. (it-web)


Lesenswert?

> Muss ich eigentlich ein Treiber schreiben, oder kann ich direkt eine
> Linux-Anwendung schreiben wo ich auch mein VHDL-Core zugreife (mit
> out_be32 o.ä.)???
Zu Testzwecken kannst du die relevanten Registeradressen deines IP Cores 
in einem eigenen Programm, das dann mit root Rechten laufen muss, per 
mmap() Systemcall einbinden und danach wie auf normale Variablen 
zugreifen.
Für eine endgültige Lösung brauchst du aber einen Treiber. Dieser kann 
aber wenn du das lieber möchtest sehr minimalistisch sein und auch nur 
ein mmap anbieten, sodass die gesamte Logik im Userspace bleibt wie bei 
/dev/mem

> ist die Adresse vom IP-Core die ich in Linux verwenden muss, die auch
> xparameters.h bzw. die die EDK die baseadress ist???
Grundsätzlich natürlich ja, die Busadressen gelten auch in Linux.
D.h. für /dev/mem oder mmap z.B. verwendest du die direkt.
Ansonsten macht dein Kerneltreiber ein ioremap auf eine neue virtuelle 
Adresse die er anschließend verwendet.

von Misha M. (Gast)


Lesenswert?

Vielen Dank für die Schnelle Antwort, die nächste Frage ist, früher ( 
also wo ich die C anwendung standalone, ohne Linux) war es so bevor ich 
auf der FPGA seite entsprechenden Falg gesetzt habe, wurde die powerpc 
Anwendung blockiert,

also z.b wenn ich auf plb von powerpc seite was schreiben wollte, aber 
der entsprechender Flag nicht gesetzt wurde, hat es blockiert bis FPGA 
den Flag gesetzt hat, dieser lese-schreib vorgang war aufruf eines 
Assembler befehls:
1
 u32 XIo_In32(void * InAddress)
2
 {
3
     /* read the contents of the I/O location and then synchronize the I/O
4
      * such that the I/O operation completes before proceeding on
5
      */
6
 
7
     u32 IoContents;
8
     __asm__ volatile ("eieio; lwz %0,0(%1)":"=r" (IoContents):"b"
9
               (InAddress));
10
     return IoContents;
11
 
12
 }
13
 
14
 void XIo_Out32(void * OutAddress, u32 Value)
15
 {
16
     /* write the contents of the I/O location and then synchronize the I/O
17
      * such that the I/O operation completes before proceeding on
18
      */
19
 
20
     __asm__ volatile ("stw %0,0(%1); eieio"::"r" (Value), "b"(OutAddress));
21
 
22
 }
mit mmap wird so wie ich verstehen diese Blockierung nicht mehr 
stadtfinden?

und Wie sieht es aus mit Interrups, mein IP-Core lösst Interrupts aus, 
muss ich dafür eine bestimmte Adresse jetzt pollen?

von Georg A. (Gast)


Lesenswert?

> D.h. für /dev/mem oder mmap z.B. verwendest du die direkt.

Man muss da aufpassen, nicht auf jeder Architektur funktioniert das. zB. 
mit dem ARM-Linux geht mmap auf /dev/mem nicht.

von Misha M. (Gast)


Lesenswert?

Arbeite auf Powerpc 440, scheint zu gehen :-) zumiendestens mmap()

von David Epping (Gast)


Lesenswert?

Ja das geht, ich hab das bisher zwar nur mit Virtex4 und seinem PPC405 
gemacht, aber da is nicht viel anders ...

von Misha M. (Gast)


Lesenswert?

David Epping schrieb:
> Ja das geht, ich hab das bisher zwar nur mit Virtex4 und seinem PPC405
> gemacht, aber da is nicht viel anders ...

was geht?

kann man also mit mmap, auch auf die Interrupt des IP-Cores zugreifen??, 
wenn ja wie?, ich habe ja meine Adressen von meinem Core:
1
/* Definitions for peripheral TEST_CORE_0 */
2
#define XPAR_TEST_CORE_0_BASEADDR 0xCEA00000
3
#define XPAR_TEST_CORE_0_HIGHADDR 0xCEA0FFFF

und Adresse von Interruptcontroller von Powerpc:
1
#define XPAR_INTC_SINGLE_BASEADDR 0x81800000
2
#define XPAR_INTC_SINGLE_HIGHADDR 0x8180FFFF
3
#define XPAR_INTC_SINGLE_DEVICE_ID XPAR_XPS_INTC_0_DEVICE_ID
4
#define XPAR_TEST_CORE_0_IP2INTC_IRPT_MASK 0X000001
5
#define XPAR_XPS_INTC_0_TEST_CORE_0_IP2INTC_IRPT_INTR 0
6
...

muss ich deinem auch mappen und auf den Signal warten?

von David E. (it-web)


Lesenswert?

mmap auf powerpc geht. wie das mit den interrupts funktioniert kann ich 
nicht sagen, sicher nicht per mmap. es gibt zwar wohl möglichkeiten 
interrupts in den userspace zu bringen, aber eigtl muss das der kernel 
treiber erledigen.

Mir scheint dein IP Core benötigt einen richtigen Treiber ... so schwer 
ist das auch nicht!

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.