[Librem-5-dev] Building and testing your own kernel
andy at warmcat.com
Thu Dec 27 03:20:56 PST 2018
I can't find any existing notes about kernel build and test without
overwriting the old kernel. In the absence of any official information,
here's how I did it. It's not hard since Linux, Freescale, Emcraft and
Purism (and gcc) guys already did the hard stuff.
1) You'll need a serial connection so you can interrupt U-Boot.
I soldered a 0.1" pitch header for the serial console in and connected a
3.3V USB-Serial adapter as described in , which immediately worked at
115200. There are instructions at  that you can use the power USB-C
connector as a logical USB CDC ACM device to get the same result. I
tried it using the USB A - C cable that shipped with the device, but no
ttyACM0 appeared on my box.
2) Install your distro arm64 / aarch64 cross toolchain, or install an
external one of a specific gcc version and add it to your path (out of
scope for these notes). For Fedora, it just means:
$ sudo dnf install gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
3) Clone the kernel tree.
$ git clone https://source.puri.sm/Librem5/linux-emcraft.git
$ cd linux-emcraft
$ mkdir mods
4) Optionally choose the branch, tag or commit... by default it's
imx8-4.18-wip branch HEAD, 2471a858f4e0 when I tried it, and you can
just skip this step and build the latest. If you want to force it to
the exact older commit as was shipped with the dev board:
$ git reset --hard 510718c9
5) Build the kernel
$ CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_STRIP=1
INSTALL_MOD_PATH=mods make -j32 ARCH=arm64 librem5-evk_defconfig all
Note 1: CROSS_COMPILE should be set to the first part of your
toolchain binaries. The Fedora package "gcc-aarch64-linux-gnu" installs
a toolchain named like "aarch64-linux-gnu-gcc". So it's
"aarch64-linux-gnu-" with that.
Note 2: Change the -j32 to suit your build machine number of threads
and memory... 32 means run 32 build steps in parallel.
Note 3: The built modules are placed into ./mods/lib/modules/... and
can be installed into the dev board rootfs. But it seems that there's
nothing critical for basic operation built as a module.
6) Boot the device and confirm the network is working. It's best to set
up keys, but by default the root password is "root". Sshd is already
running and workable. Find your ip address with ifconfig eth0.
On the dev board:
# mkdir /boot/boot2
# mkidr /boot/boot2/dtbs
On your build machine (replace 192.168.2.245 with its IP)
$ scp ./arch/arm64/boot/Image root at 192.168.2.245:/boot/boot2
$ scp ./arch/arm64/boot/dts/freescale/librem5-evk.dtb
root at 192.168.2.245:/boot/boot2/dtbs
7) If you want to copy the modules over too (these are in versioned
directories, but caution: if you built the original shipped commit these
will overwrite the shipped modules since the version will be the
same...) it boots fine for normal operation (network etc) without them...
$ scp -rp mods/lib root at 192.168.2.245:/
8) Reboot the dev board
9) Press a key to enter U-Boot. Then paste the U-Boot commands one by one
setenv fdt_file /boot2/dtbs/librem5-evk.dtb
setenv image /boot2/Image
You will see something like...
Booting from mmc ...
switch to partitions #0, OK
mmc0(part 0) is current device
** File not found boot.scr **
** Unrecognized filesystem type **
40831 bytes read in 90 ms (442.4 KiB/s)
18827776 bytes read in 941 ms (19.1 MiB/s)
## Flattened Device Tree blob at 43000000
Booting using the fdt blob at 0x43000000
reserving fdt memory region: addr=40000000 size=20000
Using Device Tree in place at 0000000043000000, end 000000004300cf7e
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[ 0.000000] Linux version 4.18.11-00322-g2471a858f4e0 (agreen at learn)
(gcc version 8.1.1 20180626 (Red Hat Cross 8.1.1-3) (GCC)) #1 SMP
PREEMPT Thu Dec 27 14:17:58 CST 2018
[ 0.000000] Machine model: Purism Librem 5 devkit
If you reboot it again without interrupting U-Boot, it'll just boot into
the original kernel as before.
More information about the Librem-5-dev