From 924087f4e1a7ae13f847d598b35baff0c8a39af9 Mon Sep 17 00:00:00 2001 From: rick Date: Fri, 27 Jan 2023 17:59:44 +0100 Subject: [PATCH] add task 5 --- README.md | 55 +++++++++++++++++++++++++++++++++++++++--- task_5/Makefile | 10 ++++++++ task_5/my-usb-detect.c | 44 +++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 task_5/Makefile create mode 100644 task_5/my-usb-detect.c diff --git a/README.md b/README.md index fae4b88..654140f 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,6 @@ distributions basées Debian). Il suffit ensuite d'aller dans le dossier de votre choix et faire `make`. -## Ressources - - * [The Linux Kernel Module Programming Guide](https://sysprog21.github.io/lkmpg) - ## Réponses L'Eudyptula challenge demande souvent des preuves de notre réussite. Vous @@ -39,6 +35,8 @@ commande `dmesg`. [102108.046104] Tschuss !!! ``` + * [The Linux Kernel Module Programming Guide](https://sysprog21.github.io/lkmpg) + ### Tache 2 J'utilise Gentoo et configure puis compile moi-même mon kernel. Je passe cette @@ -82,3 +80,52 @@ Je n'ai pas mit les fichiers corrigés. Il suffit d'utiliser la commande `indent` pour pouvoir bien indenter le code dans un premier temps. Il faut ensuite utiliser le script `scripts/checkpatch.pl` sur les fichiers pour trouver les derniers soucis. + + * [Les conventions de code (Documentation Kernel)](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/process/coding-style.rst) + +### Tache 5 + +Il faut dans un premier temps générer l'alias du module. Cela va permettre de +lier les périphériques disponibles pour le module avec. + +2 façons: + + * `depmod $(uname -r) $(pwd)/task_5/my-usb-detect.ko` en étant à la racine du + dépôt git. **Cela va cependant réécrire le fichier + `/lib/modules/$(uname -r)/modules.alias`, ce qui peut casser votre + installation Linux.** Faites un backup de votre dossier avant. + * `cp task_5/my-usb-detect.ko /lib/modules/$(uname -r)/ && depmod -A` + +La deuxième méthode est la plus recommandée. Je l'ai trouvé après avoir écrit +le module sans réussir à le charger. Le blog de Nihaal explique de manière +détaillée le fonctionnement des modules et de la détection de périphériques. + +``` +# on branche le clavier +[ 6712.426017 ] usb 2-3: new full-speed USB device number 4 using xhci_hcd +[ 6712.569813 ] usb 2-3: New USB device found, idVendor=046d, idProduct=c52b, bcdDevice=24.01 +[ 6712.569826 ] usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=0 +[ 6712.569830 ] usb 2-3: Product: USB Receiver +[ 6712.569833 ] usb 2-3: Manufacturer: Logitech +[ 6712.575345 ] input: Logitech USB Receiver as /devices/pci0000:00/0000:00:14.0/usb2/2-3/2-3:1.0/0003:046D:C52B.0007/input/input32 +[ 6712.629923 ] hid-generic 0003:046D:C52B.0007: input,hidraw0: USB HID v1.11 Keyboard [Logitech USB Receiver] on usb-0000:00:14.0-3/input0 +[ 6712.634279 ] input: Logitech USB Receiver Mouse as /devices/pci0000:00/0000:00:14.0/usb2/2-3/2-3:1.1/0003:046D:C52B.0008/input/input33 +[ 6712.634743 ] input: Logitech USB Receiver Consumer Control as /devices/pci0000:00/0000:00:14.0/usb2/2-3/2-3:1.1/0003:046D:C52B.0008/input/input34 +[ 6712.689561 ] input: Logitech USB Receiver System Control as /devices/pci0000:00/0000:00:14.0/usb2/2-3/2-3:1.1/0003:046D:C52B.0008/input/input35 +[ 6712.689844 ] hid-generic 0003:046D:C52B.0008: input,hiddev96,hidraw1: USB HID v1.11 Mouse [Logitech USB Receiver] on usb-0000:00:14.0-3/input1 +[ 6712.693283 ] hid-generic 0003:046D:C52B.0009: hiddev97,hidraw2: USB HID v1.11 Device [Logitech USB Receiver] on usb-0000:00:14.0-3/input2 +# notre module s'est chargé tout seul !! +[ 6713.143767 ] Coucou le gens !!!! +[ 6713.259818 ] elogind-daemon[3774]: Watching system buttons on /dev/input/event18 (Logitech USB Receiver Consumer Control) +[ 6713.260009 ] elogind-daemon[3774]: Watching system buttons on /dev/input/event19 (Logitech USB Receiver System Control) +[ 6713.663077 ] elogind-daemon[3774]: Watching system buttons on /dev/input/event16 (Logitech USB Receiver) +# le clavier est débranché et notre module n'est pas déchargé. +[ 6716.982578 ] usb 2-3: USB disconnect, device number 4 +``` + +Il faut le décharger à la main avec `rmmod`. + + * [Writing USB Device Drivers (Documentation Kernel)](https://www.kernel.org/doc/html/latest/driver-api/usb/writing_usb_driver.html) + * [USB hotplugging/USB Modutils Support (Documentation Kernel)](https://www.kernel.org/doc/html/latest/driver-api/usb/hotplug.html#usb-modutils-support) + * [usb-skeleton.c (Code Kernel)](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/usb/usb-skeleton.c) + * [Nihaal - Eudyptula Challenge Task 5](https://nihaal.me/post/ec5/) diff --git a/task_5/Makefile b/task_5/Makefile new file mode 100644 index 0000000..390f666 --- /dev/null +++ b/task_5/Makefile @@ -0,0 +1,10 @@ +#CFLAGS_my-usb-detect2.o = -DDEBUG +obj-m += my-usb-detect.o + +PWD := $(CURDIR) + +all: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules + +clean: + make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean diff --git a/task_5/my-usb-detect.c b/task_5/my-usb-detect.c new file mode 100644 index 0000000..f582420 --- /dev/null +++ b/task_5/my-usb-detect.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include +#include +#include + +/* On défini quels périphériques usb notre driver va pouvoir utiliser. */ +static const struct usb_device_id mydriver_id_table[] = { + /* ici pour un périphérique en particulier (VendorID:ProductID) */ + {USB_DEVICE(0x03eb, 0x2042)}, + /* Pour définir une classe d'interface usb. n'existe que pour les claviers et + * les souris ? + * cf. include/linux/usb.h:1039 et include/linux/uapi/linux/hid.h:{35,41,42} + */ + {USB_INTERFACE_INFO + (USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT, + USB_INTERFACE_PROTOCOL_KEYBOARD)}, + /* indique la fin de la liste */ + {} +}; + +/* exporte dans le userspace la table des périphériques supportés. Cela permet + * de lier le périphérique avec le driver. + */ +MODULE_DEVICE_TABLE(usb, mydriver_id_table); + +static int __init my_init(void) +{ + pr_info("Coucou le gens !!!!\n"); + return 0; +} + +static void __exit my_exit(void) +{ + pr_info("Tschuss !!!\n"); +} + +module_init(my_init); +module_exit(my_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("rick "); +MODULE_DESCRIPTION("Module chargé lorsqu'un un clavier est branché.");