.. _run-app-hello: Build and run of a simple hello world application on the Cortex®-M4/7 ===================================================================== Building the firmware --------------------- Please read the chapter 'Run a demo using Arm GCC' from the document 'Getting Started with MCUXpresso SDK for EVK-MIMX8xx'. To build the hello world sample, open a new terminal window and change the directory to the example application project directory, which has a path similar to the following: /boards////armgcc In case of the hello world sample the directory is: /boards/evkmimx8mm/demo_apps/hello_world/armgcc run one of the available build scripts, for example: .. prompt:: :prompts: $ ./build_debug.sh The script should end with the messages: .. code-block:: text [100%] Linking C executable debug/hello_world.elf Memory region Used Size Region Size %age Used m_interrupts: 576 B 576 B 100.00% m_text: 13516 B 130496 B 10.36% m_data: 2224 B 128 KB 1.70% m_data2: 0 GB 16 MB 0.00% [100%] Built target hello_world.elf Deploying the firmware to the target ------------------------------------ To start the firmware, we have to deploy it first to the target's memory. That could be basicly, the internal emmc device of the SOM or the SD-card of the base board. The following example shows, how to deploy the firmware to the internal emmc device. After building the yocto Linux and programming it with the uuu-tool to the target, we can examine the programmed partitions inside U-Boot: .. prompt:: :prompts: U-Boot> part list mmc ${mmcdev} .. code-block:: text Partition Map for MMC device 0 -- Partition Type: EFI Part Start LBA End LBA Name Attributes Type GUID Partition GUID 1 0x00000800 0x000107ff "boot" attrs: 0x0000000000000000 type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 type: data guid: d117f98e-6f2c-d04b-a5b2-331a19f91cb2 2 0x00010800 0x0075fbff "rootfs" attrs: 0x0000000000000000 type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 type: data guid: 0cc66cc0-5458-384d-1610-726f6f746673 The "boot"-partition contains the Linux- image and device trees. To store the firmware binary into that partition we use the USB Mass Storage U-Boot function to mount that partition to our Linux host PC: .. prompt:: :prompts: U-Boot> ums 0 mmc ${mmcdev}:1 .. prompt:: :prompts: $ sudo mount /dev/sdX /mnt Copy the file hello_world.bin to the mounted boot-partition. Unmount this partition: .. prompt:: :prompts: $ sudo umount /mnt Stop the ums-device with :kbd:`CTRL` + :kbd:`C` in U-Boot. List the contents of the boot-partition from U-Boot to check it: .. prompt:: :prompts: U-Boot> ls mmc ${mmcdev} .. code-block:: text 15759368 Image 37178 imx8mm-tx8m-1610.dtb 41437 imx8mm-tx8m-1610-mipi-mb.dtb 14192 hello_world.bin 4 file(s), 0 dir(s) Starting the firmware --------------------- The hello-world-sample uses the pins UART4_TXD and UART4_RXD to communicate to the outside world. As you can see in the source file pin_mux.c, the Cortex®-M4/7 firmware handles the setup of the pinmux- and the pad-registers by itself. That means, if you will start a Linux image on the Cortex®-A53 later, you have to ensure that the devices that are used by the Cortex®-M4/7 firmware are disabled in the Linux device tree. Looking into the TX8M-Datasheet document, you will find these two signals on the module pins 65 and 66. Please note, these are 3,3V pins. Use a second TTL to USB Serial Converter cable to connect to the UART4 interface. Start a serial terminal on your host, e.g. minicom, with the parameters 115200 -8N1. Three steps are necessary to start the firmware: #) copy the firmware from mmc device into local memory #) copy the firmware from local memory into the TCM of the Cortex®-M4/7 #) start the firmware from U-Boot with the bootaux command .. prompt:: :prompts: U-Boot> load mmc ${mmcdev}:1 ${loadaddr} hello_world.bin cp.b ${fileaddr} 0x7e0000 0x20000 bootaux 0x7e0000 .. code-block:: text ## Starting auxiliary core stack = 0x20020000, pc = 0x1FFE030D... "hello world." will be printed on your UART4 terminal window: .. figure:: images/SDKXpresso-hello-world.png :scale: 35 % :align: left :figwidth: 100%