Es geht um einen Altera FPGA mit NIOS II Prozessor, auf dem Linux 3.7
läuft. Der Kernel verwendet einen Device Tree zur Geräteerkennung, was
auch korrekt funktioniert. Nun würde ich gerne Teile des Device Trees
auslesen, um sie für eigene Treiber zu nutzen. Z.B. würde ich gerne die
property "reg" aus folgendem Knoten lesen:
1
memory@0{
2
device_type="memory";
3
reg=<0x110000000x00080000
4
0x110850000x00000400
5
0x000000000x08000000>;
6
};
Im /proc-Dateisystem sieht die property folgendermassen aus:
Wat is'n das fürn sinnloser Brei? Wo sind meine reg-Werte 0x11000000
usw.? Ich habe auch versucht, die Werte direkt aus meinem Treiber
(Kernelmodul) zu lesen:
Benutzt du eine initrd Ramdisk oder ein intramfs? Bei letzterem hatte
ich schon das prblem, das /proc/device-tree überschreiben worden ist,
wenn das RAM knapp geworden is...
Ich weiss nicht mehr woran es lag, allerdings war /proc/device-tree
Mist, solange ich ein initramfs benutzt habe...
Andere Möglichkeit:
Kleines C-Programm um den device-tree als binary aus dem speicher zu
holen und dann mit der libfdt auslesen. Klappt super.
rev schrieb:> Kleines C-Programm um den device-tree als binary aus dem speicher zu> holen und dann mit der libfdt auslesen. Klappt super.
Hast du Beispielcode dafür? Wo im Speicher finde ich den device tree?
Also die libfdt ist ja ziemlich selbsterklärend. Man muss nur den Buffer
mit dem Device-Tree-Binary übergeben, und kann dann ziemlich alles damit
anstellen.
Wo der Device-Tree liegt hängt natürlich von deinem Board ab. Irgendwo
im Flash, also evtl in einem der /dev/mtdX
Der Device-Tree wird ja vom Bootloader beim Start an den Kernel
übergeben, also irgendwo im Speicehr wird er schon sein.
Die unelegante(aber sehr effektive) Methode wäre /dev/mem zu beutzen um
den Speicher zu lesen...
Ich hab die Wurzel des Problems gefunden: Der Device-Tree-Speicher wird
vom Kernel freigegeben, sobald er nicht mehr benötigt wird, d.h. nachdem
der Tree vom Kernel ausgewertet wurde. Wenn ich mein Modul, das den Baum
liest, direkt in den Kernel kompiliere, sehe ich die richtigen Werte
statt binären Datenmüll. Hat jemand eine Idee, wie man es unterbinden
kann, dass der Kernel den Devtree-Speicher freigibt?
segfault (core dumped) schrieb:> Hat jemand eine Idee, wie man es unterbinden> kann, dass der Kernel den Devtree-Speicher freigibt?
Vielleicht fragst Du da an geeigneter Stelle nach z.B. auf der
Kernel-Mailing-List. [1]
Duke
[1] http://www.lkml.org
Für die Nachwelt: Das Freigeben des Device-Tree-Speichers durch den
Kernel kann mit einer einfachen Code-Modifikation vermieden werden. Vor
dem Aufruf von unflatten_device_tree() sind folgende Zeilen einzufügen:
1
void*fdt_copy;
2
fdt_copy=alloc_bootmem(size);
3
memcpy(fdt_copy,initial_boot_params,size);
4
initial_boot_params=fdt_copy;
Dies erstellt eine Kopie des Device-Trees in einem Speicherbereich, der
nicht freigegeben wird. Wo genau unflatten_device_tree() aufgerufen
wird, ist architekturabhängig.
segfault (core dumped) schrieb:> Für die Nachwelt: Das Freigeben des Device-Tree-Speichers durch den> Kernel kann mit einer einfachen Code-Modifikation vermieden werden. Vor> dem Aufruf von unflatten_device_tree() sind folgende Zeilen einzufügen:> void *fdt_copy;> fdt_copy = alloc_bootmem(size);> memcpy(fdt_copy, initial_boot_params, size);> initial_boot_params = fdt_copy;> Dies erstellt eine Kopie des Device-Trees in einem Speicherbereich, der> nicht freigegeben wird. Wo genau unflatten_device_tree() aufgerufen> wird, ist architekturabhängig.
irgendwie sieht das merkürdig aus.
da kannst du auch gleich
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.