Embedded Bootloader fuer PowerPC MPC5xx?

May 26, 2006 3 Replies

Hallo allerseits,



ich frage mal hier, weil ich den Eindruck habe, dass sich hier doch einige mehr mit Embedded-SW/HW auskennen als in einer reinen Info-Gruppe:



Ich muss einen embedded Bootloader fuer einen PowerPC aus der



5xx-Reihe (genauer: 563) schreiben (Compiler gcc, Programmiersprache c, eventuell asm). Leider habe ich sowas noch nie gemacht.

Ich habe mir mal den Quellcode fuer 'das UBoot' angeschaut. Aber das ist wohl Overkill fuer meine Zwecke. Alles viel zu generisch, als dass ich es in endlicher Zeit kapieren wuerde ;<



Der Bootloader soll internes Flash verwenden. Im Flash kann man Bloecke schuetzen. Damit brauche ich nicht vor dem Loeschen den Code ins RAM zu kopieren, immerhin. Der Bootloader soll zunaechst nur ueber die serielle Schnittstelle/Hyperterminal funktionieren.



Initialisierungsroutinen fuer das Board und die serielle Schnittstelle habe ich schon. Fuer das interne Flash habe ich bis jetzt noch keine Routinen (wird im Reference Manual 'UC3F' genannt).



Wo es im Moment v.a. auch noch hapert: Als Download-Datei wird bisher eine ELF-Datei verwendet. Muss jetzt der Bootloader diese ELF-Datei erst mal interpretieren um zu 'wissen' an welche Stellen die Sections hinkommen, den ELF-Header extrahieren und die Sections an die richtige Stelle schreiben? Zunaecht muss er es ja erst mal in's Flash schreiben. Muss ich dann in die crt0.S (in das Startup-File?) Routinen schreiben, um diese Sections in die richtigen Stellen im RAM zu schreiben?



Bisher wurde die ELF-Datei ueber eine BDM-HW runtergeladen. In dem Projekt zur Erzeugung der ELF-Datei ist eine Linker-Script-Datei eingebunden. Die sorgt wohl letztlich dafuer, dass die ELF-Datei die Informationen bekommt, wo was letztlich hingeladen werden soll. Den Rest besorgt der BDM-Downloader, oder? Ich braeuchte jetzt also gewissermassen diese Funktion als SW-Routine.



Liege ich ganz falsch mit meinen Ueberlegungen? Hat jemand sowas fuer den PPC schon gemacht? Gibt es irgendeine Website/Buch fuer sowas (sollte schon PowerPC und internes Flash sein), habe vergeblich gesucht. Gibt es vielleicht Firmen, die moeglichst Quellcode anbieten?


Viele Gruesse



Johannes



Ich w=C3=BCrde die ELF-Datei bereits auf dem Host-System in irgendetwas "absolutes" wandeln. Das geht mit einem passenden Linker-Skript und ggf. objcopy. Musst halt mal zB im Linux-Umfeld gucken, wie man das macht; es gibt da allerdings eine unter Umst=C3=A4nden merkbare Lernkurve.

F=C3=BCr den seriellen Download solltest du dir ein geeignetes Protkoll a= us der XYZ-Modem Familie suchen und ggf. noch eine Pr=C3=BCfsumme =C3=BCber = alles vorsehen, damit du keinen M=C3=BCll ins Flash schreibst.

Dann brauchst du noch den Code f=C3=BCr die Flashprogrammierung, den du d= ir am besten aus uboot oder so klaust.

Gru=C3=9F, Enrik

Kann das Flash auch concurrent read/write? Ansonsten bleibt der Code in den geschützten Blöcken zwar erhalten, aber die CPU kann dort trotzdem nicht lesen, während ein Schreib-/Löschzyklus auf einen anderen Block läuft.

Wenn das Flash das kann, mußt Du die Blockaufteilung so machen, daß Bootlader und zu löschender Teil in jedem Fall in getrennten, parallel zugreifbaren Blöcken liegen.

Ich bevorzuge es normalerweise, als erstes den Speicher zu testen und dann den restlichen Bootlader ins RAM zu kopieren und von dort auszuführen. Das funktioniert zum einen mit beliebigen einfachen Flashroms, und zum anderen kann der 2. Teil, der aus dem RAM läuft, in C geschrieben werden - bei dem Teil, der aus dem Flash läuft und das RAM testen soll, geht das mangels Speicher für den Stack schlecht, es sei denn, man hat wie beim MPC860 etwas SRAM.

Flashroutinen für ein bestimmtes Flash und eine feste Busorganisation sind schnell geschrieben und Beispiele gibt es massig im Netz. Interessanter wird es, wenn in der Serie dann verschiedenste Flash-Typen benutzt werden sollen.

Ja.

Ich weiß jetzt nicht, welche crt0.S Du meinst - die des Bootloaders, oder die des zu startenden ELF-Files?

im Bootlader benutze ich normalerweise keine mitgelieferte crt0.S, sondern der Startcode muß eh ans Board angepaßt werden - und heißt dann bei mir auch anders.

Die crt0.S der zu startenden ELF-Datei geht nicht: dafür müßte die ELF-Datei ja schon passend im RAM liegen.

Korrekt.

Deutlich einfacher geht es, wenn Du diese Arbeit auf dem Entwicklungssystem im Makefile erledigst: die ELF-Datei mit objcopy in eine Binärdatei umwandeln, die der Bootlader dann einfach ind RAM umkopieren kann. Dazu muß der Bootlader allerdings die Zieladresse und den Einsprungpunkt kennen - entweder, man macht die konstant und sorgt im Linkerscript dafür, daß das paßt (dann kann man das aber nie mehr ändern, ohne den Bootlader anzupassen), oder man packt noch einen kurzen Header davor.

Ein eigener Header ist eh sinnvoll: außer Zieladresse und Einsprungpunkt kann man da ein Magic, eine Board-ID und eine Prüfsumme unterbringen - das verhindert, daß der Kunde eine ungeeignete Datei oder eine für das falsche Board ins Flash lädt. Ich rege mich immer wieder über Systeme auf, bei denen der Entwickler solche grundlegenden Sachen vergessen hat - bsonders, wenn beim Update auch der Bootcode überschrieben wird und das Board bei einem Fehler erstmal Schrott ist.

Ein weiterer Punkt: wenn man nicht gerade reichlich Flash hat, möchte man normalerweise das Image im Flash komprimieren. Die zlib ist frei einsetzbar und der Code zum Auspacken recht kompakt. Den Entpacker kann man entweder in den Bootlader integrieren, oder man packt ihn vor das gepackte Applikations-Image, dann muß der Bootlader nichts davon wissen.

Ja - von Null auf für den MC68040, danach für den MPC860, SH7751 und zuletzt IXP425. Bei den letzten 3 gab allerdings schon einen (SH3-)Bootlader in der Firma, der dann jeweils erweitert wurde.

Wenn Du von 0 auf startest, würde ich wirklich empfehlen, uboot oder einen anderen Bootcode, den es für Deinen oder einen ähnlichen Prozessor gibt, als Basis zu nehmen. Hat Freescale nicht irgendwo Beispielcode zu dem Bootlader eines Evalboards oder so? Beim Coldfire gab es damals IIRC sowas, während die einzelnen Codeschnipsel zur Peripherie des MPC8xx sehr rudimentär waren.

Ich kenne zumindest keine Bücher. Die Kombination PPC und internes Flash ist auch sehr speziell - ich denke, Du kannst froh sein, wenn Du zu PPC alleine was geeignetes in Papierform findest. Die Anforderungen sind halt sehr speziell (und pro Board unterschiedlich), da ist wenig Bedarf für entsprechende Literatur. Das ist eher ein Entwicklungsjob auf Basis der Herstellerdoku, da findet man eher mehr oder weniger dokumentierten Code - uboot hast Du ja schon gefunden.

Firmen gibt es sicherlich - im Bereich Consulting rund um embedded Linux wird man da sicherlich fündig, jedes embedded-Linux-Gerät braucht ja auch so einen Bootlader mit ähnlichen Anforderungen. Mir fallen auf Anhieb DENX und Montavista ein, da habe ich aber keinen Überblick.

cu Michael

Some people have no repect of age unless it is bottled.

Michael Schwingen schrub:

MPC5XX ist prinzipiell bereits vorhanden. Und vielleicht gibt es sogar schon ein unterstütztes Board, das der Wunsch-Hardware sehr nahe kommt, so dass man sich nur noch ein paar Spezialsachen selber dranstricken muss (z.B. sowas wie besondere USB-Controller, andere Netzwerk-PHYs oder so).

ACK.

Dazu gibt es z.B. den "Denx U-Boot and Linux Guide" (kurz: DULG) auf

formatting link

Und Herr Wolfgang Denk ist idR sehr kooperativ (man sollte aber schon eine gute Ahnung haben, wovon man spricht, bevor man sich an ihn wendet).

Ansgar

Mails an die angegebene Adresse erreichen mich - oder auch nicht! Gültige Adresse gibt's bei Bedarf! Mails to the given address may or may not reach me - valid return address will be given when required!

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required