Xtensa

From Free Pascal wiki
Revision as of 19:34, 26 April 2020 by FPK (talk | contribs) (To use with QEMU)
Warning-icon.png

Warning: The ESP32 support is highly experimental and prone to be broken. This description is work in progress.


So far Linux and Mac hosts only


Xtensa-FreeRTOS

Preparations

Native stable FPC must be installed and working on the system.

Install esp-idf based on the instructions given here:

Get Started (for Stable Release)

Follow the instructions to a least step 8 where you build the hello_word demo project.

copy all the freshly compiled .a files from the current project directory to a directory of your choice:

 mkdir ~/esp/xtensa-esp32-elf-libs
 find ~/esp/ -name "*.a" -exec cp {} ~/esp/xtensa-esp32-elf-libs \; 

Notes:

  • One should not copy libraries from the project/build/bootloader directory, since these libraries do not contain full functionality.
  • Some of the required libraries are located in the esp-idf/components folder. Important to also copy the libraries in the ~/esp/esp-idf/component directory if the demo project was copied to outside the esp-idf directory.

Now you are ready to compile fpc and rtl.

execute

export IDF_PATH=~/esp/esp-idf
source ~/esp/esp-idf/export.sh

to get the path and environment set (namely tools path and $IDF_PATH are needed)

Build FPC

Change into the fpc directory and run

 make FPC=fpc CPU_TARGET=xtensa OS_TARGET=freertos "CROSSOPT=-Cplx6 -XPxtensa-esp32-elf- -Cfhard" all -j


Tips & Tricks

If linking fails due to missing libraries, you can search them by (replace missing_symbol by the missing symbol):

 xtensa-esp32-elf-objdump -t ~/esp/xtensa-esp32-elf-libs/*.a | grep 'missing_symbol\|xtensa-esp32-elf-libs'

Compile and run test program

Create a hello world program in the fpc dir and compile it with

 compiler/ppcrossxtensa -Furtl/units/xtensa-freertos/ -Tfreertos -XPxtensa-esp32-elf- -O3 -Wpesp32 -Fl~/esp/xtensa-esp32-elf-libs  -Fl~/.espressif/tools/xtensa-esp32-elf/esp-2019r2-8.2.0/xtensa-esp32-elf/xtensa-esp32-elf/lib/ hello

Get partition-table.bin and bootloader.bin from the hello_world example compiled above and copy them into the same dir as the compiled hello.bin

Flash with

 esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32  write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 bootloader.bin 0x8000 partition-table.bin 0x10000 hello.bin

Monitor the output with:

 idf_monitor.py  --port /dev/ttyUSB0 hello.elf

Note:

  • Once the bootloader and partition table has been flashed once one could also just flash the application only:
 esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32  write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x10000 hello.bin

Xtensa-Linux

To use with QEMU

Get binutils-gdb sources, e.g. by

 git clone git://sourceware.org/git/binutils-gdb

Copy https://github.com/FPK/binutils-xtensa-config/blob/master/lx6/xtensa-config.h into binutils-gdb/include to configure binutils for the CPU type support by FPC for xtensa-linux. This replaces the original file.

Configure and build binutils with

 ./configure --target=xtensa-linux --disable-gdb --disable-sim --disable-readline --disable-libdecnumber
 make -j `nproc`
 sudo make install

Build FPC

Get latest trunk and build it with:

 make FPC=fpc all OVERRIDEVERSIONCHECK=1 -j "CROSSOPT=-Cfhard -Cawindowed -Tlinux" OS_TARGET=linux CPU_TARGET=xtensa

Create a hello world in the FPC top level directory. Compile it with:

 compiler/ppcrossxtensa hello.pp -Tlinux -Furtl/units/xtensa-linux

Run it with:

 qemu-xtensa ./hello

Xtensa-Embedded