[Librem-5-dev] Building and testing your own kernel

Andy Green andy at warmcat.com
Thu Dec 27 03:20:56 PST 2018


Hi -

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 [1], which immediately worked at 
115200.  There are instructions at [2] 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 
modules_install

   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

  # reboot

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
boot

You will see something like...

...
u-boot=> boot
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.

-Andy

[1] 
https://developer.puri.sm/Librem5/Development_Environment/Boards/Troubleshooting.html#attaching-a-usb-to-serial-adapter

[2] 
https://developer.puri.sm/Librem5/Development_Environment/Boards/imx8.html#devkit-test-run


More information about the Librem-5-dev mailing list