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.
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?
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 | 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?
> 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.
Arbeite auf Powerpc 440, scheint zu gehen :-) zumiendestens mmap()
Ja das geht, ich hab das bisher zwar nur mit Virtex4 und seinem PPC405 gemacht, aber da is nicht viel anders ...
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.