Explorer l'EEPROM d'une autoradio...

Tags: électronique voiture

Il m'est venu l'idée de bidouiller mon autoradio RD4 (le modèle de base de certaines Peugeot/Citroen). Ceci est peut être lié au fait que je n'avais pas d'entrée auxiliaire d'activée pour brancher une autre source, et que je voulais éviter de passer par un garagiste et payer pour une simple opération de 2 minutes, ni d'attendre un mois qu'un PP2000 arrive de Chine. Peut être aussi que j'aime me casser la tête pour pas grand chose.

L'autoradio (RD4 N1M-03) possède une 24C64. Il y a dans cette EEPROM 8k octets de "foutoire", qu'on peut facilement lire avec une pince spéciale. On voit bien qu'il y a le code VIN de la voiture (en 2 exemplaires), la liste des stations radios enregistrées, mais il y a beaucoup d'autres choses qui ne sont vraiment pas claires à première vue.

clip"

Pour faciliter la tâche, en premier lieu, on peut sortir 4 fils de l'autoradio (GNC, VCC, SDA ,SCL), qui permet de faire les opérations de lectures/écritures sans avoir à tout démonter, mais aussi (et c'est bien plus intéressant), d'écouter ce qu'il se dit sur le bus I2C entre le micro-contrôleur et l'EEPROM. Avec un analyseur logique, une fois les trames I2C décodées, on peut facilement voir les opérations de lecture et d'écriture.

fils1"fils2"

On comprend assez rapidement que la mémoire est décomposée en blocs, et que pratiquement tous les blocs (généralement lus d'une seule traite) se terminent par un octet de contrôle, qui est la somme des autres octets du bloc (modulo 256).

Lors de l'initialisation, l'uC commence à lire l'octet (qui contient un 'V', très probablement le même 'V' que le premier caractère du numéro VIN). Quelques lectures plus tard, il lit les deux blocs contenant le numéro VIN. Ces blocs contiennent le VIN (en ASCII) terminant par un 0x04 (qui semble terminer chaque chaîne de caractère ASCII, comme les noms des stations radio), puis un entier contenant ce qui semble être une somme de contrôle (qui semble être le non binaire le de la somme des caractères du numéro VIN, sans le 'V' initial et le 0x04 final), puis l'octet-somme-de-contrôle-des-blocs. On repère aussi facilement des tableaux correspondant aux stations radio enregistrées (fréquences, texte RDS...). On trouve aussi d'autres informations: un bloc lié à la lecture CD (numéro de piste, nombre de pistes...), un bloc contenant les flags (TA, PTY, suivi RDS...). Mais il reste toujours beaucoup d'inconnues.

Puis vient une expérience plus amusante: modifier les données, et voir quel impact cela a sur le fonctionnement de l'autoradio. L'idée de base était qu'il devait certainement avoir un booléen à changer quelque part. J'ai donc remplacé des 0 par des 1 à divers endroit, et réinitialisé l'autoradio. Cela a été fait en branchant en série un pseudo-arduino, qui me permet d'injecter des trames I2C d'écritures. C'est un peu sale: il ne faut pas avoir la malchance d'envoyer une trame en même temps que l'uC de l'autoradio, puis les tensions logiques ne sont pas être les mêmes: 3.3V pour le RD4, et 5V pour l'arduino. L'électronique du RD4 pourrait ne pas le tolérer... Mais j'imagine que ces parties là sont généralement plutôt protégées, quand c'est bien fait. Et au pire, si je crame quelque chose, cela me donnera une bonne raison pour remplacer ce truc par un vrai autoradio qui traîne déjà dans mon bordel.

double"

Malheureusement, toutes mes tentatives pour activer l'entrée auxiliaire ou le chargeur CD ont lamentablement échouées. J'ai seulement réussi à bloquer la radio et/ou la lecture CD (opération facilement annulable, en réécrivant l'ancien dump).

Je me suis donc résigné à passer par la "valise" pour pouvoir activer cette entrée externe... À suivre.

M.À.J. du 11/11/2017

Un "diff" plus tard les activations par la "valise", il semble que les informations des deux entrées externes (AUX1 et AUX2, mais néanmoins, il ne semble pas y avoir d'AUX2 accessible via le changement de source sur l'autoradio) de cette version du RD4 se trouvaient dans 4eme octet du bloc commencant à l'adresse "1B63". Y mettre "0x50" active les 2 entrées en "classique", et y mettre "0x90" active les 2 antrées en mode "mute externe" (et bien sûr, 0x00 désactive les deux entrées...).

Par quelle magie l'ordinateur de bord dit au RD4 d'activer/désactiver les entrées ? Apparemment, via un message envoyé sur le CAN "confort" sur lequel est connecté l'autoradio: "0x07 0x3B 0xC0 [les 5 octets du bloc 1B63]" (par exemple, dans mon cas "0x07 0x3B 0xC0 0x07 0x19 0x5B 0x50 0x25"), envoyé via l'identifiant 0x760. Il peut apparemment aussi se servir de l'identifiant CAN 0x660 pour "télécoder" le RD4.

Mais de toutes façons, on peut aussi se demander comment la valise demande à l'ordinateur de bord de demander au RD4 d'activer l'entrée externe... Encore une affaire à suivre.