1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2025-01-18 12:52:44 +01:00

Merge pull request #13146 from chrysn-pull-requests/nrf52840-dongle-2

boards: add support for nrf52840-dongle
This commit is contained in:
Alexandre Abadie 2020-05-08 15:31:25 +02:00 committed by GitHub
commit c9b83e3a5a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 389 additions and 0 deletions

View File

@ -0,0 +1,3 @@
MODULE = board
include $(RIOTBASE)/Makefile.base

View File

@ -0,0 +1,17 @@
ifneq (,$(filter saul_default,$(USEMODULE)))
USEMODULE += saul_gpio
endif
ifeq (,$(filter-out stdio_cdc_acm,$(filter stdio_% slipdev_stdio,$(USEMODULE))))
# Use stdio_cdc_acm only if no other stdio is requested explicitly.
USEMODULE += stdio_cdc_acm
# This does not *really* hinge on the choice of stdio, but this ensures
# compatibility with the test suite that uses stdio_null and would conflict
# with bootloader_nrfutil.
# (Having the feature in is generally a good thing because as an indicator
# that it the resulting program is meant to be flashed using nrfutil).
FEATURES_REQUIRED += bootloader_nrfutil
endif
# ... and fall back to the UART-based stdio
include $(RIOTBOARD)/common/nrf52/Makefile.dep

View File

@ -0,0 +1,11 @@
CPU_MODEL = nrf52840xxaa
# Put defined MCU peripherals here (in alphabetical order)
FEATURES_PROVIDED += periph_uart
FEATURES_PROVIDED += periph_usbdev
# Various other features (if any)
FEATURES_PROVIDED += radio_nrf802154
FEATURES_PROVIDED += bootloader_nrfutil
include $(RIOTBOARD)/common/nrf52/Makefile.features

View File

@ -0,0 +1,27 @@
# This board uses the vendor's serial bootloader
PROGRAMMER ?= nrfutil
ifeq (nrfutil,$(PROGRAMMER))
# Using nrfutil implies using the Nordic bootloader described at
# <https://devzone.nordicsemi.com/nordic/short-range-guides/b/getting-started/posts/nrf52840-dongle-programming-tutorial>.
#
# It has a static MBR at the first 4k, and an ample 128k Open USB Bootloader at
# the end, leaving 892k for the application. This overwrites any SoftDevice,
# but that's what the minimal working example for the dongle does as well.
ROM_OFFSET = 0x1000
ROM_LEN = 0xdf000
FLASHFILE = $(HEXFILE)
FLASHDEPS += $(HEXFILE).zip
FLASHER = nrfutil
FFLAGS = dfu usb-serial --port=${PORT} --package=$(HEXFILE).zip
endif
%.hex.zip: %.hex
$(call check_cmd,$(FLASHER),Flash program and preparation tool)
$(FLASHER) pkg generate --hw-version 52 --sd-req 0x00 --application-version 1 --application $< $@
include $(RIOTBOARD)/common/nrf52/Makefile.include

View File

@ -0,0 +1,42 @@
/*
* Copyright (C) 2019 Christian Amsüss <chrysn@fsfe.org>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_nrf52840dongle
* @{
*
* @file
* @brief Board initialization for the nRF52840-dongle
*
* @author Christian Amsüss <chrysn@fsfe.org>
*
* @}
*/
#include "cpu.h"
#include "board.h"
#include "periph/gpio.h"
void board_init(void)
{
/* initialize the board's single LED */
gpio_init(LED0_PIN, GPIO_OUT);
gpio_set(LED0_PIN);
/* initialize the board's RGB LED */
gpio_init(LED1_PIN, GPIO_OUT);
gpio_set(LED1_PIN);
gpio_init(LED2_PIN, GPIO_OUT);
gpio_set(LED2_PIN);
gpio_init(LED3_PIN, GPIO_OUT);
gpio_set(LED3_PIN);
/* initialize the CPU */
cpu_init();
}

View File

@ -0,0 +1,58 @@
/**
@defgroup boards_nrf52840dongle nRF52840-Dongle
@ingroup boards
@brief Support for the nRF52840-Dongle
### General information
The nRF52840-Dongle is a bare USB-stick shaped device that houses barely
anything than the nRF52840 itself, which offers BLE and 802.15.4 and USB
connectivity.
Unlike similar sticks (like the @ref boards_nrf52840-mdk), it features no
dedicated programmer hardware but relies on direct USB communication with a
built-in bootloader.
The board features two LEDs (LD1: green, LD2: RGB), a user (SW1) and a
reset button as well as 15 configurable external pins.
### Links
- [nRF52840 web page](https://www.nordicsemi.com/?sc_itemid=%7BCDCCA013-FE4C-4655-B20C-1557AB6568C9%7D)
- [documentation and hardware description](https://infocenter.nordicsemi.com/topic/ug_nrf52840_dongle/UG/nrf52840_Dongle/intro.html?cp=3_0_5)
### Flash the board
The board is flashed using its on-board boot loader; the
[nrfutil](https://github.com/NordicSemiconductor/pc-nrfutil) program needs to
be installed. That can turn the binary into a suitable zip file and send it to the
bootloader.
The process is automated in the usual `make flash` target. For that process to
complete, you need to enter the bootloader manually by pressing the board's
reset button. Readiness of the bootloader is indicated by LD2 pulsing in red.
#### nrfutil installation
On systems with Python 2 available, `pip install nrfutil` works.
On systems with Python 3, a recent version of pip is required to install all dependencies;
you may need to run `pip install --upgrade pip` before being able to run `pip install nrfutil` successfully.
### Accessing STDIO
The usual way to obtain a console on this board is using an emulated USB serial port (CDC-ACM).
This is available automatically using the `stdio_cdc_acm` module,
unless any other stdio module is enabled.
On Linux systems with ModemManager < 1.10 installed,
`make term` will, in some setups, fail for a few seconds after the device has come up.
This is [fixed in its 1.12.4 version](https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues/164),
but should not be more than a short annoyance in earlier versions.
To ease debugging,
pins 0.13 and 0.15 are configured as RX and TX, respectively.
They provide stdio if no CDC-ACM is disabled,
and can be used as a custom UART otherwise.
*/

View File

@ -0,0 +1,96 @@
/*
* Copyright (C) 2019 Christian Amsüss <chrysn@fsfe.org>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_nrf52840dongle
* @{
*
* @file
* @brief Board specific configuration for the nRF52840-Dongle
*
* @author Christian Amsüss <chrysn@fsfe.org>
*/
#ifndef BOARD_H
#define BOARD_H
#include "cpu.h"
#include "board_common.h"
#include "periph/gpio.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name LED pin configuration
* @{
*/
/** @brief The LED labelled LD1 */
#define LED0_PIN GPIO_PIN(0, 6)
/** @brief The red channel of the LED labelled LD2 */
#define LED1_PIN GPIO_PIN(0, 8)
/** @brief The green channel of the LED labelled LD2 */
#define LED2_PIN GPIO_PIN(1, 9)
/** @brief The blue channel of the LED labelled LD2 */
#define LED3_PIN GPIO_PIN(0, 12)
/** @} */
/**
* @name LED access macros
* @{
*/
/** Enable LD1 */
#define LED0_ON gpio_clear(LED0_PIN)
/** Disable LD1 */
#define LED0_OFF gpio_set(LED0_PIN)
/** Toggle LD1 */
#define LED0_TOGGLE gpio_toggle(LED0_PIN)
/** Enable LD2's red channel */
#define LED1_ON gpio_clear(LED1_PIN)
/** Disable LD2's red channel */
#define LED1_OFF gpio_set(LED1_PIN)
/** Toggle LD2's red channel */
#define LED1_TOGGLE gpio_toggle(LED1_PIN)
/** Enable LD2's green channel */
#define LED2_ON gpio_clear(LED2_PIN)
/** Disable LD2's green channel */
#define LED2_OFF gpio_set(LED2_PIN)
/** Toggle LD2's green channel */
#define LED2_TOGGLE gpio_toggle(LED2_PIN)
/** Enable LD2's blue channel */
#define LED3_ON gpio_clear(LED3_PIN)
/** Disable LD2's blue channel */
#define LED3_OFF gpio_set(LED3_PIN)
/** Toggle LD2's blue channel */
#define LED3_TOGGLE gpio_toggle(LED3_PIN)
/** @} */
/**
* @name Button pin configuration
* @{
*/
/** @brief The button labelled SW1 */
#define BTN0_PIN GPIO_PIN(1, 6)
/** @brief The GPIO pin mode of the button labelled SW1 */
#define BTN0_MODE GPIO_IN_PU
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* BOARD_H */
/** @} */

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2019 Christian Amsüss <chrysn@fsfe.org>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_nrf52840dongle
* @{
*
* @file
* @brief Configuration of SAUL mapped GPIO pins
*
* @author Christian Amsüss <chrysn@fsfe.org>
*/
#ifndef GPIO_PARAMS_H
#define GPIO_PARAMS_H
#include "board.h"
#include "saul/periph.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief LED and button configuration for SAUL
*/
static const saul_gpio_params_t saul_gpio_params[] =
{
{
.name = "LD 1",
.pin = LED0_PIN,
.mode = GPIO_OUT,
.flags = (SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR),
},
{
.name = "LD 2 Red",
.pin = LED1_PIN,
.mode = GPIO_OUT,
.flags = (SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR),
},
{
.name = "LD 2 Green",
.pin = LED2_PIN,
.mode = GPIO_OUT,
.flags = (SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR),
},
{
.name = "LD 2 Blue",
.pin = LED3_PIN,
.mode = GPIO_OUT,
.flags = (SAUL_GPIO_INVERTED | SAUL_GPIO_INIT_CLEAR),
},
{
.name = "SW 1",
.pin = BTN0_PIN,
.mode = GPIO_IN_PU,
.flags = SAUL_GPIO_INVERTED,
},
};
#ifdef __cplusplus
}
#endif
#endif /* GPIO_PARAMS_H */
/** @} */

View File

@ -0,0 +1,63 @@
/*
* Copyright (C) 2019 Christian Amsüss <chrysn@fsfe.org>
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup boards_nrf52840dongle
* @{
*
* @file
* @brief Peripheral configuration for the nRF52840-Dongle
*
* @author Christian Amsüss <chrysn@fsfe.org>
*
*/
#ifndef PERIPH_CONF_H
#define PERIPH_CONF_H
#include "periph_cpu.h"
#include "cfg_clock_32_1.h"
#include "cfg_rtt_default.h"
#include "cfg_timer_default.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @name UART configuration
*
* This board does not have explicit UART pins. These are set as UART 0 to
* provide an easy serial debug port when not using (or debugging) USB.
*
* @{
*/
static const uart_conf_t uart_config[] = {
{
.dev = NRF_UARTE0,
.rx_pin = GPIO_PIN(0, 13),
.tx_pin = GPIO_PIN(0, 15),
#ifdef MODULE_PERIPH_UART_HW_FC
.rts_pin = GPIO_UNDEF,
.cts_pin = GPIO_UNDEF,
#endif
.irqn = UARTE0_UART0_IRQn,
},
};
#define UART_0_ISR (isr_uart0)
#define UART_NUMOF ARRAY_SIZE(uart_config)
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* PERIPH_CONF_H */