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
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.
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)
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.
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.
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.
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.
Ein .rbf laden ist einfach. Siehe hier: Beitrag "Re: Altera FPGA mit JTAG über SVF-Player konfigurieren Frage"
.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.
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.
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.
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?
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).
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.