dimanche 27 mars 2016

Utilisation du STM32 VL/L discovery sous Linux

C'est possible et on peut se faciliter la vie avec un bon makefile. Auparavant ils vous faut installer l'ensemble des outils : le compilateur et l'outil de flashage/déboggage.

Cross compiler pour ARM

Installation du compilateur gcc-arm-none-eabi

Il devrait être fourni par la majorité des distributions :

#Debian/Ubuntu
sudo apt-get install gcc-arm-none-eabi
#Archlinux
yaourt gcc-arm-none-eabi

Sinon vous trouverez ici les sources et binaires.

https://github.com/esden/summon-arm-toolchain

Le tarball :

https://launchpad.net/gcc-arm-embedded/+download

Example de compilation

Compilation d'un fichier main.c

/usr/bin/arm-none-eabi-gcc -O1 -c -mcpu=cortex-m3 -mthumb \
-msoft-float -gdwarf-2 -mno-sched-prolog -fno-hosted -mtune=cortex-m3 -march=armv7-m -mfix-cortex-m3-ldrd \
-DSTM32F10X_MD_VL -DUSE_STDPERIPH_DRIVER -I"/home/toto/ROM_READER/cmsis" -I"/home/toto/ROM_READER/device"\
-I"/home/toto/ROM_READER/inc" -I"/home/toto/ROM_READER/stm32lib/inc" /home/toto/ROM_READER/src/main.c

Édition des liens (connection des fichiers compilés)

/usr/bin/arm-none-eabi-gcc -o Demo.elf -O1  -g -Wall \
-Werror  -fno-exceptions -ffunction-sections -fdata-sections -nostartfiles -Wl,--gc-sections,\
-T/home/toto/ROM_READER/device/linker/STM32F100RB_FLASH.ld  core_cm3.o system_stm32f10x.o \
stm32f10x_gpio.o stm32f10x_rcc.o main.o startup_stm32f10x_md_vl.o 

Convertion du binaire au format elf en binaire exécutable par le systême.

/usr/bin/arm-none-eabi-objcopy -O binary Demo.elf Demo.bin

Liste de la taille des sections et la taille totale.

/usr/bin/arm-none-eabi-size -B Demo.hex

Flasher le STM-32

Installation de st-link

Si vous n'avez pas de "flasheur" JTAG comme le bus pirate, les kit de développment ont une puce (un autre stm32) qui convertie la liaison série en JTAG. Cela parmet de programmer directement votre STM32 par USB.

Pour communiquer avec cette puce vous avez besoin de st-link (https://github.com/texane/stlink). St-link foruni une bibliothèque de communication (libstlink), un serveur de déboggage GDB (st-util), et un outil de flashage (st-flash). Les dépendances requises sont libusb, pkg-config et autotools.

git clone stlink
cd stlink
./autogen.sh
./configure
make

Exemple pour charger un fichier

Il vous faudra utiliser l'option v1 pour votre vl discovery et v2 pour votre l discovery (v2 l'est par défaut). Stlink vous permet de lire et d'écrire la rom flash du stm32.

# Lecture de 4096 addresses d'un VL et transfert dans out.bin
./st-flash read v1 out.bin 0x8000000 4096
# De même avec un v2
./st-flash read out.bin 0x8000000 4096
# Écriture du binaire in.bin dans la rom
./st-flash write v1 in.bin 0x8000000 

Pour lancer le programme, n'oubliez pas de resetter votre stm32 après le chargement du binaire.

Si vous n'aimez pas la ligne de commande, reportez vous sur l'interface graphique stlink-gui:



Un makefile

Pour vous faciliter la vie voici un Makefile et les sources fournies par STM pour le VL-Discovery (https://github.com/z3bu/STM32VL-Discovery).

git clone https://github.com/z3bu/STM32VL-Discovery
cd STM32VL-Discovery
#Compilation de la démo
make
#Écriture de la flash
make load

Les bibliothèques fournies par STM sont dans le dossier stm32lib. Les fichiers core sont dans cmsis, l'éditeure de lien, le fichier assembleur de startup, et d'autres définitions pour le STM32 sont dans le dossier device.

Décommentez ou ajoutez dans le Makefile et inc/stm32f10x_conf.h lorsque vous voulez utiliser de nouvelles bibliothèques dans votre programme.

samedi 26 mars 2016

Utiliser votre vieux modem club internet comme routeur/point d'accés et plus si affinité.

Si vous avez un modem AH4222 à l'interface SFR inexploitable (il ne permet pas de changer son adresse ip et d'autres paramètres), voici comment rétablir sont firmware d'origine, voir le modifier.

Le routeur à par défaut l'adresse IP 192.168.1.1. Cadencé à 256 MHz, 16 MB de ram, il a une petite ROM de 4 Mio Il a heureusement un utilitaire CFE (Common Firmware Environment) qui permet de flasher le bcm6348.

Méthode simple

Si vous voulez simplement remettre le firmware d'origine, la méthode la plus simple est de télécharger le firmware que j'ai pu recompilé ici (la méthode de recompilation se trouve après). Le CFE est accessible par liaison série et également par l'interface web après avoir maintenu le bouton reset pendant 30 secondes. accédez par la suite à l'interface sur l'adresse de la box.

Méthode avancée

Vous povez utiliser la liaison série. Les paramètres de liaison sont 115200bps, 8 bits, pas de parité, 1 bit de stop. Les niveaux sont à 3.3V.

Donc si vous voulez vous amuser: achetez un convertisseur USB-Série.

Le brochage est, en numérotant les broches du haut vers le bas :
  1. Vcc (3.3V)
  2. Rx
  3. Tx
  4. GND
Pour connecter un terminal depuis linux a votre box:
#Avec putty
putty -serial /dev/ttyUSB0 -sercfg 11520
#Avec screen
screen /dev/ttyUSB0 115200

Si vous utilisez le port série de votre PC, remplacez ttyUSB0 par ttyS0.

Vous devriez être en mesure de voir les logs de boot de la box. Au début du boot un compteur vous laissera le temps d'accéder au CFE, c'est ce qui nous intéressera pour flasher le modem.
CFE version 1.0.37-0.7 for BCM96348 (32bit,SP,BE)
Build Date: Thu Mar  2 16:45:45 CST 2006 (root@hp)
Copyright (C) 2000,2001,2002,2003 Broadcom Corporation.

Initializing Arena.
Initializing Devices.
Flash device ID:22f6
AMD FLASH FAMILY
Auto-negotiation timed-out
10 MB Half-Duplex (assumed)
CPU type 0x29107: 256MHz, Bus: 128MHz, Ref: 32MHz

Total memory used by CFE:  0x80401000 - 0x805232F0 (1188592)
Initialized Data:          0x8041B390 - 0x8041CC60 (6352)
BSS Area:                  0x8041CC60 - 0x804212F0 (18064)
Local Heap:                0x804212F0 - 0x805212F0 (1048576)
Stack Area:                0x805212F0 - 0x805232F0 (8192)
Text (code) segment:       0x80401000 - 0x8041B388 (107400)
Boot area (physical):      0x00524000 - 0x00564000
Relocation Factor:         I:00000000 - D:00000000

Board IP address                : 192.168.1.1:ffffff00  
Host IP address                 : 192.168.1.100  
Gateway IP address              :   
Run from flash/host (f/h)       : f  
Default host run file name      : vmlinux  
Default host flash file name    : bcm963xx_fs_kernel  
Boot delay (0-9 seconds)        : 1  
Board Id Name                   : 96348GW  
Psi size in KB                  : 24
Number of MAC Addresses (1-32)  : 12  
Base MAC Address                : 00:16:38:de:de:de  
Ethernet PHY Type               : Internal
Memory size in MB               : 16

*** Press any key to stop auto run (1 seconds) ***
Auto run second count down: 

Voici les logs du CFE, vous pouvez y accédez si vous appuyez sur une touche (par votre terminal série) dans le temps qui vous est imparti.

Par la suite il est possible de changer le "boot delay" et l'addresse IP utilisé par le CFE.

Compilation du firmware

Avant d'essayer de tout recompiler j'ai tenté de récupérer le firmware image d'origine sur une box qui n'avait pas subi de mise à jour lors du passage à SFR.
cat /dev/mtdblock > /dev/ttySO

Du coté de mon linux j'ai utilisé dd pour récupérer l'image. Cependant cette méthode ne semble pas marcher.

Installation de la toolchain (debian 8)

Téléchargez au choix les .rpm ou .deb ici et installez les.

dpkg -i *.deb

Le tout est installé dans /opt/toolchain.

Maintenant vous pouvez récupérer les sources publiées par Club Internet (v44) dans le même répertoire (vous aurez des problèmes avec cmplzma et mksquashfs qui nécessitent libfstc++.so.5, les sources en elles mêmes nécessitent des modifications)

Sinon vous pouvez clonez le git https://github.com/z3bu/AH4222/ auquel j'ai apporté des modifications sur les binaires permettant la compression de l'image finale (cmplzma et squashfs version 2.0 compilés pour Debian 8), mais également quelquse mini patch sur le code source. Pour cmplzma j'ai utilisé le paquet officiel (sinon prenez le ici), pour squashfs j'ai du retrouver la bonne version et la recompiler. Quelqu'un a fais un dépot avec pleins d'utilitaires de ce genre : https://github.com/z3bu/firmware-mod-kit.

Placez vous dans le dossier des sources et compilez le tout ainsi :

make PROFILE=96348GWV

Désormais pour le transférer, référez vous à l'interface web du CFE. Si vous voulez le faire par le port série il vous faut :

Installer tftp-hpa, modifier/identifier le répertoire du serveur (par défaut /srv/tftp) dans le fichier /etc/conf.d/tftpd.

Copiez-y le firmware qui se situe dans

Lancer le service

systemctl start tftpd 

Maintenant il est temps de revenir au CFE par le port série, à l'aide d'un terminal entrez :

flashimage 192.168.1.41:bcm96348GWV_fs_kernel_AH4222...

J'ai eu quelques problème de conflit d'adresse ip lors du flashage, il est possible de changer l'addresse ip du routeur à l'aide du CFE, mais il faudra redémarrer la box par la suite. Ce problème de conflit rendait le chargement de l'image par tftp impossible.

Une fois flashé vous pouvez vous connecter à l'aide de telnet sur la box ! Les identifiants par défaut sont :

id: root
mdp : clubadmin

Par contre j'aurais aimé retrouver retrouver le brochage du port JTAG, si quelqu'un a des sources.