Tags

arm64 blacklistd bluepill bluetooth cu dns dovecot elf envsubst esp8266 filter freebsd ipfw lets_encrypt opensmtpd python shell ssl stm32 template tls unbound yubikey

Powered by

blOg
maRkdown
awK
shEll

09/10/2022

[ stm32 bluepill elf ]

202210090800 stm32 bluepill elf

FreeBSD et bluepill, corrections

J'ai raconté plusieurs conneries dans mon billet FreeBSD et bluepill qu'il me faut corriger.

openocd et mon adaptateur

Quand openocd affiche le message suivant:

$ openocd -f openocd.cfg -c "init"
Open On-Chip Debugger 0.11.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
none separate

Info : clock speed 1000 kHz
Info : STLINK V2J17S4 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.137032
Warn : UNEXPECTED idcode: 0x2ba01477
Error: expected 1 of 1: 0x1ba01477

Ce n'est pas l'adaptateur qui pose problème mais bien la bluepill comme on peut le lire sur hackaday.com:

[ snip bluepill version Chang ]
...
A major difference one will quickly encounter with this chip is when programming it and getting the message "UNEXPECTED idcode: 0x2ba01477". The reason for this is that the STM32F103 MCU reports the ID 0x1ba01477, confusing the programmer.
....

core.S

Toujours depuis ce fichier assembleur, avec une nouvelle modification en provenance directe du jardin magique (merki miod@ et semarie@): utiliser le préprocesseur pour définir la valeur du registre r7:

$ fetch -o - https://raw.githubusercontent.com/WRansohoff/STM32F0_minimal/master/core.S | sed -e 's/cortex-m0/cortex-m3/' -e 's/reset_handler/Reset_Handler/g' -e 's/_estack/__end_stack/' -e 's/0xDEADBEEF/R7_REGISTER/' > core.S

On compile avec l'option -x assembler-with-cpp et la valeur:

$ clang --target=arm-none-eabi -mcpu=cortex-m3 -mfloat-abi=soft -x assembler-with-cpp -DR7_REGISTER=0xDEADBEEF -c core.S -o core.o

On génère le binaire avec le linker script :

$ fetch -o stm32-base.zip https://github.com/STM32-base/STM32-base/archive/refs/heads/master.zip
$ tar xf stm32-base.zip STM32-base-master/linker
$ clang --target=arm-none-eabi -mcpu=cortex-m3 -mfloat-abi=soft -nostdlib -L STM32-base-master/linker -T STM32-base-master/linker/STM32F1xx/STM32F103xB.ld core.o -o core.elf

Pour vérifier la prise en compte de la valeur:

$ readelf -x .text main.elf

Hex dump of section '.text':
  0x08000000 00500020 09000008 02488546 024f0020 .P. .....H.F.O.
  0x08000010 401cfde7 00500020 efbeadde          @....P. ....

efbeadde correspond bien à la version petit boutiste de DEADBEEF.

objcopy

Partie la plus sensible qui va me jouer des tours pendant plusieurs semaines, la conversion du .elf en .bin . On peut lire un peu partout cette commande:

$ objcopy -O binary main.elf main.bin

Mais sur FreeBSD on trouve 2 objcopy:

$ ls -l /usr/bin/*objcopy
-r-xr-xr-x  2 root  wheel  4025248 May 21 09:32 /usr/bin/llvm-objcopy
-r-xr-xr-x  2 root  wheel   129560 May 21 09:32 /usr/bin/objcopy
$ file /usr/bin/*objcopy
/usr/bin/llvm-objcopy: ELF 64-bit LSB executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, FreeBSD-style, stripped
/usr/bin/objcopy:      ELF 64-bit LSB pie executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.1, FreeBSD-style, stripped

En partant d'un fichier source aussi simple que celui-ci:

void __libc_init_array(void) {} // startup_common.s
int integer_in_data_section = 1; // la section .data ne doit pas être vide

int
main(void) {
    int i = 0;
    while (1) {
        i += integer_in_data_section;
    }

    return i;
}

Je commence par compiler un fichier assembleur correspondant à la carte:

$ tar xf stm32-base.zip STM32-base-master/startup
$ clang --target=arm-none-eabi -mcpu=cortex-m3 -mfloat-abi=soft -I STM32-base-master/startup -c STM32-base-master/startup/STM32F1xx/STM32F103xB.s -o startup.o
STM32-base-master/startup/startup_common.s:24:1: warning: Reset_Handler changed binding to STB_WEAK
.weak Reset_Handler

puis mon fichier source:

$ clang --target=arm-none-eabi -mcpu=cortex-m3 -mfloat-abi=soft -c main.c -o main.o
$ clang --target=arm-none-eabi -mcpu=cortex-m3 -mfloat-abi=soft -nostdlib -L STM32-base-master/linker -T STM32-base-master/linker/STM32F1xx/STM32F103xB.ld main.o startup.o -o main.elf
$ size main.elf
  text   data    bss    dec     hex   filename
   416      4   1536   1956   0x7a4   main.elf

que je dois convertir en .bin :

$ objcopy -O binary main.elf main.bin
$ ls -l main.bin
-rwxr-xr-x  1 dsx  wheel  402653188  2 nov.  19:39 main.bin

400 Mo pour incrémenter une variable, on dépasse un peu les bornes des limites. Avec le "bon" objcopy:

$ llvm-objcopy -O binary main.elf main.bin
$ ls -l main.bin
-rwxr-xr-x  1 dsx  wheel  420  2 nov.  19:41 main.bin

A moi (enfin !) les <blink>leds</blink> qui clignottent !

Commentaires: https://github.com/bsdsx/blog_posts/issues/16


Lien vers ce billet