Programmation d'une montre GPS

Introduction

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 :

Processus de mise à jour

Mode de mise à jour du firmware

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 :

Le programme python de mise à jour du firmware est disponible ici

Adresses de téléchargement direct des firmwares geonaute :

Le bootloader

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

Portion du bootloader qui test le passage en mode "mise à jour"

Le fichier binaire du bootloader (incluant le début du firmware) est disponnible ici.

L'écran

Ecran de la montre GPS

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 :

Portion du firmware qui initialise le LCD

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

Le circuit imprimé

Voici le circuit imprimé d'une "W Kalenji 300 gps" annoté avec les différents périphériques

Circuit imprimé d'une Kalenji 300 GPS (cliquer pour agrandir)

Composants :

Firmware personnalisé

Affichage de l'heure

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

Vidéo de démonstration

Montrant le processus de mise à jour du firmware personnalisé.