I'm posting the steps I executed to build and install a PREEMPT RT Linux kernel in Raspberry Pi OS for my Pi 4B for two reasons.
- Hopefully it helps someone trying to do this or something similar. I appreciate the pointers I got from alangibson, cornholio, and rodw
- This is the first Linux kernel I've ever built. So I open this up to comments and suggestions.
NOTE: Version 6.13 of the Linux kernel is under development and could have bugs / issues. So far it's been stable for me, but your mileage may vary.
I started with a fresh installation of
Raspberry Pi OS
on my Pi 4B.
1/16/25 Edit: Based on responses after the initial post it was clear that the Wayland display protocol is non-optimal for LinuxCNC. A comparison of the baseline
pre-optimized jitter was conducted where the only difference is the display protocol, Wayland vs X11. The latency histograms for each are included in those posts, and show a dramatic difference with X11 inducing significantly less jitter. Wayland is the default in the current Raspberry Pi OS, but is easily changed to X11.
You can check the session type:
wayland
Launch Rasp-config command line tool in a terminal:
Arrow down to "Advanced Options", and enter.
Arrow down to "Wayland Switch between X and Wayland backends", and enter.
If not on the line that says "W1 X11 Openbox window manager with X11 backend", arrow to it and enter.
The popup should say "Openbox on X11 is active" and have "Ok" highlighted. Enter.
It will return to the main screen. Use left-righ arrows to select "Finish". Enter.
Popup asks if you would like to reboot now, with "Yes" highlighted. Enter.
After reboot:
x11
Raspberry Pi's
documentation on how to build a kernel
was used as the guideline for this process:
Download the source code for the 6.13 Raspberry Pi kernel:
git clone -b rpi-6.13.y --depth=1 https://github.com/raspberrypi/linux
Install the needed build dependencies:
sudo apt install bc bison flex libssl-dev make
Download the RT patches for v6.13 and the signature file.
Starting here
, select the
tarballs link
at bottom left of page. From the list of versions,
select the 6.13 link
.
Download the patch file patch-6.13-rc6-rt3.patch.gz:
curl -OL https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.13/patch-6.13-rc6-rt3.patch.gz
Download the signature file patch-6.13-rc6-rt3.patch.sign:
curl -OL https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.13/patch-6.13-rc6-rt3.patch.sign
Verify the signature of the patch file. These were committed by Sebastian Andrzej Siewior.
Add the following two lines:
auto-key-locate wkd,dane,local
Get the public key for "Sebastian Andrzej Siewior <
This email address is being protected from spambots. You need JavaScript enabled to view it.>"
gpg --locate-keys [email]bigeasy@linutronix.de[/email]
Unzip the patch file:
gzip -d patch-6.13-rc6-rt3.patch.gz
Verify signature:
gpg2 --verify patch-6.13-rc6-rt3.patch.sign
gpg: assuming signed data in 'patch-6.13-rc6-rt3.patch'
gpg: Signature made Thu 09 Jan 2025 05:04:09 AM EST
gpg: using RSA key 57892E705233051337F6FDD105641F175712FA5B
gpg: Good signature from "Sebastian Andrzej Siewior <
This email address is being protected from spambots. You need JavaScript enabled to view it.>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 6425 4695 FFF0 AA44 66CC 19E6 7B96 E816 2A8C F5D1
Subkey fingerprint: 5789 2E70 5233 0513 37F6 FDD1 0564 1F17 5712 FA5B
Go back to the linux directory created by the git clone:
Patch the 6.13 RT kernel:
patch -p1 < ~/Downloads/patch-6.13-rc6-rt3.patch
patching file arch/arm/Kconfig
patching file arch/arm/kernel/module-plts.c
patching file arch/arm/kernel/traps.c
patching file arch/arm/mm/fault.c
patching file arch/arm64/kernel/ftrace.c
patching file arch/arm64/kernel/traps.c
patching file arch/loongarch/kernel/ftrace_dyn.c
patching file arch/loongarch/kernel/unwind_orc.c
patching file arch/powerpc/Kconfig
patching file arch/powerpc/include/asm/stackprotector.h
patching file arch/powerpc/include/asm/thread_info.h
patching file arch/powerpc/kernel/interrupt.c
patching file arch/powerpc/kernel/trace/ftrace.c
patching file arch/powerpc/kernel/trace/ftrace_64_pg.c
patching file arch/powerpc/kernel/traps.c
patching file arch/powerpc/kvm/Kconfig
patching file arch/powerpc/lib/vmx-helper.c
patching file arch/powerpc/platforms/pseries/Kconfig
patching file arch/powerpc/platforms/pseries/iommu.c
patching file arch/s390/kernel/dumpstack.c
patching file arch/x86/kernel/callthunks.c
patching file arch/x86/kernel/dumpstack.c
patching file arch/x86/kernel/unwind_orc.c
patching file arch/xtensa/kernel/traps.c
patching file drivers/gpu/drm/i915/Kconfig
patching file drivers/gpu/drm/i915/display/intel_crtc.c
patching file drivers/gpu/drm/i915/display/intel_cursor.c
patching file drivers/gpu/drm/i915/display/intel_display_trace.h
patching file drivers/gpu/drm/i915/display/intel_vblank.c
patching file drivers/gpu/drm/i915/gt/intel_execlists_submission.c
patching file drivers/gpu/drm/i915/gt/uc/intel_guc.h
patching file drivers/gpu/drm/i915/i915_request.c
patching file drivers/gpu/drm/i915/i915_trace.h
patching file drivers/gpu/drm/i915/i915_utils.h
patching file drivers/tty/serial/8250/8250_core.c
Hunk #1 succeeded at 403 (offset 15 lines).
Hunk #2 succeeded at 411 (offset 15 lines).
Hunk #3 succeeded at 541 (offset 15 lines).
patching file drivers/tty/serial/8250/8250_port.c
Hunk #4 succeeded at 3317 (offset 9 lines).
Hunk #5 succeeded at 3350 (offset 9 lines).
Hunk #6 succeeded at 3409 (offset 9 lines).
Hunk #7 succeeded at 3475 (offset 9 lines).
Hunk #8 succeeded at 3618 (offset 9 lines).
Hunk #9 succeeded at 3628 (offset 9 lines).
patching file include/linux/kallsyms.h
patching file include/linux/module.h
patching file include/linux/preempt.h
patching file include/linux/serial_8250.h
patching file kernel/cfi.c
patching file kernel/jump_label.c
patching file kernel/kprobes.c
patching file kernel/ksysfs.c
patching file kernel/livepatch/core.c
patching file kernel/module/internal.h
patching file kernel/module/kallsyms.c
patching file kernel/module/main.c
patching file kernel/module/tracking.c
patching file kernel/module/tree_lookup.c
patching file kernel/module/version.c
patching file kernel/sched/core.c
patching file kernel/static_call_inline.c
patching file kernel/trace/bpf_trace.c
patching file kernel/trace/trace.c
patching file kernel/trace/trace_kprobe.c
patching file lib/bug.c
patching file lib/dump_stack.c
patching file localversion-rt