Il est né ?
Vous êtes ici : mk0phpgtk.xgarreau.org >> aide >> divers >> zaurus : Connexion USB entre le PC et le Zaurus
Version imprimable

Connexion USB entre le PC et le Zaurus

Bien que tournant sous linux, le zaurus est livré avec un ensemble d'utilitaires pour windows, mais pas linux. Enfin, signalons quand même qu'il existe une version de Qtopia Desktop pour linux librement téléchargeable sur le site de trolltech. Ce qui nous intéresse dans cet article est de connecter le zaurus en réseau TCP/IP avec le PC, sous linux, sans ajouter de matériel, c'est à dire en utilisant le socle et la liaison USB.

On peut en effet utiliser d'autres techniques pour connecter le Zaurus au PC comme une carte WiFi, une carte réseau, ou même au prix de quelques efforts, une liaison bluetooth. Ces techniques demandant l'acquisition de matériel supplémentaire, aussi bien pour le PC que pour le Zaurus, je ne les traiterai pas ici.

J'ai utilisé, pour la rédaction de cet article, un PC portable tournant sous linux debian woody tenue à jour avec notamment un noyau 2.4.21 téléchargé sur kernel.org. Le Zaurus, quand à lui, utilise une ROM 3.10, de chez Sharp.

Préparer le Zaurus

A vrai dire, il n'y a pas grand chose à faire côté zaurus, au moins dans un premier temps. Raccordez le bloc secteur au socle et enclenchez y le zaurus. Ensuite, dans l'onglet Settings, choisissez PC Link.
Vérifiez sous Connection: que la valeur sélectionnée est bien USB - TCP/IP (advanced).

C'est tout pour l'instant.

Sur le PC

Je suppose dans cet article que je m'adresse à des gens qui savent recompiler un noyau et qui sont à l'aise avec la procédure à suivre dans le cas général. Pour les néophytes, reportez vous aux nombreuses documentations détaillant la marche à suivre (dans linux pratique ou sur lea-linux.org par exemple).

Un noyau

La méthode que je donne ici est générique et devrait convenir à toutes les distributions (à quelques modifications près). En contrepartie, ce n'est pas forcément la plus simple. Vous pouvez visiter http://docs.zaurus.com/ pour voir si une méthode plus simple existe pour votre distribution ou votre noyau mais cette page étant ancienne, elle ne donne pas la méthode présentée ici, qui tient compte du fait que le module nous intéressant (usbnet) n'a été que récemment intégré au noyau linux.

Vous l'aurez compris, vous devez posséder sur le PC un noyau possédant les fonctionnalités adaptées à la mise en place d'un réseau sur le port usb. Je vous donne ici des indications à suivre pour un noyau 2.4.21, dernier stable disponible lors de la rédaction de l'article et premier à fournir le module usbnet (on n'utilise donc plus un patch usbdnet).

Vérifiez donc et/ou faites les modifications nécessaires à votre noyau grâce à la commande make xconfig ou make menuconfig, personnellement, je préfère la seconde car elle donne moins une impression de fouillis et surtout parce qu'elle ne requiert pas d'environnement X. C'est une bonne habitude à prendre de travailler en mode console pour des tâches de maintenance, ainsi, si un jour vous devez administrer un serveur à distance, une mise à jour du noyau via ssh ne vous fera pas peur ;-).
Voici les options à vérifier/modifier :

Faut-il mettre ces options en module ou les inclure dans le noyau ? Personnellement, je vous conseille d'inclure dans le noyau ce qui est toujours sur votre PC et en modules ce qui n'y est attaché que par moments. C'est pourquoi, je vous encourage à mettre le support usb et éventuellement le pilote du contrôleur dans le noyau et usbnet en module mais je ne force personne ...
Compilez et installez le noyau selon la méthode habituelle en n'oubliant pas de copier le nouveau noyau et de relancer votre chargeur (lilo, grub ou autre), connectez le zaurus à votre pc et rebootez.

Lors du démarrage si vous avez suivi mes conseils ou après avoir chargé les modules usbcore et usb-uhci (par exemple), vous devriez obtenir ces messages dans /var/log/messages ou en tapant dmesg. Si non, relisez l'article, il y a un problème quelque part. Si oui, vous constatez que l'on retouve bien le couple vid/pid du zaurus (Vendor ID, Product ID, le couple d'identifiants permettant de relier un driver à un périphérique donné selon la norme usb)

hub.c: new USB device 00:1d.0-1, assigned address 2
usb.c: USB device 2 (vend/prod 0x4dd/0x8004) is not claimed by any active
 driver.

Vous pouvez vérifier que tout c'est bien passé en tapant les commandes suivantes :

ZazouMobile:/home/zazou# modprobe usbnet
ZazouMobile:/home/zazou# ifconfig usb0 up 192.168.129.1
ZazouMobile:/home/zazou# ifconfig usb0
usb0      Link encap:Ethernet  HWaddr 6E:EF:75:60:19:F6
          inet addr:192.168.129.1  Bcast:192.168.129.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:2251 (2.1 KiB)  TX bytes:0 (0.0 b)

ZazouMobile:/home/zazou# ping 192.168.129.201
PING 192.168.129.201 (192.168.129.201): 56 data bytes
64 bytes from 192.168.129.201: icmp_seq=0 ttl=255 time=2.8 ms
64 bytes from 192.168.129.201: icmp_seq=1 ttl=255 time=1.5 ms
64 bytes from 192.168.129.201: icmp_seq=2 ttl=255 time=3.4 ms
64 bytes from 192.168.129.201: icmp_seq=3 ttl=255 time=1.2 ms

--- 192.168.129.201 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 1.2/2.2/3.4 ms
ZazouMobile:/home/zazou#

Vous êtes en réseau avec votre Zaurus, vous pouvez donc vous connecter aux serveurs disponibles sur le zaurus (comme ssh par exemple si vous l'avez installé).

hotplug

On a réussi à configurer tout cela et ça marche ... Mais bon, retaper la configuration réseau et devoir charger le module à la main à chaque fois, c'est fatigant. On va se servir de la fonctionnalité hotplug sous linux permettant au PC de détecter l'insertion de périphériques et d'assurer seul la (re)configuration nécessaire.

L'hotplug est constitué de deux parties, une partie kernel qui envoie au mode utilisateur des informations sur les périphériques que l'on connecte ou déconnecte des ports usb et une partie utilisateur, les scripts qui reçoivent d'une manière ou d'une autre les informations de connexion et chargent les modules adéquats.

La partie kernel est prise en charge par un thread kernel khubd et le script en mode utilisateur peut être choisi en éditant la valeur /proc/sys/kernel/hotplug. Par défaut, il s'agit de /sbin/hotplug

Cette partie kernel est opérationelle si vous avez suivi jusqu'ici les instructions de l'article, en cochant l'option Support for hot-pluggable devices lors de la configuration du kernel. Vous pouvez vérifier à l'aide de dmesg ou dans /var/log/messages ou /var/log/syslog qu'il fonctionne en connectant/déconnectant vos périphériques usb grâce à des messages comme :

kernel: usb.c: new USB device 00:1d.0-1, assigned address 3
kernel: hub.c: USB device 3 (vend/prod 0x4dd/0x8004) is not claimed by any
 active driver.

La nécéssité de l'hoplug est mise en évidence par le deuxième message. Nous savons, nous, qu'il faut utiliser usbnet pour le Zaurus mais le système doit l'avoir chargé pour s'en rendre compte, puisque chaque module annonce lui-même de quels périphériques il s'occuppe.

Pour s'en convaincre, déconnectons le Zaurus, chargeons le module usbnet (modprobe usbnet) et reconnectons le. Voici les messages obtenus :

kernel: usb.c: USB disconnect on device 00:1d.0-1 address 3
kernel: usb.c: registered new driver usbnet
kernel: hub.c: new USB device 00:1d.0-1, assigned address 4
kernel: usb0: register usbnet usb-00:1d.0-1, Sharp Zaurus SL-5x00

La première correspond à la déconnexion, la seconde au modprobe. Les deux dernières sont la reconnexion et la prise en charge par usbnet, qui a reconnu un Zaurus SL5x00. Bon, ça a marché, déconnectez le Zaurus et déchargez le module (modprobe -r usbnet).

Ce que nous allons faire en installant les scripts de hotplug, c'est faire charger le bon module et configurer la connexion réseau au moment de la connexion USB.

L'installation se déroule, sous debian en tapant apt-get install hotplug. Ceci devrait vous gratifier des messages suivants :

Unpacking hotplug (from .../hotplug_0.0.20020114-7_all.deb) ...
Setting up hotplug (0.0.20020114-7) ...
Starting hotplug subsystem: usb.
Updating /etc/hotplug/usb.usermap ...done.

Pour les autres distributions, vous trouverez votre bonheur sur le site linux-hotplug (ou en rpm, tgz, etc...) mais sachez que l'installation, si elle n'a pas été faite au moment de l'installation, n'est jamais très compliquée.

Les scripts utilisent, entre autres, le fichier /lib/modules/(votre_version_de_kernel)/modules.usbmap pour faire correspondre un module à un périphérique. Ce fichier est automatiquement généré quand vous faites un depmod -a. Pour une raison que j'ignore ce fichier contient une erreur de masque qui empêche la reconnaissance du Zaurus. Editer ce fichier n'est pas une bonne solution à long terme puisqu'il est réactualisé automatiquement. Vous pouvez utiliser les fichiers de description de périphérique locaux, dans le répertoire /etc/hotplug (ou modifier les entrées du module, à la fin du fichier source usbdnet.c). Donc, ajoutez dans /etc/hotplug/usb.handmap la ligne du fichier modules.usbmap contenant usbnet et 0x0383 0x04dd 0x8004. Remplacez-y 0x0383 par 0x0003, c'est à dire quelque chose comme :

usbnet 0x0003 0x04dd 0x8004  0x0000 0x0000 0x00 0x00 0x00 0x02 0x0a 0x00
 0x00003800

L'important est que la ligne contienne usbnet 0x0003 0x04dd 0x8004 les autres valeurs peuvent être à 0. Une dernière astuce : vous pouvez également ajouter cette ligne dans usb.usermap et ajouter modprobe usbnet dans le script /etc/hotplug/usb/usbnet que nous créerons dans quelques lignes. En effet, le fichier usb.handmap contient des périphériques pour lesquels on tente de charger un module et de lancer un script alors que pour les périphériques contenus dans usb.usermap, on ne fait que lancer un script. Naturellement, si le fichier /lib/modules/.../modules.usbmap contient les bonnes valeurs, tout ceci n'est pas à faire.

Dans le cas où vous décideriez de modifier le module usbnet, il vous suffit de remplacer à la fin du fichier source du module la section suivante :

        .match_flags    =   USB_DEVICE_ID_MATCH_INT_INFO
                          | USB_DEVICE_ID_MATCH_DEVICE,
        .idVendor               = 0x04DD,
        .idProduct              = 0x8004,
par
        .match_flags    =   USB_DEVICE_ID_MATCH_DEVICE,
        .idVendor               = 0x04DD,
        .idProduct              = 0x8004,

Ensuite, un simple make modules modules_install suffira à faire fonctionner le hotplug, car le fichier modules.usbmap aura été mis à jour avec un masque correct.

Il nous faut configurer l'interface réseau lorsque le module est chargé. Dans notre cas, un script /etc/hotplug/usb/usbnet sera exécuté s'il existe et est exécutable. Donc, on crée le répertoire et le script, c'est à dire au minimum :

#!/bin/bash
#
ifconfig usb0 up 192.168.129.1

Les options supplémentaires ne sont pas nécessaires, les valeurs par défaut étant adaptées.
N'oubliez pas de rendre ce fichier exécutable en tapant chmod a+x /etc/hotplug/usb/usbnet et pluggez le Z...

A présent lorsque vous connectez votre zaurus, tout est effectué automatiquement et vous pouvez directement vous y connecter, par exemple par ssh en tapant ssh root@192.168.129.201

Partage de connexion

On va maintenant permettre au zaurus d'utiliser le réseau auquel est connecté le PC pour naviguer sur Internet, partager et accéder à des fichiers et ressources diverses, etc... Tout ce qui fait que l'on a tous envie d'être connectés ;-)

Sur le PC : le PC doit router les paquets vers/depuis le Zaurus et faire du masquerading, on lui dit de s'acquitter de cette tâche grâce aux commandes suivantes que vous pouvez ajouter au script d'hotplug vu plus haut. L'exemple ci dessous correspond à un PC connecté à internet via son interface eth0, pour laquelle l'IP est 192.168.1.2 :

iptables  -t nat -F
iptables  -t nat -A POSTROUTING -j SNAT -o eth0 --to 192.168.1.2
echo 1 > /proc/sys/net/ipv4/ip_forward

Sur le Zaurus : vous devez dire au Zaurus par où envoyer ses packets. On lui ajoute donc une passerelle (gateway) par défaut.

route add default gw 192.168.129.1

Nous verrons quelques lignes plus bas où ajoutez cette ligne pour qu'elle soit automatiquement exécutée.

Reste le problème du proxy et du dns... Dans la nouvelle version de sa ROM, l'interface graphique ne permet plus de les spécifier pour la connexion via usb. Le problème est que le zaurus garde donc les valeurs valides pour la dernière connexion réseau via carte CF ou SD, ce qui ne correspond pas forcément à la bonne configuration...

La solution consiste à créer deux fichiers que l'on remplace quand le besoin s'en fait sentir :

/etc/resolv.conf.usbdnet doit contenir vos dns, dans mon cas, il s'agit de ceux de Nerim, j'obtiens donc le fichier suivant :

nameserver 62.4.16.70
nameserver 62.4.16.69

/home/root/Applications/Network/modules/Proxies.conf.usbdnet doit contenir les infos de proxy, c'est à dire la plupart du temps, un fichier vide. Vous pouvez toutefois le remplir en vous servant de l'existant (si vous avez déjà configuré un réseau par carte sur le Zaurus) /home/root/Applications/Network/modules/Proxies.conf, en remplaçant les hôtes et les numéros de ports pour les faire correspondre à ceux de votre réseau. La syntaxe du fichier est relativement simple.

Modifions enfin le fichier /etc/hotplug/usbd.func du Zaurus, qui contient les fonctions appélées lors des connexion et déconnexion du support.

Dans usbd_net_if_up(), ajoutez avant la dernière accolade les lignes suivantes :

/sbin/route add default gw 192.168.129.1
mv /home/root/Applications/Network/modules/Proxies.conf /home/root/Applications/Network/modules/Proxies.conf.bak
cp /home/root/Applications/Network/modules/Proxies.conf.usbdnet /home/root/Applications/Network/modules/Proxies.conf
mv /etc/resolv.conf /etc/resolv.conf.bak
cp /etc/resolv.conf.usbdnet /etc/resolv.conf

Dans usbd_net_if_down(), ajoutez avant la dernière accolade fermante :

mv /home/root/Applications/Network/modules/Proxies.conf.bak /home/root/Applications/Network/modules/Proxies.conf
mv /etc/resolv.conf.bak /etc/resolv.conf

Cet article me paraissait plus simple qu'il ne l'est vraiment lorsque je l'ai commencé, j'espère qu'il vous aura aidé à mieux connaître votre Z et linux en général et qu'il n'aura pas été trop ardu ...

@+

Xavier Garreau - <xavier@xgarreau.org>
http://www.xgarreau.org/

Ingénieur de recherche PRIM'TIME TECHNOLOGY
http://www.prim-time.fr/

Membre fondateur du ROCHELUG
http://www.rochelug.org/

Liens & Références :


Précédent Index Suivant

a+

Auteur : Xavier GARREAU
Modifié le 21.09.2004

Rechercher :

Google
 
Web www.xgarreau.org