iMX8M Industrial Environmental chamber testing

From Voipac Wiki
Revision as of 14:56, 4 April 2023 by Voipac (talk | contribs)
Jump to navigation Jump to search

On this page environmental stress testing results of iMX8M Industrial Development Kit are displayed. Detailed instructions how to setup boards are also shown.

Hardware configuration

All of the modules used standard specification except of the temperature ranges for the key components as described below:

  • 1x iMX8M Industrial Development Kit in Max configuration
    • i.MX 8M Quad 1.3GHz CPU - extended industrial temperature range (-40°C to +105°C)
    • 4GB LPDDR4 Memory - extended industrial temperature range (-40°C to +95°C)
    • eMMC 32GB - industrial temperature range (-40°C to +85°C)
    • SPB228-D-3 WiFi & Bluetooth Module - industrial temperature range (-40°C to +85°C)


  • 1x iMX8M Industrial Development Kit in Pro configuration
    • i.MX 8M QuadLite 1.3GHz CPU - extended industrial temperature range (-40°C to +105°C)
    • 2GB LPDDR4 Memory - automotive temperature range (-40°C to +95°C)
    • eMMC 16GB - industrial temperature range (-40°C to +85°C)
    • SPB228-D-3 WiFi & Bluetooth Module - industrial temperature range (-40°C to +85°C)


  • 1x iMX8M Industrial Development Kit in Basic configuration
    • i.MX 8M Dual 1.3GHz CPU - extended industrial temperature range (-40°C to +105°C)
    • 1GB LPDDR4 Memory - industrial temperature range (-40°C to +95°C)
    • eMMC 8GB - industrial temperature range (-40°C to +85°C)


  • 1x iMX8M Industrial Development Kit in Max configuration
    • i.MX 8M Quad 1.5GHz CPU - extended commercial temperature range (0°C to +95°C)
    • 4GB LPDDR4 Memory - industrial temperature range (-30°C to +85°C)
    • eMMC 32GB - extended temperature range (-25°C to +85°C)
    • CM-276NF WiFi & Bluetooth Module - industrial temperature range (-30°C to +85°C)


All of the tested modules used standard configuration of iMX8M Development Baseboard with extended temperature range (-20°C to +85°C). The majority of tested kits used the standard heatsink sized 25x25x25mm, which is included in every development kit package, thus showcasing that this standardised heatsink performs even in very harsh conditions. One of the kits was mounted with extra large heatsink and the second one was mounted with the standard heatsink including a fan to test its effect on the performance.
To test the performance of the video capturing capabilities of the development kits under extreme conditions, NXP MIPI-CSI and Digilent MIPI-CSI cameras were included in the tested setups.

The setup in the environmental chamber:
800px

iMX8M Industrial Development Kits-Enviromental chamber overview with description.jpg

Test description

Four iMX8M Industrial Development Kits (one in Max configuration, one in Pro configuration, one in Pro Commercial configuration and one in Basic configuration) were running full peripheral test and stressed all the peripherals in different range of temperatures to check the reliability and stability of the firmware and hardware design.

Configuration, software and testing threads in details:

1x iMX8M Industrial Development Kit [Setup No 4] in Max configuration peripheral stress testing

  • 1 thread of extensive Memory stress test
  • 1 thread of CPU stress test
  • sending HDMI Output to external monitor
  • copying a file from the first USB device to SD card and vice versa
  • copying a file from the second USB device to SD card and vice versa
  • pinging the host PC via Ethernet
  • all the messages were printed out on the serial console through connected Micro USB cable
  • firmware running from eMMC
  • standard 25x25x25mm heatsink plus fan


1x iMX8M Industrial Development Kit [Setup No 2] in Pro configuration Memory stress testing

  • 1 thread of extensive Memory stress test
  • 1 thread of CPU stress test
  • sending HDMI Output to external monitor
  • copying a file from the first USB device to SD card and vice versa
  • copying a file from the second USB device to SD card and vice versa
  • pinging the host PC via Ethernet
  • all the messages were printed out on the serial console through connected Micro USB cable
  • firmware running from eMMC
  • Extra large 48x48x16mm heatsink


1x iMX8M Industrial Development Kit [Setup No 1] in Basic configuration peripheral stress testing

  • 1 thread of extensive Memory stress test
  • 1 thread of CPU stress test
  • sending HDMI Output to external monitor
  • copying a file from the first USB device to SD card and vice versa
  • copying a file from the second USB device to SD card and vice versa
  • pinging the host PC via Ethernet
  • all the messages were printed out on the serial console through connected Micro USB cable
  • firmware running from eMMC
  • standard 25x25x25mm heatsink


1x iMX8M Industrial Development Kit [Setup No 3] in Max configuration peripheral stress testing

  • 1 thread of extensive Memory stress test
  • 1 thread of CPU stress test
  • sending HDMI Output to external monitor
  • copying a file from the first USB device to SD card and vice versa
  • copying a file from the second USB device to SD card and vice versa
  • pinging the host PC via Ethernet
  • all the messages were printed out on the serial console through connected Micro USB cable
  • firmware running from eMMC
  • standard 25x25x25mm heatsink plus fan


USB flash devices were placed outside the environmental chamber. All the scripts running during the test and the board setup instructions can be found in section How to prepare the test.

Testing Results

The picture below shows the temperature profile during the whole testing process:
680px

Running the boards at -40°C – PASS

Test description: CPU, Memory and peripheral stress tests were running at -40°C. All the tested kits were working without errors during the whole time, even if some components used for iMX8M PRO QuadLite Commercial were only rated for temperature range between 0°C and +95°C. iMX8M Industrial Development Base Boards were running at this temperature with components certified only from 0°C to +85°C temperature range.

A closer image on the temperature chamber displaying the minimum temperature is shown below. These readouts are available on the display:

  • the first number shows current temperature
  • the second one set temperature
  • the last two shows rerelative humidity. Humidity was not controlled during testing process.

iMX8M Industrial Kit-Env chamber-Boards at 40°C.png

Running the kits at high temperatures (from +60°C to +100°C) – PASS

Test description: The ambient temperature was gradually increasing (from 60°C up to 100°C) while CPU, Memory and peripheral stress tests were running. The moment when CPU frequency had decreased was used as a test threshold (this occurred when CPU temperature reached +70°C up to +100°C). Components used for iMX8 Base Boards were only rated from 0°C to +85°C operating temperature range.
iMX8M Industrial Kit-Env chamber-Boards at 86°C.png

Switch ON/OFF test at -40°C – PASS

Test description: At temperature -40°C the boards were switched OFF, left OFF for at least 10 minutes (to cool down completely) and then switched ON to see if they boot up without problems. Once booted up into Linux, the test scrip was launched to test RAM memory and all peripherals. The boards were turned off again multiple times to see potential problems at lowest temperature level. All of the tested boards booted up successfully.


iMX8M Industrial Kit-Env chamber-Boards snow.png

Cooling performance at high temperatures

Test description: As mentioned above, different heatsinks and enclosures were utilized in order to compare the cooling abilities. All these tests were performed with Max version which generate the most heat by itself. All setup reached temperature +85°C in the chamber while still successfully running. The board in the enclosure with the biggest height and cooling fins on the top size reached +100°C.

PC setup

The PC was used during test while controlling / monitoring all the boards through serial console sessions. The control computer was running Windows 10 operating system.

HDMI and Serial consoles

To control iMX8M Industrial Development Kit, one TeraTerm serial console was opened per board. The boards was connected to external HDMI switch to monitoring HDMI output.

The setup of the environmental chamber cables and out-of-chamber equipment:
800px

Preparing the test

Boot device and software

eMMC was selected as a booting device for all the boards. U-Boot settings were not adjusted as the default configuration was used. The only change compared to standard software package was running a test script. To prepare a fresh eMMC follow these instructions. Here is an example of creating a eMMC suitable for Max configuration:

git clone https://github.com/voipac/imx8m-production
cd ...../
.....

Downloading stress test

Stressapptest package was selected to check CPU and memory integrity. Placing this file into the same directory where the testing script will be stored is important:

wget https://github.com/voipac/imx8m-production/blob/master/imx8mq-voipac-peripheral-test.sh

Start CPU and memory stress test

Navigate into the directory, where stressapptest feature and test are stored.

Stress command:

for d in $(seq 1 1 999)
do
	uptime
	echo "Test $a Test $b Test $c  $d times"
	echo "Start stress-ng --iomix 1 -t 10 -v"
	stress-ng --iomix 1 -t 10 -v
	echo "End"
	echo "Start stress-ng --cpu 2 --vm 4 -t 10"
	stress-ng --cpu 2 --vm 4 -t 10
	echo "End"
	echo "Start stress-ng --shm 0 -t 10"
	stress-ng --shm 0 -t 10
	echo "End"
	echo "Start stress-ng --seq 0 -t 2 --tz -v"
	stress-ng --seq 0 -t 2 --tz -v
	echo "End"
	echo "Start Thermal zone information"
	stress-ng --matrix 0 --tz -t 10 --log-brief -t 10
	echo "End"
done

Start peripheral test

Plug the development kit into mains and connect it to the controlling PC via console. Before the first time usage of the script, permissions need to be granted by the following command:

chmod +x imx8m-voipac-peripheral-test.sh


Testing scripts command consists of the following arguments:

  • the first parameter - configuration of tested development kit (Max, Pro or Basic)
  • the second parameter - USB drive 1 location
  • the third parameter - USB drive 2 location
  • the fourth parameter - SD card location


Several commands used during EMC testing are shown below:

  • iMX8M Industrial Development Kit Max:
./imx8m-voipac-peripheral-test.sh -max sda1 sdb1 mmcblk1p1 | tee -i imx8m-emc-testing.log
  • iMX8M Industrial Development Kit Pro:
./imx8m-voipac-peripheral-test.sh -pro sda1 sdb1 mmcblk1p1 | tee -i imx8m-emc-testing.log
  • iMX8M Industrial Development Kit Basic:
./imx8m-voipac-peripheral-test.sh -basic sda1 sdb1 mmcblk1p1 | tee -i imx8m-emc-testing.log

The complete script can be found in the github or down below:

#!/bin/sh
 
# iMX8MQ environmental chamber peripheral test
  
mountDevice() {
  mkdir -p "/media/$2"
  mount /dev/$1 /media/$2
  cat /proc/mounts | grep -F "/dev/$1 /media/$2"
  if [ "$?" -eq "0" ]; then
    echo "$2 mounted"
  else
    echo "$2 not mounted"; exit 2
  fi
}
 
# prepare files
cd ~/
mkdir -p env-chamber-testing/
cd env-chamber-testing/
   
touch env-chamber-testing.log
touch cpu-temp.log
 
basic=0
pro=0
max=0
case $1 in
  -basic)  basic=1 ;;
  -pro)  pro=1 ;;
  -max)  max=1 ;;
  *)
esac
  
# mount devices
mountDevice $2 usb0
mountDevice $3 usb1
mountDevice $4 mmc0
 
updateLogFiles() {
  # obtain board ID from IP address - be sure addresses are allocated based on MAC
  boardID=$(/sbin/ip -o -4 addr list eth0 | awk '{print $4}' | cut -d/ -f1 | cut -d'.' -f4 | cut -d'2' -f2);
  # be sure time server is running on DHCP server
  currentTime=`date +%Y-%m-%d.%H:%M`
   
  mv env-chamber-testing.log trx-board-$boardID-env-chamber.log.$currentTime
  mv cpu-temp.log trx-board-$boardID-env-cpu-temp.log.$currentTime
}
 
finish_test_now() {
  echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Ctrl+C Detected: End of the test"
  precced=0;
  #kill -INT $vid_pid $str_pid $log_pid;
  sleep 3;
  test_status=`cat env-chamber-testing.log | grep -i "error" | grep -v -e "0 errors" -e "no corrected errors"`
  if [ -z "$test_status" ]
  then
    echo "*********TEST PASS*********"
  else
    echo "*********TEST FAIL*********"
    echo "List of detected errors:"
    cat env-chamber-testing.log | grep -i "error" | grep -v -e "0 errors" -e "no corrected errors" -e "List of detected errors:"
  fi
  updateLogFiles
  exit;
}
  
# kill all processes if Ctrl+C is detected
trap finish_test_now 2
 
# play a video stream from HDMI input - testing also HDMI output
gst-launch-1.0 -q imxv4l2src ! autovideosink &
 
# stressapptest - one thread CPU, one thread memory, sata thread (if possible)
if [ "${basic}" -eq "1" ]; then
  stress-ng --cpu 2 --vm 4 &
  str_pid=$!
fi
if [ "${pro}" -eq "1" ]; then
  stress-ng --cpu 4 --vm 4 &
  str_pid=$!
fi
if [ "${max}" -eq "1" ]; then
  stress-ng --cpu 4 --vm 4 &
  str_pid=$!
fi
echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Starting stressapptest with PID: " $str_pid
  
proceed=1
# create test files
file1_path=`mktemp`
file2_path=`mktemp`
file1=`basename $file1_path`
file2=`basename $file2_path`

dd if=/dev/urandom of=$file1_path bs=1024 count=10000
dd if=/dev/urandom of=$file2_path bs=1024 count=10000
 
cp1_from="/media/mmc0/"
cp1_to="/media/usb0/"
 
cp2_from="/media/usb0/"
cp2_to="/media/usb1/"
 
#copy files in case they are missing
cp $file1_path $cp1_from
cp $file1_path $cp1_to
cp $file2_path $cp2_from
cp $file2_path $cp2_to
  
while [ $proceed -eq 1 ]
do
 
  ping -q -c1 127.0.0.1 >> env-chamber-testing.log
  if [ $? -ne 0 ]
  then
    echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Ping failed"
  else
    echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Ping OK"
  fi
  
  cp1_done=`ps | grep $cp1_pid | grep cp`
  if [ -z "$cp1_done" ]; then # copy finished
    if cmp -s $cp1_from$file1 $cp1_to$file1; then
      echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) PASS: Copying file from $cp1_from to $cp1_to successful"
    else
      echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Difference between files on $cp1_from and $cp1_to detected"
    fi
    cp1_temp=$cp1_from # swap destinations
    cp1_from=$cp1_to
    cp1_to=$cp1_temp
      
    rm $cp1_to$file1 # remove destination file
      
    cp $cp1_from$file1 $cp1_to$file1 &
    cp1_pid=$!
    echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Started copying file from $cp1_from to $cp1_to"
  fi
    
  cp2_done=`ps | grep $cp2_pid | grep cp`
  if [ -z "$cp2_done" ]; then # copy finished
    if cmp -s $cp2_from$file2 $cp2_to$file2; then
      echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) PASS: Copying file from $cp2_from to $cp2_to successful"
    else
      echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) ERROR: Difference between files on $cp2_from and $cp2_to detected"
    fi
    cp2_temp=$cp2_from # swap destinations
    cp2_from=$cp2_to
    cp2_to=$cp2_temp
      
    rm $cp2_to$file2 # remove destination file
      
    cp $cp2_from$file2 $cp2_to$file2 &
    cp2_pid=$!
    echo "$(date +\%Y/\%m/\%d-\%T)($(date +\%Z)) Started copying file from $cp2_from to $cp2_to"
  fi
  
done