|
| 1 | +.. zephyr:board:: imx8mp_var_dart |
| 2 | +
|
| 3 | +Overview |
| 4 | +******** |
| 5 | + |
| 6 | +Variscite's DART-MX8M-PLUS System on Module (SoM) is based on the i.MX 8M Plus family, |
| 7 | +which is a set of NXP products built to achieve both high performance and low power |
| 8 | +consumption and relies on a powerful, fully coherent core complex based on a quad Cortex®-A53 |
| 9 | +cluster and Cortex®-M7 low-power coprocessor, audio digital signal processor, machine learning |
| 10 | +and graphics accelerators. |
| 11 | + |
| 12 | +Zephyr OS is ported to run on either the Cortex®-A53 or the Cortex®-M7. |
| 13 | + |
| 14 | +Specs Summary |
| 15 | +*************** |
| 16 | + |
| 17 | + - CPU |
| 18 | + |
| 19 | + - NXP i.MX8M Plus: |
| 20 | + - Up to 4x Cortex®-A53 @ 1.8GHz |
| 21 | + - 1x Cortex®-M7 @ 800 MHz |
| 22 | + - 1x NPU 2.3 TOPS |
| 23 | + - Memory |
| 24 | + |
| 25 | + - Up to 8GB LPDDR4 RAM @ 2000MHz |
| 26 | + - 8-bit up to 128GB eMMC boot and storage |
| 27 | + - GPU |
| 28 | + |
| 29 | + - 3D: Vivante™ GC7000UltraLite (2 shaders) OpenGL ES 3.0, OpenCL1.2, Vulkan |
| 30 | + - 2D: Vivante™ GC520L |
| 31 | + - NPU (Neural Processing Unit) |
| 32 | + |
| 33 | + - 2.3 TOPS Neural Network performance |
| 34 | + - Display |
| 35 | + |
| 36 | + - 2x LVDS interface 4-lane each up to 1080p60 |
| 37 | + - HDMI 2.0a up to 4Kp30 |
| 38 | + - 1x MIPI DSI with up to 4 data lanes 1080p60 |
| 39 | + - Network |
| 40 | + |
| 41 | + - 2x 10/100/1000 Mbit/s Ethernet Interface |
| 42 | + - Certified Wi-Fi 6 dual-band 802.11ax/ac/a/b/g/n with optional 802.15.4 |
| 43 | + - Bluetooth/BLE 5.4 |
| 44 | + - Camera |
| 45 | + |
| 46 | + - Up to 2x MIPI CSI – CMOS Serial camera Interface 4 lanes |
| 47 | + - 375 Mpixel/s HDR ISP (Image Sensor Processor) |
| 48 | + - Audio |
| 49 | + |
| 50 | + - Headphones |
| 51 | + - Microphone: Digital, Analog (stereo) |
| 52 | + - 6x I2S(SAI), S/PDIF RX TX, PDM 8CH, Line In/Out |
| 53 | + - USB |
| 54 | + |
| 55 | + - 2x USB 3.0/2.0 Host/Device |
| 56 | + - Serial interfaces |
| 57 | + |
| 58 | + - SPI: x3 |
| 59 | + - I2C: x5 |
| 60 | + - UART: x4, up to 5 Mbps |
| 61 | + - CAN: x2 |
| 62 | + - Temperature range |
| 63 | + |
| 64 | + - -40°C to 85°C |
| 65 | + |
| 66 | +More information about the SoM can be found at the |
| 67 | +`Variscite Wiki`_ and |
| 68 | +`Variscite website`_. |
| 69 | + |
| 70 | +Supported Features |
| 71 | +================== |
| 72 | + |
| 73 | +.. zephyr:board-supported-hw:: |
| 74 | +
|
| 75 | +.. note:: |
| 76 | + |
| 77 | + It is recommended to disable peripherals used by the M7 core on the Linux host. |
| 78 | + |
| 79 | +Devices |
| 80 | +======== |
| 81 | +System Clock |
| 82 | +------------ |
| 83 | + |
| 84 | +This board configuration uses a system clock frequency of 8 MHz. |
| 85 | + |
| 86 | +The M7 core is configured to run at an 800 MHz clock speed. |
| 87 | + |
| 88 | +Serial Port |
| 89 | +----------- |
| 90 | + |
| 91 | +This board configuration uses a single serial communication channel with the |
| 92 | +CPU's UART3. |
| 93 | + |
| 94 | +Programming and Debugging (A53) |
| 95 | +******************************* |
| 96 | + |
| 97 | +Copy the compiled ``zephyr.bin`` to the boot directory of the SD card and |
| 98 | +plug the SD card into the board. Power it up and stop the U-Boot execution at |
| 99 | +prompt. |
| 100 | + |
| 101 | +Use U-Boot to load and run zephyr.bin on the Cortex-A53: |
| 102 | + |
| 103 | +.. code-block:: console |
| 104 | +
|
| 105 | + load mmc $mmcdev:$mmcpart $loadaddr /boot/zephyr.bin |
| 106 | + dcache flush; icache flush; go $loadaddr |
| 107 | +
|
| 108 | +Use this configuration to run basic Zephyr applications and kernel tests, |
| 109 | +for example, with the :zephyr:code-sample:`hello_world` sample: |
| 110 | + |
| 111 | +.. zephyr-app-commands:: |
| 112 | + :zephyr-app: samples/hello_world |
| 113 | + :host-os: unix |
| 114 | + :board: imx8mp_var_dart/mimx8ml8/a53 |
| 115 | + :goals: build |
| 116 | + |
| 117 | +This will build an image with the hello_world sample app. When loaded and executed |
| 118 | +it will display the following ram console output: |
| 119 | + |
| 120 | +.. code-block:: console |
| 121 | +
|
| 122 | + *** Booting Zephyr OS build v4.0.0-3113-g5aeda6fe7dfa *** |
| 123 | + Hello World! imx8mp_var_dart/mimx8ml8/a53 |
| 124 | +
|
| 125 | +
|
| 126 | +Programming and Debugging (M7) |
| 127 | +****************************** |
| 128 | + |
| 129 | +.. zephyr:board-supported-runners:: |
| 130 | +
|
| 131 | +The DART-MX8M-PLUS doesn't have QSPI flash for the M7, and it needs to be |
| 132 | +started by the A53 core. The A53 core is responsible to load the M7 binary |
| 133 | +application into the RAM, put the M7 in reset, set the M7 Program Counter and |
| 134 | +Stack Pointer, and get the M7 out of reset. The A53 can perform these steps at |
| 135 | +bootloader level or after the Linux system has booted. |
| 136 | + |
| 137 | +The M7 can use up to 3 different RAMs (currently, only two configurations are |
| 138 | +supported: ITCM and DDR). These are the memory mapping for A53 and M7: |
| 139 | + |
| 140 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 141 | +| Region | Cortex-A53 | Cortex-M7 (System Bus) | Cortex-M7 (Code Bus) | Size | |
| 142 | ++============+=========================+========================+=======================+======================+ |
| 143 | +| OCRAM | 0x00900000-0x0098FFFF | 0x20200000-0x2028FFFF | 0x00900000-0x0098FFFF | 576KB | |
| 144 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 145 | +| DTCM | 0x00800000-0x0081FFFF | 0x20000000-0x2001FFFF | | 128KB | |
| 146 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 147 | +| ITCM | 0x007E0000-0x007FFFFF | | 0x00000000-0x0001FFFF | 128KB | |
| 148 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 149 | +| OCRAM_S | 0x00180000-0x00188FFF | 0x20180000-0x20188FFF | 0x00180000-0x00188FFF | 36KB | |
| 150 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 151 | +| DDR | 0x80000000-0x803FFFFF | 0x7B200000-0x7B3FFFFF | 0x7B000000-0x7B1FFFFF | 2MB | |
| 152 | ++------------+-------------------------+------------------------+-----------------------+----------------------+ |
| 153 | + |
| 154 | +For more information about memory mapping see the |
| 155 | +`i.MX 8M Applications Processor Reference Manual`_ (section 2.1 to 2.3) |
| 156 | + |
| 157 | +At compilation time you have to choose which RAM will be used. This |
| 158 | +configuration is done based on board name (e.g. imx8mp_var_dart/mimx8ml8/m7 |
| 159 | +for ITCM and imx8mp_var_dart/mimx8ml8/m7/ddr for DDR). |
| 160 | + |
| 161 | +There are two methods to load M7 Core images: U-Boot command and Linux remoteproc. |
| 162 | + |
| 163 | +Load and Run M7 Zephyr Image from U-Boot |
| 164 | +======================================== |
| 165 | + |
| 166 | +Load and run Zephyr on M7 from A53 using U-Boot by copying the compiled |
| 167 | +``zephyr.bin`` to the boot directory of the SD card and plug the SD |
| 168 | +card into the board. Power it up and stop the U-Boot execution at prompt. |
| 169 | + |
| 170 | +Load the M7 binary onto the desired memory and start its execution using: |
| 171 | + |
| 172 | +ITCM |
| 173 | +==== |
| 174 | + |
| 175 | +.. code-block:: console |
| 176 | +
|
| 177 | + load mmc 1:1 0x48000000 /boot/zephyr.bin |
| 178 | + cp.b 0x48000000 0x7e0000 20000 |
| 179 | + bootaux 0x7e0000 |
| 180 | +
|
| 181 | +DDR |
| 182 | +=== |
| 183 | + |
| 184 | +.. code-block:: console |
| 185 | +
|
| 186 | + load mmc 1:1 0x7b000000 /boot/zephyr.bin |
| 187 | + dcache flush |
| 188 | + bootaux 0x7b000000 |
| 189 | +
|
| 190 | +Load and Run M7 Zephyr Image by using Linux remoteproc |
| 191 | +====================================================== |
| 192 | + |
| 193 | +Transfer built binaries ``zephyr.bin`` and ``zephyr.elf`` to the SoM's ``/boot`` and |
| 194 | +``/lib/firmware`` respectively using ``scp`` or through an USB drive. |
| 195 | + |
| 196 | +It is possible to execute Zephyr binaries using Variscite remoteproc scripts made |
| 197 | +for MCUXpresso binaries: |
| 198 | + |
| 199 | +.. code-block:: console |
| 200 | +
|
| 201 | + root@imx8mp-var-dart:~# /etc/remoteproc/variscite-rproc-linux -f /lib/firmware/zephyr.elf |
| 202 | + [ 212.888118] remoteproc remoteproc0: powering up imx-rproc |
| 203 | + [ 212.899215] remoteproc remoteproc0: Booting fw image zephyr.elf, size 515836 |
| 204 | + [ 212.912070] remoteproc remoteproc0: No resource table in elf |
| 205 | + [ 213.444675] remoteproc remoteproc0: remote processor imx-rproc is now up |
| 206 | +
|
| 207 | +Which should yield the following result on the UART3 serial console: |
| 208 | + |
| 209 | +.. code-block:: console |
| 210 | +
|
| 211 | + *** Booting Zephyr OS build v4.0.0-3113-g5aeda6fe7dfa *** |
| 212 | + Hello World! imx8mp_var_dart/mimx8ml8/m7 |
| 213 | +
|
| 214 | +If the device tree dedicated to be used with Cortex-M7 applications is not being |
| 215 | +currently used, the script will give instructions on how to do so: |
| 216 | + |
| 217 | +.. code-block:: console |
| 218 | +
|
| 219 | + Error: /sys/class/remoteproc/remoteproc0 not found. |
| 220 | + Please enable remoteproc driver. |
| 221 | + Most likely you need to use the correct device tree, for example: |
| 222 | + fw_setenv fdt_file imx8mp-var-dart-dt8mcustomboard-m7.dtb && reboot |
| 223 | +
|
| 224 | +You can also configure U-Boot to load firmware on boot: |
| 225 | + |
| 226 | +.. code-block:: console |
| 227 | +
|
| 228 | + root@imx8mp-var-dart:~# /etc/remoteproc/variscite-rproc-u-boot -f /boot/zephyr.bin |
| 229 | + Configuring for TCM memory |
| 230 | + + fw_setenv m7_addr 0x7E0000 |
| 231 | + + fw_setenv fdt_file imx8mp-var-dart-dt8mcustomboard-m7.dtb |
| 232 | + + fw_setenv use_m7 yes |
| 233 | + + fw_setenv m7_bin zephyr.bin |
| 234 | +
|
| 235 | + Finished: Please reboot, the m7 firmware will run during U-Boot |
| 236 | +
|
| 237 | +For more information about Variscite remoteproc scripts and general Cortex-M7 |
| 238 | +support, visit `Variscite Wiki`_. |
| 239 | + |
| 240 | +Debugging |
| 241 | +========= |
| 242 | + |
| 243 | +DART-MX8M-PLUS board can be debugged by connecting an external |
| 244 | +JLink JTAG debugger to the J29 of the DT8MCustomBoard and to the PC. |
| 245 | +Then the application can be debugged using the usual way. |
| 246 | + |
| 247 | +Here is an example for the :zephyr:code-sample:`hello_world` application. |
| 248 | + |
| 249 | +.. zephyr-app-commands:: |
| 250 | + :zephyr-app: samples/hello_world |
| 251 | + :board: imx8mp_var_dart/mimx8ml8/m7 |
| 252 | + :goals: debug |
| 253 | + |
| 254 | +Open a serial terminal, step through the application in your debugger, and you |
| 255 | +should see the following message in the terminal: |
| 256 | + |
| 257 | +.. code-block:: console |
| 258 | +
|
| 259 | + *** Booting Zephyr OS build v4.0.0-3113-g5aeda6fe7dfa *** |
| 260 | + Hello World! imx8mp_var_dart/mimx8ml8/m7 |
| 261 | +
|
| 262 | +References |
| 263 | +========== |
| 264 | + |
| 265 | +- `Variscite Wiki`_ |
| 266 | +- `Variscite website`_ |
| 267 | +- `i.MX 8M Applications Processor Reference Manual`_ |
| 268 | + |
| 269 | +.. _Variscite Wiki: |
| 270 | + https://variwiki.com/index.php?title=DART-MX8M-PLUS |
| 271 | + |
| 272 | +.. _Variscite website: |
| 273 | + https://www.variscite.com/product/system-on-module-som/cortex-a53-krait/dart-mx8m-plus-nxp-i-mx-8m-plus |
| 274 | + |
| 275 | +.. _i.MX 8M Applications Processor Reference Manual: |
| 276 | + https://www.nxp.com/webapp/Download?colCode=IMX8MPRM |
0 commit comments