Skip to content

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 to do the following steps to assemble the system.

  1. Mount the PAN9028 M.2 device 3 onto the M.2 to Raspberry Pi Adapter 2 as explained in First Steps.

  2. Mount the M.2 to Raspberry Pi Adapter 2 onto the 40-pin expansion header of the STM32MP157 Discovery Kit 1.

  3. 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:

  1. Setting up the development system

  2. Installing the necessary tools

  3. Downloading an image binary

  4. Populating the SD card of the STM32MP157 Discovery Kit

  5. 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.

  1. 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:

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 and dtc
  • nano package that provides the nano text editor
  • git package that provides the git version control system
  1. Update the package index on the host system.

    apt update
    
  2. 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.

  1. 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.

  2. 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
    
  3. 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
    
  4. 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.

  1. 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
    
  2. 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:

  1. Installing some extra packages

  2. Downloading the SDK

  3. Running the installation script

  4. 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:

  1. Downloading the BSP that contains the Linux kernel source code

  2. Preparing the Linux kernel source code

You don't have to build the Linux kernel, however, you need to prepare the kernel.

  1. 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 to make sure that the development environment is initialized.

  1. 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.

  1. Navigate to the base of your working environment.

    cd ~/STM32MPU_workspace/STM32MPU-Ecosystem-v5.1.0/
    
  2. 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/
    
  3. 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
    [...]
    
  4. 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
    
  5. 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
    
  6. 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.

  1. Create the destination directory for the firmware and configuration files.

    mkdir -p /lib/firmware/nxp/
    
  2. 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
    
  3. Copy the firmware to the global firmware directory.

    cd ~/imx-firmware
    cp nxp/FwImage_8987/sdiouart8987_combo_v0.bin /lib/firmware/nxp/
    
  4. 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.

  1. Make sure that Linux kernel module dependency database is up-to-date.

    depmod -a
    
  2. Load the modules into the Linux kernel.

    modprobe mlan
    modprobe moal mod_para=nxp/wifi_mod_para.conf 
    
  3. 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.

  1. Use the ip command to verify that the mlan0 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.

  1. Bring up the Wi-Fi interface.

    ip link set dev mlan0 up
    
  2. 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.

  1. Initialize the Bluetooth interface.

    hciattach /dev/ttySTM1 any 3000000 flow
    

    The output should look something like this:

    Device setup complete
    

  2. Bring up the Bluetooth interface.

    hciconfig hci0 up
    

Usage๐Ÿ”—

You have to follow these steps to check if Bluetooth is functional.

  1. 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:

  1. Apply GND to GPIO 5 to signal power down to the module.

    gpioset -c 6 2=0
    
  2. Apply VCC to GPIO 5 to enable the module again.

    gpioset -c 6 2=1