Developing for M4
This chapter provides a short description on how to create and debug applications on the M4 coprocessor of the STM32MP1 with the help of example applications. For a more general and detailed description of the M4 functionality please refer to the STM32 MPU wiki by ST.
Provided demo applications
- m4_ktn_echo_CM4.elf (default)
Simple application to illustrate communication between Linux and M4 by /dev/ttyRPMSG virtual UARTs. - m4_ktn_simple-monitor.elf (outdated)
Simple application to communicate thru /dev/ttyRPMSG and to control LEDs on the Kontron DK/BL boards. Outdated because it uses an older IDE version. - m4_ktn-eval-usart6 (outdated)
Demo application to demonstrate accessing the SOC UART component and how to partition the SOC components between Linux and M4 context. Outdated because it uses an older IDE version and requires the elder t1000-s BL/DK boards.
For Kontron images, the application m4-application.elf
is loaded on boot.
This is currently the same application as m4_ktn_echo_CM4.elf
.
Prerequisites
For M4 debugging you need an appropriate JTAG debugger. What we recommend is
See the board documentation for the location of the debug plug. For Kontron BL/DK boars the outline of the debug plug can be found here.
Before continuing make sure that:
- A running linux image is present on your device
- The STM32CubeIDE is installed
Debug modes of the M4 coprocessor
The M4 firmware can be run and debugged in two different modes:
-
Production mode
M4 firmware is loaded from network and started with the remoteproc service running on the A7. -
Engineering mode
M4 firmware is loaded and started from the debugger similar to normal STM32 procedure. In this mode the A7 is not running.
Info
Due to a missing boot switch the engineering mode is currently not available for Kontron BL/DK boards. Thus, following description is for the production mode only.
More detailed information on the boot modes can be found in the ST wiki.
Debugging the M4 coprocessor
This is a step by step guide how to debug the M4 example application on the Kontron BL/DK boards in production mode.
- Connect the debug console to the host (via USB interface)
- Connect the BL/DK board to the network and figure out the ip address with
ifconfig
- Connect the ST-Link with Olimex connector to the board and the pc
- Open the CubeIDE
- Open or import the example project
m4_ktn_echo
- Rebuild the project
- Right click on the project and go to
Debug as..
- Double click
ST's STM32 MPU Debugging
- Go to the
Startup
tab and input the ip address of your board - Set a breakpoint at the start of
main()
- Press
Debug
and inputroot
as username and no password - After confirming the log in data a few times, you should end up in the Debug view similar to normal STM32 microcontroller debugging.
The next section describes the capabilities of this application and how to use it.
Description of the m4_ktn_echo
example application
This example is based on the OpenAMP_TTY_echo
example application from ST
which can be found here.
It will create one virtual uart channel between the A7 and the M4 cores based
on the Linux frameworks RPMsg, VirtIO and
IPCC
and the OpenAmp framework on the M4 side.
As the name implies, the application offers a simple echo server which echoes all incoming messages back to Linux.
Creating a new project
New projects might be created with the CubeIDE or by taking the ST template from https://github.com/STMicroelectronics/STM32CubeMP1. This repository also includes all HAL_Drivers and lots of examples which can be used for building your application.
However, these example applications are designed for the evaluation boards of ST and have complex include paths structures which are not very friendly for extracting project parts like the OpenAMP framework.
For Kontron SOM and BL/DK boards appropriate CubeIDE projects can be found in
the directory conf/machine/cubemx
in meta-ktn-stm32
layer. These projects
already contain the correct clock tree and pinmux settings for these devices
and might be a good starting point for your own project.
Using the m4_ktn_echo
might be less stressful to use as starting point for
your own project, as it includes the rsc_table, basic Drivers and system
libraries as well as all necessary header and source files.
Assigning peripheral devices to the M4 coprocessor
To use a peripheral device with the M4 coprocessor it has to be assigned to it
in the device tree prior to the Linux boot. This can be accomplished by creating your own board device tree overlay. For the Kontron BL/DK boards there is a file
stm32mp-board-k-m4-uart.dtsi
which removes USART3 (RS232) form Linux context
and assigns to M4 context.
In the following the usart3 peripheral is taken as an example. On the Kontron BL/DK boards the usart3 is available as RS232 interface on connector X16.
First of all, the respective node has to be disabled for A7 cores with Linux and enabled for the M4. This can be accomplished by adding:
/* Disable usart3 for linux and enable m4 resource */
&usart3{
status = "disabled";
};
&m4_usart3{
status = "okay";
};
Normally a M4 application called m4-application.elf
will be loaded and started
on boot. To change the M4 applilcation to be loaded, a device tree entry can be
set like this:
/ {
/* Load M4 demo application */
m4-application = "m4-ktn-demo";
};
To rebuild the device tree, either build the respective image or only the Linux kernel image with bitbake linux-stm32mp
.
Afterwards replace the old device tree in the boot directory and reboot the
board. To check if the resource is really disabled for the A7, read out the node
status with cat /proc/device-tree/soc/serial\@4000f000/status
. Additionally
check if the M4 resource was enabled successfully with
cat /proc/device-tree/m4\@0/m4_system_resources/serial\@4000f000/status
.
Additionaly, for an easy and graphical configuration of a new peripheral the
CubeIDE tool can be used to generate the project. As a starting point the
CubeIDE project with the initial evaluation board configuration can be used,
which can be found in the meta-ktn-stm32mp
layer at conf/machine/cubemx
.
Here, it is again simplier to take the initialization of the respective
peripheral from the project created by CubeMX and use it in an already working
project.
When sharing peripheals between Linux and M4 the resource manager could also get interesting.
Also some stronger protection of the M4 peripheals can be activated in tf-a bootloader for every peripheal which is used exclusively by M4. This requires creating and compiling your own adapted tf-a bootloader.
More detailed informations on assigning peripheral devices can be found in the ST wiki.
Starting Software with system service
A system service called m4-autoload.sh
is included in the Kontron Linux
images. It loads and starts the examples on system boot. The service can be
controlled with the commands start
and stop
. For example this stops the
M4 processor:
/etc/init.d/m4-autoload.sh stop
If you want to start your own M4 appllication, you have to adapt the
APPLICATION_NAME
entry in /etc/default/m4-autoload.conf
to your needs.
If you want to include your own binary file into the service when building your yocto image, you need to add some adaptions in your own yocto layer.
- either exchange the
m4-appliction.elf
file with your own copy - or adapt the
m4-autoload.conf
file to your needs
In every case you have to create a recipe append file called
m4-autoload.bbappend
in recipes-extended/m4-autoload
directory which
references your binary M4 application file from
recipes-extended/m4-autoload/files/binary
.
Starting software manually
In case the system service is not used, the M4 firmware can be started manually with the following principle
- Copy or link the binary file into
/lib/firmware
- Publish the file name which contains the application binary
echo -n "my-application.elf" > /sys/class/remoteproc/remoteproc0/firmware
- Load and start M4 application
echo -n start > /sys/class/remoteproc/remoteproc0/state
- Read the state of M4
cat /sys/class/remoteproc/remoteproc0/state
- stop the M4 application
echo -n stop > /sys/class/remoteproc/remoteproc0/state
Alternatively you can also use the m4-autostart
script available in the
Kontron images.
Getting logs from M4
For all of the demo projects a trace buffer is added to the resource table. This enables reading out the log buffer of M4 in the Linux context:
root@stm32mp-t1000-s-multi:~# cat /sys/kernel/debug/remoteproc/remoteproc0/trace0
[00000.000][INFO ]Cortex-M4 boot successful with STM32Cube FW version: v1.0.0
[00000.008][INFO ]Virtual UART0 OpenAMP-rpmsg channel creation
[00000.009][INFO ]Virtual UART1 OpenAMP-rpmsg channel creation