Compilation et installation du pilote MT7610U (AC600) pour GNU/Linux

Le pilote MT7610U fonctionne au moins pour le modèle commercialement connu sous le nom de AC600. Le AC600 est une carte Wi-Fi connectable via USB. Il faut faire attention avec le nom commercial : Edimax propose une clé USB Wi-Fi sous le nom AC600, mais le pilote MT7610U ne la gère pas. La puce Wi-Fi est faite par MediaTek. D'après les spécifications, il peut aller jusqu'à 150 Mbps sur la fréquence 2.4 GHz et jusqu'à 450 Mbps sur la fréquence 5 GHz (mais il faut bien sur que votre routeur supporte aussi ces vitesses théoriques). Il supporte la norme 802.11ac.

Téléchargement des sources

Le code source est disponible via Internet sur le site web de MediaTek. Pour accéder au lien, vous devez déclarer un nom et une addresse email, il n'y a pas de vérification, vous pouvez donc mentir. Il y a aussi un captcha Google qui nécessite JavaScript. Vous pouvez aussi directement utiliser ce lien.

Il existe des versions modifiées des sources officielles. Il y a par exemple le dépot chenhaiq / mt7610u_wifi_sta_v3002_dpo_20130916 sur GitHub.

Au moins une partie des sources est sous la licence GNU GPL en version 2 ou plus. C'est une licence de logiciel libre (avec copyleft).

Installation des outils de compilation

Pour compiler, il faut les outils pour. Sous au moins Debian et Trisquel, apt-get install build-essential (avec les droits root/SuperUser) devrait faire l'affaire.

Compilation et installation théorique

# Téléchargement des sources
wget https://s3.amazonaws.com/mtk.cfs/Downloads/linux/mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# Déarchivage et décompression
tar xjf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# On va dans le dossier issu de l'archive
cd mt7610u_wifi_sta_v3002_dpo_20130916

Il suffit ensuite de faire dans cette ordre les 2 commandes suivantes. C'est la théorie.

# Compilation
make
# Installation (avec les droits root/SuperUtilisateur)
make install

Repérer l'identifiant de votre carte

L'identifiant de votre carte n'est peut être pas dans les sources. Si c'est le cas, un pilote compilé et fonctionnel ne détectera pas votre carte. lsusb donne la liste des périphériques USB connectés. Faites en un quand la carte est branchée et un autre quand elle est débranchée, puis comparer la différence (vous pouvez rediriger les résultats dans des fichiers et utiliser diff).

Le nom symbolique doit être "Sitecom Europe B.V." ou quelque chose de similaire. Si c'est "Edimax Technology Co., Ltd" ou proche, ce tutoriel ne traite pas d'un pilote compatible.

$ lsusb
Bus 001 Device 004: ID 7392:a812 Edimax Technology Co., Ltd
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ lsusb
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ echo 'Oups, j'ai une de carte de Edimax.'

Ajouter l'identifiant de votre carte

Le fichier "common/rtusb_dev_id.c" devrait contenir un tableau se nommant rtusb_dev_id. Ce tableau contient la liste des identifiants gérés par le pilote. Si l'identifiant de votre carte n'en fait pas parti, rajoutez le (par exemple {USB_DEVICE(0x0DF6,0x0075)}, /* MT7610U */).

USB_DEVICE_ID rtusb_dev_id[] = {
#ifdef MT76x0
        {USB_DEVICE(0x0DF6,0x0075)}, /* MT7610U */
        {USB_DEVICE(0x148F,0x7610)}, /* MT7610U */
        {USB_DEVICE(0x0E8D,0x7610)}, /* MT7610U */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7650, 0xff, 0x2, 0xff)}, /* MT7650U */
#endif

La structure _OS_FS_INFO_

os/linux/rt_linux.c:1109:20: error: incompatible types when assigning to type ‘int’ from type ‘kuid_t’
   pOSFSInfo->fsuid = current_fsuid();
                    ^
os/linux/rt_linux.c:1110:20: error: incompatible types when assigning to type ‘int’ from type ‘kgid_t’
   pOSFSInfo->fsgid = current_fsgid();

Si vous avez au moins une de ces erreurs, c'est qu'il y a une erreur dans la structure _OS_FS_INFO_. Le membre fsuid doit être de type kuid_t et fsgid de type kgid_t. Cette structure se trouve dans le fichier include/os/rt_linux.h vers la ligne 279.

typedef struct _OS_FS_INFO_
{
    kuid_t          fsuid;
    kgid_t          fsgid;
    mm_segment_t    fs;
} OS_FS_INFO;

Build reproductible

Un build reproductible est un build qui pourra être reproduit à l'identique. Pour cela, il faut qu'un même compilateur produise toujours le même binaire. Cela n'est pas possible si le binaire contient des données indiquant quand il a été compilé. Un build reproductible permet de vérifier qu'un binaire donné par un tiers corresponde bien aux sources. Un build reproductible permet aussi de vérifier (d'une manière faible) qu'aucune machine n'a une suite de compilation corrompue.

Les macros __DATE__ et __TIME__ sont incompatibles avec un build reproductible. Il faut donc les enlever, ainsi que tout élément en dépendant.

sta/sta_cfg.c:5401:85: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
   snprintf(extra, size, "Driver version-%s, %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__ );

Si vous avez cette erreur, le correctif est snprintf(extra, size, "Driver version-%s\n", STA_DRIVER_VERSION);.

common/cmm_info.c:47:97: error: macro "__DATE__" might prevent reproducible builds [-Werror=date-time]
   DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s %s %s\n", STA_DRIVER_VERSION, __DATE__, __TIME__));

Si vous avez cette erreur, le correctif est DBGPRINT(RT_DEBUG_TRACE, ("Driver version-%s\n", STA_DRIVER_VERSION));.

Fichier(s) d'en-tête manquant(s)

Si vous avez l'erreur suivante, c'est qu'il vous manque au moins 1 fichier d'en-tête (appelé header en anglais). make[1]: /lib/modules/4.1.19-v7+/build: No such file or directory. Stop. Makefile:403: recipe for target 'LINUX' failed make: [LINUX] Error 2

Pour résoudre ce problème, le plus simple est d'installer le paquet approprié de votre distribution. Sur une distribution avec APT (comme Debian ou Trisquel), apt-get install linux-headers-generic devrait faire l'affaire. Sur Raspbian (Debian pour Raspberry Pi), c'est différent : apt-get install raspberrypi-kernel-headers.

Support du WPA

Dans le fichier "os/linux/confik.mk", il y a des variables pour activer le WPA. Il faut que leurs valeurs soient "y" (pour "yes", c'est-à-dire "oui").

HAS_WPA_SUPPLICANT=y
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

Sources