Forum: FPGA, VHDL & Co. Load FPGA from Linux, SoC/HPS


von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Hallo zusammen und gleich mal einen guten Rutsch ins 2019'er.
Folgender Hintergrund zu obigen Thema/Frage:
Projekt Infos, siehe : 
https://github.com/pdp11gy/SoC-HPS-based-RL-disk-emulator
Alles begann mit einem DE0-Nano-SoC board. Hier konnte ein FPGA-load 
sehr einfach
realisiert werden mit: dd if=/home/root/DE1_SoC_Computer.rbf 
of=/dev/fpga0 bs=1M
Linux: DE0-Nano-SoC:(DE0_Nano_SoC_Linux_Console_3.13.img)
Poky 8.0 (Yocto Project 1.3 Reference Distro) 1.3
--Leider war nun mein DE0-Nano-SoC board defekt und es war auch nicht 
mehr lieferbar.
Ich musste auf das neuere(angeblich bessere) Ersatz board DE10-Nano 
umsteigen.
Das Linux dazu: DE10-Nano:(de10_nano_linux_console.img)
The Angstrom Distribution socfpga ttyS0 Angstrom v2014.12 - Kernel
--Leider funktioniert nun aber leider der dd command nicht mehr. Ich 
kann zwar
ein .sof file laden oder ein .jic file in das EPCS flashen, aber damit 
ist aller
Mehrwert von Linux weg, denn man braucht immer noch den 
Quartus-Programmer.
Meine Frage an Euch:
1) wie bekomme ich das doch relativ einfach hin. Es gibt zwar mehrere 
Hinweise,
wie z.B. mit overlay usw... aber ich bekomme es nicht so richtig hin. 
Auch
terasic konnte mir da nicht weiterhelfen.
2) vielleicht hat jemand zugriff auf die Struktur des .sof oder .rbf 
file.
Dann könnte ich vielleicht selber einen loader schreiben?

Besten Dank, Reinhard

von Sigi (Gast)


Lesenswert?

Mit den Configuration-Optionen der aktuellen Altera-Generation
kenne ich mich nur sehr grob aus, aus den Datasheets weiss ich
aber, dass das FPGA-Array und der CPU-Bereich getrennt
konfiguriert werden können, und zwar auch gegenseitig. Im
CPU-Bereich stehen neben der CPU auch diverse IO-Komponenten
wie z.B. SDCard-Reader zur Verfügung. Damit kannst Du dann
eine FPGA-Konfiguration lesen und damit das FPGA-Array
konfigurieren. Schau Dir mal das MISTER-Projekt an (eine
Emulations-/Simulationsumgebung für Retro-Projekte), da wird
auch ein Cyclone10 genau so konfiguriert. Der Rahmen müsste
OpenSource sein.

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Danke für Die Antwort und Deinen Hinweis
zum MISTER-Projek. Werde es mir mal noch
genauer ansehen. Im ersten Augenblick kann
ich nur erkennen, dass sie "Loading FPGA from u-boot"
benützen. Das ist nun nicht das was ich eigentlich
suche. Ich suche eine Möglichkeit, meine FPGA-Anwendung
dynamisch zu laden. ( wie früher beim DE0-Nano-SoC mit dd)

von M. Н. (Gast)


Lesenswert?

Der Linux Kernel hat das FPGA subsystem, in dem der FPGA manager 
implementiert ist. Damit ist es möglich den FPGA von Linux aus zu 
konfigurieren. Da hat es allerdings einige Umstrukturierungen gegeben.

Was genau ist das Problem? Funktioniert das Konfigurieren nicht, oder 
ist das Device weg? Ist dein Device Tree korrekt? Ist der Linuxtreiber 
einkompiliert?

Im Zweifelsfall musst du mal einen eigenen Kernel kompilieren.

von M. Н. (Gast)


Lesenswert?

Reinhard H. schrieb:
> Dann könnte ich vielleicht selber einen loader schreiben?

Du brauchst keinen Zugriff auf das file-Format. Das RBF enthält den 
rohen Bitstream, den du genauso in das FIFO des Konfigurationsmoduls 
schreiben kannst. Das mach der Linuxtreiber beim schreiben von /dev/fpga 
auch. Da muss nix geparst werden.

Ob der Kerneltreiber für den fpga-manager geladen ist, kann man u.U. in 
/proc/config.gz nachschauen. Kannst du den Inhalt davon mal posten? 
Sollte /proc/config.gz oder /proc/config nicht da sein, kann es sein, 
dass Terasic, oder wer auch immer das Linux baut, das config file 
deaktiviert hat. Dann kann man die Kernel-Konfiguartion leider nicht so 
flink auslesen.

Alternativ kannst du auch noch die /proc/kallsyms Datei posten. Wenn da 
die Treibersymbole nicht drin sind, bleiben dir nur 2 Wege:

1. du kompilierst deinen eigenen Kernel mit dem FPGA treiber
2. Du schreibst ein kleines C programm was über mmap() und /dev/mem auf 
das Konfiguationsmodul zugreift und die Datei dort reinschiebt. Dzu 
kannst du dir im HPS user manual die Register davon anschauen. Wie man 
auf hardwareadressen aus dem Userspace von Linux zugreift kannst du hier 
sehen:
https://stackoverflow.com/questions/12040303/how-to-access-physical-addresses-from-user-space-in-linux

EDIT: /proc/config.gz ist gz komprimiert. Also nicht wundern, dass da 
was komisches drinsteht. Fürs anzeigen mit dekomprimierung zcat 
verwenden.

von M. Н. (Gast)


Lesenswert?

Okay. Ich habe mich nun etwas durch die Linux-Sourcen gewühlt und muss 
dir leider sagen, dass eine Konfiguration à la "dd if=foo of=/dev/fpga" 
nicht mehr möglich ist.

Hintergrund ist wohl, dass dadurch die Hierarchie etwas verletzt wird, 
da der Nutzer mit der Konfiguration des FPGA nichts zu tun hat (an 
sich)... Außerdem ergeben sich andere Probleme: Der Nutzer konfiguriert 
das FPGA. Aber Linux verwendet ein Modul im FPGA. Folge: Kernel/Linux 
kaputt.

Das neue Interface ist über devicetree overlays realisisert, die während 
der Runtime hinzugefügt werden können. Da gibt es irgendwo den Parameter 
"firmware-name" oder "firmware" (sorry, vergessen welcher), der dann den 
Dateinamen zum rbf enthält.

Hier eine kleine Präsentation zum FPGA gedöns: 
https://archive.fosdem.org/2016/schedule/event/fpga_devicetree/attachments/slides/986/export/events/attachments/fpga_devicetree/slides/986/FOSDEM__fpga_manager_&_devicetree_overlays.pdf

Du musst dich da wohl oder übel ein wenig mit beschäftigen, oder du 
baust dir einen alten Kernel zusammen.

Dieser Beitrag zeigt das ganze auch etwas:
https://forum.rocketboards.org/t/load-fpga-rbf-from-device-tree-overlay-example/999/17

Achtung: da steht irgendwo in fett "overlay". Da hat der Highlighter der 
Seite zugeschlagen. Da sollten eigentlich zwei Unterstriche vor und nach 
dem Overlay sein.

Falls du mehr über die Kernelsache wissen willst:
https://www.kernel.org/doc/html/v4.18/driver-api/fpga/intro.html#fpga-region
Vorallem fpga-region und der fpga-manager sind für die Konfiguartion 
interessant.

Reinhard H. schrieb:
> aber damit
> ist aller
> Mehrwert von Linux weg, denn man braucht immer noch den
> Quartus-Programmer.

Der Sinn von Linux auf diesen SoCs ist ja nicht, dass man damit bequem 
den FPGA konfigurieren kann, sondern, dass man die Vorteile eines 
mächtigen Betriebssystems mit denen eines FPGAs kombiniert. Ich 
persönlich habe mit den SoCs Linux-Treiberentwicklung gemacht. Da war es 
dann erforderlich, dass der FPGA mit der HW vor dem Linux betriebsbereit 
ist. Deswegen ist die Konfiguration über u-boot auch so beliebt.

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Vielen Dank für die vielen Tips und Hinweise.
Ich werde mal eruieren wie ich das hinbekomme.
Allerdings, wenn der Quartus programmer problemlos
ein .sof file ( oder .rbf) laden kann, dann sollte man
doch ein programm schreiben können, welches ein .sof
File laden kann, allerdings finde ich keinen Hinweis
wie das .sof file aufgebaut ist.

von Markus F. (mfro)


Lesenswert?


von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

.rbf load geht leider nicht beim DE10-Nano board, bzw. bekomme ich nicht 
hin
mit dem dementsprechenden Linux, Angstrom v2014.12 - Kernel
es fehlt /dev/fpga0 , siehe auch :
https://forum.rocketboards.org/t/how-to-program-fpga-from-hps-de10-nano/1278
Bei dem Vorgänger-Board, DE0-Nano-Soc hat es funktioniert. Hier gibt es 
aber
ein anderes Linux: Poky 8.0 (Yocto Project 1.3 Reference Distro) 1.3
Wie auch immer, der Programmer von Quartus kann das .sof file laden, 
aber
ich kenne nun mal nicht nicht die .sof file Struktur.
Einen quartus Stand-alon Programmer gibt es nur für Windows und 
eventuell
für ein 64Bit Linux.
Die im oberen Link beschriebene Overlay Technik bekomme ich nicht hin. 
Einmal
hat es zwar funktioniert aber ein Boot war dann nicht mehr möglich.

von M. Н. (Gast)


Lesenswert?

Reinhard H. schrieb:
> .rbf load geht leider nicht beim DE10-Nano board, bzw. bekomme ich nicht
> hin
> mit dem dementsprechenden Linux, Angstrom v2014.12 - Kernel
> es fehlt /dev/fpga0 , siehe auch :

Das habe ich ja oben schon geschrieben, dass dieses Interface 
abgekündigt ist
Da hast jetzt folgende Möglichkeiten:

Entweder du baust dir selber einen alten Kernel (version < 4.4, am 
besten irgendein 4.0.x).

Oder:

Möglichkeit 2: Du ziehst dir den alten Linux Kernel vom DE0 nano SoC auf 
die Karte. Dazu einfach das uImage/zImage kopieren. Devicetree (*.dtb) 
vom DE10 nehmen. Wenn du Glück hast, hat sich der Devicetree nicht so 
stark verändert, sodass das alte Linux damit noch was anfangen kann.
Sollte auf dem DE10 ein uImage liegne und auf dem DE0 ein zImage oder 
so, musst du das entweder konvertieren oder in u-boot bisschen umbauen.

Möglichkeit 3: Du beschaffst den rohen devicetree des DE10 boards (dts 
datei) und deaktivierst selbst den FPGA manager darin und greifst von 
einer User-Applikation darauf zu. Das Hardwaremodul ist irgendwo im HPS 
Manual beschrieben. Wie man auf physikalische Adressen unter Linux 
zugreift habe ich weiter oben erwähnt. Wenn das mit dem Dev-Tree nichts 
wird, kannst du einfach auch mal probieren das Modul einfach so 
anzusprechen. Aber je nachdem wie der Treiber von Linux damit verbastelt 
ist, bekommst du entweder gar keinen Zugriff auf den Speicherbereich, 
oder der Treiber versaut dir alles.

Möglichkeit 4: Du suchst auf ebay ein altes Board, Oder fragst im Forum. 
Vielleicht mag ja einer dein DE10 haben.

Möglichkeit 5: Du hast Glück und ich habe Lust heute Abend einen alten 
Kernel zusammenzubasteln.

EDIT: Gerade im Mainline kernel geschaut. 4.0 hat noch keine FPGA 
Treiber. Aber 4.4 hat noch den alten mit dem /dev/fpgaX device.

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Vielen Dank für all Deine Bemühungen und Hinweise.
Die SW vom "alten" De0-Nano-SoC board kann man sich auch hier noch 
holen:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=205&No=941&PartNo=4
Läuft aber nicht auf den DE10-Nano, u.a. weil anderer FPGA usw..
Die Möglichkeit 4 ist unsinnig, ich will nicht zurück auf ein altes 
board.
Du brauchst dir wirklich nicht die Mühe machen einen alten Kernel zu 
bauen.
Eine solche Lösung ist für mich also für diese Anwendung nicht sinnvoll. 
Trotzdem vielen Dank für Deine Mühe.
Ich bevorzuge/suche immer noch eher nach der Möglichkeit einen .sof file 
loader zu implementieren.

von M. Н. (Gast)


Lesenswert?

Reinhard H. schrieb:
> Ich bevorzuge/suche immer noch eher nach der Möglichkeit einen .sof file
> loader zu implementieren.

Das SOF ist ein proprietäres Format. Das RBF ist der rohe bitstream, wie 
er auch über AS/PS in den FPGA übertragen werden kann. Wenn du dir bei 
Altera anschuast, wie ihr JTAG funktioniert. Ich meine es gibt eine 
Appnote dafür, dann kannst du das RBF auch über JTAG laden. Das SOF ist 
quasi das RBF mit einigen Zusatzinformationen und Metadaten.

Reinhard H. schrieb:
> Läuft aber nicht auf den DE10-Nano, u.a. weil anderer FPGA usw..

Sollte ansich schon irgendwas tun. Der HPS-Teil ist soweit ich sehe 
gleich. Du musst halt das Image vom DE10 nehmen und nur den kernel 
darauf mit dem vom DE0 tauschen. Alle Hardwarespezifika des Board 
stecken entweder im Device Tree oder in uboot bzw. dem secondary stage 
loader. Diese bleiben aber, wenn du nur den kernel tauscht, erhalten.

Eine Frage noch? Was genau meinst du jetzt mit Loader? Soll der SoC 
selbst den FPGA konfigurieren, oder soll das von extern kommen?

von Elias K. (elik)


Lesenswert?

M. H. schrieb:
> Möglichkeit 4: Du suchst auf ebay ein altes Board, Oder fragst im Forum.
> Vielleicht mag ja einer dein DE10 haben.

Reinhard H. schrieb:
> Die Möglichkeit 4 ist unsinnig, ich will nicht zurück auf ein altes
> board.

Falls du deine Meinung änderst: Ich habe ein wenig genutztes Board, was 
ich bereit wäre zu tauschen.

Hast du übrigens mal nach dem Terasic Atlas-SOC Kit geschaut? Das ist 
das DE0 Nano SoC Board unter anderem Namen. Und die sind lieferbar 
(mouser zum Beispiel).

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Ich habe mir nun mal weitere Hinweise besorgt und Euch allen vielen Dank 
für die Hinweise. Nett gemeint mit dem Tauch eines Boards, aber meine 
Anwendungen sind auf das DE10-Nano portiert und ich nütze auch das 
grössere RAM für mein DPR und auch die HDMI-Schnittstelle.
Was ich ideal finden würde, dass ich die Firmware von verschiedenen 
Anwendungen dynamisch von Unix aus laden kann. Ich werde nun mal 
versuchen den HPS-Teil zu portieren. Vielleicht starte ich auch noch 
eine Anfrage im Altera forum um an die Struktur des .sof Formats zu 
kommen.

von Blechbieger (Gast)


Lesenswert?

Ich verstehe nicht warum du dich so auf sof versteifst. Einziger 
"Vorteil" ist die Unterstützung für laufzeitbegrenzte Eval-Cores. Alle 
anderen sof-Bitstreams kannst du einfach mit Quartus in rbf umwandeln.

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Ja, da hast Du schon Recht, das Umwandeln ist ja auch einfach möglich.
Würde nur zu gerne wissen, wie das im .sof realisiert wurde.

von Reinhard H. (Firma: PRIVAT) (pdp11gy)


Lesenswert?

Hallo nochmals,
nur zur Info, ich habe nun eine optimale Lösung gefunden:
https://github.com/nhasbun/de10nano_fpga_linux_config
Nochmals Danke für all die hilfreichen Hinweise

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.