Difference between revisions of "CL-SOM-iMX7: FreeRTOS: Demos Usage Guide"

From Compulab Mediawiki
Jump to: navigation, search
(Watchdog driver demo)
 
(See also)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
== Introduction and Preparations ==
+
{{:Transclusion: CL-SOM-iMX7: FreeRTOS: Demos Usage Guide}}
This article provides a usage guide for the various FreeRTOS demo images that come with the CL-SOM-iMX7 BSP.<br>
 
To run a demo:
 
* Open a [[#Serial connections|serial connection]] to the A7 core.
 
* Open a [[#Serial connections|serial connection]] to the M4 core.
 
* Obtain an [[#SD-card media|SD-card]] formatted with a FAT or EXT filesystem.
 
* (optional) Install the [[#CL-SOM-iMX7 Linux installation|Linux BSP for CL-SOM-iMX7]].
 
 
 
=== Serial connections ===
 
The FreeRTOS demos for CL-SOM-iMX7 were setup so that the M4 serial connection is set to the P4-31 (RX) and P4-33 (TX) pins on the SB-SOM baseboard, using UART2.
 
The A7 core serial port is using UART1, and is located on the P8 connector of the SB-SOM baseboard.
 
For more information about the A7 serial port, please see the [[SB-SOM: HOWTO: RS-232 Console|SB-SOM RS-232 Console]] article.
 
 
 
To communicate with both the M4 and A7 cores using the serial interface, start a terminal emulation program (such as HyperTerminal) for each serial port, with the following port settings:
 
<blockquote>
 
{{:SB-SOM: serial port parameters table}}
 
</blockquote>
 
 
 
=== SD-card media ===
 
In this article, all the demos are loaded using U-Boot from a filesystem formatted SD-card.
 
The SD card must be FAT or EXT filesystems formatted.
 
For other methods of loading the demo images, see the [[#See also|See also section]].
 
 
 
=== CL-SOM-iMX7 Linux installation ===
 
Some of the demos require a Linux installation.
 
In order to boot Linux alongside FreeRTOS, a special device tree blob must be used to prevent Linux and FreeRTOS from interfering with one another.
 
* Follow the [[CL-SOM-iMX7: Linux: Automatic Installation|CL-SOM-iMX7 automatic installation procedure]].
 
* Copy the {{filename|imx7d-sbc-imx7-m4.dtb}} device tree blob to the SD-card
 
* Run the following commands to make sure that U-Boot {{cmd|boot}} command will load the special device tree blob:
 
<pre>
 
CL-SOM-iMX7 # setenv fdtaddr 0x83000000
 
CL-SOM-iMX7 # setenv fdtfile imx7d-sbc-imx7-m4.dtb
 
CL-SOM-iMX7 # setenv loadfdt 'mmc rescan; load mmc 0 ${fdtaddr} ${fdtfile}'
 
CL-SOM-iMX7 # saveenv
 
</pre>
 
 
 
== Demos usage examples ==
 
=== Blinking LED with GPT demo ===
 
The blinking GPT demo utilizes GPT to blink the CL-SOM-iMX7 LED at variable intervals.
 
The length of the interval can be changed by sending anykey presses into the M4 console.
 
==== Example run ====
 
Running the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 blinking_imx_demo_gpt.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output (key presses not echoed back):
 
<pre>
 
================= Blinking Demo ==================
 
 
 
====== Blinking interval 100ms ======
 
 
 
====== Press any key to change blinking interval ======
 
 
 
Wait 5 seconds to switch blinking frequency:
 
 
 
====== Blinking interval 200ms ======
 
 
 
====== Press any key to change blinking interval ======
 
 
 
Wait 5 seconds to switch blinking frequency:
 
 
 
====== Blinking interval 300ms ======
 
 
 
====== Press any key to change blinking interval ======
 
 
 
Wait 5 seconds to switch blinking frequency:
 
 
 
====== Blinking interval 400ms ======
 
 
 
====== Press any key to change blinking interval ======
 
 
 
Wait 5 seconds to switch blinking frequency:
 
 
 
====== Blinking interval 500ms ======
 
 
 
====== Press any key to change blinking interval ======
 
 
 
Wait 5 seconds to switch blinking frequency:
 
</pre>
 
 
 
=== Hello World demo ===
 
The various hello world demos simply output "Hello World!" on the M4 console, and echo any keypresses made by the user.
 
 
 
==== Example run ====
 
Running the demo via U-Boot:
 
* To run the hello_world application in TCM memory:
 
<blockquote><pre>CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 hello_world.bin && dcache flush; bootaux 7F8000</pre></blockquote>
 
* To run the hello_world application in DDR memory:
 
<blockquote><pre>CL-SOM-iMX7 # mmc rescan && load mmc 0 9FF00000 hello_world_ddr.bin && dcache flush; bootaux 9FF00000</pre></blockquote>
 
* To run the hello_world application in OCRAM memory:
 
<blockquote><pre>CL-SOM-iMX7 # mmc rescan && load mmc 0 910000 hello_world_ocram.bin && dcache flush; bootaux 910000</pre></blockquote>
 
 
 
The M4 serial output:
 
<pre>
 
Hello World!
 
 
 
These words were typed by the user and echoed back!
 
</pre>
 
 
 
=== Rand WFI demo ===
 
In this demo a GPT will change the M4 Power Mode with random period.
 
The power mode changes do not happen until Linux boot is initiated.
 
 
 
==== Example run ====
 
Run the demo via U-Boot, and then boot linux:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rand_wfi_imx7d.bin && dcache flush; bootaux 7F8000
 
...
 
CL-SOM-iMX7 # boot
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
************************************************************************
 
*          i.MX 7Dual Dual Core Low Power Demo - M4 side              *
 
*                                                                      *
 
*        A GPT will change the M4 Power Mode with random period        *
 
*                                                                      *
 
************************************************************************
 
 
 
Low Power Demo
 
********************************
 
Please wait :
 
    1) A7 peer is ready
 
Then press "S" to start the demo
 
********************************
 
 
 
Press "S" to start the demo : s
 
GPT will triggle interrupt in 18s
 
go to mode WAIT
 
GPT Event! Total time 18s
 
GPT will triggle interrupt in 18s
 
go to mode STOP
 
GPT Event! Total time 36s
 
GPT will triggle interrupt in 17s
 
go to mode RUN
 
GPT Event! Total time 53s
 
GPT will triggle interrupt in 19s
 
go to mode WAIT
 
GPT Event! Total time 72s
 
GPT will triggle interrupt in 15s
 
go to mode STOP
 
GPT Event! Total time 87s
 
GPT will triggle interrupt in 18s
 
go to mode RUN
 
GPT Event! Total time 105s
 
GPT will triggle interrupt in 17s
 
go to mode WAIT
 
GPT Event! Total time 122s
 
GPT will triggle interrupt in 16s
 
go to mode STOP
 
GPT Event! Total time 138s
 
GPT will triggle interrupt in 16s
 
go to mode RUN
 
</pre>
 
 
 
=== SEMA4 demo ===
 
This demo demonstrates locking and unlocking of the SEMA4 lock.
 
The user can initiate locking manually or set M4 to lock the SEMA4 every 5 seconds.
 
 
 
==== Example run ====
 
Running the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 sema4_demo.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
================== SEMA4 demo ==================
 
Enter command:
 
----- 'm' to manually trigger a SEMA4 lock
 
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
 
m
 
...SEMA4 mutex lock successfully!
 
Enter command:
 
----- 'm' to manually trigger a SEMA4 lock
 
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
 
m
 
...SEMA4 mutex lock successfully!
 
Enter command:
 
----- 'm' to manually trigger a SEMA4 lock
 
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
 
a
 
...SEMA4 mutex lock successfully!
 
Wait for 5 seconds......
 
 
 
...SEMA4 mutex lock successfully!
 
Wait for 5 seconds......
 
 
 
...SEMA4 mutex lock successfully!
 
Wait for 5 seconds......
 
</pre>
 
 
 
=== RPMSG ping-pong demo ===
 
This demo demonstrates synchronization between the A7 and M4 cores by printing a series of messages, with an incrementing index, such that even messages are printed on one core, and odd messages on another core.
 
This demo requires booting into Linux and loading a special driver.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_pingpong_bm_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
or
 
 
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_pingpong_freertos_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
...and then boot into Linux:
 
<pre>
 
CL-SOM-iMX7 # boot
 
</pre>
 
 
 
While Linux boots, you will see this on the M4 core terminal:
 
<pre>
 
RPMSG PingPong Bare Metal Demo...
 
RPMSG Init as Remote
 
</pre>
 
 
 
After Linux finished booting, run the ping pong rpmsg driver.
 
<pre>
 
root@cl-debian:~# cd /lib/modules/4.1.15-cl-som-imx7-3.1/kernel/drivers/rpmsg/
 
root@cl-debian:~# insmod imx_rpmsg_pingpong.ko
 
</pre>
 
 
 
With both A7 and M4 terminals side by side, you will see the following output (A7 to the left, M4 to the right):
 
<pre>
 
                                        Name service handshake is done, M4 has setup a rpmsg channel [0 ---> 1024]
 
get 1 (src: 0x0)                        Get Data From Master Side : 0
 
get 3 (src: 0x0)                        Get Data From Master Side : 2
 
get 5 (src: 0x0)                        Get Data From Master Side : 4
 
get 7 (src: 0x0)                        Get Data From Master Side : 6
 
get 9 (src: 0x0)                        Get Data From Master Side : 8
 
get 11 (src: 0x0)                      Get Data From Master Side : 10
 
...                                    ...
 
</pre>
 
 
 
=== Serial communication demo ===
 
This demo sets up a communication channel between the A7 and M4 cores, allowing the user to type characters from the A7 core, and make them appear on M4 core.
 
This demo requires booting into Linux and loading a special driver, and also running a terminal emulation app on the CL-SOM-iMX7.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_str_echo_bm_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
or
 
 
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_str_echo_freertos_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
...and then boot into Linux:
 
<pre>
 
CL-SOM-iMX7 # boot
 
</pre>
 
 
 
While Linux boots, the following will appear on the M4 core terminal:
 
<pre>
 
RPMSG String Echo Bare Metal Demo...
 
RPMSG Init as Remote
 
</pre>
 
 
 
After booting into Linux, load the imx_rpmsg_tty driver:
 
<pre>
 
root@cl-debian:~# cd /lib/modules/4.1.15-cl-som-imx7-3.1/kernel/drivers/rpmsg/
 
root@cl-debian:~# insmod imx_rpmsg_tty.ko
 
</pre>
 
 
 
A7 serial output:
 
<pre>
 
imx_rpmsg_tty rpmsg0: new channel: 0x400 -> 0x0!
 
Install rpmsg tty driver!
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
Name service handshake is done, M4 has setup a rpmsg channel [0 ---> 1024]
 
</pre>
 
 
 
A {{filename|/dev/ttyRPMSG}} device file will appear in Linux on the A7 core. Connect to it using a terminal emulator of your choice.
 
The following example uses kermit:
 
<pre>
 
root@cl-debian:/# cat kermit.conf
 
set carrier-watch off
 
set handshake none
 
set flow-control none
 
set key \127 \008
 
robust
 
 
 
root@cl-debian:/# kermit -l /dev/ttyRPMSG -b 115200 -y kermit.conf
 
C-Kermit 9.0.302 OPEN SOURCE:, 20 Aug 2011, for Linux+SSL+KRB5
 
Copyright (C) 1985, 2011,
 
  Trustees of Columbia University in the City of New York.
 
Type ? or HELP for help.
 
(/) C-Kermit>connect
 
Connecting to /dev/ttyRPMSG, speed 38400
 
Escape character: Ctrl-\ (ASCII 28, FS): enabled
 
Type the escape character followed by C to get back,
 
or followed by ? to see other options.
 
----------------------------------------------------
 
Hello M4 core! I am A7.
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
Get Message From Master Side : "H" [len : 1] from slot 0
 
Get Message From Master Side : "e" [len : 1] from slot 1
 
Get Message From Master Side : "l" [len : 1] from slot 2
 
Get Message From Master Side : "l" [len : 1] from slot 0
 
Get Message From Master Side : "o" [len : 1] from slot 1
 
Get Message From Master Side : " " [len : 1] from slot 2
 
Get Message From Master Side : "M" [len : 1] from slot 0
 
Get Message From Master Side : "4" [len : 1] from slot 1
 
Get Message From Master Side : " " [len : 1] from slot 2
 
Get Message From Master Side : "c" [len : 1] from slot 0
 
Get Message From Master Side : "o" [len : 1] from slot 1
 
Get Message From Master Side : "r" [len : 1] from slot 2
 
Get Message From Master Side : "e" [len : 1] from slot 0
 
Get Message From Master Side : "!" [len : 1] from slot 1
 
Get Message From Master Side : " " [len : 1] from slot 2
 
Get Message From Master Side : "I" [len : 1] from slot 0
 
Get Message From Master Side : " " [len : 1] from slot 1
 
Get Message From Master Side : "a" [len : 1] from slot 2
 
Get Message From Master Side : "m" [len : 1] from slot 0
 
Get Message From Master Side : " " [len : 1] from slot 1
 
Get Message From Master Side : "A" [len : 1] from slot 2
 
Get Message From Master Side : "7" [len : 1] from slot 0
 
Get Message From Master Side : "." [len : 1] from slot 1
 
</pre>
 
 
 
=== ADC driver demo ===
 
The demo demonstrates the usage of the ADC driver.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 adc_imx7d_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
-------------- ADC imx7d driver example --------------
 
 
 
This example demonstrates usage of ADC driver on i.MX processor.
 
It Continuous convert Analog Input, and print the result to terminal
 
Current analog value: 1.33v
 
Current analog value: 1.32v
 
Current analog value: 1.31v
 
Current analog value: 1.29v
 
Current analog value: 1.31v
 
Current analog value: 1.31v
 
Current analog value: 1.32v
 
Current analog value: 1.31v
 
Current analog value: 1.32v
 
Current analog value: 1.30v
 
Current analog value: 1.32v
 
Current analog value: 1.32v
 
Current analog value: 1.30v
 
Current analog value: 1.31v
 
Current analog value: 1.31v
 
Current analog value: 1.31v
 
Current analog value: 1.30v
 
</pre>
 
 
 
=== Flexcan loopback demo ===
 
This demo demonstrates the usage of the Flexcan driver, when the CAN bus is set to loopback mode.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 flexcan_loopback_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
********* FLEXCAN LOOPBACK TEST *********
 
  Message format: Standard (11 bit id)
 
  Message buffer 9 used for Rx.
 
  Message buffer 13 used for Tx.
 
  Interrupt Mode: Enabled
 
  Operating Mode: TX and RX --> LoopBack
 
*****************************************
 
 
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x0
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x1
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x2
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x3
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x4
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x5
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x6
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x7
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x8
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x9
 
 
 
DLC=1, mb_idx=0x123
 
RX MB data: 0xa
 
</pre>
 
 
 
=== Flexcan network demo ===
 
This demo demonstrates the usage of the Flexcan driver. It is designed to be paired with another M4 core, running a modified version of this demo.
 
 
 
==== Preparation ====
 
* Prepare 2 versions of the flexcan_network_example demo image, one configured for NODE1, and another configured for NODE2:
 
** The precompiled image in the CL-SOM-iMX7 BSP is compiled for NODE 1. No need to do anything further.
 
** Set the Node configuration in main.c to NODE 2 (#define NODE 2).
 
** Build project with the modified NODE configuration. See [[FreeRTOS: Introduction to FreeRTOS development]] for more information.
 
* Obtain another CL-SOM-iMX7 eval board and connect the two boards to the CAN Bus.
 
 
 
==== Example run ====
 
Run the demo via U-Boot on both devices:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 flexcan_network_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
After boot succeeds, the serial output of M4 will display the following:
 
<pre>
 
********* FLEXCAN NETWORK TEST *********
 
  Message format: Standard (11 bit id)
 
  Message buffer 9 used for Rx.
 
  Message buffer 8 used for Tx.
 
  Interrupt Mode: Enabled
 
  Operating Mode: TX and RX --> Normal
 
****************************************
 
 
 
 
 
NODE is 1
 
</pre>
 
 
 
After both modules loaded and booted the demo image, CAN bus communication between the boards will commence.
 
<pre>
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x0
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x1
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x2
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x3
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x4
 
DLC=1, mb_idx=0x123
 
RX MB data: 0x5
 
</pre>
 
 
 
=== GPIO driver demo ===
 
This demo demonstrates the usage of the GPIO driver. It is setup to control the CL-SOM-iMX7 LED using keypresses into the M4 serial connection.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 flexcan_network_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output (key presses are not echoed back):
 
<pre>
 
====================== GPIO Example ========================
 
 
 
============ Use key to simulate GPIO button ==============
 
Input any data from terminal 3 times to continues.
 
 
 
Button pressed 1 time.
 
Button pressed 2 time.
 
Button pressed 3 time.
 
 
 
================= GPIO Functionality==================
 
The button state is now polled.
 
Press the button to switch LED on or off
 
</pre>
 
 
 
At this point sending keypresses into the M4 terminal toggles the CL-SOM-iMX7 LED on and off.
 
 
 
=== GPT driver demo ===
 
This demo demonstrates the usage of the GPT driver.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 gpt_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
GPT timer will now start
 
counter/freq ratio should be close to 0.0 or 1.0 ...
 
GPT A freq 6000000, counter 6.
 
GPT B freq 49090907, counter 18.
 
GPT A freq 6000000, counter 2.
 
GPT B freq 49090907, counter 52.
 
GPT A freq 6000000, counter 1.
 
GPT B freq 49090907, counter 52.
 
GPT A freq 6000000, counter 0.
 
GPT B freq 49090907, counter 53.
 
GPT A freq 6000000, counter 6000000.
 
GPT B freq 49090907, counter 53.
 
GPT example finished...
 
</pre>
 
 
 
=== UART driver demo ===
 
This demo demonstrates the usage of the UART driver in both interrupt and polling modes of operation.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 uart_imx_interrupt_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
or
 
 
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 uart_imx_polling_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
++++++++++++++++ UART Send/Receive Interrupt Driven Example +++++++++++++++++
 
 
 
Type characters from keyboard, the board will receive and then echo them to terminal screen
 
This was typed by the user!
 
</pre>
 
 
 
or
 
 
 
<pre>
 
++++++++++++++++ UART Send/Receive Polling Example +++++++++++++++++
 
 
 
Type characters from keyboard, the board will receive and then echo them to terminal screen
 
This was typed by the user!
 
</pre>
 
 
 
=== Watchdog driver demo ===
 
This demo demonstrates the usage of the Watchdog driver.
 
 
 
==== Example run ====
 
Run the demo via U-Boot:
 
<pre>
 
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 wdog_imx_example.bin && dcache flush; bootaux 7F8000
 
</pre>
 
 
 
M4 serial output:
 
<pre>
 
WDOG with timeout 1.5 seconds will now start
 
WDOG was refreshed 4
 
WDOG was refreshed 3
 
WDOG was refreshed 2
 
WDOG was refreshed 1
 
WDOG was refreshed 0
 
Counter down to 0, WDOG is starved now...
 
WDOG with timeout 1.5 seconds will now start
 
WDOG was refreshed 4
 
WDOG was refreshed 3
 
WDOG was refreshed 2
 
WDOG was refreshed 1
 
WDOG was refreshed 0
 
Counter down to 0, WDOG is starved now...
 
</pre>
 
  
 
== See also ==
 
== See also ==
 
* [[CL-SOM-iMX7: FreeRTOS: Running Demos]]
 
* [[CL-SOM-iMX7: FreeRTOS: Running Demos]]
* [[FreeRTOS: Introduction to FreeRTOS development]]
+
* [[CL-SOM-iMX7: Linux: Automatic Installation|CL-SOM-iMX7 automatic installation procedure]]
 +
* [[CL-SOM-iMX7: FreeRTOS: Introduction to NXP FreeRTOS development|FreeRTOS: Introduction to NXP FreeRTOS development]]
 
* [[Linux: Setting up a development environment|Setting up a development environment]]
 
* [[Linux: Setting up a development environment|Setting up a development environment]]
 
* [http://www.freertos.org/ FreeRTOS website]
 
* [http://www.freertos.org/ FreeRTOS website]

Latest revision as of 10:46, 23 October 2017

Introduction and Preparations

This article provides a usage guide for the various FreeRTOS demo images that come with the CL-SOM-iMX7 BSP.
To run a demo:

Serial connections

The FreeRTOS demos for CL-SOM-iMX7 were setup so that the M4 serial connection is set to the P4-31 (RX) and P4-33 (TX) pins on the carrier baseboard, using UART2. The A7 core serial port is using UART1, and is located on the P8 connector of the carrier baseboard. For more information about the A7 serial port, please see the HOWTO: RS-232 Console article.

To communicate with both the M4 and A7 cores using the serial interface, start a terminal emulation program (such as HyperTerminal) for each serial port, with the following port settings:

Baud Rate Data Bits Stop Bits Parity Flow Control
115200 8 1 none none

SD-card media

In this article, all the demos are loaded using U-Boot from a filesystem formatted SD-card. The SD card must be FAT or EXT filesystems formatted. For other methods of loading the demo images, see the See also section.

Linux installation

Some of the demos require a Linux installation. In order to boot Linux alongside FreeRTOS, a special device tree blob must be used to prevent Linux and FreeRTOS from interfering with one another.

  • Follow the automatic installation procedure in the see also section.
  • Copy the precompiled imx7d-sbc-imx7-m4.dtb device tree blob to the SD-card (or use your own modified dtb).
  • Run the following commands to make sure that U-Boot boot command will load the special device tree blob:
CL-SOM-iMX7 # setenv fdtaddr 0x83000000
CL-SOM-iMX7 # setenv fdtfile imx7d-sbc-imx7-m4.dtb
CL-SOM-iMX7 # setenv loadfdt 'mmc rescan; load mmc 0 ${fdtaddr} ${fdtfile}'
CL-SOM-iMX7 # saveenv

Demos usage examples

Blinking LED with GPT demo

The blinking GPT demo utilizes GPT to blink the CL-SOM-iMX7 LED at variable intervals. The length of the interval can be changed by sending anykey presses into the M4 console.

Example run

Running the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 blinking_imx_demo_gpt.bin && dcache flush; bootaux 7F8000

M4 serial output (key presses not echoed back):

================= Blinking Demo ==================

====== Blinking interval 100ms ======

====== Press any key to change blinking interval ======

Wait 5 seconds to switch blinking frequency:

====== Blinking interval 200ms ======

====== Press any key to change blinking interval ======

Wait 5 seconds to switch blinking frequency:

====== Blinking interval 300ms ======

====== Press any key to change blinking interval ======

Wait 5 seconds to switch blinking frequency:

====== Blinking interval 400ms ======

====== Press any key to change blinking interval ======

Wait 5 seconds to switch blinking frequency:

====== Blinking interval 500ms ======

====== Press any key to change blinking interval ======

Wait 5 seconds to switch blinking frequency:

Hello World demo

The various hello world demos simply output "Hello World!" on the M4 console, and echo any keypresses made by the user.

Example run

Running the demo via U-Boot:

  • To run the hello_world application in TCM memory:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 hello_world.bin && dcache flush; bootaux 7F8000
  • To run the hello_world application in DDR memory:
CL-SOM-iMX7 # mmc rescan && load mmc 0 9FF00000 hello_world_ddr.bin && dcache flush; bootaux 9FF00000
  • To run the hello_world application in OCRAM memory:
CL-SOM-iMX7 # mmc rescan && load mmc 0 910000 hello_world_ocram.bin && dcache flush; bootaux 910000

The M4 serial output:

Hello World!

These words were typed by the user and echoed back!

Rand WFI demo

In this demo a GPT will change the M4 Power Mode with random period. The power mode changes do not happen until Linux boot is initiated.

Example run

Run the demo via U-Boot, and then boot linux:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rand_wfi_imx7d.bin && dcache flush; bootaux 7F8000
...
CL-SOM-iMX7 # boot

M4 serial output:

 ************************************************************************
 *          i.MX 7Dual Dual Core Low Power Demo - M4 side               *
 *                                                                      *
 *        A GPT will change the M4 Power Mode with random period        *
 *                                                                      *
 ************************************************************************

Low Power Demo
********************************
Please wait :
    1) A7 peer is ready
Then press "S" to start the demo
********************************

Press "S" to start the demo : s
GPT will triggle interrupt in 18s
go to mode WAIT
GPT Event! Total time 18s
GPT will triggle interrupt in 18s
go to mode STOP
GPT Event! Total time 36s
GPT will triggle interrupt in 17s
go to mode RUN
GPT Event! Total time 53s
GPT will triggle interrupt in 19s
go to mode WAIT
GPT Event! Total time 72s
GPT will triggle interrupt in 15s
go to mode STOP
GPT Event! Total time 87s
GPT will triggle interrupt in 18s
go to mode RUN
GPT Event! Total time 105s
GPT will triggle interrupt in 17s
go to mode WAIT
GPT Event! Total time 122s
GPT will triggle interrupt in 16s
go to mode STOP
GPT Event! Total time 138s
GPT will triggle interrupt in 16s
go to mode RUN

SEMA4 demo

This demo demonstrates locking and unlocking of the SEMA4 lock. The user can initiate locking manually or set M4 to lock the SEMA4 every 5 seconds.

Example run

Running the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 sema4_demo.bin && dcache flush; bootaux 7F8000

M4 serial output:

================== SEMA4 demo ==================
Enter command:
----- 'm' to manually trigger a SEMA4 lock
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
m
...SEMA4 mutex lock successfully!
Enter command:
----- 'm' to manually trigger a SEMA4 lock
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
m
...SEMA4 mutex lock successfully!
Enter command:
----- 'm' to manually trigger a SEMA4 lock
----- 'a' to automatically trigger SEMA4 lock every 5 seconds
a
...SEMA4 mutex lock successfully!
Wait for 5 seconds......

...SEMA4 mutex lock successfully!
Wait for 5 seconds......

...SEMA4 mutex lock successfully!
Wait for 5 seconds......

RPMSG ping-pong demo

This demo demonstrates synchronization between the A7 and M4 cores by printing a series of messages, with an incrementing index, such that even messages are printed on one core, and odd messages on another core. This demo requires booting into Linux and loading a special driver. It is available in two configurations: the "bare metal" (bm) configuration, which implements the demo functionality without FreeRTOS kernel code, and the freertos version, which does use freertos kernel code.

Example run

Run the demo via U-Boot:

  • To run the bare metal version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_pingpong_bm_example.bin && dcache flush; bootaux 7F8000
  • To run the freertos kernel version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_pingpong_freertos_example.bin && dcache flush; bootaux 7F8000

Initiate an edit of the kernel bootargs:

CL-SOM-iMX7 # editenv bootargs

...and append "mem=255M" to the end of the bootargs.

Boot into Linux:

CL-SOM-iMX7 # boot

While Linux boots, the below messages can be seen on the M4 core terminal:

RPMSG PingPong Bare Metal Demo...
RPMSG Init as Remote

After Linux finished booting, run the ping pong rpmsg driver.

root@cl-debian:~# modprobe imx_rpmsg_pingpong

With both A7 and M4 terminals side by side, the following output can be observed (A7 to the left, M4 to the right):

                                        Name service handshake is done, M4 has setup a rpmsg channel [0 ---> 1024]
get 1 (src: 0x0)                        Get Data From Master Side : 0
get 3 (src: 0x0)                        Get Data From Master Side : 2
get 5 (src: 0x0)                        Get Data From Master Side : 4
get 7 (src: 0x0)                        Get Data From Master Side : 6
get 9 (src: 0x0)                        Get Data From Master Side : 8
get 11 (src: 0x0)                       Get Data From Master Side : 10
...                                     ...

Serial communication demo

This demo sets up a communication channel between the A7 and M4 cores, allowing the user to type characters from the A7 core, and make them appear on M4 core. This demo requires booting into Linux and loading a special driver, and configure the serial tty connection between the cores. It is available in two configurations: the "bare metal" (bm) configuration, which implements the demo functionality without FreeRTOS kernel code, and the freertos version, which does use freertos kernel code.

Example run

Run the demo via U-Boot:

  • To run the bare metal version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_str_echo_bm_example.bin && dcache flush; bootaux 7F8000
  • To run the freertos kernel version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 rpmsg_str_echo_freertos_example.bin && dcache flush; bootaux 7F8000

Initiate an edit of the kernel bootargs:

CL-SOM-iMX7 # editenv bootargs

...and append "mem=255M" to the end of the bootargs.

Boot into Linux:

CL-SOM-iMX7 # boot

While Linux boots, the following will appear on the M4 core terminal:

RPMSG String Echo Bare Metal Demo...
RPMSG Init as Remote

After booting into Linux, load the imx_rpmsg_tty driver:

root@cl-debian:~# modprobe imx_rpmsg_tty
imx_rpmsg_tty rpmsg0: new channel: 0x400 -> 0x0!
Install rpmsg tty driver!

On M4 serial terminal the following output is observed:

Name service handshake is done, M4 has setup a rpmsg channel [0 ---> 1024]

A /dev/ttyRPMSG0 device file will appear in Linux. Configure it for serial communication using stty:

root@cl-debian:/# stty -F /dev/ttyRPMSG0

Send a message from Linux to M4 core:

root@cl-debian:/# echo hello > /dev/ttyRPMSG0

On M4 serial terminal the following output is observed:

Get Message From Master Side : "hello" [len : 5]
Get New Line From Master Side

ADC driver demo

The demo demonstrates the usage of the ADC driver.

Example run

Run the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 adc_imx7d_example.bin && dcache flush; bootaux 7F8000

M4 serial output:

-------------- ADC imx7d driver example --------------

This example demonstrates usage of ADC driver on i.MX processor.
It Continuous convert Analog Input, and print the result to terminal 
Current analog value: 1.33v
Current analog value: 1.32v
Current analog value: 1.31v
Current analog value: 1.29v
Current analog value: 1.31v
Current analog value: 1.31v
Current analog value: 1.32v
Current analog value: 1.31v
Current analog value: 1.32v
Current analog value: 1.30v
Current analog value: 1.32v
Current analog value: 1.32v
Current analog value: 1.30v
Current analog value: 1.31v
Current analog value: 1.31v
Current analog value: 1.31v
Current analog value: 1.30v

Flexcan loopback demo

This demo demonstrates the usage of the Flexcan driver, when the CAN bus is set to loopback mode.

Example run

Run the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 flexcan_loopback_example.bin && dcache flush; bootaux 7F8000

M4 serial output:

********* FLEXCAN LOOPBACK TEST *********
   Message format: Standard (11 bit id)
   Message buffer 9 used for Rx.
   Message buffer 13 used for Tx.
   Interrupt Mode: Enabled
   Operating Mode: TX and RX --> LoopBack
*****************************************


DLC=1, mb_idx=0x123
RX MB data: 0x0 

DLC=1, mb_idx=0x123
RX MB data: 0x1 

DLC=1, mb_idx=0x123
RX MB data: 0x2 

DLC=1, mb_idx=0x123
RX MB data: 0x3 

DLC=1, mb_idx=0x123
RX MB data: 0x4 

DLC=1, mb_idx=0x123
RX MB data: 0x5 

DLC=1, mb_idx=0x123
RX MB data: 0x6 

DLC=1, mb_idx=0x123
RX MB data: 0x7 

DLC=1, mb_idx=0x123
RX MB data: 0x8 

DLC=1, mb_idx=0x123
RX MB data: 0x9 

DLC=1, mb_idx=0x123
RX MB data: 0xa 

Flexcan network demo

This demo demonstrates the usage of the Flexcan driver. It is designed to be paired with another M4 core, running a modified version of this demo.

Preparation

  • Prepare 2 versions of the flexcan_network_example demo image, one configured for NODE1, and another configured for NODE2. Both variations can be found in the images folder.
  • Obtain another CL-SOM-iMX7 eval board and connect the two boards to the CAN Bus.

Example run

Run the demo via U-Boot on both devices:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 flexcan_network_example_nodeX.bin && dcache flush; bootaux 7F8000

After boot succeeds, the serial output of M4 will display the following:

********* FLEXCAN NETWORK TEST *********
   Message format: Standard (11 bit id)
   Message buffer 9 used for Rx.
   Message buffer 8 used for Tx.
   Interrupt Mode: Enabled
   Operating Mode: TX and RX --> Normal
****************************************


NODE is 1

After both modules loaded and booted the demo image, CAN bus communication between the boards will commence.

DLC=1, mb_idx=0x123
RX MB data: 0x0
DLC=1, mb_idx=0x123
RX MB data: 0x1
DLC=1, mb_idx=0x123
RX MB data: 0x2
DLC=1, mb_idx=0x123
RX MB data: 0x3
DLC=1, mb_idx=0x123
RX MB data: 0x4
DLC=1, mb_idx=0x123
RX MB data: 0x5

GPIO driver demo

This demo demonstrates the usage of the GPIO driver. It is setup to toggle a GPIO on and off using key presses into the M4 serial connection. On CL-SOM-iMX7 the GPIO controls the CL-SOM-iMX7 LED.

Example run

Run the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 gpio_imx_example.bin && dcache flush; bootaux 7F8000

M4 serial output (key presses are not echoed back):

====================== GPIO Example ========================

============ Use key to simulate GPIO button ==============
Input any data from terminal 3 times to continues.

Button pressed 1 time. 
Button pressed 2 time. 
Button pressed 3 time. 

================= GPIO Functionality==================
The button state is now polled.
Press the button to switch LED on or off

At this point sending keypresses into the M4 terminal toggles the CL-SOM-iMX7 LED on and off.

GPT driver demo

This demo demonstrates the usage of the GPT driver.

Example run

Run the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 gpt_example.bin && dcache flush; bootaux 7F8000

M4 serial output:

GPT timer will now start
counter/freq ratio should be close to 0.0 or 1.0 ...
	GPT A freq 6000000, counter 6.
	GPT B freq 49090907, counter 18.
	GPT A freq 6000000, counter 2.
	GPT B freq 49090907, counter 52.
	GPT A freq 6000000, counter 1.
	GPT B freq 49090907, counter 52.
	GPT A freq 6000000, counter 0.
	GPT B freq 49090907, counter 53.
	GPT A freq 6000000, counter 6000000.
	GPT B freq 49090907, counter 53.
GPT example finished...

UART driver demo

This demo demonstrates the usage of the UART driver in both interrupt and polling modes of operation.

Example run

Run the demo via U-Boot:

  • To run the interrupt driven version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 uart_imx_interrupt_example.bin && dcache flush; bootaux 7F8000
  • To run the polling version:
CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 uart_imx_polling_example.bin && dcache flush; bootaux 7F8000

M4 serial output for interrupt driven example:

++++++++++++++++ UART Send/Receive Interrupt Driven Example +++++++++++++++++

Type characters from keyboard, the board will receive and then echo them to terminal screen
This was typed by the user!

M4 serial output for polling driven example:

++++++++++++++++ UART Send/Receive Polling Example +++++++++++++++++

Type characters from keyboard, the board will receive and then echo them to terminal screen
This was typed by the user!

Watchdog driver demo

This demo demonstrates the usage of the Watchdog driver.

Example run

Run the demo via U-Boot:

CL-SOM-iMX7 # mmc rescan && load mmc 0 7F8000 wdog_imx_example.bin && dcache flush; bootaux 7F8000

M4 serial output:

WDOG with timeout 1.5 seconds will now start
WDOG was refreshed 4
WDOG was refreshed 3
WDOG was refreshed 2
WDOG was refreshed 1
WDOG was refreshed 0
Counter down to 0, WDOG is starved now...
WDOG with timeout 1.5 seconds will now start
WDOG was refreshed 4
WDOG was refreshed 3
WDOG was refreshed 2
WDOG was refreshed 1
WDOG was refreshed 0
Counter down to 0, WDOG is starved now...

See also