TI WiFi Kernel Module Example
- Warning
- The TIWiFi module example is here for example purposes only, the driver is currently bundled with Linux on supported targets. If you want to try this example you must first remove the TIWiFi driver from Linux and rebuild your Linux Distribution.
The TI WiFi module provides an example of a complicated install and remove script for multiple modules as well as dependencies on multiple kernel modules.
The TI WiFi driver is comprised of 3 kernel modules:
- wlcore: needs install and remove scripts
- wlcore_sdio
- wp18xx: needs install and remove scripts
The load sequence for the modules is (the unload sequence is done in reverse):
1. wlcore 2. wlcore_sdio 3. wl18xx
All three modules must be called in your systems .sdef file:
{
$LEGATO_ROOT/drivers/wl18xx/wl18xx.mdef
$LEGATO_ROOT/drivers/wlcore/wlcore.mdef
$LEGATO_ROOT/drivers/wlcore_sdio/wlcore_sdio.mdef
}
The wlcore kernel module contains multiple source files as well as 2 binary files. These must be defined in the wlcore.mdef as follows:
//-------------------------------------------------------------------------------------------------
// wlcore.mdef
//
// Copyright (C) Sierra Wireless Inc.
//-------------------------------------------------------------------------------------------------
sources:
{
acx.c
ps.c
tx.c
cmd.c
debugfs.c
event.c
io.c
main.c
scan.c
boot.c
init.c
rx.c
sysfs.c
vendor_cmd.c
}
bundles:
{
file:
{
$CURDIR/bin/wl18xx-conf.bin /bin/wl18xx-conf.bin
$CURDIR/bin/wl18xx-fw-4.bin /bin/wl18xx-fw-4.bin
}
}
scripts:
{
install: $CURDIR/scripts_wlcore/install.sh
remove: $CURDIR/scripts_wlcore/remove.sh
}
To install the wlcore kernel module we need to use an install and remove script as we need to:
- point the kernel to where the binaries will be available on the target
- enable the GPIO pins
- resolve the module dependencies
- install modules already included in the Linux distribution (msm_sdcc, cfg80211, mac80211)
- install wlcore
Install Script:
#!/bin/sh
# Copyright (C) Sierra Wireless Inc.
#
# TI wireless wl18xx specific applications start or stop here
# TI WIFI IoT board is managed by SDIO/MMC bus. Some signals need to be set
# and managed before the SDIO/MMC module is inserted.
# TI WIFI IoT conflicts with others devices using the SDIO/MMC bus
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin
KO_PATH=$1
echo -n /legato/systems/current/modules/files/wlcore/bin > /sys/module/firmware_class/parameters/path
# Add mdev rule for crda
grep crda /etc/mdev.conf > /dev/null
if [ $? -ne 0 ]; then
(mount | grep -q " on /etc type ") || \
(cp /etc/mdev.conf /tmp; mount -o bind /tmp/mdev.conf /etc/mdev.conf)
echo "\$COUNTRY=.. root:root 0660 */sbin/crda" >> /etc/mdev.conf
fi
lsmod | grep wlcore >/dev/null
if [ $? -ne 0 ]; then
# Check if MMC/SDIO module is inserted. Because WIFI use SDIO/MMC bus
# we need to remove the SDIO/MMC module
lsmod | grep msm_sdcc >/dev/null
if [ $? -eq 0 ]; then
grep -q mmcblk /proc/mounts
if [ $? -ne 0 ]; then
rmmod msm_sdcc
else
false
fi
if [ $? -ne 0 ]; then
# Unable to remove. May be others devices use SDIO/MMC bus
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo "Unable to remove the SDIO/MMC module... May be in use ?"
echo "Please, free all SDIO/MMC devices before using TI WIFI."
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
exit 127
fi
fi
# Enable all GPIOs on all EXPANDERs
gpioexp 1 1 enable >/dev/null || exit 127
### mangOH green has 3 expanders
# Set IOTO_RESET, GPIO#4/EXPANDER#3 - IOT0 Reset signal is disabled
gpioexp 3 4 output normal high >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "mangOH red board"
# Set IOT0_GPIO2 = 1 (WP GPIO13)
[ -d /sys/class/gpio/gpio13 ] || echo 13 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio13/direction
echo 1 >/sys/class/gpio/gpio13/value
# Set IOT0_RESET = 1 (WP GPIO2)
[ -d /sys/class/gpio/gpio2 ] || echo 2 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio2/direction
echo 1 >/sys/class/gpio/gpio2/value
# Clear SDIO_SEL, GPIO#9/EXPANDER#1 - Select the SDIO
gpioexp 1 9 output normal low >/dev/null || exit 127
else
echo "mangOH green board"
# Set IOT0_GPIO2 = 1 (WP GPIO33)
[ -d /sys/class/gpio/gpio33 ] || echo 33 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio33/direction
echo 1 >/sys/class/gpio/gpio33/value
# Clear SDIO_SEL, GPIO#13/EXPANDER#1 - Select the SDIO
gpioexp 1 13 output normal low >/dev/null || exit 127
fi
# Set IOT0_GPIO4 = 1 (WP GPIO8)
[ -d /sys/class/gpio/gpio8 ] || echo 8 >/sys/class/gpio/export
echo out >/sys/class/gpio/gpio8/direction
echo 1 >/sys/class/gpio/gpio8/value
modprobe msm_sdcc || exit 127
modprobe cfg80211 || exit 127
modprobe mac80211 || exit 127
insmod $KO_PATH || exit 127
fi
The removal script must:
- remove the dependencies on the modules in the Linux distribution (msm_sdcc, cfg80211, mac80211)
- disable the GPIO pins
- remove the wlcore module
Remove Script:
#!/bin/sh
# Copyright (C) Sierra Wireless Inc.
#
# TI wireless wl18xx specific applications start or stop here
# TI WIFI IoT board is managed by SDIO/MMC bus. Some signals need to be set
# and managed before the SDIO/MMC module is inserted.
# TI WIFI IoT conflicts with others devices using the SDIO/MMC bus
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin
KO_PATH=$1
lsmod | grep wlcore >/dev/null
if [ $? -eq 0 ]; then
rmmod $KO_PATH || exit 127
rmmod mac80211 || exit 127
rmmod cfg80211 || exit 127
if `lsmod | grep '^compat '`; then
rmmod compat || exit 127
fi
rmmod msm-sdcc || exit 127
# Reset IOT0_GPIO4 = 0 (WP GPIO8)
echo 0 >/sys/class/gpio/gpio8/value
# Clear IOTO_RESET, GPIO#4/EXPANDER#3 - IOT0 Reset signal is enabled
gpioexp 3 4 output normal low >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "mangOH red board"
# Set IOT0_RESET = 1 (WP GPIO2)
echo 0 >/sys/class/gpio/gpio2/value
# Clear SDIO_SEL, GPIO#9/EXPANDER#1 - Deselect the SDIO
gpioexp 1 9 output normal high >/dev/null || exit 127
# Reset IOT0_GPIO2 = 0 (WP GPIO13)
echo 0 >/sys/class/gpio/gpio13/value
else
echo "mangOH green board"
# Set SDIO_SEL, GPIO#13/EXPANDER#1 - Deselect the SDIO
gpioexp 1 13 output normal high >/dev/null || exit 127
# Reset IOT0_GPIO2 = 0 (WP GPIO33)
echo 0 >/sys/class/gpio/gpio33/value
fi
# Insert MMC/SDIO module
modprobe msm_sdcc || exit 127
fi
The wlcore_sdio module has only one source file sdio.c and has dependency on wlcore. The module dependency is indicated in the mdef with requires: kernelModules: section.
sources:
{
sdio.c
}
requires:
{
kernelModules:
{
$LEGATO_ROOT/drivers/wlcore/wlcore.mdef
}
}
The wp18xx module is made up of multiple source files and also needs to use an install and removal script to correctly install the kernel module.
wl18xx.mdef:
sources:
{
acx.c
cmd.c
debugfs.c
event.c
io.c
main.c
scan.c
tx.c
}
requires:
{
kernelModules:
{
$LEGATO_ROOT/drivers/wlcore_sdio/wlcore_sdio.mdef
}
}
scripts:
{
install: $CURDIR/scripts_wl18xx/install.sh
remove: $CURDIR/scripts_wl18xx/remove.sh
}
The install script for the wp18xx module needs to install the module and enable the wlan0 interface:
#!/bin/sh
# Copyright (C) Sierra Wireless Inc.
#
# TI wireless wl18xx specific applications start or stop here
# TI WIFI IoT board is managed by SDIO/MMC bus. Some signals need to be set
# and managed before the SDIO/MMC module is inserted.
# TI WIFI IoT conflicts with others devices using the SDIO/MMC bus
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin
KO_PATH=$1
insmod $KO_PATH
sleep 62
ifconfig -a | grep wlan0 >/dev/null
if [ $? -ne 0 ] ; then
echo "Failed to start TI wifi"; exit 126
fi
ifconfig wlan0 up >/dev/null
if [ $? -ne 0 ] ; then
echo "Failed to start TI wifi"; exit 127
fi
And the removal script needs to disable the wlan0 interface and remove the module:
#!/bin/sh
# Copyright (C) Sierra Wireless Inc.
#
# TI wireless wl18xx specific applications start or stop here
# TI WIFI IoT board is managed by SDIO/MMC bus. Some signals need to be set
# and managed before the SDIO/MMC module is inserted.
# TI WIFI IoT conflicts with others devices using the SDIO/MMC bus
export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin
KO_PATH=$1
ifconfig | grep wlan0 >/dev/null
if [ $? -eq 0 ]; then
ifconfig wlan0 down
fi
lsmod | grep wlcore >/dev/null
if [ $? -eq 0 ]; then
rmmod $KO_PATH
fi
You should now be able to build your system including the kernel module and update your target with the new system including the TI WiFi modules.
Once the new system is installed on your target you should be able to find the TI WiFi files in the following location:
/legato/systems/current/modules
├── files
│ ├── wl18xx
│ │ └── scripts
│ │ ├── install.sh
│ │ └── remove.sh
│ └── wlcore
│ ├── bin
│ │ ├── wl18xx-conf.bin
│ │ └── wl18xx-fw-4.bin
│ └── scripts
│ ├── install.sh
│ └── remove.sh
├── wl18xx.ko
├── wlcore.ko
└── wlcore_sdio.ko
