From b190fa0b4aa873379564a837ec2f99a4154b8664 Mon Sep 17 00:00:00 2001 From: Florijan Plohl Date: Tue, 11 Jun 2024 10:22:25 +0200 Subject: [PATCH] boards: norik: Add support for Norik Octopus IO-Board Add support for Norik Systems Octopus IO-Board based on Norik Systems Octopus SoM. Supported features: - LTE-M/NB-IoT - GPS - LED - 3-axis accelerometer - Battery charger - Solar charger - SPI NOR flash - Nano SIM connector Signed-off-by: Florijan Plohl --- boards/norik/octopus_io_board/CMakeLists.txt | 5 + boards/norik/octopus_io_board/Kconfig | 15 ++ .../norik/octopus_io_board/Kconfig.defconfig | 33 ++++ .../octopus_io_board/Kconfig.octopus_io_board | 5 + boards/norik/octopus_io_board/board.c | 63 ++++++++ boards/norik/octopus_io_board/board.cmake | 6 + boards/norik/octopus_io_board/board.yml | 7 + .../doc/img/Norik_Octopus_IO-board.webp | Bin 0 -> 43468 bytes boards/norik/octopus_io_board/doc/index.rst | 147 ++++++++++++++++++ .../dts/bindings/norik,power-controller.yaml | 39 +++++ .../dts/bindings/norik,sim_select.yaml | 26 ++++ .../octopus_io_board_common-pinctrl.dtsi | 36 +++++ .../octopus_io_board_common.dtsi | 76 +++++++++ .../octopus_io_board_defconfig | 24 +++ .../octopus_io_board_nrf9160.dts | 23 +++ .../octopus_io_board_nrf9160.yaml | 17 ++ .../octopus_io_board_nrf9160_ns.dts | 22 +++ .../octopus_io_board_nrf9160_ns.yaml | 17 ++ .../octopus_io_board_nrf9160_ns_defconfig | 27 ++++ dts/bindings/vendor-prefixes.txt | 1 + 20 files changed, 589 insertions(+) create mode 100644 boards/norik/octopus_io_board/CMakeLists.txt create mode 100644 boards/norik/octopus_io_board/Kconfig create mode 100644 boards/norik/octopus_io_board/Kconfig.defconfig create mode 100644 boards/norik/octopus_io_board/Kconfig.octopus_io_board create mode 100644 boards/norik/octopus_io_board/board.c create mode 100644 boards/norik/octopus_io_board/board.cmake create mode 100644 boards/norik/octopus_io_board/board.yml create mode 100644 boards/norik/octopus_io_board/doc/img/Norik_Octopus_IO-board.webp create mode 100644 boards/norik/octopus_io_board/doc/index.rst create mode 100644 boards/norik/octopus_io_board/dts/bindings/norik,power-controller.yaml create mode 100644 boards/norik/octopus_io_board/dts/bindings/norik,sim_select.yaml create mode 100644 boards/norik/octopus_io_board/octopus_io_board_common-pinctrl.dtsi create mode 100644 boards/norik/octopus_io_board/octopus_io_board_common.dtsi create mode 100644 boards/norik/octopus_io_board/octopus_io_board_defconfig create mode 100644 boards/norik/octopus_io_board/octopus_io_board_nrf9160.dts create mode 100644 boards/norik/octopus_io_board/octopus_io_board_nrf9160.yaml create mode 100644 boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.dts create mode 100644 boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.yaml create mode 100644 boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns_defconfig diff --git a/boards/norik/octopus_io_board/CMakeLists.txt b/boards/norik/octopus_io_board/CMakeLists.txt new file mode 100644 index 00000000000000..2e35c87b81db63 --- /dev/null +++ b/boards/norik/octopus_io_board/CMakeLists.txt @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() +zephyr_library_sources(board.c) diff --git a/boards/norik/octopus_io_board/Kconfig b/boards/norik/octopus_io_board/Kconfig new file mode 100644 index 00000000000000..a960cec6a29beb --- /dev/null +++ b/boards/norik/octopus_io_board/Kconfig @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_OCTOPUS_IO_BOARD + select PINCTRL + +config OCTOPUS_IO_BOARD_CONTROL_INIT_PRIORITY + int "Init priority" + default 99 + help + Init priority for board control. + +module = OCTOPUS_IO_BOARD_CONTROL +module-str = Board Control +source "subsys/logging/Kconfig.template.log_config" diff --git a/boards/norik/octopus_io_board/Kconfig.defconfig b/boards/norik/octopus_io_board/Kconfig.defconfig new file mode 100644 index 00000000000000..4c00ab52ab59bd --- /dev/null +++ b/boards/norik/octopus_io_board/Kconfig.defconfig @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_OCTOPUS_IO_BOARD + +# For the secure version of the board the firmware is linked at the beginning +# of the flash, or into the code-partition defined in DT if it is intended to +# be loaded by MCUboot. If the secure firmware is to be combined with a non- +# secure image (TRUSTED_EXECUTION_SECURE=y), the secure FW image shall always +# be restricted to the size of its code partition. +# For the non-secure version of the board, the firmware +# must be linked into the code-partition (non-secure) defined in DT, regardless. +# Apply this configuration below by setting the Kconfig symbols used by +# the linker according to the information extracted from DT partitions. + +# Workaround for not being able to have commas in macro arguments +DT_CHOSEN_Z_CODE_PARTITION := zephyr,code-partition + +config FLASH_LOAD_SIZE + default $(dt_chosen_reg_size_hex,$(DT_CHOSEN_Z_CODE_PARTITION)) + depends on BOARD_OCTOPUS_IO_BOARD && TRUSTED_EXECUTION_SECURE + +if BOARD_OCTOPUS_IO_BOARD_NRF9160_NS + +config FLASH_LOAD_OFFSET + default $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CODE_PARTITION)) + +config FLASH_LOAD_SIZE + default $(dt_chosen_reg_size_hex,$(DT_CHOSEN_Z_CODE_PARTITION)) + +endif # BOARD_OCTOPUS_IO_BOARD_NRF9160_NS + +endif # BOARD_OCTOPUS_IO_BOARD diff --git a/boards/norik/octopus_io_board/Kconfig.octopus_io_board b/boards/norik/octopus_io_board/Kconfig.octopus_io_board new file mode 100644 index 00000000000000..1b24864afda649 --- /dev/null +++ b/boards/norik/octopus_io_board/Kconfig.octopus_io_board @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_OCTOPUS_IO_BOARD + select SOC_NRF9160_SICA diff --git a/boards/norik/octopus_io_board/board.c b/boards/norik/octopus_io_board/board.c new file mode 100644 index 00000000000000..4cc88bd393e10c --- /dev/null +++ b/boards/norik/octopus_io_board/board.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2024 Norik Systems + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include +#include + +LOG_MODULE_REGISTER(board_control, CONFIG_OCTOPUS_IO_BOARD_CONTROL_LOG_LEVEL); + +#define CHARGER_NODE DT_NODELABEL(bq25180) +#define SIM_SELECT_NODE DT_PATH(sim_select) + +struct charger_config { + struct i2c_dt_spec i2c; + uint32_t initial_current_microamp; +}; + +static int octopus_io_board_init(void) +{ + int ret; + + const struct gpio_dt_spec simctrl = GPIO_DT_SPEC_GET(DT_PATH(sim_select), sim_gpios); + + if (!gpio_is_ready_dt(&simctrl)) { + LOG_ERR("SIM select GPIO not available"); + return -ENODEV; + } + + if (DT_ENUM_IDX(SIM_SELECT_NODE, sim) == 0) { + (void)gpio_pin_configure_dt(&simctrl, GPIO_OUTPUT_LOW); + LOG_INF("On-board SIM selected"); + } else { + (void)gpio_pin_configure_dt(&simctrl, GPIO_OUTPUT_HIGH); + LOG_INF("External SIM selected"); + } + + const struct device *charger = DEVICE_DT_GET(CHARGER_NODE); + + if (!device_is_ready(charger)) { + LOG_ERR("Charger not ready"); + return -ENODEV; + } + + const struct charger_config *cfg = charger->config; + + ret = i2c_reg_update_byte_dt(&cfg->i2c, 0x5, 0xff, 0b00100100); + + if (ret < 0) { + LOG_ERR("Failed to set charger CHARGECTRL0 register"); + return ret; + } + LOG_INF("Set CHARGECTRL0 register"); + + return 0; +} + +SYS_INIT(octopus_io_board_init, POST_KERNEL, CONFIG_OCTOPUS_IO_BOARD_CONTROL_INIT_PRIORITY); diff --git a/boards/norik/octopus_io_board/board.cmake b/boards/norik/octopus_io_board/board.cmake new file mode 100644 index 00000000000000..e1ae7b4e9b2373 --- /dev/null +++ b/boards/norik/octopus_io_board/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=nRF9160_xxAA" "--speed=4000") +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/norik/octopus_io_board/board.yml b/boards/norik/octopus_io_board/board.yml new file mode 100644 index 00000000000000..3a021861b16f0e --- /dev/null +++ b/boards/norik/octopus_io_board/board.yml @@ -0,0 +1,7 @@ +board: + name: octopus_io_board + vendor: norik + socs: + - name: nrf9160 + variants: + - name: 'ns' diff --git a/boards/norik/octopus_io_board/doc/img/Norik_Octopus_IO-board.webp b/boards/norik/octopus_io_board/doc/img/Norik_Octopus_IO-board.webp new file mode 100644 index 0000000000000000000000000000000000000000..ea170c7e3c012c4873fd6854007aba77207ed52b GIT binary patch literal 43468 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 z^j%LM1AqVk04C;!P;pL1_==*A;J8Uzga7~l000000000008Q`!000000000000000 G0000~m|#Qz literal 0 HcmV?d00001 diff --git a/boards/norik/octopus_io_board/doc/index.rst b/boards/norik/octopus_io_board/doc/index.rst new file mode 100644 index 00000000000000..069b3f4df00bb9 --- /dev/null +++ b/boards/norik/octopus_io_board/doc/index.rst @@ -0,0 +1,147 @@ +.. _octopus_io_board: + +Norik Octopus IO-Board +###################### + +Overview +******** + +Octopus IO-Board is an expansion to the Octopus SoM, which is built around the nRF9160 SiP +offering NB-IoT and LTE-M connectivity, GPS and accelerometer. Octopus IO-Board expands +the capabilities of the Octopus SoM by providing additional peripherals and interfaces for +development and prototyping of low-power IoT applications. + +nRF9160 SiP contains ARM Cortex-M33 application processor 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)` +* :abbr:`RTC (nRF RTC System Clock)` +* Segger RTT (RTT Console) +* :abbr:`SPI (Serial Peripheral Interface)` +* :abbr:`UARTE (Universal asynchronous receiver-transmitter with EasyDMA)` +* :abbr:`WDT (Watchdog Timer)` +* :abbr:`IDAU (Implementation Defined Attribution Unit)` + +.. figure:: img/Norik_Octopus_IO-board.webp + :align: center + :alt: Norik Octopus IO-Board front view + + Norik Octopus IO-Board + +Octopus IO Board offers the following features: + +* Battery charger +* USB-C for power +* Solar charger +* Alkaline battery input +* LDO regulator to power Octopus SoM and peripherals +* Battery monitoring using ADC +* 64 Mbit SPI NOR flash +* Dedicated ADC, GPIO, I2C, SPI and UARTE pins for expansion +* Exposed headers for current measurements +* Nano SIM connector +* Tag-Connect TC2030-IDC 6-pin connector for SWD programming and debugging +* 2x3 pinheader for SWD programming and debugging + +Hardware +******** + +Connections and IOs +=================== + +The Octopus IO Board features multiple dedicated pin headers for peripherals: + +* 3x I2C0 bus +* 2x SPI0 bus +* 3x I2C1/SPI1 bus (selectable) +* 1x UARTE0 bus +* 1x Analog input (5 input pins) +* 1x GPIO (7 I/O pins) + +The I2C1/SPI1 bus is selectable by the user by cutting/soldering SB8 and SB9 solder bridges and configuring the bus in the device tree. + +The GPIO pin header provides 7 I/O pins, which can be used as digital input/output. Some of them also serve as chip selects for SPI peripherals. + +Power supply +============ + +The Octopus IO Board can be powered from the following sources: + +* USB-C connector +* Solar cell +* Alkaline battery +* Li-Po battery + +When powered from USB-C or solar cell, the board can charge the Li-Po battery. The battery voltage can be monitored using ADC which can +provide information about the battery State of charge (SOC). + +When powered from alkaline battery, the user needs to set switch SW1 to ALK position. This ensures that the Li-Ion battery is not charged from the alkaline battery. + +The board has a built-in LDO regulator that is used to power the Octopus SoM and peripherals. The EN2 pin can be used to enable/disable output 2 of the LDO regulator. +This can be used to power off peripherals to save power when they are not needed. + +The board also has multiple built-in test points for measuring current consumption of the board, which enables the user to measure and optimize the power consumption of the board. + +Programming and Debugging +************************* + +Norik Octopus IO board can be programmed and debugged using the Tag-Connect TC2030-IDC 6-pin connector or 6-pin SWD pinheader. + +Building an application +======================= + +In most case you'll need to use ``octopus_io_board/nrf9160/ns`` target for building examples. +Some examples don't require non secure mode and can be built with ``octopus_io_board/nrf9160`` target. + +Flashing +======== +Refer to the instruction in the :ref:`nordic_segger` page to install and +configure all the necessary software. + +Here is an example for the Hello World application. + +First, run your favorite terminal program to listen for output. + +.. code-block:: console + + $ minicom /dev/ 115200 + +Replace with the port where the Octopus IO-Board can be found. For example, under Linux, /dev/ttyACM0. + +Then build and flash the application in the usual way. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: octopus_io_board/nrf9160 + :goals: build flash + +To build and flash the application in non-secure mode, use the following command: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: octopus_io_board/nrf9160/ns + :goals: build flash + +Debugging +========= +Refer to the instruction in the :ref:`nordic_segger` page for information on +debugging. + +Testing the on-board LED +======================== +Use the :zephyr:code-sample:`blinky` to test the on-board LED. Build and flash the example to make sure Zephyr is running correctly on your board. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: octopus_io_board/nrf9160 + :goals: build flash + +References +********** diff --git a/boards/norik/octopus_io_board/dts/bindings/norik,power-controller.yaml b/boards/norik/octopus_io_board/dts/bindings/norik,power-controller.yaml new file mode 100644 index 00000000000000..b49b947a7b700c --- /dev/null +++ b/boards/norik/octopus_io_board/dts/bindings/norik,power-controller.yaml @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +description: | + This binding is used for controlling battery charger and + LDO regulator on the Octopus IO Board. + +compatible: "norik,power-controller" + +include: base.yaml + +properties: + debounce-interval-ms: + type: int + default: 30 + description: | + Debouncing interval time in milliseconds. + If not specified defaults to 30. + + polling-mode: + type: boolean + description: | + Do not use interrupts for the key GPIOs, poll the pin periodically at the + specified debounce-interval-ms instead. + +child-binding: + description: Child Node for the power controller + properties: + gpios: + type: phandle-array + required: true + + label: + type: string + description: Descriptive name of the gpio + + zephyr,code: + type: int + description: Key code to emit. diff --git a/boards/norik/octopus_io_board/dts/bindings/norik,sim_select.yaml b/boards/norik/octopus_io_board/dts/bindings/norik,sim_select.yaml new file mode 100644 index 00000000000000..2745afaac9434b --- /dev/null +++ b/boards/norik/octopus_io_board/dts/bindings/norik,sim_select.yaml @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Norik Systems +# SPDX-License-Identifier: Apache-2.0 + +description: | + The Octopus SoM provides the user 2 options for connecting + a SIM card to the nRF9160. Option one is to use on-board eSIM or + external nano SIM. Which SIM is used can be selected using the 'sim' + property of the 'sim_select' dt node. + +compatible: "norik,sim_select" + +include: base.yaml + +properties: + sim-gpios: + type: phandle-array + required: true + description: Pin used to select which SIM is used + + sim: + type: string + required: true + enum: + - "on-board" + - "external" + description: SIM choice (on-board eSIM or external nano SIM) diff --git a/boards/norik/octopus_io_board/octopus_io_board_common-pinctrl.dtsi b/boards/norik/octopus_io_board/octopus_io_board_common-pinctrl.dtsi new file mode 100644 index 00000000000000..8f46475d246a4d --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_common-pinctrl.dtsi @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2024 Norik Systems + * SPDX-License-Identifier: Apache-2.0 + */ + +&pinctrl { + i2c0_default: i2c0_default { + group1 { + psels = , + ; + }; + }; + + i2c0_sleep: i2c0_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; + + i2c1_default: i2c1_default { + group1 { + psels = , + ; + }; + }; + + i2c1_sleep: i2c1_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/boards/norik/octopus_io_board/octopus_io_board_common.dtsi b/boards/norik/octopus_io_board/octopus_io_board_common.dtsi new file mode 100644 index 00000000000000..d97fb083fc3a43 --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_common.dtsi @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2024 Norik Systems + * SPDX-License-Identifier: Apache-2.0 + */ +#include "octopus_io_board_common-pinctrl.dtsi" +#include "../octopus_som/octopus_som_common.dtsi" + +/ { + model = "Norik Octopus IO-Board"; + compatible = "norik,octopus-io-board"; + + chosen { + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,uart-mcumgr = &uart0; + }; + + peripheral-power-controller { + compatible = "norik,power-controller"; + + pwrgpio0: pwrgpio_0 { + label = "VP on/off"; + gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; + }; + + pwrgpio1: pwrgpio_1 { + label = "CHG control"; + gpios = <&gpio0 20 (GPIO_ACTIVE_LOW)>; + }; + + }; + + /* These aliases are provided for compatibility with samples */ + aliases { + watchdog0 = &wdt0; + }; +}; + +&i2c1 { + compatible = "nordic,nrf-twim"; + status = "okay"; + pinctrl-0 = <&i2c0_default>; + pinctrl-1 = <&i2c0_sleep>; + pinctrl-names = "default", "sleep"; + + bq25180: bq25180@6a { + compatible = "ti,bq25180"; + status = "okay"; + reg = <0x6a>; + constant-charge-current-max-microamp = <10000>; + }; +}; + +&spi3 { + status = "okay"; + cs-gpios = <&gpio0 11 GPIO_ACTIVE_LOW>,<&gpio0 5 GPIO_ACTIVE_LOW>; + + adxl362: adxl362@0 { + compatible = "adi,adxl362"; + spi-max-frequency = <8000000>; + reg = <0>; + int1-gpios = <&gpio0 12 0>; + }; + + w25q64: w25q64@1 { + compatible = "jedec,spi-nor"; + status = "okay"; + reg = <1>; + spi-max-frequency = <8000000>; + jedec-id = [ef 40 17]; + size = <0x4000000>; + has-dpd; + t-enter-dpd = <3500>; + t-exit-dpd = <3500>; + }; +}; diff --git a/boards/norik/octopus_io_board/octopus_io_board_defconfig b/boards/norik/octopus_io_board/octopus_io_board_defconfig new file mode 100644 index 00000000000000..ebe61dd1c470f0 --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_defconfig @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable TrustZone-M +CONFIG_ARM_TRUSTZONE_M=y + +# Enable GPIO +CONFIG_GPIO=y +CONFIG_INPUT_GPIO_KEYS=n + +# Enable uart driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable charger +CONFIG_CHARGER=y diff --git a/boards/norik/octopus_io_board/octopus_io_board_nrf9160.dts b/boards/norik/octopus_io_board/octopus_io_board_nrf9160.dts new file mode 100644 index 00000000000000..aae7cb1f345fe5 --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_nrf9160.dts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2024 Norik Systems + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "octopus_io_board_common.dtsi" + +/ { + chosen { + zephyr,sram = &sram0_s; + zephyr,flash = &flash0; + zephyr,code-partition = &slot0_partition; + zephyr,sram-secure-partition = &sram0_s; + zephyr,sram-non-secure-partition = &sram0_ns; + }; +}; + +&uart0 { + status = "okay"; + current-speed = <115200>; +}; diff --git a/boards/norik/octopus_io_board/octopus_io_board_nrf9160.yaml b/boards/norik/octopus_io_board/octopus_io_board_nrf9160.yaml new file mode 100644 index 00000000000000..e91c1da14b57d6 --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_nrf9160.yaml @@ -0,0 +1,17 @@ +identifier: octopus_io_board/nrf9160 +name: Norik Octopus IO-Board +type: mcu +arch: arm +ram: 88 +flash: 1024 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - i2c + - spi + - pwm + - watchdog +vendor: norik diff --git a/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.dts b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.dts new file mode 100644 index 00000000000000..fa24ffbf56500c --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.dts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 Norik Systems + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include "octopus_io_board_common.dtsi" + +/ { + chosen { + zephyr,flash = &flash0; + zephyr,sram = &sram0_ns; + zephyr,code-partition = &slot0_ns_partition; + }; +}; + +/* Disable UART1, because it is used by default in TF-M */ + +&uart1 { + status = "disabled"; +}; diff --git a/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.yaml b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.yaml new file mode 100644 index 00000000000000..675c316f6c28cf --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns.yaml @@ -0,0 +1,17 @@ +identifier: octopus_io_board/nrf9160/ns +name: Norik Octopus IO-Board Non-Secure +type: mcu +arch: arm +ram: 128 +flash: 192 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - gpio + - i2c + - spi + - pwm + - watchdog +vendor: norik diff --git a/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns_defconfig b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns_defconfig new file mode 100644 index 00000000000000..7f83de24f606b2 --- /dev/null +++ b/boards/norik/octopus_io_board/octopus_io_board_nrf9160_ns_defconfig @@ -0,0 +1,27 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable hardware stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable TrustZone-M +CONFIG_ARM_TRUSTZONE_M=y + +# This Board implies building Non-Secure firmware +CONFIG_TRUSTED_EXECUTION_NONSECURE=y + +# Enable GPIO +CONFIG_GPIO=y +CONFIG_INPUT_GPIO_KEYS=n + +# Enable uart driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable charger +CONFIG_CHARGER=y diff --git a/dts/bindings/vendor-prefixes.txt b/dts/bindings/vendor-prefixes.txt index 466ea9e3f3ce82..9cd5368cdf3281 100644 --- a/dts/bindings/vendor-prefixes.txt +++ b/dts/bindings/vendor-prefixes.txt @@ -463,6 +463,7 @@ nintendo Nintendo nlt NLT Technologies, Ltd. nokia Nokia nordic Nordic Semiconductor +norik Norik Systems noritake Noritake Co., Inc. Electronics Division novtech NovTech, Inc. nuclei Nuclei System Technology