Reines Debian mit U-Boot auf BeagleBoneBlack mit Bootmenü

===== Reines Debian mit U-Boot auf BeagleBoneBlack und Bootmenü =====

Hier wird ein Weg beschrieben wie auf dem BeagleBoneBlack ein reines Debian Buster System installiert werden kann. Es soll die Möglichkeit bestehen auf der Seriellen Konsole ein Bootmenü anzuzeigen.

==== Zielsetzung ==== Es soll als Kernel ein reiner Upstream Kernel ohne irgenwelche Patches genutzt werden. Auch u-boot soll rein Upstream sein.

So wird das Bootmenü aussehen:

==== Voraussetzungen ====

  • BeagleBoneBlack
  • SD Karte >= 2GB
  • TTL UART Kabel (ich habe eine BusPirate im Einsatz)
  • SD Karten Adapter

==== Vorbereitung SD Karte ==== u-boot kann seine Umgebungsvariablen und sein Programm in Sektoren nach der Partitionierungstabelle und vor der ersten Partition eingebettet werden. Das ist wie früher bei den PCs. Deshalb lege ich eine eigene Firmware Partition an. So wie es heutzutage üblich ist.

So sieht meine Partitionierung aus:

Disk /dev/sdc: 29,81 GiB, 32010928128 bytes, 62521344 sectors
Disk model: MassStorageClass
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x22e84a6d

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdc1  *     2048    34815    32768   16M  c W95 FAT32 (LBA)
/dev/sdc2       34816 62521343 62486528 29,8G 83 Linux

Wichtig ist, das sdx1 das Bootflag gesetzt hat und als Partitionierungstyp “W95 FAT32 (LBA)” hat. Die Linux Partition ist Standard.

Der Disk identifier ist später nötig für die /etc/fstab und die cmdline für den Kernel.

Nachdem die SD Karte partitioniert ist, geht es an das Root Filesystem.

==== Rootfilesystem ==== Wir brauchen auf unserem Host qemu-debootstrap. Unter Debian ist das im Paket “qemu-user-static”.

apt install qemu binfmt-support qemu-user-static

Jetzt erzeugen wir die Dateisysteme für die Firmware und das Rootfilesystem. Es ist SEHR WICHTIG das ihr die Partitionsnamen richtig auswählt. Sonst könnt ihr euer System zerschiessen.

mkdosfs -n FIRMWARE /dev/sdx1
mkfs -t ext4 /dev/sdx2
mkdir /mnt/BBB
mount /dev/sdx2 /mnt/BBB
cd /mnt/BBB
mkdir -p boot/firmware
mount /dev/sdx1 boot/firmware
~~~~

Ok, Partitionen erstellt und entsprechend gemountet.

== Jetzt kommt das rootfs ==

qemu-debootstrap –arch=armhf buster . http://ftp.de.debian.org/debian

Das dauert jetzt ein bischen ....

Jetzt muss das Rootfs angepasst werden. Da wir eine anderen Architektur als der aktuelle Host ausführen wollen, wird binfmt benötigt. Die resolv.conf brauchen wir um Pakete zu installieren. 

cp /etc/resolv.conf etc chroot . /bin/bash apt update apt install initramfs-tools nano /etc/hostname (hier passt ihr euren hostname an) nano /etc/hosts (hier fügt ihr euren hostnamen zur ersten Zeile hinzu) passwd (optional: vergebt ein root Passwort, ohne braucht ihr sudo und einen User) nano /etc/fstab (Wichtig: fstab anlegen (siehe unten))

apt install (was auch immer ihr benötigt. Ich nehme auf jeden Fall htop locales tzdata)


Hier braucht ihr den Disk identifier von oben.

/etc/fstab PARTUUID=22e84a6d-01 /boot/firmware vfat defaults 1 2 PARTUUID=22e84a6d-02 / ext4 defaults 0 1


==== Kernel kompilieren ====
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make INSTALL_MOD_PATH=/mnt/BBB modules_install
ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make INSTALL_DTBS_PATH=/mnt/BBB/boot/dtbs/5.9.6 dtbs_install
cp arch/arm/boot/zImage /mnt/BBB/boot/vmlinuz-5.9.6

==== initrd erzeugen ====

chroot /mnt/BBB /bin/bash ls /lib/modules (hier muss jetzt euer Kernel bzw. das Kernel Modul Verzeichnis erscheinen) 5.9.6

entsprechend geht es jetzt weiter mit: update-initramfs -k 5.9.6 -c


==== u-boot kompilieren ====

cp u-boot.img /mnt/BBB/boot/firmware/
cp MLO /mnt/BBB/boot/firmware/


==== u-boot vorbereiten ====

cd /mnt/BBB chroot . /bin/bash nano /boot/uEnv.txt (das definiert unser Bootmenü)

Hier ist es wichtig das ihr wieder die PARTUUID anpasst

cmdline=console=ttyS0,115200n8 coherent_pool=1M net.ifnames=0 lpj=1990656 root=PARTUUID=22e84a6d-02 rootfstype=ext4 rootwait

bootmenu_0=5.9.6=setenv uname_r 5.9.6;run boot_uname_r bootmenu_1=5.9.1=setenv uname_r 5.9.1;run boot_uname_r bootmenu_2=Reset=reset bootmenu_delay=10


Damit sind wir jetzt auf dem Host fertig und wir entfernen die SD Karte mit

umount /mnt/BBB/boot/firmware umount /mnt/BBB sync

Jetzt wird der BBB gestartet und mit dem UART Adapter verbunden. Ich nutze screen

screen /dev/ttyUSB0 115200

u-boot startet hier und zeigt das Log.

U-Boot SPL 2020.10 (Nov 09 2020 - 15:38:44 +0100)
Trying to boot from MMC1


U-Boot 2020.10 (Nov 09 2020 - 15:38:44 +0100)

CPU  : AM335X-GP rev 2.0
Model: TI AM335x BeagleBone Black
DRAM:  512 MiB
WDT:   Started with servicing (60s timeout)
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment

<ethaddr> not set. Validating first E-fuse MAC
Net:   eth2: ethernet@4a100000, eth3: usb_ether
Hit any key to stop autoboot:  0 
=>

Jetzt müssen wir die Konfiguration erzeugen.

setenv devtype mmc
setenv bootdelay 0
setenv bootpart 0:2
setenv bootenvfile uEnv.txt
setenv loadbootenv 'load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/${bootenvfile}'
setenv importbootenv 'env import -t ${loadaddr} ${filesize}'
setenv loadimage 'load ${devtype} ${bootpart} ${loadaddr} ${bootdir}/vmlinuz-${uname_r}'
setenv loadfdt 'run findfdt;load ${devtype} ${bootpart} ${fdtaddr} ${bootdir}/dtbs/${uname_r}/${fdtfile}'
setenv loadramdisk 'load ${devtype} ${bootpart} ${rdaddr} ${bootdir}/initrd.img-${uname_r}; setenv rdsize ${filesize}'
setenv boot_uname_r 'run loadimage; run loadfdt; run loadramdisk;setenv bootargs ${cmdline};bootz ${loadaddr} ${rdaddr}:${rdsize} ${fdtaddr};reset'
setenv distro_bootcmd 'run loadbootenv; run importbootenv;run bootmenu_start;'
setenv bootmenu_start 'bootmenu ${bootmenu_delay}'
saveenv

Wichtig ist das ihr das der Reihe nach eingebt da sonst der serelle Puffer überläuft und Zeichen verloren gehen. Nach saveenv kommt “Saving Environment to FAT… OK”. mit reset gehts dann los …

==== TODO ====

root@BeagleBoneBlack:~# df -h Filesystem Size Used Avail Use% Mounted on udev 207M 0 207M 0% /dev tmpfs 49M 1.9M 47M 4% /run /dev/mmcblk1p2 30G 459M 28G 2% / tmpfs 242M 0 242M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 242M 0 242M 0% /sys/fs/cgroup /dev/mmcblk1p1 16M 1.1M 15M 7% /boot/firmware


9519616 bytes read in 609 ms (14.9 MiB/s) 62583 bytes read in 10 ms (6 MiB/s) 4785624 bytes read in 308 ms (14.8 MiB/s)

Flattened Device Tree blob at 88000000

Booting using the fdt blob at 0x88000000 Loading Ramdisk to 8fb6f000, end 8ffff5d8 … OK Loading Device Tree to 8fb5c000, end 8fb6e476 … OK

Starting kernel …

[ 0.048677] l3-aon-clkctrl:0000:0: failed to disable [ 2.490899] gpiochip_add_data_with_key: GPIOs 0..31 (gpio-0-31) failed to register, -517 [ 2.490929] omap_gpio 44e07000.gpio: Could not register gpio chip -517 [ 2.716354] gpiochip_add_data_with_key: GPIOs 0..31 (gpio-0-31) failed to register, -517 [ 2.716385] omap_gpio 4804c000.gpio: Could not register gpio chip -517 [ 2.783497] gpiochip_add_data_with_key: GPIOs 0..31 (gpio-0-31) failed to register, -517 [ 2.783526] omap_gpio 481ac000.gpio: Could not register gpio chip -517 [ 2.794744] gpiochip_add_data_with_key: GPIOs 0..31 (gpio-0-31) failed to register, -517 [ 2.794772] omap_gpio 481ae000.gpio: Could not register gpio chip -517 [ 2.875315] debugfs: Directory ‘49000000.dma’ with parent ‘dmaengine’ already present! [ 3.382977] omap_voltage_late_init: Voltage driver support not added [ 6.303953] musb-dsps 47401400.usb: can’t request region for resource [mem 0x47401000-0x474011ff] [ 6.313042] musb-hdrc musb-hdrc.0: musb_init_controller failed with status -16 [ 6.439587] musb-dsps 47401c00.usb: can’t request region for resource [mem 0x47401800-0x474019ff] [ 6.448629] musb-hdrc musb-hdrc.1: musb_init_controller failed with status -16

Debian GNU/Linux 10 BBB ttyS0

BBB login:


firmware ├── MLO ├── u-boot.img └── uEnv.txt

0 directories, 3 files


boot ├── dtbs │ └── 5.9.6 │ ├── alpine-db.dtb │ ├── am335x-baltos-ir2110.dtb │ ├── am335x-baltos-ir3220.dtb │ ├── am335x-baltos-ir5221.dtb │ ├── am335x-base0033.dtb │ ├── am335x-boneblack.dtb │ ├── am335x-boneblack-wireless.dtb │ ├── am335x-boneblue.dtb │ ├── am335x-bone.dtb │ ├── am335x-bonegreen.dtb │ ├── am335x-bonegreen-wireless.dtb │ ├── am335x-chiliboard.dtb │ ├── am335x-cm-t335.dtb │ ├── am335x-evm.dtb │ ├── am335x-evmsk.dtb │ ├── am335x-guardian.dtb │ ├── am335x-icev2.dtb │ ├── am335x-lxm.dtb │ ├── am335x-moxa-uc-2101.dtb │ ├── am335x-moxa-uc-8100-me-t.dtb │ ├── am335x-nano.dtb │ ├── am335x-netcan-plus-1xx.dtb │ ├── am335x-netcom-plus-2xx.dtb │ ├── am335x-netcom-plus-8xx.dtb │ ├── am335x-osd3358-sm-red.dtb │ ├── am335x-pdu001.dtb │ ├── am335x-pepper.dtb │ ├── am335x-phycore-rdk.dtb │ ├── am335x-pocketbeagle.dtb │ ├── am335x-regor-rdk.dtb │ ├── am335x-sancloud-bbe.dtb │ ├── am335x-sbc-t335.dtb │ ├── am335x-shc.dtb │ ├── am335x-sl50.dtb │ ├── am335x-wega-rdk.dtb │ ├── am3517-craneboard.dtb │ ├── am3517-evm.dtb │ ├── am3517_mt_ventoux.dtb │ ├── am3874-iceboard.dtb │ ├── am437x-cm-t43.dtb │ ├── am437x-gp-evm.dtb │ ├── am437x-idk-evm.dtb │ ├── am437x-sbc-t43.dtb │ ├── am437x-sk-evm.dtb │ ├── am43x-epos-evm.dtb │ ├── am571x-idk.dtb │ ├── am5729-beagleboneai.dtb │ ├── am572x-idk.dtb │ ├── am574x-idk.dtb │ ├── am57xx-beagle-x15.dtb │ ├── am57xx-beagle-x15-revb1.dtb │ ├── am57xx-beagle-x15-revc.dtb │ ├── am57xx-cl-som-am57x.dtb │ ├── am57xx-sbc-am57x.dtb ……. │ └── zynq-zybo-z7.dtb ├── firmware ├── initrd.img-5.9.6 ├── uEnv.txt └── vmlinuz-5.9.6

3 directories, 997 files