The Openwrt build for MM8108 using USB interface

Dear community!

I plan to have a Raspbery Pi CM4 working with MM8108 by its USB interface.

I discovered there is a build for OpenWrt for Pi 4 wiring MM8108 by SPI (mm8108-ekh01-spi) on this current branch GitHub - MorseMicro/openwrt at 2.9-dev I also have a successful img built for this option.

I wonder if is there any builds for CM4 and MM8108 with USB interface?

Moreover, can you explain what is the board “MM8108-EKH19 ekh19” that I found on the 2.9-dev branch README, isn’t it just a USB dongle?

Many thanks for my first post here.

I would love to share more about my works in the next following post.

Thanks,

VN.

Hi!

The MM8108-EKH19 is this development kit.
Basically an OTS travel router with a HaLow USB dongle :slight_smile: packaged as an evaluation kit. The travel router itself is part of the EKH19 kit.

The MM8108-EKH01 is a Raspberry Pi with a HaLow shield. mmx108-ekh01-sdio will compile a target compatible for both the MM6108-EKH01 and MM8108-EKH01 when the shield is in SDIO mode (the default for the EKH01). mm8108-ekh01-spi will compile an image specific for the MM8108-EKH01 when the shield is configured for SPI mode (this requires moving some 0 Ohm resistors).

For what you want, a Raspberry Pi 4 with the HaLow USB dongle, you can just build the rpi-4-mmeval target, or as most of the targets are the same, you can run the script with the superset target, ekh-bcm2711 - eg ./scripts/morse_setup.sh -i -b ekh-bcm2711 -E, which will configure your build such that it will output all the supported targets for that family. See openwrt/boards/ekh-bcm2711/target_diffconfig at 2.9-dev · MorseMicro/openwrt · GitHub

EDIT: Just to clarify, I realise you’ve been referring to the CM4. The rpi-4-mmeval image will still be appropriate for this image as the cm4 device tree overlays are included in that target image. See from openwrt/target/linux/bcm27xx/image/Makefile at 2.9-dev · MorseMicro/openwrt · GitHub onwards for how that target is defined.

Hi @ajudge

Many thanks for your comprehensive answer. I will try as you suggest and come back with the results.

Regards,

Vu.

The MM8108 build is confirmed to be working with RPi CM4. The photo below show that it is in the Mesh network with a Heltec Halow device

There are some notes that I would like to share during the build:

  1. In the file “feeds.conf.default”, there is a miss-typed “2-9.dev”, it should be “2.9-dev” Someone may want to open a git issue.
  2. During the build, you may want to add FORCE_UNSAFE_CONFIGURE=1 before make: FORCE_UNSAFE_CONFIGURE=1 make V=sc 2>&1 | tee 251011_log.txt
  3. Download and flash the factory image of OpenWrt.( Testing to determine if you are a bot! ). After that, use the Upgrade feature of the LUCI to flash the built result openwrt-morse-2.9-dev-rpi-4-mmeval-squashfs-sysupgrade.img It may be a bit tricky to people who havn’t flashed the CM4 before, but it is not too hard. Just follow the guide https://www.raspberrypi.com/documentation/computers/compute-module.html

Hope these information will help and thanks @ajudge for your support.

I am still in the progress of testing:

  1. Video streaming, bitrate upto 5Mbps
  2. Low latency and high priority telemetry link
  3. Mesh network
  4. External FEM for long range communication

I will up date if getting any progress.

Regards,

Vu.

Glad you got it all working!

The 2.9-dev typo has been fixed. However, I would recommend checking out release version tags - the latest being 2.9.3.

Hi @ajudge

Given the MM8108 is working with CM4 via USB.

Today, I wired up the SDIO interface but it is not working. Check with dmesg to have the output below

root@OpenWrt:~# dmesg
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd083]
[ 0.000000] Linux version 5.15.167 (root@localhost) (aarch64-openwrt-linux-musl-gcc.bin (OpenWrt GCC 12.3.0 r24106-10cc5fcd00) 12.3.0, GNU ld (GNU Binutils) 2.40.0) #0 SMP Thu Oct 9 12:12:48 2025
[ 0.000000] random: crng init done
[ 0.000000] Machine model: Raspberry Pi Compute Module 4 Rev 1.1
[ 0.000000] Reserved memory: created CMA memory pool at 0x000000002ac00000, size 64 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000000000-0x000000003fffffff]
[ 0.000000] DMA32 [mem 0x0000000040000000-0x00000000fbffffff]
[ 0.000000] Normal empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000000000-0x000000003b3fffff]
[ 0.000000] node 0: [mem 0x0000000040000000-0x00000000fbffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x00000000fbffffff]
[ 0.000000] On node 0, zone DMA32: 19456 pages in unavailable ranges
[ 0.000000] On node 0, zone DMA32: 16384 pages in unavailable ranges
[ 0.000000] percpu: Embedded 18 pages/cpu s34904 r8192 d30632 u73728
[ 0.000000] pcpu-alloc: s34904 r8192 d30632 u73728 alloc=184096
[ 0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
[ 0.000000] Detected PIPT I-cache on CPU0
[ 0.000000] CPU features: detected: Spectre-v2
[ 0.000000] CPU features: detected: Spectre-v4
[ 0.000000] CPU features: detected: Spectre-BHB
[ 0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 996912
[ 0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=1 snd_bcm2835.enable_compat_alsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=0 bcm2708_fb.fbheight=0 bcm2708_fb.fbswap=1 smsc95xx.macaddr=D8:3A:DD:8D:07:74 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=tty1 console=ttyAMA0,115200 root=/dev/mmcblk0p2 rootfstype=squashfs,ext4 rootwait
[ 0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] software IO TLB: mapped [mem 0x0000000037400000-0x000000003b400000] (64MB)
[ 0.000000] Memory: 3826248K/4050944K available (8384K kernel code, 918K rwdata, 2140K rodata, 448K init, 554K bss, 159160K reserved, 65536K cma-reserved)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] Tracing variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] Root IRQ handler: gic_handle_irq
[ 0.000000] GIC: Using split EOI/Deactivate mode
[ 0.000000] arch_timer: cp15 timer(s) running at 54.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0xc743ce346, max_idle_ns: 440795203123 ns
[ 0.000001] sched_clock: 56 bits at 54MHz, resolution 18ns, wraps every 4398046511102ns
[ 0.000222] Console: colour dummy device 80x25
[ 0.000514] printk: console [tty1] enabled
[ 0.000555] Calibrating delay loop (skipped), value calculated using timer frequency.. 108.00 BogoMIPS (lpj=540000)
[ 0.000580] pid_max: default: 32768 minimum: 301
[ 0.000835] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.000922] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[ 0.001561] cgroup: Disabling memory control group subsystem
[ 0.002648] rcu: Hierarchical SRCU implementation.
[ 0.003341] smp: Bringing up secondary CPUs …
[ 0.003771] Detected PIPT I-cache on CPU1
[ 0.003838] CPU1: Booted secondary processor 0x0000000001 [0x410fd083]
[ 0.004344] Detected PIPT I-cache on CPU2
[ 0.004386] CPU2: Booted secondary processor 0x0000000002 [0x410fd083]
[ 0.004844] Detected PIPT I-cache on CPU3
[ 0.004886] CPU3: Booted secondary processor 0x0000000003 [0x410fd083]
[ 0.004961] smp: Brought up 1 node, 4 CPUs
[ 0.005019] SMP: Total of 4 processors activated.
[ 0.005032] CPU features: detected: 32-bit EL0 Support
[ 0.005044] CPU features: detected: CRC32 instructions
[ 0.005127] CPU features: emulated: Privileged Access Never (PAN) using TTBR0_EL1 switching
[ 0.005145] CPU: All CPU(s) started at EL2
[ 0.005176] alternatives: patching kernel code
[ 0.013768] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[ 0.013826] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[ 0.015388] pinctrl core: initialized pinctrl subsystem
[ 0.016441] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[ 0.018077] DMA: preallocated 1024 KiB GFP_KERNEL pool for atomic allocations
[ 0.018317] DMA: preallocated 1024 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
[ 0.018705] DMA: preallocated 1024 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[ 0.019162] thermal_sys: Registered thermal governor ‘step_wise’
[ 0.019298] cpuidle: using governor ladder
[ 0.019338] cpuidle: using governor menu
[ 0.019543] ASID allocator initialised with 65536 entries
[ 0.019636] Serial: AMBA PL011 UART driver
[ 0.023839] bcm2835-mbox fe00b880.mailbox: mailbox enabled
[ 0.039955] raspberrypi-firmware soc:firmware: Attached to firmware from 2023-10-17T15:39:16, variant start
[ 0.049959] raspberrypi-firmware soc:firmware: Firmware hash is 30f0c5e4d076da3ab4f341d88e7d505760b93ad7
[ 0.082721] cryptd: max_cpu_qlen set to 1000
[ 0.084742] bcm2835-dma fe007000.dma: DMA legacy API manager, dmachans=0x1
[ 0.086895] SCSI subsystem initialized
[ 0.087051] usbcore: registered new interface driver usbfs
[ 0.087102] usbcore: registered new interface driver hub
[ 0.087142] usbcore: registered new device driver usb
[ 0.087267] usb_phy_generic phy: supply vcc not found, using dummy regulator
[ 0.088562] clocksource: Switched to clocksource arch_sys_counter
[ 0.091994] NET: Registered PF_INET protocol family
[ 0.092526] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[ 0.095293] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[ 0.095359] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.095385] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[ 0.095609] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[ 0.096145] TCP: Hash tables configured (established 32768 bind 32768)
[ 0.096359] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[ 0.096435] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[ 0.096640] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.096683] PCI: CLS 0 bytes, default 64
[ 0.100668] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[ 0.105035] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.171581] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 250)
[ 0.178308] gpio-507 (ant1): hogged as output/high
[ 0.179663] gpio-511 (ant2): hogged as output/low
[ 0.180443] brcm-pcie fd500000.pcie: host bridge /scb/pcie@7d500000 ranges:
[ 0.180475] brcm-pcie fd500000.pcie: No bus range found for /scb/pcie@7d500000, using [bus 00-ff]
[ 0.180521] brcm-pcie fd500000.pcie: MEM 0x0600000000..0x063fffffff → 0x00c0000000
[ 0.180563] brcm-pcie fd500000.pcie: IB MEM 0x0000000000..0x00ffffffff → 0x0400000000
[ 0.240628] brcm-pcie fd500000.pcie: link up, 5.0 GT/s PCIe x1 (SSC)
[ 0.240802] brcm-pcie fd500000.pcie: PCI host bridge to bus 0000:00
[ 0.240821] pci_bus 0000:00: root bus resource [bus 00-ff]
[ 0.240841] pci_bus 0000:00: root bus resource [mem 0x600000000-0x63fffffff] (bus address [0xc0000000-0xffffffff])
[ 0.240894] pci 0000:00:00.0: [14e4:2711] type 01 class 0x060400
[ 0.240980] pci 0000:00:00.0: PME# supported from D0 D3hot
[ 0.244425] pci 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring
[ 0.244561] pci 0000:01:00.0: [1106:3483] type 00 class 0x0c0330
[ 0.244602] pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x00000fff 64bit]
[ 0.244717] pci 0000:01:00.0: PME# supported from D0 D3cold
[ 0.248041] pci_bus 0000:01: busn_res: [bus 01-ff] end is updated to 01
[ 0.248084] pci 0000:00:00.0: BAR 8: assigned [mem 0x600000000-0x6000fffff]
[ 0.248107] pci 0000:01:00.0: BAR 0: assigned [mem 0x600000000-0x600000fff 64bit]
[ 0.248138] pci 0000:00:00.0: PCI bridge to [bus 01]
[ 0.248154] pci 0000:00:00.0: bridge window [mem 0x600000000-0x6000fffff]
[ 0.248325] pcieport 0000:00:00.0: enabling device (0000 → 0002)
[ 0.248454] pcieport 0000:00:00.0: PME: Signaling with IRQ 42
[ 0.248770] pcieport 0000:00:00.0: AER: enabled with IRQ 42
[ 0.249216] bcm2708_fb soc:fb: Unable to determine number of FBs. Disabling driver.
[ 0.249238] bcm2708_fb: probe of soc:fb failed with error -2
[ 0.255200] Serial: 8250/16550 driver, 1 ports, IRQ sharing enabled
[ 0.255984] iproc-rng200 fe104000.rng: hwrng registered
[ 0.256106] vc-mem: phys_addr:0x00000000 mem_base=0x3ec00000 mem_size:0x40000000(1024 MiB)
[ 0.256575] gpiomem-bcm2835 fe200000.gpiomem: Initialised: Registers at 0xfe200000
[ 0.263968] brd: module loaded
[ 0.267206] loop: module loaded
[ 0.268012] Loading iSCSI transport class v2.0-870.
[ 0.270166] bcmgenet fd580000.ethernet: GENET 5.0 EPHY: 0x0000
[ 0.438618] unimac-mdio unimac-mdio.-19: Broadcom UniMAC MDIO bus
[ 0.439481] xhci_hcd 0000:01:00.0: enabling device (0000 → 0002)
[ 0.439550] xhci_hcd 0000:01:00.0: xHCI Host Controller
[ 0.439581] xhci_hcd 0000:01:00.0: new USB bus registered, assigned bus number 1
[ 0.440179] xhci_hcd 0000:01:00.0: hcc params 0x002841eb hci version 0x100 quirks 0x0003800000000890
[ 0.440610] xhci_hcd 0000:01:00.0: xHCI Host Controller
[ 0.440634] xhci_hcd 0000:01:00.0: new USB bus registered, assigned bus number 2
[ 0.440658] xhci_hcd 0000:01:00.0: Host supports USB 3.0 SuperSpeed
[ 0.440859] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[ 0.440884] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 0.440902] usb usb1: Product: xHCI Host Controller
[ 0.440917] usb usb1: Manufacturer: Linux 5.15.167 xhci-hcd
[ 0.440931] usb usb1: SerialNumber: 0000:01:00.0
[ 0.441230] hub 1-0:1.0: USB hub found
[ 0.441274] hub 1-0:1.0: 1 port detected
[ 0.441699] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[ 0.441725] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[ 0.441743] usb usb2: Product: xHCI Host Controller
[ 0.441757] usb usb2: Manufacturer: Linux 5.15.167 xhci-hcd
[ 0.441771] usb usb2: SerialNumber: 0000:01:00.0
[ 0.442054] hub 2-0:1.0: USB hub found
[ 0.442094] hub 2-0:1.0: 4 ports detected
[ 0.442792] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 0.442885] dwc_otg: FIQ enabled
[ 0.442890] dwc_otg: NAK holdoff enabled
[ 0.442895] dwc_otg: FIQ split-transaction FSM enabled
[ 0.442903] Module dwc_common_port init
[ 0.443207] usbcore: registered new interface driver uas
[ 0.443281] usbcore: registered new interface driver usb-storage
[ 0.443365] usbcore: registered new interface driver usbserial_generic
[ 0.443395] usbserial: USB Serial support registered for generic
[ 0.443434] usbcore: registered new interface driver cp210x
[ 0.443466] usbserial: USB Serial support registered for cp210x
[ 0.443513] usbcore: registered new interface driver ftdi_sio
[ 0.443539] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 0.443613] usbcore: registered new interface driver pl2303
[ 0.443639] usbserial: USB Serial support registered for pl2303
[ 0.443718] mousedev: PS/2 mouse device common for all mice
[ 0.444261] bcm2835-wdt bcm2835-wdt: Broadcom BCM2835 watchdog timer
[ 0.449582] sdhci: Secure Digital Host Controller Interface driver
[ 0.449591] sdhci: Copyright(c) Pierre Ossman
[ 0.449790] mmc-bcm2835 fe300000.mmcnr: could not get clk, deferring probe
[ 0.449945] sdhci-pltfm: SDHCI platform and OF driver helper
[ 0.454151] NET: Registered PF_INET6 protocol family
[ 0.454640] Segment Routing with IPv6
[ 0.454659] In-situ OAM (IOAM) with IPv6
[ 0.454694] NET: Registered PF_PACKET protocol family
[ 0.454717] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 0.454768] 8021q: 802.1Q VLAN Support v1.8
[ 0.455139] Key type .fscrypt registered
[ 0.455147] Key type fscrypt-provisioning registered
[ 0.457900] uart-pl011 fe201000.serial: there is not valid maps for state default
[ 0.457972] uart-pl011 fe201000.serial: cts_event_workaround enabled
[ 0.458044] fe201000.serial: ttyAMA0 at MMIO 0xfe201000 (irq = 17, base_baud = 0) is a PL011 rev2
[ 0.738551] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[ 0.740978] printk: console [ttyAMA0] enabled
[ 0.919684] usb 1-1: New USB device found, idVendor=2109, idProduct=3431, bcdDevice= 4.20
[ 0.981823] bcm2835-power bcm2835-power: Broadcom BCM2835 power domains driver
[ 0.986622] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
[ 0.991921] mmc-bcm2835 fe300000.mmcnr: mmc_debug:0 mmc_debug2:0
[ 0.998706] usb 1-1: Product: USB2.0 Hub
[ 0.999524] hub 1-1:1.0: USB hub found
[ 1.004790] mmc-bcm2835 fe300000.mmcnr: DMA channel allocated
[ 1.009796] hub 1-1:1.0: 4 ports detected
[ 1.049140] of_cfs_init
[ 1.049198] of_cfs_init: OK
[ 1.049550] clk: Disabling unused clocks
[ 1.132293] mmc1: new high speed SDIO card at address 0001
[ 1.681833] uart-pl011 fe201000.serial: no DMA platform data
[ 1.723581] mmc0: SDHCI controller on fe340000.mmc [fe340000.mmc] using ADMA
[ 1.730763] Waiting for root device /dev/mmcblk0p2…
[ 1.797432] mmc0: new DDR MMC card at address 0001
[ 1.802641] mmcblk0: mmc0:0001 AJTD4R 14.6 GiB
[ 1.807676] mmcblk0: p1 p2
[ 1.810601] mmcblk0: mmc0:0001 AJTD4R 14.6 GiB
[ 1.815322] mmcblk0boot0: mmc0:0001 AJTD4R 4.00 MiB
[ 1.820709] mmcblk0boot1: mmc0:0001 AJTD4R 4.00 MiB
[ 1.825808] mmcblk0rpmb: mmc0:0001 AJTD4R 4.00 MiB, chardev (247:0)
[ 1.850021] VFS: Mounted root (squashfs filesystem) readonly on device 179:2.
[ 1.857457] Freeing unused kernel memory: 448K
[ 1.861978] Run /sbin/init as init process
[ 1.866066] with arguments:
[ 1.866068] /sbin/init
[ 1.866070] with environment:
[ 1.866072] HOME=/
[ 1.866074] TERM=linux
[ 1.958673] init: Console is alive
[ 1.962170] init: - watchdog -
[ 2.351788] kmodloader: loading kernel modules from /etc/modules-boot.d/
[ 2.410287] kmodloader: done loading kernel modules from /etc/modules-boot.d/*
[ 2.418382] init: - preinit -
[ 4.792437] loop0: detected capacity change from 0 to 614400
[ 4.838556] loop0: detected capacity change from 614400 to 531072
[ 4.927046] F2FS-fs (loop0): Mounted with checkpoint version = 47aeeff
[ 4.934054] mount_root: switching to f2fs overlay
[ 4.940139] overlayfs: null uuid detected in lower fs ‘/’, falling back to xino=off,index=off,nfs_export=off.
[ 4.962851] insmod: module is already loaded - fat
[ 4.968841] insmod: module is already loaded - vfat
[ 4.980939] FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
[ 4.991591] urandom-seed: Seeding with /etc/urandom.seed
[ 5.016620] procd: - early -
[ 5.019583] procd: - watchdog -
[ 5.552894] procd: - watchdog -
[ 5.556337] procd: - ubus -
[ 5.611129] procd: - init -
[ 5.710311] morsechipreset: unable to reset as MM_RESET not in gpio-line-names in device tree
[ 5.775279] kmodloader: loading kernel modules from /etc/modules.d/*
[ 5.800209] tun: Universal TUN/TAP device driver, 1.6
[ 5.807799] i2c_dev: i2c /dev entries driver
[ 5.815710] mc: Linux media interface: v0.10
[ 5.822102] videodev: Linux video capture interface: v2.00
[ 5.829518] hid: raw HID events driver (C) Jiri Kosina
[ 5.835338] vc_sm_cma: module is from the staging directory, the quality is unknown, you have been warned.
[ 5.845413] bcm2835_vc_sm_cma_probe: Videocore shared memory driver
[ 5.851731] [vc_sm_connected_init]: start
[ 5.855971] [vc_sm_connected_init]: installed successfully
[ 5.863336] bcm2835_mmal_vchiq: module is from the staging directory, the quality is unknown, you have been warned.
[ 5.874893] bcm2835_isp: module is from the staging directory, the quality is unknown, you have been warned.
[ 5.886981] bcm2835-isp bcm2835-isp: Device node output[0] registered as /dev/video13
[ 5.894971] bcm2835-isp bcm2835-isp: Device node capture[0] registered as /dev/video14
[ 5.903002] bcm2835-isp bcm2835-isp: Device node capture[1] registered as /dev/video15
[ 5.911020] bcm2835-isp bcm2835-isp: Device node stats[2] registered as /dev/video16
[ 5.918773] bcm2835-isp bcm2835-isp: Register output node 0 with media controller
[ 5.926252] bcm2835-isp bcm2835-isp: Register capture node 1 with media controller
[ 5.933825] bcm2835-isp bcm2835-isp: Register capture node 2 with media controller
[ 5.941392] bcm2835-isp bcm2835-isp: Register capture node 3 with media controller
[ 5.950785] bcm2835-isp bcm2835-isp: Device node output[0] registered as /dev/video20
[ 5.958763] bcm2835-isp bcm2835-isp: Device node capture[0] registered as /dev/video21
[ 5.966780] bcm2835-isp bcm2835-isp: Device node capture[1] registered as /dev/video22
[ 5.974781] bcm2835-isp bcm2835-isp: Device node stats[2] registered as /dev/video23
[ 5.982531] bcm2835-isp bcm2835-isp: Register output node 0 with media controller
[ 5.990017] bcm2835-isp bcm2835-isp: Register capture node 1 with media controller
[ 5.997582] bcm2835-isp bcm2835-isp: Register capture node 2 with media controller
[ 6.005151] bcm2835-isp bcm2835-isp: Register capture node 3 with media controller
[ 6.012752] bcm2835-isp bcm2835-isp: Loaded V4L2 bcm2835-isp
[ 6.021493] bcm2835_codec: module is from the staging directory, the quality is unknown, you have been warned.
[ 6.033631] bcm2835-codec bcm2835-codec: Device registered as /dev/video10
[ 6.040538] bcm2835-codec bcm2835-codec: Loaded V4L2 decode
[ 6.047514] bcm2835-codec bcm2835-codec: Device registered as /dev/video11
[ 6.054408] bcm2835-codec bcm2835-codec: Loaded V4L2 encode
[ 6.062017] bcm2835-codec bcm2835-codec: Device registered as /dev/video12
[ 6.068909] bcm2835-codec bcm2835-codec: Loaded V4L2 isp
[ 6.075491] bcm2835-codec bcm2835-codec: Device registered as /dev/video18
[ 6.082389] bcm2835-codec bcm2835-codec: Loaded V4L2 image_fx
[ 6.090002] bcm2835-codec bcm2835-codec: Device registered as /dev/video31
[ 6.096880] bcm2835-codec bcm2835-codec: Loaded V4L2 encode_image
[ 6.103996] snd_bcm2835: module is from the staging directory, the quality is unknown, you have been warned.
[ 6.115119] GACT probability on
[ 6.118619] Mirror/redirect action on
[ 6.124242] u32 classifier
[ 6.126954] input device check on
[ 6.130637] Actions configured
[ 6.138364] usbcore: registered new interface driver cdc_acm
[ 6.144049] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
[ 6.152307] Loading modules backported from Linux version v6.1.110-0-g5f55cad62cc9d
[ 6.159966] Backport generated by backports.git v6.1.110-1-0-g965f73fc
[ 6.169523] usbcore: registered new interface driver lan78xx
[ 6.182099] usbcore: registered new interface driver usbhid
[ 6.187682] usbhid: USB HID core driver
[ 6.194117] usbcore: registered new interface driver uvcvideo
[ 6.202794] xt_time: kernel timezone is -0000
[ 6.207611] usbcore: registered new interface driver cdc_ether
[ 6.228602] Morse Micro Dot11ah driver registration. Version 0-rel_1_16_4_2025_Sep_18
[ 6.269360] morse micro driver registration. Version 0-rel_1_16_4_2025_Sep_18
[ 6.276592] usbcore: registered new interface driver morse_usb
[ 6.296830] PPP generic driver version 2.4.2
[ 6.301661] NET: Registered PF_PPPOX protocol family
[ 6.307215] usbcore: registered new interface driver rndis_host
[ 6.314294] wireguard: WireGuard 1.0.0 loaded. See ``www.wireguard.com`` for information.
[ 6.322149] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[ 6.333654] batman_adv: B.A.T.M.A.N. advanced 2023.1-openwrt-7 (compatibility version 15) loaded
[ 6.392177] brcmfmac: brcmf_fw_alloc_request: using brcm/brcmfmac43455-sdio for chip BCM4345/6
[ 6.400926] brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.bin failed with error -2
[ 6.413190] brcmfmac mmc1:0001:1: Falling back to sysfs fallback for: brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.bin
[ 6.413267] usbcore: registered new interface driver brcmfmac
[ 6.433571] kmodloader: done loading kernel modules from /etc/modules.d/*
[ 6.653204] brcmfmac: brcmf_c_preinit_dcmds: Firmware: BCM4345/6 wl0: Jul 29 2022 02:15:20 version 7.45.250 (70e9766 CY) FWID 01-e53e306b
[ 6.729684] brcmfmac mmc1:0001:1 wlan-07-75: renamed from wlan0
[ 8.630537] bcmgenet fd580000.ethernet: configuring instance for external RGMII (RX delay)
[ 8.639048] bcmgenet fd580000.ethernet eth0: Link is Down
[ 8.644480] br-ahwlan: port 1(eth0) entered blocking state
[ 8.650048] br-ahwlan: port 1(eth0) entered disabled state
[ 8.655697] device eth0 entered promiscuous mode
[ 9.870484] brcmfmac mmc1:0001:1 phy0-sta0: renamed from wlan-07-75
[ 11.217247] IPv6: ADDRCONF(NETDEV_CHANGE): phy0-sta0: link becomes ready
[ 27.368815] bcmgenet fd580000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[ 27.377191] br-ahwlan: port 1(eth0) entered blocking state
[ 27.382679] br-ahwlan: port 1(eth0) entered forwarding state
[ 27.388474] IPv6: ADDRCONF(NETDEV_CHANGE): br-ahwlan: link becomes ready
...
[ 34.688806]
[ 34.688806] SSID:
[ 34.688806] Encryption: sae
[ 34.688806] Country: US
[ 34.688806] Channel: 8
[ 34.688806] Bandwidth: 4
[ 34.688806]
[ 34.688806] phy0-sta0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo state UP group default qlen 1000
[ 34.688806] link/ether d8:3a:dd:8d:07:75 brd ff:ff:ff:ff:ff:ff
[ 34.688806] inet 192.168.1.12/24 brd 192.168.1.255 scope global phy0-sta0
[ 34.688806] br-ahwlan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
[ 34.688806] link/ether d8:3a:dd:8d:07:74 brd ff:ff:ff:ff:ff:ff

Can you help to give a short guide to enable the SDIO interface?

Thanks,

V.

Hi @ajudge

Given the MM8108 is working with CM4 via USB.

Today, I wired up the SDIO interface but it is not working. Check with dmesg to have the output below

251028_dmesg.txt (23.2 KB)

(my previous message is flagged, I am not sure why, perhaps the content of the dmesg?)

Can you help to give a short guide to enable the SDIO interface?

Thanks,

V.

Hi @bigboy061293

The log triggered a flag for something silly. I have restored the post.

From your log, it looks like the MMC bus is detecting the Broadcom Wi-Fi chip and hence trying to operate that. When using Wi-Fi HaLow on the Raspberry Pi 4’s, the Broadcom Wi-Fi must be disabled. We do this by remapping the MMC pins to the GPIOs
We provide an OpenWrt image target specifically for this, mmx108-ekh01-sdio, which you should consider flashing to your CM4 instead of rpi-4-mmeval.

For your benefit, see our distroconfig.txt, which applies the devicetree changes required at boot time to disable the Broadcom Wi-Fi, and enable the Morse Micro device tree overlays, notable lines are

dtoverlay=sdio,poll_once=on
dtoverlay=mm_wlan
dtoverlay=morse-ps

Note that the mm_wlan devicetree overlay uses GPIOs 22, 23, 24, 25, 26, 27 for SDIO (SD_CLK, SD_CMD, SD_D0, SD_D1, SD_D2, SD_D3 respectively); GPIO5 for reset; GPIO3 for WAKE and GPIO7 for BUSY.

Thank you @ajudge

My previous post showed that the OpenWrt on CM4 is working with MM8108 by the USB interface. To be clarified, this USB one of 4 from VL805 chip. It convert the CM4’s PCIe into USB ports.

I am struggling with the native USB2.0 of CM4

What I actually intend is to hook the MM8108 to this USB2.0 port.

The current issue is that I can not make the MM8108 detect by OpenWrt. I have add dtoverlay=dwc2,dr_mode=host to /boot/config.txt. When plug in the MM8108 dongle or any USB devices (mouse, keyboard…) into this port, the lsusb or dmesg does not show new devices activities

I have learnt that we have to install the driver kmod-usb-dwc2. Is it correct? If yes, what do we need to do when building the OpenWrt? I have tried opkg update and opkg install kmod-usb-dwc2 but getting error “package not found”.

If building the OpenWrt is the must, does make menuconfig change the results of ./scripts/morse_setup.sh -i -b ekh-bcm2711 -E?

Thanks,

V.

Hi @bigboy061293

On the Raspberry Pi 4B, the dwc driver will be used for the OTG controller attached to the USB-C port. I assume this is the same as you are showing for the CM4.

If this port is definitely the DesignWare controller, then yes - this should be the correct driver.

When building OpenWrt, make sure PACKAGE_kmod-usb-dwc2 is selected in menuconfig. For my build, this defaulted to m as we compile all kmods. You will find the compiled .ipk in the following directory bin/targets/bcm27xx/bcm2711/packages/kmod-usb-dwc2_5.15.167-1_aarch64_cortex-a72.ipk. You should be able to scp this to your device and opkg install the `.ipk

The -b flag of morse_setup.sh rebuilds your configuration based on the fragments in the boards/ directory. The -i flag reinitialises the buildsystem entirely (updating feeds etc). For adhoc builds, run the morse_setup.sh script once, and use make menuconfig afterwards to modify configuration.

If you want to capture these changes to distribute to others - make changes to the fragment files in boards/ so others can initialise the tree with morse_setup.sh.

Thanks @ajudge so much for your instruction.

I have sucessfully built and installed in package. By plug-in the MM8108 into this USBC port, the dmesg showed that the USB driver is loaded. However, I can not see the Halow wireless interface by iwinfo. I attach here 2 dmesg logs: USBC port vs VIA PCIe USB Hub port (where the driver is working normally). Can you please have a look to inspect?

Thanks.

dmesg_VIA_PCIe_Hub.txt (33 KB)

dmesg_USBC.txt (31.7 KB)

P/S: lsusb shows different bus assigned, could it be one of the potential reasons?

USBC port
root@OpenWrt:~# lsusb
Bus 003 Device 001: ID 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 002: ID 2109:3431
Bus 002 Device 001: ID 1d6b:0003
Bus 003 Device 002: ID 325b:8100
USB VIA PCIe HUB
root@OpenWrt:~# lsusb
Bus 003 Device 001: ID 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 003: ID 325b:8100
Bus 001 Device 002: ID 2109:3431
Bus 002 Device 001: ID 1d6b:0003

What would clarify would be the contents of /etc/config/wireless and the output of logread. If you have the device connected at first boot, it’s more likely to be setup correctly in /etc/config/wireless. In general, upstream OpenWrt does not handle USB devices moving between ports well.

To try doing this manually, while this is attached I would recommend:

  • running wifi down
  • removing /etc/config/wireless
  • running wifi config
  • confirming that your device appears in /etc/config/wireless
  • setting it up how you desire

We have made some improvement to hotplug for our next release which should make what you’re doing (i.e. switching the device between USB ports) more reliable.

In both cases the driver has successfully probed the hardware! This should have all come up!

This is expected, the USBC port is connected to a different USB root hub. So no issues here.

Please show the output of ifconfig -a as well :slight_smile:, as James mentioned it’s likely there is stale configuration such that the interface is being configured as disabled by default.

Dear @james.haggerty and @ajudge,

Thank you so much for the support.

I followed James’s instruction and get it working now. Below if the comparision if radio1 section between 2 /etc/config/wireless files

Before

config wifi-device ‘radio1’
option type ‘morse’
option path ‘scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3:1.0’
option band ‘s1g’
option hwmode ‘11ah’
option reconf ‘0’
option bcf ‘bcf_mf15457.bin’
option country ‘US’
option channel ‘8’
option disabled ‘1’
option txpower ‘10’
option disabled_by_hotplug ‘1’

After

config wifi-device ‘radio1’
option type ‘morse’
option path ‘platform/soc/fe980000.usb/usb3/3-1/3-1:1.0’
option band ‘s1g’
option hwmode ‘11ah’
option reconf ‘0’
option bcf ‘bcf_mf15457.bin’
option country ‘US’
option channel ‘8’

ifconfig -a command as @ajudge mentioned

root@OpenWrt:~# ifconfig -a
br-ahwlan Link encap:Ethernet  HWaddr D8:3A:DD:8D:07:74
inet addr:192.168.0.211  Bcast:192.168.0.255  Mask:255.255.255.0
inet6 addr: fe80::da3a:ddff:fe8d:774/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:2747 errors:0 dropped:0 overruns:0 frame:0
TX packets:2884 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:408315 (398.7 KiB)  TX bytes:1913928 (1.8 MiB)

eth0      Link encap:Ethernet  HWaddr D8:3A:DD:8D:07:74
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:2694 errors:0 dropped:4 overruns:0 frame:0
TX packets:3286 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:442147 (431.7 KiB)  TX bytes:1933632 (1.8 MiB)

lo        Link encap:Local Loopback
inet addr:127.0.0.1  Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING  MTU:65536  Metric:1
RX packets:1018 errors:0 dropped:0 overruns:0 frame:0
TX packets:1018 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:76326 (74.5 KiB)  TX bytes:76326 (74.5 KiB)

morse0    Link encap:UNSPEC  HWaddr 12-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
BROADCAST MULTICAST  MTU:1500  Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

phy1-sta0 Link encap:Ethernet  HWaddr D8:3A:DD:8D:07:75
inet addr:192.168.1.12  Bcast:192.168.1.255  Mask:255.255.255.0
inet6 addr: fe80::da3a:ddff:fe8d:775/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:148 errors:0 dropped:0 overruns:0 frame:0
TX packets:166 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22678 (22.1 KiB)  TX bytes:19234 (18.7 KiB)

wlan0     Link encap:Ethernet  HWaddr D8:3A:DD:8D:07:74
inet6 addr: fe80::da3a:ddff:fe8d:774/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:369 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5860 (5.7 KiB)  TX bytes:48704 (47.5 KiB)

Regards,

V