Un troisième bouton sur une souris ADB Kensington à 2 boutons.

Introduction.

Avec certains noyaux (2.2.12, 2.2.13 et 2.2.15pre7 de Paul Mackerras, par exemple) la souris Kensington à 2 boutons est mal reconnue, et il est impossible de simuler le 3e bouton par appui simultané sur les 2 boutons. Lors du boot, on voit bien les messages suivants :

ADB keyboard at 2, handler set to 5
ADB mouse at 3, handler 1
ADB mouse at 15, handler set to 4 (TurboMouse 5)

mais en fait, le handler est mis à -1 et mousemode 15 4 n'a pas d'effet.

Or ça fonctionne avec le noyau 2.2.10. On va donc rechercher dans les sources du noyau là où la détection de la souris est faite, et comparer ce qui se passe dans les noyaux 2.2.10 et 2.2.12.

L'arrivée du nouveau mode de gestion de périphériques d'entrée (new input layer) dans la distribution LinuxPPC 2000 Q4 n'a pas résolu le problème.

Le noyau 2.2.10.

On recherche TurboMouse dans les sources du noyau, et on trouve rapidement que ce texte apparaît dans la fonction init_turbomouse du fichier /usr/src/linux-2.2.10/drivers/macintosh/mac_keybc.c. Cette fonction est la suivante :

static void init_turbomouse(int id)
{
   struct adb_request req;
      printk(" (TurboMouse 5)");
   adb_mouse_kinds[id] = ADBMOUSE_TURBOMOUSE5;
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
   adb_request(&req, NULL, ADBREQ_SYNC, 3, ADB_WRITEREG(id,3), 0x20 | id, 4);
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
   adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,2), 0xe7, 0x8c, 0, 0, 0, 0xff, 0xff, 0x94);
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
   adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(id,2), 0xa5, 0x14, 0, 0, 0x69, 0xff, 0xff, 0x27);
}

Comme d'habitude, on comprend tout ce qui est fait car les commentaires abondent ... C'est pas bien grave, on va voir ce qui se passe dans la version 2.2.12, et on va comparer.

Le noyau 2.2.12.

La version 2.2.12 est celle-ci :

static void init_turbomouse(int id)
{
   struct adb_request req;
      printk(" (TurboMouse 5)");
   adb_mouse_kinds[id] = ADBMOUSE_TURBOMOUSE5;
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(id));
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
   adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(3,2), 0xe7, 0x8c, 0, 0, 0, 0xff, 0xff, 0x94);
   adb_request(&req, NULL, ADBREQ_SYNC, 1, ADB_FLUSH(3));
   adb_request(&req, NULL, ADBREQ_SYNC, 9, ADB_WRITEREG(3,2), 0xa5, 0x14, 0, 0, 0x69, 0xff, 0xff, 0x27);
}

On remarque que les fonctions ne sont pas identiques. Il y a un ADB_WRITEREG en moins, et surtout, il y a ces "3" en lieu et place du paramètre id, qui de toute évidence, est l'identifiant du périphérique ADB.

Le noyau 2.2.18-4hpmac.

Avec le noyau 2.2.18-4hpmac de LinuxPPC 2000 Q4, le problème existe toujours. Le code de mac_keybc.c a été dupliqué dans le fichier /usr/src/linux/drivers/macintosh/adbhid.c. On y retrouve la même fonction init_turbomouse que dans le noyau 2.2.12.

Solutions possibles.

Il faut modifier le fichier mac_keybc.c. Par mesure de précaution, faites une copie de sauvegarde avant d'y toucher (par exemple cp mac_keybc.c mac_keybc.c.orig).

La première solution consiste à remplacer les paramètres "3" par "id" dans les appels aux macros ADB_FLUSH et ADB_WRITEREG. C'est la solution que j'ai retenu pour le noyau 2.2.15pre7 de Paul Mackerras.

Quand j'utilisais le noyau 2.2.12, j'avais remplacé bestialement le code (la partie de texte entre les accolades) de la fonction init_turbomouse en version 2.2.12 par celui de la version 2.2.10.

Pour le noyau 2.2.18-4hpmac de LinuxPPC 2000 Q4, la modification est à faire dans le fichier adbhid.c.

Quand la manipulation est effectuée, il n'y a plus qu'à recompiler le noyau, et repasser sous MacOS pour recopier le fichier vmlinux dans le dossier Linux Kernels de BootX. Normalement ça roule, encore faut il avoir paramétré le fichier /etc/X11/XF86Config comme il faut.

Conclusion.

J'ai fait la manip sur les noyaux 2.2.12, 2.2.15pre7 et 2.2.18-4hpmac. Il est tout à fait possible que ça fonctionne aussi sur d'autres versions de noyau. Les retours d'expériences sont les bienvenus.

Je remarque que j'ai une facheuse tendance à cliquer à coté. C'est à dire que si je clique sur la barre de titre d'un xterm et que je bouge immédiatement la souris pour déplacer la fenêtre, je sélectionne en fait du texte dans la fenêtre xterm. J'ai l'impresion qu'il se passe un temps non négligeable entre le clic et sa détection. Je n'ai pas ces désagréments sur le 6500 et avec une souris Kensington à 4 boutons.

Surtout, si vous ne rencontrez pas de problèmes avec votre souris ADB Kensington à 2 boutons, ne touchez à rien !

Etienne Herlent.

Les marques citées appartiennent à leurs propriétaires respectifs.

 

Dernière mise à jour le 23/1/01.

les fichiers en téléchargement sont à ftp://ftp.linux-france.org/pub/macintosh/

 

Retour à GNU Linux sur Macintosh