Forum: Mikrocontroller und Digitale Elektronik Eigenes i.MX6 Board - U-Boot läuft. Wie weiter mit dem Kernel


von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Hallo zusammen

Nach dem erfolgreichen Krimi 
Beitrag "Re: Eigenes i.MX6 Board - JTAG läuft. Wie nun weiter mit U-Boot?"

Kommt nun ein zweiter Teil. "Wie weiter mit dem Kernel"

Ich freue mich, wenn ich auch diesesmal wieder zahlreiche Leser und 
Leserinnen haben werde.

----

Also
U-Boot und Netzwerk sowie MMC und Uart funktionieren ja inzwischen.
Nun habe ich begonnen mittels Buildroot, einen Kernel zu kompilieren.

Dazu habe ich folgendes Versucht:

1) imx_v6_v7_defconfig verwendet.
zusammen mit meinem Device-Tree vom U-Boot.
Wobei ich doch noch einige Fehler im DT hatte (ungenutzte Verweise etc.)

Diese habe ich korrigiert und dadurch einen 8.2MB grossen Kernel uImage 
erhalten.

Diesen habe ich mittels tftp an adresse 0x80200000 geladen und dann 
mittels bootm gestartet. Es kommt dann die Meldung "starting kernel..." 
und dann nichts mehr.

etwwas googlen und gemerkt, da muss ich noch ein paar Dinge einstellen.

2. Versuch.
Ich habe eine eigene defconfig erstellt. Diese von allen GPU relevanten 
dingen befreit und noch folgendes hinzugefügt:
1
CONFIG_DEBUG_LL=y
2
CONFIG_DEBUG_LL_INCLUDE="mach/imx.S"
3
CONFIG_DEBUG_IMXUL_UART=y
4
CONFIG_DEBUG_IMX_UART_PORT=1

Mit menu makeconfig unter kernel die loadaddresse 0x80200000 gesetzt.
Kernel format: uImage with appended DT
Compression: gzip

(weitere Settings im Bild)

Kompiliert....
Ergibt einen 5.2MiB grossen Kernel. Also etwas kleiner. So wie erwartet.

Dann in U-Boot folgendes gesetzt:
1
bootargs console=ttymxc0, 115200
Quelle: https://community.nxp.com/thread/434535

Erneut mit tftp das uImage gezogen, bootm... hoffen...
1
Filename 'uImage'.
2
Load address: 0x80200000
3
Loading: #################################################################
4
         #################################################################
5
         #################################################################
6
         #################################################################
7
         #################################################################
8
         ###############################################
9
         2.6 MiB/s
10
done
11
Bytes transferred = 5452326 (533226 hex)
12
=> bootm
13
## Booting kernel from Legacy Image at 80200000 ...
14
   Image Name:   Linux-5.1.6
15
   Image Type:   ARM Linux Kernel Image (uncompressed)
16
   Data Size:    5452262 Bytes = 5.2 MiB
17
   Load Address: 80200000
18
   Entry Point:  80200000
19
   Verifying Checksum ... OK
20
   Loading Kernel Image ... OK
21
22
Starting kernel ...

Was jedoch interessant zu erwähnen ist ist, dass wenn ich mit GDB die 
Ausführung unterbreche sehe ich, dass der PC bei 0xC0822798 steht.
Eigentlich sollte der nach meinem Wissen irgendwo bei 0x8xxxxxx stehen, 
also im RAM.

Leider habe ich es bisher nicht geschafft, weitere Informationen zum 
Startvorgang herauszubekommen...


Es gäbe ja eigentlich noch eine Community von NXP für solche Anliegen. 
Dort muss man aber für jedes neue Thema erst mal ca. 12-24h warten, bis 
dieses überhaupt freigeschaltet wurde. Dann für jede Antwort wieder 
mehrere Stunden... Zudem habe ich das gefühl, hier sind mehr Experten 
unterwegs :)

Vielleicht hat ja jemand wieder einen guten Tipp

Danke :)

: Bearbeitet durch User
von Markus W. (dl8mby)


Lesenswert?

Hallo Holger,

möglicherweise kannst Du die eine oder andere Info
aus meinem Thread zum BPi-R2 herausziehen.

Beitrag "Linux Kernel 5.1.1. auf dem BPi-R2"

Habe auch in Deinem Thread (oder Krimi) zum iMX6
gelesen und wider einiges gelernt.

Möglicherweise ist Dir bereits bekannt, dass der Kernel,
je nach dem wie er kompiliert wurde eine, eine
initrd (eine initiale Ramdisk) mit Treibern benötigt
um zu starten.

Auch wird ein DT benötigt, den Du aber möglicherweise
schon im U-Boot konfiguriert hast.
Dieser wird aber von Kernel ja auch separat geladen, so
wie ich das verstehe, muss also auch beim Bootvorgang
ins RAM geladen werden wie das Linux Image und die initrd.

Viel Erfolg

Markus

von Holger K. (holgerkraehe)


Lesenswert?

Markus W. schrieb:
> möglicherweise kannst Du die eine oder andere Info
> aus meinem Thread zum BPi-R2 herausziehen.

Vielen Dank für den Link
Werde ich mir auf jedenfall anschauen.

Markus W. schrieb:
> Habe auch in Deinem Thread (oder Krimi) zum iMX6
> gelesen und wider einiges gelernt.

Das freut mich! So war das Ganze noch etwas weniger "umsonst"

Markus W. schrieb:
> Möglicherweise ist Dir bereits bekannt, dass der Kernel,
> je nach dem wie er kompiliert wurde eine, eine
> initrd (eine initiale Ramdisk) mit Treibern benötigt
> um zu starten.

Nein, ich hatte da nicht daran gedacht. Jetzt wo du es erwähnst erinnere 
ich mich aber an den Begriff. Ich dachte nur, dass vielleicht etwas mehr 
als nur "starting kernel..." zu erhalten wäre. Denn bei einigen sieht 
das ganze doch etwas anders aus, nachdem sie earlyprintk aktiviert 
haben. Ich dachte, mit meiner konfig hätte ich dies.

Hier mal ein Beispiel wo man mehr sieht:
1
Starting kernel ...
2
3
 
4
5
Uncompressing Linux... done, booting the kernel.
6
7
[ 0.000000] Booting Linux on physical CPU 0x0
8
9
[ 0.000000] Linux version 3.14.28-1.0.0_ga+g91cf351 (Lavanya@FSETBLR1LX035) (gcc version 4.9.1 (GCC) ) #3 SMP PREEMPT Wed Jun 29 16:42:46 IST 2016
10
11
[ 0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
12
13
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
14
15
[ 0.000000] Machine model: Freescale i.MX6 DualLite SABRE Smart Device Board
16
17
[ 0.000000] bootconsole [earlycon0] enabled
18
19
[ 0.000000] cma: CMA: reserved 320 MiB at 1c000000

Ich denke, zumindest "uncompressing Linux" müsste ich doch zu sehen 
bekommen?

Markus W. schrieb:
> Auch wird ein DT benötigt, den Du aber möglicherweise
> schon im U-Boot konfiguriert hast.
> Dieser wird aber von Kernel ja auch separat geladen, so
> wie ich das verstehe, muss also auch beim Bootvorgang
> ins RAM geladen werden wie das Linux Image und die initrd.

Dass der DT benötigt wird, wusste ich.
Da ich beim image ausgewählt habe "uImage appended DT" dachte ich, dass 
mein DT nun im Image steckt...

Markus W. schrieb:
> Viel Erfolg

Vielen Dank :)

von Markus W. (dl8mby)


Lesenswert?

Hallo Holger,

so wie ich das verstanden habe, macht es kein
Sinn, dass der DT im Kernel steckt.
Beim Kompilieren des Kernels bringst Du nur dem
Kernel bei einen DT entsprechend lesen zu könne
und diese Infos mittels der entsprechenden Treiber
auch zu nutzen.
Der Sinn vom DT ist ja eben nicht den Kernel immer
wieder kompilieren zu müssen, sondern den DT sagen
wir mal wie ein Addon einbinden zu können um die
darunterliegende Hardware vom Kernel besser und
gezielter ansprechen zu können.
Damit werden die Devicetreiber von ihrer Art universeller
und nicht zu speziell für jede darunterliegende HW.

Ich hoffe das so richtig wiedergegeben zu haben
und bin gerne bereit diese Aussage zu revidieren, wenn
begründete Einwände/Korrekturen hier genannt werden.

Markus

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hallo Holger

du hast doch JTAG. Da kannst du auch den Bootprozess von Linux debuggen 
;-) Das geht eigentlich ganz gut wenn man sich darüber bewusst ist das 
auch der Kernel ei

Holger K. schrieb:
> Was jedoch interessant zu erwähnen ist ist, dass wenn ich mit GDB die
> Ausführung unterbreche sehe ich, dass der PC bei 0xC0822798 steht.
> Eigentlich sollte der nach meinem Wissen irgendwo bei 0x8xxxxxx stehen,
> also im RAM.

Kann sein das dein Kernel schon im virtuellen Adressraum läuft du das 
aber nur nicht siehst. Daher die Adresse außerhalb des RAM.

Du bekommst auf jeden Fall Ausgaben auch ohne (init)rootfs wenn der 
Kernel richtig konfiguriert ist.

Ich würde an deiner Stelle einen DT nehmen der mit dem Kernel mitkommt 
und auf dein Board anpassen. Dann kein uImage sondern ein zImage + 
separatem DT image. Und den Kernel auch selber bauen außerhalb von 
Buildroot.

Viel fehlt sicher nicht. Hardware läuft ja.

von moep (Gast)


Lesenswert?

Holger K. schrieb:
> Ich denke, zumindest "uncompressing Linux" müsste ich doch zu sehen
> bekommen?

Ich glaube, dass du diese Zeile nicht zu sehen bekommst, weil du einen 
unkomprimierten Kernel uImage verwendest. zImage ist gepackt. Ich würde 
mal probieren den Device Tree nicht an das Image zu hängen sondern per 
U-Boot in den RAM zu laden. Die Adresse für den Device Tree kannst du 
dann an den Kernel in U-Boot übergeben.

von S. R. (svenska)


Lesenswert?

Du kannst auf das uImage auch komplett verzichten, weil das ist Legacy 
und nicht mehr nötig.

Dann musst du drei Dateien laden:
- den Kernel selbst (zImage)
- initramfs (das cpio-Teil)
- den Devicetree (FDT).

An welche Adresse du die lädst, ist relativ egal, der Kernel sollte sich 
selbst umherschieben können. Wenn er erstmal läuft, ist die MMU aktiv 
und physische Adressen sind (bis auf cma) egal.

Starten tust du das Teil mit "bootz", dem du die drei Adressen mitgibst 
(Kernel, initramfs, fdt). Wenn du kein initramfs hast, nimmst du "-" als 
Adresse. Also "bootz 0x80200000 - 0x80100000" oder so.

Auch ohne initramfs solltest du die Kernel-Meldungen bekommen. 
Zumindest, wenn du den Kernel mit "earlyprintk" und ohne "quiet" 
benutzt. Wie du festgestellt hast, kommen die Argumente nach "bootargs".

Wenn der Kernel läuft, ist Paging aktiv und der Kernel sollte im oberen 
Gigabyte des Adressraums liegen. Dein 0xC....... klingt also korrekt. 
Ich tippe mal darauf, dass mindestens die Ausgabe nicht funktioniert.

Als letzten Schritt startet der Kernel "init", und wenn das nicht geht 
(mangels initramfs/rootfs), gibt es ein Panic. Das solltest du sehen, 
vorher brauchst du eigentlich nicht weitermachen.

von S. R. (svenska)


Lesenswert?

Noch ein Nachtrag: Du solltest im Prinzip jeden ARM-Kernel (mit 
aktivierten Treibern) booten können, also insbesondere auch die 
Distributions-Standardkernel. Genau dafür ist der Devicetree ja mal 
eingeführt worden.

Ich war jedenfalls schon sehr oft erfolgreich darin, kaputte Kernel zu 
bauen. Ein known-good ist hilfreich, selbst wenn er frühzeitig panic()t.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Hab' da schon lange nix mehr gemacht, aber da scheint mir ja recht frueh 
schon ordentlich was schief zu gehen. Spontan fallen mir 2 Sachen ein:
* Stimmt die angegebene Konsole?
* Wie schaut das mit dem "uncompressing the Kernel" aus? Kanns sein, 
dass der sich beim aufblasen irgendwie selber ueberschreibt?

Gruss
WK

von Holger K. (holgerkraehe)


Lesenswert?

Danke für all eure Antworten.

Markus W. schrieb:
> Der Sinn vom DT ist ja eben nicht den Kernel immer
> wieder kompilieren zu müssen, sondern den DT sagen
> wir mal wie ein Addon einbinden zu können um die
> darunterliegende Hardware vom Kernel besser und
> gezielter ansprechen zu können.

Da stimme ich dir zu.
Ich dachte nur, dass es für den Entwicklungsprozess praktisch ist, wenn 
ich nicht noch ein weiteres File hinzuladen muss.

Μαtthias W. schrieb:
> du hast doch JTAG. Da kannst du auch den Bootprozess von Linux debuggen
> ;-) Das geht eigentlich ganz gut wenn man sich darüber bewusst ist das
> auch der Kernel ei

ei?

Ja, dazu bräuchte ich dann das ELF-File :) meinst du damit, dass der 
kernel eigentlich ein elf-file ist?

Μαtthias W. schrieb:
> Du bekommst auf jeden Fall Ausgaben auch ohne (init)rootfs wenn der
> Kernel richtig konfiguriert ist.

Das klingt ja schonmal gut.
Ich finde es auch etwas merkwürdig, dass da garnichts rauskommt.
Der DT ist ja von einem eval mit gleichem Prozessor kopiert.
Die Pinbelegungen stimmen auch. Die Register für UART sind im Prozessor 
ja bereits konfiguriert.

Μαtthias W. schrieb:
> Ich würde an deiner Stelle einen DT nehmen der mit dem Kernel mitkommt
> und auf dein Board anpassen.

Das hab ich gemacht. DT von einem EVAL genommen und angepasst. Bzw. 
eigentlich nur ein paar Dinge entfernt.

Μαtthias W. schrieb:
> Viel fehlt sicher nicht. Hardware läuft ja.

Ich hoffe es :)

moep schrieb:
> Ich glaube, dass du diese Zeile nicht zu sehen bekommst, weil du einen
> unkomprimierten Kernel uImage verwendest. zImage ist gepackt. Ich würde
> mal probieren den Device Tree nicht an das Image zu hängen sondern per
> U-Boot in den RAM zu laden. Die Adresse für den Device Tree kannst du
> dann an den Kernel in U-Boot übergeben.

Ok, werde ich gleich mal versuchen.

S. R. schrieb:
> Dann musst du drei Dateien laden:
> - den Kernel selbst (zImage)
> - initramfs (das cpio-Teil)
> - den Devicetree (FDT).

Vielen Dank für deine ausführliche Erklärung. Dies werde ich gleich mal 
versuchen.

S. R. schrieb:
> Dein 0xC....... klingt also korrekt.
> Ich tippe mal darauf, dass mindestens die Ausgabe nicht funktioniert.

Klingt ja schonmal nicht ganz so schlecht.

Dergute W. schrieb:
> schon ordentlich was schief zu gehen. Spontan fallen mir 2 Sachen ein:
> * Stimmt die angegebene Konsole?
> * Wie schaut das mit dem "uncompressing the Kernel" aus? Kanns sein,
> dass der sich beim aufblasen irgendwie selber ueberschreibt?

Das ist eine gute frage...

Wobei das uImage aktuell nicht komprimiert ist.


Also ich habe den Kernel nun mit folgenden bootargs getestet:
1
setenv bootargs console=tty1,115200n8 earlyprintk
2
setenv bootargs console=ttyO1,115200n8 earlyprintk
3
setenv bootargs console=ttyO0,115200n8 earlyprintk
4
setenv bootargs console=ttymxc0,115200n8 earlyprintk
5
setenv bootargs console=ttymxc1,1152008 earlyprintk
6
setenv bootargs console=ttymxc0,115200n8 
7
setenv bootargs console=ttymxc1,115200 
8
setenv bootargs console=ttymxc0,115200 earlyprintk
9
setenv bootargs console=ttymxc1,115200n8 earlyprintk

leider alle ohne Erfolg.
Ich versuche nun noch die variante mit zImage und einzelnen DT.

Ich frage mich, woher ich weiss, wie meine console unter linux 
heisst....

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Lesenswert?

So, habe nun zImage mit separaten dtb ausprobier.
1
=> bootz 0x80200000 - 0x80000000
2
Kernel image @ 0x80200000 [ 0x000000 - 0x52daa0 ]
3
4
Starting kernel ...

Da ändert sich nichts...
Echt mühsam, so ganz im Blindflug...

weitere versuche:
1
setenv bootargs console=tty0,115200 earlyprintk
2
setenv bootargs console=tty1,115200 earlyprintk
3
setenv bootargs console=ttyS0,115200 earlyprintk
4
setenv bootargs console=ttyS1,115200 earlyprintk

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Ist CONFIG_EARLY_PRINTK aktiviert?

An welchen Pins des i.MX6ULL ist der UART den du für die Konsole 
benutzt?
Was ttymxc0 und was ttymxc1 ist, wird über den Device Tree festgelegt.
ttyS0 ist mit dem Prozessor definitiv falsch. tty1 bringt nur dann 
etwas, wenn du ein Display angeschlossen und korrekt im Device Tree 
konfiguriert hast.

Wenn sich die CPU schon bei 0xC0822798 tummelt, kannst du das vmlinux in 
GDB laden um zu sehen in welcher Funktion sie sich befindet. Man könnte 
auch den printk Puffer darüber auslesen.

von Holger K. (holgerkraehe)


Lesenswert?

Guten Morgen.
Vielen Dank für deine Antwort.

Daniel schrieb:
> Ist CONFIG_EARLY_PRINTK aktiviert?

Nein... war es natürlich nicht. Wir gleich eingebaut und nochmals 
compliliert.

Daniel schrieb:
> Was ttymxc0 und was ttymxc1 ist, wird über den Device Tree festgelegt.

Nun, da steht leider nicht wirklich was von tty drinn.
Beim devicetree aus dem eval steht (diesen habe ich übernommen, daher 
steht bei mir das gleiche drin. Hab einfach ein paar Devices 
rausgenommen):
1
chosen {
2
    stdout-path = &uart1;
3
  };
4
....
5
&uart1 {
6
  pinctrl-names = "default";
7
  pinctrl-0 = <&pinctrl_uart1>;
8
  status = "okay";
9
};
10
....
11
&iomuxc {
12
  pinctrl-names = "default";
13
14
  pinctrl_uart1: uart1grp {
15
    fsl,pins = <
16
      MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1
17
      MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1
18
    >;
19
  };
20
}

bei einem Raspberry steht z.B. auch
1
&uart0 {
2
  pinctrl-names = "default";
3
  pinctrl-0 = <&uart0_gpio14>;
4
  status = "okay";
5
};

Und trotzdem greift man dann über z.B. tty... darauf zu...

von Holger K. (holgerkraehe)


Lesenswert?

So, hab nun ein neues zImage erstellt.
Diesesmal mit

CONFIG_EARLY_PRINTK

Interessanterweise wurde das Image um ein paar Bytes kleiner.
Aber wirklich nur ca. 200 Bytes.


Habe dann versucht mit folgenden Konfigs zu booten
1
 setenv bootargs console=ttymxc0, 115200 earlyprintk
2
 setenv bootargs console=ttymxc1, 115200 earlyprintk
3
...
4
5
bootz 0x80200000 - 0x80000000
6
Kernel image @ 0x80200000 [ 0x000000 - 0x52d9e0 ]
7
8
Starting kernel ...

Leider ohne Erfolg.

von Holger K. (holgerkraehe)


Lesenswert?

Daniel schrieb:
> Wenn sich die CPU schon bei 0xC0822798 tummelt, kannst du das vmlinux in
> GDB laden um zu sehen in welcher Funktion sie sich befindet. Man könnte
> auch den printk Puffer darüber auslesen.

Das hört sich interessant an. Wie macht man das genau?
Da gibt es glaube ich noch eine Wissenslücke bei mir...

EDIT:

Hier habe ich noch was gefunden:
https://stackoverflow.com/questions/18994633/how-to-specify-the-device-name-for-uart-in-device-tree-dts-file

Offenbar wird die Serielleschnittstelle zu ttyS0..

Habe jetzt mal die aliase hinzugefügt.
1
aliases {
2
    serial1 = &uart1; // becomes /dev/ttyS1
3
  };

Müsste nun also ttyS1 sein.

EDIT:

Gerade auch versucht mit ttyS1.
Hoffnungslos... Da kommt einfach nichts auf der konsole raus.

Daniel schrieb:
> An welchen Pins des i.MX6ULL ist der UART den du für die Konsole
> benutzt?

Die UART ist an den Pins UART1_RX_DATA und UART1_TX_DATA , BALL K16 und 
K14

EDIT:

Daniel schrieb:
> Man könnte
> auch den printk Puffer darüber auslesen.

Hab mal das System.map File angeschaut.

Gemäss diesem Artikel: 
https://tinylab.gitbooks.io/elinux/en/dbg_portal/kernel_dbg/Debugging_by_printing/Debugging_by_printing.html

Müsste ich einen printk_buf finden.
Ich finde aber nur trace_array_printk_buf

Ob dies das gleiche ist? vermutlich ja nicht...

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

Kompiliere den Kernel mit Debug-Symbolen, nimm JTAG und lasse den 
Debugger den Backtrace ausrechnen. Sobald Linux die MMU in Betrieb 
nimmt, kannst du mit den "Raw"-Adressen nichts mehr anfangen.

An dem Trace kann man aber vielleicht raten, was der Kernel zu tun 
versucht. Falls er tatsächlich hängt, würde ich vermuten, dass für 
irgendein Subsystem eine Clock nicht aktiviert ist. Der Trace verrät 
dann vielleicht, welches.

Edit: Ach, ich sehe gerade, der Vorschlag kam schon. Du kannst das 
vmlinux-Image gdb einfach als Argument beim Starten übergeben, dann lädt 
es die Symbole von dort. Ich weiß nicht genau, welcher Teil des Ganzen 
das virtual/physical Address Mapping macht, aber bei mir hat es zum 
Glück einfach so funktioniert ...

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Hallo,

da ist einiges durcheinander.

Holger K. schrieb:
> Das hab ich gemacht. DT von einem EVAL genommen und angepasst.
> Bzw. eigentlich nur ein paar Dinge entfernt.

Es sollte eigentlich reichen, die jeweiligen Devices mit
1
  status = "disabled";
zu deaktivieren.

Holger K. schrieb:
> So, hab nun ein neues zImage erstellt.
> Diesesmal mit
>
> CONFIG_EARLY_PRINTK

Achtung: "early printk" läuft, bevor die eigentlichen Treiber geladen 
sind.  Das heißt, weder pinmuxing noch die serielle Schnittstelle sind 
aktiv und die DT-Einstellungen sind auch noch nicht geladen.

Deswegen musst du in der Kernel-Konfiguration die zu verwendende 
Schnittstelle für early-printk separat konfigurieren und die 
Unterstützung auch per Kernel-Argument "earlyprintk" extra einschalten.

Schau mal unter CONFIG_DEBUG_LL und vergleichbar (im menuconfig sollte 
das recht eindeutig sein).

Ungefähr so:
1
  setenv bootargs console=ttymxc0,115200n8 earlyprintk

Kein Leerzeichen zwischen Device, Komma und Baudrate.

Dann solltest du zumindest etwas sehen, bis der serielle Treiber 
übernimmt.

Holger K. schrieb:
> Nun, da steht leider nicht wirklich was von tty drinn.

Der Kernel nennt serielle Schnittstellen historisch immer ttyXXXnn, 
wobei XXX vom Treiber entschieden wird und nn eine laufende Nummer ist.

Darum heißen USB-Adapter ttyACM (wenn USB-CDC) oder ttyUSB (wenn nicht), 
und die klassischen ns16550 heißen ttyS. Dein ttyS0 ist also definitiv 
falsch.

Siehe zum Beispiel hier:
http://trac.gateworks.com/wiki/serial

> Beim devicetree aus dem eval steht (diesen habe ich übernommen,
> daher steht bei mir das gleiche drin. Hab einfach ein paar Devices
> rausgenommen):
> chosen {
>     stdout-path = &uart1;
>   };

Die "chosen"-Node ist etwas speziell. Die Idee ist, dass der Bootloader 
diese Node zur Laufzeit aus vom Benutzer eingestellten Dingen erzeugt 
(z.B. Bootmenü). Scheint aber nicht üblich zu sein.

In jedem Fall steht dort das Device drin, welches für die Konsole 
benutzt werden soll. Du solltest also auch ohne "console=" booten 
können.

>   pinctrl_uart1: uart1grp {
>     fsl,pins = <
>       MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1
>       MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1
>     >;
>   };

Stimmt das bei dir auch? :-)

> Und trotzdem greift man dann über z.B. tty... darauf zu...

Der Devicetree beschreibt die Hardware, nicht das Betriebssystem! Da 
steht nicht drin, wie Linux die Devices zu nennen hat, sondern welche es 
gibt und wo sie liegen.

> Hier habe ich noch was gefunden:
> 
https://stackoverflow.com/questions/18994633/how-to-specify-the-device-name-for-uart-in-device-tree-dts-file
>
> Offenbar wird die Serielleschnittstelle zu ttyS0..

Wenn du in den Eintrag schaust, siehst du
1
  compatible = "ns16550";
 (neben anderen). Das ist der Treiber, der auch auf PCs benutzt wird und 
darum heißt es dort ttyS. Bei dir definitiv nicht!

von Holger K. (holgerkraehe)


Lesenswert?

Danke für eure Antworten.

Sven B. schrieb:
> Du kannst das
> vmlinux-Image gdb einfach als Argument beim Starten übergeben, dann lädt
> es die Symbole von dort.

Ok, werde ich mir mal anschauen.

S. R. schrieb:
> Es sollte eigentlich reichen, die jeweiligen Devices mit

Danke. das kannte ich noch nicht.

S. R. schrieb:
> Achtung: "early printk" läuft, bevor die eigentlichen Treiber geladen
> sind.  Das heißt, weder pinmuxing noch die serielle Schnittstelle sind
> aktiv und die DT-Einstellungen sind auch noch nicht geladen.

Dann sollte dies ja eigentlich gut sein. Denn die Schnittstelle wurde ja 
bereits in u-boot korrekt konfiguriert.

S. R. schrieb:
> Deswegen musst du in der Kernel-Konfiguration die zu verwendende
> Schnittstelle für early-printk separat konfigurieren und die
> Unterstützung auch per Kernel-Argument "earlyprintk" extra einschalten.
>
> Schau mal unter CONFIG_DEBUG_LL und vergleichbar (im menuconfig sollte
> das recht eindeutig sein).

Hab ich.

Meine Config sieht so aus:
1
CONFIG_SOC_IMX6UL=y
2
CONFIG_DEBUG_LL=y
3
CONFIG_DEBUG_LL_INCLUDE="mach/imx.S"
4
CONFIG_DEBUG_IMXUL_UART=y
5
CONFIG_DEBUG_IMX_UART_PORT=1
6
CONFIG_EARLY_PRINTK

S. R. schrieb:
> setenv bootargs console=ttymxc0,115200n8 earlyprintk

Ich hab jetzt folgendes versucht:
1
setenv bootargs console=ttymxc0,115200n8 earlyprintk
2
setenv bootargs console=ttymxc1,115200n8 earlyprintk
3
setenv bootargs console=ttymxc0,115200 earlyprintk

Leider weiterhin ohne erfolg. Nichtmal "uncompressing" bekomme ich zu 
sehen.

S. R. schrieb:
> Stimmt das bei dir auch? :-)

Wie meinst du das?
Es steht jedenfalls dies bei mir im DT. Und ich verwende ja genau diese 
beiden Pins...

S. R. schrieb:
> Wenn du in den Eintrag schaust, siehst du  compatible = "ns16550";
>  (neben anderen). Das ist der Treiber, der auch auf PCs benutzt wird und
> darum heißt es dort ttyS. Bei dir definitiv nicht!

Stimmt, habs jetzt auch gesehen :)

von Sven B. (scummos)


Lesenswert?

Ich würde aus dem was du siehst nicht zu viele Rückschlüsse ziehen wie 
weit der Kernel tatsächlich kommt im Bootprozess. Der macht relativ 
viel, bevor er endlich beschließt, den Ringbuffer auf die serielle 
Konsole zu schreiben.

von c-hater (Gast)


Lesenswert?

Sven B. schrieb:

> Ich würde aus dem was du siehst nicht zu viele Rückschlüsse ziehen wie
> weit der Kernel tatsächlich kommt im Bootprozess. Der macht relativ
> viel, bevor er endlich beschließt, den Ringbuffer auf die serielle
> Konsole zu schreiben.

Das ist wohl richtig, aber das "uncompressing the kernel" kommt ja noch 
garnicht vom Kernel, oder? Solange der nicht dekomprimiert ist, kann er 
ja eigentlich nicht ausgeführt werden.

Ich würde darauf tippen, dass da irgendwelche Teile des Bootloaders 
überschrieben werden und zwar schon beim Laden des Image in den RAM. Und 
ab diesem Moment passiert dann einfach nur noch irgendwelcher Unsinn.

Ich würde also erstmal ganz penibel eine memory map von dem Zustand 
erstellen, wie er sich direkt vor dem Laden des Kernels darstellt und 
dann kontrollieren, dass davon beim Laden des Kernels nix überschrieben 
wird.

von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Dann sollte dies ja eigentlich gut sein.
> Denn die Schnittstelle wurde ja bereits in u-boot korrekt konfiguriert.

Das sagt nicht viel, weil earlyprintk das (möglicherweise) nochmal tut. 
Da müsstest du in die Sourcen schauen.

>> Stimmt das bei dir auch? :-)
> Wie meinst du das?
> Es steht jedenfalls dies bei mir im DT.
> Und ich verwende ja genau diese beiden Pins...

Genau das wollte ich bestätigt haben, wie auch die 
CONFIG_DEBUG_LL-Geschichten. :-)

Hast du mal einen fertigen Standardkernel ausprobiert?
Oder zumindest ein unverändertes _defconfig?

von Daniel (Gast)


Lesenswert?

log_buf ist ein Pointer auf den Puffer. In log_buf_len steht die Länge 
des Puffers. So bei Zeile 280 in kernel/printk/printk.c ist eine 
Beschreibung wie der Inhalt des Puffers zu interpretieren ist.

Gibt auch Python-Skripte für GDB, die einem dabei helfen. Siehe 
Documentation/dev-tools/gdb-kernel-debugging.rst. Hab ich selbst noch 
nie benutzt.

CONFIG_DEBUG_IMX_UART_PORT=1 ist bei den Pins korrekt. Die 1 ist der 
UART bei 0x2020000 (siehe arch/arm/include/debug/imx-uart.h).

Mach deinen serial1 Eintrag in /aliases weg. imx6ul.dtsi enthält bereits 
serial0 = &uart1. Damit ist ttymxc0 der richtige.

Probier mal earlyprintk=serial statt nur earlyprintk.


Sag mal, wo sagst du U-Boot eigentlich, dass es dem Kernel einen Device 
Tree mitgeben soll?

von Daniel (Gast)


Lesenswert?

Daniel schrieb:
> Sag mal, wo sagst du U-Boot eigentlich, dass es dem Kernel einen Device
> Tree mitgeben soll?

Ah, im ersten Post noch nicht, aber seit du bootz benutzt.

Um das "Uncompressing Linux..." zu bekommen, muss 
CONFIG_DEBUG_UNCOMPRESS eingeschaltet sein.

von Holger K. (holgerkraehe)


Lesenswert?

c-hater schrieb:
> Das ist wohl richtig, aber das "uncompressing the kernel" kommt ja noch
> garnicht vom Kernel, oder? Solange der nicht dekomprimiert ist, kann er
> ja eigentlich nicht ausgeführt werden.

Sehe ich auch so.

c-hater schrieb:
> Ich würde darauf tippen, dass da irgendwelche Teile des Bootloaders
> überschrieben werden und zwar schon beim Laden des Image in den RAM. Und
> ab diesem Moment passiert dann einfach nur noch irgendwelcher Unsinn.

Also den Bootloader kopiere ich an adresse 0x87800000
Dieser verschiebt sich dann selbst and die relocaddr. Diese ist: 
0x8ffb2000

Das zImage lade ich an Adresse 0x80200000.

Da liegen dann  ca 250 MBytes dazwischen.
Ich denke mal, das sollte reichen :)

S. R. schrieb:
> Holger K. schrieb:
>> Dann sollte dies ja eigentlich gut sein.
>> Denn die Schnittstelle wurde ja bereits in u-boot korrekt konfiguriert.
>
> Das sagt nicht viel, weil earlyprintk das (möglicherweise) nochmal tut.
> Da müsstest du in die Sourcen schauen.

Etwas weiter oben hiess es aber, dass die Initialisierung nur mit DT 
stattfinde. Aber du hast schon recht. Wirklich wissen tut mans erst, 
wenn man sich die Sourcen anschaut.

S. R. schrieb:
> Genau das wollte ich bestätigt haben, wie auch die
> CONFIG_DEBUG_LL-Geschichten. :-)
>
> Hast du mal einen fertigen Standardkernel ausprobiert?
> Oder zumindest ein unverändertes _defconfig?

Ja, ich hab mir mal die imx_v6_v7_defconfig benutzt.
Kernel wird dann zwar etwa 8.5 MByte statt meinen 5 aber am Verhalten 
ändert sich nichts.

Kein "decompressing" rein nichts...

Einen bereits fertigen kernel habe ich allerdings noch nicht versucht.

Daniel schrieb:
> log_buf ist ein Pointer auf den Puffer. In log_buf_len steht die Länge
> des Puffers. So bei Zeile 280 in kernel/printk/printk.c ist eine
> Beschreibung wie der Inhalt des Puffers zu interpretieren ist.

Spannend. log_buf hab ich gefunden:
1
c0d17cd8 d log_buf

Daniel schrieb:
> Mach deinen serial1 Eintrag in /aliases weg. imx6ul.dtsi enthält bereits
> serial0 = &uart1. Damit ist ttymxc0 der richtige.

Stimmt. gut, werde ich entfernen.

Daniel schrieb:
> Probier mal earlyprintk=serial statt nur earlyprintk.

hab ich versucht. hat sich nichts geändert.

Daniel schrieb:
> Sag mal, wo sagst du U-Boot eigentlich, dass es dem Kernel einen Device
> Tree mitgeben soll?

Ich mach das so:
1
tftp 0x80000000 tree.dtb
2
tftp 0x80200000 zImage
3
bootz 0x80200000 - 0x80000000

Dies wurde weiter oben vorgeschlagen.

Daniel schrieb:
> Um das "Uncompressing Linux..." zu bekommen, muss
> CONFIG_DEBUG_UNCOMPRESS eingeschaltet sein.

Das ist wieder reines Insider-Wissen :)
Darauf muss man erstmal kommen.
Ich werde es gleich mal mit einbinden und den Kernel neu generieren...

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Etwas weiter oben hiess es aber, dass die Initialisierung nur mit DT
> stattfinde. Aber du hast schon recht. Wirklich wissen tut mans erst,
> wenn man sich die Sourcen anschaut.

Nun, earlyprintk nutzt eigene, minimale Treiber. Zu dem Zeitpunkt weiß 
der Kernel noch nicht, ob es überhaupt einen DT oder serielle 
Schnittstellen gibt. Bis alles ordentlich konfiguriert ist (und der 
tty-Layer auch läuft), gibt es earlyprintk.

von Sven B. (scummos)


Lesenswert?

Holger K. schrieb:
> c-hater schrieb:
>> Das ist wohl richtig, aber das "uncompressing the kernel" kommt ja noch
>> garnicht vom Kernel, oder? Solange der nicht dekomprimiert ist, kann er
>> ja eigentlich nicht ausgeführt werden.
>
> Sehe ich auch so.

Es gibt self-decompressing-Kernel. Ich glaube das ist sogar der 
Standard. Also doch, das kommt afaik vom Kernel.

Ich würde echt dazu raten den JTAG-Trace zu versuchen. Das hat eine gute 
Chance schnell sehr konkrete Hinweise zu geben. Der Rest ist ziemliches 
rumgerate ;)

: Bearbeitet durch User
von Holger K. (holgerkraehe)


Lesenswert?

Sven B. schrieb:
> Ich würde echt dazu raten den JTAG-Trace zu versuchen. Das hat eine gute
> Chance schnell sehr konkrete Hinweise zu geben. Der Rest ist ziemliches
> rumgerate ;)

Ok, wie setzte ich diesen ein?

Habe nun DEBUG_Uncompress eingestellt.
Das zImage wurde wieder ein Paar hundert Bytes grösser.
Nun kommt tatsächlich etwas mehr!
1
done
2
Bytes transferred = 5429808 (52da30 hex)
3
=> bootz 0x80200000 - 0x80000000
4
Kernel image @ 0x80200000 [ 0x000000 - 0x52da30 ]
5
6
Starting kernel ...
7
8
data abort
9
pc : [<80db6650>]          lr : [<80db3a90>]
10
reloc pc : [<9c59664c>]    lr : [<9c593a8c>]
11
sp : 812e1b68  ip : 00000020     fp : 812e0b68
12
r10: 80db2948  r9 : 80db32dc     r8 : 80000100
13
r7 : 00000000  r6 : 812e0b70     r5 : 80db7741  r4 : 00000055
14
r3 : 00000000  r2 : f5390000     r1 : 43f90000  r0 : 00000055
15
Flags: nzCv  IRQs off  FIQs off  Mode SVC_32
16
Code: 00001400 e59f1014 e59f2014 e5810040 (e5913098)
17
Resetting CPU ...
18
19
resetting ...

Wenn ich Google glauben soll, dann könnte es was mit der MMU zu tun 
haben.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Holger K. schrieb:

> data abort

Das ist 1A Google-Futter! ;o)

von Holger K. (holgerkraehe)


Lesenswert?

c-hater schrieb:
> Holger K. schrieb:
>
>> data abort
>
> Das ist 1A Google-Futter! ;o)

Jap... ich bleibe dran.... :)

EDIT:

Gemäss diesem Forumpost sollte man die BASE-Adresse anpassen:
https://forum.odroid.com/viewtopic.php?t=9128
1
#define CONFIG_SYS_MAPPED_RAM_BASE     CONFIG_SYS_SDRAM_BASE

Habe dies in u-boot umgesetzt und u-boot neu geladen.
Hat bis jetzt noch nichts verändert...

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

Wenn es hängen würde, könntest du einfach den Debugger während die CPU 
läuft attachen, den Pfad zum vmlinx-Image als Argument übergeben, und 
dann "backtrace" ausführen.

So musst du vermutlich noch einen Breakpoint im entsprechenden Fault 
Handler setzen. Wie das geht, weiß ich nicht, lässt sich aber vermutlich 
leicht herausfinden.

von Holger K. (holgerkraehe)


Lesenswert?

Sven B. schrieb:
> Wenn es hängen würde, könntest du einfach den Debugger während die
> CPU
> läuft attachen, den Pfad zum vmlinx-Image als Argument übergeben, und
> dann "backtrace" ausführen.
>
> So musst du vermutlich noch einen Breakpoint im entsprechenden Fault
> Handler setzen. Wie das geht, weiß ich nicht, lässt sich aber vermutlich
> leicht herausfinden.

Der Faulthandler ist ja auch nur eine Adresse..
Das sollte machbar sein.

Aber ich glaube auf der Konsole sehe ich bereits alle relevanten 
Register zum Zeitpunkt des Faults.

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Einen Data Abort gibts auch mit deaktivierter MMU.
Hat der imx6 im physikalischen Adressmapping Data Abort Bereiche?
Ansonsten wirft die MMU Data Aborts wenn man auf Pages zugreift wo die 
Zugriffsrechte nicht ausreichen oder nicht gemapped sind.

Der Data Abort sieht mir aber so aus als wär der noch von uboot.
Also der Abort kommt so früh, dass in der IVT noch die Vectoren von 
UBoot stehen.

Leider fehlt die wichtigste Info in diesem Handler.
Nämlich die Adresse an der er lesen/schreiben wollte.

von Daniel (Gast)


Lesenswert?

> Leider fehlt die wichtigste Info in diesem Handler.
> Nämlich die Adresse an der er lesen/schreiben wollte.

Hä? Steht doch alles da!

Er crasht, weil er versucht auf irgendwas bei 0x43f90040 zuzugreifen.
0x43f90000 ist die Basisadresse eines UARTs beim i.MX25, i.MX31 und 
i.MX35.
Hast du in der Kernelconfig die richtige CPU ausgewählt?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ja in R1 steht 0x43f90000.
Aber ob der schon dahingegriffen hat oder nicht nicht ist unbekannt.
(man kann es natürlich vermuten)

von Daniel (Gast)


Lesenswert?

Vielleicht sollte ich etwas weiter ausholen:

Den Kram in der "Code" Zeile disassemblieren (und dabei die 
Bytereihenfolge umkehren wegen little-endian) ergibt, dass die letzte 
Instruktion "str r0, [r1, #64]" war. In r1 steht 0x43f90000. Ich vermute 
das Einschalten von CONFIG_EARLY_PRINTK hat dazu geführt, dass er jetzt 
crasht bevor die MMU eingeschaltet ist. Deswegen ist pc auch ganz 
woanders. Ohne MMU können wir auch davon ausgehen, dass es kein 
imprecise data abort war.

Soweit ich das oben herauslese, machst du Änderungen an der Kernelconfig 
indem du Zeilen in einer defconfig änderst bzw. hinzufügst. Das ist 
keine gute Idee. Auch wenn da CONFIG_DEBUG_IMXUL_UART=y drin steht, kann 
es sein, dass andere Konfigurationsoptionen dazu führen, dass das nicht 
umgesetzt wird und am Ende CONFIG_DEBUG_IMX25_UART=y oder so gilt. Mach 
Änderungen am besten mit "make menuconfig ARCH=arm 
CROSS_COMPILE=arm-was-weiß-ich-wie-deine-toolchain-heißt-". Das zeigt 
dir nur die Optionen die nicht von anderen Optionen verhindert werden. 
Wenn dir eine fehlt, drück / und such (CONFIG_ dabei weglassen). Mit der 
Zahl in Klammern kannst du direkt zur Option springen. Es wird dir auch 
angezeigt was für Abhängigkeiten die Option hat.

von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Gemäss diesem Forumpost sollte man die BASE-Adresse anpassen:
> https://forum.odroid.com/viewtopic.php?t=9128

Warum suchst du in Foren zu Samsung Exynos, wenn du doch einen i.MX6 
benutzt? Die absoluten Lowlevel-Dinge (wo ist der RAM, welche Funktionen 
müssen im Kernel eingetragen werden, etc.) sind doch völlig anders.

Ich behaupte mal ins Blaue, dass dein Kernel kaputt ist.
Darum mein Vorschlag, einen definitiv funktionierenden Kernel zu nehmen. 
Es gibt Debian-Builds für i.MX6-Boards, da kannst du deren Kernel 
extrahieren und mit deinem DTB booten. Ob der dann alles kann oder 
nicht, ist egal.

von Holger K. (holgerkraehe)


Lesenswert?

Daniel schrieb:
> Hast du in der Kernelconfig die richtige CPU ausgewählt?

Meiner Meinung nach, ja.

Hier mal die defconfig
https://pastebin.com/9DTHYjxH

Daniel schrieb:
> Soweit ich das oben herauslese, machst du Änderungen an der Kernelconfig
> indem du Zeilen in einer defconfig änderst bzw. hinzufügst. Das ist
> keine gute Idee. Auch wenn da CONFIG_DEBUG_IMXUL_UART=y drin steht, kann
> es sein, dass andere Konfigurationsoptionen dazu führen, dass das nicht
> umgesetzt wird und am Ende CONFIG_DEBUG_IMX25_UART=y oder so gilt.

Interessant, das wusste ich nicht.

Leider habe ich aber Konfig wie DEBUG_LL so nicht im make menuconfig 
gefunden.

S. R. schrieb:
> Warum suchst du in Foren zu Samsung Exynos, wenn du doch einen i.MX6
> benutzt? Die absoluten Lowlevel-Dinge (wo ist der RAM, welche Funktionen
> müssen im Kernel eingetragen werden, etc.) sind doch völlig anders.

Es ging mir darum ein Gefühl dafür zu bekommen, worum es bei dem Thema 
überhaupt geht.

S. R. schrieb:
> Ich behaupte mal ins Blaue, dass dein Kernel kaputt ist.
> Darum mein Vorschlag, einen definitiv funktionierenden Kernel zu nehmen.
> Es gibt Debian-Builds für i.MX6-Boards, da kannst du deren Kernel
> extrahieren und mit deinem DTB booten. Ob der dann alles kann oder
> nicht, ist egal.

Habe ich jetzt versucht.
Habe ein zImage von hier:

https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/i.mx-evaluation-and-development-boards/evaluation-kit-for-the-i.mx-6ull-and-6ulz-applications-processor:MCIMX6ULL-EVK

Da gibts eines für den ULL chip.
Hab das zImage genommen und mit
1
setenv bootargs console=ttymxc0,115200 earlyprintk=serial
2
...
3
TFTP from server 192.168.30.31; our IP address is 192.168.30.67
4
Filename 'zImage'.
5
Load address: 0x80200000
6
Loading: #################################################################
7
         #################################################################
8
         #################################################################
9
         #################################################################
10
         #################################################################
11
         #################################################################
12
         #######################################################
13
         2.8 MiB/s
14
done
15
Bytes transferred = 6527720 (639ae8 hex)
16
=> tftp 0x80000000 tree.dtb
17
Using FEC device
18
TFTP from server 192.168.30.31; our IP address is 192.168.30.67
19
Filename 'tree.dtb'.
20
Load address: 0x80000000
21
Loading: ##
22
         351.6 KiB/s
23
done
24
Bytes transferred = 22362 (575a hex)
25
=> bootz 0x80200000 - 0x80000000
26
Kernel image @ 0x80200000 [ 0x000000 - 0x639ae8 ]
27
28
Starting kernel ...

Ausgeführt

Leider keinerlei veränderungen....
Hier wird vermutlich earlyprintk im Kernel nicht aktiv sein.

von Daniel (Gast)


Lesenswert?

> Hier mal die defconfig
> https://pastebin.com/9DTHYjxH

Joa, wenn man die reinlädt, dann ist CONFIG_DEBUG_IMX31_UART aktiviert 
und CONFIG_DEBUG_IMX6UL_UART ist nicht gesetzt. Liegt bestimmt and er 
Reihenfolge in der die Optionen in der defconfig stehen. Schalt mal 
CONFIG_ARCH_MULTI_V6 aus. Dann kommt der i.MX31 nicht mehr in Frage.

Und bei CONFIG_EARLY_PRINTK fehlt ein =y.

> Leider habe ich aber Konfig wie DEBUG_LL so nicht im make menuconfig
> gefunden.

Wenn ich dort nach DEBUG_LL suche, wird mir
1
Symbol: DEBUG_LL [=y]
2
Type  : bool
3
Prompt: Kernel low-level debugging functions (read help!)
4
  Location:
5
(1) -> Kernel hacking
6
  Defined at arch/arm/Kconfig.debug:103
7
  Depends on: DEBUG_KERNEL [=y]
angezeigt und mit Druck auf die Taste 1 bin ich sofort da.

von Daniel (Gast)


Lesenswert?

Daniel schrieb:
> Liegt bestimmt and er Reihenfolge in der die Optionen in der defconfig stehen.

Ach quatsch, da ist ein Tippfehler in CONFIG_DEBUG_IMX6UL_UART. Deswegen 
hat kconfig den Default genommen.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Daniel schrieb:
> Vielleicht sollte ich etwas weiter ausholen:
>
> Den Kram in der "Code" Zeile disassemblieren (und dabei die
> Bytereihenfolge umkehren wegen little-endian) ergibt, dass die letzte
> Instruktion "str r0, [r1, #64]" war.

So weit hab ichs nicht getrieben.
Bei meinen eigenbau Faulthandlern les ich eben die MMU (oder MPU bei M) 
aus um direkt an die Adresse zu kommen.
Auch bei nicht aktivierter MMU lässt sich die Data Abort Adresse aus der 
MMU auslesen.

von Holger K. (holgerkraehe)


Angehängte Dateien:

Lesenswert?

Soo. Weiter geht die wilde Fahrt.


Daniel schrieb:
> Daniel schrieb:
>> Liegt bestimmt and er Reihenfolge in der die Optionen in der defconfig stehen.
>
> Ach quatsch, da ist ein Tippfehler in CONFIG_DEBUG_IMX6UL_UART. Deswegen
> hat kconfig den Default genommen.

Ohh, werde ich gleich mal korrigieren.
Danke für den Hinweis.

Nun steht:
1
CONFIG_SOC_IMX6UL=y
2
CONFIG_DEBUG_LL=y
3
CONFIG_DEBUG_LL_INCLUDE="mach/imx.S"
4
CONFIG_DEBUG_IMX6UL_UART=y
5
CONFIG_DEBUG_IMX_UART_PORT=1
6
CONFIG_DEBUG_UNCOMPRESS=y
7
CONFIG_EARLY_PRINTK=y

Werde berichten, sobald ich das neue image getestet habe.


Jawoll!!!!
Es war der Tippfehler!

nun kommt deutlich mehr:
1
Starting kernel ...
2
3
Uncompressing Linux... done, booting the kernel.
4
5
Error: invalid dtb and unrecognized/unsupported machine ID
6
  r1=0x00000000, r2=0x80000100
7
  r2[]=05 00 00 00 01 00 41 54 00 00 00 00 00 00 00 00
8
Available machine support:
9
10
ID (hex)        NAME
11
ffffffff        Generic DT based system
12
000001bf        Freescale MX31ADS
13
0000049b        BugLabs BUGBase
14
ffffffff        Freescale i.MX6 Ultralite (Device Tree)
15
16
Please check your kernel config and/or bootloader.

Aus unbekanntem Grund scheint der Kernel für MX31 gebuildet worden zu 
sein.

Daniel schrieb:
> Joa, wenn man die reinlädt, dann ist CONFIG_DEBUG_IMX31_UART aktiviert
> und CONFIG_DEBUG_IMX6UL_UART ist nicht gesetzt.

Wie hast du die "reingeladen" um zu sehen, was da aktiv ist?
Meinst du damit, bei make menuconfig unter <Load> die defconf angeben?

Daniel schrieb:
> Wenn ich dort nach DEBUG_LL suche, wird mir

Wenn ich in make menuconfig von buildroot DEBUG_LL suche, dann erhalte 
ich keine Ergebnise. (Siehe Bild).

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

> Aus unbekanntem Grund scheint der Kernel für MX31 gebuildet worden zu sein.

Das ist nicht das Problem. Er ist auch für den i.MX31 gebaut.

Das Problem ist, dass dein U-Boot keinen Device Tree an Linux übergibt.

r1 muss 0xffffffff und r2 ein Pointer auf dessen Anfang sein.
Statt dessen versucht U-Boot legacy ATAGs zu übergeben (01 00 41 54 = 
ATAG_CORE) und benutzt die undefinierte Machine ID 0.

Wurde U-Boot mit eingeschaltetem CONFIG_OF_LIBFDT gebaut?

> Wie hast du die "reingeladen" um zu sehen, was da aktiv ist?
Nach .config kopiert und make olddefconfig gemacht. Danach enthält 
.config die komplette Konfiguration.

> Wenn ich in make menuconfig von buildroot DEBUG_LL suche, dann erhalte ich keine 
Ergebnise. (Siehe Bild).

Ach du benutzt Buildroot! Das hat noch ein anderes Menü drum herum 
gebastelt.
https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Aus unbekanntem Grund scheint der Kernel
> für MX31 gebuildet worden zu sein.

Bevor es Devicetrees gab, wurde jedem Board eine ID zugeordnet 
(zentral!), die der Bootloader dem Kernel übergeben hat. Der Kernel 
wusste dann, für welche Boards er gebaut wurde und konnte abbrechen, 
wenn er das Board nicht kannte. Das war großer Mist.

Mit Devicetrees ist es möglich, einen generischen Kernel für alle Boards 
haben zu können. Der Kompatiblität wegen unterstützt der Kernel beides 
parallel, in deinem Fall ist dein Board ein "Generic DT based system" 
mit der ID 0xffffffff.

Die anderen Boards (Freescale MX31ADS und BugLabs BUGbase) hast du in 
der Konfiguration zusätzlich ausgewählt, aber sie spielen für dich keine 
Rolle. Du musst ein Devicetree-Blob übergeben.

Wie hast du den Kernel genau gestartet?

Holger K. schrieb:
>> Wenn ich dort nach DEBUG_LL suche, wird mir
>
> Wenn ich in make menuconfig von buildroot DEBUG_LL suche,
> dann erhalte ich keine Ergebnise. (Siehe Bild).

Du solltest in der Konfiguration des Kernels suchen, nicht in der 
Konfiguration von Buildroot. Das sind verschiedene Dinge, Stichwort 
"make kernel-menuconfig".

von Holger K. (holgerkraehe)


Lesenswert?

Daniel schrieb:
> Wurde U-Boot mit eingeschaltetem CONFIG_OF_LIBFDT gebaut?

Nein...

Daniel schrieb:
> Das Problem ist, dass dein U-Boot keinen Device Tree an Linux übergibt.
>
> r1 muss 0xffffffff und r2 ein Pointer auf dessen Anfang sein.
> Statt dessen versucht U-Boot legacy ATAGs zu übergeben (01 00 41 54 =
> ATAG_CORE) und benutzt die undefinierte Machine ID 0.

Daniel schrieb:
> Ach du benutzt Buildroot! Das hat noch ein anderes Menü drum herum
> gebastelt.
> 
https://stackoverflow.com/questions/1414968/how-do-i-configure-the-linux-kernel-within-buildroot

Danke für den Link! Jetzt wirds klarer ^^

S. R. schrieb:
> Bevor es Devicetrees gab, wurde jedem Board eine ID zugeordnet
> (zentral!), die der Bootloader dem Kernel übergeben hat. Der Kernel
> wusste dann, für welche Boards er gebaut wurde und konnte abbrechen,
> wenn er das Board nicht kannte. Das war großer Mist.
>
> Mit Devicetrees ist es möglich, einen generischen Kernel für alle Boards
> haben zu können. Der Kompatiblität wegen unterstützt der Kernel beides
> parallel, in deinem Fall ist dein Board ein "Generic DT based system"
> mit der ID 0xffffffff.
>
> Die anderen Boards (Freescale MX31ADS und BugLabs BUGbase) hast du in
> der Konfiguration zusätzlich ausgewählt, aber sie spielen für dich keine
> Rolle. Du musst ein Devicetree-Blob übergeben.

Vielen Dank für diese ausführliche Erklärung.

S. R. schrieb:
> Wie hast du den Kernel genau gestartet?

mit bootz und dem dtb als adresse
1
Filename 'tree.dtb'.
2
Load address: 0x80000000
3
Loading: ##
4
         239.3 KiB/s
5
done
6
Bytes transferred = 22362 (575a hex)
7
=> tftp 0x80200000 zImage
8
Using FEC device
9
TFTP from server 192.168.30.31; our IP address is 192.168.30.41
10
Filename 'zImage'.
11
Load address: 0x80200000
12
Loading: #################################################################
13
         #################################################################
14
         #################################################################
15
         #################################################################
16
         #################################################################
17
         #############################################
18
         3 MiB/s
19
done
20
Bytes transferred = 5429656 (52d998 hex)
21
=> bootz 0x80200000 - 0x80000000
22
Kernel image @ 0x80200000 [ 0x000000 - 0x52d998 ]
23
24
Starting kernel ...

S. R. schrieb:
> Du solltest in der Konfiguration des Kernels suchen, nicht in der
> Konfiguration von Buildroot. Das sind verschiedene Dinge, Stichwort
> "make kernel-menuconfig".

Danke für den Hinweis. Hat geklappt.

von Holger K. (holgerkraehe)


Lesenswert?

So, u-boot neu erstellt mit CONFIG_OF_LIBFDT  und siehe da...

Der Kernel LEEEEBT :)
1
[    3.007736]  (driver?)
2
[    3.014052] Kernel panic - not syncing: VFS: Unable to mount root fs on unkno                                                                               wn-block(0,0)
3
[    3.022651] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs                                                                                on unknown-block(0,0) ]---

Hier der gesamte Output: https://pastebin.com/0sA2grTY

Er hat aber Panik bekommen ^^
Wohl ddeshalb, weil kein rootfs vorhanden ist.
Nun kopier ich das rootfs mal auf eine SD-Karte...

Gibts hierbei auch noch was zu beachten?

U-Boot erkannte die SD zu einem früheren Zeitpunkt bereits einmal.

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Holger K. schrieb:
> Er hat aber Panik bekommen ^^
> Wohl ddeshalb, weil kein rootfs vorhanden ist.

ja

> Gibts hierbei auch noch was zu beachten?

nicht wirklich
root=/dev/mmcblk0pIrgendwas
Bei einer SD-Karte willst du auch noch rootwait in die bootargs packen.

von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Gibts hierbei auch noch was zu beachten?

Stelle dein Buildroot so ein, dass es dir ein minimales rootfs (mit 
Busybox) baut und nutze das als initramfs. Das macht's einfacher.

von Holger K. (holgerkraehe)


Lesenswert?

Daniel schrieb:
> nicht wirklich
> root=/dev/mmcblk0pIrgendwas
> Bei einer SD-Karte willst du auch noch rootwait in die bootargs packen.

Danke. Werde ich versuchen.

S. R. schrieb:
> Stelle dein Buildroot so ein, dass es dir ein minimales rootfs (mit
> Busybox) baut und nutze das als initramfs. Das macht's einfacher.

Danke. Buildroot erzeugt mir bereits ein rootfs. Lade ich das dann auch 
über tftp an eine mehr oder weniger beliebige adresse und übergebe dies 
als zweiten parameter an bootz?

Wenn ja, ich hab ein rootfs.ext4 und .ext2
Ist es relevant, welches davon ich kopiere?

Und, muss ich bei den bootargumenten noch etwas ergänzen, wenn ich das 
rootfs entsprechend an bootz übergebe?

Danke :)

von S. R. (svenska)


Lesenswert?

Holger K. schrieb:
> Wenn ja, ich hab ein rootfs.ext4 und .ext2
> Ist es relevant, welches davon ich kopiere?

Wenn der Kernel beides kann, nein.
Du könntest in deiner Konfiguration das ext2 auch weglassen.

Holger K. schrieb:
> Und, muss ich bei den bootargumenten noch etwas ergänzen,
> wenn ich das rootfs entsprechend an bootz übergebe?

Eigentlich nicht. Das "root=..." gilt nicht für initramfs.

Schau aber nach, ob in deinem rootfs auch eine Datei namens "/init" 
gibt. Sonst gibt es wieder ein Panic.

von Daniel (Gast)


Lesenswert?

S. R. schrieb:
> und nutze das als initramfs. Das macht's einfacher.

Ansichtssache. Bei initramfs und initrd muss man beachten, dass 
CONFIG_DEVTMPFS_MOUNT keine Wirkung hat und, dass der Kernel nicht 
/sbin/init, sondern /init bzw. /linuxrc ausführt.

Holger K. schrieb:
> Wenn ja, ich hab ein rootfs.ext4 und .ext2

Damit wäre das eine initrd und keine initramfs. Also muss /linuxrc 
existieren, wenn du es nicht auf die SD-Karte spielen willst.

von S. R. (svenska)


Lesenswert?

Daniel schrieb:
> Damit wäre das eine initrd

Stimmt, ein initramfs ist ein komprimiertes CPIO-Archiv und hat kein 
Dateisystem. Du hast vollkommen recht, mein Fehler.

@Holger: Lass dir von buildroot ein initramfs erzeugen. Der kann das.

von Holger K. (holgerkraehe)


Lesenswert?

Danke für eure Antworten

S. R. schrieb:
> @Holger: Lass dir von buildroot ein initramfs erzeugen. Der kann das.

Buildroot hat mir ein rootfs.cpio erzeugt.

Leider sagt u-boot immer
1
=> bootz 0x805afd00 0x80007000 0x80000000
2
Kernel image @ 0x805afd00 [ 0x000000 - 0x52d998 ]
3
Wrong Ramdisk Image Format
4
Ramdisk image is corrupt or invalid

Ich google mal...

von Daniel (Gast)


Lesenswert?

Ich rate mal, dass U-Boot die initramfs gerne in ein uImage eingepackt 
haben möchte.

von Daniel (Gast)


Lesenswert?

Wenn U-Boot mit CONFIG_SUPPORT_RAW_INITRD gebaut wurde, geht es auch 
ohne uImage indem man bootz direkt hinter die Adresse der Ramdisk mit 
Doppelpunkt davon getrennt (kein Leerzeichen) die Länge der Ramdisk als 
hexdezimale Zahl schreibt.

von Holger K. (holgerkraehe)


Lesenswert?

Daniel schrieb:
> Wenn U-Boot mit CONFIG_SUPPORT_RAW_INITRD gebaut wurde, geht es auch
> ohne uImage indem man bootz direkt hinter die Adresse der Ramdisk mit
> Doppelpunkt davon getrennt (kein Leerzeichen) die Länge der Ramdisk als
> hexdezimale Zahl schreibt.

Ihr seid echt Experten!
Vielen Dank für deine Erklärung.

Wo lernt man sowas?
Gibts ein gutes Buch dafür?
Hab mir mal dieses hier gekauft:
https://www.amazon.de/Embedded-Linux-Raspberry-mitp-Professional/dp/395845061X

Leider geht dieses nicht annähernd in diese Tiefe.
Wobei aber vieles angeschnitten wird.
Für den Einstieg echt super!

Habs geschafft :)
Hab im Buildroot
Filesystem->cpio the rootfs und create u-boot image aktiviert.

nun das image mit tftp kopiert und siehe da... Linux bootet und lässt 
mich mich einloggen :)

Nun ist das ganze ein riesen gebastel...
Aktuell lade ich alle DDR-Register Werte noch mittels JTAG in den imx. 
dann wird mit GDB das elf file von u-boot geladen und gestartet. Nun 
wird mittels tftp das image gezogen und gestartet...

Eigentlich müsste ich nun die FUSES des imx brennen, damit er 
automatisch von der SD-Karte bootet.

Dann müsste ich wohl U-Boot noch in einen SPL aufteilen, welcher dann 
das RAM konfiguriert und U-Boot nachlädt.

Im jetzigen Linux wird in der Busybox leider noch kein Ethernet 
angezeigt.

Aber hey... Linux läuft schonmal :)

Danke vielmals für alle eure Unterstützung!

: Bearbeitet durch User
von Sven B. (scummos)


Lesenswert?

Also beim imx7 geht das auch ohne Fuses, da kann man an das u-Boot-Image 
so eine "Device Configuration Data"-Datei prependen die der ROM dann 
lädt.

von Holger K. (holgerkraehe)


Lesenswert?

Sven B. schrieb:
> Also beim imx7 geht das auch ohne Fuses, da kann man an das u-Boot-Image
> so eine "Device Configuration Data"-Datei prependen die der ROM dann
> lädt.

Stimmt. DCD. Davon hab ich auch schon gelesen.

Meinst du damit, dass der DCD anstelle des SPL die RAM init übernimmt?

von Daniel (Gast)


Lesenswert?

Beim i.MX6 konfiguriert man das RAM normalerweise nicht mit dem SPL, 
sondern über DCD Werte (siehe Abschnitt 8.7.2 im Reference Manual). 
Schau dir mal die  *.cfg Dateien an, die bei den anderen i.MX6 Boards im 
U-Boot Sourcecode liegen.

von Holger K. (Gast)


Lesenswert?

Daniel schrieb:
> *.cfg Dateien an, die bei den anderen i.MX6 Boards im
> U-Boot Sourcecode liegen.

Danke für den Hinweis

Die *.cfg Datei hatte ich bereits für mein Board angepasst und in den 
entsprechenden Ordner abgelegt :)

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.