Je retranscris en Français, le message que j'ai posté dans le forum OpenWrt:
Il y a définitivement un bug dans le bloc hardware USB de l'AR9331.
J'ai effectué un simple test avec une Arduino Duemilanove ou une Vinciduino en faisant tourner bitlash avec le simple script suivant sur l'Arduino:
function toggle13 {d13 = !d13;print i;i = i + 1;}
function startup {pinmode(13,1); run toggle13,1000;}
...c'est-à-dire, faire clignoter la LED toutes les secondes, en affichant un compteur monotonique incrémenté à la même cadence sur l'UART à travers l'USB.
Côté TP-LINK TL-WR703N, j'ai juste mis le module driver correspondant au chip USB de l'Arduino (ftdi_sio + usbserial en tant que /dev/ttyUSB0 pour la Duemilanove, cdc_acm en tant que /dev/ttyACM0 pour la Vinciduino), et l'émulateur de terminal simple de BusyBox "microcom" ("microcom -s 57600 /dev/ttyUSB0" pour la Duemilanove, "microcom -s 57600 /dev/ttyACM0" pour la Vinciduino).
La communication plante après un temps variable (allant de quelques minutes à quelques heures), mis en évidence par la LED TX de l'Arduino restant allumée en permanence. L'Arduino continue de fonctionner, car la LED d13 continue de flasher tranquillement toutes les seconds.
Même si vous sortez de microcom, de votre session, ou supprimez/réinsérez le module driver, la communication avec la carte Arduino ne redémarre pas. La seule solution pour remettre les choses en état de marche est de couper le jus de l'Arduino. Si celle-ci est alimentée par l'USB, cela se fait simplement en tapant les commandes :
echo 0 > /sys/classes/gpio/gpio8/value
echo 1 > /sys/classes/gpio/gpio8/value
J'ai constaté que si vous insérez un hub USB passif comme celui décrit dans ce topic, vous pouvez effectuer le même test pendant plus de 10 heures sans problème... Vous pouvez même faire tourner LES DEUX cartes Arduino en même temps sans problème !
De tout ceci, nous pouvons tirer les conclusions suivantes :
- l'Arduino tourne comme un coucou suisse
- ce n'est pas un problème d'alimentation, car j'ai pu faire tourner le hub passif USB + les 2 cartes Arduino en même temps
- ce n'est pas un problème logiciel applicatif du côté du TP-LINK TL-WR703N, car le logiciel est exactement le même dans les deux cas
- si c'est un problème logiciel, c'est un problème de très bas niveau lié aux différences de timing/protocole entre les configurations directe/à travers le hub, mais pas dans le driver USB lui-même, car cela se produit de la même façon dans le driver ftdi_sio + usbserial et le driver cdc_acm, donc cela se passe danas les accès bas-niveau interruptions/accès aux registres/DMA, etc.
- plus probablement, il s'agit d'un bug dans le bloc hardware USB
Cette dernière conclusion confirme seulement que le bloc USB à l'intérieur de l'AR9331 n'est pas très bon, car j'avais déjà constaté que l'AR9331 n'était pas capable de gérer les périphériques USB low-speed comme un simple clavier ou une souris, mais que cela fonctionne à travers un hub USB passif.
La solution: TOUJOURS insérer un hub passif, comme la "Pieuvre", qui intègre un chip hub USB GL850G en boîtier SSOP28. Notez que certains modèles semblables extérieurement, contiennent une puce directement soudée sur le PCB et noyée dans le silicone au lieu du boîtier SSOP28. Ce n'est pas important si vous utilisez le hub tel quel, mais c'est un problème si vous voulez dés-souder le chip pour un hack... Le hub complet est à peu près au même prix que le chip seul, mais vous avez des câbles et des connecteurs USB, un boîtier plastique réutilisable et un PCB avec un quartz en rab
Le fait que le son USB marche et pas les ports série USB n'est pas lié aux endpoints différents, mais est peut-être lié aux types de transactions USB : pour les communications série, des transactions "bulk" sans erreurs sont utilisées avec détection d'erreurs et ré-essais, car une transmission fiable est requise, alors que les données de son (ou de vidéo) utilisent des transactions "isochronous" qui ne garantissent pas une transmissions sans erreur, car normalement ce type de données peut contenir quelques glitches sans que cela ne soit perçu.
C'est juste une supposition, mais étant donnée la nature aléatoire du bug, il semble qu'il y ait un problème lorsqu'une erreur de transmission survient dans le mécanisme de ré-essais, présent seulement dans les transactions "bulk". Cela pourrait être confirmé en insérant de manière TRANSPARENTE un analyseur de protocole USB entre la carte Arduino et le routeur TP-LINK TL-WR703N .