Raspberry Pi Zero 2W with FGH100M

I am trying to connect a FGH100M module from Quectel on a Raspberry Pi Zero 2W in SPI mode with Raspbian. The module I am using is made by SeedStudio it is specifically this one: SeedStudio Halow. I cannot get the module to work with the Pi, it shows up, uploads the firmware then I cannot communicate with it anymore according to the dmesg logs. I basically followed the Linux Porting Guide APPNOTE 2.4 with version morse micro 1.15.

  1. Compiling the rpi kernel with the Github branch mm/rpi-6.6.31/1.15.x making sure to enable both crypto settings (CONFIG_CRYPTO_CCM=y and CONFIG_CRYPTO_GCM=y ) in the kernel config file. Then i compile everything and create a raspberry pi image and it works, when running uname -a I get the desired output Linux halow 6.6.31-v8-mm+ #1 SMP PREEMPT Tue Sep 23 15:13:59 EDT 2025 aarch64 GNU/Linux I added mm to the kernel name, it confirms that the right kernel is loaded.

  2. On the computer that I used to compile the Kernel, I then built the morse micro driver I took the version 1.15.3 directly from Github: morse_driver I then compile following the instruction in the app note making sure to enable the SPI with CONFIG_MORSE_SPI=y I then moved the files to /lib/modules/6.6.31-v8-mm+/

  3. I then build the user space software following the guide I used the hostap repo from github at version 1.15. In this repo there is the folder wpa_supplicant and hostapd that I can sucessfully compile and link to /user/local/bin at the end i get wpa_supplicant_s1g, wpa_cli_s1g, wpa_passphrase_s1g, hostapd_s1g, hostapd_cli_s1g.

  4. I then built morse_cli again at tag 1.15.3 I follow the instruction in the porting guide to compile and link, it works without issue, I linked morse_cli to /usr/local/bin.

  5. I the cloned the firmare files from morse-firmware at version 1.15 i followed the guide, but ultimately had to create a symlink the firmware file from bcf_default.bin to bcf_fgh100mhaamd.bin with this command: ln -s /lib/firmware/morse/bcf_fgh100mhaamd.bin /lib/firmware/morse/bcf_default.binOtherwise there was an error in the dmesg saying the firmware was not found.

  6. I the created the device tree overlay with the following file content:

    /dts-v1/;
    /plugin/;
    / {
    compatible = "brcm,bcm2835", "brcm,bcm2836","brcm,bcm2708", "brcm,bcm2709", "brcm,bcm2711";
        fragment@0 {
            target = <&spi0>;
            frag0: __overlay__ {
                pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
                cs-gpios = <&gpio 8 1>;
                #address-cells = <1>;
                #size-cells = <0>;
                status = "okay";
    
                mm6108: mm6108@0 {
                    compatible = "morse,mm610x-spi";
                    reg = <0>; /* CE0 */
                    reset-gpios = <&gpio 5 0>;
                    power-gpios = <&gpio 3 0>,
                        <&gpio 7 0>;
                    spi-irq-gpios = <&gpio 25 0>;
                    spi-max-frequency = <50000000>;
                    status = "okay";
                };
            };
        };
    };
    
  7. Then I compiled the $(DTC) -@ -O dtb $(FLAGS) -o overlay.dtbo overlay.dts and added the resulting .dtbo to the raspberry pi /boot/firmware/overlays folders and loaded the overlay in the config.txt file

  8. I wired up the module following the schematics of the module and the .dts file above, I noticed that some pins are not connected to the modules, specifically the pins WAKUP_IN and GPIO0 (busy) are not connected to the header, I bridged the jumper R17 and R10 to allow for control, but it breaks the communication completly, so I left it as-is.

  9. Next it was finally time to bring up the interface as in section 7.1 of the APPNOTE, it did not work using insmod, I had to use modeprobe instead otherwise it was giving a lot of error about 80211 missing dependency

At this point everything should be ready to be used, but I get error messages in dmesg that seems to indicate that both .ko modules and the overlays get loaded correctly, it seems to load the firmware, then proceed to reboot the hardware, then there is no communication working and a bunch of error. So here is the relevent dmesg output from the Raspberry Pi:

[    8.057899] dot11ah: loading out-of-tree module taints kernel.
[    8.060255] Morse Micro Dot11ah driver registration. Version 0-rel_1_15_3_2025_Apr_16
[    9.210308] morse micro driver registration. Version 0-rel_1_15_3_2025_Apr_16
[    9.210609] morse_spi spi0.0: morse_of_probe: Reading gpio pins configuration from device tree
[    9.210684] uaccess char driver major number is 236
[    9.211047] morse_io: Device node '/dev/morse_io' created successfully
[    9.284430] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 444304, crc32 0x1c6a0f92
[    9.291904] morse_spi spi0.0: Loaded BCF from morse/bcf_default.bin, size 1251, crc32 0x941b2a82
[    9.434024] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    9.434049] Bluetooth: BNEP filters: protocol multicast
[    9.434069] Bluetooth: BNEP socket layer initialized
[    9.442422] Bluetooth: MGMT ver 1.22
[    9.460521] NET: Registered PF_ALG protocol family
[    9.934031] morse_spi spi0.0: Driver loaded with kernel module parameters
[    9.934084] morse_spi spi0.0:     slow_clock_mode                         : 0
[    9.934097] morse_spi spi0.0:     enable_1mhz_probes                      : Y
[    9.934106] morse_spi spi0.0:     enable_sched_scan                       : Y
[    9.934114] morse_spi spi0.0:     enable_hw_scan                          : Y
[    9.934122] morse_spi spi0.0:     enable_pv1                              : N
[    9.934130] morse_spi spi0.0:     enable_page_slicing                     : N
[    9.934138] morse_spi spi0.0:     log_modparams_on_boot                   : Y
[    9.934146] morse_spi spi0.0:     enable_mcast_rate_control               : N
[    9.934154] morse_spi spi0.0:     enable_mcast_whitelist                  : Y
[    9.934163] morse_spi spi0.0:     ocs_type                                : 1
[    9.934171] morse_spi spi0.0:     enable_wiphy                            : 0
[    9.934179] morse_spi spi0.0:     enable_auto_mpsw                        : Y
[    9.934188] morse_spi spi0.0:     duty_cycle_probe_retry_threshold        : 2500
[    9.934196] morse_spi spi0.0:     duty_cycle_mode                         : 0
[    9.934204] morse_spi spi0.0:     enable_auto_duty_cycle                  : Y
[    9.934214] morse_spi spi0.0:     dhcpc_lease_update_script               : /morse/scripts/dhcpc_update.sh
[    9.934223] morse_spi spi0.0:     enable_ibss_probe_filtering             : Y
[    9.934231] morse_spi spi0.0:     enable_dhcpc_offload                    : N
[    9.934239] morse_spi spi0.0:     enable_arp_offload                      : N
[    9.934247] morse_spi spi0.0:     enable_bcn_change_seq_monitor           : 0
[    9.934255] morse_spi spi0.0:     enable_cac                              : 0
[    9.934263] morse_spi spi0.0:     max_mc_frames                           : 10
[    9.934272] morse_spi spi0.0:     tx_max_power_mbm                        : 2200
[    9.934280] morse_spi spi0.0:     enable_twt                              : Y
[    9.934288] morse_spi spi0.0:     enable_mac80211_connection_monitor      : N
[    9.934297] morse_spi spi0.0:     enable_airtime_fairness                 : N
[    9.934304] morse_spi spi0.0:     enable_raw                              : Y
[    9.934312] morse_spi spi0.0:     max_aggregation_count                   : 0
[    9.934320] morse_spi spi0.0:     max_rate_tries                          : 1
[    9.934328] morse_spi spi0.0:     max_rates                               : 4
[    9.934336] morse_spi spi0.0:     enable_watchdog_reset                   : N
[    9.934345] morse_spi spi0.0:     watchdog_interval_secs                  : 30
[    9.934353] morse_spi spi0.0:     enable_watchdog                         : Y
[    9.934362] morse_spi spi0.0:     country                                 : AU
[    9.934369] morse_spi spi0.0:     enable_cts_to_self                      : N
[    9.934377] morse_spi spi0.0:     enable_rts_8mhz                         : N
[    9.934385] morse_spi spi0.0:     enable_trav_pilot                       : Y
[    9.934392] morse_spi spi0.0:     enable_sgi_rc                           : Y
[    9.934401] morse_spi spi0.0:     enable_mbssid_ie                        : N
[    9.934409] morse_spi spi0.0:     virtual_sta_max                         : 0
[    9.934417] morse_spi spi0.0:     thin_lmac                               : 0
[    9.934425] morse_spi spi0.0:     enable_dynamic_ps_offload               : Y
[    9.934433] morse_spi spi0.0:     enable_ps                               : 2
[    9.934442] morse_spi spi0.0:     enable_subbands                         : 2
[    9.934449] morse_spi spi0.0:     enable_survey                           : Y
[    9.934457] morse_spi spi0.0:     mcs10_mode                              : 0
[    9.934465] morse_spi spi0.0:     mcs_mask                                : 1023
[    9.934474] morse_spi spi0.0:     no_hwcrypt                              : 0
[    9.934482] morse_spi spi0.0:     enable_ext_xtal_init                    : N
[    9.934491] morse_spi spi0.0:     enable_otp_check                        : 1
[    9.934499] morse_spi spi0.0:     bcf                                     :
[    9.934507] morse_spi spi0.0:     serial                                  : default
[    9.934515] morse_spi spi0.0:     debug_mask                              : 8
[    9.934524] morse_spi spi0.0:     tx_status_lifetime_ms                   : 15000
[    9.934533] morse_spi spi0.0:     tx_queued_lifetime_ms                   : 1000
[    9.934541] morse_spi spi0.0:     max_txq_len                             : 32
[    9.934549] morse_spi spi0.0:     default_cmd_timeout_ms                  : 600
[    9.934557] morse_spi spi0.0:     hw_reload_after_stop                    : 5
[    9.934565] morse_spi spi0.0:     enable_short_bcn_as_dtim_override       : -1
[    9.934574] morse_spi spi0.0:     fw_bin_file                             :
[    9.934583] morse_spi spi0.0:     sdio_reset_time                         : 400
[    9.934591] morse_spi spi0.0:     macaddr_suffix                          : 00:00:00
[    9.934600] morse_spi spi0.0:     macaddr_octet                           : 255
[    9.934608] morse_spi spi0.0:     max_total_vendor_ie_bytes               : 514
[    9.934619] morse_spi spi0.0:     coredump_include                        : 1
[    9.934627] morse_spi spi0.0:     coredump_method                         : 1
[    9.934657] morse_spi spi0.0:     enable_coredump                         : Y
[    9.934668] morse_spi spi0.0:     spi_use_edge_irq                        : N
[    9.934678] morse_spi spi0.0:     spi_clock_speed                         : 50000000
[    9.934686] morse_spi spi0.0:     enable_mm_vendor_ie                     : Y
[    9.934694] morse_spi spi0.0:     fixed_guard                             : 0
[    9.934703] morse_spi spi0.0:     fixed_ss                                : 1
[    9.934711] morse_spi spi0.0:     fixed_bw                                : 2
[    9.934719] morse_spi spi0.0:     fixed_mcs                               : 4
[    9.934727] morse_spi spi0.0:     enable_fixed_rate                       : N
[   10.481144] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[   10.541821] morse_spi spi0.0: morse_skbq_tx fail: -19
[   10.541861] morse_spi spi0.0: Command morse_cmd_add_if 04:10 failed with rc -19 (0xffffffed)
[   10.541876] morse_spi spi0.0: morse_cmd_add_if failed -19
[   10.541923] morse_spi spi0.0: morse_mac_restart: Restarting HW
[   11.005706] morse_spi spi0.0: Loaded firmware from morse/mm6108.bin, size 444304, crc32 0x1c6a0f92
[   11.005854] morse_spi spi0.0: Loaded BCF from morse/bcf_default.bin, size 1251, crc32 0x941b2a82
[   11.099835] morse_spi_find_data_ack failed
[   11.099856] morse_spi_cmd53_write failed
[   11.099865] morse_spi spi0.0: spi: cmd53_write fn=2 0x00000000:9 r=0x10050002 b=0x80400002 (ret:-71)
[   11.099884] morse_spi spi0.0: morse_spi_dm_write failed -71
[   11.099963] morse_spi_find_data_ack failed
[   11.099969] morse_spi_cmd53_write failed
[   11.099974] morse_spi spi0.0: spi: cmd53_write fn=1 0x00004050:4 r=0x10050002 b=0x80400002 (ret:-71)
[   11.099988] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.516909] morse_spi_find_data_ack failed
[   11.516925] morse_spi_cmd53_write failed
[   11.516934] morse_spi spi0.0: spi: cmd53_write fn=1 0x0000406c:4 r=0x10050002 b=0xffffffff (ret:-71)
[   11.516951] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.516970] morse_spi_find_data_ack failed
[   11.516975] morse_spi_cmd53_write failed
[   11.516980] morse_spi spi0.0: spi: cmd53_write fn=1 0x00004d40:4 r=0x10050002 b=0xffffffff (ret:-71)
[   11.516993] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.517010] morse_spi_find_data_ack failed
[   11.517015] morse_spi_cmd53_write failed
[   11.517020] morse_spi spi0.0: spi: cmd53_write fn=1 0x00004050:4 r=0x10050002 b=0xffffffff (ret:-71)
[   11.517033] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.932905] morse_spi_find_data_ack failed
[   11.932926] morse_spi_cmd53_write failed
[   11.932935] morse_spi spi0.0: spi: cmd53_write fn=1 0x0000406c:4 r=0x10050002 b=0xffffffff (ret:-71)
[   11.932955] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.932974] morse_spi_find_data_ack failed
[   11.932979] morse_spi_cmd53_write failed
[   11.932984] morse_spi spi0.0: spi: cmd53_write fn=1 0x00004d40:4 r=0x10050002 b=0xffffffff (ret:-71)
[   11.932997] morse_spi spi0.0: morse_spi_reg32_write failed (errno=-71)
[   11.933082] morse_spi spi0.0: morse_firmware_init failed: -5
[   11.933092] morse_spi spi0.0: morse_firmware_exec_ndr: Failed to reload: -5
[   11.933124] morse_spi_find_token failed
[   11.933129] morse_spi_cmd53_read failed
[   11.933134] morse_spi spi0.0: spi: cmd53_read fn=1 0x0000001c:4 r=0x00000002 b=0xffffffff (ret:-71)
[   11.933147] morse_spi spi0.0: morse_spi_reg32_read failed (errno=-71)
[   11.933156] morse_spi spi0.0: morse_pager_hw_read_table failed -5
[   11.933164] morse_spi spi0.0: morse_firmware_exec_ndr: chip_if_init failed: -5
[   11.933180] morse_spi_find_token failed
[   11.933185] morse_spi_cmd53_read failed
[   11.933190] morse_spi spi0.0: spi: cmd53_read fn=1 0x0000000c:4 r=0x00000002 b=0xffffffff (ret:-71)
[   11.933203] morse_spi spi0.0: morse_spi_reg32_read failed (errno=-71)
[   11.933211] morse_spi spi0.0: morse_firmware_parse_extended_host_table failed -5
[   11.933220] morse_spi spi0.0: failed to parse extended host table: -5
[   11.933228] morse_spi spi0.0: morse_mac_restart: Failed to execute NDR (errno:-5)
[   11.933241] morse_spi spi0.0: morse_mac_restart_work: HW restart failed (errno:-5, count:1)
[   11.933289] morse_spi spi0.0: morse_skbq_tx fail: -19
[   11.933300] morse_spi spi0.0: Command morse_cmd_rm_if 05:20 failed with rc -19 (0xffffffed)
[   12.137248] morse_spi spi0.0: morse_skbq_tx fail: -19
[   12.137278] morse_spi spi0.0: Command morse_cmd_get_version 02:30 failed with rc -19 (0xffffffed)
[   12.137296] morse_spi spi0.0: morse_skbq_tx fail: -19
[   12.137304] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:40 failed with rc -19 (0xffffffed)
[   12.137316] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-19)
[   13.372886] morse_spi spi0.0: Command morse_cmd_add_if 04:51 timed out
[   13.372915] morse_spi spi0.0: morse_cmd_add_if failed -110
[   14.588895] morse_spi spi0.0: Command morse_cmd_get_version 02:61 timed out
[   15.804868] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:71 timed out
[   15.804896] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   17.020871] morse_spi spi0.0: Command morse_cmd_add_if 04:81 timed out
[   17.020897] morse_spi spi0.0: morse_cmd_add_if failed -110
[   28.220871] morse_spi spi0.0: Command morse_cmd_get_version 02:91 timed out
[   29.436868] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:a1 timed out
[   29.436897] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   30.652886] morse_spi spi0.0: Command morse_cmd_add_if 04:b1 timed out
[   30.652916] morse_spi spi0.0: morse_cmd_add_if failed -110
[   31.868865] morse_spi spi0.0: Command morse_cmd_get_version 02:c1 timed out
[   33.084869] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:d1 timed out
[   33.084896] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   34.300874] morse_spi spi0.0: Command morse_cmd_add_if 04:e1 timed out
[   34.300902] morse_spi spi0.0: morse_cmd_add_if failed -110
[   46.236877] morse_spi spi0.0: Command morse_cmd_get_version 02:f1 timed out
[   47.452868] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:101 timed out
[   47.452895] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   48.668864] morse_spi spi0.0: Command morse_cmd_add_if 04:111 timed out
[   48.668890] morse_spi spi0.0: morse_cmd_add_if failed -110
[   49.884871] morse_spi spi0.0: Command morse_cmd_get_version 02:121 timed out
[   51.100861] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:131 timed out
[   51.100887] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   52.316870] morse_spi spi0.0: Command morse_cmd_add_if 04:141 timed out
[   52.316900] morse_spi spi0.0: morse_cmd_add_if failed -110
[   64.220892] morse_spi spi0.0: Command morse_cmd_get_version 02:151 timed out
[   65.436880] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:161 timed out
[   65.436915] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   66.652892] morse_spi spi0.0: Command morse_cmd_add_if 04:171 timed out
[   66.652929] morse_spi spi0.0: morse_cmd_add_if failed -110
[   67.868888] morse_spi spi0.0: Command morse_cmd_get_version 02:181 timed out
[   69.084881] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:191 timed out
[   69.084917] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   70.301179] morse_spi spi0.0: Command morse_cmd_add_if 04:1a1 timed out
[   70.301219] morse_spi spi0.0: morse_cmd_add_if failed -110
[   82.242577] morse_spi spi0.0: Command morse_cmd_get_version 02:1b1 timed out
[   83.458929] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:1c1 timed out
[   83.458964] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   84.675243] morse_spi spi0.0: Command morse_cmd_add_if 04:1d1 timed out
[   84.675278] morse_spi spi0.0: morse_cmd_add_if failed -110
[   85.891542] morse_spi spi0.0: Command morse_cmd_get_version 02:1e1 timed out
[   87.107821] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:1f1 timed out
[   87.107859] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[   88.324077] morse_spi spi0.0: Command morse_cmd_add_if 04:201 timed out
[   88.324111] morse_spi spi0.0: morse_cmd_add_if failed -110
[  100.229766] morse_spi spi0.0: Command morse_cmd_get_version 02:211 timed out
[  101.445885] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:221 timed out
[  101.445924] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[  102.661979] morse_spi spi0.0: Command morse_cmd_add_if 04:231 timed out
[  102.662020] morse_spi spi0.0: morse_cmd_add_if failed -110
[  103.878083] morse_spi spi0.0: Command morse_cmd_get_version 02:241 timed out
[  105.094166] morse_spi spi0.0: Command morse_cmd_get_disabled_channels 4a:251 timed out
[  105.094203] morse_spi spi0.0: set_hw_ignored_s1g_channels: failed (ret:-110)
[  106.310257] morse_spi spi0.0: Command morse_cmd_add_if 04:261 timed out
[  106.310299] morse_spi spi0.0: morse_cmd_add_if failed -110
[ 1271.191781] systemd[552]: memfd_create() called without MFD_EXEC or MFD_NOEXEC_SEAL set

This is where I am now stuck, there seems to be communication happening, but then fails immediatly, I don’t know where to go from here. The schematics for the module can be found here if you belive that it could be an hardware issue.

Thank you for your help

Alex

Hi @alex

Those errors look like the host processors are struggling to communicate with the Morse chip.

When working on a Raspberry Pi 5 with the Seeed boards (minipcie and carrier) I had to use a different pin mapping in the device tree due to the Seeed boards using different GPIOs to our EKH01 where it looks like that device tree file has come from.

I don’t have the device tree file handy currently, but can provide that shortly. In the meantime, see the below table which maps the MM6108 pin function to miniPCIe pinout, to 40pin header on the carrier, to Raspberry Pi GPIO pin label.

MM6108 WM1680 WM1320 RPi
SPI Clock 45 23 GPIO11
SPI MOSI 49 19 GPIO10
SPI MISO 47 21 GPIO9
SPI CS 51 24 GPIO8
SPI IRQ 10 29 GPIO5
RESETN 22 11 GPIO17
WAKE 33 16 GPIO23
BUSY 31 18 GPIO24

You’ll need to adjust the gpio settings in the device tree to match the values in the last column above. Most importantly the reset line.
Despite being a Raspberry Pi 5, the GPIO mappings should be the same as Raspberry Pi do tend to keep this consistent across platforms to retain hat compatibility.

Hi @ajudge,

I edited my device tree file to match what you had, I also reduced the clock speed hoping it would help, it now look like this:

/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835", "brcm,bcm2836","brcm,bcm2708", "brcm,bcm2709", "brcm,bcm2711";
    fragment@0 {
        target = <&spi0>;
        frag0: __overlay__ {
            pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
            cs-gpios = <&gpio 8 1>;
            #address-cells = <1>;
            #size-cells = <0>;
            status = "okay";

            mm6108: mm6108@0 {
                compatible = "morse,mm610x-spi";
                reg = <0>; /* CE0 */
                reset-gpios = <&gpio 17 0>;
                power-gpios = <&gpio 23 0>,
                    <&gpio 24 0>;
                spi-irq-gpios = <&gpio 5 0>;
                spi-max-frequency = <10000000>;
                status = "okay";
            };
        };
    };
};

It still does not work but the error is different, it looks like it cannot communicate at all, this is what I am getting in dmesg:

[   59.641216] dot11ah: loading out-of-tree module taints kernel.
[   59.643485] Morse Micro Dot11ah driver registration. Version 0-rel_1_15_3_2025_Apr_16
[   60.509434] morse micro driver registration. Version 0-rel_1_15_3_2025_Apr_16
[   60.509729] morse_spi_find_token failed
[   60.509736] morse_spi_cmd53_read failed
[   60.509746] morse_spi spi0.0: spi: cmd53_read fn=1 0x00004d20:4 r=0x10050002 b=0xffffffff (ret:-71)
[   60.509764] morse_spi spi0.0: morse_spi_reg32_read failed (errno=-71)
[   60.509773] morse_spi spi0.0: morse_chip_cfg_detect_and_init: Failed to access HW (errno:-5)
[   60.509781] morse_spi spi0.0: morse_chip_cfg_detect_and_init failed: -5
[   60.509938] morse_spi_probe failed. The driver has not been loaded!
[   60.509944] morse_spi: probe of spi0.0 failed with error -5

The way I understand the error is that the SPI communication cannot communicate with the MM6108 at all. I have searched around on the forum and there seems to be a boot sequence to follow to enter into SPI mode instead of SDIO. Some people have a script at startup to do some kind of reset to enter into SPI mode, do I need one as well?

My setup is wired as followed:

FUNCTION HALOW Module RPI
RESET D0 17
WAKE D1 23
BUSY D4 24
SPI_INT D2 5
MOSI D10 10
MISO D9 9
SCLK D8 11
SPI_CS D3 8

I will try to probe the signals with a logic analyzer to see what is actually happening. The module I am using is NOT the one made for the Raspberry Pi, I used the one for their own XIAO microcontroller, I created my own HAT that fits the Raspberry Pi that matches with my overlay. Would there be any issue with using that module that you would see?

XIAO microcontroller, I created my own HAT that fits the Raspberry Pi that matches with my overlay

Ah, my apologies. I was confused about how you were connecting the xiao to the RPi header and assumed you were using their miniPCie and carrier instead!

Definitely continue to use your device tree file then. Do you have schematics snippets you can share?
A logic analyzer trace would be handy to identify RPi GPIOs which may be configured as pull down by default. We saw this in the RPi5 for example where the RPi default pull downs were “fighting” the pullups on the HaLow module carrier.

You will need a reset script as well, which simply toggles the reset line before kernel module insertion. See this morse-feed/hardware/morse-bundle/files/morse/scripts/chipreset.sh at main · MorseMicro/morse-feed · GitHub which is used in our evaluation kits, and is called on boot, and any time we need to perform a reinsertion of the kernel module

I have changed the overlay back to the one I had and rewired accordingly. I attached the schematic of the module I am using, I added in green the corresponding Raspberry Pi connexion. The pin BUSY and Wake seems to be coonected to the header trough a jumper marked Do Not Populate. I have tried to bridge both of the jumper and it did not help. Do I need to remove the pull-up on WAKE-UP or the pull down on BUSY? The should not cause any issue if the Raspberry Pi would try to control them.

The reset script is searching for the pin MM_RESET in lines names I will try to modify the overlay to have a matching line name.

WI-FI_HALOW_FGH100M_ANNOTATED.pdf (209.8 KB)

Hi @alex ,

I have a working setup with the same configuration as you are, Raspberry Pi Zero 2W with Seeed Studio’s Xiao Halow module. I can achieve up-to 10Mbps between 2 RPi.
I wire my RPi as shown below:

Some difference I have with you setup are:

  • The DTS I use is exactly the same as the one in the AppNote
  • Modify the morse driver with the chip reset changes that’s mentioned here
  • I do not bridge the BUSY and WAKE-UP pin. So the module is ON all the time.
  • I load the morse driver with 20MHz SPI Speed
insmod morse.ko bcf=bcf_fgh100mhaamd.bin spi_clock_speed=20000000 country=US

I could never use 50MHz SPI speed using the current wiring, the SPI comm always fail. You can also pass debug_mask=1 when loading the driver to enable debug messages.

Hi @aldwin,

I sucessfully mounted the module with the insmod parameter you suggested! As far as I know it’s the spi_clock_speed parameter that allows it to work, I thought that setting the max frequency in the overlay was sufficient.

Thank for the information you provided it was really helpful
Alex

1 Like

Nice! Glad that helps