A l'attention des utilisateurs d'usb_modeswitch : Josua Dietze a mis à jour cet utilitaire ainsi que son fichier de configuration en date du 9 janvier 2009. De nouveaux périphériques sont à présents supportés.
USB_ModeSwitch - Activer les périphériques USB commutables (switchables) sous Linux
USB_ModeSwitch est (surprise!) est un outil de switch (changement) de mode pour des clefs USB à fonctions multiples.
Plusieurs nouvelles clefs USB contiennent leur propre driver MS Windows; quand on les insère pour la première fois, ces périphériques agissent comme un périphérique de stockage et installent leur driver. Après cela (et ceci à chaque nouvelle insertion de la clef) ce driver commute (switch) le mode interne, le périphérique de stockage disparait (dans la majorité des cas), et un nouveau périphérique (tel un modem USB) apparaît. Le fabriquant de clés WWAN Option appelle ce dispositif "ZeroCD (TM)".
Comme vous l'aurez suremement noté, il n'existe aucune documentation sous quelque forme que ce soit, et il n'existe pas plus de driver officiel disponible pour Linux. Heureusement nombreux sont les périphériques connus qui fonctionnent avec des divers Linux disponibles tels que "usb-storage" ou "usbserial". Mais celà laisse entier le problème du changement de mode, pour que le périphérique passe du mode "stockage" à ce qu'il est censé faire.
Néanmoins, il existe des choses telles que le raisonnement humain, les applications d'USB sniffing et "libusb". Il est ainsi possible "d'espionner" la communication du driver MS Windows, pour isoler la commande ou l'action qui fait la commutation, et de reproduire la même chose avec Linux.
USB_ModeSwitch facilite grandement la dernière étape en utilisant les paramètres importants contenus dans un fichier de configuration et en réalisant l'initialisation et la communication nécessaires .
A ce jour, il ne vérifie PAS si l'opération s'est correctement déroulée. La meilleure approche serait de consulter /proc/bus/usb/devices (ou la sortie de "lsusb") avant et après l'execution d' USB_ModeSwitch et de noter tout changement.
Pour des conseils concernant la résalisation de votre propre sniffing, merci de vous référer au paragraphe "Contribuez" ci-dessous..
Info de dernière minute : la découverte de ce petit utilitaire dans le code source du routeur Dovado UMR , qui a été publé en conformité avec la licence GPL. Si vous souhaitez connaître les joies de l'utilisation de votre clef 3G sans le "fun" d'une installation sous Linux, vous pouvez envisager d'investir dans ce type de machine.
Téléchargement
La dernière version est la 0.9.6. L'archive contient la source et un fichier binaire 686 (32 bit, VIA C7, GCC 4.2.2). Pour ce faire, le concepteur d'USB_modeswitch a utilisé libusb-0.1.12.
Les changements et mises à jour sont proposées plus régulièrement pour le fichier de configuration que pour le soft lui-même; la majeure partie des informations connues sur les périphériques s'y trouve. Il est donc préférable d'utiliser la dernière version dont le lien est ci-dessous.
Un exécutable préparé pour ARM/OMAP est disponible ICI . D'autres variantes de binaires pour la version 0.9.6 seront prochainement mises en ligne
Comment installer
Si vous souhaitez le compiler vous-même, lancez "compile.sh" ou tapez en console:
$ gcc -l usb -o usb_modeswitch usb_modeswitch.c
C'est aussi simple que ça en a l"air... Et devrait être FACILEMENT transposable (certaines limites sont connues sur les systèmes basés sur FreeBSD).
Prenez le nouvel exécutable "usb_modeswitch" (ou celui fourni avec l'archive) et mettez le dans votre path (de préférence "/sbin" ou "/usr/sbin").
Mettez "usb_modeswitch.conf" dans "/etc" et éditez le en fonction de votre matériel. Le fichier contient une documentation très complète qui devrait vous indiquer ce qu'il est nécessaire de faire.
Alternativement vous pouvez utiliser la toute nouvelle interface en ligne de commande pour dire à USB_ModeSwitch ce qu'il doit savoir; essayez "usb_modeswitch -h" pour lister les paramètres. De cette manière, vous pouvez manipuler des configurations multiples. Si un quelconque paramètre est utilisé en ligne de commande, le fichier de configuration n'est PAS lu.
Important: USB_ModeSwitch - comme tous les programmes qui utilisent libusb - doit être lancé en root. Sinon, d'étranges erreurs feront leur apparition...
Dépannage
Si vous êtes d'avoir les bonnes valeurs pour votre matériel, que vous avez bien suivi les préconnisations (voir le paragraphes "Matériels connus pour fonctionner") et que lancement après lancement USB_ModeSwitch semble avoir une action mais que dans les faits rien ne change, il y a surement une solution à mettre en place.
La majorité des distributions actuelles utilisent "udev" comme dispositif et manageur de branchement à chaud (hotplug), qui, dans certains ca, ne reflète pas les changements sur un périphérique switché, dans certains cas, ce daemon n'est pas en mesure de "dégager" la connexion établie par un périphérique commuté et de le voir comme un périphérique fraîchement inséré.
Il existe plusieurs manières d'analyser et d'aborder le problème:
Sur certains nouveaux kernels, certaines familles de périphériques (Huawei ZTE depuis 2.6.26) ont droit à un traiement particulier dans le code usb-storage, pour activer la commutation. Vous n'avez plus à utiliser USB_Modeswitch : d'un autre côté, vous n'avez plus la possibilité d'accéder à la partie "CD-ROM" de votre périphérique. Ceci dit, il arrive que ce traitement particulier ne donne aucun résultat et qu'il empêche USB_ModeSwitch de fonctionner correctement ensuite (cela est arrivé avec des ZTE, error "-2"
Si vous rencontrez des difficultés, regardez dans le fichier unusual_devs.h situé dans le dossier drivers/usb/storage de votre kernel source. Si vos ID par défaut (vendor et product ID de la partie stockage) se reouvent ici et que vous avez une quelconque erreur en lançantUSB_ModeSwitch, tentez de blacklister "usb-storage". Si cela aide, recompilez votre kernel en commentant (désactivant) cette entrée dans unusual_devs.h
La seule chose qui se produira est que usb_storage fonctionnera par défaut ensuite.
-
Consultez le forum d'usb_modeswitch pour avoir des informations ou faites une demande d'aide sur le forum de Bullteam .
Matériels connus pour fonctionner
NOTE TRES IMPORTANTE
-
Josh le concepteur de cet outil, n'a personnelIement pu tester que son Option Icon; la liste suivante, ainsi que les informations nécessaires repose sur les rapports de tiers. Ne soyez donc pas surpris si vous vous heurtez à des obstacles alors que votre périphérique est listé ici. Vous aurez été prévenus.
Il existe trois méthodes connues pour initialiser le processus de commutation :
1. l'envoi d'une commande standard rarement ou jamais utilisée (équivalente à celle du SCSI) au périphérique
2. éliminer (ou plutôt détacher) le driver de stockage du périphérique
3. envoyer un message de contrôle spécifique au périphérique
-
Comment automatiser le processus
Dites-vous que vous devez lancer USB_ModeSwitch à chaque fois que vous inserez votre clef ou que vous bootez avec. Si vous avez "udev" sur votre distribution il n'est vraiment pas compliqué de l'automatiser et de l'oublier.
Notez qu'un délai avant le lancement du tool est nécessaire avec de nombreuses installations récentes. Si votre commutation automatique est incertaine (irrégulière) le délai dans l'exécution d'USB_ModeSwitch devrait vous aider. Référez-vous au script ci-dessous. Ceci étant dit, depuis la version 0.9.4, cela n'est presque jamais nécessaire.
Vous devriez avoir un dossier nommé "/etc/udev" ou quelque chose de similaire. A l'intérieur de celui-ci (sur certains systèmes dans un dossier "rules.d") vous trouverez quelques fichiers avec l'extension ".rules". Créez-en un nouveau ou éditez-en un existant, (mais par convention pas un "50-quelque_chose.rules"). Par exemple celui nommé "45-hotplug.rules" puisqu'il s'agit de hotplug USB après tout.
Dans le fichier choisi/créé ajoutez/entrez la ligne
SUBSYSTEM=="usb", SYSFS{idProduct}=="<VotreDefaultProdID>", SYSFS{idVendor}=="<VotreDefaultVendID>", RUN+="<VotreCheminVersUSB_ModeSwitch>"
En gros, c'est tout!
A partir de là, il y a plusieurs voies pour poursuivre. Si votre périphérique GSM est reconnu par une version récente du driver of the "option" vous ne devriez plus rien avoir à faire qu'à charger le module (ce dont se charge très certainement udev automatiquement). Certains périphériques switchent sur la class ACM et sont liés au module "cdc-acm" ("USB Abstract Control Model driver for USB modems and ISDN adapters"). Le s ports crées sont nommés "ttyACM0", "..1", etc. au lieu de "ttyUSB0" ...
Sinon si votre (serial) périphérique n'est pas supporté par ce module vous pouvez toujours utiliser use "usbserial", mais vous devez alors communiquer à ce module les IDde votre dispositif (plus une option liée à la performance):
SUBSYSTEM=="usb", SYSFS{idProduct}=="<VotreTargetProdID>", SYSFS{idVendor}=="<VotreTargetVendID>",
RUN+="/sbin/modprobe usbserial vendor=<VotreTargetProdID> product=<VotreTargetVendID> maxSize=4096"
Quant à la différence entre usbserial et option ,voici une citation issue de option.c:
Ce driver existe parce que le driver "normal" ne fonctionne pas très bien avec les modems GSM
Résultat:
- perte de données -- un unique Receive URB est loin d'être suffisant
- contrôle de flux (périphériques Option) non standard
- contrôler le baud rate n'a pas de sens
Il est donc recommandé d'essayer le driver the option en premier lieu. Dans les kernels récent, il reconnaît plusieurs périphériques Option, Huawei and Novatel (et d'autres) directement. Et suivant les mails de développeurs de kernels, il semble qu'il soit entrain de devenir le standard pour les périphériques GSM depuis que de nombreux modèles ont été ajoutés. Dans les derniers kernels, l'entrée du module est "USB driver for GSM and CDMA modems" (Device Drivers / USB support / USB Serial Converter support).
Les périphériques qui fonctionnent avec le driver option qui ne changent pas leurs ID après la commutation semblent avoir des soucis parce que le driver semble voiloir être rattaché avant que le switch ne soit effectué. Dans ce cas, il peut être intéressant de le blacklister et de le charger manuellement avec le script ci dessous après l'execution de usb_modeswitch. Une fois encore, les développeurs travaillent sur le driver option pour sonder la classe de périphérique avant de le lier, ce problème devrait donc être reglé à partir du kernel 2.6.24.
Dans tous les cas si votre périphérique fonctionne bien avec usbserial et que vous n'êtes pas effrayé par l'édition des sources du kerneln pourquoi ne pas juste ajouter les ID vendor et product (après commutation bien-sûr) au driver option. Josh, le développeur d'usb_modeswitch, a tenté l'expérience avec son téléphone portable, et à présent, le module "option" est lié à lui automatiquement lorsqu'il est branché.Regardez vos autres produits inclus dans "option.c" et ajoutez simplement vos ID de la même façon. C'est tout. Deux ou trois lignes dans la majorité des cas. Recompilez, ajoutez votre périphérique à l'une des règles udev (les .rules comme ci-dessus) et faites vous plaisir !
Pour les dispositifs qui conservent leurs ID après commutation, le script "/sbin/mydevice_switch.sh" peut être créé:
#!/bin/sh
/sbin/usb_modeswitch
sleep <QuelquesSecondes> # probablement pas nécessaire, essayez sans /sbin/modprobe usbserial vendor=<VotreDefaultVendID> product=<VotreDefaultProdID> maxSize=4096
Et ensuite ajoutez cette règle:
SUBSYSTEM=="usb", SYSFS{idProduct}=="<VotreDefaultProdID>", SYSFS{idVendor}=="<VotreDefaultVendID>", RUN+="/sbin/mydeviceswitch.sh"
Si la mise en place d'un délai d'exécution est une solution pour votre matériel ou installation, il peut être utilse de différer le lancement de USB_ModeSwitch, pour autoriser d'autres drivers tel "usb-storage" à finir leur activation.
Utilisez alors à nouveau le script appellé ici "/sbin/mydevice_switch.sh" et complétez-e ainsi:
#!/bin/sh
sh -c "sleep 4; /usr/bin/usb_modeswitch" &
exit 0
Luigi Iotti a rapporté des problèmes sur certains systèmes (RHEL 5, CentOS 5) avec udev restant dans l'attente de l'achèvement de certains scripts en tâche de fond.
Dans ce cas la solution pour un "/sbin/mydevice_switch.sh" modifié:
#!/bin/sh
# pour détachr de l'udev
exec 1<&- 2<&- 5<&- 7<&-
sh -c "sleep 4; /usr/bin/usb_modeswitch" &
exit 0
Contribuez
USB_ModeSwitch est tout à fait utilisable pour mener des tests avec votre propre matériel s'il n'est pas encore supporté. Vous pouvez tenter cette approche:
Notez les ID Vendor et Product ID depuis /proc/bus/usb/devices (ou de la sortie de "lsusb"); le driver assigné est habituellement "usb-storage".
Ensuite, tentez de découvrir la communication USB communication vers le périphérique avec la même ID dans M$ Windows.
L'outil suivant est recommandé : SniffUSB
Vous trouverez un excellent exemple par Mark A. Ziesemer ici :
Alltel UM175AL USB EVDO under Ubuntu Hardy Heron
Merci de partager vos avancées, ou les nouvelles informations sur des périphériques que vous auriez découvertes soit sur le forum de Bullteam soit sur le ModeSwitchForum !
Le développeur
Un grand Merci à Josua Dietze de nous avoir permis de vous proposer la traduction des informations qu'il diffuse sur son site. Vielen Dank Josh !