From 11ea4316f3e5a60f8d34fcad8deeb154803498a8 Mon Sep 17 00:00:00 2001
From: Kamil Kasperczyk <66371704+kkasperczyk-no@users.noreply.github.com>
Date: Mon, 19 Feb 2024 09:11:59 +0100
Subject: [PATCH] [nrfconnect] Added port for lit-icd-app example. (#32196)
Implemented nrfconnect port for the lit-icd-app example.
---
examples/lit-icd-app/nrfconnect/.gitignore | 1 +
.../lit-icd-app/nrfconnect/CMakeLists.txt | 66 +++
examples/lit-icd-app/nrfconnect/Kconfig | 41 ++
examples/lit-icd-app/nrfconnect/README.md | 401 ++++++++++++++
.../boards/nrf52840dk_nrf52840.overlay | 54 ++
.../boards/nrf5340dk_nrf5340_cpuapp.overlay | 45 ++
.../boards/nrf52840dk_nrf52840.overlay | 21 +
.../nrf52840dk_nrf52840_release.overlay | 21 +
.../boards/nrf5340dk_nrf5340_cpuapp.overlay | 20 +
.../nrf5340dk_nrf5340_cpuapp_release.overlay | 21 +
.../nrfconnect/child_image/mcuboot/prj.conf | 30 ++
.../child_image/mcuboot/prj_release.conf | 30 ++
.../child_image/multiprotocol_rpmsg/prj.conf | 25 +
.../multiprotocol_rpmsg/prj_no_dfu.conf | 25 +
.../multiprotocol_rpmsg/prj_release.conf | 25 +
.../nrf52840dk_nrf52840/pm_static_dfu.yml | 42 ++
.../pm_static_dfu.yml | 56 ++
.../lit-icd-app/nrfconnect/main/AppTask.cpp | 502 ++++++++++++++++++
.../nrfconnect/main/include/AppConfig.h | 33 ++
.../nrfconnect/main/include/AppEvent.h | 72 +++
.../nrfconnect/main/include/AppTask.h | 74 +++
.../main/include/CHIPProjectConfig.h | 28 +
examples/lit-icd-app/nrfconnect/main/main.cpp | 33 ++
examples/lit-icd-app/nrfconnect/prj.conf | 46 ++
.../lit-icd-app/nrfconnect/prj_no_dfu.conf | 48 ++
.../lit-icd-app/nrfconnect/prj_release.conf | 60 +++
.../nrfconnect/third_party/connectedhomeip | 1 +
27 files changed, 1821 insertions(+)
create mode 100644 examples/lit-icd-app/nrfconnect/.gitignore
create mode 100644 examples/lit-icd-app/nrfconnect/CMakeLists.txt
create mode 100644 examples/lit-icd-app/nrfconnect/Kconfig
create mode 100644 examples/lit-icd-app/nrfconnect/README.md
create mode 100644 examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf
create mode 100644 examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf
create mode 100644 examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
create mode 100644 examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml
create mode 100644 examples/lit-icd-app/nrfconnect/main/AppTask.cpp
create mode 100644 examples/lit-icd-app/nrfconnect/main/include/AppConfig.h
create mode 100644 examples/lit-icd-app/nrfconnect/main/include/AppEvent.h
create mode 100644 examples/lit-icd-app/nrfconnect/main/include/AppTask.h
create mode 100644 examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h
create mode 100644 examples/lit-icd-app/nrfconnect/main/main.cpp
create mode 100644 examples/lit-icd-app/nrfconnect/prj.conf
create mode 100644 examples/lit-icd-app/nrfconnect/prj_no_dfu.conf
create mode 100644 examples/lit-icd-app/nrfconnect/prj_release.conf
create mode 120000 examples/lit-icd-app/nrfconnect/third_party/connectedhomeip
diff --git a/examples/lit-icd-app/nrfconnect/.gitignore b/examples/lit-icd-app/nrfconnect/.gitignore
new file mode 100644
index 00000000000000..84c048a73cc2e5
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/examples/lit-icd-app/nrfconnect/CMakeLists.txt b/examples/lit-icd-app/nrfconnect/CMakeLists.txt
new file mode 100644
index 00000000000000..a9b921016670e7
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/CMakeLists.txt
@@ -0,0 +1,66 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+cmake_minimum_required(VERSION 3.13.1)
+
+get_filename_component(CHIP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/third_party/connectedhomeip REALPATH)
+get_filename_component(NRFCONNECT_COMMON ${CHIP_ROOT}/examples/platform/nrfconnect REALPATH)
+get_filename_component(GEN_DIR ${CHIP_ROOT}/zzz_generated/ REALPATH)
+
+include(${CHIP_ROOT}/config/nrfconnect/app/check-nrfconnect-version.cmake)
+
+# Set Kconfig root files that will be processed as a first Kconfig for used child images.
+set(mcuboot_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.mcuboot.root)
+set(multiprotocol_rpmsg_KCONFIG_ROOT ${CHIP_ROOT}/config/nrfconnect/chip-module/Kconfig.multiprotocol_rpmsg.root)
+
+if(NOT CONF_FILE STREQUAL "prj_no_dfu.conf")
+ set(PM_STATIC_YML_FILE ${CMAKE_CURRENT_SOURCE_DIR}/configuration/${BOARD}/pm_static_dfu.yml)
+endif()
+
+list(APPEND ZEPHYR_EXTRA_MODULES ${CHIP_ROOT}/config/nrfconnect/chip-module)
+find_package(Zephyr HINTS $ENV{ZEPHYR_BASE})
+
+# -Wmaybe-uninitialized has too many false positives, including on std::optional
+# and chip::Optional. Make it nonfatal.
+#
+# See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80635
+target_compile_options(app PRIVATE -Werror -Wno-error=maybe-uninitialized)
+
+project(chip-nrfconnect-lit-icd-app-example)
+
+include(${CHIP_ROOT}/config/nrfconnect/app/enable-gnu-std.cmake)
+include(${CHIP_ROOT}/config/nrfconnect/app/flashing.cmake)
+include(${CHIP_ROOT}/src/app/chip_data_model.cmake)
+
+target_include_directories(app PRIVATE
+ main/include
+ ${GEN_DIR}/app-common
+ ${GEN_DIR}/lit-icd-app
+ ${NRFCONNECT_COMMON}/util/include
+ ${NRFCONNECT_COMMON}/app/include)
+
+target_sources(app PRIVATE
+ main/AppTask.cpp
+ main/main.cpp
+ ${NRFCONNECT_COMMON}/util/LEDWidget.cpp)
+
+chip_configure_data_model(app
+ INCLUDE_SERVER
+ ZAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/../lit-icd-common/lit-icd-server-app.zap
+)
+
+if(CONFIG_CHIP_OTA_REQUESTOR)
+ target_sources(app PRIVATE ${NRFCONNECT_COMMON}/util/OTAUtil.cpp)
+endif()
diff --git a/examples/lit-icd-app/nrfconnect/Kconfig b/examples/lit-icd-app/nrfconnect/Kconfig
new file mode 100644
index 00000000000000..4d9501ac5cab90
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/Kconfig
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+mainmenu "Matter nRF Connect LIT ICD Example Application"
+
+config STATE_LEDS
+ bool "Use LEDs to indicate the device state"
+ default y
+ help
+ Use LEDs to render the current state of the device such as the progress of commissioning of
+ the device into a network or the factory reset initiation. Note that setting this option to
+ 'n' does not disable the LED indicating the state of the simulated bolt.
+
+# Sample configuration used for Thread networking
+if NET_L2_OPENTHREAD
+
+choice OPENTHREAD_NORDIC_LIBRARY_CONFIGURATION
+ default OPENTHREAD_NORDIC_LIBRARY_MTD
+endchoice
+
+choice OPENTHREAD_DEVICE_TYPE
+ default OPENTHREAD_MTD
+endchoice
+
+endif # NET_L2_OPENTHREAD
+
+rsource "../../../config/nrfconnect/chip-module/Kconfig.features"
+rsource "../../../config/nrfconnect/chip-module/Kconfig.defaults"
+source "Kconfig.zephyr"
diff --git a/examples/lit-icd-app/nrfconnect/README.md b/examples/lit-icd-app/nrfconnect/README.md
new file mode 100644
index 00000000000000..704950fdcac63e
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/README.md
@@ -0,0 +1,401 @@
+# Matter nRF Connect LIT ICD Example Application
+
+The nRF Connect LIT ICD Example allows to test the device that utilizes Long
+Idle Time feature from the Intermittently Connected Device Management cluster.
+It uses buttons to change the device states and LEDs to show the state of these
+changes. You can use this example as a reference for creating your own
+application.
+
+
+
+
+The example is based on
+[Matter](https://github.com/project-chip/connectedhomeip) and Nordic
+Semiconductor's nRF Connect SDK, and was created to facilitate testing and
+certification of a Matter device communicating over a low-power, 802.15.4 Thread
+network.
+
+The example behaves as a Matter accessory, that is a device that can be paired
+into an existing Matter network and can be controlled by this network.
+
+
+
+## Overview
+
+This example is running on the nRF Connect platform, which is based on Nordic
+Semiconductor's
+[nRF Connect SDK](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/index.html)
+and [Zephyr RTOS](https://zephyrproject.org/). Visit Matter's
+[nRF Connect platform overview](../../../docs/guides/nrfconnect_platform_overview.md)
+to read more about the platform structure and dependencies.
+
+By default, the Matter accessory device has IPv6 networking disabled. You must
+pair it with the Matter controller over Bluetooth® LE to get the configuration
+from the controller to use the device within a Thread network. You have to make
+the device discoverable manually (for security reasons). See
+[Bluetooth LE advertising](#bluetooth-le-advertising) to learn how to do this.
+The controller must get the commissioning information from the Matter accessory
+device and provision the device into the network.
+
+The sample uses buttons for changing the device states, and LEDs to show the
+state of these changes.
+
+### Bluetooth LE advertising
+
+In this example, to commission the device onto a Matter network, it must be
+discoverable over Bluetooth LE. For security reasons, you must start Bluetooth
+LE advertising manually after powering up the device by pressing **Button 4**.
+
+### Bluetooth LE rendezvous
+
+In this example, the commissioning procedure is done over Bluetooth LE between a
+Matter device and the Matter controller, where the controller has the
+commissioner role.
+
+To start the rendezvous, the controller must get the commissioning information
+from the Matter device. The data payload is encoded within a QR code, printed to
+the UART console, and shared using an NFC tag. The emulation of the NFC tag
+emulation starts automatically when Bluetooth LE advertising is started and
+stays enabled until Bluetooth LE advertising timeout expires.
+
+#### Thread provisioning
+
+The provisioning operation, which is the Last part of the rendezvous procedure,
+involves sending the Thread network credentials from the Matter controller to
+the Matter device. As a result, the device joins the Thread network and can
+communicate with other devices in the network.
+
+### Device Firmware Upgrade
+
+The example supports over-the-air (OTA) device firmware upgrade (DFU) using
+Matter OTA mechanism, which is enabled by default.
+
+The
+[MCUboot](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/mcuboot/index.html)
+bootloader solution is used to replace the old firmware image with the new one.
+
+#### Matter Over-the-Air Update
+
+The Matter over-the-air update distinguishes two types of nodes: OTA Provider
+and OTA Requestor.
+
+An OTA Provider is a node that hosts a new firmware image and is able to respond
+on an OTA Requestor's queries regarding availability of new firmware images or
+requests to start sending the update packages.
+
+An OTA Requestor is a node that wants to download a new firmware image and sends
+requests to an OTA Provider to start the update process.
+
+#### Bootloader
+
+MCUboot is a secure bootloader used for swapping firmware images of different
+versions and generating proper build output files that can be used in the device
+firmware upgrade process.
+
+The bootloader solution requires an area of flash memory to swap application
+images during the firmware upgrade. Nordic Semiconductor devices use an external
+memory chip for this purpose. The memory chip communicates with the
+microcontroller through the QSPI bus.
+
+See the
+[Building with Device Firmware Upgrade support](#building-with-device-firmware-upgrade-support)
+section to learn how to change MCUboot and flash configuration in this example.
+
+
+
+## Requirements
+
+The application requires a specific revision of the nRF Connect SDK to work
+correctly. See [Setting up the environment](#setting-up-the-environment) for
+more information.
+
+### Supported devices
+
+The example supports building and running on the following devices:
+
+| Hardware platform | Build target | Platform image |
+| ----------------------------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
+| [nRF52840 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK) | `nrf52840dk_nrf52840` | nRF52840 DK
|
+| [nRF5340 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK) | `nrf5340dk_nrf5340_cpuapp` | nRF5340 DK
|
+
+
+
+## Device UI
+
+This section lists the User Interface elements that you can use to control and
+monitor the state of the device. These correspond to PCB components on the
+platform image.
+
+**LED 1** shows the overall state of the device and its connectivity. The
+following states are possible:
+
+- _Short Flash On (50 ms on/950 ms off)_ — The device is in the
+ unprovisioned (unpaired) state and is waiting for a commissioning
+ application to connect.
+
+- _Rapid Even Flashing (100 ms on/100 ms off)_ — The device is in the
+ unprovisioned state and a commissioning application is connected through
+ Bluetooth LE.
+
+- _Short Flash Off (950ms on/50ms off)_ — The device is fully
+ provisioned, but does not yet have full connectivity for Thread network.
+
+- _Solid On_ — The device is fully provisioned.
+
+**LED 2** is used for the Identify feature purpose. The LED starts blinking
+evenly (500 ms on/500 ms off) when the Identify command of the Identify cluster
+is received on the endpoint 1. The command’s argument can be used to specify the
+duration of the effect.
+
+**Button 1** Pressing the button for more than 3 s initiates the factory reset
+of the device. Releasing the button within the 3-second window cancels the
+factory reset procedure.
+
+**Button 3** Represents the User Active Mode Trigger feature from the
+Intermittently Connected Devices Management cluster. Pressing it puts the ICD
+device in the active mode and makes it responsive.
+
+**Button 4** Starts the NFC tag emulation, enables Bluetooth LE advertising for
+the predefined period of time (15 minutes by default), and makes the device
+discoverable over Bluetooth LE. This button is used during the commissioning
+procedure.
+
+**SEGGER J-Link USB port** can be used to get logs from the device or
+communicate with it using the
+[command line interface](../../../docs/guides/nrfconnect_examples_cli.md).
+
+**NFC port with antenna attached** can be used to start the
+[rendezvous](#bluetooth-le-rendezvous) by providing the commissioning
+information from the Matter device in a data payload that can be shared using
+NFC.
+
+
+
+## Setting up the environment
+
+Before building the example, check out the Matter repository and sync submodules
+using the following command:
+
+ $ python3 scripts/checkout_submodules.py --shallow --platform nrfconnect
+
+> **Note**:
+>
+> For Linux operating system install
+> [SEGGER J-Link Software](https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack).
+
+### Install Command Line Tools
+
+With admin permissions enabled, download and install the
+[nRF Command Line Tools](https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools).
+
+### Install Toolchain Manager
+
+Toolchain Manager is available from
+[nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop),
+a cross-platform tool that provides different applications that simplify
+installing the nRF Connect SDK. Both the tool and the application are available
+for Windows, Linux, and macOS.
+
+To install the Toolchain Manager app, complete the following steps:
+
+1. [Download nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop/download#infotabs)
+ for your operating system.
+
+2. Install and run the tool on your machine.
+
+3. In the **APPS** section, click **Install** button on the Toolchain Manager
+ tab.
+
+### Install nRF Connect SDK
+
+Complete the following steps to install the nRF Connect SDK:
+
+1. Open Toolchain Manager in nRF Connect for Desktop.
+
+2. Click the **Install** button next to the
+ [recommended](../../../config/nrfconnect/.nrfconnect-recommended-revision)
+ version of the nRF Connect SDK.
+
+3. A pop-up window will inform you about the current installation directory. If
+ you want to change the directory, click the **Change directory** button.
+ Otherwise, click the **Continue installation** button.
+
+4. When the nRF Connect SDK is installed on your machine, the **Install**
+ button changes to the **Open VS Code** button.
+
+5. Click the dropdown menu next to the **Open VS Code** button for the
+ installed nRF Connect SDK version, and select **Open terminal**.
+
+6. Make sure that the nRF Connect SDK version is compatible with the Matter SDK
+ version:
+
+ ```
+ $ cd {connectedhomeip directory}
+ $ python3 scripts/setup/nrfconnect/update_ncs.py --update
+ ```
+
+Now you can proceed with the [Building](#building) instruction.
+
+
+
+## Building
+
+Complete the following steps to build the sample:
+
+1. Navigate to the example's directory:
+
+ $ cd examples/lit-icd-app/nrfconnect
+
+2. Run the following command to build the example, with _build-target_ replaced
+ with the build target name of the Nordic Semiconductor's kit you own, for
+ example `nrf52840dk_nrf52840`:
+
+ $ west build -b build-target
+
+ You only need to specify the build target on the first build. See
+ [Requirements](#requirements) for the build target names of compatible kits.
+
+The output `zephyr.hex` file will be available in the `build/zephyr/` directory.
+
+### Removing build artifacts
+
+If you're planning to build the example for a different kit or make changes to
+the configuration, remove all build artifacts before building. To do so, use the
+following command:
+
+ $ rm -r build
+
+### Building with release configuration
+
+To build the example with release configuration that disables the diagnostic
+features like logs and command-line interface, run the following command:
+
+ $ west build -b build-target -- -DCONF_FILE=prj_release.conf
+
+Remember to replace _build-target_ with the build target name of the Nordic
+Semiconductor's kit you own.
+
+### Building with Device Firmware Upgrade support
+
+Support for DFU using Matter OTA is enabled by default.
+
+To completely disable support for DFU, run the following command with
+_build-target_ replaced with the build target name of the Nordic Semiconductor
+kit you are using (for example `nrf52840dk_nrf52840`):
+
+ $ west build -b build-target -- -DCONF_FILE=prj_no_dfu.conf
+
+> **Note**:
+>
+> There are two types of Device Firmware Upgrade modes: single-image DFU and
+> multi-image DFU. Single-image mode supports upgrading only one firmware image,
+> the application image, and should be used for single-core nRF52840 DK devices.
+> Multi-image mode allows to upgrade more firmware images and is suitable for
+> upgrading the application core and network core firmware in two-core nRF5340
+> DK devices.
+
+#### Changing bootloader configuration
+
+To change the default MCUboot configuration, edit the `prj.conf` file located in
+the `child_image/mcuboot` directory.
+
+Make sure to keep the configuration consistent with changes made to the
+application configuration. This is necessary for the configuration to work, as
+the bootloader image is a separate application from the user application and it
+has its own configuration file.
+
+#### Changing flash memory settings
+
+In the default configuration, the MCUboot uses the
+[Partition Manager](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#partition-manager)
+to configure flash partitions used for the bootloader application image slot
+purposes. You can change these settings by defining
+[static partitions](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#ug-pm-static).
+This example uses this option to define using an external flash.
+
+To modify the flash settings of your board (that is, your _build-target_, for
+example `nrf52840dk_nrf52840`), edit the `pm_static_dfu.yml` file located in the
+`configuration/build-target/` directory.
+
+
+
+## Configuring the example
+
+The Zephyr ecosystem is based on Kconfig files and the settings can be modified
+using the menuconfig utility.
+
+To open the menuconfig utility, run the following command from the example
+directory:
+
+ $ west build -b build-target -t menuconfig
+
+Remember to replace _build-target_ with the build target name of the Nordic
+Semiconductor's kit you own.
+
+Changes done with menuconfig will be lost if the `build` directory is deleted.
+To make them persistent, save the configuration options in the `prj.conf` file.
+
+### Example build types
+
+The example uses different configuration files depending on the supported
+features. Configuration files are provided for different build types and they
+are located in the application root directory.
+
+The `prj.conf` file represents a debug build type. Other build types are covered
+by dedicated files with the build type added as a suffix to the prj part, as per
+the following list. For example, the release build type file name is
+`prj_release.conf`. If a board has other configuration files, for example
+associated with partition layout or child image configuration, these follow the
+same pattern.
+
+Before you start testing the application, you can select one of the build types
+supported by the sample. This sample supports the following build types,
+depending on the selected board:
+
+- debug -- Debug version of the application - can be used to enable additional
+ features for verifying the application behavior, such as logs or
+ command-line shell.
+- release -- Release version of the application - can be used to enable only
+ the necessary application functionalities to optimize its performance.
+- no_dfu -- Debug version of the application without Device Firmware Upgrade
+ feature support.
+
+For more information, see the
+[Configuring nRF Connect SDK examples](../../../docs/guides/nrfconnect_examples_configuration.md)
+page.
+
+
+
+## Flashing and debugging
+
+To flash the application to the device, use the west tool and run the following
+command from the example directory:
+
+ $ west flash --erase
+
+If you have multiple development kits connected, west will prompt you to pick
+the correct one.
+
+To debug the application on target, run the following command from the example
+directory:
+
+ $ west debug
+
+
+
+## Testing the example
+
+Check the [CLI tutorial](../../../docs/guides/nrfconnect_examples_cli.md) to
+learn how to use command-line interface of the application.
+
+### Testing using Linux CHIPTool
+
+Read the [CHIP Tool user guide](../../../docs/guides/chip_tool_guide.md) to see
+how to use [CHIP Tool for Linux or mac OS](../../chip-tool/README.md) to
+commission and control the application within a Matter-enabled Thread network.
+
+### Testing Device Firmware Upgrade
+
+Read the
+[DFU tutorial](../../../docs/guides/nrfconnect_examples_software_update.md) to
+see how to upgrade your device firmware.
diff --git a/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay b/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay
new file mode 100644
index 00000000000000..7babe0424821ba
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/boards/nrf52840dk_nrf52840.overlay
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+
+ /*
+ * In some default configurations within the nRF Connect SDK,
+ * e.g. on nRF52840, the chosen zephyr,entropy node is &cryptocell.
+ * This devicetree overlay ensures that default is overridden wherever it
+ * is set, as this application uses the RNG node for entropy exclusively.
+ */
+ chosen {
+ zephyr,entropy = &rng;
+ };
+};
+
+/* Disable unused peripherals to reduce power consumption */
+&adc {
+ status = "disabled";
+};
+&uart1 {
+ status = "disabled";
+};
+&i2c0 {
+ status = "disabled";
+};
+&pwm0 {
+ status = "disabled";
+};
+&spi1 {
+ status = "disabled";
+};
+&spi3 {
+ status = "disabled";
+};
+&usbd {
+ status = "disabled";
+};
diff --git a/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay b/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay
new file mode 100644
index 00000000000000..12155ffcd1f509
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/boards/nrf5340dk_nrf5340_cpuapp.overlay
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
+
+/* Set IPC thread priority to the highest value to not collide with other threads. */
+&ipc0 {
+ zephyr,priority = <0 PRIO_COOP>;
+};
+
+/* Disable unused peripherals to reduce power consumption */
+&adc {
+ status = "disabled";
+};
+&i2c1 {
+ status = "disabled";
+};
+&pwm0 {
+ status = "disabled";
+};
+&spi2 {
+ status = "disabled";
+};
+&usbd {
+ status = "disabled";
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf52840dk_nrf52840_release.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay
new file mode 100644
index 00000000000000..50069180506973
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp.overlay
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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.
+ */
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay
new file mode 100644
index 00000000000000..9f9128c6beff60
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/boards/nrf5340dk_nrf5340_cpuapp_release.overlay
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed 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.
+ */
+
+/ {
+ chosen {
+ nordic,pm-ext-flash = &mx25r64;
+ };
+};
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf
new file mode 100644
index 00000000000000..3f43b733b4bb96
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj.conf
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This target uses Kconfig.mcuboot.defaults to set options common for all
+# samples using mcuboot. This file should contain only options specific for this sample
+# mcuboot configuration or overrides of default values.
+
+CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
+
+# Bootloader size optimization
+# Disable not used modules that cannot be set in Kconfig.mcuboot.defaults due to overriding
+# in board files.
+CONFIG_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_GPIO=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf
new file mode 100644
index 00000000000000..3f43b733b4bb96
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/mcuboot/prj_release.conf
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This target uses Kconfig.mcuboot.defaults to set options common for all
+# samples using mcuboot. This file should contain only options specific for this sample
+# mcuboot configuration or overrides of default values.
+
+CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
+
+# Bootloader size optimization
+# Disable not used modules that cannot be set in Kconfig.mcuboot.defaults due to overriding
+# in board files.
+CONFIG_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_GPIO=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_no_dfu.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf
new file mode 100644
index 00000000000000..48deaa9fa18135
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/child_image/multiprotocol_rpmsg/prj_release.conf
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This target uses Kconfig.multiprotocol_rpmsg.defaults to set options common for all
+# samples using multiprotocol_rpmsg. This file should contain only options specific for this sample
+# multiprotocol_rpmsg configuration or overrides of default values.
+
+# Disable not used modules that cannot be set in Kconfig.multiprotocol_rpmsg.defaults due to overriding
+# in board files.
+
+CONFIG_SERIAL=n
+CONFIG_UART_CONSOLE=n
diff --git a/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml b/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
new file mode 100644
index 00000000000000..ce42b39e55ee87
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/configuration/nrf52840dk_nrf52840/pm_static_dfu.yml
@@ -0,0 +1,42 @@
+mcuboot:
+ address: 0x0
+ size: 0x7000
+ region: flash_primary
+mcuboot_pad:
+ address: 0x7000
+ size: 0x200
+app:
+ address: 0x7200
+ size: 0xf3e00
+mcuboot_primary:
+ orig_span: &id001
+ - mcuboot_pad
+ - app
+ span: *id001
+ address: 0x7000
+ size: 0xf4000
+ region: flash_primary
+mcuboot_primary_app:
+ orig_span: &id002
+ - app
+ span: *id002
+ address: 0x7200
+ size: 0xf3e00
+factory_data:
+ address: 0xfb000
+ size: 0x1000
+ region: flash_primary
+settings_storage:
+ address: 0xfc000
+ size: 0x4000
+ region: flash_primary
+mcuboot_secondary:
+ address: 0x0
+ size: 0xf4000
+ device: MX25R64
+ region: external_flash
+external_flash:
+ address: 0xf4000
+ size: 0x70c000
+ device: MX25R64
+ region: external_flash
diff --git a/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml b/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml
new file mode 100644
index 00000000000000..10e8680c363a53
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/configuration/nrf5340dk_nrf5340_cpuapp/pm_static_dfu.yml
@@ -0,0 +1,56 @@
+mcuboot:
+ address: 0x0
+ size: 0x8000
+ region: flash_primary
+mcuboot_pad:
+ address: 0x8000
+ size: 0x200
+app:
+ address: 0x8200
+ size: 0xf2e00
+mcuboot_primary:
+ orig_span: &id001
+ - mcuboot_pad
+ - app
+ span: *id001
+ address: 0x8000
+ size: 0xf3000
+ region: flash_primary
+mcuboot_primary_app:
+ orig_span: &id002
+ - app
+ span: *id002
+ address: 0x8200
+ size: 0xf2e00
+factory_data:
+ address: 0xfb000
+ size: 0x1000
+ region: flash_primary
+settings_storage:
+ address: 0xfc000
+ size: 0x4000
+ region: flash_primary
+mcuboot_primary_1:
+ address: 0x0
+ size: 0x40000
+ device: flash_ctrl
+ region: ram_flash
+mcuboot_secondary:
+ address: 0x0
+ size: 0xf3000
+ device: MX25R64
+ region: external_flash
+mcuboot_secondary_1:
+ address: 0xf3000
+ size: 0x40000
+ device: MX25R64
+ region: external_flash
+external_flash:
+ address: 0x133000
+ size: 0x6CD000
+ device: MX25R64
+ region: external_flash
+pcd_sram:
+ address: 0x20000000
+ size: 0x2000
+ region: sram_primary
diff --git a/examples/lit-icd-app/nrfconnect/main/AppTask.cpp b/examples/lit-icd-app/nrfconnect/main/AppTask.cpp
new file mode 100644
index 00000000000000..50622d0c88b96e
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/AppTask.cpp
@@ -0,0 +1,502 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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 "AppTask.h"
+#include "AppConfig.h"
+#include "AppEvent.h"
+#include "FabricTableDelegate.h"
+#include "LEDUtil.h"
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#if CONFIG_CHIP_OTA_REQUESTOR
+#include "OTAUtil.h"
+#endif
+
+#include
+#include
+#include
+
+LOG_MODULE_DECLARE(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+using namespace ::chip::app;
+using namespace ::chip::Credentials;
+using namespace ::chip::DeviceLayer;
+
+namespace {
+constexpr uint32_t kFactoryResetTriggerTimeout = 3000;
+constexpr uint32_t kFactoryResetCancelWindowTimeout = 3000;
+constexpr size_t kAppEventQueueSize = 10;
+constexpr EndpointId kIdentifyEndpointId = 1;
+
+// NOTE! This key is for test/certification only and should not be available in production devices!
+// If CONFIG_CHIP_FACTORY_DATA is enabled, this value is read from the factory data.
+uint8_t sTestEventTriggerEnableKey[TestEventTriggerDelegate::kEnableKeyLength] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
+
+K_MSGQ_DEFINE(sAppEventQueue, sizeof(AppEvent), kAppEventQueueSize, alignof(AppEvent));
+k_timer sFunctionTimer;
+
+chip::DeviceLayer::DeviceInfoProviderImpl gExampleDeviceInfoProvider;
+
+Identify sIdentify = { kIdentifyEndpointId, AppTask::IdentifyStartHandler, AppTask::IdentifyStopHandler,
+ Clusters::Identify::IdentifyTypeEnum::kVisibleIndicator };
+
+LEDWidget sStatusLED;
+LEDWidget sIdentifyLED;
+FactoryResetLEDsWrapper<2> sFactoryResetLEDs{ { FACTORY_RESET_SIGNAL_LED, FACTORY_RESET_SIGNAL_LED1 } };
+
+bool sIsNetworkProvisioned = false;
+bool sIsNetworkEnabled = false;
+bool sHaveBLEConnections = false;
+
+} // namespace
+
+namespace LedConsts {
+constexpr uint32_t kBlinkRate_ms{ 500 };
+constexpr uint32_t kIdentifyBlinkRate_ms{ 500 };
+namespace StatusLed {
+namespace Unprovisioned {
+constexpr uint32_t kOn_ms{ 100 };
+constexpr uint32_t kOff_ms{ kOn_ms };
+} // namespace Unprovisioned
+namespace Provisioned {
+constexpr uint32_t kOn_ms{ 50 };
+constexpr uint32_t kOff_ms{ 950 };
+} // namespace Provisioned
+
+} // namespace StatusLed
+} // namespace LedConsts
+
+CHIP_ERROR AppTask::Init()
+{
+ // Initialize CHIP stack
+ LOG_INF("Init CHIP stack");
+
+ CHIP_ERROR err = chip::Platform::MemoryInit();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("Platform::MemoryInit() failed");
+ return err;
+ }
+
+ err = PlatformMgr().InitChipStack();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("PlatformMgr().InitChipStack() failed");
+ return err;
+ }
+
+#if defined(CONFIG_NET_L2_OPENTHREAD)
+ err = ThreadStackMgr().InitThreadStack();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("ThreadStackMgr().InitThreadStack() failed");
+ return err;
+ }
+
+#ifdef CONFIG_OPENTHREAD_MTD_SED
+ err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice);
+#else
+ err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice);
+#endif
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("ConnectivityMgr().SetThreadDeviceType() failed");
+ return err;
+ }
+#else
+ return CHIP_ERROR_INTERNAL;
+#endif // CONFIG_NET_L2_OPENTHREAD
+
+ // Initialize LEDs
+ LEDWidget::InitGpio();
+ LEDWidget::SetStateUpdateCallback(LEDStateUpdateHandler);
+
+ sStatusLED.Init(SYSTEM_STATE_LED);
+ sIdentifyLED.Init(IDENTIFY_STATE_LED);
+ sIdentifyLED.Set(false);
+
+ UpdateStatusLED();
+
+ // Initialize buttons
+ auto ret = dk_buttons_init(ButtonEventHandler);
+ if (ret)
+ {
+ LOG_ERR("dk_buttons_init() failed");
+ return chip::System::MapErrorZephyr(ret);
+ }
+
+ // Initialize timer user data
+ k_timer_init(&sFunctionTimer, &AppTask::FunctionTimerTimeoutCallback, nullptr);
+ k_timer_user_data_set(&sFunctionTimer, this);
+
+#ifdef CONFIG_CHIP_OTA_REQUESTOR
+ /* OTA image confirmation must be done before the factory data init. */
+ OtaConfirmNewImage();
+#endif
+
+ // Initialize CHIP server
+#if CONFIG_CHIP_FACTORY_DATA
+ ReturnErrorOnFailure(mFactoryDataProvider.Init());
+ SetDeviceInstanceInfoProvider(&mFactoryDataProvider);
+ SetDeviceAttestationCredentialsProvider(&mFactoryDataProvider);
+ SetCommissionableDataProvider(&mFactoryDataProvider);
+ // Read EnableKey from the factory data.
+ MutableByteSpan enableKey(sTestEventTriggerEnableKey);
+ err = mFactoryDataProvider.GetEnableKey(enableKey);
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("mFactoryDataProvider.GetEnableKey() failed. Could not delegate a test event trigger");
+ memset(sTestEventTriggerEnableKey, 0, sizeof(sTestEventTriggerEnableKey));
+ }
+#else
+ SetDeviceInstanceInfoProvider(&DeviceInstanceInfoProviderMgrImpl());
+ SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
+#endif
+
+ static CommonCaseDeviceServerInitParams initParams;
+ static SimpleTestEventTriggerDelegate sTestEventTriggerDelegate{};
+ static OTATestEventTriggerHandler sOtaTestEventTriggerHandler{};
+ VerifyOrDie(sTestEventTriggerDelegate.Init(ByteSpan(sTestEventTriggerEnableKey)) == CHIP_NO_ERROR);
+ VerifyOrDie(sTestEventTriggerDelegate.AddHandler(&sOtaTestEventTriggerHandler) == CHIP_NO_ERROR);
+ (void) initParams.InitializeStaticResourcesBeforeServerInit();
+ initParams.testEventTriggerDelegate = &sTestEventTriggerDelegate;
+ ReturnErrorOnFailure(chip::Server::GetInstance().Init(initParams));
+ AppFabricTableDelegate::Init();
+
+ gExampleDeviceInfoProvider.SetStorageDelegate(&Server::GetInstance().GetPersistentStorage());
+ chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
+ ConfigurationMgr().LogDeviceConfig();
+ PrintOnboardingCodes(chip::RendezvousInformationFlag(chip::RendezvousInformationFlag::kBLE));
+
+ // Add CHIP event handler and start CHIP thread.
+ // Note that all the initialization code should happen prior to this point to avoid data races
+ // between the main and the CHIP threads
+ PlatformMgr().AddEventHandler(ChipEventHandler, 0);
+ err = PlatformMgr().StartEventLoopTask();
+ if (err != CHIP_NO_ERROR)
+ {
+ LOG_ERR("PlatformMgr().StartEventLoopTask() failed");
+ }
+
+ return err;
+}
+
+CHIP_ERROR AppTask::StartApp()
+{
+ ReturnErrorOnFailure(Init());
+
+ AppEvent event{};
+
+ while (true)
+ {
+ k_msgq_get(&sAppEventQueue, &event, K_FOREVER);
+ DispatchEvent(event);
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+void AppTask::IdentifyStartHandler(Identify *)
+{
+ AppEvent event;
+ event.Type = AppEventType::IdentifyStart;
+ event.Handler = [](const AppEvent &) { sIdentifyLED.Blink(LedConsts::kIdentifyBlinkRate_ms); };
+ PostEvent(event);
+}
+
+void AppTask::IdentifyStopHandler(Identify *)
+{
+ AppEvent event;
+ event.Type = AppEventType::IdentifyStop;
+ event.Handler = [](const AppEvent &) { sIdentifyLED.Set(false); };
+ PostEvent(event);
+}
+
+void AppTask::ButtonEventHandler(uint32_t buttonState, uint32_t hasChanged)
+{
+ AppEvent button_event;
+ button_event.Type = AppEventType::Button;
+
+ if (BLE_ADVERTISEMENT_START_BUTTON_MASK & buttonState & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = BLE_ADVERTISEMENT_START_BUTTON;
+ button_event.ButtonEvent.Action = static_cast(AppEventType::ButtonPushed);
+ button_event.Handler = StartBLEAdvertisementHandler;
+ PostEvent(button_event);
+ }
+
+ if (FUNCTION_BUTTON_MASK & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = FUNCTION_BUTTON;
+ button_event.ButtonEvent.Action =
+ static_cast((FUNCTION_BUTTON_MASK & buttonState) ? AppEventType::ButtonPushed : AppEventType::ButtonReleased);
+ button_event.Handler = FunctionHandler;
+ PostEvent(button_event);
+ }
+
+ if (ICD_UAT_BUTTON_MASK & hasChanged)
+ {
+ button_event.ButtonEvent.PinNo = ICD_UAT_BUTTON;
+ button_event.ButtonEvent.Action = static_cast(AppEventType::ButtonPushed);
+ button_event.Handler = IcdUatEventHandler;
+ PostEvent(button_event);
+ }
+}
+
+void AppTask::IcdUatEventHandler(const AppEvent &)
+{
+ Server::GetInstance().GetICDManager().UpdateOperationState(ICDManager::OperationalState::ActiveMode);
+}
+
+void AppTask::FunctionTimerTimeoutCallback(k_timer * timer)
+{
+ if (!timer)
+ {
+ return;
+ }
+
+ AppEvent event;
+ event.Type = AppEventType::Timer;
+ event.TimerEvent.Context = k_timer_user_data_get(timer);
+ event.Handler = FunctionTimerEventHandler;
+ PostEvent(event);
+}
+
+void AppTask::FunctionTimerEventHandler(const AppEvent & event)
+{
+ if (event.Type != AppEventType::Timer || !Instance().mFunctionTimerActive)
+ {
+ return;
+ }
+
+ // If we reached here, the button was held past kFactoryResetTriggerTimeout, initiate factory reset
+ if (Instance().mFunction == FunctionEvent::SoftwareUpdate)
+ {
+ LOG_INF("Factory Reset Triggered. Release button within %ums to cancel.", kFactoryResetTriggerTimeout);
+
+ // Start timer for kFactoryResetCancelWindowTimeout to allow user to cancel, if required.
+ Instance().StartTimer(kFactoryResetCancelWindowTimeout);
+ Instance().mFunction = FunctionEvent::FactoryReset;
+
+ // Turn off all LEDs before starting blink to make sure blink is coordinated.
+ sStatusLED.Set(false);
+ sFactoryResetLEDs.Set(false);
+
+ sStatusLED.Blink(LedConsts::kBlinkRate_ms);
+ sFactoryResetLEDs.Blink(LedConsts::kBlinkRate_ms);
+ }
+ else if (Instance().mFunction == FunctionEvent::FactoryReset)
+ {
+ // Actually trigger Factory Reset
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ chip::Server::GetInstance().ScheduleFactoryReset();
+ }
+ else if (Instance().mFunction == FunctionEvent::AdvertisingStart)
+ {
+ // The button was held past kAdvertisingTriggerTimeout, start BLE advertisement if we have 2 buttons UI
+ StartBLEAdvertisementHandler(event);
+ }
+}
+
+void AppTask::FunctionHandler(const AppEvent & event)
+{
+ if (event.ButtonEvent.PinNo != FUNCTION_BUTTON)
+ return;
+
+ // To trigger software update: press the FUNCTION_BUTTON button briefly (< FACTORY_RESET_TRIGGER_TIMEOUT)
+ // To initiate factory reset: press the FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT + FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
+ // All LEDs start blinking after FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated.
+ // To cancel factory reset: release the FUNCTION_BUTTON once all LEDs start blinking within the
+ // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
+ if (event.ButtonEvent.Action == static_cast(AppEventType::ButtonPushed))
+ {
+ if (!Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::NoneSelected)
+ {
+ Instance().StartTimer(kFactoryResetTriggerTimeout);
+
+ Instance().mFunction = FunctionEvent::SoftwareUpdate;
+ }
+ }
+ else
+ {
+ // If the button was released before factory reset got initiated, trigger a software update.
+ if (Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::SoftwareUpdate)
+ {
+ Instance().CancelTimer();
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ }
+ else if (Instance().mFunctionTimerActive && Instance().mFunction == FunctionEvent::FactoryReset)
+ {
+ sFactoryResetLEDs.Set(false);
+ UpdateStatusLED();
+ Instance().CancelTimer();
+ Instance().mFunction = FunctionEvent::NoneSelected;
+ LOG_INF("Factory Reset has been Canceled");
+ }
+ }
+}
+
+void AppTask::StartBLEAdvertisementHandler(const AppEvent &)
+{
+ if (Server::GetInstance().GetFabricTable().FabricCount() != 0)
+ {
+ LOG_INF("Matter service BLE advertising not started - device is already commissioned");
+ return;
+ }
+
+ if (ConnectivityMgr().IsBLEAdvertisingEnabled())
+ {
+ LOG_INF("BLE advertising is already enabled");
+ return;
+ }
+
+ if (Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow() != CHIP_NO_ERROR)
+ {
+ LOG_ERR("OpenBasicCommissioningWindow() failed");
+ }
+}
+
+void AppTask::UpdateLedStateEventHandler(const AppEvent & event)
+{
+ if (event.Type == AppEventType::UpdateLedState)
+ {
+ event.UpdateLedStateEvent.LedWidget->UpdateState();
+ }
+}
+
+void AppTask::LEDStateUpdateHandler(LEDWidget & ledWidget)
+{
+ AppEvent event;
+ event.Type = AppEventType::UpdateLedState;
+ event.Handler = UpdateLedStateEventHandler;
+ event.UpdateLedStateEvent.LedWidget = &ledWidget;
+ PostEvent(event);
+}
+
+void AppTask::UpdateStatusLED()
+{
+#ifdef CONFIG_STATE_LEDS
+ // Update the status LED.
+ //
+ // If IPv6 network and service provisioned, keep the LED On constantly.
+ //
+ // If the system has BLE connection(s) until the stage above, THEN blink the LED at an even
+ // rate of 100ms.
+ //
+ // Otherwise, blink the LED for a very short time.
+ if (sIsNetworkProvisioned && sIsNetworkEnabled)
+ {
+ sStatusLED.Set(true);
+ }
+ else if (sHaveBLEConnections)
+ {
+ sStatusLED.Blink(LedConsts::StatusLed::Unprovisioned::kOn_ms, LedConsts::StatusLed::Unprovisioned::kOff_ms);
+ }
+ else
+ {
+ sStatusLED.Blink(LedConsts::StatusLed::Provisioned::kOn_ms, LedConsts::StatusLed::Provisioned::kOff_ms);
+ }
+#endif
+}
+
+void AppTask::ChipEventHandler(const ChipDeviceEvent * event, intptr_t /* arg */)
+{
+ switch (event->Type)
+ {
+ case DeviceEventType::kCHIPoBLEAdvertisingChange:
+#ifdef CONFIG_CHIP_NFC_COMMISSIONING
+ if (event->CHIPoBLEAdvertisingChange.Result == kActivity_Started)
+ {
+ if (NFCMgr().IsTagEmulationStarted())
+ {
+ LOG_INF("NFC Tag emulation is already started");
+ }
+ else
+ {
+ ShareQRCodeOverNFC(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE));
+ }
+ }
+ else if (event->CHIPoBLEAdvertisingChange.Result == kActivity_Stopped)
+ {
+ NFCMgr().StopTagEmulation();
+ }
+#endif
+ sHaveBLEConnections = ConnectivityMgr().NumBLEConnections() != 0;
+ UpdateStatusLED();
+ break;
+#if defined(CONFIG_NET_L2_OPENTHREAD)
+ case DeviceEventType::kDnssdInitialized:
+#if CONFIG_CHIP_OTA_REQUESTOR
+ InitBasicOTARequestor();
+#endif // CONFIG_CHIP_OTA_REQUESTOR
+ break;
+ case DeviceEventType::kThreadStateChange:
+ sIsNetworkProvisioned = ConnectivityMgr().IsThreadProvisioned();
+ sIsNetworkEnabled = ConnectivityMgr().IsThreadEnabled();
+ UpdateStatusLED();
+ break;
+#endif // CONFIG_NET_L2_OPENTHREAD
+ default:
+ break;
+ }
+}
+
+void AppTask::CancelTimer()
+{
+ k_timer_stop(&sFunctionTimer);
+ Instance().mFunctionTimerActive = false;
+}
+
+void AppTask::StartTimer(uint32_t aTimeoutInMs)
+{
+ k_timer_start(&sFunctionTimer, K_MSEC(aTimeoutInMs), K_NO_WAIT);
+ Instance().mFunctionTimerActive = true;
+}
+
+void AppTask::PostEvent(const AppEvent & event)
+{
+ if (k_msgq_put(&sAppEventQueue, &event, K_NO_WAIT) != 0)
+ {
+ LOG_INF("Failed to post event to app task event queue");
+ }
+}
+
+void AppTask::DispatchEvent(const AppEvent & event)
+{
+ if (event.Handler)
+ {
+ event.Handler(event);
+ }
+ else
+ {
+ LOG_INF("Event received with no handler. Dropping event.");
+ }
+}
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h b/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h
new file mode 100644
index 00000000000000..26f63f5ec1fa06
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppConfig.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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.
+ */
+
+#pragma once
+
+#include "BoardUtil.h"
+
+// ---- LIT ICD Application example config ----
+
+#define FUNCTION_BUTTON DK_BTN1
+#define FUNCTION_BUTTON_MASK DK_BTN1_MSK
+#define ICD_UAT_BUTTON DK_BTN3
+#define ICD_UAT_BUTTON_MASK DK_BTN3_MSK
+#define BLE_ADVERTISEMENT_START_BUTTON DK_BTN4
+#define BLE_ADVERTISEMENT_START_BUTTON_MASK DK_BTN4_MSK
+#define SYSTEM_STATE_LED DK_LED1
+#define IDENTIFY_STATE_LED DK_LED2
+#define FACTORY_RESET_SIGNAL_LED DK_LED3
+#define FACTORY_RESET_SIGNAL_LED1 DK_LED4
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h b/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h
new file mode 100644
index 00000000000000..27ae7408f52e08
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppEvent.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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.
+ */
+
+#pragma once
+
+#include
+
+#include "EventTypes.h"
+
+class LEDWidget;
+
+enum class AppEventType : uint8_t
+{
+ None = 0,
+ Button,
+ ButtonPushed,
+ ButtonReleased,
+ Timer,
+ UpdateLedState,
+ IdentifyStart,
+ IdentifyStop,
+};
+
+enum class FunctionEvent : uint8_t
+{
+ NoneSelected = 0,
+ SoftwareUpdate = 0,
+ FactoryReset,
+ AdvertisingStart
+};
+
+struct AppEvent
+{
+ union
+ {
+ struct
+ {
+ uint8_t PinNo;
+ uint8_t Action;
+ } ButtonEvent;
+ struct
+ {
+ void * Context;
+ } TimerEvent;
+ struct
+ {
+ uint8_t Action;
+ int32_t Actor;
+ } LockEvent;
+ struct
+ {
+ LEDWidget * LedWidget;
+ } UpdateLedStateEvent;
+ };
+
+ AppEventType Type{ AppEventType::None };
+ EventHandler Handler;
+};
diff --git a/examples/lit-icd-app/nrfconnect/main/include/AppTask.h b/examples/lit-icd-app/nrfconnect/main/include/AppTask.h
new file mode 100644
index 00000000000000..f1513b2d1e75cb
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/AppTask.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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.
+ */
+
+#pragma once
+
+#include
+
+#include "AppEvent.h"
+#include "LEDWidget.h"
+
+#if CONFIG_CHIP_FACTORY_DATA
+#include
+#else
+#include
+#endif
+
+struct k_timer;
+struct Identify;
+
+class AppTask
+{
+public:
+ static AppTask & Instance(void)
+ {
+ static AppTask sAppTask;
+ return sAppTask;
+ };
+ CHIP_ERROR StartApp();
+
+ static void IdentifyStartHandler(Identify *);
+ static void IdentifyStopHandler(Identify *);
+
+ static void PostEvent(const AppEvent & event);
+
+private:
+ CHIP_ERROR Init();
+
+ static void CancelTimer();
+ static void StartTimer(uint32_t timeoutInMs);
+
+ static void DispatchEvent(const AppEvent & event);
+ static void FunctionTimerEventHandler(const AppEvent & event);
+ static void FunctionHandler(const AppEvent & event);
+ static void StartBLEAdvertisementHandler(const AppEvent & event);
+ static void IcdUatEventHandler(const AppEvent & event);
+ static void UpdateLedStateEventHandler(const AppEvent & event);
+
+ static void ChipEventHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg);
+ static void ButtonEventHandler(uint32_t buttonState, uint32_t hasChanged);
+ static void LEDStateUpdateHandler(LEDWidget & ledWidget);
+ static void FunctionTimerTimeoutCallback(k_timer * timer);
+ static void UpdateStatusLED();
+
+ FunctionEvent mFunction = FunctionEvent::NoneSelected;
+ bool mFunctionTimerActive = false;
+
+#if CONFIG_CHIP_FACTORY_DATA
+ chip::DeviceLayer::FactoryDataProvider mFactoryDataProvider;
+#endif
+};
diff --git a/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h b/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h
new file mode 100644
index 00000000000000..4baa186190f638
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/include/CHIPProjectConfig.h
@@ -0,0 +1,28 @@
+/*
+ *
+ * Copyright (c) 2020 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * @file
+ * Example project configuration file for CHIP.
+ *
+ * This is a place to put application or project-specific overrides
+ * to the default configuration values for general CHIP features.
+ *
+ */
+
+#pragma once
diff --git a/examples/lit-icd-app/nrfconnect/main/main.cpp b/examples/lit-icd-app/nrfconnect/main/main.cpp
new file mode 100644
index 00000000000000..0f9b0451e4284d
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/main/main.cpp
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed 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 "AppTask.h"
+
+#include
+
+LOG_MODULE_REGISTER(app, CONFIG_CHIP_APP_LOG_LEVEL);
+
+using namespace ::chip;
+
+int main()
+{
+ CHIP_ERROR err = AppTask::Instance().StartApp();
+
+ LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format());
+ return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/examples/lit-icd-app/nrfconnect/prj.conf b/examples/lit-icd-app/nrfconnect/prj.conf
new file mode 100644
index 00000000000000..950be7c8c394e4
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj.conf
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Other settings
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+CONFIG_RESET_ON_FATAL_ERROR=n
+
+# Reduce application size
+CONFIG_USE_SEGGER_RTT=n
+
+# Enable Factory Data feature
+CONFIG_CHIP_FACTORY_DATA=y
+CONFIG_CHIP_FACTORY_DATA_BUILD=y
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf b/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf
new file mode 100644
index 00000000000000..00607e349a31ab
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj_no_dfu.conf
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Other settings
+CONFIG_THREAD_NAME=y
+CONFIG_MPU_STACK_GUARD=y
+CONFIG_RESET_ON_FATAL_ERROR=n
+
+# Reduce application size
+CONFIG_USE_SEGGER_RTT=n
+
+# Disable Matter OTA DFU
+CONFIG_CHIP_OTA_REQUESTOR=n
+
+# Disable QSPI NOR
+CONFIG_CHIP_QSPI_NOR=n
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/prj_release.conf b/examples/lit-icd-app/nrfconnect/prj_release.conf
new file mode 100644
index 00000000000000..61b6b3dfc6f8f8
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/prj_release.conf
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2024 Project CHIP Authors
+#
+# Licensed 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.
+#
+
+# This sample uses Kconfig.defaults to set options common for all
+# samples. This file should contain only options specific for this sample
+# or overrides of default values.
+
+# Enable CHIP
+CONFIG_CHIP=y
+CONFIG_CHIP_PROJECT_CONFIG="main/include/CHIPProjectConfig.h"
+CONFIG_STD_CPP17=y
+
+# Add support for LEDs and buttons on Nordic development kits
+CONFIG_DK_LIBRARY=y
+
+# Bluetooth Low Energy configuration
+CONFIG_BT_DEVICE_NAME="MatterLIT"
+
+# Enable system reset on fatal error
+CONFIG_RESET_ON_FATAL_ERROR=y
+
+# Suspend devices when the CPU goes into sleep
+CONFIG_PM_DEVICE=y
+
+# Disable all debug features
+CONFIG_USE_SEGGER_RTT=n
+CONFIG_SHELL=n
+CONFIG_OPENTHREAD_SHELL=n
+CONFIG_CONSOLE=n
+CONFIG_UART_CONSOLE=n
+CONFIG_SERIAL=n
+CONFIG_LOG=n
+CONFIG_LOG_MODE_MINIMAL=n
+CONFIG_ASSERT_VERBOSE=n
+CONFIG_ASSERT_NO_FILE_INFO=y
+CONFIG_PRINTK=n
+CONFIG_PRINTK_SYNC=n
+CONFIG_THREAD_NAME=n
+CONFIG_BOOT_BANNER=n
+
+# Enable Factory Data feature
+CONFIG_CHIP_FACTORY_DATA=y
+CONFIG_CHIP_FACTORY_DATA_BUILD=y
+
+# Enable LIT ICD configuration
+CONFIG_CHIP_ENABLE_ICD_SUPPORT=y
+CONFIG_CHIP_ICD_LIT_SUPPORT=y
diff --git a/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip b/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip
new file mode 120000
index 00000000000000..c866b86874994d
--- /dev/null
+++ b/examples/lit-icd-app/nrfconnect/third_party/connectedhomeip
@@ -0,0 +1 @@
+../../../..
\ No newline at end of file