1
0

feat(lab02): add code for ex08

This commit is contained in:
2026-04-01 17:21:01 +02:00
parent 59b7caf82e
commit 906954a035
2 changed files with 137 additions and 18 deletions

View File

@@ -0,0 +1,83 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include "linux/printk.h"
#define SWITCH_K1 0
#define SWITCH_K2 2
#define SWITCH_K3 3
struct gpio_nanopi {
int pin;
char* name;
};
static struct gpio_nanopi switchK1 = {0, "K1: GPIOA.0"};
static struct gpio_nanopi switchK2 = {0, "K2: GPIOA.2"};
static struct gpio_nanopi switchK3 = {0, "K3: GPIOA.3"};
irqreturn_t isrGPIO(int irq, void* gpio_struct) {
struct gpio_nanopi *gpio = (struct gpio_nanopi *)gpio_struct;
pr_info("GPIO pressed: %s\n", gpio->name);
return IRQ_HANDLED;
}
void interrupt_init(void) {
pr_info("Initializing interrupts\n");
int status = 0;
// Switch k1
if (gpio_request(SWITCH_K1, switchK1.name) == 0) {
status = request_irq(
gpio_to_irq(SWITCH_K1),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK1.name,
&switchK1
);
}
// Switch k2
if (gpio_request(SWITCH_K2, switchK2.name) == 0) {
status = request_irq(
gpio_to_irq(SWITCH_K2),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK2.name,
&switchK2
);
}
// Switch k3
if (gpio_request(SWITCH_K3, switchK3.name) == 0) {
status = request_irq(
gpio_to_irq(SWITCH_K3),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK3.name,
&switchK3
);
}
pr_info("Interrupt initialized\n");
}
void interrupt_exit(void) {
pr_info("Exiting interrupts\n");
gpio_free(SWITCH_K1);
free_irq(gpio_to_irq(SWITCH_K1), &switchK1);
gpio_free(SWITCH_K2);
free_irq(gpio_to_irq(SWITCH_K2), &switchK2);
gpio_free(SWITCH_K3);
free_irq(gpio_to_irq(SWITCH_K3), &switchK3);
pr_info ("Interrupt exited\n");
}

View File

@@ -3,69 +3,105 @@
#include <linux/init.h> // needed for macros #include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging #include <linux/kernel.h> // needed for debugging
#include "linux/printk.h"
#include "s02e02-parameters.c" #include "s02e02-parameters.c"
// #define PARAMETERS
#include "s02e04-dynamic_allocation.c" #include "s02e04-dynamic_allocation.c"
// #define DYNAMIC_ALLOCATION
#include "s02e05-io_memory_mapped.c" #include "s02e05-io_memory_mapped.c"
// #define IO_MEMORY_MAPPED
#include "s02e06-thread.c" #include "s02e06-thread.c"
// #define THREAD
#include "s02e07-sleeping.c" #include "s02e07-sleeping.c"
// #define SLEEPING
#include "s02e08-interrupt.c"
#define INTERRUPT
static int __init skeleton_init(void) { static int __init skeleton_init(void) {
pr_info("Linux module skeleton ex05 loading...\n"); pr_info("Linux module skeleton ex05 loading...\n");
pr_info("--------------------\n");
// Lab02 - Exercise 2: Parameters // Lab02 - Exercise 2: Parameters
// parameters_print(); #ifdef PARAMETERS
pr_info("--------------------\n"); pr_info("--------------------\n");
parameters_print();
#endif
// Lab02 - Exercise 4: Dynamic memory allocation and linked list // Lab02 - Exercise 4: Dynamic memory allocation and linked list
// dynAlloc_init(); #ifdef DYNAMIC_ALLOCATION
pr_info("--------------------\n"); pr_info("--------------------\n");
Alloc_init();
#endif
// Lab02 - Exercise 5: Memory-mapped I/O // Lab02 - Exercise 5: Memory-mapped I/O
// ioMemoryMapped_init(); #ifdef IO_MEMORY_MAPPED
pr_info("--------------------\n"); pr_info("--------------------\n");
ioMemoryMapped_init();
#endif
// Lab02 - Exercise 6: Kernel thread // Lab02 - Exercise 6: Kernel thread
// thread_init(); #ifdef THREAD
pr_info("--------------------\n"); pr_info("--------------------\n");
thread_init();
#endif
// Lab02 - Exercise 7: Sleeping // Lab02 - Exercise 7: Sleeping
#ifdef SLEEPING
pr_info("--------------------\n");
sleeping_init(); sleeping_init();
#endif
// Lab02 - Exercise 8: Interrupt
#ifdef INTERRUPT
pr_info("--------------------\n");
interrupt_init();
#endif
pr_info("--------------------\n"); pr_info("--------------------\n");
pr_info("Linux module skeleton loaded\n"); pr_info("Linux module skeleton loaded\n");
return 0; return 0;
} }
static void __exit skeleton_exit(void) { static void __exit skeleton_exit(void) {
pr_info("Linux module skeleton unloading...\n");
// Lab02 - Exercise 4: Dynamic memory allocation and linked list // Lab02 - Exercise 4: Dynamic memory allocation and linked list
// dynAlloc_exit(); #ifdef DYNAMIC_ALLOCATION
pr_info("--------------------\n"); pr_info("--------------------\n");
dynAlloc_exit();
#endif
// Lab02 - Exercise 5: Memory-mapped I/O // Lab02 - Exercise 5: Memory-mapped I/O
// ioMemoryMapped_exit(); #ifdef IO_MEMORY_MAPPED
pr_info("--------------------\n"); pr_info("--------------------\n");
ioMemoryMapped_exit();
#endif
// Lab02 - Exercise 6: Kernel thread // Lab02 - Exercise 6: Kernel thread
// thread_exit(); #ifdef THREAD
pr_info("--------------------\n"); pr_info("--------------------\n");
thread_exit();
#endif
// Lab02 - Exercise 7: Sleeping // Lab02 - Exercise 7: Sleeping
#ifdef SLEEPING
pr_info("--------------------\n");
sleeping_exit(); sleeping_exit();
#endif
// Lab02 - Exercise 8: Interrupt
#ifdef INTERRUPT
pr_info("--------------------\n");
interrupt_exit();
#endif
pr_info("--------------------\n"); pr_info("--------------------\n");
pr_info ("Linux module skeleton unloaded\n"); pr_info ("Linux module skeleton unloaded\n");
} }