From b6ed4ba76168afd2ed84be6687dcee80a690b6b9 Mon Sep 17 00:00:00 2001 From: Jacob Winther Date: Sun, 21 Jul 2024 21:03:27 +1200 Subject: [PATCH] boards: Add Adafruit Feather nrf52840 Sense Add support for board based on the Express variant. Board uses uf2 as it has no swd adaptor. Signed-off-by: Jacob Winther --- boards/adafruit/feather_nrf52840/Kconfig | 9 +- .../Kconfig.adafruit_feather_nrf52840_sense | 8 ++ .../feather_nrf52840/Kconfig.defconfig | 46 ++++++- .../adafruit_feather_nrf52840_common.dtsi | 130 ++++++++++++++++++ .../adafruit_feather_nrf52840_express.dts | 116 +--------------- .../adafruit_feather_nrf52840_express.yaml | 2 +- .../adafruit_feather_nrf52840_sense.dts | 78 +++++++++++ .../adafruit_feather_nrf52840_sense.yaml | 19 +++ .../adafruit_feather_nrf52840_sense_defconfig | 25 ++++ boards/adafruit/feather_nrf52840/board.cmake | 3 + boards/adafruit/feather_nrf52840/board.yml | 14 +- ... => adafruit_feather_nrf52840_express.jpg} | Bin .../img/adafruit_feather_nrf52840_sense.jpg | Bin 0 -> 35527 bytes .../adafruit/feather_nrf52840/doc/index.rst | 127 +++++++++++++---- .../adafruit_feather_nrf52840_sense.overlay | 7 + 15 files changed, 432 insertions(+), 152 deletions(-) create mode 100644 boards/adafruit/feather_nrf52840/Kconfig.adafruit_feather_nrf52840_sense create mode 100644 boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_common.dtsi create mode 100644 boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.dts create mode 100644 boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.yaml create mode 100644 boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense_defconfig rename boards/adafruit/feather_nrf52840/doc/img/{adafruit_feather_nrf52840.jpg => adafruit_feather_nrf52840_express.jpg} (100%) create mode 100644 boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840_sense.jpg create mode 100644 tests/drivers/adc/adc_api/boards/adafruit_feather_nrf52840_sense.overlay diff --git a/boards/adafruit/feather_nrf52840/Kconfig b/boards/adafruit/feather_nrf52840/Kconfig index 9445ee79dc2..a315e78c179 100644 --- a/boards/adafruit/feather_nrf52840/Kconfig +++ b/boards/adafruit/feather_nrf52840/Kconfig @@ -8,4 +8,11 @@ config BOARD_ENABLE_DCDC bool "DCDC mode" select SOC_DCDC_NRF52X default y - depends on BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS + depends on BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS || BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE + +if BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE +config BOARD_SERIAL_BACKEND_CDC_ACM + bool "USB CDC" + default y + +endif # BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE diff --git a/boards/adafruit/feather_nrf52840/Kconfig.adafruit_feather_nrf52840_sense b/boards/adafruit/feather_nrf52840/Kconfig.adafruit_feather_nrf52840_sense new file mode 100644 index 00000000000..126e60355d6 --- /dev/null +++ b/boards/adafruit/feather_nrf52840/Kconfig.adafruit_feather_nrf52840_sense @@ -0,0 +1,8 @@ +# Adafruit Feather nRF52840 Express board configuration + +# Copyright (c) 2020 Tobias Svehagen +# Copyright (c) 2024 Jacob Winther +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE + select SOC_NRF52840_QIAA diff --git a/boards/adafruit/feather_nrf52840/Kconfig.defconfig b/boards/adafruit/feather_nrf52840/Kconfig.defconfig index 1b1038d3340..8cdb39e07f0 100644 --- a/boards/adafruit/feather_nrf52840/Kconfig.defconfig +++ b/boards/adafruit/feather_nrf52840/Kconfig.defconfig @@ -4,9 +4,51 @@ # Copyright (c) 2024 Jacob Winther # SPDX-License-Identifier: Apache-2.0 -if BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS +if (BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS || BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE) config BT_CTLR default BT -endif # BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS +if BOARD_SERIAL_BACKEND_CDC_ACM + +config USB_DEVICE_STACK + default y + +config USB_CDC_ACM + default SERIAL + +config UART_CONSOLE + default CONSOLE + +config USB_DEVICE_INITIALIZE_AT_BOOT + default y if CONSOLE + +config SHELL_BACKEND_SERIAL_CHECK_DTR + default SHELL + depends on UART_LINE_CTRL + +config UART_LINE_CTRL + default SHELL + +config USB_DEVICE_REMOTE_WAKEUP + default n + +if LOG + +# Logger cannot use itself to log +config USB_CDC_ACM_LOG_LEVEL + default 0 + +# Set USB log level to error only +config USB_DEVICE_LOG_LEVEL + default 1 + +# Wait 1500ms at startup for logging +config LOG_PROCESS_THREAD_STARTUP_DELAY_MS + default 1500 + +endif # LOG + +endif # BOARD_SERIAL_BACKEND_CDC_ACM + +endif # BOARD_ADAFRUIT_FEATHER_NRF52840_EXPRESS || BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_common.dtsi b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_common.dtsi new file mode 100644 index 00000000000..03a4e42b585 --- /dev/null +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_common.dtsi @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2020 Tobias Svehagen + * Copyright (c) 2024 Jacob Winther + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "feather_connector.dtsi" +#include "adafruit_feather_nrf52840-pinctrl.dtsi" +#include + +/ { + + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,ieee802154 = &ieee802154; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + label = "Red LED"; + }; + led1: led_1 { + gpios = <&gpio1 10 0>; + label = "Blue LED"; + }; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio1 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch"; + zephyr,code = ; + }; + }; + + vbatt { + compatible = "voltage-divider"; + io-channels = <&adc 5>; + output-ohms = <100000>; + full-ohms = <(100000 + 100000)>; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led0; + led1 = &led1; + sw0 = &button0; + watchdog0 = &wdt0; + }; +}; + +&adc { + status = "okay"; +}; + +&uicr { + gpio-as-nreset; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&uart0 { + compatible = "nordic,nrf-uart"; + current-speed = <115200>; + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&i2c0 { + compatible = "nordic,nrf-twi"; + status = "okay"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&spi1 { + compatible = "nordic,nrf-spi"; + status = "okay"; + pinctrl-0 = <&spi1_default>; + pinctrl-1 = <&spi1_sleep>; + pinctrl-names = "default", "sleep"; +}; + +&qspi { + status = "okay"; + pinctrl-0 = <&qspi_default>; + pinctrl-1 = <&qspi_sleep>; + pinctrl-names = "default", "sleep"; + gd25q16: gd25q16@0 { + compatible = "nordic,qspi-nor"; + reg = <0>; + writeoc = "pp4o"; + readoc = "read4io"; + sck-frequency = <16000000>; + jedec-id = [ c8 40 15 ]; + size = <16777216>; + has-dpd; + t-enter-dpd = <20000>; + t-exit-dpd = <20000>; + quad-enable-requirements = "S2B1v1"; + }; +}; + +&ieee802154 { + status = "okay"; +}; + +zephyr_udc0: &usbd { + compatible = "nordic,nrf-usbd"; + status = "okay"; +}; diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.dts b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.dts index 30e2a13b309..143ae5b992b 100644 --- a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.dts +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.dts @@ -6,14 +6,12 @@ */ /dts-v1/; -#include -#include "feather_connector.dtsi" -#include "adafruit_feather_nrf52840-pinctrl.dtsi" -#include + +#include "adafruit_feather_nrf52840_common.dtsi" / { model = "Adafruit Feather nRF52840 Express"; - compatible = "adafruit,feather-nrf52840-express"; + compatible = "adafruit,feather_nrf52840-express"; chosen { zephyr,console = &uart0; @@ -21,120 +19,17 @@ zephyr,uart-mcumgr = &uart0; zephyr,bt-mon-uart = &uart0; zephyr,bt-c2h-uart = &uart0; - zephyr,sram = &sram0; - zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; - zephyr,ieee802154 = &ieee802154; }; leds { - compatible = "gpio-leds"; led0: led_0 { gpios = <&gpio1 15 0>; - label = "Red LED"; - }; - led1: led_1 { - gpios = <&gpio1 10 0>; - label = "Blue LED"; }; }; - - buttons { - compatible = "gpio-keys"; - button0: button_0 { - gpios = <&gpio1 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; - label = "Push button switch"; - zephyr,code = ; - }; - }; - - vbatt { - compatible = "voltage-divider"; - io-channels = <&adc 5>; - output-ohms = <100000>; - full-ohms = <(100000 + 100000)>; - }; - - /* These aliases are provided for compatibility with samples */ - aliases { - led0 = &led0; - led1 = &led1; - sw0 = &button0; - watchdog0 = &wdt0; - }; -}; - -&adc { - status = "okay"; -}; - -&uicr { - gpio-as-nreset; -}; - -&gpiote { - status = "okay"; -}; - -&gpio0 { - status = "okay"; -}; - -&gpio1 { - status = "okay"; -}; - -&uart0 { - compatible = "nordic,nrf-uart"; - current-speed = <115200>; - status = "okay"; - pinctrl-0 = <&uart0_default>; - pinctrl-1 = <&uart0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&i2c0 { - compatible = "nordic,nrf-twi"; - status = "okay"; - pinctrl-0 = <&i2c0_default>; - pinctrl-1 = <&i2c0_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&spi1 { - compatible = "nordic,nrf-spi"; - status = "okay"; - pinctrl-0 = <&spi1_default>; - pinctrl-1 = <&spi1_sleep>; - pinctrl-names = "default", "sleep"; -}; - -&qspi { - status = "okay"; - pinctrl-0 = <&qspi_default>; - pinctrl-1 = <&qspi_sleep>; - pinctrl-names = "default", "sleep"; - gd25q16: gd25q16@0 { - compatible = "nordic,qspi-nor"; - reg = <0>; - writeoc = "pp4o"; - readoc = "read4io"; - sck-frequency = <16000000>; - jedec-id = [c8 40 15]; - size = <16777216>; - has-dpd; - t-enter-dpd = <20000>; - t-exit-dpd = <20000>; - quad-enable-requirements = "S2B1v1"; - }; -}; - -&ieee802154 { - status = "okay"; }; &flash0 { - partitions { compatible = "fixed-partitions"; #address-cells = <1>; @@ -169,8 +64,3 @@ }; }; }; - -zephyr_udc0: &usbd { - compatible = "nordic,nrf-usbd"; - status = "okay"; -}; diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.yaml b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.yaml index 11c2d97176d..7f49fe1b108 100644 --- a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.yaml +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_express.yaml @@ -1,4 +1,4 @@ -identifier: adafruit_feather_nrf52840_express/nrf52840 +identifier: adafruit_feather_nrf52840_express name: Adafruit Feather nRF52840 Express type: mcu arch: arm diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.dts b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.dts new file mode 100644 index 00000000000..ad85a18d59d --- /dev/null +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.dts @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2020 Tobias Svehagen + * Copyright (c) 2024 Jacob Winther + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include "adafruit_feather_nrf52840_common.dtsi" + +/ { + model = "Adafruit Feather nRF52840 Sense"; + compatible = "adafruit,feather_nrf52840-sense"; + + chosen { + zephyr,console = &cdc_acm_uart0; + zephyr,shell-uart = &cdc_acm_uart0; + zephyr,uart-mcumgr = &cdc_acm_uart0; + zephyr,bt-mon-uart = &cdc_acm_uart0; + zephyr,bt-c2h-uart = &cdc_acm_uart0; + zephyr,code-partition = &code_partition; + }; + + leds { + led0: led_0 { + gpios = <&gpio1 9 0>; + }; + }; +}; + +&i2c0 { + SHT3XD: sht3xd@44 { + compatible = "sensirion,sht3xd"; + reg = <0x44>; + }; +}; + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* To enable flashing with UF2 bootloader, we + * must reserve a partition for SoftDevice. + * See https://learn.adafruit.com/ + * introducing-the-adafruit-nrf52840-feather?view=all#hathach-memory-map + */ + reserved_partition_0: partition@0 { + label = "SoftDevice"; + reg = <0x000000000 DT_SIZE_K(152)>; + }; + code_partition: partition@26000 { + label = "Application"; + reg = <0x00026000 DT_SIZE_K(796)>; + }; + + /* + * The flash starting at 0x000ed000 and ending at + * 0x000f4000 is reserved for use by the application. + */ + storage_partition: partition@ed000 { + label = "storage"; + reg = <0x0000ed000 DT_SIZE_K(28)>; + }; + + boot_partition: partition@f4000 { + label = "UF2"; + reg = <0x000f4000 DT_SIZE_K(48)>; + }; + }; +}; + +zephyr_udc0: &usbd { + cdc_acm_uart0: cdc_acm_uart0 { + compatible = "zephyr,cdc-acm-uart"; + }; +}; diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.yaml b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.yaml new file mode 100644 index 00000000000..cf4a04dcf18 --- /dev/null +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense.yaml @@ -0,0 +1,19 @@ +identifier: adafruit_feather_nrf52840_sense +name: Adafruit Feather nRF52840 Sense +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - usb_cdc + - ble + - watchdog + - counter + - feather_serial + - feather_i2c + - feather_spi +vendor: adafruit diff --git a/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense_defconfig b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense_defconfig new file mode 100644 index 00000000000..d656ab0dbf1 --- /dev/null +++ b/boards/adafruit/feather_nrf52840/adafruit_feather_nrf52840_sense_defconfig @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# enable uart driver +CONFIG_SERIAL=y + +# enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# 32kHz clock source +CONFIG_CLOCK_CONTROL_NRF_K32SRC_RC=y +CONFIG_CLOCK_CONTROL_NRF_K32SRC_500PPM=y + +# enable bossac +CONFIG_BOOTLOADER_BOSSA=y +CONFIG_BOOTLOADER_BOSSA_ADAFRUIT_UF2=y + +# Build UF2 by default, supported by the Adafruit nRF52 Bootloader +CONFIG_BUILD_OUTPUT_UF2=y diff --git a/boards/adafruit/feather_nrf52840/board.cmake b/boards/adafruit/feather_nrf52840/board.cmake index c351ecd3a0b..9661ff35388 100644 --- a/boards/adafruit/feather_nrf52840/board.cmake +++ b/boards/adafruit/feather_nrf52840/board.cmake @@ -2,6 +2,9 @@ board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000") board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000") +if(CONFIG_BOARD_ADAFRUIT_FEATHER_NRF52840_SENSE) +include(${ZEPHYR_BASE}/boards/common/uf2.board.cmake) +endif() include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) diff --git a/boards/adafruit/feather_nrf52840/board.yml b/boards/adafruit/feather_nrf52840/board.yml index 7006acca236..daf1f9232cd 100644 --- a/boards/adafruit/feather_nrf52840/board.yml +++ b/boards/adafruit/feather_nrf52840/board.yml @@ -1,5 +1,9 @@ -board: - name: adafruit_feather_nrf52840_express - vendor: adafruit - socs: - - name: nrf52840 +boards: + - name: adafruit_feather_nrf52840_express + vendor: adafruit + socs: + - name: nrf52840 + - name: adafruit_feather_nrf52840_sense + vendor: adafruit + socs: + - name: nrf52840 diff --git a/boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840.jpg b/boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840_express.jpg similarity index 100% rename from boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840.jpg rename to boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840_express.jpg diff --git a/boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840_sense.jpg b/boards/adafruit/feather_nrf52840/doc/img/adafruit_feather_nrf52840_sense.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c2bd1da9cba482574cfdd2107f4fc4a4b7eb223d GIT binary patch literal 35527 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 literal 0 HcmV?d00001 diff --git a/boards/adafruit/feather_nrf52840/doc/index.rst b/boards/adafruit/feather_nrf52840/doc/index.rst index 0b439b30f1c..63aa30abb47 100644 --- a/boards/adafruit/feather_nrf52840/doc/index.rst +++ b/boards/adafruit/feather_nrf52840/doc/index.rst @@ -1,7 +1,7 @@ .. _adafruit_feather_nrf52840: -Adafruit Feather nRF52840 Express -################################# +Adafruit Feather nRF52840 (Express, Sense) +########################################## Overview ******** @@ -25,9 +25,19 @@ nRF52840 ARM Cortex-M4F CPU and the following devices: * :abbr:`USB (Universal Serial Bus)` * :abbr:`WDT (Watchdog Timer)` -.. figure:: img/adafruit_feather_nrf52840.jpg - :align: center - :alt: Adafruit Feather nRF52840 Express +.. tabs:: + + .. group-tab:: Express + + .. figure:: img/adafruit_feather_nrf52840_express.jpg + :align: center + :alt: Adafruit Feather nRF52840 Express + + .. group-tab:: Sense + + .. figure:: img/adafruit_feather_nrf52840_sense.jpg + :align: center + :alt: Adafruit Feather nRF52840 Sense Hardware ******** @@ -39,7 +49,14 @@ Hardware - 2 User LEDs - 1 NeoPixel LED - Reset button -- SWD connector +- SWD connector (Express only) +- SWD solder pads on bottom of PCB (Sense only) +- LSM6DS33 Accel/Gyro (Sense only) +- LIS3MDL magnetometer (Sense only) +- APDS9960 Proximity, Light, Color, and Gesture Sensor (Sense only) +- MP34DT01-M PDM Microphone sound sensor (Sense only) +- SHT3X Humidity sensor (Sense only) +- BMP280 temperature and barometric pressure/altitude (Sense only) Supported Features ================== @@ -85,13 +102,25 @@ Other hardware features have not been enabled yet for this board. Connections and IOs =================== -The `Adafruit Feather nRF52840 Express Learn site`_ has detailed -information about the board including `pinouts`_ and the `schematic`_. +.. tabs:: + + .. group-tab:: Express + + The `Adafruit Feather nRF52840 Express Learn site`_ has + detailed information about the board including + `pinouts (Express)`_ and the `schematic (Express)`_. + + .. group-tab:: Sense + + The `Adafruit Feather nRF52840 Sense Learn site`_ has + detailed information about the board including + `pinouts (Sense)`_ and the `schematic (Sense)`_. LED --- -* LED0 (red) = P1.15 +* LED0 (red) = P1.15 (Express) +* LED0 (red) = P1.9 (Sense) * LED1 (blue) = P1.10 Push buttons @@ -103,33 +132,56 @@ Push buttons Programming and Debugging ************************* -Applications for the ``adafruit_feather_nrf52840_express`` board configuration -can be built and flashed in the usual way (see :ref:`build_an_application` -and :ref:`application_run` for more details). - Flashing ======== -Flashing Zephyr onto the ``adafruit_feather_nrf52480_express`` board requires -an external programmer. The programmer is attached to the SWD header. +Flashing Zephyr onto the ``adafruit_feather_nrf52480_express`` board is possible +using an external programmer. The programmer is attached to the SWD header. -Build the Zephyr kernel and the :zephyr:code-sample:`blinky` sample application. +The Feather nRF52840 ships with the `Adafruit nRF52 Bootloader`_ which +supports flashing using `UF2`_. This allows easy flashing of new images, +but does not support debugging the device. - .. zephyr-app-commands:: - :zephyr-app: samples/basic/blinky - :board: adafruit_feather_nrf52840_express - :goals: build - :compact: +#. Build the Zephyr kernel and the :zephyr:code-sample:`blinky` sample application. -Flash the image. +.. tabs:: - .. zephyr-app-commands:: - :zephyr-app: samples/basic/blinky - :board: adafruit_feather_nrf52840_express - :goals: flash - :compact: + .. group-tab:: Express -You should see the red LED blink. + .. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: adafruit_feather_nrf52840_express/nrf52840 + :goals: build + :compact: + + .. group-tab:: Sense + + .. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: adafruit_feather_nrf52840_sense/nrf52840 + :goals: build + :compact: + +#. If using UF2, connect the board to your host computer using USB. + +#. Tap the reset button twice quickly to enter bootloader mode. + A mass storage device named `FTHR840BOOT` for (Express) or + `FTHRSNSBOOT` (Sense) should appear on the host. Ensure this is + mounted. + +#. Flash the image. + +.. tabs:: + + .. group-tab:: Sense + + .. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: adafruit_feather_nrf52840_sense + :goals: flash + :compact: + +#. You should see the red LED blink. References ********** @@ -139,8 +191,23 @@ References .. _Adafruit Feather nRF52840 Express Learn site: https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/ -.. _pinouts: +.. _pinouts (Express): https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/pinouts -.. _schematic: +.. _schematic (Express): https://learn.adafruit.com/introducing-the-adafruit-nrf52840-feather/downloads + +.. _Adafruit Feather nRF52840 Sense Learn site: + https://learn.adafruit.com/adafruit-feather-sense + +.. _pinouts (Sense): + https://learn.adafruit.com/adafruit-feather-sense/pinouts + +.. _schematic (Sense): + https://learn.adafruit.com/adafruit-feather-sense/downloads + +.. _Adafruit nRF52 Bootloader: + https://github.com/adafruit/Adafruit_nRF52_Bootloader + +.. _UF2: + https://github.com/microsoft/uf2 diff --git a/tests/drivers/adc/adc_api/boards/adafruit_feather_nrf52840_sense.overlay b/tests/drivers/adc/adc_api/boards/adafruit_feather_nrf52840_sense.overlay new file mode 100644 index 00000000000..2af48efc4d1 --- /dev/null +++ b/tests/drivers/adc/adc_api/boards/adafruit_feather_nrf52840_sense.overlay @@ -0,0 +1,7 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (c) 2023 Benjamin Björnsson + */ + +#include "nordic,nrf-saadc-common.dtsi"