i.MX93 Cortex-M33 DDR example

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

i.MX93 Cortex-M33 DDR example

i.MX93 Cortex-M33 DDR example

Hello everyone!

In this document you'll find an example on how to build your Cortex-M33 code where some parts of the code runs from DDR, for this changes on ATF where the M33 core can visit DRAM in early stage.

For this we will take advantage of RPROC framework, RPROC (Remote Processor Framework) is a Linux kernel and U-Boot subsystem that manages secondary, embedded processors (like Cortex-M cores), where we will use the A55 to load the M33 firmware.

This will require changes on Linux device tree, ATF and M33 linker file.

Requirements:
Ubuntu 20.04 or later host PC
i.MX93 QSB
UUU Tool
ARM GNU Toolchain (arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu)
SDK package (SDK_25_09_00_MCIMX93-QSB)
Prebuild Linux Image (LF_v6.12.34-2.1.0_images_IMX93EVK)

### Clone imx-mkimage, it is better to download the same version of the sw we are working with ###
$ git clone https://github.com/nxp-imx/imx-mkimage -b lf-6.12.34-2.1.0

### Decompress the GNU toolchain into a path in local disk, in this test would be /opt/ ###
$ sudo tar -xvJf arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt

### Clone and build Uboot ###
$ git clone https://github.com/nxp-imx/uboot-imx -b lf-6.12.34-2.1.0
$ cd uboot-imx
$ make -j $(nproc --all) clean
$ make -j$(nproc --all) ARCH=arm CROSS_COMPILE=/opt/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- imx93_11x11_evk_defconfig
$ make -j $(nproc --all) ARCH=arm CROSS_COMPILE=/opt/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

### Download and extract ELE firmware ###
$ cd ..
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-ele-imx-2.0.3-286c884.bin
$ chmod +x firmware-ele-imx-2.0.3-286c884.bin
$ ./firmware-ele-imx-2.0.3-286c884.bin --auto-accept

### Optional if using i.MX FW ###
$ wget https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.29-8741a3b.bin
$ chmod +x firmware-imx-8.29-8741a3b.bin
$ ./firmware-imx-8.29-8741a3b.bin --auto-accept

### Clone ATF ###
$ git clone https://github.com/nxp-imx/imx-atf -b lf-6.12.34-2.1.0
$ cd imx-atf

### Modify ATF for the M33 to be able to access DDR ###

 

Spoiler

--- a/plat/imx/imx93/trdc_config.h
+++ b/plat/imx/imx93/trdc_config.h

struct trdc_mrc_config trdc_n_mrc[] = {
{ 0, 0, 0, 0x80000000, 0x80000000, 0, false }, /* MRC0 DRAM for S400 DID0 */
{ 0, 1, 0, 0x80000000, 0x80000000, 0, false }, /* MRC0 DRAM for MTR DID1 */
- { 0, 2, 0, 0x80000000, 0x80000000, 0, true }, /* MRC0 DRAM for M33 DID2 */
+ { 0, 2, 0, 0x80000000, 0x80000000, 1, true }, /* MRC0 DRAM for M33 DID2 */
{ 0, 3, 0, 0x80000000, 0x80000000, 1, false }, /* MRC0 DRAM for A55 DID3 */
{ 0, 5, 0, 0x80000000, 0x80000000, 0, false }, /* MRC0 DRAM for USDHC1 DID5 */
{ 0, 6, 0, 0x80000000, 0x80000000, 0, false }, /* MRC0 DRAM for USDHC2 DID6 */

### Build modified ATF ###
$ make -j $(nproc --all) PLAT=imx93 bl31 CROSS_COMPILE=/opt/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-

### Modify linker file and build M33 code, in this example we are using hello world SDK example ###
$ cd ..
$ tar -xvzf SDK_25_09_00_MCIMX93-QSB.tar.gz
$ cd SDK_25_09_00_MCIMX93-QSB/boards/mcimx93qsb/demo_apps/hello_world/armgcc

Spoiler

--- a/boards/mcimx93autoevk/demo_apps/hello_world/armgcc/MIMX9352_cm33_ram.ld
+++ b/boards/mcimx93autoevk/demo_apps/hello_world/armgcc/MIMX9352_cm33_ram.ld

m_a55_suspend_ram (RW) : ORIGIN = 0x20002000, LENGTH = 0x00001000
m_data (RW) : ORIGIN = 0x20003000, LENGTH = 0x0001B000
m_rsc_tbl (RW) : ORIGIN = 0x2001E000, LENGTH = 0x00001000
+ m_text_dram (RW) : ORIGIN = 0x8F000000, LENGTH = 0x00001000
+ m_data_dram (RW) : ORIGIN = 0x8F001000, LENGTH = 0x00001000
}

/* Define output sections */


. = ALIGN(4);
} > m_text

+ .dram_text :
+ {
+ . = ALIGN(32);
+ *(.myDRAM)
+ . = ALIGN(32);
+ } > m_text_dram
+
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)


.ARM.attributes 0 : { *(.ARM.attributes) }

ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap")
+
+ .dram_data :
+ {
+ . = ALIGN(32);
+ *(.myDRAM_data)
+ . = ALIGN(32);
+ } > m_data_dram
}

a/boards/mcimx93autoevk/demo_apps/hello_world/hello_world.c
+++ b/boards/mcimx93autoevk/demo_apps/hello_world/hello_world.c

* Definitions
******************************************************************************/

+#define _RET_IP_ (unsigned long)__builtin_return_address(0)
+#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })

/*******************************************************************************
* Prototypes


/*******************************************************************************
* Variables
******************************************************************************/
-
+const char myString[] __attribute__((section(".myDRAM_data"))) = "Hello, World!";
/*******************************************************************************
* Code
******************************************************************************/
+__attribute__ ((section(".myDRAM")))
+void Dram_test(void) {
+ PRINTF("Dram_test!!\r\n");
+
+ PRINTF("%s!!\r\n", myString);
+
+ PRINTF("function %p\n",_THIS_IP_);
+}
+
/*!
* @brief Main function
*/


BOARD_BootClockRUN();
BOARD_InitDebugConsole();

- PRINTF("hello world.\r\n");
+ PRINTF("hello world from DRAM.\r\n");

while (1)
{
ch = GETCHAR();
PUTCHAR(ch);
+ if(ch == 'a'){
+ Dram_test();
+ }
}
}

$ export ARMGCC_DIR=~/gcc-arm-none-eabi-10.3-2021.10
$ export PATH=$PATH:~/gcc-arm-none-eabi-10.3-2021.10
$ ./build_release.sh

### Copy the resulting binaries to imx-mkimage ###
$ cp ~/imx-atf/build/imx93/release/bl31.bin ~/imx-mkimage/iMX93
$ cp ~/uboot-imx/u-boot.bin ~/imx-mkimage/iMX93
$ cp ~/uboot-imx/spl/u-boot-spl.bin ~/imx-mkimage/iMX93

### Copy i.MX firmware ###
$ cd ..
$ cp firmware-imx-8.29-8741a3b/firmware/ddr/synopsys/lpddr4_dmem_* ~/imx-mkimage/iMX93
$ cp firmware-imx-8.29-8741a3b/firmware/ddr/synopsys/lpddr4_imem_* ~/imx-mkimage/iMX93
$ cpfirmware-ele-imx-2.0.3-286c884/mx93a1-ahab-container.img ~/imx-mkimage/iMX93

### Build the flash.bin using mkimage
$ cd imx-mkimage
$ make SOC=iMX93 flash_singleboot

### Clone, modify and build device tree for Linux to be able to use RPROC to load M33 Firmware ###
$ git clone https://github.com/nxp-imx/linux-imx -b lf-6.12.34-2.1.0

Spoiler

--- a/arch/arm64/boot/dts/freescale/imx93-9x9-qsb.dts
+++ b/arch/arm64/boot/dts/freescale/imx93-9x9-qsb.dts

no-map;
};

+ dram: dram@20480000 {
+ reg = <0 0x8f000000 0 0x20000>;
+ no-map;
+ };
+
rsc_table: rsc-table@2021e000 {
reg = <0 0x2021e000 0 0x1000>;
no-map;


<&mu1 1 1>,
<&mu1 3 1>;
- memory-region = <&vdevbuffer>, <&vdev0vring0>, <&vdev0vring1>,
+ memory-region = <&dram>, <&vdevbuffer>, <&vdev0vring0>, <&vdev0vring1>,
<&vdev1vring0>, <&vdev1vring1>, <&rsc_table>;
fsl,startup-delay-ms = <500>;
status = "okay";

$ export ARCH=arm64
$ export CROSS_COMPILE=/opt/arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
$ make imx_v8_defconfig
$ make freescale/imx93-9x9-qsb.dtb

Set SW for serial download on the QSB (0001), connect debug, download and power cables and turn on the QSB, for this test we will flash the demo image and just replace Linux device tree, flash.bin and M33 firmware into the QSB board.

$ uuu -b sd_all flash.bin imx-image-full-imx93evk.wic


Once it is done change SW to the respective bootmedia
SD boot (0011) and boot the board and stop at uboot, to enter fastboot mode to load modified device tree and M33 firmware

> fastboot 1

After this just run UUU tool on the host computer and fatload the files

$ uuu -b fat_write imx93-9x9-qsb.dtb mmc 1:1
$ uuu -b fat_write hello_world.elf mmc 1:1

When the tool finish, stop fastboot mode by typing CTRL+C and then boot into Linux
> boot

Login with default password "root" and run the following commands to load M33 firmware
$ root
$ modprobe imx_rpmsg_tty
$ cp /run/media/boot-mmcblk1p1/hello_world.elf /lib/firmware/
$ echo hello_world.elf > /sys/class/remoteproc/remoteproc0/firmware
$ echo start >/sys/class/remoteproc/remoteproc0/state

M33_DDR.png


Once done we can verify that the M33 firmware is running on DDR

hello_world.png


Hope everyone finds this useful!

For any question regarding this document, please create a community thread and tag me if needed.

Saludos/Regards,
Aldo.

%3CLINGO-SUB%20id%3D%22lingo-sub-2259696%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3Ei.MX93%20Cortex-M33%20DDR%20example%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2259696%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%0A%3CP%3EHello%20everyone!%3C%2FP%3E%0A%3CP%3EIn%20this%20document%20you'll%20find%20an%20example%20on%20how%20to%20build%20your%20Cortex-M33%20code%20where%20some%20parts%20of%20the%20code%20runs%20from%20DDR%2C%20for%20this%20changes%20on%20ATF%20where%20the%20M33%20core%20can%20visit%20DRAM%20in%20early%20stage.%3C%2FP%3E%0A%3CP%3EFor%20this%20we%20will%20take%20advantage%20of%20RPROC%20framework%2C%20RPROC%20(Remote%20Processor%20Framework)%20is%20a%20Linux%20kernel%20and%20U-Boot%20subsystem%20that%20manages%20secondary%2C%20embedded%20processors%20(like%20Cortex-M%20cores)%2C%20where%20we%20will%20use%20the%20A55%20to%20load%20the%20M33%20firmware.%3C%2FP%3E%0A%3CP%3EThis%20will%20require%20changes%20on%20Linux%20device%20tree%2C%20ATF%20and%20M33%20linker%20file.%3C%2FP%3E%0A%3CP%3ERequirements%3A%3CBR%20%2F%3EUbuntu%2020.04%20or%20later%20host%20PC%3CBR%20%2F%3Ei.MX93%20QSB%3CBR%20%2F%3EUUU%20Tool%3CBR%20%2F%3EARM%20GNU%20Toolchain%20(arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu)%3CBR%20%2F%3ESDK%20package%20(SDK_25_09_00_MCIMX93-QSB)%3CBR%20%2F%3EPrebuild%20Linux%20Image%20(LF_v6.12.34-2.1.0_images_IMX93EVK)%3C%2FP%3E%0A%3CP%3E%23%23%23%20Clone%20imx-mkimage%2C%20it%20is%20better%20to%20download%20the%20same%20version%20of%20the%20sw%20we%20are%20working%20with%20%23%23%23%3CBR%20%2F%3E%24%20git%20clone%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fnxp-imx%2Fimx-mkimage%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fnxp-imx%2Fimx-mkimage%3C%2FA%3E%20-b%20lf-6.12.34-2.1.0%3CBR%20%2F%3E%3CBR%20%2F%3E%23%23%23%20Decompress%20the%20GNU%20toolchain%20into%20a%20path%20in%20local%20disk%2C%20in%20this%20test%20would%20be%20%2Fopt%2F%20%23%23%23%3CBR%20%2F%3E%24%20sudo%20tar%20-xvJf%20arm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu.tar.xz%20-C%20%2Fopt%3C%2FP%3E%0A%3CP%3E%23%23%23%20Clone%20and%20build%20Uboot%20%23%23%23%3CBR%20%2F%3E%24%20git%20clone%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fnxp-imx%2Fuboot-imx%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fnxp-imx%2Fuboot-imx%3C%2FA%3E%20-b%20lf-6.12.34-2.1.0%3CBR%20%2F%3E%24%20cd%20uboot-imx%3CBR%20%2F%3E%24%20make%20-j%20%24(nproc%20--all)%20clean%3CBR%20%2F%3E%24%20make%20-j%24(nproc%20--all)%20ARCH%3Darm%20CROSS_COMPILE%3D%2Fopt%2Farm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu%2Fbin%2Faarch64-none-linux-gnu-%20imx93_11x11_evk_defconfig%3CBR%20%2F%3E%24%20make%20-j%20%24(nproc%20--all)%20ARCH%3Darm%20CROSS_COMPILE%3D%2Fopt%2Farm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu%2Fbin%2Faarch64-none-linux-gnu-%3CBR%20%2F%3E%3CBR%20%2F%3E%23%23%23%20Download%20and%20extract%20ELE%20firmware%20%23%23%23%3CBR%20%2F%3E%24%20cd%20..%3CBR%20%2F%3E%24%20wget%20%3CA%20href%3D%22https%3A%2F%2Fwww.nxp.com%2Flgfiles%2FNMG%2FMAD%2FYOCTO%2Ffirmware-ele-imx-2.0.3-286c884.bin%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fwww.nxp.com%2Flgfiles%2FNMG%2FMAD%2FYOCTO%2Ffirmware-ele-imx-2.0.3-286c884.bin%3C%2FA%3E%3CBR%20%2F%3E%24%20chmod%20%2Bx%20firmware-ele-imx-2.0.3-286c884.bin%3CBR%20%2F%3E%24%20.%2Ffirmware-ele-imx-2.0.3-286c884.bin%20--auto-accept%3CBR%20%2F%3E%3CBR%20%2F%3E%23%23%23%20Optional%20if%20using%20i.MX%20FW%20%23%23%23%3CBR%20%2F%3E%24%20wget%20%3CA%20href%3D%22https%3A%2F%2Fwww.nxp.com%2Flgfiles%2FNMG%2FMAD%2FYOCTO%2Ffirmware-imx-8.29-8741a3b.bin%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fwww.nxp.com%2Flgfiles%2FNMG%2FMAD%2FYOCTO%2Ffirmware-imx-8.29-8741a3b.bin%3C%2FA%3E%3CBR%20%2F%3E%24%20chmod%20%2Bx%20firmware-imx-8.29-8741a3b.bin%3CBR%20%2F%3E%24%20.%2Ffirmware-imx-8.29-8741a3b.bin%20--auto-accept%3CBR%20%2F%3E%3CBR%20%2F%3E%23%23%23%20Clone%20ATF%20%23%23%23%3CBR%20%2F%3E%24%20git%20clone%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fnxp-imx%2Fimx-atf%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fnxp-imx%2Fimx-atf%3C%2FA%3E%20-b%20lf-6.12.34-2.1.0%3CBR%20%2F%3E%24%20cd%20imx-atf%3CBR%20%2F%3E%3CBR%20%2F%3E%23%23%23%20Modify%20ATF%20for%20the%20M33%20to%20be%20able%20to%20access%20DDR%20%23%23%23%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CDIV%20class%3D%22lia-spoiler-container%22%3E%3CA%20class%3D%22lia-spoiler-link%22%20href%3D%22%23%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%20target%3D%22_blank%22%3ESpoiler%3C%2FA%3E%3CNOSCRIPT%3E%20(Highlight%20to%20read)%3C%2FNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-border%22%3E%3CDIV%20class%3D%22lia-spoiler-content%22%3E%0A%3CP%3E---%20a%2Fplat%2Fimx%2Fimx93%2Ftrdc_config.h%3CBR%20%2F%3E%2B%2B%2B%20b%2Fplat%2Fimx%2Fimx93%2Ftrdc_config.h%3C%2FP%3E%0A%3CP%3Estruct%20trdc_mrc_config%20trdc_n_mrc%5B%5D%20%3D%20%7B%3CBR%20%2F%3E%7B%200%2C%200%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20S400%20DID0%20*%2F%3CBR%20%2F%3E%7B%200%2C%201%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20MTR%20DID1%20*%2F%3CBR%20%2F%3E-%20%7B%200%2C%202%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20true%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20M33%20DID2%20*%2F%3CBR%20%2F%3E%2B%20%7B%200%2C%202%2C%200%2C%200x80000000%2C%200x80000000%2C%201%2C%20true%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20M33%20DID2%20*%2F%3CBR%20%2F%3E%7B%200%2C%203%2C%200%2C%200x80000000%2C%200x80000000%2C%201%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20A55%20DID3%20*%2F%3CBR%20%2F%3E%7B%200%2C%205%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20USDHC1%20DID5%20*%2F%3CBR%20%2F%3E%7B%200%2C%206%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20USDHC2%20DID6%20*%2F%3C%2FP%3E%0A%3C%2FDIV%3E%3CNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-noscript-container%22%3E%3CDIV%20class%3D%22lia-spoiler-noscript-content%22%3E%0A---%20a%2Fplat%2Fimx%2Fimx93%2Ftrdc_config.h%2B%2B%2B%20b%2Fplat%2Fimx%2Fimx93%2Ftrdc_config.h%0Astruct%20trdc_mrc_config%20trdc_n_mrc%5B%5D%20%3D%20%7B%7B%200%2C%200%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20S400%20DID0%20*%2F%7B%200%2C%201%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20MTR%20DID1%20*%2F-%20%7B%200%2C%202%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20true%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20M33%20DID2%20*%2F%2B%20%7B%200%2C%202%2C%200%2C%200x80000000%2C%200x80000000%2C%201%2C%20true%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20M33%20DID2%20*%2F%7B%200%2C%203%2C%200%2C%200x80000000%2C%200x80000000%2C%201%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20A55%20DID3%20*%2F%7B%200%2C%205%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20USDHC1%20DID5%20*%2F%7B%200%2C%206%2C%200%2C%200x80000000%2C%200x80000000%2C%200%2C%20false%20%7D%2C%20%2F*%20MRC0%20DRAM%20for%20USDHC2%20DID6%20*%2F%0A%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FNOSCRIPT%3E%3C%2FDIV%3E%3C%2FDIV%3E%0A%3CP%3E%23%23%23%20Build%20modified%20ATF%20%23%23%23%3CBR%20%2F%3E%24%20make%20-j%20%24(nproc%20--all)%20PLAT%3Dimx93%20bl31%20CROSS_COMPILE%3D%2Fopt%2Farm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu%2Fbin%2Faarch64-none-linux-gnu-%3C%2FP%3E%0A%3CP%3E%23%23%23%20Modify%20linker%20file%20and%20build%20M33%20code%2C%20in%20this%20example%20we%20are%20using%20hello%20world%20SDK%20example%20%23%23%23%3CBR%20%2F%3E%24%20cd%20..%3CBR%20%2F%3E%24%20tar%20-xvzf%20SDK_25_09_00_MCIMX93-QSB.tar.gz%3CBR%20%2F%3E%24%20cd%20SDK_25_09_00_MCIMX93-QSB%2Fboards%2Fmcimx93qsb%2Fdemo_apps%2Fhello_world%2Farmgcc%3C%2FP%3E%0A%3CDIV%20class%3D%22lia-spoiler-container%22%3E%3CA%20class%3D%22lia-spoiler-link%22%20href%3D%22%23%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%20target%3D%22_blank%22%3ESpoiler%3C%2FA%3E%3CNOSCRIPT%3E%20(Highlight%20to%20read)%3C%2FNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-border%22%3E%3CDIV%20class%3D%22lia-spoiler-content%22%3E%0A%3CP%3E---%20a%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Farmgcc%2FMIMX9352_cm33_ram.ld%3CBR%20%2F%3E%2B%2B%2B%20b%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Farmgcc%2FMIMX9352_cm33_ram.ld%3C%2FP%3E%0A%3CP%3Em_a55_suspend_ram%20(RW)%20%3A%20ORIGIN%20%3D%200x20002000%2C%20LENGTH%20%3D%200x00001000%3CBR%20%2F%3Em_data%20(RW)%20%3A%20ORIGIN%20%3D%200x20003000%2C%20LENGTH%20%3D%200x0001B000%3CBR%20%2F%3Em_rsc_tbl%20(RW)%20%3A%20ORIGIN%20%3D%200x2001E000%2C%20LENGTH%20%3D%200x00001000%3CBR%20%2F%3E%2B%20m_text_dram%20(RW)%20%3A%20ORIGIN%20%3D%200x8F000000%2C%20LENGTH%20%3D%200x00001000%3CBR%20%2F%3E%2B%20m_data_dram%20(RW)%20%3A%20ORIGIN%20%3D%200x8F001000%2C%20LENGTH%20%3D%200x00001000%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*%20Define%20output%20sections%20*%2F%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3E.%20%3D%20ALIGN(4)%3B%3CBR%20%2F%3E%7D%20%26gt%3B%20m_text%3CBR%20%2F%3E%3CBR%20%2F%3E%2B%20.dram_text%20%3A%3CBR%20%2F%3E%2B%20%7B%3CBR%20%2F%3E%2B%20.%20%3D%20ALIGN(32)%3B%3CBR%20%2F%3E%2B%20*(.myDRAM)%3CBR%20%2F%3E%2B%20.%20%3D%20ALIGN(32)%3B%3CBR%20%2F%3E%2B%20%7D%20%26gt%3B%20m_text_dram%3CBR%20%2F%3E%2B%3CBR%20%2F%3E.ARM.extab%20%3A%3CBR%20%2F%3E%7B%3CBR%20%2F%3E*(.ARM.extab*%20.gnu.linkonce.armextab.*)%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3E.ARM.attributes%200%20%3A%20%7B%20*(.ARM.attributes)%20%7D%3CBR%20%2F%3E%3CBR%20%2F%3EASSERT(__StackLimit%20%26gt%3B%3D%20__HeapLimit%2C%20%22region%20m_data%20overflowed%20with%20stack%20and%20heap%22)%3CBR%20%2F%3E%2B%3CBR%20%2F%3E%2B%20.dram_data%20%3A%3CBR%20%2F%3E%2B%20%7B%3CBR%20%2F%3E%2B%20.%20%3D%20ALIGN(32)%3B%3CBR%20%2F%3E%2B%20*(.myDRAM_data)%3CBR%20%2F%3E%2B%20.%20%3D%20ALIGN(32)%3B%3CBR%20%2F%3E%2B%20%7D%20%26gt%3B%20m_data_dram%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3Ea%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Fhello_world.c%3CBR%20%2F%3E%2B%2B%2B%20b%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Fhello_world.c%3C%2FP%3E%0A%3CP%3E*%20Definitions%3CBR%20%2F%3E******************************************************************************%2F%3CBR%20%2F%3E%3CBR%20%2F%3E%2B%23define%20_RET_IP_%20(unsigned%20long)__builtin_return_address(0)%3CBR%20%2F%3E%2B%23define%20_THIS_IP_%20(%7B%20__label__%20__here%3B%20__here%3A%20(unsigned%20long)%26amp%3B%26amp%3B__here%3B%20%7D)%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*******************************************************************************%3CBR%20%2F%3E*%20Prototypes%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3E%2F*******************************************************************************%3CBR%20%2F%3E*%20Variables%3CBR%20%2F%3E******************************************************************************%2F%3CBR%20%2F%3E-%3CBR%20%2F%3E%2Bconst%20char%20myString%5B%5D%20__attribute__((section(%22.myDRAM_data%22)))%20%3D%20%22Hello%2C%20World!%22%3B%3CBR%20%2F%3E%2F*******************************************************************************%3CBR%20%2F%3E*%20Code%3CBR%20%2F%3E******************************************************************************%2F%3CBR%20%2F%3E%2B__attribute__%20((section(%22.myDRAM%22)))%3CBR%20%2F%3E%2Bvoid%20Dram_test(void)%20%7B%3CBR%20%2F%3E%2B%20PRINTF(%22Dram_test!!%5Cr%5Cn%22)%3B%3CBR%20%2F%3E%2B%3CBR%20%2F%3E%2B%20PRINTF(%22%25s!!%5Cr%5Cn%22%2C%20myString)%3B%3CBR%20%2F%3E%2B%3CBR%20%2F%3E%2B%20PRINTF(%22function%20%25p%5Cn%22%2C_THIS_IP_)%3B%3CBR%20%2F%3E%2B%7D%3CBR%20%2F%3E%2B%3CBR%20%2F%3E%2F*!%3CBR%20%2F%3E*%20%40brief%20Main%20function%3CBR%20%2F%3E*%2F%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3EBOARD_BootClockRUN()%3B%3CBR%20%2F%3EBOARD_InitDebugConsole()%3B%3CBR%20%2F%3E%3CBR%20%2F%3E-%20PRINTF(%22hello%20world.%5Cr%5Cn%22)%3B%3CBR%20%2F%3E%2B%20PRINTF(%22hello%20world%20from%20DRAM.%5Cr%5Cn%22)%3B%3CBR%20%2F%3E%3CBR%20%2F%3Ewhile%20(1)%3CBR%20%2F%3E%7B%3CBR%20%2F%3Ech%20%3D%20GETCHAR()%3B%3CBR%20%2F%3EPUTCHAR(ch)%3B%3CBR%20%2F%3E%2B%20if(ch%20%3D%3D%20'a')%7B%3CBR%20%2F%3E%2B%20Dram_test()%3B%3CBR%20%2F%3E%2B%20%7D%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%7D%3C%2FP%3E%0A%3C%2FDIV%3E%3CNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-noscript-container%22%3E%3CDIV%20class%3D%22lia-spoiler-noscript-content%22%3E%0A---%20a%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Farmgcc%2FMIMX9352_cm33_ram.ld%2B%2B%2B%20b%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Farmgcc%2FMIMX9352_cm33_ram.ld%0Am_a55_suspend_ram%20(RW)%20%3A%20ORIGIN%20%3D%200x20002000%2C%20LENGTH%20%3D%200x00001000m_data%20(RW)%20%3A%20ORIGIN%20%3D%200x20003000%2C%20LENGTH%20%3D%200x0001B000m_rsc_tbl%20(RW)%20%3A%20ORIGIN%20%3D%200x2001E000%2C%20LENGTH%20%3D%200x00001000%2B%20m_text_dram%20(RW)%20%3A%20ORIGIN%20%3D%200x8F000000%2C%20LENGTH%20%3D%200x00001000%2B%20m_data_dram%20(RW)%20%3A%20ORIGIN%20%3D%200x8F001000%2C%20LENGTH%20%3D%200x00001000%7D%2F*%20Define%20output%20sections%20*%2F%0A.%20%3D%20ALIGN(4)%3B%7D%20%26gt%3B%20m_text%2B%20.dram_text%20%3A%2B%20%7B%2B%20.%20%3D%20ALIGN(32)%3B%2B%20*(.myDRAM)%2B%20.%20%3D%20ALIGN(32)%3B%2B%20%7D%20%26gt%3B%20m_text_dram%2B.ARM.extab%20%3A%7B*(.ARM.extab*%20.gnu.linkonce.armextab.*)%0A.ARM.attributes%200%20%3A%20%7B%20*(.ARM.attributes)%20%7DASSERT(__StackLimit%20%26gt%3B%3D%20__HeapLimit%2C%20%22region%20m_data%20overflowed%20with%20stack%20and%20heap%22)%2B%2B%20.dram_data%20%3A%2B%20%7B%2B%20.%20%3D%20ALIGN(32)%3B%2B%20*(.myDRAM_data)%2B%20.%20%3D%20ALIGN(32)%3B%2B%20%7D%20%26gt%3B%20m_data_dram%7Da%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Fhello_world.c%2B%2B%2B%20b%2Fboards%2Fmcimx93autoevk%2Fdemo_apps%2Fhello_world%2Fhello_world.c%0A*%20Definitions******************************************************************************%2F%2B%23define%20_RET_IP_%20(unsigned%20long)__builtin_return_address(0)%2B%23define%20_THIS_IP_%20(%7B%20__label__%20__here%3B%20__here%3A%20(unsigned%20long)%26amp%3B%26amp%3B__here%3B%20%7D)%2F********************************************************************************%20Prototypes%0A%2F********************************************************************************%20Variables******************************************************************************%2F-%2Bconst%20char%20myString%5B%5D%20__attribute__((section(%22.myDRAM_data%22)))%20%3D%20%22Hello%2C%20World!%22%3B%2F********************************************************************************%20Code******************************************************************************%2F%2B__attribute__%20((section(%22.myDRAM%22)))%2Bvoid%20Dram_test(void)%20%7B%2B%20PRINTF(%22Dram_test!!%5Cr%5Cn%22)%3B%2B%2B%20PRINTF(%22%25s!!%5Cr%5Cn%22%2C%20myString)%3B%2B%2B%20PRINTF(%22function%20%25p%5Cn%22%2C_THIS_IP_)%3B%2B%7D%2B%2F*!*%20%40brief%20Main%20function*%2F%0ABOARD_BootClockRUN()%3BBOARD_InitDebugConsole()%3B-%20PRINTF(%22hello%20world.%5Cr%5Cn%22)%3B%2B%20PRINTF(%22hello%20world%20from%20DRAM.%5Cr%5Cn%22)%3Bwhile%20(1)%7Bch%20%3D%20GETCHAR()%3BPUTCHAR(ch)%3B%2B%20if(ch%20%3D%3D%20'a')%7B%2B%20Dram_test()%3B%2B%20%7D%7D%7D%0A%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FNOSCRIPT%3E%3C%2FDIV%3E%3C%2FDIV%3E%0A%3CP%3E%24%20export%20ARMGCC_DIR%3D~%2Fgcc-arm-none-eabi-10.3-2021.10%3CBR%20%2F%3E%24%20export%20PATH%3D%24PATH%3A~%2Fgcc-arm-none-eabi-10.3-2021.10%3CBR%20%2F%3E%24%20.%2Fbuild_release.sh%3C%2FP%3E%0A%3CP%3E%23%23%23%20Copy%20the%20resulting%20binaries%20to%20imx-mkimage%20%23%23%23%3CBR%20%2F%3E%24%20cp%20~%2Fimx-atf%2Fbuild%2Fimx93%2Frelease%2Fbl31.bin%20~%2Fimx-mkimage%2FiMX93%3CBR%20%2F%3E%24%20cp%20~%2Fuboot-imx%2Fu-boot.bin%20~%2Fimx-mkimage%2FiMX93%3CBR%20%2F%3E%24%20cp%20~%2Fuboot-imx%2Fspl%2Fu-boot-spl.bin%20~%2Fimx-mkimage%2FiMX93%3C%2FP%3E%0A%3CP%3E%23%23%23%20Copy%20i.MX%20firmware%20%23%23%23%3CBR%20%2F%3E%24%20cd%20..%3CBR%20%2F%3E%24%20cp%20firmware-imx-8.29-8741a3b%2Ffirmware%2Fddr%2Fsynopsys%2Flpddr4_dmem_*%20~%2Fimx-mkimage%2FiMX93%3CBR%20%2F%3E%24%20cp%20firmware-imx-8.29-8741a3b%2Ffirmware%2Fddr%2Fsynopsys%2Flpddr4_imem_*%20~%2Fimx-mkimage%2FiMX93%3CBR%20%2F%3E%24%20cpfirmware-ele-imx-2.0.3-286c884%2Fmx93a1-ahab-container.img%20~%2Fimx-mkimage%2FiMX93%3C%2FP%3E%0A%3CP%3E%23%23%23%20Build%20the%20flash.bin%20using%20mkimage%3CBR%20%2F%3E%24%20cd%20imx-mkimage%3CBR%20%2F%3E%24%20make%20SOC%3DiMX93%20flash_singleboot%3C%2FP%3E%0A%3CP%3E%23%23%23%20Clone%2C%20modify%20and%20build%20device%20tree%20for%20Linux%20to%20be%20able%20to%20use%20RPROC%20to%20load%20M33%20Firmware%20%23%23%23%3CBR%20%2F%3E%24%20git%20clone%20%3CA%20href%3D%22https%3A%2F%2Fgithub.com%2Fnxp-imx%2Flinux-imx%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%3Ehttps%3A%2F%2Fgithub.com%2Fnxp-imx%2Flinux-imx%3C%2FA%3E%20-b%20lf-6.12.34-2.1.0%3C%2FP%3E%0A%3CDIV%20class%3D%22lia-spoiler-container%22%3E%3CA%20class%3D%22lia-spoiler-link%22%20href%3D%22%23%22%20rel%3D%22nofollow%20noopener%20noreferrer%22%20target%3D%22_blank%22%3ESpoiler%3C%2FA%3E%3CNOSCRIPT%3E%20(Highlight%20to%20read)%3C%2FNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-border%22%3E%3CDIV%20class%3D%22lia-spoiler-content%22%3E%0A%3CP%3E---%20a%2Farch%2Farm64%2Fboot%2Fdts%2Ffreescale%2Fimx93-9x9-qsb.dts%3CBR%20%2F%3E%2B%2B%2B%20b%2Farch%2Farm64%2Fboot%2Fdts%2Ffreescale%2Fimx93-9x9-qsb.dts%3C%2FP%3E%0A%3CP%3Eno-map%3B%3CBR%20%2F%3E%7D%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%2B%20dram%3A%20dram%4020480000%20%7B%3CBR%20%2F%3E%2B%20reg%20%3D%20%26lt%3B0%200x8f000000%200%200x20000%26gt%3B%3B%3CBR%20%2F%3E%2B%20no-map%3B%3CBR%20%2F%3E%2B%20%7D%3B%3CBR%20%2F%3E%2B%3CBR%20%2F%3Ersc_table%3A%20rsc-table%402021e000%20%7B%3CBR%20%2F%3Ereg%20%3D%20%26lt%3B0%200x2021e000%200%200x1000%26gt%3B%3B%3CBR%20%2F%3Eno-map%3B%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3E%26lt%3B%26amp%3Bmu1%201%201%26gt%3B%2C%3CBR%20%2F%3E%26lt%3B%26amp%3Bmu1%203%201%26gt%3B%3B%3CBR%20%2F%3E-%20memory-region%20%3D%20%26lt%3B%26amp%3Bvdevbuffer%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring1%26gt%3B%2C%3CBR%20%2F%3E%2B%20memory-region%20%3D%20%26lt%3B%26amp%3Bdram%26gt%3B%2C%20%26lt%3B%26amp%3Bvdevbuffer%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring1%26gt%3B%2C%3CBR%20%2F%3E%26lt%3B%26amp%3Bvdev1vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev1vring1%26gt%3B%2C%20%26lt%3B%26amp%3Brsc_table%26gt%3B%3B%3CBR%20%2F%3Efsl%2Cstartup-delay-ms%20%3D%20%26lt%3B500%26gt%3B%3B%3CBR%20%2F%3Estatus%20%3D%20%22okay%22%3B%3C%2FP%3E%0A%3C%2FDIV%3E%3CNOSCRIPT%3E%3CDIV%20class%3D%22lia-spoiler-noscript-container%22%3E%3CDIV%20class%3D%22lia-spoiler-noscript-content%22%3E%0A---%20a%2Farch%2Farm64%2Fboot%2Fdts%2Ffreescale%2Fimx93-9x9-qsb.dts%2B%2B%2B%20b%2Farch%2Farm64%2Fboot%2Fdts%2Ffreescale%2Fimx93-9x9-qsb.dts%0Ano-map%3B%7D%3B%2B%20dram%3A%20dram%4020480000%20%7B%2B%20reg%20%3D%20%26lt%3B0%200x8f000000%200%200x20000%26gt%3B%3B%2B%20no-map%3B%2B%20%7D%3B%2Brsc_table%3A%20rsc-table%402021e000%20%7Breg%20%3D%20%26lt%3B0%200x2021e000%200%200x1000%26gt%3B%3Bno-map%3B%0A%26lt%3B%26amp%3Bmu1%201%201%26gt%3B%2C%26lt%3B%26amp%3Bmu1%203%201%26gt%3B%3B-%20memory-region%20%3D%20%26lt%3B%26amp%3Bvdevbuffer%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring1%26gt%3B%2C%2B%20memory-region%20%3D%20%26lt%3B%26amp%3Bdram%26gt%3B%2C%20%26lt%3B%26amp%3Bvdevbuffer%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev0vring1%26gt%3B%2C%26lt%3B%26amp%3Bvdev1vring0%26gt%3B%2C%20%26lt%3B%26amp%3Bvdev1vring1%26gt%3B%2C%20%26lt%3B%26amp%3Brsc_table%26gt%3B%3Bfsl%2Cstartup-delay-ms%20%3D%20%26lt%3B500%26gt%3B%3Bstatus%20%3D%20%22okay%22%3B%0A%3C%2FDIV%3E%3C%2FDIV%3E%3C%2FNOSCRIPT%3E%3C%2FDIV%3E%3C%2FDIV%3E%0A%3CP%3E%24%20export%20ARCH%3Darm64%3CBR%20%2F%3E%24%20export%20CROSS_COMPILE%3D%2Fopt%2Farm-gnu-toolchain-12.3.rel1-x86_64-aarch64-none-linux-gnu%2Fbin%2Faarch64-none-linux-gnu-%3CBR%20%2F%3E%24%20make%20imx_v8_defconfig%3CBR%20%2F%3E%24%20make%20freescale%2Fimx93-9x9-qsb.dtb%3C%2FP%3E%0A%3CP%3ESet%20SW%20for%20serial%20download%20on%20the%20QSB%20(0001)%2C%20connect%20debug%2C%20download%20and%20power%20cables%20and%20turn%20on%20the%20QSB%2C%20for%20this%20test%20we%20will%20flash%20the%20demo%20image%20and%20just%20replace%20Linux%20device%20tree%2C%20flash.bin%20and%20M33%20firmware%20into%20the%20QSB%20board.%3C%2FP%3E%0A%3CP%3E%24%20uuu%20-b%20sd_all%20flash.bin%20imx-image-full-imx93evk.wic%3C%2FP%3E%0A%3CP%3E%3CBR%20%2F%3EOnce%20it%20is%20done%20change%20SW%20to%20the%20respective%20bootmedia%3CBR%20%2F%3ESD%20boot%20(0011)%20and%20boot%20the%20board%20and%20stop%20at%20uboot%2C%20to%20enter%20fastboot%20mode%20to%20load%20modified%20device%20tree%20and%20M33%20firmware%3C%2FP%3E%0A%3CP%3E%26gt%3B%20fastboot%201%3C%2FP%3E%0A%3CP%3EAfter%20this%20just%20run%20UUU%20tool%20on%20the%20host%20computer%20and%20fatload%20the%20files%3C%2FP%3E%0A%3CP%3E%24%20uuu%20-b%20fat_write%20imx93-9x9-qsb.dtb%20mmc%201%3A1%3CBR%20%2F%3E%24%20uuu%20-b%20fat_write%20hello_world.elf%20mmc%201%3A1%3C%2FP%3E%0A%3CP%3EWhen%20the%20tool%20finish%2C%20stop%20fastboot%20mode%20by%20typing%20CTRL%2BC%20and%20then%20boot%20into%20Linux%3CBR%20%2F%3E%26gt%3B%20boot%3C%2FP%3E%0A%3CP%3ELogin%20with%20default%20password%20%22root%22%20and%20run%20the%20following%20commands%20to%20load%20M33%20firmware%3CBR%20%2F%3E%24%20root%3CBR%20%2F%3E%24%20modprobe%20imx_rpmsg_tty%3CBR%20%2F%3E%24%20cp%20%2Frun%2Fmedia%2Fboot-mmcblk1p1%2Fhello_world.elf%20%2Flib%2Ffirmware%2F%3CBR%20%2F%3E%24%20echo%20hello_world.elf%20%26gt%3B%20%2Fsys%2Fclass%2Fremoteproc%2Fremoteproc0%2Ffirmware%3CBR%20%2F%3E%24%20echo%20start%20%26gt%3B%2Fsys%2Fclass%2Fremoteproc%2Fremoteproc0%2Fstate%3C%2FP%3E%0A%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22M33_DDR.png%22%20style%3D%22width%3A%20633px%3B%22%3E%3Cspan%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22M33_DDR.png%22%20style%3D%22width%3A%20633px%3B%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F369449i1B28CC56842A316B%2Fimage-dimensions%2F633x163%3Fv%3Dv2%22%20width%3D%22633%22%20height%3D%22163%22%20role%3D%22button%22%20title%3D%22M33_DDR.png%22%20alt%3D%22M33_DDR.png%22%20%2F%3E%3C%2Fspan%3E%3C%2FSPAN%3E%0A%3CP%3E%E2%80%83%3CBR%20%2F%3EOnce%20done%20we%20can%20verify%20that%20the%20M33%20firmware%20is%20running%20on%20DDR%3C%2FP%3E%0A%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22hello_world.png%22%20style%3D%22width%3A%20630px%3B%22%3E%3Cspan%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22hello_world.png%22%20style%3D%22width%3A%20630px%3B%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F369450i3B8479D80BC168B5%2Fimage-dimensions%2F630x132%3Fv%3Dv2%22%20width%3D%22630%22%20height%3D%22132%22%20role%3D%22button%22%20title%3D%22hello_world.png%22%20alt%3D%22hello_world.png%22%20%2F%3E%3C%2Fspan%3E%3C%2FSPAN%3E%0A%3CP%3E%3CBR%20%2F%3EHope%20everyone%20finds%20this%20useful!%3C%2FP%3E%0A%3CP%3EFor%20any%20question%20regarding%20this%20document%2C%20please%20create%20a%20community%20thread%20and%20tag%20me%20if%20needed.%3C%2FP%3E%0A%3CP%3ESaludos%2FRegards%2C%3CBR%20%2F%3EAldo.%3C%2FP%3E%0A%3C%2FLINGO-BODY%3E
100% helpful (1/1)
Version history
Last update:
‎12-10-2025 11:50 PM
Updated by: