Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision Last revision Both sides next revision | ||
en:c2_building_rt_kernel [2016/04/05 10:09] odroid created |
en:c2_building_rt_kernel [2016/08/11 14:22] moon.linux [BuildRT Linux Kernel] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | *Template* | + | ====== Odroid C2 Real Time Kernel ====== |
+ | |||
+ | The standard Linux kernel only meets soft real-time requirements: it provides basic POSIX operations for userspace time handling | ||
+ | but has no guarantees for hard timing deadlines. With Ingo Molnar's Realtime Preemption patch | ||
+ | (referenced to as RT-Preempt in this document) and Thomas Gleixner's generic clock event layer with high resolution support, | ||
+ | the kernel gains hard realtime capabilities. | ||
+ | |||
+ | The RT-Preempt patch has raised quite some interest throughout the industry. | ||
+ | Its clean design and consequent aim towards mainline integration makes it an interesting option for hard and firm realtime applications, | ||
+ | reaching from professional audio to industrial control. | ||
+ | |||
+ | Goals of RT kernel | ||
+ | Making in-kernel locking-primitives (using spinlocks) preemptible though reimplementation with rtmutexes: | ||
+ | Critical sections protected by i.e. spinlock_t and rwlock_t are now preemptible. | ||
+ | Implementing priority inheritance for in-kernel mutexes, spinlocks and rw_semaphores. | ||
+ | Converting interrupt handlers into preemptible kernel threads | ||
+ | Converting the old Linux timer API into separate infrastructures for high resolution kernel timers plus one for timeouts, | ||
+ | leading to userspace POSIX timers with high resolution. | ||
+ | |||
+ | ====== Build RT kernel ====== | ||
+ | |||
+ | To build RT kernel we need to update the kernel with Real time kernel patches. | ||
+ | |||
+ | RT Patches file can be found on https://www.kernel.org/pub/linux/kernel/projects/rt/ | ||
+ | |||
+ | Latest Patches for 3.14.x can be found on https://www.kernel.org/pub/linux/kernel/projects/rt/3.14/ | ||
+ | |||
+ | ==== Checkout ==== | ||
+ | You can checkout Linux kernel source tree from **[[https://github.com/hardkernel/linux/tree/odroidc2-3.14.y|Hardkernel's Github]]**. | ||
+ | |||
+ | === RT Linux Kernel === | ||
+ | Note: RT patches depend on the kernel version, so choose the relevant patch series. | ||
+ | <code> | ||
+ | $ git clone --depth 1 -b odroidc2-3.14.y https://github.com/hardkernel/linux.git odroidc2-3.14.y-rt | ||
+ | $ cd odroidc2-3.14.y-rt | ||
+ | $ wget https://www.kernel.org/pub/linux/kernel/projects/rt/3.14/older/patch-3.14.65-rt68.patch.gz | ||
+ | $ zcat patch-3.14.65-rt68.patch.gz > patch-3.14.65-rt68.patch | ||
+ | $ patch -p1 < patch-3.14.65-rt68.patch | ||
+ | </code> | ||
+ | |||
+ | **Note:** Arc arm64 rt kernel have some missing patches so we have to update the kernel for | ||
+ | Following patches need to be applied to build the kernel. | ||
+ | |||
+ | **Note:** These patches can be found in 3.18.y-rt patch series. | ||
+ | |||
+ | <code> | ||
+ | arm64: Mark PMU interrupt IRQF_NO_THREAD.patch | ||
+ | arm64: Allow forced irq threading.patch | ||
+ | arch/arm64: Add lazy preempt support.patch | ||
+ | arm64: replace read_lock to rcu lock in call_step_hook | ||
+ | </code> | ||
+ | |||
+ | **Note:** Few file have conflict so you need to update manually these patches before build the kernel. | ||
+ | |||
+ | ==== BuildRT Linux Kernel ==== | ||
+ | Kernel Configuration for RT Full Preemptible Kernel. | ||
+ | |||
+ | Select following options to build the kernel. | ||
+ | <code> | ||
+ | Kernel Features ---> | ||
+ | Preemption Model (Fully Preemptible Kernel (RT)) ---> | ||
+ | (X) Fully Preemptible Kernel (RT) ---> | ||
+ | </code> | ||
+ | **Note:** update the odroidc2_defconfig with current modified. | ||
+ | <code> | ||
+ | $ cp .config arch/arm64/configs/odroidc2_defconfig | ||
+ | </code> | ||
+ | |||
+ | Then, Update your ODROID's kernel. | ||
+ | |||
+ | You must do kernel configuration for ODROID-C2, then start to build. Adding -j option on make command will help you to finish compiling faster. | ||
+ | |||
+ | <code> | ||
+ | $ make odroidc2_defconfig | ||
+ | $ make <-j4> Image dtbs modules | ||
+ | </code> | ||
+ | |||
+ | You have done to compile the Linux kernel (Image), the device tree file (.dtb) and kernel modules (.ko). | ||
+ | |||
+ | <WRAP center round important 100%> | ||
+ | ** This explanation assume that your USB memory CARD reader is assigned at /dev/sdc. Be careful!** | ||
+ | </WRAP> | ||
+ | |||
+ | 1. Plug the Boot-Device(eMMC or SD) into the USB memory CARD reader and Connect the USB memory CARD reader to your HOST PC(Linux OS). | ||
+ | |||
+ | 2. Copy the Image and DT(meson64_odroidc2.dtb) to the FAT partition(1st partition) in the Boot-Device. | ||
+ | <code> | ||
+ | $ mkdir -p mount | ||
+ | $ sudo mount /dev/sdc1 ./mount | ||
+ | $ sudo cp arch/arm64/boot/Image arch/arm64/boot/dts/meson64_odroidc2.dtb ./mount && sync && sudo umount ./mount | ||
+ | </code> | ||
+ | |||
+ | 3. Copy the driver modules to the EXT4 partition(2nd partition) in the Boot-Device. | ||
+ | <code> | ||
+ | $ sudo mount /dev/sdc2 ./mount | ||
+ | $ sudo make modules_install ARCH=arm64 INSTALL_MOD_PATH=./mount && sync && sudo umount ./mount | ||
+ | $ rm -rf mount | ||
+ | </code> |