My first question on StackExchange.

I have set up a Raspberry Pi 2 with the latest Raspbian (Buster Lite 2019-09-26 Kernel version: 4.19). I want to use a module that was not compiled into this image. Is it possible to compile only that module, using the tools and files available on the Pi itself?

The module I want is this one: https://github.com/raspberrypi/linux/blob/rpi-4.19.y/drivers/auxdisplay/ht16k33.c

It was not included when the image was compiled. The only drivers I have in this section are these:

ls /lib/modules/4.19.75-v7+/kernel/drivers/auxdisplay/
charlcd.ko  hd44780.ko

I have searched for answers, and the only thing that came close was this: How compile a loadable kernel module without recompiling kernel

However it talks about making your own modules, not compiling an existing one. Other discussions talk about building the entire kernel.

Once I have the module I will load it using Device Tree (which I know how to do).

Edit: Thanks to @ingo for the hint, but I haven't got it working yet. I found this article:

I can successfully compile the module, but I get errors due to unknown symbols. My source file was the ht16k33.c code linked from GitHub above and placed in a subdirectory of user pi. The Makefile is as follows, copied from the article:

obj-m := ht16k33.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

Running make is successful:

make -C /lib/modules/4.19.75-v7+/build SUBDIRS=/home/pi/projects/ht16k33 modules
make[1]: Entering directory '/usr/src/linux-headers-4.19.75-v7+'
  CC [M]  /home/pi/projects/ht16k33/ht16k33.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/pi/projects/ht16k33/ht16k33.mod.o
  LD [M]  /home/pi/projects/ht16k33/ht16k33.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.19.75-v7+'

When I try and load the module I get this error:

sudo insmod ht16k33.ko
insmod: ERROR: could not insert module ht16k33.ko: Unknown symbol in module

And the following reported in /var/log/messages:

Jan  7 17:20:23 soap kernel: [99203.981258] ht16k33: loading out-of-tree module taints kernel.
Jan  7 17:20:23 soap kernel: [99203.981943] ht16k33: Unknown symbol matrix_keypad_build_keymap (err -2)
Jan  7 17:20:23 soap kernel: [99203.982082] ht16k33: Unknown symbol fb_sys_write (err -2)
Jan  7 17:20:23 soap kernel: [99203.982142] ht16k33: Unknown symbol sys_imageblit (err -2)
Jan  7 17:20:23 soap kernel: [99203.982214] ht16k33: Unknown symbol sys_fillrect (err -2)
Jan  7 17:20:23 soap kernel: [99203.982300] ht16k33: Unknown symbol matrix_keypad_parse_properties (err -2)
Jan  7 17:20:23 soap kernel: [99203.982380] ht16k33: Unknown symbol sys_copyarea (err -2)
Jan  7 17:20:23 soap kernel: [99203.982460] ht16k33: Unknown symbol fb_sys_read (err -2)

Edit: Further reading and experimentation led me to this course of action:

  • Copy the ht16k33.ko file produced to /lib/modules/4.19.75-v7+/extra
  • sudo depmod
  • modprobe ht16k33
tail /var/log/messages

Jan  7 19:30:51 soap kernel: [107031.622336] input: ht16k33-keypad as /devices/platform/soc/3f804000.i2c/i2c-1/1-0070/input/input0

I think I'm done. Thanks.

If I've done it wrong then I'd be happy to tidy up this explanation.

  • This is not a question specific to Raspberry Pi. I have just asked google for debian compile kernel module and got 794.000 results. Just the first match seems already to be a good tutorial but also have a look at other links.
    – Ingo
    Commented Jan 6, 2020 at 21:51
  • Thank you. I have edited the post to talk about progress I made. I will look at the next set of errors and try to continue. In the meantime I'd be happy to receive any more hints from anyone. I feel there should be simple instructions for doing this specifically on Raspbian.
    – ame
    Commented Jan 7, 2020 at 4:43


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.