Scripts-Fu
Gimp Bumpy
Gimp Aquabou
Gimp Plasticlogo

Fond d'écran
Debian (19)
POV-Ray (26)
GNUstep (23)
Enlightenment (8)
Celtique (14)
Autres... (2)

Articles
Gimp (1.2 & 2.x)
Electronique
Prog. & Dével.

Code
PAM t2g
ppdog

Un watchdog sur port parallèle

Les informations qui suivent sont complémentaires des deux articles publiés dans le GNU/Linux Magazine France numéro 67 de Décembre 2004. Pour l'heure vous trouverez ici les éléments logiciels. Les explications et documentations (schémas) suivront par la suite, ainsi qu'une version anglaise.

LE CODE DU MAGAZINE

Le code suivant est celui publié dans les pages du magazine. Il s'agit d'un simple outil permettant de commander la ligne STROBE sur port parallèle. Ce dernier est désigné par le fichier /dev/parportxx est le numéro du port à utiliser. On utilise ici l'interface ppdev permettant aux programmes utilisateur d'accéder au port.

Le code est relativement facile à comprendre (et documenté dans l'article) : ppwatchdog.c

Il se compile en utilisant la ligne suivante :

gcc -O2 -Wall -o ppwatchdog ppwatchdog.c

Ce n'est vraiment pas compliqué. Pour l'utilisation, c'est pareil, l'option -d prend en argument le chemin vers le /dev qui va bien, -1 et -0 permettent respectivement d'activer et désactiver le watchdog et -t prend en argument un délai en microseconde entre une désactivation et une réactivation.

Cette commande sera placée dans /usr/local/sbin et utilisée par un script d'init spécifique (décrit dans le magazine). Voici le script en question. Il devrait être renommé ppwatchdog et placer dans votre /etc/init.d (distribution Debian). Vous l'installerez avec update-rc.d (distribution Debian aussi).

ATTENTION : Dès le script d'init activé au démarage (ou manuellement en passant l'argument start), le watchdog est activé, il commence à décompter. Vous devez alors, toutes les deux minutes (maximum), faire un reset du timer de ce dernier en utilisant le binaire /usr/local/bin/ppwatchdog.

Pour automatiser les choses, placez simplement l'appel à cette commande dans votre crontab (ou équivalent) sous la forme :

*/1 * * * * root test \! -e /var/run/ppwatchdog.on || \
/usr/local/sbin/ppwatchdog -d /dev/parport0 -t 350000

Ici, j'exécute /usr/local/sbin/ppwatchdog en utilisant le premier port parallèle avec un timing d'un tier de seconde environ. Ceci ne se passe qu'à la condition que le fichier /var/run/ppwatchdog.on existe. Ce dernier est créer par le script d'init lors de la mise en marche du service. Ceci permet de ne pas s'inquiéter de ce que fait cron toutes les minutes ou lors du démarrage du système. En effet, si le watchdog est à l'arrêt, il ne risque pas d'être activé par erreur lors d'un reset du timer.

MODULE KERNEL

Pour poussez plus loin dans l'étude du watchdog du point de vue de la programmation système sous Linux, nous avons le support dans le noyau. En effet, les Kernel 2.4 et 2.6 disposent d'une API permettant la gestion de watchdogs. Par défaut, livrés avec le kernel, un certain nombre de modèles manufacturés sont supportés. Il s'agit de périphérique ISA, PCI, USB ou parallèle ayant tous un point commun : un prix très élevé ou une intégration dans des machines spécifique toutes aussi chère.

L'utilisation de l'API du Kernel en lieu et place d'un outil «User Land» comme le code précédent, présente un avantage important : cela entre dans le cadre d'une utilisation standardisée. L'API Kernel définie l'utilisation de /dev/watchdog. Une fois le support chargé dans le Kernel (sous forme de module), un accès (ouverture) de l'entrée /dev provoque la mise en route du watchdog.

Il faut alors écrire de manière régulière dans /dev/watchdog pour remettre de timer à zéro et éviter un reset hard du PC. Selon les paramètres passés au chargement du module, une fermeture du fichier provoquera ou non l'arrêt du watchdog sous certaines conditions (le caractère magique "V"). Consultez la documentation du Kernel pour en savoir plus.

Les sources du module pour les Kernels 2.4 et 2.6 se trouvent dans l'archive ppdog-0.1.tar.gz. Notez que vous devez appliquer la méthode traditionnelle de compilation de modules aussi bien pour la série 2.4 (Makefile seul) que pour la 2.6 (avec un arbre de sources du Kernel configuré et compilé). Consultez les documentations adéquates pour ce type de manipulations.

Notez que ce module (décliné en deux versions) n'est qu'un début. Bien qu'il soit complet, je pense qu'un certain nombre d'améliorations seront apportées (documentation, amélioration du circuit, programmation du timer, utilisation d'un PIC, etc).

$Id: index.php,v 1.3 2004/11/20 15:05:12 denis Exp $

© Denis Bodor <lefinnois@lefinnois.net>

Aucune reproduction, même partielle, autres que celles prévues à l'article L 122-5
du code de la propriété intellectuelle, ne peut être faite de ce site
sans l'autorisation expresse de l'auteur.