STM32MP157 Discovery Kit๐
Introduction๐
The PAN9028 requires a fairly powerful host processor that executes the low-level Wi-Fiยฎ and Bluetoothยฎ drivers as well as some high-level Wi-Fi application software and a Bluetooth stack.
As an evaluation platform you can use the STM32MP157 Discovery Kit.
It does not have an on-board M.2 Key E slot for the PAN9028 M.2 device, but an additional SDIO interface and other peripherals can be enabled on the 40-pin expansion header.
To bring the PAN9028 M.2 device and the STM32MP157 Discovery Kit together, you can use the M.2 to Raspberry Pi Adapter.
This guide shows you how to evaluate a Panasonic PAN9028 M.2 device on a STM32MP157 Discovery Kit with the help of the M.2 to Raspberry Pi Adapter. But you have to be aware that only the basic bring-up is explained, not any advanced usage.
Hardware Modifications๐
You have to do some hardware modification to the PAN9028 M.2 device before you can use it together with the STM32MP157 Discovery Kit.
The following requirements must be met:
- You have a PAN9028 M.2 device.
SDIO and IO Reference Voltages๐
The interfaces on the 40-pin expansion header of the STM32MP157 Discovery Kit operate with 3.3 V signal level, while the PAN9028 M.2 device operates with 1.8 V instead.
Because of this you have to modify the PAN9028 M.2 device as explained in Hardware Modifications in order to change the SDIO and IO reference voltages to 3.3 V.
Note
A signal level of 3.3 V limits the SDIO clock speed to 50 MHz, which also limits the maximum achievable data rate severely.
For further information please refer to the module product specification at
Host System Assembly๐
The following requirements must be met:
-
You have a STM32MP157 Discovery Kit (host system).
-
You have a M.2 to Raspberry Pi Adapter.
-
You have a modified PAN9028 M.2 device.
You have to do the following steps to assemble the system.
-
Mount the PAN9028 M.2 device 3 onto the M.2 to Raspberry Pi Adapter 2 as explained in First Steps.
-
Mount the M.2 to Raspberry Pi Adapter 2 onto the 40-pin expansion header of the STM32MP157 Discovery Kit 1.
-
Power the M.2 to Raspberry Pi Adapter through the USB-C connector 4, otherwise the adapter is non-functional.
Host System Setup๐
Note
Please note that you need an myST account to be able to access any of the mentioned documents.
Initial Bring-Up๐
You have to follow the Let's start guide in the STM32 MPU Ecosystem User Guide to bring up your STM32MP157 Discovery Kit.
This includes the following steps:
-
Setting up the development system
-
Installing the necessary tools
-
Downloading an image binary
-
Populating the SD card of the STM32MP157 Discovery Kit
-
Booting the STM32MP157 Discovery Kit
This guide is based on the following versions:
en.flash-stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26.tar.gz
Network Connectivity๐
You have to make sure that the STM32MP157 Discovery Kit is on the same network as your development system, because you need to interact with your host system and maybe transfer files to it in later steps.
You have to check and remember the IP address of your host system for later use.
-
On your host system, retrieve the current network configuration for the on-board Ethernet port in a Terminal window.
ip addr show eth0
The output should look something like this:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.187.100/24 brd 192.168.187.255 scope global dynamic noprefixroute eth0 valid_lft 86089sec preferred_lft 86089sec inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link noprefixroute valid_lft forever preferred_lft forever
The IP address of your host system is 192.168.187.100
Host System IP Address
For this host system the IP address is 192.168.187.100, but it may be different for yours.
In any case you have to use this IP address to communicate with your host system for the remainder of this document.
You have to follow Check the host computer Internet access to make sure that your host system has access to the Internet.
Host System Remote Access
If you do not have any application for the SSH protocol yet, you can try the OpenSSH protocol suite.
It also includes tools for remote file operations like ssh
and scp
.
At the end of this process you should have a fully working system you can remotely log into.
Host System Configuration๐
The following requirements must be met:
-
You have brought up your STM32MP157 Discovery Kit as explained in Host System Setup.
-
You can access your STM32MP157 Discovery Kit remotely.
Install Additional Packages๐
You have to install the following packages on your host system for later use:
- device tree compiler package that provides tools for device tree handling, like
fdtput
anddtc
- nano package that provides the
nano
text editor - git package that provides the
git
version control system
-
Update the package index on the host system.
apt update
-
Install the additional packages.
apt install dtc nano git
Enable Peripheral Interfaces๐
You have to enable additional peripheral interfaces on the 40-pin expansion header.
-
Enable and configure an additional SDIO interface.
fdtput -d /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/mmc@48004000 status fdtput -t s /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/mmc@48004000 status okay fdtput /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/mmc@48004000 no-1-8-v fdtput /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/mmc@48004000 broken-cd
Non-recommended Setting
Setting the option
broken-cd
(for broken card detect) is not recommended and you should never use it in a product.It makes the Linux kernel poll the interface regularly and can disturb the operation of the device if it happens at the wrong time.
However, in this setup, it makes the reset button on the M.2 to Raspberry Pi Adapter work and helps you during the evaluation.
-
Enable an additional UART interface.
fdtput -d /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/serial@4000f000 status fdtput -t s /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/serial@4000f000 status okay
-
Enable an additional I2C interface.
fdtput -d /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/i2c@40015000 status fdtput -t s /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/i2c@40015000 status okay
-
Enable an additional SPI interface.
fdtput -d /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/spi@44009000 status fdtput -t s /boot/stm32mp157d-dk1.dtb /soc/etzpc@5c007000/spi@44009000 status okay
Rename Conflicting Drivers๐
The Linux kernel of the STM32 MPU OpenSTLinux Distribution comes with pre-compiled drivers that conflict with the official device drivers that you install in a later step.
One way to resolve this conflict is to rename the existing drivers.
-
Rename the conflicting Wi-Fi drivers.
cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/marvell/mwifiex sudo mv mwifiex.ko mwifiex.ko.bak sudo mv mwifiex_sdio.ko mwifiex_sdio.ko.bak
-
Rename the conflicting Bluetooth drivers.
cd /lib/modules/$(uname -r)/kernel/drivers/bluetooth sudo mv btmrvl_sdio.ko btmrvl_sdio.ko.bak sudo mv btmrvl.ko btmrvl.ko.bak
System Reboot
You have to reboot the host system for these changes to take effect.
reboot
Development System Setup๐
Note
This guide assumes that you follow the recommendations for the directory structure as explained in Example of directory structure for Packages.
Setup Development Environment๐
You have to setup the development environment on your development system and follow the Develop on Armยฎ Cortexยฎ-A7 guide.
This includes the following steps:
-
Installing some extra packages
-
Downloading the SDK
-
Running the installation script
-
Starting the SDK
Note
You can skip the step to create a simple application and you don't need to rebuild the Linux kernel.
Setup Linux Kernel Build Environment๐
You have to setup the build environment for the Linux kernel and follow the Modify, rebuild and reload the Linuxยฎ kernel guide.
This includes the following steps:
-
Downloading the BSP that contains the Linux kernel source code
-
Preparing the Linux kernel source code
You don't have to build the Linux kernel, however, you need to prepare the kernel.
-
In the Linux kernel directory, execute the following statement to prepare the kernel.
make O=${OUTPUT_BUILD_DIR} prepare
This guide is based on the following versions:
en.sdk-x86_64-stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26.tar.gz
en.sources-stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26.tar.gz
Host System Software Installation๐
The following requirements must be met:
- You have brought up your development system as explained in Development System Setup.
You have to make sure that the development environment is initialized.
-
Execute the initialization script of the SDK.
. ~/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/Developer-Package/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
Compile the Device Driver๐
You have to download the PAN9028 module device driver, compile it and transfer it to the host system.
-
Navigate to the base of your working environment.
cd ~/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/
-
Clone the driver repository from NXP's GitHub space.
git clone https://github.com/nxp-imx/mwifiex.git cd mwifiex/ git checkout lf-6.6.23_2.0.0 cd mxm_wifiex/wlan_src/
-
You have to disable support for some unused devices inside the driver.
Use the
nano
editor to open the file and change it as described.nano Makefile
Makefile 32 33 34 35 36 37 38 39 40 41 42 43 44 45
# Multi-chipsets [...] CONFIG_SD8997=y CONFIG_USB8997=n CONFIG_PCIE8997=n CONFIG_SD8987=y CONFIG_SD9097=n [...] CONFIG_SD9098=y CONFIG_USB9098=n CONFIG_PCIE9098=n CONFIG_SDIW624=n CONFIG_SDAW693=n [...]
-
You have to download and apply a custom patch from the Development Hub to fix an incorrect version check in the driver.
wget -O ./nxp-fix-version-check.patch \ https://pideu.panasonic.de/development-hub/pan9019/downloads/nxp-fix-version-check.patch patch -p1 < ./nxp-fix-version-check.patch
-
Compile the device driver.
make O="${OUTPUT_BUILD_DIR}" KERNELDIR=~/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/Developer-Package/stm32mp1-openstlinux-6.1-yocto-mickledore-mpu-v24.06.26/sources/arm-ostl-linux-gnueabi/linux-stm32mp-6.1.82-stm32mp-r2-r0/linux-6.1.82 build
-
Copy the device driver to your host system.
scp mlan.ko moal.ko root@192.168.187.100:/lib/modules/6.1.82/extra/
Install the Firmware๐
You have to download and install the firmware for the PAN9028 module.
-
Create the destination directory for the firmware and configuration files.
mkdir -p /lib/firmware/nxp/
-
Clone the firmware repository from NXP's GitHub space.
cd ~ git clone https://github.com/nxp-imx/imx-firmware.git cd imx-firmware/ git checkout lf-6.6.23_2.0.0
-
Copy the firmware to the global firmware directory.
cd ~/imx-firmware cp nxp/FwImage_8987/sdiouart8987_combo_v0.bin /lib/firmware/nxp/
-
Copy the configuration file
wifi_mod_para.conf
to the global firmware directory.cd ~/imx-firmware cp nxp/wifi_mod_para.conf /lib/firmware/nxp/
Wi-Fi๐
Bring Up๐
The newly compiled device drivers are not loaded into the Linux kernel automatically, you have to manually load them into the kernel prior to operation.
-
Make sure that Linux kernel module dependency database is up-to-date.
depmod -a
-
Load the modules into the Linux kernel.
modprobe mlan modprobe moal mod_para=nxp/wifi_mod_para.conf
-
Check the Linux kernel log.
dmesg
The output should look something like this:
[ 541.095842] fw_name=nxp/sdiouart8987_combo_v0.bin [ 541.100571] SDIO: max_segs=128 max_seg_size=65536 [ 541.105295] rx_work=1 cpu_num=4 [ 541.108445] Enable moal_recv_amsdu_packet [ 541.108451] Attach mlan adapter operations.card_type is 0x105. [ 541.108767] wlan: Enable TX SG mode [ 541.108770] wlan: Enable RX SG mode [ 541.109583] Request firmware: nxp/sdiouart8987_combo_v0.bin [ 541.383340] Wlan: FW download over, firmwarelen=625084 downloaded 615980 [ 542.321457] WLAN FW is active [ 542.324435] on_time is 541839042441 [ 543.398906] VDLL image: len=9104 [ 543.399654] fw_cap_info=0x181d6f03, dev_cap_mask=0xffffffff [ 543.399661] max_p2p_conn = 8, max_sta_conn = 8 [ 543.399896] SDIO rx aggr: 1 block_size=512 [ 543.399907] wlan: Enable RX SG mode [ 543.399909] mpa_rx_buf_size=65280 [...] [ 543.408951] call regulatory_set_wiphy_regd US [ 543.408976] ForceRegionRule is set in the on-chip OTP memory [ 543.413376] 11D: Error setting domain info in FW [...] [ 543.414984] Register NXP 802.11 Adapter mlan0 [ 543.422141] Register NXP 802.11 Adapter uap0 [...] [ 543.437884] Register NXP 802.11 Adapter wfd0 [ 543.443263] wlan: version = SD8987----16.92.21.p119.3-MM6X16437.p21-GPL-(FP92) [ 543.451664] Set REG 0x80002328: 0x13d57 slew_rate=3 [ 543.468394] uap0: Skip change virtual intf type on uap: from 3 to 2
Note
If you can't see that the PAN9028 M.2 device was detected, press the reset button 6 button of the M.2 to Raspberry Pi Adapter briefly once.
This resets the PAN9028 module, but also triggers the detection in the Linux kernel again.
You can now check the functionality of the driver.
-
Use the
ip
command to verify that themlan0
network interface for the PAN9028 is now available.ip addr show mlan0
The output should look something like this:
3: mlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000 link/ether 34:32:e6:xx:xx:xx brd ff:ff:ff:ff:ff:ff
Usage๐
You have to follow these steps to check if Wi-Fi is functional.
-
Bring up the Wi-Fi interface.
ip link set dev mlan0 up
-
Execute a Wi-Fi scan.
iw dev mlan0 scan
You can see that nearby Wi-Fi networks are discovered successfully.
Bluetooth๐
The following requirements must be met:
- You have successfully brought up the Wi-Fi portion as explained in Wi-Fi.
Bring Up๐
You have to follow these steps to bring up the Bluetooth interface.
-
Initialize the Bluetooth interface.
hciattach /dev/ttySTM1 any 3000000 flow
The output should look something like this:
Device setup complete
-
Bring up the Bluetooth interface.
hciconfig hci0 up
Usage๐
You have to follow these steps to check if Bluetooth is functional.
-
Execute a Bluetooth scan.
bluetoothctl scan on
You can see that nearby Bluetooth devices that are advertising are discovered successfully.
Appendix๐
The PAN9028 module has a couple of special function pins that are routed to the 40-pin expansion header as follows.
Chip / Line | STM32MP157 | Pin Header | M.2 Specification | PAN9028 | Description |
---|---|---|---|---|---|
6 / 2 | PG2 | GPIO 5 | W_DISABLE1# | PDn | Power Down |
7 / 11 | PH11 | GPIO 6 | W_DISABLE#2 | IND_RST_BT | Bluetooth reset |
0 / 8 | PA8 | GPIO 4 | SDIO_RST# | IND_RST_WL | Wi-Fi reset |
You can manually control the special function pins using the gpioset
tool. For example:
-
Apply GND to GPIO 5 to signal power down to the module.
gpioset -c 6 2=0
-
Apply VCC to GPIO 5 to enable the module again.
gpioset -c 6 2=1