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.
-
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 -aI get the desired outputLinux halow 6.6.31-v8-mm+ #1 SMP PREEMPT Tue Sep 23 15:13:59 EDT 2025 aarch64 GNU/LinuxI added mm to the kernel name, it confirms that the right kernel is loaded. -
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+/
-
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.
-
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.
-
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. -
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"; }; }; }; }; -
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
-
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.
-
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
