How to timely turn on the WiFi interface on the CM3-HOME

The CM3-HOME is equipped with the well known Acmesystems USB Wi-Fi (IEEE 802.11b). However such interface is not powered on by default. A suitable systemd script is proposed here.

This is the CM3-HOME schematic for the part concerning the WiFi interface:

as can be easily seen, the WiFi interface (GWF-3M-08) is powered only if the Q17 is turned on, bringing the WiFi module GND pin to ground.

In order to do that, the WiFi_ON signal has to be put at high logical level; the script below is useful just for that purpose:

/bin/echo 37  > /sys/class/gpio/export ; 
/bin/echo out > /sys/class/gpio/gpio37/direction ; 
/bin/echo 1   > /sys/class/gpio/gpio37/value

Now, we need to configure the system to execute that three lines on each boot.

The first idea in order to activate at boot the WiFi could be to use /etc/rc.local where, in the past, all the applications that implemented the system functionalities were started.

So, rc.local could be setup as the following:

cat /etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/bin/echo 37  > /sys/class/gpio/export ; 
/bin/echo out > /sys/class/gpio/gpio37/direction ; 
/bin/echo 1   > /sys/class/gpio/gpio37/value

exit 0

In this example a three rows script is executed that create access to GPIO pin #37 and outputs on it a logical one, that, turning on the fet Q17, brings the WiFI_Ground to system ground, finally turning on the WiFi interface. However it happens that, as the rc.local is the last script executed at boot, the networking services (started well before) are finding no WiFi interface at all as it is still turned off.

What we need is a way to force the systemd to execute our script before the network services are started avoiding to incur into the previously described pitfall, that network services are failing just because the WiFi physical interface has not yet powered.

With systemd a different and more integrated approach is feasible. Instead of adding something to a shell script, a proper service file can be created and added to the systemd.

Let's create a service file for the power on script. Create as root a file called poweronwifi.service in /lib/systemd/system directory.

sudo nano /lib/systemd/system/poweronwifi.service

then save inside it the following lines:

[Unit]
Description=Poweron WiFi
Before=network-pre.target
Wants=network-pre.target

[Service]
ExecStart=/bin/bash -c '/bin/echo 37 > /sys/class/gpio/export ; /bin/echo out > /sys/class/gpio/gpio37/direction ; /bin/echo 1 > /sys/class/gpio/gpio37/value'

[Install]
WantedBy=multi-user.target

Next systemd has to be configured, enabling the service so that the next reboot it will be started automatically. First off, though, the systemd itself has to be reloaded in order to detect the new service definition:

sudo systemctl daemon-reload

Next, the new service is enabled

sudo systemctl enable poweronwifi.service

Check if it is really enabled:

sudo systemctl list-unit-files | grep enabled

Of course, it can be started manually just now:

sudo systemctl start poweronwifi.service

How to see full log from systemctl status service ?

Use the journalctl command, as in:

journalctl -u poweronwifi.service

nothing should be there as far the procedure is successfully executed.

Links

Andrea Montefusco
Currently employed as network architect, always Internet working man, real C/C++ programmer in the past, network and Unix system engineer as needed, HAM Radio enthusiast (former IW0RDI, now IW0HDV), aeromodeller (a person who builds and flies model airplanes) since 1976 (ex FAI10655).
http://www.montefusco.com - https://github.com/amontefusco - https://github.com/IW0HDV - andrew@montefusco.com