#include #include #include #include /* * Last compiled with Linux 6.14.5-300.fc42.x86_64 */ /* Meta Info */ MODULE_DESCRIPTION("Demo kernel module."); 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..."); 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..."); } module_init(demo_mod_init); module_exit(demo_mod_exit);