Page 1 of 1

Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 31 Jul 2019, 23:02
by Lionel Debroux
Version française, English version


En octobre 2017, j'avais lancé le Challenge NumWorks++, visant à réaliser une modification matérielle relativement simple de la calculatrice NumWorks (modèle "N0100"), en l'occurrence l'ajout d'un chip de Flash externe sur l'emplacement de la carte mère prévu par NumWorks pour cet usage, et la réalisation de logiciel tirant parti de ce nouveau chip. Adriweb avait d'ailleurs écrit la news avec moi.
In October 2017, I had launched the NumWorks++ Challenge, aiming at making a relatively simple hardware mod of the NumWorks calculator ("N0100" model), i.e. the addition of an external Flash chip on the pins suitably provided by NumWorks for this usage, and the making of software leveraging this new chip. Adriweb wrote the news item with me.

Plusieurs personnes se sont lancées publiquement dans le challenge, aux 4 coins du monde. En France, plus particulièrement, Jean-Baptiste Boric et Damien "zardam" Nicolet. Ces personnes ont donc reçu par courrier un exemplaire des chips de Flash NOR QSPI Adesto AT25SF641 de 8 MB (le modèle suggéré par les schémas officiels de NumWorks) et Winbond W25Q128JV de 16 MB, à pinout compatible, que nous avions achetés pour ce challenge, et se sont mises au travail…
Several persons, over the world, took on the challenge. In France, there were especially Jean-Baptiste Boric and Damien "zardam" Nicolet. Therefore, these persons were mailed two QSPI Nor Flash chips, and started working with them: 1 x Adesto AT25SF641 of 8 MB (the model suggested by NumWorks' official schematics) and 1 x Winbond W25Q128JV of 16 MB, whose pinout is compatible. We had bought the chips for this challenge…

Trois (!) semaines plus tard, zardam disposait d'un firmware permettant de flasher le chip externe, comme il l'annonçait par ici. Seulement quelques semaines supplémentaires plus tard, toujours le même zardam avait produit une version patchée du firmware NumWorks de l'époque, comportant un build du puissant moteur CAS "giac" de Bernard Parisse (bien connu ici parce qu'il est à la base de Xcas, le logiciel des HP Prime G1 et G2 depuis le début, KhiCAS sur TI-Nspire et Casio, etc.), qui s'exécute depuis la Flash externe ajoutée sur la calculatrice. Une partie du firmware, en gros le code de NumWorks avec quelques modifications de zardam, s'exécute toujours depuis la Flash interne, grâce au script linker adéquat.
Three weeks later (!), zardam had a firmware able to flash the external chip, as he announced here. By only several weeks later, the same zardam had produced a patched version of the contemporary NumWorks firmware, featuring a build of the powerful "giac" CAS engine by Bernard Parisse (well known here because it's the foundation of Xcas, the HP Prime G1 and G2 firmware from the beginning, KhiCAS on the TI-Nspire and Casio calculators, etc.), running from the external Flash chip added to the calculator. Part of the firmware, basically NumWorks' code with several modifications by zardam, keeps running from the internal Flash memory, thanks to the appropriate linker script.

Voici la vidéo réalisée par zardam, présentant une version antérieure de son code, qui n'activait pas encore le mode QSPI qui a quadruplé la vitesse de lecture de la Flash (donc c'est nettement plus rapide maintenant):

Bref, des fonctionnalités plus proches de celles d'une calculatrice haut de gamme dans le corps d'une calculatrice de milieu de gamme, grâce à l'ajout d'un circuit coûtant moins d'1€ à l'unité (pour le chip de 8 MB) dans ce modèle conçu par le fabricant pour monter en gamme. le processus de soudage d'un circuit au pas de 1.27mm étant habituellement considéré comme faisable, même sans grande expérience, tant qu'on dispose d'un fer à souder avec une pointe dans un état correct. La performance est plutôt bonne pour le milieu de gamme, grâce au Cortex-M4 32 bits à 100 MHz utilisé par NumWorks - d'autant que contrairement à l'eZ80 à ~48 MHz des TI-84 Plus CE / TI-83 Premium CE (micro-architecture beaucoup moins efficace par cycle d'horloge et réalisant des opérations moins avancées que les ARM), le Cortex-M4 des calculatrices NumWorks n'est pas ralenti par des waitstates, car la RAM, les bus mémoires et les mémoires Flash peuvent fonctionner à 100 MHz.
Here's the video made by zardam, showcasing an older version of his code, which didn't enable the QSPI mode which quadrupled the Flash memory bandwidth (so it's much faster now):

Well, to sum up, this is a feature set closer to that of a higher-end calculator, in the body of a mid-range calculator, thanks to the addition of a < 1 USD/EUR chip (for the 8 MB one) into that model designed by the manufacturer for upgradability. The process for soldering a 1.27mm (50 mil) pitch chip is usually considered doable, even with limited experience, as long as the soldering iron's tip is in a decent state. The performance is rather good for a mid-range calculator, thanks to the 32-bit Cortex-M4 running at 100 MHz used by NumWorks - all the more unlike the ~48 MHz eZ80 powering the TI-84 Plus CE / TI-83 Premium CE (much less efficient micro-architecture per clock cycle, which performs less advanced operations), the NumWorks calculators' Cortex-M4 processor speed isn't hampered by waitstates, as the RAM, the memory bus and the Flash memories can run at 100 MHz.

zardam a donc clairement gagné le challenge, dès novembre 2017 :bj:
Un an plus tard, il a posté un résumé de certains éléments techniques et procédures dans un article sur son blog: modifications matérielles et logicielles réalisées, et la façon de les compiler et installer.
Je dois donc lui présenter mes excuses pour avoir pris beaucoup trop de temps, malgré un certain nombre de relances par d'autres membres de l'équipe, pour écrire, en partie à l'occasion de congés d'été, cet article promis dans la news annonçant le défi (sans indication de durée il est vrai, mais ce n'est pas une raison valable :P). A vrai dire, je ne pensais pas que quelqu'un s'en emparerait et produirait aussi rapidement un tel résultat... j'avais tort :)
All in all, zardam clearly won the challenge, as early as November 2017 :bj:
A year later, he posted a summary of several technical notes and procedures in an article on his blog: hardware and software changes, and the way to build and install them.
Therefore, I need to apologize to him for taking way too much time, despite multiple pings by other staff members, to write, partially during summer holidays, the article promised in the news item announcing the challenge (without giving a timeline, granted, but that's not a valid reason :P). To tell the truth, I didn't expect that anyone would raise up to the challenge and would produce such a result so quickly... I was wrong :)

Résumons et commentons certaines parties de son travail:
  • le premier programme permettant de flasher le chip externe de Flash se base sur deux éléments principaux de logiciel open source: libopencm3, une librairie pour gérer divers microcontrôleurs à base de coeurs ARM Cortex-M et leurs périphériques sans avoir à tout réinventer soi-même à partir de la datasheet et des éventuels exemples fournis par le fabricant, et Flashrom, auquel il faut fournir les paramètres et commandes du chip de Flash s'ils ne font pas encore partie de la banque de données standard du programme, mais qui s'occupe de tout (effacement de blocs, écriture, etc.) à partir de ces paramètres. zardam a eu bien raison d'utiliser ces briques de construction logicielle, d'autant qu'à l'époque, le firmware officiel NumWorks ne fournissait pas encore de capacité de communication USB: elle est arrivée 5 mois plus tard, dans la version 1.4 d'avril 2018.
  • zardam a implémenté un bootloader offrant le multi-boot dans un mini-firmware, pour permettre le basculement d'un firmware à un autre (y compris de quoi flasher une partie de la Flash interne du microcontrôleur à partir de la Flash externe) sans devoir passer par un ordinateur. Bonne idée, cela peut être utile dans certaines configurations de test qu'il devait rencontrer.
  • il semble que l'activation du mode QSPI de la Flash externe (pour plus de vitesse) avec le programme qu'il a fait ne doive être réalisée qu'une fois. C'est important, il pense que c'est en le faisant plusieurs fois qu'il a grillé le microcontrôleur principal STM32 de sa calculatrice, il a dû le remplacer. Cette opération de remplacement du chip principal est nettement plus difficile que le soudage du chip de Flash externe, car le pas des pattes est plus fin et les pattes sont beaucoup plus nombreuses. NdT: Il paraît que l'utilisation de flux de soudage aide.
Let's summarize, and comment on, several parts of his work:
  • the initial program for flashing the external chip ls based on two main pieces of open source software: libopencm3, a library for handling a variety of microcontrollers based on ARM Cortex-M cores and their devices without having to reinvent the wheel from scratch from the datasheet and code examples provided by the manufacturer (if any), and Flashrom, which needs to be given the Flash chip's parameters and commands if they're not part of the standard database of the program yet, but which takes care of everything (block erases, block writes, etc.) from these parameters. zardam totally did the right thing using these software building blocks, all the more at the time, NumWorks' official firmware didn't provide a USB communication ability yet: it came up 5 months later, in the 1.4 version released in April 2018.
  • zardam implemented a multi-boot-capable bootloader in a mini-firmware, so that the calculator can be switched from a firmware to another (including something to reflash the internal Flash chip from the external Flash chip) without having to be connected to a computer. It's a good idea, it can be useful in some testing configurations which were probably relevant to him.
  • it seems that the QSPI mode of the external Flash chip (for higher speed) with the additional program he made needs to be done only once. This is important, he thinks that doing it multiple times is the reason why fried his calculator's main STM32 microcontroller. He had to replace it, and the process for replacing the main chip is much harder than soldering the external Flash chip, as the pitch is finer and there are many more pins. Translator's note: it appears that using soldering flux can help.

Si vous voulez utiliser votre calculatrice NumWorks comme cobaye pour répliquer le travail de zardam, et ainsi la faire monter en gamme pour un très faible coût et un risque limité, basez-vous sur son billet de blog, qui détaille, comme déjà indiqué, les différentes étapes de la construction des images et du flashage :)
Peut-être que quelqu'un sera intéressé par la mise à jour de l'intégration firmware NumWorks <-> giac vers la version actuelle du firmware NumWorks ? ;)

Une nouvelle fois, bravo à zardam pour son travail :)

Liens externes utiles :
If you want to use your NumWorks calculator as a testbed for replicating zardam's work, thereby upgrading it at a very low cost and a limited hardware risk, use his blog's article, which lists, as already mentioned, the steps for building images and flashing the calculator :)
Maybe someone will be interested by upgrading the NumWorks firmware <-> giac integration to the current version of the NumWorks firmware ? ;)

Once again, congratulations to zardam for his work :)

Useful external links:

Re: Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 01 Aug 2019, 07:51
by critor
Merci pour cet article fort intéressant. :)

Re: Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 01 Aug 2019, 08:08
by Lionel Debroux
Merci, mais il est peu utile, mon article... j'aurais dû le faire beaucoup plus tôt. En ne le faisant que la plus grosse partie de 2 ans plus tard, ce n'est pas ainsi que je vais inciter les gens à faire la manip.

Re: Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 03 Aug 2019, 07:30
by Wistaro
Très intéressant !

Merci :)

Re: Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 04 Jan 2020, 17:23
by critor
Maintenant que nous avons le firmware Omega permettant de faire cohabiter les modifs/améliorations communautaires avec les derniers ajouts officiels de NumWorks, serait-il possible d'y pousser un support propre pour la puce Flash externe rajoutée sur N0100, histoire de pouvoir par exemple installer KhiCAS sur NumWorks N0100 ?

Merci.

Re: Challenge NumWorks++: résumé / wrap up...

Unread postPosted: 04 Jan 2020, 17:30
by M4x1m3
Je pense que oui. Honnêtement j'y ai pensé, maintenant que j'ai une n0100. J'aimerais ne pas trop prendre de risque avec mon HW, je vais donc attendre d'avoir une 2e n0100 avant de souder une puce de flash dessus, mais je compte le faire. Si les drivers sont déjà écris, adaptés à Ion, il ne devrait pas être trop dure de rajouter un modèle spéciale (MODEL=n0100++ par exemple) ou de faire une option de compilation (MODEL=n0100 HAS_FLASH=1) dans le build-system et d'ajouter une option FLASH_DRIVER pour pouvoir choisir son type de flash.