Il y a quelques temps, j'ai fabriqué une boîte géocache inverse à partir d'une montre GPS cassée (Keymaze 700 trail) récupérée dans une poubelle. Pour cela j'ai du créer un nouveau firmware pour le microcontrôleur STM32F103 par JTAG (avec un buspirate et OpenOCD).
La montre gps "CW Kalenji 700 gps", est très similaire à la "Keymaze 700 trail", le microcontrôleur est le même et peut donc facilement être reprogrammé. Plutôt que de devoir l'ouvrir, pour la programmer par JTAG, il serait bien plus commode d'utiliser la méthode de mise à jour originale de la montre.
Les informations nécessaires pour mener à bien ce projet ont été recueillies principalement de deux manière :
On peut mettre la montre en mode "mise à jour", de deux manière :
La mise à jour se fait normalement à partir du logiciel Geonaute Software , en enregistrant une session de mise à jour, j'ai pu mettre au point un petit programme pour programmer un fichier de firmware donnée. La montre est reconnue par le PC comme un port série virtuel. Le protocole de mise à jour est le suivant :
0x11 0x02 0x00 0x00 0x00 0x02
initialise l'effacement de la mémoire, lorsque la mémoire est effacée on reçoit 0x88
0x11 0x02 0x04 nn mm
(nn mm
numéro du paquet, nn=LSB
)0x11
)0x88
Le programme python de mise à jour du firmware est disponible ici
Adresses de téléchargement direct des firmwares geonaute :
Le bootloader se trouve à l'adresse 0x08000000
et a une taille de 12kB (0x3000 = 0x400*12 bytes)
Le firmware est programmé à l'adresse 0x08003000
et a une taille de 500kB.
Pour pouvoir étudier le bootloader, je l'ai extrait d'une montre en utilisant un buspirate et le programme pirate-swd qui implémente le protocole Serial Wire Debug.
Le desassemblage du bootloader a permis de déterminer la méthode logiciel pour le placer en mode "mise à jour" : redémarrer avec la valeur "fu"
écrite dans le registre BKP_DR10
Le fichier binaire du bootloader (incluant le début du firmware) est disponnible ici.
Le pilotage de l'écran est probablement la partie qui a été la plus problématique dans ce projet, en effet après de longues recherches il m'a été impossible de trouver la référence de cet afficheur LCD et donc impossible de trouver les commandes pour le contrôler
Caractéristiques
Un peu semblable à ST7571 (datasheet ), mais toutes les commandes du ST7571 ne fonctionnent pas avec cet écran. J'ai pu déterminer la séquence d'initialisation à partir du firmware d'origine. En cherchant dans le code désassemblé les parties en rapport avec la communication par SPI, on tombe sur cette partie :
On en tire la séquence d'initialisation : E2 24 C2 A0 D2 EB 81 1E F1 63 F2 00 F3 63 AF
.
Un octet de données data
correspond à 4 pixels, les bits de data
étant regroupés par 2 pour déterminer le niveau de gris du pixel correspondant. Le pixel de gauche est codé dans les deux bits de poids faible et celui de droite dans les deux bits de poids fort
Voici le circuit imprimé d'une "W Kalenji 300 gps" annoté avec les différents périphériques
Composants :
Pour afficher du texte à l'écran, j'ai utilisé l'excellente bibliothèque u8glib qui dispose déjà d'un certain nombre de polices et des fonctions pour les afficher. Pour l'instant elle n'est utilisée que pour afficher du texte, mais elle peut faire bien plus
L'objectif de tout cela étant de rendre cette montre GPS programmable, et d'écrire un firmware personnalisé. Pour l'instant il ne s'agit que d'un programme basique qui montre comment contrôler les principales fonctions de la montre (boutons, GPS, écran). Il reste encore beaucoup de choses à faire pour que le nouveau firmware soit parfaitement opérationnel, il reste beaucoup de fonctionnalités non prises en charge :
L'état actuel des choses est néanmoins une bonne base de départ.
Le code source du firmware peut être téléchargé ici
Montrant le processus de mise à jour du firmware personnalisé.