From 20574978bf12689492b220e5d965fa67c037a61b Mon Sep 17 00:00:00 2001 From: doru91 Date: Tue, 5 Apr 2022 18:44:08 +0300 Subject: [PATCH] [MATTER-135] TE8 fixes (#16721) OTA * add support for compiling without OTA support. If this happens, then the application is written at address 0 in flash (instead at 0 + 16K - required for SSBL). Also, more space is available for the app in this case; * add detailed README instructions; * increase idle task stack size - that's because writes to the eeprom are done on the idle task; * allow the application to specify the block size for each OTA fragment; * add NXP SDK fixes for fixing eeprom race conditions; * add NXP SDK fix for allowing the processing of OTA blocks of different sizes; * add support for parsing the OTA header; * fix OTA logic such that the application can pace the rate at which new OTA fragments are requested; Tokenizer * add detailed README instructions. Light app/Lock app * enable lock tracking; * schedule OTA/Matter attribute change/Server operations on the Matter task; * avoid checking if thread is provisioned in a busy loop on eeprom - use an event instead; * disable mbedtls error logging (~13K) and instead add error logs in MemConfig.cpp in case mbedtls memory allocations fail; * change task priorities such that the app task has a smaller priority than the Matter one; * enable CHIP_DEVICE_CONFIG_ENABLE_TEST_SETUP_PARAMS such that the PBKDF are hard-coded on the device side; * refactor the gn options such that K32W0 module can be easily configured to be attached to a dk different than DK6; * group initialization calls in a single function; * consider the case when WriteConfigValueStr is not called with a NULL-terminated string. * refactor board initialization code; * allow building k32w light application with ota support - disable ble for the moment, until a size-optimized SDK is released; * fix NFC compilation error is BLE is disabled. Signed-off-by: Doru Gucea --- .github/.wordlist.txt | 16 ++ .github/workflows/examples-k32w.yaml | 6 +- examples/lighting-app/nxp/k32w/k32w0/BUILD.gn | 12 +- .../lighting-app/nxp/k32w/k32w0/README.md | 218 +++++++++++++++++- examples/lighting-app/nxp/k32w/k32w0/args.gni | 2 + examples/lighting-app/nxp/k32w/k32w0/data.bin | Bin 4128 -> 0 bytes .../k32w/k32w0/include/CHIPProjectConfig.h | 9 +- .../nxp/k32w/k32w0/include/FreeRTOSConfig.h | 7 +- .../nxp/k32w/k32w0/main/AppTask.cpp | 162 +++++++++---- .../nxp/k32w/k32w0/main/LightingManager.cpp | 2 +- .../nxp/k32w/k32w0/main/include/AppEvent.h | 1 + .../nxp/k32w/k32w0/main/include/AppTask.h | 12 + .../lighting-app/nxp/k32w/k32w0/main/main.cpp | 51 ++-- examples/lock-app/nxp/k32w/k32w0/args.gni | 5 + examples/lock-app/nxp/k32w/k32w0/data.bin | Bin 4128 -> 0 bytes .../k32w/k32w0/include/CHIPProjectConfig.h | 9 +- .../lock-app/nxp/k32w/k32w0/main/AppTask.cpp | 46 ++-- .../nxp/k32w/k32w0/main/include/AppTask.h | 3 +- .../lock-app/nxp/k32w/k32w0/main/main.cpp | 25 +- examples/platform/nxp/k32w/k32w0/BUILD.gn | 5 +- .../app/ldscripts/chip-k32w061-linker.ld | 24 +- .../nxp/k32w/k32w0/app/support/BUILD.gn | 3 +- .../nxp/k32w/k32w0/app/support/Memconfig.cpp | 7 + .../k32w/k32w0/doc/images/flash_location.JPG | Bin 0 -> 120564 bytes .../k32w/k32w0/doc/images/ota_topology.JPG | Bin 0 -> 19680 bytes .../k32w/k32w0/doc/images/pdm_ext_flash.JPG | Bin 0 -> 119639 bytes .../nxp/k32w/k32w0/doc/images/ssbl_bin.JPG | Bin 0 -> 45572 bytes .../nxp/k32w/k32w0/doc/images/ssbl_select.JPG | Bin 0 -> 107428 bytes examples/shell/nxp/k32w/k32w0/args.gni | 4 + examples/shell/nxp/k32w/k32w0/data.bin | Bin 684 -> 0 bytes .../k32w/k32w0/include/CHIPProjectConfig.h | 7 - .../shell/nxp/k32w/k32w0/main/AppTask.cpp | 3 - examples/shell/nxp/k32w/k32w0/main/main.cpp | 27 +-- scripts/build/build/targets.py | 11 +- scripts/build/builders/k32w.py | 17 +- .../testdata/all_targets_except_host.txt | 5 +- .../build/testdata/build_all_except_host.txt | 24 +- .../glob_star_targets_except_host.txt | 2 +- .../DefaultOTARequestorDriver.cpp | 5 + .../ota-requestor/DefaultOTARequestorDriver.h | 2 + .../ota-requestor/OTARequestorDriver.h | 3 + src/include/platform/CHIPDeviceEvent.h | 15 ++ src/lwip/k32w0/lwipopts.h | 2 +- src/platform/BUILD.gn | 3 +- .../nxp/k32w/k32w0/BLEManagerImpl.cpp | 7 +- .../nxp/k32w/k32w0/CHIPDevicePlatformConfig.h | 10 +- .../k32w/k32w0/ConfigurationManagerImpl.cpp | 17 ++ .../nxp/k32w/k32w0/ConfigurationManagerImpl.h | 2 + src/platform/nxp/k32w/k32w0/K32W0Config.cpp | 16 +- src/platform/nxp/k32w/k32w0/K32W0Config.h | 9 +- .../k32w/k32w0/KeyValueStoreManagerImpl.cpp | 7 +- .../nxp/k32w/k32w0/NFCManagerImpl.cpp | 2 + .../nxp/k32w/k32w0/OTAImageProcessorImpl.cpp | 153 ++++++++++-- .../nxp/k32w/k32w0/OTAImageProcessorImpl.h | 12 +- .../nxp/k32w/k32w0/PlatformManagerImpl.cpp | 43 +++- .../nxp/k32w/k32w0/PlatformManagerImpl.h | 1 + src/platform/nxp/k32w/k32w0/args.gni | 2 +- third_party/nxp/k32w0_sdk/BUILD.gn | 1 - third_party/nxp/k32w0_sdk/k32w0_sdk.gni | 117 +++++++--- .../sdk_fixes/Eeprom_MX25R8035F_c.patch | 112 +++++++++ .../k32w0_sdk/sdk_fixes/MemManager_h.patch | 22 ++ .../k32w0_sdk/sdk_fixes/OtaSupport_c.patch | 144 ++++++++++++ .../nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh | 28 ++- .../k32w0_sdk/sdk_fixes/sign_images_sh.patch | 18 ++ 64 files changed, 1194 insertions(+), 284 deletions(-) delete mode 100644 examples/lighting-app/nxp/k32w/k32w0/data.bin delete mode 100644 examples/lock-app/nxp/k32w/k32w0/data.bin create mode 100644 examples/platform/nxp/k32w/k32w0/doc/images/flash_location.JPG create mode 100644 examples/platform/nxp/k32w/k32w0/doc/images/ota_topology.JPG create mode 100644 examples/platform/nxp/k32w/k32w0/doc/images/pdm_ext_flash.JPG create mode 100644 examples/platform/nxp/k32w/k32w0/doc/images/ssbl_bin.JPG create mode 100644 examples/platform/nxp/k32w/k32w0/doc/images/ssbl_select.JPG delete mode 100644 examples/shell/nxp/k32w/k32w0/data.bin create mode 100644 third_party/nxp/k32w0_sdk/sdk_fixes/Eeprom_MX25R8035F_c.patch create mode 100644 third_party/nxp/k32w0_sdk/sdk_fixes/MemManager_h.patch create mode 100644 third_party/nxp/k32w0_sdk/sdk_fixes/OtaSupport_c.patch create mode 100644 third_party/nxp/k32w0_sdk/sdk_fixes/sign_images_sh.patch diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt index 6b71bab558ed4e..850f970b1a8a0f 100644 --- a/.github/.wordlist.txt +++ b/.github/.wordlist.txt @@ -12,6 +12,7 @@ aabbccddeeff aarch abcdef abfb +appwrite ABI ABIs ables @@ -175,6 +176,7 @@ CatalogVendorId CBB cbd ccf +csg CCMP CCS CCSTUDIO @@ -315,6 +317,7 @@ dataset datasets DataVersion dbf +doru DBG dBm DBUILD @@ -594,8 +597,10 @@ IDF IDL IDLs idx +ifconfig ifdef ifdefs +itsfoss IGMP ignoreApplyUpdate ignoreQueryImage @@ -897,6 +902,8 @@ optionOverride optionsMask optionsOverride orgs +otaissues +otatesting OTA OTADownloader otaDownloadPath @@ -940,7 +947,10 @@ pbxproj PCA pcaps PDFs +PDM PDK +PSECT +pdm peerAddrStr peerNodeId peerSessionId @@ -949,6 +959,7 @@ percentageLiftValue periodicQueryTimeout pexpect pickString +psect PID Pigweed PinCode @@ -1019,6 +1030,7 @@ QRCodeUrl QSPI QueryImage QueryImageResponse +Quickstart queryImageStatus qvCHIP RADVD @@ -1028,6 +1040,7 @@ rAv RCP ReadAttribute ReadConfigValue +RPis readelf readfds README @@ -1089,6 +1102,7 @@ scalable scm sco scp +ssbl ScriptBinding SDC SDHC @@ -1119,6 +1133,7 @@ SetupQRCode sexualized SHA ShadeConfiguration +SSBL showDocumentation shubhamdp SIGINT @@ -1345,6 +1360,7 @@ whde whitespace whitespaces whl +wg wic WiFiNetworkDiagnostics WindowCovering diff --git a/.github/workflows/examples-k32w.yaml b/.github/workflows/examples-k32w.yaml index 834d513b9e2019..91ca49a9482b03 100644 --- a/.github/workflows/examples-k32w.yaml +++ b/.github/workflows/examples-k32w.yaml @@ -70,8 +70,8 @@ jobs: run: | scripts/run_in_build_env.sh "\ ./scripts/build/build_examples.py \ - --target k32w-light-release \ - --target k32w-light-tokenizer-release \ + --target k32w-light-ota-se \ + --target k32w-light-release-no-ota \ --target k32w-lock-low-power-release \ --target k32w-shell-release \ build \ @@ -82,7 +82,7 @@ jobs: run: | .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ k32w k32w061+release light \ - out/artifacts/k32w-light-release/chip-k32w061-light-example \ + out/artifacts/k32w-light-release-no-ota/chip-k32w061-light-example \ /tmp/bloat_reports/ - name: Get lock size stats timeout-minutes: 5 diff --git a/examples/lighting-app/nxp/k32w/k32w0/BUILD.gn b/examples/lighting-app/nxp/k32w/k32w0/BUILD.gn index 449c7ba01b322b..5e811f8900e0d8 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/BUILD.gn +++ b/examples/lighting-app/nxp/k32w/k32w0/BUILD.gn @@ -21,6 +21,7 @@ import("${k32w0_sdk_build_root}/k32w0_sdk.gni") import("${chip_root}/src/crypto/crypto.gni") import("${chip_root}/src/lib/core/core.gni") +import("${chip_root}/src/lib/core/core.gni") import("${chip_root}/src/platform/device.gni") if (chip_pw_tokenizer_logging) { @@ -82,7 +83,7 @@ k32w0_executable("light_app") { deps = [ ":sdk", "${chip_root}/examples/common/QRCode", - "${chip_root}/examples/ota-requestor-app/ota-requestor-common", + "${chip_root}/examples/lighting-app/lighting-common/", "${chip_root}/src/lib", "${chip_root}/third_party/mbedtls:mbedtls", "${k32w0_platform_dir}/app/support:freertos_mbedtls_utils", @@ -108,6 +109,15 @@ k32w0_executable("light_app") { ldflags = [ "-T" + rebase_path(ldscript, root_build_dir) ] + if (chip_enable_ota_requestor) { + ldflags += [ + "-Wl,--defsym", + "-Wl,__app_load_address__=0x4000", + "-Wl,--defsym", + "-Wl,__app_stated_size__=0x99A00", + ] + } + output_dir = root_out_dir } diff --git a/examples/lighting-app/nxp/k32w/k32w0/README.md b/examples/lighting-app/nxp/k32w/k32w0/README.md index d059e2ed46775c..571779f83ca519 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/README.md +++ b/examples/lighting-app/nxp/k32w/k32w0/README.md @@ -23,13 +23,14 @@ network. - [Device UI](#device-ui) - [Building](#building) - [Flashing and debugging](#flashdebug) -- [Testing the example](#testing-the-example) - [Pigweed Tokenizer](#tokenizer) - [Detokenizer script](#detokenizer) - [Notes](#detokenizer-notes) - [Known issues](#detokenizer-known-issues) - -
+- [OTA](#ota) - [Writing the SSBL](#ssbl) - [Writing the PSECT](#psect) - + [Writing the application](#appwrite) - [OTA Testing](#otatesting) - + [Known issues](#otaissues) + @@ -226,13 +227,6 @@ All you have to do is to replace the Openthread binaries from the above documentation with _out/debug/chip-k32w061-light-example.bin_ if DK6Programmer is used or with _out/debug/chip-k32w061-light-example_ if MCUXpresso is used. -## Testing the example - -The app can be deployed against any generic OpenThread Border Router. See the -guide -[Commissioning NXP K32W using Android CHIPTool](../../../docs/guides/nxp_k32w_android_commissioning.md) -for step-by-step instructions. - ## Pigweed tokenizer @@ -299,3 +293,207 @@ script won't find them in the special-created sections. If run, closed and rerun with the serial option on the same serial port, the detokenization script will get stuck and not show any logs. The solution is to unplug and plug the board and then rerun the script. + + + +## OTA + +The internal flash needs to be prepared for the OTA process. First 16K of the +internal flash needs to be populated with a Secondary Stage Bootloader (SSBL) +related data while the last 8.5K of flash space is holding image directory +related data (PSECT). The space between these two zones will be filled by the +application. + + + +### Writing the SSBL + +The SSBL can ge generated from one of the SDK demo examples. The SDK demo +example needs to be compiled inside MCUXpresso with the define _PDM_EXT_FLASH_. +The SSBL demo application can be imported from the _Quickstart panel_: _Import +SDK example(s)_ -> select _wireless->framework->ssbl_ application. + +![SSBL Application Select](../../../../platform/nxp/k32w/k32w0/doc/images/ssbl_select.JPG) + +The SSBL project must be compiled using the PDM_EXT_FLASH define. + +![PDM_EXT_FLASH](../../../../platform/nxp/k32w/k32w0/doc/images/pdm_ext_flash.JPG) + +Once compiled, the required ssbl file is called k32w061dk6_ssbl.bin + +![SSBL_BIN](../../../../platform/nxp/k32w/k32w0/doc/images/ssbl_bin.JPG) + +Before writing the SSBL, it it recommanded to fully erase the internal flash: + +``` +DK6Programmer.exe -V 5 -P 1000000 -s -e Flash +``` + +k32w061dk6_ssbl.bin must be written at address 0 in the internal flash: + +``` +DK6Programmer.exe -V2 -s -P 1000000 -Y -p FLASH@0x00="k32w061dk6_ssbl.bin" +``` + + + +### Writing the PSECT + +First, image directory 0 must be written: + +``` +DK6Programmer.exe -V5 -s -P 1000000 -w image_dir_0=0000000010000000 +``` + +Here is the interpretation of the fields: + +``` +00000000 -> start address 0x00000000 +1000 -> size = 0x0010 pages of 512-bytes (= 8kB) +00 -> not bootable (only used by the SSBL to support SSBL update) +00 -> SSBL Image Type +``` + +Second, image directory 1 must be written: + +``` +DK6Programmer.exe -V5 -s -P 1000000 -w image_dir_1=00400000CD040101 +``` + +Here is the interpretation of the fields: + +``` +00400000 -> start address 0x00004000 +CD04 -> 0x4CD pages of 512-bytes (= 614,5kB) +01 -> bootable flag +01 -> image type for the application +``` + + + +### Writing the application + +DK6Programmer can be used for flashing the application: + +``` +DK6Programmer.exe -V2 -s -P 1000000 -Y -p FLASH@0x4000="chip-k32w061-light-example.bin" +``` + +If debugging is needed, MCUXpresso can be used then for flashing the +application. Please make sure that the application is written at address 0x4000: + +![FLASH_LOCATION](../../../../platform/nxp/k32w/k32w0/doc/images/flash_location.JPG) + + + +### OTA Testing + +The OTA topology used for OTA testing is illustrated in the figure below. +Topology is similar with the one used for Matter Test Events. + +![OTA_TOPOLOGY](../../../../platform/nxp/k32w/k32w0/doc/images/ota_topology.JPG) + +The concept for OTA is the next one: + +- there is an OTA Provider Application that holds the OTA image. In our case, + this is a Linux application running on an Ubuntu based-system; +- the OTA Requestor functionality is embedded inside the Lighting Application. + It will be used for requesting OTA blocks from the OTA Provider; +- the controller (a linux application called chip-tool) will be used for + commissioning both the device and the OTA Provider App. The device will be + commissioned using the standard Matter flow (BLE + IEEE 802.15.4) while the + OTA Provider Application will be commissioned using the _onnetwork_ option + of chip-tool; +- during commissioning, each device is assigned a node id by the chip-tool + (can be specified manually by the user). Using the node id of the device and + of the lighting application, chip-tool triggers the OTA transfer by invoking + the _announce-ota-provider_ command - basically, the OTA Requestor is + informed of the node id of the OTA Provider Application. + +_Computer #1_ can be any system running an Ubuntu distribution. We recommand +using TE 7.5 instructions from +[here](https://groups.csa-iot.org/wg/matter-csg/document/24839), where RPi 4 are +proposed. Also, TE 7.5 instructions document point to the OS/Docker images that +should be used on the RPis. For compatibility reasons, we recommand compiling +chip-tool and OTA Provider applications with the same commit id that was used +for compiling the Lighting Application. Also, please note that there is a single +controller (chip-tool) running on Computer #1 which is used for commissioning +both the device and the OTA Provider Application. If needed, +[these instructions](https://itsfoss.com/connect-wifi-terminal-ubuntu/) could be +used for connecting the RPis to WiFi. + +Build the Linux OTA provider application: + +``` +doru@computer1:~/connectedhomeip$ : ./scripts/examples/gn_build_example.sh examples/ota-provider-app/linux out/ota-provider-app chip_config_network_layer_ble=false +``` + +Build OTA image and start the OTA Provider Application: + +``` +doru@computer1:~/connectedhomeip$ : ./src/app/ota_image_tool.py create -v 0xDEAD -p 0xBEEF -vn 1 -vs "1.0" -da sha256 chip-k32w061-light-example.bin chip-k32w061-light-example.ota +doru@computer1:~/connectedhomeip$ : rm -rf /tmp/chip_* +doru@computer1:~/connectedhomeip$ : ./out/ota-provider-app/chip-ota-provider-app -f chip-k32w061-light-example.ota +``` + +Build Linux chip-tool: + +``` +doru@computer1:~/connectedhomeip$ : ./scripts/examples/gn_build_example.sh examples/chip-tool out/chip-tool-app +``` + +Provision the OTA provider application and assign node id _1_. Also, grant ACL +entries to allow OTA requestors: + +``` +doru@computer1:~/connectedhomeip$ : rm -rf /tmp/chip_* +doru@computer1:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing onnetwork 1 20202021 +doru@computer1:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null}, {"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": null, "targets": null}]' 1 0 +``` + +Provision the device and assign node id _2_: + +``` +doru@computer1:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool pairing ble-thread 2 hex: 20202021 3840 +``` + +Start the OTA process: + +``` +doru@computer1:~/connectedhomeip$ : ./out/chip-tool-app/chip-tool otasoftwareupdaterequestor announce-ota-provider 1 0 0 0 2 0 +``` + + + +## Known issues + +- SRP cache on the openthread border router needs to flushed each time a new + commissioning process is attempted. For this, factory reset the device, then + execute _ot-ctl server disable_ followed by _ot-ctl server enable_. After + this step, the commissioning process of the device can start; +- Due to some MDNS issues, the commissioning of the OTA Provider Application + may fail. Please make sure that the SRP cache is disabled (_ot-ctl srp + server disable_) on the openthread border router while commissioning the OTA + Provider Application; +- No other Docker image should be running (e.g.: Docker image needed by Test + Harness) except the OTBR one. A docker image can be killed using the + command: + +``` +doru@computer1:~/connectedhomeip$ : sudo docker kill $container_id +``` + +- In order to avoid MDNS issues, only one interface should be active at one + time. E.g.: if WiFi is used then disable the Ethernet interface and also + disable multicast on that interface: + +``` +doru@computer1:~/connectedhomeip$ sudo ip link set dev eth0 down +doru@computer1:~/connectedhomeip$ sudo ifconfig eth0 -multicast +``` + +- If OTBR Docker image is used, then the "-B" parameter should point to the + interface used for the backbone. + +- If Wi-Fi is used on a RPI4, then a 5Ghz network should be selected. + Otherwise, issues related to BLE-WiFi combo may appear. diff --git a/examples/lighting-app/nxp/k32w/k32w0/args.gni b/examples/lighting-app/nxp/k32w/k32w0/args.gni index 114ae5310569ca..8bbd1e952f5ab9 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/args.gni +++ b/examples/lighting-app/nxp/k32w/k32w0/args.gni @@ -20,4 +20,6 @@ k32w0_sdk_target = get_label_info(":sdk", "label_no_toolchain") declare_args() { chip_enable_ota_requestor = true + chip_stack_lock_tracking = "fatal" + chip_enable_ble = true } diff --git a/examples/lighting-app/nxp/k32w/k32w0/data.bin b/examples/lighting-app/nxp/k32w/k32w0/data.bin deleted file mode 100644 index 05db12377ed787a317edb85370a90821562e2a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4128 zcmeIuu?+wq2n0YZwPI5TWI2rqOPHg1zWj@D1PBlyK!5-N0t5&UAV7e??*f&hdSmW+ I-_`Zy0ZC{A8UO$Q diff --git a/examples/lighting-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h b/examples/lighting-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h index 45428ef35d17d5..8b248f9e76e22c 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h +++ b/examples/lighting-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h @@ -86,7 +86,7 @@ * {MAJOR_VERSION}.0d{MINOR_VERSION} */ #ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING -#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "04-2020-te2" +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "03-2022-te8" #endif #ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION @@ -101,13 +101,6 @@ #define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME "NXP Demo App" #endif -/** - * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE - * - * Enable support for CHIP-over-BLE (CHIPOBLE). - */ -#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1 - /** * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC * diff --git a/examples/lighting-app/nxp/k32w/k32w0/include/FreeRTOSConfig.h b/examples/lighting-app/nxp/k32w/k32w0/include/FreeRTOSConfig.h index 9419372bbed91a..8c533831108e98 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/include/FreeRTOSConfig.h +++ b/examples/lighting-app/nxp/k32w/k32w0/include/FreeRTOSConfig.h @@ -44,7 +44,8 @@ #define configCPU_CLOCK_HZ (SystemCoreClock) #define configTICK_RATE_HZ ((TickType_t) 100) #define configMAX_PRIORITIES (8) -#define configMINIMAL_STACK_SIZE ((unsigned short) 90) +// idle task stack size needs to be increased for OTA EEPROM processing +#define configMINIMAL_STACK_SIZE ((unsigned short) 450) #define configMAX_TASK_NAME_LEN 20 #define configUSE_16_BIT_TICKS 0 #define configIDLE_SHOULD_YIELD 1 @@ -74,7 +75,7 @@ /* Hook function related definitions. */ #ifndef configUSE_IDLE_HOOK -#define configUSE_IDLE_HOOK 0 +#define configUSE_IDLE_HOOK 1 #endif #define configUSE_TICK_HOOK 0 #define configCHECK_FOR_STACK_OVERFLOW 0 @@ -99,7 +100,7 @@ #define configUSE_TIMERS 1 #define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) #define configTIMER_QUEUE_LENGTH 10 -#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 4) +#define configTIMER_TASK_STACK_DEPTH (360) /* Define to trap errors during development. */ #define configASSERT(x) \ diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp index be977affa6ff2b..eb8e749278b314 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/lighting-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -34,17 +34,18 @@ #include /* OTA related includes */ +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR #include "OTAImageProcessorImpl.h" #include "OtaSupport.h" #include #include #include #include +#endif #include "Keyboard.h" #include "LED.h" #include "LEDWidget.h" -#include "TimersManager.h" #include "app_config.h" #if CHIP_CRYPTO_HSM @@ -68,7 +69,6 @@ static LEDWidget sStatusLED; static LEDWidget sLightLED; static bool sIsThreadProvisioned = false; -static bool sIsThreadEnabled = false; static bool sHaveBLEConnections = false; static uint32_t eventMask = 0; @@ -85,12 +85,18 @@ using namespace chip; AppTask AppTask::sAppTask; /* OTA related variables */ +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR static DefaultOTARequestor gRequestorCore; static DefaultOTARequestorStorage gRequestorStorage; static DeviceLayer::DefaultOTARequestorDriver gRequestorUser; static BDXDownloader gDownloader; static OTAImageProcessorImpl gImageProcessor; +constexpr uint16_t requestedOtaBlockSize = 1024; +#endif + +extern bool shouldReset; + CHIP_ERROR AppTask::StartAppTask() { CHIP_ERROR err = CHIP_NO_ERROR; @@ -111,9 +117,7 @@ CHIP_ERROR AppTask::Init() CHIP_ERROR err = CHIP_NO_ERROR; // Init ZCL Data Model and start server - static chip::CommonCaseDeviceServerInitParams initParams; - (void) initParams.InitializeStaticResourcesBeforeServerInit(); - chip::Server::GetInstance().Init(initParams); + PlatformMgr().ScheduleWork(InitServer, 0); // Initialize device attestation config #ifdef ENABLE_HSM_DEVICE_ATTESTATION @@ -122,25 +126,13 @@ CHIP_ERROR AppTask::Init() SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); #endif - // Initialize and interconnect the Requestor and Image Processor objects -- START - SetRequestorInstance(&gRequestorCore); - - gRequestorStorage.Init(Server::GetInstance().GetPersistentStorage()); - gRequestorCore.Init(Server::GetInstance(), gRequestorStorage, gRequestorUser, gDownloader); - gRequestorUser.Init(&gRequestorCore, &gImageProcessor); - - gImageProcessor.SetOTAImageFile("test.txt"); - gImageProcessor.SetOTADownloader(&gDownloader); - - // Connect the gDownloader and Image Processor objects - gDownloader.SetImageProcessorDelegate(&gImageProcessor); - // Initialize and interconnect the Requestor and Image Processor objects -- END +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR + PlatformMgr().ScheduleWork(InitOTA, 0); +#endif // QR code will be used with CHIP Tool PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE)); - TMR_Init(); - /* HW init leds */ LED_Init(); @@ -156,8 +148,7 @@ CHIP_ERROR AppTask::Init() sStatusLED.Init(SYSTEM_STATE_LED); sLightLED.Init(LIGHT_STATE_LED); - sLightLED.Set(!LightingMgr().IsTurnedOff()); - UpdateClusterState(); + UpdateDeviceState(); /* intialize the Keyboard and button press calback */ KBD_Init(KBD_Callback); @@ -188,13 +179,38 @@ CHIP_ERROR AppTask::Init() K32W_LOG("Current Software Version: %s", currentSoftwareVer); -#if CONFIG_CHIP_NFC_COMMISSIONING PlatformMgr().AddEventHandler(ThreadProvisioningHandler, 0); -#endif return err; } +void AppTask::InitServer(intptr_t arg) +{ + static chip::CommonCaseDeviceServerInitParams initParams; + (void) initParams.InitializeStaticResourcesBeforeServerInit(); + + // Init ZCL Data Model and start server + VerifyOrDie((chip::Server::GetInstance().Init(initParams)) == CHIP_NO_ERROR); +} + +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR +void AppTask::InitOTA(intptr_t arg) +{ + // Initialize and interconnect the Requestor and Image Processor objects -- START + SetRequestorInstance(&gRequestorCore); + + gRequestorStorage.Init(chip::Server::GetInstance().GetPersistentStorage()); + gRequestorCore.Init(chip::Server::GetInstance(), gRequestorStorage, gRequestorUser, gDownloader); + gRequestorUser.SetMaxDownloadBlockSize(requestedOtaBlockSize); + gRequestorUser.Init(&gRequestorCore, &gImageProcessor); + gImageProcessor.SetOTADownloader(&gDownloader); + + // Connect the gDownloader and Image Processor objects + gDownloader.SetImageProcessorDelegate(&gImageProcessor); + // Initialize and interconnect the Requestor and Image Processor objects -- END +} +#endif + void AppTask::AppTaskMain(void * pvParameter) { AppEvent event; @@ -225,9 +241,7 @@ void AppTask::AppTaskMain(void * pvParameter) #if CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI K32WUartProcess(); #endif - sIsThreadProvisioned = ConnectivityMgr().IsThreadProvisioned(); - sIsThreadEnabled = ConnectivityMgr().IsThreadEnabled(); - sHaveBLEConnections = (ConnectivityMgr().NumBLEConnections() != 0); + sHaveBLEConnections = (ConnectivityMgr().NumBLEConnections() != 0); PlatformMgr().UnlockChipStack(); } @@ -245,7 +259,7 @@ void AppTask::AppTaskMain(void * pvParameter) // Otherwise, blink the LED ON for a very short time. if (sAppTask.mFunction != kFunction_FactoryReset) { - if (sIsThreadProvisioned && sIsThreadEnabled) + if (sIsThreadProvisioned) { sStatusLED.Blink(950, 50); } @@ -263,16 +277,6 @@ void AppTask::AppTaskMain(void * pvParameter) sLightLED.Animate(); HandleKeyboard(); - - if (gDownloader.GetState() == OTADownloader::State::kInProgress) - { - OTA_TransactionResume(); - - if (!EEPROM_isBusy()) - { - gDownloader.FetchNextData(); - } - } } } @@ -483,15 +487,32 @@ void AppTask::OTAHandler(AppEvent * aEvent) if (aEvent->ButtonEvent.PinNo != OTA_BUTTON) return; +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR if (sAppTask.mFunction != kFunction_NoneSelected) { K32W_LOG("Another function is scheduled. Could not initiate OTA!"); return; } + PlatformMgr().ScheduleWork(StartOTAQuery, 0); +#endif +} + +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR +void AppTask::StartOTAQuery(intptr_t arg) +{ static_cast(GetRequestorInstance())->TriggerImmediateQuery(); } +void AppTask::PostOTAResume() +{ + AppEvent event; + event.Type = AppEvent::kEventType_OTAResume; + event.Handler = OTAResumeEventHandler; + sAppTask.PostEvent(&event); +} +#endif + void AppTask::BleHandler(AppEvent * aEvent) { if (aEvent->ButtonEvent.PinNo != BLE_BUTTON) @@ -523,9 +544,28 @@ void AppTask::BleHandler(AppEvent * aEvent) } } -#if CONFIG_CHIP_NFC_COMMISSIONING void AppTask::ThreadProvisioningHandler(const ChipDeviceEvent * event, intptr_t) { + if (event->Type == DeviceEventType::kServiceProvisioningChange && event->ServiceProvisioningChange.IsServiceProvisioned) + { + if (event->ServiceProvisioningChange.IsServiceProvisioned) + { + sIsThreadProvisioned = TRUE; + } + else + { + sIsThreadProvisioned = FALSE; + } + } + +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR + if (event->Type == DeviceEventType::kOtaStateChanged && event->OtaStateChanged.newState == kOtaSpaceAvailable) + { + sAppTask.PostOTAResume(); + } +#endif + +#if CONFIG_CHIP_NFC_COMMISSIONING if (event->Type == DeviceEventType::kCHIPoBLEAdvertisingChange && event->CHIPoBLEAdvertisingChange.Result == kActivity_Stopped) { if (!NFCMgr().IsTagEmulationStarted()) @@ -551,8 +591,8 @@ void AppTask::ThreadProvisioningHandler(const ChipDeviceEvent * event, intptr_t) K32W_LOG("Started NFC Tag Emulation!"); } } -} #endif +} void AppTask::CancelTimer() { @@ -637,6 +677,26 @@ void AppTask::PostTurnOnActionRequest(int32_t aActor, LightingManager::Action_t PostEvent(&event); } +void AppTask::OTAResumeEventHandler(AppEvent * aEvent) +{ + if (aEvent->Type == AppEvent::kEventType_OTAResume) + { +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR + if (gDownloader.GetState() == OTADownloader::State::kInProgress) + { + gImageProcessor.TriggerNewRequestForData(); + } +#endif + } +} + +extern "C" void vApplicationIdleHook(void) +{ +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR + OTA_TransactionResume(); +#endif +} + void AppTask::PostEvent(const AppEvent * aEvent) { if (sAppEventQueue != NULL) @@ -661,6 +721,11 @@ void AppTask::DispatchEvent(AppEvent * aEvent) } void AppTask::UpdateClusterState(void) +{ + PlatformMgr().ScheduleWork(UpdateClusterStateInternal, 0); +} + +void AppTask::UpdateClusterStateInternal(intptr_t arg) { uint8_t newValue = !LightingMgr().IsTurnedOff(); @@ -672,3 +737,20 @@ void AppTask::UpdateClusterState(void) ChipLogError(NotSpecified, "ERR: updating on/off %x", status); } } + +void AppTask::UpdateDeviceState(void) +{ + PlatformMgr().ScheduleWork(UpdateDeviceStateInternal, 0); +} + +void AppTask::UpdateDeviceStateInternal(intptr_t arg) +{ + bool onoffAttrValue = 0; + + /* get onoff attribute value */ + (void) emberAfReadAttribute(1, ZCL_ON_OFF_CLUSTER_ID, ZCL_ON_OFF_ATTRIBUTE_ID, CLUSTER_MASK_SERVER, (uint8_t *) &onoffAttrValue, + 1, NULL); + + /* set the device state */ + sLightLED.Set(onoffAttrValue); +} diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/LightingManager.cpp b/examples/lighting-app/nxp/k32w/k32w0/main/LightingManager.cpp index 135df61442d050..af2dae0f3ff062 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/LightingManager.cpp +++ b/examples/lighting-app/nxp/k32w/k32w0/main/LightingManager.cpp @@ -28,7 +28,7 @@ LightingManager LightingManager::sLight; int LightingManager::Init() { - mState = kState_Off; + mState = kState_On; return 0; } diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/include/AppEvent.h b/examples/lighting-app/nxp/k32w/k32w0/main/include/AppEvent.h index 0e49456b8addd7..f067c2ed86368c 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/include/AppEvent.h +++ b/examples/lighting-app/nxp/k32w/k32w0/main/include/AppEvent.h @@ -29,6 +29,7 @@ struct AppEvent kEventType_Timer, kEventType_TurnOn, kEventType_Install, + kEventType_OTAResume, }; AppEventTypes Type; diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/include/AppTask.h b/examples/lighting-app/nxp/k32w/k32w0/main/include/AppTask.h index 73ad95aebd50bc..d0ef272e00350c 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/include/AppTask.h +++ b/examples/lighting-app/nxp/k32w/k32w0/main/include/AppTask.h @@ -47,6 +47,7 @@ class AppTask void PostEvent(const AppEvent * event); void UpdateClusterState(void); + void UpdateDeviceState(void); private: friend AppTask & GetAppTask(void); @@ -66,6 +67,7 @@ class AppTask static void OTAHandler(AppEvent * aEvent); static void BleHandler(AppEvent * aEvent); static void LightActionEventHandler(AppEvent * aEvent); + static void OTAResumeEventHandler(AppEvent * aEvent); static void ResetActionEventHandler(AppEvent * aEvent); static void InstallEventHandler(AppEvent * aEvent); @@ -75,6 +77,16 @@ class AppTask static void ThreadProvisioningHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg); void StartTimer(uint32_t aTimeoutInMs); +#if CHIP_DEVICE_CONFIG_ENABLE_OTA_REQUESTOR + static void InitOTA(intptr_t arg); + static void StartOTAQuery(intptr_t arg); + static void PostOTAResume(); +#endif + + static void UpdateClusterStateInternal(intptr_t arg); + static void UpdateDeviceStateInternal(intptr_t arg); + static void InitServer(intptr_t arg); + enum Function_t { kFunction_NoneSelected = 0, diff --git a/examples/lighting-app/nxp/k32w/k32w0/main/main.cpp b/examples/lighting-app/nxp/k32w/k32w0/main/main.cpp index bb1322e62cadc5..f3c4096c4d5a8a 100644 --- a/examples/lighting-app/nxp/k32w/k32w0/main/main.cpp +++ b/examples/lighting-app/nxp/k32w/k32w0/main/main.cpp @@ -20,32 +20,22 @@ // Main Code // ================================================================================ -#include "openthread/platform/logging.h" #include -#include -#include -#include -#include +#include #include -#include #include -#include #include #include #include "FreeRtosHooks.h" #include "app_config.h" -#include "radio.h" - using namespace ::chip; using namespace ::chip::Inet; using namespace ::chip::DeviceLayer; using namespace ::chip::Logging; -#include - typedef void (*InitFunc)(void); extern InitFunc __init_array_start; extern InitFunc __init_array_end; @@ -55,6 +45,8 @@ uint8_t __attribute__((section(".heap"))) ucHeap[HEAP_SIZE]; extern "C" void main_task(void const * argument) { + CHIP_ERROR err = CHIP_NO_ERROR; + /* Call C++ constructors */ InitFunc * pFunc = &__init_array_start; for (; pFunc < &__init_array_end; ++pFunc) @@ -62,59 +54,60 @@ extern "C" void main_task(void const * argument) (*pFunc)(); } - SHA_ClkInit(SHA_INSTANCE); - mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree); - /* Used for HW initializations */ - otSysInit(0, NULL); + err = PlatformMgrImpl().InitBoardFwk(); + if (err != CHIP_NO_ERROR) + { + return; + } K32W_LOG("Welcome to NXP Lighting Demo App"); /* Mbedtls Threading support is needed because both - * Thread and Weave tasks are using it */ + * Thread and Matter tasks are using it */ freertos_mbedtls_mutex_init(); // Init Chip memory management before the stack chip::Platform::MemoryInit(); - CHIP_ERROR ret = PlatformMgr().InitChipStack(); - if (ret != CHIP_NO_ERROR) + err = PlatformMgr().InitChipStack(); + if (err != CHIP_NO_ERROR) { - K32W_LOG("Error during PlatformMgr().InitWeaveStack()"); + K32W_LOG("Error during PlatformMgr().InitMatterStack()"); goto exit; } - ret = ThreadStackMgr().InitThreadStack(); - if (ret != CHIP_NO_ERROR) + err = ThreadStackMgr().InitThreadStack(); + if (err != CHIP_NO_ERROR) { K32W_LOG("Error during ThreadStackMgr().InitThreadStack()"); goto exit; } - ret = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice); - if (ret != CHIP_NO_ERROR) + err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice); + if (err != CHIP_NO_ERROR) { goto exit; } - ret = PlatformMgr().StartEventLoopTask(); - if (ret != CHIP_NO_ERROR) + err = PlatformMgr().StartEventLoopTask(); + if (err != CHIP_NO_ERROR) { K32W_LOG("Error during PlatformMgr().StartEventLoopTask();"); goto exit; } // Start OpenThread task - ret = ThreadStackMgrImpl().StartThreadTask(); - if (ret != CHIP_NO_ERROR) + err = ThreadStackMgrImpl().StartThreadTask(); + if (err != CHIP_NO_ERROR) { K32W_LOG("Error during ThreadStackMgrImpl().StartThreadTask()"); goto exit; } - ret = GetAppTask().StartAppTask(); - if (ret != CHIP_NO_ERROR) + err = GetAppTask().StartAppTask(); + if (err != CHIP_NO_ERROR) { K32W_LOG("Error during GetAppTask().StartAppTask()"); goto exit; diff --git a/examples/lock-app/nxp/k32w/k32w0/args.gni b/examples/lock-app/nxp/k32w/k32w0/args.gni index 0f921756420fce..aac1d79a737a71 100644 --- a/examples/lock-app/nxp/k32w/k32w0/args.gni +++ b/examples/lock-app/nxp/k32w/k32w0/args.gni @@ -17,3 +17,8 @@ import("${chip_root}/examples/platform/nxp/k32w/k32w0/args.gni") # SDK target. This is overridden to add our SDK app_config.h & defines. k32w0_sdk_target = get_label_info(":sdk", "label_no_toolchain") + +declare_args() { + chip_stack_lock_tracking = "fatal" + chip_enable_ble = true +} diff --git a/examples/lock-app/nxp/k32w/k32w0/data.bin b/examples/lock-app/nxp/k32w/k32w0/data.bin deleted file mode 100644 index 2bbd19d1429608a19d2c67dfefd4da96b02bd772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4128 zcmeIup$z~a30t5&UAV7cs0RjXF5cpjnXUp2S KcE9ha`tkrpoB`$l diff --git a/examples/lock-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h b/examples/lock-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h index ab177e86b699d4..e7529327edf259 100644 --- a/examples/lock-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h +++ b/examples/lock-app/nxp/k32w/k32w0/include/CHIPProjectConfig.h @@ -86,7 +86,7 @@ * {MAJOR_VERSION}.0d{MINOR_VERSION} */ #ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING -#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "04-2020-te2" +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING "03-2022-te8" #endif #ifndef CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION @@ -101,13 +101,6 @@ #define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME "NXP Demo App" #endif -/** - * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE - * - * Enable support for CHIP-over-BLE (CHIPOBLE). - */ -#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1 - /** * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC * diff --git a/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp b/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp index 1d0173d97be8dc..837c18b4d210ff 100644 --- a/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/lock-app/nxp/k32w/k32w0/main/AppTask.cpp @@ -36,7 +36,6 @@ #include "Keyboard.h" #include "LED.h" #include "LEDWidget.h" -#include "TimersManager.h" #include "app_config.h" constexpr uint32_t kFactoryResetTriggerTimeout = 6000; @@ -53,7 +52,6 @@ static LEDWidget sLockLED; #endif static bool sIsThreadProvisioned = false; -static bool sIsThreadEnabled = false; static bool sHaveBLEConnections = false; static uint32_t eventMask = 0; @@ -86,9 +84,7 @@ CHIP_ERROR AppTask::Init() CHIP_ERROR err = CHIP_NO_ERROR; // Init ZCL Data Model and start server - static chip::CommonCaseDeviceServerInitParams initParams; - (void) initParams.InitializeStaticResourcesBeforeServerInit(); - chip::Server::GetInstance().Init(initParams); + PlatformMgr().ScheduleWork(InitServer, 0); // Initialize device attestation config SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider()); @@ -96,8 +92,6 @@ CHIP_ERROR AppTask::Init() // QR code will be used with CHIP Tool PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE)); - TMR_Init(); - /* HW init leds */ #if !cPWR_UsePowerDownMode LED_Init(); @@ -151,14 +145,21 @@ CHIP_ERROR AppTask::Init() assert(err == CHIP_NO_ERROR); } -#if CONFIG_CHIP_NFC_COMMISSIONING PlatformMgr().AddEventHandler(ThreadProvisioningHandler, 0); -#endif K32W_LOG("Current Software Version: %s", currentSoftwareVer); return err; } +void AppTask::InitServer(intptr_t arg) +{ + static chip::CommonCaseDeviceServerInitParams initParams; + (void) initParams.InitializeStaticResourcesBeforeServerInit(); + + // Init ZCL Data Model and start server + VerifyOrDie((chip::Server::GetInstance().Init(initParams)) == CHIP_NO_ERROR); +} + void AppTask::AppTaskMain(void * pvParameter) { AppEvent event; @@ -195,10 +196,7 @@ void AppTask::AppTaskMain(void * pvParameter) #if CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI K32WUartProcess(); #endif - - sIsThreadProvisioned = ConnectivityMgr().IsThreadProvisioned(); - sIsThreadEnabled = ConnectivityMgr().IsThreadEnabled(); - sHaveBLEConnections = (ConnectivityMgr().NumBLEConnections() != 0); + sHaveBLEConnections = (ConnectivityMgr().NumBLEConnections() != 0); PlatformMgr().UnlockChipStack(); } @@ -218,7 +216,7 @@ void AppTask::AppTaskMain(void * pvParameter) #if !cPWR_UsePowerDownMode if (sAppTask.mFunction != kFunction_FactoryReset) { - if (sIsThreadProvisioned && sIsThreadEnabled) + if (sIsThreadProvisioned) { sStatusLED.Blink(950, 50); } @@ -535,9 +533,21 @@ void AppTask::BleHandler(void * aGenericEvent) } } -#if CONFIG_CHIP_NFC_COMMISSIONING void AppTask::ThreadProvisioningHandler(const ChipDeviceEvent * event, intptr_t) { + if (event->Type == DeviceEventType::kServiceProvisioningChange && event->ServiceProvisioningChange.IsServiceProvisioned) + { + if (event->ServiceProvisioningChange.IsServiceProvisioned) + { + sIsThreadProvisioned = TRUE; + } + else + { + sIsThreadProvisioned = FALSE; + } + } + +#if CONFIG_CHIP_NFC_COMMISSIONING if (event->Type == DeviceEventType::kCHIPoBLEAdvertisingChange && event->CHIPoBLEAdvertisingChange.Result == kActivity_Stopped) { if (!NFCMgr().IsTagEmulationStarted()) @@ -563,8 +573,8 @@ void AppTask::ThreadProvisioningHandler(const ChipDeviceEvent * event, intptr_t) K32W_LOG("Started NFC Tag Emulation!"); } } -} #endif +} void AppTask::CancelTimer() { @@ -703,6 +713,10 @@ void AppTask::DispatchEvent(AppEvent * aEvent) } void AppTask::UpdateClusterState(void) +{ + PlatformMgr().ScheduleWork(UpdateClusterStateInternal, 0); +} +void AppTask::UpdateClusterStateInternal(intptr_t arg) { uint8_t newValue = !BoltLockMgr().IsUnlocked(); diff --git a/examples/lock-app/nxp/k32w/k32w0/main/include/AppTask.h b/examples/lock-app/nxp/k32w/k32w0/main/include/AppTask.h index 6ea8303d1934db..9e0116cacf7e8d 100644 --- a/examples/lock-app/nxp/k32w/k32w0/main/include/AppTask.h +++ b/examples/lock-app/nxp/k32w/k32w0/main/include/AppTask.h @@ -65,8 +65,9 @@ class AppTask static void TimerEventHandler(TimerHandle_t xTimer); static void ThreadProvisioningHandler(const chip::DeviceLayer::ChipDeviceEvent * event, intptr_t arg); - + static void UpdateClusterStateInternal(intptr_t arg); static void ThreadStart(); + static void InitServer(intptr_t arg); void StartTimer(uint32_t aTimeoutInMs); enum Function_t diff --git a/examples/lock-app/nxp/k32w/k32w0/main/main.cpp b/examples/lock-app/nxp/k32w/k32w0/main/main.cpp index 0552507b285282..216f98328503ee 100644 --- a/examples/lock-app/nxp/k32w/k32w0/main/main.cpp +++ b/examples/lock-app/nxp/k32w/k32w0/main/main.cpp @@ -20,16 +20,11 @@ // Main Code // ================================================================================ -#include "openthread/platform/logging.h" #include -#include -#include -#include +#include #include -#include #include -#include #include #include @@ -41,8 +36,6 @@ using namespace ::chip::Inet; using namespace ::chip::DeviceLayer; using namespace ::chip::Logging; -#include - #if defined(cPWR_UsePowerDownMode) && (cPWR_UsePowerDownMode) #include "Keyboard.h" #include "PWR_Configuration.h" @@ -89,6 +82,8 @@ uint8_t __attribute__((section(".heap"))) ucHeap[HEAP_SIZE]; extern "C" void main_task(void const * argument) { + CHIP_ERROR err = CHIP_NO_ERROR; + /* Call C++ constructors */ InitFunc * pFunc = &__init_array_start; for (; pFunc < &__init_array_end; ++pFunc) @@ -96,7 +91,11 @@ extern "C" void main_task(void const * argument) (*pFunc)(); } - SHA_ClkInit(SHA_INSTANCE); + err = PlatformMgrImpl().InitBoardFwk(); + if (err != CHIP_NO_ERROR) + { + return; + } #if defined(cPWR_UsePowerDownMode) && (cPWR_UsePowerDownMode) PWR_Init(); @@ -110,13 +109,10 @@ extern "C" void main_task(void const * argument) mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree); - /* Used for HW initializations */ - otSysInit(0, NULL); - K32W_LOG("Welcome to NXP ELock Demo App"); /* Mbedtls Threading support is needed because both - * Thread and Weave tasks are using it */ + * Thread and Matter tasks are using it */ freertos_mbedtls_mutex_init(); // Init Chip memory management before the stack @@ -125,7 +121,7 @@ extern "C" void main_task(void const * argument) CHIP_ERROR ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) { - K32W_LOG("Error during PlatformMgr().InitWeaveStack()"); + K32W_LOG("Error during PlatformMgr().InitMatterStack()"); goto exit; } @@ -324,4 +320,5 @@ static void BOARD_SetClockForWakeup(void) /* Enables the clock for the GPIO0 module */ CLOCK_EnableClock(kCLOCK_Gpio0); } + #endif diff --git a/examples/platform/nxp/k32w/k32w0/BUILD.gn b/examples/platform/nxp/k32w/k32w0/BUILD.gn index dfe84cc8a14499..8abd38f2a250eb 100644 --- a/examples/platform/nxp/k32w/k32w0/BUILD.gn +++ b/examples/platform/nxp/k32w/k32w0/BUILD.gn @@ -18,7 +18,10 @@ import("//build_overrides/k32w0_sdk.gni") import("${k32w0_sdk_build_root}/k32w0_sdk.gni") config("chip_examples_project_config") { - include_dirs = [ "app/project_include" ] + include_dirs = [ + "app/project_include", + "${chip_root}", + ] } source_set("openthread_core_config_k32w0_chip_examples") { diff --git a/examples/platform/nxp/k32w/k32w0/app/ldscripts/chip-k32w061-linker.ld b/examples/platform/nxp/k32w/k32w0/app/ldscripts/chip-k32w061-linker.ld index c4913037e98cf3..c880b29ec2b843 100644 --- a/examples/platform/nxp/k32w/k32w0/app/ldscripts/chip-k32w061-linker.ld +++ b/examples/platform/nxp/k32w/k32w0/app/ldscripts/chip-k32w061-linker.ld @@ -47,11 +47,22 @@ MEM_RAM0_SIZE = 0x0015c00; MEM_RAM1_BASE = 0x4020000; MEM_RAM1_SIZE = 0x10000; +/* internal flash size: 640K */ +m_int_flash_size = 0xA0000; +m_int_sector_size = 512; + +/* first 8K: SSBL, next 8K: SSBL update region */ +m_app_start = DEFINED(__app_load_address__) ? __app_load_address__ : 0x0; + +/* sizeof(BOOT_BLOCK_T) + sizeof(IMAGE_CERT_T) + SIGNATURE_LEN + alignment = 1024 bytes */ +m_app_meta_data = 0x400; + +/* 640K (Total Flash size) - 16K (SSBL + SSBL update region) - 8.5K (PSECT) - m_app_meta_data */ +m_app_size = DEFINED(__app_stated_size__) ? __app_stated_size__ : 0x9FC00; + MEMORY { - /* Define each memory region. RAM0 definition leaves the first 1kB for the - boot code */ - Flash640 (rx) : ORIGIN = 0, LENGTH = 0x00a0000 /* 640K bytes (alias Flash) */ + Flash640 (rx) : ORIGIN = m_app_start, LENGTH = m_app_size RAM0 (rwx) : ORIGIN = 0x4000400, LENGTH = 0x0015c00 /* 87K bytes (alias RAM) */ RAM1 (rwx) : ORIGIN = 0x4020000, LENGTH = 0x10000 /* 64K bytes (alias RAM2) */ } @@ -60,7 +71,7 @@ MEMORY __top_RAM1 = MEM_RAM1_BASE + MEM_RAM1_SIZE; /* 64K bytes */ /* To be improved. At this moment the second RAM bank is dedicated entirely to heap + stack. */ -HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : 0xF000; +HEAP_SIZE = DEFINED(HEAP_SIZE) ? HEAP_SIZE : 0x10000; /* set external flash properties - external flash is present on the DK6 board */ m_ext_flash_size = 0x00100000; @@ -75,7 +86,9 @@ NV_STORAGE_SECTOR_SIZE = m_ext_flash_sector_size; NV_STORAGE_START_ADDRESS = m_ext_flash_size - 1; NV_STORAGE_END_ADDRESS = NV_STORAGE_START_ADDRESS - NV_STORAGE_SIZE + 1; -m_app_size = 0x00a0000; /* 640K */ +INT_STORAGE_START = m_int_flash_size - 17 * m_int_sector_size - 1; +INT_STORAGE_END = INT_STORAGE_START; +INT_STORAGE_SIZE = INT_STORAGE_START - INT_STORAGE_END; __ram_vector_table__ = 1; vector_table_size = 0x120; @@ -328,5 +341,4 @@ SECTIONS PROVIDE(_pvHeapLimit = _pvHeapStart + (HEAP_SIZE)); __StackLimit = _vStackTop - STACK_SIZE; - ASSERT (LENGTH(Flash640) >= (_etext + SIZEOF(.data)), "Application does not fit into flash!") } diff --git a/examples/platform/nxp/k32w/k32w0/app/support/BUILD.gn b/examples/platform/nxp/k32w/k32w0/app/support/BUILD.gn index ca8fabba7e2dea..014199c60a7619 100644 --- a/examples/platform/nxp/k32w/k32w0/app/support/BUILD.gn +++ b/examples/platform/nxp/k32w/k32w0/app/support/BUILD.gn @@ -44,8 +44,7 @@ source_set("freertos_mbedtls_utils") { "Memconfig.cpp", ] - #TODO: not sure this is required, maybe we should make this dependant on mbedtls - public_deps = [ "${k32w0_sdk_build_root}:k32w0_sdk" ] + deps = [ "${chip_root}/src/lib/support" ] cflags = [ "-Wconversion" ] diff --git a/examples/platform/nxp/k32w/k32w0/app/support/Memconfig.cpp b/examples/platform/nxp/k32w/k32w0/app/support/Memconfig.cpp index 87c8639f214298..8bcd4551bb300d 100644 --- a/examples/platform/nxp/k32w/k32w0/app/support/Memconfig.cpp +++ b/examples/platform/nxp/k32w/k32w0/app/support/Memconfig.cpp @@ -33,6 +33,8 @@ #include #endif +#include + #if CHIP_CONFIG_MEMORY_DEBUG_DMALLOC #include #include @@ -123,6 +125,10 @@ void * __wrap_calloc(size_t num, size_t size) { memset(ptr, 0, total_size); } + else + { + ChipLogError(DeviceLayer, "__wrap_calloc: Could not allocate memory!"); + } return ptr; } @@ -147,6 +153,7 @@ void * __wrap_realloc(void * ptr, size_t new_size) if (!new_ptr) { + ChipLogError(DeviceLayer, "__wrap_realloc: Could not allocate memory!"); return NULL; } diff --git a/examples/platform/nxp/k32w/k32w0/doc/images/flash_location.JPG b/examples/platform/nxp/k32w/k32w0/doc/images/flash_location.JPG new file mode 100644 index 0000000000000000000000000000000000000000..9ee50ba61173c5cf79752a413e9c6461e47a0416 GIT binary patch literal 120564 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 literal 0 HcmV?d00001 diff --git a/examples/platform/nxp/k32w/k32w0/doc/images/ota_topology.JPG b/examples/platform/nxp/k32w/k32w0/doc/images/ota_topology.JPG new file mode 100644 index 0000000000000000000000000000000000000000..75fc40a70e3b273fc06c3ea3ca04267bb0d0ee3b GIT binary patch literal 19680 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 I?5nT;2c|ys`2YX_ literal 0 HcmV?d00001 diff --git a/examples/platform/nxp/k32w/k32w0/doc/images/pdm_ext_flash.JPG b/examples/platform/nxp/k32w/k32w0/doc/images/pdm_ext_flash.JPG new file mode 100644 index 0000000000000000000000000000000000000000..00ceab4d6d0bffd534ee08f6133ca983761485b0 GIT binary patch literal 119639 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

dup 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 literal 0 HcmV?d00001 diff --git a/examples/shell/nxp/k32w/k32w0/args.gni b/examples/shell/nxp/k32w/k32w0/args.gni index 788b29c6c8fb3e..5f68faa6512372 100644 --- a/examples/shell/nxp/k32w/k32w0/args.gni +++ b/examples/shell/nxp/k32w/k32w0/args.gni @@ -18,3 +18,7 @@ import("${chip_root}/examples/platform/nxp/k32w/k32w0/args.gni") import("${chip_root}/src/platform/nxp/k32w/k32w0/args.gni") k32w0_sdk_target = get_label_info(":sdk", "label_no_toolchain") + +declare_args() { + chip_enable_ble = true +} diff --git a/examples/shell/nxp/k32w/k32w0/data.bin b/examples/shell/nxp/k32w/k32w0/data.bin deleted file mode 100644 index 7fbde80387a55ddec36d64f81e5513f01494d458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmb`EEl31G6vzK>c4l_>6f`PwuwWAos~~m-!zm~ThARf~qZl*@=LJEaXY0K^aJX;vn!ig?4v zN>6c;jf}jwo)x+nlp2NFs933}KXWYD_5#Xvh_4)Po56;(QbD7zO9+6A3HT1ljtrJr z;B8jM04~|KM;W^4R!D0aaIU^;WI(K)5!TtOlLq7aimV_B#)3+aYbNCyw6qy%10Q&;W{}13SFrhQaLPW<{@?b(*SU2EeBA@)0a$th h@( diff --git a/examples/shell/nxp/k32w/k32w0/include/CHIPProjectConfig.h b/examples/shell/nxp/k32w/k32w0/include/CHIPProjectConfig.h index e3075bbce62e0b..a5f5b04740b222 100644 --- a/examples/shell/nxp/k32w/k32w0/include/CHIPProjectConfig.h +++ b/examples/shell/nxp/k32w/k32w0/include/CHIPProjectConfig.h @@ -101,13 +101,6 @@ #define CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_NAME "NXP Demo App" #endif -/** - * CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE - * - * Enable support for CHIP-over-BLE (CHIPOBLE). - */ -#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1 - /** * CHIP_DEVICE_CONFIG_ENABLE_CHIP_TIME_SERVICE_TIME_SYNC * diff --git a/examples/shell/nxp/k32w/k32w0/main/AppTask.cpp b/examples/shell/nxp/k32w/k32w0/main/AppTask.cpp index 383dbdb1f9b19d..89b0e14eb59717 100644 --- a/examples/shell/nxp/k32w/k32w0/main/AppTask.cpp +++ b/examples/shell/nxp/k32w/k32w0/main/AppTask.cpp @@ -31,7 +31,6 @@ #include "Keyboard.h" #include "LED.h" #include "LEDWidget.h" -#include "TimersManager.h" #include "app_config.h" #define FACTORY_RESET_TRIGGER_TIMEOUT 6000 @@ -85,8 +84,6 @@ CHIP_ERROR AppTask::Init() // QR code will be used with CHIP Tool PrintOnboardingCodes(chip::RendezvousInformationFlags(chip::RendezvousInformationFlag::kBLE)); - TMR_Init(); - /* HW init leds */ LED_Init(); diff --git a/examples/shell/nxp/k32w/k32w0/main/main.cpp b/examples/shell/nxp/k32w/k32w0/main/main.cpp index da20f798e4cca7..196623359aaffd 100644 --- a/examples/shell/nxp/k32w/k32w0/main/main.cpp +++ b/examples/shell/nxp/k32w/k32w0/main/main.cpp @@ -20,12 +20,8 @@ // Main Code // ================================================================================ -#include "openthread/platform/logging.h" +#include #include -#include -#include -#include -#include #include #include @@ -40,10 +36,6 @@ #include "FreeRtosHooks.h" #include "app_config.h" -#include "radio.h" - -#include - const uint16_t shell_task_size = 3096; const uint8_t shell_task_priority = 0; @@ -74,8 +66,10 @@ static void shell_task(void * args) extern "C" void main_task(void const * argument) { - int status = 0; + int status = 0; + char * argv[1] = { 0 }; BaseType_t shellTaskHandle; + CHIP_ERROR err = CHIP_NO_ERROR; /* Call C++ constructors */ InitFunc * pFunc = &__init_array_start; @@ -84,15 +78,18 @@ extern "C" void main_task(void const * argument) (*pFunc)(); } - mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree); + err = PlatformMgrImpl().InitBoardFwk(); + if (err != CHIP_NO_ERROR) + { + return; + } - /* Used for HW initializations */ - otSysInit(0, NULL); + mbedtls_platform_set_calloc_free(CHIPPlatformMemoryCalloc, CHIPPlatformMemoryFree); K32W_LOG("Welcome to NXP Shell Demo App"); /* Mbedtls Threading support is needed because both - * Thread and Weave tasks are using it */ + * Thread and Matter tasks are using it */ freertos_mbedtls_mutex_init(); // Init Chip memory management before the stack @@ -101,7 +98,7 @@ extern "C" void main_task(void const * argument) CHIP_ERROR ret = PlatformMgr().InitChipStack(); if (ret != CHIP_NO_ERROR) { - K32W_LOG("Error during PlatformMgr().InitWeaveStack()"); + K32W_LOG("Error during PlatformMgr().InitMatterStack()"); goto exit; } diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index ec310f80a7b489..de3e94538ade28 100644 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -460,15 +460,8 @@ def AmebaTargets(): def K32WTargets(): target = Target('k32w', K32WBuilder) - # This is for testing only in case debug builds are to be fixed - # Error is LWIP_DEBUG being redefined between 0 and 1 in debug builds in: - # third_party/connectedhomeip/src/lwip/k32w0/lwipopts.h - # gen/include/lwip/lwip_buildconfig.h - yield target.Extend('light', app=K32WApp.LIGHT).GlobBlacklist("Debug builds broken due to LWIP_DEBUG redefition") - - yield target.Extend('light-release', app=K32WApp.LIGHT, release=True) - yield target.Extend('light-tokenizer-release', app=K32WApp.LIGHT, - tokenizer=True, release=True).GlobBlacklist("Only on demand build") + yield target.Extend('light-ota-se', app=K32WApp.LIGHT, release=True, disable_ble=True, se05x=True).GlobBlacklist("Only on demand build") + yield target.Extend('light-release-no-ota', app=K32WApp.LIGHT, tokenizer=True, disable_ota=True, release=True) yield target.Extend('shell-release', app=K32WApp.SHELL, release=True) yield target.Extend('lock-release', app=K32WApp.LOCK, release=True) yield target.Extend('lock-low-power-release', app=K32WApp.LOCK, diff --git a/scripts/build/builders/k32w.py b/scripts/build/builders/k32w.py index e5624ca621ff66..ea446ec8a40e88 100644 --- a/scripts/build/builders/k32w.py +++ b/scripts/build/builders/k32w.py @@ -55,7 +55,10 @@ def __init__(self, app: K32WApp = K32WApp.LIGHT, release: bool = False, low_power: bool = False, - tokenizer: bool = False): + tokenizer: bool = False, + disable_ble: bool = False, + disable_ota: bool = False, + se05x: bool = False): super(K32WBuilder, self).__init__( root=app.BuildRoot(root), runner=runner) @@ -64,6 +67,9 @@ def __init__(self, self.low_power = low_power self.tokenizer = tokenizer self.release = release + self.disable_ble = disable_ble + self.disable_ota = disable_ota + self.se05x = se05x def GnBuildArgs(self): args = [ @@ -81,6 +87,15 @@ def GnBuildArgs(self): if self.release: args.append('is_debug=false') + if self.disable_ble: + args.append('chip_enable_ble=false') + + if self.disable_ota: + args.append('chip_enable_ota_requestor=false') + + if self.se05x: + args.append('chip_with_se05x=true') + return args def generate(self): diff --git a/scripts/build/testdata/all_targets_except_host.txt b/scripts/build/testdata/all_targets_except_host.txt index 647e0b0a02bfc3..a25205367182fa 100644 --- a/scripts/build/testdata/all_targets_except_host.txt +++ b/scripts/build/testdata/all_targets_except_host.txt @@ -152,9 +152,8 @@ esp32-qemu-tests infineon-p6-all-clusters infineon-p6-light infineon-p6-lock -k32w-light (NOGLOB: Debug builds broken due to LWIP_DEBUG redefition) -k32w-light-release -k32w-light-tokenizer-release (NOGLOB: Only on demand build) +k32w-light-ota-se (NOGLOB: Only on demand build) +k32w-light-release-no-ota k32w-lock-low-power-release (NOGLOB: Only on demand build) k32w-lock-release k32w-shell-release diff --git a/scripts/build/testdata/build_all_except_host.txt b/scripts/build/testdata/build_all_except_host.txt index 552aea9f5efdae..81ae8a8de857b0 100644 --- a/scripts/build/testdata/build_all_except_host.txt +++ b/scripts/build/testdata/build_all_except_host.txt @@ -700,18 +700,13 @@ gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/exa {root}/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh -# Generating k32w-light -gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/examples/lighting-app/nxp/k32w/k32w0 '--args=k32w0_sdk_root="TEST_NXP_K32W061_SDK_ROOT" chip_with_low_power=0' {out}/k32w-light +# Generating k32w-light-ota-se +gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/examples/lighting-app/nxp/k32w/k32w0 '--args=k32w0_sdk_root="TEST_NXP_K32W061_SDK_ROOT" chip_with_low_power=0 is_debug=false chip_enable_ble=false chip_with_se05x=true' {out}/k32w-light-ota-se {root}/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh -# Generating k32w-light-release -gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/examples/lighting-app/nxp/k32w/k32w0 '--args=k32w0_sdk_root="TEST_NXP_K32W061_SDK_ROOT" chip_with_low_power=0 is_debug=false' {out}/k32w-light-release - -{root}/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh - -# Generating k32w-light-tokenizer-release -gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/examples/lighting-app/nxp/k32w/k32w0 '--args=k32w0_sdk_root="TEST_NXP_K32W061_SDK_ROOT" chip_with_low_power=0 chip_pw_tokenizer_logging=true is_debug=false' {out}/k32w-light-tokenizer-release +# Generating k32w-light-release-no-ota +gn gen --check --fail-on-unused-args --export-compile-commands --root={root}/examples/lighting-app/nxp/k32w/k32w0 '--args=k32w0_sdk_root="TEST_NXP_K32W061_SDK_ROOT" chip_with_low_power=0 chip_pw_tokenizer_logging=true is_debug=false chip_enable_ota_requestor=false' {out}/k32w-light-release-no-ota {root}/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh @@ -1619,14 +1614,11 @@ ninja -C {out}/infineon-p6-light # Building infineon-p6-lock ninja -C {out}/infineon-p6-lock -# Building k32w-light -ninja -C {out}/k32w-light - -# Building k32w-light-release -ninja -C {out}/k32w-light-release +# Building k32w-light-ota-se +ninja -C {out}/k32w-light-ota-se -# Building k32w-light-tokenizer-release -ninja -C {out}/k32w-light-tokenizer-release +# Building k32w-light-release-no-ota +ninja -C {out}/k32w-light-release-no-ota # Building k32w-lock-low-power-release ninja -C {out}/k32w-lock-low-power-release diff --git a/scripts/build/testdata/glob_star_targets_except_host.txt b/scripts/build/testdata/glob_star_targets_except_host.txt index 3adfb5b384ab2e..b28e45f29b39e9 100644 --- a/scripts/build/testdata/glob_star_targets_except_host.txt +++ b/scripts/build/testdata/glob_star_targets_except_host.txt @@ -46,7 +46,7 @@ esp32-qemu-tests infineon-p6-all-clusters infineon-p6-light infineon-p6-lock -k32w-light-release +k32w-light-release-no-ota k32w-lock-release k32w-shell-release mbed-CY8CPROTO_062_4343W-all-clusters-release diff --git a/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.cpp b/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.cpp index e5158a9905f7eb..7e44dcbaba1b9a 100644 --- a/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.cpp +++ b/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.cpp @@ -99,6 +99,11 @@ uint16_t DefaultOTARequestorDriver::GetMaxDownloadBlockSize() return 1024; } +void DefaultOTARequestorDriver::SetMaxDownloadBlockSize(uint16_t blockSize) +{ + maxDownloadBlockSize = blockSize; +} + void StartDelayTimerHandler(System::Layer * systemLayer, void * appState) { ToDriver(appState)->SendQueryImage(); diff --git a/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.h b/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.h index 87c66a5f775922..f0948dd3d22a96 100644 --- a/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.h +++ b/src/app/clusters/ota-requestor/DefaultOTARequestorDriver.h @@ -64,6 +64,7 @@ class DefaultOTARequestorDriver : public OTARequestorDriver //// Virtual methods from OTARequestorDriver bool CanConsent() override; uint16_t GetMaxDownloadBlockSize() override; + void SetMaxDownloadBlockSize(uint16_t maxDownloadBlockSize) override; void HandleError(UpdateFailureState state, CHIP_ERROR error) override; void HandleIdleStateExit() override; void HandleIdleState(IdleStateReason reason) override; @@ -99,6 +100,7 @@ class DefaultOTARequestorDriver : public OTARequestorDriver uint32_t mPeriodicQueryTimeInterval = (24 * 60 * 60); // Timeout (in seconds) for checking if current OTA download is stuck and requires a reset uint32_t mWatchdogTimeInterval = (6 * 60 * 60); + uint16_t maxDownloadBlockSize = 1024; // Maximum number of times to retry a BUSY OTA provider before moving to the next available one static constexpr uint8_t kMaxBusyProviderRetryCount = 3; uint8_t mProviderRetryCount; // Track retry count for the current provider diff --git a/src/app/clusters/ota-requestor/OTARequestorDriver.h b/src/app/clusters/ota-requestor/OTARequestorDriver.h index bcdc58b8010d81..d3856d17543e12 100644 --- a/src/app/clusters/ota-requestor/OTARequestorDriver.h +++ b/src/app/clusters/ota-requestor/OTARequestorDriver.h @@ -91,6 +91,9 @@ class OTARequestorDriver /// Return maximum supported download block size virtual uint16_t GetMaxDownloadBlockSize() { return 1024; } + /// Set maximum supported download block size + virtual void SetMaxDownloadBlockSize(uint16_t maxDownloadBlockSize) = 0; + /// Called when an error occurs at any OTA requestor operation virtual void HandleError(UpdateFailureState state, CHIP_ERROR error) = 0; diff --git a/src/include/platform/CHIPDeviceEvent.h b/src/include/platform/CHIPDeviceEvent.h index 0b935ff471c4d0..f5988a7a4ffc4d 100644 --- a/src/include/platform/CHIPDeviceEvent.h +++ b/src/include/platform/CHIPDeviceEvent.h @@ -240,6 +240,11 @@ enum PublicEventTypes * Signals that bindings were updated. */ kBindingsChangedViaCluster, + + /** + * Signals that the state of the OTA engine changed. + */ + kOtaStateChanged, }; /** @@ -299,6 +304,11 @@ enum ActivityChange kActivity_Stopped = -1, }; +enum OtaState +{ + kOtaSpaceAvailable = 0, +}; + inline ConnectivityChange GetConnectivityChange(bool prevState, bool newState) { if (prevState == newState) @@ -468,6 +478,11 @@ struct ChipDeviceEvent final // TODO(cecille): This should just specify wifi or thread since we assume at most 1. int network; } OperationalNetwork; + + struct + { + OtaState newState; + } OtaStateChanged; }; void Clear() { memset(this, 0, sizeof(*this)); } diff --git a/src/lwip/k32w0/lwipopts.h b/src/lwip/k32w0/lwipopts.h index daeb6afb17c035..1ecec9f14f0a70 100644 --- a/src/lwip/k32w0/lwipopts.h +++ b/src/lwip/k32w0/lwipopts.h @@ -113,7 +113,7 @@ #define PBUF_LINK_HLEN (0) #define TCPIP_THREAD_STACKSIZE (2048) -#define TCPIP_THREAD_PRIO (2) +#define TCPIP_THREAD_PRIO (3) #define NETIF_MAX_HWADDR_LEN 8U diff --git a/src/platform/BUILD.gn b/src/platform/BUILD.gn index f5e87a8b13deb7..ccacf2ccd87063 100644 --- a/src/platform/BUILD.gn +++ b/src/platform/BUILD.gn @@ -111,7 +111,8 @@ if (chip_device_platform != "none" && chip_device_platform != "external") { ] if (chip_device_platform == "linux" || chip_device_platform == "darwin" || - chip_device_platform == "tizen" || chip_device_platform == "android") { + chip_device_platform == "tizen" || chip_device_platform == "android" || + chip_device_platform == "k32w0") { defines += [ "CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE=${chip_enable_ble}" ] } diff --git a/src/platform/nxp/k32w/k32w0/BLEManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/BLEManagerImpl.cpp index 00229438b1616c..d96c3c0e1ed6cc 100644 --- a/src/platform/nxp/k32w/k32w0/BLEManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/BLEManagerImpl.cpp @@ -41,8 +41,6 @@ #include "stdio.h" #include "timers.h" -#include "RNG_Interface.h" - #if defined(cPWR_UsePowerDownMode) && (cPWR_UsePowerDownMode) #include "PWR_Configuration.h" #endif @@ -100,7 +98,7 @@ namespace { #define CONTROLLER_TASK_STACK_SIZE (gControllerTaskStackSize_c / sizeof(StackType_t)) /* host task configuration */ -#define HOST_TASK_PRIORITY (3U) +#define HOST_TASK_PRIORITY (4U) #define HOST_TASK_STACK_SIZE (gHost_TaskStackSize_c / sizeof(StackType_t)) /* ble app task configuration */ @@ -160,9 +158,6 @@ CHIP_ERROR BLEManagerImpl::_Init() err = BleLayer::Init(this, this, &DeviceLayer::SystemLayer()); SuccessOrExit(err); - (void) RNG_Init(); - RNG_SetPseudoRandomNoSeed(NULL); - /* Initialization of message wait events - * used for receiving BLE Stack events */ event_msg = OSA_EventCreate(TRUE); diff --git a/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h b/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h index 13232a2819b4d2..7a5778406aefa2 100644 --- a/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h +++ b/src/platform/nxp/k32w/k32w0/CHIPDevicePlatformConfig.h @@ -33,10 +33,6 @@ #define CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION 0 #define CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP 0 -#ifndef CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE -#define CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE 1 -#endif - #ifndef CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE #define CHIP_DEVICE_CHIP0BLE_DEBUG 0 #endif @@ -94,9 +90,15 @@ #define CHIP_DEVICE_CONFIG_ENABLE_PAIRING_AUTOSTART 0 +#define CHIP_DEVICE_CONFIG_THREAD_TASK_PRIORITY 3 + +#define CHIP_DEVICE_CONFIG_CHIP_TASK_PRIORITY 2 + #if CHIP_ENABLE_OPENTHREAD #define CHIP_DEVICE_CONFIG_ENABLE_THREAD 1 #define CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT 1 #define CHIP_DEVICE_CONFIG_ENABLE_THREAD_DNS_CLIENT 1 #define CHIP_DEVICE_CONFIG_ENABLE_EXTENDED_DISCOVERY 1 #endif + +#define CHIP_DEVICE_CONFIG_ENABLE_TEST_SETUP_PARAMS 1 diff --git a/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.cpp index 8819a8d3ca5dde..ec29b04d2e81a8 100644 --- a/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.cpp @@ -52,6 +52,13 @@ CHIP_ERROR ConfigurationManagerImpl::Init() CHIP_ERROR err; uint32_t rebootCount = 0; + // Save out software version on first boot + if (!K32WConfig::ConfigValueExists(K32WConfig::kConfigKey_SoftwareVersion)) + { + err = StoreSoftwareVersion(CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION); + SuccessOrExit(err); + } + if (K32WConfig::ConfigValueExists(K32WConfig::kCounterKey_RebootCount)) { err = GetRebootCount(rebootCount); @@ -111,6 +118,16 @@ CHIP_ERROR ConfigurationManagerImpl::StoreTotalOperationalHours(uint32_t totalOp return WriteConfigValue(K32WConfig::kCounterKey_TotalOperationalHours, totalOperationalHours); } +CHIP_ERROR ConfigurationManagerImpl::GetSoftwareVersion(uint32_t & softwareVer) +{ + return ReadConfigValue(K32WConfig::kConfigKey_SoftwareVersion, softwareVer); +} + +CHIP_ERROR ConfigurationManagerImpl::StoreSoftwareVersion(uint32_t softwareVer) +{ + return WriteConfigValue(K32WConfig::kConfigKey_SoftwareVersion, softwareVer); +} + CHIP_ERROR ConfigurationManagerImpl::GetBootReason(uint32_t & bootReason) { bootReason = to_underlying(BootReasonType::kUnspecified); diff --git a/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.h b/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.h index e7825239474125..bdceee20899ace 100644 --- a/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.h +++ b/src/platform/nxp/k32w/k32w0/ConfigurationManagerImpl.h @@ -51,6 +51,8 @@ class ConfigurationManagerImpl final : public Internal::GenericConfigurationMana CHIP_ERROR WritePersistedStorageValue(::chip::Platform::PersistedStorage::Key key, uint32_t value) override; CHIP_ERROR GetRebootCount(uint32_t & rebootCount) override; CHIP_ERROR StoreRebootCount(uint32_t rebootCount) override; + CHIP_ERROR GetSoftwareVersion(uint32_t & softwareVer) override; + CHIP_ERROR StoreSoftwareVersion(uint32_t softwareVer) override; CHIP_ERROR GetTotalOperationalHours(uint32_t & totalOperationalHours) override; CHIP_ERROR StoreTotalOperationalHours(uint32_t totalOperationalHours) override; CHIP_ERROR GetBootReason(uint32_t & bootReasons) override; diff --git a/src/platform/nxp/k32w/k32w0/K32W0Config.cpp b/src/platform/nxp/k32w/k32w0/K32W0Config.cpp index bf4910285160c4..6c8e4f9c1f2ad7 100644 --- a/src/platform/nxp/k32w/k32w0/K32W0Config.cpp +++ b/src/platform/nxp/k32w/k32w0/K32W0Config.cpp @@ -287,8 +287,20 @@ CHIP_ERROR K32WConfig::WriteConfigValueStr(Key key, const char * str, size_t str if (str != NULL) { - pdmStatus = PDM_eSaveRecordData((uint16_t) key, (void *) str, strLen); - SuccessOrExit(err = MapPdmStatus(pdmStatus)); + uint8_t * pData = (uint8_t *) pvPortMalloc(strLen + 1); + + if (pData != NULL) + { + memcpy(pData, str, strLen); + pData[strLen] = '\0'; + pdmStatus = PDM_eSaveRecordData((uint16_t) key, (void *) pData, strLen + 1); + vPortFree((void *) pData); + SuccessOrExit(err = MapPdmStatus(pdmStatus)); + } + else + { + err = CHIP_ERROR_NO_MEMORY; + } } else { diff --git a/src/platform/nxp/k32w/k32w0/K32W0Config.h b/src/platform/nxp/k32w/k32w0/K32W0Config.h index 08dcb907d999cc..f02bd367036f1a 100644 --- a/src/platform/nxp/k32w/k32w0/K32W0Config.h +++ b/src/platform/nxp/k32w/k32w0/K32W0Config.h @@ -28,7 +28,6 @@ #include -#include "MemManager.h" #include "PDM.h" namespace chip { @@ -92,6 +91,8 @@ class K32WConfig static constexpr Key kConfigKey_CountryCode = K32WConfigKey(kPDMId_ChipConfig, 0x08); static constexpr Key kConfigKey_Breadcrumb = K32WConfigKey(kPDMId_ChipConfig, 0x09); static constexpr Key kConfigKey_UniqueId = K32WConfigKey(kPDMId_ChipConfig, 0x0A); + static constexpr Key kConfigKey_SoftwareVersion = K32WConfigKey(kPDMId_ChipConfig, 0x0B); + static constexpr Key kConfigKey_FirstRunOfOTAImage = K32WConfigKey(kPDMId_ChipConfig, 0x0C); // CHIP Counter Keys static constexpr Key kCounterKey_RebootCount = K32WConfigKey(kPDMId_ChipCounter, 0x00); @@ -101,11 +102,11 @@ class K32WConfig // Set key id limits for each group. static constexpr Key kMinConfigKey_ChipFactory = K32WConfigKey(kPDMId_ChipFactory, 0x00); - static constexpr Key kMaxConfigKey_ChipFactory = K32WConfigKey(kPDMId_ChipFactory, 0x0B); + static constexpr Key kMaxConfigKey_ChipFactory = K32WConfigKey(kPDMId_ChipFactory, 0xFF); static constexpr Key kMinConfigKey_ChipConfig = K32WConfigKey(kPDMId_ChipConfig, 0x00); - static constexpr Key kMaxConfigKey_ChipConfig = K32WConfigKey(kPDMId_ChipConfig, 0x1E); + static constexpr Key kMaxConfigKey_ChipConfig = K32WConfigKey(kPDMId_ChipConfig, 0xFF); static constexpr Key kMinConfigKey_ChipCounter = K32WConfigKey(kPDMId_ChipCounter, 0x00); - static constexpr Key kMaxConfigKey_ChipCounter = K32WConfigKey(kPDMId_ChipCounter, 0x1F); // Allows 32 Counters to be created. + static constexpr Key kMaxConfigKey_ChipCounter = K32WConfigKey(kPDMId_ChipCounter, 0xFF); // Allows 32 Counters to be created. static constexpr Key kMinConfigKey_KVS = K32WConfigKey(kPDMId_KVS, 0x00); static constexpr Key kMaxConfigKey_KVS = K32WConfigKey(kPDMId_KVS, 0xFF); diff --git a/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp index 5753f614a0550a..09fe21772150b4 100644 --- a/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/KeyValueStoreManagerImpl.cpp @@ -38,7 +38,7 @@ namespace DeviceLayer { namespace PersistedStorage { /* TODO: adjust these values */ -constexpr size_t kMaxNumberOfKeys = 20; +constexpr size_t kMaxNumberOfKeys = 30; constexpr size_t kMaxKeyValueBytes = 255; KeyValueStoreManagerImpl KeyValueStoreManagerImpl::sInstance; @@ -118,7 +118,7 @@ CHIP_ERROR RestoreFromFlash() CHIP_ERROR KeyValueStoreManagerImpl::_Get(const char * key, void * value, size_t value_size, size_t * read_bytes_size, size_t offset_bytes) { - CHIP_ERROR err = CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND; + CHIP_ERROR err = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND; uint8_t pdm_id_kvs = chip::DeviceLayer::Internal::K32WConfig::kPDMId_KVS; std::unordered_map::const_iterator it; size_t read_bytes = 0; @@ -194,7 +194,8 @@ CHIP_ERROR KeyValueStoreManagerImpl::_Put(const char * key, const void * value, pdm_internal_id = chip::DeviceLayer::Internal::K32WConfigKey(pdm_id_kvs, key_id + kMaxNumberOfKeys); ChipLogProgress(DeviceLayer, "KVS, save in flash the Matter key [%s] with PDM id: %i", key, pdm_internal_id); - err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueStr(pdm_internal_id, key, strlen(key)); + /* TODO (MATTER-132): do we need to make sure that "key" is NULL-terminated? */ + err = chip::DeviceLayer::Internal::K32WConfig::WriteConfigValueStr(pdm_internal_id, key, strlen(key) + 1); if (err != CHIP_NO_ERROR) { diff --git a/src/platform/nxp/k32w/k32w0/NFCManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/NFCManagerImpl.cpp index 90267ff0aff148..f6254515312d5b 100644 --- a/src/platform/nxp/k32w/k32w0/NFCManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/NFCManagerImpl.cpp @@ -25,6 +25,8 @@ #include #include +#include "FunctionLib.h" + namespace chip { namespace DeviceLayer { diff --git a/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.cpp b/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.cpp index 895f116bc0d11c..27deee3fece95f 100644 --- a/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.cpp @@ -16,7 +16,9 @@ * limitations under the License. */ +#include #include +#include #include "OTAImageProcessorImpl.h" #include "OtaSupport.h" @@ -24,16 +26,13 @@ extern "C" void ResetMCU(void); +using namespace chip::DeviceLayer; +using namespace ::chip::DeviceLayer::Internal; + namespace chip { CHIP_ERROR OTAImageProcessorImpl::PrepareDownload() { - if (mImageFile == nullptr) - { - ChipLogError(SoftwareUpdate, "Invalid output image file supplied"); - return CHIP_ERROR_INTERNAL; - } - DeviceLayer::PlatformMgr().ScheduleWork(HandlePrepareDownload, reinterpret_cast(this)); return CHIP_NO_ERROR; } @@ -46,6 +45,7 @@ CHIP_ERROR OTAImageProcessorImpl::Finalize() CHIP_ERROR OTAImageProcessorImpl::Apply() { + DeviceLayer::PlatformMgr().ScheduleWork(HandleApply, reinterpret_cast(this)); return CHIP_NO_ERROR; } @@ -79,6 +79,14 @@ CHIP_ERROR OTAImageProcessorImpl::ProcessBlock(ByteSpan & block) return CHIP_NO_ERROR; } +void OTAImageProcessorImpl::TriggerNewRequestForData() +{ + if (mDownloader) + { + this->mDownloader->FetchNextData(); + } +} + void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context) { auto * imageProcessor = reinterpret_cast(context); @@ -95,13 +103,26 @@ void OTAImageProcessorImpl::HandlePrepareDownload(intptr_t context) if (gOtaSuccess_c == OTA_ClientInit()) { - if (gOtaSuccess_c == OTA_StartImage(strlen(imageProcessor->mImageFile))) - { - imageProcessor->mDownloader->OnPreparedForDownload(CHIP_NO_ERROR); - } + imageProcessor->mHeaderParser.Init(); + imageProcessor->mDownloader->OnPreparedForDownload(CHIP_NO_ERROR); } } +CHIP_ERROR OTAImageProcessorImpl::ProcessHeader(ByteSpan & block) +{ + OTAImageHeader header; + CHIP_ERROR error = mHeaderParser.AccumulateAndDecode(block, header); + + // Needs more data to decode the header + ReturnErrorCodeIf(error == CHIP_ERROR_BUFFER_TOO_SMALL, CHIP_NO_ERROR); + ReturnErrorOnFailure(error); + mParams.totalFileBytes = header.mPayloadSize; + mSoftwareVersion = header.mSoftwareVersion; + mHeaderParser.Clear(); + + return CHIP_NO_ERROR; +} + void OTAImageProcessorImpl::HandleAbort(intptr_t context) { auto * imageProcessor = reinterpret_cast(context); @@ -116,6 +137,8 @@ void OTAImageProcessorImpl::HandleAbort(intptr_t context) void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) { + CHIP_ERROR error = CHIP_NO_ERROR; + auto * imageProcessor = reinterpret_cast(context); if (imageProcessor == nullptr) { @@ -128,8 +151,50 @@ void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) return; } + /* process OTA header if not already did */ + if (imageProcessor->mHeaderParser.IsInitialized()) + { + ByteSpan block = ByteSpan(imageProcessor->mBlock.data(), imageProcessor->mBlock.size()); + + error = imageProcessor->ProcessHeader(block); + if (error == CHIP_NO_ERROR) + { + if (gOtaSuccess_c == OTA_StartImage(imageProcessor->mParams.totalFileBytes)) + { + uint8_t * ptr = static_cast(chip::Platform::MemoryAlloc(block.size())); + + if (ptr != nullptr) + { + MutableByteSpan mutableBlock = MutableByteSpan(ptr, block.size()); + error = CopySpanToMutableSpan(block, mutableBlock); + + if (error == CHIP_NO_ERROR) + { + imageProcessor->ReleaseBlock(); + imageProcessor->mBlock = MutableByteSpan(mutableBlock.data(), mutableBlock.size()); + } + } + else + { + error = CHIP_ERROR_NO_MEMORY; + } + } + else + { + error = CHIP_ERROR_INTERNAL; + } + } + } + + if (error != CHIP_NO_ERROR) + { + ChipLogError(SoftwareUpdate, "Failed to process OTA image header"); + imageProcessor->mDownloader->EndDownload(error); + return; + } + /* Will start an erase of 4K if necessary */ - if (gOtaSuccess_c == OTA_MakeHeadRoomForNextBlock(imageProcessor->mBlock.size(), NULL, 0)) + if (gOtaSuccess_c == OTA_MakeHeadRoomForNextBlock(imageProcessor->mBlock.size(), HandleBlockEraseComplete, 0)) { if (gOtaSuccess_c == OTA_PushImageChunk(imageProcessor->mBlock.data(), (uint16_t) imageProcessor->mBlock.size(), NULL, NULL)) @@ -140,6 +205,25 @@ void OTAImageProcessorImpl::HandleProcessBlock(intptr_t context) } } +bool OTAImageProcessorImpl::IsFirstImageRun() +{ + bool firstRun = false; + + if (CHIP_NO_ERROR == (K32WConfig::ReadConfigValue(K32WConfig::kConfigKey_FirstRunOfOTAImage, firstRun))) + { + return firstRun; + } + + return false; +} + +CHIP_ERROR OTAImageProcessorImpl::ConfirmCurrentImage() +{ + bool firstRun = false; + + return K32WConfig::WriteConfigValue(K32WConfig::kConfigKey_FirstRunOfOTAImage, firstRun); +} + CHIP_ERROR OTAImageProcessorImpl::SetBlock(ByteSpan & block) { if (!IsSpanUsable(block)) @@ -176,15 +260,37 @@ void OTAImageProcessorImpl::HandleFinalize(intptr_t context) return; } + imageProcessor->ReleaseBlock(); +} + +void OTAImageProcessorImpl::HandleApply(intptr_t context) +{ + auto * imageProcessor = reinterpret_cast(context); + bool firstRun = true; + + if (imageProcessor == nullptr) + { + return; + } + OTA_CommitImage(NULL); if (OTA_ImageAuthenticate() == gOtaImageAuthPass_c) { - /* Set the necessary information to inform the SSBL that a new image is available */ - OTA_SetNewImageFlag(); - ResetMCU(); - } - imageProcessor->ReleaseBlock(); + /* TODO internal: MATTER-126 */ + /*if (CHIP_NO_ERROR == K32WConfig::WriteConfigValue(K32WConfig::kConfigKey_FirstRunOfOTAImage, firstRun)) */ + { + /* Set the necessary information to inform the SSBL that a new image is available */ + DeviceLayer::ConfigurationMgr().StoreSoftwareVersion(imageProcessor->mSoftwareVersion); + OTA_SetNewImageFlag(); + ChipLogProgress(SoftwareUpdate, "OTA image authentication success. Device will reboot with the new image!"); + ResetMCU(); + } + } + else + { + ChipLogError(SoftwareUpdate, "Image authentication error"); + } } CHIP_ERROR OTAImageProcessorImpl::ReleaseBlock() @@ -198,4 +304,19 @@ CHIP_ERROR OTAImageProcessorImpl::ReleaseBlock() return CHIP_NO_ERROR; } +void OTAImageProcessorImpl::HandleBlockEraseComplete(uint32_t) +{ + CHIP_ERROR error = CHIP_NO_ERROR; + + ChipDeviceEvent otaChange; + otaChange.Type = DeviceEventType::kOtaStateChanged; + otaChange.OtaStateChanged.newState = kOtaSpaceAvailable; + error = PlatformMgr().PostEvent(&otaChange); + + if (error != CHIP_NO_ERROR) + { + ChipLogError(SoftwareUpdate, "Error while posting OtaChange event"); + } +} + } // namespace chip diff --git a/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.h b/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.h index 845c43bfc85eea..e431f538c5e984 100644 --- a/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.h +++ b/src/platform/nxp/k32w/k32w0/OTAImageProcessorImpl.h @@ -18,6 +18,7 @@ #pragma once +#include #include #include #include @@ -33,18 +34,21 @@ class OTAImageProcessorImpl : public OTAImageProcessorInterface CHIP_ERROR Apply() override; CHIP_ERROR Abort() override; CHIP_ERROR ProcessBlock(ByteSpan & block) override; - bool IsFirstImageRun() override { return false; } - CHIP_ERROR ConfirmCurrentImage() override { return CHIP_NO_ERROR; } - + bool IsFirstImageRun() override; + CHIP_ERROR ConfirmCurrentImage() override; + void TriggerNewRequestForData(); void SetOTADownloader(OTADownloader * downloader) { mDownloader = downloader; } void SetOTAImageFile(const char * imageFile) { mImageFile = imageFile; } private: //////////// Actual handlers for the OTAImageProcessorInterface /////////////// static void HandlePrepareDownload(intptr_t context); + CHIP_ERROR ProcessHeader(ByteSpan & block); static void HandleFinalize(intptr_t context); + static void HandleApply(intptr_t context); static void HandleAbort(intptr_t context); static void HandleProcessBlock(intptr_t context); + static void HandleBlockEraseComplete(uint32_t); /** * Called to allocate memory for mBlock if necessary and set it to block @@ -57,8 +61,10 @@ class OTAImageProcessorImpl : public OTAImageProcessorInterface CHIP_ERROR ReleaseBlock(); OTADownloader * mDownloader; + OTAImageHeaderParser mHeaderParser; MutableByteSpan mBlock; const char * mImageFile = nullptr; + uint32_t mSoftwareVersion; }; } // namespace chip diff --git a/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.cpp b/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.cpp index 9b928dea89aa86..ef6c5c3556d1dd 100644 --- a/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.cpp +++ b/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -35,12 +36,48 @@ #include #include "K32W061.h" +#include "MemManager.h" +#include "RNG_Interface.h" +#include "TimersManager.h" +#include "fsl_sha.h" +#include "k32w0-chip-mbedtls-config.h" namespace chip { namespace DeviceLayer { PlatformManagerImpl PlatformManagerImpl::sInstance; +CHIP_ERROR PlatformManagerImpl::InitBoardFwk(void) +{ + CHIP_ERROR err = CHIP_NO_ERROR; + char initString[] = "app"; + char * argv[1] = { 0 }; + argv[0] = &initString[0]; + + SHA_ClkInit(SHA_INSTANCE); + + if (MEM_Init() != MEM_SUCCESS_c) + { + err = CHIP_ERROR_NO_MEMORY; + goto exit; + } + + if (RNG_Init() != gRngSuccess_d) + { + err = CHIP_ERROR_RANDOM_DATA_UNAVAILABLE; + goto exit; + } + RNG_SetPseudoRandomNoSeed(NULL); + + TMR_Init(); + + /* Used for OT initializations */ + otSysInit(1, argv); + +exit: + return err; +} + static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen) { otError otErr = otPlatEntropyGet(output, (uint16_t) len); @@ -56,13 +93,15 @@ static int app_entropy_source(void * data, unsigned char * output, size_t len, s CHIP_ERROR PlatformManagerImpl::_InitChipStack(void) { - CHIP_ERROR err; + uint32_t chipType; + CHIP_ERROR err = CHIP_NO_ERROR; // Initialize the configuration system. err = Internal::K32WConfig::Init(); SuccessOrExit(err); - if (Chip_GetType() != CHIP_K32W061) + chipType = Chip_GetType(); + if ((chipType != CHIP_K32W061) && (chipType != CHIP_K32W041) && (chipType != CHIP_K32W041A) && (chipType != CHIP_K32W041AM)) { err = CHIP_ERROR_INTERNAL; ChipLogError(DeviceLayer, "Invalid chip type, expected K32W061"); diff --git a/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.h b/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.h index c3fa03ac8fa3ce..b9452e0f5c92e8 100644 --- a/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.h +++ b/src/platform/nxp/k32w/k32w0/PlatformManagerImpl.h @@ -49,6 +49,7 @@ class PlatformManagerImpl final : public PlatformManager, public Internal::Gener // ===== Platform-specific members that may be accessed directly by the application. System::Clock::Timestamp GetStartTime() { return mStartTime; } + CHIP_ERROR InitBoardFwk(void); private: // ===== Methods that implement the PlatformManager abstract interface. diff --git a/src/platform/nxp/k32w/k32w0/args.gni b/src/platform/nxp/k32w/k32w0/args.gni index 5bfab05ecaff7e..d6ccbd8bb86e29 100644 --- a/src/platform/nxp/k32w/k32w0/args.gni +++ b/src/platform/nxp/k32w/k32w0/args.gni @@ -29,7 +29,7 @@ chip_build_tests = false chip_mdns = "platform" # Trying to fit into the available flash by disabling optional logging for now -chip_detail_logging = true +chip_detail_logging = false chip_progress_logging = true mbedtls_target = "${chip_root}/third_party/nxp/k32w0_sdk:mbedtls" diff --git a/third_party/nxp/k32w0_sdk/BUILD.gn b/third_party/nxp/k32w0_sdk/BUILD.gn index 2bad31f2060c9d..2019a2c2a55f36 100644 --- a/third_party/nxp/k32w0_sdk/BUILD.gn +++ b/third_party/nxp/k32w0_sdk/BUILD.gn @@ -42,7 +42,6 @@ config("mbedtls_k32w0_config") { "MBEDTLS_X509_CREATE_C", "MBEDTLS_PEM_WRITE_C", "MBEDTLS_HKDF_C", - "MBEDTLS_ERROR_C", "MBEDTLS_PKCS5_C", ] diff --git a/third_party/nxp/k32w0_sdk/k32w0_sdk.gni b/third_party/nxp/k32w0_sdk/k32w0_sdk.gni index c08806190eda51..4206ceded05c79 100644 --- a/third_party/nxp/k32w0_sdk/k32w0_sdk.gni +++ b/third_party/nxp/k32w0_sdk/k32w0_sdk.gni @@ -21,6 +21,7 @@ import("${chip_root}/src/platform/nxp/k32w/k32w0/args.gni") declare_args() { # Location of the k32w0 SDK. k32w0_sdk_root = getenv("NXP_K32W061_SDK_ROOT") + chip_with_DK6 = true chip_with_OM15082 = 0 chip_with_ot_cli = 0 chip_with_low_power = 0 @@ -38,7 +39,13 @@ template("k32w0_sdk") { k32w0_sdk_root = invoker.k32w0_sdk_root } + if (defined(invoker.override_is_DK6)) { + chip_with_DK6 = invoker.override_is_DK6 + } + assert(k32w0_sdk_root != "", "k32w0_sdk_root must be specified") + assert(chip_with_OM15082 == 0 || chip_with_DK6, + "OM15082 expansion board is only supported on DK6 board") assert( chip_with_low_power == 0 || (chip_with_low_power == 1 && chip_with_OM15082 == 0 && @@ -56,10 +63,21 @@ template("k32w0_sdk") { # We want to treat SDK headers as system headers, so that warnings in those # headers are not fatal. Therefore don't add them directly to include_dirs; # we will add them to cflags below instead. - _sdk_include_dirs = [ - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm", - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/enablement", - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common", + _sdk_include_dirs = [] + + if (chip_with_DK6) { + if (chip_with_low_power != 0) { + _sdk_include_dirs += [ "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm" ] + } else { + _sdk_include_dirs += [ "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm" ] + } + } + + if (chip_with_low_power != 0) { + _sdk_include_dirs += [ "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common" ] + } + + _sdk_include_dirs += [ "${chip_root}/src/platform/nxp/k32w/k32w0", "${k32w0_sdk_root}/CMSIS/Include", "${k32w0_sdk_root}/components/serial_manager", @@ -130,7 +148,7 @@ template("k32w0_sdk") { "CPU_JN518X_REV=2", "JENNIC_CHIP_FAMILY_NAME=_JN518x", "gPWR_LDOMEM_0_9V_PD=0", - "SDK_DEBUGCONSOLE=1", + "SDK_DEBUGCONSOLE=DEBUGCONSOLE_REDIRECT_TO_SDK", "NO_SYSCORECLK_UPD=0", "USE_RTOS=1", "USE_SDK_OSA=0", @@ -140,26 +158,22 @@ template("k32w0_sdk") { "gUartDebugConsole_d=1", "DEBUG_SERIAL_INTERFACE_INSTANCE=0", "APP_SERIAL_INTERFACE_INSTANCE=1", - "gUsePdm_d=1", - "PDM_EXT_FLASH=1", - "gEepromType_d=gEepromDevice_MX25R8035F_c", "gOTA_externalFlash_d=1", "gEepromPostedOperations_d=1", "gOtaEepromPostedOperations_d=1", + "gOtaVerifyWrite_d=0", + "gExternalFlashIsCiphered_d=1", + "gBootData_None_c=1", "PROGRAM_PAGE_SZ=256", - "gKeyBoardSupported_d", - "gPdmNbSegments=63", "configFRTOS_MEMORY_SCHEME=4", "osCustomStartup=1", - "gLEDsOnTargetBoardCnt_c=2", - "gLED_InvertedMode_d=1", "ENABLE_RAM_VECTOR_TABLE=1", "gTMR_Enabled_d=1", "gTimestamp_Enabled_d=0", "K32W_LOG_ENABLED=1", "CHIP_ENABLE_OPENTHREAD=1", "gOtaMemPoolId_c=1", - "PoolsDetails_c=_block_size_ 32 _number_of_blocks_ 6 _pool_id_(0) _eol_ _block_size_ 256 _number_of_blocks_ 3 _pool_id_(0) _eol_ _block_size_ 512 _number_of_blocks_ 2 _pool_id_(0) _eol_ _block_size_ 768 _number_of_blocks_ 1 _pool_id_(0) _eol_ _block_size_ 268 _number_of_blocks_ 4 _pool_id_(gOtaMemPoolId_c) _eol_", + "PoolsDetails_c=_block_size_ 32 _number_of_blocks_ 6 _pool_id_(0) _eol_ _block_size_ 256 _number_of_blocks_ 3 _pool_id_(0) _eol_ _block_size_ 512 _number_of_blocks_ 2 _pool_id_(0) _eol_ _block_size_ 768 _number_of_blocks_ 1 _pool_id_(0) _eol_ _block_size_ 268 _number_of_blocks_ 8 _pool_id_(gOtaMemPoolId_c) _eol_", "SUPPORT_FOR_15_4=1", "gAppMaxConnections_c=1", "gAppUseBonding_d=0", @@ -192,13 +206,34 @@ template("k32w0_sdk") { ] } - if (chip_with_OM15082 == 1) { + if (chip_with_DK6) { defines += [ - "gKBD_KeysCount_c=4", - "OM15082=1", + "gUsePdm_d=1", + "PDM_EXT_FLASH=1", + "gEepromType_d=gEepromDevice_MX25R8035F_c", + "gPdmNbSegments=63", ] - } else { - defines += [ "gKBD_KeysCount_c=1" ] + + if (chip_with_OM15082 != 0) { + defines += [ + "OM15082=1", + "gKeyBoardSupported_d=1", + "gKBD_KeysCount_c=4", + ] + } else { + defines += [ + "gKeyBoardSupported_d=1", + "gKBD_KeysCount_c=1", + ] + } + + if (chip_with_low_power == 0) { + defines += [ + "gLEDSupported_d=1", + "gLEDsOnTargetBoardCnt_c=2", + "gLED_InvertedMode_d=1", + ] + } } if (chip_with_ot_cli == 1) { @@ -218,9 +253,6 @@ template("k32w0_sdk") { ] } else { defines += [ - "gLEDSupported_d", - "gLED_InvertedMode_d=1", - "gLEDsOnTargetBoardCnt_c=2", "cPWR_UsePowerDownMode=0", "cPWR_FullPowerDownMode=0", ] @@ -257,9 +289,6 @@ template("k32w0_sdk") { } sources += [ - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/board.c", - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/board_utility.c", - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/hardware_init.c", "${k32w0_sdk_root}/components/serial_manager/serial_manager.c", "${k32w0_sdk_root}/components/serial_manager/serial_port_uart.c", "${k32w0_sdk_root}/components/uart/usart_adapter.c", @@ -332,19 +361,37 @@ template("k32w0_sdk") { "${k32w0_sdk_root}/rtos/amazon-freertos/lib/FreeRTOS/timers.c", ] - if (chip_with_se05x == 1) { - sources += [ - "${chip_root}/third_party/simw-top-mini/repo/demos/ksdk/common/boards/DK6/wireless_examples/chip/clock_config.c", - "${chip_root}/third_party/simw-top-mini/repo/demos/ksdk/common/boards/DK6/wireless_examples/chip/pin_mux.c", - ] - } else { - sources += [ - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/enablement/clock_config.c", - "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/enablement/pin_mux.c", - ] + if (chip_with_DK6) { + if (chip_with_low_power != 0) { + sources += [ + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm/board.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm/board_utility.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm/clock_config.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm/hardware_init.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/lped/bm/pin_mux.c", + ] + } else { + sources += [ + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/board.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/board_utility.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/hardware_init.c", + ] + + if (chip_with_se05x != 0) { + sources += [ + "${chip_root}/third_party/simw-top-mini/repo/demos/ksdk/common/boards/DK6/wireless_examples/chip/clock_config.c", + "${chip_root}/third_party/simw-top-mini/repo/demos/ksdk/common/boards/DK6/wireless_examples/chip/pin_mux.c", + ] + } else { + sources += [ + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/clock_config.c", + "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/openthread/reed/bm/pin_mux.c", + ] + } + } } - if (chip_with_low_power == 1) { + if (chip_with_low_power != 0) { sources += [ "${k32w0_sdk_root}/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common/app_dual_mode_low_power.c" ] } diff --git a/third_party/nxp/k32w0_sdk/sdk_fixes/Eeprom_MX25R8035F_c.patch b/third_party/nxp/k32w0_sdk/sdk_fixes/Eeprom_MX25R8035F_c.patch new file mode 100644 index 00000000000000..c017836bfa83aa --- /dev/null +++ b/third_party/nxp/k32w0_sdk/sdk_fixes/Eeprom_MX25R8035F_c.patch @@ -0,0 +1,112 @@ +--- a/Eeprom_MX25R8035F.c ++++ b//Eeprom_MX25R8035F.c +@@ -146,7 +146,7 @@ static uint32_t EEPROM_ReadStatusReq(void); + static uint32_t EEPROM_ReadIDReq(void); + static uint32_t EEPROM_ReadResReq(void); + +- ++static uint8_t EEPROM_isBusyPrivate(void); + + #define MX25_SR_WIP_POS 0 /* Write In Progress */ + #define MX25_SR_WEL_POS 1 /* Write Enable Latch */ +@@ -316,7 +316,7 @@ ee_err_t EEPROM_Init(void) + { + initialized = 1; + } +- while (EEPROM_isBusy()); ++ while (EEPROM_isBusyPrivate()); + } + + return status; +@@ -366,7 +366,7 @@ ee_err_t EEPROM_ChipErase(void) + + /* Wait for idle state : check before operation in order to let previous + * operation terminate rather than blocking */ +- while (EEPROM_isBusy()); ++ while (EEPROM_isBusyPrivate()); + + /* Enable write */ + EEPROM_WriteEnable(); +@@ -410,7 +410,7 @@ ee_err_t EEPROM_EraseBlock(uint32_t Addr, uint32_t block_size) + + OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); + +- while (EEPROM_isBusy()); ++ while (EEPROM_isBusyPrivate()); + + EEPROM_WriteEnable(); + +@@ -485,7 +485,7 @@ ee_err_t EEPROM_EraseArea(uint32_t *Addr, int32_t *size, bool non_blocking) + { + OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); + +- if (non_blocking && EEPROM_isBusy()) ++ if (non_blocking && EEPROM_isBusyPrivate()) + { + status = ee_busy; + OSA_SemaphorePost(mExtEepromSemaphoreId); +@@ -679,7 +679,7 @@ void EEPROM_SetRead(void) + + OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); + +- while (EEPROM_isBusy()); ++ while (EEPROM_isBusyPrivate()); + + /* Set start address */ + SPIFI_SetCommandAddress(SPIFI, FSL_FEATURE_SPIFI_START_ADDR ); +@@ -714,7 +714,7 @@ ee_err_t EEPROM_ReadData(uint16_t NoOfBytes, uint32_t Addr, uint8_t *inbuf) + + OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); + +- while (EEPROM_isBusy()); ++ while (EEPROM_isBusyPrivate()); + + /* Set start address */ + SPIFI_SetCommandAddress(SPIFI, FSL_FEATURE_SPIFI_START_ADDR + Addr); +@@ -750,7 +750,12 @@ ee_err_t EEPROM_ReadData(uint16_t NoOfBytes, uint32_t Addr, uint8_t *inbuf) + ********************************************************************************** */ + uint8_t EEPROM_isBusy(void) + { +- return (EEPROM_ReadStatusReq() & EEPROM_BUSY_FLAG_MASK) == EEPROM_BUSY_FLAG_MASK; ++ uint8_t res = 0; ++ ++ OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); ++ res = EEPROM_isBusyPrivate(); ++ OSA_SemaphorePost(mExtEepromSemaphoreId); ++ return res; + } + + /*! ********************************************************************************* +@@ -759,6 +764,11 @@ uint8_t EEPROM_isBusy(void) + ************************************************************************************* + ********************************************************************************** */ + ++static uint8_t EEPROM_isBusyPrivate(void) ++{ ++ return (EEPROM_ReadStatusReq() & EEPROM_BUSY_FLAG_MASK) == EEPROM_BUSY_FLAG_MASK; ++} ++ + /*! ********************************************************************************* + * \brief Read the memory controller status register + * +@@ -882,6 +892,7 @@ void EepromWritePage(uint32_t NoOfBytes, uint32_t Addr, uint8_t *Outbuf) + #endif /* gFlashBlockBitmap_d */ + + OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); ++ while (EEPROM_isBusyPrivate()); + + EEPROM_WriteEnable(); + SPIFI_SetCommandAddress(SPIFI, Addr + FSL_FEATURE_SPIFI_START_ADDR); +@@ -917,12 +928,6 @@ static ee_err_t EEPROM_WritePage(uint32_t NoOfBytes, uint32_t Addr, uint8_t *Out + + if (NoOfBytes > 0) + { +- OSA_SemaphoreWait(mExtEepromSemaphoreId, osaWaitForever_c); +- +- while (EEPROM_isBusy()); +- +- OSA_SemaphorePost(mExtEepromSemaphoreId); +- + EepromWritePage(NoOfBytes, Addr, Outbuf); + } + diff --git a/third_party/nxp/k32w0_sdk/sdk_fixes/MemManager_h.patch b/third_party/nxp/k32w0_sdk/sdk_fixes/MemManager_h.patch new file mode 100644 index 00000000000000..49ed7e803738cd --- /dev/null +++ b/third_party/nxp/k32w0_sdk/sdk_fixes/MemManager_h.patch @@ -0,0 +1,22 @@ +--- a/MemManager.h ++++ b/MemManager.h +@@ -24,6 +24,9 @@ + #include "EmbeddedTypes.h" + #include "GenericList.h" + ++#ifdef __cplusplus ++extern "C" { ++#endif + + /*! ********************************************************************************* + ************************************************************************************* +@@ -220,4 +223,8 @@ extern __attribute__((weak)) uint32_t MEM_GetTimeStamp(void); + + #endif /*MEM_TRACKING*/ + ++#ifdef __cplusplus ++} ++#endif ++ + #endif /* _MEM_MANAGER_H_ */ + diff --git a/third_party/nxp/k32w0_sdk/sdk_fixes/OtaSupport_c.patch b/third_party/nxp/k32w0_sdk/sdk_fixes/OtaSupport_c.patch new file mode 100644 index 00000000000000..0ff1c9ec118651 --- /dev/null +++ b/third_party/nxp/k32w0_sdk/sdk_fixes/OtaSupport_c.patch @@ -0,0 +1,144 @@ +--- a/OtaSupport.c ++++ b/OtaSupport.c +@@ -116,10 +116,9 @@ typedef bool (*efuse_AESKeyPresent_t)(void); + typedef int (*efuse_LoadUniqueKey_t)(void); + typedef uint32_t (*aesLoadKeyFromOTP_t)(AES_KEY_SIZE_T keySize); + +-const static efuse_LoadUniqueKey_t efuse_LoadUniqueKey = (efuse_LoadUniqueKey_t)ROM_API_efuse_LoadUniqueKey; +-const static aesLoadKeyFromOTP_t aesLoadKeyFromOTP = (aesLoadKeyFromOTP_t)ROM_API_aesLoadKeyFromOTP; +-const static efuse_AESKeyPresent_t efuse_AESKeyPresent = (efuse_AESKeyPresent_t)ROM_API_efuse_AESKeyPresent; +- ++static const efuse_LoadUniqueKey_t efuse_LoadUniqueKey = (efuse_LoadUniqueKey_t)ROM_API_efuse_LoadUniqueKey; ++static const aesLoadKeyFromOTP_t aesLoadKeyFromOTP = (aesLoadKeyFromOTP_t)ROM_API_aesLoadKeyFromOTP; ++static const efuse_AESKeyPresent_t efuse_AESKeyPresent = (efuse_AESKeyPresent_t)ROM_API_efuse_AESKeyPresent; + + #if gUsePasswordCiphering_d + const static uint32_t (*aesLoadKeyFromSW)(AES_KEY_SIZE_T keySize, +@@ -187,6 +186,7 @@ typedef struct { + int max_cnt_idle; + int q_sz; + int q_max; ++ osaMutexId_t msgQueueMutex; + #endif + eEncryptionKeyType ciphered_mode; + #if gExternalFlashIsCiphered_d +@@ -207,6 +207,7 @@ typedef struct { + #if ( gEepromParams_bufferedWrite_c == 1) + bool_t gOtaInvalidateHeader; + #endif ++ bool_t isInitialized; + } OtaFlashTaskContext_t; + + /****************************************************************************** +@@ -287,6 +288,7 @@ static OtaFlashTaskContext_t mHandle = { + #if ( gEepromParams_bufferedWrite_c == 1) + .gOtaInvalidateHeader = FALSE, + #endif ++ .isInitialized = FALSE, + }; + + +@@ -460,6 +462,11 @@ otaResult_t OTA_StartImageWithMaxSize(uint32_t length, uint32_t maxAllowedArchSi + int OTA_TransactionResume(void) + { + int nb_treated = 0; ++ ++ if (mHandle.isInitialized) ++ { ++ OSA_MutexLock(mHandle.msgQueueMutex, osaWaitForever_c); ++ + while ( OTA_IsTransactionPending() /* There are queued flash operations pending in queue */ + && (nb_treated < MAX_CONSECUTIVE_TRANSACTIONS)) /* ... but do not schedule too many in a same pass */ + { +@@ -553,6 +560,9 @@ int OTA_TransactionResume(void) + /* There were transactions pending but we consumed some */ + mHandle.cnt_idle_op = 0; + ++ OSA_MutexUnlock(mHandle.msgQueueMutex); ++ } ++ + return nb_treated; + } + /***************************************************************************** +@@ -578,7 +588,11 @@ void OTA_WritePendingData(void) + + while (EEPROM_isBusy()); + /* Always take head of queue : we just queued something so we know it is not empty */ +- OTA_TransactionResume(); ++ while (OTA_IsTransactionPending()) ++ { ++ OTA_TransactionResume(); ++ } ++ + while (EEPROM_isBusy()); + + } while (0); +@@ -877,7 +891,14 @@ otaResult_t OTA_PushImageChunk(uint8_t* pData, uint16_t length, uint32_t* pImage + OTA_MsgQueue(pMsg); + + OTA_DBG_LOG("Submitted page Addr=%x", pMsg->flash_addr); +- mHandle.cur_transaction = NULL; ++ if (mHandle.cur_transaction != NULL) ++ { ++ mHandle.cur_transaction = NULL; ++ } ++ else ++ { ++ Addr += PROGRAM_PAGE_SZ; ++ } + } + else + { +@@ -1229,6 +1250,9 @@ otaResult_t OTA_ClientInit(void) + OTA_DEBUG_TRACE("%s\r\n", __FUNCTION__); + otaResult_t res = gOtaSuccess_c; + ++ if (!mHandle.isInitialized) ++ { ++ + mHandle.LoadOtaImageInEepromInProgress = FALSE; + mHandle.OtaImageTotalLength = 0; + mHandle.OtaImageCurrentLength = 0; +@@ -1255,6 +1279,7 @@ otaResult_t OTA_ClientInit(void) + + #if gOtaEepromPostedOperations_d + MSG_InitQueue(&mHandle.op_queue); ++ mHandle.msgQueueMutex = OSA_MutexCreate(); + #endif + #if gExternalFlashIsCiphered_d + mHandle.ciphered_mode = (efuse_AESKeyPresent()) ? eEfuseKey : eSoftwareKey; +@@ -1262,6 +1287,9 @@ otaResult_t OTA_ClientInit(void) + mHandle.ciphered_mode = eCipherKeyNone; + #endif + res = OTA_InitExternalMemory(); ++ ++ mHandle.isInitialized = TRUE; ++ } + return res; + } + +@@ -1645,7 +1673,7 @@ static uint32_t OTA_GetMaxAllowedArchSize(void) + return gFlashMaxStatedSize*2 - current_app_stated_size; + #else + /* Read the value from the psector img directory */ +- uint32_t allowedSize = 0; ++ uint32_t maxImgPages = 0; + uint8_t i; + psector_page_data_t * mPage0Hdl = psector_GetPage0Handle(); + if (mPage0Hdl != NULL) +@@ -1653,12 +1681,12 @@ static uint32_t OTA_GetMaxAllowedArchSize(void) + image_directory_entry_t * currentEntry = mPage0Hdl->page0_v3.img_directory; + for (i=0; iimg_nb_pages > allowedSize) +- allowedSize = currentEntry->img_nb_pages*512; ++ if (currentEntry->img_nb_pages > maxImgPages) ++ maxImgPages = currentEntry->img_nb_pages; + currentEntry++; + } + } +- return allowedSize; ++ return maxImgPages*512; /* 512 corresponding to the size of one page in the internal flash */ + #endif + + } diff --git a/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh b/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh index 4737db6534e45e..49a18592d4a5a2 100755 --- a/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh +++ b/third_party/nxp/k32w0_sdk/sdk_fixes/patch_k32w_sdk.sh @@ -7,29 +7,43 @@ fi convert_to_dos() { - [[ $(file -b - <$1) != *"CRLF"* ]] && unix2dos "$1" + [[ $(file -b - <$1) != *"CRLF"* ]] && sed -i 's/$/\r/' "$1" } SOURCE=${BASH_SOURCE[0]} SOURCE_DIR=$(cd "$(dirname "$SOURCE")" >/dev/null 2>&1 && pwd) convert_to_dos "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/openthread/reed/bm/gpio_pins.h -patch --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/openthread/reed/bm -p1 <"$SOURCE_DIR/gpio_pins_h.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/openthread/reed/bm -p1 <"$SOURCE_DIR/gpio_pins_h.patch" convert_to_dos "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common/app_dual_mode_low_power.h -patch --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common -p1 <"$SOURCE_DIR/app_dual_mode_low_power_h.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common -p1 <"$SOURCE_DIR/app_dual_mode_low_power_h.patch" convert_to_dos "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common/app_dual_mode_switch.h -patch --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common -p1 <"$SOURCE_DIR/app_dual_mode_switch_h.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/boards/k32w061dk6/wireless_examples/hybrid/ble_ot/lped_ble_wuart/ble_802_15_4_common -p1 <"$SOURCE_DIR/app_dual_mode_switch_h.patch" convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/SecLib/SecLib.h -patch --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/SecLib -p1 <"$SOURCE_DIR/SecLib_h.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/SecLib -p1 <"$SOURCE_DIR/SecLib_h.patch" convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/OtaSupport/Source/OtaUtils.c -patch --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/OtaSupport/Source -p1 <"$SOURCE_DIR/OtaUtils_c.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/OtaSupport/Source -p1 <"$SOURCE_DIR/OtaUtils_c.patch" + +convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/OtaSupport/Source/OtaSupport.c +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/OtaSupport/Source -p1 <"$SOURCE_DIR/OtaSupport_c.patch" convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/bluetooth/host/interface/ble_utils.h -patch --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/bluetooth/host/interface -p1 <"$SOURCE_DIR/ble_utils_h.patch" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/bluetooth/host/interface -p1 <"$SOURCE_DIR/ble_utils_h.patch" + +convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/Flash/External/Source/Eeprom_MX25R8035F.c +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/Flash/External/Source -p1 <"$SOURCE_DIR/Eeprom_MX25R8035F_c.patch" + +convert_to_dos "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/MemManager/Interface/MemManager.h +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/middleware/wireless/framework/MemManager/Interface -p1 <"$SOURCE_DIR/MemManager_h.patch" + +SIGN_FILE_PATH="$NXP_K32W061_SDK_ROOT"/tools/imagetool/sign_images.sh +convert_to_dos "$SIGN_FILE_PATH" +patch -N --binary -d "$NXP_K32W061_SDK_ROOT"/tools/imagetool/ -p1 <"$SOURCE_DIR/sign_images_sh.patch" +sed -i 's/\r$//' "$SIGN_FILE_PATH" echo "K32W SDK MR3 QP1 was patched!" exit 0 diff --git a/third_party/nxp/k32w0_sdk/sdk_fixes/sign_images_sh.patch b/third_party/nxp/k32w0_sdk/sdk_fixes/sign_images_sh.patch new file mode 100644 index 00000000000000..43ebc1ed8023b1 --- /dev/null +++ b/third_party/nxp/k32w0_sdk/sdk_fixes/sign_images_sh.patch @@ -0,0 +1,18 @@ +--- a/sign_images.sh ++++ b/sign_images.sh +@@ -56,7 +56,14 @@ if [ "$#" -gt 0 ]; then + MIME_SET="$(file -ib $FILENAME)" + + if [[ $MIME_SET == *"$MIME_PATTERN"* ]]; then +- python3 $SIGNING_TOOL $FILENAME ++ OTA_ENABLED=0 ++ APP_START=`arm-none-eabi-nm $FILENAME | grep -i m_app_start | cut -d " " -f 1` ++ ++ if [ "$APP_START" -gt 0 ]; then ++ OTA_ENABLED=1 ++ fi ++ ++ python3 $SIGNING_TOOL -i="$OTA_ENABLED" $FILENAME + arm-none-eabi-objcopy -O binary $FILENAME $FILENAME.bin + fi + done