Forum: PC-Programmierung Yocto Linux, bitbake und device tree


von Arnd (Gast)


Lesenswert?

Hallo,

ich habe ein embedded Module von Digi und mit mit bitbake ein yocto nach 
deren Anleitung erzeugt.

Es gibt auf der Homepage vorgefertigte images, die auch tatsächlich nach 
dem aufspielen funktionieren. Diese enthielt aber KEINE .dtb Datei.

Mein selbst erzeugtes yocto liefert eben diese .dtb Datei. Wenn ich den 
Kernel (uImage) und das roots flashe, dann fängt mein embedded an zu 
booten - friert jedoch sofort ein.

Ich glaube verstanden zu haben, dass das  am fehlenden Device Tree 
liegen soll. Leider finde ich keinen Hinweis im Netz, der einem Dummie 
wie mir einfach erklären kann, was ich mit dem .dtb file mache?

Auf welche Partition schreibe ich das image? Muss es irgendwo angehangen 
werden?

Ich würde es gerne einfach erstmal zum laufen bringen - scheitere aber 
schon daran. Ich hoffe es kann mir jemand helfen.

Mit dem uboot kann ich folgende update funktion ausführen:
1
update <partition> [source] [extra-args...]
2
 Description: updates flash <partition> via <source>
3
 Arguments:
4
   - partition:    a partition name or one of the reserved names:
5
                   uboot|linux|android|rootfs|userfs|androidfs|splash|fdt
6
   - [source]:     tftp (default)|nfs|usb|mmc|hsmmc|sata|ram
7
   - [extra-args]: extra arguments depending on 'source'
8
9
      source=tftp|nfs -> [filename]
10
       - filename: file to transfer (required if using a partition name)
11
12
      source=usb|mmc|hsmmc|sata -> [device:part filesystem] [filename]
13
       - device:part: number of device and partition
14
       - filesystem: fat|vfat|ext2|ext3
15
       - filename: file to transfer
16
17
      source=ram -> <image_address> <image_size>
18
       - image_address: address of image in RAM
19
       - image_size: size of image in RAM

Vielen dank schonmal :)

von Required field (Gast)


Lesenswert?

Du kannst das dtb File einfach an das zImage anhängen:

Z.B. so:

function  mkdevtree-uboot-image()
{
    cp arch/arm/boot/zImage /tmp/zImage-with-dtb
    cat arch/arm/boot/dts/armada-370.dtb >> /tmp/zImage-with-dtb
    ./scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x00008000 
-e 0x00008000 -n 'Linux-mbx' -d /tmp/zImage-with-dtb /tmp/uImage
}

Ansonsten müsste es eigentlich genügen, das passende .dtb an den selben 
Ort wie den Kernel zu legen.

von Arnd (Gast)


Lesenswert?

Ich habe beide images mit cat und cp zusammengefügt, aber beim booten 
friert das System nach wie vor ein.

Was du hier machst, ist mir nnicht so ganz klar? Was ist das für ein 
script und wo kommt dies her?
1
./scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x00008000 
2
-e 0x00008000 -n 'Linux-mbx' -d /tmp/zImage-with-dtb /tmp/uImage

von Required field (Gast)


Lesenswert?

Das mkuboot.sh Skript ist Bestandteil des Kerneltrees.

$cat mkuboot.sh
#!/bin/bash

#
# Build U-Boot image when `mkimage' tool is available.
#
....


Das zImage wird beim Kernel Build erzeugt ('make zImage').
uImage ist das vom uboot erwartete Format.

$ mkimage
Usage: mkimage -l image
          -l ==> list image header information
       mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name 
-d data_file[:data_file...] image
          -A ==> set architecture to 'arch'
          -O ==> set operating system to 'os'
          -T ==> set image type to 'type'
          -C ==> set compression type 'comp'
          -a ==> set load address to 'addr' (hex)
          -e ==> set entry point to 'ep' (hex)
          -n ==> set image name to 'name'
          -d ==> use image data from 'datafile'
          -x ==> set XIP (execute in place)
       mkimage [-D dtc_options] [-f fit-image.its|-F] fit-image
          -D => set all options for device tree compiler
          -f => input filename for FIT source
Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined)
       mkimage -V ==> print version information and exit
Use -T to see a list of available image types

von S. R. (svenska)


Lesenswert?

Dein U-Boot sollte in der Lage sein, ein beliebiges DTB zusammen mit dem 
Kernel zu laden. Wo das DTB herkommt, ist dann egal, aber du musst 
dessen Adresse mit angeben.

Alternativ kannst das Devicetree-Binary auch an den Kernel kleben, aber 
das macht Veränderungen schwierig.

von Arnd (Gast)


Lesenswert?

Also es hat jetzt folgendermaßen geklappt:

Ich habe eine Partition für device-tree erstellt und dort das dtb-image 
reingeschrieben. Nun wird anständig gebootet. Mit cp/cat konnte ich kein 
lauffähiges image zusammenbasteln?

von S. R. (svenska)


Lesenswert?

Eventuell musst du in der Kernel-Konfiguration einstellen, dass der 
Device-Tree auch aus dem Image kommen kann.

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.