Request for Raspberry Pi 4 troubleshooting/Setup Guide for MM6108 HaLow Module (APIM2 Adapter, UART/SDIO)

The MM6108 HaLow module on a Raspberry Pi 4 using the APIM2 adapter board. My goal is to start with UART or SDIO bring-up, since the APIM2 M.2 E-Key slot does not support SPI, only SDIO and UART.

Here is the context of my setup:

Hardware:

  • Raspberry Pi 4B

  • APIM2 adapter board

  • MM6108 HaLow module (AHMB6108S / AHM26108D)

Bus support:

  • mikroBUS socket: SPI, I2C, UART

  • M.2 E-Key slot: SDIO, UART

Steps attempted so far:

  1. Compiled morse and dot11ah drivers from your repository.

  2. Tried loading modules:

sudo insmod /home/bot/morse_driver/dot11ah/dot11ah.ko   # succeeds
sudo insmod /home/bot/morse_driver/morse.ko country=AU    # fails with unknown symbols

  1. lsmod shows modules partially loaded:
morse
crc7
mac80211
libarc4
dot11ah
cfg80211

  1. dmesg shows many unresolved symbols from mac80211:
morse: Unknown symbol ieee80211_txq_schedule_start (err -2)
morse: Unknown symbol ieee80211_register_hw (err -2)
...
morse micro driver registration. Version 0-rel_1_15_3_2025_Apr_16

  1. Checked UART devices:
ls -l /dev/serial*
serial0 -> ttyS0
serial1 -> ttyAMA0

I am currently stuck at bringing up the module, due to driver unresolved symbols when loading the morse module.

bot@bot:~$ lsmod | grep -E "morse|mac80211|cfg80211|dot11ah"
morse                 417792  0
crc7                   16384  1 morse
mac80211             1232896  1 morse
libarc4                16384  1 mac80211
dot11ah               106496  1 morse
cfg80211              970752  4 dot11ah,brcmfmac,mac80211,morse
bot@bot:~$ grep ieee80211 /proc/kallsyms | grep -E "txq_schedule_start|register_hw|alloc_hw_nm" | head -20
0000000000000000 r __kstrtab_ieee80211_alloc_hw_nm	[mac80211]
0000000000000000 r __kstrtabns_ieee80211_alloc_hw_nm	[mac80211]
0000000000000000 r __ksymtab_ieee80211_alloc_hw_nm	[mac80211]
0000000000000000 r __kstrtab_ieee80211_register_hw	[mac80211]
0000000000000000 r __kstrtabns_ieee80211_register_hw	[mac80211]
0000000000000000 r __ksymtab_ieee80211_register_hw	[mac80211]
0000000000000000 r __kstrtab_ieee80211_unregister_hw	[mac80211]
0000000000000000 r __kstrtabns_ieee80211_unregister_hw	[mac80211]
0000000000000000 r __ksymtab_ieee80211_unregister_hw	[mac80211]
0000000000000000 r __kstrtab_ieee80211_txq_schedule_start	[mac80211]
0000000000000000 r __kstrtabns_ieee80211_txq_schedule_start	[mac80211]
0000000000000000 r __ksymtab_ieee80211_txq_schedule_start	[mac80211]
0000000000000000 T ieee80211_txq_schedule_start	[mac80211]
0000000000000000 T ieee80211_register_hw	[mac80211]
0000000000000000 T ieee80211_alloc_hw_nm	[mac80211]
0000000000000000 T ieee80211_unregister_hw	[mac80211]
bot@bot:~$ uname -r
5.15.0-1085-raspi
bot@bot:~$ ls -l /lib/modules/5.15.0-1085-raspi/build
lrwxrwxrwx 1 root root 40 Aug 20 03:45 /lib/modules/5.15.0-1085-raspi/build → /usr/src/linux-headers-5.15.0-1085-raspi
bot@bot:~$ dmesg | grep -i morse
dmesg | grep -i ah
dmesg: read kernel buffer failed: Operation not permitted
dmesg: read kernel buffer failed: Operation not permitted
bot@bot:~$ sudo dmesg | grep -i morse
[  611.389002] Morse Micro Dot11ah driver registration. Version 0-rel_1_15_3_2025_Apr_16
[  636.273214] morse: Unknown symbol ieee80211_queue_stopped (err -2)
[  636.273288] morse: Unknown symbol ieee80211_stop_tx_ba_session (err -2)
[  636.273400] morse: Unknown symbol ieee80211_start_tx_ba_cb_irqsafe (err -2)
[  636.273456] morse: Unknown symbol ieee80211_connection_loss (err -2)
[  636.273564] morse: Unknown symbol ieee80211_sched_scan_stopped (err -2)
[  636.273736] morse: Unknown symbol crc7_be_syndrome_table (err -2)
[  636.273863] morse: Unknown symbol ieee80211_free_hw (err -2)
[  636.273977] morse: Unknown symbol ieee80211_probereq_get (err -2)
[  636.274007] morse: Unknown symbol ieee80211_txq_schedule_start (err -2)
[  636.274061] morse: Unknown symbol ieee80211_iterate_stations_atomic (err -2)
[  636.274106] morse: Unknown symbol ieee80211_ap_probereq_get (err -2)
[  636.274145] morse: Unknown symbol ieee80211_start_tx_ba_session (err -2)
[  636.274176] morse: Unknown symbol ieee80211_beacon_loss (err -2)
[  636.274225] morse: Unknown symbol ieee80211_register_hw (err -2)
[  636.274274] morse: Unknown symbol ieee80211_restart_hw (err -2)
[  636.274316] morse: Unknown symbol ieee80211_sta_eosp (err -2)
[  636.274353] morse: Unknown symbol __ieee80211_get_radio_led_name (err -2)
[  636.274417] morse: Unknown symbol ieee80211_stop_rx_ba_session (err -2)
[  636.274449] morse: Unknown symbol ieee80211_wake_queue (err -2)
[  636.274524] morse: Unknown symbol __ieee80211_get_tx_led_name (err -2)
[  636.274576] morse: Unknown symbol ieee80211_get_buffered_bc (err -2)
[  636.274617] morse: Unknown symbol ieee80211_find_sta (err -2)
[  636.274813] morse: Unknown symbol __ieee80211_get_rx_led_name (err -2)
[  636.274884] morse: Unknown symbol ieee80211_stop_tx_ba_cb_irqsafe (err -2)
[  636.274939] morse: Unknown symbol wiphy_to_ieee80211_hw (err -2)
[  636.274991] morse: Unknown symbol ieee80211_queue_delayed_work (err -2)
[  636.275021] morse: Unknown symbol ieee80211_proberesp_get (err -2)
[  636.275143] morse: Unknown symbol ieee80211_find_sta_by_ifaddr (err -2)
[  636.275171] morse: Unknown symbol ieee80211_next_txq (err -2)
[  636.275226] morse: Unknown symbol ieee80211_beacon_cntdwn_is_complete (err -2)
[  636.275286] morse: Unknown symbol ieee80211_wake_queues (err -2)
[  636.275335] morse: Unknown symbol ieee80211_free_txskb (err -2)
[  636.275381] morse: Unknown symbol ieee80211_alloc_hw_nm (err -2)
[  636.275435] morse: Unknown symbol ieee80211_tx_dequeue (err -2)
[  636.275514] morse: Unknown symbol ieee80211_tx_status (err -2)
[  636.275538] morse: Unknown symbol ieee80211_stop_queue (err -2)
[  636.275578] morse: Unknown symbol wdev_to_ieee80211_vif (err -2)
[  636.275602] morse: Unknown symbol ieee80211_stop_queues (err -2)
[  636.275645] morse: Unknown symbol ieee80211_vif_to_wdev (err -2)
[  636.275670] morse: Unknown symbol __ieee80211_get_assoc_led_name (err -2)
[  636.275715] morse: Unknown symbol ieee80211_sched_scan_results (err -2)
[  636.275739] morse: Unknown symbol ieee80211_scan_completed (err -2)
[  636.275790] morse: Unknown symbol ieee80211_unregister_hw (err -2)
[  636.275834] morse: Unknown symbol ieee80211_beacon_get_tim (err -2)
[  636.275949] morse: Unknown symbol ieee80211_return_txq (err -2)
[  636.276055] morse: Unknown symbol ieee80211_csa_finish (err -2)
[  636.276081] morse: Unknown symbol ieee80211_rx_irqsafe (err -2)
[  741.244612] morse micro driver registration. Version 0-rel_1_15_3_2025_Apr_16
bot@bot:~$ sudo dmesg | grep -i ah
[  611.385081] dot11ah: loading out-of-tree module taints kernel.
[  611.389002] Morse Micro Dot11ah driver registration. Version 0-rel_1_15_3_2025_Apr_16
bot@bot:~$ dmesg | grep -i morse
dmesg: read kernel buffer failed: Operation not permitted
bot@bot:~$ sudo dmesg | grep morse
[sudo] password for bot:
[  636.273214] morse: Unknown symbol ieee80211_queue_stopped (err -2)
[  636.273288] morse: Unknown symbol ieee80211_stop_tx_ba_session (err -2)
[  636.273400] morse: Unknown symbol ieee80211_start_tx_ba_cb_irqsafe (err -2)
[  636.273456] morse: Unknown symbol ieee80211_connection_loss (err -2)
[  636.273564] morse: Unknown symbol ieee80211_sched_scan_stopped (err -2)
[  636.273736] morse: Unknown symbol crc7_be_syndrome_table (err -2)
[  636.273863] morse: Unknown symbol ieee80211_free_hw (err -2)
[  636.273977] morse: Unknown symbol ieee80211_probereq_get (err -2)
[  636.274007] morse: Unknown symbol ieee80211_txq_schedule_start (err -2)
[  636.274061] morse: Unknown symbol ieee80211_iterate_stations_atomic (err -2)
[  636.274106] morse: Unknown symbol ieee80211_ap_probereq_get (err -2)
[  636.274145] morse: Unknown symbol ieee80211_start_tx_ba_session (err -2)
[  636.274176] morse: Unknown symbol ieee80211_beacon_loss (err -2)
[  636.274225] morse: Unknown symbol ieee80211_register_hw (err -2)
[  636.274274] morse: Unknown symbol ieee80211_restart_hw (err -2)
[  636.274316] morse: Unknown symbol ieee80211_sta_eosp (err -2)
[  636.274353] morse: Unknown symbol __ieee80211_get_radio_led_name (err -2)
[  636.274417] morse: Unknown symbol ieee80211_stop_rx_ba_session (err -2)
[  636.274449] morse: Unknown symbol ieee80211_wake_queue (err -2)
[  636.274524] morse: Unknown symbol __ieee80211_get_tx_led_name (err -2)
[  636.274576] morse: Unknown symbol ieee80211_get_buffered_bc (err -2)
[  636.274617] morse: Unknown symbol ieee80211_find_sta (err -2)
[  636.274813] morse: Unknown symbol __ieee80211_get_rx_led_name (err -2)
[  636.274884] morse: Unknown symbol ieee80211_stop_tx_ba_cb_irqsafe (err -2)
[  636.274939] morse: Unknown symbol wiphy_to_ieee80211_hw (err -2)
[  636.274991] morse: Unknown symbol ieee80211_queue_delayed_work (err -2)
[  636.275021] morse: Unknown symbol ieee80211_proberesp_get (err -2)
[  636.275143] morse: Unknown symbol ieee80211_find_sta_by_ifaddr (err -2)
[  636.275171] morse: Unknown symbol ieee80211_next_txq (err -2)
[  636.275226] morse: Unknown symbol ieee80211_beacon_cntdwn_is_complete (err -2)
[  636.275286] morse: Unknown symbol ieee80211_wake_queues (err -2)
[  636.275335] morse: Unknown symbol ieee80211_free_txskb (err -2)
[  636.275381] morse: Unknown symbol ieee80211_alloc_hw_nm (err -2)
[  636.275435] morse: Unknown symbol ieee80211_tx_dequeue (err -2)
[  636.275514] morse: Unknown symbol ieee80211_tx_status (err -2)
[  636.275538] morse: Unknown symbol ieee80211_stop_queue (err -2)
[  636.275578] morse: Unknown symbol wdev_to_ieee80211_vif (err -2)
[  636.275602] morse: Unknown symbol ieee80211_stop_queues (err -2)
[  636.275645] morse: Unknown symbol ieee80211_vif_to_wdev (err -2)
[  636.275670] morse: Unknown symbol __ieee80211_get_assoc_led_name (err -2)
[  636.275715] morse: Unknown symbol ieee80211_sched_scan_results (err -2)
[  636.275739] morse: Unknown symbol ieee80211_scan_completed (err -2)
[  636.275790] morse: Unknown symbol ieee80211_unregister_hw (err -2)
[  636.275834] morse: Unknown symbol ieee80211_beacon_get_tim (err -2)
[  636.275949] morse: Unknown symbol ieee80211_return_txq (err -2)
[  636.276055] morse: Unknown symbol ieee80211_csa_finish (err -2)
[  636.276081] morse: Unknown symbol ieee80211_rx_irqsafe (err -2)
[  741.244612] morse micro driver registration. Version 0-rel_1_15_3_2025_Apr_16
bot@bot:~$ lsmod | grep morse
morse                 417792  0
crc7                   16384  1 morse
mac80211             1232896  1 morse
dot11ah               106496  1 morse
cfg80211              970752  4 dot11ah,brcmfmac,mac80211,morse
bot@bot:~$

Could you please provide a step-by-step setup guide for Raspberry Pi 4 using APIM2, including:

  1. Required kernel version and configuration for Raspberry Pi 4

  2. Driver compilation and module loading sequence

  3. Firmware or device tree overlay requirements

  4. Recommended bring-up procedure for UART or SDIO, considering M.2 E-Key slot does not support SPI

It looks like you haven’t correctly compiled the morse modules against your current kernel/mac80211. I would recommend following Linux Driver Porting Guide (App Note 24) - %%网站名称

Can you let us know what operating system/kernel you’re using? If OpenWrt is an option, you may want to use our OpenWrt distribution (GitHub - MorseMicro/openwrt), which will mean you only have to correctly define the dtoverlay.

2 Likes
bot@raspberrypi:~/morse_driver $ lsmod | grep morse
morse                 364544  0
dot11ah                94208  1 morse
crc7                   16384  1 morse
mac80211              974848  1 morse
cfg80211              925696  4 dot11ah,brcmfmac,mac80211,morse
bot@raspberrypi:~/morse_driver $ uname -r
**6.1.21-v8+**
bot@raspberrypi:~/morse_driver $ cat /etc/os-release
**PRETTY_NAME=“Debian GNU/Linux 11 (bullseye)”**
NAME=“Debian GNU/Linux”
VERSION_ID=“11”
VERSION=“11 (bullseye)”
VERSION_CODENAME=bullseye
ID=debian
HOME_URL=“https://www.debian.org/”
SUPPORT_URL=“https://www.debian.org/support”
BUG_REPORT_URL=“https://bugs.debian.org/”
bot@raspberrypi:~/morse_driver $ uname -m
aarch64
bot@raspberrypi:~/morse_driver $

Hello,

I have been working on integrating the Morse Micro Wi-Fi HaLow driver by following the Linux Driver Porting Guide (App Note 24).

Here is a summary of my attempts:

  1. Ubuntu 22.04 LTS (Jammy Jellyfish) on Raspberry Pi

    • Kernel: 5.15.0-1085-raspi

    • While compiling, I ran into unknown symbol errors during module insertion (likely due to kernel/mac80211 mismatches).

  2. Raspberry Pi OS (Debian 11 Bullseye, 64-bit)

    • Kernel: 6.1.21-v8+

    • Driver built successfully, and I can load the modules:

      lsmod | grep morse
      morse     364544  0
      dot11ah    94208  1 morse
      crc7       16384  1 morse
      mac80211  974848  1 morse
      cfg80211  925696  4 dot11ah,brcmfmac,mac80211,morse
      
      
    • However, at runtime I still encounter unknown symbols and instability.

Based on the documentation, I see that the driver officially supports specific Raspberry Pi kernel tags, for example:

  • 5.15.61 (1.20220830)

  • 6.1.21 (1.20230405)

  • 6.6.19 (stable_20240529)


My questions:

  1. Ubuntu 22.04 Jammy

    • Is the HaLow driver expected to support Ubuntu kernels (e.g., 5.15.0-1085-raspi) directly, or would I need to manually port patches from the Raspberry Pi Foundation kernels?

    • If supported, is the build procedure the same as in the guide, or are there Ubuntu-specific steps?

  2. Raspberry Pi OS / Debian

    • For a reliable and clean build, which OS + kernel combination do you recommend?

    • Should I specifically use Raspberry Pi OS with the exact supported kernel tags (e.g., 5.15.61 / 6.1.21 / 6.6.19), rather than Debian Bullseye with a generic Pi kernel?


I’d greatly appreciate any guidance on the best-supported path forward.
My goal is to confirm whether Ubuntu Jammy is viable, or if I should standardize on Raspberry Pi OS with a known good kernel version for Morse Micro HaLow development.

Thank you!

@krishna please don’t flood the forum with multiple threads for the same request.

I’ve moved your newest thread into this one, and closed the other two you have created.


I ran into unknown symbol errors during module insertion (likely due to kernel/mac80211 mismatches).

Unknown symbols are either due to a mismatch in kernel source the driver was compiled against, or in the case of your last image - dot11ah.ko failing to insert before inserting morse.ko. Please show the dmesg for the dot11ah insertion.

Check the kernel source you are compiling against, and make sure you insert dot11ah.ko before morse.ko.

If supported, is the build procedure the same as in the guide

Yes, but as per the porting guide you will need to apply a small number of kernel patches. These patches are provided to target Raspberry Pi kernels and LTS Linux versions. Choose the branch tag that matches as close to your kernel version as possible.

For a reliable and clean build, which OS + kernel combination do you recommend?

If you can use OpenWrt, we recommend that. Otherwise the Raspberry Pi OS will be closer to what we produce.
What do you want to use?

Hello,

Apologies for creating multiple threads earlier — I’ll make sure to keep everything consolidated in one thread from now on.


Looks like the drivers have correctly inserted, but they aren’t probing the hardware.

You will need to make sure the SDIO interface on the Raspberry Pi 4 is routed to the 40pin header instead of the onboard 2.4/5 GHz Wi-Fi chip, and it would also be helpful to create a device tree overlay to define the reset, busy and wake GPIOs.

The Linux porting guide should have some examples of device tree files, but the one we use for our EKH01 evaluation platform can be found in this patch file openwrt/target/linux/bcm27xx/patches-5.15/991-0001-dt-overlays-morse-add-sdio-overlay-fragment.patch at mm/v23.05.5 · MorseMicro/openwrt · GitHub. Note that your pinouts may differ. Check the APIM2 carrier board carefully.

1 Like