Modifions les tranceivers VHF/UHF professionnels

 

 

Attention, ceci n'est pas un guide pour trouver des modifications toutes faites sur internet.
On suppose que chacun sait déjà utiliser un moteur de recherche.

Ceci est plutôt un guide pour tenter d'orienter les éventuels futurs crakers de postes.
A l'inverse de la recherche sur le net assez peu enrichissante, le travail proposé ici est personnel,
et, avec un peu d'expérience, on fait largement mieux que ce qui est disponible tout prêt sur le net.
Ceci est sans doute du au fait que ce sont souvent des modifications hasardeuses, probablement
faites par divers essais de la modification du code exécutable avec un éditeur hexadécimal, ce qui
donne un fonctionnement dont il faudrait se satisfaire.
Une autre voie est possible : faisons le nous même.
On n'est pas tenu de réussir à chaque coup.
Ayons à l'esprit qu'en la matière, essayer c'est progresser. Progressons donc.




Connaissances nécessaires

Les connaissances nécessaires ne sont pas extraordinaires, pourtant, il faut connaître un minimum du
fonctionnement des radios et, bien sur, il faut une assez bonne connaissance de la programmation.

Ce guide est en partie basé sur la gestion par le micro contrôleur MCS51 (80C31, 32, 51,52 ...).
En effet, il est le plus utilisé et ce n'est un hasard. Il y a aussi l'excellents mais ancien 6801/6803
ainsi que sont successeur le peu convaincant 68HC11.
Le MCS51 est devenu et depuis longtemps déjà le standard industriel. Il est très puissant, très diffusé et
il est fabriqué par un bon nombre de fondeurs. Par la puissance de son coeur, les évolutions toujours
compatibles qu'il a subi et la profusion d'outils de développement, soyons convaincus qu'il reste une
valeur sure.

 

Organisation du poste : la CPU et ses périphériques

- CPU ou micro contrôleur.
Grand ordonnanceur de tout ce qui ce passe dans le poste. Par l'intermédiaire de ses ports, il est forcément relié à tout le reste :

- Synthétiseur(s)
Un ou deux sous ensembles destinés à générer les fréquences nécessaires

- Mémoire non volatile
Mémoire chargée de contenir les paramètres des canaux. Ces paramètres sont nécessaires au fonctionnement du synthétiseur.

- Entrées/sorties
Boutons, PTT, entrée squelch, afficheur, commande RX/TX, voyants ...

 

Organisation de "l'attaque"

1 - Etablir la liste des connexions entre chaque port et les composants.

2 - Extraction du firmware original si c'est possible.

3 - Désassemblage du firmware.

4 - Consolidation de la liste des connexion µP/périphériques.

5 - Techniques de reconnaissance et de manipulation des entrées/sorties.

6 - Ecriture d'un firmware de substitution.

 

 

La liste des connexions entre chaque port et les composants

Se munir d'un crayon, d'une feuille et d'un hommètre de préférence à sonette.
Retirer le micro contrôleur, puis, pour chacun des ports, noter les liaison trouvées avec les circuits intégré de
l'électronique (N° de patte et référence du circuit). Noter également des conclusions.
N°1 P1.0 -> (3) 93C46 - (3) MC12345 (inconnu) à côté d'un MC145156 donc P1.0 est utilisé pour véhiculer
des données vers la mémoire non volatile mais aussi sans doute pour faire quelque chose avec le synthé.

N°2 P1.2 -> (2) 93C46.
N°3 P1.3 -> (1) 93C46.
:
:
:
Pour un µP de la famille MCS51, il faut refaire le boulot 32 fois, parfois sans succès.

 

Extraction du firmware original

L'extraction du logiciel d'origine n'est pas toujours possible, dans ce cas ce sera plus difficile
car il sera impossible de voir de quelle façon dont sont gérées les entrées/sortie.
Installer le micro contrôleur original sur un lecteur et en extraire le code.
Sauver ce code dans un fichier.

Désassemblage du firmware.

Trouver un désassembleur et produire un fichier de désassemblage (fichier texte). Selon le désassembleur
utilisé, on récupère un source ou quelque chose d'assez semblable.
Ce fichier va être consulté avec un éditeur de texte.

Consolider la liste des connexions µP/périphériques.

Consolidons nos connaissances au sujet de P1.0
Avec un éditeur de texte, on charge le fichier de désassemblage, puis, ou recherche "P1.0."
Première occurrence :
SETB P1.3
MOV R7,#8
L0000:
RRC A
MOV P1.0,C
SETB P1.2
CLR P1.2
DJNZ R7,L0000
CLR P1.3

Conclusions P1.0 est bien destiné à envoyer les données vers la 93C46, mais de plus on sait
maintenant que ce que l'on a déjà trouvé à l'ohmmètre est correct : P1.2 = CLOCK 93C46 et
P1.3 est la sélection de la 93C46.

Prochaine occurrence de P1.0 :

MOV R7,#8
MOV A,@R0
INC R0
L0001:
RRC A
MOV P1.0,C
SETB P1.2
CLR P1.2
DJNZ R7,L0001
MOV A,@R0
INC R0
MOV R7,#8
L0002:
RRC A
MOV P1.0,C
SETB P1.2
CLR P1.2
DJNZ R7,L0002
MOV A,@R0
RRC A
MOV P1.0,C
RRC A
MOV P1.0,C
RRC A
MOV P1.0,C
SETB P1.4
CLR P1.4

Conclusions :
P1.0 sert aussi à envoyer les données au synthé. P1.2 sert aussi d'horloge et P1.4 valide les données.
On constate que :
- on n'a même pas besoin de trouver la data sheet du MC12345,
- on a une routine toute faite pour le synthé. Pour l'utiliser, il faut la comprendre en établissant la corrélation
avec la data sheet du synthé, puis trouver ses paramètres (valeurs que contiennent les registres au début de la
routine). Ici R0 pointe sur un buffer de 3 octets contenant les 19 bits à envoyer dans le synthé.

Refaire tout cela pour les autres ports. Une bonne habitude est de commenter le fichier de désassemblage.
On peut aussi, nommer les sous programmes en remplaçant les labels automatiques par des noms signifiant
leur fonction. Toutes les recherches au fil de l'évolution du travail en seront facilitées.

 

Techniques de reconnaissance et de manipulation des entrées/sorties.

Les entrées sorties des systèmes à micro contrôleurs peuvent être très complexes.
Par exemple les sorties peuvent être en série synchrones cascadées (n+1 MC4094 pour n*8 sorties) utilisant
simplement 3 ports, afficheurs multiplexés piloté par des convertisseurs série/parallèle ... et le tout peut aussi
être combiné aux circuits de lecture des entrées. En effet, il peut y avoir des circuits de lecture à sorties 3
états.
Pour s'en sortir, le mieux est de repérer un routine de lecture d'entrées, de la récupérer dans le but de l'essayer
puis, bien sur, de l'utiliser.
Pour faire un travail fiable, il est nécessaire de décortiquer la dite routine, de bien l'examiner et surtout de la
comprendre.

 

Ecriture d'un firmware de substitution.

Pour faire nos essais, il faut écrire un petit (au début) bout de code pour démarrer le µP, puis lui
greffer nos nouvelles routines de bas niveau (celles qui s'attaquent aux CIs).

1- Commande du synthétiseur
Comme il faut bien commencer par quelque chose, je me suggère de commencer par essayer le synthé.
C'est rassurant, ça fait une victoire pas trop difficile et très motivante.
Après avoir étudié la routine d'origine de commande du synthé, étudié la data sheet de celui ci, soit on
écrit une routine toute neuve, soit on récupère l'existante (pas toujours évident).
Pour commencer, on lui fournit des paramètres en dur : réglages des registre N, A et R.
On assemble, on teste. Normalement, avec un scanner, on constate une porteuse sur la fréquence désirée.
C'est la première victoire. Ça s'arrose !
Si cela ne fonctionne pas il faut avoir à l'esprit que l'on est peut être trop loin de la fréquence d'origine.
Il faut essayer avec des valeurs correspondant à la fréquence d'origine. Si 'est correct, cela veut dire qu'il faut
retoucher le réglage L/C du VCO. Penser que souvent il faut aussi fournir à un synthé une
commande de commutation de plage de fréquence pour qu'il soit capable de verrouiller sur la fréquence
d'émission, mais aussi sur la fréquence d'oscillateur local en réception.
Voir les sorties SW1 et SW2 (les 2 premiers bits envoyés) des synthés Motorola par exemple.
Au besoin, remettre le poste dans son état d'origine et vérifier ces sorties en émission puis en réception.


2- Lecture des entrées
Comme pour le synthé, une bonne connaissance de la ou des routines d'origine peut être nécessaire
ainsi qu'une bonne maîtrise du circuit électronique des entrées.
Le mieux est de greffer sur le programme précédent notre routine de lecture des entrées suivie d'un envoi
des valeurs lues sur la liaison série du µP en faisant tourner notre programme en boucle. On récupère les
valeurs de la lecture sur l'écran d'un PC où fonctionne une console.
Ça peut sembler lourd, mais c'est absolument imparable!


3- Les sorties et l'affichage

Pour les sorties - dont l'affichage - procéder comme pour le reste.
Simplement, utiliser la lecture des entrées pour avoir des données à afficher.
Mieux encore, utiliser la liaison série pour recevoir des données d'un PC pour (essayer de) les faire afficher.
Cette technique est plus souple et plus puissante.

4 - Considérations au sujet des E/S
Dans la version originale, les entrées, les sorties ou les deux peuvent être faites sous interruption timer.
Ce n'est pas un choix hasardeux, dans la version finale (la notre) il faudra faire pareil pour obtenir un
fonctionnement agréable. Par exemple, un affichage multiplexé est sous interruptions pour assurer une
constance dans le rafraîchissement. Ceci ne serait pas possible au sein d'une boucle.
En phase de mise au point, bien sur, on peut afficher dans la boucle principale.


5- La mémoire non volatile ou comment conserver les données des canaux
Il faut également être capable de lire le contenu de la mémoire non volatile pour en extraire les données
nécessaires au synthé afin qu'il génère les fréquences prévues pour chaque canal.
Cette mémoire doit être organisée de façon à conserver, pour chaque canal, la fréquence et le mode de
fonctionnement qui lui est propre.
Afin de faciliter le travail, il est toujours possible de connecter une 24C16 s'il n'y en a pas déjà une.
Elle ne nécessite que deux fils d'alimentation plus deux fils SLC et SDA.
Le but est d'utiliser le logiciel FM1000.EXE qui propose toutes les options nécessaires aux canaux, de
plus, il peut charger directement une 24C16 via un programmateur genre "gold".
Chaque canal y est conservé dans quatre octets consécutifs. Il y a le nombre de pas de 12,5KHz plus
le mode du canal :
- WORD wChannel ;Nombre de pas de 12,5KHz
- BYTE cMode ; Mode
- BYTE cChk ; Chk

6 - Le logiciel final

Le logiciel final a commencé à prendre forme dès les premiers essais.
Normalement on trouve :
Début:
- Initialisations (variables, E/S)
Boucle:
- Détection changement état du PTT
- Eventuel passage TX -> fin
- Eventuel passage RX -> fin
- Sinon traitement RX :
Aiguillage en fonction des commandes(scan, reverse ...)->fin

Fin: Mise à jour de sorties, affichages (soit direct, soit vers buffer
exploité sous interruption)puis
Saut à Boucle


Chacune des lignes ci dessus est en réalité un appel à un sous programme, faisant lui même appels à
d'autres sous programmes. Plusieurs niveaux d'appels sont couramment utilisés.
Par exemple, le passage en émission doit :
1) prendre le nombre pas de 12,5HKz destiné au synthé,
2) vérifier si il ne faut pas tenir compte d'un shift,
3) éventuellement ajouter ou soustraire le shift,
4) envoyer le nombre de pas au synthé en tenant compte du format des registres,
5) vérifier le vérouillage,
6) commander la sortie de passage en émission.

 

 

Ici, un tranceiver VHF sous la torture. Le malheureux n'a résisté que quelques heures. Trois ou quatre journées de travail
pour en faire quelque chose de bien (100canaux, scan, duplex, reverse, call, affichage de la fréquence ...).
Le micro contrôleur est remplacé par un DS5000 par l'intermédiaire de la nappe 40 fils. Il s'agit un micro contrôleur téléchargeable
utilisé en phase de dévelopement pour la rapidité de l'enchaînement des essais.
Le poste est connecté à une charge résistive pour éviter de flamber le PA en cas de commande intempestive de l'émission.
Par respect pour la dignité d'un malheureux publiquement humilié, sa face avant a été floutée.


Dans l'espoir que ces quelques lignes susciteront sinon des vocations, du moins l'envie de s'essayer à l'exercice.
By Stack Overflow (StOw)