Skip to content

Commit a4df35a

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: ChihoSin [email protected]
1 parent f2f496d commit a4df35a

16 files changed

+665
-0
lines changed
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
1.22 MB
Loading
655 KB
Loading
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
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 SX1262 LoRa® transceiver.
7+
8+
For more details see the `FoBE Quill nRF52840 Mesh`_ documentation page.
9+
10+
.. figure:: img/quill_nrf52840_mesh.png
11+
:align: center
12+
:alt: Quill nRF52840 Mesh
13+
14+
Quill nRF52840 Mesh
15+
16+
Hardware
17+
********
18+
19+
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®.
20+
21+
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.
22+
23+
Supported Features
24+
==================
25+
26+
.. zephyr:board-supported-hw::
27+
28+
Connections and IOs
29+
===================
30+
31+
The board uses a standard Quill pinout, the default pin mapping is the following:
32+
33+
.. figure:: img/quill_nrf52840_mesh_pinout.png
34+
:align: center
35+
:alt: Quill nRF52840 Mesh Pinout
36+
37+
Quill nRF52840 Mesh Pinout
38+
39+
Programming and Debugging
40+
*************************
41+
42+
.. zephyr:board-supported-runners::
43+
44+
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`_.
45+
46+
UF2 Flashing
47+
============
48+
49+
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 ``QUILLNRF`` 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 ``QUILLNRF`` mass storage device. The board will automatically reset and launch the newly flashed application.
50+
51+
External Debugger
52+
=================
53+
54+
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.
55+
56+
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.
57+
58+
Building & Flashing
59+
*******************
60+
61+
Simple build and flash
62+
======================
63+
64+
Build and flash applications as usual (see :ref:`build_an_application` and :ref:`application_run` for more details).
65+
66+
.. tabs::
67+
68+
.. group-tab:: Quill nRF52840 Mesh
69+
70+
.. zephyr-app-commands::
71+
:zephyr-app: samples/hello_world
72+
:board: quill_nrf52840_mesh
73+
:goals: build
74+
75+
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.
76+
77+
.. tabs::
78+
79+
.. group-tab:: Quill nRF52840 Mesh
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 :ref:`jlink-external-debug-probe` or BlackMagic Probe). Then build and flash applications as usual.
90+
91+
Here is an example for the :zephyr:code-sample:`hello_world` application.
92+
93+
First, run your favorite terminal program to listen for output.
94+
95+
.. code-block:: console
96+
97+
$ minicom -D <tty_device> -b 115200
98+
99+
Replace :code:`<tty_device>` with the port where the board can be found. For example, under Linux, :code:`/dev/ttyACM0`.
100+
101+
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:
102+
103+
.. tabs::
104+
105+
.. group-tab:: Quill nRF52840 Mesh
106+
107+
.. zephyr-app-commands::
108+
:zephyr-app: samples/hello_world
109+
:board: quill_nrf52840_mesh
110+
:goals: build flash
111+
:gen-args: -DCONFIG_BOOT_DELAY=5000
112+
113+
Debugging
114+
*********
115+
116+
Refer to the :ref:`jlink-external-debug-probe` page to learn about debugging 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+
.. tabs::
123+
124+
.. group-tab:: Quill nRF52840 Mesh
125+
126+
.. zephyr-app-commands::
127+
:zephyr-app: samples/hello_world
128+
:board: quill_nrf52840_mesh
129+
:goals: debug
130+
131+
Testing the LEDs
132+
*****************
133+
134+
There is a sample that allows to test that LEDs on the board are working properly with Zephyr:
135+
136+
.. tabs::
137+
138+
.. group-tab:: Quill nRF52840 Mesh
139+
140+
.. zephyr-app-commands::
141+
:zephyr-app: samples/basic/blinky
142+
:board: quill_nrf52840_mesh
143+
:goals: build flash
144+
145+
You can build and flash the examples to make sure Zephyr is running correctly on your board.
146+
147+
Testing shell over USB
148+
***********************
149+
150+
There is a sample that allows to test shell interface over USB CDC ACM interface with Zephyr:
151+
152+
.. tabs::
153+
154+
.. group-tab:: Quill nRF52840 Mesh
155+
156+
.. zephyr-app-commands::
157+
:zephyr-app: samples/subsys/shell/shell_module
158+
:board: quill_nrf52840_mesh
159+
:goals: build flash
160+
161+
References
162+
**********
163+
164+
.. target-notes::
165+
166+
.. _`FoBE Quill nRF52840 Mesh`: https://docs.fobestudio.com/product/f1101
167+
.. _`FoBE nRF52 Bootloader`: https://github.com/fobe-projects/fobe-nrf52-bootloader
168+
.. _`UF2`: https://github.com/microsoft/uf2
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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
14+
= <0 0 &gpio1 12 0> /* D0 */
15+
, <1 0 &gpio1 11 0> /* D1 */
16+
, <2 0 &gpio1 14 0> /* D2 */
17+
, <3 0 &gpio1 0 0> /* D3 */
18+
, <4 0 &gpio0 24 0> /* D4 */
19+
, <5 0 &gpio0 22 0> /* D5 */
20+
, <6 0 &gpio0 20 0> /* D6 */
21+
, <7 0 &gpio0 17 0> /* D7 */
22+
, <8 0 &gpio0 15 0> /* D8 */
23+
, <9 0 &gpio0 13 0> /* D9 */
24+
, <10 0 &gpio0 16 0> /* D10 */
25+
, <11 0 &gpio0 14 0> /* D11 */
26+
, <12 0 &gpio0 11 0> /* D12 */
27+
, <13 0 &gpio1 8 0> /* D13 */
28+
, <14 0 &gpio0 3 0> /* A0 */
29+
, <15 0 &gpio0 28 0> /* A1 */
30+
, <16 0 &gpio0 2 0> /* A2 */
31+
, <17 0 &gpio0 29 0> /* A3 */
32+
, <18 0 &gpio0 31 0> /* A4 */
33+
, <19 0 &gpio0 30 0> /* A5 */
34+
;
35+
};
36+
};
37+
38+
quill_spi: &spi2 {};
39+
quill_i2c: &i2c0 {};
40+
quill_serial: &uart0 {};
41+
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+
group2 {
13+
psels = <NRF_PSEL(UART_RX, 1, 11)>;
14+
bias-pull-up;
15+
};
16+
};
17+
18+
uart0_sleep: uart0_sleep {
19+
group1 {
20+
psels = <NRF_PSEL(UART_TX, 1, 12)>,
21+
<NRF_PSEL(UART_RX, 1, 11)>;
22+
low-power-enable;
23+
};
24+
};
25+
26+
i2c0_default: i2c0_default {
27+
group1 {
28+
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
29+
<NRF_PSEL(TWIM_SCL, 0, 24)>;
30+
};
31+
};
32+
33+
i2c0_sleep: i2c0_sleep {
34+
group1 {
35+
psels = <NRF_PSEL(TWIM_SDA, 0, 22)>,
36+
<NRF_PSEL(TWIM_SCL, 0, 24)>;
37+
low-power-enable;
38+
};
39+
};
40+
41+
pwm0_default: pwm0_default {
42+
group1 {
43+
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
44+
nordic,invert;
45+
};
46+
};
47+
48+
pwm0_sleep: pwm0_sleep {
49+
group1 {
50+
psels = <NRF_PSEL(PWM_OUT0, 1, 15)>;
51+
low-power-enable;
52+
};
53+
};
54+
55+
spi2_default: spi2_default {
56+
group1 {
57+
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
58+
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
59+
<NRF_PSEL(SPIM_MISO, 0, 19)>;
60+
};
61+
};
62+
63+
spi2_sleep: spi2_sleep {
64+
group1 {
65+
psels = <NRF_PSEL(SPIM_SCK, 0, 23)>,
66+
<NRF_PSEL(SPIM_MOSI, 0, 21)>,
67+
<NRF_PSEL(SPIM_MISO, 0, 19)>;
68+
low-power-enable;
69+
};
70+
};
71+
72+
spi3_default: spi3_default {
73+
group1 {
74+
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
75+
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
76+
};
77+
};
78+
79+
spi3_sleep: spi3_sleep {
80+
group1 {
81+
psels = <NRF_PSEL(SPIM_SCK, 1, 9)>,
82+
<NRF_PSEL(SPIM_MOSI, 0, 8)>;
83+
low-power-enable;
84+
};
85+
};
86+
87+
};

0 commit comments

Comments
 (0)