Manuel de compilation du kernel uCLinux 2.4 à destination du VTECH GeniusIQ Laptop


Auteur : Alexandre BOTZUNG
Date de création du document : 15/07/2022

● Comment compiler le kernel Linux ?

L'adresse IP par défaut du système est : 192.168.0.200/24
Le compte à utiliser est osboxes (mot de passe : osboxes) (ne pas utiliser le compte root !)
La VM est disponible sur la page Téléchargement

Se rendre dans ce répertoire :

/home/osboxes/vtechdevel/uClinux20080808

Pour lancer une compilation avec les paramètres de .config : (Un script a été fait pour régénérer les paramètres kivontbien 🙂

./doit

Une alternative existe (plus rapide, mais plus sale) :

./dofast

Une fois la compilation réalisée, l'image binaire (nommée IQLaptop.bin) se trouve dans le répertoire :

/home/osboxes/vtechdevel/uClinux20080808/images

(ls -alh)
total 3.4M
drwxrwxr-x  2 osboxes osboxes  4.0K Jul 15 15:20 .
drwxrwxr-x 16 osboxes osboxes  4.0K Jul 15 15:20 ..
-rw-rw-r--  1 osboxes osboxes  1.7M Jul 15 15:20 IQLaptop.bin
-rwxrwxr-x  1 osboxes osboxes  144K Jul 15 15:20 linux.data
-rwxrwxr-x  1 osboxes osboxes  539K Jul 15 15:20 linux.text
-rw-rw-r--  1 osboxes osboxes 1005K Jul 15 15:20 romfs.img
-rw-rw-r--  1 osboxes osboxes  2.6K Jul 15 15:20 romfs-inst.log

Ce fichier est à programmer à l'adresse $0 de votre ROM/FLASH.
Il est déjà patchée pour correctement fonctionner sur le Vtech Laptop IQ (version Anglaise), sur le port cartouche "A" (port à droite de la machine).
Il n'y a rien à faire de particulier ; "Enjoy !"

● Quelques détails à propos de l'environnement, et du Linux (à caractère informatif, bien sûr !)

L'environnement de compilation est basée sur un Ubuntu 14.04.6 LTS (x64) glanée sur le site d'OsBoxes.
La configuration est bancale, mais fonctionnel.

Les sources Linux ont étés modifiés en partie pour s’accommoder au Vtech GeniusIQ, mais aussi pour corriger quelques bugs "par ci par là".

Notamment :

  • Le driver block ROMFS (linux-2.4.x\fs\romfs\inode.c) ; Pour une raison que j'ignore, la fonction strncmp ne réalise pas une bonne opération. J'ai réecris la fonction pour avoir quelque-chose de fonctionnel.

  • Le driver vidéo FBCON (linux-2.4.x\drivers\video\fbcon.c) ; Celui-ci réecris les pixels affichée sur le framebuffer par la sortie ASCII du terminal, provoquant des artefacts à l'écran.

  • Le driver char vtechiqkeyb (linux/arch/m68k/amiga/vtechiqkeyb.c) ; Gère les entrés clavier. Il manque la partie pour lire les coordonnées de la souris et la date/heure du RTC. (driver buggée ; "Here be dragons")
    Fun fact : ...car oui, c'est le microcontrolleur "clavier" qui gère le ...clavier, la souris mais aussi le RTC.
    il est très probable que pour des raison d'autonomie, le travail du RTC ait été décalée dans cette puce.

  • Le crt0 (linux-2.4.x\arch\m68knommu\platform\68EZ328\ucsimm\crt0_fixed.S), utilisée pour initialiser la plateforme avant le transfert de contrôle à Linux.

ainsi que quelques détails que ma mémoire ne saurait rappeler à lui.
(une grande partie de l'aventure est documentée ici : /home/osboxes/vtechdevel/uClinux20080808/LisMoi.txt )
En règle général ; regardez les dates de modifications des fichiers, vous trouverez sûrement votre bonheur.

⚠️ Attention tout de même lors de votre compilation du Kernel ;

Il y a 3 point clés à respecter pour voir Linux démarrer correctement :

1. ) L'adresse de chargement du LINUX en mémoire :

Le VTECH GeniusIQ possède 2 ports cartouches.
Chaque port cartouche possède une adresse mémoire spécifique dans la carte mémoire du CPU 68K.
Une ROM fonctionnel pour le port cartouche de DROITE, ne fonctionnera PAS sur le port de GAUCHE. (et inversement).
Le port de GAUCHE (Card B) possède l'adresse $400 0000
Le port de DROITE (Card A) possède l'adresse $500 0000
(quand l'appareil est face à vous, posée sur une table)

Par défaut, la compilation du kernel est réalisée pour le port de DROITE (Card A) ($0500 0000) Regardez le fichier linux-2.4.x\arch\m68knommu\platform\68EZ328\ucsimm\rom.ld pour savoir comment est chargée Linux en RAM.

2.) L'entête d'amorçage :
Le VTECH possède probablement un mécanisme permettant d'amorcer des ROMS avant le démarrage de PSOS (le système d'exploitation du VTECH).
Hors, impossible de trouver le point d'exécution.
EDIT 17/07/2022 : L'octet @$1F détermine comment la ROM dot être chargée ; $0A = Autodémarrage / $0E = Autodémarrage après le logo Vtech / $0C = Démarrage manuel
Je me suis rabattu en "simulant" une cartouche de jeux "Englisch für Anfänger" pour outrepasser les vérifications de l'OS.
(une GRAND merci à la Team Europe!)

La recette est simple : copier les 256 premiers octets concernant l'entête qui contient :

  • "R&D" (à l'adresse $0)
  • Le nom du jeux (ASCII) (à l'adresse $9, longueur $10)
  • la valeur de zonage (j'y reviens plus tard)
  • Le (les?) point (plutôt offset) d'exécution du logiciel sur la cartouche

Ensuite, modifier les points (offset plutôt) d'exécution pour coïncider avec l'adresse mémoire où Linux est supposément résider.
L'adresse mémoire dans la ROM @ $26 (longueur $2 / .w) correspond à l'offset de l'offset mémoire de démarrage, ajoutée à l'adresse base de la ROM (oui monsieur, toutafai !)

Pour faire simple :
   (BASE_ROM est égale à $500 0000 ou $400 0000. Pour la démonstration, on prendra $500 0000)
   l'OS PSoS lit le mot à l'adresse BASE_ROM+$26. (dans notre exemple, la valeur vaut $61 (00 61))
   Ensuite, il va lire un long (4 octets) à l'adresse BASE_ROM + {$61} + 1 (dans notre exemple, la valeur vaut $500 (00 00 50 00))
   ...enfin, le point d'exécution sera BASE_ROM + {$500}

   Pour résumer :
   ($5000000+$26).w => $0061.w
   ($5000000+$0061+1).l => $500.l    jsr ($5000000+$500).l
   Simple, non ? ^^

3.) Le zonage (aka DRM de 1998) :
VTECH s'était dit en 1998 que ça serait bien de mettre en place du zonage sur les cartouches à destination des ordinateurs VTECH.
Ce qui fait qu'une cartouche, de langue Allemande par exemple, ne fonctionnera pas dans un système Anglais. Elle n'est pas véritablement "bloquée" ; l'exécution du logiciel ne fonctionne pas. (pourtant l'OS la détecte). Fun fact : En forçant la bonne valeur, il est tout de même possible de permettre la bonne exécution.

Voici la bonne valeur à modifier (dans l'entête) pour permettre la bonne exécution de la cartouche :

Pour un système avec la langue ANGLAIS : 196034
Pour un système avec la langue ALLEMANDE : 196041
Pour un système avec la langue FRANÇAISE : 196051

Ce chiffre, est à modifier dans l'entête à l'adresse $33 jusqu'à $38.

Normalement, vous devriez avoir une image fonctionnel à graver dans votre EPROM.

● Trucs en vrac

  • Le 68ez328 possède une interface "debug" in situ, pratique pour dumper la ROM sans jamais la dessouder.
    (par contre, vous devez retrouver l'utilitaire bbug.exe sur les internets)
    Si vous êtes fort en Purebasic, il existe une version "homemade" du process BBUG dans le répertoire de compilation. (à bidouiller)

  • Certains adaptateurs d'EPROM "27C322 <==> TL866" ont des switchs pour changer la banque à programmer. Hors (après des heures de recherches dans mon code...)
    il s'avère que le chiffre "d'état" du switch ne désigne PAS l'état logique définissant la banque (switch en configuration pull-up). (j'ai perdu 4h et des cheveux à cause de ce "détail"...)

  • Ce projet a pris beaucoup de temps, je ne pense pas réaliser de mise à jour à son propos. Les fichiers sont fournis "en l'état, sans aucune garantie d'aucune sorte, sauf éventuellement de perte de temps."
    A défaut, les fichiers sont sous licence GPL. (envoyez-moi un mail si cela vous a motivé/servi pour un projet 😅 )
    Un grand merci à la Team Europe pour la ROM Allemande, à BMOW, pour son projet 68Katy, à PulkoMandy pour son aide précieuse.