#include #include #include // gpiochip0: GPIOs 512-565, parent: platform/3f200000.gpio, pinctrl-bcm2835 // From /sys/kernel/debug/gpio #define RPI3_BCM2835_GPIO_OFFSET 512 #define BCM_TO_LINUX_GPIO(bcm) (RPI3_BCM2835_GPIO_OFFSET + (bcm)) static int gpio_pin = -1; module_param(gpio_pin, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); MODULE_PARM_DESC(gpio_pin, "BCM GPIO pin number (e.g., 17)"); struct gpio_pin_rpi3 { int linux_gpio; int bcm_gpio; struct gpio_desc *desc; }; static struct gpio_pin_rpi3 pin; static int __init gpio_pin_rpi3_init(void) { if (gpio_pin < 0) { pr_err("gpio_pin_rpi3: You must specify 'gpio_pin' (e.g., gpio_pin=17)\n"); return -EINVAL; } pin.bcm_gpio = gpio_pin; pin.linux_gpio = BCM_TO_LINUX_GPIO(pin.bcm_gpio); // Récupération du descripteur GPIO à partir du numéro Globale Linux pin.desc = gpio_to_desc(pin.linux_gpio); if (!pin.desc) { pr_err("gpio_pin_rpi3: Le GPIO %d (BCM %d) non trouvé\n", pin.linux_gpio, pin.bcm_gpio); return -ENODEV; } // Réclame le PIN GPIO if (gpiod_direction_output(pin.desc, 0)) { pr_err("gpio_pin_rpi3: Impossible de configurer le GPIO %d\n", pin.linux_gpio); gpiod_put(pin.desc); return -EINVAL; } // Allume la LED gpiod_set_value(pin.desc, 1); pr_info("gpio_pin_rpi3: GPIO %d (BCM %d) activé (LED ON)\n", pin.linux_gpio, pin.bcm_gpio); return 0; } static void __exit gpio_pin_rpi3_exit(void) { // Turn LED off and release GPIO gpiod_set_value(pin.desc, 0); gpiod_put(pin.desc); pr_info("gpio_pin_rpi3: GPIO %d (BCM %d) libéré (LED OFF)\n", pin.linux_gpio, pin.bcm_gpio); } module_init(gpio_pin_rpi3_init); module_exit(gpio_pin_rpi3_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Florian RICHER "); MODULE_DESCRIPTION("Un module noyau pour utiliser un PIN GPIO d'une RPI"); MODULE_VERSION("1.0");