# Out-of-tree build for the IEC listener kernel module.
# Build ON the Pi (or cross-compile) against the running kernel's headers:
#     sudo apt install raspberrypi-kernel-headers
#     make            # builds iec_listener.ko
#     sudo make load  # insmod + show /dev/iec0
#     sudo make unload
#
# See docs/kernel-notes.md for headers/pinning details.

MODULE_NAME := iec_listener
obj-m       += $(MODULE_NAME).o

# iec_listener.o is built from iec_listener.c; the other headers are includes.
KDIR ?= /lib/modules/$(shell uname -r)/build
PWD  := $(shell pwd)

# overlay
DTS := dts/iec-overlay.dts
DTBO := dts/iec-overlay.dtbo

.PHONY: all clean load unload overlay install docker-build docker-clean

all:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

# Cross-build in an emulated arm64 container (for compiling off the Pi).
# Override e.g. KERNEL_VERSION=... HEADERS_PKG=... ; see build-in-docker.sh.
docker-build:
	./build-in-docker.sh

docker-clean:
	./build-in-docker.sh clean

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean
	rm -f $(DTBO)

# Compile the device-tree overlay (pin reservation / pulls).
overlay: $(DTBO)
$(DTBO): $(DTS)
	dtc -@ -I dts -O dtb -o $@ $<

load: all
	sudo insmod $(MODULE_NAME).ko $(if $(ADDRESS),address=$(ADDRESS),)
	@echo "loaded; device:" && ls -l /dev/iec0

unload:
	sudo rmmod $(MODULE_NAME)

install: all
	$(MAKE) -C $(KDIR) M=$(PWD) modules_install
	sudo depmod -a
