add task 5
This commit is contained in:
parent
7730081dfb
commit
924087f4e1
3 changed files with 105 additions and 4 deletions
55
README.md
55
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/)
|
||||
|
|
10
task_5/Makefile
Normal file
10
task_5/Makefile
Normal 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
44
task_5/my-usb-detect.c
Normal 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é.");
|
Loading…
Reference in a new issue