1.  Motivations

Lorsqu'on essaie d'installer Linux sur une carte embarquée mal documentée, une des premières étapes significatives consiste à obtenir des messages de log sur une console série. Parfois le port série est bien identifié comme tel. Parfois il est caché dans un port USB OTG et activé en présentant une valeur de résistance spéciale sur la broche ID. Parfois le port série se résume à des contacts sur un circuit imprimé.

On a appris en 2013 que plusieurs appareils Android de la gamme Google Nexus ont un port série multiplexé avec les signaux audio dans leur prise 3,5 mm. C'est un choix de conception intéressant car :

  • De nombreux appareils mobiles, même les plus compacts, ont une prise audio.

  • Le port USB reste disponible pour d'autres fonctions, ce qui favorise un cycle de développement/test efficace (charger un noyau avec fastboot, examiner la console, etc)

  • Les ports USB risquent de disparaître si le chargement par induction deviennent populaire.

  • D'autres appareils Android semblent avoir des consoles série du même type :

2.  État de l'art

Figure 1.  Niveaux logiques

Niveaux logiques

Ces billets présentent plusieurs tentatives pour accéder à la console série de divers appareils Nexus, avec des interrogations sur les tensions à respecter :

Attention.  Je ne recommande pas de suivre ces instructions à la lettre. Ces réalisations utilisent des adaptateurs USB-UART 3,3 V et des diviseurs de tensions résistifs, d'où des signaux sensibles aux parasites, une consommation excessive et des incompatibilités entre niveaux logiques. L'objet du présent article est de faire mieux. Qu'un noyau chargé ne produise pas de logs sur sa console est déjà suffisamment frustrant ; je ne veux pas en plus avoir à me préoccuper de câbles défectueux ou de ports série grillés.

Ces documents révèlent plusieurs informations intéressantes :

  • Lorsqu'on injecte une certaine tension sur la broche MIC, la prise passe du mode audio au mode série.

  • Les niveau logiques RX/TX sont vraisemblablement 1,8 V.

  • Sur certains appareils il faut activer la console série au moyens de paramètres sur la ligne de commande du noyau.

  • Dans le cas du Nexus 7, au premier abord la console série est déjà activée par console=ttyHSL0,115200,n8, mais le bootloader ignore cette partie de la ligne de commande pour une raison indéterminée.

  • Ces commits conduisent au code source pertinent :


3.  Implémentation de référence (2015)

Le cahier des charges de Google pour les prises audio de tous les appareils Android ([WAHS]) confirme que le brochage respecte généralement la norme CTIA/AHJ : (tip) LEFT - RIGHT - GROUND - MIC (sleeve).

La tension de polarisation du microphone peut varier entre 1,8 V to 2,9 V. On peut donc s'attendre à ce que la tension seuil pour activer le port série soit supérieure à 2,9 V ; mais Google a également pu choisir une tension de polarisation dans le bas de la fourchette pour ses appareils Nexus.

En mai 2015 Google a publié le schéma, selon toute vraisemblance, de l'adaptateur utilisé en interne ([DEBUGCABLE], annoncé ici) sans pour autant garantir aucune compatibilité ("No Warranty expressed or implied"). En fait c'est tout le dossier de fabrication qui est disponible, et vous pourriez l'envoyer à une usine au lieu lire le reste de cet article.

  • L'adaptateur comporte un régulateur 1,8 V qui alimente l'entrée VCCIO d'un convertisseur USB-UART FT232R.

  • L'adaptateur comporte un second régulateur apparemment censé fournir 3.36 V. D'après les valeurs des composants, les tolérances et les fiches techniques ([TPS717]) la plage réelle est 3,30 - 3,49 V.

    Cette tension est injectée dans l'entrée MIC à travers un thermistor PTC de 33 Ohm (Ihold=36mA et Itrip=71mA d'après la fiche technique ; Ihold=29mA and Itrip=61mA d'après la nomenclatures).

    Pourquoi ne pas avoir utilisé le régulateur 3,3 V intégré dans le FT232R ? Peut-être ne fournit-il pas suffisamment de courant pour vaincre la tension de polarisation du microphone, ou peut-être a-t-il été jugé trop imprécis (la plage garantie est 3,0 - 3,6 V d'après [FT232R]).

4.  Adaptateur USB vers console série sur fiche audio avec niveaux logiques 1,8 V

En attendant que quelqu'un commercialise l'adaptateur de Google, j'utilise les bricolages ci-dessous.

4.1.  Modification d'un cordon FTDI TTL-232RG 1,8 V

Le FTDI TTL-232RG-VREG1V8-WEFTDI TTL-232RG-VREG1V8-WEFTDI TTL-232RG-VREG1V8-WEFTDI TTL-232RG-VREG1V8-WE est un adaptateur USB-UART avec des niveaux logiques de 1,8 V Malheureusement sa sortie VCC (fil route) est aussi à 1,8 V, et la ligne 3,3 V n'est pas accessible hors du boîtier en plastique moulé ([TTL-232RG-VREG1V8-WE]).

Le produit était entièrement noir sur la photo du catalogue mais l'exemplaire que j'ai reçu avait une prise transparente ; j'ai donc pu le découper à chaud pour atteindre les contacts pertinents.

ftdi_c7.jpg

ftdi_jp4.jpg

ftdi_c7cut.jpg

ftdi_redcut.jpg

J'ai dessoudé le fil rouge et je l'ai raccordé à travers une résistance de 33 ohm à 3V3OUT sur C7 (également atteignable sur JP4).

ftdi_resistor.jpg

J'ai vérifié que 3V3OUT fournit exactement 3,30 V. Comme indiqué plus haut, la fiche technique garantit seulement une plage de 3,0 V (potentiellement trop faible pour activer le port série) à 3,6 V (potentiellement dangereux).

Pour finir, j'ai refermé le boîtier avec de l'époxy.

Notons que la bonne vieille fiche jack audio 3.5 mm n'est pas un connecteur très sûr. Si le contact MIC est mis à la terre, le FT232R ne pourra pas maintenir 3V3OUT à 3,3 V (le courant maximum est 50 mA d'après [FT232R]). Comme le FT232R utilise 3V3OUT pour alimenter sont interface USB, cela peut poser des problèmes. Pour la même raison, si le contact MIC est porté accidentellement à une tension excessive, celle-ci pourrait atteindre l'ordinateur hôte par le port USB. J'aurais utilisé un fusible PTC, comme Google l'a fait, si j'en avais eu un en stock.

Tableau 1.  Branchements pour l'adaptateur à base de cordon TTL-232RG

TTL-232RG signalTTL-232RG wireAudio wireAudio signal (CTIA/AHJ)Jack contactDevice console signal
RXYellowWhiteLeftTipTX
TXOrangeRedRightRing 1RX
GroundBlackShield/YellowGroundRing 2Ground
3V3OUTRed (re-wired)Yellow/ShieldMicSleeveDetect

Figure 2.  Android contrôlant la console de son propre noyau

#turinglocks #singularity #skynet #RotM
Android contrôlant la console de son propre noyau


4.2.  Ajout d'une alimentation 1,8 V à un adaptateur à base de FT232R

Cette variante devrait être plus facile à fabriquer, mais moins compacte.

Composants :

PAS ENCORE TESTÉ.


Bibliographie

[WAHS] Wired Audio Headset Specification (v1.1). http://source.android.com/accessories/headset/specification.html.

[DEBUGCABLE] USB debug cable design documents. https://android.googlesource.com/device/google/debugcable.

[TPS717] TPS717xx Low-Noise, High-Bandwidth PSRR, Low-Dropout, 150-mA Linear Regulator. http://www.ti.com/lit/gpn/TPS717.

[TTL-232RG-VREG1V8-WE] TTL-232RG TTL to USB Serial Converter Generic Cables. http://www.ftdichip.com/Documents/DataSheets/Cables/DS_TTL-232RG_CABLES.pdf.