Installation von Ubuntu 14.04 minimal auf den BeagleBone Black

Die folgende Anleitung erklärt die Installation von Ubuntu 14.04 minimal auf dem BeagleBone Black. Diese Anleitung wurde auf der Basis von https://eewiki.net/display/linuxonarm/BeagleBone+Black erstellt (2014-08-19).

Voraussetzung

  • PC oder VM mit installiertem Ubuntu 14.04.1 LTS
  • BeagleBone Black
  • microSD Karte zum flashen

Vorbereitung

Abhängigketien installieren

# apt-get update
# apt-get upgrade
# apt-get install build-essential device-tree-compiler lzma lzop u-boot-tools libncurses5-dev:amd64
# apt-get install libc6:i386 libstdc++6:i386 libncurses5:i386 zlib1g:i386
# apt-get install git

Git konfigurieren

$ git config --global user.name "Name des Benutzers"
$ git config --global user.email "E-Mail Adresse des Benutzers"

Toolchain herunterladen (50 MB) und entpacken

$ cd
$ wget -c https://releases.linaro.org/archive/14.04/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz
$ tar xf gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xz

(Dieser Punkt kann auch übersprungen werden, da die Toolchain automatisch von einem Script heruntergeladen wird. Da aber die Toolchain später für die Softwareentwicklung benötigt wird, kann man das jetzt schon machen und später den Pfad im Kernel-Script angeben.)

Symlink zu Toolchain erstellen (für User ntb)

$ cd /opt
# ln -s /home/ntb/gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux beaglebone-tc
$ cd -

Toolchain Version anzeigen

$ /opt/beaglebone-tc/bin/arm-linux-gnueabihf-g++ --version
arm-linux-gnueabihf-g++ (crosstool-NG linaro-1.13.1-4.8-2014.04 - Linaro GCC 4.8-2014.04) 4.8.3 20140401 (prerelease)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Kernel

Kernel-Scripts herunterladen (Branch 3.15)

$ cd
$ git clone https://github.com/RobertCNelson/bb-kernel.git
$ cd bb-kernel

temporären Branch erstellen

$ git checkout origin/am33x-v3.15 -b tmp

system.sh.sample kopieren zu system.sh und einstellungen ändern: CC=/opt/beaglebone-tc/bin/arm-linux-gnueabihf-

Kernel kompilieren

$ ./build_kernel.sh

Dieses Script holt automatisch alles was es braucht (Toolchain, Kernel Source, Patches, …). Es klont aber das komplette Linux Repository, welches 1.4 GB gross ist. Die Daten werden komprimiert übermittelt, was aber trotzdem ca. 20 min. dauert (je nach Internetverbindung). Wenn man in der Datei system.sh den Pfad zur Toolchain angibt, wird diese Toolchain verwendet und nicht die Standardtoolchain heruntergeladen. Das Kompilieren des Kernels dauert ca. 20 min (Ubuntu VM mit 4 Cores). Anschliessend findet man das Image im Ordner deploy.

Root File System

Root File System herunterladen (90 MB) und entpacken

$ cd
$ wget -c https://rcn-ee.net/deb/minfs/trusty/ubuntu-14.04-minimal-armhf-2014-07-07.tar.xz
$ md5sum ubuntu-14.04-minimal-armhf-2014-07-07.tar.xz
c30fb91012701cdbfa00bb6c86868d0a ubuntu-14.04-minimal-armhf-2014-07-07.tar.xz
$ tar xf ubuntu-14.04-minimal-armhf-2014-07-07.tar.xz

Standardmässig ist ein User mit dem Namen ubuntu und dem Passwort temppwd eingerichtet.

Bootloader

U-Boot Source herunterladen (63 MB)

$ cd
$ git clone git://git.denx.de/u-boot.git
$ cd u-boot/
$ git checkout v2014.07 -b tmp

Patches herunterladen und anwenden

wget -c https://raw.githubusercontent.com/eewiki/u-boot-patches/master/v2014.07/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch

Kompilieren:

$ make ARCH=arm CROSS_COMPILE=/opt/beaglebone-tc/bin/arm-linux-gnueabihf- distclean
$ make ARCH=arm CROSS_COMPILE=/opt/beaglebone-tc/bin/arm-linux-gnueabihf- am335x_evm_config
$ make ARCH=arm CROSS_COMPILE=/opt/beaglebone-tc/bin/arm-linux-gnueabihf-

microSD

Bevor die microSD Karte eingelegt wird oder der Cardreader angeschlossen wird, sollte folgender Befehl ausgeführt werden.

$ lsblk
NAME                          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                             8:0    0    20G  0 disk 
├─sda1                          8:1    0   243M  0 part /boot
├─sda2                          8:2    0     1K  0 part 
└─sda5                          8:5    0  19.8G  0 part 
  ├─ntb--vm--vg-root (dm-0)   252:0    0  18.8G  0 lvm  /
  └─ntb--vm--vg-swap_1 (dm-1) 252:1    0  1020M  0 lvm  [SWAP]
sr0                            11:0    1  56.8M  0 rom  

Jetzt kann die microSD Karte oder der Cardreader angeschlossen werden.

$ lsblk
AME                          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                             8:0    0    20G  0 disk 
├─sda1                          8:1    0   243M  0 part /boot
├─sda2                          8:2    0     1K  0 part 
└─sda5                          8:5    0  19.8G  0 part 
  ├─ntb--vm--vg-root (dm-0)   252:0    0  18.8G  0 lvm  /
  └─ntb--vm--vg-swap_1 (dm-1) 252:1    0  1020M  0 lvm  [SWAP]
sde                             8:64   1  29.5G  0 disk 
└─sde1                          8:65   1  29.5G  0 part 
sr0                            11:0    1  56.8M  0 rom

Die microSD Karte ist somit das Device /dev/sde

$ export DISK=/dev/sde

Karte löschen

# dd if=/dev/zero of=${DISK} bs=1M count=20

Partitionen erstelln

sudo sfdisk --in-order --Linux --unit M ${DISK} <<-__EOF__
1,12,0xE,*
,,,-
__EOF__

Falls DISK == /dev/sdx

# mkfs.vfat -F 16 ${DISK}1 -n BOOT
# mkfs.ext4 ${DISK}2 -L rootfs

Falls DISK == /dev/mmcblk0

# sudo mkfs.vfat -F 16 ${DISK}p1 -n BOOT
# mkfs.ext4 ${DISK}p2 -L rootfs

Ordner erstellen um Partitionen zu mounten

# mkdir -p /media/boot/
# mkdir -p /media/rootfs/

Falls DISK == /dev/sdx

# mount ${DISK}1 /media/boot/
# mount ${DISK}2 /media/rootfs/

Falls DISK == /dev/mmcblk0

# mount ${DISK}p1 /media/boot/
# mount ${DISK}p2 /media/rootfs/

Bootloader installieren

$ cd
# cp -v ./u-boot/MLO /media/boot/
# cp -v ./u-boot/u-boot.img /media/boot/

U-Boot Script

# touch /media/rootfs/boot/uEnv.txt
# nano /media/boot/uEnv.txt

Folgenden Inhalt einfügen

#u-boot eMMC specific overrides; Angstrom Distribution (BeagleBone Black) 2013-06-20
kernel_file=zImage
initrd_file=initrd.img
 
loadaddr=0x82000000
initrd_addr=0x88080000
fdtaddr=0x88000000
 
initrd_high=0xffffffff
fdt_high=0xffffffff
 
loadimage=load mmc ${mmcdev}:${mmcpart} ${loadaddr} ${kernel_file}
loadinitrd=load mmc ${mmcdev}:${mmcpart} ${initrd_addr} ${initrd_file}; setenv initrd_size ${filesize}
loadfdt=load mmc ${mmcdev}:${mmcpart} ${fdtaddr} /dtbs/${fdtfile}
#
 
console=ttyO0,115200n8
mmcroot=/dev/mmcblk0p2 ro
mmcrootfstype=ext4 rootwait fixrtc
 
##To disable HDMI/eMMC...
#optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN,BB-BONE-EMMC-2G
optargs=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN capemgr.enable_partno=enable-uart5
 
##3.1MP Camera Cape
#optargs=capemgr.disable_partno=BB-BONE-EMMC-2G
 
mmcargs=setenv bootargs console=${console} root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs}
 
#zImage:
uenvcmd=run loadimage; run loadfdt; run mmcargs; bootz ${loadaddr} - ${fdtaddr}

Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

Root File system installieren

# tar xfvp ubuntu-14.04-minimal-armhf-2014-07-07/armhf-rootfs-ubuntu-trusty.tar -C /media/rootfs

Kernel installieren

$ export kernel_version=3.15.10-bone6
# cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/BOOT/zImage
# mkdir -p /media/boot/dtbs/
# tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/boot/dtbs/
# mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
# tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/
# tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

Auto-mount Root File System

$ sudo sh -c "echo '/dev/mmcblk0p2  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

Netzwerk einrichten

# nano /media/rootfs/etc/network/interfaces

Folgenden Inhalt einfügen:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto usb0
iface usb0 inet static
    address 192.168.7.2
    netmask 255.255.255.0
    network 192.168.7.0
    gateway 192.168.7.1

Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

Serial Console over UART5

# nano /media/rootfs/etc/init/serial.conf

Folgenden Inhalt einfügen:

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]
 
respawn
exec /sbin/getty 115200 ttyO0

Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

USB-Gadgets Kernelmodul beim Start laden

# nano /media/rootfs/etc/modules

Ganz unten folgende Zeile anhängen:

g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0 removable=1 nofua=1 iManufacturer=Circuitco  iProduct=BeagleBoneBlack

Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

DHCP Server aktivieren:

# nano /media/rootfs/etc/default/udhcpd

Die Zeile mit 'DHCPD_ENABLED=„no“' auskommentieren. Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

DHCP Server konfigurieren:

#nano /media/rootfs/etc/udhcpd.conf

Folgende Einstellungen ändern:

start		192.168.7.1	#default: 192.168.0.20
end		192.168.7.1	#default: 192.168.0.254
interface	usb0		#default: eth0
max_leases	1		#default: 254
optionsubnet	255.255.255.252	#default: 255.255.255.0

Um zu speichern Ctrl+O drücken und mit Ctrl+X schliessen.

Script um microSD Karte auf eMMC Flash zu kopieren

$ wget https://raw.githubusercontent.com/RobertCNelson/boot-scripts/master/tools/eMMC/bbb-eMMC-flasher-eewiki-12mb.sh
$ chmod +x bbb-eMMC-flasher-eewiki-12mb.sh
# cp bbb-eMMC-flasher-eewiki-12mb.sh /media/rootfs/root/

Ganz am Schluss microSD Karte unmounten.

$ sync
# umount /media/boot
# umount /media/rootfs

SPI für FPGA Anbindung auf BBB

Ubuntu 16.04

Auf dem BeagleBone Black kann nun auch Ubuntu 16.04 installiert werden. Das Image dazu steht auf dem eewiki zum Download zur Verfügung. Mit Ubuntu hat auch der Cape Manager geändert, mit welchem die Device Tree Overlays geladen werden können. Deshalb ist momentan die Anelitung zur Aktivierung der SPI auf dem BeagleBone Black (siehe oben) nicht mehr korrekt bzw. aktuell.

Eine grosse Auswahl an Capes besteht für das BeagleBone Black auf Github.

In oben aufgeführter Anleitung zur Aktivierung der SPI mittels device tree overlay gibt es nun einen Fehler im Pfad. Der alte Befehl ist folgender:

echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots

Der Pfad für den Cape-Manager hat nun in Ubuntu 16.04 jedoch geändert und der Befehl sieht nun folgendermassen aus:

echo BB-SPI1-01 > /sys/devices/platform/bone_capemgr/slots

Der aktuelle Befehl zur Aktivierung bzw. Deaktivierung eines Capes zur Bootzeit ist neu folgender:

cape_enable = bone_capemgr.enable_partno=DESIRED_CAPE_NAME

Wenn also oben verlinkte Anleitung für SPI verwendet wird, muss der Schritt, in welchem das File /boot/uEnv.txt angepasst wird, wie folgt abgeändert werden:

optargs=quiet drm.debug=7 cape_disable=bone_capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
cape_enable=bone_capemgr.enable_partno=BB-SPI1-01