From 5db311f44d6665d80b9338df19a3c7159e53fee8 Mon Sep 17 00:00:00 2001 From: Nerivec <62446222+Nerivec@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:04:14 +0100 Subject: [PATCH] Reset to nabucasa, with reconfigured manifests. (#8) --- .github/workflows/build.yaml | 20 +- Dockerfile | 17 +- README.md | 30 +- .../aeotec/aeotec_zga008_openthread_rcp.yaml | 33 + .../aeotec/aeotec_zga008_zigbee_ncp.yaml | 50 + .../easyiot_zb-gw04-1v1_openthread_rcp.yaml | 36 + .../easyiot_zb-gw04-1v1_zigbee_ncp.yaml | 51 + .../easyiot_zb-gw04-1v2_openthread_rcp.yaml | 33 + .../easyiot_zb-gw04-1v2_zigbee_ncp.yaml | 50 + .../easyiot/easyiot_zb-gw04_bootloader.yaml | 33 + ...ml => nabucasa_skyconnect_bootloader.yaml} | 2 +- ...> nabucasa_skyconnect_openthread_rcp.yaml} | 11 +- ...ml => nabucasa_skyconnect_zigbee_ncp.yaml} | 33 +- ...r.yaml => nabucasa_yellow_bootloader.yaml} | 2 +- ...ml => nabucasa_yellow_openthread_rcp.yaml} | 11 +- ...p.yaml => nabucasa_yellow_zigbee_ncp.yaml} | 33 +- ...e_stick.yaml => nabucasa_zwave_stick.yaml} | 2 +- .../smlight_slzb06m_opentread_rcp.yaml | 36 + .../smlight/smlight_slzb06m_zigbee_ncp.yaml | 51 + .../smlight_slzb07Mg24_bootloader.yaml | 33 + .../smlight_slzb07Mg24_opentread_rcp.yaml | 33 + .../smlight_slzb07Mg24_zigbee_ncp.yaml | 51 + .../smlight/smlight_slzb07_bootloader.yaml | 33 + .../smlight/smlight_slzb07_opentread_rcp.yaml | 33 + .../smlight/smlight_slzb07_zigbee_ncp.yaml | 50 + .../sonoff_zbdonglee_openthread_rcp.yaml | 36 + .../sonoff/sonoff_zbdonglee_zigbee_ncp.yaml | 51 + .../sonoff_zbdonglee_zigbee_router.yaml | 100 + .../sparkfun/sparkfun_mgm240p_bootloader.yaml | 33 + .../sparkfun_mgm240p_openthread_rcp.yaml | 36 + .../sparkfun/sparkfun_mgm240p_zigbee_ncp.yaml | 51 + .../tubeszb/tubeszb-mgm24-openthread_rcp.yaml | 33 + .../tubeszb/tubeszb-mgm24-zigbee_ncp.yaml | 51 + .../tubeszb-mgm24PB-openthread_rcp.yaml | 33 + .../tubeszb/tubeszb-mgm24PB-zigbee_ncp.yaml | 51 + .../tubeszb/tubeszb_MGM240PB_bootloader.yaml | 33 + src/openthread_rcp/app.c | 86 +- src/openthread_rcp/app.h | 37 +- src/openthread_rcp/main.c | 75 +- src/openthread_rcp/openthread_rcp.slcp | 6 +- src/openthread_rcp/reset_util.h | 4 +- src/zigbee_ncp/app.c | 401 +- src/zigbee_ncp/config/xncp_config.h | 20 - src/zigbee_ncp/main.c | 2 +- src/zigbee_ncp/zigbee_ncp.slcp | 25 +- src/zigbee_router/app.c | 250 ++ src/zigbee_router/config/zcl/zcl_config.zap | 3777 +++++++++++++++++ src/zigbee_router/main.c | 74 + src/zigbee_router/zigbee_router.slcp | 123 + tools/build_project.py | 134 +- tools/create_gbl.py | 30 +- 51 files changed, 5731 insertions(+), 588 deletions(-) create mode 100644 manifests/aeotec/aeotec_zga008_openthread_rcp.yaml create mode 100644 manifests/aeotec/aeotec_zga008_zigbee_ncp.yaml create mode 100644 manifests/easyiot/easyiot_zb-gw04-1v1_openthread_rcp.yaml create mode 100644 manifests/easyiot/easyiot_zb-gw04-1v1_zigbee_ncp.yaml create mode 100644 manifests/easyiot/easyiot_zb-gw04-1v2_openthread_rcp.yaml create mode 100644 manifests/easyiot/easyiot_zb-gw04-1v2_zigbee_ncp.yaml create mode 100644 manifests/easyiot/easyiot_zb-gw04_bootloader.yaml rename manifests/nabucasa/{skyconnect_bootloader.yaml => nabucasa_skyconnect_bootloader.yaml} (95%) rename manifests/nabucasa/{skyconnect_openthread_rcp.yaml => nabucasa_skyconnect_openthread_rcp.yaml} (78%) rename manifests/nabucasa/{skyconnect_zigbee_ncp.yaml => nabucasa_skyconnect_zigbee_ncp.yaml} (58%) rename manifests/nabucasa/{yellow_bootloader.yaml => nabucasa_yellow_bootloader.yaml} (95%) rename manifests/nabucasa/{yellow_openthread_rcp.yaml => nabucasa_yellow_openthread_rcp.yaml} (80%) rename manifests/nabucasa/{yellow_zigbee_ncp.yaml => nabucasa_yellow_zigbee_ncp.yaml} (60%) rename manifests/nabucasa/{zwave_stick.yaml => nabucasa_zwave_stick.yaml} (97%) create mode 100644 manifests/smlight/smlight_slzb06m_opentread_rcp.yaml create mode 100644 manifests/smlight/smlight_slzb06m_zigbee_ncp.yaml create mode 100644 manifests/smlight/smlight_slzb07Mg24_bootloader.yaml create mode 100644 manifests/smlight/smlight_slzb07Mg24_opentread_rcp.yaml create mode 100644 manifests/smlight/smlight_slzb07Mg24_zigbee_ncp.yaml create mode 100644 manifests/smlight/smlight_slzb07_bootloader.yaml create mode 100644 manifests/smlight/smlight_slzb07_opentread_rcp.yaml create mode 100644 manifests/smlight/smlight_slzb07_zigbee_ncp.yaml create mode 100644 manifests/sonoff/sonoff_zbdonglee_openthread_rcp.yaml create mode 100644 manifests/sonoff/sonoff_zbdonglee_zigbee_ncp.yaml create mode 100644 manifests/sonoff/sonoff_zbdonglee_zigbee_router.yaml create mode 100644 manifests/sparkfun/sparkfun_mgm240p_bootloader.yaml create mode 100644 manifests/sparkfun/sparkfun_mgm240p_openthread_rcp.yaml create mode 100644 manifests/sparkfun/sparkfun_mgm240p_zigbee_ncp.yaml create mode 100644 manifests/tubeszb/tubeszb-mgm24-openthread_rcp.yaml create mode 100644 manifests/tubeszb/tubeszb-mgm24-zigbee_ncp.yaml create mode 100644 manifests/tubeszb/tubeszb-mgm24PB-openthread_rcp.yaml create mode 100644 manifests/tubeszb/tubeszb-mgm24PB-zigbee_ncp.yaml create mode 100644 manifests/tubeszb/tubeszb_MGM240PB_bootloader.yaml delete mode 100644 src/zigbee_ncp/config/xncp_config.h create mode 100644 src/zigbee_router/app.c create mode 100644 src/zigbee_router/config/zcl/zcl_config.zap create mode 100644 src/zigbee_router/main.c create mode 100644 src/zigbee_router/zigbee_router.slcp diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index edfcfd74..aa706f1e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -21,8 +21,8 @@ jobs: name: Run pre-commit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 - name: Install pre-commit run: | pip install pre-commit @@ -37,9 +37,9 @@ jobs: permissions: packages: write steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4 - name: Log in to the GitHub container registry - uses: docker/login-action@v3.1.0 + uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.repository_owner }} @@ -85,10 +85,10 @@ jobs: echo "image_name=$image_name" >> $GITHUB_OUTPUT echo "container_name=${{ env.REGISTRY }}/$image_name:$tag_name" >> $GITHUB_OUTPUT - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.3.0 + uses: docker/setup-buildx-action@v3 if: steps.read-repo-info.outputs.build_image == 'true' - name: Build and Push - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v6 if: steps.read-repo-info.outputs.build_image == 'true' with: context: . @@ -109,7 +109,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4 - id: set-matrix run: | echo "matrix=$(find manifests -type f \( -name "*.yaml" -o -name "*.yml" \) -print | sort | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT @@ -125,7 +125,7 @@ jobs: matrix: manifest: ${{ fromJson(needs.list-manifests.outputs.matrix) }} steps: - - uses: actions/checkout@v4.1.4 + - uses: actions/checkout@v4 - name: Install SDK extensions run: | @@ -181,7 +181,7 @@ jobs: apt-get install -y nodejs - name: Upload artifact - uses: actions/upload-artifact@v4.3.3 + uses: actions/upload-artifact@v4 with: name: firmware-build-${{ steps.build-firmware.outputs.output_basename }} path: outputs/* @@ -204,6 +204,6 @@ jobs: pattern: firmware-build-* - name: Upload artifacts - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: files: artifacts/*.gbl diff --git a/Dockerfile b/Dockerfile index c8cedaa4..5fdb844f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,7 +39,7 @@ RUN \ ENV PATH="$PATH:/opt/slc_cli" -# GCC Embedded Toolchain 12.2.rel1 (for Gecko SDK 4.4.0+) +# GCC Embedded Toolchain 12.2.rel1 (for Simplicity SDK) RUN \ curl -O https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz \ && tar -C /opt -xf arm-gnu-toolchain-12.2.rel1-x86_64-arm-none-eabi.tar.xz \ @@ -51,18 +51,11 @@ RUN \ && unzip -q -d simplicity_sdk_2024.6.2 simplicity_sdk_2024.6.2.zip \ && rm simplicity_sdk_2024.6.2.zip -# Gecko SDK 4.4.4 +# ZCL Advanced Platform (ZAP) v2024.10.24 RUN \ - curl -o gecko_sdk_4.4.4.zip -L https://github.com/SiliconLabs/gecko_sdk/releases/download/v4.4.4/gecko-sdk.zip \ - && unzip -q -d gecko_sdk_4.4.4 gecko_sdk_4.4.4.zip \ - && rm gecko_sdk_4.4.4.zip - -# ZCL Advanced Platform (ZAP) v2024.09.27 -RUN \ - curl -o zap_2024.09.27.zip -L https://github.com/project-chip/zap/releases/download/v2024.09.27/zap-linux-x64.zip \ - && unzip -q -d /opt/zap zap_2024.09.27.zip \ - && rm zap_2024.09.27.zip - + curl -o zap_2024.10.24.zip -L https://github.com/project-chip/zap/releases/download/v2024.10.24/zap-linux-x64.zip \ + && unzip -q -d /opt/zap zap_2024.10.24.zip \ + && rm zap_2024.10.24.zip ENV STUDIO_ADAPTER_PACK_PATH="/opt/zap" ARG USERNAME=builder diff --git a/README.md b/README.md index e3aaf22a..a0b50e22 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,8 @@ ZBT-1/SkyConnect and the Home Assistant Yellow's IEEE 802.15.4 radio. The firmwa manifests are entirely generic, however, and are intended to be written easily for any Silicon Labs EFR32 device. -It uses the Silicon Labs Gecko SDK and proprietary Silicon Labs tools such as the -Silicon Labs Configurator (slc) and the Simplicity Commander standalone utility. +It uses the Silicon Labs Gecko/Simplicity SDK and proprietary Silicon Labs tools such as +the Silicon Labs Configurator (slc) and the Simplicity Commander standalone utility. ## Background The project templates in this repository are configured and built for specific boards @@ -14,34 +14,32 @@ manifest file configures the Zigbee firmware for the SkyConnect/Connect ZBT-1. ## Setting up Simplicity Studio (for development) If you are going to be developing using Simplicity Studio, note that each project can -potentially use a different Gecko SDK release. It is recommended to forego the typical +potentially use a different Simplicity SDK release. It is recommended to forego the typical Simplicity Studio SDK management workflow and manually manage SDKs: -1. Clone a specific version of the Gecko SDK: +1. Clone a specific version of the Simplicity SDK: ```bash # For macOS - mkdir ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2 - cd ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2 + mkdir ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.2 + cd ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.2 - git clone -b v4.4.2 https://github.com/SiliconLabs/gecko_sdk . + git clone -b v2024.6.2 https://github.com/SiliconLabs/simplicity_sdk . git checkout -b branch_tag ``` 2. Open preferences, navigate to **Simplicity Studio > SDKs**, click the `Add SDK...` button, and browse to the above location. -3. Once the SDK is added, select its entry and click `Add Extension...`. -4. In this repo, add the extensions under `gecko_sdk_extensions`. Repeat this process for every necessary SDK version. > [!TIP] > If you have build issues after switching commits, make sure to delete any -> `gecko_sdk_*` and `template` folders from the Simplicity working tree. +> `simplicity_sdk_*`, `gecko_sdk_*`, and `template` folders from the project working tree. ## Building with a firmware manifest (for building device firmware) Command line building requires: - [`slc-cli`](https://docs.silabs.com/simplicity-studio-5-users-guide/latest/ss-5-users-guide-tools-slc-cli/02-installation) - [Simplicity Commander](https://www.silabs.com/developers/mcu-programming-options) (`commander`) -- The exact Gecko SDK version required by the project. Note that this doesn't have to be a Git working tree, you can use [a GitHub release](https://github.com/SiliconLabs/gecko_sdk/releases). +- The exact Simplicity SDK version required by the project. Note that this doesn't have to be a Git working tree, you can use [a GitHub release](https://github.com/SiliconLabs/gecko_sdk/releases). - A compatible toolchain. Take a look at the `Dockerfile` for the necessary toolchains. > [!TIP] @@ -57,8 +55,8 @@ Command line building requires: SDK extensions for every SDK you plan to use: ```bash -slc signature trust --sdk ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2 -slc signature trust --sdk ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2 --extension-path ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2/extension/nc_efr32_watchdog_extension +slc signature trust --sdk ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.2 +slc signature trust --sdk ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.2 --extension-path ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.2/extension/nc_efr32_watchdog_extension ``` `tools/build_project.py` is the main entry point for building firmwares. Provide paths @@ -73,9 +71,9 @@ tool will automatically determine which SDK and toolchain to use. pip install ruamel.yaml # Only dependency python tools/build_project.py \ - # The following SDK and toolchain flags can be omitted on macOS - --sdk ~/SimplicityStudio/SDKs/gecko_sdk_4.4.0 \ - --sdk ~/SimplicityStudio/SDKs/gecko_sdk_4.4.2 \ + # The following SDK and toolchain flags can be omitted on macOS, they are all autodetected + --sdk ~/SimplicityStudio/SDKs/gecko_sdk_4.4.4 \ + --sdk ~/SimplicityStudio/SDKs/simplicity_sdk_2024.6.0 \ --toolchain '/Applications/Simplicity Studio.app/Contents/Eclipse/developer/toolchains/gnu_arm/10.3_2021.10' \ --toolchain '/Applications/Simplicity Studio.app/Contents/Eclipse/developer/toolchains/gnu_arm/12.2.rel1_2023.7' \ diff --git a/manifests/aeotec/aeotec_zga008_openthread_rcp.yaml b/manifests/aeotec/aeotec_zga008_openthread_rcp.yaml new file mode 100644 index 00000000..ce8c12c7 --- /dev/null +++ b/manifests/aeotec/aeotec_zga008_openthread_rcp.yaml @@ -0,0 +1,33 @@ +name: ZGA008 OpenThread RCP +device: EFR32MG21A020F1024IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 5 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 6 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortC + SL_UARTDRV_USART_VCOM_CTS_PIN: 1 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RTS_PIN: 4 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/aeotec/aeotec_zga008_zigbee_ncp.yaml b/manifests/aeotec/aeotec_zga008_zigbee_ncp.yaml new file mode 100644 index 00000000..a9cddb35 --- /dev/null +++ b/manifests/aeotec/aeotec_zga008_zigbee_ncp.yaml @@ -0,0 +1,50 @@ +name: ZGA008 Zigbee +device: EFR32MG21A020F1024IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortC + SL_IOSTREAM_USART_VCOM_CTS_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RTS_PIN: 4 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 254 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/easyiot/easyiot_zb-gw04-1v1_openthread_rcp.yaml b/manifests/easyiot/easyiot_zb-gw04-1v1_openthread_rcp.yaml new file mode 100644 index 00000000..d1bd86c4 --- /dev/null +++ b/manifests/easyiot/easyiot_zb-gw04-1v1_openthread_rcp.yaml @@ -0,0 +1,36 @@ +name: ZB-GW04-1v1 OpenThread RCP +device: EFR32MG21A020F768IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 230400 + fw_variant: no_flow + +c_defines: + SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlNone + + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 230400 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_TX_PIN: 1 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_RX_PIN: 0 + + SL_UARTDRV_USART_VCOM_CTS_PORT: 0 + SL_UARTDRV_USART_VCOM_CTS_PIN: 0 + + SL_UARTDRV_USART_VCOM_RTS_PORT: 0 + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/easyiot/easyiot_zb-gw04-1v1_zigbee_ncp.yaml b/manifests/easyiot/easyiot_zb-gw04-1v1_zigbee_ncp.yaml new file mode 100644 index 00000000..5596d299 --- /dev/null +++ b/manifests/easyiot/easyiot_zb-gw04-1v1_zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: ZB-GW04-1v1 Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + fw_variant: sw_flow + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: uartFlowControlSoftware + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_TX_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RX_PIN: 0 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_CTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/easyiot/easyiot_zb-gw04-1v2_openthread_rcp.yaml b/manifests/easyiot/easyiot_zb-gw04-1v2_openthread_rcp.yaml new file mode 100644 index 00000000..8d5e930b --- /dev/null +++ b/manifests/easyiot/easyiot_zb-gw04-1v2_openthread_rcp.yaml @@ -0,0 +1,33 @@ +name: ZB-GW04-1v2 OpenThread RCP +device: EFR32MG21A020F768IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 230400 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 230400 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_TX_PIN: 1 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_RX_PIN: 0 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortD + SL_UARTDRV_USART_VCOM_CTS_PIN: 3 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortD + SL_UARTDRV_USART_VCOM_RTS_PIN: 4 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/easyiot/easyiot_zb-gw04-1v2_zigbee_ncp.yaml b/manifests/easyiot/easyiot_zb-gw04-1v2_zigbee_ncp.yaml new file mode 100644 index 00000000..478664a5 --- /dev/null +++ b/manifests/easyiot/easyiot_zb-gw04-1v2_zigbee_ncp.yaml @@ -0,0 +1,50 @@ +name: ZB-GW04-1v2 Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_TX_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RX_PIN: 0 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortD + SL_IOSTREAM_USART_VCOM_CTS_PIN: 3 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortD + SL_IOSTREAM_USART_VCOM_RTS_PIN: 4 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/easyiot/easyiot_zb-gw04_bootloader.yaml b/manifests/easyiot/easyiot_zb-gw04_bootloader.yaml new file mode 100644 index 00000000..68bf67c4 --- /dev/null +++ b/manifests/easyiot/easyiot_zb-gw04_bootloader.yaml @@ -0,0 +1,33 @@ +name: ZB-GW04 Bootloader +device: EFR32MG21A020F768IM32 +base_project: src/bootloader +filename: "{manifest_name}_{gecko_bootloader_version}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: gecko-bootloader + gecko_bootloader_version: dynamic + baudrate: 115200 + +c_defines: + SL_SERIAL_UART_FLOW_CONTROL: 0 + + SL_SERIAL_UART_PERIPHERAL: USART0 + SL_SERIAL_UART_PERIPHERAL_NO: 0 + + SL_SERIAL_UART_TX_PORT: gpioPortB + SL_SERIAL_UART_TX_PIN: 1 + + SL_SERIAL_UART_RX_PORT: gpioPortB + SL_SERIAL_UART_RX_PIN: 0 + + SL_SERIAL_UART_CTS_PORT: 0 + SL_SERIAL_UART_CTS_PIN: 0 + + SL_SERIAL_UART_RTS_PORT: 0 + SL_SERIAL_UART_RTS_PIN: 0 + + SL_GPIO_ACTIVATION_POLARITY: LOW + SL_BTL_BUTTON_PORT: gpioPortA + SL_BTL_BUTTON_PIN: 0 \ No newline at end of file diff --git a/manifests/nabucasa/skyconnect_bootloader.yaml b/manifests/nabucasa/nabucasa_skyconnect_bootloader.yaml similarity index 95% rename from manifests/nabucasa/skyconnect_bootloader.yaml rename to manifests/nabucasa/nabucasa_skyconnect_bootloader.yaml index b6547fb9..e8cc478a 100644 --- a/manifests/nabucasa/skyconnect_bootloader.yaml +++ b/manifests/nabucasa/nabucasa_skyconnect_bootloader.yaml @@ -2,7 +2,7 @@ name: SkyConnect Bootloader device: EFR32MG21A020F512IM32 base_project: src/bootloader filename: "{manifest_name}_{gecko_bootloader_version}" -sdk: "gecko_sdk:4.4.4" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: diff --git a/manifests/nabucasa/skyconnect_openthread_rcp.yaml b/manifests/nabucasa/nabucasa_skyconnect_openthread_rcp.yaml similarity index 78% rename from manifests/nabucasa/skyconnect_openthread_rcp.yaml rename to manifests/nabucasa/nabucasa_skyconnect_openthread_rcp.yaml index 284e2993..6f674a46 100644 --- a/manifests/nabucasa/skyconnect_openthread_rcp.yaml +++ b/manifests/nabucasa/nabucasa_skyconnect_openthread_rcp.yaml @@ -1,13 +1,13 @@ name: SkyConnect OpenThread RCP device: EFR32MG21A020F512IM32 base_project: src/openthread_rcp -filename: "{manifest_name}_{ot_rcp_version.split('/')[-1]}_gsdk_{sdk_version}" -sdk: "gecko_sdk:4.4.4" +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: fw_type: openthread_rcp - ot_rcp_version: dynamic + ot_version: dynamic baudrate: 460800 c_defines: @@ -28,3 +28,8 @@ c_defines: SL_UARTDRV_USART_VCOM_RTS_PIN: 0 SL_APPLICATION_PRODUCT_ID: '{0xE9, 0x92, 0x67, 0x94, 0xBB, 0x2C, 0x4E, 0xC8, 0x9F, 0x36, 0xD9, 0xC6, 0x79, 0x4A, 0x81, 0xFB}' + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 133 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/nabucasa/skyconnect_zigbee_ncp.yaml b/manifests/nabucasa/nabucasa_skyconnect_zigbee_ncp.yaml similarity index 58% rename from manifests/nabucasa/skyconnect_zigbee_ncp.yaml rename to manifests/nabucasa/nabucasa_skyconnect_zigbee_ncp.yaml index 44d707f1..d28f723d 100644 --- a/manifests/nabucasa/skyconnect_zigbee_ncp.yaml +++ b/manifests/nabucasa/nabucasa_skyconnect_zigbee_ncp.yaml @@ -1,8 +1,8 @@ name: SkyConnect Zigbee device: EFR32MG21A020F512IM32 base_project: src/zigbee_ncp -filename: "{manifest_name}_{ezsp_version}" -sdk: "gecko_sdk:4.4.4" +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: @@ -10,18 +10,13 @@ gbl: ezsp_version: dynamic baudrate: 115200 -configuration: - EMBER_CHILD_TABLE_SIZE: 32 +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 c_defines: - EMBER_APS_UNICAST_MESSAGE_COUNT: 32 - EMBER_BINDING_TABLE_SIZE: 32 - EMBER_BROADCAST_TABLE_SIZE: 64 - EMBER_KEY_TABLE_SIZE: 12 - EMBER_MAX_END_DEVICE_CHILDREN: 32 - EMBER_PACKET_BUFFER_COUNT: 255 - EMBER_SOURCE_ROUTE_TABLE_SIZE: 200 - SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts @@ -41,3 +36,17 @@ c_defines: SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 SL_APPLICATION_PRODUCT_ID: '{0xE9, 0x92, 0x67, 0x94, 0xBB, 0x2C, 0x4E, 0xC8, 0x9F, 0x36, 0xD9, 0xC6, 0x79, 0x4A, 0x81, 0xFB}' + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 133 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/nabucasa/yellow_bootloader.yaml b/manifests/nabucasa/nabucasa_yellow_bootloader.yaml similarity index 95% rename from manifests/nabucasa/yellow_bootloader.yaml rename to manifests/nabucasa/nabucasa_yellow_bootloader.yaml index 2859c852..6f9a1704 100644 --- a/manifests/nabucasa/yellow_bootloader.yaml +++ b/manifests/nabucasa/nabucasa_yellow_bootloader.yaml @@ -2,7 +2,7 @@ name: Yellow Bootloader device: MGM210PA32JIA base_project: src/bootloader filename: "{manifest_name}_{gecko_bootloader_version}" -sdk: "gecko_sdk:4.4.4" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: diff --git a/manifests/nabucasa/yellow_openthread_rcp.yaml b/manifests/nabucasa/nabucasa_yellow_openthread_rcp.yaml similarity index 80% rename from manifests/nabucasa/yellow_openthread_rcp.yaml rename to manifests/nabucasa/nabucasa_yellow_openthread_rcp.yaml index d0ee8200..569beaac 100644 --- a/manifests/nabucasa/yellow_openthread_rcp.yaml +++ b/manifests/nabucasa/nabucasa_yellow_openthread_rcp.yaml @@ -1,13 +1,13 @@ name: Yellow OpenThread RCP device: MGM210PA32JIA base_project: src/openthread_rcp -filename: "{manifest_name}_{ot_rcp_version.split('/')[-1]}_gsdk_{sdk_version}" -sdk: "gecko_sdk:4.4.4" +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: fw_type: openthread_rcp - ot_rcp_version: dynamic + ot_version: dynamic baudrate: 460800 add_components: @@ -34,3 +34,8 @@ c_defines: SL_SIMPLE_LED_BOARD_ACTIVITY_POLARITY: SL_SIMPLE_LED_POLARITY_ACTIVE_LOW SL_SIMPLE_LED_BOARD_ACTIVITY_PORT: gpioPortB SL_SIMPLE_LED_BOARD_ACTIVITY_PIN: 1 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 133 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/nabucasa/yellow_zigbee_ncp.yaml b/manifests/nabucasa/nabucasa_yellow_zigbee_ncp.yaml similarity index 60% rename from manifests/nabucasa/yellow_zigbee_ncp.yaml rename to manifests/nabucasa/nabucasa_yellow_zigbee_ncp.yaml index 1cbdd0ae..2f5340c2 100644 --- a/manifests/nabucasa/yellow_zigbee_ncp.yaml +++ b/manifests/nabucasa/nabucasa_yellow_zigbee_ncp.yaml @@ -1,8 +1,8 @@ name: Yellow Zigbee device: MGM210PA32JIA base_project: src/zigbee_ncp -filename: "{manifest_name}_{ezsp_version}" -sdk: "gecko_sdk:4.4.4" +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" toolchain: "12.2.1.20221205" gbl: @@ -14,18 +14,13 @@ add_components: - id: simple_led instance: [board_activity] -configuration: - EMBER_CHILD_TABLE_SIZE: 32 +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 c_defines: - EMBER_APS_UNICAST_MESSAGE_COUNT: 32 - EMBER_BINDING_TABLE_SIZE: 32 - EMBER_BROADCAST_TABLE_SIZE: 64 - EMBER_KEY_TABLE_SIZE: 12 - EMBER_MAX_END_DEVICE_CHILDREN: 32 - EMBER_PACKET_BUFFER_COUNT: 255 - EMBER_SOURCE_ROUTE_TABLE_SIZE: 200 - SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts @@ -47,3 +42,17 @@ c_defines: SL_SIMPLE_LED_BOARD_ACTIVITY_POLARITY: SL_SIMPLE_LED_POLARITY_ACTIVE_LOW SL_SIMPLE_LED_BOARD_ACTIVITY_PORT: gpioPortB SL_SIMPLE_LED_BOARD_ACTIVITY_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 133 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/nabucasa/zwave_stick.yaml b/manifests/nabucasa/nabucasa_zwave_stick.yaml similarity index 97% rename from manifests/nabucasa/zwave_stick.yaml rename to manifests/nabucasa/nabucasa_zwave_stick.yaml index f48ffc2b..f9028e32 100644 --- a/manifests/nabucasa/zwave_stick.yaml +++ b/manifests/nabucasa/nabucasa_zwave_stick.yaml @@ -25,4 +25,4 @@ c_defines: SERIAL_API_TX_PIN: 8 SERIAL_API_RX_PORT: gpioPortA - SERIAL_API_RX_PIN: 9 \ No newline at end of file + SERIAL_API_RX_PIN: 9 diff --git a/manifests/smlight/smlight_slzb06m_opentread_rcp.yaml b/manifests/smlight/smlight_slzb06m_opentread_rcp.yaml new file mode 100644 index 00000000..aaa44141 --- /dev/null +++ b/manifests/smlight/smlight_slzb06m_opentread_rcp.yaml @@ -0,0 +1,36 @@ +name: SLZB-06M OpenThread RCP +device: EFR32MG21A020F768IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + fw_variant: no_flow + +c_defines: + SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlNone + + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 6 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 5 + + SL_UARTDRV_USART_VCOM_CTS_PORT: 0 + SL_UARTDRV_USART_VCOM_CTS_PIN: 0 + + SL_UARTDRV_USART_VCOM_RTS_PORT: 0 + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 80 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/smlight/smlight_slzb06m_zigbee_ncp.yaml b/manifests/smlight/smlight_slzb06m_zigbee_ncp.yaml new file mode 100644 index 00000000..78678e2a --- /dev/null +++ b/manifests/smlight/smlight_slzb06m_zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: SLZB-06M Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + fw_variant: sw_flow + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: uartFlowControlSoftware + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_TX_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RX_PIN: 0 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_CTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 80 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/smlight/smlight_slzb07Mg24_bootloader.yaml b/manifests/smlight/smlight_slzb07Mg24_bootloader.yaml new file mode 100644 index 00000000..f3ff1add --- /dev/null +++ b/manifests/smlight/smlight_slzb07Mg24_bootloader.yaml @@ -0,0 +1,33 @@ +name: SLZB-07Mg24 Bootloader +device: EFR32MG24A020F1024IM40 +base_project: src/bootloader +filename: "{manifest_name}_{gecko_bootloader_version}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: gecko-bootloader + gecko_bootloader_version: dynamic + baudrate: 115200 + +c_defines: + SL_SERIAL_UART_FLOW_CONTROL: 1 + + SL_SERIAL_UART_PERIPHERAL: USART0 + SL_SERIAL_UART_PERIPHERAL_NO: 0 + + SL_SERIAL_UART_TX_PORT: gpioPortA + SL_SERIAL_UART_TX_PIN: 6 + + SL_SERIAL_UART_RX_PORT: gpioPortA + SL_SERIAL_UART_RX_PIN: 5 + + SL_SERIAL_UART_CTS_PORT: gpioPortB + SL_SERIAL_UART_CTS_PIN: 1 + + SL_SERIAL_UART_RTS_PORT: gpioPortB + SL_SERIAL_UART_RTS_PIN: 0 + + SL_GPIO_ACTIVATION_POLARITY: LOW + SL_BTL_BUTTON_PORT: gpioPortA + SL_BTL_BUTTON_PIN: 0 diff --git a/manifests/smlight/smlight_slzb07Mg24_opentread_rcp.yaml b/manifests/smlight/smlight_slzb07Mg24_opentread_rcp.yaml new file mode 100644 index 00000000..f10d65c0 --- /dev/null +++ b/manifests/smlight/smlight_slzb07Mg24_opentread_rcp.yaml @@ -0,0 +1,33 @@ +name: SLZB-07Mg24 OpenThread RCP +device: EFR32MG24A020F1024IM40 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 6 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 5 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_CTS_PIN: 1 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/smlight/smlight_slzb07Mg24_zigbee_ncp.yaml b/manifests/smlight/smlight_slzb07Mg24_zigbee_ncp.yaml new file mode 100644 index 00000000..a89dc1ce --- /dev/null +++ b/manifests/smlight/smlight_slzb07Mg24_zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: SLZB-07Mg24 Zigbee +device: EFR32MG24A020F1024IM40 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 64 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 16 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_CTS_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 128 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 254 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 64 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + SL_ZIGBEE_APS_DUPLICATE_REJECTION_MAX_ENTRIES: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/smlight/smlight_slzb07_bootloader.yaml b/manifests/smlight/smlight_slzb07_bootloader.yaml new file mode 100644 index 00000000..6f57fcae --- /dev/null +++ b/manifests/smlight/smlight_slzb07_bootloader.yaml @@ -0,0 +1,33 @@ +name: SLZB-07 Bootloader +device: EFR32MG21A020F768IM32 +base_project: src/bootloader +filename: "{manifest_name}_{gecko_bootloader_version}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: gecko-bootloader + gecko_bootloader_version: dynamic + baudrate: 115200 + +c_defines: + SL_SERIAL_UART_FLOW_CONTROL: 1 + + SL_SERIAL_UART_PERIPHERAL: USART0 + SL_SERIAL_UART_PERIPHERAL_NO: 0 + + SL_SERIAL_UART_TX_PORT: gpioPortA + SL_SERIAL_UART_TX_PIN: 6 + + SL_SERIAL_UART_RX_PORT: gpioPortA + SL_SERIAL_UART_RX_PIN: 5 + + SL_SERIAL_UART_CTS_PORT: gpioPortB + SL_SERIAL_UART_CTS_PIN: 1 + + SL_SERIAL_UART_RTS_PORT: gpioPortB + SL_SERIAL_UART_RTS_PIN: 0 + + SL_GPIO_ACTIVATION_POLARITY: LOW + SL_BTL_BUTTON_PORT: gpioPortA + SL_BTL_BUTTON_PIN: 0 diff --git a/manifests/smlight/smlight_slzb07_opentread_rcp.yaml b/manifests/smlight/smlight_slzb07_opentread_rcp.yaml new file mode 100644 index 00000000..a4dfbd03 --- /dev/null +++ b/manifests/smlight/smlight_slzb07_opentread_rcp.yaml @@ -0,0 +1,33 @@ +name: SLZB-07 OpenThread RCP +device: EFR32MG21A020F768IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 6 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 5 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_CTS_PIN: 1 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/smlight/smlight_slzb07_zigbee_ncp.yaml b/manifests/smlight/smlight_slzb07_zigbee_ncp.yaml new file mode 100644 index 00000000..c271beca --- /dev/null +++ b/manifests/smlight/smlight_slzb07_zigbee_ncp.yaml @@ -0,0 +1,50 @@ +name: SLZB-07 Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_CTS_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/sonoff/sonoff_zbdonglee_openthread_rcp.yaml b/manifests/sonoff/sonoff_zbdonglee_openthread_rcp.yaml new file mode 100644 index 00000000..b77f0626 --- /dev/null +++ b/manifests/sonoff/sonoff_zbdonglee_openthread_rcp.yaml @@ -0,0 +1,36 @@ +name: ZBDongle-E OpenThread RCP +device: EFR32MG21A020F768IM32 +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + fw_variant: no_flow + +c_defines: + SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlNone + + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_TX_PIN: 1 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortB + SL_UARTDRV_USART_VCOM_RX_PIN: 0 + + SL_UARTDRV_USART_VCOM_CTS_PORT: 0 + SL_UARTDRV_USART_VCOM_CTS_PIN: 0 + + SL_UARTDRV_USART_VCOM_RTS_PORT: 0 + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/sonoff/sonoff_zbdonglee_zigbee_ncp.yaml b/manifests/sonoff/sonoff_zbdonglee_zigbee_ncp.yaml new file mode 100644 index 00000000..54604065 --- /dev/null +++ b/manifests/sonoff/sonoff_zbdonglee_zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: ZBDongle-E Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + fw_variant: sw_flow + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: uartFlowControlSoftware + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_TX_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RX_PIN: 0 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_CTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 diff --git a/manifests/sonoff/sonoff_zbdonglee_zigbee_router.yaml b/manifests/sonoff/sonoff_zbdonglee_zigbee_router.yaml new file mode 100644 index 00000000..9fc85034 --- /dev/null +++ b/manifests/sonoff/sonoff_zbdonglee_zigbee_router.yaml @@ -0,0 +1,100 @@ +name: ZBDongle-E Zigbee +device: EFR32MG21A020F768IM32 +base_project: src/zigbee_router +filename: "{manifest_name}_{ezsp_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_router + ezsp_version: dynamic + baudrate: 115200 + fw_variant: sw_flow + +add_components: + # Status + - id: simple_led + instance: + - led0 + # BOOT + - id: simple_button + instance: + - btn1 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 8 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: uartFlowControlSoftware + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_TX_PIN: 1 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortB + SL_IOSTREAM_USART_VCOM_RX_PIN: 0 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_CTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_SIMPLE_LED_LED0_POLARITY: SL_SIMPLE_LED_POLARITY_ACTIVE_LOW + SL_SIMPLE_LED_LED0_PORT: gpioPortC + SL_SIMPLE_LED_LED0_PIN: 0 + + SL_SIMPLE_BUTTON_BTN1_MODE: SL_SIMPLE_BUTTON_MODE_INTERRUPT + SL_SIMPLE_BUTTON_BTN1_PORT: gpioPortA + SL_SIMPLE_BUTTON_BTN1_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 128 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 200 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: -11 + + # all zigbee channels + SL_ZIGBEE_AF_PLUGIN_NETWORK_STEERING_CHANNEL_MASK: 0x07fff800 + SL_ZIGBEE_AF_PLUGIN_NETWORK_STEERING_RADIO_TX_POWER: 20 + # RST button behavior: + # whenever the dongle is already joined + # a click will allow permit join (with broadcast) + # a >5sec press will force the adapter to leave the network + # whenever the dongle is not joined + # a click will run a scan and try to join an open network + # a >5sec press will factory reset the adapter + SL_ZIGBEE_AF_PLUGIN_BUTTON_JOINING_PERMIT_JOIN_TIMEOUT: 60 + +json_config: + - file: "config/zcl/zcl_config.zap" + jq: | + (.endpointTypes[].clusters[].attributes[] | select(.name == "model identifier")).defaultValue = "DONGLE-E_R" + + - file: "config/zcl/zcl_config.zap" + jq: | + (.endpointTypes[].clusters[].attributes[] | select(.name == "manufacturer name")).defaultValue = "SONOFF" + + # remove OTA cluster + - file: "config/zcl/zcl_config.zap" + jq: | + del(.endpointTypes[].clusters[] | select(.name == "Over the Air Bootloading")) + + # remove Occupancy cluster + - file: "config/zcl/zcl_config.zap" + jq: | + del(.endpointTypes[].clusters[] | select(.name == "Occupancy Sensing")) diff --git a/manifests/sparkfun/sparkfun_mgm240p_bootloader.yaml b/manifests/sparkfun/sparkfun_mgm240p_bootloader.yaml new file mode 100644 index 00000000..8a37fa14 --- /dev/null +++ b/manifests/sparkfun/sparkfun_mgm240p_bootloader.yaml @@ -0,0 +1,33 @@ +name: MGM240P Bootloader +device: MGM240PB32VNA +base_project: src/bootloader +filename: "{manifest_name}_{gecko_bootloader_version}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: gecko-bootloader + gecko_bootloader_version: dynamic + baudrate: 115200 + +c_defines: + SL_SERIAL_UART_FLOW_CONTROL: 0 + + SL_SERIAL_UART_PERIPHERAL: USART0 + SL_SERIAL_UART_PERIPHERAL_NO: 0 + + SL_SERIAL_UART_TX_PORT: gpioPortA + SL_SERIAL_UART_TX_PIN: 5 + + SL_SERIAL_UART_RX_PORT: gpioPortA + SL_SERIAL_UART_RX_PIN: 6 + + SL_SERIAL_UART_CTS_PORT: 0 + SL_SERIAL_UART_CTS_PIN: 0 + + SL_SERIAL_UART_RTS_PORT: 0 + SL_SERIAL_UART_RTS_PIN: 0 + + SL_GPIO_ACTIVATION_POLARITY: LOW + SL_BTL_BUTTON_PORT: gpioPortC + SL_BTL_BUTTON_PIN: 0 diff --git a/manifests/sparkfun/sparkfun_mgm240p_openthread_rcp.yaml b/manifests/sparkfun/sparkfun_mgm240p_openthread_rcp.yaml new file mode 100644 index 00000000..1c5b1731 --- /dev/null +++ b/manifests/sparkfun/sparkfun_mgm240p_openthread_rcp.yaml @@ -0,0 +1,36 @@ +name: MGM240P OpenThread RCP +device: MGM240PB32VNA +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + fw_variant: no_flow + +c_defines: + SL_UARTDRV_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlNone + + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 5 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 6 + + SL_UARTDRV_USART_VCOM_CTS_PORT: 0 + SL_UARTDRV_USART_VCOM_CTS_PIN: 0 + + SL_UARTDRV_USART_VCOM_RTS_PORT: 0 + SL_UARTDRV_USART_VCOM_RTS_PIN: 0 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/sparkfun/sparkfun_mgm240p_zigbee_ncp.yaml b/manifests/sparkfun/sparkfun_mgm240p_zigbee_ncp.yaml new file mode 100644 index 00000000..d3244499 --- /dev/null +++ b/manifests/sparkfun/sparkfun_mgm240p_zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: MGM240P Zigbee +device: MGM240PB32VNA +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}_{fw_variant}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + fw_variant: sw_flow + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 32 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 16 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: uartFlowControlSoftware + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_CTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: 0 + SL_IOSTREAM_USART_VCOM_RTS_PIN: 0 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 64 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 64 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 254 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 32 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/tubeszb/tubeszb-mgm24-openthread_rcp.yaml b/manifests/tubeszb/tubeszb-mgm24-openthread_rcp.yaml new file mode 100644 index 00000000..09e8c81b --- /dev/null +++ b/manifests/tubeszb/tubeszb-mgm24-openthread_rcp.yaml @@ -0,0 +1,33 @@ +name: TubesZB MGM24 Zigbee +device: MGM240PA32VNN +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 6 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 5 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_CTS_PIN: 7 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RTS_PIN: 8 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/tubeszb/tubeszb-mgm24-zigbee_ncp.yaml b/manifests/tubeszb/tubeszb-mgm24-zigbee_ncp.yaml new file mode 100644 index 00000000..8a6d355f --- /dev/null +++ b/manifests/tubeszb/tubeszb-mgm24-zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: TubesZB MGM24 Zigbee +device: MGM240PA32VNN +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 64 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 16 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_CTS_PIN: 7 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RTS_PIN: 8 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 128 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 128 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 254 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 64 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + SL_ZIGBEE_APS_DUPLICATE_REJECTION_MAX_ENTRIES: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/tubeszb/tubeszb-mgm24PB-openthread_rcp.yaml b/manifests/tubeszb/tubeszb-mgm24PB-openthread_rcp.yaml new file mode 100644 index 00000000..cd22181e --- /dev/null +++ b/manifests/tubeszb/tubeszb-mgm24PB-openthread_rcp.yaml @@ -0,0 +1,33 @@ +name: TubesZB MGM24PB Zigbee +device: MGM240PB32VNN +base_project: src/openthread_rcp +filename: "{manifest_name}_{ot_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: openthread_rcp + ot_version: dynamic + baudrate: 460800 + +c_defines: + SL_UARTDRV_USART_VCOM_PERIPHERAL: USART0 + SL_UARTDRV_USART_VCOM_PERIPHERAL_NO: 0 + SL_UARTDRV_USART_VCOM_BAUDRATE: 460800 + + SL_UARTDRV_USART_VCOM_TX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_TX_PIN: 6 + + SL_UARTDRV_USART_VCOM_RX_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RX_PIN: 5 + + SL_UARTDRV_USART_VCOM_CTS_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_CTS_PIN: 7 + + SL_UARTDRV_USART_VCOM_RTS_PORT: gpioPortA + SL_UARTDRV_USART_VCOM_RTS_PIN: 8 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/tubeszb/tubeszb-mgm24PB-zigbee_ncp.yaml b/manifests/tubeszb/tubeszb-mgm24PB-zigbee_ncp.yaml new file mode 100644 index 00000000..495cac33 --- /dev/null +++ b/manifests/tubeszb/tubeszb-mgm24PB-zigbee_ncp.yaml @@ -0,0 +1,51 @@ +name: TubesZB MGM24PB Zigbee +device: MGM240PB32VNN +base_project: src/zigbee_ncp +filename: "{manifest_name}_{ezsp_version}_{baudrate}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: zigbee_ncp + ezsp_version: dynamic + baudrate: 115200 + +slcp_defines: + SL_ZIGBEE_ADDRESS_TABLE_SIZE: 64 + SL_ZIGBEE_MULTICAST_TABLE_SIZE: 26 + SL_ZIGBEE_ROUTE_TABLE_SIZE: 16 + SL_ZIGBEE_DISCOVERY_TABLE_SIZE: 16 + +c_defines: + SL_IOSTREAM_USART_VCOM_BAUDRATE: 115200 + SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE: usartHwFlowControlCtsAndRts + + SL_IOSTREAM_USART_VCOM_PERIPHERAL: USART0 + SL_IOSTREAM_USART_VCOM_PERIPHERAL_NO: 0 + + SL_IOSTREAM_USART_VCOM_TX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_TX_PIN: 6 + + SL_IOSTREAM_USART_VCOM_RX_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RX_PIN: 5 + + SL_IOSTREAM_USART_VCOM_CTS_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_CTS_PIN: 7 + + SL_IOSTREAM_USART_VCOM_RTS_PORT: gpioPortA + SL_IOSTREAM_USART_VCOM_RTS_PIN: 8 + + SL_IOSTREAM_USART_VCOM_RX_BUFFER_SIZE: 128 + + SL_CLOCK_MANAGER_HFXO_EN: 1 + SL_CLOCK_MANAGER_HFXO_CTUNE: 140 + + SL_ZIGBEE_APS_UNICAST_MESSAGE_COUNT: 128 + SL_ZIGBEE_BROADCAST_TABLE_SIZE: 30 + SL_ZIGBEE_NEIGHBOR_TABLE_SIZE: 26 + SL_ZIGBEE_SOURCE_ROUTE_TABLE_SIZE: 254 + SL_ZIGBEE_MAX_END_DEVICE_CHILDREN: 64 + SL_ZIGBEE_BINDING_TABLE_SIZE: 64 + SL_ZIGBEE_APS_DUPLICATE_REJECTION_MAX_ENTRIES: 64 + + SL_RAIL_UTIL_RSSI_OFFSET: 0 diff --git a/manifests/tubeszb/tubeszb_MGM240PB_bootloader.yaml b/manifests/tubeszb/tubeszb_MGM240PB_bootloader.yaml new file mode 100644 index 00000000..6a18cbf4 --- /dev/null +++ b/manifests/tubeszb/tubeszb_MGM240PB_bootloader.yaml @@ -0,0 +1,33 @@ +name: Yellow Bootloader +device: MGM240PB32VNN +base_project: src/bootloader +filename: "{manifest_name}_{gecko_bootloader_version}" +sdk: "simplicity_sdk:2024.6.2" +toolchain: "12.2.1.20221205" + +gbl: + fw_type: gecko-bootloader + gecko_bootloader_version: dynamic + baudrate: 115200 + +c_defines: + SL_SERIAL_UART_FLOW_CONTROL: 1 + + SL_SERIAL_UART_PERIPHERAL: USART0 + SL_SERIAL_UART_PERIPHERAL_NO: 0 + + SL_SERIAL_UART_TX_PORT: gpioPortA + SL_SERIAL_UART_TX_PIN: 6 + + SL_SERIAL_UART_RX_PORT: gpioPortA + SL_SERIAL_UART_RX_PIN: 5 + + SL_SERIAL_UART_CTS_PORT: gpioPortA + SL_SERIAL_UART_CTS_PIN: 7 + + SL_SERIAL_UART_RTS_PORT: gpioPortA + SL_SERIAL_UART_RTS_PIN: 8 + + SL_GPIO_ACTIVATION_POLARITY: LOW + SL_BTL_BUTTON_PORT: gpioPortA + SL_BTL_BUTTON_PIN: 0 diff --git a/src/openthread_rcp/app.c b/src/openthread_rcp/app.c index b3af0528..ca5d42a7 100755 --- a/src/openthread_rcp/app.c +++ b/src/openthread_rcp/app.c @@ -1,41 +1,72 @@ -/***************************************************************************//** +/******************************************************************************* * @file * @brief Core application logic. ******************************************************************************* * # License - * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com ******************************************************************************* * - * The licensor of this software is Silicon Laboratories Inc. Your use of this - * software is governed by the terms of Silicon Labs Master Software License - * Agreement (MSLA) available at - * www.silabs.com/about-us/legal/master-software-license-agreement. This - * software is distributed to you in Source Code format and is governed by the - * sections of the MSLA applicable to Source Code. + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. * ******************************************************************************/ + #include #include #include -#include #include +#include #include -#include "openthread-system.h" #include "app.h" +#include "openthread-system.h" #include "reset_util.h" +#include "sl_component_catalog.h" +#include "sl_memory_manager.h" + +#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE +#if OPENTHREAD_CONFIG_MULTIPLE_STATIC_INSTANCE_ENABLE == 0 +#error "Support for multiple OpenThread static instance is disabled." +#endif +otInstance *sInstances[OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM] = {NULL}; +#endif // OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE + /** * This function initializes the NCP app. * * @param[in] aInstance The OpenThread instance structure. * */ +#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE +extern void otAppNcpInitMulti(otInstance **aInstances, uint8_t aCount); +#else extern void otAppNcpInit(otInstance *aInstance); +#endif -static otInstance* sInstance = NULL; +#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && !OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE +static uint8_t *sOtInstanceBuffer = NULL; +#endif +static otInstance *sInstance = NULL; otInstance *otGetInstance(void) { @@ -44,19 +75,26 @@ otInstance *otGetInstance(void) void sl_ot_create_instance(void) { -#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE - size_t otInstanceBufferLength = 0; - uint8_t *otInstanceBuffer = NULL; +#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE + for (int i = 0; i < OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM; i++) + { + sInstances[i] = otInstanceInitMultiple(i); + + assert(sInstances[i]); + } + sInstance = sInstances[0]; +#elif OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && !OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE + size_t otInstanceBufferLength = 0; // Call to query the buffer size (void)otInstanceInit(NULL, &otInstanceBufferLength); // Call to allocate the buffer - otInstanceBuffer = (uint8_t *)malloc(otInstanceBufferLength); - assert(otInstanceBuffer); + sOtInstanceBuffer = (uint8_t *)sl_malloc(otInstanceBufferLength); + assert(sOtInstanceBuffer); // Initialize OpenThread with the buffer - sInstance = otInstanceInit(otInstanceBuffer, &otInstanceBufferLength); + sInstance = otInstanceInit(sOtInstanceBuffer, &otInstanceBufferLength); #else sInstance = otInstanceInitSingle(); #endif @@ -65,10 +103,14 @@ void sl_ot_create_instance(void) void sl_ot_ncp_init(void) { +#if OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE + otAppNcpInitMulti(sInstances, OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_NUM); +#else otAppNcpInit(sInstance); +#endif } -/**************************************************************************//** +/****************************************************************************** * Application Init. *****************************************************************************/ @@ -77,7 +119,7 @@ void app_init(void) OT_SETUP_RESET_JUMP(argv); } -/**************************************************************************//** +/****************************************************************************** * Application Process Action. *****************************************************************************/ void app_process_action(void) @@ -86,14 +128,14 @@ void app_process_action(void) otSysProcessDrivers(sInstance); } -/**************************************************************************//** +/****************************************************************************** * Application Exit. *****************************************************************************/ void app_exit(void) { otInstanceFinalize(sInstance); -#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE - free(otInstanceBuffer); +#if OPENTHREAD_CONFIG_MULTIPLE_INSTANCE_ENABLE && !OPENTHREAD_CONFIG_MULTIPAN_RCP_ENABLE + sl_free(sOtInstanceBuffer); #endif // TO DO : pseudo reset? } diff --git a/src/openthread_rcp/app.h b/src/openthread_rcp/app.h index 4a8493a9..ac672d5f 100755 --- a/src/openthread_rcp/app.h +++ b/src/openthread_rcp/app.h @@ -1,36 +1,49 @@ -/***************************************************************************//** +/******************************************************************************* * @file * @brief Application interface provided to main(). ******************************************************************************* * # License - * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com ******************************************************************************* * - * The licensor of this software is Silicon Laboratories Inc. Your use of this - * software is governed by the terms of Silicon Labs Master Software License - * Agreement (MSLA) available at - * www.silabs.com/about-us/legal/master-software-license-agreement. This - * software is distributed to you in Source Code format and is governed by the - * sections of the MSLA applicable to Source Code. + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. * ******************************************************************************/ #ifndef APP_H #define APP_H -/**************************************************************************//** +/****************************************************************************** * Application Init. *****************************************************************************/ void app_init(void); -/**************************************************************************//** +/****************************************************************************** * Application Exit. *****************************************************************************/ void app_exit(void); -/**************************************************************************//** +/****************************************************************************** * Application Process Action. *****************************************************************************/ void app_process_action(void); -#endif \ No newline at end of file +#endif diff --git a/src/openthread_rcp/main.c b/src/openthread_rcp/main.c index 143e4cdf..81a37f0b 100644 --- a/src/openthread_rcp/main.c +++ b/src/openthread_rcp/main.c @@ -1,22 +1,36 @@ -/***************************************************************************//** +/******************************************************************************* * @file * @brief main() function. ******************************************************************************* * # License - * Copyright 2020 Silicon Laboratories Inc. www.silabs.com + * Copyright 2024 Silicon Laboratories Inc. www.silabs.com ******************************************************************************* * - * The licensor of this software is Silicon Laboratories Inc. Your use of this - * software is governed by the terms of Silicon Labs Master Software License - * Agreement (MSLA) available at - * www.silabs.com/about-us/legal/master-software-license-agreement. This - * software is distributed to you in Source Code format and is governed by the - * sections of the MSLA applicable to Source Code. + * SPDX-License-Identifier: Zlib + * + * The licensor of this software is Silicon Laboratories Inc. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. * ******************************************************************************/ + +#include "app.h" #include "sl_component_catalog.h" #include "sl_system_init.h" -#include "app.h" #if defined(SL_CATALOG_POWER_MANAGER_PRESENT) #include "sl_power_manager.h" #endif // SL_CATALOG_POWER_MANAGER_PRESENT @@ -28,33 +42,34 @@ int main(void) { - // Initialize Silicon Labs device, system, service(s) and protocol stack(s). - // Note that if the kernel is present, processing task(s) will be created by - // this call. - sl_system_init(); + // Initialize Silicon Labs device, system, service(s) and protocol stack(s). + // Note that if the kernel is present, processing task(s) will be created by + // this call. + sl_system_init(); - // Initialize the application. For example, create periodic timer(s) or - // task(s) if the kernel is present. - app_init(); + // Initialize the application. For example, create periodic timer(s) or + // task(s) if the kernel is present. + app_init(); #if defined(SL_CATALOG_KERNEL_PRESENT) - // Start the kernel. Task(s) created in app_init() will start running. - sl_system_kernel_start(); + // Start the kernel. Task(s) created in app_init() will start running. + sl_system_kernel_start(); #else // SL_CATALOG_KERNEL_PRESENT - while (1) { - // Do not remove this call: Silicon Labs components process action routine - // must be called from the super loop. - sl_system_process_action(); + while (1) + { + // Do not remove this call: Silicon Labs components process action routine + // must be called from the super loop. + sl_system_process_action(); - // Application process. - app_process_action(); + // Application process. + app_process_action(); #if defined(SL_CATALOG_POWER_MANAGER_PRESENT) - // Let the CPU go to sleep if the system allows it. - sl_power_manager_sleep(); + // Let the CPU go to sleep if the system allows it. + sl_power_manager_sleep(); #endif - } - // Clean-up when exiting the application. - app_exit(); + } + // Clean-up when exiting the application. + app_exit(); #endif // SL_CATALOG_KERNEL_PRESENT -} \ No newline at end of file +} diff --git a/src/openthread_rcp/openthread_rcp.slcp b/src/openthread_rcp/openthread_rcp.slcp index 3294e605..a74faa41 100644 --- a/src/openthread_rcp/openthread_rcp.slcp +++ b/src/openthread_rcp/openthread_rcp.slcp @@ -14,6 +14,7 @@ component: - vcom - id: rail_util_pti - id: bootloader_interface + - id: clock_manager include: - path: . @@ -40,12 +41,11 @@ configuration: - name: BUFFER_SIZE_UP value: 768 condition: [ot_rtt_log] - - name: BUFFER_SIZE_UP - value: 128 - condition: [ot_rtt_log, device_family_efr32mg1] - name: BUFFER_SIZE_DOWN value: 0 condition: [ot_rtt_log] + - name: CIRCULAR_QUEUE_LEN_MAX + value: 16 filter: - name: "Wireless Technology" diff --git a/src/openthread_rcp/reset_util.h b/src/openthread_rcp/reset_util.h index 52f56813..56e75da9 100644 --- a/src/openthread_rcp/reset_util.h +++ b/src/openthread_rcp/reset_util.h @@ -32,8 +32,8 @@ #if defined(OPENTHREAD_ENABLE_COVERAGE) && OPENTHREAD_ENABLE_COVERAGE && defined(__GNUC__) #if __GNUC__ >= 11 || (defined(__clang__) && (defined(__APPLE__) && (__clang_major__ >= 13)) || \ (!defined(__APPLE__) && (__clang_major__ >= 12))) -void __gcov_dump(); -void __gcov_reset(); +void __gcov_dump(void); +void __gcov_reset(void); static void flush_gcov(void) { diff --git a/src/zigbee_ncp/app.c b/src/zigbee_ncp/app.c index 6725bfc6..0cc620ad 100644 --- a/src/zigbee_ncp/app.c +++ b/src/zigbee_ncp/app.c @@ -16,136 +16,16 @@ ******************************************************************************/ #include PLATFORM_HEADER -#include "ember.h" -#include "ember-types.h" -#include "ezsp-enum.h" -#include "random.h" -#include "mac-flat-header.h" - -#include "stack/include/message.h" -#include "app/ncp/plugin/xncp/xncp.h" -#include "em_usart.h" - -#include "config/xncp_config.h" -#include "config/sl_iostream_usart_vcom_config.h" - - -#define BUILD_UINT16(low, high) (((uint16_t)(low) << 0) | ((uint16_t)(high) << 8)) - -#define FEATURE_MEMBER_OF_ALL_GROUPS (0b00000000000000000000000000000001) -#define FEATURE_MANUAL_SOURCE_ROUTE (0b00000000000000000000000000000010) -#define FEATURE_MFG_TOKEN_OVERRIDES (0b00000000000000000000000000000100) -#define FEATURE_BUILD_STRING (0b00000000000000000000000000001000) -#define FEATURE_FLOW_CONTROL_TYPE (0b00000000000000000000000000010000) - -#define SUPPORTED_FEATURES ( \ - FEATURE_MEMBER_OF_ALL_GROUPS \ - | FEATURE_MANUAL_SOURCE_ROUTE \ - | FEATURE_MFG_TOKEN_OVERRIDES \ - | FEATURE_BUILD_STRING \ - | FEATURE_FLOW_CONTROL_TYPE \ -) - -extern sli_zigbee_route_table_entry_t sli_zigbee_route_table[]; -extern uint8_t sli_zigbee_route_table_size; - -/* - * Indicates whether this entry is active (0), being - * discovered (1), unused (3), or validating (4). - */ -typedef enum { - EMBER_ROUTE_ACTIVE = 0, - EMBER_ROUTE_BEING_DISCOVERED = 1, - EMBER_ROUTE_UNUSED = 3, - EMBER_ROUTE_VALIDATING = 4 -} EmberRouteStatus; - - -typedef enum { - XNCP_FLOW_CONTROL_TYPE_SOFTWARE = 0x00, - XNCP_FLOW_CONTROL_TYPE_HARDWARE = 0x01, -} XncpFlowControlType; - -typedef enum { - XNCP_CMD_GET_SUPPORTED_FEATURES_REQ = 0x0000, - XNCP_CMD_SET_SOURCE_ROUTE_REQ = 0x0001, - XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ = 0x0002, - XNCP_CMD_GET_BUILD_STRING_REQ = 0x0003, - XNCP_CMD_GET_FLOW_CONTROL_TYPE_REQ = 0x0004, - - XNCP_CMD_GET_SUPPORTED_FEATURES_RSP = XNCP_CMD_GET_SUPPORTED_FEATURES_REQ | 0x8000, - XNCP_CMD_SET_SOURCE_ROUTE_RSP = XNCP_CMD_SET_SOURCE_ROUTE_REQ | 0x8000, - XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_RSP = XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ | 0x8000, - XNCP_CMD_GET_BUILD_STRING_RSP = XNCP_CMD_GET_BUILD_STRING_REQ | 0x8000, - XNCP_CMD_GET_FLOW_CONTROL_TYPE_RSP = XNCP_CMD_GET_FLOW_CONTROL_TYPE_REQ | 0x8000, - - XNCP_CMD_UNKNOWN = 0xFFFF -} XncpCommand; - -typedef struct ManualSourceRoute { - bool active; - uint16_t destination; - uint8_t num_relays; - uint16_t relays[EMBER_MAX_SOURCE_ROUTE_RELAY_COUNT]; -} ManualSourceRoute; - -ManualSourceRoute manual_source_routes[XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE]; - - -ManualSourceRoute* get_manual_source_route(EmberNodeId destination) -{ - uint8_t index = 0xFF; - - for (uint8_t i = 0; i < XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE; i++) { - if (manual_source_routes[i].active && (manual_source_routes[i].destination == destination)) { - index = i; - break; - } - } - - if (index == 0xFF) { - return NULL; - } - - return &manual_source_routes[index]; -} - - -sli_zigbee_route_table_entry_t* find_free_routing_table_entry(EmberNodeId destination) { - uint8_t index = 0xFF; - - sli_zigbee_route_table_entry_t *route_table_entry = NULL; - - for (uint8_t i = 0; i < sli_zigbee_route_table_size; i++) { - route_table_entry = &sli_zigbee_route_table[i]; - - if (route_table_entry->destination == destination) { - // Perfer a route to the destination, if one exists - return route_table_entry; - } else if (route_table_entry->status == EMBER_ROUTE_UNUSED) { - // Otherwise, keep track of the most recent unused route - index = i; - continue; - } - } - - // If we have no free route slots, we still need to insert somewhere. Pick at random. - if (index == 0xFF) { - index = emberGetPseudoRandomNumber() % sli_zigbee_route_table_size; - } - - return &sli_zigbee_route_table[index]; -} - +#include "sl_zigbee.h" //---------------------- // Implemented Callbacks /** @brief * - * Application framework equivalent of ::emberRadioNeedsCalibratingHandler + * Application framework equivalent of ::sl_zigbee_radio_needs_calibrating_handler */ -void emberAfRadioNeedsCalibratingCallback(void) +void sl_zigbee_af_radio_needs_calibrating_cb(void) { sl_mac_calibrate_current_channel(); } @@ -153,279 +33,6 @@ void emberAfRadioNeedsCalibratingCallback(void) /** @brief Init * Application init function */ -void emberAfMainInitCallback(void) -{ - for (uint8_t i = 0; i < XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE; i++) { - manual_source_routes[i].active = false; - } -} - -/** @brief Incoming packet filter callback - * - * Filters and/or mutates incoming packets. Currently used only for wildcard multicast - * group membership. - */ -EmberPacketAction sli_zigbee_af_packet_handoff_incoming_callback(EmberZigbeePacketType packetType, - EmberMessageBuffer packetBuffer, - uint8_t index, - void *data) -{ - if (packetType != EMBER_ZIGBEE_PACKET_TYPE_APS_DATA) { - return EMBER_ACCEPT_PACKET; - } - - uint8_t* packetData = emberMessageBufferContents(packetBuffer); - uint16_t packetSize = emberMessageBufferLength(packetBuffer); - - // Skip over the 802.15.4 header to the payload - uint8_t payload_offset = sl_mac_flat_field_offset(packetData, true, EMBER_PH_FIELD_MAC_PAYLOAD); - packetData += payload_offset; - packetSize -= payload_offset; - - if (packetSize < 3) { - return EMBER_ACCEPT_PACKET; - } - - uint8_t deliveryMode = (packetData[0] & 0b00001100) >> 2; - - // Only look at multicast packets - if (deliveryMode != 0x03) { - return EMBER_ACCEPT_PACKET; - } - - // Take ownership over the first entry and continuously rewrite it - EmberMulticastTableEntry *tableEntry = &(sl_zigbee_get_multicast_table()[0]); - - tableEntry->endpoint = 1; - tableEntry->multicastId = BUILD_UINT16(packetData[1], packetData[2]); - tableEntry->networkIndex = 0; - - return EMBER_ACCEPT_PACKET; -} - - -/** @brief Outgoing packet filter callback - * - * Filters and/or mutates outgoing packets. - */ -EmberPacketAction sli_zigbee_af_packet_handoff_outgoing_callback(EmberZigbeePacketType packetType, - EmberMessageBuffer packetBuffer, - uint8_t index, - void *data) +void sl_zigbee_af_main_init_cb(void) { - return EMBER_ACCEPT_PACKET; -} - - -void nc_zigbee_override_append_source_route(EmberNodeId destination, - EmberMessageBuffer *header, - bool *consumed) -{ - ManualSourceRoute *route = get_manual_source_route(destination); - - if (route == NULL) { - *consumed = false; - return; - } - - *consumed = true; - - // Empty source routes are invalid according to the spec - if (route->num_relays == 0) { - // Add a fake route to the routing table to help EmberZNet just send the packet - sli_zigbee_route_table_entry_t *route_table_entry = find_free_routing_table_entry(route->destination); - route_table_entry->destination = route->destination; - route_table_entry->nextHop = route->destination; - route_table_entry->status = EMBER_ROUTE_ACTIVE; - route_table_entry->cost = 0; - route_table_entry->networkIndex = 0; - - return; - } - - uint8_t relay_index = route->num_relays - 1; - - route->active = false; // Disable the route after a single use - - emberAppendToLinkedBuffers(*header, &route->num_relays, 1); - emberAppendToLinkedBuffers(*header, &relay_index, 1); - - for (uint8_t i = 0; i < route->num_relays; i++) { - emberAppendToLinkedBuffers(*header, (uint8_t*)&route->relays[route->num_relays - i - 1], 2); - } - - return; -} - - -EmberStatus emberAfPluginXncpIncomingCustomFrameCallback(uint8_t messageLength, - uint8_t *messagePayload, - uint8_t *replyPayloadLength, - uint8_t *replyPayload) { - uint8_t rsp_status = EMBER_SUCCESS; - uint16_t rsp_command_id = XNCP_CMD_UNKNOWN; - - if (messageLength < 3) { - rsp_status = EMBER_BAD_ARGUMENT; - - replyPayload[0] = (uint8_t)((rsp_command_id >> 0) & 0xFF); - replyPayload[1] = (uint8_t)((rsp_command_id >> 8) & 0xFF); - replyPayload[2] = rsp_status; - return EMBER_SUCCESS; - } - - uint16_t req_command_id = BUILD_UINT16(messagePayload[0], messagePayload[1]); - uint8_t req_status = messagePayload[2]; - (void)req_status; - - // Strip the packet header to simplify command parsing below - messagePayload += 3; - messageLength -= 3; - - // Leave space for the reply packet header - *replyPayloadLength = 0; - *replyPayloadLength += 2; // Space for the response command ID - *replyPayloadLength += 1; // Space for the status - - switch (req_command_id) { - case XNCP_CMD_GET_SUPPORTED_FEATURES_REQ: { - rsp_command_id = XNCP_CMD_GET_SUPPORTED_FEATURES_RSP; - rsp_status = EMBER_SUCCESS; - - replyPayload[(*replyPayloadLength)++] = (uint8_t)((SUPPORTED_FEATURES >> 0) & 0xFF); - replyPayload[(*replyPayloadLength)++] = (uint8_t)((SUPPORTED_FEATURES >> 8) & 0xFF); - replyPayload[(*replyPayloadLength)++] = (uint8_t)((SUPPORTED_FEATURES >> 16) & 0xFF); - replyPayload[(*replyPayloadLength)++] = (uint8_t)((SUPPORTED_FEATURES >> 24) & 0xFF); - break; - } - - case XNCP_CMD_SET_SOURCE_ROUTE_REQ: { - rsp_command_id = XNCP_CMD_SET_SOURCE_ROUTE_RSP; - rsp_status = EMBER_SUCCESS; - - if ((messageLength < 2) || (messageLength % 2 != 0)) { - rsp_status = EMBER_BAD_ARGUMENT; - break; - } - - uint8_t num_relays = (messageLength - 2) / 2; - - if (num_relays > EMBER_MAX_SOURCE_ROUTE_RELAY_COUNT + 1) { - rsp_status = EMBER_BAD_ARGUMENT; - break; - } - - // If we don't find a better index, pick one at random to replace - uint8_t insertion_index = emberGetPseudoRandomNumber() % XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE; - uint16_t node_id = BUILD_UINT16(messagePayload[0], messagePayload[1]); - - for (uint8_t i = 0; i < XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE; i++) { - ManualSourceRoute *route = &manual_source_routes[i]; - - if (route->active == false) { - insertion_index = i; - } else if (route->destination == node_id) { - insertion_index = i; - break; - } - } - - ManualSourceRoute *route = &manual_source_routes[insertion_index]; - - for (uint8_t i = 0; i < num_relays; i++) { - uint16_t relay = BUILD_UINT16(messagePayload[2 + 2 * i + 0], messagePayload[2 + 2 * i + 1]); - route->relays[i] = relay; - } - - route->destination = node_id; - route->num_relays = num_relays; - route->active = true; - - break; - } - - case XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_REQ: { - rsp_command_id = XNCP_CMD_GET_MFG_TOKEN_OVERRIDE_RSP; - rsp_status = EMBER_SUCCESS; - - if (messageLength != 1) { - rsp_status = EMBER_BAD_ARGUMENT; - break; - } - - uint8_t token_id = messagePayload[0]; - char *override_value; - - switch (token_id) { - case EZSP_MFG_STRING: { - override_value = XNCP_MFG_MANUF_NAME; - break; - } - - case EZSP_MFG_BOARD_NAME: { - override_value = XNCP_MFG_BOARD_NAME; - break; - } - - default: { - rsp_status = EMBER_NOT_FOUND; - override_value = ""; - break; - } - } - - uint8_t value_length = strlen(override_value); - memcpy(replyPayload + *replyPayloadLength, override_value, value_length); - *replyPayloadLength += value_length; - break; - } - - case XNCP_CMD_GET_BUILD_STRING_REQ: { - rsp_command_id = XNCP_CMD_GET_BUILD_STRING_RSP; - rsp_status = EMBER_SUCCESS; - - uint8_t value_length = strlen(XNCP_BUILD_STRING); - memcpy(replyPayload + *replyPayloadLength, XNCP_BUILD_STRING, value_length); - *replyPayloadLength += value_length; - break; - } - - case XNCP_CMD_GET_FLOW_CONTROL_TYPE_REQ: { - rsp_command_id = XNCP_CMD_GET_FLOW_CONTROL_TYPE_RSP; - rsp_status = EMBER_SUCCESS; - - XncpFlowControlType flow_control_type; - - switch (SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE) { - case usartHwFlowControlCtsAndRts: { - flow_control_type = XNCP_FLOW_CONTROL_TYPE_HARDWARE; - break; - } - - case usartHwFlowControlNone: { - flow_control_type = XNCP_FLOW_CONTROL_TYPE_SOFTWARE; - break; - } - - default: { - flow_control_type = XNCP_FLOW_CONTROL_TYPE_SOFTWARE; - break; - } - } - - replyPayload[(*replyPayloadLength)++] = (uint8_t)(flow_control_type & 0xFF); - break; - } - - default: { - rsp_status = EMBER_NOT_FOUND; - break; - } - } - - replyPayload[0] = (uint8_t)((rsp_command_id >> 0) & 0xFF); - replyPayload[1] = (uint8_t)((rsp_command_id >> 8) & 0xFF); - replyPayload[2] = rsp_status; - - return EMBER_SUCCESS; } diff --git a/src/zigbee_ncp/config/xncp_config.h b/src/zigbee_ncp/config/xncp_config.h deleted file mode 100644 index fd85149b..00000000 --- a/src/zigbee_ncp/config/xncp_config.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef CONFIG_XNCP_CONFIG_H_ -#define CONFIG_XNCP_CONFIG_H_ - -// Table entries are ephemeral and are expected to be populated before a request is sent. -// This is not the size of any source route table! Rather, this controls how many unique -// destinations can be concurrently contacted with source routing enabled. -#define XNCP_MANUAL_SOURCE_ROUTE_TABLE_SIZE (20) - - -// Some manufacturers do not write a board or manufacturer name to the NCP. -// Rather than writing the manufacturing tokens within the application, you can instead -// supply overrides that will be preferred to the manufacturing token values. -#define XNCP_MFG_MANUF_NAME ("") -#define XNCP_MFG_BOARD_NAME ("") - - -// Specify a build string that can be read by the host, augmenting its version info -#define XNCP_BUILD_STRING ("") - -#endif /* CONFIG_XNCP_CONFIG_H_ */ diff --git a/src/zigbee_ncp/main.c b/src/zigbee_ncp/main.c index 996b1e0b..f07f4b28 100644 --- a/src/zigbee_ncp/main.c +++ b/src/zigbee_ncp/main.c @@ -28,7 +28,7 @@ #include "sl_system_process_action.h" #endif // SL_CATALOG_KERNEL_PRESENT -#ifdef EMBER_TEST +#ifdef SL_ZIGBEE_TEST #define main nodeMain #endif diff --git a/src/zigbee_ncp/zigbee_ncp.slcp b/src/zigbee_ncp/zigbee_ncp.slcp index 5ac2ad92..aac754e4 100644 --- a/src/zigbee_ncp/zigbee_ncp.slcp +++ b/src/zigbee_ncp/zigbee_ncp.slcp @@ -21,30 +21,28 @@ component: - id: zigbee_r22_support - id: zigbee_security_link_keys - id: zigbee_zll - - id: zigbee_app_framework_common + - id: zigbee_system_common - id: zigbee_ncp_uart_hardware - id: zigbee_debug_basic - id: zigbee_debug_extended - - id: zigbee_xncp - id: rail_util_rssi + - id: clock_manager define: - name: EMBER_CUSTOM_MAC_FILTER_TABLE_SIZE value: 15 configuration: - - name: SL_CLI_MAX_INPUT_ARGUMENTS - value: 16 - name: SL_BOARD_ENABLE_VCOM value: 1 - name: SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE value: usartHwFlowControlCtsAndRts + - name: SL_CLI_MAX_INPUT_ARGUMENTS + value: 16 + - name: SL_ZIGBEE_PACKET_BUFFER_HEAP_SIZE + value: SL_ZIGBEE_LARGE_PACKET_BUFFER_HEAP - name: SL_CLI_EXAMPLE_IOSTREAM_HANDLE value: sl_iostream_vuart_handle - - name: NVM3_DEFAULT_NVM_SIZE - value: 36864 - condition: - - device_series_1 - name: NVM3_DEFAULT_NVM_SIZE value: 32768 condition: @@ -58,22 +56,11 @@ configuration: value: 0 - name: SL_PSA_ITS_SUPPORT_V3_DRIVER value: 1 - - name: EMBER_AF_PLUGIN_PACKET_HANDOFF_ALLOW_ALL_PACKETS - value: 1 source: - path: main.c - path: app.c -config_file: - - path: config/xncp_config.h - file_id: xncp_config - -template_contribution: -- name: zigbee_stack_callback - priority: -9999 - value: {callback_type: override_append_source_route, function_name: nc_zigbee_override_append_source_route} - filter: - name: Wireless Technology value: [Zigbee] diff --git a/src/zigbee_router/app.c b/src/zigbee_router/app.c new file mode 100644 index 00000000..a1a0c107 --- /dev/null +++ b/src/zigbee_router/app.c @@ -0,0 +1,250 @@ +/***************************************************************************//** + * @file app.c + * @brief Callbacks implementation and application specific code. + ******************************************************************************* + * # License + * Copyright 2021 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * The licensor of this software is Silicon Laboratories Inc. Your use of this + * software is governed by the terms of Silicon Labs Master Software License + * Agreement (MSLA) available at + * www.silabs.com/about-us/legal/master-software-license-agreement. This + * software is distributed to you in Source Code format and is governed by the + * sections of the MSLA applicable to Source Code. + * + ******************************************************************************/ + +#include "app/framework/include/af.h" +#ifdef SL_COMPONENT_CATALOG_PRESENT +#include "sl_component_catalog.h" +#endif + +#ifdef SL_CATALOG_ZIGBEE_NETWORK_TEST_PRESENT +#include "network_test_config.h" +#endif //SL_CATALOG_ZIGBEE_NETWORK_TEST_PRESENT + +#if (LARGE_NETWORK_TESTING == 0) +#ifndef EZSP_HOST + +#include "zigbee_sleep_config.h" +#endif + +#include "network-steering.h" + +#ifdef SL_CATALOG_ZIGBEE_ZLL_COMMISSIONING_COMMON_PRESENT +#include "zll-commissioning.h" +#endif //SL_CATALOG_ZIGBEE_ZLL_COMMISSIONING_COMMON_PRESENT + +#if defined(SL_CATALOG_LED0_PRESENT) +#include "sl_led.h" +#include "sl_simple_led_instances.h" +#define led_turn_on(led) sl_led_turn_on(led) +#define led_turn_off(led) sl_led_turn_off(led) +#define led_toggle(led) sl_led_toggle(led) +#define COMMISSIONING_STATUS_LED (&sl_led_led0) +#define ON_OFF_LIGHT_LED (&sl_led_led0) +#else // !SL_CATALOG_LED0_PRESENT +#define led_turn_on(led) +#define led_turn_off(led) +#define led_toggle(led) +#endif // SL_CATALOG_LED0_PRESENT + +#define NWK_STEERING_COOLDOWN_MS 10000 + +static sl_zigbee_af_event_t commissioning_led_event; + +//--------------- +// Event handlers + +static void commissioning_led_event_handler(sl_zigbee_af_event_t *event) +{ + led_turn_on(COMMISSIONING_STATUS_LED); + + if (sl_zigbee_af_network_state() != SL_ZIGBEE_JOINED_NETWORK) { + sl_status_t status = sl_zigbee_af_network_steering_start(); + sl_zigbee_app_debug_println("%s network %s: 0x%X", "Join", "start", status); + } +} + +//---------------------- +// Implemented Callbacks + +/** @brief Stack Status + * + * This function is called by the application framework from the stack status + * handler. This callbacks provides applications an opportunity to be notified + * of changes to the stack status and take appropriate action. The framework + * will always process the stack status after the callback returns. + */ +void sl_zigbee_af_stack_status_cb(sl_status_t status) +{ + // Note, the ZLL state is automatically updated by the stack and the plugin. + if (status == SL_STATUS_NETWORK_DOWN) { + led_turn_off(COMMISSIONING_STATUS_LED); + sl_zigbee_af_event_set_delay_ms(&commissioning_led_event, NWK_STEERING_COOLDOWN_MS); + } else if (status == SL_STATUS_NETWORK_UP) { + led_turn_on(COMMISSIONING_STATUS_LED); + } +} + +/** @brief Init + * Application init function + */ +void sl_zigbee_af_main_init_cb(void) +{ + sl_zigbee_af_event_init(&commissioning_led_event, commissioning_led_event_handler); + + sl_zigbee_af_event_set_active(&commissioning_led_event); +} + +/** @brief Complete network steering. + * + * This callback is fired when the Network Steering plugin is complete. + * + * @param status On success this will be set to SL_STATUS_OK to indicate a + * network was joined successfully. On failure this will be the status code of + * the last join or scan attempt. + * + * @param totalBeacons The total number of 802.15.4 beacons that were heard, + * including beacons from different devices with the same PAN ID. + * + * @param joinAttempts The number of join attempts that were made to get onto + * an open Zigbee network. + * + * @param finalState The finishing state of the network steering process. From + * this, one is able to tell on which channel mask and with which key the + * process was complete. + */ +void sl_zigbee_af_network_steering_complete_cb(sl_status_t status, + uint8_t totalBeacons, + uint8_t joinAttempts, + uint8_t finalState) +{ + sl_zigbee_app_debug_println("Join network complete: 0x%X", status); + + if (status != SL_STATUS_OK) { + led_turn_off(COMMISSIONING_STATUS_LED); +#ifdef SL_CATALOG_ZIGBEE_ZLL_COMMISSIONING_COMMON_PRESENT + // Initialize our ZLL security now so that we are ready to be a touchlink + // target at any point. + status = sl_zigbee_af_zll_set_initial_security_state(); + if (status != SL_STATUS_OK) { + sl_zigbee_app_debug_println("Error: cannot initialize ZLL security: 0x%X", status); + } +#endif //SL_CATALOG_ZIGBEE_ZLL_COMMISSIONING_COMMON_PRESENT + sl_zigbee_af_event_set_delay_ms(&commissioning_led_event, NWK_STEERING_COOLDOWN_MS); + } +} + +/** @brief Post Attribute Change + * + * This function is called by the application framework after it changes an + * attribute value. The value passed into this callback is the value to which + * the attribute was set by the framework. + */ +void sl_zigbee_af_post_attribute_change_cb(uint8_t endpoint, + sl_zigbee_af_cluster_id_t clusterId, + sl_zigbee_af_attribute_id_t attributeId, + uint8_t mask, + uint16_t manufacturerCode, + uint8_t type, + uint8_t size, + uint8_t* value) +{ + if (clusterId == ZCL_ON_OFF_CLUSTER_ID + && attributeId == ZCL_ON_OFF_ATTRIBUTE_ID + && mask == CLUSTER_MASK_SERVER) { + bool onOff; + if (sl_zigbee_af_read_server_attribute(endpoint, + ZCL_ON_OFF_CLUSTER_ID, + ZCL_ON_OFF_ATTRIBUTE_ID, + (uint8_t *)&onOff, + sizeof(onOff)) + == SL_ZIGBEE_ZCL_STATUS_SUCCESS) { + if (onOff) { + led_turn_on(ON_OFF_LIGHT_LED); + } else { + led_turn_off(ON_OFF_LIGHT_LED); + } + } + } +} + +/** @brief On/off Cluster Server Post Init + * + * Following resolution of the On/Off state at startup for this endpoint, perform any + * additional initialization needed; e.g., synchronize hardware state. + * + * @param endpoint Endpoint that is being initialized + */ +void sl_zigbee_af_on_off_cluster_server_post_init_cb(uint8_t endpoint) +{ + // At startup, trigger a read of the attribute and possibly a toggle of the + // LED to make sure they are always in sync. + sl_zigbee_af_post_attribute_change_cb(endpoint, + ZCL_ON_OFF_CLUSTER_ID, + ZCL_ON_OFF_ATTRIBUTE_ID, + CLUSTER_MASK_SERVER, + 0, + 0, + 0, + NULL); +} + +/** @brief + * + * Application framework equivalent of ::sl_zigbee_radio_needs_calibrating_handler + */ +void sl_zigbee_af_radio_needs_calibrating_cb(void) +{ + #ifndef EZSP_HOST + sl_mac_calibrate_current_channel(); + #endif +} + +#if defined(SL_CATALOG_SIMPLE_BUTTON_PRESENT) && (SL_ZIGBEE_APP_FRAMEWORK_USE_BUTTON_TO_STAY_AWAKE == 0) +#include "sl_simple_button.h" +#include "sl_simple_button_instances.h" +#ifdef SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT +#include "force-sleep-wakeup.h" +#endif //SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT +/***************************************************************************//** + * A callback called in interrupt context whenever a button changes its state. + * + * @remark Can be implemented by the application if required. This function + * can contain the functionality to be executed in response to changes of state + * in each of the buttons, or callbacks to appropriate functionality. + * + * @note The button state should not be updated in this function, it is updated + * by specific button driver prior to arriving here + * + @param[out] handle Pointer to button instance + ******************************************************************************/ +void sl_button_on_change(const sl_button_t *handle) +{ + if (sl_button_get_state(handle) == SL_SIMPLE_BUTTON_RELEASED) { + #ifdef SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT + sl_zigbee_app_framework_force_wakeup(); + #endif //SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT + } +} +#endif // SL_CATALOG_SIMPLE_BUTTON_PRESENT && SL_ZIGBEE_APP_FRAMEWORK_USE_BUTTON_TO_STAY_AWAKE == 0 + +//Internal testing stuff +#if defined(SL_ZIGBEE_TEST) +void sl_zigbee_af_hal_button_isr_cb(uint8_t button, uint8_t state) +{ + if (state == BUTTON_RELEASED) { + } +} +#endif // SL_ZIGBEE_TEST + +#ifdef SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT +void sli_zigbee_app_framework_force_sleep_callback(void) +{ + // Do other things like turn off LEDs etc + sl_led_turn_off(&sl_led_led0); +} +#endif // SL_CATALOG_ZIGBEE_FORCE_SLEEP_AND_WAKEUP_PRESENT +#endif //#if (LARGE_NETWORK_TESTING == 0) diff --git a/src/zigbee_router/config/zcl/zcl_config.zap b/src/zigbee_router/config/zcl/zcl_config.zap new file mode 100644 index 00000000..87abb552 --- /dev/null +++ b/src/zigbee_router/config/zcl/zcl_config.zap @@ -0,0 +1,3777 @@ +{ + "fileFormat": 2, + "featureLevel": 104, + "creator": "zap", + "keyValuePairs": [ + { + "key": "commandDiscovery", + "value": "1" + }, + { + "key": "defaultResponsePolicy", + "value": "always" + }, + { + "key": "manufacturerCodes", + "value": "0x1002" + } + ], + "package": [ + { + "pathRelativity": "relativeToZap", + "path": "../../../../../../../../../app/zcl/zcl-zap.json", + "type": "zcl-properties", + "category": "zigbee", + "version": 1, + "description": "Zigbee Silabs ZCL data" + }, + { + "pathRelativity": "relativeToZap", + "path": "../../../../../gen-template/gen-templates.json", + "type": "gen-templates-json", + "category": "zigbee", + "version": "zigbee-v0" + } + ], + "endpointTypes": [ + { + "id": 1, + "name": "Centralized", + "deviceTypeRef": { + "code": 257, + "profileId": 260, + "label": "LO-dimmablelight", + "name": "LO-dimmablelight" + }, + "deviceTypes": [ + { + "code": 257, + "profileId": 260, + "label": "LO-dimmablelight", + "name": "LO-dimmablelight" + } + ], + "deviceVersions": [ + 1 + ], + "deviceIdentifiers": [ + 257 + ], + "deviceTypeName": "LO-dimmablelight", + "deviceTypeCode": 257, + "deviceTypeProfileId": 260, + "clusters": [ + { + "name": "Basic", + "code": 0, + "mfgCode": null, + "define": "BASIC_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ResetToFactoryDefaults", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "ZCL version", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "8", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "application version", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "stack version", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "hardware version", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "manufacturer name", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "model identifier", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "date code", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "power source", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "generic device class", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "generic device type", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "product code", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "product url", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "sw build id", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "IdentifyQueryResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "IdentifyQuery", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TriggerEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "identify time", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddGroup", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddGroupResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewGroup", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewGroupResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetGroupMembership", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetGroupMembershipResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveGroup", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveGroupResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveAllGroups", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddGroupIfIdentifying", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "name support", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddScene", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddSceneResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewScene", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewSceneResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveScene", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveSceneResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenes", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenesResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "StoreScene", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StoreSceneResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RecallScene", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetSceneMembership", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetSceneMembershipResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "EnhancedAddScene", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedViewScene", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "CopyScene", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "scene count", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current scene", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current group", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "scene valid", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "name support", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "On/off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "Off", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "On", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Toggle", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OffWithEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OnWithRecallGlobalScene", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OnWithTimedOff", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "on/off", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "global scene control", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on time", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "off wait time", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "start up on off", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "MoveToLevel", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Move", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Step", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Stop", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToLevelWithOnOff", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveWithOnOff", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepWithOnOff", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StopWithOnOff", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "current level", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "remaining time", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on off transition time", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on level", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "254", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "default move rate", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "start up current level", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "51", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Over the Air Bootloading", + "code": 25, + "mfgCode": null, + "define": "OTA_BOOTLOAD_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "QueryNextImageRequest", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ImageBlockRequest", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "UpgradeEndRequest", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "OTA Upgrade Server ID", + "code": 0, + "mfgCode": null, + "side": "client", + "type": "ieee_address", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0xffffffffffffffff", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Offset (address) into the file", + "code": 1, + "mfgCode": null, + "side": "client", + "type": "int32u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0xffffffff", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OTA Upgrade Status", + "code": 6, + "mfgCode": null, + "side": "client", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Occupancy Sensing", + "code": 1030, + "mfgCode": null, + "define": "OCCUPANCY_SENSING_CLUSTER", + "side": "client", + "enabled": 1, + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "ZLL Commissioning", + "code": 4096, + "mfgCode": null, + "define": "ZLL_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ScanRequest", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ScanResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "DeviceInformationRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "DeviceInformationResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "IdentifyRequest", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ResetToFactoryNewRequest", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkStartRequest", + "code": 16, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkStartResponse", + "code": 17, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkJoinRouterRequest", + "code": 18, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkJoinRouterResponse", + "code": 19, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkJoinEndDeviceRequest", + "code": 20, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkJoinEndDeviceResponse", + "code": 21, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkUpdateRequest", + "code": 22, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EndpointInformation", + "code": 64, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetGroupIdentifiersRequest", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetGroupIdentifiersResponse", + "code": 65, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetEndpointListRequest", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetEndpointListResponse", + "code": 66, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + } + ] + }, + { + "id": 2, + "name": "Touchlink", + "deviceTypeRef": { + "code": 269, + "profileId": 260, + "label": "LO-extendedcolorlight", + "name": "LO-extendedcolorlight" + }, + "deviceTypes": [ + { + "code": 269, + "profileId": 260, + "label": "LO-extendedcolorlight", + "name": "LO-extendedcolorlight" + } + ], + "deviceVersions": [ + 1 + ], + "deviceIdentifiers": [ + 269 + ], + "deviceTypeName": "LO-extendedcolorlight", + "deviceTypeCode": 269, + "deviceTypeProfileId": 260, + "clusters": [ + { + "name": "Basic", + "code": 0, + "mfgCode": null, + "define": "BASIC_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ResetToFactoryDefaults", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "ZCL version", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "8", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "application version", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "stack version", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "hardware version", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "manufacturer name", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "model identifier", + "code": 5, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "date code", + "code": 6, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "power source", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "generic device class", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "generic device type", + "code": 9, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "product code", + "code": 10, + "mfgCode": null, + "side": "server", + "type": "octet_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "product url", + "code": 11, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "sw build id", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "char_string", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 1, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Identify", + "code": 3, + "mfgCode": null, + "define": "IDENTIFY_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "Identify", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "IdentifyQueryResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "IdentifyQuery", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "TriggerEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "identify time", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Groups", + "code": 4, + "mfgCode": null, + "define": "GROUPS_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddGroup", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddGroupResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewGroup", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewGroupResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetGroupMembership", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetGroupMembershipResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveGroup", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveGroupResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveAllGroups", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddGroupIfIdentifying", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "name support", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Scenes", + "code": 5, + "mfgCode": null, + "define": "SCENES_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "AddScene", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "AddSceneResponse", + "code": 0, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ViewScene", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ViewSceneResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveScene", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveSceneResponse", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenes", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "RemoveAllScenesResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "StoreScene", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StoreSceneResponse", + "code": 4, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "RecallScene", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetSceneMembership", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetSceneMembershipResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "EnhancedAddScene", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedViewScene", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "CopyScene", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "scene count", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current scene", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current group", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "scene valid", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "name support", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "On/off", + "code": 6, + "mfgCode": null, + "define": "ON_OFF_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "Off", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "On", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Toggle", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OffWithEffect", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OnWithRecallGlobalScene", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "OnWithTimedOff", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "on/off", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "global scene control", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "boolean", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on time", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "off wait time", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "start up on off", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "255", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Level Control", + "code": 8, + "mfgCode": null, + "define": "LEVEL_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "MoveToLevel", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Move", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Step", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "Stop", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToLevelWithOnOff", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveWithOnOff", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepWithOnOff", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StopWithOnOff", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "current level", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "remaining time", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on off transition time", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "on level", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "254", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "default move rate", + "code": 20, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "start up current level", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": null, + "defaultValue": "51", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Over the Air Bootloading", + "code": 25, + "mfgCode": null, + "define": "OTA_BOOTLOAD_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "QueryNextImageRequest", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "ImageBlockRequest", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "UpgradeEndRequest", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "OTA Upgrade Server ID", + "code": 0, + "mfgCode": null, + "side": "client", + "type": "ieee_address", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0xffffffffffffffff", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "Offset (address) into the file", + "code": 1, + "mfgCode": null, + "side": "client", + "type": "int32u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0xffffffff", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "OTA Upgrade Status", + "code": 6, + "mfgCode": null, + "side": "client", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "0", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "Color Control", + "code": 768, + "mfgCode": null, + "define": "COLOR_CONTROL_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "MoveToHue", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveHue", + "code": 1, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepHue", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToSaturation", + "code": 3, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveSaturation", + "code": 4, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepSaturation", + "code": 5, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToHueAndSaturation", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToColor", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveColor", + "code": 8, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepColor", + "code": 9, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveToColorTemperature", + "code": 10, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedMoveToHue", + "code": 64, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedMoveHue", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedStepHue", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EnhancedMoveToHueAndSaturation", + "code": 67, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ColorLoopSet", + "code": 68, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StopMoveStep", + "code": 71, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "MoveColorTemperature", + "code": 75, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "StepColorTemperature", + "code": 76, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "current hue", + "code": 0, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current saturation", + "code": 1, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "remaining time", + "code": 2, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current x", + "code": 3, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x616B", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "current y", + "code": 4, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x607D", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color temperature", + "code": 7, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00FA", + "reportable": 1, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color mode", + "code": 8, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color control options", + "code": 15, + "mfgCode": null, + "side": "server", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "number of primaries", + "code": 16, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 1 x", + "code": 17, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 1 y", + "code": 18, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 1 intensity", + "code": 19, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 2 x", + "code": 21, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 2 y", + "code": 22, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 2 intensity", + "code": 23, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 3 x", + "code": 25, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 3 y", + "code": 26, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 3 intensity", + "code": 27, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 4 x", + "code": 32, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 4 y", + "code": 33, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 4 intensity", + "code": 34, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 5 x", + "code": 36, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 5 y", + "code": 37, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 5 intensity", + "code": 38, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 6 x", + "code": 40, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 6 y", + "code": 41, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "primary 6 intensity", + "code": 42, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "enhanced current hue", + "code": 16384, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "enhanced color mode", + "code": 16385, + "mfgCode": null, + "side": "server", + "type": "enum8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x01", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color loop active", + "code": 16386, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color loop direction", + "code": 16387, + "mfgCode": null, + "side": "server", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color loop time", + "code": 16388, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0019", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color loop start enhanced hue", + "code": 16389, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x2300", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color loop stored enhanced hue", + "code": 16390, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color capabilities", + "code": 16394, + "mfgCode": null, + "side": "server", + "type": "bitmap16", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color temp physical min", + "code": 16395, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "color temp physical max", + "code": 16396, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFEFF", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "couple color temp to level min-mireds", + "code": 16397, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "start up color temperature mireds", + "code": 16400, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "NVM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x4444", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + }, + { + "name": "ZLL Commissioning", + "code": 4096, + "mfgCode": null, + "define": "ZLL_COMMISSIONING_CLUSTER", + "side": "server", + "enabled": 1, + "commands": [ + { + "name": "ScanRequest", + "code": 0, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ScanResponse", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "DeviceInformationRequest", + "code": 2, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "DeviceInformationResponse", + "code": 3, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "IdentifyRequest", + "code": 6, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "ResetToFactoryNewRequest", + "code": 7, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkStartRequest", + "code": 16, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkStartResponse", + "code": 17, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkJoinRouterRequest", + "code": 18, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkJoinRouterResponse", + "code": 19, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkJoinEndDeviceRequest", + "code": 20, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "NetworkJoinEndDeviceResponse", + "code": 21, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "NetworkUpdateRequest", + "code": 22, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "EndpointInformation", + "code": 64, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetGroupIdentifiersRequest", + "code": 65, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetGroupIdentifiersResponse", + "code": 65, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + }, + { + "name": "GetEndpointListRequest", + "code": 66, + "mfgCode": null, + "source": "client", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GetEndpointListResponse", + "code": 66, + "mfgCode": null, + "source": "server", + "isIncoming": 0, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "server", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": null, + "defaultValue": "1", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + } + ] + }, + { + "id": 3, + "name": "GreenPower", + "deviceTypeRef": { + "code": 97, + "profileId": 41440, + "label": "GP-proxy-basic", + "name": "GP-proxy-basic" + }, + "deviceTypes": [ + { + "code": 97, + "profileId": 41440, + "label": "GP-proxy-basic", + "name": "GP-proxy-basic" + } + ], + "deviceVersions": [ + 0 + ], + "deviceIdentifiers": [ + 97 + ], + "deviceTypeName": "GP-proxy-basic", + "deviceTypeCode": 97, + "deviceTypeProfileId": 41440, + "clusters": [ + { + "name": "Green Power", + "code": 33, + "mfgCode": null, + "define": "GREEN_POWER_CLUSTER", + "side": "client", + "enabled": 1, + "commands": [ + { + "name": "GpPairing", + "code": 1, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GpProxyCommissioningMode", + "code": 2, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GpResponse", + "code": 6, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + }, + { + "name": "GpProxyTableRequest", + "code": 11, + "mfgCode": null, + "source": "server", + "isIncoming": 1, + "isEnabled": 1 + } + ], + "attributes": [ + { + "name": "gpp max proxy table entries", + "code": 16, + "mfgCode": null, + "side": "client", + "type": "int8u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x14", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "proxy table", + "code": 17, + "mfgCode": null, + "side": "client", + "type": "long_octet_string", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "gpp functionality", + "code": 22, + "mfgCode": null, + "side": "client", + "type": "bitmap24", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x09AC2F", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "gpp active functionality", + "code": 23, + "mfgCode": null, + "side": "client", + "type": "bitmap24", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0xFFFFFF", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "gp shared security key type", + "code": 32, + "mfgCode": null, + "side": "client", + "type": "bitmap8", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "gp shared security key", + "code": 33, + "mfgCode": null, + "side": "client", + "type": "security_key", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x00000000000000000000000000000000", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "gp link key", + "code": 34, + "mfgCode": null, + "side": "client", + "type": "security_key", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x5a6967426565416c6c69616e63653039", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + }, + { + "name": "cluster revision", + "code": 65533, + "mfgCode": null, + "side": "client", + "type": "int16u", + "included": 1, + "storageOption": "RAM", + "singleton": 0, + "bounded": 0, + "defaultValue": "0x0001", + "reportable": 0, + "minInterval": 1, + "maxInterval": 65534, + "reportableChange": 0 + } + ] + } + ] + } + ], + "endpoints": [ + { + "endpointTypeName": "Centralized", + "endpointTypeIndex": 0, + "profileId": 260, + "endpointId": 1, + "networkId": 0, + "parentEndpointIdentifier": null + }, + { + "endpointTypeName": "Touchlink", + "endpointTypeIndex": 1, + "profileId": 260, + "endpointId": 2, + "networkId": 0, + "parentEndpointIdentifier": null + }, + { + "endpointTypeName": "GreenPower", + "endpointTypeIndex": 2, + "profileId": 41440, + "endpointId": 242, + "networkId": 0, + "parentEndpointIdentifier": null + } + ] +} \ No newline at end of file diff --git a/src/zigbee_router/main.c b/src/zigbee_router/main.c new file mode 100644 index 00000000..6c7831a3 --- /dev/null +++ b/src/zigbee_router/main.c @@ -0,0 +1,74 @@ +/***************************************************************************//** + * @file main.c + * @brief main() function. + ******************************************************************************* + * # License + * Copyright 2021 Silicon Laboratories Inc. www.silabs.com + ******************************************************************************* + * + * The licensor of this software is Silicon Laboratories Inc. Your use of this + * software is governed by the terms of Silicon Labs Master Software License + * Agreement (MSLA) available at + * www.silabs.com/about-us/legal/master-software-license-agreement. This + * software is distributed to you in Source Code format and is governed by the + * sections of the MSLA applicable to Source Code. + * + ******************************************************************************/ + +#ifdef SL_COMPONENT_CATALOG_PRESENT +#include "sl_component_catalog.h" +#endif +#include "sl_system_init.h" +#if defined(SL_CATALOG_POWER_MANAGER_PRESENT) +#include "sl_power_manager.h" +#endif +#if defined(SL_CATALOG_KERNEL_PRESENT) +#include "sl_system_kernel.h" +#else +#include "sl_system_process_action.h" +#endif // SL_CATALOG_KERNEL_PRESENT + +#ifdef SL_ZIGBEE_TEST +#define main nodeMain +#endif + +void app_init(void) +{ +} + +void app_process_action(void) +{ +} + +int main(void) +{ + // Initialize Silicon Labs device, system, service(s) and protocol stack(s). + // Note that if the kernel is present, processing task(s) will be created by + // this call. + sl_system_init(); + + // Initialize the application. For example, create periodic timer(s) or + // task(s) if the kernel is present. + app_init(); + +#if defined(SL_CATALOG_KERNEL_PRESENT) + // Start the kernel. Task(s) created in app_init() will start running. + sl_system_kernel_start(); +#else // SL_CATALOG_KERNEL_PRESENT + while (1) { + // Do not remove this call: Silicon Labs components process action routine + // must be called from the super loop. + sl_system_process_action(); + + // Application process. + app_process_action(); + + // Let the CPU go to sleep if the system allow it. +#if defined(SL_CATALOG_POWER_MANAGER_PRESENT) + sl_power_manager_sleep(); +#endif // SL_CATALOG_POWER_MANAGER_PRESENT + } +#endif // SL_CATALOG_KERNEL_PRESENT + + return 0; +} diff --git a/src/zigbee_router/zigbee_router.slcp b/src/zigbee_router/zigbee_router.slcp new file mode 100644 index 00000000..f86587d0 --- /dev/null +++ b/src/zigbee_router/zigbee_router.slcp @@ -0,0 +1,123 @@ +project_name: zigbee_router +label: Zigbee - Router +package: Zigbee +category: Zigbee Application +quality: production +description: Zigbee Router firmware. Derived from the `Z3Light` example Simplicity SDK project. +author: Nerivec + +component: + - id: cli + instance: + - example + - id: iostream_recommended_stream + - id: iostream_usart + instance: + - vcom + - id: zigbee_debug_print + - id: zigbee_pro_stack + - id: zigbee_source_route + - id: zigbee_stack_diagnostics + - id: zigbee_gp + - id: zigbee_zll + - id: zigbee_zcl_framework_core + - id: zigbee_zcl_cli + - id: zigbee_core_cli + - id: zigbee_color_control_server + - id: zigbee_groups_server + - id: zigbee_identify + - id: zigbee_level_control + - id: zigbee_on_off + - id: zigbee_zll_on_off_server + - id: zigbee_counters + - id: zigbee_green_power_common + - id: zigbee_green_power_client + - id: zigbee_green_power_client_cli + - id: zigbee_interpan + - id: zigbee_zll_commissioning_common + - id: zigbee_zll_commissioning_server + - id: zigbee_network_steering + - id: zigbee_reporting + - id: zigbee_zll_identify_server + - id: zigbee_zll_level_control_server + - id: zigbee_scenes + - id: zigbee_zll_scenes_server + - id: zigbee_basic + - id: zigbee_zll_utility_server + - id: zigbee_scan_dispatch + - id: zigbee_update_tc_link_key + - id: clock_manager + - id: zigbee_application_bootloader + - id: zigbee_button_joining + - id: rail_util_rssi + +define: + - name: EMBER_CUSTOM_MAC_FILTER_TABLE_SIZE + value: 15 + +configuration: + - name: SL_BOARD_ENABLE_VCOM + value: 1 + - name: SL_IOSTREAM_USART_VCOM_FLOW_CONTROL_TYPE + value: usartHwFlowControlCtsAndRts + condition: + - iostream_usart + - name: SL_IOSTREAM_EUSART_VCOM_FLOW_CONTROL_TYPE + value: SL_IOSTREAM_EUSART_UART_FLOW_CTRL_CTS_RTS + condition: + - iostream_eusart + - name: SL_CLI_MAX_INPUT_ARGUMENTS + value: 16 + - name: SLI_ZIGBEE_PRIMARY_NETWORK_DEVICE_TYPE + value: SLI_ZIGBEE_NETWORK_DEVICE_TYPE_ROUTER + - name: SLI_ZIGBEE_PRIMARY_NETWORK_SECURITY_TYPE + value: SLI_ZIGBEE_NETWORK_SECURITY_TYPE_3_0 + - name: SL_CLI_PROMPT_STRING + value: "\"Z3Router>\"" + - name: NVM3_DEFAULT_NVM_SIZE + value: 32768 + condition: + - device_series_2 + # If using zigbee_secure_key_storage we do not need to support backwards + # compatibility because we have never deployed images with keys in PSA + # As a result, these lines end up saving some code space + - name: SL_PSA_ITS_SUPPORT_V1_DRIVER + value: 0 + - name: SL_PSA_ITS_SUPPORT_V2_DRIVER + value: 0 + - name: SL_PSA_ITS_SUPPORT_V3_DRIVER + value: 1 + - name: SL_STACK_SIZE + value: 1024 + condition: + - freertos + - name: SL_STACK_SIZE + value: 512 + condition: + - micriumos_kernel + # Timer RTOS task priority needs to be one more than SL_BT_RTOS_LINK_LAYER_TASK_PRIORITY + # BT uses event flags that require the timer task to be higher priority than all other RTOS tasks + - name: configTIMER_TASK_PRIORITY + value: 53 + - name: configMAX_TASK_NAME_LEN + value: 30 + +source: + - path: main.c + - path: app.c + +config_file: + - path: config/zcl/zcl_config.zap + file_id: zap_configuration_file_id + directory: zcl + +include: + - path: ./ + +filter: + - name: Wireless Technology + value: [Zigbee] + - name: Device Type + value: [SoC] + - name: Project Difficulty + value: [Beginner] diff --git a/tools/build_project.py b/tools/build_project.py index ec8c865f..cabbea05 100755 --- a/tools/build_project.py +++ b/tools/build_project.py @@ -17,7 +17,7 @@ import contextlib import subprocess import multiprocessing -from datetime import datetime, timezone +from datetime import datetime from ruamel.yaml import YAML @@ -29,6 +29,45 @@ yaml = YAML(typ="safe") +# prefix components: +TREE_SPACE = " " +TREE_BRANCH = "│ " +# pointers: +TREE_TEE = "├── " +TREE_LAST = "└── " + + +def tree(dir_path: pathlib.Path, prefix: str = ""): + """A recursive generator, given a directory Path object + will yield a visual tree structure line by line + with each line prefixed by the same characters + Source: https://stackoverflow.com/a/59109706 + """ + contents = list(dir_path.iterdir()) + # contents each get pointers that are ├── with a final └── : + pointers = [TREE_TEE] * (len(contents) - 1) + [TREE_LAST] + + for pointer, path in zip(pointers, contents): + yield prefix + pointer + path.name + + if path.is_dir(): # extend the prefix and recurse: + extension = TREE_BRANCH if pointer == TREE_TEE else TREE_SPACE + + # i.e. space because last, └── , above so no more | + yield from tree(path, prefix=prefix + extension) + + +def log_tree(dir_path: pathlib.Path, prefix: str = ""): + LOGGER.info(f"Tree for {dir_path}:") + + for line in tree(dir_path, prefix): + LOGGER.info(line) + + +def log_subprocess_output(pipe, prefix: str = "subprocess"): + for line in iter(pipe.readline, b""): + LOGGER.info("[%s] %r", prefix, line) + def evaulate_f_string(f_string: str, variables: dict[str, typing.Any]) -> str: """ @@ -316,6 +355,8 @@ def main(): ], ) + log_tree(build_template_path) + # We extend the base project with the manifest, since added components could have # extra dependencies (base_project_slcp,) = build_template_path.glob("*.slcp") @@ -370,11 +411,74 @@ def main(): with (args.build_dir / "gbl_metadata.yaml").open("w") as f: yaml.dump(manifest["gbl"], f) + zcl_config_zap = build_template_path / "config/zcl/zcl_config.zap" + + if zcl_config_zap.exists(): + date_code = datetime.today().strftime("%Y-%m-%d") + default_zap_changes = [ + # Set software date code to day of build + f'(.endpointTypes[].clusters[].attributes[] | select(.name == "date code")).defaultValue = "{date_code}"', + # Set software build ID to SDK version + f'(.endpointTypes[].clusters[].attributes[] | select(.name == "sw build id")).defaultValue = "{sdk_version.split(":", 1)[1]}"', + # Set path + f'(.package[] | select(.type == "zcl-properties")).path = "{sdk}/app/zcl/zcl-zap.json"', + # Set path + f'(.package[] | select(.type == "gen-templates-json")).path = "{sdk}/protocol/zigbee/app/framework/gen-template/gen-templates.json"', + ] + + for zap_change in default_zap_changes: + LOGGER.info("Default ZAP change: %s", zap_change) + + result = subprocess.run( + [ + "jq", + zap_change, + zcl_config_zap, + ], + capture_output=True, + ) + + if result.returncode != 0: + LOGGER.error("jq stderr: %s\n%s", result.returncode, result.stderr) + sys.exit(1) + + with open(zcl_config_zap, "wb") as f: + f.write(result.stdout) + + # JSON config + for json_config in manifest.get("json_config", []): + json_path = build_template_path / json_config["file"] + + if not json_path.exists(): + raise ValueError(f"[{json_path}] does not exist") + + device_spe_change = json_config["jq"] + + LOGGER.info("Device-specific change in %s: %s", json_path, device_spe_change) + + result = subprocess.run( + [ + "jq", + device_spe_change, + json_path, + ], + capture_output=True, + ) + + if result.returncode != 0: + LOGGER.error("jq stderr: %s\n%s", result.returncode, result.stderr) + sys.exit(1) + + with open(json_path, "wb") as f: + f.write(result.stdout) + + log_tree(build_template_path) + # Next, generate a chip-specific project from the modified base project - print(f"Generating project for {manifest['device']}") + LOGGER.info(f"Generating project for {manifest['device']}") # fmt: off - subprocess.run( + slc_result = subprocess.Popen( SLC + [ "generate", @@ -387,10 +491,22 @@ def main(): "--sdk", sdk, "--output-type", args.build_system, ], - check=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT ) # fmt: on + with slc_result.stdout: + log_subprocess_output(slc_result.stdout, "SLC generate") + + slc_result_returncode = slc_result.wait() + + if slc_result_returncode != 0: + LOGGER.error("[SLC generate] Error: %s", slc_result_returncode) + sys.exit(1) + + log_tree(build_template_path) + # Make sure all extensions are valid for sdk_extension in base_project.get("sdk_extension", []): expected_dir = sdk / f"extension/{sdk_extension['id']}_extension" @@ -403,7 +519,6 @@ def main(): value_template_env = { "git_repo_hash": get_git_commit_id(repo=pathlib.Path(__file__).parent.parent), "manifest_name": args.manifest.stem, - "now": datetime.now(timezone.utc), } # Actually search for C defines within config @@ -490,7 +605,14 @@ def main(): args.build_dir: "/src", toolchain: "/toolchain", }.items() - ] + ["-Wall", "-Wextra", "-Werror"] + ] + [ + "-Wall", + "-Wextra", + "-Werror", + # XXX: Fails due to protocol/openthread/platform-abstraction/efr32/radio.c@RAILCb_Generic + # Remove once this is fixed in the SDK! + "-Wno-error=unused-but-set-variable", + ] output_artifact = (args.build_dir / "build/debug" / base_project_name).with_suffix( ".gbl" diff --git a/tools/create_gbl.py b/tools/create_gbl.py index 4167c56a..eaf3c772 100755 --- a/tools/create_gbl.py +++ b/tools/create_gbl.py @@ -164,16 +164,36 @@ def main(): ) metadata["ezsp_version"] = zigbee_esf_props["version"][0] + if "ot_version" in gbl_dynamic: + gbl_dynamic.remove("ot_version") + ot_esf_props = parse_properties_file( + (gsdk_path / "protocol/openthread/esf.properties").read_text() + ) + metadata["ot_version"] = ot_esf_props["version"][0] + + if "ble_version" in gbl_dynamic: + gbl_dynamic.remove("ble_version") + sl_bt_version_h = parse_c_header_defines( + (gsdk_path / "protocol/bluetooth/inc/sl_bt_version.h").read_text() + ) + metadata["ble_version"] = ".".join( + [ + str(sl_bt_version_h["SL_BT_VERSION_MAJOR"]), + str(sl_bt_version_h["SL_BT_VERSION_MINOR"]), + str(sl_bt_version_h["SL_BT_VERSION_PATCH"]), + ] + ) + if "cpc_version" in gbl_dynamic: gbl_dynamic.remove("cpc_version") - sl_gsdk_version_h = parse_c_header_defines( - (gsdk_path / "platform/common/inc/sl_gsdk_version.h").read_text() + sl_platform_version_h = parse_c_header_defines( + (gsdk_path / "platform/common/inc/sl_platform_version.h").read_text() ) metadata["cpc_version"] = ".".join( [ - str(sl_gsdk_version_h["SL_GSDK_MAJOR_VERSION"]), - str(sl_gsdk_version_h["SL_GSDK_MINOR_VERSION"]), - str(sl_gsdk_version_h["SL_GSDK_PATCH_VERSION"]), + str(sl_platform_version_h["SL_PLATFORM_MAJOR_VERSION"]), + str(sl_platform_version_h["SL_PLATFORM_MINOR_VERSION"]), + str(sl_platform_version_h["SL_PLATFORM_PATCH_VERSION"]), ] )