M: Type d'encodage du billet
1: Une seule correspondance enregistrée sur ce billet
Bxxxx/XAVIER MR : Nom/Prénom, titre
E: Billet électronique
U4ABCD: Code de réservation du billet
LHR: Code IATA de l'aéroport de départ (London Heathrow)
MUC: Code IATA de l'aéroport de destination (Munich)
BA: Code IATA de l'opérateur (British Airways)
0956: Numéro du vol
040: Date du vol (9 Février, 40ème jour de l'année)
M: Type de compartiment et code de tarif propre au transporteur (classe économique non-remboursable)
009F: Numéro de place
0087: Sequence d'embarquement, 87ème personne à imprimer le boarding pass
1: Statut du passager?
3C: ?
>: Début de la section de sécurité (102 caractères)
E-Billet Lufthansa
Ce billet a été envoyé par e-mail par le transpoxxxxr après avoir chocodela place.
M: Type d'encodage du billet
1: Une seule correspondance enregistrée sur ce billet
Bxxxx/XAVIER : Nom/Prénom, titre
E: Billet électronique
ES9ABC: Code de réservation du billet
LYS: Code IATA de l'aéroport de départ (Lyon Saint-Exupéry)
MUC: Code IATA de l'aéroport de destination (Munich)
LH: Code IATA de l'opérateur (Lufthansa)
2253: Numéro du vol
330: Date du vol (26 Novembre, 330ème jour de l'année)
M: Type de compartiment et code de tarif propre au transporteur (classe économique non-remboursable)
012F: Numéro de place
0045: Sequence d'embarquement, 45ème personne à imprimer le boarding pass
3: Statut du passager?
5D: ?
>: Début de la section de sécurité (102 caractères)
J'ai toujours voulu afficher n'importe quoi sur l'afficheur au centre du tableau de bord, qui affiche normalement la station de radio et l'heure, et il se trouve que c'est tout à fait possible.
Hardware
Ici, on a un autoradio Renault/VDO Tuner List (modèle 22DC259/62T, 77 00 434 422) et un afficheur Renault (82 00 028 364), avec un connecteur gris connecté au tableau de bord et à la radio, et un connecteur rouge connecté aux commandes situées sous le volant.
Je n'ai pas eu confiance dans les documentations que j'ai pu trouver, avec des couleurs de fils incorrectes, des brochages de connecteurs parfois à l'envers, différentes version de l'afficheur ou de l'autoradio.
Mais ce n'est pas un problème, il suffit de démonter pour vérifier qu'on ne va rien faire de dangereux. On peut rapidement identifier les pins à la masse, ceux des alimentations, et certains signaux de puissance.
Connecteur Gris :
NTC
GND
NC
NC
GND
Éclairage feux? (in)
Éclairage backlight? (in)
+12V (contact?, in)
+12V (permanent?, in)
NC
GND
LCD_ENABLE (12V, in)
SDA (TTL, io)
SCL (TTL, io)
!MRQ (TTL, io, active-low)
Connecteur Rouge (TTL) :
NC
NC
NC
NC
NC
NC
NC
NC
Commun 1
Retour A
Commun 2
Retour B
Commun 3
Retour C
NC
Ça permet de comprendre la majorité du câblage :
Et on peut aussi reverse-engineerer la matrice des boutons utilisés pour les commandes au volant:
Fonction
Pin commun
Pin retour
OK
A
1
VOL-
A
2
VOL+
A
3
Source L
B
1
Source R
B
2
Pause
B
3
Molette 1
C
1
Molette 2
C
2
Molette 3
C
3
Curieusement, la molette n'est qu'un interrupteur rotatif à 3 positions, ça suffit à détecter le sens de rotation ça donne l'impression de bien plus de positions (6 par tour).
Câble
Dans ce cas, la solution la plus pratique est de prendre une rallonge avec des câbles mini-ISO branchés sur l'autoradio, de couper chaque fils et de les brancher sur un connecteur à 0.1", pour y mettre des cavaliers pour une connection directe, des fils en Y pour espionner le bus ou bien des fils vers un MCU ou un analyseur logique.
Connecteur jaune C1 :
SDA (TTL 5V)
SCL (TTL 5V)
!MRQ (TTL 5V)
LCD_ENABLE (+12V)
GND
On peut se contenter de n'utiliser que ce connecteur pour afficher ce que l'on veut, et reverse-engineerer une partie du protocole.
Comme je ne voulais pas décharger la batterie ni passer plusieurs heures dans le froid, j'ai préféré démonter l'afficheur et l'autoradio pour les utiliser à l'intérieur.
Protocole
Ça nous avance bien de connaître le matériel, mais il faut encore comprendre comment l'autoradio communique avec l'écran LCD.
Pour ça, on va utiliser un analyseur logique (Cypress FX2 et sigrok/pulseview) et regarder tout ce qui passe sur le bus i2c.
On peut voir que le bus i2c fonctionne à 7.14kHz et que le signal !MRQ est constamment tiré à 0 avant que quelque chose ne soit transféré sur le bus.
En débranchant le signal MRQ de chaque côté, on peut voir que l'afficheur le force à 0 en attendant une trame de l'autoradio, mais que l'autoradio le force aussi à 0 avant d'envoyer une tram à l'autoradio. On peut aussi voir que l'autoradio est maître sur le bus i2c, et identifier l'adresse de l'écran LCD (0x23).
On peut voir plusieurs messages de 2 octets de long [0x01, 0x10] ou [0x01, 0x11], demandés au moins toutes les 500ms par l'autoradio (initié par l'afficheur qui tire le signal MRQ à 0, puis répond lorsque l'autoradio envoie une requête).
Commandes au volant
Il y a aussi une trame répondue par l'afficheur lorsqu'on appuie sur un bouton des commandes au volant, et qui permet de déduire le code de chacune des commandes au volant. L'afficheur tire le signal MRQ à 0, l'autoradio envoie une requête, puis l'afficheur envoie la trame correspondant aux boutons pressés.
Bouton
octet 0
octet 1
octet 2
octet 3
octet 4
action
OK
0x04
0x82
0x91
0x00
0x00
press
OK
0x04
0x82
0x91
0x00
0x40
hold
Source R
0x04
0x82
0x91
0x00
0x01
press
Source R
0x04
0x82
0x91
0x00
0x81
hold
Source L
0x04
0x82
0x91
0x00
0x02
press
Source L
0x04
0x82
0x91
0x00
0x82
hold
Volume +
0x04
0x82
0x91
0x00
0x03
press
Volume +
0x04
0x82
0x91
0x00
0x43
hold
Volume -
0x04
0x82
0x91
0x00
0x04
press
Volume -
0x04
0x82
0x91
0x00
0x44
hold
Pause
0x04
0x82
0x91
0x00
0x05
press
Wheel up
0x04
0x82
0x91
0x01
0x41
Wheel down
0x04
0x82
0x91
0x01
0x01
Les valeurs 0x41 et 0x42 pour le dernier octet sont aussi interprétées par l'autoradio comme les boutons Source R et Source L maintenus appuyés, et il n'y a pas de code lorsqu'on maintient appuyé le bouton Pause ou pour la molette.
Affichage
L'afficheur est rafraichi uniquement en cas de besoin, on peut l'observer en appuyant sur un bouton de l'autoradio, qui va forcer le signal MRQ à 0, puis va envoyer une trame entre 13 et 16 octets avec les caractères à afficher.
Affichage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
98.5
0x0f
0x90
0x7f
0x29
0xff
0x3f
0x35
0x81
0x20
0x20
0x20
0x20
0x39
0x38
0x35
0x20
CASS [=]
0x0f
0x90
0x7f
0x55
0xff
0xff
0x60
0x01
0x43
0x41
0x53
0x53
0x20
0x04
0x05
0x06
BAYERN 3
0x0f
0x90
0x7f
0x55
0xff
0x3f
0x75
0x01
0x42
0x41
0x59
0x45
0x52
0x4E
0x20
0x33
Bingo ! Les trames à partir de l'octet 9 ressemblent à de l'ASCII (les caractères clignotent si le MSB est à 1), l'octet 7 permet d'afficher le point décimal et le digit de mémoire/piste, et l'octet 6 permet d'afficher les pictogrammes Tuner Preset, Tuner Manu, Dolby et MSS.
Programme
On va remplacer l'autoradio par un Arduino Mega (n'importe quel micro-contrôleur avec un périphérique i2c et des IO TTL suffit), pour pouvoir écrire sur l'afficheur et lire l'état des boutons.
Avec un Atmel AVR, il faut forcer le bitrate/prescaler à environ 7kHz avec les lignes suivantes: void conf() {
TWBR = 0xff;
TWSR = 0x01;
}
Comme c'est un programme de test qui n'a qu'une seule fonction et un MCU surpuissant pour son utilisation, il est possible d'écrire un code peu optimisé (polling au lieu d'interruptions, copy/paste).
On va initialiser l'écran en envoyant quelques trames [0x01, 0x10] et [0x01, 0x11], puis on peut écrire un peu ce qu'on veut : void writerandom(byte *data, int len) {
while(digitalRead(2)); // polling the MRQ line
Wire.beginTransmission(0x23);
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.write(data, len);
Wire.endTransmission();
}
Dans ce cas, on peut commencer par copier/coller des trames récupérées en sniffant celles envoyées par l'autoradio, puis on va reverse-engineerer le protocole complet en bouclant sur tous les caractères entre 0x00 et 0xFF, et en testant les pictogrammes.
On va aussi pouvoir lire l'état des boutons, qui sont des trames de 5 octets : void read01() {
while(digitalRead(2)); // polling the MRQ line, pulling the MRQ line low and waiting 500us also works
conf(); // overwrites the bitrate/prescaler after the Wire lib configures the i2c
Wire.requestFrom(0x23, 5);
TWBR = 0xff;
TWSR = 0x01; // 0x00 appears to work as well
for(i = 0; i < 5; i++) {
READDATA[i] = Wire.read();
}
}
Références
RTA 120.1 Renault Mégane/Scénic 1 1999-2003 (page 177, section essence)
Manuel de Réparation Renault MR312-8 (pages 165-166)
Manuel Renault/Philips MR-Radiosat-6000-10 (pages 34-36)
J'ai un autoradio Tuner List (Renault/VDO, modèle 22DC259/62T), avec un lecteur cassettes qui m'est inutile, mais je voulais ajouter une entrée analogique pour y brancher un smartphone ou un lecteur audio.
/!\ Danger La tension maximale n'est que de <15V, mais tout est sous tension, même lorsque le contact n'est pas mis, ou que l'autoradio est éteint. Le fusible permet de sortir 15A, largement de quoi tout casser et se blesser avant qu'il ne fonde. /!\ Warning The maximum voltage is only <15V, however, the radio is always powered, even when switched off or when the engine is turned off. The fuse is rated for 15A, more than enough to blow the radio and hurt yourself before it melts.
Démontage
Sur les Renault Mégane, la face avant de l'autoradio est plus large que celle des autres voitures, mais les fixations sont à peu près au même standard.
Il suffit d'insérer deux clous de 4mm dans les deux trous en bas sur les côtés, pousser les clous vers l'extérieur, et de faire bouger l'autoradio sur les côtés en le tirant. Deux mains sont nécessaires, mais c'est faisable sans outils spéciaux.
Une fois l'autoradio tiré, il y a un connecteur DIN/ISO (parfois séparé en deux parties) à gauche, puis un connecteur (jaune dans ce cas), pour relier les commandes au volant et l'afficheur (I²C). Il y a aussi parfois aussi un connecteur (bleu) dans le cas où un chargeur de CD serait présent. Le câble d'antenne (Coax à droite) est aussi à débrancher. Il est souvent clipsé à l'arrière de l'autoradio.
Code
Quand l'alimentation de l'autoradio a été débranchée, il est nécessaire d'entrer un code (normalement fourni, sinon trouvable à partir du numéro de série).
Quand l'autoradio affiche "0000", avec le premier '0' clignotant et qu'il faut entrer le code "1234", il faudra taper une fois sur la touche "1", une fois sur la touche "2" pour choisir le 2nd caractère (qui doit clignoter), puis deux fois sur cette touche (l'écran doit afficher "1200"), idem avec les touches 3 et 4 pour les derniers digits.
Une fois le code complet, il faut maintenir la touche 6 appuyée jusqu'à ce que l'autoradio fonctionne normalement.
Teardown
Le haut de l'autoradio se démonte simplement en déclipsant 4 clips avec un tournevis plat.
Il faut retirer deux connecteurs Würth WR-MM et dévisser 4 vis Torx T8 pour démonter le lecteur de cassettes en le tirant vers l'arrière (il faut retirer la cassette présente avant de retirer le lecteur).
La carte n'a de composants que sur la face, le PCB vertical à l'arrière contient uniquement le tuner FM/AM, et le PCB vertical à l'avant supporte des boutons poussoirs et des LEDs.
Il y a 3 composants qui nous intéressent :
TEA0676T : Préampli de cassette, à proximité du connecteur WR-MM à 4 pins des têtes du lecteur de cassette
93CW44DF : Microcontrôleur OTP ou ASIC custom, sans documentation, semble tout contrôler
TAA276H (TDA7385H) : Ampli de puissance 4*20W (bridge)
Les autres gros circuits intégrés concernent le tuner, l'ampli de puissance ou de la glue logique.
Sur cet autoradio, il est possible d'utiliser l'entrée SPDIF (disponible sur le connecteur du chargeur de CD), mais le périphérique doit communiquer avec l'autoradio (RS232 0-12V, 9600, 8N1).
Entrée
Le circuit SAA7708H supporte 3 entrées analogiques (phone, tape, CD), mais elles sont contrôlées par le chip 93CW44DF (contrôle par un bus I²C).
Comme le lecteur de cassettes ne me sert pas, je vais câbler l'entrée à la place de celui-ci.
Au niveau des têtes de lecture, le niveau est très faible (~1mV), et surtout le signal est remis en forme (filtres, égaliseur). Il est nettement plus simple de récupérer le signal en sortie du préampli (signal déjà égalisé, filtré et amplifié), à environ 1V (compatible avec une sortie casque/ligne au volume maximal).
En regardant entre la sortie du TEA0676T l'entrée du SAA7708H, on voit des capacités pour bloquer une composante DC, et un filtre passe-haut (entrée d'ADC). On va donc câbler l'entrée juste à la sortie du TEA0676T.
Les pins 1 et 16 sont dessoudés et isolés de leurs pastilles, et le câble d'entrée est soudé sur des points de test et la masse sur un plan.
Après un test, l'entrée fonctionne uniquement si le lecteur de cassettes (connecteur à 10 pins) est branché et si une cassette est présente (il n'y a pas besoin de brancher le câble à 4 pins).
Lecteur de cassettes
Par un peu de rétro-ingéniérie, il est possible d'identifier chaque signal du connecteur WR-MM à 10 pins :
Pin
Fonction
1
Auto-reverse switch
2
GND
3
Presence switch (C)
4
Presence switch (T)
5
Motor (+)
6
Mute switch
7
Solenoid
8
Solenoid
9
NC
10
CrO2 switch
Avec quelques tests, seulement les fils en gras sont utiles pour activer le lecteur de cassette.
Le pin 6 (Mute switch) est à relier au pin 2 (GND). Les pins 2 et 3 (presence switch) sont à relier entre eux.
Remarques
Attention, il y a très peu de place entre le volant et le levier de vitesse, un faux mouvement fait vite des dégâts. En pratique, il faut isoler le mécanisme de cassette et le PCB de contrôle avec des sachets antistatiques, et aussi débrancher le connecteur WR-MM à 10 pins avant chaque modification.
À la moindre erreur, il peut y avoir de gros dégâts :
L'autoradio est soumis à de larges cycles de température et doit supporter des vibrations. Pour cela, tous les câbles ont été isolés avec de la gaine thermo-rétractable ou plusieurs couches de ruban de kapton ou de vinyl.
Il faut aussi prendre en compte le fait que le jack peut être tiré depuis l'extérieur. Un simple noeud permet d'éviter de casser les soudures.
Les boutons eject et avance/retour rapide ont été fixés par des morceaux de PVC pris en sandwich entre la face avant et le haut du boitier. Il a été nécessaire de percer les boutons pour laisser passer le câble.
.
Avec mon lecteur audio Sandisk Sansa et mon smartphone HTC Desire X, le volume doit être au maximum pour avoir le même volume que le tuner FM, mais le son est bien en stéréo et de bonne qualité.
Description
J'ai récupéré une alimentation HP ESP-135 qui vient d'un HP Proliant DL-380 G4 et fabriquée par Lite-On (modèle PS-3601-1C).
Ces alimentations peuvent se monter par paire et sont "hot swap". Par contre, je n'ai pas récupéré la carte d'interconnection entre les alimentations et la carte mère et qui permet de contrôler l'alimentation. Du coup il faudra faire un peu de reverse-engineering pour la faire fonctionner.
D'après l'étiquette, l'alimentation a un rail +5V (standby) sortant 7A, et un rail +12V capable de sortir 47A (600W).
Mesure
Le soucis, c'est que la connectique n'est pas documentée et ne respecte aucun standard, on peut trouver les lames de gauche qui sont reliées à la masse, et celle de droite au +12V (reliées par des busbars à l'intérieur).
Alimentation branchée, mais arrêtée :
+5V
+5V
+5V
3~5V
0V
4.6V
0.2V
0V
0,2V
4.6V
1.5V
0V
Les pins en rouge sont des rails d'alimentation et ceux en bleu sont des signaux logique ou de feedback (forte impédance)
En identifiant un peu et en regardant le marquage sur le PCB, on peut trouver quelques signaux :
Identification :
+5V SB
+5V SB
+5V SB
FAN_V (out)
-12V
PS_ON_1?
12V FB?
GND
GND_FB?
PS_ON_2?
?
5V_FB?
Uniquement les signaux en vert sont écrits explicitement sur le circuit imprimé. Les autres ont été "devinés" en mesurant et en testant.
Si on relie les deux signaux PS_ON à la masse (pins 6, 8 et 10), l'alimentation démarre.
Alimentation démarrée :
+5V
+5V
+5V
3~12V
-12V
0V_
12V
0V
0.2V
0V_
1.5V
4.5V
Câblage
Comme avoir des câbles qui pendent autour du connecteur n'est pas très pratique, j'ai voulu avoir un interrupteur en façade de l'alimentation.
Le PCB de connectique est relié à la carte principale de l'alimentation par des busbars et quelques câbles. Le connecteur CN8 est relié à un autre PCB de contrôle de l'alimentation.
Les signaux qui nous intéressent, PS_ON_1 et PS_ON_2, sont respectivement sur les pins 3 et 6 du connecteur CN8. On peut trouver un point de masse sur le connecteur de la LED D910.
Pour éviter que l'alimentation ne fonctionne dans un serveur, on va enlever les fils 3 et 6 du connecteur CN8 et les câbler directement sur l'interrupteur.
J'ai utilisé un interrupteur bipolaire pour limiter la casse (je ne sais pas comment la carte-mère commande l'alimentation), mais on peut voir d'autres montages où les deux signaux PS_ON_1 et PS_ON_2 sont reliés en permanence.
Notes
La vis située à côté des busbars est l'unique point qui relie la masse du secondaire au le châssis de l'alimentation. Il faut noter que les transistors Q300 et Q302 (PFC?) chauffent avec l'alimentation à vide, lorsque la masse est isolée. Dans le cas où on voudrait mettre plusieurs alimentations en série (ce qui n'est pas une bonne idée), c'est ce point-là qu'il faut isoler.
Il y a quelques semaines, un de mes disques durs s'est arrêté de fonctionner. Ça a été l'occasion de tenter de le réparer, et de voir s'il était possible de réparer d'autres disques en stock.
Hitachi Deskstar 7K3000
J'ai acheté deux disques identiques, de modèle HDS723020BLA642 (2To, 7200rpm, SATA 6Gbit/s) en août 2011.
Jusqu'en juin 2013, les deux disques fonctionnaient 24h/24 dans mes deux serveurs, dont les données étaient synchronisées quotidiennement.
Après 2013, un des deux disque n'a servi que pour des sauvegardes plus ou moins régulières.
En juin 2016, j'ai démarré le disque pour une sauvegarde, mais il n'a jamais fonctionné, même après plusieurs tests.
Curieusement, c'est le disque qui a le moins servi (< 200 start-stop, < 20 000 heures, température < 40°C) qui ne fonctionne plus.
Identification
Comme il n'y a pas de rotation du moteur ni de mouvement des têtes (d'habitude audibles), et que le disque n'est pas détecté par le PC, je suppose que le problème vient de l'électronique et pas de la mécanique ou du stockage.
Il y a quelques marquages sur le PCB (référence : 110 0A90302 01), mais aucune documentation, datasheet ou schéma n'est accessible, il y a quelques forums qui montrent des points de tests, mais ce n'est pas forcément facile à tester (le PCB est face contre le disque) ni fiable (certaines infos se contredisent).
Un cas typique à l'air de venir de fusibles sur les rails 5V et 12V à proximité de diodes transil (TVS), mais tout est en bon état de ce côté là, et le disque consomme un peu sur le rail 5V. En testant le non-court-circuit des capacités, transistors/MOS et diodes, et la continuité de toutes les inductances, résistances de puissance, diodes et fusibles, je suis arrivé à un composant ressemblant beaucoup à un fusible (ou une capacité en mica, peu probable ici) ouvert.
Réparation
Après l'avoir remplacé par un fusible 2A temporisé (il n'y avait aucun marquage clair d'origine, mais ça devrait se couper en cas de court-circuit franc), il n'y a toujours aucun fonctionnement, et le fusible est encore conducteur. FAIL! Si quelqu'un a un disque Hitachi Deskstar 7K3000 Hors-service avec le même PCB 110 0A90302 01, vous pouvez me contacter, je serais curieux de faire quelques tests. If anyone has a non-working Hitachi Deskstar 7K3000 with a 110 0A90302 01 PCB, feel free to contact me, I would be interested to perform a few more tests.
Update (07.2016) :
Le fusible n'en est pas un. Il s'agit d'un accéléromètre piezo (d'où une capacité de quelques centaine de pF et pas de résistance parallèle quand je l'ai mesuré) et sert à détecter les chocs (probablement pour la garantie). Son remplacement par un fusible n'a rien dû changer...
IBM (HP) Ultrastar 36LZX
J'avais récupéré un array RAID de disques DDYS-T18350 (18.4Gio, 10krpm, SCSI Ultra 3) dans un serveur HP, et l'un d'eux ne fonctionnait pas. Je l'avais remplacé sans me poser de questions il y a plusieurs mois, mais je l'avais mis de côté pour une autopsie.
Identification
Le disque avait un comportement curieux, avec des temps d'accès très lents, quelques redémarrages, et la carte RAID qui affichait un problème pour ce disque.
J'ai supposé un problème mécanique, mais j'ai commencé par démonter le disque de son rack, et j'ai trouvé une capacité 0402 au fond du rack...
Réparation
Avec une soudure un peu grosse, mais faite avec du matériel accessible (panne de fer de 1.2mm, pas de flux, étain au plomb, pince à épiler), il y a quand même de quoi replacer proprement quelques composants en boitier 0402.
Résultat
Le disque est détecté par la carte SCSI, mais renvoie l'erreur "Disk not ready", et le système d'exploitation renvoie un timeout pendant la detection des disques. L'absence de capacité a peut-être causé d'autres dégâts, ou alors c'est une coïncidence (probablement un choc durant le transport).
J'avais récupéré un KVM qui avait quelques défauts (image bruitée sur certains canaux, clavier non-fonctionnel avec certains PC) et ne m'était pas utile. De ce fait, je n'ai gardé que le boîtier en acier et la face avant pour l'utiliser dans un projet de préampli.
Face avant
Il y a un PCB avec 2 latches 74HC273 et un latch 74HC374, 9 boutons poussoirs, 16 LEDs et un buzzer. Chaque groupe de boutons et de LEDs est relié à un latch, relié à un bus 8 bits.
Le second bus sert au contrôle des latches, du buzzer et du switch de droite.
Pinouts
Control_bus :
BUZ: 0
SWI: 1 (input)
!CLR: 2 (active low)
CLKG: 3 (green)
CLKR: 4 (red)
!OE: 5 (active low)
CLKS: 6 (switches)
NC: 7
Vdd: 8 (+5V)
Vdd: 9 (+5V)
Vdd: 10 (+5V)
Data_bus :
DATA: [0..7] (TTL in/out)
Vss: 8 (GND)
Vss: 9 (GND)
Vss: 10 (GND)
Interface bas-niveau
Pour commencer, j'ai utilisé un Arduino Mega en reliant le bus de données sur le port F ([A0..A7]), et le bus de contrôle au port K ([A8..A15]).
La fonction ledOut() permet d'allumer les LEDs vertes et rouges en fonction des variables ledG et ledR (uint8_t).
void ledOut(void) {
//set bus out
DDRF = 0xFF;
// clear latches
PORTK &= ~_CLR;
ndelay();
PORTK |= _CLR;
// reset bus
PORTF = 0x00;
//write bit
PORTF |= ledG;
ndelay();
//write CLK up
PORTK |= CLKG; //1st row
ndelay();
//write CLK down
PORTK &= ~CLKG;
//reset bus
PORTF &= ~ledG;
//write bus
PORTF |= ledR;
ndelay();
//write CLK up
PORTK |= CLKR; //2nd row
ndelay();
//write CLK down
PORTK &= ~CLKR;
//reset bus
PORTF &= ~ledR;
}
La fonction swIn() écrit l'état des interrupteurs dans les variables swstatus et oldswstatus.
void swIn(void) {
// save old value
oldswstatus = swstatus;
//set bus in
DDRF = 0x00;
//write CLK (up)
PORTK |= CLKS;
ndelay();
PORTK &= ~CLKS;
ndelay();
//write !OE
PORTK &= ~_OE;
ndelay();
ndelay();
ndelay();
//read bus
swstatus = ~PINF;
//write OE
PORTK |= _OE;
//set bus out
//DDRF = 0xFF;
//Serial.print(swstatus);
}
Ici, la macro ndelay() est équivalente à un NOP, soit 1 cycle à 16MHz (62.5ns). Le latch 74HC374 est donné pour supporter un temps de transition de 45ns, en pratique, la transition entre !OE et les sorties donne quelques glitches lorsqu'on attend que 125ns, et le fonctionnement est correct avec une pause de 187.5ns (3 NOPs à la suite).
Écran
En général, il est assez facile de récupérer des écrans bas de gamme agés de 5 à 10 ans. Pour la majorité, le rétro-éclairage de l'écran clignote, puis finit par s'éteindre. En général, ce problème est dû à la faible durée de vie de certaines capacités (souvent sous-dimensionnées en ESR, en courant et en température). Parfois, les diodes de redressement s'abiment du fait des pics de courant non-absorbés par les capas usées. Mais en général, une réparation coûte moins de 5EUR.
Sur cet écran (plutôt milieu de gamme), le fusible côté secteur était fondu et les capacités du côté secondaire étaient en bon état.
/!\ Danger Des tensions dangereuses sont présentes sur la carte d'alimentation, ne rien toucher sans l'avoir débranchée et déchargé la capacité primaire. /!\ Warning Dangerous voltages are present on the power board, do not touch it until it is unplugged and its primary capacitor is discharged.
Panne
Sur ces écran, seulement la carte d'alimentation (modèle 715G1502, fabriquée par AOC) est défectueuse, la dalle et la carte gérant l'affichage sont encore fonctionnelles.
En regardant la carte d'alimentation, la capacité qui lisse la tension du secteur (C905) fuit légèrement, et le mosfet de découpage (Q903) a l'air d'avoir bien chauffé.
En sortant le multimètre, la capa de lissage n'est pas en court-circuit et n'a pas de résistance de fuite trop faible, par contre le mosfet de découpage est en court-circuit.
Après remplacement par un MOS équivalent, l'écran s'allume, mais le transformateur couine par intermittances à 100Hz, et le mosfet est brûlant (>100°C au toucher).
Mon voltmètre affiche "Hors-Calibre" quand je mesure la tension hachée au primaire du transformateur flyback (AC) et sur la capacité de lissage (DC).
Avec un autre voltmètre (2kV max), je mesure entre 500V et 800V DC et 200V AC aux bornes de la capacité C905, et du coup je n'ose pas mesurer au primaire du transfo...
Réparation
Cette carte converti la tension du secteur en +5V et +12V, permanents, avec un convertisseur flyback. Un deuxième convertisseur (activé uniquement quand l'écran fonctionne) convertit le +12V en 800V~2kV pour les tubes CCFL du rétroéclairage.
Comme la partie primaire ne fonctionne pas, et que le secondaire a des diodes de redressement fonctionnelles, on peut alimenter les sorties +5V et +12V directement, tant que le primaire n'est pas branché.
La première réparation rapide a concisté à brancher directement une alimentation de PC (connecteur Molex 8981) sur les pistes du +12V (Cathode de D902) et +5V (Cathode de D904). Ça fonctionne, mais l'encombrement des connecteurs et les câbles empêchent de fermer la coque de l'écran et d'éloigner l'écran de l'alimentation.
La réparation définitive conciste à scier le primaire et le secondaire de l'alimentation (seule la partie "inverter" pour le rétroéclairage CCFL est gardée).
On ajoute un régulateur à découpage 12V -> 5V à base de LM2576 et une banque de capacités de découplage pour les rails 5V et 12V.
Le rail 12V est fourni par une alimentation externe (12V, >3A), via un connecteur "barrel" (DIN 45323 5-2mm ou IEC 60130-10 type A).
Le câblage du connecteur CN902 est identifiable :
Il faut bien isoler la carte d'alimentation 12-5V, et utiliser du scotch isolant pour fixer la carte et les câbles.
Le seul défaut vient de la résistance DC du câble et du connecteur, qui fait légèrement chauffer le câble et le connecteur).
Hardware
C'est un lecteur de DVD de salon vendu entre 2005 et 2007. Il date du moment où les lecteurs DVD ont commencé à bien supporter les DivX et sont devenus vraiment cheap.
Ce lecteur a plusieurs clones ou modèles très proches : Magnavox/Philips/Schneider MDV435, MDV437, SDV436, et probablement d'autres.
Celui-ci a 3 circuits imprimés :
une alimentation à découpage +3.3V, +5V, +12V, -12V et -24V (15W)
un panneau d'interface utilisateur : Contrôleur PT6312 (équivalent µPD16312), afficheur VFD, boutons, LED, capteur IR
une carte mère avec un SoC SunPlus SPHE8281D (ou SPHE8201D), un driver de puissance pour le lecteur CD (Moteurs brushless + DC), des régulateurs de tension, de la SDRAM et deux puces EEPROM (firmware + réglages sauvegardés)
Il y a plusieurs connecteurs et composants non-installés sur la carte-mère (P/N : 40-MDV435-MAC2G). le manuel de réparation indique que ce sont des connecteurs de debug (probablement RS-232), un micro/ampli pour un mode karaoké et un connecteur USB pour lire des fichiers depuis un disque dur externe. Par contre, il n'y a aucun connecteur JTAG.
Le problème, c'est que sur ce SoC, les pins de l'UART sont partagés avec la synchro horizontale/verticale, et ne sortent pas grand chose qui ressemble à un signal série.
Pour avoir de la place, j'ai démonté le bloc du lecteur DVD, sans lequel la carte-mère est incapable de démarrer. Mais il est possible de la leurrer en reliant le pin TRAYI à la masse, sur le connecteur CN?.
Dézonage
Ce modèle a été vendu en Europe et ne lit que les DVDs de Region 2.
Le dézonage est assez rapide et se fait de la même façon sur d'autres modèles Philips/Magnavox/Schneider :
Démarrage du lecteur DVD,
Ouverture du tiroir,
4 appuis successifs sur la touche 7 de la télécommande (7-7-7-7),
Selection du champ REGION sur le menu affiché,
Choix de l'option REGION 0,
Fermeture du tiroir.
Software
La recherche d'un firmware n'a rien donné. Ce qui est assez dommage, puisque même le firmware d'origine aurait permis de comprendre son fonctionnement.
Utilisation de l'écran VFD
La carte d'interface utilisateur a besoin d'alimentation +12V, -24V (afficheur VFD) et d'une interface SPI (connectée à l'ASIC PT6312) pour afficher des caractères.
D'après la documentation de la puce, il faut plusieurs commandes d'initialisation, puis balayer la mémoire avec les positions des segments (chaque digit est séparé en deux blocs de 7 segments).
En voyant une vidéo parlant des données présentes sur les divers codes barres des billets d'avion, j'ai regardé si les billets de train que j'avais en stock étaient pareil. https://www.youtube.com/watch?v=jM4_iz3RqE8
J'ai trouvé 4 types de billets avec des codes-barres différents :
Billets cartonnés (code PDF417)
E-Billets TGV et IC (code PDF417 ou Aztec)
E-Billets TER (code Aztec)
Billets "Online-Ticket" ÖBB imprimés (code Aztec)
Billet cartonné
"Billet classique", commandé puis retiré a un guichet/borne, avec un code PDF-417 imprimé à gauche
F : Drapeau de spécimen (0 pour un faux ou 1 pour un vrai)
G : Version de codage du billet (1)
H : Ticket A de B
0 : Réservé (10 caractères)
I : Type de carte de réduction (deux espaces en cas d'absence)
J : Nombre de voyageurs adultes
K : Nombre de voyageurs enfants
L : Dernier digit de l'année du voyage
M : Date d'impression (nombre de jours depuis le 01.01)
N : date de début de validité, idem
O : Date de fin de validité, idem
Premier segment :
P : Gare de départ (code ISO3166-1 du pays puis code de la gare sur 3 digits)
Q : Gare d'arrivée, idem
R : Numéro de train (6 digits, ou 5 digits + '\0', ou '0' + 4 digits + '\0')
S : Code antifraude
T : Date de départ du train (nombre de jours depuis le 01.01)
U : Numéro de voiture
V : Numéro de place
W : Classe du voyage
X : Code du tarif
Y : Conditions du services/payements
Le premier segment (de M à V) peut être complété par un second segment suivant la même syntaxe si le voyage a des correspondances. En cas d'absence, il y a 29 espaces, la classe est notée '*', puis 6 espaces.
Ici on a un un billet au format "e" pour le numéro de dossier RUZNxx, un numéro de billet 58361xxxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage. Le billet n'est pas lié à une carte de réduction, il est pour un adulte sans enfant, est vallable pour l'année 2013, a été acheté le 14.06 et est vallable du 15.06 au 14.08.
Le premier segment est au départ de Lyon Part-Dieu (France, LPD) et à destination de Genève-Cornavin (Suisse, GVA), pour le train 96506, le code est illisible, le train circule le 15.06, n'a pas de place/voiture réservée, est en 2nde classe, pour un tarif "illico Jeunes -25%" et n'est pas échangeable après le départ.
Dans tous les cas, ces billets ne posent aucun risques une fois le voyage effectué dans sa totalité (par contre il est possible de l'annuler ou de le reproduire si il n'a pas encore été utilisé).
E-Billet TGV/IC
Les E-billets sont fournis par des agences de voyages (Voyages-SNCF, Capitaine-train, E-billet-SNCF) et ont un code Aztec pour ceux imprimés soi-même ou un code PDF-417 pour ceux imprimés sur les bornes de la SNCF. Dans les deux cas ils utilisent la même organisation.
Ici on a un billet au format "i", imprimé sur une borne SNCF, le billet est une "Confirmation de voyage" pour le dossier RIKNxx, un numéro de billet 248713xxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage.
Le billet est au départ de Chambéry-Challes-les-eaux (France, CMF), à destination de Paris-Austerlitz (France, PAZ), avec le train 05706 le 13/05.
Le numéro d'identifiant du trajet est 0029009166230xxxxxx, porté par "Xavier Bo", voyageant en seconde classe avec un tarif "preum's"
La seconde partie du trajet est au départ de Paris Montparnasse (France, PMO) vers La-Ferté-Bernard (France, DLY), avec le train 16757.
Ici on a un billet au format "i", imprimé par ses propres moyens, le billet est une "Confirmation de voyage" pour le dossier QZWKxx, un numéro de billet 482593xxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage.
Le billet est au départ de Genève-Cornavin (Suisse, GVA), à destination de Lyon Part-Dieu (France, LPD), avec le train 09744 le 19/12.
Le numéro d'identifiant du trajet est 00290290169300xxxxxx, porté par "Xavier Bo", voyageant en seconde classe. Par contre les informations de tarif sont vides et le voyage n'a pas de correspondance (champs remplis par des espaces ou des '0').
Le ticket à plutôt l'air de servir à identifier le voyageur (I, J, K, Q, R) et à porter un numéro d'identifiant (Q) qui doit pointer dans une base de donnée mieux remplie (et non-modifiable).
Certains paramètres (O, P, T, V) ont l'air d'être présent en cas de base de donnée injoignable ou pas à jour pour au moins vérifier sommairement que personne ne tente de frauder.
E-Billet TER imprimé
Le billet a été commandé sur le site web des TER-Rhône-Alpes et a un code Aztec assez grand.
Le début contient des données encodées, puis la chaîne :
En interprêtant sommairement, on remarque plusieurs chaînes contenant la date du 28.12.2015 (date de commande, début et fin de validité du ticket).
La chaîne 1313 correspond à l'heure de la commande du billet, "NG02" semble être un tarif, et plusieurs champs peuvent correspondre à la classe.
Les champs FRLYL et FRHCZ sont au format des autres billets et indiquent les gares de départ et d'arrivée (France, Lyon Gorge-de-Loup et Fleurieux-sur-l'Arbresle).
Par contre je n'ai qu'un seul ticket de ce type pour l'instant, je pourrais compléter quand j'aurais comparé avec des tickets du même type pour des trajets.
Internet-Ticket ÖBB imprimé
Les tickets à imprimer soi-même sont les seuls à comporter un code-barres unique. Par contre le codage a l'air similaire et compatible avec celui utilisé par la DB (Allemagne) et les SBB (Suisse).
Pour l'instant le code comporte une en-tête dépendant du type de ticket/carte, du transporteur et de la longueur du message. Le reste est encodé en binaire mais semble décodable.
J'ai récupéré deux points d'accès D-Link DWL-G700AP hors-service, chacun de révision B3, le premier fabriqué au milieu de l'année 2006 et le 2nd au milieu de l'année 2007.
Point d'accès #1
Au branchement, il ne démarre pas et aucune LED n'est allumée.
En l'ouvrant, la tension est à 0V en sortie des selfs de choke de l'entrée d'alimentation (fonctionnelle). L'Ohm-mètre affiche un court-circuit sur le rail 3.3V (sortie du régulateur qui alimente quasiment toute la carte).
Quelques capacités sont gonflées, mais aucune n'est en court-circuit.
Point d'accès #2
Au branchement, seulement la LED D1 (Power) est allumée, mais aucune réponse par le réseau ou par le port série.
En mesurant un peu de partout, la sortie du régulateur U9 (GS1117AX-18) donne 0.95V à la place des 1.8V attendus.
Le simple échange de régulateur entre les deux points d'accès à suffit à en rendre un fonctionnel.
Notes :
Le régulateur U9 chauffe beaucoup et a une surface de dissipation trop petite...
Il est possible d'alimenter le routeur avec n'importe quelle tension entre 5V et 16V (tension limite des capacités, le régulateur Buck supporte au moins 20V).
Port série
Le connecteur J2 est cablé directement sur le SoC RTL8186 (signaux 3.3V) :
3.3V
GND
CTS*
RTS*
TX
RX
*Non-testé et non-indispensable
La connection est en 38400, 8N1 et donne un accès au bootlog de Linux et à un shell busybox.
Flash
En cas de flash du mauvais firmware, le point d'accès à un bootblock qui permet de reflasher "facilement" le point d'accès.
Débrancher l'alimentation
Tenir le bouton RESET appuyé
Brancher l'alimentation
Lâcher le bouton RESET après 5s
Brancher un PC en ethernet avec l'adresse 192.168.1.xx (différente de 192.168.1.6)
uploader le firmware par tftp :
tftp 192.168.1.6
tftp> binary
tftp> put DWLG700AP_FW231b02.bin
Sent 1025832 bytes in 2.6 seconds
tftp>
Firmwares Wive et Wive-NG
Ces deux firmware alternatifs sont disponibles et permettent plus de choses que le firmware D-Link de base (qui n'a pas les commandes ls, vi, mount ou ping...).
Par contre les firmwares Wive sont un peu buggés (un des firmware détecte aléatoirement 8 ou 16Mio de RAM et plante dès qu'on utilise une zone de mémoire inexistante), très mal documentés et il y a quelques instabilités qui freezent la machine ou la redémarrent.
Firmware Realtek/D-Link Custom
Le firmware et une partie de la toolchain RTL8186 sont fournie sur le site de D-Link, et il est possible d'y modifier pas mal de choses.
Il faut juste éviter de bricker la machine en cassant le bootloader. ÉCHEC
JTAG
Comme j'ai brické le point d'accès en cassant le bootloader, j'ai essayé de le reflasher en utilisant le bus JTAG (12 pins),
nTRST (NC)
GND
TDI (D0)
GND
TDO (!Select)
GND
TMS (D2)
GND
TCK (D1)
GND
nSRST (NC)
GND
Je n'ai pas de programmateur JTAG générique, du coup j'ai copié un programmateur Xilinx DLC5 sur port parallèle (adresse 0x378 sur ma machine), en le réglant à 250kHz (mais ça ne fonctionne pas, peu importe la fréquence).
jtag> cable DLC5 parallel 0x378
Initializing parallel port at 0x378
jtag> frequency 250000
Setting TCK frequency to 250000 Hz
requested frequency 250000, now calibrating delay loop
new real frequency 241253, delay 0
done
jtag> detect
Warning: TDO seems to be stuck at 1 ÉCHEC