Compare commits

..

No commits in common. "04de922e609a2817d93eb2da92f818deb57d603c" and "944299048fc0ffa7368b125e561feee95f9f76c7" have entirely different histories.

3 changed files with 8 additions and 108 deletions

View file

@ -3,13 +3,8 @@
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/module.h> #include <linux/module.h>
static void virtual_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) { static void virtual_led_set_brightness(struct led_classdev *led_cdev, enum led_brightness brightness) {
pr_info("Luminosité défini sur la LED %s à %d\n", led_cdev->name, brightness); pr_info("Luminosité défini sur la LED %s à %d", led_cdev->name, brightness);
}
static enum led_brightness virtual_led_brightness_get(struct led_classdev *led_cdev) {
pr_info("Luminosité lu sur la LED %s, valeur actuelle: %d\n", led_cdev->name, led_cdev->brightness);
return led_cdev->brightness;
} }
static struct led_classdev virtual_led = { static struct led_classdev virtual_led = {
@ -17,28 +12,27 @@ static struct led_classdev virtual_led = {
.color = LED_COLOR_ID_WHITE, .color = LED_COLOR_ID_WHITE,
.brightness = 0, .brightness = 0,
.max_brightness = 255, .max_brightness = 255,
.brightness_set = virtual_led_brightness_set, .brightness_set = virtual_led_set_brightness
.brightness_set = virtual_led_brightness_get
}; };
static int __init virtual_led_init(void) { static int __init virtual_led_init(void) {
int ret; int ret;
pr_info("Chargement du module pour la LED virtuelle\n"); pr_info("Chargement du module pour la LED virtuelle");
ret = led_classdev_register(NULL, &virtual_led); ret = led_classdev_register(NULL, &virtual_led);
if (ret < 0) { if (ret < 0) {
pr_err("Impossible d'ajouter la LED virtuelle\n"); pr_err("Impossible d'ajouter la LED virtuelle");
return ret; return ret;
} }
pr_info("La LED virtuelle est ajouté\n"); pr_info("La LED virtuelle est ajouté");
return 0; return 0;
} }
static void __exit virtual_led_exit(void) { static void __exit virtual_led_exit(void) {
pr_info("Déchargement du module pour la LED virtuelle\n"); pr_info("Déchargement du module pour la LED virtuelle");
led_classdev_unregister(&virtual_led); led_classdev_unregister(&virtual_led);
pr_info("La LED virtuelle est bien retiré\n"); pr_info("La LED virtuelle est bien retiré");
} }
module_init(virtual_led_init); module_init(virtual_led_init);

View file

@ -1,7 +0,0 @@
obj-m += test_module.o
all:
make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) modules
clean:
make -C $(LINUX_MODULES_FOLDER)/build M=$(PWD) clean

View file

@ -1,87 +0,0 @@
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/leds.h>
#include <linux/module.h>
#define NUM_LEDS 5
struct flo_device {
struct led_classdev *leds[NUM_LEDS];
};
static struct flo_device flo_dev;
static void virtual_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness brightness) {
pr_info("Luminosité défini sur la LED %s à %d\n", led_cdev->name, brightness);
}
static enum led_brightness virtual_led_brightness_get(struct led_classdev *led_cdev) {
pr_info("Luminosité lu sur la LED %s, valeur actuelle: %d\n", led_cdev->name, led_cdev->brightness);
return led_cdev->brightness;
}
static int __init virtual_led_init(void) {
int ret, i;
pr_info("Chargement du module pour les LEDs virtuelles\n");
for (i = 0; i < NUM_LEDS; i++) {
struct led_classdev *led = kzalloc(sizeof(struct led_classdev), GFP_KERNEL);
if (!led) {
pr_err("Échec de l'allocation de mémoire pour la LED %d\n", i);
ret = -ENOMEM;
goto fail;
}
led->name = kasprintf(GFP_KERNEL, "flo-led:white:flo-%d", i + 1);
led->color = LED_COLOR_ID_WHITE;
led->brightness = 0;
led->max_brightness = 255;
led->brightness_set = virtual_led_brightness_set;
led->brightness_get = virtual_led_brightness_get;
ret = led_classdev_register(NULL, led);
if (ret < 0) {
pr_err("Impossible d'ajouter la LED virtuelle %d\n", i);
kfree(led->name);
kfree(led);
goto fail;
}
flo_dev.leds[i] = led;
}
pr_info("Les LEDs virtuelles sont ajoutées\n");
return 0;
fail:
for (i--; i >= 0; i--) {
led_classdev_unregister(flo_dev.leds[i]);
kfree(flo_dev.leds[i]->name);
kfree(flo_dev.leds[i]);
}
pr_err("Les LEDs virtuelles n'ont pas pu être ajoutées\n");
return ret;
}
static void __exit virtual_led_exit(void) {
int i;
pr_info("Déchargement du module pour les LEDs virtuelles\n");
for (i = 0; i < NUM_LEDS; i++) {
if (flo_dev.leds[i]) {
led_classdev_unregister(flo_dev.leds[i]);
kfree(flo_dev.leds[i]->name);
kfree(flo_dev.leds[i]);
}
}
pr_info("Les LEDs virtuelles sont bien retirées\n");
}
module_init(virtual_led_init);
module_exit(virtual_led_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Florian RICHER");
MODULE_DESCRIPTION("Un module noyau qui ajoute des LEDs virtuelles");
MODULE_VERSION("1.0");