ARM-CORTEX-M33 with no DSP support

I have been working on trying to get the Quectel FGH100M working with a Quectel FCM363x under Zephyr.

I started with your mm-iot-zephyr repo which targets Zephyr 3.7. I successfully integrated the Quectel FGH100M and a ST nucleo_u575zi_q using the morse_mmech08 shield.

Then I moved the setup forward to Zephyr 4.0, 4.1, 4.2, and 4.3 making adjustments for the changes to Zephyr. This all works.

The problem that is preventing me form migrating to the Quectel FCM363x module is the NXP processor the module is based on uses a Arm Cortex-M33 that lacks a DSP.

There appear to be DSP instructions within your code base. I particular the libmorse.a and then l later incorporated and built as mush of your mm-iot-sdk as available source code allowed but I was still forced to link with libmorse_nosupplicant.a.

Even with this minimal precompiled code the library still contains smulbb and smlabb instructions that my RW610 processor do not support.

Would you be so kind as to provide me with a version of your libmorse.a compiled for the arm-cortex-m33f with no DSP?

Best regards,

Roy Cooley

Hi @Roy,

We just updated mm-iot-zephyr to use the 2.10.4 version of mm-iot-sdk, which contains source for libmorse instead of precompiled binaries. This should let you compile for your target :slight_smile:

Using the 2.10.4 version of mm-iot-sdk I was able to get the RW610 processor running Zephyr to work with the Arm Cortex-M33. The biggest initial challenge was dealing with changes to mbedtls.

Now the system runs HaLow in isolation just fine. I can connect to a MQTT broker and publish once a second for hours. However when the RW610 processor gets busier. The HaLow fails within a minute or two. We have enabled some tracing functionality you have embedded in the source. Following are some logs. These are all from the same run. There are two cases where the HaLow reports an error but continues working. The fail error report leads to failure.

Any help resolving this would be greatly appreciated:

A few seconds after launch up to first reported error:

[00:30:32.853,031]  alpha_testing_NETWORKING: Subscribed to topic
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_multi_byte
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_multi_byte
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] irq_disabled
[transport_fsm] release
E    30411 dr morse_pageset_write[474] Failed to write page: -32768
E    30411 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] irq_enabled
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] irq_disabled

The messages surrounding the second reported error:

[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[00:30:49.109,541]  bdg_ble: majorminor: 10000006 , count: 1 , sum: -62
[00:30:49.109,623]  bdg_ble: majorminor: 10000101 , count: 2 , sum: -130
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_multi_byte
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] irq_disabled
[transport_fsm] release
E    46558 dr morse_pageset_write[474] Failed to write page: -32768
E    46558 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] irq_enabled
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release

Here are the fail message up to failure:

[transport_fsm] read_multi_byte
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] release
[00:31:00.646,503]  bdg_ble: majorminor: 10000101 , count: 1 , sum: -63
[00:31:00.646,538]  bdg_ble: majorminor: 10002004 , count: 1 , sum: -84
[transport_fsm] claim
[transport_fsm] irq_disabled
[transport_fsm] release
E    57654 dr morse_pageset_write[474] Failed to write page: -32768
E    57655 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] irq_enabled
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
E    57898 dr morse_pageset_write[474] Failed to write page: -32768
E    57898 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
E    58257 dr morse_pageset_write[474] Failed to write page: -32768
E    58257 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
E    58795 dr morse_pageset_write[474] Failed to write page: -32768
E    58795 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
E    59600 dr morse_pageset_write[474] Failed to write page: -32768
E    59600 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[00:31:03.407,632]  bdg_ble: majorminor: 10000007 , count: 1 , sum: -69
[00:31:03.407,674]  bdg_ble: majorminor: 10000101 , count: 2 , sum: -133
E    60808 dr morse_pageset_write[474] Failed to write page: -32768
E    60809 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claimE    60828 dr morse_pageset_write[474] Failed to write page: -32768
E    60828 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1

[transport_fsm] write_multi_byte
[transport_fsm] release
E    61829 dr morse_pageset_write[474] Failed to write page: -32768
E    61829 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1
[transport_fsm] claim
[transport_fsm] write_multi_byte
E    62620 dr morse_pageset_write[474] Failed to write page: -32768
E    62620 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] read_word
[transport_fsm] release
[00:31:06.179,766]  bdg_ble: majorminor: 10000101 , count: 2 , sum: -141
E    62840 dr morse_pageset_write[474] Failed to write page: -32768
E    62840 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1
[transport_fsm] claim
[transport_fsm] write_multi_byte
E    63833 he morse_cmd_tx[230] Command 19:342 timed out
[transport_fsm] E    63840 dr morse_pageset_write[474] Failed to write page: -32768
E    63840 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1
release
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
E    64842 dr morse_pageset_write[474] Failed to write page: -32768
E    64843 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
[transport_fsm] claim
E    65335 dr morse_pageset_write[474] Failed to write page: -32768
E    65335 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=16
[transport_fsm] write_multi_byte
[transport_fsm] release
[00:31:08.975,838]  bdg_ble: majorminor: 10000101 , count: 3 , sum: -213
[00:31:08.975,886]  bdg_ble: majorminor: 10000006 , count: 1 , sum: -63
E    65843 dr morse_pageset_write[474] Failed to write page: -32768
E    65843 dr morse_pageset_tx[809] morse_pageset_tx could not write 1 pkts - rc=-32768 items=1 pages=1
[00:31:08.975,889]  bdg_ble: majorminor: 380038 , count: 1 , sum: -87
[00:31:08.975,893]  bdg_ble: majorminor: 10002001 , count: 1 , sum: -84
[transport_fsm] claim
[transport_fsm] write_multi_byte
[transport_fsm] release
E    66841 he morse_cmd_tx[230] Command 19:352 timed out
E    66841 he driver_health_task_main[134] Health check failed (errno=-116)
[transport_fsm] claim
[transport_fsm] irq_disabled
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] write_word
[transport_fsm] release
[transport_fsm] claim— 60 messages dropped —
release
[transport_fsm] claim
[transport_fsm] read_word
[transport_fsm] write_word
[transport_fsm] write_word
[transport_fsm]
[transport_fsm] claim
[transport_fsm] irq_disabled
[transport_fsm] release
[transport_fsm] claim
[transport_fsm] release
[transport_fsm] reset
[transport_fsm] claim
[00:31:11.741,599]  bdg_ble: majorminor: 10000006 , count: 1 , sum: -79
[00:31:11.741,641]  bdg_ble: majorminor: 10000005 , count: 1 , sum: -82
[00:31:11.741,644]  bdg_ble: majorminor: 10002004 , count: 1 , sum: -85
[00:31:11.741,648]  bdg_ble: majorminor: 10002003 , count: 1 , sum: -83
[00:31:13.803,640]  wifi_morse: Failed to send packet - 6
[00:31:13.803,764]  net_if: iface 1 pkt 0x100b2cf0 send failure status -116
[00:31:14.503,287]  bdg_ble: majorminor: 10000002 , count: 1 , sum: -87
[00:31:14.503,320]  bdg_ble: majorminor: 10000101 , count: 1 , sum: -74
[00:31:14.503,323]  bdg_ble: majorminor: 10002002 , count: 1 , sum: -91
[00:31:17.328,326]  bdg_ble: majorminor: 10000101 , count: 1 , sum: -65
[00:31:20.104,909]  bdg_ble: majorminor: 10000007 , count: 1 , sum: -70
[00:31:20.104,978]  bdg_ble: majorminor: 10000102 , count: 1 , sum: -83
[00:31:20.912,842]  wifi_morse: Failed to send packet - 6
[00:31:20.912,961]  net_if: iface 1 pkt 0x100b2cf0 send failure status -116
[00:31:21.164,468]  net_mqtt_rx: [CID 0x100566b8]: Transport read error: -116
[00:31:21.164,534]  net_mqtt_sock_tcp: Closing socket 0
[00:31:21.164,857]  alpha_testing_NETWORKING: MQTT disconnected (-116)
[00:31:21.164,879]  network_task: mqtt_input error: -116
[00:31:22.893,688]  bdg_ble: majorminor: 10000101 , count: 2 , sum: -145
[00:31:22.893,757]  bdg_ble: majorminor: 10000 , count: 1 , sum: -87
[00:31:22.893,763]  bdg_ble: majorminor: 10000002 , count: 1 , sum: -86
[00:31:22.893,767]  bdg_ble: majorminor: 10002005 , count: 1 , sum: -75
[00:31:25.741,126]  bdg_ble: majorminor: 10000101 , count: 2 , sum: -134
[00:31:25.741,170]  bdg_ble: majorminor: 10000007 , count: 1 , sum: -78
[00:31:25.741,173]  bdg_ble: majorminor: 10000005 , count: 1 , sum: -76
[00:31:31.268,216]  bdg_ble: majorminor: a0040 , count: 1 , sum: -84

Can you elaborate what these were? The default Kconfig options we provide for our morse_sm driver should select the right configuration for mbedtls. Though for some platforms I have noticed these settings are overridden by another part of the system.

The error causing your failure is likely

E    66841 he morse_cmd_tx[230] Command 19:352 timed out
E    66841 he driver_health_task_main[134] Health check failed (errno=-116)

You’ll note that when this occurs, it is preceded by 3 counts of

E    65335 dr morse_pageset_write[474] Failed to write page: -32768

and I suspect that other instances of this error message are the same commands failing, but passing on subsequent retries.

This pattern could occur when the health check thread is being starved. As an experiment, can you try forcing all Morse Micro library created threads to priority level 0 to increase the priority of the health check thread. This is easily done in
modules/lib/morsemicro/drivers/wifi/morse_sm/shims/mmosal_shim_zephyr.c by applying the following change

--- a/drivers/wifi/morse_sm/shims/mmosal_shim_zephyr.c
+++ b/drivers/wifi/morse_sm/shims/mmosal_shim_zephyr.c
@@ -171,7 +171,7 @@ struct mmosal_task *mmosal_task_create(mmosal_task_fn_t task_fn, void *argument,

        tid = k_thread_create(&data->tid, data->stack, sizeof(uint32_t) * stack_size_u32,
                              mmosal_task_fn, task_fn, argument, data,
-                             mmosal_task_priorities[priority], 0, K_FOREVER);
+                             0, 0, K_FOREVER);

        /* This needs to be set before the thread starts otherwise we could notify too early */
        tid->custom_data = data;