Introduction

This document shows what a simple kernel module looks like and how it can be integrated as a package in Buildroot.

The kernel module itself

Makefile

obj-m := mymod.o
mymod-objs := mymod-test1.o mymod-test2.o
ccflags-y := -I$(src)/include

mymod-test1.c

#include <linux/module.h>
#include <linux/kernel.h>

#include 

static int mymod_init(void)
{
	pr_info("Entering\n");
	foobar();
	return 0;
}

static void mymod_exit(void)
{
	pr_info("Exiting\n");
}

module_init(mymod_init)
module_exit(mymod_exit)

MODULE_LICENSE("GPLv2");
MODULE_AUTHOR("Thomas Petazzoni");

mymod-test2.c

#include <linux/kernel.h>

void foobar(void)
{
	pr_info("In foobar!\n");
}

include/mymod.h

#ifndef __MYMOD_H__
#define __MYMOD_H__

void foobar(void);

#endif /* __MYMOD_H__ */

Buildroot packaging

package/example-mod/example-mod.mk

The following .mk assumes that the kernel module code above is stored locally in $(HOME)/example-mod.

################################################################################
#
# example-mod
#
################################################################################

EXAMPLE_MOD_SITE = $(HOME)/example-mod
EXAMPLE_MOD_SITE_METHOD = local

$(eval $(kernel-module))
$(eval $(generic-package))

package/example-mod/Config.in

config BR2_PACKAGE_EXAMPLE_MOD
	bool "example-mod"
	depends on BR2_LINUX_KERNEL
	help
	  This is an example kernel module.

comment "example-mod needs a Linux kernel to be built"
	depends on !BR2_LINUX_KERNEL

package/Config.in

Just the following change:

diff --git a/package/Config.in b/package/Config.in
index e860f72..ef3a453 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -368,6 +368,7 @@ endif
        source "package/eudev/Config.in"
        source "package/evemu/Config.in"
        source "package/evtest/Config.in"
+       source "package/example-mod/Config.in"
        source "package/fan-ctrl/Config.in"
        source "package/fbtft/Config.in"
        source "package/fconfig/Config.in"

Testing

>>> example-mod undefined Syncing from source dir /home/thomas/example-mod
rsync -au --chmod=u=rwX,go=rX --exclude .svn --exclude .git --exclude .hg --exclude .bzr --exclude CVS /home/thomas/example-mod/ /home/thomas/projets/buildroot/output/build/example-mod-undefined
>>> example-mod undefined Configuring
>>> example-mod undefined Building
>>> example-mod undefined Building kernel module(s)
PATH="/home/thomas/projets/buildroot/output/host/bin:/home/thomas/projets/buildroot/output/host/sbin:/home/thomas/projets/buildroot/output/host/usr/bin:/home/thomas/projets/buildroot/output/host/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/thomas/sys/bin:/home/thomas/.gem/ruby/2.1.0/bin" BR_BINARIES_DIR=/home/thomas/projets/buildroot/output/images /usr/bin/make -j5 -C /home/thomas/projets/buildroot/output/build/linux-4.5 HOSTCC="/usr/bin/gcc" HOSTCFLAGS="" ARCH=arm INSTALL_MOD_PATH=/home/thomas/projets/buildroot/output/target CROSS_COMPILE="/home/thomas/projets/buildroot/output/host/usr/bin/arm-linux-" DEPMOD=/home/thomas/projets/buildroot/output/host/sbin/depmod  PWD=/home/thomas/projets/buildroot/output/build/example-mod-undefined/. M=/home/thomas/projets/buildroot/output/build/example-mod-undefined/. modules
  CC [M]  /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod-test1.o
  CC [M]  /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod-test2.o
  LD [M]  /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod.mod.o
  LD [M]  /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod.ko
>>> example-mod undefined Installing to target
>>> example-mod undefined Installing kernel module(s)
PATH="/home/thomas/projets/buildroot/output/host/bin:/home/thomas/projets/buildroot/output/host/sbin:/home/thomas/projets/buildroot/output/host/usr/bin:/home/thomas/projets/buildroot/output/host/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/thomas/sys/bin:/home/thomas/.gem/ruby/2.1.0/bin" BR_BINARIES_DIR=/home/thomas/projets/buildroot/output/images /usr/bin/make -j5 -C /home/thomas/projets/buildroot/output/build/linux-4.5 HOSTCC="/usr/bin/gcc" HOSTCFLAGS="" ARCH=arm INSTALL_MOD_PATH=/home/thomas/projets/buildroot/output/target CROSS_COMPILE="/home/thomas/projets/buildroot/output/host/usr/bin/arm-linux-" DEPMOD=/home/thomas/projets/buildroot/output/host/sbin/depmod  PWD=/home/thomas/projets/buildroot/output/build/example-mod-undefined/. M=/home/thomas/projets/buildroot/output/build/example-mod-undefined/. modules_install
  INSTALL /home/thomas/projets/buildroot/output/build/example-mod-undefined/./mymod.ko
  DEPMOD  4.5.0