Utilisation d'une clef wifi USB TP-Link TL-WN722


Voici les manipulations effectuées sur un Raspberry PI avec une TL-WN722 chip Atheros 9271 afin de faire fonctionner la clef USB sur les fréquences amateurs.

Avant de lire la suite : malgré les nombreuses manipulations je n'ai pas réussi à faire fonctionner la clef TL-WN722 sur les bandes amateurs, de plus le pilote ath9k actuel ne permet pas d'utiliser les bandes passantes 5 et 10 MHz utilisé en 2.3 GHz.
En l'état actuel des choses il est indispensable de passer par une ré écriture de ce pilote ou l'utilisation d'un ancien pilote mais il serait alors incompatible avec un Linux récent.


Je recherche encore la solution, si quelqu'un a une idée, ça m'interesse.


Rappel : les manipulations ci après ont été réalisés sur Raspberry PI B et B+ sous Raspian Kernel version 3.10 et 3.12.  

Concernant la compilation du Kernel il est possible de faire de la cross compilation sur une autre machine et un autre kernel. Il faut savoir qu’une compilation de Kernel sur un Raspberry PI dure plus de 30 heures. 

Dans le cas où la compilation est lancée via un SSH il est vivement conseillé d’exécuter la commande dans un tmux comme cela si la connexion est perdue la commande continue à s’éxécuter et il est possible de récupérer la connexion comme si de rien n'était.

Commençons les manipulations.
 
Dans le home de l'utilisateur utilisé créer un répertoire où seront copiés l'ensemble des données à savoir le source du Kernel, le source de wireless-regdb et les patchs.
 
Depuis le Raspberry PI et dans le répertoire créé à cet effet récupérer les sources du Kernel en fonction du Kernel installé, dans ce document les opérations ont été réalisés sur une version 3.12 du Kernel. La commande ci après va lancer le transfert et décompresser le fichier à la suite.
 
$ wget https://github.com/raspberrypi/linux/archive/rpi-3.12.y.tar.gz -O - | tar xzf -
 
Récupérer les sources ‘wireless-regdb’, le plus simple est de faire un 'apt-get source wireless-regdb' sur un Debian puis de transférer les fichiers sur le Raspberry PI car ces sources ne sont pas disponibles depuis Raspbian.
 
Récupérer les patchs ATHEROS HAMBANDS : http://www.yo3iiu.ro/archives/atheros_hambands/atheros_hambands.tgz , décompresser le fichier et placer les fichiers, htc_drv_init.c.patch, regd.c.patch et util.c.patch dans le répertoire racine des sources du Kernel. Le patch hw_features.c.patch n'est utilisé que pour le mode HotSpot, non développé ici.
 
Passer les patchs :
 
$ cat htc_drv_init.c.patch | patch -p1 –verbose
 
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- linux-source-3.0.0/drivers/net/wireless/ath/ath9k/htc_drv_init.c   2011-07-22 05:17:23.000000000 +0300
|+++ linux-source-3.0.0.modif/drivers/net/wireless/ath/ath9k/htc_drv_init.c     2013-11-29 23:50:40.456139799 +0200
--------------------------
Patching file drivers/net/wireless/ath/ath9k/htc_drv_init.c using Plan A...
Hunk #1 succeeded at 37 (offset 6 lines).
Hunk #2 succeeded at 48 with fuzz 1 (offset 4 lines).
done
 
Vérifier la présence du fichier /drivers/net/wireless/ath/ath9k/init.c si le fichier est présent le modifier comme le fichier /drivers/net/wireless/ath/ath9k/htc_drv_init.c en  ajoutant les canaux supplémentaires.
 
Supprimer les canaux sous la ligne 'static struct ieee80211_channel ath9k_2ghz_channels[] = {'
 et ajouter les canaux ci après :

        CHAN2G(2312, 33), /* Channel -19 */
        CHAN2G(2317, 32), /* Channel -18 */
        CHAN2G(2322, 31), /* Channel -17 */
        CHAN2G(2327, 30), /* Channel -16 */
        CHAN2G(2332, 29), /* Channel -15 */
        CHAN2G(2337, 28), /* Channel -14 */
        CHAN2G(2342, 27), /* Channel -13 */
        CHAN2G(2347, 26), /* Channel -12 */
        CHAN2G(2352, 25), /* Channel -11 */
        CHAN2G(2357, 24), /* Channel -10 */
        CHAN2G(2362, 23), /* Channel -9 */
        CHAN2G(2367, 22), /* Channel -8 */
        CHAN2G(2372, 21), /* Channel -7 */
        CHAN2G(2377, 20), /* Channel -6 */
        CHAN2G(2382, 19), /* Channel -5 */
        CHAN2G(2387, 18), /* Channel -4 */
        CHAN2G(2392, 17), /* Channel -3 */
        CHAN2G(2397, 16), /* Channel -2 */
        CHAN2G(2402, 15), /* Channel -1 */
        CHAN2G(2407, 14), /* Channel 0 */
        CHAN2G(2412, 0), /* Channel 1 */
        CHAN2G(2417, 1), /* Channel 2 */
        CHAN2G(2422, 2), /* Channel 3 */
        CHAN2G(2427, 3), /* Channel 4 */
        CHAN2G(2432, 4), /* Channel 5 */
        CHAN2G(2437, 5), /* Channel 6 */
        CHAN2G(2442, 6), /* Channel 7 */
        CHAN2G(2447, 7), /* Channel 8 */
        CHAN2G(2452, 8), /* Channel 9 */
        CHAN2G(2457, 9), /* Channel 10 */
        CHAN2G(2462, 10), /* Channel 11 */
        CHAN2G(2467, 11), /* Channel 12 */
        CHAN2G(2472, 12), /* Channel 13 */
        CHAN2G(2484, 13), /* Channel 14 */
 
Puis
 
$cat regd.c.patch | patch -p1 --verbose
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- linux-source-3.0.0/drivers/net/wireless/ath/regd.c 2011-07-22 05:17:23.000000000 +0300
|+++ linux-source-3.0.0.modif/drivers/net/wireless/ath/regd.c   2013-11-30 00:04:15.816138473 +0200
--------------------------
Patching file drivers/net/wireless/ath/regd.c using Plan A...
Hunk #1 succeeded at 33 (offset 5 lines).
done
 
Concernant le troisième patch celui ci ne fonctionne pas sous Debian / Raspbian, voici l'erreur :
 
$ cat util.c.patch | patch -p1 --verbose
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|--- linux-source-3.0.0/net/wireless/util.c     2013-03-01 00:32:56.000000000 +0200
|+++ linux-source-3.0.0.modif/net/wireless/util.c       2013-11-28 21:27:55.884285510 +0200
--------------------------
Patching file net/wireless/util.c using Plan A...
Hunk #1 FAILED at 39.
1 out of 1 hunk FAILED -- saving rejects to file net/wireless/util.c.rej
done
 
Modifier le fichier manuellement, remplacer dans /net/wireless/util.c :
 
case IEEE80211_BAND_2GHZ:
                        if (chan == 14)
                                   return 2484;
                        else if (chan < 14)
                                   return 2407 + chan * 5;
                        break;
 
par
 
case IEEE80211_BAND_2GHZ:
                if (chan == 14)
                        return 2484;
                else if (chan < 14)
*                        chan = (int)(char)chan;*
                        return 2407 + chan * 5;
                break;
 
Modifier ensuite le fichier /drivers/net/wireless/ath/ath9k/hw.h du fait de l'ajout de 20 canaux supplémentaires
 
remplacer #define ATH9K_NUM_CHANNELS      38
     par   #define ATH9K_NUM_CHANNELS      58
 
Aller maintenant dans le répertoire où se trouve 'wireless-regdb' et lancer les commandes suivantes :
 
$ make ~/.wireless-regdb-${USER}.key.priv.pem
 
Connecter la clef USB, dans l'exemple présent c'est une TP-Link TL-WN722n
 
$ iw reg get
 
 
C'est la Chine qui est le pays par défaut
 
country CN:
          (2402 - 2482 @ 40), (N/A, 20)
          (5170 - 5250 @ 80), (N/A, 23)
          (5250 - 5330 @ 80), (N/A, 23), DFS
          (5735 - 5835 @ 80), (N/A, 30)
          (57240 - 59400 @ 2160), (N/A, 28)
          (59400 - 63720 @ 2160), (N/A, 44)
          (63720 - 65880 @ 2160), (N/A, 28)
 
Si une erreur aparait avec la commande 'iw' installer le package iw avec la commande apt-get install iw
 
$ sudo iw reg set FR
 
Editer le fichier db.txt et modifier le pays qui s'est affiché après la commande 'iw reg get', ici CN.
 
Remplacer      (2402 - 2482 @ 40), (N/A, 20)
     par      (2302 - 2482 @ 40), (N/A, 30)
 
 
Faite la même opération pour le pays FR
 
$ sudo aptitude install python-m2crypto cdbs
 
$ make
 
Editer le fichier debian/rules et remplacer dans la ligne REGDB_AUTHOR pour mettre =$USER à la place du nom présent.
 
$ fakeroot ./debian-example/rules binary
 
Si la commande fakeroot revient en erreur installer le package debhelper avec un 'sudo apt-get install debhelper' et relancer la compilation.
 
Revenir au répertoire parent avec un cd ..
 
$ sudo dpkg -i wireless-regdb_2014.10.07-1_all.deb
 
$ sudo ln -s $(pwd)/wireless-regdb-2014.06.13/${USER}.key.pub.pem /lib/crda/pubkeys/
 
Attention /wireless-regdb-2014.06.13/ peut avoir un nom différent en fonction de ce qui a été créé au départ.
 
Les préparatifs sont terminés, la compilation peut être lancée mais avant il est préférable de faire un nettoyage des sources avec :
 
Aller dans le répertoire des sources du Kernel et lancer les commandes suivantes :
 
$ make mrproper
$ zcat /proc/config.gz > .config
$ make oldconfig
 
Appuyer sur [Enter] à chaque question
 
Dans le cas ou la compilation est en échec, faire un nettoyage avant de la relancer. 
 
Pour lancer la compilation exécuter la commande suivante : Attention cela va durer longtemps, longtemps
 
$ fakeroot make-kpkg –revision=votrenum --append-to-version=-hambands kernel_image
 
Installation du nouveau Kernel

$ sudo dpkg -i linux-image-3.12.35-hambands_1.00.f1src_armhf.deb                

$ sudo mv /boot/kernel.img /boot/kernel.img.orig

$ sudo ln -s vmlinuz-3.12.35-hambands /boot/kernel.img

Si il y une erreur ajouter dans /boot/config.txt
             kernel=vmlinuz-3.12.35-hambands

Rebooter le Raspberry Pi

$ iw reg get

$ iw reg get
country FR:
        (2302 - 2482 @ 40), (N/A, 30)
        (5170 - 5250 @ 80), (N/A, 20)
        (5250 - 5330 @ 80), (N/A, 20), DFS
        (5490 - 5710 @ 80), (N/A, 27), DFS
        (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR

Vérifier la plage de fréquence et le pays, si autre que FR

$ sudo iw reg set FR

Comme je le disais malgré ces manipulations cela ne fonctionne pas, même en modifiant le crda, les fréquences de la bande amateur sont bien présentes mais impossible de se connecter à une Nanostation en mode AP. Je ne sais pas où est le souci.

Il y a aussi à régler le souci de paramétrage de la bande passante, là aussi je n'ai pas encore trouvé la solution.
 
A suivre.

Sources d’informations :
YO3IIU : http://yo3iiu.ro/blog/?p=1301
F4GDL / F5KAV : http://www.f5kav.org/index.php?option=com_content&view=article&id=175&Itemid=129
 
Logiciel :
Tmux : http://fr.wikipedia.org/wiki/Tmux
 
Matériels :
Raspberry PI : http://www.raspberrypi.org/
TP-Link TL-WN722n : http://www.tp-link.fr/products/details/?model=TL-WN722N
ALFA AWUS036NHA : http://www.alfa.com.tw/products_show.php?pc=34&ps=20
ATHEROS 9271 : https://wikidevi.com/wiki/Atheros_AR9271  

> Sommaire