From 0ae359f913ef912b911d2af98bd34f515ce4da15 Mon Sep 17 00:00:00 2001 From: raiden00pl Date: Fri, 18 Sep 2026 16:20:50 +0200 Subject: [PATCH] boards/nrf54l15-tag: add board support add nrf54l15-tag board support Assisted-by: Codex:GPT-6 Signed-off-by: raiden00pl --- .../arm/nrf54l/boards/nrf54l15-tag/index.rst | 112 +++++++++++++ .../nrf54l15-tag/nrf54l15-tag-front.jpg | Bin 0 -> 84642 bytes boards/Kconfig | 10 ++ boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt | 23 +++ boards/arm/nrf54l/nrf54l15-tag/Kconfig | 8 + .../nrf54l/nrf54l15-tag/configs/nsh/defconfig | 28 ++++ .../nrf54l/nrf54l15-tag/configs/sdc/defconfig | 62 +++++++ .../nrf54l15-tag/configs/sensors/defconfig | 65 ++++++++ .../arm/nrf54l/nrf54l15-tag/include/board.h | 82 +++++++++ .../arm/nrf54l/nrf54l15-tag/scripts/Make.defs | 36 ++++ .../arm/nrf54l/nrf54l15-tag/scripts/rram.ld | 111 +++++++++++++ .../nrf54l/nrf54l15-tag/src/CMakeLists.txt | 45 +++++ boards/arm/nrf54l/nrf54l15-tag/src/Make.defs | 51 ++++++ boards/arm/nrf54l/nrf54l15-tag/src/Makefile | 24 +++ .../nrf54l/nrf54l15-tag/src/nrf54l15-tag.h | 103 ++++++++++++ .../arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c | 93 +++++++++++ .../nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c | 104 ++++++++++++ .../arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c | 72 ++++++++ .../nrf54l/nrf54l15-tag/src/nrf54l_bringup.c | 147 ++++++++++++++++ .../nrf54l/nrf54l15-tag/src/nrf54l_buttons.c | 157 ++++++++++++++++++ .../arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c | 98 +++++++++++ .../nrf54l/nrf54l15-tag/src/nrf54l_sensors.c | 156 +++++++++++++++++ .../arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c | 82 +++++++++ .../nrf54l/nrf54l15-tag/src/nrf54l_userleds.c | 115 +++++++++++++ 24 files changed, 1784 insertions(+) create mode 100644 Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/index.rst create mode 100644 Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/nrf54l15-tag-front.jpg create mode 100644 boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt create mode 100644 boards/arm/nrf54l/nrf54l15-tag/Kconfig create mode 100644 boards/arm/nrf54l/nrf54l15-tag/configs/nsh/defconfig create mode 100644 boards/arm/nrf54l/nrf54l15-tag/configs/sdc/defconfig create mode 100644 boards/arm/nrf54l/nrf54l15-tag/configs/sensors/defconfig create mode 100644 boards/arm/nrf54l/nrf54l15-tag/include/board.h create mode 100644 boards/arm/nrf54l/nrf54l15-tag/scripts/Make.defs create mode 100644 boards/arm/nrf54l/nrf54l15-tag/scripts/rram.ld create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/CMakeLists.txt create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/Make.defs create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/Makefile create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l15-tag.h create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_bringup.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_buttons.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_sensors.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c create mode 100644 boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_userleds.c diff --git a/Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/index.rst b/Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/index.rst new file mode 100644 index 00000000000..27652d1ea75 --- /dev/null +++ b/Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/index.rst @@ -0,0 +1,112 @@ +=================== +Nordic nRF54L15 Tag +=================== + +.. tags:: chip:nrf54l, chip:nrf54l15 + +.. figure:: nrf54l15-tag-front.jpg + :align: center + :alt: nRF54L15-TAG Front + + nRF54L15-TAG Front + +The nRF54L15-TAG is a board based on the nRF54L15 from Nordic. + +Serial Console +============== + +The console uses RTT channel 0. Connect an external J-Link probe to the +P1 SWD header and use a bidirectional RTT terminal. + +LEDs +==== + +The board has an RGB LED: + +===== ===== +Color MCU +===== ===== +Red P2.08 +Green P2.10 +Blue P2.09 +===== ===== + +A low output illuminates the LED. + +Button +====== + +BTN1 is connected to P0.00 and is active low. + +Onboard sensors +=============== + +The board provides the following sensors: + +======== ===================================== ======================= +Device Measurements Interface +======== ===================================== ======================= +BMI270 Acceleration and angular velocity SPI2 (SPIM22) +BME688 Temperature, pressure, humidity, gas I2C1 (TWIM21), 0x76 +ADXL367 Acceleration and die temperature I2C1 (TWIM21), 0x1d +======== ===================================== ======================= + +SPI2 uses P1.08 (SCK), P1.06 (MOSI), P1.05 (MISO), and P1.07 +(BMI270 chip select). I2C1 uses P1.11 (SCL) and P1.12 (SDA). + +The SAADC measures the supply voltage through its internal VDD input. +With 12-bit resolution and a 3.6 V full scale, the voltage is +``sample * 3.6 / 4096`` volts. + +Configurations +============== + +Select a configuration with:: + + tools/configure.sh nrf54l15-tag: + +nsh +--- + +Basic NuttShell configuration with the console over RTT. + +sensors +------- + +NSH over RTT with the three onboard sensors, supply-voltage ADC, BTN1, +user LEDs, and TIMER20. The configuration includes ``sensortest``, ``i2c``, +``adc``, ``buttons``, ``leds``, and ``timer``. For example:: + + sensortest -n 10 accel0 + sensortest -n 10 gyro0 + sensortest -n 10 accel1 + sensortest -n 5 baro0 + sensortest -n 5 humi0 + adc + buttons + timer + +``accel0`` and ``gyro0`` are the BMI270; ``accel1`` is the ADXL367. +The BME688 barometer samples also include temperature. The ADC is registered +at ``/dev/adc0``, BTN1 at ``/dev/buttons``, and TIMER20 at ``/dev/timer0``. + +sdc +--- + +NSH over RTT with the native Bluetooth host, SoftDevice Controller, GRTC +tickless scheduling and the ``bt`` utility. Set ``CONFIG_NRF54L_SDC_PUB_ADDR`` +to the board's assigned public address. The host advertises its GAP service +at startup. To scan:: + + bt bnep0 scan start -d + bt bnep0 scan get + bt bnep0 scan stop + +Flash & Debug +============= + +An external SWD probe is required. Program the generated ``nuttx.hex`` +with a tool supporting nRF54L15, for example:: + + nrfutil device program --firmware nuttx.hex --serial-number PROBE_SERIAL + nrfutil device reset --serial-number PROBE_SERIAL diff --git a/Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/nrf54l15-tag-front.jpg b/Documentation/platforms/arm/nrf54l/boards/nrf54l15-tag/nrf54l15-tag-front.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1ab82c922079d7ef7148507fade7fb840673c254 GIT binary patch literal 84642 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 S-#o29YfJ}9)~vOCRR7svh4nZ9 literal 0 HcmV?d00001 diff --git a/boards/Kconfig b/boards/Kconfig index 2e651a8056c..48038f28f05 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -1567,6 +1567,15 @@ config ARCH_BOARD_THINGY53 ---help--- This option selects the Thingy:53 multi-protocol IoT prototyping platform +config ARCH_BOARD_NRF54L15_TAG + bool "Nordic nRF54L15 Tag" + depends on ARCH_CHIP_NRF54L15 + select ARCH_HAVE_LEDS + select ARCH_HAVE_BUTTONS + select ARCH_HAVE_IRQBUTTONS + ---help--- + This option selects the nRF54L15 Tag + config ARCH_BOARD_NRF54LM20_DK bool "Nordic nRF54LM20 Development Kit" depends on ARCH_CHIP_NRF54LM20A || ARCH_CHIP_NRF54LM20B @@ -4141,6 +4150,7 @@ config ARCH_BOARD default "nrf5340-dk" if ARCH_BOARD_NRF5340_DK default "nrf5340-audio-dk" if ARCH_BOARD_NRF5340_AUDIO_DK default "thingy53" if ARCH_BOARD_THINGY53 + default "nrf54l15-tag" if ARCH_BOARD_NRF54L15_TAG default "nrf54lm20-dk" if ARCH_BOARD_NRF54LM20_DK default "nrf9160-dk" if ARCH_BOARD_NRF9160_DK default "thingy91" if ARCH_BOARD_THINGY91 diff --git a/boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt b/boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt new file mode 100644 index 00000000000..410d7e5661e --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt @@ -0,0 +1,23 @@ +# ############################################################################## +# boards/arm/nrf54l/nrf54l15-tag/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) diff --git a/boards/arm/nrf54l/nrf54l15-tag/Kconfig b/boards/arm/nrf54l/nrf54l15-tag/Kconfig new file mode 100644 index 00000000000..1b82cd0f69c --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/Kconfig @@ -0,0 +1,8 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_NRF54L15_TAG + +endif # ARCH_BOARD_NRF54L15_TAG diff --git a/boards/arm/nrf54l/nrf54l15-tag/configs/nsh/defconfig b/boards/arm/nrf54l/nrf54l15-tag/configs/nsh/defconfig new file mode 100644 index 00000000000..f142f8f44ee --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/configs/nsh/defconfig @@ -0,0 +1,28 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="nrf54l15-tag" +CONFIG_ARCH_BOARD_NRF54L15_TAG=y +CONFIG_ARCH_CHIP="nrf54l" +CONFIG_ARCH_CHIP_NRF54L15=y +CONFIG_ARCH_CHIP_NRF54L=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARD_LOOPSPERMSEC=10000 +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INTELHEX_BINARY=y +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=262144 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_SEGGER_RTT_BUFFER_SIZE_DOWN=256 +CONFIG_SERIAL_RTT0=y +CONFIG_START_YEAR=2026 +CONFIG_SYSLOG_RTT=y +CONFIG_SYSTEM_NSH=y diff --git a/boards/arm/nrf54l/nrf54l15-tag/configs/sdc/defconfig b/boards/arm/nrf54l/nrf54l15-tag/configs/sdc/defconfig new file mode 100644 index 00000000000..aac9931915d --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/configs/sdc/defconfig @@ -0,0 +1,62 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ALLOW_BSDNORDIC_COMPONENTS=y +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="nrf54l15-tag" +CONFIG_ARCH_BOARD_NRF54L15_TAG=y +CONFIG_ARCH_CHIP="nrf54l" +CONFIG_ARCH_CHIP_NRF54L15=y +CONFIG_ARCH_CHIP_NRF54L=y +CONFIG_ARCH_INTERRUPTSTACK=4096 +CONFIG_ARCH_STACKDUMP=y +CONFIG_BLUETOOTH_MAX_CONN=2 +CONFIG_BLUETOOTH_TXCMD_PRIORITY=180 +CONFIG_BLUETOOTH_TXCONN_PRIORITY=180 +CONFIG_BOARD_LOOPSPERMSEC=10000 +CONFIG_BTSAK=y +CONFIG_BTSAK_STACKSIZE=4096 +CONFIG_BUILTIN=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_HARDFAULT_ALERT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DEBUG_WIRELESS=y +CONFIG_DEBUG_WIRELESS_ERROR=y +CONFIG_DEBUG_WIRELESS_WARN=y +CONFIG_FS_PROCFS=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=4096 +CONFIG_INTELHEX_BINARY=y +CONFIG_NET=y +CONFIG_NETDEV_LATEINIT=y +CONFIG_NET_BLUETOOTH=y +CONFIG_NRF54L_LFCLK_SYNTH=y +CONFIG_NRF54L_SDC_PUB_ADDR=0x010203040507 +CONFIG_NRF54L_SOFTDEVICE_CONTROLLER=y +CONFIG_NRF54L_SYSTIMER_GRTC=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFCONFIG=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_DISABLE_VCONFIG=y +CONFIG_NSH_READLINE=y +CONFIG_PREALLOC_MQ_MSGS=32 +CONFIG_RAM_SIZE=262144 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_SCHED_LPWORKPRIORITY=180 +CONFIG_SCHED_LPWORKSTACKSIZE=4096 +CONFIG_SCHED_WAITPID=y +CONFIG_SEGGER_RTT_BUFFER_SIZE_DOWN=256 +CONFIG_SERIAL_RTT0=y +CONFIG_STACK_COLORATION=y +CONFIG_START_YEAR=2026 +CONFIG_SYSLOG_RTT=y +CONFIG_SYSTEM_NSH=y +CONFIG_USEC_PER_TICK=10000 +CONFIG_WIRELESS=y +CONFIG_WIRELESS_BLUETOOTH=y diff --git a/boards/arm/nrf54l/nrf54l15-tag/configs/sensors/defconfig b/boards/arm/nrf54l/nrf54l15-tag/configs/sensors/defconfig new file mode 100644 index 00000000000..c27b11b53fd --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/configs/sensors/defconfig @@ -0,0 +1,65 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_ARCH_LEDS is not set +CONFIG_ADC=y +CONFIG_ANALOG=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="nrf54l15-tag" +CONFIG_ARCH_BOARD_NRF54L15_TAG=y +CONFIG_ARCH_BUTTONS=y +CONFIG_ARCH_CHIP="nrf54l" +CONFIG_ARCH_CHIP_NRF54L15=y +CONFIG_ARCH_CHIP_NRF54L=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_IRQBUTTONS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BME688_I2C_FREQUENCY=100000 +CONFIG_BOARD_LOOPSPERMSEC=10000 +CONFIG_BUILTIN=y +CONFIG_DEBUG_FEATURES=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_EXAMPLES_ADC=y +CONFIG_EXAMPLES_ADC_GROUPSIZE=1 +CONFIG_EXAMPLES_ADC_NSAMPLES=5 +CONFIG_EXAMPLES_ADC_SWTRIG=y +CONFIG_EXAMPLES_BUTTONS=y +CONFIG_EXAMPLES_LEDS=y +CONFIG_EXAMPLES_TIMER=y +CONFIG_FS_PROCFS=y +CONFIG_I2CTOOL_DEFFREQ=100000 +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INPUT=y +CONFIG_INPUT_BUTTONS=y +CONFIG_INPUT_BUTTONS_LOWER=y +CONFIG_INTELHEX_BINARY=y +CONFIG_NRF54L_GPIOTE=y +CONFIG_NRF54L_I2C1_MASTER=y +CONFIG_NRF54L_SAADC=y +CONFIG_NRF54L_SAADC_CHANNELS=1 +CONFIG_NRF54L_SAADC_RESOLUTION=2 +CONFIG_NRF54L_SPI2_MASTER=y +CONFIG_NRF54L_TIMER0=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=262144 +CONFIG_RAM_START=0x20000000 +CONFIG_RAW_BINARY=y +CONFIG_SEGGER_RTT_BUFFER_SIZE_DOWN=256 +CONFIG_SENSORS=y +CONFIG_SENSORS_ADXL367=y +CONFIG_SENSORS_BME688=y +CONFIG_SENSORS_BMI270=y +CONFIG_SENSORS_BMI270_UORB=y +CONFIG_SERIAL_RTT0=y +CONFIG_START_YEAR=2026 +CONFIG_SYSLOG_RTT=y +CONFIG_SYSTEM_I2CTOOL=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_SENSORTEST=y +CONFIG_USERLED=y +CONFIG_USERLED_LOWER=y diff --git a/boards/arm/nrf54l/nrf54l15-tag/include/board.h b/boards/arm/nrf54l/nrf54l15-tag/include/board.h new file mode 100644 index 00000000000..a0d3c27093f --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/include/board.h @@ -0,0 +1,82 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/include/board.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_NRF54L_NRF54L15_TAG_INCLUDE_BOARD_H +#define __BOARDS_ARM_NRF54L_NRF54L15_TAG_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +#define BOARD_SYSTICK_CLOCK 128000000 +#define BOARD_HFXO_CAPACITANCE 15000 + +/* LED definitions **********************************************************/ + +#define BOARD_LED1 0 +#define BOARD_LED2 1 +#define BOARD_LED3 2 +#define BOARD_NLEDS 3 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) +#define BOARD_LED2_BIT (1 << BOARD_LED2) +#define BOARD_LED3_BIT (1 << BOARD_LED3) + +/* LED indications when CONFIG_ARCH_LEDS is selected */ + +#define LED_STARTED 0 /* OFF */ +#define LED_HEAPALLOCATE 0 /* OFF */ +#define LED_IRQSENABLED 0 /* OFF */ +#define LED_STACKCREATED 1 /* ON */ +#define LED_INIRQ 2 /* No change */ +#define LED_SIGNAL 2 /* No change */ +#define LED_ASSERTION 2 /* No change */ +#define LED_PANIC 3 /* Flashing */ + +/* Buttons ******************************************************************/ + +#define BUTTON_BTN1 0 +#define NUM_BUTTONS 1 +#define BUTTON_BTN1_BIT (1 << BUTTON_BTN1) + +/* SPI22: BMI270 ************************************************************/ + +#define BOARD_SPI2_SCK_PIN (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT1 | GPIO_PIN(8)) +#define BOARD_SPI2_MOSI_PIN (GPIO_OUTPUT | GPIO_PORT1 | GPIO_PIN(6)) +#define BOARD_SPI2_MISO_PIN (GPIO_INPUT | GPIO_PORT1 | GPIO_PIN(5)) + +/* TWIM21: BME688 and ADXL367 ***********************************************/ + +#define BOARD_I2C1_SCL_PIN (GPIO_OUTPUT | GPIO_PORT1 | GPIO_PIN(11)) +#define BOARD_I2C1_SDA_PIN (GPIO_INPUT | GPIO_PORT1 | GPIO_PIN(12)) + +#endif /* __BOARDS_ARM_NRF54L_NRF54L15_TAG_INCLUDE_BOARD_H */ diff --git a/boards/arm/nrf54l/nrf54l15-tag/scripts/Make.defs b/boards/arm/nrf54l/nrf54l15-tag/scripts/Make.defs new file mode 100644 index 00000000000..e1a9cfb8919 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/scripts/Make.defs @@ -0,0 +1,36 @@ +############################################################################ +# boards/arm/nrf54l/nrf54l15-tag/scripts/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/arch/arm/src/armv8-m/Toolchain.defs + +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)rram.ld + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/nrf54l/nrf54l15-tag/scripts/rram.ld b/boards/arm/nrf54l/nrf54l15-tag/scripts/rram.ld new file mode 100644 index 00000000000..a22b426e1c7 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/scripts/rram.ld @@ -0,0 +1,111 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/scripts/rram.ld + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#include + +MEMORY +{ + progmem (rx) : ORIGIN = 0x00000000, LENGTH = 0x17d000 + datamem (rwx) : ORIGIN = 0x20000000, LENGTH = 256K +} + +OUTPUT_ARCH(arm) +ENTRY(__start) /* Treat __start as the anchor for dead code stripping */ +EXTERN(_vectors) /* Force the vectors to be included in the output */ +SECTIONS +{ + .text : + { + _stext = ABSOLUTE(.); + *(.vectors) + *(.text .text.*) + *(.fixup) + *(.gnu.warning) + *(.rodata .rodata.*) + *(.gnu.linkonce.t.*) + *(.glue_7) + *(.glue_7t) + *(.got) + *(.gcc_except_table) + *(.gnu.linkonce.r.*) + _etext = ABSOLUTE(.); + } > progmem + + .init_section : + { + _sinit = ABSOLUTE(.); + KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP(*(.init_array EXCLUDE_FILE(*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o) .ctors)) + _einit = ABSOLUTE(.); + } > progmem + + .ARM.extab : + { + *(.ARM.extab*) + } > progmem + + __exidx_start = ABSOLUTE(.); + .ARM.exidx : + { + *(.ARM.exidx*) + } > progmem + __exidx_end = ABSOLUTE(.); + + _eronly = ABSOLUTE(.); + + .data : + { + _sdata = ABSOLUTE(.); + *(.data .data.*) + *(.gnu.linkonce.d.*) + CONSTRUCTORS + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > datamem AT > progmem + + /* BSS */ + + .bss : + { + _sbss = ABSOLUTE(.); + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + _ebss = ABSOLUTE(.); + } > datamem + + /* Stabs debugging sections. */ + + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_info 0 : { *(.debug_info) } + .debug_line 0 : { *(.debug_line) } + .debug_pubnames 0 : { *(.debug_pubnames) } + .debug_aranges 0 : { *(.debug_aranges) } +} diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/CMakeLists.txt b/boards/arm/nrf54l/nrf54l15-tag/src/CMakeLists.txt new file mode 100644 index 00000000000..5f7e0bcd2e5 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/CMakeLists.txt @@ -0,0 +1,45 @@ +# ############################################################################## +# boards/arm/nrf54l/nrf54l15-tag/src/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS nrf54l_boot.c nrf54l_bringup.c) +if(CONFIG_NRF54L_SPI2_MASTER) + list(APPEND SRCS nrf54l_spi.c) +endif() +if(CONFIG_SYSTEM_I2CTOOL) + list(APPEND SRCS nrf54l_i2c.c) +endif() +if(CONFIG_SENSORS) + list(APPEND SRCS nrf54l_sensors.c) +endif() +if(CONFIG_ARCH_BUTTONS) + list(APPEND SRCS nrf54l_buttons.c) +endif() +if(CONFIG_NRF54L_SAADC) + list(APPEND SRCS nrf54l_adc.c) +endif() +if(CONFIG_ARCH_LEDS) + list(APPEND SRCS nrf54l_autoleds.c) +else() + list(APPEND SRCS nrf54l_userleds.c) +endif() +target_sources(board PRIVATE ${SRCS}) +set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/rram.ld") diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/Make.defs b/boards/arm/nrf54l/nrf54l15-tag/src/Make.defs new file mode 100644 index 00000000000..018593cb472 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/Make.defs @@ -0,0 +1,51 @@ +############################################################################ +# boards/arm/nrf54l/nrf54l15-tag/src/Make.defs +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = nrf54l_boot.c nrf54l_bringup.c + +ifeq ($(CONFIG_NRF54L_SPI2_MASTER),y) +CSRCS += nrf54l_spi.c +endif + +ifeq ($(CONFIG_SYSTEM_I2CTOOL),y) +CSRCS += nrf54l_i2c.c +endif + +ifeq ($(CONFIG_SENSORS),y) +CSRCS += nrf54l_sensors.c +endif + +ifeq ($(CONFIG_ARCH_BUTTONS),y) +CSRCS += nrf54l_buttons.c +endif + +ifeq ($(CONFIG_NRF54L_SAADC),y) +CSRCS += nrf54l_adc.c +endif + +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += nrf54l_autoleds.c +else +CSRCS += nrf54l_userleds.c +endif diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/Makefile b/boards/arm/nrf54l/nrf54l15-tag/src/Makefile new file mode 100644 index 00000000000..18f237a458c --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/Makefile @@ -0,0 +1,24 @@ +############################################################################ +# boards/arm/nrf54l/nrf54l15-tag/src/Makefile +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include Make.defs +include $(TOPDIR)/boards/Board.mk diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l15-tag.h b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l15-tag.h new file mode 100644 index 00000000000..baa0884351d --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l15-tag.h @@ -0,0 +1,103 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l15-tag.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_NRF54L_NRF54L15_TAG_SRC_NRF54L15_TAG_H +#define __BOARDS_ARM_NRF54L_NRF54L15_TAG_SRC_NRF54L15_TAG_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include "nrf54l_gpio.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Configuration ************************************************************/ + +/* procfs File System */ + +#ifdef CONFIG_FS_PROCFS +# ifdef CONFIG_NSH_PROC_MOUNTPOINT +# define NRF54L_PROCFS_MOUNTPOINT CONFIG_NSH_PROC_MOUNTPOINT +# else +# define NRF54L_PROCFS_MOUNTPOINT "/proc" +# endif +#endif + +/* LED definitions **********************************************************/ + +/* Definitions to configure LED GPIO as outputs */ + +#define GPIO_LED1 (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN(8)) +#define GPIO_LED2 (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN(10)) +#define GPIO_LED3 (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT2 | GPIO_PIN(9)) + +/* Antenna switch ***********************************************************/ + +#define GPIO_ANT1 (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT1 | GPIO_PIN(9)) +#define GPIO_ANT2 (GPIO_OUTPUT | GPIO_PORT1 | GPIO_PIN(10)) + +/* Button and sensors *******************************************************/ + +#define GPIO_BUTTON1 (GPIO_INPUT | GPIO_PULLUP | GPIO_PORT0 | GPIO_PIN(0)) +#define GPIO_BMI270_CS (GPIO_OUTPUT | GPIO_VALUE_ONE | GPIO_PORT1 | GPIO_PIN(7)) + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_bringup + * + * Description: + * Perform board-specific initialization. Called from + * board_late_initialize() when CONFIG_BOARD_LATE_INITIALIZE is selected. + * + ****************************************************************************/ + +int nrf54l_bringup(void); + +#ifdef CONFIG_NRF54L_SPI2_MASTER +void nrf54l_spidev_initialize(void); +#endif + +#ifdef CONFIG_SYSTEM_I2CTOOL +int nrf54l_i2ctool(void); +#endif + +#ifdef CONFIG_SENSORS +int nrf54l_sensors_init(void); +#endif + +#ifdef CONFIG_NRF54L_SAADC +int nrf54l_adc_setup(void); +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_NRF54L_NRF54L15_TAG_SRC_NRF54L15_TAG_H */ diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c new file mode 100644 index 00000000000..05c4f2eb003 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c @@ -0,0 +1,93 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_adc.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include "nrf54l_adc.h" +#include "nrf54l15-tag.h" + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Internal VDD input, 0.9 V reference and gain 1/4: 3.6 V full scale. */ + +static const struct nrf54l_adc_channel_s g_adc_chanlist[] = +{ + { + .p_psel = NRF54L_ADC_IN_VDD, + .n_psel = 0, + .gain = NRF54L_ADC_GAIN_1_4, + .refsel = NRF54L_ADC_REFSEL_INTERNAL, + .tacq = NRF54L_ADC_TACQ_40US, + .mode = NRF54L_ADC_MODE_SE, + .burst = NRF54L_ADC_BURST_DISABLE, + } +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_adc_setup + * + * Description: + * Register the supply voltage ADC channel. + * + ****************************************************************************/ + +int nrf54l_adc_setup(void) +{ + static bool initialized; + struct adc_dev_s *adc; + int ret; + + if (initialized) + { + return OK; + } + + adc = nrf54l_adcinitialize(g_adc_chanlist, 1); + if (adc == NULL) + { + return -ENODEV; + } + + ret = adc_register("/dev/adc0", adc); + if (ret < 0) + { + aerr("ERROR: adc_register failed: %d\n", ret); + return ret; + } + + initialized = true; + return OK; +} diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c new file mode 100644 index 00000000000..06842832426 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c @@ -0,0 +1,104 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_autoleds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "nrf54l15-tag.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const nrf54l_pinset_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED1, + GPIO_LED2, + GPIO_LED3, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_autoled_initialize + * + * Description: + * Configure the GPIO pins used for operating system LED indications. + * + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + unsigned int i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + nrf54l_gpio_config(g_ledcfg[i]); + } +} + +/**************************************************************************** + * Name: board_autoled_on + * + * Description: + * Set the LED indication for the requested operating system event. + * + ****************************************************************************/ + +void board_autoled_on(int led) +{ + if (led == LED_STACKCREATED || led == LED_PANIC) + { + nrf54l_gpio_write(g_ledcfg[BOARD_LED1], false); + } +} + +/**************************************************************************** + * Name: board_autoled_off + * + * Description: + * Clear the LED indication for the requested operating system event. + * + ****************************************************************************/ + +void board_autoled_off(int led) +{ + if (led == LED_PANIC) + { + nrf54l_gpio_write(g_ledcfg[BOARD_LED1], true); + } +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c new file mode 100644 index 00000000000..3df65f93637 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_boot.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#include "nrf54l_start.h" +#include "nrf54l15-tag.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_board_initialize + * + * Description: + * Initialize board hardware before starting the operating system. + * + ****************************************************************************/ + +void nrf54l_board_initialize(void) +{ +#ifdef CONFIG_NRF54L_SPI2_MASTER + nrf54l_spidev_initialize(); +#endif + +#ifdef CONFIG_ARCH_LEDS + board_autoled_initialize(); +#endif +} + +#ifdef CONFIG_BOARD_LATE_INITIALIZE +/**************************************************************************** + * Name: board_late_initialize + * + * Description: + * Initialize board devices after the operating system is available. + * + ****************************************************************************/ + +void board_late_initialize(void) +{ + nrf54l_bringup(); +} +#endif diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_bringup.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_bringup.c new file mode 100644 index 00000000000..a038c37a48a --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_bringup.c @@ -0,0 +1,147 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_bringup.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include + +#ifdef CONFIG_INPUT_BUTTONS_LOWER +# include +#endif + +#ifdef CONFIG_USERLED_LOWER +# include +#endif + +#ifdef CONFIG_TIMER +# include "nrf54l_tim_lowerhalf.h" +#endif + +#include "nrf54l15-tag.h" + +#ifdef CONFIG_NRF54L_SOFTDEVICE_CONTROLLER +# include "nrf54l_sdc.h" +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_bringup + * + * Description: + * Mount optional file systems and register enabled board devices. + * + ****************************************************************************/ + +int nrf54l_bringup(void) +{ + int ret; + +#ifdef CONFIG_FS_PROCFS + /* Mount the procfs file system */ + + ret = nx_mount(NULL, NRF54L_PROCFS_MOUNTPOINT, "procfs", 0, NULL); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: procfs mount failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_USERLED_LOWER + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: LED registration failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_INPUT_BUTTONS_LOWER + ret = btn_lower_initialize("/dev/buttons"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Button registration failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_SYSTEM_I2CTOOL + ret = nrf54l_i2ctool(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: I2C registration failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_NRF54L_SAADC + ret = nrf54l_adc_setup(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: ADC registration failed: %d\n", ret); + } +#endif + +#if defined(CONFIG_TIMER) && defined(CONFIG_NRF54L_TIMER0) + /* Configure TIMER driver */ + + ret = nrf54l_timer_initialize("/dev/timer0", 0); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to initialize timer driver: %d\n", ret); + } +#endif + +#ifdef CONFIG_SENSORS + ret = nrf54l_sensors_init(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Sensor registration failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_NRF54L_SOFTDEVICE_CONTROLLER + /* Select antenna 1 on the SKY13348 RF switch */ + + nrf54l_gpio_config(GPIO_ANT2); + nrf54l_gpio_config(GPIO_ANT1); + + /* Register the Bluetooth controller */ + + ret = nrf54l_sdc_initialize(); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: SDC initialization failed: %d\n", ret); + return ret; + } +#endif + + UNUSED(ret); + return OK; +} diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_buttons.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_buttons.c new file mode 100644 index 00000000000..2f43334002b --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_buttons.c @@ -0,0 +1,157 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_buttons.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include "nrf54l_gpio.h" +#include "nrf54l_gpiote.h" + +#include "nrf54l15-tag.h" + +#ifdef CONFIG_ARCH_BUTTONS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* Pin configuration for each button. This array is indexed by + * the BUTTON_* definitions in board.h + */ + +static const uint32_t g_buttons[NUM_BUTTONS] = +{ + GPIO_BUTTON1, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_button_initialize + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + ****************************************************************************/ + +uint32_t board_button_initialize(void) +{ + int i; + + /* Configure the GPIO pins as inputs. */ + + for (i = 0; i < NUM_BUTTONS; i++) + { + nrf54l_gpio_config(g_buttons[i]); + } + + return NUM_BUTTONS; +} + +/**************************************************************************** + * Name: board_buttons + ****************************************************************************/ + +uint32_t board_buttons(void) +{ + uint32_t ret = 0; + int i; + + /* Check that state of each key */ + + for (i = 0; i < NUM_BUTTONS; i++) + { + /* A LOW value means that the key is pressed. */ + + bool released = nrf54l_gpio_read(g_buttons[i]); + + /* Accumulate the set of depressed (not released) keys */ + + if (!released) + { + ret |= (1 << i); + } + } + + return ret; +} + +/**************************************************************************** + * Button support. + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + * After board_button_initialize() has been called, board_buttons() may be + * called to collect the state of all buttons. board_buttons() returns an + * 32-bit bit set with each bit associated with a button. See the + * BUTTON_*_BIT definitions in board.h for the meaning of each bit. + * + * board_button_irq() may be called to register an interrupt handler that + * will be called when a button is depressed or released. The ID value is + * a button enumeration value that uniquely identifies a button resource. + * See the BUTTON_* definitions in board.h for the meaning of enumeration + * value. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQBUTTONS +int board_button_irq(int id, xcpt_t irqhandler, void *arg) +{ + int ret = OK; + + if (id < 0 || id >= NUM_BUTTONS) + { + return -EINVAL; + } + + ret = nrf54l_gpiote_set_event(g_buttons[id], true, true, irqhandler, arg); + if (ret < 0) + { + ierr("ERROR: nrf54l_gpiote_set_event\n"); + return ret; + } + + return OK; +} +#endif + +#endif /* CONFIG_ARCH_BUTTONS */ diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c new file mode 100644 index 00000000000..2243f02e765 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c @@ -0,0 +1,98 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_i2c.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#ifdef CONFIG_I2C +# include "nrf54l_i2c.h" +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_i2c_register + * + * Description: + * Register one I2C drivers for the I2C tool. + * + ****************************************************************************/ + +#ifdef CONFIG_SYSTEM_I2CTOOL +int nrf54l_i2c_register(int bus) +{ + struct i2c_master_s *i2c; + int ret = OK; + + i2c = nrf54l_i2cbus_initialize(bus); + if (i2c == NULL) + { + syslog(LOG_ERR, "ERROR: Failed to get I2C%d interface\n", bus); + ret = -ENODEV; + } + else + { + ret = i2c_register(i2c, bus); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: Failed to register I2C%d driver: %d\n", + bus, ret); + nrf54l_i2cbus_uninitialize(i2c); + } + } + + return ret; +} +#endif + +/**************************************************************************** + * Name: nrf54l_i2ctool + * + * Description: + * Register I2C drivers for the I2C tool. + * + ****************************************************************************/ + +#ifdef CONFIG_SYSTEM_I2CTOOL +int nrf54l_i2ctool(void) +{ + int ret = OK; + +#ifdef CONFIG_NRF54L_I2C1_MASTER + ret = nrf54l_i2c_register(1); + if (ret != OK) + { + return ret; + } +#endif + + return ret; +} +#endif diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_sensors.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_sensors.c new file mode 100644 index 00000000000..7458f478cf4 --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_sensors.c @@ -0,0 +1,156 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_sensors.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#ifdef CONFIG_SENSORS_BMI270 +# include +# include "nrf54l_spi.h" +#endif +#ifdef CONFIG_SENSORS_BME688 +# include +#endif +#ifdef CONFIG_SENSORS_ADXL367 +# include +#endif + +#include "nrf54l_i2c.h" +#include "nrf54l15-tag.h" + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +#ifdef CONFIG_SENSORS_BME688 +/**************************************************************************** + * Name: nrf54l_bme688_init + ****************************************************************************/ + +static int nrf54l_bme688_init(struct i2c_master_s *i2c) +{ + struct bme688_config_s config = + { + 0 + }; + + config.temp_os = BME688_OS_2X; +#ifndef CONFIG_BME688_DISABLE_PRESS_MEAS + config.press_os = BME688_OS_16X; +#endif +#ifndef CONFIG_BME688_DISABLE_HUM_MEAS + config.hum_os = BME688_OS_1X; +#endif +#ifdef CONFIG_BME688_ENABLE_IIR_FILTER + config.filter_coef = BME688_FILTER_COEF3; +#endif +#ifndef CONFIG_BME688_DISABLE_GAS_MEAS + config.target_temp = 300; + config.heater_duration = 100; + config.nb_conv = 0; + config.amb_temp = 30; +#endif + + return bme688_register(0, i2c, &config); +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_sensors_init + * + * Description: + * Initialize and register the onboard sensors. + * + ****************************************************************************/ + +int nrf54l_sensors_init(void) +{ +#ifdef CONFIG_SENSORS_BMI270 + struct spi_dev_s *spi; +#endif +#if defined(CONFIG_SENSORS_BME688) || defined(CONFIG_SENSORS_ADXL367) + struct i2c_master_s *i2c; +#endif + int ret = OK; + int result = OK; + +#ifdef CONFIG_SENSORS_BMI270 + spi = nrf54l_spibus_initialize(2); + if (spi == NULL) + { + ret = -ENODEV; + } + else + { +#ifdef CONFIG_SENSORS_BMI270_UORB + ret = bmi270_register_uorb(0, spi); +#else + ret = bmi270_register("/dev/bmi270", spi); +#endif + } + + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: BMI270 registration failed: %d\n", ret); + result = ret; + } +#endif + +#if defined(CONFIG_SENSORS_BME688) || defined(CONFIG_SENSORS_ADXL367) + i2c = nrf54l_i2cbus_initialize(1); + if (i2c == NULL) + { + return -ENODEV; + } + +#ifdef CONFIG_SENSORS_BME688 + ret = nrf54l_bme688_init(i2c); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: BME688 registration failed: %d\n", ret); + result = ret; + } +#endif + +#ifdef CONFIG_SENSORS_ADXL367 + ret = adxl367_register(1, i2c, 0x1d); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: ADXL367 registration failed: %d\n", ret); + result = ret; + } +#endif +#endif + + UNUSED(ret); + return result; +} diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c new file mode 100644 index 00000000000..7b3eb9fff6c --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c @@ -0,0 +1,82 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_spi.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include "nrf54l_gpio.h" +#include "nrf54l_spi.h" +#include "nrf54l15-tag.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: nrf54l_spidev_initialize + * + * Description: + * Configure the BMI270 chip select. + * + ****************************************************************************/ + +void nrf54l_spidev_initialize(void) +{ + nrf54l_gpio_config(GPIO_BMI270_CS); +} + +/**************************************************************************** + * Name: nrf54l_spi2select + ****************************************************************************/ + +void nrf54l_spi2select(struct spi_dev_s *dev, uint32_t devid, bool selected) +{ + spiinfo("devid: %08lx CS: %s\n", + (unsigned long)devid, selected ? "assert" : "de-assert"); + + switch (devid) + { + case SPIDEV_IMU(0): + nrf54l_gpio_write(GPIO_BMI270_CS, !selected); + break; + + default: + break; + } +} + +/**************************************************************************** + * Name: nrf54l_spi2status + ****************************************************************************/ + +uint8_t nrf54l_spi2status(struct spi_dev_s *dev, uint32_t devid) +{ + return devid == SPIDEV_IMU(0) ? SPI_STATUS_PRESENT : 0; +} diff --git a/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_userleds.c b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_userleds.c new file mode 100644 index 00000000000..fc1412acd1a --- /dev/null +++ b/boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_userleds.c @@ -0,0 +1,115 @@ +/**************************************************************************** + * boards/arm/nrf54l/nrf54l15-tag/src/nrf54l_userleds.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include + +#include "nrf54l15-tag.h" + +#ifndef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define LED_ON 0 +#define LED_OFF 1 + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const nrf54l_pinset_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED1, + GPIO_LED2, + GPIO_LED3, +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + * + * Description: + * Configure the user LEDs and return the number of available LEDs. + * + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + unsigned int i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + nrf54l_gpio_config(g_ledcfg[i]); + } + + return BOARD_NLEDS; +} + +/**************************************************************************** + * Name: board_userled + * + * Description: + * Set the state of one user LED. + * + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + if ((unsigned int)led < BOARD_NLEDS) + { + nrf54l_gpio_write(g_ledcfg[led], ledon ? LED_ON : LED_OFF); + } +} + +/**************************************************************************** + * Name: board_userled_all + * + * Description: + * Set all user LEDs from the supplied bit set. + * + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + unsigned int i; + + for (i = 0; i < BOARD_NLEDS; i++) + { + nrf54l_gpio_write(g_ledcfg[i], (ledset & (1 << i)) ? LED_ON : LED_OFF); + } +} + +#endif /* !CONFIG_ARCH_LEDS */