Following Setup:
1.) Building light-switch-app from original https://github.com/project-chip/connectedhomeip Repo for nRF5340 from command line with nRF SDK v2.1.0
cd <connecthomeip-repo> source scripts/activate.sh source <nrf-sdk-path>/zephyr/zephyr-env.sh cd examples/light-switch-app/nrfconnect west build -b nrf5340dk_nrf5340_cpuapp
2.) Building light-bulb example from nRF SDK with nRF VS Code Extension
Following steps to adapted this example to run on nRF52840 USB Dongle --> (Why is this example not available for nRF52840 USB Dongle out off the box???)
Create a pm_static_nrf52840dongle_nrf52840_no_dfu.yml file in root dir of example. Following content:
settings_storage: address: 0xd8000 size: 0x8000 region: flash_primary open_bootloader: address: 0xe0000 size: 0x20000 region: flash_primary
Create a nrf52840dongle_nrf52840_no_dfu.conf file in boards dir of example. Following content:
# # Copyright (c) 2022 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. # # Configure logging over USB # - do enable shell to reduce flash usage # - disable CDC ACM logs as it may lead to infinite loop when CDC ACM is used as the log backend CONFIG_USB_DEVICE_STACK=y CONFIG_CONSOLE=y CONFIG_UART_CONSOLE=y CONFIG_LOG_BACKEND_UART=y CONFIG_SHELL_LOG_BACKEND=n CONFIG_UART_LINE_CTRL=y CONFIG_USB_CDC_ACM_LOG_LEVEL_OFF=y # The minimal logging mode does not work properly with the USB CDC device, so use the deferred mode CONFIG_LOG_MODE_MINIMAL=n CONFIG_LOG2_MODE_DEFERRED=y CONFIG_LOG_BUFFER_SIZE=8192 # Reduce the code size as the dongle reserves some space for MBR and Open Bootloader CONFIG_ASSERT_VERBOSE=n CONFIG_SHELL=n CONFIG_OPENTHREAD_SHELL=n # Use partition manager to configure the settings partition not to overlap with Open Bootloader CONFIG_PM_SINGLE_IMAGE=y # Disable factory data support. # --> disabled cause nRF create application don't know about these CONFIG_PARMS #CONFIG_CHIP_FACTORY_DATA=n #CONFIG_CHIP_FACTORY_DATA_BUILD=n
Create nrf52840dongle_nrf52840.overlay file in boards dir of example. Following content:
/* * Copyright (c) 2021 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 { zephyr,console = &cdc_acm_uart0; }; }; &zephyr_udc0 { cdc_acm_uart0: cdc_acm_uart0 { compatible = "zephyr,cdc-acm-uart"; label = "CDC_ACM_0"; }; };
Change CMakeLists.txt in root dir of example. File content should look like:
# # Copyright (c) 2021 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # cmake_minimum_required(VERSION 3.20.0) get_filename_component(MATTER_MODULE_ROOT $ENV{ZEPHYR_BASE}/../modules/lib/matter REALPATH) # Set Kconfig root files that will be processed as a first Kconfig for used child images. set(mcuboot_KCONFIG_ROOT ${MATTER_MODULE_ROOT}/config/nrfconnect/chip-module/Kconfig.mcuboot.root) set(multiprotocol_rpmsg_KCONFIG_ROOT ${MATTER_MODULE_ROOT}/config/nrfconnect/chip-module/Kconfig.multiprotocol_rpmsg.root) if(NOT CONF_FILE STREQUAL "prj_no_dfu.conf" AND NOT BOARD STREQUAL "nrf52840dongle_nrf52840") set(PM_STATIC_YML_FILE ${CMAKE_CURRENT_SOURCE_DIR}/configuration/${BOARD}/pm_static_dfu.yml) endif() find_package(Zephyr HINTS $ENV{ZEPHYR_BASE}) project(matter-light-bulb) set(COMMON_ROOT ${ZEPHYR_NRF_MODULE_DIR}/samples/matter/common) set(NLIO_ROOT ${MATTER_MODULE_ROOT}/third_party/nlio/repo) include(${MATTER_MODULE_ROOT}/config/nrfconnect/app/enable-gnu-std.cmake) include(${MATTER_MODULE_ROOT}/src/app/chip_data_model.cmake) # NORDIC SDK APP START target_include_directories(app PRIVATE src ${COMMON_ROOT}/src ${NLIO_ROOT}/include ${MATTER_MODULE_ROOT}/zzz_generated/app-common ) target_sources(app PRIVATE src/app_task.cpp src/lighting_manager.cpp src/main.cpp src/zcl_callbacks.cpp src/zap-generated/IMClusterCommandHandler.cpp src/zap-generated/callback-stub.cpp ${COMMON_ROOT}/src/led_widget.cpp ${COMMON_ROOT}/src/thread_util.cpp ) if(CONFIG_CHIP_OTA_REQUESTOR) target_sources(app PRIVATE ${COMMON_ROOT}/src/ota_util.cpp) endif() if(CONFIG_MCUMGR_SMP_BT) target_sources(app PRIVATE ${COMMON_ROOT}/src/dfu_over_smp.cpp) endif() chip_configure_data_model(app INCLUDE_SERVER ZAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/src/light_bulb.zap ) if (CONFIG_SHELL AND BOARD STREQUAL "nrf52840dongle_nrf52840") target_sources(app PRIVATE ${NRFCONNECT_COMMON}/util/DFUTrigger.cpp) endif() # NORDIC SDK APP END
Change the main.c in src dir of the example. Like this
/* * Copyright (c) 2021 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause */ #include "app_task.h" #include <zephyr/logging/log.h> #if DT_NODE_HAS_COMPAT(DT_CHOSEN(zephyr_console), zephyr_cdc_acm_uart) #include <zephyr/drivers/uart.h> #include <zephyr/usb/usb_device.h> #endif LOG_MODULE_REGISTER(app, CONFIG_MATTER_LOG_LEVEL); using namespace ::chip; #if DT_NODE_HAS_COMPAT(DT_CHOSEN(zephyr_console), zephyr_cdc_acm_uart) static int InitUSB() { int err = usb_enable(nullptr); if (err) { LOG_ERR("Failed to initialize USB device"); return err; } const struct device * dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_console)); uint32_t dtr = 0; while (!dtr) { uart_line_ctrl_get(dev, UART_LINE_CTRL_DTR, &dtr); k_sleep(K_MSEC(100)); } return 0; } #endif int main() { CHIP_ERROR err = CHIP_NO_ERROR; #if DT_NODE_HAS_COMPAT(DT_CHOSEN(zephyr_console), zephyr_cdc_acm_uart) err = System::MapErrorZephyr(InitUSB()); #endif err = GetAppTask().StartApp(); LOG_ERR("Exited with code %" CHIP_ERROR_FORMAT, err.Format()); return err == CHIP_NO_ERROR ? EXIT_SUCCESS : EXIT_FAILURE; }
Now you can build the light-build example for nRF52840 USB Dongle.
Copy the light-bulb application to the nRF52840 by nRF Programmer Tool.
3.) Pair both matter devices to an existing or new created thread-network with chip-tool
4.) Set the ACL access for the light-bulb
sudo ./chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [light-switch-id], "targets": [{"cluster": 6, "endpoint": 1, "deviceType": null}, {"cluster": 8, "endpoint": 1, "deviceType": null}]}]' light-bulb-id 0
There is an error in the chip tool log
1665610428271] [16033:1856894] CHIP: [EM] >>> [E:4373i M:3817318090 (Ack:115418483)] (U) Msg RX from 0:0000000000000000 [0000] --- Type 0000:10 (SecureChannel:StandaloneAck) [1665610428272] [16033:1856894] CHIP: [EM] OnMessageReceived failed, err = ../connectedhomeip/examples/chip-tool/third_party/connectedhomeip/src/messaging/ExchangeMgr.cpp:305: CHIP Error 0x00000070: Unsolicited msg with originator bit clear [1665610428457] [16033:1856854] CHIP: [EM] >>> [E:4374i M:11470867 (Ack:81659602)] (S) Msg RX from 1:0000000000000100 [0BB5] --- Type 0001:07 (IM:WriteResponse)
5.) Create the binding to cluster 6 and cluster 8 for the light-switch
sudo ./chip-tool binding write binding '[{"fabricIndex": 1, "node": light-bulb-id, "endpoint": 1, "cluster": 6}, {"fabricIndex": 1, "node": light-bulb-id, "endpoint": 1, "cluster": 8}]' light-switch-id 1
There is an error in the Log of the light-switch application (nRF5340DK) during the binding:
I: 327706 [EM]<<< [E:47538i M:132360026 (Ack:3817318092)] (U) Msg TX to 0:0000000000000000 [0000] --- Type 0000:10 (SecureChannel:StandaloneAck) I: 327719 [IN](U) Sending msg 132360026 to IP address 'UDP:[fdf9:547d:593b:1:cd8:1a0f:d500:29a2]:5540' D: 327729 [EM]Flushed pending ack for MessageCounter:3817318092 on exchange 47538i I: 327737 [EM]>>> [E:47538i M:3817318093 (Ack:132360023)] (U) Msg RX from 0:0000000000000000 [0000] --- Ty pe 0000:10 (SecureChannel:StandaloneAck) E: 327750 [EM]OnMessageReceived failed, err = 70
6.) Press the button 2 of the nRF5340DK Board to toggle the light-bulb on the nRF52840 Dongle. (works).
7.) Press button 2 for longer time to dim the LED of the light-bulb --> That doesn't work (seems to be a binding error)
I: 397578 [DMG]Received Command Response Status for Endpoint=1 Cluster=0x0000_0008 Command=0x0000_0000 Sta tus=0x85 E: Binding command was not applied! Reason: 585