From 40c2f694d259b8c03dec468218fd82ac56e30abd Mon Sep 17 00:00:00 2001 From: pstruebi Date: Wed, 9 Apr 2025 15:28:24 +0200 Subject: [PATCH] add custom board for nrf52 dongle without usb --- boards/nrf52840dongle_no_usb/CMakeLists.txt | 4 + boards/nrf52840dongle_no_usb/Kconfig | 19 + .../nrf52840dongle_no_usb/Kconfig.defconfig | 83 + .../Kconfig.nrf52840dongle_no_usb | 7 + boards/nrf52840dongle_no_usb/board.c | 45 + boards/nrf52840dongle_no_usb/board.cmake | 7 + boards/nrf52840dongle_no_usb/board.yml | 6 + .../doc/img/nRF52840_dongle_press_reset.svg | 1991 +++++++++++++++++ .../doc/img/nrf52840dongle_nrf52840.jpg | Bin 0 -> 43433 bytes boards/nrf52840dongle_no_usb/doc/index.rst | 348 +++ .../nrf52840dongle_no_usb/fstab-debugger.dtsi | 36 + boards/nrf52840dongle_no_usb/fstab-stock.dtsi | 44 + ...rf52840dongle_no_usb_nrf52840-pinctrl.dtsi | 81 + .../nrf52840dongle_no_usb_nrf52840.dts | 147 ++ .../nrf52840dongle_no_usb_nrf52840.yaml | 21 + .../nrf52840dongle_no_usb_nrf52840_defconfig | 16 + .../nrf52840dongle_no_usb/pre_dt_board.cmake | 7 + no_bootloader.conf | 1 + prj.conf | 3 + 19 files changed, 2866 insertions(+) create mode 100644 boards/nrf52840dongle_no_usb/CMakeLists.txt create mode 100644 boards/nrf52840dongle_no_usb/Kconfig create mode 100644 boards/nrf52840dongle_no_usb/Kconfig.defconfig create mode 100644 boards/nrf52840dongle_no_usb/Kconfig.nrf52840dongle_no_usb create mode 100644 boards/nrf52840dongle_no_usb/board.c create mode 100644 boards/nrf52840dongle_no_usb/board.cmake create mode 100644 boards/nrf52840dongle_no_usb/board.yml create mode 100644 boards/nrf52840dongle_no_usb/doc/img/nRF52840_dongle_press_reset.svg create mode 100644 boards/nrf52840dongle_no_usb/doc/img/nrf52840dongle_nrf52840.jpg create mode 100644 boards/nrf52840dongle_no_usb/doc/index.rst create mode 100644 boards/nrf52840dongle_no_usb/fstab-debugger.dtsi create mode 100644 boards/nrf52840dongle_no_usb/fstab-stock.dtsi create mode 100644 boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840-pinctrl.dtsi create mode 100644 boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.dts create mode 100644 boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.yaml create mode 100644 boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840_defconfig create mode 100644 boards/nrf52840dongle_no_usb/pre_dt_board.cmake create mode 100644 no_bootloader.conf diff --git a/boards/nrf52840dongle_no_usb/CMakeLists.txt b/boards/nrf52840dongle_no_usb/CMakeLists.txt new file mode 100644 index 0000000..218a060 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() +zephyr_library_sources(board.c) diff --git a/boards/nrf52840dongle_no_usb/Kconfig b/boards/nrf52840dongle_no_usb/Kconfig new file mode 100644 index 0000000..b1cb32d --- /dev/null +++ b/boards/nrf52840dongle_no_usb/Kconfig @@ -0,0 +1,19 @@ +# nRF52840 Dongle NRF52840 board configuration + +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_NRF52840DONGLE + +config BOARD_HAS_NRF5_BOOTLOADER + bool "Board has nRF5 bootloader" + default y + help + If selected, applications are linked so that they can be loaded by Nordic + nRF5 bootloader. + +config BOARD_SERIAL_BACKEND_CDC_ACM + bool "USB CDC" + default y + +endif # BOARD_NRF52840DONGLE diff --git a/boards/nrf52840dongle_no_usb/Kconfig.defconfig b/boards/nrf52840dongle_no_usb/Kconfig.defconfig new file mode 100644 index 0000000..1288e33 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/Kconfig.defconfig @@ -0,0 +1,83 @@ +# nRF52840 Dongle NRF52840 board configuration +# +# Copyright (c) 2018-2023 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_NRF52840DONGLE + +# To let the nRF5 bootloader load an application, the application +# must be linked after Nordic MBR, that is factory-programmed on the board. + +# Nordic nRF5 bootloader exists outside of the partitions specified in the +# DTS file, so we manually override FLASH_LOAD_OFFSET to link the application +# correctly, after Nordic MBR. + +# When building MCUBoot, MCUBoot itself will select USE_DT_CODE_PARTITION +# which will make it link into the correct partition specified in DTS file, +# the offset is applied here so that the full partition size can be used when +# the bootloader Kconfig option has been disabled. + +config FLASH_LOAD_OFFSET + default 0x1000 + depends on BOARD_HAS_NRF5_BOOTLOADER && (MCUBOOT || !USE_DT_CODE_PARTITION) + +if BOARD_SERIAL_BACKEND_CDC_ACM + +config USB_DEVICE_STACK + default y + +config USB_CDC_ACM + default SERIAL + +config CONSOLE + default y + +config UART_CONSOLE + default CONSOLE + +config USB_DEVICE_INITIALIZE_AT_BOOT + default y if !MCUBOOT && 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 +choice USB_CDC_ACM_LOG_LEVEL_CHOICE + default USB_CDC_ACM_LOG_LEVEL_OFF +endchoice + +# Set USB log level to error only +choice USB_DEVICE_LOG_LEVEL_CHOICE + default USB_DEVICE_LOG_LEVEL_ERR +endchoice + +# Wait 4000ms at startup for logging +config LOG_PROCESS_THREAD_STARTUP_DELAY_MS + default 4000 + +endif # LOG + +if USB_DEVICE_STACK + +# Enable UART driver, needed for CDC ACM +config SERIAL + default y + +endif # USB_DEVICE_STACK + +endif # BOARD_SERIAL_BACKEND_CDC_ACM + +config BT_CTLR + default BT + +endif # BOARD_NRF52840DONGLE diff --git a/boards/nrf52840dongle_no_usb/Kconfig.nrf52840dongle_no_usb b/boards/nrf52840dongle_no_usb/Kconfig.nrf52840dongle_no_usb new file mode 100644 index 0000000..de2273f --- /dev/null +++ b/boards/nrf52840dongle_no_usb/Kconfig.nrf52840dongle_no_usb @@ -0,0 +1,7 @@ +# nRF52840 Dongle NRF52840 board configuration + +# Copyright (c) 2018 Nordic Semiconductor ASA +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_NRF52840DONGLE_NO_USB + select SOC_NRF52840_QIAA diff --git a/boards/nrf52840dongle_no_usb/board.c b/boards/nrf52840dongle_no_usb/board.c new file mode 100644 index 0000000..ac37eac --- /dev/null +++ b/boards/nrf52840dongle_no_usb/board.c @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2018 Nordic Semiconductor ASA. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +static int board_nrf52840dongle_nrf52840_init(void) +{ + + /* if the nrf52840dongle_nrf52840 board is powered from USB + * (high voltage mode), GPIO output voltage is set to 1.8 volts by + * default and that is not enough to turn the green and blue LEDs on. + * Increase GPIO voltage to 3.0 volts. + */ + if ((nrf_power_mainregstatus_get(NRF_POWER) == + NRF_POWER_MAINREGSTATUS_HIGH) && + ((NRF_UICR->REGOUT0 & UICR_REGOUT0_VOUT_Msk) == + (UICR_REGOUT0_VOUT_DEFAULT << UICR_REGOUT0_VOUT_Pos))) { + + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen << NVMC_CONFIG_WEN_Pos; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { + ; + } + + NRF_UICR->REGOUT0 = + (NRF_UICR->REGOUT0 & ~((uint32_t)UICR_REGOUT0_VOUT_Msk)) | + (UICR_REGOUT0_VOUT_3V0 << UICR_REGOUT0_VOUT_Pos); + + NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren << NVMC_CONFIG_WEN_Pos; + while (NRF_NVMC->READY == NVMC_READY_READY_Busy) { + ; + } + + /* a reset is required for changes to take effect */ + NVIC_SystemReset(); + } + + return 0; +} + +SYS_INIT(board_nrf52840dongle_nrf52840_init, PRE_KERNEL_1, + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); diff --git a/boards/nrf52840dongle_no_usb/board.cmake b/boards/nrf52840dongle_no_usb/board.cmake new file mode 100644 index 0000000..1f43fd9 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/board.cmake @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=nRF52840_xxAA" "--speed=4000") +board_runner_args(pyocd "--target=nrf52840" "--frequency=4000000") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/nrf52840dongle_no_usb/board.yml b/boards/nrf52840dongle_no_usb/board.yml new file mode 100644 index 0000000..93c6d69 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/board.yml @@ -0,0 +1,6 @@ +board: + name: nrf52840dongle_no_usb + full_name: nRF52840 Dongle no usb + vendor: nordic + socs: + - name: nrf52840 diff --git a/boards/nrf52840dongle_no_usb/doc/img/nRF52840_dongle_press_reset.svg b/boards/nrf52840dongle_no_usb/doc/img/nRF52840_dongle_press_reset.svg new file mode 100644 index 0000000..5e3e031 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/doc/img/nRF52840_dongle_press_reset.svg @@ -0,0 +1,1991 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/boards/nrf52840dongle_no_usb/doc/img/nrf52840dongle_nrf52840.jpg b/boards/nrf52840dongle_no_usb/doc/img/nrf52840dongle_nrf52840.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eab80fe53b8dc28f77f3207a95490713b3006ad7 GIT binary patch literal 43433 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 h2OC8^#PLLh$ll=bl6l` + +These instructions use the :ref:`west ` tool and assume you are in the +root directory of your :term:`west installation`. + +Option 1: Using the Built-In Bootloader Only +-------------------------------------------- + +The board is factory-programmed with Nordic's bootloader from Nordic's nRF5 +SDK. With this option, you'll use Nordic's `nrfutil`_ program to create +firmware packages supported by this bootloader and flash them to the +device. Make sure ``nrfutil`` is installed before proceeding. + +#. Reset the board into the Nordic bootloader by pressing the RESET button. + + The push button is on the far side of the board from the USB connector. Note + that the button does not face up. You will have to push it from the outside + in, towards the USB connector: + + .. image:: img/nRF52840_dongle_press_reset.svg + :alt: Location of RESET button and direction of push + + The red LED should start a fade pattern, signalling the bootloader is + running. + +#. Compile a Zephyr application; we'll use :zephyr:code-sample:`blinky`. + + .. zephyr-app-commands:: + :app: zephyr/samples/basic/blinky + :board: nrf52840dongle/nrf52840 + :goals: build + +#. Package the application for the bootloader using ``nrfutil``: + + .. code-block:: console + + nrfutil pkg generate --hw-version 52 --sd-req=0x00 \ + --application build/zephyr/zephyr.hex \ + --application-version 1 blinky.zip + +#. Flash it onto the board. Note :file:`/dev/ttyACM0` is for Linux; it will be + something like ``COMx`` on Windows, and something else on macOS. + + .. code-block:: console + + nrfutil dfu usb-serial -pkg blinky.zip -p /dev/ttyACM0 + + When this command exits, observe the green LED on the board blinking, + instead of the red LED used by the bootloader. + +For more information, see `Nordic Semiconductor USB DFU`_. + +Option 2: Using MCUboot in Serial Recovery Mode +----------------------------------------------- + +It is also possible to use the MCUboot bootloader with this board to flash +Zephyr applications. You need to do some one-time set-up to build and flash +MCUboot on your board. From that point on, you can build and flash other Zephyr +applications using MCUboot's serial recovery mode. This process does not +overwrite the built-in Nordic bootloader, so you can always go back to using +Option 1 later. + +Install `nrfutil`_ and `mcumgr`_ first, and make sure MCUboot's ``imgtool`` is +available for signing your binary for MCUboot as described on :ref:`west-sign`. + +Next, do the **one-time setup** to flash MCUboot. We'll assume you've cloned +the `MCUboot`_ repository into the directory ``mcuboot``, and that it is next +to the zephyr repository on your computer. + +#. Reset the board into the Nordic bootloader as described above. + +#. Compile MCUboot as a Zephyr application. + + .. zephyr-app-commands:: + :app: mcuboot/boot/zephyr + :board: nrf52840dongle/nrf52840 + :build-dir: mcuboot + :goals: build + +#. Package the application for the bootloader using ``nrfutil``: + + .. code-block:: console + + nrfutil pkg generate --hw-version 52 --sd-req=0x00 \ + --application build/mcuboot/zephyr/zephyr.hex \ + --application-version 1 mcuboot.zip + +#. Flash it onto the board. Note :file:`/dev/ttyACM0` is for Linux; it will be + something like ``COMx`` on Windows, and something else on macOS. + + .. code-block:: console + + nrfutil dfu usb-serial -pkg mcuboot.zip -p /dev/ttyACM0 + +You can now flash a Zephyr application to the board using MCUboot's serial +recovery mode. We'll use the :zephyr:code-sample:`smp-svr` sample since it's ready to be +compiled for chain-loading by MCUboot (and itself supports firmware updates +over Bluetooth). + +#. Boot into MCUboot serial recovery mode by plugging the board in with the SW1 + button pressed down. See above for a picture showing where SW1 is. + + **Do not press RESET**; that will run the Nordic bootloader, which is + different than MCUboot. + + A serial port will enumerate on your board. On Windows, "MCUBOOT" should + appear under "Other Devices" in the Device Manager (in addition to the usual + ``COMx`` device). On Linux, something like + :file:`/dev/serial/by-id/usb-ZEPHYR_MCUBOOT_0.01-if00` should be created. + + If no serial port appears, try plugging it in again, making sure SW1 is + pressed. If it still doesn't appear, retry the one-time MCUboot setup. + +#. Compile ``smp_svr``. + + .. zephyr-app-commands:: + :app: zephyr/samples/subsys/mgmt/mcumgr/smp_svr + :board: nrf52840dongle/nrf52840 + :build-dir: smp_svr + :goals: build + +#. Sign ``smp_svr`` for chain-loading by MCUboot. + + .. code-block:: console + + west sign -t imgtool --bin --no-hex -d build/smp_svr \ + -B smp_svr.signed.bin -- --key mcuboot/root-rsa-2048.pem + +#. Flash the application to the MCUboot serial port using ``mcumgr``: + + .. code-block:: console + + mcumgr --conntype=serial --connstring='dev=/dev/ttyACM0,baud=115200' \ + image upload -e smp_svr.signed.bin + +#. Reset the device: + + .. code-block:: console + + mcumgr --conntype=serial --connstring='dev=/dev/ttyACM0,baud=115200' reset + +You should now be able to scan for Bluetooth devices using a smartphone or +computer. The device you just flashed will be listed with ``Zephyr`` in its +name. + +.. note:: + + This board supports building other Zephyr applications for flashing with + MCUboot in this way also. Just make sure :kconfig:option:`CONFIG_BOOTLOADER_MCUBOOT` + is set when building your application. For example, to compile blinky for + loading by MCUboot, use this: + + .. zephyr-app-commands:: + :app: zephyr/samples/basic/blinky + :board: nrf52840dongle/nrf52840 + :build-dir: blinky + :goals: build + :gen-args: -DCONFIG_BOOTLOADER_MCUBOOT=y + + You can then sign and flash it using the steps above. + +Option 3: Using an External Debug Probe +--------------------------------------- + +If you have one, you can also use an external :ref:`debug probe ` +to flash and debug Zephyr applications, but you need to solder an SWD header +onto the back side of the board. + +For Segger J-Link debug probes, follow the instructions in the +:ref:`nordic_segger` page to install and configure all the necessary +software. Further information can be found in :ref:`nordic_segger_flashing`. + +Locate the DTS file: :zephyr_file:`boards/nordic/nrf52840dongle/nrf52840dongle_nrf52840.dts`. +This file requires a small modification to use a different partition table. +Edit the include directive to include "fstab-debugger" instead of "fstab-stock". + +In addition, the Kconfig file in the same directory must be modified by setting +``BOARD_HAS_NRF5_BOOTLOADER`` to be default ``n``, otherwise the code will be +flashed with an offset. + +Then build and flash applications as usual (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +Here is an example for the :zephyr:code-sample:`blinky` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: nrf52840dongle/nrf52840 + :goals: build flash + +Observe the LED on the board blinking. + +Debugging +========= + +The ``nrf52840dongle/nrf52840`` board does not have an on-board J-Link debug IC +as some nRF5x development boards, however, instructions from the +:ref:`nordic_segger` page also apply to this board, with the additional step +of connecting an external debugger. + +Testing the LEDs and buttons on the nRF52840 Dongle +*************************************************** + +There are 2 samples that allow you to test that the buttons (switches) and LEDs on +the board are working properly with Zephyr: + +* :zephyr:code-sample:`blinky` + +You can build and program the examples to make sure Zephyr is running correctly +on your board. + + +References +********** + +.. target-notes:: + +.. _nRF52840 Dongle website: + https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle +.. _nRF52840 Dongle guide: https://docs.nordicsemi.com/bundle/ug_nrf52840_dk/page/UG/dk/intro.html +.. _nRF52840 Dongle Hardware description: https://docs.nordicsemi.com/bundle/ug_nrf52840_dongle/page/UG/nrf52840_Dongle/hw_description.html +.. _J-Link Software and documentation pack: + https://www.segger.com/jlink-software.html +.. _Nordic Semiconductor USB DFU: + https://docs.nordicsemi.com/bundle/sdk_nrf5_v17.1.0/page/sdk_app_serial_dfu_bootloader.html +.. _nrfutil: + https://github.com/NordicSemiconductor/pc-nrfutil +.. _MCUboot: + https://github.com/JuulLabs-OSS/mcuboot +.. _mcumgr: + https://github.com/apache/mynewt-mcumgr-cli diff --git a/boards/nrf52840dongle_no_usb/fstab-debugger.dtsi b/boards/nrf52840dongle_no_usb/fstab-debugger.dtsi new file mode 100644 index 0000000..9fbbe7c --- /dev/null +++ b/boards/nrf52840dongle_no_usb/fstab-debugger.dtsi @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* Flash partition table without support for Nordic nRF5 bootloader */ + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* The size of this partition ensures that MCUBoot can be built + * with an RTT console, CDC ACM support, and w/o optimizations. + */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00012000>; + }; + + slot0_partition: partition@12000 { + label = "image-0"; + reg = <0x00012000 0x00075000>; + }; + slot1_partition: partition@87000 { + label = "image-1"; + reg = <0x00087000 0x00075000>; + }; + storage_partition: partition@fc000 { + label = "storage"; + reg = <0x000fc000 0x00004000>; + }; + }; +}; diff --git a/boards/nrf52840dongle_no_usb/fstab-stock.dtsi b/boards/nrf52840dongle_no_usb/fstab-stock.dtsi new file mode 100644 index 0000000..2686367 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/fstab-stock.dtsi @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* Flash partition table compatible with Nordic nRF5 bootloader */ + +&flash0 { + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* MCUboot placed after Nordic MBR (this is set with the FLASH_LOAD_OFFSET + * Kconfig value when BOARD_HAS_NRF5_BOOTLOADER is enabled), otherwise MCUboot + * will be placed at 0x0. The size of this partition ensures that MCUBoot can + * be built with CDC ACM support and w/o optimizations. + */ + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0x00010000>; + }; + + slot0_partition: partition@10000 { + label = "image-0"; + reg = <0x00010000 0x00066000>; + }; + slot1_partition: partition@76000 { + label = "image-1"; + reg = <0x00076000 0x00066000>; + }; + storage_partition: partition@dc000 { + label = "storage"; + reg = <0x000dc000 0x00004000>; + }; + + /* Nordic nRF5 bootloader <0xe0000 0x1c000> + * + * In addition, the last and second last flash pages + * are used by the nRF5 bootloader and MBR to store settings. + */ + }; +}; diff --git a/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840-pinctrl.dtsi b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840-pinctrl.dtsi new file mode 100644 index 0000000..ac6b912 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840-pinctrl.dtsi @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2022 Nordic Semiconductor + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + uart0_default: uart0_default { + group1 { + psels = , + ; + }; + group2 { + psels = , + ; + bias-pull-up; + }; + }; + + uart0_sleep: uart0_sleep { + group1 { + psels = , + , + , + ; + low-power-enable; + }; + }; + + pwm0_default: pwm0_default { + group1 { + psels = , + , + ; + nordic,invert; + }; + }; + + pwm0_sleep: pwm0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi0_default: spi0_default { + group1 { + psels = , + , + ; + }; + }; + + spi0_sleep: spi0_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + + spi1_default: spi1_default { + group1 { + psels = , + , + ; + }; + }; + + spi1_sleep: spi1_sleep { + group1 { + psels = , + , + ; + low-power-enable; + }; + }; + +}; diff --git a/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.dts b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.dts new file mode 100644 index 0000000..9ebfb11 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.dts @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2018-2023 Nordic Semiconductor ASA + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "nrf52840dongle_no_usb_nrf52840-pinctrl.dtsi" +#include + + +&uart0 { + compatible = "nordic,nrf-uarte"; + status = "okay"; + current-speed = <1000000>; + pinctrl-0 = <&uart0_default>; + pinctrl-1 = <&uart0_sleep>; + pinctrl-names = "default", "sleep"; + hw-flow-control; +}; + + +/ { + model = "Nordic nRF52840 Dongle NRF52840"; + compatible = "nordic,nrf52840-dongle_no_usb-nrf52840"; + + chosen { + //zephyr,console = &uart0; + //zephyr,shell-uart = &uart0; + //zephyr,uart-mcumgr = &uart0; + //zephyr,bt-mon-uart = &uart0; + zephyr,bt-c2h-uart = &uart0; // make uart0 the hci interfac + + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,ieee802154 = &ieee802154; + }; + + leds { + compatible = "gpio-leds"; + led0_green: led_0 { + gpios = <&gpio0 6 GPIO_ACTIVE_LOW>; + label = "Green LED 0"; + }; + led1_red: led_1 { + gpios = <&gpio0 8 GPIO_ACTIVE_LOW>; + label = "Red LED 1"; + }; + led1_green: led_2 { + gpios = <&gpio1 9 GPIO_ACTIVE_LOW>; + label = "Green LED 1"; + }; + led1_blue: led_3 { + gpios = <&gpio0 12 GPIO_ACTIVE_LOW>; + label = "Blue LED 1"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + red_pwm_led: pwm_led_0 { + pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>; + }; + green_pwm_led: pwm_led_1 { + pwms = <&pwm0 1 PWM_MSEC(20) PWM_POLARITY_INVERTED>; + }; + blue_pwm_led: pwm_led_2 { + pwms = <&pwm0 2 PWM_MSEC(20) PWM_POLARITY_INVERTED>; + }; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio1 6 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 0"; + zephyr,code = ; + }; + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + sw0 = &button0; + led0 = &led0_green; + led1 = &led1_red; + led2 = &led1_green; + led3 = &led1_blue; + led0-green = &led0_green; + led1-red = &led1_red; + led1-green = &led1_green; + led1-blue = &led1_blue; + pwm-led0 = &red_pwm_led; + pwm-led1 = &green_pwm_led; + pwm-led2 = &blue_pwm_led; + red-pwm-led = &red_pwm_led; + green-pwm-led = &green_pwm_led; + blue-pwm-led = &blue_pwm_led; + mcuboot-button0 = &button0; + mcuboot-led0 = &led0_green; + watchdog0 = &wdt0; + }; +}; + +®0 { + status = "okay"; +}; + +®1 { + regulator-initial-mode = ; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&uicr { + nfct-pins-as-gpios; + gpio-as-nreset; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + + +&ieee802154 { + status = "okay"; +}; + +/* Include flash partition table. + * Two partition tables are available: + * fstab-stock -compatible with Nordic nRF5 bootloader, default + * fstab-debugger -to use an external debugger, w/o the nRF5 bootloader + */ +#include "fstab-debugger.dtsi" + diff --git a/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.yaml b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.yaml new file mode 100644 index 0000000..e5410c7 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840.yaml @@ -0,0 +1,21 @@ +identifier: nrf52840dongle/nrf52840 +name: nRF52840-Dongle-NRF52840 +type: mcu +arch: arm +ram: 256 +flash: 1024 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - pwm + - spi + - watchdog + - counter + - netif:openthread + - gpio +vendor: nordic diff --git a/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840_defconfig b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840_defconfig new file mode 100644 index 0000000..ffaccd7 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/nrf52840dongle_no_usb_nrf52840_defconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# enable GPIO +CONFIG_GPIO=y + +# Board Kconfig.defconfig enables USB CDC ACM and should disable USB remote +# wakeup by default. It needs to be disabled here, because the USB nrfx +# driver always overwrites option from Kconfig mentioned above with the +# imply from CONFIG_USB_NRFX. +CONFIG_USB_DEVICE_REMOTE_WAKEUP=n diff --git a/boards/nrf52840dongle_no_usb/pre_dt_board.cmake b/boards/nrf52840dongle_no_usb/pre_dt_board.cmake new file mode 100644 index 0000000..3369c21 --- /dev/null +++ b/boards/nrf52840dongle_no_usb/pre_dt_board.cmake @@ -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") diff --git a/no_bootloader.conf b/no_bootloader.conf new file mode 100644 index 0000000..4928394 --- /dev/null +++ b/no_bootloader.conf @@ -0,0 +1 @@ +CONFIG_BOARD_HAS_NRF5_BOOTLOADER=n \ No newline at end of file diff --git a/prj.conf b/prj.conf index bdc73dd..e889ba4 100644 --- a/prj.conf +++ b/prj.conf @@ -5,6 +5,9 @@ CONFIG_GPIO=y CONFIG_SERIAL=y CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_BT=y +CONFIG_BT_CTLR=y +CONFIG_BT_LL_SOFTDEVICE=y + CONFIG_BT_HCI_RAW=y CONFIG_BT_HCI_RAW_H4=y CONFIG_BT_HCI_RAW_H4_ENABLE=y