Examples on how to build various modules - notro/rpi-source GitHub Wiki

Examples on how to build various modules

When adding a section to this page, please add to the TOC as well.
Everyone with a Github account can edit this page.

Hello World example

Classic Hello World example for a loadable kernel module (LKM).

mkdir hello && cd hello

Makefile

obj-m := hello.o

hello.c

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

int hello_init(void)
{
	pr_alert("Hello World :)\n");
	return 0;
}
void hello_exit(void)
{
	pr_alert("Goodbye World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
$ sudo insmod hello.ko
$ dmesg | tail -1
[58728.008906] Hello World :)
$ sudo rmmod hello
$ dmesg | tail -1
[58732.440677] Goodbye World!

# Install module (/lib/modules/<ver>/extra/hello.ko)
$ sudo make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install
$ sudo depmod
$ sudo modprobe hello

spi-config

spi board configuration without having to recompile the kernel
README

$ uname -a
Linux raspberrypi 3.12.18+ #679 PREEMPT Thu May 1 14:40:27 BST 2014 armv6l GNU/Linux

$ git clone https://github.com/msperl/spi-config
$ cd spi-config
$ make
$ sudo make install
$ sudo depmod

ENC28J60 SPI Ethernet driver

Forum post: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=18397

spi-config can be used to add SPI device

$ uname -a
Linux raspberrypi 3.12.18+ #679 PREEMPT Thu May 1 14:40:27 BST 2014 armv6l GNU/Linux

$ cd linux

# Enable ENC28J60:
# Device Drivers -> Network device support -> Ethernet driver support -> Microchip devices -> <M> ENC28J60 support
$ make menuconfig

# show config diff
$ scripts/diffconfig
 ENC28J60 n -> m
+ENC28J60_WRITEVERIFY n

# prepare for build (always after config change)
$ make prepare

# build
$ make SUBDIRS=drivers/net/ethernet/microchip modules

# install
$ sudo make SUBDIRS=drivers/net/ethernet/microchip modules_install
# this is needed even if the previous command runs depmod (don't know why)
$ sudo depmod

# load
$ sudo modprobe enc28j60
$ lsmod
Module                  Size  Used by
enc28j60               17844  0

Microchip MCP251x SPI CAN controller

spi-config can be used to add SPI device

$ uname -a
Linux raspberrypi 3.12.18+ #679 PREEMPT Thu May 1 14:40:27 BST 2014 armv6l GNU/Linux

$ cd linux

# Networking support -> <M> CAN bus subsystem support
#     CAN Device Drivers -> <M> Microchip MCP251x SPI CAN controllers
$ make menuconfig

$ scripts/diffconfig
 CAN n -> m
+CAN_8DEV_USB n
+CAN_AT91 n
+CAN_BCM m
+CAN_CALC_BITTIMING y
+CAN_CC770 n
+CAN_C_CAN n
+CAN_DEBUG_DEVICES n
+CAN_DEV m
+CAN_EMS_USB n
+CAN_ESD_USB2 n
+CAN_GW m
+CAN_KVASER_USB n
+CAN_LEDS n
+CAN_MCP251X m
+CAN_PEAK_USB n
+CAN_RAW m
+CAN_SJA1000 n
+CAN_SLCAN n
+CAN_SOFTING n
+CAN_VCAN n
+NET_EMATCH_CANID n

# prepare for build (always after config change)
$ make prepare

# build
$ make SUBDIRS=net/can modules
  CC [M]  net/can/bcm.o
  CC [M]  net/can/gw.o
  CC [M]  net/can/raw.o
  CC [M]  net/can/af_can.o
  CC [M]  net/can/proc.o
  LD [M]  net/can/can.o
  LD [M]  net/can/can-raw.o
  LD [M]  net/can/can-bcm.o
  LD [M]  net/can/can-gw.o
  Building modules, stage 2.
  MODPOST 4 modules
  CC      net/can/can-bcm.mod.o
  LD [M]  net/can/can-bcm.ko
  CC      net/can/can-gw.mod.o
  LD [M]  net/can/can-gw.ko
  CC      net/can/can-raw.mod.o
  LD [M]  net/can/can-raw.ko
  CC      net/can/can.mod.o
  LD [M]  net/can/can.ko

$ make SUBDIRS=drivers/net/can modules
  CC [M]  drivers/net/can/dev.o
  LD [M]  drivers/net/can/can-dev.o
  CC [M]  drivers/net/can/mcp251x.o
  Building modules, stage 2.
  MODPOST 2 modules
  CC      drivers/net/can/can-dev.mod.o
  LD [M]  drivers/net/can/can-dev.ko
  CC      drivers/net/can/mcp251x.mod.o
  LD [M]  drivers/net/can/mcp251x.ko

# install
$ sudo make SUBDIRS=net/can modules_install
$ sudo make SUBDIRS=drivers/net/can modules_install
$ sudo depmod

# load
$ sudo modprobe mcp251x
$ dmesg | tail
[16352.509840] CAN device driver interface
$ lsmod
Module                  Size  Used by
mcp251x                 9589  0
can_dev                 9774  1 mcp251x

Use spi-config to add device

sudo modprobe spi-config devices=bus=0:cs=0:modalias=mcp2515:speed=10000000:gpioirq=25:pd=20:pdu32-0=16000000:pdu32-4=0x2002

Links:

mcp2515a

New implementation of the mcp251x driver with low latency/low IRQ in mind making use of asyncronous SPI

First install the CAN subsystem modules mentioned in the previous example.

$ uname -a
Linux raspberrypi 3.12.18+ #680 PREEMPT Sat May 3 19:29:46 BST 2014 armv6l GNU/Linux

$ cd
$ git clone https://github.com/msperl/mcp2515a.git
$ cd mcp2515a

Remove enc28j60.o from the Makefile

KBUILD_EXTRA_SYMBOLS is needed to make the can_dev symbols available (6.3 Symbols From Another External Module).

$ make XTRA="KBUILD_EXTRA_SYMBOLS=~/linux/drivers/net/can/Module.symvers"
make -C /lib/modules/3.12.18+/build KBUILD_EXTRA_SYMBOLS=~/linux/drivers/net/can/Module.symvers M=/home/pi/mcp2515a modules
make[1]: Entering directory `/home/pi/linux-b09a27249d61475e4423607f7632a5aa6e7b3a53'
  CC [M]  /home/pi/mcp2515a/mcp2515a.o
/home/pi/mcp2515a/mcp2515a.c: In function âmcp2515a_free_transfersâ:
/home/pi/mcp2515a/mcp2515a.c:463:6: warning: unused variable âiâ [-Wunused-variable]
/home/pi/mcp2515a/mcp2515a.c: At top level:
/home/pi/mcp2515a/mcp2515a.c:72:13: warning: âset_lowâ defined but not used [-Wunused-function]
/home/pi/mcp2515a/mcp2515a.c:79:13: warning: âset_highâ defined but not used [-Wunused-function]
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/pi/mcp2515a/mcp2515a.mod.o
  LD [M]  /home/pi/mcp2515a/mcp2515a.ko
make[1]: Leaving directory `/home/pi/linux-b09a27249d61475e4423607f7632a5aa6e7b3a53'

$ sudo make XTRA="KBUILD_EXTRA_SYMBOLS=~/linux/drivers/net/can/Module.symvers" install
make -C /lib/modules/3.12.18+/build KBUILD_EXTRA_SYMBOLS=~/linux/drivers/net/can/Module.symvers M=/home/pi/mcp2515a modules modules_install
make[1]: Entering directory `/home/pi/linux-b09a27249d61475e4423607f7632a5aa6e7b3a53'
  LD      /home/pi/mcp2515a/built-in.o
  Building modules, stage 2.
  MODPOST 1 modules
  INSTALL /home/pi/mcp2515a/mcp2515a.ko
  DEPMOD  3.12.18+
make[1]: Leaving directory `/home/pi/linux-b09a27249d61475e4423607f7632a5aa6e7b3a53'
sync

$ sudo depmod
$ sudo modprobe mcp2515a
$ lsmod
Module                  Size  Used by
mcp2515a               12523  0
can_dev                 9927  1 mcp2515a

PCF8574

$ uname -a
Linux raspberrypi 3.12.18+ #679 PREEMPT Thu May 1 14:40:27 BST 2014 armv6l GNU/Linux

$ cd linux

# Enable PCF857x:
# Device Drivers -> -*- GPIO Support -> <M> PCF857x, PCA{85,96}7x, and MAX732[89] I2C GPIO expanders
$ make menuconfig
$ make prepare

# build
$ make SUBDIRS=drivers/gpio modules
  CC [M]  drivers/gpio/gpio-pcf857x.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      drivers/gpio/gpio-pcf857x.mod.o
  LD [M]  drivers/gpio/gpio-pcf857x.ko

# install
$ sudo make SUBDIRS=drivers/gpio modules_install
  INSTALL drivers/gpio/gpio-pcf857x.ko
  DEPMOD  3.12.18+
$ sudo depmod

# load driver
$ sudo modprobe i2c-bcm2708
$ sudo modprobe i2c-dev
$ sudo modprobe gpio-pcf857x
$ echo pcf8574 0x39 | sudo tee /sys/bus/i2c/devices/i2c-1/new_device

# Output added by mikroskeem
$ dmesg | tail
[  703.075077] pcf857x 1-0038: probed
[  703.080759] i2c i2c-1: new_device: Instantiated device pcf8574 at 0x38

TP-Link TL-WN725N version 2 lwfinger

Ref: http://tech.enekochan.com/2014/03/08/new-script-to-compile-tp-link-tl-wn725n-version-2-lwfinger-driver-in-raspbian/

$ uname -a
Linux raspberrypi 3.12.21+ #1 PREEMPT Sat Jun 14 13:44:18 CEST 2014 armv6l GNU/Linux

$ git clone https://github.com/lwfinger/rtl8188eu.git
$ cd rtl8188eu

$ make all

$ sudo make install

$ sudo depmod

$ sudo modprobe 8188eu

$ lsmod
Module                  Size  Used by
8188eu                796381  0

⚠️ **GitHub.com Fallback** ⚠️