FX30 with ESP32 as network interface

Hi,

We want to enable WiFi in a Sierra Wireless FX30 using the Espressif ESP32-C3-MINI-1 running the ESP-Hosted solution. We have already tested this solution using a Raspberry Pi running kernel 5.10.63. In this case, we just had to install all dependencies and run ./rpi_init.sh spi to build and load the driver from the RPi itself.

Now, for the FX30 we have setup the leaf environment and are using the swi-fx30-catm_1.0.0 package which is running kernel version 3.18.44. We already created a mdef file to setup and build the kmod but it compiles with some warnings and on the FX30 side the kernel is not loaded because of some errors. I’m attaching the mdef and logs below.

We are trying to follow the porting guide but of course, it doesn’t translate one-to-one to the FX30 development framework.

The missing pieces are: build and mount the kernel module correctly, change or configure the correct SPI and GPIOs pinout, use the new network interface on the FX30 to connect to WiFi. Any help or insight on these issues is greatly appreciated.

esp32-spi mdef

sources:
{
main.c
esp_bt.c.c
esp_rb.c
esp_serial.c
esp_spi.c
}

cflags:
{
"-DCONFIG_SUPPORT_ESP_SERIAL"
}

Build warnings log

[64/384] Build kernel driver module
make: Entering directory '/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi'
make -C /home/carlos/fx30_workspace/leaf-data/SWI-FX30-CATM/wp77-toolchain/sysroots/armv7a-neon-poky-linux-gnueabi/usr/src/kernel M=/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi modules
make[1]: Entering directory '/home/carlos/.leaf/wp77-toolchain_SWI9X06Y_02.18.05.00-linux64/sysroots/armv7a-neon-poky-linux-gnueabi/usr/src/kernel'
CC [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/main.o
CC [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp_bt.o
CC [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp_rb.o
CC [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp_serial.o
CC [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp_spi.o
LD [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.o
Building modules, stage 2.
MODPOST 1 modules
WARNING: "hci_register_dev" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
WARNING: "hci_recv_frame" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
WARNING: "hci_unregister_dev" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
WARNING: "bt_err" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
WARNING: "hci_alloc_dev" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
WARNING: "hci_free_dev" [/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko] undefined!
CC /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.mod.o
LD [M] /home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi/esp32_spi.ko
make[1]: Leaving directory '/home/carlos/.leaf/wp77-toolchain_SWI9X06Y_02.18.05.00-linux64/sysroots/armv7a-neon-poky-linux-gnueabi/usr/src/kernel'
make: Leaving directory '/home/carlos/fx30_workspace/_build_mySystem/wp77xx/modules/esp32_spi'

Kernel module load errors log

root@fx30s:~# logread -f | grep "esp32"
Jan 7 23:43:11 fx30s user.info Legato: INFO | supervisor[22226]/supervisor T=main | kernelModules.c ReleaseModulesMemory() 840 | Released memory of module 'esp32_spi.ko'
Jan 7 23:43:14 fx30s user.info Legato: INFO | supervisor[22522]/supervisor T=main | kernelModules.c ModuleGetParams() 355 | Module esp32_spi.ko uses no parameters.
Jan 7 23:43:14 fx30s user.info Legato: INFO | supervisor[22522]/supervisor T=main | kernelModules.c ExecuteCommand() 190 | Execute '/sbin/insmod /legato/systems/current/modules/esp32_spi.ko'
Jan 7 23:43:14 fx30s user.err Legato: =ERR= | supervisor[22522]/supervisor T=main | kernelModules.c installModules() 771 | Error in installing module esp32_spi.ko
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136516] esp32_spi: Unknown symbol hci_free_dev (err 0)
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136650] esp32_spi: Unknown symbol hci_alloc_dev (err 0)
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136689] esp32_spi: Unknown symbol bt_err (err 0)
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136702] esp32_spi: Unknown symbol hci_unregister_dev (err 0)
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136718] esp32_spi: Unknown symbol hci_recv_frame (err 0)
Jan 7 23:43:14 fx30s user.warn kernel: [171791.136742] esp32_spi: Unknown symbol hci_register_dev (err 0)

root@fx30s:~# uname -a
Linux fx30s 3.18.44 #2 PREEMPT Tue Jan 29 11:21:07 PST 2019 armv7l GNU/Linux

Regards,
Carlos

have you tried to insmod bluetooth module first?

e.g.

insmod /lib/modules/3.18.131/kernel/net/bluetooth/bluetooth.ko

Thanks for the reply. Unfortunately the bluetooth kmod cannot be found, do I need to add something to the sdef to add it?

Do you mean “bluetooth.ko”?
I can find it in WP7702 module:

owner@owner-ThinkPad-X220:~$ ssh root@192.168.2.2
root@fx30:~# find / -name "*bluetooth*"
/etc/bluetooth
/etc/dbus-1/system.d/bluetooth.conf
/etc/init.d/bluetooth
/etc/rc0.d/K20bluetooth
/etc/rc1.d/K20bluetooth
/etc/rc2.d/S20bluetooth
/etc/rc3.d/S20bluetooth
/etc/rc4.d/S20bluetooth
/etc/rc5.d/S20bluetooth
/etc/rc6.d/K20bluetooth
/lib/modules/3.18.140/kernel/drivers/bluetooth
/lib/modules/3.18.140/kernel/drivers/bluetooth/bluetooth-power.ko
/lib/modules/3.18.140/kernel/net/bluetooth
/lib/modules/3.18.140/kernel/net/bluetooth/bluetooth.ko
find: /proc/2859: No such file or directory
^C
root@fx30:~# cm info
Device:                        WP7702
IMEI:                          352653090002791
IMEISV:                        6
FSN:                           VU735370340201
Firmware Version:              SWI9X06Y_02.36.06.00 63d944 jenkins 2020/12/10 19:12:28
Bootloader Version:            SWI9X06Y_02.36.06.00 63d944 jenkins 2020/12/10 19:12:28
MCU Version:                   002.015
PRI Part Number (PN):          9907365
PRI Revision:                  001.001 
Carrier PRI Name:              GENERIC
Carrier PRI Revision:          001.071_001
SKU:                           1103530
Last Reset Cause:              Power Down
Resets Count:                  Expected: 410	Unexpected: 28

You can try the FX30 FW R14.

https://source.sierrawireless.com/resources/airlink/software_downloads/fx30-firmware/fx30-firmware-catm/#sthash.UrclZKPN.dpbs

It seems my FX30 has a different set of modules. I’ll try R14 or R15 next.

carlos@mark2:~$ ssh root@192.168.2.2
root@fx30s:~# find / -name "*bluetooth*"
root@fx30s:~# cm info
Device:                        FX30S(WP7702)
IMEI:                          354723090256370
IMEISV:                        2
FSN:                           VU125301000710
Firmware Version:              SWI9X06Y_02.16.06.00 7605a6 jenkins 2018/06/20 17:56:12
Bootloader Version:            SWI9X06Y_02.16.06.00 7605a6 jenkins 2018/06/20 17:56:12
MCU Version:                   002.009
PRI Part Number (PN):          9907957
PRI Revision:                  001.000
Carrier PRI Name:              GENERIC
Carrier PRI Revision:          001.028_002
SKU:                           1103882
Last Reset Cause:              Power Down
Resets Count:                  Expected: 18     Unexpected: 1

Now with FX30 FW R14 it got a little bit further (I believe) but the module still doesn’t load. Here is the log.

Jan  9 03:16:45 fx30s user.warn Legato: -WRN- | updateDaemon[3127]/framework T=main | safeRef.c le_ref_CreateRef() 547 | Safe reference map maximum exceeded for refFdMonitors, new size 42
Jan  9 03:16:45 fx30s user.info Legato:  INFO | updateDaemon[3127]/updateDaemon T=main | updateDaemon.c StartProbation() 214 | System on probation (timer started).
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | frameworkDaemons.c StartDaemon() 293 | Started system process 'updateDaemon' with PID: 3127.
Jan  9 03:16:45 fx30s user.warn Legato: -WRN- | configTree[3126]/framework T=main | safeRef.c le_ref_CreateRef() 547 | Safe reference map maximum exceeded for refFdMonitors, new size 42
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | frameworkDaemons.c StartDaemon() 293 | Started system process 'watchdog' with PID: 3128.
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | frameworkDaemons.c fwDaemons_Start() 331 | All framework daemons ready.
Jan  9 03:16:45 fx30s user.info Legato:  INFO | sdir[3129]/framework T=main | user.c user_Init() 445 | /etc is writable
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ModuleGetParams() 575 | Module esp32_spi.ko uses no parameters.
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/esp32_spi.ko '
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/example.ko '
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ModuleGetParams() 575 | Module spisvc.ko uses no parameters.
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/spisvc.ko '
Jan  9 03:16:45 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modprobe bluetooth.ko '
Jan  9 03:16:46 fx30s user.info Legato:  INFO | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/insmod /legato/systems/current/modules/esp32_spi.ko '
Jan  9 03:16:46 fx30s user.info kernel: [  405.770521] Bluetooth: c89ebde8
Jan  9 03:16:46 fx30s user.info kernel: [  405.770877] NET: Registered protocol family 31
Jan  9 03:16:46 fx30s user.info kernel: [  405.770895] Bluetooth: c89ebde8
Jan  9 03:16:46 fx30s user.info kernel: [  405.770935] Bluetooth: c89ebde0Bluetooth: c89ebdd0
Jan  9 03:16:46 fx30s user.info kernel: [  405.771003] Bluetooth: c89ebdd8<3>[  405.779874] Failed to obtain SPI master handle
Jan  9 03:16:46 fx30s user.crit Legato: *CRT* | supervisor[3113]/supervisor T=main | kernelModules.c ExecuteCommand() 290 | /sbin/insmod /legato/systems/current/modules/esp32_spi.ko  was killed by a signal 11.
Jan  9 03:16:46 fx30s user.err Legato: =ERR= | supervisor[3113]/supervisor T=main | kernelModules.c installModules() 1276 | Error in installing module esp32_spi.ko. Restarting system ...
Jan  9 03:16:46 fx30s user.emerg Legato: *EMR* | supervisor[3113]/supervisor T=main | supervisor.c framework_Reboot() 811 | Supervisor going down to trigger reboot.

not sure about the SPI master handle…
you can try this:

root@fx30:~# insmod /mnt/legato/system/modules/spisvc.ko
root@fx30:~# ls /dev/spi*
/dev/spidev1.0

I can see that when loading spisvc.ko manually. Is there a way to load it automatically at boot?

When updating this is the current log. I disabled some BT lines in the kernel module of the esp32.

Jan  9 04:21:02 fx30s user.info Legato:  INFO | sdir[8004]/framework T=main | user.c user_Init() 445 | /etc is writable
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ModuleGetParams() 575 | Module esp32_spi.ko uses no parameters.
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/esp32_spi.ko '
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/example.ko '
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ModuleGetParams() 575 | Module spisvc.ko uses no parameters.
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/modinfo -F depends /legato/systems/current/modules/spisvc.ko '
Jan  9 04:21:03 fx30s user.info Legato:  INFO | supervisor[7988]/supervisor T=main | kernelModules.c ExecuteCommand() 244 | Execute '/sbin/insmod /legato/systems/current/modules/esp32_spi.ko '
Jan  9 04:21:03 fx30s user.err kernel: [ 3745.746175] Failed to obtain SPI master handle

you can see here to modify the init script:

or you can write a unsandboxed legato application to run a script when power on: