This is an old revision of the document!
The Linux kernel is comprised of numerous modules. These can be in-tree (part of the kernel source structure) or out-of-tree (independent modules). While there are some limitations when writing out-of-tree modules, such as restricted access to certain functions, this generally doesn't affect your ability to write drivers.
We are going to write a few out-of-tree kernel modules since this method is more portable. If your code is not architecture-dependent, then you can compile and test your module on your host machine just as easily as on the board. However, if you want to compile it to run on the board, you need a copy of the kernel's source tree that is checked out at the same version as that which is running on the target device. In the following code example we assume that the board is running Linux v6.4.
# check kernel version on the board [root@board ~]$ uname -r 6.4 # see available release tags on your copy of the Linux repo [student@host ~/linux]$ git tag # check out to the appropriate release version [student@host ~/linux]$ git checkout v6.4
Although we have the desired kernel version, remember that the FDT needed to be slightly modified. Apply the following diffpatch:
[student@host ~/linux]$ git apply kernel_fdt.patch
Finally, compile the Linux kernel after creating the arm64 defconfig. Also, consider enabling the generation of debug info in Kernel hacking / Compile-time checks and compiler options
. If you are compiling the kernel in a VM, make sure to allocate said VM as many CPUs and as much RAM as you can, otherwise it will take a while.
# assuming the cross compiler bin/ is in PATH [student@host ~/linux]$ make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 defconfig [student@host ~/linux]$ make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 Image -j $(nproc) [student@host ~/linux]$ make CROSS_COMPILE=aarch64-none-linux-gnu- ARCH=arm64 dtbs
compile_commands.json
file that contains the cmdline of all ${CROSS_COMPILE}gcc
invocations. Tools like bear can generate it for you without much hassle, but the Linux build system (separate from Kbuild) has a handy script that assembles it for you after compilation:
[student@host ~/linux]$ ./scripts/clang-tools/gen_compile_commands.py
If you don't have a language server configured, you can use elixir as an online alternative.
For this lab we want to be able to easily transfer files to our boards. We are going to achieve this via SSH, so include BR2_PACKAGE_OPENSSH
in your build configuration. Additionally, we want to place a configuration file for the SSH daemon (i.e. sshd) at /etc/ssh/sshd_config
. In order to achieve this, we are going to use a rootfs overlay. Essentially, we are going to specify the absolute path to a certain directory