From edc26eca45203af812bf516c501458e20c1acaf2 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Sat, 10 May 2025 09:30:07 +0200 Subject: [PATCH] GPIO code --- demo_module.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/demo_module.c b/demo_module.c index e43ae92..85598ab 100644 --- a/demo_module.c +++ b/demo_module.c @@ -1,6 +1,11 @@ -#include -#include +#include #include +#include +#include + +/* + * Last compiled with Linux 6.14.5-300.fc42.x86_64 + */ /* Meta Info */ MODULE_DESCRIPTION("Demo kernel module."); @@ -8,19 +13,61 @@ MODULE_VERSION("0.0.1"); MODULE_AUTHOR("Imbus"); MODULE_LICENSE("GPL"); +/* + * Hard coded for RPI3 + * Usually retrieved via device tree + */ +#define IO_LED 21 +#define IO_BUTTON 20 +#define IO_OFFSET 0 + +static struct gpio_desc *led, *button; + /** * @brief Called on load */ static int __init demo_mod_init(void) { - printk(KERN_INFO "Demo module loaded successfully..."); - return 0; + printk(KERN_INFO "Demo module loaded successfully..."); + + int status; + + led = gpio_to_desc(IO_LED + IO_OFFSET); + if (!led) { + printk("gpioctrl - Error getting pin 21\n"); + return -ENODEV; + } + + button = gpio_to_desc(IO_BUTTON + IO_OFFSET); + if (!button) { + printk("gpioctrl - Error getting pin 20\n"); + return -ENODEV; + } + + status = gpiod_direction_output(led, 0); + if (status) { + printk("gpioctrl - Error setting pin 20 to output\n"); + return status; + } + + status = gpiod_direction_input(button); + if (status) { + printk("gpioctrl - Error setting pin 21 to input\n"); + return status; + } + + gpiod_set_value(led, 1); + + printk("gpioctrl - Button is %spressed\n", + gpiod_get_value(button) ? " " : "not "); + + return 0; } /** * @brief Called on unload */ static void __exit demo_mod_exit(void) { - printk(KERN_INFO "Demo module unloaded successfully..."); + printk(KERN_INFO "Demo module unloaded successfully..."); } module_init(demo_mod_init);