Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 1 | # Matter nRF Connect Lock Example Application |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 2 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 3 | > **Note:** This example is intended only to perform smoke tests of a Matter |
| 4 | > solution integrated with nRF Connect SDK platform. The example quality is not |
| 5 | > production ready and it may contain minor bugs or use not optimal |
| 6 | > configuration. It is not recommended to use this example as a basis for |
| 7 | > creating a market ready product. |
| 8 | > |
| 9 | > For the production ready and optimized Matter samples, see |
| 10 | > [nRF Connect SDK samples](https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/samples/matter.html). |
| 11 | > The Matter samples in nRF Connect SDK use various additional software |
| 12 | > components and provide multiple optional features that improve the developer |
| 13 | > and user experience. To read more about it, see |
| 14 | > [Matter support in nRF Connect SDK](https://docs.nordicsemi.com/bundle/ncs-latest/page/nrf/protocols/matter/index.html#ug-matter) |
| 15 | > page. Using Matter samples from nRF Connect SDK allows you to get a full |
| 16 | > Nordic technical support via [DevZone](https://devzone.nordicsemi.com/) |
| 17 | > portal. |
| 18 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 19 | The nRF Connect Lock Example demonstrates how to remotely control a door lock |
| 20 | device with one basic bolt. It uses buttons to test changing the lock and device |
| 21 | states and LEDs to show the state of these changes. You can use this example as |
| 22 | a reference for creating your own application. |
| 23 | |
Gaute Svanes Lunde | e7347ea | 2023-01-09 19:43:07 +0100 | [diff] [blame] | 24 | <img src="../../platform/nrfconnect/doc/images/Logo_RGB_H-small.png" alt="Nordic Semiconductor logo"/> |
| 25 | <img src="../../platform/nrfconnect/doc/images/nRF52840-DK-small.png" alt="nRF52840 DK"> |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 26 | |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 27 | The example is based on |
| 28 | [Matter](https://github.com/project-chip/connectedhomeip) and Nordic |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 29 | Semiconductor's nRF Connect SDK, and was created to facilitate testing and |
| 30 | certification of a Matter device communicating over a low-power, 802.15.4 Thread |
| 31 | network, or Wi-Fi network. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 32 | |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 33 | The example behaves as a Matter accessory, that is a device that can be paired |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 34 | into an existing Matter network and can be controlled by this network. In the |
| 35 | case of Thread, this device works as a Thread Sleepy End Device. Support for |
| 36 | both Thread and Wi-Fi is mutually exclusive and depends on the hardware |
| 37 | platform, so only one protocol can be supported for a specific lock device. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 38 | |
| 39 | <hr> |
| 40 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 41 | ## Overview |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 42 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 43 | This example is running on the nRF Connect platform, which is based on Nordic |
| 44 | Semiconductor's |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 45 | [nRF Connect SDK](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/index.html) |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 46 | and [Zephyr RTOS](https://zephyrproject.org/). Visit Matter's |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 47 | [nRF Connect platform overview](../../../docs/guides/nrfconnect_platform_overview.md) |
| 48 | to read more about the platform structure and dependencies. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 49 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 50 | By default, the Matter accessory device has IPv6 networking disabled. You must |
| 51 | pair it with the Matter controller over Bluetooth® LE to get the configuration |
| 52 | from the controller to use the device within a Thread or Wi-Fi network. You have |
| 53 | to make the device discoverable manually (for security reasons). See |
| 54 | [Bluetooth LE advertising](#bluetooth-le-advertising) to learn how to do this. |
| 55 | The controller must get the commissioning information from the Matter accessory |
| 56 | device and provision the device into the network. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 57 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 58 | The sample uses buttons for changing the lock and device states, and LEDs to |
| 59 | show the state of these changes. You can test it in the following ways: |
| 60 | |
| 61 | - Standalone, using a single DK that runs the door lock application. |
| 62 | |
| 63 | - Remotely over the Thread or the Wi-Fi protocol, which in either case |
| 64 | requires more devices, including a Matter controller that you can configure |
| 65 | either on a PC or a mobile device. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 66 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 67 | ### Bluetooth LE advertising |
| 68 | |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 69 | In this example, to commission the device onto a Matter network, it must be |
doru91 | 9d0d48f | 2021-01-28 20:45:01 +0200 | [diff] [blame] | 70 | discoverable over Bluetooth LE. For security reasons, you must start Bluetooth |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 71 | LE advertising manually after powering up the device by pressing: |
| 72 | |
| 73 | - On nRF52840 DK, nRF5340 DK, and nRF21540 DK: **Button 4**. |
| 74 | |
| 75 | - On nRF7002 DK: **Button 2**. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 76 | |
| 77 | ### Bluetooth LE rendezvous |
| 78 | |
Damian Królik | c3edd9a | 2021-07-03 03:59:59 +0200 | [diff] [blame] | 79 | In this example, the commissioning procedure is done over Bluetooth LE between a |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 80 | Matter device and the Matter controller, where the controller has the |
| 81 | commissioner role. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 82 | |
| 83 | To start the rendezvous, the controller must get the commissioning information |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 84 | from the Matter device. The data payload is encoded within a QR code, printed to |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 85 | the UART console, and shared using an NFC tag. The emulation of the NFC tag |
| 86 | emulation starts automatically when Bluetooth LE advertising is started and |
| 87 | stays enabled until Bluetooth LE advertising timeout expires. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 88 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 89 | #### Thread or Wi-Fi provisioning |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 90 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 91 | The provisioning operation, which is the Last part of the rendezvous procedure, |
| 92 | involves sending the Thread or Wi-Fi network credentials from the Matter |
| 93 | controller to the Matter device. As a result, the device joins the Thread or |
| 94 | Wi-Fi network and can communicate with other devices in the network. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 95 | |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 96 | ### Device Firmware Upgrade |
| 97 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 98 | The example supports over-the-air (OTA) device firmware upgrade (DFU) using one |
| 99 | of the two available methods: |
| 100 | |
| 101 | - Matter OTA update that is mandatory for Matter-compliant devices and enabled |
| 102 | by default |
| 103 | - [Simple Management Protocol](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/device_mgmt/index.html#device-mgmt) |
| 104 | over Bluetooth LE, an optional proprietary method that can be enabled to |
| 105 | work alongside the default Matter OTA update. Note that this protocol is not |
| 106 | a part of the Matter specification. |
| 107 | |
| 108 | For both methods, the |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 109 | [MCUboot](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/mcuboot/index.html) |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 110 | bootloader solution is used to replace the old firmware image with the new one. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 111 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 112 | #### Matter Over-the-Air Update |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 113 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 114 | The Matter over-the-air update distinguishes two types of nodes: OTA Provider |
| 115 | and OTA Requestor. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 116 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 117 | An OTA Provider is a node that hosts a new firmware image and is able to respond |
| 118 | on an OTA Requestor's queries regarding availability of new firmware images or |
| 119 | requests to start sending the update packages. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 120 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 121 | An OTA Requestor is a node that wants to download a new firmware image and sends |
| 122 | requests to an OTA Provider to start the update process. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 123 | |
| 124 | #### Simple Management Protocol |
| 125 | |
| 126 | Simple Management Protocol (SMP) is a basic transfer encoding that is used for |
| 127 | device management purposes, including application image management. SMP supports |
| 128 | using different transports, such as Bluetooth LE, UDP, or serial USB/UART. |
| 129 | |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 130 | In this example, the Matter device runs the SMP Server to download the |
| 131 | application update image using the Bluetooth LE transport. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 132 | |
| 133 | See the |
| 134 | [Building with Device Firmware Upgrade support](#building-with-device-firmware-upgrade-support) |
| 135 | section to learn how to enable SMP and use it for the DFU purpose in this |
| 136 | example. |
| 137 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 138 | #### Bootloader |
| 139 | |
| 140 | MCUboot is a secure bootloader used for swapping firmware images of different |
| 141 | versions and generating proper build output files that can be used in the device |
| 142 | firmware upgrade process. |
| 143 | |
| 144 | The bootloader solution requires an area of flash memory to swap application |
| 145 | images during the firmware upgrade. Nordic Semiconductor devices use an external |
| 146 | memory chip for this purpose. The memory chip communicates with the |
| 147 | microcontroller through the QSPI bus. |
| 148 | |
| 149 | See the |
| 150 | [Building with Device Firmware Upgrade support](#building-with-device-firmware-upgrade-support) |
| 151 | section to learn how to change MCUboot and flash configuration in this example. |
| 152 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 153 | <hr> |
| 154 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 155 | ## Requirements |
| 156 | |
Kamil Kasperczyk | e4ab6f4 | 2021-03-11 15:17:03 +0100 | [diff] [blame] | 157 | The application requires a specific revision of the nRF Connect SDK to work |
| 158 | correctly. See [Setting up the environment](#setting-up-the-environment) for |
| 159 | more information. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 160 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 161 | ### Supported devices |
| 162 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 163 | The example supports building and running on the following devices: |
| 164 | |
Grzegorz Ferenc | a2e3206 | 2023-03-17 20:07:17 +0100 | [diff] [blame] | 165 | | Hardware platform | Build target | Platform image | |
| 166 | | ----------------------------------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 167 | | [nRF52840 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK) | `nrf52840dk/nrf52840` | <details><summary>nRF52840 DK</summary><img src="../../platform/nrfconnect/doc/images/nRF52840_DK_info-medium.jpg" alt="nRF52840 DK"/></details> | |
| 168 | | [nRF5340 DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK) | `nrf5340dk/nrf5340/cpuapp` | <details><summary>nRF5340 DK</summary><img src="../../platform/nrfconnect/doc/images/nRF5340_DK_info-medium.jpg" alt="nRF5340 DK"/></details> | |
| 169 | | [nRF7002 DK](https://www.nordicsemi.com/Products/Development-hardware/nRF7002-DK) | `nrf7002dk/nrf5340/cpuapp` | <details><summary>nRF7002 DK</summary><img src="../../platform/nrfconnect/doc/images/nRF7002-DK_Front-small.png" alt="nRF7002 DK"/></details> | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 170 | |
| 171 | <hr> |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 172 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 173 | ### IPv6 network support |
| 174 | |
| 175 | The development kits for this sample offer the following IPv6 network support |
| 176 | for Matter: |
| 177 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 178 | - Matter over Thread is supported for `nrf52840dk/nrf52840` and |
| 179 | `nrf5340dk/nrf5340/cpuapp`. |
| 180 | - Matter over Wi-Fi is supported for `nrf7002dk/nrf5340/cpuapp`. |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 181 | |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 182 | ## Device UI |
| 183 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 184 | This section lists the User Interface elements that you can use to control and |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 185 | monitor the state of the device. These correspond to PCB components on the |
| 186 | platform image. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 187 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 188 | **LED 1** shows the overall state of the device and its connectivity. The |
| 189 | following states are possible: |
| 190 | |
| 191 | - _Short Flash On (50 ms on/950 ms off)_ — The device is in the |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 192 | unprovisioned (unpaired) state and is waiting for a commissioning |
| 193 | application to connect. |
| 194 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 195 | - _Rapid Even Flashing (100 ms on/100 ms off)_ — The device is in the |
| 196 | unprovisioned state and a commissioning application is connected through |
| 197 | Bluetooth LE. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 198 | |
Damian Królik | 994af3c | 2020-10-12 16:50:50 +0200 | [diff] [blame] | 199 | - _Short Flash Off (950ms on/50ms off)_ — The device is fully |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 200 | provisioned, but does not yet have full connectivity for Thread or Wi-Fi |
| 201 | network. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 202 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 203 | - _Solid On_ — The device is fully provisioned. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 204 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 205 | **LED 2** simulates the lock bolt and shows the state of the lock. The following |
| 206 | states are possible: |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 207 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 208 | - _Solid On_ — The bolt is extended and the door is locked. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 209 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 210 | - _Off_ — The bolt is retracted and the door is unlocked. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 211 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 212 | - _Rapid Even Flashing (100 ms on/100 ms off during 2 s)_ — The |
| 213 | simulated bolt is in motion from one position to another. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 214 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 215 | Additionally, the LED starts blinking evenly (500 ms on/500 ms off) when the |
| 216 | Identify command of the Identify cluster is received on the endpoint 1. The |
| 217 | command’s argument can be used to specify the duration of the effect. |
Krzysztof Taborowski | 6bb7ff6 | 2020-08-21 21:22:46 +0200 | [diff] [blame] | 218 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 219 | **Button 1** can be used for the following purposes: |
Kamil Kasperczyk | 8a84d97 | 2020-10-28 19:57:37 +0100 | [diff] [blame] | 220 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 221 | - _Pressed for less than 3 s_ — Initiates the OTA software update |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 222 | process. This feature is disabled by default, but can be enabled by |
| 223 | following the |
| 224 | [Building with Device Firmware Upgrade support](#building-with-device-firmware-upgrade-support) |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 225 | instructions. |
| 226 | |
| 227 | - _Pressed for more than 3 s_ — initiates the factory reset of the |
| 228 | device. Releasing the button within the 3-second window cancels the factory |
| 229 | reset procedure. |
Kamil Kasperczyk | 005b7ae | 2020-11-05 17:42:51 +0100 | [diff] [blame] | 230 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 231 | **Button 2** — Pressing the button once changes the lock state to the |
| 232 | opposite one. |
Kamil Kasperczyk | 005b7ae | 2020-11-05 17:42:51 +0100 | [diff] [blame] | 233 | |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 234 | - On nRF52840 DK, nRF5340 DK, and nRF21540 DK: Changes the lock state to the |
| 235 | opposite one. |
| 236 | |
| 237 | - On nRF7002 DK: |
| 238 | |
| 239 | - If pressed for less than three seconds, it changes the lock state to the |
| 240 | opposite one. |
| 241 | |
| 242 | - If pressed for more than three seconds, it starts the NFC tag emulation, |
| 243 | enables Bluetooth LE advertising for the predefined period of time (15 |
| 244 | minutes by default), and makes the device discoverable over Bluetooth |
| 245 | LE. |
| 246 | |
| 247 | **Button 4**: |
| 248 | |
| 249 | - On nRF52840 DK, nRF5340 DK, and nRF21540 DK: Starts the NFC tag emulation, |
| 250 | enables Bluetooth LE advertising for the predefined period of time (15 |
| 251 | minutes by default), and makes the device discoverable over Bluetooth LE. |
| 252 | This button is used during the commissioning procedure. |
| 253 | |
| 254 | - On nRF7002 DK: Not available. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 255 | |
| 256 | **SEGGER J-Link USB port** can be used to get logs from the device or |
| 257 | communicate with it using the |
| 258 | [command line interface](../../../docs/guides/nrfconnect_examples_cli.md). |
| 259 | |
| 260 | **NFC port with antenna attached** can be used to start the |
| 261 | [rendezvous](#bluetooth-le-rendezvous) by providing the commissioning |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 262 | information from the Matter device in a data payload that can be shared using |
| 263 | NFC. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 264 | |
| 265 | <hr> |
| 266 | |
| 267 | ## Setting up the environment |
| 268 | |
Grzegorz Ferenc | bae3e7d | 2021-10-19 15:49:45 +0200 | [diff] [blame] | 269 | Before building the example, check out the Matter repository and sync submodules |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 270 | using the following command: |
| 271 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 272 | $ python3 scripts/checkout_submodules.py --shallow --platform nrfconnect |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 273 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 274 | > **Note**: |
| 275 | > |
| 276 | > For Linux operating system install |
| 277 | > [SEGGER J-Link Software](https://www.segger.com/downloads/jlink/#J-LinkSoftwareAndDocumentationPack). |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 278 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 279 | ### Install Command Line Tools |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 280 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 281 | With admin permissions enabled, download and install the |
| 282 | [nRF Command Line Tools](https://www.nordicsemi.com/Products/Development-tools/nrf-command-line-tools). |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 283 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 284 | ### Install Toolchain Manager |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 285 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 286 | Toolchain Manager is available from |
| 287 | [nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop), |
| 288 | a cross-platform tool that provides different applications that simplify |
| 289 | installing the nRF Connect SDK. Both the tool and the application are available |
| 290 | for Windows, Linux, and macOS. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 291 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 292 | To install the Toolchain Manager app, complete the following steps: |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 293 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 294 | 1. [Download nRF Connect for Desktop](https://www.nordicsemi.com/Products/Development-tools/nrf-connect-for-desktop/download#infotabs) |
| 295 | for your operating system. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 296 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 297 | 2. Install and run the tool on your machine. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 298 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 299 | 3. In the **APPS** section, click **Install** button on the Toolchain Manager |
| 300 | tab. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 301 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 302 | ### Install nRF Connect SDK |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 303 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 304 | Complete the following steps to install the nRF Connect SDK: |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 305 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 306 | 1. Open Toolchain Manager in nRF Connect for Desktop. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 307 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 308 | 2. Click the **Install** button next to the |
| 309 | [recommended](../../../config/nrfconnect/.nrfconnect-recommended-revision) |
| 310 | version of the nRF Connect SDK. |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 311 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 312 | 3. A pop-up window will inform you about the current installation directory. If |
| 313 | you want to change the directory, click the **Change directory** button. |
| 314 | Otherwise, click the **Continue installation** button. |
| 315 | |
| 316 | 4. When the nRF Connect SDK is installed on your machine, the **Install** |
| 317 | button changes to the **Open VS Code** button. |
| 318 | |
| 319 | 5. Click the dropdown menu next to the **Open VS Code** button for the |
| 320 | installed nRF Connect SDK version, and select **Open terminal**. |
| 321 | |
| 322 | 6. Make sure that the nRF Connect SDK version is compatible with the Matter SDK |
| 323 | version: |
| 324 | |
| 325 | ``` |
| 326 | $ cd {connectedhomeip directory} |
Kamil Kasperczyk | e4ab6f4 | 2021-03-11 15:17:03 +0100 | [diff] [blame] | 327 | $ python3 scripts/setup/nrfconnect/update_ncs.py --update |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 328 | ``` |
Kamil Kasperczyk | e4ab6f4 | 2021-03-11 15:17:03 +0100 | [diff] [blame] | 329 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 330 | Now you can proceed with the [Building](#building) instruction. |
| 331 | |
| 332 | <hr> |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 333 | |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 334 | ## Building |
| 335 | |
Lipinski Patryk | 907a486 | 2023-11-14 12:07:46 +0100 | [diff] [blame] | 336 | Complete the following steps to build the sample: |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 337 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 338 | 1. Navigate to the example's directory: |
Damian Królik | 994af3c | 2020-10-12 16:50:50 +0200 | [diff] [blame] | 339 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 340 | $ cd examples/lock-app/nrfconnect |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 341 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 342 | 2. Run the following command to build the example, with _build-target_ replaced |
| 343 | with the build target name of the Nordic Semiconductor's kit you own, for |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 344 | example `nrf52840dk/nrf52840`: |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 345 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 346 | $ west build -b build-target --sysbuild |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 347 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 348 | You only need to specify the build target on the first build. See |
| 349 | [Requirements](#requirements) for the build target names of compatible kits. |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 350 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 351 | The output `zephyr.hex` file will be available in the `build/nrfconnect/zephyr/` |
| 352 | directory. |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 353 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 354 | ### Removing build artifacts |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 355 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 356 | If you're planning to build the example for a different kit or make changes to |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 357 | the configuration, remove all build artifacts before building. To do so, use the |
| 358 | following command: |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 359 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 360 | $ rm -r build |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 361 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 362 | ### Building with release configuration |
Damian Królik | 1ace193 | 2020-09-08 17:51:37 +0200 | [diff] [blame] | 363 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 364 | To build the example with release configuration that disables the diagnostic |
| 365 | features like logs and command-line interface, run the following command: |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 366 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 367 | $ west build -b build-target --sysbuild -- -DFILE_SUFFIX=release |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 368 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 369 | Remember to replace _build-target_ with the build target name of the Nordic |
| 370 | Semiconductor's kit you own. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 371 | |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 372 | ### Building with Device Firmware Upgrade support |
| 373 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 374 | Support for DFU using Matter OTA is enabled by default. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 375 | |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 376 | To enable DFU over Bluetooth LE, run the following command with _build-target_ |
| 377 | replaced with the build target name of the Nordic Semiconductor kit you are |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 378 | using (for example `nrf52840dk/nrf52840`): |
Damian Królik | 967d6fd | 2022-03-02 18:37:05 +0100 | [diff] [blame] | 379 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 380 | $ west build -b build-target --sysbuild -- -DCONFIG_CHIP_DFU_OVER_BT_SMP=y |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 381 | |
Kamil Kasperczyk | 109214f | 2021-10-01 15:12:35 +0200 | [diff] [blame] | 382 | > **Note**: |
| 383 | > |
| 384 | > There are two types of Device Firmware Upgrade modes: single-image DFU and |
| 385 | > multi-image DFU. Single-image mode supports upgrading only one firmware image, |
| 386 | > the application image, and should be used for single-core nRF52840 DK devices. |
| 387 | > Multi-image mode allows to upgrade more firmware images and is suitable for |
| 388 | > upgrading the application core and network core firmware in two-core nRF5340 |
| 389 | > DK devices. |
| 390 | |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 391 | #### Changing bootloader configuration |
| 392 | |
Kamil Kasperczyk | fcf08c8 | 2022-04-07 21:41:37 +0200 | [diff] [blame] | 393 | To change the default MCUboot configuration, edit the `prj.conf` file located in |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 394 | the `sysbuild/mcuboot` directory. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 395 | |
Kamil Kasperczyk | 109214f | 2021-10-01 15:12:35 +0200 | [diff] [blame] | 396 | Make sure to keep the configuration consistent with changes made to the |
| 397 | application configuration. This is necessary for the configuration to work, as |
| 398 | the bootloader image is a separate application from the user application and it |
| 399 | has its own configuration file. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 400 | |
| 401 | #### Changing flash memory settings |
| 402 | |
| 403 | In the default configuration, the MCUboot uses the |
| 404 | [Partition Manager](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#partition-manager) |
| 405 | to configure flash partitions used for the bootloader application image slot |
| 406 | purposes. You can change these settings by defining |
| 407 | [static partitions](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/scripts/partition_manager/partition_manager.html#ug-pm-static). |
| 408 | This example uses this option to define using an external flash. |
| 409 | |
| 410 | To modify the flash settings of your board (that is, your _build-target_, for |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 411 | example `nrf52840dk/nrf52840`), edit the `pm_static_<build_target>.yml` file |
| 412 | (for example `pm_static_nrf52840dk_nrf52840.yml`), located in the main |
| 413 | application directory. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 414 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 415 | <hr> |
Damian Królik | 19a520e | 2020-11-16 17:59:16 +0100 | [diff] [blame] | 416 | |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 417 | ## Configuring the example |
| 418 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 419 | The Zephyr ecosystem is based on Kconfig files and the settings can be modified |
| 420 | using the menuconfig utility. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 421 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 422 | To open the menuconfig utility, run the following command from the example |
| 423 | directory: |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 424 | |
Kamil Kasperczyk | 275c8c9 | 2024-07-29 22:09:45 +0200 | [diff] [blame] | 425 | $ west build -b build-target --sysbuild -t menuconfig |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 426 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 427 | Remember to replace _build-target_ with the build target name of the Nordic |
| 428 | Semiconductor's kit you own. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 429 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 430 | Changes done with menuconfig will be lost if the `build` directory is deleted. |
| 431 | To make them persistent, save the configuration options in the `prj.conf` file. |
Kamil Kasperczyk | dcca243 | 2022-04-05 12:46:55 +0200 | [diff] [blame] | 432 | |
| 433 | ### Example build types |
| 434 | |
| 435 | The example uses different configuration files depending on the supported |
| 436 | features. Configuration files are provided for different build types and they |
Kamil Kasperczyk | 3be5bc4 | 2022-04-11 16:28:39 +0200 | [diff] [blame] | 437 | are located in the application root directory. |
Kamil Kasperczyk | dcca243 | 2022-04-05 12:46:55 +0200 | [diff] [blame] | 438 | |
| 439 | The `prj.conf` file represents a debug build type. Other build types are covered |
| 440 | by dedicated files with the build type added as a suffix to the prj part, as per |
| 441 | the following list. For example, the release build type file name is |
| 442 | `prj_release.conf`. If a board has other configuration files, for example |
| 443 | associated with partition layout or child image configuration, these follow the |
| 444 | same pattern. |
| 445 | |
| 446 | Before you start testing the application, you can select one of the build types |
| 447 | supported by the sample. This sample supports the following build types, |
| 448 | depending on the selected board: |
| 449 | |
| 450 | - debug -- Debug version of the application - can be used to enable additional |
| 451 | features for verifying the application behavior, such as logs or |
| 452 | command-line shell. |
| 453 | - release -- Release version of the application - can be used to enable only |
| 454 | the necessary application functionalities to optimize its performance. |
Kamil Kasperczyk | dcca243 | 2022-04-05 12:46:55 +0200 | [diff] [blame] | 455 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 456 | For more information, see the |
| 457 | [Configuring nRF Connect SDK examples](../../../docs/guides/nrfconnect_examples_configuration.md) |
| 458 | page. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 459 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 460 | <hr> |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 461 | |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 462 | ## Flashing and debugging |
| 463 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 464 | To flash the application to the device, use the west tool and run the following |
| 465 | command from the example directory: |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 466 | |
Damian Królik | 35dfbc4 | 2021-04-06 18:54:18 +0200 | [diff] [blame] | 467 | $ west flash --erase |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 468 | |
Łukasz Duda | 4b61b4f | 2021-03-04 21:44:51 +0100 | [diff] [blame] | 469 | If you have multiple development kits connected, west will prompt you to pick |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 470 | the correct one. |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 471 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 472 | To debug the application on target, run the following command from the example |
| 473 | directory: |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 474 | |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 475 | $ west debug |
| 476 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 477 | <hr> |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 478 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 479 | ## Testing the example |
Damian Królik | 34a4a93 | 2020-07-20 20:07:50 +0200 | [diff] [blame] | 480 | |
Damian Królik | ee937e6 | 2020-12-07 15:46:30 +0100 | [diff] [blame] | 481 | Check the [CLI tutorial](../../../docs/guides/nrfconnect_examples_cli.md) to |
| 482 | learn how to use command-line interface of the application. |
Kamil Kasperczyk | 1073ccf | 2021-02-01 17:35:59 +0100 | [diff] [blame] | 483 | |
Kamil Kasperczyk | 3b96652 | 2022-10-10 19:04:49 +0200 | [diff] [blame] | 484 | ### Testing using Linux CHIPTool |
| 485 | |
| 486 | Read the [CHIP Tool user guide](../../../docs/guides/chip_tool_guide.md) to see |
| 487 | how to use [CHIP Tool for Linux or mac OS](../../chip-tool/README.md) to |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 488 | commission and control the application within a Matter-enabled Thread or Wi-Fi |
| 489 | network. |
Kamil Kasperczyk | 3b96652 | 2022-10-10 19:04:49 +0200 | [diff] [blame] | 490 | |
| 491 | ### Testing using Android CHIPTool |
Kamil Kasperczyk | 1073ccf | 2021-02-01 17:35:59 +0100 | [diff] [blame] | 492 | |
| 493 | Read the |
| 494 | [Android commissioning guide](../../../docs/guides/nrfconnect_android_commissioning.md) |
Yufeng Wang | a334714 | 2022-09-29 15:22:36 -0700 | [diff] [blame] | 495 | to see how to use [CHIPTool](../../../examples/android/CHIPTool/README.md) for |
Kamil Kasperczyk | 1073ccf | 2021-02-01 17:35:59 +0100 | [diff] [blame] | 496 | Android smartphones to commission and control the application within a |
Arkadiusz Bałys | e6a1e8e | 2022-11-25 15:50:18 +0100 | [diff] [blame] | 497 | Matter-enabled Thread or Wi-Fi network. |
Kamil Kasperczyk | 329ea7c | 2021-05-10 15:44:39 +0200 | [diff] [blame] | 498 | |
| 499 | ### Testing Device Firmware Upgrade |
| 500 | |
Kamil Kasperczyk | 17821b9 | 2021-06-02 00:10:40 +0200 | [diff] [blame] | 501 | Read the |
| 502 | [DFU tutorial](../../../docs/guides/nrfconnect_examples_software_update.md) to |
| 503 | see how to upgrade your device firmware. |