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 Jan 6 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 Jan 7 at 4:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.