Von Linux auf eigene IP-Cores zugreifen

Gast #1763444
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.
Gast #1765103
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.
Gast #1765254
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
#1765758
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.
Gast #1773215
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???
#1773640
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.
Gast #1774099
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?
Gast #1775601
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?
#1776238
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren