diff --git a/driver/Makefile b/driver/Makefile index 765bb8b..3b2b127 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -1,31 +1,31 @@ NAME = counter +OBJS = init.o leds.o ls7366r.o trigger.o io.o +KDIR := /lib/modules/$(shell uname -r)/build +DTC_FLAGS := -@ -I dts -O dtb + obj-m += $(NAME).o -$(NAME)-objs := init.o leds.o ls7366r.o trigger.o +$(NAME)-objs := $(OBJS) all: $(NAME).ko $(NAME).dtbo echo Builded Device Tree Overlay and kernel module -$(NAME).ko: init.c leds.c ls7366r.c trigger.c - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules +$(NAME).ko: + make -C $(KDIR) M=$(PWD) modules $(NAME).dtbo: $(NAME).dts - dtc -@ -I dts -O dtb -o $@ $< + dtc $(DTC_FLAGS) -o $@ $< clean: - make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean + make -C $(KDIR) M=$(PWD) clean rm -rf $(NAME).dtbo load: - sudo dtoverlay -d . $(NAME).dtbo - @echo "Overlay loaded" - sudo insmod ./$(NAME).ko - @echo "LKM loaded" + sudo dtoverlay -d . $(NAME).dtbo && echo "Overlay loaded" + sudo insmod ./$(NAME).ko && echo "LKM loaded" unload: - sudo rmmod ./$(NAME).ko - @echo "LKM unloaded" - sudo dtoverlay -R $(NAME) - @echo "Overlay unloaded" + sudo rmmod ./$(NAME).ko && echo "LKM unloaded" + sudo dtoverlay -R $(NAME) && echo "Overlay unloaded" list: sudo dtoverlay -l diff --git a/driver/counter_io_calls.h b/driver/counter_io_calls.h new file mode 100644 index 0000000..9cc7708 --- /dev/null +++ b/driver/counter_io_calls.h @@ -0,0 +1,19 @@ +#ifndef _COUNTER_IO_CALLS_H_ +#define _COUNTER_IO_CALLS_H_ + +#ifndef __KERNEL__ +#include +#define u64 uint64_t +#define u32 uint32_t +#endif + +struct observation { + u64 ts_sec; + u64 ts_nsec; + u32 value; +}; + + + + +#endif /* _COUNTER_IO_CALLS_H_ */ diff --git a/driver/init.c b/driver/init.c index be03f7b..923b69a 100644 --- a/driver/init.c +++ b/driver/init.c @@ -6,6 +6,8 @@ #include "ls7366r.h" #include "trigger.h" #include "leds.h" +#include "io.h" + MODULE_LICENSE("GPL"); MODULE_AUTHOR("Wolfgang Hottgenroth"); @@ -15,6 +17,12 @@ MODULE_DESCRIPTION("Driver for the MainsCnt measurement hat"); /* module loading and unloading */ static int __init my_init(void) { + printk("counter - Loading IO subsystem...\n"); + if (io_init()) { + printk("counter - Error! Could not load IO subsystem\n"); + return -1; + } + printk("counter - Loading the leds driver...\n"); if(platform_driver_register(&leds_driver)) { printk("counter - Error! Could not load leds driver\n"); @@ -45,6 +53,9 @@ static void __exit my_exit(void) { printk("counter - Unloading the interrupt driver...\n"); platform_driver_unregister(&interrupt_driver); + + printk("counter - Unloading IO subsystem...\n"); + io_exit(); } module_init(my_init); diff --git a/driver/io.c b/driver/io.c new file mode 100644 index 0000000..0b3ea90 --- /dev/null +++ b/driver/io.c @@ -0,0 +1,12 @@ +#include +#include + +#include "io.h" + +int io_init(void) { + return 0; +} + +void io_exit(void) { +} + diff --git a/driver/io.h b/driver/io.h new file mode 100644 index 0000000..97da6bf --- /dev/null +++ b/driver/io.h @@ -0,0 +1,8 @@ +#ifndef _IO_H_ +#define _IO_H_ + + +int io_init(void); +void io_exit(void); + +#endif /* _IO_H_ */ diff --git a/driver/leds.c b/driver/leds.c index 17bfe43..9428e8a 100644 --- a/driver/leds.c +++ b/driver/leds.c @@ -6,6 +6,8 @@ #include #include +#include "leds.h" + /* leds stuff */ static int dt_leds_probe(struct platform_device *pdev); @@ -72,3 +74,26 @@ static void dt_leds_remove(struct platform_device *pdev) { gpiod_put(red_led); gpiod_put(blue_led); } + +void led_ctrl(enum led_color_e color, enum led_state_e state) { + struct gpio_desc *led; + switch (color) { + case e_RED: + led = red_led; + break; + case e_BLUE: + led = blue_led; + break; + } + int st; + switch (state) { + case e_ON: + st = 1; + break; + case e_OFF: + st = 0; + break; + } + gpiod_set_value(led, st); +} + diff --git a/driver/leds.h b/driver/leds.h index 56f0af9..c3dc3db 100644 --- a/driver/leds.h +++ b/driver/leds.h @@ -5,4 +5,9 @@ extern struct platform_driver leds_driver; +enum led_color_e { e_RED, e_BLUE }; +enum led_state_e { e_ON, e_OFF }; + +void led_ctrl(enum led_color_e color, enum led_state_e state); + #endif /* _LEDS_H_ */ diff --git a/driver/trigger.c b/driver/trigger.c index a9c82d4..092fd00 100644 --- a/driver/trigger.c +++ b/driver/trigger.c @@ -12,6 +12,7 @@ #include #include "ls7366r.h" +#include "leds.h" @@ -65,12 +66,9 @@ static void counter_worker(struct work_struct *work) { if (data->last_value) { u32 period = counter_value - data->last_value; - struct timespec64 duration = timespec64_sub(data->current_timestamp, data->last_timestamp); - printk("counter %lld.%09lu %lld.%09lu %u\n", + printk("counter %lld.%09lu %u\n", (s64)((data->current_timestamp).tv_sec), ((data->current_timestamp).tv_nsec), - (s64)duration.tv_sec, - duration.tv_nsec, period);