diff --git a/app/boards/arm/nrf52dk_nrf52832/CMakeLists.txt b/app/boards/arm/nrf52dk_nrf52832/CMakeLists.txt new file mode 100644 index 00000000..8f3f3224 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/CMakeLists.txt @@ -0,0 +1,3 @@ +zephyr_library() +zephyr_library_sources(custom_runtime_code.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) \ No newline at end of file diff --git a/app/boards/arm/nrf52dk_nrf52832/Kconfig b/app/boards/arm/nrf52dk_nrf52832/Kconfig new file mode 100644 index 00000000..b8fd339e --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/Kconfig @@ -0,0 +1,13 @@ +# nRF52 DK board configuration + +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on BOARD_NRF52DK_NRF52832 \ No newline at end of file diff --git a/app/boards/arm/nrf52dk_nrf52832/Kconfig.board b/app/boards/arm/nrf52dk_nrf52832/Kconfig.board new file mode 100644 index 00000000..9dae95fb --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/Kconfig.board @@ -0,0 +1,11 @@ +# nRF52 DK NRF52832 board configuration + +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +config BOARD_NRF52DK_NRF52832 + bool "nRF52 DK NRF52832" + depends on SOC_NRF52832_QFAA diff --git a/app/boards/arm/nrf52dk_nrf52832/Kconfig.defconfig b/app/boards/arm/nrf52dk_nrf52832/Kconfig.defconfig new file mode 100644 index 00000000..6d9451cd --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/Kconfig.defconfig @@ -0,0 +1,19 @@ +# nRF52 DK NRF52832 board configuration + +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +config BOARD + default "nrf52dk_nrf52832" + +config ZMK_KEYBOARD_NAME + default "nrf52dk_nrf52832" + +config BT_CTLR +default BT + +config ZMK_BLE + default y diff --git a/app/boards/arm/nrf52dk_nrf52832/README.md b/app/boards/arm/nrf52dk_nrf52832/README.md new file mode 100644 index 00000000..79b72aac --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/README.md @@ -0,0 +1,21 @@ +# NRF52 DK + +This is a sample self-contained ZMK board that is built for the ubiquitous NRF52 DK from Nordic. This can help jumpstart new board projects for people by showcasing various features on a known standard + +You should be able to use this by plugging in an NRF52 DK, turning on the power switch, then running the following from the zmk/app folder: + +```` +west build --pristine -b nrf52dk_nrf52832 && west flash +```` + +## Features + +- BLE functionality +- Simple keymap with modifiers +- Direct GPIO kscan +- Additonal custom code alongside ZMK runtime +- Connection LED + +## Other details + +Many of the files are from zmk/zepjhyr/boards/arm/nrf52dk_nrf52832, with additional modifications for ZMK. \ No newline at end of file diff --git a/app/boards/arm/nrf52dk_nrf52832/board.cmake b/app/boards/arm/nrf52dk_nrf52832/board.cmake new file mode 100644 index 00000000..f99446d1 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/board.cmake @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=nrf52" "--speed=4000") +board_runner_args(pyocd "--target=nrf52" "--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) +include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake) diff --git a/app/boards/arm/nrf52dk_nrf52832/custom_runtime_code.c b/app/boards/arm/nrf52dk_nrf52832/custom_runtime_code.c new file mode 100644 index 00000000..509847d2 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/custom_runtime_code.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include +#include + +#define SW0_NODE DT_ALIAS(sw0) +#if !DT_NODE_HAS_STATUS(SW0_NODE, okay) +#error "Unsupported board: sw0 devicetree alias is not defined" +#endif +static const struct gpio_dt_spec _button = GPIO_DT_SPEC_GET_OR(SW0_NODE, gpios, + {0}); +static const struct gpio_dt_spec led_one = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led0), gpios, + {0}); +static const struct gpio_dt_spec led_two = GPIO_DT_SPEC_GET_OR(DT_ALIAS(led1), gpios, + {0}); + +/** + * Set up an LED DT Spec, default off + */ +void configure_led(struct gpio_dt_spec l) { + int ret = 0; + if (l.port && !device_is_ready(l.port)) { + printk("Error %d: LED device %s is not ready; ignoring it\n", + ret, l.port->name); + l.port = NULL; + } + if (l.port) { + ret = gpio_pin_configure_dt(&l, (GPIO_OUTPUT | GPIO_OUTPUT_LOW)); + if (ret != 0) { + printk("Error %d: failed to configure LED device %s pin %d\n", + ret, l.port->name, l.pin); + l.port = NULL; + } else { + printk("Set up LED at %s pin %d\n", l.port->name, l.pin); + } + } +} + +static struct gpio_callback button_cb_data; +/** + * When the button is pressed, toggle an LED + */ +void button_pressed(const struct device *dev, struct gpio_callback *cb, + uint32_t pins) +{ + printk("Button pressed at %" PRIu32 "\n", k_cycle_get_32()); + gpio_pin_toggle_dt(&led_two); +} + +/** + * Configure a button to be clickable and callback to a method + */ +void configure_button(struct gpio_dt_spec button) { + if (!device_is_ready(button.port)) { + printk("Error: button device %s is not ready\n", + button.port->name); + return; + } + + int ret = gpio_pin_configure_dt(&button, GPIO_INPUT); + if (ret != 0) { + printk("Error %d: failed to configure %s pin %d\n", + ret, button.port->name, button.pin); + return; + } + + ret = gpio_pin_interrupt_configure_dt(&button, + GPIO_INT_EDGE_TO_ACTIVE); + if (ret != 0) { + printk("Error %d: failed to configure interrupt on %s pin %d\n", + ret, button.port->name, button.pin); + return; + } + gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin)); + gpio_add_callback(button.port, &button_cb_data); + printk("Set up button at %s pin %d\n", button.port->name, button.pin); + +} + +/** + * When the BT is connected, turn on an LED + */ +static void connected(struct bt_conn *conn, uint8_t err) +{ + if (err) { + printk("Connection failed (err 0x%02x)\n", err); + int err = gpio_pin_set_dt(&led_one, 0); + if (err) { + printk("LED Set failed (err 0x%02x)\n", err); + } + } else { + int err = gpio_pin_set_dt(&led_one, 1); + if (err) { + printk("LED Set failed (err 0x%02x)\n", err); + } + printk("Connected\n"); + } +} + +/** + * When the BT is disconnected, turn o ff an LED + */ +static void disconnected(struct bt_conn *conn, uint8_t reason) +{ + int err = gpio_pin_set_dt(&led_one, 0); + if (err) { + printk("LED Set failed (err 0x%02x)\n", err); + } + printk("Disconnected (reason 0x%02x)\n", reason); +} + +// Configure the connection callbacks +BT_CONN_CB_DEFINE(conn_callbacks) = { + .connected = connected, + .disconnected = disconnected, +}; + + +static int init(const struct device *port) { + configure_led(led_one); + configure_led(led_two); + configure_button(_button); + + return 0; +} + +SYS_INIT(init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); diff --git a/app/boards/arm/nrf52dk_nrf52832/doc/img/nrf52dk_nrf52832.jpg b/app/boards/arm/nrf52dk_nrf52832/doc/img/nrf52dk_nrf52832.jpg new file mode 100644 index 00000000..0e1af257 Binary files /dev/null and b/app/boards/arm/nrf52dk_nrf52832/doc/img/nrf52dk_nrf52832.jpg differ diff --git a/app/boards/arm/nrf52dk_nrf52832/doc/index.rst b/app/boards/arm/nrf52dk_nrf52832/doc/index.rst new file mode 100644 index 00000000..ee5607d7 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/doc/index.rst @@ -0,0 +1,407 @@ +.. _nrf52dk_nrf52832: + +nRF52 DK +######## + +Overview +******** + +The nRF52 Development Kit (PCA10040) hardware provides +support for the Nordic Semiconductor nRF52832 ARM Cortex-M4F CPU and +the following devices: + +* :abbr:`ADC (Analog to Digital Converter)` +* CLOCK +* FLASH +* :abbr:`GPIO (General Purpose Input Output)` +* :abbr:`I2C (Inter-Integrated Circuit)` +* :abbr:`MPU (Memory Protection Unit)` +* :abbr:`NVIC (Nested Vectored Interrupt Controller)` +* :abbr:`PWM (Pulse Width Modulation)` +* RADIO (Bluetooth Low Energy) +* :abbr:`RTC (nRF RTC System Clock)` +* Segger RTT (RTT Console) +* :abbr:`SPI (Serial Peripheral Interface)` +* :abbr:`UART (Universal asynchronous receiver-transmitter)` +* :abbr:`WDT (Watchdog Timer)` + +.. figure:: img/nrf52dk_nrf52832.jpg + :width: 442px + :align: center + :alt: nRF52 DK + + nRF52 DK (Credit: Nordic Semiconductor) + +More information about the board can be found at the +`nRF52 DK website`_. The `Nordic Semiconductor Infocenter`_ +contains the processor's information and the datasheet. + + +Hardware +******** + +nRF52 DK has two external oscillators. The frequency of +the slow clock is 32.768 kHz. The frequency of the main clock +is 32 MHz. + +Supported Features +================== + +The nrf52dk_nrf52832 board configuration supports the following +hardware features: + ++-----------+------------+----------------------+ +| Interface | Controller | Driver/Component | ++===========+============+======================+ +| ADC | on-chip | adc | ++-----------+------------+----------------------+ +| CLOCK | on-chip | clock_control | ++-----------+------------+----------------------+ +| FLASH | on-chip | flash | ++-----------+------------+----------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+----------------------+ +| I2C(M) | on-chip | i2c | ++-----------+------------+----------------------+ +| MPU | on-chip | arch/arm | ++-----------+------------+----------------------+ +| NVIC | on-chip | arch/arm | ++-----------+------------+----------------------+ +| PWM | on-chip | pwm | ++-----------+------------+----------------------+ +| RADIO | on-chip | Bluetooth | ++-----------+------------+----------------------+ +| RTC | on-chip | system clock | ++-----------+------------+----------------------+ +| RTT | Segger | console | ++-----------+------------+----------------------+ +| SPI(M/S) | on-chip | spi | ++-----------+------------+----------------------+ +| UART | on-chip | serial | ++-----------+------------+----------------------+ +| WDT | on-chip | watchdog | ++-----------+------------+----------------------+ + +Other hardware features have not been enabled yet for this board. +See `nRF52 DK website`_ and `Nordic Semiconductor Infocenter`_ +for a complete list of nRF52 Development Kit board hardware features. + +Connections and IOs +=================== + +LED +--- + +* LED1 (green) = P0.17 +* LED2 (green) = P0.18 +* LED3 (green) = P0.19 +* LED4 (green) = P0.20 +* LD5 (red/green) = OB LED 1/2 + +Push buttons +------------ + +* BUTTON1 = SW1 = P0.13 +* BUTTON2 = SW2 = P0.14 +* BUTTON3 = SW3 = P0.15 +* BUTTON4 = SW4 = P0.16 +* BOOT = SW5 = boot/reset + +External Connectors +------------------- + +J-Link Prog Connector + ++-------+--------------+ +| PIN # | Signal Name | ++=======+==============+ +| 1 | VDD | ++-------+--------------+ +| 2 | IMCU_TMSS | ++-------+--------------+ +| 3 | GND | ++-------+--------------+ +| 4 | IMCU_TCKS | ++-------+--------------+ +| 5 | V5V | ++-------+--------------+ +| 6 | IMCU_TDOS | ++-------+--------------+ +| 7 | Cut off | ++-------+--------------+ +| 8 | IMCU_TDIS | ++-------+--------------+ +| 9 | Cut off | ++-------+--------------+ +| 10 | IMCU_RESET | ++-------+--------------+ + +Debug IN + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | VDD | N/A | ++-------+--------------+-------------------------+ +| 2 | SWDIO | SWDIO | ++-------+--------------+-------------------------+ +| 3 | GND | N/A | ++-------+--------------+-------------------------+ +| 4 | SWDCLK | SWDCLK | ++-------+--------------+-------------------------+ +| 5 | GND | N/A | ++-------+--------------+-------------------------+ +| 6 | P0.18 | P0.18 / TRACEDATA[0] / | +| | | SWO | ++-------+--------------+-------------------------+ +| 7 | Cut off | N/A | ++-------+--------------+-------------------------+ +| 8 | Cut off | N/A | ++-------+--------------+-------------------------+ +| 9 | GND | N/A | ++-------+--------------+-------------------------+ +| 10 | P0.21 | P0.21 / RESET | ++-------+--------------+-------------------------+ + +Debug OUT + ++-------+----------------+ +| PIN # | Signal Name | ++=======+================+ +| 1 | EXT_VTG | ++-------+----------------+ +| 2 | EXT_SWDIO | ++-------+----------------+ +| 3 | GND | ++-------+----------------+ +| 4 | EXT_SWDCLK | ++-------+----------------+ +| 5 | GND | ++-------+----------------+ +| 6 | EXT_SWO | +| | | ++-------+----------------+ +| 7 | Cut off | ++-------+----------------+ +| 8 | Cut off | ++-------+----------------+ +| 9 | EXT_GND_DETECT | ++-------+----------------+ +| 10 | EXT_RESET | ++-------+----------------+ + +Shield Debug and Current measurement + ++-------+----------------+ +| PIN # | Signal Name | ++=======+================+ +| 1 | VDD_nRF | ++-------+----------------+ +| 2 | VDD | ++-------+----------------+ +| 3 | SH_VTG | ++-------+----------------+ +| 4 | SH_SWDIO | ++-------+----------------+ +| 5 | SH_SWDCLK | ++-------+----------------+ +| 6 | SH_SWO | ++-------+----------------+ +| 7 | SH_RESET | ++-------+----------------+ +| 8 | SH_GND_DETECT | ++-------+----------------+ + +Auxiliary + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | P0.00 | P0.00 / XL1 | ++-------+--------------+-------------------------+ +| 2 | P0.01 | P0.01 / XL2 | ++-------+--------------+-------------------------+ +| 3 | P0.21 | P0.21 / RESET | ++-------+--------------+-------------------------+ +| 4 | P0.05_C | P0.05 / AIN3 | ++-------+--------------+-------------------------+ +| 5 | P0.06_C | P0.06 | ++-------+--------------+-------------------------+ +| 6 | P0.07_C | P0.07 | ++-------+--------------+-------------------------+ +| 7 | P0.08_C | P0.08 | ++-------+--------------+-------------------------+ +| 8 | P0.09 | P0.09 / NFC1 | ++-------+--------------+-------------------------+ +| 9 | P0.10 | P0.10 / NFC2 | ++-------+--------------+-------------------------+ + +Arduino Headers +--------------- + +P1/P7 Power + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | VDD | N/A | ++-------+--------------+-------------------------+ +| 2 | VDD | N/A | ++-------+--------------+-------------------------+ +| 3 | RESET | P0.21 / RESET | ++-------+--------------+-------------------------+ +| 4 | VDD | N/A | ++-------+--------------+-------------------------+ +| 5 | V5V | N/A | ++-------+--------------+-------------------------+ +| 6 | GND | N/A | ++-------+--------------+-------------------------+ +| 7 | GND | N/A | ++-------+--------------+-------------------------+ +| 8 | VIN | N/A | ++-------+--------------+-------------------------+ + +P2/P8 Analog in + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | A0 | P0.03 / AIN1 | ++-------+--------------+-------------------------+ +| 2 | A1 | P0.04 / AIN2 | ++-------+--------------+-------------------------+ +| 3 | A2 | P0.28 / AIN4 | ++-------+--------------+-------------------------+ +| 4 | A3 | P0.29 / AIN5 | ++-------+--------------+-------------------------+ +| 5 | A4 | P0.30 / AIN6 | ++-------+--------------+-------------------------+ +| 6 | A5 | P0.31 / AIN7 | ++-------+--------------+-------------------------+ + +P3/P9 Digital I/O + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | D0 (RX) | P0.11 | ++-------+--------------+-------------------------+ +| 2 | D1 (TX) | P0.12 | ++-------+--------------+-------------------------+ +| 3 | D2 | P0.13 | ++-------+--------------+-------------------------+ +| 4 | D3 | P0.14 / TRACEDATA[3] | ++-------+--------------+-------------------------+ +| 5 | D4 | P0.15 / TRACEDATA[2] | ++-------+--------------+-------------------------+ +| 6 | D5 | P0.16 / TRACEDATA[1] | ++-------+--------------+-------------------------+ +| 7 | D6 | P0.17 | ++-------+--------------+-------------------------+ +| 8 | D7 | P0.18 / TRACEDATA[3] / | +| | | SWO | ++-------+--------------+-------------------------+ + +P4/P10 Digital I/O + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | D8 | P0.19 | ++-------+--------------+-------------------------+ +| 2 | D9 | P0.20 / TRACECLK | ++-------+--------------+-------------------------+ +| 3 | D10 (SS) | P0.22 | ++-------+--------------+-------------------------+ +| 4 | D11 (MOSI) | P0.23 | ++-------+--------------+-------------------------+ +| 5 | D12 (MISO) | P0.24 | ++-------+--------------+-------------------------+ +| 6 | D13 (SCK) | P0.25 | ++-------+--------------+-------------------------+ +| 7 | GND | N/A | ++-------+--------------+-------------------------+ +| 8 | AREF | P0.02 / AIN0 | ++-------+--------------+-------------------------+ +| 9 | SDA | P0.26 | ++-------+--------------+-------------------------+ +| 10 | SCL | P0.27 | ++-------+--------------+-------------------------+ + +P5/P11 + ++-------+--------------+-------------------------+ +| PIN # | Signal Name | NRF52832 Functions | ++=======+==============+=========================+ +| 1 | D12 (MISO) | P0.24 | ++-------+--------------+-------------------------+ +| 2 | V5V | N/A | ++-------+--------------+-------------------------+ +| 3 | D13 (SCK) | P0.25 | ++-------+--------------+-------------------------+ +| 4 | D11 (MOSI) | P0.23 | ++-------+--------------+-------------------------+ +| 5 | RESET | N/A | ++-------+--------------+-------------------------+ +| 6 | N/A | N/A | ++-------+--------------+-------------------------+ + +Programming and Debugging +************************* + +Flashing +======== + +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`. 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 :ref:`hello_world` application. + +First, run your favorite terminal program to listen for output. + +.. code-block:: console + + $ minicom -D -b 115200 + +Replace :code:`` with the port where the board nRF52 DK +can be found. For example, under Linux, :code:`/dev/ttyACM0`. + +Then build and flash the application in the usual way. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: nrf52dk_nrf52832 + :goals: build flash + +Debugging +========= + +Refer to the :ref:`nordic_segger` page to learn about debugging Nordic boards with a +Segger IC. + + +Testing the LEDs and buttons in the nRF52 DK +******************************************** + +There are 2 samples that allow you to test that the buttons (switches) and LEDs on +the board are working properly with Zephyr: + +.. code-block:: console + + samples/basic/blinky + samples/basic/button + +You can build and flash the examples to make sure Zephyr is running correctly on +your board. The button and LED definitions can be found in +:zephyr_file:`boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts`. + +References +********** + +.. target-notes:: + +.. _nRF52 DK website: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52-DK +.. _Nordic Semiconductor Infocenter: https://infocenter.nordicsemi.com diff --git a/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts new file mode 100644 index 00000000..440e2e80 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.dts @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include + +/ { + model = "Nordic nRF52 DK NRF52832"; + compatible = "nordic,nrf52-dk-nrf52832"; + kscan0: kscan { + compatible = "zmk,kscan-gpio-direct"; + label = "KSCAN"; + + input-gpios + = <&gpio0 13 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpio0 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpio0 15 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + , <&gpio0 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)> + ; + }; + + chosen { + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + 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; + zmk,kscan = &kscan0; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 17 GPIO_ACTIVE_LOW>; + label = "Green LED 0"; + }; + led1: led_1 { + gpios = <&gpio0 18 GPIO_ACTIVE_LOW>; + label = "Green LED 1"; + }; + led2: led_2 { + gpios = <&gpio0 19 GPIO_ACTIVE_LOW>; + label = "Green LED 2"; + }; + led3: led_3 { + gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + label = "Green LED 3"; + }; + }; + + pwmleds { + compatible = "pwm-leds"; + pwm_led0: pwm_led_0 { + pwms = <&pwm0 17>; + }; + }; + + buttons { + compatible = "gpio-keys"; + button0: button_0 { + gpios = <&gpio0 13 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 0"; + }; + button1: button_1 { + gpios = <&gpio0 14 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 1"; + }; + button2: button_2 { + gpios = <&gpio0 15 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 2"; + }; + button3: button_3 { + gpios = <&gpio0 16 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "Push button switch 3"; + }; + }; + + arduino_header: connector { + compatible = "arduino-header-r3"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 3 0>, /* A0 */ + <1 0 &gpio0 4 0>, /* A1 */ + <2 0 &gpio0 28 0>, /* A2 */ + <3 0 &gpio0 29 0>, /* A3 */ + <4 0 &gpio0 30 0>, /* A4 */ + <5 0 &gpio0 31 0>, /* A5 */ + <6 0 &gpio0 11 0>, /* D0 */ + <7 0 &gpio0 12 0>, /* D1 */ + <8 0 &gpio0 13 0>, /* D2 */ + <9 0 &gpio0 14 0>, /* D3 */ + <10 0 &gpio0 15 0>, /* D4 */ + <11 0 &gpio0 16 0>, /* D5 */ + <12 0 &gpio0 17 0>, /* D6 */ + <13 0 &gpio0 18 0>, /* D7 */ + <14 0 &gpio0 19 0>, /* D8 */ + <15 0 &gpio0 20 0>, /* D9 */ + <16 0 &gpio0 22 0>, /* D10 */ + <17 0 &gpio0 23 0>, /* D11 */ + <18 0 &gpio0 24 0>, /* D12 */ + <19 0 &gpio0 25 0>, /* D13 */ + <20 0 &gpio0 26 0>, /* D14 */ + <21 0 &gpio0 27 0>; /* D15 */ + }; + + arduino_adc: analog-connector { + compatible = "arduino,uno-adc"; + #io-channel-cells = <1>; + io-channel-map = <0 &adc 1>, /* A0 = P0.3 = AIN1 */ + <1 &adc 2>, /* A1 = P0.4 = AIN2 */ + <2 &adc 4>, /* A2 = P0.28 = AIN4 */ + <3 &adc 5>, /* A3 = P0.29 = AIN5 */ + <4 &adc 6>, /* A4 = P0.30 = AIN6 */ + <5 &adc 7>; /* A5 = P0.31 = AIN7 */ + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + led0 = &led0; + led1 = &led1; + led2 = &led2; + led3 = &led3; + pwm-led0 = &pwm_led0; + sw0 = &button0; + sw1 = &button1; + sw2 = &button2; + sw3 = &button3; + bootloader-led0 = &led0; + }; +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +arduino_serial: &uart0 { + status = "okay"; + compatible = "nordic,nrf-uarte"; + current-speed = <115200>; + tx-pin = <6>; + rx-pin = <8>; + rts-pin = <5>; + cts-pin = <7>; +}; + +arduino_i2c: &i2c0 { + compatible = "nordic,nrf-twi"; + status = "okay"; + sda-pin = <26>; + scl-pin = <27>; +}; + +&i2c1 { + compatible = "nordic,nrf-twi"; + /* Cannot be used together with spi1. */ + /* status = "okay"; */ + sda-pin = <30>; + scl-pin = <31>; +}; + +&pwm0 { + status = "okay"; + ch0-pin = <17>; + ch0-inverted; +}; + +&spi0 { + compatible = "nordic,nrf-spi"; + /* Cannot be used together with i2c0. */ + /* status = "okay"; */ + sck-pin = <27>; + mosi-pin = <26>; + miso-pin = <28>; +}; + +&spi1 { + compatible = "nordic,nrf-spi"; + status = "okay"; + sck-pin = <31>; + mosi-pin = <30>; + miso-pin = <29>; +}; + +arduino_spi: &spi2 { + compatible = "nordic,nrf-spi"; + status = "okay"; + sck-pin = <25>; + mosi-pin = <23>; + miso-pin = <24>; + cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */ +}; + +&flash0 { + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + boot_partition: partition@0 { + label = "mcuboot"; + reg = <0x00000000 0xc000>; + }; + slot0_partition: partition@c000 { + label = "image-0"; + reg = <0x0000C000 0x32000>; + }; + slot1_partition: partition@3e000 { + label = "image-1"; + reg = <0x0003E000 0x32000>; + }; + scratch_partition: partition@70000 { + label = "image-scratch"; + reg = <0x00070000 0xa000>; + }; + storage_partition: partition@7a000 { + label = "storage"; + reg = <0x0007a000 0x00006000>; + }; + }; +}; diff --git a/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.keymap b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.keymap new file mode 100644 index 00000000..0682ffa3 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.keymap @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2022 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + default_layer { + bindings = < + &kp Z &kp M &kp K &kp LEFT_SHIFT + >; + }; + }; +}; diff --git a/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.yaml b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.yaml new file mode 100644 index 00000000..8bae499c --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.yaml @@ -0,0 +1,23 @@ +identifier: nrf52dk_nrf52832 +name: nRF52-DK-NRF52832 +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 64 +flash: 512 +supported: + - adc + - arduino_gpio + - arduino_i2c + - arduino_spi + - ble + - gpio + - counter + - nvs + - i2c + - pwm + - spi + - watchdog diff --git a/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.zmk.yaml b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.zmk.yaml new file mode 100644 index 00000000..13e09cb7 --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832.zmk.yaml @@ -0,0 +1,12 @@ +file_format: "1" +id: nrf52dk_nrf52832 +name: nrf52dk_nrf52832 +type: board +arch: arm +features: + - keys + - ble +outputs: + - usb + - ble +url: https://nicekeyboards.com/nice-60 diff --git a/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832_defconfig b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832_defconfig new file mode 100644 index 00000000..b66fcf8d --- /dev/null +++ b/app/boards/arm/nrf52dk_nrf52832/nrf52dk_nrf52832_defconfig @@ -0,0 +1,44 @@ +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52832_QFAA=y +CONFIG_BOARD_NRF52DK_NRF52832=y +# CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_ZMK_KSCAN_DIRECT_POLLING=y +CONFIG_ZMK_BLE=y +# CONFIG_LOG=y #causes crashes +# CONFIG_LOG_BACKEND_SHOW_COLOR=n +# CONFIG_ZMK_LOG_LEVEL_DBG=y +# CONFIG_DEBUG=y +CONFIG_MAIN_STACK_SIZE=2048 +CONFIG_ISR_STACK_SIZE=2048 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable RTT +CONFIG_USE_SEGGER_RTT=y + +# enable GPIO +CONFIG_GPIO=y + +# enable uart driver +CONFIG_SERIAL=y + +# enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# additional board options +CONFIG_GPIO_AS_PINRESET=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y