www.mikrocontroller.net

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


Autor: Misha M. (Gast)
Datum:

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

Autor: Misha M. (Gast)
Datum:

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

hatt jemand schon damit gearbeitet?

Autor: A. M. (am85)
Datum:

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

Autor: sepp (Gast)
Datum:

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

Autor: Misha M. (Gast)
Datum:

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

http://www.xilinx.com/support/documentation/applic...

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

Autor: David Epping (it-web)
Datum:

Bewertung
0 lesenswert
nicht 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/xi...
Der Zugriff auf die Register findet über out_be32 statt nachdem der 
Speicherbereich entsprechend gemappt wurde.

Autor: Misha M. (Gast)
Datum:

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

Autor: David Epping (it-web)
Datum:

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

Autor: Misha M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 u32 XIo_In32(void * InAddress)
 {
     /* read the contents of the I/O location and then synchronize the I/O
      * such that the I/O operation completes before proceeding on
      */
 
     u32 IoContents;
     __asm__ volatile ("eieio; lwz %0,0(%1)":"=r" (IoContents):"b"
               (InAddress));
     return IoContents;
 
 }
 
 void XIo_Out32(void * OutAddress, u32 Value)
 {
     /* write the contents of the I/O location and then synchronize the I/O
      * such that the I/O operation completes before proceeding on
      */
 
     __asm__ volatile ("stw %0,0(%1); eieio"::"r" (Value), "b"(OutAddress));
 
 }
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?

Autor: Georg A. (Gast)
Datum:

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

Autor: Misha M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arbeite auf Powerpc 440, scheint zu gehen :-) zumiendestens mmap()

Autor: David Epping (Gast)
Datum:

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

Autor: Misha M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
/* Definitions for peripheral TEST_CORE_0 */
#define XPAR_TEST_CORE_0_BASEADDR 0xCEA00000
#define XPAR_TEST_CORE_0_HIGHADDR 0xCEA0FFFF

und Adresse von Interruptcontroller von Powerpc:
#define XPAR_INTC_SINGLE_BASEADDR 0x81800000
#define XPAR_INTC_SINGLE_HIGHADDR 0x8180FFFF
#define XPAR_INTC_SINGLE_DEVICE_ID XPAR_XPS_INTC_0_DEVICE_ID
#define XPAR_TEST_CORE_0_IP2INTC_IRPT_MASK 0X000001
#define XPAR_XPS_INTC_0_TEST_CORE_0_IP2INTC_IRPT_INTR 0
...

muss ich deinem auch mappen und auf den Signal warten?

Autor: David Epping (it-web)
Datum:

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

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]
  • [vhdl]VHDL-Code[/vhdl]
  • [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.