home Sonstiges Linux OpenBSD Links

Linux from Scratch on Wandboard i.MX6

This is an old release, for other releases see here.

I created a minimal LFS system. It might be interesting for people who are searching a minimal system for their own Wandboard projects. It was created between 13th and 20th Jan 2018.

My SD card image can be downloaded here.

Please use the upper SD card slot at the Wandboard:

Installed/used software
from LFS:
acl 2.2.52, attr 2.4.47, autoconf 2.69, automake 1.15.1, bash 4.4.12, bc 1.07.1, binutils 2.29.1, bison 3.0.4, bzip2 1.0.6, check 0.12.0, coreutils 8.29, DejaGNU 1.6.1, diffutils 3.6, eudev 3.2.5, e2fsprogs 1.43.8, elfutils 0.170, expat 2.2.5, expect 5.45.3, file 5.32, findutils 4.6.0, flex 2.6.4, gawk 4.2.0, gcc 7.2.0, GDBM 1.14.1, gettext 0.19.8.1, glibc 2.26, GMP 6.1.2, gperf 3.1, grep 3.1, groff 1.22.3, gzip 1.9, iana-etc 2.30, inetutils 1.9.4, intltool 0.51.0, IPRoute2 4.14.1, kbd 2.0.4, kmod 25, less 487, LFS-bootscripts 20170626, libcap 2.25, libffi 3.2.1, libpipeline 1.5.0, libtool 2.4.6, linux 4.14.13, m4 1.4.18, make 4.2.1, man-DB 2.7.6.1, man-pages 4.14, meson 0.44.0, MPC 1.1.0, MPFR 4.0.0, ninja 1.8.2, ncurses 6.0, patch 2.7.5, perl 5.26.1, pkg-config 0.29.2, procps 3.3.12, psmisc 23.1, python 3.6.4, readline 7.0, sed 4.4, shadow 4.5, sysklogd 1.5.1, sysvinit 2.88dsf, tar 1.30, tcl 8.6.8, texinfo 6.5, time zone data 2017c, udev-lfs-tarball udev-lfs-20171102, util-linux 2.31.1, vim 8.0.586, XML::Parser 2.44, xz utils 5.2.3, zlib 1.2.11

additional software:
openssl 1.1.0g, Certificate Authority Certificates, dhcpcd 7.0.0, time 1.8, tree 1.7.0, curl 7.57, pcre 8.41, libtirpc 1.0.2, rpcbind 0.2.4, lsof 4.89, lynx 2.8.8rel2, wget 1.19.2, joe 4.6, slang 2.3.1, nano 2.9.2, git 2.15.1, cpio 2.12, wireless tools 29, libnl 3.4, wpa_supplicant 2.6, traceroute 2.1, iptables 1.6.1, openssh 7.6p1, sntp and ntpdate from ntp 4.2.8p10, htop 2.0.2, which 2.21, net-tools-cvs_20101030 (and from there additional ifconfig because this knows IPv6), uboot (via git checkout, see below), linux kernel 4.14 tree with Wandboard patches (see below)


resizing the partition

Use cfdisk /dev/mmcblk2. There is a menu point Resize.
After that 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

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-7.2.0 - Pass 1 and chapter 5.10. GCC-7.2.0 - Pass 2):

for file in gcc/config/{linux,i386/linux{,64},arm/linux-eabi,arm/linux-elf}.h
do
  cp -uv $file{,.orig}
  sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
      -e 's@/usr@/tools@g' $file.orig > $file
  echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

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 v2018.01-rc2 -b tmp
make distclean
make wandboard_defconfig 
make
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
To create a partition, use the program sfdisk (as root). You should use a newer version (=> 2.26):
sfdisk /dev/sdb <<-__EOF__
1M,3G,L,*
__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/v4.14.x -b tmp
./build_kernel.sh
At the end the kernel, modules and dtbs archive has been build. You get an overview, copy and paste it. Example:
'arch/arm/boot/zImage' -> '/sources/kernel2/armv7-multiplatform/deploy/4.14.14-armv7-x4.zImage'
'.config' -> '/sources/kernel2/armv7-multiplatform/deploy/config-4.14.14-armv7-x4'
-rwxr-xr-x 1 root root 6,5M 18. Jan 23:22 /sources/kernel2/armv7-multiplatform/deploy/4.14.14-armv7-x4.zImage
-----------------------------
Building modules archive...
Compressing 4.14.14-armv7-x4-modules.tar.gz...
-rw-r--r-- 1 root root 20M 18. Jan 23:30 /sources/kernel2/armv7-multiplatform/deploy/4.14.14-armv7-x4-modules.tar.gz
-----------------------------
Building dtbs archive...
Compressing 4.14.14-armv7-x4-dtbs.tar.gz...
-rw-r--r-- 1 root root 4,3M 18. Jan 23:30 /sources/kernel2/armv7-multiplatform/deploy/4.14.14-armv7-x4-dtbs.tar.gz
-----------------------------
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=4.14.14-armv7-x4]
In this example the kernel version is 4.14.14-armv7-x4 Create /boot/uEnv.txt with this content:
uname_r=4.14.14-armv7-x4
cmdline=video=HDMI-A-1:1024x768@60e
uname_r is the kernel that U-Boot should load. The filename must start with vmlinuz, so copy and rename the kernel:
cp -v ./armv7-multiplatform/deploy/4.14.14-armv7-x4.zImage /boot/vmlinuz-4.14.14-armv7-x4
Install the dtbs files:
mkdir -p /boot/dtbs/4.14.14-armv7-x4/
tar xfv ./armv7-multiplatform/deploy/4.14.14-armv7-x4-dtbs.tar.gz -C /boot/dtbs/4.14.14-armv7-x4/
Install kernel modules (again: you might need to modify the path, take care that you don't destroy your host system /lib!):
tar xfv ./armv7-multiplatform/deploy/4.14.14-armv7-x4-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:
uname_r=4.14.14-armv7-x4
cmdline=root=/dev/sda1 rw video=HDMI-A-1:1024x768@60e

Adding a Dallas DS1307 RTC

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
    start)
        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.

zurück zur Linuxübersicht
Letzte Aktualisierung dieser Seite: 24. Februar 2018