Des convertisseurs d'événements joystick en événements souris existent déjà, malheureusement ils sont tous, à ma connaissance, intégrés à des logiciels tels que GPM, XFree86, ... Js2Mouse est donc un pilote, développer depuis rien, qui a pour unique tâche de réaliser cette conversion. De cette manière, un logiciel nécessitant directement les sorties souris n'a pas besoin d'intégrer dans son code un tel émulateur pour utiliser le joystick. Le but final de Js2Mouse est de passé dans l'espace noyau, c'est l'une des raisons pour laquelle il est écrit en C. Ainsi, ce pilote gérera son propre tampon et sera capable d'émuler d'autres types de souris, notamment celles qui nécessitent une initialisation à travers le fichier de périphérique ou un appel à ioctl()
.
Pour comprendre le protocole de ma souris, j'ai utilisé une technique d'analyse inversée. Pour cela MouseTest, fourni avec Js2Mouse, lit le fichier de périphérique du pilote d'une souris et affiche le résultat à l'écran. A partir de là on peut retrouver comment fonctionne le pilote de la souris et l'imiter.
Exemple d'exécution de MouseTest :
./mousetest b[0]= -3 b[1]= 5 b[2]= 0 b[0]= 24 b[1]= -4 b[2]= 3 b[0]= 0 b[1]= 24 b[2]= -5 b[0]= 1 b[1]= 0 b[2]= 24 b[0]= -5 b[1]= 1 b[2]= 0 b[0]= 24 b[1]= -5 b[2]= 0 b[0]= 0 b[1]= 56 b[2]= -5 b[0]= -1 b[1]= 0 b[2]= 56 b[0]= -5 b[1]= -3 b[2]= 0 b[0]= 56 b[1]= -4 b[2]= -6 b[0]= 0 b[1]= 56 b[2]= -2 b[0]= -8 b[1]= 0 b[2]= 56 b[0]= -1 b[1]=-11 b[2]= 0 b[0]= 40 b[1]= 0 b[2]=-11 b[0]= 0 b[1]= 40 b[2]= 1 b[0]=-10 b[1]= 0 b[2]= 40 b[0]= 3 b[1]= -7 b[2]= 0 b[0]= 40 b[1]= 2 b[2]= -4 b[0]= 0 b[1]= 40 b[2]= 3
Dans le cas d'une souris PS2, cela a permis de conclure que les événements sont fournis sous la forme d'un tableau de 3 octets. Le premier est un masque binaire représentant les actions en cours, le second représente la vitesse horizontale et le dernier la vitesse vertical.
Extrait du fichier convert_ps2.c
des sources de Js2Mouse :
//The fisrt byte represents ORed actions : #define PS2_CLICK_LEFT 0x9 //1001 #define PS2_CLICK_RIGHT 0xa //1010 #define PS2_CLICK_RELEASE 0x8 //1000 #define PS2_MOVE_LEFT 0x18 //1 1000 #define PS2_MOVE_RIGHT 0x8 //1000 #define PS2_MOVE_UP 0x8 //1000 #define PS2_MOVE_DOWN 0x28 //10 1000
Le pilotes de souris renvoie en continue un statut lorsque celle-ci est en mouvement, alors que le pilote de joystick renvoie un événement. Pour être plus clair, tant que la souris ce déplace, le pilote indique sa vitesse et sa direction, alors que lorsque l'axe du joystick est actif mais qu'il ne bouge plus, par exemple en font de butée, le pilote n'envoie pas d'événements. Le pilote de souris fournis en simultané les actions en cours, alors que pour le joystick, le pilote n'indique que séquentiellement les événements. Ces points sont importants pour la compréhension des sources de Js2Mouse.