| .. zephyr:code-sample:: ipm-imx |
| :name: IPM on NXP i.MX |
| :relevant-api: ipm_interface |
| |
| Implement inter-processor mailbox (IPM) on i.MX SoCs containing a Messaging Unit peripheral. |
| |
| Overview |
| ******** |
| This simple example can be used with multicore i.MX SoCs containing a |
| Messaging Unit peripheral. It reads the received data from the Messaging Unit |
| using the IPM and transmits it back unchanged. The information about |
| the received data is printed to the console. When sending the data back, |
| it blocks until the data are read by the remote side. |
| |
| The i.MX Messaging Unit peripheral consists of four 32-bit transmit and receive |
| registers. The sample uses the option :kconfig:option:`CONFIG_IPM_IMX_MAX_DATA_SIZE_4`, |
| which effectively creates four IPM channels. Selecting the option |
| :kconfig:option:`CONFIG_IPM_IMX_MAX_DATA_SIZE_8` or |
| :kconfig:option:`CONFIG_IPM_IMX_MAX_DATA_SIZE_16` would result in two 64-bit channels |
| or a single 128-bit channel respectively. |
| |
| Note that this is just a simple demo to demonstrate the i.MX IPM functionality |
| and blocking sending of the data back is done in the interrupt handler, which |
| would not be appropriate for a real world application. |
| |
| Building and Running the Zephyr Code |
| ************************************ |
| |
| The sample requires that data are being sent by the remote core so it can echo |
| it back. The other core is usually not running Zephyr but Linux on i.MX |
| multicore processors. |
| |
| This project outputs data to the console. |
| It can be built as follows: |
| |
| .. zephyr-app-commands:: |
| :zephyr-app: samples/drivers/ipm/ipm_imx |
| :board: udoo_neo_full/mcimx6x/m4 |
| :goals: build flash |
| :compact: |
| |
| Follow the instructions in the :zephyr:board:`udoo_neo_full` board documentation |
| for how to load the Zephyr binary to the desired core and execute it. |
| |
| Building and Running the Linux Code |
| *********************************** |
| |
| The remote code is in the form of a loadable Linux kernel module. It creates |
| four character devices /dev/mu0 till /dev/mu3, which are used to read data from |
| and write data into the Messaging Unit. |
| |
| The remote code and the instructions how to build and run it are located at: |
| |
| https://source.codeaurora.org/external/imxsupport/imx-mu/ |
| |
| Sample Output |
| ============= |
| |
| Typing this in the Linux console: |
| |
| .. code-block:: console |
| |
| # cat > /dev/mu0 |
| abcdefgh |
| ^D |
| |
| Results in the following output on the Zephyr side: |
| |
| .. code-block:: console |
| |
| ***** Booting Zephyr OS v1.12.0-291-g8cc508b ***** |
| IPM initialized, data size = 4 |
| ipm_callback: id = 0, data = 0x03323130 |
| ipm_callback: id = 0, data = 0x03353433 |
| ipm_callback: id = 0, data = 0x03383736 |
| ipm_callback: id = 0, data = 0x02000a39 |