Support for MM610X-H06 on Raspberry Pi 3B+

Hi all,
I’m approaching the world of HaLow for the first time for an academic project using the MM610X-H06 module and a dual-band router from AsiaRF. Currently, I have a Raspberry Pi 3B+, but the SDK provided by the company is only compatible with the Raspberry Pi 4B.

I’m trying to make it work on the Pi 3B+ with my noob skills. Over the past few days, I’ve been trying to “reverse engineer” the drivers, and so far, I’ve made the following progress:

  • Compiled the kernel with the configuration for Pi 3B+, applying the patches provided by the company.
  • Recompiled the modules morse.ko and dot11ah.ko for the new kernel, starting from the code found on GitHub.

With these modifications, I’m able to detect the interface, but when checking the logs through dmesg, I can see that it isn’t working properly.


Main Issues

There are some binary files and installation scripts that I don’t know how to handle:

  • bcf_mf1022.bin, mm6108.bin

    • I can’t find the sources and don’t know if or how they should be recompiled.
  • mm_wlan.dtbo and morse-spi.dtbo

    • I’m not sure if these files are correct for my configuration on the Pi 3B+.

Unrecompiled Files

  • morsecli
  • wpa_supplicant_s1g
  • hostapds1g

I’ve left these files as they are for now because I can’t communicate with the board yet.


Other Issues

  • I’m not sure if driver modules from different companies are compatible with each other or if they differ.
  • I’ve searched as much as possible on GitHub, but many things are still unclear.
  • I also read the guide for the Raspberry Pi 5 in the community, where references are made to patches and code that I unfortunately couldn’t find anywhere.

I’m using Raspbian OS for simplicity, but in the future, I’d like to expand to other distros and, if I gain enough expertise, build everything with Buildroot.

I would like to understand how to extend the use of HaLow to the Raspberry Pi 3B+, as I believe in the potential of this technology. Any advice or useful resources would be greatly appreciated.

Sorry if my message is a bit confusing, and I thank in advance anyone who can help me. Any additional information you might need, I’ll be happy to provide.

Thanks! :grin:

Hi @aletinti

It should be possible to add HaLow onto the RPi 3B+. I’ll do some digging internally to see if we have anything we can share as we may have done this ourselves in the past.

While you wait, some comments and requests to help me get you the right information otherwise:

  • Can you share the dmesg output which shows it isn’t working properly?
  • The .dtbo files will need to be modified for the RPi 3B+. For our OpenWrt SDK targeting the RPi 4B these files are added as patches to the kernel. Please see mm_wlan-overlay.dts and morse-spi-overlay.dts.
    • One of our community members created a Yocto meta-layer for the RPi 4B which contains these files more clearly - ie not as patches.
    • If you get stuck with device tree, feel free to ask questions. Happy to help where we can!
  • For the most part, the Morse Micro driver should be consistent across module vendors. However, I can’t guarantee this will always be the case.
  • bcf_mf1022.bin will have to come from your module vendor (AsiaRF), as it contains radio calibration data specific to their module.
  • Our firmware binaries do not need to be re-compiled, and can be found in the release artefacts on GitHub
  • Please make sure the version of the firmware binary, bcf binary, and Linux driver match as the chip will not boot otherwise. It’s best to ask your module vendor what versions their BCF are compatible with.
    • I suspect they may target an earlier version than what we have released on GitHub (1.11.4 and 1.12.4). Teething issues as we’ve only recently started opening our software to the public. We have other avenues to handle this if required. So let me know!
    • Alternatively, use the firmware and driver provided by AsiaRF (if provided) to ensure compatibility.

I’ll get back to you with any more information of prior RPi 3B+ integration as soon as I can!

Hi @ajudge ,
Thank you so much for your response! I’ve finally resumed working on the module today.

I reviewed the additional resources provided through your platform, downloading the MM6108-Linux-Driver-Release-Package-1.12.4 and examining the guide. However, I decided to continue using the driver structure provided by AsiaRF, as it already includes some scripts that simplify the installation process.


SDK Structure

  • app/ – Contains modified tools for hostapd and wpa_supplicant to configure the module as a Wi-Fi Access Point or Station, as well as the morse_cli tool.
  • driver/ – Includes:
    • Firmware (e.g., mm6108.bin, bcf_mf10220.bin)
    • Kernel Drivers (morse.ko.xz, dot11ah.ko.xz)
    • Device Tree Overlays (DTS) (mm_wlan.dtbo, morse-spi.dtbo)
    • Management Scripts (chipreset.sh)
  • kernel-patches/ – Patches to add 802.11ah support to the Linux kernel.

What I’ve Done So Far

Kernel and Drivers:

I recompiled the kernel using AsiaRF’s patches, which appear identical to those in your driver package.
I recompiled the .ko modules using the following command:

make MORSE_TRACE_PATH='pwd' ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL_SRC=../../linux/ CONFIG_WLAN_VENDOR_MORSE=m -j$(nproc) CONFIG_MORSE_USER_ACCESS=y CONFIG_MORSE_SDIO=y CONFIG_MORSE_VENDOR_COMMAND=y CONFIG_MORSE_COUNTRY="US"`

Note!
I had to comment out part of line 16 in the Makefile:

ccflags-y += $(DEBFLAGS) #-Wall -Werror

Because some warnings were preventing the compilation.

DTS and Firmware:

The dtbo files, after decompilation, seem correct and match the two dts files available here: meta-morse GitHub Repo.
However, I can’t be 100% sure because some information may have been lost during decompilation. These files should also be compatible with older versions of the Raspberry Pi, including the Raspberry Pi 4.

I’m uncertain whether defining the pins this way (via dtbo files) requires including the morse_patches.patch from that repo. AsiaRF seems to use this method, but the patch is not included in their implementation.

The firmware files (mm6108.bin, bcf_mf10220.bin) have not been modified.

Installation:

I installed the drivers using the install_driver.sh script. This script also adds the necessary lines to config.txt, pointing to mm_wlan, and to rc.local, pointing to the chipreset.sh script.

App:

I recompiled the tools in the app/ folder, but they don’t appear to differ from those provided by AsiaRF. For now, they remain unused since I haven’t been able to get them to work yet.


Current Issue

Unlike the last time, I can’t see the wlan0 interface using iwconfig or nmcli.

dmesg Errors:

[   11.682824] morse micro driver registration. Version 0-rel_1_12_4_2024_Jun_11  
[   11.689496] morse_sdio: probe of mmc2:0001:1 failed with error -110  
[   11.689754] morse_sdio: probe of mmc2:0001:2 failed with error -110  

Open Questions

  1. morse_patches.patch

Should I include this patch, even though AsiaRF does not seem to use it? Could it resolve hardware compatibility or pin configuration issues?

  1. Compilation Flags

Could AsiaRF have used different flags that affect the module’s behavior?

  1. DTS and Hardware Connections

Although the dtbo files seem correct, I can’t completely rule out a configuration issue with the pins.
I would like to better understand whether the error I’m receiving is caused by incorrect pin configurations or if it’s purely a software issue related to the drivers. This would help me focus my debugging efforts in the right direction.

  1. Differences in Reset Scripts

The chipreset.sh script provided by AsiaRF is different from the one in your GitHub repository: chipreset.sh.
However, I doubt this is the root cause of the problem.


Next Steps

I’m trying to recreate the scenario where the interface was detected (although with errors in dmesg) to better understand what might have worked or not.


I apologize for the length of the message, but I hope I have been as thorough as possible in order to find a solution to this issue or similar ones. :sweat_smile:

Quick Progress Update!

After following the previous instructions, I managed to get the module working with the same configuration as before, but I had to make a small modification to the line in the /boot/firmware/config.txt file:

From:

dtoverlay=mm_wlan

To:

dtoverlay=mm_wlan,sdio_overclock=25

This change allowed the module to start correctly. I’m still not sure if this is the optimal configuration, as it seems that speeds should be configured in other places, but for now, it works.


I’d like to ask for your feedback on my dmesg output to see if everything looks correct and if there are any possible optimizations. Here’s part of the log I obtained:

[   12.797737] morse micro driver registration. Version 0-rel_1_12_4_2024_Jun_11
[   12.799342] morse_sdio mmc2:0001:1: sdio new func 1 vendor 0x325b device 0x306 block 0x8/0x8
[   12.802301] morse_sdio mmc2:0001:2: sdio new func 2 vendor 0x325b device 0x306 block 0x200/0x200
[   12.805355] morse_sdio mmc2:0001:2: Reading gpio pins configuration from device tree
[   12.873008] morse_sdio mmc2:0001:2: Loaded firmware from morse/mm6108.bin, size 433044, crc32 0x436ba524
[   12.891644] morse_sdio mmc2:0001:2: Loaded BCF from morse/bcf_default.bin, size 915, crc32 0x087bbb44
[   13.433617] morse_sdio mmc2:0001:2: Country code GB is not supported
[   13.433638] morse_sdio mmc2:0001:2: Failed to set regulatory to country GB, staying in US
[   13.438475] morse_sdio mmc2:0001:2: Driver loaded with kernel module parameters
[   13.438513] morse_sdio mmc2:0001:2:     enable_1mhz_probes                      : Y
[   13.438527] morse_sdio mmc2:0001:2:     enable_hw_scan                          : Y
[   13.438540] morse_sdio mmc2:0001:2:     enable_pv1                              : N
[   13.438552] morse_sdio mmc2:0001:2:     enable_page_slicing                     : N
[   13.438566] morse_sdio mmc2:0001:2:     log_modparams_on_boot                   : Y
[   13.438578] morse_sdio mmc2:0001:2:     enable_mcast_at_op_bw                   : N
[   13.438591] morse_sdio mmc2:0001:2:     enable_mcast_whitelist                  : Y
[   13.438607] morse_sdio mmc2:0001:2:     ocs_type                                : 1
[   13.438620] morse_sdio mmc2:0001:2:     enable_auto_mpsw                        : Y
[   13.438634] morse_sdio mmc2:0001:2:     duty_cycle_probe_retry_threshold        : 2500
[   13.438647] morse_sdio mmc2:0001:2:     duty_cycle_mode                         : 0
[   13.438659] morse_sdio mmc2:0001:2:     enable_auto_duty_cycle                  : Y
[   13.438673] morse_sdio mmc2:0001:2:     dhcpc_lease_update_script               : /morse/scripts/dhcpc_update.sh
[   13.438687] morse_sdio mmc2:0001:2:     enable_ibss_probe_filtering             : Y
[   13.438699] morse_sdio mmc2:0001:2:     enable_dhcpc_offload                    : N
[   13.438712] morse_sdio mmc2:0001:2:     enable_arp_offload                      : N
[   13.438725] morse_sdio mmc2:0001:2:     enable_bcn_change_seq_monitor           : 0
[   13.438737] morse_sdio mmc2:0001:2:     enable_cac                              : 0
[   13.438750] morse_sdio mmc2:0001:2:     max_mc_frames                           : 10
[   13.438763] morse_sdio mmc2:0001:2:     tx_max_power_mbm                        : 2200
[   13.438776] morse_sdio mmc2:0001:2:     enable_twt                              : Y
[   13.438788] morse_sdio mmc2:0001:2:     enable_mac80211_connection_monitor      : N
[   13.438801] morse_sdio mmc2:0001:2:     enable_airtime_fairness                 : N
[   13.438813] morse_sdio mmc2:0001:2:     enable_raw                              : Y
[   13.438825] morse_sdio mmc2:0001:2:     max_aggregation_count                   : 0
[   13.438838] morse_sdio mmc2:0001:2:     max_rate_tries                          : 1
[   13.438851] morse_sdio mmc2:0001:2:     max_rates                               : 3
[   13.438863] morse_sdio mmc2:0001:2:     enable_watchdog_reset                   : N
[   13.438875] morse_sdio mmc2:0001:2:     watchdog_interval_secs                  : 30
[   13.438888] morse_sdio mmc2:0001:2:     enable_watchdog                         : Y
[   13.438901] morse_sdio mmc2:0001:2:     country                                 : US
[   13.438913] morse_sdio mmc2:0001:2:     enable_cts_to_self                      : N
[   13.438925] morse_sdio mmc2:0001:2:     enable_rts_8mhz                         : N
[   13.438943] morse_sdio mmc2:0001:2:     enable_trav_pilot                       : Y
[   13.438956] morse_sdio mmc2:0001:2:     enable_sgi_rc                           : Y
[   13.438968] morse_sdio mmc2:0001:2:     enable_mbssid_ie                        : N
[   13.438980] morse_sdio mmc2:0001:2:     virtual_sta_max                         : 0
[   13.438993] morse_sdio mmc2:0001:2:     thin_lmac                               : 0
[   13.439006] morse_sdio mmc2:0001:2:     enable_dynamic_ps_offload               : Y
[   13.439018] morse_sdio mmc2:0001:2:     enable_ps                               : 2
[   13.439030] morse_sdio mmc2:0001:2:     enable_subbands                         : 2
[   13.439043] morse_sdio mmc2:0001:2:     enable_survey                           : Y
[   13.439055] morse_sdio mmc2:0001:2:     mcs10_mode                              : 0
[   13.439068] morse_sdio mmc2:0001:2:     mcs_mask                                : 1023
[   13.439080] morse_sdio mmc2:0001:2:     no_hwcrypt                              : 0
[   13.439093] morse_sdio mmc2:0001:2:     enable_ext_xtal_init                    : N
[   13.439107] morse_sdio mmc2:0001:2:     enable_otp_check                        : 1
[   13.439119] morse_sdio mmc2:0001:2:     bcf                                     : 
[   13.439184] morse_sdio mmc2:0001:2:     serial                                  : default
[   13.439198] morse_sdio mmc2:0001:2:     debug_mask                              : 8
[   13.439211] morse_sdio mmc2:0001:2:     tx_status_lifetime_ms                   : 15000
[   13.439224] morse_sdio mmc2:0001:2:     tx_queued_lifetime_ms                   : 1000
[   13.439238] morse_sdio mmc2:0001:2:     max_txq_len                             : 32
[   13.439251] morse_sdio mmc2:0001:2:     default_cmd_timeout_ms                  : 600
[   13.439264] morse_sdio mmc2:0001:2:     enable_short_bcn_as_dtim_override       : -1
[   13.439277] morse_sdio mmc2:0001:2:     fw_bin_file                             : 
[   13.439290] morse_sdio mmc2:0001:2:     sdio_reset_time                         : 400
[   13.439302] morse_sdio mmc2:0001:2:     macaddr_suffix                          : 00:00:00
[   13.439321] morse_sdio mmc2:0001:2:     macaddr_octet                           : 255
[   13.439334] morse_sdio mmc2:0001:2:     max_total_vendor_ie_bytes               : 514
[   13.439348] morse_sdio mmc2:0001:2:     coredump_include                        : 1
[   13.439361] morse_sdio mmc2:0001:2:     coredump_method                         : 1
[   13.439374] morse_sdio mmc2:0001:2:     enable_coredump                         : Y
[   13.439386] morse_sdio mmc2:0001:2:     sdio_clk_debugfs                        : 
[   13.439398] morse_sdio mmc2:0001:2:     enable_mm_vendor_ie                     : Y
[   13.439934] morse_io: Device node '/dev/morse_io' created successfully

The goal for this holiday season is to dive deeper into the necessary steps to make the hat work properly on Raspberry Pi, and to create a simple installer so that anyone can configure it without going through the same struggles I faced this past week.

Thanks for the support, and I look forward to your suggestions! :smile:

Glad to see you got it working! Your dmesg output look sane and what we would expect from a successful insertion and bring up of the Morse Micro interface.

I’ll take a look at the sdio_overclock parameter. You may be able to set this in the devicetree file itself, but I suspect you’re doing the right thing by configuring this parameter.

1 Like