Récepteur Logitech Unifying

De ArchwikiFR

(voir la page originale sur le wiki officiel, en anglais)

Le récepteur Logitech Unifying est un récepteur sans fil qui permet de connecter à l'ordinateur jusqu'à six périphériques (souris, claviers) compatibles. Le périphérique d'entrée fourni avec le récepteur est normalement déjà appairé et devrait fonctionner 'out of the box' grâce au plug-and-play.

Néammoins, Logitech ne supporte officellement l'appairage de périphériques additionnels qu'au travers de leur logiciel pour Windows. L'appairage sous GNU/Linux est gérable grâce à un programme créé par Benjamin Tissoires. Cet outil ne fournit cependant pas de retour sur le terminal. D'autres développeurs ont conçus des outils plus complets qui retournent à l'utilisateur des informations sur l'état de l'appairage mais aussi permettent de désappairer un périphérique précédemment appairé.

ltunify est un programme C en ligne de commande qui permet d'appairer, désappairer et lister les périphériques compatibles. Solaar est un outil graphique en Python qui s'insère dans la zone de notification et permet également de configurer des options additionnelles sur le périphérique d'entrée comme par exemple l'inversion du fonctionnement des touches de fonctions.

Installation

Depuis AUR

Le programme de Benjamin peut être directement installé depuis AUR: pairingtool.

Solaar est également disponible sur AUR: solaar. Avant d'installer le paquet, veillez à créer le groupe plugdev et à vous y ajouter pour ne pas avoir à lancer l'application sous le compte root.

Le paquet Solaar crée automatiquement le groupe plugdev à l'installation. Après l'installation, veillez à vous ajouter au groupe plugdev (# usermod -aG plugdev <user>) pour utiliser Solaar en tant qu'utilisateur normal.

ltunify est maintenant également disponible sur AUR: ltunify-git. Il vous faudra créer puis vous ajouter au groupe plugdev (ou autre, le groupe en question est configurable dans le fichier /etc/udev/rules.d/42-logitech-unify-permissions.rules) pour profiter de ltunify sans avoir à le lancer en root.

ltunify (installation manuelle)

ltunify est disponible sur AUR, mais vous pouvez néammoins décider de l'installer manuellement. Voici la marche à suivre :

# pacman -S gcc
$ git clone https://git.lekensteyn.nl/ltunify.git && cd ltunify
$ make ltunify
$ make install-home

La dernière étape permet d'installer ltunify dans votre répertoire personnel sous ~/bin/ltunify. Copiez le fichier udev/42-logitech-unify-permissions.rules dans /etc/udev/rules.d/ pour profiter de ltunify sans besoin du compte root.

pairingtool (installation manuelle)

Si vous le préférez, vous pouvez également compiler le code source manuellement. Tout d'abord, assurez-vous d'avoir un compilateur C d'installé :

# pacman -S gcc

Vous pouvez ensuite copier-coller le code suivant dans un fichier local, pairing_tool.c par exemple :

/*
* Copyright 2011 Benjamin Tissoires 
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see .
*/

#include <linux/input.h>
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>

#define USB_VENDOR_ID_LOGITECH                  (__u32)0x046d
#define USB_DEVICE_ID_UNIFYING_RECEIVER         (__s16)0xc52b
#define USB_DEVICE_ID_UNIFYING_RECEIVER_2       (__s16)0xc532

int main(int argc, char **argv)
{
       int fd;
       int res;
       struct hidraw_devinfo info;
       char magic_sequence[] = {0x10, 0xFF, 0x80, 0xB2, 0x01, 0x00, 0x00};

       if (argc == 1) {
               errno = EINVAL;
               perror("No hidraw device given");
               return 1;
       }

       /* Open the Device with non-blocking reads. */
       fd = open(argv[1], O_RDWR|O_NONBLOCK);

       if (fd < 0) {
               perror("Unable to open device");
               return 1;
       }

       /* Get Raw Info */
       res = ioctl(fd, HIDIOCGRAWINFO, &info);
       if (res < 0) {
               perror("error while getting info from device");
       } else {
               if (info.bustype != BUS_USB ||
                   info.vendor != USB_VENDOR_ID_LOGITECH ||
                   (info.product != USB_DEVICE_ID_UNIFYING_RECEIVER &&
                    info.product != USB_DEVICE_ID_UNIFYING_RECEIVER_2)) {
                       errno = EPERM;
                       perror("The given device is not a Logitech "
                               "Unifying Receiver");
                       return 1;
               }
       }

       /* Send the magic sequence to the Device */
       res = write(fd, magic_sequence, sizeof(magic_sequence));
       if (res < 0) {
               printf("Error: %d\n", errno);
               perror("write");
       } else if (res == sizeof(magic_sequence)) {
               printf("The receiver is ready to pair a new device.\n"
               "Switch your device on to pair it.\n");
       } else {
               errno = ENOMEM;
               printf("write: %d were written instead of %ld.\n", res,
                       sizeof(magic_sequence));
               perror("write");
       }
       close(fd);
       return 0;
}

Après création, le fichier doit être compilé :

$ gcc -o pairing_tool pairing_tool.c

Utilisation

pairingtool permet simplement d'appairer un périphérique, et ne retourne aucune information. Il a également besoin de connaître le nom du périphérique correspondant au récepteur Unifying utilisé. ltunify et Solaar permettent eux de détecter automatiquement le périphérique à ajouter.

ltunify

Exemples d'appairage, désappairage et d'affichage de la liste des périphériques connectés :

$ ltunify unpair mouse
Device 0x01 Mouse successfully unpaired
$ ltunify pair
Please turn your wireless device off and on to start pairing.
Found new device, id=0x01 Mouse
$ ltunify list
Devices count: 1
Connected devices:
idx=1   Mouse   M525

Solaar

Solaar dispose d'une interface graphique et d'une ligne de commande. Exemple d'appairage dans un terminal :

$ solaar-cli unpair mouse
Unpaired 1: Wireless Mouse M525 [M525:DAFA335E]
$ solaar-cli pair
Pairing: turn your new device on (timing out in 20 seconds).
Paired device 1: Wireless Mouse M525 [M525:DAFA335E]
$ solaar-cli show
-: Unifying Receiver [/dev/hidraw0:08D89AA6] with 1 devices
1: Wireless Mouse M525 [M525:DAFA335E] 

pairingtool

Pour trouver le périphérique adéquat, jetez un oeil à la sortie de

$ ls -l /sys/class/hidraw/hidraw*/device/driver | awk -F/ '/receiver/{print $5}'

Cela retournera le nom du périphérique récepteur (par exemple hidraw0).

Eteignez maintenant le périphérique à appairer (s'il était allumé) et lancez l'exécutable fraîchement compilé avec le périphérique approprié en argument :

# ./pairing_tool /dev/hidraw0
The receiver is ready to pair a new device.
Switch your device on to pair it (you have thirty seconds to do so).

Vous disposez de 30 secondes pour allumer votre périphérique à appairer. Au bout de quelques secondes, votre périphérique devrait fonctionner correctement.

Problèmes connus

Mauvais périphérique (pairing tool seulement)

Sur certains systèmes, il y a plusieurs périphériques possédant le même nom. Dans ce cas, vous recevrez le message d'erreur suivant :

# pairing_tool /dev/hidraw1
Error: 32
write: Broken pipe

Keyboard Layout dans le fichier de config de X.Org

Sur le noyau Linux 3.2, le récepteur Unifying possède son propre module hid_logitech_dj mais celui-ci ne fonctionne pas parfaitement avec le layout de clavier lorsque ce dernier est configuré depuis le fichier de configuration de X.Org. Une solution temporaire consiste à utiliser xorg-setxkbmap et à configurer manuellement le layout du clavier. Pour un clavier azerty standard, la commande peut être :

$ setxkbmap -layout fr -variant latin1

Pour automatiser la procédure, vous pouvez placer cette commande dans votre .xinitrc.