home Sonstiges Linux OpenBSD Links

For other releases please see here. This is an old release.

Linux from Scratch 8.4 on Wandboard i.MX6

I created a minimal LFS system. It might be interesting for people who are searching a minimal system for their own Wandboard projects.

My SD card image can be downloaded here.

Please use the upper SD card slot at the Wandboard:

Installed/used software
from LFS:
man-pages 5.00 , glibc 2.29, zlib 1.2.11, file 5.36, readline 8.0, m4 1.4.18, bc 1.07.1, binutils 2.32, GMP 6.1.2, MPFR 4.0.2, MPC 1.1.0, gcc 8.3.0, pkg-config 0.29.2, ncurses 6.1, attr 2.4.48, acl 2.2.53, libcap 2.26, sed 4.7, psmisc 23.2, iana-etc 2.30, bison 3.3.2, flex 2.6.4, grep 3.3, bash 5.0, libtool 2.4.6, GDBM 1.18.1, inetutils 1.9.4, Perl 5.28.1, expat 2.2.6, gperf 3.1, XML::Parser 2.44, intltool 0.51.0, autoconf 2.69, automake 1.16.1, xz 5.2.4, kmod 26, gettext, elfutils 0.176, libffi 3.2.1, OpenSSL 1.1.1b, Python 3.7.3, ninja 1.9.0, meson 0.49.2, coreutils 8.31, check 0.12.0, diffutils 3.7, gawk 4.2.1, findutils 4.6.0, groff 1.22.4, less 530, gzip 1.10, IPRoute2 5.0.0, kbd 2.0.4, libpipeline 1.5.1, make 4.2.1, patch 2.7.6, man-db 2.8.5, tar 1.32, texinfo 6.6, vim 8.1, procps-ng 3.3.15, util-linux 2.33.1, e2fsprogs 1.45.0, sysklogd 1.5.1, sysvinit 2.94, eudev 3.2.7

additional software:
isl 0.21, libtasn1 4.13, p11-kit 0.23.15, make-ca 1.2, wget 1.20.3, cpio 2.12, joe 4.6, nano 4.0, net-tools-cvs_20101030 (and from there additional ifconfig because this knows IPv6), traceroute 2.1.0, tree 1.8.0, which 2.21, libtirpc 1.1.4, lsof 4.91, iptables 1.8.2, lynx 2.8.9rel1, time 1.9, tcl 8.6.9, expect 5.45.5, dejagnu 1.6.2, gcc 8.3.0 (with enabled languages c,c++,fortran,go,objc,obj-c++), libnl 3.4, libunistring 0.9.10, libidn2 2.1.1, pcre2 10.32, curl 7.64.1, rpcbind 1.2.5, git 2.21.0, wireless tools 29, wpa_supplicant 2.7, Python 2.7.16, htop 2.2.0, screen 4.6.2, sntp and ntpdate from ntp 4.2.8p13, lzo 2.10, lzop 1.04, openssh 7.9p1, dhcpcd 7.1.1, uboot (via git checkout, see below), linux kernel 5.0.5 with Wandboard patches (see below)

Network connectivity

The image is configured to request an IP address via DHCP via ethernet connection. Dhcpd will send out the hostname wandboard. If you have a Fritzbox, the system should be SSH able via wandboard.fritz.box
WLAN is not configured, you need to configure the WPA passphrase. See file HowToGetWLANrunning in the home directory of root.

Resizing the partition

Use cfdisk /dev/mmcblk2. There is a menu point Resize.
Use resize2fs /dev/mmcblk2p1 to expand the filesystem.

Hints if you want to create your own LFS

As LFS target please use armv7l-lfs-linux-gnueabihf - Chapter 4.4 Setting Up the Environment:
cat > ~/.bashrc << "EOF"
set +h
umask 022
At two points the LFS book says you must patch gcc. Since LFS is more for i386/x86-64 the patch in the book doesn't take care about arm. So here are the correct commands (chapter 5.5.1 GCC-8.2.0 - Pass 1 and chapter 5.10.1 GCC-8.2.0 - Pass 2):
for file in gcc/config/{linux,i386/linux{,64},arm/linux-eabi,arm/linux-elf}.h
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig

Chapter 6.9.1 Glibc:

case $(uname -m) in
    i?86)    GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/8.2.0/include
            ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
    x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/8.2.0/include
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    armv7l) GCC_INCDIR=/usr/lib/gcc/armv7l-unknown-linux-gnueabi/8.2.0/include
            ln -sfv ld-linux.so.3 /lib/ld-lsb.so.3
Chapter 6.10 Adjusting the Toolchain:
mv -v /tools/bin/{ld,ld-old}
mv -v /tools/armv7l-unknown-linux-gnueabi/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/armv7l-unknown-linux-gnueabi/bin/ld
Chapter 7.6.2 Configuring Sysvinit
I added an agetty entry in /etc/inittab for the serial console:
c0:12345:respawn:/sbin/agetty 115200 ttymxc0 vt100
Hint: on the Wandboard, ttymxc0 is the serial line, not ttyS0

Chapter 7.6.5 Configuring the Linux Console
After trying a boot with the new LFS, it stopped with this error message:

*****Setting up Linux console...                                       [ FAIL ]
*****                                                                  [ FAIL ]

You should not be reading this error message.

It means that an unforeseen error took place in
which exited with a return value of 1.
If you're able to track this error down to a bug in one of
the files provided by the LFS book,
please be so kind to inform us at lfs-dev@linuxfromscratch.org (Registration required).
*****                                                                  [ FAIL ]
     Press Enter to continue...
After pressing Enter to system continues to boot. But usually you might have not a serial console connected so you never see this message.
I figured out that there is a line in cat /etc/sysconfig/console which caused the error. Comment the line starting with LEGACY_CHARSET with a #
# Begin /etc/sysconfig/console

#LEGACY_CHARSET="iso-8859-15" # Removed, with this enabled the console init script stops
FONT="LatArCyrHeb-16 -m 8859-15"

# End /etc/sysconfig/console

Compiling and installing U-Boot

The information are taken from https://eewiki.net/display/linuxonarm/Wandboard

git clone https://github.com/u-boot/u-boot
cd u-boot/
git checkout v2019.01 -b tmp
wget -c https://rcn-ee.com/repos/git/u-boot-patches/v2019.01/0001-wandboard-uEnv.txt-bootz-n-fixes.patch
patch -p1 < 0001-wandboard-uEnv.txt-bootz-n-fixes.patch
make distclean
make wandboard_defconfig 
You should find now two files: SPL and u-boot.img. Assume your SD card is /dev/sdb, install U-Boot with this commands (as root):
dd if=/dev/zero of=/dev/sdb bs=1M count=10
dd if=SPL of=/dev/sdb seek=1 bs=1k
dd if=u-boot.img of=/dev/sdb seek=69 bs=1k
Hint: if you are already on a Wandboard, the SD card might be /dev/mmcblk0 or /dev/mmcklb2

To create a partition, use the program sfdisk (as root). You should use a newer version of sfdisk (=> 2.26):

sfdisk /dev/sdb <<-__EOF__

Compiling and installing a Linux kernel

The information are taken from https://eewiki.net/display/linuxonarm/Wandboard. You might need to change path names depending is you are inside a LFS chroot or not. Take care that you do not destroy your host system /boot directory!

git clone https://github.com/RobertCNelson/armv7-multiplatform
cd armv7-multiplatform/
git checkout origin/v5.0.x -b tmp
You don't need to change anything in the configuration dialog except one thing: Set General setup / Kernel compression mode to Gzip

At the end the kernel, modules and dtbs archive has been build. You get an overview. Example:

'arch/arm/boot/zImage' -> '/root/kernel/armv7-multiplatform/deploy/5.0.5-armv7-x8.zImage'
'.config' -> '/root/kernel/armv7-multiplatform/deploy/config-5.0.5-armv7-x8'
-rwxr-xr-x 1 root root 8.2M Apr  7 02:45 /root/kernel/armv7-multiplatform/deploy/5.0.5-armv7-x8.zImage
Building modules archive...
Compressing 5.0.5-armv7-x8-modules.tar.gz...
-rw-r--r-- 1 root root 19M Apr  7 02:51 /root/kernel/armv7-multiplatform/deploy/5.0.5-armv7-x8-modules.tar.gz
Building dtbs archive...
Compressing 5.0.5-armv7-x8-dtbs.tar.gz...
-rw-r--r-- 1 root root 4.9M Apr  7 02:52 /root/kernel/armv7-multiplatform/deploy/5.0.5-armv7-x8-dtbs.tar.gz
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=5.0.5-armv7-x8]
In this example the kernel version is 5.0.5-armv7-x8 Create /boot/uEnv.txt with this content:
uname_r is the kernel that U-Boot should load. The filename must start with vmlinuz, so copy and rename the kernel:
cp -v ./deploy/5.0.5-armv7-x8.zImage /boot/vmlinuz-5.0.5-armv7-x8
Install the dtbs files:
mkdir -p /boot/dtbs/5.0.5-armv7-x8/
tar xfv ./deploy/5.0.5-armv7-x8-dtbs.tar.gz -C /boot/dtbs/5.0.5-armv7-x8/
Install kernel modules (again: you might need to modify the path, take care that you don't destroy your host system /lib!):
tar xfv ./deploy/5.0.5-armv7-x8-modules.tar.gz -C /

Booting from SATA drive

Only the Quad Wandboard has a SATA connector.
The Wandboard will always boot the kernel from the SD card, so you must simply add a root=/dev/sda1 to /boot/uEnv.txt (again on the SD card).
The best ways is: install the image /on the SD card, prepare the SATA drive and change the value in /uEnv.txt. So should it look:
cmdline=root=/dev/sda1 rw video=HDMI-A-1:1024x768@60e

Adding a Dallas DS1307 RTC

This has been untested, but should work.

The Wandboard onboard RTC will always loose the time if powered off. Simplest way is to set the time via NTP. But if don't want this or your configuration has no access to a NTP server, you can add a Dallas DS1307 RTC chip via I2C connection.
I bought a small Adafruit DS1307 board. It has five pin, but you only have to connect four wires: +5V, GND, SDA, SCL. The board needs a CR1220 battery to keep the time. On my first tries I inserted the battery in the wrong direction - so of course the DS1307 will not keep the time ;)
The I2C pins SDA and SCL are at JP2 expansion pin header, +5V and GND are at JP4. See Wandboard User Guide page 7 for information which pin is which signal. My wiring looks bad, but it works:
Click here to enlarge

Finally you must the tell the system that there is a DS1307 RTC. With my minimal LFS system from above, edit /etc/rc.d/init.d/settimeviantp and add the red lines:

case "$1" in
        echo "try to set time via DS1307"
        echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device
        sleep 3
        /sbin/hwclock --rtc /dev/rtc1 --hctosys
        echo "Setting time via NTP from ptbtime1.ptb.de..."
        sleep 10
        /usr/sbin/ntpdate -s ptbtime1.ptb.de
        sleep 1
The echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device command is important. This tells the kernel that there is a DS1307 device. Of course the kernel needs to be compiled with I2C and DS1307 RTC support.

Run now /etc/rc.d/init.d/settimeviantp start

At dmesg you should see that the DS1307 recognized:

root@wandboard:~ # dmesg | grep ds1307
[   12.591586] rtc-ds1307 0-0068: registered as rtc1
[   12.597197] i2c i2c-0: new_device: Instantiated device ds1307 at 0x68
The DS1307 is registered as rtc1, so we have to tell the hwclock command via parameter --rtc /dev/rtc1 that this should be used.

To set the time to the DS1307 RTC from the current kernel time which has been hopefully set via NTP, use:

root@wandboard:~ # hwclock --rtc /dev/rtc1 -w
You may want to create a crontab script that updates at least one time per day the time via NTP and sync to the DS1307.

If something doesn't work it is always good to check with I2C Tools. Does it see the DS1307?

root@wandboard:~ # i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
If you see instead of 68 only UU: you have set already the device via settimeviantp script (echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device)

Keep in mind: the Wandboard has two I2C busses, my wiring from above is on the first I2C bus, which is checked via the parameter -y 0

Nullmodem cable

I'm able to watch the boot process via a serial null modem cable. But it seems so that my keystrokes are not transmitted. Currently no idea why. I have a second Wandboard (DUAL version) where the null modem cable works as expected. Once agetty started a login dialog, it worked. Set speed to 115200 in your terminal program.

zurück zur Linuxübersicht
Letzte Aktualisierung dieser Seite: 7. April 2019