add task 5

This commit is contained in:
rick 2023-01-27 17:59:44 +01:00
parent 7730081dfb
commit 924087f4e1
Signed by: Rick
GPG key ID: 4A6223D66294EB20
3 changed files with 105 additions and 4 deletions

View file

@ -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/)

10
task_5/Makefile Normal file
View file

@ -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

44
task_5/my-usb-detect.c Normal file
View file

@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/hid.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/usb.h>
/* 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 <rick@gnous.eu>");
MODULE_DESCRIPTION("Module chargé lorsqu'un un clavier est branché.");