IOT-GATE-iMX8 and SBC-IOT-iMX8: Yocto Linux: How-To Guide

From Compulab Mediawiki
Jump to: navigation, search


Yocto Linux image for the CompuLab IOT-GATE-iMX8 and SBC-IOT-iMX8 includes the drivers and utilities needed to operate the on-board hardware components.

In addition, the default Yocto build includes many software packages, such as:

  • Core system
  • SSH server and client
  • NetworkManager
  • ModemManager
  • Bluez5 Bluetooth tools and daemons
  • SocketCAN
  • Minicom
  • GPSD

Serial Console

IOT-GATE-IMX8 / SBC-IOT-IMX8 provides a serial console on the front panel micro-USB Console connector.

Connecting to a host PC

  1. Use a micro-USB cable to connect the Console connector to a USB port on your host PC.
  2. Make sure the CP2104 driver is available with your operating system, otherwise install CP2104 driver onto the host PC from
  3. Identify the host PC interface and port number that will be used for communication with the device:
    • In most Linux PCs, the serial port will be denoted as one of the following (where n is a positive integer): /dev/ttyUSB0, /dev/ttyUSB1 ... /dev/ttyUSBn
    • In Windows PCs, the serial port usually will be denoted as one of the following (where n is a positive integer): COM1, COM2 ... COMn
  4. Start a terminal emulation program (such as PuTTY on Windows or minicom on Linux).
  5. In the port configuration section of the terminal emulation program select the port identified in previous step and set the following serial port parameters:
Baud Rate Data Bits Stop Bits Parity Flow Control
115200 8 1 none none

Connection and Login

This Yocto rootfs comes with an empty root password. No password is required for login.

To login into the Linux system, you may use a terminal emulator as described here, or connect through the network (ssh).

Admolition important.png The following examples assume root user.


To configure networking, edit /etc/network/interfaces, /etc/resolv.conf, /etc/hostname and /etc/hosts. For more information about Debian Linux network configuration read:

The majority of network setup can be done via the interfaces configuration file at /etc/network/interfaces.

Admolition note.png auto line is required for interfaces that have to be brought up at boot time.
  • Using DHCP to automatically configure the interface
auto eth0
allow-hotplug eth0
iface eth0 inet dhcp
  • Configuring the interface manually
auto eth0
    iface eth0 inet static


IOT-GATE-iMX8 / SBC-IOT-iMX8 features an optional 802.11ac WiFi interface, implemented with the Intel WiFi 6 AX200 module.

Simple Scanning

  • Sample WiFi scanning:
root@iot-gate-imx8:~# nmcli dev wifi list

The output will show the list of Access Points and Ad-Hoc cells in range. For more information about tuning WiFi interfaces refer to the “wireless-tools” man pages.

Connecting to an Access Point

The NetworkManager can be used to connect to an access point.
Access point connection command example.

Replace SSID with the wireless network name.
Replace PASSWORD with the wireless network password.
Replace Connection-Name with the new connection name.
root@iot-gate-imx8:~# nmcli radio wifi on
root@iot-gate-imx8:~# nmcli dev wifi con "SSID" password "PASSWORD" name "Connection-Name"

Creating an Access Point

The hostapd can be used to create an access point.

Access point creation example

Access point network mask is used.
Replace the mask with the desired network mask.

  • Install the required utilities
root@iot-gate-imx8:~# apt-get update
root@iot-gate-imx8:~# DEBIAN_FRONTEND=noninteractive apt-get install --yes hostapd iptables-persistent
  • Create the configuration file.
Replace SSID with the wireless network name.
Replace PASSWORD with the wireless network password.
root@iot-gate-imx8:~# cat > /etc/hostapd/hostapd.conf << EOF
  • Update the network interfaces configuration to force the WiFi interface to only run in the access point mode.
root@iot-gate-imx8:~# cat >> /etc/network/interfaces << EOF

auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet static
hostapd /etc/hostapd/hostapd.conf
  • Update the dnsmasq configuration file for DNS relay and DHCP server on our WiFi interface.
root@iot-gate-imx8:~# cat > /etc/NetworkManager/dnsmasq.d/dnsmasq.conf << EOF
  • Use iptables for NAT configuration
root@iot-gate-imx8:~# iptables -t nat -I POSTROUTING 1 -s ! -d  -j MASQUERADE
root@iot-gate-imx8:~# iptables -I FORWARD 1 -s -j ACCEPT
root@iot-gate-imx8:~# iptables -I FORWARD 1 -d -j ACCEPT
root@iot-gate-imx8:~# iptables-save > /etc/iptables/rules.v4
  • Prevent Network Manager from interfering with hostapd.
root@iot-gate-imx8:~# sed -i "/^plugins=/c\plugins=ifupdown,keyfile,ofono" /etc/NetworkManager/NetworkManager.conf
  • Restart the system.
root@iot-gate-imx8:~# reboot


IOT-GATE-iMX8 / SBC-IOT-iMX8 features an optional Bluetooth 5.1 BLE interface, implemented with the Intel WiFi 6 AX200 module.

Host Controller Interface (HCI) Initialization

  • HCI requires no user interaction for being configured. The driver gets loaded automatically unless this option has been disabled by putting a black list rule for this device.
  • HCI device configuration utility can be run to retrieve detailed information about the Bluetooth interfaces:
root@iot-gate-imx8:~# hciconfig hci0 -a
hci0:   Type: Primary  Bus: USB
        BD Address: 38:00:25:AF:FF:59  ACL MTU: 1021:4  SCO MTU: 96:6
        UP RUNNING
        RX bytes:751 acl:0 sco:0 events:52 errors:0
        TX bytes:2676 acl:0 sco:0 commands:52 errors:0
        Features: 0xbf 0xfe 0x0f 0xfe 0xdb 0xff 0x7b 0x87
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH SNIFF
        Link mode: SLAVE ACCEPT
        Name: 'iot-gate-imx8'
        Class: 0x000000
        Service Classes: Unspecified
        Device Class: Miscellaneous,
        HCI Version: 5.0 (0x9)  Revision: 0x100
        LMP Version: 5.0 (0x9)  Subversion: 0x100
        Manufacturer: Intel Corp. (2)
  • If the HCI device is not running, use the below command to enable the HCI device:
root@iot-gate-imx8:~#  hciconfig hci0 up
  • HCI Inquire remote devices.
root@iot-gate-imx8:~# hcitool scan
Scanning ...

Cellular Modem


WvDial is a Point-to-Point Protocol dialer that automatically detects modem, and can log into almost any Internet Service Provider without a complicated configuration. First, edit the wldial configuration file. Please use the a correct ISP APN instead of YOUR_ISP_APN stub.

Example configuration file /etc/wvdial.conf:

[Dialer cellular]

# Your modem device. Usually /dev/ttyUSB0 or /dev/ttyACM0
#Modem = /dev/ttyACM0
Modem = /dev/ttyUSB3

# Port speeds that're worth testing:
# 921600
# 460800
# 115200
#  57600
Baud = 115200

# If your SIM card has a PIN, comment this line, uncomment the next one, and
# change the PIN shown to your PIN.
Init = ATZ
# Init = ATZ+CPIN="0000"

# If you know your ISP's APN, specify it instead of YOUR_ISP_APN below.
# If you don't, you may be able to find out on the 'net, or from tech
# support.
# There's also an APN table at .
# If you can't find it, you might be able to dial out without setting an APN
# (especially from a mobile phone). Just comment this line and uncomment
# the next one.
#Init2 = AT+CGDCONT=1,"IP"

# Most services/devices dial with *99# . A few seem to require *99***1#
Phone = *99#

# These often suffice, but your ISP might require different details. They're
# often dummy details used for all users on the ISP, frequently the ISP's
# name, but some ISP's do require you to use a real username and password.
Username = dummy
Password = dummy

The following command can be used for dialing:

root@iot-gate-imx8:~# wvdial cellular &


Optional GPS interface is implemented with the cellular modem module.
The cgps client can be used to display the GPS information. The cgps client utility depends on the gpsd daemon (starts automatically).

  • Select the GPS interface:
root@iot-gate-imx8:~# sed -i "/^DEVICES=.*/c\DEVICES=\"/dev/ttyUSB1\"" /etc/default/gpsd
  • Enable the GPS with the following AT commands:
root@iot-gate-imx8:~# echo AT+CGPS=0,1 | socat - /dev/ttyUSB3,crnl
root@iot-gate-imx8:~# echo AT+CGPS=1,1 | socat - /dev/ttyUSB3,crnl
  • Start the cgps client to display GPS information.

The synchronization process might take a few minutes.

root@iot-gate-imx8:~# cgps
│    Time:       2020-05-04T14:13:30.000Z   ││PRN:   Elev:  Azim:  SNR:  Used: │
│    Latitude:    32.65985123 N             ││  71    29    123    22      Y   │
│    Longitude:   35.10027205 E             ││  85    27    047    22      Y   │
│    Altitude:   102.700 m                  ││                                 │
│    Speed:      0.00 kph                   ││                                 │
│    Heading:    128.7 deg (true)           ││                                 │
│    Climb:      6.00 m/min                 ││                                 │
│    Status:     3D FIX (53 secs)           ││                                 │
│    Longitude Err:   n/a                   ││                                 │
│    Latitude Err:    n/a                   ││                                 │
│    Altitude Err:    +/- 18 m              ││                                 │
│    Course Err:      n/a                   ││                                 │
│    Speed Err:       n/a                   ││                                 │
│    Time offset:     -3.682                ││                                 │
│    Grid Square:     KM72np                ││                                 │

Back panel RS485 / RS232 port

IOT-GATE-iMX8 / SBC-IOT-iMX8 features a RS485 / RS232 port. Only half-duplex mode is supported for the RS485.
The RS485 / RS232 interface is routed to rear panel terminal block connector see drawing.
RS485 / RS232 connector pin-out:

Pin Number RS485 Functionality RS232 Functionality
3 Ground Ground
6 Ground Ground

RS485 / RS232 Mode Selection

The UART mode is stored in the U-Boot environment.
U-Boot environment commands are used to set/get the UART mode.

Set RS485 mode

root@iot-gate-imx8:~# fw_setenv uart_mode rs485
root@iot-gate-imx8:~# reboot

Set RS232 mode

root@iot-gate-imx8:~# fw_setenv uart_mode rs232
root@iot-gate-imx8:~# reboot

Get UART mode

root@iot-gate-imx8:~# fw_printenv uart_mode

Note: The default port mode is RS485. The port operates in this mode in case of the variable uart_mode is assigned to an incorrect value or unset.


Serial terminal emulator application can be used to test the RS485 port.

  • Use the following command to start Minicom with the user space device of the RS485 (/dev/ttymxc0).
root@iot-gate-imx8:~# minicom -D /dev/ttymxc0
  • Follow the following steps to disable hardware flow control
    • Open the menu "Configure Minicom" with CTRL-a followed by the letter 'o'.
    • Select "Serial port setup"
    • Press the letter 'f'.
    • Press the letter 'h'.
    • Press the letter 'i'.
    • Press the Esc key twice.
  • The characters that are typed in the terminal are transmitted to the RS485 port.
  • The characters that are received from the RS485 port are displayed in the terminal.
  • Press CTRL-a followed by the letter 'x' to exit from Minicom


Modbus is a standard communication protocol and is a commonly available means of connecting industrial electronic devices. IOT-GATE-iMX8 RS485 ports can be used to implement the Modbus protocol.
It is recommended to use the modpoll - a command line based Modbus master simulator and test utility. Download and install the modpoll utility:

compulab@iot-gate-imx8:~$ wget -P /tmp
compulab@iot-gate-imx8:~$ sudo tar -xvf /tmp/modpoll.tgz -C /opt/

Modbus Communication Example

[XY-MD02] is a high-precision temperature and humidity sensor. XY-MD02 uses the RS485 hardware interface and protocol layer compatible with standard industrial Modbus RTU protocol.

  • Connect the XY-MD02 sensor to the IOT-GATE-iMX8, RS485 port:
    • Connect power lines to a DC power supply 5V-30V
    • Connect RS485 lines
|                  |                                   
|                  *--(+)---< <------------- 5V-30V    
|                  |                                   
|                  *--(-)---< <-------------- GND     ------------------------  
| XY-MD02 (RS485)  |                                  |                      |
|                  *--(A+)--< <---...---> >--(P7/2)---*-----                 |
|                  |                                  | P7 |  IOT-GATE-iMX8  |
|                  *--(B-)--< <---...---> >--(P7/1)---*-----                 |
|                  |                                  |                      |
--------------------                                  ------------------------ 
  • Read temperature once:
root@iot-gate-imx8:~# /opt/modpoll/arm-linux-gnueabihf/modpoll -b 9600 -p none -t 3 -c 1 -r 2 -1 /dev/ttymxc0
-- Polling slave...
[2]: 284
  • Read humidity once:
root@iot-gate-imx8:~# /opt/modpoll/arm-linux-gnueabihf/modpoll -b 9600 -p none -t 3 -c 1 -r 3 -1 /dev/ttymxc0

-- Polling slave...
[3]: 453

Industrial I/O add-on

IOT-GATE-iMX8 / SBC-IOT-iMX8 can be optionally assembled with the industrial I/O add-on board.
The industrial I/O add-on features up-to three separate I/O modules which allow to implement different combinations of isolated CAN, RS485, RS232, digital outputs and inputs.


CAN bus modules can be installed in I/O add-on slots A or B.
CAN bus modules support both CAN 2.0B and CAN FD standards. Maximum supported data rate is 8Mbps (in CAN FD mode).

CAN interface configuration

  • Configure the CAN interface bit-rate to 1 Mbits/sec:
root@iot-gate-imx8:~# ip link set can0 type can bitrate 1000000
  • Enable the CAN interface:
root@iot-gate-imx8:~# ip link set can0 up

Send/Receive packets

Use cansend and candump utilities to send and receive packets via CAN interface.

  • Send standard CAN frame (on the first device):
root@iot-gate-imx8:~# cansend can0 111#1122334455667788
  • Send extended CAN frame (on the first device):
root@iot-gate-imx8:~# cansend can0 11111111#1122334455667788
  • CAN frames (extended mode) generator, random payload, interval between two successive flames 50 msec:
root@iot-gate-imx8:~# cangen -g 50 -e -D r -v can0
can: raw protocol (rev 20170425)
  can0  03FF0983#D7.61.FF.03.C1.F7.C1.34
  can0  19C34D32#F7.5A.C2.73.AD.0E.3F.0B
  can0  0675E391#2B.2D.D3.49
  can0  13091C55#99.32.EC.
  can0  098D67CF#22.50.AB.48.AD.7F.F4.26
  can0  05263FEC#1B.4C.02.45.6E
  can0  12B30E20#
  can0  1F193DF9#C5
  can0  1EB0B18F#3E.3F.DA.57.C2.FE.73.58
  can0  1E5C64D9#6F.0D.B3.63.6A
  can0  1E1DE3F9#96.48.AC.79.4E.00.27.71
  can0  0E1A11B7#
  can0  05F8FD8B#33.F9.9B.1E.77.3D.1F
  can0  1E155FCD#E6.BA.F8.58.ED.6D.C8.10
  can0  1D91DF9E#5D.29.82.7B.97.1D.AB.5C
  can0  11FB3CDA#14.65.C3
  can0  091352C0#2C.ED
  • Dump all received data frames as well as error frames (on the second device):
root@iot-gate-imx8:~# candump any,0:0,#FFFFFFFF
  can0  111   [8]  11 22 33 44 55 66 77 88
  can0  11111111   [8]  11 22 33 44 55 66 77 88
  can0  03FF0983   [8]  D7 61 FF 03 C1 F7 C1 34
  can0  19C34D32   [8]  F7 5A C2 73 AD 0E 3F 0B
  can0  0675E391   [4]  2B 2D D3 49
  can0  13091C55   [8]  99 32 EC 77 27 81 49 0B
  can0  098D67CF   [8]  22 50 AB 48 AD 7F F4 26
  can0  05263FEC   [5]  1B 4C 02 45 6E
  can0  12B30E20   [0] 
  can0  1F193DF9   [1]  C5
  can0  1EB0B18F   [8]  3E 3F DA 57 C2 FE 73 58
  can0  1E5C64D9   [5]  6F 0D B3 63 6A
  can0  1E1DE3F9   [8]  96 48 AC 79 4E 00 27 71
  can0  0E1A11B7   [8]  75 81 70 7C 86 79 A7 77
  can0  05F8FD8B   [7]  33 F9 9B 1E 77 3D 1F
  can0  1E155FCD   [8]  E6 BA F8 58 ED 6D C8 10
  can0  1D91DF9E   [8]  5D 29 82 7B 97 1D AB 5C
  can0  11FB3CDA   [3]  14 65 C3
  can0  091352C0   [2]  2C ED


RS232 modules can be installed in I/O slots A or B.
The module implements RS232 interface without hardware flow control.
The interface device in Linux:

  • I/O module A: /dev/ttymxc1
  • I/O module B: /dev/ttymxc3


RS485 modules can be installed in I/O module A or B.
The module implements a half-duplex RS485 interface.
The interface device in Linux:

  • I/O module A: /dev/ttymxc1
  • I/O module B: /dev/ttymxc3

Digital I/O

The digital I/O module can be installed in industrial I/O add-on slot C. The module implements 4 digital input and 4 digital output signals.
Make sure that the digital I/O module is present in your device.

Admolition note.png in order to operate digital output or input signals, it is mandatory to connect external voltage source between pin 19 (24V_IN) and pin 20 (ISO_GND_C) of the industrial I/O add-on connector.

Read Digital Input

Use the following commands to read the value of the input signals.
Command format:

root@iot-gate-imx8:~# gpioget 2 0
Signal Name Pin number on the
I/O add-on connector
Read input
IN0 15 gpioget 2 0
IN2 16 gpioget 2 6
IN1 17 gpioget 2 1
IN3 18 gpioget 2 7

Set Digital Output

Use the following commands to set the value of the output signals.
Command format:

root@iot-gate-imx8:~# gpioset 2 8=1
Signal Name Pin number on the
I/O add-on connector
OUT0 11 gpioset 2 8=1 gpioset 2 8=0
OUT2 12 gpioset 5 9=1 gpioset 5 9=0
OUT1 13 gpioset 2 9=1 gpioset 2 9=0
OUT3 14 gpioset 5 10=1 gpioset 5 10=0

Analog Input

Analog 4–20mA input modules can be installed in I/O slots A or B.
The module detects the current level between 4 to 20 mA with 12-bit resolution.

Use the following command to load the kernel object:

root@iot-gate-imx8:~# modprobe max11108

Read the Detected Value

Use the following command to read the current detected value:

root@iot-gate-imx8:~# cat /sys/bus/iio/devices/iio:device0/in_current_raw

Values range from 0 to 4095 (12-bit resolution).
Values can be transposed to actual mA current in the loop by the formula: Current(mA)= Value * 0.00684

  • Current 4mA equals the digital value of 585
  • Current 20mA equals the digital value of 2,924


IOT-GATE-IMX8 / SBC-IOT-IMX8 watchdog function is implemented with the i.MX8M-Mini SoC watchdog.
By default, the watchdog is not configured.

$ systemctl show | grep RuntimeWatchdog

The value RuntimeWatchdogUSec=0 means watchdog logic is disabled: no watchdog device is opened, configured, or pinged

Watchdog configuration

  • Edit /etc/systemd/system.conf file to configure watchdog related parameters, in particular RuntimeWatchdogSec and ShutdownWatchdogSec.
RuntimeWatchdogSec - specifies the watchdog timeout for runtime services, meaning services that are actively running during normal system operation. The value is in seconds and should be set to a positive integer.
ShutdownWatchdogSec - specifies the watchdog timeout for the shutdown process, ensuring the system doesn't hang indefinitely during the shutdown. The value is in seconds and should be set to a positive integer.
  • Reboot the device
  • Verify watchdog configuration
$ systemctl show | grep RuntimeWatchdog

Watchdog testing

  • Run the following command to simulate kernel panic:
# echo "c" > /proc/sysrq-trigger
  • As a result, the watchdog is not fed and the system reboots after 10 sec.


IOT-GATE-IMX8 / SBC-IOT-IMX8 RTC is implemented with the AM1805 real-time clock (RTC) chip.
The backup battery keeps the RTC running to maintain clock and time information whenever the main power supply is not present.

Accessing and setting the RTC

  • To access the RTC time and date run:
$ sudo hwclock -r
2022-08-04 12:38:10.577874+00:00
  • To set the date and write it into the RTC do the following:
$ sudo date -s "31 Dec 2021 10:00:00"
Fri Dec 31 10:00:00 IST 2021
$ sudo hwclock -w
$ sudo hwclock -r
2021-12-31 10:00:08.317403+02:00


Use the following commands to set the LED state:

  • Off
root@iot-gate-imx8:~# gpioset 2 25=0; gpioset 2 19=0
  • Green
root@iot-gate-imx8:~# gpioset 2 25=1; gpioset 2 19=0
  • Yellow
root@iot-gate-imx8:~# gpioset 2 25=0; gpioset 2 19=1
  • Orange
root@iot-gate-imx8:~# gpioset 2 25=1; gpioset 2 19=1

See also