Skip to content

Commit 4fdc525

Browse files
committed
boards: fobe: add FoBE Quill nRF52840 Mesh board
This commit introduces the FoBE Quill nRF52840 Mesh board configuration, including device tree files, Kconfig settings, and necessary documentation. It also adds GPIO header definitions and updates vendor prefixes for proper identification. Signed-off-by: Chiho Sin <[email protected]>
1 parent f2f496d commit 4fdc525

17 files changed

+656
-0
lines changed

boards/fobe/index.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
.. _boards-fobe:
2+
3+
FoBE Studio
4+
###########
5+
6+
.. toctree::
7+
:maxdepth: 1
8+
:glob:
9+
10+
**/*
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# QUILL NRF52840 MESH board configuration
2+
3+
# Copyright (c) 2025 Chiho Sin
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
if BOARD_QUILL_NRF52840_MESH
7+
8+
source "boards/common/usb/Kconfig.cdc_acm_serial.defconfig"
9+
10+
endif # BOARD_QUILL_NRF52840_MESH
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# QUILL NRF52840 MESH board configuration
2+
3+
# Copyright (c) 2025 Chiho Sin
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
config BOARD_QUILL_NRF52840_MESH
7+
select SOC_NRF52840_QIAA
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# SPDX-License-Identifier: Apache-2.0
2+
3+
board_runner_args(nrfjprog "--nrf-family=NRF52")
4+
board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000")
5+
board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000")
6+
board_runner_args(uf2 "--board-id=nRF52840-FoBEF1101-rev1a")
7+
include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)
8+
include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)
9+
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)
10+
include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake)
11+
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake)
12+
include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake)
13+
include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
board:
2+
name: quill_nrf52840_mesh
3+
full_name: Quill nRF52840 Mesh
4+
vendor: fobe
5+
socs:
6+
- name: nrf52840
Binary file not shown.
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
.. zephyr:board:: quill_nrf52840_mesh
2+
3+
Overview
4+
********
5+
6+
The FoBE Quill nRF52840 Mesh is a development kit featuring the nRF52840 SoC and an integrated
7+
SX1262 LoRa® transceiver.
8+
9+
For more details see the `FoBE Quill nRF52840 Mesh`_ documentation page.
10+
11+
Hardware
12+
********
13+
14+
The FoBE Quill nRF52840 Mesh is a compact and versatile development platform for IoT solutions.
15+
It combines Nordic's high-end multiprotocol SoC, the nRF52840, with Semtech's ultra-low-power
16+
sub-GHz radio transceiver, the SX1262 (packaged using SiP technology).
17+
Designed for IoT applications, it offers a comprehensive wireless connectivity solution,
18+
supporting protocols such as Bluetooth 5, Thread, Zigbee, IEEE 802.15.4, and LoRa®.
19+
20+
This development board is feature-rich, including a battery charger,
21+
dedicated power path management, an ultra-low quiescent current DC-DC converter,
22+
a 1.14-inch color IPS display, user-programmable LEDs and buttons, an MFP expansion connector,
23+
a reversible USB-C connector, and header sockets for easy expansion.
24+
25+
Supported Features
26+
==================
27+
28+
.. zephyr:board-supported-hw::
29+
30+
Connections and IOs
31+
===================
32+
33+
The `FoBE Quill nRF52840 Mesh`_ Documentation has detailed information about board
34+
connections.
35+
36+
Programming and Debugging
37+
*************************
38+
39+
.. zephyr:board-supported-runners::
40+
41+
The Quill nRF52840 Mesh ships with the `FoBE nRF52 Bootloader`_ which supports flashing
42+
using `UF2`_. Doing so allows easy flashing of new images, but does not support debugging the
43+
device. For debugging please use `External Debugger`_.
44+
45+
UF2 Flashing
46+
============
47+
48+
To enter the bootloader, connect the USB port of the Quill nRF52840 Mesh to your host,
49+
and double tap the reset button. A mass storage device named ``FOBEBOOT`` should appear
50+
on the host. Using the command line, or your file manager copy the :file:`zephyr/zephyr.uf2`
51+
file from your build to the base of the ``FOBEBOOT`` mass storage device. The board will
52+
automatically reset and launch the newly flashed application.
53+
54+
External Debugger
55+
=================
56+
57+
In order to support debugging the device, instead of using the bootloader, you can use an
58+
:ref:`External Debug Probe <debug-probes>`. To flash and debug Zephyr applications you need to
59+
connect an SWD debugger to the SWD pins on the board.
60+
61+
For Segger J-Link debug probes, follow the instructions in the :ref:`jlink-external-debug-probe`
62+
page to install and configure all the necessary software.
63+
64+
Building & Flashing
65+
*******************
66+
67+
Simple build and flash
68+
======================
69+
70+
Build and flash applications as usual (see :ref:`build_an_application` and :ref:`application_run`
71+
for more details).
72+
73+
.. zephyr-app-commands::
74+
:zephyr-app: samples/hello_world
75+
:board: quill_nrf52840_mesh
76+
:goals: build
77+
78+
The usual ``flash`` target will work with the ``quill_nrf52840_mesh`` board configuration.
79+
Here is an example for the :zephyr:code-sample:`hello_world` application.
80+
81+
.. zephyr-app-commands::
82+
:zephyr-app: samples/hello_world
83+
:board: quill_nrf52840_mesh
84+
:goals: flash
85+
86+
Flashing with External Debugger
87+
--------------------------------
88+
89+
Setup and connect a supported debug probe (JLink, instructions at
90+
:ref:`jlink-external-debug-probe` or BlackMagic Probe). Then build and flash applications as usual.
91+
92+
Here is an example for the :zephyr:code-sample:`hello_world` application.
93+
94+
First, run your favorite terminal program to listen for output.
95+
96+
.. code-block:: console
97+
98+
$ minicom -D <tty_device> -b 115200
99+
100+
Replace :code:`<tty_device>` with the port where the board can be found. For example,
101+
under Linux, :code:`/dev/ttyACM0`.
102+
103+
Then build and flash the application. Just add ``CONFIG_BOOT_DELAY=5000`` to the configuration,
104+
so that USB CDC ACM is initialized before any text is printed:
105+
106+
.. zephyr-app-commands::
107+
:zephyr-app: samples/hello_world
108+
:board: quill_nrf52840_mesh
109+
:goals: build flash
110+
:gen-args: -DCONFIG_BOOT_DELAY=5000
111+
112+
Debugging
113+
*********
114+
115+
Refer to the :ref:`jlink-external-debug-probe` page to learn about debugging
116+
boards with a Segger IC.
117+
118+
Debugging using a BlackMagic Probe is also supported.
119+
120+
Here is an example for building and debugging the :zephyr:code-sample:`hello_world` application.
121+
122+
.. zephyr-app-commands::
123+
:zephyr-app: samples/hello_world
124+
:board: quill_nrf52840_mesh
125+
:goals: debug
126+
127+
Testing the LEDs
128+
*****************
129+
130+
There is a sample that allows to test that LEDs on the board are working properly with Zephyr:
131+
132+
.. zephyr-app-commands::
133+
:zephyr-app: samples/basic/blinky
134+
:board: quill_nrf52840_mesh
135+
:goals: build flash
136+
137+
You can build and flash the examples to make sure Zephyr is running correctly on your board.
138+
139+
Testing shell over USB
140+
***********************
141+
142+
There is a sample that allows to test shell interface over USB CDC ACM interface with Zephyr:
143+
144+
.. zephyr-app-commands::
145+
:zephyr-app: samples/subsys/shell/shell_module
146+
:board: quill_nrf52840_mesh
147+
:goals: build flash
148+
149+
References
150+
**********
151+
152+
.. target-notes::
153+
154+
.. _`FoBE Quill nRF52840 Mesh`: https://docs.fobestudio.com/product/f1101
155+
.. _`FoBE nRF52 Bootloader`: https://github.com/fobe-projects/fobe-nrf52-bootloader
156+
.. _`UF2`: https://github.com/microsoft/uf2
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (c) 2025 Chiho Sin
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/ {
8+
quill_header: connector {
9+
compatible = "fobe,quill-header";
10+
#gpio-cells = <2>;
11+
gpio-map-mask = <0xffffffff 0xffffffc0>;
12+
gpio-map-pass-thru = <0 0x3f>;
13+
gpio-map = <0 0 &gpio1 12 0>, /* D0 */
14+
<1 0 &gpio1 11 0>, /* D1 */
15+
<2 0 &gpio1 14 0>, /* D2 */
16+
<3 0 &gpio1 0 0>, /* D3 */
17+
<4 0 &gpio0 24 0>, /* D4 */
18+
<5 0 &gpio0 22 0>, /* D5 */
19+
<6 0 &gpio0 20 0>, /* D6 */
20+
<7 0 &gpio0 17 0>, /* D7 */
21+
<8 0 &gpio0 15 0>, /* D8 */
22+
<9 0 &gpio0 13 0>, /* D9 */
23+
<10 0 &gpio0 16 0>, /* D10 */
24+
<11 0 &gpio0 14 0>, /* D11 */
25+
<12 0 &gpio0 11 0>, /* D12 */
26+
<13 0 &gpio1 8 0>, /* D13 */
27+
<14 0 &gpio0 3 0>, /* A0 */
28+
<15 0 &gpio0 28 0>, /* A1 */
29+
<16 0 &gpio0 2 0>, /* A2 */
30+
<17 0 &gpio0 29 0>, /* A3 */
31+
<18 0 &gpio0 31 0>, /* A4 */
32+
<19 0 &gpio0 30 0>; /* A5 */
33+
};
34+
};
35+
36+
quill_spi: &spi2 {};
37+
quill_i2c: &i2c0 {};
38+
quill_serial: &uart0 {};
39+
quill_adc: &adc {};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Copyright (c) 2022 Nordic Semiconductor
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
# Suppress "unique_unit_address_if_enabled" to handle the following overlaps:
5+
# - power@40000000 & clock@40000000 & bprot@40000000
6+
# - acl@4001e000 & flash-controller@4001e000
7+
list(APPEND EXTRA_DTC_FLAGS "-Wno-unique_unit_address_if_enabled")
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* Copyright (c) 2025 Chiho Sin
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
&pinctrl {
8+
uart0_default: uart0_default {
9+
group1 {
10+
psels = <NRF_PSEL(UART_TX, 1, 12)>;
11+
};
12+
13+
group2 {
14+
psels = <NRF_PSEL(UART_RX, 1, 11)>;
15+
bias-pull-up;
16+
};
17+
};
18+
19+
uart0_sleep: uart0_sleep {
20+
group1 {
21+
psels = <NRF_PSEL(UART_TX, 1, 12)>,
22+
<NRF_PSEL(UART_RX, 1, 11)>;
23+
low-power-enable;
24+
};
25+
};
26+
27+
i2c0_default: i2c0_default {
28+
group1 {
29+
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
30+
<NRF_PSEL(TWIM_SCL, 0, 24)>;
31+
};
32+
};
33+
34+
i2c0_sleep: i2c0_sleep {
35+
group1 {
36+
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
37+
<NRF_PSEL(TWIM_SCL, 0, 24)>;
38+
low-power-enable;
39+
};
40+
};
41+
42+
pwm0_default: pwm0_default {
43+
group1 {
44+
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
45+
nordic,invert;
46+
};
47+
};
48+
49+
pwm0_sleep: pwm0_sleep {
50+
group1 {
51+
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
52+
low-power-enable;
53+
};
54+
};
55+
56+
spi2_default: spi2_default {
57+
group1 {
58+
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
59+
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
60+
<NRF_PSEL(SPIM_MISO, 0, 19)>;
61+
};
62+
};
63+
64+
spi2_sleep: spi2_sleep {
65+
group1 {
66+
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
67+
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
68+
<NRF_PSEL(SPIM_MISO, 0, 19)>;
69+
low-power-enable;
70+
};
71+
};
72+
73+
spi3_default: spi3_default {
74+
group1 {
75+
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
76+
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
77+
};
78+
};
79+
80+
spi3_sleep: spi3_sleep {
81+
group1 {
82+
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
83+
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
84+
low-power-enable;
85+
};
86+
};
87+
};

0 commit comments

Comments
 (0)