MM8108-EKH19 Wi-Fi HaLow USB Network Adapter Evaluation Kit Usage

Hi everyone,

I have purchased 2 of the MM8108 evaluation kits as listed in the title. My goal is to set up one of the kits as an access point, which I have done, and then connect to it with a station. I was successful in connecting the station to the access point using the router and USB from the kit.

However, my end goal is connecting the USB directly to a raspberry pi 3 or 4 and then connecting to the access point as a station without needing the second router from the kit. Is this possible? I haven’t had any luck so far.

I want to do this without needing to create a new image on the pi, so I can keep my existing code that I have running on the pi, and just use the USB to connect to the HaLow wifi.

When I plug the USB into the pi, it does not light up but my pi can recognize it with lsusb. I was told that when I plug in the USB it would present itself as an ethernet connection to my pi and I would be able to configure it on the pi by typing the ip address into a browser, but I have not seen that happen.

Do I need to add any software or drivers to configure the USB for the pi? If anyone could help me out with this, I would really appreciate it!

Thanks!

You’ll have to install the MM8108 drivers on your RPi to make this work.

1 Like

Which ones and where are they? How do you install them?

Hi @0o0gg

Are you planning to use the OpenWrt OS on your RPi? If yes, please check my post below. It received a huge support from the Morse Team

Regards,

Vu.

Which ones and where are they? How do you install them?

The answer to this depends on what operating system you’re using. The easy path is using our OpenWrt system, but it sounds like you want to add them to whatever you’re running at the moment. What is that? Raspbian?

I’m running on Raspberry Pi OS 12 Bookworm, 6.12.25+rpt-rpi-v8. And yes I don’t want to overwrite what I currently have. Does OpenWrt only reimage the pi completely? How would you add on to an existing image?

Thanks for pointing this out! I was able to use OpenWrt on my Pi4 and completely reimage it with the help of your post. But what I want is to not require a complete reimaging of the pi. I want to take an existing image and add in the MM8108 functionality to connect to a HaLow access point. Anyone know how to do this?

Hi @0o0gg

This is doable, but it may require you to patch your kernel.
I have some instructions for bringing this up on a Raspberry Pi 5 running Raspberry Pi OS and I can share those instructions shortly.

In the meantime, take a look at Wi-Fi HaLow Driver | Linux Porting Guide App Note 24 for the compilation instructions of the Morse Micro driver. You can acquire kernel source to target the driver with sudo apt install linux-headers-$(uname -r). This should install the headers, and kbuild into /usr/src/linux-headers-$(uname -r).
You can then point the driver compilation to this as the KERNEL_SRC.

If you find you do need to patch the kernel (required for 1.15, possibly not required for 1.16), then you’ll need to clone the Linux source to apply the patches. You can update the kernel without affecting your rootfs.

We’re looking to deliver a dkms package in the future, when time allows.

2 Likes

Hi @ajudge

Thank you for your reply. I still have not been successful in getting this to work.

When you say patching the kernel, are you expecting to point the driver compilation towards the clone of the Linux source after the patches are applied? I am still confused on how patching the kernel works and what version the pi needs to be.

I also have a problem of the Morse Micro linux repo being too large to clone onto my pi. I am trying to put it onto a CM3+ running 6.12.25+rpt-rpi-v8. So I was trying to compile the driver on my pc and then transfer it to the CM3+. I cloned the morse linux repo and ran through all the patch files. But making the driver is giving me errors still. How exactly is the driver supposed to be built? Could you give me steps to build it on a pc so that I could transfer it to the CM3+?

I also tried building it on a raspberry pi 4 that was running 6.1.21-v8+. I was able to clone the morse linux and patch it. Then I built it, went through the firmware installs, modprobed the drivers, ran the wpa_supplicant, but the usb MM8108 was still not lighting up. The usb was recognized and the drivers were being registered.

I really need to get this up and working soon, so any help you could provide would be greatly appreciated!

Thank you so much.

Can you give us more information about this one? It’s not clear at what point the bring-up went wrong here. Did wlan0 appear and did you set it up? What logs did wpa_supplicant emit?

I cloned the morse linux repo and ran through all the patch files. But making the driver is giving me errors still.

What errors are you getting?

Other thoughts:

  • if you build things on your PC, you will need to cross compile the kernel/driver. I’m not sure if you’re doing that.
  • you mention cloning the Linux repo. If you follow Arien’s suggestion, you should not need to do this, but instead be installing the Linux source from the raspbian package. The only repo to clone is the morse_driver. However, you may need to look at the Morse Linux repo as a reference for what patches to apply.

So I’m confused on what you mean here exactly. In regards to building directly on the pi with 6.12.2-v8 on a CM3, do I clone this at all? GitHub - raspberrypi/linux: Kernel source tree for Raspberry Pi-provided kernel builds. Issues unrelated to the linux kernel should be posted on the community forum at https://forums.raspberrypi.com/

I also was never able to get wlan0 to appear.

I left a list of steps I tried below. I built the MorseMicro linux on my pc and copied the patch files over. The driver compiles against the clone of the raspberry pi linux, but not when running: make KERNEL_SRC=/usr/src/linux-headers-$(uname -r) CONFIG_WLAN_VENDOR_MORSE=m CONFIG_MORSE_USER_ACCESS=y CONFIG_MORSE_VENDOR_COMMAND=y

Are you supposed to apply the patches to the kernel directly? How do you do that? Can’t you only apply patches to a git repository?

If you could edit this or list out the steps that would be great.

On pc:

git clone --depth 1 https://github.com/MorseMicro/linux.git morse_linux
cd morse_linux/
git checkout mm/linux-6.12.21/1.1.x
git format-patch v6.1.21

Copy .patch files to pi

On pi:

sudo apt update
sudo apt install -y git bc build-essential libncurses5-dev bison flex libssl-dev
sudo apt install -y raspberrypi-kernel-headers
mkdir -p ~/halow_build
cd ~/halow_build
git clone https://github.com/MorseMicro/morse_driver.git
cd morse_driver
git checkout
git submodule update --init –recursive
git checkout
git submodule update --init –recursive
sudo apt install linux-headers-$(uname -r)
make KERNEL_SRC=/usr/src/linux-headers-$(uname -r) CONFIG_WLAN_VENDOR_MORSE=m CONFIG_MORSE_USER_ACCESS=y CONFIG_MORSE_VENDOR_COMMAND=y

likely fails : apply patches

git clone --depth=1 --branch rpi-6.12.y https://github.com/raspberrypi/linux.git rpi_kernel_6.12
mkdir ~/halow_patches
cp ~/halow_build/morse_linux/*.patch ~/halow_patches/

(just copy .patch files into halow_patches)

cd ~/halow_build/rpi_kernel_6.12
git am ~/halow_patches/*.patch
git am --show-current-patch=diff
git add -u
git am –continue

keep adding space in comment and deleting, add each time

sudo apt install raspberrypi-kernel-headers
cd /usr/src
cp /usr/src/linux-headers-6.12.25+rpt-rpi-v8/.config ~/halow_build/rpi_kernel_6.12/.config
cd ~/halow_build/rpi_kernel_6.12
make oldconfig
make prepare
make -j$(nproc)
sudo make modules_install
sudo make install
sudo reboot

remake drivers:

make KERNEL_SRC=/usr/src/linux-headers-$(uname -r) CONFIG_WLAN_VENDOR_MORSE=m CONFIG_MORSE_USER_ACCESS=y CONFIG_MORSE_VENDOR_COMMAND=y

Install firmware:

mkdir $STAGING_DIR
curl -sL https://github.com/MorseMicro/firmware_binaries/releases/download/v1.15.3/morsemicro-fw-rel_1_15_3_2025_Apr_16.tar | sudo tar -C /lib/firmware/morse -xv
curl -sL https://github.com/MorseMicro/bcf_binaries/releases/download/v1.15.3/morsemicro-bcf-rel_1_15_3_2025_Apr_16.tar | sudo tar -C /lib/firmware/morse -xv
ln -s /lib/firmware/morse/$BCF.bin $STAGING_DIR/lib/firmware/morse/bcf_default.bin

When compiling the morse_driver on a patched 6.12.47+rpt-rpi-v8 kernel with morse_driver 1.16.4 running:

make  KERNEL_SRC=/lib/modules/$(uname -r)/build CONFIG_WLAN_VENDOR_MORSE=m CONFIG_MORSE_USER_ACCESS=y  CONFIG_MORSE_VENDOR_COMMAND=y CONFIG_MORSE_USB=y CONFIG_MORSE_SDIO=n

Here are some of the errors:

make MORSE_VERSION=ā€œ0-rel_1_16_4_2025_Sep_18ā€ -C /lib/modules/6.12.47+rpt-rpi-v8/build M=/home/pi/halow_build/morse_driver
make[1]: Entering directory ā€˜/usr/src/linux-headers-6.12.47+rpt-rpi-v8’
CC [M]  /home/pi/halow_build/morse_driver/dot11ah/main.o
CC [M]  /home/pi/halow_build/morse_driver/dot11ah/debug.o
CC [M]  /home/pi/halow_build/morse_driver/dot11ah/tx_11n_to_s1g.o
CC [M]  /home/pi/halow_build/morse_driver/dot11ah/rx_s1g_to_11n.o
CC [M]  /home/pi/halow_build/morse_driver/dot11ah/ie.o
/home/pi/halow_build/morse_driver/dot11ah/ie.c: In function ā€˜morse_dot11_insert_ordered_ies_from_ies_mask’:
/home/pi/halow_build/morse_driver/dot11ah/ie.c:529:13: error: too few arguments to function ā€˜ieee80211_is_s1g_short_beacon’
529 |         if (ieee80211_is_s1g_short_beacon(frame_control) ||
|             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/src/linux-headers-6.12.47+rpt-common-rpi/include/net/mac80211.h:20,
from /home/pi/halow_build/morse_driver/dot11ah/ie.c:11:
/usr/src/linux-headers-6.12.47+rpt-common-rpi/include/linux/ieee80211.h:4870:20: note: declared here
4870 | static inline bool ieee80211_is_s1g_short_beacon(__le16 fc, const u8 *variable,
|                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/pi/halow_build/morse_driver/dot11ah/s1g_channels.c: In function ā€˜morse_dot11ah_ignore_channel’:
/home/pi/halow_build/morse_driver/dot11ah/s1g_channels.c:724:70: error: ā€˜IEEE80211_CHAN_IGNORE’ undeclared (first use in this function); did you mean ā€˜IEEE80211_CHAN_NO_HE’?
724 |                         __mors_s1g_map->s1g_channels[ch].ch.flags |= IEEE80211_CHAN_IGNORE;
|                                                                      ^~~~~~~~~~~~~~~~~~~~~
|                                                                      IEEE80211_CHAN_NO_HE
/home/pi/halow_build/morse_driver/dot11ah/s1g_channels.c:724:70: note: each undeclared identifier is reported only once for each function it appears in
/home/pi/halow_build/morse_driver/dot11ah/s1g_channels.c: In function ā€˜morse_dot11ah_fill_channel_list’:
/home/pi/halow_build/morse_driver/dot11ah/s1g_channels.c:756:43: error: ā€˜IEEE80211_CHAN_IGNORE’ undeclared (first use in this function); did you mean ā€˜IEEE80211_CHAN_NO_HE’?
756 |                 if (map_entry->ch.flags & IEEE80211_CHAN_IGNORE)
|                                           ^~~~~~~~~~~~~~~~~~~~~
|                                           IEEE80211_CHAN_NO_HE

Are there manual edits that can fix these? Is there a certain branch that works with bookworm OS?

I got wlan0 to appear got it to set up on 6.1.21-v8+. I’m having trouble connecting still on this older OS version.

Here are some wpa_supplicant logs after running:

sudo MORSE_DEBUG=0xFF wpa_supplicant_s1g -dddt -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant_s1g.conf -D nl80211

Looks like it’s only scanning in traditional wifi frequencies rather than the sub 1 GHz HaLow band. Morse_cli is also having an issue. I am trying it on 1.16.4.

Is there a better example wpa_supplicant.conf file example than the one in the guide?

This is my /etc/wpa_supplicant/wpa_supplicant_s1g.conf file:

ctrl_interface=/var/run/wpa_supplicant_s1g
pmf=2
sae_pwe=1
ap_scan=1

network={
    ssid=ā€œHaLow-ssidā€
    key_mgmt=SAE
    pairwise=CCMP
    psk=ā€œpasswordā€
    frequency=916
}

Here are some logs:

1763595127.950205: nl80211: Scan SSID
1763595127.950218: nl80211: Scan co-located APs on 6 GHz
1763595127.950232: nl80211: Scan extra IEs - hexdump(len=13): 7f 0b 00 00 0a 02 00 00 40 00 00 00 20
1763595127.951406: Scan requested (ret=0) - scan timeout 30 seconds
1763595127.951478: nl80211: Event message available
1763595127.951531: nl80211: Drv Event 33 (NL80211_CMD_TRIGGER_SCAN) received for wlan0
1763595127.951564: wlan0: nl80211: Scan trigger
1763595127.951592: wlan0: Event SCAN_STARTED (47) received
1763595127.951624: wlan0: Own scan request started a scan in 0.000171 seconds
1763595130.088201: RTM_NEWLINK: ifi_index=5 ifname=wlan0 wext ifi_family=0 ifi_flags=0x1003 ([UP])
1763595130.088350: nl80211: Event message available
1763595130.088411: nl80211: Drv Event 34 (NL80211_CMD_NEW_SCAN_RESULTS) received for wlan0
1763595130.088439: wlan0: nl80211: New scan results available
1763595130.088489: nl80211: Scan probed for SSID ā€˜ā€™
1763595130.088551: nl80211: Scan included (5 GHz mapped) frequencies: 5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5745 5765 5785 5805 5825 5845 5865 5885 5190 5230 5270 5310 5510 5550 5590 5630 5670 5755 5795 5835 5875 5210 5290 5530 5610 5775 5855 5250 5570 5815
1763595130.088580: wlan0: Event SCAN_RESULTS (3) received
1763595130.088616: wlan0: Scan completed in 2.136992 seconds
1763595130.088815: nl80211: Received scan results (1 BSSes)
1763595130.088911: Sorted scan results
1763595130.088933: 0c:bf:74:00:25:ab ssid=HaLow-ssid chan=27 qual=0 noise=-92~ level=-12 snr=80* flags=0xb age=356 est=780001
1763595130.088973: IEs - hexdump(len=187): 00 09 53 53 47 2d 48 61 4c 6f 77 01 08 02 04 0b 8c 16 98 24 b0 07 09 55 53 04 c9 45 00 1a 01 24 0b 05 00 00 00 00 00 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00 00 0f ac 08 cc 00 3b 02 81 00 7f 08 04 00 02 02 01 00 01 40 d6 02 64 00 dd 18 00 50 f2 02 01 01 81 00 03 a4 d5 01 27 a4 d5 01 42 43 d5 01 62 32 d5 01 dd 04 50 6f 9a 1e f4 01 20 2d 1a 6e 00 03 ff 00 00 00 00 00 00 00 00 00 41 00 01 00 00 00 00 00 00 00 00 00 00 3d 16 70 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 bf 0c 66 00 80 03 fe ff 00 00 fe ff 00 00 c0 05 02 72 00 fd ff
1763595130.089178: wlan0: BSS: Start scan result update 17

1763595214.551808: nl80211: Data frame filter flags=0x0
1763595214.552219: wlan0: State: DISCONNECTED → DISCONNECTED
1763595214.552415: nl80211: Set wlan0 operstate 0->0 (DORMANT)
1763595214.552603: netlink: Operstate: ifindex=5 linkmode=-1 (no change), operstate=5 (IF_OPER_DORMANT)
1763595214.552817: morse: disable long sleep on ifname wlan0
1763595214.552988: morse: execute morse_cli -i wlan0 long_sleep disable
Command ā€˜morse_cli -i wlan0 long_sleep disable’ failed with error code -1
1763595214.563154: morse: Failed to execute morse_cli to disable long sleep on ifname wlan0
1763595214.563376: EAPOL: External notification - portEnabled=0
1763595214.563548: EAPOL: External notification - portValid=0
1763595214.563721: QM: Clear all active DSCP policies
1763595214.563886: wlan0: CTRL-EVENT-DSCP-POLICY clear_all
1763595214.564074: wlan0: Ignore new scan request for 1.000000 sec since an earlier request is scheduled to trigger sooner
1763595214.564263: nl80211: Event message available
1763595214.564475: nl80211: Drv Event 46 (NL80211_CMD_CONNECT) received for wlan0
1763595214.564639: nl80211: Connect event (status=1 ignore_next_local_disconnect=1763594946)
1763595214.564796: nl80211: Ignore connection failure event triggered during reassociation
1763595214.564974: nl80211: Event message available
1763595214.565173: nl80211: Event message available
1763595214.638336: wlan0: State: DISCONNECTED → SCANNING
```

Here’s an update of my progress of the MM8108-EKH19 USB with a Raspberry Pi on 6.12:

I used this GitHub commit fix build compatibility with Linux 6.12+ and hardened kernels with strict type checks from GitHub - MorseMicro/morse_driver . This still had this error:

 ā€˜IEEE80211_CHAN_IGNORE’ undeclared (first use in this function); did you mean ā€˜IEEE80211_CHAN_NO_HE’?
724 | __mors_s1g_map->s1g_channels\[ch\].ch.flags |= IEEE80211_CHAN_IGNORE;
| ^~~~~~~~~~~~~~~~~~~~~
| IEEE80211_CHAN_NO_HE

I wasn’t sure how to fix this so I changed it to IEEE80211_CHAN_DISABLED. But it hasn’t fully worked yet so if someone knows a better solution let me know.

Then I compiled with:

make  KERNEL_SRC=/lib/modules/$(uname -r)/build  CONFIG_WLAN_VENDOR_MORSE=m CONFIG_MORSE_USER_ACCESS=y  CONFIG_MORSE_VENDOR_COMMAND=y CONFIG_MORSE_USB=y CONFIG_MORSE_SDIO=n

Then I downloaded the firmware from GitHub - MorseMicro/morse-firmware

total 2424
lrwxrwxrwx 1 root root     18 Oct  3 19:55 bcf_boardtype_0801.bin → bcf_mf08651_us.bin
lrwxrwxrwx 1 root root     18 Oct  3 19:55 bcf_boardtype_0802.bin → bcf_mf08651_jp.bin
lrwxrwxrwx 1 root root     15 Oct  3 19:55 bcf_boardtype_0804.bin → bcf_mf15457.bin
lrwxrwxrwx 1 root root     15 Oct  3 19:55 bcf_boardtype_0807.bin → bcf_mf15457.bin
-rwxrwxr-x 1 root root   1435 Oct  3 19:55 bcf_mf08651_4v3_us.bin
-rwxrwxr-x 1 root root    990 Oct  3 19:55 bcf_mf08651_jp.bin
-rwxrwxr-x 1 root root   1753 Oct  3 19:55 bcf_mf08651_us.bin
-rwxrwxr-x 1 root root   2081 Oct  3 19:55 bcf_mf15457.bin
-rwxrwxr-x 1 root root   1030 Oct  3 19:55 bcf_mf28551.bin
-rwxrwxr-x 1 root root   1774 Oct  3 19:55 bcf_mm_hl1_4v3.bin
-rwxrwxr-x 1 root root   1753 Oct  3 19:55 bcf_mm_hl1.bin
-rw-rw-r-- 1 root root 459124 Oct  3 19:55 mm6108.bin
-rw-rw-r-- 1 root root 452388 Oct  3 19:55 mm6108-tlm.bin
-rwxrwxr-x 1 root root 611192 Oct  3 19:55 mm8108b2-flm-rl.bin
-rwxrwxr-x 1 root root 456924 Oct  3 19:55 mm8108b2-rl.bin
-rwxrwxr-x 1 root root 452044 Oct  3 19:55 mm8108b2-tlm-rl.bin

Then I inserted the mods:

sudo depmod -a
sudo modprobe mac80211
sudo modprobe crc7
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/morse/dot11ah.ko
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/morse/morse.ko enable_wiphy=Y country=US

The phy appears after this but I still can’t set wlan1 up.

phy#1
Interface wlan1
ifindex 4
wdev 0x100000001
addr 0c:bf:74:00:1d:b5
type managed
txpower 0.00 dBm
multicast TXQ:
qsz-byt qsz-pkt flows   drops   marks   overlmt    hashcol tx-bytes        tx-packets
0       0       0       0       0       0 00               0

Here is the dmesg logs, please let me know if you know how to fix this or notice something I did wrong:

[11677.366040] morse_usb 1-1.2:1.0: morse_yaps_hw_update_status: to-chip yaps delimiter CRC fail, pkt_count=0
[11677.972547] morse_usb 1-1.2:1.0: morse_yaps_hw_update_status: to-chip yaps delimiter CRC fail, pkt_count=0
[11678.580218] morse_usb 1-1.2:1.0: Command morse_cmd_set_country 3e:71 timed out

Apologies for the late reply @0o0gg! Can you try without the enable_wiphy=Y modparam?

@ajudge I’m also trying to do the same, but I’m using an NVIDIA Jetson Orin Nano. Is there any documentation on how to integrate the MM8108-EKH19 USB directly with the Jetson and connect it to an already set-up access point?