blob: bd4f1271ae45a32813010af14bbd3e0612ba87fa [file] [log] [blame]
###############
LPCXpresso55S69
###############
****************
1. Building TF-M
****************
There are two options for the TF-M build - with or without secondary bootloader (BL2).
1.1 Building TF-M demo without BL2
==================================
To build S and NS application image for the LPCXpresso55S69, run the ``build_tfm_demo.py`` script in ``platform/ext/target/nxp/lpcxpresso55s69/scripts``
Or do it manually using the following commands:
.. code:: bash
$ cmake -S . -B build -DTFM_PLATFORM=nxp/lpcxpresso55s69 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DTFM_PROFILE=profile_medium -DBL2=OFF -G"Unix Makefiles"
$ cd build && make install
1.2 Building TF-M demo with BL2
===============================
To build S and NS application along with a BL2 (bootloader) image for the
LPCXpresso55S69 run the ``build_tfm_demo_bl2.py`` script in ``platform/ext/target/nxp/lpcxpresso55s69/scripts``
Or do it manually using the following commands:
.. code:: bash
$ cmake -S . -B build -DTFM_PLATFORM=nxp/lpcxpresso55s69 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DTFM_PROFILE=profile_medium -DBL2=ON -G"Unix Makefiles"
$ cd build && make install
1.3 Building TF-M regression tests
==================================
To run the S and NS regression tests (``TEST_S=ON`` and ``TEST_NS=ON``), the
secondary image areas must be set to 0 (firmware updates are not possible).
Use the ``build_tfm_regression.py`` script in ``platform/ext/target/nxp/lpcxpresso55s69/scripts``
or do it manually using following commands:
.. code:: bash
$ cmake -S . -B build -DTFM_PLATFORM=nxp/lpcxpresso55s69 -DTFM_TOOLCHAIN_FILE=toolchain_GNUARM.cmake -DTFM_PROFILE=profile_medium -DBL2=OFF -DTEST_S=ON -DTEST_NS=ON -G"Unix Makefiles"
$ cd build && make install
****************
2. Flashing TF-M
****************
After generating the binaries, there are three options to flash them using:
1) **External Segger J-Link flasher**
2) **On-board J-Link debugger** - with update of LPC-Link2 debugger to the Segger J-Link firmware
3) **PyOCD** - supports both DAPLink and J-Link interfaces. The LPCXpresso55S69 boards, by default, use DAPLink firmware.
2.1 Flashing with Segger J-Link
===============================
For command line flashing it is recommended to use external Segger J-Link flasher or to
update the LPC-Link 2 debugger on the development board with the firmware provided by Segger,
which makes the device behave as if there is an on-board J-Link debugger.
For onboard J-Link debugger option please follow this step:
2.1.1 Update the LPC-Link 2 to Segger J-Link
--------------------------------------------
- Install a recent version of the `J-Link Software and Documentation
Pack <https://www.segger.com/downloads/jlink#J-LinkSoftwareAndDocumentationPack>`__.
Version **6.98b** was used with this guide.
- Update the on-board LPC-Link 2 to use the latest J-Link firmware,
following the instructions from Segger: `Getting Started with
LPC-Link2 <https://www.segger.com/products/debug-probes/j-link/models/other-j-links/lpc-link-2/>`__.
- Link the DFU jumper (J4) and make power cycle
- Flash the **NXP LPCXpresso On-Board** firmware image with ``lpcscrypt`` from the ``lpcscrypt_2.1.2_57/scripts`` folder as follows:
.. tabs::
.. group-tab:: Linux
.. code-block:: bash
$ ./program_JLINK ../probe_firmware/LPCXpressoV2/Firmware_JLink_LPCXpressoV2_20190404.bin
.. group-tab:: Windows
.. code-block:: bash
$ program_JLINK ../probe_firmware/LPCXpressoV2/Firmware_JLink_LPCXpressoV2_20190404.bin
Then remove the link on the DFU jumper and power cycle.
2.1.2 Flash images with ``JLinkCommander``
------------------------------------------
To flash TF-M images use the flash scripts provided in ``platform/ext/target/nxp/lpcxpresso55s69/scripts`` folder:
- ``flash_JLink.py`` - for uploading image without BL2
- ``flash_bl2_JLink.py`` - for uploading image with BL2
Or you can do it manually according to paragraph ``2.1.2.1``.
2.1.2.1 Connect to the board using ``JLinkCommander``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. tabs::
.. group-tab:: Linux
.. code-block:: bash
$ JLinkExe -device lpc55s69 -if swd -speed 2000 -autoconnect 1
SEGGER J-Link Commander V6.98b (Compiled Mar 12 2021 15:03:29)
DLL version V6.98b, compiled Mar 12 2021 15:02:22
Connecting to J-Link via USB...O.K.
Firmware: J-Link LPCXpresso V2 compiled Apr 4 2019 16:54:03
Hardware version: V1.00
S/N: 729458359
VTref=3.300V
Device "LPC55S69_M33_0" selected.
...
Cortex-M33 identified.
.. group-tab:: Windows
.. code-block:: bash
$ JLink -device lpc55s69 -if swd -speed 2000 -autoconnect 1
SEGGER J-Link Commander V6.98b (Compiled Mar 12 2021 15:03:29)
DLL version V6.98b, compiled Mar 12 2021 15:02:22
Connecting to J-Link via USB...O.K.
Firmware: J-Link LPCXpresso V2 compiled Apr 4 2019 16:54:03
Hardware version: V1.00
S/N: 729458359
VTref=3.300V
Device "LPC55S69_M33_0" selected.
...
Cortex-M33 identified.
2.1.2.2 Flash the built images
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
When BL2 is disabled, flash the generated hex secure and non-secure images:
::
J-Link> loadfile ${BUILD_DIR}/bl2.hex
J-Link> loadfile ${BUILD_DIR}/tfm_s_signed.bin 0x00008000
J-Link> loadfile ${BUILD_DIR}/tfm_ns_signed.bin 0x00030000
If you built TF-M with the BL2 secondary bootloader, use following commands:
::
J-Link> loadfile ${BUILD_DIR}/tfm_s.hex
J-Link> loadfile ${BUILD_DIR}/tfm_ns.hex
2.2 Flashing with PyOCD
=======================
PyOCD is an open source Python package for programming and debugging Arm Cortex-M microcontrollers using multiple supported types of USB debug probes.
See: `PyOCD <https://pypi.org/project/pyocd/>`__
To flash TF-M images with PyOCD you can use the flash scripts provided in ``platform/ext/target/nxp/lpcxpresso55s69/scripts`` folder:
- ``flash_PyOCD.py`` - for uploading image without BL2
- ``flash_bl2_PyOCD.py`` - for uploading image with BL2
You should get the following output (flashing without BL2):
::
$ python flash_PyOCD.py
0001749:INFO:eraser:Mass erasing device...
0001749:INFO:eraser:Erasing chip...
0001902:INFO:eraser:Done
0001902:INFO:eraser:Successfully erased.
[====================] 100%
0007694:INFO:loader:Erased 262144 bytes (8 sectors), programmed 203776 bytes (398 pages), skipped 0 bytes (0 pages) at 33.91 kB/s
[====================] 100%
0005187:INFO:loader:Erased 131072 bytes (4 sectors), programmed 121856 bytes (238 pages), skipped 0 bytes (0 pages) at 34.13 kB/s
Or do it manually according the following steps:
If you built TF-M with the BL2 secondary bootloader, use the following commands:
::
$ pyocd erase --mass -t LPC55S69
$ pyocd flash ${BUILD_DIR}/tfm_s.hex ${BUILD_DIR}/tfm_ns.hex -t LPC55S69
When BL2 is disabled, flash the generated hex secure and non-secure images:
::
$ pyocd erase --mass -t LPC55S69
$ pyocd flash ${BUILD_DIR}/bl2.hex -t LPC55S69
$ pyocd flash ${BUILD_DIR}/tfm_s_ns_signed.bin --base-address 0x8000 -t LPC55S69
.. Note::
At present, the reset target command does not seem to respond, so you can reset the device to start firmware execution via the physical RESET button (S4). There is sometimes also a stability issue with the flash erasing, so if the script freezes, it is needed to terminate the script, physically reset the target an rerun it again.
.. Warning::
When using PyOCD on Windows, there might currently occur an issue with the ``libusb`` library. In that case, download the ``libusb`` library from `here <https://libusb.info/>`__ and copy .DLL file into the Python installation folder (next to python.exe)
************
3. Debugging
************
3.1 Debugging with Segger Ozone
===============================
If you have a commercially licensed Segger J-Link, or if you meet the
license terms for it's use, `Segger's cross-platform Ozone
tool <https://www.segger.com/products/development-tools/ozone-j-link-debugger/>`__
can be used to debug TF-M firmware images.
To debug, flash the BL2, S and NS firmware images using the ``flash.py``
script or command-line options described earlier in this guide, and
configure a new project on Ozone as follows:
- Device: LPC55S69
- Target Interface: SWD
- Target Interface Speed: 2 MHz
- Host Interface: USB
- Program File: build/secure\_fw/tfm\_s.axf (etc.)
Once the project has been set up, and the firmware has previously been
flashed to the board, connect to the target via:
- Debug > Start Debug Session > Attach to a Running Program
At this point, you can set a breakpoint somewhere in the code, such as
in ``startup_LPC55S69_cm33_core0.s`` at the start of the
``Reset_Handler``, or near a line like ``bl SystemInit``, or at
another appropriate location, and reset the device to debug.
3.2 Debugging with GDB
======================
**NOTE**: If you are debugging, make sure to set the
build type variable to ``-DCMAKE_BUILD_TYPE=Debug`` when
building TF-M so that debug information is available to GDB.
**NOTE**: When debugging with the mbed-crypto library, it is needed to add an
additional ``-DMBEDCRYPTO_BUILD_TYPE=DEBUG`` compile-time switch.
3.2.1 Start the GDB server, pointing to the secure application image:
---------------------------------------------------------------------
You can use JLinkGDBServer or PyOCD server depending on the interface configured in the previous step.
.. tabs::
.. group-tab:: J-Link GDB server
.. code-block:: bash
$ JLinkGDBServer -device lpc55s69 -if swd -speed 2000
.. group-tab:: PyOCD GDB server
.. code:: bash
$ pyocd gdbserver -f 2000k -t LPC55S69
3.2.2 Connecting to the GDB server
----------------------------------
In a separate terminal, start the GDB client in ``tui`` (text UI) mode:
.. code:: bash
$ arm-none-eabi-gdb --tui secure_fw/tfm_s.axf
Then from the client connect to the remote GDB server that was started
earlier:
.. tabs::
.. group-tab:: J-Link GDB server
With ``JLinkGDBServer`` (default port 2331):
.. code:: bash
(gdb) target remote:2331
Remote debugging using :2331
.. group-tab:: PyOCD GDB server
With ``pyocd gdbserver`` (default port 3333):
.. code:: bash
(gdb) target remote:3333
Remote debugging using :3333
3.2.3 Reset and stop at ``main``
--------------------------------
Set a breakpoint at ``main()`` (found in ``tfm_core.c``), reset the
device (``monitor reset``), and continue (``c``) execution.
::
(gdb) break main
Breakpoint 1 at 0x10024220: file [path]/secure_fw/core/tfm_core.c, line 189.
(gdb) monitor reset
(gdb) c
Continuing.
Note: automatically using hardware breakpoints for read-only addresses.
Breakpoint 1, main ()
at [path]/secure_fw/core/tfm_core.c:189
189 tfm_arch_init_secure_msp((uint32_t)&REGION_NAME(Image$$, ARM_LIB_STACK,
3.2.4 Commonly used GDB commands
--------------------------------
You can start, step through, and analyse the code using some of the
following GDB commands:
+-------------------+---------------------------------------------------------+
| GDB Command | Description |
+===================+=========================================================+
| ``next`` | Execute the next statement in the program |
+-------------------+---------------------------------------------------------+
| ``step`` | Step until new source line, entering called functions |
+-------------------+---------------------------------------------------------+
| ``until <n>`` | Run until source line ``n`` in the current file |
+-------------------+---------------------------------------------------------+
| ``info locals`` | Display the local variables and their current values |
+-------------------+---------------------------------------------------------+
| ``bt`` | Display a stack backtrace up to the current function |
+-------------------+---------------------------------------------------------+
| ``print <x>`` | Print the expression (ex. ``print my_var``) |
+-------------------+---------------------------------------------------------+
| ``x`` | Examine memory (ex. ``x/s *my_string``) |
+-------------------+---------------------------------------------------------+
From here, you should consult a tutorial or book on GDB to know how to debug
common problems.
--------------
*Copyright (c) 2020, Linaro. All rights reserved.*
*Copyright (c) 2020-2021, Arm Limited. All rights reserved.*
*Copyright 2020-2023 NXP. All rights reserved.
*SPDX-License-Identifier: BSD-3-Clause*