The SIMATIC IOT2050 is an open industrial IoT gateway that is using the TI AM6528 GP (Basic variant) or the AM6548 HS (Advanced variant). The Advanced variant is prepared for secure boot. M.2 Variant also uses the AM6548 HS. Instead of a MiniPCI connector, it comes with two M.2 connectors and can support 5G/WIFI/BT applications or connect an SSD.

The IOT2050 starts only from OSPI. It loads a Siemens-provided bootloader called SE-Boot for the MCU domain (R5F cores), then hands over to ATF and OP-TEE, before booting U-Boot on the A53 cores. This describes how to build all open artifacts into a flashable image for the OSPI flash. The flash image will work on both variants.


ATF: Upstream release 2.4 or newer OP-TEE: Upstream release 3.10.0 or newer

Binary dependencies can be found in The following binaries from that source need to be present in the build folder:

  • seboot_pg1.bin

  • seboot_pg2.bin

When using the watchdog, a related firmware for the R5 core(s) is needed, e.g. The name and location of the image is configured via CONFIG_WDT_K3_RTI_FW_FILE.

For building an image containing the OTP key provisioning data, below binary needs to be present in the build folder:

  • otpcmd.bin

Regarding how to generating this otpcmd.bin, please refer to:


Make sure that CROSS_COMPILE is set appropriately:

$ export CROSS_COMPILE=aarch64-linux-gnu-


$ make PLAT=k3 SPD=opteed K3_USART=1




$ export BL31=/path/to/bl31.bin
$ export TEE=/path/to/tee-raw.bin
$ make iot2050_defconfig

$ make

This will generate two different flash images: flash-p1.bin that targets the first generation of IOT2050 devices and flash-pg2.bin that runs on PG2 including M.2 devices.


Via U-Boot:

IOT2050> sf probe
IOT2050> load mmc 0:1 $loadaddr /path/to/flash-pgX.bin
IOT2050> sf update $loadaddr 0x0 $filesize

Via external programmer Dediprog SF100 or SF600:

$ dpcmd --vcc 2 -v -u flash-pgX.bin

Signing (optional)

To enable verified boot for the firmware artifacts after the Siemens-managed first-stage loader (seboot_pgX.bin), the following steps need to be taken before and after the build:

Generate dtsi holding the public key

tools/ -c -s key.pem public-key.dtsi

This will be used to embed the public key into U-Boot SPL and main so that each step can validate signatures of the succeeding one.

Adjust U-Boot configuration

Enabled at least the following options in U-Boot:


Note that there are more configuration changes needed in order to lock-down the command line and the boot process of U-Boot for secure scenarios. These are not in scope here.

Build U-Boot

See related section above.

Sign flash-pgX.bin

In the build folder still containing artifacts from step 3, invoke:

tools/ /path/to/key.pem

Flash signed flash-pgX.bin

The signing has happen in-place in flash-pgX.bin, thus the flashing procedure described above.

M.2 slot configuration

The M.2 variant of the IOT2050 comes with one B-keyed and one E-keyed slot. These are configured by U-Boot depending on the detected usage (auto configuration). The device tree loaded later on for the OS will be fixed up by U-Boot according to this configuration.

For the case auto configuration does not work reliably, it is possible to set the U-Boot environment variable “m2_manual_config” to select the mode manually:

“0” - B-key: PCIe x2, USB 2.0

E-key: USB 2.0

“1” - B-key: PCIe, USB 2.0

E-key: PCIe, USB 2.0

“2” - B-key: USB 3.0,

E-key: PCIe, USB 2.0