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.
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.
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.
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
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.
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???
> 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.
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
u32XIo_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
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?
> 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.
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:
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!