Building the Beaglebone kernel
This post describes how to cross compile the Beaglebone Black (BBB) or Beaglebone Green (BBG) Linux kernel on an Ubuntu 18.04 Linux machine.
1. Introduction
Before you proceed, back up your BBB files as we are going to overwrite them!
Although it is possible to develop directly on a Linux embedded
platform, often the machine speed, disk and memory capacity are insufficient for
doing kernel work. Moreover, not all embedded systems have luxuries
such as Ethernet. For these reasons, the normal practice is to
compile on a more powerful host machine. In the descriptions that following, the $
prompt is from the host machine and the debian@beaglebone:~$
prompt is on the BBB.
The system that I am using is Ubuntu 18.04.5. Start by installing this on your real or virtual machine.
Also, you should update the Debian distribution on your BBB. Download and flash the latest image. Boot from an SD card with the latest image by pressing the “User Boot” button while applying power.
Then extend the partition to the same size as the SDcard (the initial partition is 4 GB) by executing.
$ sudo /opt/scripts/tools/grow_partition.sh
and rebooting.
2. Reflash the eMMC
If you want to reflash the eMMC as well, uncomment the following line in /boot/uEnv.txt
:
cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh
Then reboot again from the SDcard. After a few tens of seconds, you should see a pattern of the blue LEDs turning on in sequence. After tens of minutes, they will all turn off and your eMMC will have the same image as the SDcard.
2. Cross Compilation
On the BBB, work out what kernel version is being used:
debian@beaglebone:~$ uname -r
4.19.94-ti-r42
Now install the cross compiler.
$ sudo apt-get install gcc-arm-linux-gnueabi bison flex libssl-dev lzop u-boot-tools
Clone the BBB Linux repository and checkout the kernel version you are using. Even if you are planning to upgrade the kernel, it is a good idea to make sure you can rebuild the original one first.
$ git clone git://github.com/beagleboard/linux.git
$ git checkout 4.19.94-ti-r42
This installs installs the initial .config
file for the BB kernel and tells the make
system to use the cross compiler that we installed..
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- bb.org_defconfig
You can configure the kernel with custom options using the command.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
While you are there, select the SiLabs 5351A/B/C driver under “Kernel Configuration > Device Drivers > Common Clock Framework” as illustrated below.
.config - Linux/arm 4.19.94 Kernel Configuration
> Device Drivers > Common Clock Framework
┌─sssssssssssssssssssssss Common Clock Framework ─ ┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty │
│ submenus ----). Highlighted letters are hotkeys. Pressing <Y> │
│ includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to │
│ exit, <?> for Help, </> for Search. Legend: [*] built-in [ ] │
│ ┌─ ┐ │
│ │ [ ] PLL Driver for HSDK platform │ │
│ │ < > Maxim 9485 Programmable Clock Generator │ │
│ │ <*> Clock driver for SiLabs 5351A/B/C │ │
│ │ < > Clock driver for SiLabs 514 devices │ │
│ │ < > Clock driver for SiLabs 544 devices │ │
│ │ < > Clock driver for SiLabs 570 and compatible devices │ │
│ │ < > Clock driver for TI CDCE706 clock synthesizer │ │
│ │ < > Clock driver for TI CDCE913/925/937/949 devices │ │
│ │ < > Clock driver for CS2000 Fractional-N Clock Synthesizer & Cloc│ │
│ │ [ ] Clock driver for Freescale QorIQ platforms │ │
│ └─ ┴(+) ┘ │
├─ ┤
│ <Select> < Exit > < Help > < Save > < Load > │
└─ ┘
After you finish, exit and save your configuation (it is fine not to make changes at this point). You can
see that what it did was to select the CONFIG_COMMON_CLK_SI5351
option.
$ grep 5351 .config
CONFIG_COMMON_CLK_SI5351=y
Now cross compile the kernel, specifying the loading address (0x80000000) and that we want to make an image suitable for Uboot (uImage) and to buid all the device tree binaries (dtbs),
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LOADADDR=0x80000000 uImage dtbs
Now build the kernel modules.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
Then strip and install them all to some temporary directory.
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=/tmp/bbbfs modules_install
3. Testing the new Kernel
First copy the kernel and modules to the BBB. You will need SDcard storage to include all the modules that are in Linux.
$ scp arch/arm/boot/uImage beaglebone.local:
$ scp -r /tmp/bbbfs beaglebone.local:
Then move the files into the correct location as root.
debian@beaglebone:~$ mv ~/bbbfs/lib/modules/4.19.94 /lib/modules
debian@beaglebone:~$ mv ~/zImage /boot/vmlinuz-4.19.94
Change the kernel that will be used to this one in /boot/uEnv.txt
by modifying the uname_r
environment variable.
# uname_r=4.19.94-ti-r42
uname_r=4.19.94
and reboot. We can check the new kernel is being used by the build time.
debian@beaglebone:~$ cat /proc/version
Linux version 4.19.94 (phwl@bream) (gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)) #1 SMP PREEMPT Wed Mar 24 10:25:30 AEDT 2021
4. Docker version
Install dockere (if needed).
``` sudo apt install docker.io wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.6.15.tar.xz tar -xf linux-5.6.15.tar.xz cd linux-5.6.15 docker run –rm dockcross/linux-x64 > ./dockcross chmod +x dockcross ./dockcross make defconfig ./dockcross make -j 4