[MQX] Utiliser MFS avec une Nand Flash

Les versions de MQX antérieures à 4.0 ne supportent pas de monter un système de fichier sur une mémoire Nand Flash externe. Pourquoi? MFS, la librairie intégrée à MQX pour gérer les systèmes de fichier est basée sur FAT, qui a l’avantage d’être très répandu (windows, linux, clé usb, …), mais qui n’est pas adapté aux Nand Flash (pas de support du wear leveling).

Le document « Release notes » de MQX 4.0 change la donne:

Ready for new Freescale NAND Flash File System library.

o The MQX 4.0 has been tested with the new FFS library which implements the wear leveling algorithms and support for on-chip NAND Flash controller.

o This library enables the MFS filesystem to be installed and used on top of the NAND Flash memory devices.

o The FFS library is available as a standalone installation package.

Autrement dit, MQX 4.0 introduit le support des Nand Flash par MFS, mais il faut installer un add-on.

Cet add-on n’est pas encore disponible au téléchargement sur le site institutionnel de Freescale (cependant une alternative payante est référencée)

En revanche, une version « preview » est disponible sur le réseau social de la marque: NAND Flash File System patch for Freescale MQXâ„¢ RTOS 4.0.0

[MQX] mktfs.exe: comment l’utiliser correctement (basé sur « httpsrv example »)

MQX 4.0 vous propose l’outil mktfs.exe pour générer un fichier .c compatible avec le système de fichier TFS.

mktfs.exe se lance en ligne de commande et transforme chaque fichier contenu dans un répertoire donné (et ses sous-répertoires) en un tableau d’octets. Les octets contenus dans ces tableaux sont bien sûr les octets qui constituent les fichiers.

Pour faire fonctionner correctement cet outil, il faut prendre en considération les points suivants:

Fichier de sortie

Le fichier de sortie de mktfs.exe s’appelle tfs_data.c. Il est créé dans le répertoire de travail courant de la ligne de commande. Il n’est pas possible de modifier le nom du fichier ni son chemin.

Nommage automatique des tableaux

Les tableaux d’octets générés par mktfs.exe dans tfs_data.c sont nommés automatiquement. En particulier, les noms sont fabriqués à partir du répertoire de travail qui a été spécifié en argument lors de l’appel à mktfs.exe, du sous-répertoire dans lequel se trouve chaque fichier, et bien sûr du nom du fichier lui-même.

C’est là qu’il y a un problème potentiel: si l’une des composantes du chemin d’accès aux fichiers (y compris le nom du fichier lui-même) contient un caractère illégal du point de vue du nommage des variables en langage C, le fichier tfs_data.c résultant ne sera pas compilable.

En particulier, si l’on travaille sous Windows et que l’on passe un chemin d’accès absolu en argument à mktfs.exe (« C:\mon_projet », par exemple), les noms de variables générés dans tds_data.c vont systématiquement comporter « C:\ ». Or, le double point et l’antislash sont des caractères illégaux dans les noms de variables en C.

La solution

Pour utiliser correctement mktfs.exe, il faut donc respecter deux règles simples:

  1. Le lancer à partir du répertoire dans lequel le fichier tfs_data.c doit être généré.
  2. Les fichiers à traiter doivent se trouver dans un sous-répertoire du répertoire qui contient tfs_data.c.

[MQX] Le programme d’exemple « httpsrv »

Capture d'écran d'une page générée par le firmware "httpsrv example"

Capture d’écran d’une page générée par le firmware « httpsrv example »

Le programme d’exemple « httpsrv » fourni avec MQX 4.0 génère un serveur web avec support CGI. Le but de cet article est de présenter une petite astuce qui tue pour le faire marcher correctement sur le kit d’évaluation TWRK60F120M-KIT, et d’analyser comment il fonctionne.

Etape 1: Générer le projet

Pour créer l’application « httpsrv », il faut commencer par les étapes suivantes:

  1. Dans CodeWarrior 10.3, aller dans le menu File, puis New et enfin MQX 4.0 Project.
  2. Le wizard demande un nom pour le nouveau projet: « web » par exemple.
  3. Sélectionner le nom du kit d’évaluation pour lequel le projet sera généré (dans mon cas: Kinetis Evaluation Board, TWRK60F120M Board.
  4. Cliquer sur Next (pas sur « Finish »)
  5. Choisir l’option « Select application Type » : Example application.
  6. Dans le dossier RTCS examples, sélectionner httpsrv example
  7. Cliquer sur Finish.

L’application est maintenant générée et se trouve dans la liste des projets actuellement ouverts.

Etape 2: Corriger les erreurs de compilation

En suivant la procédure ci-dessus, j’ai obtenu une application qui ne compile pas. Les dépendances avec le module « shell » de MQX ne sont pas résolues. Si vous avez le même problème, voici comment le résoudre:

  1. Dans la fenêtre CodeWarrior Projects, faire un clic-droit sur le nom de l’application et sélectionner le menu Properties.
  2. Développer le dossier C/C++ Build et sélectionner l’option Settings.
  3. Dans l’onglet Tool Settings, développer le dossier ARM Compiler et sélectionner l’option Input.
  4. Ajouter ${MQX_ROOT_DIR}/lib/twrk60f120m.cw10/debug/shell dans Include User Search Path
  5. Développer le dossier ARM Linker et sélectionner l’option Input.
  6. Ajouter ${MQX_ROOT_DIR}/lib/twrk60f120m.cw10/debug/shell dans Library Search Paths
  7. Ajouter « shell.a » dans Additional Libraries.
  8. Valider en cliquant sur OK.
  9. Effectuer un Clean Project
  10. Build Project devrait maintenant construire l’application sans erreur.

Etape 3: Vérifier la position des jumpers sur la carte TWR-SER

Pour être certain que le port Ethernet du kit d’évaluation TWRK60F120M-KIT fonctionne, il faut positionner correctement les cavaliers J2 et J12 sur la carte TWR-SER.

  • Cavalier J2 sur la position 3-4
  • Cavalier J12 sur la position 9-10

La discussion suivante sur le site communautaire de Freescale donne toutes les explications à ce sujet: rtcs_shell_twrk60f120m and httpsrv_twrk60f120m

Etape 4: Comment ça marche ?

Ce programme d’exemple, une fois chargé sur le kit d’évaluation TWRK60F120M-KIT, fourni une interface en ligne de commande (shell) via le port série pour régler les paramètres TCP/IP.
Avec une liaison RS232 et un terminal, on accède notamment à une commande « ipconfig » qui permet de régler l’adresse IP et le masque réseau de l’interface Ethernet.

Une fois ces paramètres réglés, un navigateur internet quelconque permet de se connecter au serveur web intégré.

[MQX] Le programme d’exemple « Hello World »

TowerSystem

Voilà,

Après avoir installé CodeWarrior 10.3, MQX 4.0, assemblé le kit d’évaluation (TWRK60F120M-KIT, composé des cartes TWRK60F120M et TWR-SER), je suis prêt à tester mon tout nouveau jouet: une microcontrôleur Kinetis K60, de chez Freescale.

Pour ce premier contact, l’objectif tient en une ligne: « Hello World ».

Etape 1: Préparatifs

La fonction printf() va envoyer les caractères passés en paramètres sur la sortie standard.

Avec MQX et le kit d’évaluation TWRK60F120M-KIT, l’entrée et la sortie standard s’effectuent par défaut via l’UART 5. Cela est bien pratique, car c’est justement l’UART 5 qui est relié au connecteur DB9 déporté sur la carte d’extension TWR-SER.

Pour info, les paramètres par défaut de l’UART 5 sont:

  • Baudrate = 115200
  • Parity = None

Pour obtenir l’affichage « Hello World » sur le PC, il faut donc relier le connecteur DB9 du kit d’évaluation à un port série du PC. Ensuite, un terminal (PuTTY, Hyperterminal, etc…) sera nécessaire. CodeWarrior 10.3 possède un terminal qui fait parfaitement l’affaire (mais il est un peu caché!).

Etape 2: Générer le projet

Pour créer rapidement l’application « Hello World », tout est déjà prévu. Il suffit de suivre les étapes suivantes:

  1. Dans CodeWarrior 10.3, aller dans le menu File, puis New et enfin MQX 4.0 Project.
  2. Le wizard demande un nom pour le nouveau projet: « helloworld » par exemple.
  3. Sélectionner le nom du kit d’évaluation pour lequel le projet sera généré (dans mon cas: Kinetis Evaluation Board, TWRK60F120M Board.
  4. Cliquer sur Next (pas sur « Finish »)
  5. Choisir l’option « Select application Type » : Example application.
  6. Dans le dossier Basic examples, sélectionner hello example
  7. Cliquer sur Finish.

L’application est maintenant générée et se trouve dans la liste des projets actuellement ouverts. Il comprend une seule tâche, qui fait une seule chose:

printf("Hello World\n");

Un clic sur Build et la compilation s’effectue sans erreur.

Etape 3: Exécution

Un clique sur le bouton Debug lance le chargement du projet sur le K60. Une fois le chargement effectué, l’exécution du programme est suspendue jusqu’à ce que l’utilisateur clique sur le bouton « Run ».

Avant de faire cela, il convient d’ouvrir le terminal qui permettra de voir le texte « Hello World » s’afficher via l’UART 5 :

  • Dans le menu Window, choisir Show View puis Other…
  • Développer le dossier Terminal, sélectionner l’item Terminal et cliquer sur OK
  • Dans l’onglet « Terminal » qui vient d’apparaître, cliquer sur l’icone Connect (zigzag vert). Une fenêtre d’options apparaît.
  • Pour Connection Type, choisir Serial
  • Pour le champ Port, sélectionner le port COM du PC sur lequel est relié le kit d’évaluation
  • Changer la valeur de Baud Rate en 115200
  • Cliquer sur OK

On peut maintenant lancer l’exécution du projet: un clic sur Run (bouton avec la flèche), et le texte « Hello World » s’affiche dans le terminal que l’on vient d’ouvrir.

C’est gagné !

Etape bonus: La même résultat sans port série

MQX permet de définir librement le périphérique qui sert à l’entrée/sortie standard.

En plus des « TTY », qui sont associés aux UARTs du K60 (ex: « ttyf: » est associé à l’UART 5), il est également possible d’utiliser le périphérique « IO Debug ». Avec « IO Debug », la sonde JTAG se débrouille magiquement par acheminer les caractères du printf() dans la Console de debug de CodeWarrior. Ce qui permet de se passer du port série.

Pour obtenir ce résultat:

  1. Ouvrir le code source de MQX: rechercher le fichier .wsd correspondant au kit d’évalutation (dans mon cas: C:\Freescale\Freescale_MQX_4_0\config\twrk60f120m\cw10\twrk60f120m.wsd) et le faire glisser-déposer dans l’onglet « CodeWarrior Projects » de CodeWarrior.
  2. Ouvrir le projet du BSP (dans mon cas: bsp_twrk60f120m)
  3. Dans le dossier twrk60f120m User Config, double-cliquer sur user_config.h
  4. Dans la section Default Driver Installation in BSP startup, mettre la valeur de BSPCFG_ENABLE_IODEBUG à true.
  5. Dans la section Default MQX initialization parameters, mettre la valeur de BSP_DEFAULT_IO_CHANNEL à « iodebug: » (y compris les guillements).
  6. Il faut maintenant tout recompiler en cliquant sur Build All.

Avec cette modification dans le code source de MQX, tous les caractères passés à printf() vont s’afficher dans la console de debug de CodeWarrior.

Avantages:

  1. On se passe de la liaison RS232.
  2. On peut même se passer complètement de la carte d’extension TWR-SER pour faire fonctionner ce programme d’exemple.

Inconvénients :

  1. C’est très lent.
  2. Pour des projets plus compliqués, il y a un risque de blocage. Notamment, il devient impossible de faire fonctionner le programme d’exemple du lecteur de carte SD.