Summary
Hardware
- Module: Fanstel BT840X (nRF52840 + SKY66112-11 FEM)
- FEM Pins:
- CTX (PA enable): P0.17
- CRX (LNA enable): P0.19
- CPS (Bypass): P0.06 (active low - LOW = FEM active)
- CHL (Power mode): P0.08 (HIGH = max power)
Software
- NCS Version: v3.1.1 (broken)
- Previously working: NCS v2.4.x
- Application: Custom wpanusb firmware (IEEE 802.15.4 raw mode over USB)
Symptoms
- With CONFIG_MPSL_FEM=n: Radio works, weak signal (~-48dBm at 50cm) => expected without FEM
- With CONFIG_MPSL_FEM=y: Radio works but signal remains weak (~-48 to -50dBm) => FEM not activating
- Manual GPIO test (forcing CTX high, CPS low, CHL high in board.c with FEM disabled): ~-23dBm => confirms FEM hardware works
Configuration
Devicetree (myboard_bt840x_nrf52840.dts)
/ {
nrf_radio_fem: fem {
status = "okay";
compatible = "skyworks,sky66112-11", "generic-fem-two-ctrl-pins";
ctx-gpios = <&gpio0 17 GPIO_ACTIVE_HIGH>;
ctx-settle-time-us = <4>;
tx-gain-db = <22>;
crx-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>;
crx-settle-time-us = <4>;
rx-gain-db = <11>;
};
};
&radio {
fem = <&nrf_radio_fem>;
status = "okay";
};
Defconfig (myboard_bt840x_nrf52840_defconfig)
CONFIG_ARM_MPU=y CONFIG_HW_STACK_PROTECTION=y CONFIG_USE_SEGGER_RTT=n CONFIG_GPIO=y CONFIG_SERIAL=n CONFIG_USB_MAX_POWER=250 CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y CONFIG_CLOCK_CONTROL_NRF_K32SRC_150PPM=y CONFIG_MPSL=y CONFIG_MPSL_FEM=y CONFIG_PINCTRL=y
prj.conf
CONFIG_BOOTLOADER_MCUBOOT=n CONFIG_TEST_RANDOM_GENERATOR=n CONFIG_USB_DEVICE_STACK=y CONFIG_USB_DEVICE_PID=0x000D CONFIG_USB_MAX_NUM_TRANSFERS=4 CONFIG_USB_REQUEST_BUFFER_SIZE=4096 CONFIG_USB_DEVICE_MANUFACTURER="manufacturer" CONFIG_USB_DEVICE_PRODUCT="BOARD-WPANUSB" CONFIG_USB_DEVICE_SN="4D4F4E43554C" CONFIG_NETWORKING=y CONFIG_NET_CONFIG_SETTINGS=y CONFIG_NET_CONFIG_AUTO_INIT=n CONFIG_NET_BUF_DATA_SIZE=128 CONFIG_IEEE802154=y CONFIG_IEEE802154_RAW_MODE=y CONFIG_NET_CONFIG_IEEE802154_RADIO_TX_POWER=18 CONFIG_LOG=n CONFIG_NET_LOG=n
board.c (CPS/CHL static control)
#include <zephyr/init.h>
#include <zephyr/drivers/gpio.h>
#define CPS_PIN 6 /* P0.06, FEM bypass (LOW = FEM active) */
#define CHL_PIN 8 /* P0.08, FEM power (HIGH = max power) */
static int myboard_fem_init(void)
{
const struct device *gpio_dev = DEVICE_DT_GET(DT_NODELABEL(gpio0));
if (!device_is_ready(gpio_dev)) {
return -ENODEV;
}
gpio_pin_configure(gpio_dev, CPS_PIN, GPIO_OUTPUT);
gpio_pin_set(gpio_dev, CPS_PIN, 0); /* FEM active */
gpio_pin_configure(gpio_dev, CHL_PIN, GPIO_OUTPUT);
gpio_pin_set(gpio_dev, CHL_PIN, 1); /* Max power mode */
return 0;
}
SYS_INIT(myboard_fem_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);
Relevant .config values (from build)
CONFIG_DT_HAS_GENERIC_FEM_TWO_CTRL_PINS_ENABLED=y CONFIG_MPSL_FEM_ANY_SUPPORT=y CONFIG_MPSL_FEM_GENERIC_TWO_CTRL_PINS_SUPPORT=y CONFIG_MPSL_FEM_NCS_SUPPORTED_FEM_USED=y CONFIG_MPSL_FEM_API_AVAILABLE=y CONFIG_MPSL_FEM=y CONFIG_MPSL_FEM_SIMPLE_GPIO=y CONFIG_MPSL_FEM_DEVICE_CONFIG_254=y CONFIG_MPSL_FEM_INIT_PRIORITY=50 CONFIG_MPSL_FEM_PIN_FORWARDER=n CONFIG_NRF_802154_RADIO_DRIVER=y CONFIG_NRF_802154_MULTIPROTOCOL_SUPPORT=y CONFIG_NRF_802154_SL_OPENSOURCE=n CONFIG_NRF_802154_SOURCE_NRFXLIB=y CONFIG_NRF_802154_SL=y
What I've tried
- Various compatible strings ("skyworks,sky66112-11", "generic-fem-two-ctrl-pins", both)
- Different settle times (4µs, 23µs default, removing custom values)
- CONFIG_MPSL_FEM_SIMPLE_GPIO=y explicitly
- CONFIG_NRF_802154_SL_OPENSOURCE=y and =n
- CONFIG_MPSL_FEM_PIN_FORWARDER=y (doesn't apply to nRF52840)
- Different SYS_INIT priorities for board.c (PRE_KERNEL_1, POST_KERNEL, APPLICATION)
- Direct nrf_gpio HAL calls instead of Zephyr GPIO driver
- Verified FEM hardware works with manual GPIO control (CTX forced high = ~-23dBm)
Expected behavior
Actual behavior
Questions
- Is IEEE 802.15.4 raw mode + Simple GPIO FEM (SKY66112) supported in NCS 3.x?
- Was there a breaking change in the MPSL/802.15.4 FEM integration between NCS 2.4 and 3.x?
- Is there additional configuration required for FEM with 802.15.4 raw mode in NCS 3.1.1?