Skip to content

boards: fobe: add FoBE Quill nRF52840 Mesh board #94292

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions boards/fobe/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
.. _boards-fobe:

FoBE Studio
###########

.. toctree::
:maxdepth: 1
:glob:

**/*
10 changes: 10 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/Kconfig.defconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# QUILL NRF52840 MESH board configuration

# Copyright (c) 2025 Chiho Sin
# SPDX-License-Identifier: Apache-2.0

if BOARD_QUILL_NRF52840_MESH

source "boards/common/usb/Kconfig.cdc_acm_serial.defconfig"

endif # BOARD_QUILL_NRF52840_MESH
7 changes: 7 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/Kconfig.quill_nrf52840_mesh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# QUILL NRF52840 MESH board configuration

# Copyright (c) 2025 Chiho Sin
# SPDX-License-Identifier: Apache-2.0

config BOARD_QUILL_NRF52840_MESH
select SOC_NRF52840_QIAA
13 changes: 13 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/board.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# SPDX-License-Identifier: Apache-2.0

board_runner_args(nrfjprog "--nrf-family=NRF52")
board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000")
board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000")
board_runner_args(uf2 "--board-id=nRF52840-FoBEF1101-rev1a")
include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)
include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake)
include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake)
6 changes: 6 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/board.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
board:
name: quill_nrf52840_mesh
full_name: Quill nRF52840 Mesh
vendor: fobe
socs:
- name: nrf52840
Binary file not shown.
156 changes: 156 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/doc/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
.. zephyr:board:: quill_nrf52840_mesh

Overview
********

The FoBE Quill nRF52840 Mesh is a development kit featuring the nRF52840 SoC and an integrated
SX1262 LoRa® transceiver.

For more details see the `FoBE Quill nRF52840 Mesh`_ documentation page.

Hardware
********

The FoBE Quill nRF52840 Mesh is a compact and versatile development platform for IoT solutions.
It combines Nordic's high-end multiprotocol SoC, the nRF52840, with Semtech's ultra-low-power
sub-GHz radio transceiver, the SX1262 (packaged using SiP technology).
Designed for IoT applications, it offers a comprehensive wireless connectivity solution,
supporting protocols such as Bluetooth 5, Thread, Zigbee, IEEE 802.15.4, and LoRa®.

This development board is feature-rich, including a battery charger,
dedicated power path management, an ultra-low quiescent current DC-DC converter,
a 1.14-inch color IPS display, user-programmable LEDs and buttons, an MFP expansion connector,
a reversible USB-C connector, and header sockets for easy expansion.

Supported Features
==================

.. zephyr:board-supported-hw::

Connections and IOs
===================

The `FoBE Quill nRF52840 Mesh`_ Documentation has detailed information about board
connections.

Programming and Debugging
*************************

.. zephyr:board-supported-runners::

The Quill nRF52840 Mesh ships with the `FoBE nRF52 Bootloader`_ which supports flashing
using `UF2`_. Doing so allows easy flashing of new images, but does not support debugging the
device. For debugging please use `External Debugger`_.

UF2 Flashing
============

To enter the bootloader, connect the USB port of the Quill nRF52840 Mesh to your host,
and double tap the reset button. A mass storage device named ``FOBEBOOT`` should appear
on the host. Using the command line, or your file manager copy the :file:`zephyr/zephyr.uf2`
file from your build to the base of the ``FOBEBOOT`` mass storage device. The board will
automatically reset and launch the newly flashed application.

External Debugger
=================

In order to support debugging the device, instead of using the bootloader, you can use an
:ref:`External Debug Probe <debug-probes>`. To flash and debug Zephyr applications you need to
connect an SWD debugger to the SWD pins on the board.

For Segger J-Link debug probes, follow the instructions in the :ref:`jlink-external-debug-probe`
page to install and configure all the necessary software.

Building & Flashing
*******************

Simple build and flash
======================

Build and flash applications as usual (see :ref:`build_an_application` and :ref:`application_run`
for more details).

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: quill_nrf52840_mesh
:goals: build

The usual ``flash`` target will work with the ``quill_nrf52840_mesh`` board configuration.
Here is an example for the :zephyr:code-sample:`hello_world` application.

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: quill_nrf52840_mesh
:goals: flash

Flashing with External Debugger
--------------------------------

Setup and connect a supported debug probe (JLink, instructions at
:ref:`jlink-external-debug-probe` or BlackMagic Probe). Then build and flash applications as usual.

Here is an example for the :zephyr:code-sample:`hello_world` application.

First, run your favorite terminal program to listen for output.

.. code-block:: console

$ minicom -D <tty_device> -b 115200

Replace :code:`<tty_device>` with the port where the board can be found. For example,
under Linux, :code:`/dev/ttyACM0`.

Then build and flash the application. Just add ``CONFIG_BOOT_DELAY=5000`` to the configuration,
so that USB CDC ACM is initialized before any text is printed:

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: quill_nrf52840_mesh
:goals: build flash
:gen-args: -DCONFIG_BOOT_DELAY=5000

Debugging
*********

Refer to the :ref:`jlink-external-debug-probe` page to learn about debugging
boards with a Segger IC.

Debugging using a BlackMagic Probe is also supported.

Here is an example for building and debugging the :zephyr:code-sample:`hello_world` application.

.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: quill_nrf52840_mesh
:goals: debug

Testing the LEDs
*****************

There is a sample that allows to test that LEDs on the board are working properly with Zephyr:

.. zephyr-app-commands::
:zephyr-app: samples/basic/blinky
:board: quill_nrf52840_mesh
:goals: build flash

You can build and flash the examples to make sure Zephyr is running correctly on your board.

Testing shell over USB
***********************

There is a sample that allows to test shell interface over USB CDC ACM interface with Zephyr:

.. zephyr-app-commands::
:zephyr-app: samples/subsys/shell/shell_module
:board: quill_nrf52840_mesh
:goals: build flash

References
**********

.. target-notes::

.. _`FoBE Quill nRF52840 Mesh`: https://docs.fobestudio.com/product/f1101
.. _`FoBE nRF52 Bootloader`: https://github.com/fobe-projects/fobe-nrf52-bootloader
.. _`UF2`: https://github.com/microsoft/uf2
39 changes: 39 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/fobe_quill_connector.dtsi
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2025 Chiho Sin
*
* SPDX-License-Identifier: Apache-2.0
*/

/ {
quill_header: connector {
compatible = "fobe,quill-header";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpio1 12 0>, /* D0 */
<1 0 &gpio1 11 0>, /* D1 */
<2 0 &gpio1 14 0>, /* D2 */
<3 0 &gpio1 0 0>, /* D3 */
<4 0 &gpio0 24 0>, /* D4 */
<5 0 &gpio0 22 0>, /* D5 */
<6 0 &gpio0 20 0>, /* D6 */
<7 0 &gpio0 17 0>, /* D7 */
<8 0 &gpio0 15 0>, /* D8 */
<9 0 &gpio0 13 0>, /* D9 */
<10 0 &gpio0 16 0>, /* D10 */
<11 0 &gpio0 14 0>, /* D11 */
<12 0 &gpio0 11 0>, /* D12 */
<13 0 &gpio1 8 0>, /* D13 */
<14 0 &gpio0 3 0>, /* A0 */
<15 0 &gpio0 28 0>, /* A1 */
<16 0 &gpio0 2 0>, /* A2 */
<17 0 &gpio0 29 0>, /* A3 */
<18 0 &gpio0 31 0>, /* A4 */
<19 0 &gpio0 30 0>; /* A5 */
};
};

quill_spi: &spi2 {};
quill_i2c: &i2c0 {};
quill_serial: &uart0 {};
quill_adc: &adc {};
7 changes: 7 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/pre_dt_board.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Copyright (c) 2022 Nordic Semiconductor
# SPDX-License-Identifier: Apache-2.0

# Suppress "unique_unit_address_if_enabled" to handle the following overlaps:
# - power@40000000 & clock@40000000 & bprot@40000000
# - acl@4001e000 & flash-controller@4001e000
list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled")
87 changes: 87 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/quill_nrf52840_mesh-pinctrl.dtsi
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*
* Copyright (c) 2025 Chiho Sin
*
* SPDX-License-Identifier: Apache-2.0
*/

&pinctrl {
uart0_default: uart0_default {
group1 {
psels = <NRF_PSEL(UART_TX, 1, 12)>;
};

group2 {
psels = <NRF_PSEL(UART_RX, 1, 11)>;
bias-pull-up;
};
};

uart0_sleep: uart0_sleep {
group1 {
psels = <NRF_PSEL(UART_TX, 1, 12)>,
<NRF_PSEL(UART_RX, 1, 11)>;
low-power-enable;
};
};

i2c0_default: i2c0_default {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
<NRF_PSEL(TWIM_SCL, 0, 24)>;
};
};

i2c0_sleep: i2c0_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
<NRF_PSEL(TWIM_SCL, 0, 24)>;
low-power-enable;
};
};

pwm0_default: pwm0_default {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
nordic,invert;
};
};

pwm0_sleep: pwm0_sleep {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
low-power-enable;
};
};

spi2_default: spi2_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
<NRF_PSEL(SPIM_MISO, 0, 19)>;
};
};

spi2_sleep: spi2_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
<NRF_PSEL(SPIM_MISO, 0, 19)>;
low-power-enable;
};
};

spi3_default: spi3_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
};
};

spi3_sleep: spi3_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
low-power-enable;
};
};
};
13 changes: 13 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/quill_nrf52840_mesh.dts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* Copyright (c) 2025 Chiho Sin
*
* SPDX-License-Identifier: Apache-2.0
*/

/dts-v1/;
#include "quill_nrf52840_mesh_common.dtsi"

/ {
model = "FoBE Quill nRF52840 Mesh";
compatible = "fobe,quill-nrf52840-mesh";
};
23 changes: 23 additions & 0 deletions boards/fobe/quill_nrf52840_mesh/quill_nrf52840_mesh.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
identifier: quill_nrf52840_mesh
name: Quill nRF52840 Mesh
type: mcu
arch: arm
ram: 256
flash: 1024
toolchain:
- zephyr
- gnuarmemb
supported:
- adc
- ble
- counter
- gpio
- lora
- i2c
- i2s
- pwm
- spi
- usb_device
- watchdog
- netif:openthread
vendor: fobe
Loading
Loading