.. SPDX-License-Identifier: GPL-2.0+ .. sectionauthor:: Jan Kiszka SIMATIC IOT2050 BASIC and ADVANCED ================================== 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. Dependencies ------------ ATF: Upstream release 2.4 or newer OP-TEE: Upstream release 3.10.0 or newer Binary dependencies can be found in https://github.com/siemens/meta-iot2050/tree/master/recipes-bsp/u-boot/files/prebuild. 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. https://github.com/siemens/k3-rti-wdt. 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: https://github.com/siemens/meta-iot2050/tree/master/recipes-bsp/secure-boot-otp-provisioning/files/make-otpcmd.sh Building -------- Make sure that CROSS_COMPILE is set appropriately: .. code-block:: text $ export CROSS_COMPILE=aarch64-linux-gnu- ATF: .. code-block:: text $ make PLAT=k3 SPD=opteed K3_USART=1 OP-TEE: .. code-block:: text $ make PLATFORM=k3-am65x CFG_ARM64_core=y CFG_TEE_CORE_LOG_LEVEL=2 CFG_CONSOLE_UART=1 CFG_USER_TA_TARGETS="ta_arm64" U-Boot: .. code-block:: text $ 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. Flashing -------- Via U-Boot: .. code-block:: text 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: .. code-block:: text $ 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: text tools/key2dtsi.py -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: .. code-block:: text CONFIG_SPL_FIT_SIGNATURE=y CONFIG_DEVICE_TREE_INCLUDES="/path/to/public-key.dtsi" CONFIG_RSA=y 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: .. code-block:: text tools/iot2050-sign-fw.sh /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