# Support for MM610X-H06 on Raspberry Pi 3B+

**URL:** <https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205>\
**Category:** Software\
**Created:** [December 18, 2024, 12:24am UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205 "2024-12-18T00:24:18Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![aletinti](https://avatars.discourse-cdn.com/v4/letter/a/9fc348/32.png) [@aletinti](https://community.morsemicro.com/u/aletinti)\
**Post date:** [December 18, 2024, 12:24am UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205/1 "2024-12-18T00:24:18Z")

</div>

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`**

- **`mm_wlan.dtbo`** and **`morse-spi.dtbo`**

* * *

### **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! 😁

---

<div class="post-metadata">

**Author:** ![ajudge](https://avatars.discourse-cdn.com/v4/letter/a/c2a13f/32.png) [@ajudge](https://community.morsemicro.com/u/ajudge)\
**Post date:** [December 18, 2024, 12:53am UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205/2 "2024-12-18T00:53:31Z")

</div>

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](https://github.com/MorseMicro/openwrt/blob/mm/v23.05.3/target/linux/bcm27xx/patches-5.15/991-0001-dt-overlays-morse-add-sdio-overlay-fragment.patch) and [morse-spi-overlay.dts](https://github.com/MorseMicro/openwrt/blob/mm/v23.05.3/target/linux/bcm27xx/patches-5.15/991-0003-dt-overlays-morse-add-spi-overlay-fragment.patch).
  - One of our community members created a [Yocto meta-layer for the RPi 4B](https://github.com/LOflynn/meta-morse/tree/main/recipes-morse/morse-rpi4/files) 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](https://github.com/MorseMicro/firmware_binaries/releases/)
- 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!

---

<div class="post-metadata">

**Author:** ![aletinti](https://avatars.discourse-cdn.com/v4/letter/a/9fc348/32.png) [@aletinti](https://community.morsemicro.com/u/aletinti)\
**Post date:** [December 22, 2024, 4:33pm UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205/3 "2024-12-22T16:33:37Z")

</div>

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:

```bash
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:

```bash
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](https://github.com/LOflynn/meta-morse/tree/main/recipes-morse/morse-rpi4/files).  
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:

```auto
[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](https://github.com/MorseMicro/morse-feed/blob/ec2a198eff88d0a1733607661a3e7bf061fbf959/kernel/morse-bundle/files/morse/scripts/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._ 😅

---

<div class="post-metadata">

**Author:** ![aletinti](https://avatars.discourse-cdn.com/v4/letter/a/9fc348/32.png) [@aletinti](https://community.morsemicro.com/u/aletinti)\
**Post date:** [December 22, 2024, 8:50pm UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205/4 "2024-12-22T20:50:23Z")

</div>

# 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:

```auto
dtoverlay=mm_wlan

```

To:

```auto
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:

```auto
[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! 😄

---

<div class="post-metadata">

**Author:** ![ajudge](https://avatars.discourse-cdn.com/v4/letter/a/c2a13f/32.png) [@ajudge](https://community.morsemicro.com/u/ajudge)\
**Post date:** [December 23, 2024, 7:18am UTC](https://community.morsemicro.com/t/support-for-mm610x-h06-on-raspberry-pi-3b/205/5 "2024-12-23T07:18:18Z")

</div>

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.
