[Silabs] SiWx917 platform changes (#23799)
* Lighting app changes for SiWx917
* examples platform folder changes for SiWx917
* source platform changes for SiWx917
* third_party folder changes for CCP
* Restyle plus some extra changes
* Spell checks corrected
* Address review comments
* Restyling the PR
diff --git a/examples/lighting-app/silabs/SiWx917/BUILD.gn b/examples/lighting-app/silabs/SiWx917/BUILD.gn
index 3a812b9..61f849a 100644
--- a/examples/lighting-app/silabs/SiWx917/BUILD.gn
+++ b/examples/lighting-app/silabs/SiWx917/BUILD.gn
@@ -18,8 +18,8 @@
import("//build_overrides/pigweed.gni")
import("${build_root}/config/defaults.gni")
+import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
import("${efr32_sdk_build_root}/efr32_executable.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
import("${chip_root}/examples/common/pigweed/pigweed_rpcs.gni")
import("${chip_root}/src/platform/device.gni")
@@ -31,8 +31,8 @@
assert(current_os == "freertos")
-efr32_project_dir = "${chip_root}/examples/lighting-app/silabs/efr32"
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
+efr32_project_dir = "${chip_root}/examples/lighting-app/silabs/SiWx917"
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
examples_common_plat_dir = "${chip_root}/examples/platform/silabs"
declare_args() {
@@ -56,13 +56,19 @@
sl_wfx_config_scan = true
# Disable LCD on supported devices
- disable_lcd = false
+ disable_lcd = true
# Argument to Disable IPv4 for wifi(rs911)
chip_enable_wifi_ipv4 = false
# Argument to force enable WPA3 security on rs91x
rs91x_wpa3_only = false
+
+ #default WiFi SSID
+ ssid = ""
+
+ #default Wifi Password
+ psk = ""
}
declare_args() {
@@ -80,7 +86,7 @@
if (chip_enable_wifi) {
assert(use_rs911x || use_wf200)
enable_openthread_cli = false
- import("${chip_root}/src/platform/silabs/EFR32/wifi_args.gni")
+ import("${chip_root}/src/platform/silabs/SiWx917/wifi_args.gni")
}
# ThunderBoards, Explorer Kit and MGM240L do not support LCD (No LCD)
@@ -90,6 +96,8 @@
disable_lcd = true
}
+defines = []
+
# WiFi settings
if (chip_enable_wifi) {
# disabling LCD for MG24 for wifi
@@ -97,7 +105,19 @@
show_qr_code = false
disable_lcd = true
}
- wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
+
+ if (ssid != "") {
+ defines += [
+ "CHIP_ONNETWORK_PAIRING = 1",
+ "CHIP_WIFI_SSID = $ssid",
+ ]
+ }
+ if (psk != "") {
+ assert(ssid != "", "ssid can't be null if psk is provided")
+ defines += [ "CHIP_WIFI_PSK = $psk" ]
+ }
+
+ wifi_sdk_dir = "${chip_root}/src/platform/silabs/SiWx917/wifi"
efr32_lwip_defs = [ "LWIP_NETIF_API=1" ]
if (lwip_ipv4) {
efr32_lwip_defs += [
@@ -122,13 +142,8 @@
efr32_lwip_defs += [ "LWIP_IPV6=0" ]
}
- if (use_rs911x) {
- wiseconnect_sdk_root =
- "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
- import("${examples_plat_dir}/rs911x/rs911x.gni")
- } else {
- import("${examples_plat_dir}/wf200/wf200.gni")
- }
+ wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+ import("${examples_plat_dir}/SiWx917/rs911x.gni")
}
efr32_sdk("sdk") {
@@ -138,22 +153,18 @@
]
include_dirs = [
- "${chip_root}/src/platform/silabs/EFR32",
+ "${chip_root}/src/platform/silabs/SiWx917",
"${efr32_project_dir}/include",
"${examples_plat_dir}",
"${chip_root}/src/lib",
"${examples_common_plat_dir}",
]
- defines = [
+ defines += [
"BOARD_ID=${silabs_board}",
"OTA_PERIODIC_TIMEOUT=${OTA_periodic_query_timeout}",
]
- if (enable_heap_monitoring) {
- defines += [ "HEAP_MONITORING" ]
- }
-
if (chip_enable_pw_rpc) {
defines += [
"HAL_VCOM_ENABLE=1",
@@ -196,9 +207,9 @@
sources = [
"${examples_common_plat_dir}/heap_4_silabs.c",
"${examples_plat_dir}/BaseApplication.cpp",
- "${examples_plat_dir}/efr32_utils.cpp",
- "${examples_plat_dir}/init_efrPlatform.cpp",
+ "${examples_plat_dir}/init_ccpPlatform.cpp",
"${examples_plat_dir}/matter_config.cpp",
+ "${examples_plat_dir}/siwx917_utils.cpp",
"src/AppTask.cpp",
"src/LightingManager.cpp",
"src/ZclCallbacks.cpp",
@@ -206,12 +217,13 @@
]
if (use_wstk_leds) {
- sources += [ "${examples_plat_dir}/LEDWidget.cpp" ]
+ # TODO: Commentting for CCP till the bring up of this is done
+ #sources += [ "${examples_plat_dir}/LEDWidget.cpp" ]
}
- if (chip_enable_pw_rpc || chip_build_libshell || enable_openthread_cli ||
- use_wf200 || use_rs911x) {
- sources += [ "${examples_plat_dir}/uart.cpp" ]
+ if (chip_enable_pw_rpc || chip_build_libshell || use_rs911x) {
+ # TODO: Commentting for CCP till the bring up of this is done
+ #sources += [ "${examples_plat_dir}/uart.cpp" ]
}
deps = [
@@ -231,10 +243,7 @@
]
}
- if (chip_enable_ota_requestor) {
- defines += [ "EFR32_OTA_ENABLED" ]
- sources += [ "${examples_plat_dir}/OTAConfig.cpp" ]
- }
+ #TODO: OTA should be added
# WiFi Settings
if (chip_enable_wifi) {
@@ -326,7 +335,7 @@
"${chip_root}/examples/common/pigweed:lighting_service.nanopb_rpc",
"${chip_root}/examples/common/pigweed:ot_cli_service.nanopb_rpc",
"${chip_root}/examples/common/pigweed:thread_service.nanopb_rpc",
- "${examples_plat_dir}/pw_sys_io:pw_sys_io_efr32",
+ "${examples_plat_dir}/pw_sys_io:pw_sys_io_siwx917",
]
deps += pw_build_LINK_DEPS
@@ -365,7 +374,7 @@
# Attestation Credentials
if (chip_build_platform_attestation_credentials_provider) {
- deps += [ "${examples_plat_dir}:efr32-attestation-credentials" ]
+ deps += [ "${examples_plat_dir}:siwx917-attestation-credentials" ]
}
# Factory Data Provider
diff --git a/examples/lighting-app/silabs/SiWx917/args.gni b/examples/lighting-app/silabs/SiWx917/args.gni
index d216faa..8b382c4 100644
--- a/examples/lighting-app/silabs/SiWx917/args.gni
+++ b/examples/lighting-app/silabs/SiWx917/args.gni
@@ -15,7 +15,7 @@
import("//build_overrides/chip.gni")
import("//build_overrides/pigweed.gni")
import("${chip_root}/config/standalone/args.gni")
-import("${chip_root}/src/platform/silabs/EFR32/args.gni")
+import("${chip_root}/src/platform/silabs/SiWx917/args.gni")
efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
diff --git a/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni b/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
index 363d2be..8a0192c 100644
--- a/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
+++ b/examples/lighting-app/silabs/SiWx917/build_for_wifi_args.gni
@@ -17,7 +17,7 @@
efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
chip_enable_openthread = false
-import("${chip_root}/src/platform/silabs/EFR32/wifi_args.gni")
+import("${chip_root}/src/platform/silabs/SiWx917/wifi_args.gni")
chip_enable_ota_requestor = true
diff --git a/examples/lighting-app/silabs/SiWx917/include/AppConfig.h b/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
index ffadaf9..b86af8b 100644
--- a/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
+++ b/examples/lighting-app/silabs/SiWx917/include/AppConfig.h
@@ -19,7 +19,7 @@
#pragma once
-#include "efr32_utils.h"
+#include "siwx917_utils.h"
// ---- Lighting Example App Config ----
diff --git a/examples/lighting-app/silabs/SiWx917/include/AppTask.h b/examples/lighting-app/silabs/SiWx917/include/AppTask.h
index df80995..225b726 100644
--- a/examples/lighting-app/silabs/SiWx917/include/AppTask.h
+++ b/examples/lighting-app/silabs/SiWx917/include/AppTask.h
@@ -30,7 +30,6 @@
#include "BaseApplication.h"
#include "FreeRTOS.h"
#include "LightingManager.h"
-#include "sl_simple_button_instances.h"
#include "timers.h" // provides FreeRTOS timer support
#include <app/clusters/identify-server/identify-server.h>
#include <ble/BLEEndPoint.h>
@@ -71,16 +70,6 @@
CHIP_ERROR StartAppTask();
/**
- * @brief Event handler when a button is pressed
- * Function posts an event for button processing
- *
- * @param buttonHandle APP_LIGHT_SWITCH or APP_FUNCTION_BUTTON
- * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED,
- * SL_SIMPLE_BUTTON_RELEASED or SL_SIMPLE_BUTTON_DISABLED
- */
- void ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction) override;
-
- /**
* @brief Callback called by the identify-server when an identify command is received
*
* @param identify identify structure the command applies on
diff --git a/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp b/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
index 9abc9e1..22cab2f 100644
--- a/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
+++ b/examples/lighting-app/silabs/SiWx917/src/AppTask.cpp
@@ -21,11 +21,6 @@
#include "AppConfig.h"
#include "AppEvent.h"
-#ifdef ENABLE_WSTK_LEDS
-#include "LEDWidget.h"
-#include "sl_simple_led_instances.h"
-#endif // ENABLE_WSTK_LEDS
-
#include <app-common/zap-generated/attribute-id.h>
#include <app-common/zap-generated/attribute-type.h>
#include <app/clusters/identify-server/identify-server.h>
@@ -43,11 +38,6 @@
#include <platform/CHIPDeviceLayer.h>
-#ifdef ENABLE_WSTK_LEDS
-#define SYSTEM_STATE_LED &sl_led_led0
-#define LIGHT_LED &sl_led_led1
-#endif // ENABLE_WSTK_LEDS
-
#define APP_FUNCTION_BUTTON &sl_button_btn0
#define APP_LIGHT_SWITCH &sl_button_btn1
@@ -56,10 +46,6 @@
namespace {
-#ifdef ENABLE_WSTK_LEDS
-LEDWidget sLightLED;
-#endif // ENABLE_WSTK_LEDS
-
EmberAfIdentifyEffectIdentifier sIdentifyEffect = EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_STOP_EFFECT;
/**********************************************************
@@ -144,19 +130,16 @@
appError(err);
}
- err = LightMgr().Init();
- if (err != CHIP_NO_ERROR)
- {
- SILABS_LOG("LightMgr::Init() failed");
- appError(err);
- }
+ /* TODO
+ err = LightMgr().Init();
+ if (err != CHIP_NO_ERROR)
+ {
+ SILABS_LOG("LightMgr::Init() failed");
+ appError(err);
+ }
- LightMgr().SetCallbacks(ActionInitiated, ActionCompleted);
-
-#ifdef ENABLE_WSTK_LEDS
- sLightLED.Init(LIGHT_LED);
- sLightLED.Set(LightMgr().IsLightOn());
-#endif // ENABLE_WSTK_LEDS
+ LightMgr().SetCallbacks(ActionInitiated, ActionCompleted);
+ */
return err;
}
@@ -246,39 +229,12 @@
}
}
-void AppTask::ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction)
-{
- if (buttonHandle == NULL)
- {
- return;
- }
-
- AppEvent button_event = {};
- button_event.Type = AppEvent::kEventType_Button;
- button_event.ButtonEvent.Action = btnAction;
-
- if (buttonHandle == APP_LIGHT_SWITCH && btnAction == SL_SIMPLE_BUTTON_PRESSED)
- {
- button_event.Handler = LightActionEventHandler;
- sAppTask.PostEvent(&button_event);
- }
- else if (buttonHandle == APP_FUNCTION_BUTTON)
- {
- button_event.Handler = BaseApplication::ButtonHandler;
- sAppTask.PostEvent(&button_event);
- }
-}
-
void AppTask::ActionInitiated(LightingManager::Action_t aAction, int32_t aActor)
{
// Action initiated, update the light led
bool lightOn = aAction == LightingManager::ON_ACTION;
SILABS_LOG("Turning light %s", (lightOn) ? "On" : "Off")
-#ifdef ENABLE_WSTK_LEDS
- sLightLED.Set(lightOn);
-#endif // ENABLE_WSTK_LEDS
-
#ifdef DISPLAY_ENABLED
sAppTask.GetLCD().WriteDemoUI(lightOn);
#endif
diff --git a/examples/lighting-app/silabs/SiWx917/src/main.cpp b/examples/lighting-app/silabs/SiWx917/src/main.cpp
index 2594f6f..e3ed2a9 100644
--- a/examples/lighting-app/silabs/SiWx917/src/main.cpp
+++ b/examples/lighting-app/silabs/SiWx917/src/main.cpp
@@ -20,14 +20,13 @@
#include <AppTask.h>
#include "AppConfig.h"
-#include "init_efrPlatform.h"
-#include "sl_simple_button_instances.h"
-#include "sl_system_kernel.h"
+#include "init_ccpPlatform.h"
+
#include <DeviceInfoProviderImpl.h>
#include <app/server/Server.h>
#include <credentials/DeviceAttestationCredsProvider.h>
#include <matter_config.h>
-#ifdef EFR32_ATTESTATION_CREDENTIALS
+#ifdef SI917_ATTESTATION_CREDENTIALS
#include <examples/platform/silabs/SilabsDeviceAttestationCreds.h>
#else
#include <credentials/examples/DeviceAttestationCredsExample.h>
@@ -49,16 +48,18 @@
// ================================================================================
int main(void)
{
- init_efrPlatform();
- if (EFR32MatterConfig::InitMatter(BLE_DEV_NAME) != CHIP_NO_ERROR)
+ init_ccpPlatform();
+ if (SI917MatterConfig::InitMatter(BLE_DEV_NAME) != CHIP_NO_ERROR)
+ {
appError(CHIP_ERROR_INTERNAL);
+ }
gExampleDeviceInfoProvider.SetStorageDelegate(&chip::Server::GetInstance().GetPersistentStorage());
chip::DeviceLayer::SetDeviceInfoProvider(&gExampleDeviceInfoProvider);
chip::DeviceLayer::PlatformMgr().LockChipStack();
// Initialize device attestation config
-#ifdef EFR32_ATTESTATION_CREDENTIALS
+#ifdef SI917_ATTESTATION_CREDENTIALS
SetDeviceAttestationCredentialsProvider(Silabs::GetSilabsDacProvider());
#else
SetDeviceAttestationCredentialsProvider(Examples::GetExampleDACProvider());
@@ -67,18 +68,15 @@
SILABS_LOG("Starting App Task");
if (AppTask::GetAppTask().StartAppTask() != CHIP_NO_ERROR)
+ {
appError(CHIP_ERROR_INTERNAL);
+ }
SILABS_LOG("Starting FreeRTOS scheduler");
- sl_system_kernel_start();
+ vTaskStartScheduler();
// Should never get here.
chip::Platform::MemoryShutdown();
SILABS_LOG("vTaskStartScheduler() failed");
appError(CHIP_ERROR_INTERNAL);
}
-
-void sl_button_on_change(const sl_button_t * handle)
-{
- AppTask::GetAppTask().ButtonEventHandler(handle, sl_button_get_state(handle));
-}
diff --git a/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni b/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
index 40a8bb7..3e2b6e5 100644
--- a/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
+++ b/examples/lighting-app/silabs/SiWx917/with_pw_rpc.gni
@@ -17,7 +17,7 @@
import("//build_overrides/chip.gni")
import("${chip_root}/config/efr32/lib/pw_rpc/pw_rpc.gni")
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
efr32_sdk_target = get_label_info(":sdk", "label_no_toolchain")
diff --git a/examples/platform/silabs/SiWx917/BUILD.gn b/examples/platform/silabs/SiWx917/BUILD.gn
index dbd8473..990a43d 100644
--- a/examples/platform/silabs/SiWx917/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/BUILD.gn
@@ -16,7 +16,7 @@
import("//build_overrides/efr32_sdk.gni")
import("${chip_root}/src/lib/lib.gni")
import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
config("chip_examples_project_config") {
include_dirs = [ "project_include" ]
@@ -40,22 +40,6 @@
]
}
-source_set("openthread_core_config_efr32_chip_examples") {
- if (chip_enable_openthread) {
- sources = [ "project_include/OpenThreadConfig.h" ]
-
- public_deps = [ "${efr32_sdk_build_root}:efr32_sdk" ]
-
- if (use_silabs_thread_lib) {
- public_deps += [ "${efr32_sdk_build_root}:openthread_core_config_efr32" ]
- } else {
- public_deps += [ "${chip_root}/third_party/openthread/platforms/efr32:openthread_core_config_efr32" ]
- }
-
- public_configs = [ ":chip_examples_project_config" ]
- }
-}
-
source_set("efr-matter-shell") {
if (chip_build_libshell) {
defines = [ "ENABLE_CHIP_SHELL" ]
@@ -75,8 +59,8 @@
include_dirs = [ "${chip_root}" ]
defines = [
- # Set to 1 to enable EFR32 attestation credentials
- "EFR32_ATTESTATION_CREDENTIALS",
+ # Set to 1 to enable SI917 attestation credentials
+ "SI917_ATTESTATION_CREDENTIALS",
]
}
@@ -96,8 +80,8 @@
source_set("efr32-factory-data-provider") {
sources = [
- "EFR32DeviceDataProvider.cpp",
- "EFR32DeviceDataProvider.h",
+ "SiWx917DeviceDataProvider.cpp",
+ "SiWx917DeviceDataProvider.h",
]
public_deps = [
diff --git a/examples/platform/silabs/SiWx917/BaseApplication.cpp b/examples/platform/silabs/SiWx917/BaseApplication.cpp
index a9ecfc6..b401c18 100644
--- a/examples/platform/silabs/SiWx917/BaseApplication.cpp
+++ b/examples/platform/silabs/SiWx917/BaseApplication.cpp
@@ -25,11 +25,6 @@
#include "AppEvent.h"
#include "AppTask.h"
-#ifdef ENABLE_WSTK_LEDS
-#include "LEDWidget.h"
-#include "sl_simple_led_instances.h"
-#endif // ENABLE_WSTK_LEDS
-
#ifdef DISPLAY_ENABLED
#include "lcd.h"
#ifdef QR_CODE_ENABLED
@@ -37,7 +32,7 @@
#endif // QR_CODE_ENABLED
#endif // DISPLAY_ENABLED
-#include "EFR32DeviceDataProvider.h"
+#include "SiWx917DeviceDataProvider.h"
#include <app-common/zap-generated/attribute-id.h>
#include <app-common/zap-generated/attribute-type.h>
#include <app/server/OnboardingCodesUtil.h>
@@ -49,12 +44,6 @@
#include <setup_payload/QRCodeSetupPayloadGenerator.h>
#include <setup_payload/SetupPayload.h>
-#if CHIP_ENABLE_OPENTHREAD
-#include <platform/OpenThread/OpenThreadUtils.h>
-#include <platform/ThreadStackManager.h>
-#include <platform/silabs/ThreadStackManagerImpl.h>
-#endif // CHIP_ENABLE_OPENTHREAD
-
#ifdef SL_WIFI
#include "wfx_host_events.h"
#include <app/clusters/network-commissioning/network-commissioning.h>
@@ -74,12 +63,6 @@
#define APP_EVENT_QUEUE_SIZE 10
#define EXAMPLE_VENDOR_ID 0xcafe
-#ifdef ENABLE_WSTK_LEDS
-#define SYSTEM_STATE_LED &sl_led_led0
-#endif // ENABLE_WSTK_LEDS
-
-#define APP_FUNCTION_BUTTON &sl_button_btn0
-
using namespace chip;
using namespace ::chip::DeviceLayer;
@@ -95,10 +78,6 @@
TaskHandle_t sAppTaskHandle;
QueueHandle_t sAppEventQueue;
-#ifdef ENABLE_WSTK_LEDS
-LEDWidget sStatusLED;
-#endif // ENABLE_WSTK_LEDS
-
#ifdef SL_WIFI
app::Clusters::NetworkCommissioning::Instance
sWiFiNetworkCommissioningInstance(0 /* Endpoint Id */, &(NetworkCommissioning::SlWiFiDriver::GetInstance()));
@@ -211,11 +190,6 @@
SILABS_LOG("Current Software Version: %s", CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING);
-#ifdef ENABLE_WSTK_LEDS
- LEDWidget::InitGpio();
- sStatusLED.Init(SYSTEM_STATE_LED);
-#endif // ENABLE_WSTK_LEDS
-
ConfigurationMgr().LogDeviceConfig();
// Create buffer for QR code that can fit max size and null terminator.
@@ -271,13 +245,6 @@
#endif // CHIP_DEVICE_CONFIG_ENABLE_SED
mFunction = kFunction_FactoryReset;
-
-#ifdef ENABLE_WSTK_LEDS
- // Turn off all LEDs before starting blink to make sure blink is
- // co-ordinated.
- sStatusLED.Set(false);
- sStatusLED.Blink(500);
-#endif // ENABLE_WSTK_LEDS
}
else if (mFunctionTimerActive && mFunction == kFunction_FactoryReset)
{
@@ -329,133 +296,6 @@
// the LEDs at an even rate of 100ms.
//
// Otherwise, blink the LED ON for a very short time.
- if (mFunction != kFunction_FactoryReset)
- {
- if ((gIdentifyptr != nullptr) && (gIdentifyptr->mActive))
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(250, 250);
-#endif // ENABLE_WSTK_LEDS
- }
- else if (sIdentifyEffect != EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_STOP_EFFECT)
- {
- if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BLINK)
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(50, 50);
-#endif // ENABLE_WSTK_LEDS
- }
- if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_BREATHE)
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(1000, 1000);
-#endif // ENABLE_WSTK_LEDS
- }
- if (sIdentifyEffect == EMBER_ZCL_IDENTIFY_EFFECT_IDENTIFIER_OKAY)
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(300, 700);
-#endif // ENABLE_WSTK_LEDS
- }
- }
-#if !(defined(CHIP_DEVICE_CONFIG_ENABLE_SED) && CHIP_DEVICE_CONFIG_ENABLE_SED)
- else if (sIsProvisioned && sIsEnabled)
- {
- if (sIsAttached)
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Set(true);
-#endif // ENABLE_WSTK_LEDS
- }
- else
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(950, 50);
-#endif
- }
- }
- else if (sHaveBLEConnections)
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(100, 100);
-#endif // ENABLE_WSTK_LEDS
- }
- else
- {
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Blink(50, 950);
-#endif // ENABLE_WSTK_LEDS
- }
-#endif // CHIP_DEVICE_CONFIG_ENABLE_SED
- }
-
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Animate();
-#endif // ENABLE_WSTK_LEDS
-}
-
-void BaseApplication::ButtonHandler(AppEvent * aEvent)
-{
- // To trigger software update: press the APP_FUNCTION_BUTTON button briefly (<
- // FACTORY_RESET_TRIGGER_TIMEOUT) To initiate factory reset: press the
- // APP_FUNCTION_BUTTON for FACTORY_RESET_TRIGGER_TIMEOUT +
- // FACTORY_RESET_CANCEL_WINDOW_TIMEOUT All LEDs start blinking after
- // FACTORY_RESET_TRIGGER_TIMEOUT to signal factory reset has been initiated.
- // To cancel factory reset: release the APP_FUNCTION_BUTTON once all LEDs
- // start blinking within the FACTORY_RESET_CANCEL_WINDOW_TIMEOUT
- if (aEvent->ButtonEvent.Action == SL_SIMPLE_BUTTON_PRESSED)
- {
- if (!mFunctionTimerActive && mFunction == kFunction_NoneSelected)
- {
- StartFunctionTimer(FACTORY_RESET_TRIGGER_TIMEOUT);
- mFunction = kFunction_StartBleAdv;
- }
- }
- else
- {
- // If the button was released before factory reset got initiated, open the commissioning window and start BLE advertissement
- // in fast mode
- if (mFunctionTimerActive && mFunction == kFunction_StartBleAdv)
- {
- CancelFunctionTimer();
- mFunction = kFunction_NoneSelected;
-
-#ifdef QR_CODE_ENABLED
- // TOGGLE QRCode/LCD demo UI
- slLCD.ToggleQRCode();
-#endif
-
-#ifdef SL_WIFI
- if (!ConnectivityMgr().IsWiFiStationProvisioned())
-#else
- if (!ConnectivityMgr().IsThreadProvisioned())
-#endif /* !SL_WIFI */
- {
- // Open Basic CommissioningWindow. Will start BLE advertisements
- chip::DeviceLayer::PlatformMgr().LockChipStack();
- CHIP_ERROR err = chip::Server::GetInstance().GetCommissioningWindowManager().OpenBasicCommissioningWindow();
- chip::DeviceLayer::PlatformMgr().UnlockChipStack();
- if (err != CHIP_NO_ERROR)
- {
- SILABS_LOG("Failed to open the Basic Commissioning Window");
- }
- }
- else { SILABS_LOG("Network is already provisioned, Ble advertissement not enabled"); }
- }
- else if (mFunctionTimerActive && mFunction == kFunction_FactoryReset)
- {
- CancelFunctionTimer();
-
-#if CHIP_DEVICE_CONFIG_ENABLE_SED == 1
- StopStatusLEDTimer();
-#endif
-
- // Change the function to none selected since factory reset has been
- // canceled.
- mFunction = kFunction_NoneSelected;
- SILABS_LOG("Factory Reset has been Canceled");
- }
- }
}
void BaseApplication::CancelFunctionTimer()
@@ -500,9 +340,6 @@
void BaseApplication::StopStatusLEDTimer()
{
-#ifdef ENABLE_WSTK_LEDS
- sStatusLED.Set(false);
-#endif // ENABLE_WSTK_LEDS
if (xTimerStop(sLightTimer, 100) != pdPASS)
{
diff --git a/examples/platform/silabs/SiWx917/BaseApplication.h b/examples/platform/silabs/SiWx917/BaseApplication.h
index febd7aa..2c0e07e 100644
--- a/examples/platform/silabs/SiWx917/BaseApplication.h
+++ b/examples/platform/silabs/SiWx917/BaseApplication.h
@@ -28,7 +28,6 @@
#include "AppEvent.h"
#include "FreeRTOS.h"
-#include "sl_simple_button_instances.h"
#include "timers.h" // provides FreeRTOS timer support
#include <app/clusters/identify-server/identify-server.h>
#include <ble/BLEEndPoint.h>
@@ -89,16 +88,6 @@
#endif
/**
- * @brief Event handler when a button is pressed
- * Function posts an event for button processing
- *
- * @param buttonHandle APP_LIGHT_SWITCH or APP_FUNCTION_BUTTON
- * @param btnAction button action - SL_SIMPLE_BUTTON_PRESSED,
- * SL_SIMPLE_BUTTON_RELEASED or SL_SIMPLE_BUTTON_DISABLED
- */
- virtual void ButtonEventHandler(const sl_button_t * buttonHandle, uint8_t btnAction) = 0;
-
- /**
* @brief Function called to start the LED light timer
*/
static void StartStatusLEDTimer(void);
diff --git a/examples/platform/silabs/SiWx917/FreeRTOSConfig.h b/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
index 50f4c24..02b441e 100644
--- a/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
+++ b/examples/platform/silabs/SiWx917/FreeRTOSConfig.h
@@ -107,20 +107,6 @@
#include <stdint.h>
-#include "RTE_Components.h"
-#include CMSIS_device_header
-
-#include "em_assert.h"
-#include "em_device.h"
-
-#if defined(SL_COMPONENT_CATALOG_PRESENT)
-#include "sl_component_catalog.h"
-#endif
-
-#if SL_SYSTEM_VIEW
-#include "SEGGER_SYSVIEW_FreeRTOS.h"
-#endif
-
/*-----------------------------------------------------------
* Application specific definitions.
*
@@ -133,6 +119,8 @@
* See http://www.freertos.org/a00110.html.
*----------------------------------------------------------*/
+extern uint32_t SystemCoreClock;
+
/* Energy saving modes. */
#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
#define configUSE_TICKLESS_IDLE 1
@@ -148,7 +136,7 @@
#define configUSE_TICK_HOOK (1)
#define configCHECK_FOR_STACK_OVERFLOW (2)
#define configUSE_MALLOC_FAILED_HOOK (1)
-#define configUSE_IDLE_HOOK (1)
+#define configUSE_IDLE_HOOK (0)
/* Main functions*/
/* Run time stats gathering related definitions. */
@@ -185,13 +173,7 @@
#define configUSE_TICKLESS_IDLE_SIMPLE_DEBUG (1) /* See into vPortSuppressTicksAndSleep source code for explanation */
#define configMAX_PRIORITIES (56)
#define configMINIMAL_STACK_SIZE (320) /* Number of words to use for Idle and Timer stacks */
-
-#ifdef HEAP_MONITORING
-#define configMAX_TASK_NAME_LEN (24)
-#else
#define configMAX_TASK_NAME_LEN (10)
-#endif // HEAP_MONITORING
-
#define configUSE_16_BIT_TICKS (0)
#define configIDLE_SHOULD_YIELD (1)
#define configUSE_MUTEXES (1)
@@ -207,11 +189,7 @@
#define configSUPPORT_DYNAMIC_ALLOCATION (1)
#ifndef configTOTAL_HEAP_SIZE
-#ifdef SL_WIFI
#define configTOTAL_HEAP_SIZE ((size_t)(34 * 1024))
-#else
-#define configTOTAL_HEAP_SIZE ((size_t)(20 * 1024))
-#endif
#endif // configTOTAL_HEAP_SIZE
/* Optional functions - most linkers will remove unused functions anyway. */
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
similarity index 94%
rename from examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h
rename to examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
index 4e19543..8e4e6e2 100644
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal.h
@@ -54,12 +54,6 @@
// Macro to drive high value on GPIO
#define RSI_HAL_GPIO_HIGH 1
-// Macro to drive LDMA channel number
-#define RSI_LDMA_TRANSFER_CHANNEL_NUM 3
-
-// Macro to drive semaphore block minimun timer in milli seconds
-#define RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS 50
-
/******************************************************
* * Function Declarations
* ******************************************************/
diff --git a/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c
new file mode 100644
index 0000000..b2effb5
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_platform_init.c
@@ -0,0 +1,113 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Includes
+ */
+#include "rsi_board.h"
+#include "rsi_pll.h"
+#include "rsi_rom_clks.h"
+#include "siwx917_utils.h"
+#include "system_RS1xxxx.h"
+
+#define SOC_PLL_REF_FREQUENCY 32000000 /* PLL input REFERENCE clock 32MHZ */
+
+// Note: Change this macro to required PLL frequency in hertz
+#define PS4_SOC_FREQ 80000000 /* PLL out clock 80MHz */
+#define SWITCH_QSPI_TO_SOC_PLL
+#define ICACHE_DISABLE
+#define DEBUG_DISABLE
+
+#define PMU_GOOD_TIME 31 /*Duration in us*/
+#define XTAL_GOOD_TIME 31 /*Duration in us*/
+
+/*Pre-fetch and regestring */
+#define ICACHE2_ADDR_TRANSLATE_1_REG *(volatile uint32_t *) (0x20280000 + 0x24)
+#define MISC_CFG_SRAM_REDUNDANCY_CTRL *(volatile uint32_t *) (0x46008000 + 0x18)
+#define MISC_CONFIG_MISC_CTRL1 *(volatile uint32_t *) (0x46008000 + 0x44)
+#define MISC_QUASI_SYNC_MODE *(volatile uint32_t *) (0x46008000 + 0x84)
+
+/**
+ * @fn void soc_pll_config()
+ * @brief This function to configure clock for SiWx917 SoC (80MHz)
+ * Configure the PLL frequency and Switch M4 clock to PLL clock for speed operations
+ *
+ * @param[in] none
+ * @param[out] none
+ * @return int
+ * @section description
+ * configure clock for SiWx917 SoC
+ *
+ */
+int soc_pll_config(void)
+{
+ RSI_CLK_SocPllLockConfig(1, 1, 7);
+
+ RSI_CLK_SocPllRefClkConfig(2);
+
+ RSI_CLK_M4SocClkConfig(M4CLK, M4_ULPREFCLK, 0);
+
+ /*Enable fre-fetch and register if SOC-PLL frequency is more than or equal to 120M*/
+#if (PS4_SOC_FREQ >= 120000000)
+ ICACHE2_ADDR_TRANSLATE_1_REG = BIT(21);
+ MISC_CFG_SRAM_REDUNDANCY_CTRL = BIT(4);
+ MISC_CONFIG_MISC_CTRL1 |= BIT(4);
+#if !(defined WISE_AOC_4)
+ MISC_QUASI_SYNC_MODE |= BIT(6);
+ MISC_QUASI_SYNC_MODE |= (BIT(6) | BIT(7));
+#endif /* !WISE_AOC_4 */
+#endif /* (PS4_SOC_FREQ > 120000000) */
+
+ RSI_CLK_SetSocPllFreq(M4CLK, PS4_SOC_FREQ, SOC_PLL_REF_FREQUENCY);
+
+ RSI_CLK_M4SocClkConfig(M4CLK, M4_SOCPLLCLK, 0);
+
+#ifdef SWITCH_QSPI_TO_SOC_PLL
+ RSI_CLK_QspiClkConfig(M4CLK, QSPI_INTFPLLCLK, 0, 0, 0);
+#endif /* SWITCH_QSPI_TO_SOC_PLL */
+
+ return 0;
+}
+
+/*==============================================*/
+/**
+ * @fn void rsi_hal_board_init()
+ * @brief This function Initializes the platform
+ * @param[in] none
+ * @param[out] none
+ * @return none
+ * @section description
+ * This function initializes the platform
+ *
+ */
+void rsi_hal_board_init(void)
+{
+ SystemCoreClockUpdate();
+
+ /* configure clock for SiWx917 SoC */
+ soc_pll_config();
+ SILABS_LOG("%s, soc_pll_config, SystemCoreClock=%d\n", __func__, SystemCoreClock);
+
+#ifdef COMMON_FLASH_EN
+ /* Before TA going to power save mode ,set m4ss_ref_clk_mux_ctrl ,tass_ref_clk_mux_ctrl,
+ AON domain power supply controls form TA to M4 */
+ RSI_Set_Cntrls_To_M4();
+#endif
+#ifdef DEBUG_UART
+ DEBUGINIT();
+#endif
+}
diff --git a/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c
new file mode 100644
index 0000000..e7141d4
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/hal/rsi_hal_mcu_timer.c
@@ -0,0 +1,221 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Includes
+ */
+
+#include "rsi_driver.h"
+#ifdef RSI_WITH_OS
+/* FreeRTOS includes. */
+#include "FreeRTOS.h"
+#include "StackMacros.h"
+#include "task.h"
+#include "timers.h"
+
+#if defined(SysTick)
+#undef SysTick_Handler
+/* FreeRTOS SysTick interrupt handler prototype */
+extern void SysTick_Handler(void);
+/* FreeRTOS tick timer interrupt handler prototype */
+extern void xPortSysTickHandler(void);
+#endif /* SysTick */
+#endif
+
+static volatile uint32_t _dwTickCount; // systick cout variable
+
+/*===================================================*/
+/**
+ * @fn int32_t rsi_timer_start(uint8_t timer_no, uint8_t mode,uint8_t type,uint32_t duration,void (*
+ * rsi_timer_expiry_handler)())
+ * @brief Starts and configures timer
+ * @param[in] timer_node, timer node to be configured.
+ * @param[in] mode , mode of the timer
+ * 0 - Micro seconds mode
+ * 1 - Milli seconds mode
+ * @param[in] type, type of the timer
+ * 0 - single shot type
+ * 1 - periodic type
+ * @param[in] duration, timer duration
+ * @param[in] rsi_timer_expiry_handler() ,call back function to handle timer interrupt
+ * @param[out] none
+ * @return 0 - success
+ * !0 - Failure
+ * @description This HAL API should contain the code to initialize the timer and start the timer
+ *
+ */
+
+int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void))
+{
+
+ //! Initialise the timer
+
+ //! register the call back
+
+ //! Start timer
+
+ return 0;
+}
+
+/*===================================================*/
+/**
+ * @fn int32_t rsi_timer_stop(uint8_t timer_no)
+ * @brief Stops timer
+ * @param[in] timer_node, timer node to stop
+ * @param[out] none
+ * @return 0 - success
+ * !0 - Failure
+ * @description This HAL API should contain the code to stop the timer
+ *
+ */
+
+int32_t rsi_timer_stop(uint8_t timer_node)
+{
+
+ //! Stop the timer
+
+ return 0;
+}
+
+/*===================================================*/
+/**
+ * @fn uint32_t rsi_timer_read(uint8_t timer_node)
+ * @brief read timer
+ * @param[in] timer_node, timer node to read
+ * @param[out] none
+ * @return timer value
+ * @description This HAL API should contain API to read the timer
+ *
+ */
+
+uint32_t rsi_timer_read(uint8_t timer_node)
+{
+
+ volatile uint32_t timer_val = 0;
+
+ //! read the timer and return timer value
+
+ return timer_val;
+}
+
+/*===================================================*/
+/**
+ * @fn void rsi_delay_us(uint32_t delay)
+ * @brief create delay in micro seconds
+ * @param[in] delay_us, timer delay in micro seconds
+ * @param[out] none
+ * @return none
+ * @description This HAL API should contain the code to create delay in micro seconds
+ *
+ */
+void rsi_delay_us(uint32_t delay_us)
+{
+
+ //! call the API for delay in micro seconds
+
+ return;
+}
+
+/*===================================================*/
+/**
+ * @fn void rsi_delay_ms(uint32_t delay)
+ * @brief create delay in micro seconds
+ * @param[in] delay, timer delay in micro seconds
+ * @param[out] none
+ * @return none
+ * @description This HAL API should contain the code to create delay in micro seconds
+ *
+ */
+void rsi_delay_ms1(uint32_t delay_ms)
+{
+
+ //! call the API for delay in milli seconds
+
+ return;
+}
+
+/*===================================================*/
+/**
+ * @fn void SysTick_Handler(void);
+ * @brief systick cout variable
+ * @param[in] none
+ * @param[out] none
+ * @return none
+ * @description This HAL API is systick cout variable
+ *
+ */
+
+void SysTick_Handler(void)
+{
+ _dwTickCount++;
+#ifdef RSI_WITH_OS
+ if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
+ {
+ xPortSysTickHandler();
+ }
+#endif
+}
+/*===================================================*/
+/**
+ * @fn uint32_t GetTickCount( void )
+ * @brief gets the tick count from systic ISR
+ * @param[in] delay, timer delay in micro seconds
+ * @param[out] none
+ * @return Returns the systick current tick count
+ * @description This HAL API gets the tick count from systic ISR
+ *
+ */
+
+uint32_t GetTickCount(void)
+{
+ return _dwTickCount; // gets the tick count from systic ISR
+}
+
+/*===================================================*/
+/**
+ * @fn void rsi_delay_ms(uint32_t delay)
+ * @brief create delay in milli seconds
+ * @param[in] delay, timer delay in milli seconds
+ * @param[out] none
+ * @return none
+ * @description This HAL API should contain the code to create delay in milli seconds
+ *
+ */
+
+void rsi_delay_ms(uint32_t delay_ms)
+{
+ uint64_t waitTime = rsi_hal_gettickcount() + delay_ms;
+
+ while (waitTime > rsi_hal_gettickcount())
+ {
+ // we busy wait
+ }
+}
+
+/*===================================================*/
+/**
+ * @fn uint32_t rsi_hal_gettickcount()
+ * @brief provides a tick value in milliseconds
+ * @return tick value
+ * @description This HAL API should contain the code to read the timer tick count value in milliseconds
+ *
+ */
+
+uint32_t rsi_hal_gettickcount(void)
+{
+ return GetTickCount();
+}
diff --git a/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni b/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni
new file mode 100644
index 0000000..0cca175
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/SiWx917/rs911x.gni
@@ -0,0 +1,144 @@
+import("//build_overrides/chip.gni")
+import("//build_overrides/efr32_sdk.gni")
+import("//build_overrides/pigweed.gni")
+
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
+wifi_sdk_dir = "${chip_root}/src/platform/silabs/SiWx917/wifi"
+wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+rs911x_cflags = []
+
+rs911x_src_plat = [
+ "${examples_plat_dir}/SiWx917/rsi_if.c",
+ "${examples_plat_dir}/SiWx917/wfx_rsi_host.c",
+ "${wifi_sdk_dir}/wfx_notify.cpp",
+
+ "${examples_plat_dir}/SiWx917/hal/rsi_hal_mcu_timer.c",
+ "${examples_plat_dir}/SiWx917/hal/rsi_hal_mcu_platform_init.c",
+
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_bootup_config.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_m4.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_m4_rom.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/src/rsi_hal_mcu_interrupt.c",
+]
+rs911x_plat_incs = [
+ "${wifi_sdk_dir}",
+ "${wifi_sdk_dir}/hal",
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+
+ # "${wiseconnect_sdk_root}/sapi/include",
+ "${chip_root}/src/platform/silabs/SiWx917",
+ "${chip_root}/src/platform/silabs/SiWx917/bluetooth",
+ "${examples_plat_dir}/SiWx917",
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+]
+
+#
+# All the stuff from wiseconnect
+#
+rs911x_src_sapi = [
+ "${wiseconnect_sdk_root}/sapi/wlan/rsi_wlan_apis.c",
+ "${wiseconnect_sdk_root}/sapi/common/rsi_apis_non_rom.c",
+ "${wiseconnect_sdk_root}/sapi/common/rsi_apis_rom.c",
+ "${wiseconnect_sdk_root}/sapi/common/rsi_common_apis.c",
+ "${wiseconnect_sdk_root}/sapi/common/rsi_device_init_apis.c",
+
+ # "${wiseconnect_sdk_root}/sapi/common/rsi_wisemcu_hardware_setup.c",
+ "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_frame_rd_wr.c",
+ "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_functs.c",
+ "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_iface_init.c",
+ "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_mem_rd_wr.c",
+ "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_reg_rd_wr.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_common.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_device_init.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_driver_event_handlers.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_driver.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_events_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_events.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_iap.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_queue_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_queue.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_setregion_countryinfo.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_timer.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_utils_rom.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_utils.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_wlan.c",
+ "${wiseconnect_sdk_root}/sapi/rtos/freertos_wrapper/rsi_os_wrapper.c",
+]
+
+foreach(src_file, rs911x_src_sapi) {
+ rs911x_cflags += [
+ "-Wno-empty-body",
+ "-Wno-cpp",
+ "-Wno-missing-braces",
+ "-Wno-sign-compare",
+ "-Wno-error",
+ "-Wno-unknown-warning-option",
+ "-Wno-unused-variable",
+ "-Wno-implicit-function-declaration",
+ "-Wno-unused-function",
+ ]
+}
+
+rs911x_inc_plat = [
+ "${wifi_sdk_dir}",
+ "${examples_plat_dir}/SiWx917",
+ "${examples_plat_dir}/SiWx917/hal",
+ "${wiseconnect_sdk_root}/sapi/include",
+
+ #CCP Platfrom
+ "${wiseconnect_sdk_root}/platforms/si91x/hal/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/config",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/config",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/rom_driver/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/CMSIS/Driver/Include",
+
+ "${wiseconnect_sdk_root}/platforms/si91x/core/cmsis",
+ "${wiseconnect_sdk_root}/platforms/si91x/service/system/inc",
+]
+
+# Apparently - the rsi library needs this
+rs911x_src_sock = [
+ "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket.c",
+ "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket_rom.c",
+]
+rs911x_sock_inc = [ "${wifi_sdk_dir}/rsi-sockets" ]
+
+#
+# If we use LWIP - not built-in sockets
+#
+rs911x_src_lwip = [
+ "${wifi_sdk_dir}/ethernetif.cpp",
+ "${wifi_sdk_dir}/dhcp_client.cpp",
+ "${wifi_sdk_dir}/lwip_netif.cpp",
+]
+rs911x_defs = [
+ "CCP_SI917_BRINGUP=1",
+ "SL_HEAP_SIZE=32768",
+ "SL_WIFI=1",
+ "RS911X_WIFI",
+ "RSI_WLAN_ENABLE",
+ "RSI_WITH_OS",
+ "RSI_M4_INTERFACE", #Enable CCP bus Interface
+ "RSI_WLAN_API_ENABLE",
+ "HMAC_512",
+ "LITTLE_ENDIAN_ORDER",
+ "_CHIP_9118",
+
+ # "ROM_WIRELESS"
+ #__CC_ARM DEBUG_UART _CHIP_9118 LITTLE_ENDIAN_ORDER HMAC_512
+]
+rs911x_sock_defs = [
+ "RS911X_SOCKETS",
+ "RSI_IPV6_ENABLE",
+]
diff --git a/examples/platform/silabs/SiWx917/rs911x/rsi_if.c b/examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
similarity index 92%
rename from examples/platform/silabs/SiWx917/rs911x/rsi_if.c
rename to examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
index 7d3be40..3b15cd8 100644
--- a/examples/platform/silabs/SiWx917/rs911x/rsi_if.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/rsi_if.c
@@ -19,12 +19,6 @@
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
#include "sl_status.h"
#include "FreeRTOS.h"
@@ -38,6 +32,7 @@
#include "rsi_common_apis.h"
#include "rsi_data_types.h"
+#include "rsi_error.h"
#include "rsi_nwk.h"
#include "rsi_socket.h"
#include "rsi_utils.h"
@@ -46,12 +41,13 @@
#include "rsi_wlan_config.h"
//#include "rsi_wlan_non_rom.h"
#include "rsi_bootup_config.h"
-#include "rsi_error.h"
#include "dhcp_client.h"
-#include "wfx_host_events.h"
#include "wfx_rsi.h"
+#define VAL(str) #str
+#define TOSTRING(str) VAL(str)
+
/* Rsi driver Task will use as its stack */
StackType_t driverRsiTaskStack[WFX_RSI_WLAN_TASK_SZ] = { 0 };
@@ -107,24 +103,10 @@
*********************************************************************/
int32_t wfx_rsi_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
{
- int32_t status;
- uint8_t buff[RSI_RESPONSE_MAX_SIZE] = { 0 };
- status = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff));
- if (status != RSI_SUCCESS)
- {
- WFX_RSI_LOG("\r\n Failed, Error Code : 0x%lX\r\n", status);
- }
- else
- {
- rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff;
- extra_info->beacon_lost_count = test->beacon_lost_count - temp_reset->beacon_lost_count;
- extra_info->beacon_rx_count = test->beacon_rx_count - temp_reset->beacon_rx_count;
- extra_info->mcast_rx_count = test->mcast_rx_count - temp_reset->mcast_rx_count;
- extra_info->mcast_tx_count = test->mcast_tx_count - temp_reset->mcast_tx_count;
- extra_info->ucast_rx_count = test->ucast_rx_count - temp_reset->ucast_rx_count;
- extra_info->ucast_tx_count = test->ucast_tx_count - temp_reset->ucast_tx_count;
- extra_info->overrun_count = test->overrun_count - temp_reset->overrun_count;
- }
+ /* TODO : Place holder until we have similar functionality
+ * available for SiWx917
+ */
+ int32_t status = 0;
return status;
}
@@ -138,24 +120,10 @@
*********************************************************************/
int32_t wfx_rsi_reset_count()
{
- int32_t status;
- uint8_t buff[RSI_RESPONSE_MAX_SIZE] = { 0 };
- status = rsi_wlan_get(RSI_WLAN_EXT_STATS, buff, sizeof(buff));
- if (status != RSI_SUCCESS)
- {
- WFX_RSI_LOG("\r\n Failed, Error Code : 0x%lX\r\n", status);
- }
- else
- {
- rsi_wlan_ext_stats_t * test = (rsi_wlan_ext_stats_t *) buff;
- temp_reset->beacon_lost_count = test->beacon_lost_count;
- temp_reset->beacon_rx_count = test->beacon_rx_count;
- temp_reset->mcast_rx_count = test->mcast_rx_count;
- temp_reset->mcast_tx_count = test->mcast_tx_count;
- temp_reset->ucast_rx_count = test->ucast_rx_count;
- temp_reset->ucast_tx_count = test->ucast_tx_count;
- temp_reset->overrun_count = test->overrun_count;
- }
+ /* TODO : Place holder until we have similar functionality
+ * available for SiWx917
+ */
+ int32_t status = 0;
return status;
}
@@ -187,8 +155,6 @@
{
WFX_RSI_LOG("%s: status: %02x", __func__, status);
wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING;
- temp_reset = (wfx_wifi_scan_ext_t *) malloc(sizeof(wfx_wifi_scan_ext_t));
- memset(temp_reset, 0, sizeof(wfx_wifi_scan_ext_t));
if (status != RSI_SUCCESS)
{
/*
@@ -294,24 +260,7 @@
{
int32_t status;
uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE];
- extern void rsi_hal_board_init(void);
- WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
- //! Driver initialization
- status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
- if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
- {
- WFX_RSI_LOG("%s: error: RSI drv init failed with status: %02x", __func__, status);
- return status;
- }
-
- WFX_RSI_LOG("%s: rsi_device_init", __func__);
- /* ! Redpine module intialisation */
- if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
- {
- WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
- return status;
- }
WFX_RSI_LOG("%s: start wireless drv task", __func__);
/*
* Create the driver task
@@ -478,6 +427,7 @@
/* Call rsi connect call with given ssid and password
* And check there is a success
*/
+
if ((status = rsi_wlan_connect_async((int8_t *) &wfx_rsi.sec.ssid[0], (rsi_security_mode_t) wfx_rsi.sec.security,
&wfx_rsi.sec.passkey[0], wfx_rsi_join_cb)) != RSI_SUCCESS)
{
@@ -485,7 +435,7 @@
wfx_rsi.dev_state &= ~WFX_RSI_ST_STA_CONNECTING;
WFX_RSI_LOG("%s: rsi_wlan_connect_async failed with status: %02x on try %d", __func__, status,
wfx_rsi.join_retries);
- vTaskDelay(4000);
+ vTaskDelay(400);
/* TODO - Start a timer.. to retry */
}
else
@@ -501,6 +451,7 @@
{
WFX_RSI_LOG("%s: starting JOIN to %s after %d tries\n", __func__, (char *) &wfx_rsi.sec.ssid[0], wfx_rsi.join_retries);
}
+ WFX_RSI_LOG("Returning the do join");
}
}
@@ -518,6 +469,7 @@
void wfx_rsi_task(void * arg)
{
EventBits_t flags;
+ int32_t status = 0;
#ifndef RS911X_SOCKETS
TickType_t last_dhcp_poll, now;
struct netif * sta_netif;
@@ -537,6 +489,12 @@
wfx_started_notify();
WFX_RSI_LOG("%s: starting event wait", __func__);
+#ifdef CHIP_ONNETWORK_PAIRING
+ memcpy(&wfx_rsi.sec.ssid[0], TOSTRING(CHIP_WIFI_SSID), sizeof(TOSTRING(CHIP_WIFI_SSID)));
+ memcpy(&wfx_rsi.sec.passkey[0], TOSTRING(CHIP_WIFI_PSK), sizeof(TOSTRING(CHIP_WIFI_PSK)));
+ xEventGroupSetBits(wfx_rsi.events, WFX_EVT_STA_START_JOIN);
+#endif
+
for (;;)
{
/*
@@ -627,7 +585,7 @@
// Joining to the network
wfx_rsi_do_join();
}
- if (flags & WFX_EVT_STA_CONN)
+ if ((flags & WFX_EVT_STA_CONN))
{
/*
* Initiate the Join command (assuming we have been provisioned)
@@ -851,4 +809,28 @@
return status;
}
+int32_t wfx_rsi_init_platform()
+{
+ int32_t status;
+ /*init task - RS911x*/
+ WFX_RSI_LOG("RSI_INIT");
+ WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
+ //! Driver initialization
+ status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
+ if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
+ {
+ WFX_RSI_LOG("%s: error: RSI drv init failed with status: %02x", __func__, status);
+ }
+
+ WFX_RSI_LOG("%s: rsi_device_init", __func__);
+ /* ! Redpine module intialisation */
+ if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
+ {
+ WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
+ return status;
+ }
+
+ return status;
+}
+
struct wfx_rsi wfx_rsi;
diff --git a/examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h b/examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
similarity index 84%
rename from examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h
rename to examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
index f2a47b5..4f2dc07 100644
--- a/examples/platform/silabs/SiWx917/rs911x/rsi_wlan_config.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/rsi_wlan_config.h
@@ -25,53 +25,31 @@
//! Disable feature
#define RSI_DISABLE 0
-//! To enable wlan opermode
-#define RSI_OPERMODE_WLAN 0
-
//! To enable concurrent mode
#define CONCURRENT_MODE RSI_DISABLE
-//! opermode command parameters
+//! opermode command paramaters
/*=======================================================================*/
//! To set wlan feature select bit map
#define RSI_FEATURE_BIT_MAP (FEAT_SECURITY_OPEN)
//! TCP IP BYPASS feature check
-#ifdef RS911X_SOCKETS
-#define RSI_TCP_IP_BYPASS RSI_DISABLE
+//#define RSI_TCP_IP_BYPASS RSI_DISABLE
+//! TCP/IP feature select bitmap for selecting TCP/IP features
+//#define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_DHCPV4_CLIENT | TCP_IP_FEAT_ICMP)
-#define RSI_TCP_IP_FEATURE_BIT_MAP \
- (TCP_IP_FEAT_DHCPV4_CLIENT | /*TCP_IP_FEAT_HTTP_CLIENT | */ \
- TCP_IP_FEAT_EXTENSION_VALID | /*TCP_IP_FEAT_SSL |*/ /*TCP_IP_FEAT_DNS_CLIENT |*/ \
- 0)
-//! To set custom feature select bit map
-#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENSION_VALID
-
-#else /* Don't use RSI_SOCKETS */
#define RSI_TCP_IP_BYPASS RSI_ENABLE
+//#define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_DHCPV4_CLIENT | TCP_IP_FEAT_ICMP)
#define RSI_TCP_IP_FEATURE_BIT_MAP (TCP_IP_FEAT_BYPASS /*| TCP_IP_FEAT_EXTENSION_VALID*/)
-#endif
+
+//! To set custom feature select bit map
+#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENTION_VALID
//! To set Extended custom feature select bit map
-#if WIFI_ENABLE_SECURITY_WPA3
-#ifdef RSI_M4_INTERFACE
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_256K_MODE | EXT_FEAT_IEEE_80211W)
-#else
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_384K_MODE | EXT_FEAT_IEEE_80211W)
-#endif
-#else
-#ifdef RSI_M4_INTERFACE
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_256K_MODE
-#else
-#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_384K_MODE
-#endif
-#endif
+#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP EXT_FEAT_UART_SEL_FOR_DEBUG_PRINTS
-//! To set Extended TCPIP feature select bit map
-#define RSI_EXT_TCPIP_FEATURE_BITMAP (/*EXT_FEAT_HTTP_OTAF_SUPPORT |*/ EXT_TCP_IP_SSL_16K_RECORD)
-//! Extended custom feature is selected internally
-//! CCP -- EXT_FEAT_256K_MODE
-//! Wiseconnect -- EXT_FEAT_384K_MODE
+#define RSI_EXT_TCPIP_FEATURE_BITMAP 0
+
/*=======================================================================*/
//! Feature frame parameters
/*=======================================================================*/
@@ -82,13 +60,13 @@
#define AFE_TYPE 1
#define FEATURE_ENABLES 0
/*=======================================================================*/
-//! Band command parameters
+//! Band command paramters
/*=======================================================================*/
//! RSI_BAND_2P4GHZ(2.4GHz) or RSI_BAND_5GHZ(5GHz) or RSI_DUAL_BAND
#define RSI_BAND RSI_BAND_2P4GHZ
/*=======================================================================*/
-//! set region command parameters
+//! set region command paramters
/*=======================================================================*/
//! RSI_ENABLE or RSI_DISABLE Set region support
@@ -98,13 +76,13 @@
#define RSI_SET_REGION_FROM_USER_OR_BEACON 1
//! 0-Default Region domain ,1-US, 2-EUROPE, 3-JAPAN
-#define RSI_REGION_CODE 1
+#define RSI_REGION_CODE 3
//! 0- Without On Board Antenna , 1- With On Board Antenna
#define RSI_MODULE_TYPE 1
/*=======================================================================*/
-//! set region AP command parameters
+//! set region AP command paramters
/*=======================================================================*/
//! RSI_ENABLE or RSI_DISABLE Set region AP support
@@ -114,20 +92,21 @@
#define RSI_SET_REGION_AP_FROM_USER RSI_DISABLE
//! "US" or "EU" or "JP" or other region codes
-#define RSI_COUNTRY_CODE "US"
+#define RSI_COUNTRY_CODE "US "
+
/*=======================================================================*/
//! Rejoin parameters
/*=======================================================================*/
//! RSI_ENABLE or RSI_DISABLE rejoin params
-#define RSI_REJOIN_PARAMS_SUPPORT RSI_ENABLE
+#define RSI_REJOIN_PARAMS_SUPPORT RSI_DISABLE
//! Rejoin retry count. If 0 retries infinity times
-#define RSI_REJOIN_MAX_RETRY 5
+#define RSI_REJOIN_MAX_RETRY 0
//! Periodicity of rejoin attempt
-#define RSI_REJOIN_SCAN_INTERVAL 1
+#define RSI_REJOIN_SCAN_INTERVAL 4
//! Beacon missed count
#define RSI_REJOIN_BEACON_MISSED_COUNT 40
@@ -141,13 +120,13 @@
/*=======================================================================*/
//! RSI_ENABLE or RSI_DISABLE BG Scan support
-#define RSI_BG_SCAN_SUPPORT RSI_ENABLE
+#define RSI_BG_SCAN_SUPPORT RSI_DISABLE
//! RSI_ENABLE or RSI_DISABLE BG scan
#define RSI_BG_SCAN_ENABLE RSI_ENABLE
//! RSI_ENABLE or RSI_DISABLE instant BG scan
-#define RSI_INSTANT_BG RSI_ENABLE
+#define RSI_INSTANT_BG 1 // RSI_DISABLE
//! BG scan threshold value
#define RSI_BG_SCAN_THRESHOLD 63
@@ -165,7 +144,7 @@
#define RSI_PASSIVE_SCAN_DURATION 50
//! Multi probe
-#define RSI_MULTIPROBE RSI_ENABLE
+#define RSI_MULTIPROBE RSI_DISABLE
/*=======================================================================*/
@@ -197,15 +176,8 @@
//! RSI_ENABLE or RSI_DISABLE 11n mode in AP mode
#define RSI_MODE_11N_ENABLE RSI_DISABLE
-//! HT caps supported
-#define RSI_HT_CAPS_NUM_RX_STBC (1 << 8)
-#define RSI_HT_CAPS_SHORT_GI_20MHZ BIT(5)
-#define RSI_HT_CAPS_GREENFIELD_EN BIT(4)
-#define RSI_HT_CAPS_SUPPORT_CH_WIDTH BIT(1)
-
//! HT caps bit map.
-#define RSI_HT_CAPS_BIT_MAP \
- (RSI_HT_CAPS_NUM_RX_STBC | RSI_HT_CAPS_SHORT_GI_20MHZ | RSI_HT_CAPS_GREENFIELD_EN | RSI_HT_CAPS_SUPPORT_CH_WIDTH)
+#define RSI_HT_CAPS_BIT_MAP 10
/*=======================================================================*/
//! Scan command parameters
@@ -253,12 +225,9 @@
#define RSI_POWER_LEVEL RSI_POWER_LEVEL_HIGH
//! RSI_JOIN_FEAT_STA_BG_ONLY_MODE_ENABLE or RSI_JOIN_FEAT_LISTEN_INTERVAL_VALID
-#if WIFI_ENABLE_SECURITY_WPA3
-#define RSI_JOIN_FEAT_BIT_MAP RSI_JOIN_FEAT_MFP_CAPABLE_REQUIRED
-#else
#define RSI_JOIN_FEAT_BIT_MAP 0
-#endif
+//!
#define RSI_LISTEN_INTERVAL 0
//! Transmission data rate. Physical rate at which data has to be transmitted.
@@ -269,7 +238,7 @@
/*=======================================================================*/
//! DHCP client host name
-#define RSI_DHCP_HOST_NAME "efr_9116"
+#define RSI_DHCP_HOST_NAME "dhcp_client"
//! Transmit test command parameters
/*=======================================================================*/
@@ -345,16 +314,17 @@
/*=======================================================================*/
//! RSI_ENABLE or RSI_DISABLE High performance socket
#define HIGH_PERFORMANCE_ENABLE RSI_ENABLE //@ RSI_ENABLE or RSI_DISABLE High performance socket
-#define TOTAL_SOCKETS 10 //@ Total number of sockets. TCP TX + TCP RX + UDP TX + UDP RX
-#define TOTAL_TCP_SOCKETS 4 //@ Total TCP sockets. TCP TX + TCP RX
-#define TOTAL_UDP_SOCKETS 4 //@ Total UDP sockets. UDP TX + UDP RX
-#define TCP_TX_ONLY_SOCKETS 0 //@ Total TCP TX only sockets. TCP TX
-#define TCP_RX_ONLY_SOCKETS 0 //@ Total TCP RX only sockets. TCP RX
-#define UDP_TX_ONLY_SOCKETS 0 //@ Total UDP TX only sockets. UDP TX
-#define UDP_RX_ONLY_SOCKETS 0 //@ Total UDP RX only sockets. UDP RX
-#define TCP_RX_HIGH_PERFORMANCE_SOCKETS 1 //@ Total TCP RX High Performance sockets
-#define TCP_RX_WINDOW_SIZE_CAP 10 //@ TCP RX Window size
-#define TCP_RX_WINDOW_DIV_FACTOR 10 //@ TCP RX Window division factor
+
+#define TOTAL_SOCKETS 1 //@ Total number of sockets. TCP TX + TCP RX + UDP TX + UDP RX
+#define TOTAL_TCP_SOCKETS 1 //@ Total TCP sockets. TCP TX + TCP RX
+#define TOTAL_UDP_SOCKETS 0 //@ Total UDP sockets. UDP TX + UDP RX
+#define TCP_TX_ONLY_SOCKETS 0 //@ Total TCP TX only sockets. TCP TX
+#define TCP_RX_ONLY_SOCKETS 1 //@ Total TCP RX only sockets. TCP RX
+#define UDP_TX_ONLY_SOCKETS 0 //@ Total UDP TX only sockets. UDP TX
+#define UDP_RX_ONLY_SOCKETS 0 //@ Total UDP RX only sockets. UDP RX
+#define TCP_RX_HIGH_PERFORMANCE_SOCKETS 1 //@ Total TCP RX High Performance sockets
+#define TCP_RX_WINDOW_SIZE_CAP 10 //@ TCP RX Window size
+#define TCP_RX_WINDOW_DIV_FACTOR 10 //@ TCP RX Window division factor
/*=======================================================================*/
//! Socket Create parameters
@@ -384,12 +354,6 @@
//! Timeout for PING_REQUEST
#define RSI_PING_REQ_TIMEOUT_MS 1000
-//! Provide HTTP/HTTPS response status code indication to application e.g 200, 404 etc
-/*=======================================================================*/
-//! Enable or Diable feature
-#define RSI_HTTP_STATUS_INDICATION_EN RSI_DISABLE
-/*=======================================================================*/
-
//! Store Config Profile parameters
/*=======================================================================*/
@@ -470,7 +434,7 @@
//! To configure listen interval
#define RSI_CONFIG_CLIENT_LISTEN_INTERVAL 0
//! To configure SSID
-#define RSI_CONFIG_CLIENT_SSID "Matter_9116"
+#define RSI_CONFIG_CLIENT_SSID "SILABS_AP"
//! RSI_BAND_2P4GHZ(2.4GHz) or RSI_BAND_5GHZ(5GHz) or RSI_DUAL_BAND
#define RSI_CONFIG_CLIENT_BAND RSI_BAND_2P4GHZ
//! To configure channel number
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
similarity index 85%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
index 380fc8f..4309e97 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi.h
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi.h
@@ -21,11 +21,11 @@
* Interface to RSI Sapis
*/
-#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256) /* Unknown how big this should be */
-#define WFX_RSI_TASK_SZ (1024 + 1024) /* Stack for the WFX/RSI task */
-#define WFX_RSI_BUF_SZ (1024 * 10) /* May need tweak */
-#define WFX_RSI_CONFIG_MAX_JOIN 5 /* Max join retries */
-#define WFX_RSI_NUM_TIMERS 2 /* Number of RSI timers to alloc */
+#define WFX_RSI_WLAN_TASK_SZ (1024 + 512 + 256 + 1024 + 512) /* Unknown how big this should be */
+#define WFX_RSI_TASK_SZ (1024 + 1024 + 1024) /* Stack for the WFX/RSI task */
+#define WFX_RSI_BUF_SZ (1024 * 15) /* May need tweak */
+#define WFX_RSI_CONFIG_MAX_JOIN 5 /* Max join retries */
+#define WFX_RSI_NUM_TIMERS 2 /* Number of RSI timers to alloc */
/*
* Various events fielded by the wfx_rsi task
@@ -57,6 +57,8 @@
EventGroupHandle_t events;
TaskHandle_t drv_task;
TaskHandle_t wlan_task;
+ TaskHandle_t init_task;
+ TaskHandle_t ble_task;
uint16_t dev_state;
uint16_t ap_chan; /* The chan our STA is using */
wfx_wifi_provision_t sec;
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
similarity index 98%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
index a55e0ae..f44b6e9 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsi_host.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsi_host.c
@@ -15,15 +15,11 @@
* limitations under the License.
*/
+#include "stdbool.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
#include "sl_status.h"
#include "FreeRTOS.h"
@@ -71,6 +67,11 @@
return SL_STATUS_OK;
}
+int32_t wfx_rsi_platform()
+{
+ return wfx_rsi_init_platform();
+}
+
/*********************************************************************
* @fn void wfx_enable_sta_mode(void)
* @brief
diff --git a/examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
similarity index 99%
rename from examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c
rename to examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
index 8d8a3c1..d7a4641 100644
--- a/examples/platform/silabs/SiWx917/rs911x/wfx_rsidev.c
+++ b/examples/platform/silabs/SiWx917/SiWx917/wfx_rsidev.c
@@ -223,7 +223,7 @@
USART_InitSync_TypeDef usartInit = USART_INITSYNC_DEFAULT;
res = sl_wfx_host_spi_set_config(USART);
- if (res != SPI_CONFIG_SUCCESS)
+ if (res != SPI_CONFIG_SUCESS)
{
return SL_STATUS_FAIL;
}
diff --git a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
similarity index 99%
rename from examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp
rename to examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
index 6e097ff..9116c26 100644
--- a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.cpp
+++ b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.cpp
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-#include "EFR32DeviceDataProvider.h"
+#include "SiWx917DeviceDataProvider.h"
#include <crypto/CHIPCryptoPAL.h>
#include <lib/support/Base64.h>
#include <platform/silabs/SilabsConfig.h>
diff --git a/examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.h b/examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.h
similarity index 100%
rename from examples/platform/silabs/SiWx917/EFR32DeviceDataProvider.h
rename to examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider.h
diff --git a/examples/platform/silabs/SiWx917/TemperatureSensor.cpp b/examples/platform/silabs/SiWx917/TemperatureSensor.cpp
deleted file mode 100644
index 69ba106..0000000
--- a/examples/platform/silabs/SiWx917/TemperatureSensor.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Google LLC.
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "TemperatureSensor.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-// This is a C implementation. Need the ifdef __cplusplus else we get linking issues
-#include "sl_sensor_rht.h"
-
-#ifdef __cplusplus
-}
-#endif
-
-namespace TemperatureSensor {
-constexpr uint16_t kSensorTemperatureOffset = 800;
-
-sl_status_t Init()
-{
- return sl_sensor_rht_init();
-}
-
-sl_status_t GetTemp(uint32_t * relativeHumidity, int16_t * temperature)
-{
- // Sensor resolution 0.001 C
- // DataModel resolution 0.01 C
- int32_t temp;
- sl_status_t status = sl_sensor_rht_get(relativeHumidity, &temp);
- *temperature = static_cast<int16_t>(temp / 10) - kSensorTemperatureOffset;
- return status;
-}
-}; // namespace TemperatureSensor
diff --git a/examples/platform/silabs/SiWx917/TemperatureSensor.h b/examples/platform/silabs/SiWx917/TemperatureSensor.h
deleted file mode 100644
index 116287e..0000000
--- a/examples/platform/silabs/SiWx917/TemperatureSensor.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Google LLC.
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "sl_status.h"
-#include <stdint.h>
-
-namespace TemperatureSensor {
-sl_status_t Init();
-sl_status_t GetTemp(uint32_t * relativeHumidity, int16_t * temperature);
-}; // namespace TemperatureSensor
diff --git a/examples/platform/silabs/SiWx917/board_config.h b/examples/platform/silabs/SiWx917/board_config.h
index 8c495b4..ed92fdd 100644
--- a/examples/platform/silabs/SiWx917/board_config.h
+++ b/examples/platform/silabs/SiWx917/board_config.h
@@ -28,7 +28,7 @@
/**
* @file
- * This file includes dev borad compile-time configuration constants for efr32.
+ * This file includes dev board compile-time configuration constants for SiWx917.
*
*/
diff --git a/examples/platform/silabs/SiWx917/device/inc/system_si917.h b/examples/platform/silabs/SiWx917/device/inc/system_si917.h
new file mode 100644
index 0000000..9c56651
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/inc/system_si917.h
@@ -0,0 +1,167 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */
+#include <stdint.h>
+//#include "cmsis_gcc.h"
+
+/*******************************************************************************
+ * @addtogroup Parts
+ * @{
+ ******************************************************************************/
+/*******************************************************************************
+ * @addtogroup EFR32 EFR32
+ * @{
+ ******************************************************************************/
+
+/*******************************************************************************
+ ****************************** TYPEDEFS ***********************************
+ ******************************************************************************/
+
+/* Interrupt vectortable entry */
+typedef union
+{
+ void (*VECTOR_TABLE_Type)(void);
+ void * topOfStack;
+} tVectorEntry;
+
+/*******************************************************************************
+ ************************** GLOBAL VARIABLES *******************************
+ ******************************************************************************/
+//#ifndef CCP_SI917_BRINGUP
+extern uint32_t SystemCoreClock; /**< System Clock Frequency (Core Clock) */
+//#endif /* CCP_SI917_BRINGUP */
+extern uint32_t SystemHfrcoFreq; /**< System HFRCO frequency */
+
+/*******************************************************************************
+ ***************************** PROTOTYPES **********************************
+ ******************************************************************************/
+
+void Reset_Handler(void); /**< Reset Handler */
+void NMI_Handler(void); /**< NMI Handler */
+void HardFault_Handler(void); /**< Hard Fault Handler */
+void MemManage_Handler(void); /**< MPU Fault Handler */
+void BusFault_Handler(void); /**< Bus Fault Handler */
+void UsageFault_Handler(void); /**< Usage Fault Handler */
+void SVC_Handler(void); /**< SVCall Handler */
+void DebugMon_Handler(void); /**< Debug Monitor Handler */
+void PendSV_Handler(void); /**< PendSV Handler */
+void SysTick_Handler(void); /**< SysTick Handler */
+
+void EMU_IRQHandler(void); /**< EMU IRQ Handler */
+void FRC_PRI_IRQHandler(void); /**< FRC_PRI IRQ Handler */
+void WDOG0_IRQHandler(void); /**< WDOG0 IRQ Handler */
+void WDOG1_IRQHandler(void); /**< WDOG1 IRQ Handler */
+void FRC_IRQHandler(void); /**< FRC IRQ Handler */
+void MODEM_IRQHandler(void); /**< MODEM IRQ Handler */
+void RAC_SEQ_IRQHandler(void); /**< RAC_SEQ IRQ Handler */
+void RAC_RSM_IRQHandler(void); /**< RAC_RSM IRQ Handler */
+void BUFC_IRQHandler(void); /**< BUFC IRQ Handler */
+void LDMA_IRQHandler(void); /**< LDMA IRQ Handler */
+void GPIO_EVEN_IRQHandler(void); /**< GPIO_EVEN IRQ Handler */
+void TIMER0_IRQHandler(void); /**< TIMER0 IRQ Handler */
+void USART0_RX_IRQHandler(void); /**< USART0_RX IRQ Handler */
+void USART0_TX_IRQHandler(void); /**< USART0_TX IRQ Handler */
+void ACMP0_IRQHandler(void); /**< ACMP0 IRQ Handler */
+void ADC0_IRQHandler(void); /**< ADC0 IRQ Handler */
+void IDAC0_IRQHandler(void); /**< IDAC0 IRQ Handler */
+void I2C0_IRQHandler(void); /**< I2C0 IRQ Handler */
+void GPIO_ODD_IRQHandler(void); /**< GPIO_ODD IRQ Handler */
+void TIMER1_IRQHandler(void); /**< TIMER1 IRQ Handler */
+void USART1_RX_IRQHandler(void); /**< USART1_RX IRQ Handler */
+void USART1_TX_IRQHandler(void); /**< USART1_TX IRQ Handler */
+void LEUART0_IRQHandler(void); /**< LEUART0 IRQ Handler */
+void PCNT0_IRQHandler(void); /**< PCNT0 IRQ Handler */
+void CMU_IRQHandler(void); /**< CMU IRQ Handler */
+void MSC_IRQHandler(void); /**< MSC IRQ Handler */
+void CRYPTO0_IRQHandler(void); /**< CRYPTO IRQ Handler */
+void LETIMER0_IRQHandler(void); /**< LETIMER0 IRQ Handler */
+void AGC_IRQHandler(void); /**< AGC IRQ Handler */
+void PROTIMER_IRQHandler(void); /**< PROTIMER IRQ Handler */
+void RTCC_IRQHandler(void); /**< RTCC IRQ Handler */
+void SYNTH_IRQHandler(void); /**< SYNTH IRQ Handler */
+void CRYOTIMER_IRQHandler(void); /**< CRYOTIMER IRQ Handler */
+void RFSENSE_IRQHandler(void); /**< RFSENSE IRQ Handler */
+void FPUEH_IRQHandler(void); /**< FPUEH IRQ Handler */
+void SMU_IRQHandler(void); /**< SMU IRQ Handler */
+void WTIMER0_IRQHandler(void); /**< WTIMER0 IRQ Handler */
+void WTIMER1_IRQHandler(void); /**< WTIMER1 IRQ Handler */
+void PCNT1_IRQHandler(void); /**< PCNT1 IRQ Handler */
+void PCNT2_IRQHandler(void); /**< PCNT2 IRQ Handler */
+void USART2_RX_IRQHandler(void); /**< USART2_RX IRQ Handler */
+void USART2_TX_IRQHandler(void); /**< USART2_TX IRQ Handler */
+void I2C1_IRQHandler(void); /**< I2C1 IRQ Handler */
+void USART3_RX_IRQHandler(void); /**< USART3_RX IRQ Handler */
+void USART3_TX_IRQHandler(void); /**< USART3_TX IRQ Handler */
+void VDAC0_IRQHandler(void); /**< VDAC0 IRQ Handler */
+void CSEN_IRQHandler(void); /**< CSEN IRQ Handler */
+void LESENSE_IRQHandler(void); /**< LESENSE IRQ Handler */
+void CRYPTO1_IRQHandler(void); /**< CRYPTO1 IRQ Handler */
+void TRNG0_IRQHandler(void); /**< TRNG0 IRQ Handler */
+void SYSCFG_IRQHandler(void); /**< SYSCFG IRQ Handler */
+
+uint32_t SystemCoreClockGet(void);
+
+/*******************************************************************************
+ * @brief
+ * Update CMSIS SystemCoreClock variable.
+ *
+ * @details
+ * CMSIS defines a global variable SystemCoreClock
+ *that shall hold the core frequency in Hz. If the
+ *core frequency is dynamically changed, the variable
+ *must be kept updated in order to be CMSIS compliant.
+ *
+ * Notice that only if changing the core clock
+ *frequency through the EFR CMU API, this variable
+ *will be kept updated. This function is only provided
+ * for CMSIS compliance and if a user modifies the
+ *the core clock outside the CMU API.
+ ******************************************************************************/
+#ifndef CCP_SI917_BRINGUP
+static __INLINE void SystemCoreClockUpdate(void)
+{
+ (void) SystemCoreClockGet();
+}
+#endif /* CCP_SI917_BRINGUP */
+
+uint32_t SystemMaxCoreClockGet(void);
+
+void SystemInit(void);
+uint32_t SystemHFClockGet(void);
+
+uint32_t SystemHFXOClockGet(void);
+void SystemHFXOClockSet(uint32_t freq);
+
+uint32_t SystemLFRCOClockGet(void);
+uint32_t SystemULFRCOClockGet(void);
+
+uint32_t SystemLFXOClockGet(void);
+void SystemLFXOClockSet(uint32_t freq);
+
+/** @} End of group */
+/** @} End of group Parts */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c b/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c
new file mode 100644
index 0000000..a62ea68
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/src/startup_RS1xxxx.c
@@ -0,0 +1,530 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "rsi_ps_ram_func.h"
+#include "system_RS1xxxx.h"
+#include "system_si917.h"
+
+/*----------Stack Configuration-----------------------------------------------*/
+#define STACK_SIZE 0x00000C00 /*!< Stack size (in Words) */
+__attribute__((section(".co_stack"))) unsigned long pulStack[STACK_SIZE];
+
+#define EXT_IRQ_COUNT 98 /**< Number of External (NVIC) interrupts */ // senthil copied from "efr32mg12p432f1024gl125.h"
+#define TOTAL_INTERRUPTS (16 + EXT_IRQ_COUNT)
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP __StackTop
+#endif
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
+#endif
+
+/*----------Macro definition--------------------------------------------------*/
+#define WEAK __attribute__((weak))
+
+/*----------Declaration of the default fault handlers-------------------------*/
+// #ifndef __START
+// extern void _start(void) __attribute__((noreturn)); /* Pre Main (C library entry point) */
+// #else
+// extern int __START(void) __attribute__((noreturn)); /* main entry point */
+// #endif
+
+/* System exception vector handler */
+__attribute__((used)) void WEAK Reset_Handler(void);
+void WEAK NMI_Handler(void);
+void WEAK HardFault_Handler(void);
+void WEAK MemManage_Handler(void);
+void WEAK BusFault_Handler(void);
+void WEAK UsageFault_Handler(void);
+void WEAK SVC_Handler(void);
+void WEAK DebugMon_Handler(void);
+void WEAK PendSV_Handler(void);
+void WEAK SysTick_Handler(void);
+
+/*Boot up functions*/
+void RSI_Default_Reset_Handler(void);
+void RSI_Default_WakeUp_Handler(void);
+void RSI_PS_RestoreCpuContext(void);
+
+void WEAK IRQ000_Handler(void); /*!< ULP Processor Interrupt 0 */
+void WEAK IRQ001_Handler(void); /*!< ULP Processor Interrupt 1 */
+void WEAK IRQ002_Handler(void); /*!< ULP Processor Interrupt 2 */
+void WEAK IRQ003_Handler(void); /*!< ULP Processor Interrupt 3 */
+void WEAK IRQ004_Handler(void); /*!< ULP Processor Interrupt 4 */
+void WEAK IRQ005_Handler(void); /*!< ULP Processor Interrupt 5 */
+void WEAK IRQ006_Handler(void); /*!< ULP Processor Interrupt 6 */
+void WEAK IRQ007_Handler(void); /*!< ULP Processor Interrupt 7 */
+void WEAK IRQ008_Handler(void); /*!< ULP Processor Interrupt 8 */
+void WEAK IRQ009_Handler(void); /*!< ULP Processor Interrupt 9 */
+void WEAK IRQ010_Handler(void); /*!< ULP Processor Interrupt 10 */
+void WEAK IRQ011_Handler(void); /*!< ULP Processor Interrupt 11 */
+void WEAK IRQ012_Handler(void); /*!< ULP Processor Interrupt 12 */
+void WEAK IRQ013_Handler(void); /*!< ULP Processor Interrupt 13 */
+void WEAK IRQ014_Handler(void); /*!< ULP Processor Interrupt 14 */
+void WEAK IRQ015_Handler(void); /*!< ULP Processor Interrupt 15 */
+void WEAK IRQ016_Handler(void); /*!< ULP Processor Interrupt 15 */
+void WEAK IRQ017_Handler(void); /*!< ULP Processor Interrupt 17 */
+void WEAK IRQ018_Handler(void); /*!< ULP Processor Interrupt 18 */
+void WEAK IRQ019_Handler(void); /*!< ULP Processor Interrupt 19 */
+void WEAK IRQ020_Handler(void); /*!< Sleep Sensor Interrupts 0 */ /*WDT*/
+void WEAK IRQ021_Handler(void); /*!< Sleep Sensor Interrupts 1 */
+void WEAK IRQ022_Handler(void); /*!< Sleep Sensor Interrupts 2 */
+void WEAK IRQ023_Handler(void); /*!< Sleep Sensor Interrupts 3 */
+void WEAK IRQ024_Handler(void); /*!< Sleep Sensor Interrupts 4 */
+void WEAK IRQ025_Handler(void); /*!< Sleep Sensor Interrupts 5 */
+void WEAK IRQ026_Handler(void); /*!< Sleep Sensor Interrupts 6 */
+void WEAK IRQ027_Handler(void); /*!< Sleep Sensor Interrupts 7 */
+void WEAK IRQ028_Handler(void); /*!< Sleep Sensor Interrupts 8 */ /*Alarm*/
+void WEAK IRQ029_Handler(void); /*!< Sleep Sensor Interrupts 9 */ /*Msec and sec interrupt */
+void WEAK IRQ030_Handler(void); /*!< Reserved */
+void WEAK IRQ031_Handler(void); /*!< M4SS DMA interrupt */
+void WEAK IRQ032_Handler(void); /*!< Reserved */
+void WEAK IRQ033_Handler(void); /*!< M4SS DMA interrupt */
+void WEAK IRQ034_Handler(void); /*!< M4SS SCT interrupt */
+void WEAK HIF1_IRQHandler(void); /*!< HIF Interrupt 1 */
+void WEAK HIF2_IRQHandler(void); /*!< HIF Interrupt 2 */
+void WEAK IRQ037_Handler(void); /*!< SIO Interrupt */
+void WEAK IRQ038_Handler(void); /*!< USART 1 Interrupt */
+void WEAK IRQ039_Handler(void); /*!< Reserved */
+void WEAK IRQ040_Handler(void); /*!< Reserved */
+void WEAK IRQ041_Handler(void); /*!< Reserved */
+void WEAK IRQ042_Handler(void); /*!< I2C Interrupt */
+void WEAK IRQ043_Handler(void); /*!< Reserved */
+void WEAK IRQ044_Handler(void); /*!< SSI Slave Interrupt */
+void WEAK IRQ045_Handler(void); /*!< Reserved */
+void WEAK IRQ046_Handler(void); /*!< GSPI Master 1 Interrupt */
+void WEAK IRQ047_Handler(void); /*!< Reserved */
+void WEAK IRQ048_Handler(void); /*!< MCPWM Interrupt */
+void WEAK IRQ049_Handler(void); /*!< QEI Interrupt */
+void WEAK IRQ050_Handler(void); /*!< GPIO Group Interrupt 0 */
+void WEAK IRQ051_Handler(void); /*!< GPIO Group Interrupt 1 */
+void WEAK IRQ052_Handler(void); /*!< GPIO Pin Interrupt 0 */
+void WEAK IRQ053_Handler(void); /*!< GPIO Pin Interrupt 1 */
+void WEAK IRQ054_Handler(void); /*!< GPIO Pin Interrupt 2 */
+void WEAK IRQ055_Handler(void); /*!< GPIO Pin Interrupt 3 */
+void WEAK IRQ056_Handler(void); /*!< GPIO Pin Interrupt 4 */
+void WEAK IRQ057_Handler(void); /*!< GPIO Pin Interrupt 5 */
+void WEAK IRQ058_Handler(void); /*!< GPIO Pin Interrupt 6 */
+void WEAK IRQ059_Handler(void); /*!< GPIO Pin Interrupt 7 */
+void WEAK IRQ060_Handler(void); /*!< QSPI Interrupt */
+void WEAK IRQ061_Handler(void); /*!< I2C 2 Interrupt */
+void WEAK IRQ062_Handler(void); /*!< Ethernet Interrupt */
+void WEAK IRQ063_Handler(void); /*!< Reserved */
+void WEAK IRQ064_Handler(void); /*!< I2S master Interrupt */
+void WEAK IRQ065_Handler(void); /*!< Reserved */
+void WEAK IRQ066_Handler(void); /*!< Can 1 Interrupt */
+void WEAK IRQ067_Handler(void); /*!< Reserved */
+void WEAK IRQ068_Handler(void); /*!< SDMEM Interrupt */
+void WEAK IRQ069_Handler(void); /*!< PLL clock ind Interrupt */
+void WEAK IRQ070_Handler(void); /*!< Reserved */
+void WEAK IRQ071_Handler(void); /*!< CCI system Interrupt Out */
+void WEAK IRQ072_Handler(void); /*!< FPU exception */
+void WEAK IRQ073_Handler(void); /*!< USB INTR */
+void WEAK IRQ074_Handler(void); /*!< TASS_P2P_INTR */
+void WEAK IRQ075_Handler(void); /*!< WLAN Band1 intr0 */
+void WEAK IRQ076_Handler(void); /*!< WLAN Band1 intr1 */
+void WEAK IRQ077_Handler(void); /*!< Reserved */
+void WEAK IRQ078_Handler(void); /*!< Reserved */
+void WEAK IRQ079_Handler(void); /*!< BT intr */
+void WEAK IRQ080_Handler(void); /*!< ZB intr */
+void WEAK IRQ081_Handler(void); /*!< Reserved */
+void WEAK IRQ082_Handler(void); /*!< Modem disabled mode trigger intr */
+void WEAK IRQ083_Handler(void); /*!< gpio intr */
+void WEAK IRQ084_Handler(void); /*!< uart intr */
+void WEAK IRQ085_Handler(void); /*!< watch dog level intr */
+void WEAK IRQ086_Handler(void); /*!< ULP Sleep sensor interrupt */
+void WEAK IRQ087_Handler(void); /*!< ECDH intr */
+void WEAK IRQ088_Handler(void); /*!< DH intr */
+void WEAK IRQ089_Handler(void); /*!< QSPI intr */
+void WEAK IRQ090_Handler(void); /*!< ULP processor interrupt TASS */
+void WEAK IRQ091_Handler(void); /*!< Sys Tick Timer */
+void WEAK IRQ092_Handler(void); /*!< Real Timer interrupt */
+void WEAK IRQ093_Handler(void); /*!< PLL lock interrupt */
+void WEAK IRQ094_Handler(void); /*!< Reserved */
+void WEAK IRQ095_Handler(void); /*!< UART2 Interrupt */
+void WEAK IRQ096_Handler(void); /*!< I2S Interrupt */
+void WEAK IRQ097_Handler(void); /*!< I2C Interrupt */
+void WEAK IRQ098_Handler(void); /*!< RESERVED */
+
+/*----------Symbols defined in linker script----------------------------------*/
+extern unsigned long _sidata; /*!< Start address for the initialization
+ values of the .data section. */
+extern unsigned long _sdata; /*!< Start address for the .data section */
+extern unsigned long _edata; /*!< End address for the .data section */
+extern unsigned long _sbss; /*!< Start address for the .bss section */
+extern unsigned long _ebss; /*!< End address for the .bss section */
+extern void _eram; /*!< End address for ram */
+extern uint32_t __etext;
+extern unsigned long __StackTop;
+
+/*----------Function prototypes-----------------------------------------------*/
+extern int main(void); /*!< The entry point for the application */
+void Default_Reset_Handler(void); /*!< Default reset handler */
+static void Default_Handler(void); /*!< Default exception handler */
+/**
+ *@brief The minimal vector table for a Cortex M4. Note that the proper constructs
+ * must be placed on this to ensure that it ends up at physical address
+ * 0x00000000.
+ */
+
+//(void *)0x300001
+/*CCP new */
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+ /* Cortex-M Exception Handlers */
+ { .topOfStack = &__INITIAL_SP }, /* Initial Stack Pointer */
+ /*{ (void *)&pulStack[STACK_SIZE - 1] },*/
+ { (void *) 0x300001 }, /* Reset Handler : IN CCP Platform system start
+ from bootloader which inturn call reset handler */
+ { NMI_Handler }, /* NMI Handler */
+ { HardFault_Handler }, /* Hard Fault Handler */
+ { MemManage_Handler }, /* MPU Fault Handler */
+ { BusFault_Handler }, /* Bus Fault Handler */
+ { UsageFault_Handler }, /* Usage Fault Handler */
+ { 0 }, /* Reserved */
+ { 0 }, /* Reserved */
+ { 0 }, /* Reserved */
+ { 0 }, /* Reserved */
+ { SVC_Handler }, /* SVCall Handler */
+ { DebugMon_Handler }, /* Debug Monitor Handler */
+ { 0 }, /* Application properties*/
+ { PendSV_Handler }, /* PendSV Handler */
+ { SysTick_Handler }, /* SysTick Handler */
+
+ /* External interrupts */
+
+ { IRQ000_Handler }, /* 0 */
+ { IRQ001_Handler }, /* 1 */
+ { IRQ002_Handler }, /* 2 */
+ { IRQ003_Handler }, /* 3 */
+ { IRQ004_Handler }, /* 4 */
+ { IRQ005_Handler }, /* 5 */
+ { IRQ006_Handler }, /* 6 */
+ { IRQ007_Handler }, /* 7 */
+ { IRQ008_Handler }, /* 8 */
+ { IRQ009_Handler }, /* 9 */
+ { IRQ010_Handler }, /* 10 */
+ { IRQ011_Handler }, /* 11 */
+ { IRQ012_Handler }, /* 12 */
+ { IRQ013_Handler }, /* 13 */
+ { IRQ014_Handler }, /* 14 */
+ { IRQ015_Handler }, /* 15 */
+ { IRQ016_Handler }, /* 16 */
+ { IRQ017_Handler }, /* 17 */
+ { IRQ018_Handler }, /* 18 */
+ { IRQ019_Handler }, /* 19 */
+ { IRQ020_Handler }, /* 20 */
+ { IRQ021_Handler }, /* 21 */
+ { IRQ022_Handler }, /* 22 */
+ { IRQ023_Handler }, /* 23 */
+ { IRQ024_Handler }, /* 24 */
+ { IRQ025_Handler }, /* 25 */
+ { IRQ026_Handler }, /* 26 */
+ { IRQ027_Handler }, /* 27 */
+ { IRQ028_Handler }, /* 28 */
+ { IRQ029_Handler }, /* 29 */
+ { (void *) &__StackTop - 0x0c }, /* 30 */
+ { IRQ031_Handler }, /* 31 */
+ { RSI_Default_Reset_Handler }, /* 32 */
+ { IRQ033_Handler }, /* 33 */
+ { IRQ034_Handler }, /* 34 */
+ { HIF1_IRQHandler }, /* 35 */
+ { HIF2_IRQHandler }, /* 36 */
+ { IRQ037_Handler }, /* 37 */
+ { IRQ038_Handler }, /* 38 */
+ { IRQ039_Handler }, /* 39 */
+ { RSI_PS_RestoreCpuContext }, /* 40 */
+ { IRQ041_Handler }, /* 41 */
+ { IRQ042_Handler }, /* 42 */
+ { (void *) 0x10AD10AD }, /* 43 */
+ { IRQ044_Handler }, /* 44 */
+ { 0 }, /* 45 */
+ { IRQ046_Handler }, /* 46 */
+ { IRQ047_Handler }, /* 47 */
+ { IRQ048_Handler }, /* 48 */
+ { IRQ049_Handler }, /* 49 */
+ { IRQ050_Handler }, /* 50 - Reserved */
+ { IRQ051_Handler },
+ { IRQ052_Handler },
+ { IRQ053_Handler },
+ { IRQ054_Handler },
+ { IRQ055_Handler },
+ { IRQ056_Handler },
+ { IRQ057_Handler },
+ { IRQ058_Handler },
+ { IRQ059_Handler },
+ { IRQ060_Handler },
+ { IRQ061_Handler },
+ { IRQ062_Handler },
+ { IRQ063_Handler },
+ { IRQ064_Handler },
+ { 0 },
+ { IRQ066_Handler },
+ { 0 },
+ { IRQ068_Handler },
+ { IRQ069_Handler },
+ { 0 },
+ { IRQ071_Handler },
+ { IRQ072_Handler },
+ { IRQ073_Handler },
+ { IRQ074_Handler },
+ { IRQ075_Handler },
+ { IRQ076_Handler },
+ { 0 },
+ { 0 },
+ { IRQ079_Handler },
+ { IRQ080_Handler },
+ { 0 },
+ { IRQ082_Handler },
+ { IRQ083_Handler },
+ { IRQ084_Handler },
+ { IRQ085_Handler },
+ { IRQ086_Handler },
+ { IRQ087_Handler },
+ { IRQ088_Handler },
+ { IRQ089_Handler },
+ { IRQ090_Handler },
+ { IRQ091_Handler },
+ { IRQ092_Handler },
+ { IRQ093_Handler },
+ { 0 },
+ { IRQ095_Handler },
+ { 0 },
+ { IRQ097_Handler },
+};
+
+/**
+ * @brief This is the code that gets never called, Dummy handler
+ * @param None
+ * @retval None
+ */
+void Default_Reset_Handler(void)
+{
+ /*Generic Default reset handler for CM4 */
+ while (1)
+ ;
+}
+
+void Copy_Table()
+{
+ uint32_t *pSrc, *pDest;
+ extern uint32_t __etext;
+ extern uint32_t __data_start__;
+ extern uint32_t __data_end__;
+ pSrc = &__etext;
+ pDest = &__data_start__;
+
+ for (; pDest < &__data_end__;)
+ {
+ *pDest++ = *pSrc++;
+ }
+}
+
+void Zero_Table()
+{
+ uint32_t * pDest;
+ extern uint32_t __bss_start__;
+ extern uint32_t __bss_end__;
+ pDest = &__bss_start__;
+
+ for (; pDest < &__bss_end__;)
+ {
+ *pDest++ = 0UL;
+ }
+}
+void Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+ SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+ SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+ Copy_Table();
+ Zero_Table();
+ __START();
+#else
+#if 0 // senthil_ccp
+ __PROGRAM_START(); /* Enter PreMain (C library entry point) */
+#else
+ Copy_Table();
+ Zero_Table();
+ _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+void RSI_Default_Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+ SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+ SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+ Copy_Table();
+ Zero_Table();
+ __START();
+#else
+#if 0 // senthil_ccp
+ __PROGRAM_START(); /* Enter PreMain (C library entry point) */
+#else
+ Copy_Table();
+ Zero_Table();
+ _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+/**
+ *@brief Provide weak aliases for each Exception handler to the Default_Handler.
+ * As they are weak aliases, any function with the same name will override
+ * this definition.
+ */
+//#pragma weak Reset_Handler = RSI_Default_Reset_Handler
+#pragma weak NMI_Handler = Default_Handler
+#pragma weak HardFault_Handler = Default_Handler
+#pragma weak MemManage_Handler = Default_Handler
+#pragma weak BusFault_Handler = Default_Handler
+#pragma weak UsageFault_Handler = Default_Handler
+#pragma weak SVC_Handler = Default_Handler
+#pragma weak DebugMon_Handler = Default_Handler
+#pragma weak PendSV_Handler = Default_Handler
+#pragma weak SysTick_Handler = Default_Handler
+/*----------------------------------external interrupts------------------------------ */
+#pragma weak IRQ000_Handler = Default_Handler
+#pragma weak IRQ001_Handler = Default_Handler
+#pragma weak IRQ002_Handler = Default_Handler
+#pragma weak IRQ003_Handler = Default_Handler
+#pragma weak IRQ004_Handler = Default_Handler
+#pragma weak IRQ005_Handler = Default_Handler
+#pragma weak IRQ006_Handler = Default_Handler
+#pragma weak IRQ007_Handler = Default_Handler
+#pragma weak IRQ008_Handler = Default_Handler
+#pragma weak IRQ009_Handler = Default_Handler
+#pragma weak IRQ010_Handler = Default_Handler
+#pragma weak IRQ011_Handler = Default_Handler
+#pragma weak IRQ012_Handler = Default_Handler
+#pragma weak IRQ013_Handler = Default_Handler
+#pragma weak IRQ014_Handler = Default_Handler
+#pragma weak IRQ015_Handler = Default_Handler
+#pragma weak IRQ016_Handler = Default_Handler
+#pragma weak IRQ017_Handler = Default_Handler
+#pragma weak IRQ018_Handler = Default_Handler
+#pragma weak IRQ019_Handler = Default_Handler
+#pragma weak IRQ020_Handler = Default_Handler
+#pragma weak IRQ021_Handler = Default_Handler
+#pragma weak IRQ022_Handler = Default_Handler
+#pragma weak IRQ023_Handler = Default_Handler
+#pragma weak IRQ024_Handler = Default_Handler
+#pragma weak IRQ025_Handler = Default_Handler
+#pragma weak IRQ026_Handler = Default_Handler
+#pragma weak IRQ027_Handler = Default_Handler
+#pragma weak IRQ028_Handler = Default_Handler
+#pragma weak IRQ029_Handler = Default_Handler
+#pragma weak IRQ030_Handler = Default_Handler
+#pragma weak IRQ031_Handler = Default_Handler
+#pragma weak IRQ032_Handler = Default_Handler
+#pragma weak IRQ033_Handler = Default_Handler
+#pragma weak IRQ034_Handler = Default_Handler
+#pragma weak HIF1_IRQHandler = Default_Handler
+#pragma weak HIF2_IRQHandler = Default_Handler
+#pragma weak IRQ037_Handler = Default_Handler
+#pragma weak IRQ038_Handler = Default_Handler
+#pragma weak IRQ039_Handler = Default_Handler
+#pragma weak IRQ040_Handler = Default_Handler
+#pragma weak IRQ041_Handler = Default_Handler
+#pragma weak IRQ042_Handler = Default_Handler
+#pragma weak IRQ043_Handler = Default_Handler
+#pragma weak IRQ044_Handler = Default_Handler
+#pragma weak IRQ045_Handler = Default_Handler
+#pragma weak IRQ046_Handler = Default_Handler
+#pragma weak IRQ047_Handler = Default_Handler
+#pragma weak IRQ048_Handler = Default_Handler
+#pragma weak IRQ049_Handler = Default_Handler
+#pragma weak IRQ050_Handler = Default_Handler
+#pragma weak IRQ051_Handler = Default_Handler
+#pragma weak IRQ052_Handler = Default_Handler
+#pragma weak IRQ053_Handler = Default_Handler
+#pragma weak IRQ054_Handler = Default_Handler
+#pragma weak IRQ055_Handler = Default_Handler
+#pragma weak IRQ056_Handler = Default_Handler
+#pragma weak IRQ057_Handler = Default_Handler
+#pragma weak IRQ058_Handler = Default_Handler
+#pragma weak IRQ059_Handler = Default_Handler
+#pragma weak IRQ060_Handler = Default_Handler
+#pragma weak IRQ061_Handler = Default_Handler
+#pragma weak IRQ062_Handler = Default_Handler
+#pragma weak IRQ063_Handler = Default_Handler
+#pragma weak IRQ064_Handler = Default_Handler
+#pragma weak IRQ065_Handler = Default_Handler
+#pragma weak IRQ066_Handler = Default_Handler
+#pragma weak IRQ067_Handler = Default_Handler
+#pragma weak IRQ068_Handler = Default_Handler
+#pragma weak IRQ069_Handler = Default_Handler
+#pragma weak IRQ070_Handler = Default_Handler
+#pragma weak IRQ071_Handler = Default_Handler
+#pragma weak IRQ072_Handler = Default_Handler
+#pragma weak IRQ073_Handler = Default_Handler
+#pragma weak IRQ074_Handler = Default_Handler
+#pragma weak IRQ075_Handler = Default_Handler
+#pragma weak IRQ076_Handler = Default_Handler
+#pragma weak IRQ077_Handler = Default_Handler
+#pragma weak IRQ078_Handler = Default_Handler
+#pragma weak IRQ079_Handler = Default_Handler
+#pragma weak IRQ080_Handler = Default_Handler
+#pragma weak IRQ081_Handler = Default_Handler
+#pragma weak IRQ082_Handler = Default_Handler
+#pragma weak IRQ083_Handler = Default_Handler
+#pragma weak IRQ084_Handler = Default_Handler
+#pragma weak IRQ085_Handler = Default_Handler
+#pragma weak IRQ086_Handler = Default_Handler
+#pragma weak IRQ087_Handler = Default_Handler
+#pragma weak IRQ088_Handler = Default_Handler
+#pragma weak IRQ089_Handler = Default_Handler
+#pragma weak IRQ090_Handler = Default_Handler
+#pragma weak IRQ091_Handler = Default_Handler
+#pragma weak IRQ092_Handler = Default_Handler
+#pragma weak IRQ093_Handler = Default_Handler
+#pragma weak IRQ094_Handler = Default_Handler
+#pragma weak IRQ095_Handler = Default_Handler
+#pragma weak IRQ096_Handler = Default_Handler
+#pragma weak IRQ097_Handler = Default_Handler
+#pragma weak IRQ098_Handler = Default_Handler
+
+/**
+ * @brief This is the code that gets called when the processor receives an
+ * unexpected interrupt. This simply enters an infinite loop,
+ * preserving the system state for examination by a debugger.
+ * @param None
+ * @retval None
+ */
+static void Default_Handler(void)
+{
+ /* Go into an infinite loop. */
+ while (1)
+ {
+ }
+}
+
+/*********************** (C) COPYRIGHT 2009 Coocox ************END OF FILE*****/
diff --git a/examples/platform/silabs/SiWx917/device/src/startup_si917.c b/examples/platform/silabs/SiWx917/device/src/startup_si917.c
new file mode 100644
index 0000000..03cb7ff
--- /dev/null
+++ b/examples/platform/silabs/SiWx917/device/src/startup_si917.c
@@ -0,0 +1,403 @@
+/*
+ *
+ * Copyright (c) 2022 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "system_si917.h"
+#include <stdbool.h>
+#include <stdint.h>
+//#include "cmsis_gcc.h"
+
+#ifdef BOOTLOADER_ENABLE
+#include "api/btl_interface.h"
+
+#endif
+
+#ifdef SL_APP_PROPERTIES
+#include "api/application_properties.h"
+
+#endif
+
+#define EXT_IRQ_COUNT 51 /**< Number of External (NVIC) interrupts */ // senthil copied from "efr32mg12p432f1024gl125.h"
+#define TOTAL_INTERRUPTS (16 + EXT_IRQ_COUNT)
+
+#ifdef BOOTLOADER_ENABLE
+extern MainBootloaderTable_t mainStageTable;
+
+extern void SystemInit2(void);
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler Function Prototype
+ *----------------------------------------------------------------------------*/
+typedef void (*VECTOR_TABLE_Type)(void);
+#endif
+
+#ifdef SL_APP_PROPERTIES
+extern ApplicationProperties_t sl_app_properties;
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler Function Prototype
+ *----------------------------------------------------------------------------*/
+typedef void (*VECTOR_TABLE_Type)(void);
+#endif
+
+/*---------------------------------------------------------------------------
+ * External References
+ *---------------------------------------------------------------------------*/
+extern uint32_t __INITIAL_SP;
+extern uint32_t __StackTop;
+
+#ifndef __INITIAL_SP
+#define __INITIAL_SP __StackTop
+#endif
+#ifndef __VECTOR_TABLE_ATTRIBUTE
+#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section(".vectors")))
+#endif
+
+extern void __PROGRAM_START(void);
+
+#if defined(__START) && defined(__GNUC__)
+extern int __START(void) __attribute__((noreturn)); /* main entry point */
+void Zero_Table();
+void Copy_Table();
+#endif /* __START */
+
+/*---------------------------------------------------------------------------
+ * Internal References
+ *---------------------------------------------------------------------------*/
+void Reset_Handler(void);
+void Default_Handler(void);
+
+#if defined(__GNUC__)
+#ifndef __STACK_SIZE
+#define __STACK_SIZE 0x00000400
+#endif /* __STACK_SIZE */
+
+#ifndef __HEAP_SIZE
+#define __HEAP_SIZE 0x00000C00
+#endif /* __HEAP_SIZE */
+#endif /* __GNUC__ */
+
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Handler
+ *----------------------------------------------------------------------------*/
+/* Cortex-M Processor Exceptions */
+void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
+void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
+#ifndef SL_APP_PROPERTIES
+/* Provide a dummy value for the sl_app_properties symbol. */
+void sl_app_properties(void); /* Prototype to please MISRA checkers. */
+void sl_app_properties(void) __attribute__((weak, alias("Default_Handler")));
+#endif
+
+/* Part Specific Interrupts */
+
+void EMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FRC_PRI_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WDOG0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WDOG1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FRC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void MODEM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RAC_SEQ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RAC_RSM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void BUFC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void GPIO_EVEN_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART0_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART0_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void ACMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void ADC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void IDAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void GPIO_ODD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TIMER1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART1_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART1_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LEUART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void MSC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYPTO0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LETIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void AGC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PROTIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RTCC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void SYNTH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYOTIMER_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void RFSENSE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void FPUEH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void SMU_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WTIMER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void WTIMER1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void PCNT2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART2_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART2_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART3_RX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void USART3_TX_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void VDAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CSEN_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void LESENSE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void CRYPTO1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+void TRNG0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
+
+#if 0 // senthil_ccp
+
+#ifndef __PROGRAM_START
+
+/**
+ \brief Initializes data and bss sections
+ \details This default implementations initialized all data and additional bss
+ sections relying on .copy.table and .zero.table specified properly
+ in the used linker script.
+
+ */
+void __cmsis_start(void)
+{
+ extern void _start(void) __NO_RETURN;
+
+ typedef struct {
+ uint32_t const* src;
+ uint32_t* dest;
+ uint32_t wlen;
+ } __copy_table_t;
+
+ typedef struct {
+ uint32_t* dest;
+ uint32_t wlen;
+ } __zero_table_t;
+
+ extern const __copy_table_t __copy_table_start__;
+ extern const __copy_table_t __copy_table_end__;
+ extern const __zero_table_t __zero_table_start__;
+ extern const __zero_table_t __zero_table_end__;
+
+ for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) {
+ for(uint32_t i=0u; i<pTable->wlen; ++i) {
+ pTable->dest[i] = pTable->src[i];
+ }
+ }
+
+ for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) {
+ for(uint32_t i=0u; i<pTable->wlen; ++i) {
+ pTable->dest[i] = 0u;
+ }
+ }
+
+ _start();
+}
+
+#define __PROGRAM_START __cmsis_start
+#endif
+
+#endif / senthil_ccp
+/*----------------------------------------------------------------------------
+ * Exception / Interrupt Vector table
+ *----------------------------------------------------------------------------*/
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+
+#if defined(__ICCARM__)
+#pragma data_alignment = 512
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __VECTOR_TABLE_ATTRIBUTE = {
+#elif defined(__GNUC__)
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+// const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __attribute__((aligned(512))) __VECTOR_TABLE_ATTRIBUTE = {
+#else
+extern const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS];
+const tVectorEntry __VECTOR_TABLE[TOTAL_INTERRUPTS] __VECTOR_TABLE_ATTRIBUTE = {
+#endif
+ /* Cortex-M Exception Handlers */
+ { .topOfStack = &__INITIAL_SP }, /* Initial Stack Pointer */
+ { Reset_Handler }, /* Reset Handler */
+ { NMI_Handler }, /* NMI Handler */
+ { HardFault_Handler }, /* Hard Fault Handler */
+ { MemManage_Handler }, /* MPU Fault Handler */
+ { BusFault_Handler }, /* Bus Fault Handler */
+ { UsageFault_Handler }, /* Usage Fault Handler */
+ { Default_Handler }, /* Reserved */
+ { Default_Handler }, /* Reserved */
+ { Default_Handler }, /* Reserved */
+#ifdef BOOTLOADER_ENABLE
+ { (VECTOR_TABLE_Type) &mainStageTable },
+#else
+ { Default_Handler }, /* Reserved */
+#endif
+ { SVC_Handler }, /* SVCall Handler */
+ { DebugMon_Handler }, /* Debug Monitor Handler */
+#ifdef SL_APP_PROPERTIES
+ { (VECTOR_TABLE_Type) &sl_app_properties }, /* Application properties*/
+#else
+ { sl_app_properties }, /* Application properties*/
+#endif
+ { PendSV_Handler }, /* PendSV Handler */
+ { SysTick_Handler }, /* SysTick Handler */
+
+ /* External interrupts */
+
+ { EMU_IRQHandler }, /* 0 */
+ { FRC_PRI_IRQHandler }, /* 1 */
+ { WDOG0_IRQHandler }, /* 2 */
+ { WDOG1_IRQHandler }, /* 3 */
+ { FRC_IRQHandler }, /* 4 */
+ { MODEM_IRQHandler }, /* 5 */
+ { RAC_SEQ_IRQHandler }, /* 6 */
+ { RAC_RSM_IRQHandler }, /* 7 */
+ { BUFC_IRQHandler }, /* 8 */
+ { LDMA_IRQHandler }, /* 9 */
+ { GPIO_EVEN_IRQHandler }, /* 10 */
+ { TIMER0_IRQHandler }, /* 11 */
+ { USART0_RX_IRQHandler }, /* 12 */
+ { USART0_TX_IRQHandler }, /* 13 */
+ { ACMP0_IRQHandler }, /* 14 */
+ { ADC0_IRQHandler }, /* 15 */
+ { IDAC0_IRQHandler }, /* 16 */
+ { I2C0_IRQHandler }, /* 17 */
+ { GPIO_ODD_IRQHandler }, /* 18 */
+ { TIMER1_IRQHandler }, /* 19 */
+ { USART1_RX_IRQHandler }, /* 20 */
+ { USART1_TX_IRQHandler }, /* 21 */
+ { LEUART0_IRQHandler }, /* 22 */
+ { PCNT0_IRQHandler }, /* 23 */
+ { CMU_IRQHandler }, /* 24 */
+ { MSC_IRQHandler }, /* 25 */
+ { CRYPTO0_IRQHandler }, /* 26 */
+ { LETIMER0_IRQHandler }, /* 27 */
+ { AGC_IRQHandler }, /* 28 */
+ { PROTIMER_IRQHandler }, /* 29 */
+ { RTCC_IRQHandler }, /* 30 */
+ { SYNTH_IRQHandler }, /* 31 */
+ { CRYOTIMER_IRQHandler }, /* 32 */
+ { RFSENSE_IRQHandler }, /* 33 */
+ { FPUEH_IRQHandler }, /* 34 */
+ { SMU_IRQHandler }, /* 35 */
+ { WTIMER0_IRQHandler }, /* 36 */
+ { WTIMER1_IRQHandler }, /* 37 */
+ { PCNT1_IRQHandler }, /* 38 */
+ { PCNT2_IRQHandler }, /* 39 */
+ { USART2_RX_IRQHandler }, /* 40 */
+ { USART2_TX_IRQHandler }, /* 41 */
+ { I2C1_IRQHandler }, /* 42 */
+ { USART3_RX_IRQHandler }, /* 43 */
+ { USART3_TX_IRQHandler }, /* 44 */
+ { VDAC0_IRQHandler }, /* 45 */
+ { CSEN_IRQHandler }, /* 46 */
+ { LESENSE_IRQHandler }, /* 47 */
+ { CRYPTO1_IRQHandler }, /* 48 */
+ { TRNG0_IRQHandler }, /* 49 */
+ { Default_Handler }, /* 50 - Reserved */
+};
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+//#if defined (__START) && defined (__GNUC__) //senthil_ccp
+void Copy_Table()
+{
+ uint32_t *pSrc, *pDest;
+ extern uint32_t __etext;
+ extern uint32_t __data_start__;
+ extern uint32_t __data_end__;
+ pSrc = &__etext;
+ pDest = &__data_start__;
+
+ for (; pDest < &__data_end__;)
+ {
+ *pDest++ = *pSrc++;
+ }
+}
+
+void Zero_Table()
+{
+ uint32_t * pDest;
+ extern uint32_t __bss_start__;
+ extern uint32_t __bss_end__;
+ pDest = &__bss_start__;
+
+ for (; pDest < &__bss_end__;)
+ {
+ *pDest++ = 0UL;
+ }
+}
+//#endif /* __START */
+
+/*---------------------------------------------------------------------------
+ * Reset Handler called on controller reset
+ *---------------------------------------------------------------------------*/
+#if 0
+ void SysTick_Handler(void)
+{
+ SysTick_Handler();
+}
+#endif
+
+void Reset_Handler(void)
+{
+#ifndef __NO_SYSTEM_INIT
+ SystemInit(); /* CMSIS System Initialization */
+#endif
+
+#ifdef BOOTLOADER_ENABLE
+ SystemInit2();
+#endif /* BOOTLOADER_ENABLE */
+
+#if defined(__GNUC__) && defined(__START)
+ Copy_Table();
+ Zero_Table();
+ __START();
+#else
+#if 0 // senthil_ccp
+ __PROGRAM_START(); /* Enter PreMain (C library entry point) */
+#else
+ Copy_Table();
+ Zero_Table();
+ _start();
+#endif
+#endif /* __GNUC__ */
+}
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wmissing-noreturn"
+#endif
+
+/*----------------------------------------------------------------------------
+ * Default Handler for Exceptions / Interrupts
+ *----------------------------------------------------------------------------*/
+void Default_Handler(void)
+{
+ while (true)
+ {
+ }
+}
+
+#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
+#pragma clang diagnostic pop
+#endif
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.h b/examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
similarity index 67%
copy from examples/platform/silabs/SiWx917/efr32_utils.h
copy to examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
index b0d508d..0d5bb78 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.h
+++ b/examples/platform/silabs/SiWx917/init_ccpPlatform.cpp
@@ -1,7 +1,7 @@
/*
*
* Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2022 Silabs.
+ * Copyright (c) 2019 Google LLC.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -17,22 +17,30 @@
* limitations under the License.
*/
-#pragma once
+#include "AppConfig.h"
+#include <lib/support/CHIPPlatformMemory.h>
+#include <platform/CHIPDeviceLayer.h>
-// EFR Logging
#ifdef __cplusplus
extern "C" {
#endif
+#include <assert.h>
+#include <string.h>
-void silabsInitLog(void);
+#include <mbedtls/platform.h>
-void efr32Log(const char * aFormat, ...);
-#define SILABS_LOG(...) efr32Log(__VA_ARGS__);
-void appError(int err);
+#include "init_ccpPlatform.h"
+
+void initAntenna(void);
+
+void init_ccpPlatform(void)
+{
+
+#if SILABS_LOG_ENABLED
+ silabsInitLog();
+#endif
+}
#ifdef __cplusplus
}
-
-#include <lib/core/CHIPError.h>
-void appError(CHIP_ERROR error);
#endif
diff --git a/examples/platform/silabs/SiWx917/init_efrPlatform.h b/examples/platform/silabs/SiWx917/init_ccpPlatform.h
similarity index 96%
rename from examples/platform/silabs/SiWx917/init_efrPlatform.h
rename to examples/platform/silabs/SiWx917/init_ccpPlatform.h
index aeb47b8..986e2fe 100644
--- a/examples/platform/silabs/SiWx917/init_efrPlatform.h
+++ b/examples/platform/silabs/SiWx917/init_ccpPlatform.h
@@ -22,8 +22,7 @@
extern "C" {
#endif
-void init_efrPlatform(void);
-
+void init_ccpPlatform(void);
#ifdef __cplusplus
}
#endif
diff --git a/examples/platform/silabs/SiWx917/init_efrPlatform.cpp b/examples/platform/silabs/SiWx917/init_efrPlatform.cpp
deleted file mode 100644
index 993b4fe..0000000
--- a/examples/platform/silabs/SiWx917/init_efrPlatform.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Google LLC.
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "AppConfig.h"
-#include <lib/support/CHIPPlatformMemory.h>
-#include <platform/CHIPDeviceLayer.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-#include <assert.h>
-#include <string.h>
-
-#include <mbedtls/platform.h>
-
-#if CHIP_ENABLE_OPENTHREAD
-#include <openthread-core-config.h>
-#include <openthread/cli.h>
-#include <openthread/config.h>
-#include <openthread/dataset.h>
-#include <openthread/error.h>
-#include <openthread/heap.h>
-#include <openthread/icmp6.h>
-#include <openthread/instance.h>
-#include <openthread/link.h>
-#include <openthread/platform/openthread-system.h>
-#include <openthread/tasklet.h>
-#include <openthread/thread.h>
-#include <utils/uart.h>
-
-#include "platform-efr32.h"
-
-#if OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
-#include "openthread/heap.h"
-#endif // OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE
-#endif // CHIP_ENABLE_OPENTHREAD
-
-#include "init_efrPlatform.h"
-#include "sl_component_catalog.h"
-#include "sl_mbedtls.h"
-#include "sl_system_init.h"
-
-#if SL_SYSTEM_VIEW
-#include "SEGGER_SYSVIEW.h"
-#endif
-
-void initAntenna(void);
-
-void init_efrPlatform(void)
-{
- sl_system_init();
- sl_mbedtls_init();
-#if SL_SYSTEM_VIEW
- SEGGER_SYSVIEW_Conf();
- SEGGER_SYSVIEW_Start();
-#endif
-
-#if SILABS_LOG_ENABLED
- silabsInitLog();
-#endif
-
-#if CHIP_ENABLE_OPENTHREAD
- efr32RadioInit();
- efr32AlarmInit();
-#endif // CHIP_ENABLE_OPENTHREAD
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld b/examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
similarity index 74%
rename from examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld
rename to examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
index f9f4f55..13f0b22 100644
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg12.ld
+++ b/examples/platform/silabs/SiWx917/ldscripts/SiWx917.ld
@@ -1,7 +1,6 @@
/*
*
- * Copyright (c) 2020 Project CHIP Authors
- * All rights reserved.
+ * Copyright (c) 2022 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,40 +14,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/***************************************************************************//**
- * Linker script for Silicon Labs EFR32MG12P devices
- *******************************************************************************
- * # License
- * <b>Copyright 2022 Silicon Laboratories Inc. www.silabs.com</b>
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
MEMORY
{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 262144
+ FLASH (rx) : ORIGIN = 0x08012000, LENGTH = 0x200000
+ RAM (rwx) : ORIGIN = 0xC, LENGTH = 262144
}
/* Linker script to place sections and symbol values. Should be used together
@@ -146,10 +117,13 @@
} > FLASH
__etext = ALIGN (4);
+ _sidata = __etext;
.data : AT (__etext)
{
__data_start__ = .;
+ _sdata = __data_start__;
+
*(vtable)
*(.data*)
. = ALIGN (4);
@@ -181,6 +155,7 @@
. = ALIGN(4);
/* All data end */
__data_end__ = .;
+ _edata = __data_end__;
} > RAM
@@ -188,11 +163,13 @@
{
. = ALIGN(4);
__bss_start__ = .;
+ _sbss = __bss_start__;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
__bss_end__ = .;
+ _ebss = __bss_end__;
} > RAM
.heap (COPY) :
@@ -237,6 +214,6 @@
ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
/* Check if FLASH usage exceeds FLASH size */
- ASSERT( LENGTH(FLASH) >= (__etext), "FLASH memory overflowed !")
+/* ASSERT( LENGTH(FLASH) >= (__etext), "FLASH memory overflowed !") */ /* Build error need to be checked for CCP */
ASSERT((__etext + SIZEOF(.data)) <= __nvm3Base, "FLASH memory overlapped with NVM section.")
}
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld b/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld
deleted file mode 100644
index 2c9de0d..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg21.ld
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/***************************************************************************//**
- * Linker script for Silicon Labs EFR32MG21 devices
- * @version 5.7.2
- *******************************************************************************
- * # License
- * <b>Copyright 2018 Silicon Laboratories Inc. www.silabs.com</b>
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 1048576 - 8192 /* 8K is reserved at top of flash on MG21 */
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 98304
-}
-
-/* Linker script to place sections and symbol values. Should be used together
- * with other linker script that defines memory regions FLASH and RAM.
- * It references following symbols, which must be defined in code:
- * Reset_Handler : Entry of reset handler
- *
- * It defines following symbols, which code can use without definition:
- * __exidx_start
- * __exidx_end
- * __copy_table_start__
- * __copy_table_end__
- * __zero_table_start__
- * __zero_table_end__
- * __etext
- * __data_start__
- * __preinit_array_start
- * __preinit_array_end
- * __init_array_start
- * __init_array_end
- * __fini_array_start
- * __fini_array_end
- * __data_end__
- * __bss_start__
- * __bss_end__
- * __end__
- * end
- * __HeapBase
- * __HeapLimit
- * __StackLimit
- * __StackTop
- * __stack
- * __Vectors_End
- * __Vectors_Size
- */
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
- .text :
- {
- KEEP(*(.vectors))
- __Vectors_End = .;
- __Vectors_Size = __Vectors_End - __Vectors;
- __end__ = .;
-
- *(.text*)
-
- KEEP(*(.init))
- KEEP(*(.fini))
-
- KEEP(*(.application_properties))
- KEEP(*(.gecko_configuration))
- KEEP(*(.xo_configuration))
- KEEP(*(.gatt_header))
- KEEP(*(.gatt_data))
-
- /* .ctors */
- *crtbegin.o(.ctors)
- *crtbegin?.o(.ctors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
- *(SORT(.ctors.*))
- *(.ctors)
-
- /* .dtors */
- *crtbegin.o(.dtors)
- *crtbegin?.o(.dtors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
- *(SORT(.dtors.*))
- *(.dtors)
-
- *(.rodata*)
-
-
- KEEP(*(.eh_frame*))
- } > FLASH
-
-
- .ARM.extab :
- {
- *(.ARM.extab* .gnu.linkonce.armextab.*)
- } > FLASH
-
- __exidx_start = .;
- .ARM.exidx :
- {
- *(.ARM.exidx* .gnu.linkonce.armexidx.*)
- } > FLASH
- __exidx_end = .;
-
-
-
- /* To copy multiple ROM to RAM sections,
- * uncomment .copy.table section and,
- * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
- /*
- .copy.table :
- {
- . = ALIGN(4);
- __copy_table_start__ = .;
- LONG (__etext)
- LONG (__data_start__)
- LONG (__data_end__ - __data_start__)
- LONG (__etext2)
- LONG (__data2_start__)
- LONG (__data2_end__ - __data2_start__)
- __copy_table_end__ = .;
- } > FLASH
- */
-
- /* To clear multiple BSS sections,
- * uncomment .zero.table section and,
- * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
- /*
- .zero.table :
- {
- . = ALIGN(4);
- __zero_table_start__ = .;
- LONG (__bss_start__)
- LONG (__bss_end__ - __bss_start__)
- LONG (__bss2_start__)
- LONG (__bss2_end__ - __bss2_start__)
- __zero_table_end__ = .;
- } > FLASH
- */
-
- __etext = .;
-
- /*******************************************************************/
- /* Define flash block for BLE-simee & CHIP-nvm3 */
- /* simee: 9000H (36k) bytes for BLE nvm3 */
- /* chipNvm3_section: 4000H (16k) bytes for CHIP nvm3. */
- /* 8K is reserved for OpenThread's NVM which is mapped directly at */
- /* the top of flash */
- /*******************************************************************/
-
- OPENTHREAD_NVM_SIZE = 8192;
-
- .nvm_dummy (DSECT):
- {
- __nvm3_dummy_begin = .;
- . = ALIGN (8192);
- __nvm3_dummy_simee = .;
- KEEP(*(.simee));
- . = ALIGN (8192);
- __nvm3_dummy_chip = .;
- KEEP(*(chipNvm3_section));
- . = ALIGN (8192);
- . += OPENTHREAD_NVM_SIZE;
- . = ALIGN (8192);
- } > FLASH
-
- /* Set NVM to end of FLASH */
- __nvm3Base = LENGTH(FLASH) - SIZEOF(.nvm_dummy) + (__nvm3_dummy_simee - __nvm3_dummy_begin);
- __nvm3ChipBase = LENGTH(FLASH) - SIZEOF(.nvm_dummy) + (__nvm3_dummy_chip - __nvm3_dummy_begin);
-
-
- /*******************************************************************/
-
- .data : AT (__etext)
- {
- __data_start__ = .;
- *(vtable)
- *(.data*)
- . = ALIGN (4);
- PROVIDE (__ram_func_section_start = .);
- *(.ram)
- PROVIDE (__ram_func_section_end = .);
-
- . = ALIGN(4);
- /* preinit data */
- PROVIDE_HIDDEN (__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE_HIDDEN (__preinit_array_end = .);
-
- . = ALIGN(4);
- /* init data */
- PROVIDE_HIDDEN (__init_array_start = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE_HIDDEN (__init_array_end = .);
-
- . = ALIGN(4);
- /* finit data */
- PROVIDE_HIDDEN (__fini_array_start = .);
- KEEP(*(SORT(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE_HIDDEN (__fini_array_end = .);
-
- KEEP(*(.jcr*))
- . = ALIGN(4);
- /* All data end */
- __data_end__ = .;
-
- } > RAM
-
- .bss :
- {
- . = ALIGN(4);
- __bss_start__ = .;
- *(.bss*)
- *(COMMON)
- . = ALIGN(4);
- __bss_end__ = .;
- } > RAM
-
- .heap (COPY):
- {
- __HeapBase = .;
- __end__ = .;
- end = __end__;
- _end = __end__;
- KEEP(*(.heap*))
- __HeapLimit = .;
- } > RAM
-
- /* .stack_dummy section doesn't contains any symbols. It is only
- * used for linker to calculate size of stack sections, and assign
- * values to stack symbols later */
- .stack_dummy (COPY):
- {
- KEEP(*(.stack*))
- } > RAM
-
- /* Set stack top to end of RAM, and stack limit move down by
- * size of stack_dummy section */
- __StackTop = ORIGIN(RAM) + LENGTH(RAM);
- __StackLimit = __StackTop - SIZEOF(.stack_dummy);
- PROVIDE(__stack = __StackTop);
-
- /* Check if data + heap + stack exceeds RAM limit */
- ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
-
-
- /* Check if FLASH usage exceeds FLASH size */
- ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
- ASSERT((__etext + SIZEOF(.data)) <= __nvm3Base, "FLASH memory overlapped with NVM section.")
-}
\ No newline at end of file
diff --git a/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld b/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld
deleted file mode 100644
index b057a9a..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/efr32mg24.ld
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Copyright (c) 2021 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/***************************************************************************//**
- * @file gcc_EFR32MG24.ld
- * @brief GNU Linker Script for Cortex-M based device
- * @version V2.2.0
- * @date 16. December 2020
- * Linker script for Silicon Labs EFR32MG24 devices
- *******************************************************************************
- * # License
- * <b>Copyright 2022 Silicon Laboratories, Inc. www.silabs.com </b>
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x08006000, LENGTH = 0x17A000
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
-}
-
-/* Linker script to place sections and symbol values. Should be used together
- * with other linker script that defines memory regions FLASH and RAM.
- * It references following symbols, which must be defined in code:
- * Reset_Handler : Entry of reset handler
- *
- * It defines following symbols, which code can use without definition:
- * __exidx_start
- * __exidx_end
- * __copy_table_start__
- * __copy_table_end__
- * __zero_table_start__
- * __zero_table_end__
- * __etext
- * __data_start__
- * __preinit_array_start
- * __preinit_array_end
- * __init_array_start
- * __init_array_end
- * __fini_array_start
- * __fini_array_end
- * __data_end__
- * __bss_start__
- * __bss_end__
- * __end__
- * end
- * __HeapLimit
- * __StackLimit
- * __StackTop
- * __stack
- * __StackSeal (only if ARMv8-M stack sealing is used)
- */
-
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
- .text :
- {
- KEEP(*(.vectors))
- *(.text*)
-
- KEEP(*(.init))
- KEEP(*(.fini))
-
- /* .ctors */
- *crtbegin.o(.ctors)
- *crtbegin?.o(.ctors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
- *(SORT(.ctors.*))
- *(.ctors)
-
- /* .dtors */
- *crtbegin.o(.dtors)
- *crtbegin?.o(.dtors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
- *(SORT(.dtors.*))
- *(.dtors)
-
- *(.rodata*)
-
- KEEP(*(.eh_frame*))
- } > FLASH
- .ARM.extab :
- {
- *(.ARM.extab* .gnu.linkonce.armextab.*)
- } > FLASH
-
- __exidx_start = .;
- .ARM.exidx :
- {
- *(.ARM.exidx* .gnu.linkonce.armexidx.*)
- } > FLASH
- __exidx_end = .;
-
- .copy.table :
- {
- . = ALIGN(4);
- __copy_table_start__ = .;
-
- LONG (__etext)
- LONG (__data_start__)
- LONG ((__data_end__ - __data_start__) / 4)
-
- __copy_table_end__ = .;
- } > FLASH
-
- .zero.table :
- {
- . = ALIGN(4);
- __zero_table_start__ = .;
- __zero_table_end__ = .;
- __etext = ALIGN(4);
- } > FLASH
-
- .data : AT (__etext)
- {
- __data_start__ = .;
- *(vtable)
- *(.data*)
- . = ALIGN (4);
- PROVIDE (__ram_func_section_start = .);
- *(.ram)
- PROVIDE (__ram_func_section_end = .);
-
- . = ALIGN(4);
- /* preinit data */
- PROVIDE_HIDDEN (__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE_HIDDEN (__preinit_array_end = .);
-
- . = ALIGN(4);
- /* init data */
- PROVIDE_HIDDEN (__init_array_start = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE_HIDDEN (__init_array_end = .);
-
- . = ALIGN(4);
- /* finit data */
- PROVIDE_HIDDEN (__fini_array_start = .);
- KEEP(*(SORT(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE_HIDDEN (__fini_array_end = .);
-
- KEEP(*(.jcr*))
- . = ALIGN(4);
- /* All data end */
- __data_end__ = .;
-
- } > RAM
-
- .bss :
- {
- . = ALIGN(4);
- __bss_start__ = .;
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(4);
- __bss_end__ = .;
- } > RAM AT > RAM
-
- .heap (COPY):
- {
- __HeapBase = .;
- __end__ = .;
- end = __end__;
- _end = __end__;
- KEEP(*(.heap*))
- __HeapLimit = .;
- } > RAM
-
- __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
-
- /* .stack_dummy section doesn't contains any symbols. It is only
- * used for linker to calculate size of stack sections, and assign
- * values to stack symbols later */
- .stack_dummy (COPY):
- {
- KEEP(*(.stack*))
- /* KEEP(*(.stackseal*))*/
- } > RAM
-
- /* Set stack top to end of RAM, and stack limit move down by
- * size of stack_dummy section */
- __StackTop = ORIGIN(RAM) + LENGTH(RAM);
- __StackLimit = __StackTop - SIZEOF(.stack_dummy);
- PROVIDE(__stack = __StackTop);
-
- .nvm (DSECT) : {
- KEEP(*(.simee*))
- } > FLASH
-
- /* Last page of flash is reserved for the manufacturing token space */
- linker_nvm_end = __main_flash_end__ - 8192;
- linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
- linker_nvm_size = SIZEOF(.nvm);
- __nvm3Base = linker_nvm_begin;
- __attestation_credentials_base = linker_nvm_end;
-
- /* Check if data + heap + stack exceeds RAM limit */
- /*ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")*/
- ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
-
- /* Check if FLASH usage exceeds FLASH size */
- ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
-}
diff --git a/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld b/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld
deleted file mode 100644
index b057a9a..0000000
--- a/examples/platform/silabs/SiWx917/ldscripts/mgm24.ld
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *
- * Copyright (c) 2021 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/***************************************************************************//**
- * @file gcc_EFR32MG24.ld
- * @brief GNU Linker Script for Cortex-M based device
- * @version V2.2.0
- * @date 16. December 2020
- * Linker script for Silicon Labs EFR32MG24 devices
- *******************************************************************************
- * # License
- * <b>Copyright 2022 Silicon Laboratories, Inc. www.silabs.com </b>
- *******************************************************************************
- *
- * SPDX-License-Identifier: Zlib
- *
- * The licensor of this software is Silicon Laboratories Inc.
- *
- * This software is provided 'as-is', without any express or implied
- * warranty. In no event will the authors be held liable for any damages
- * arising from the use of this software.
- *
- * Permission is granted to anyone to use this software for any purpose,
- * including commercial applications, and to alter it and redistribute it
- * freely, subject to the following restrictions:
- *
- * 1. The origin of this software must not be misrepresented; you must not
- * claim that you wrote the original software. If you use this software
- * in a product, an acknowledgment in the product documentation would be
- * appreciated but is not required.
- * 2. Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software.
- * 3. This notice may not be removed or altered from any source distribution.
- *
- ******************************************************************************/
-
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0x08006000, LENGTH = 0x17A000
- RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000
-}
-
-/* Linker script to place sections and symbol values. Should be used together
- * with other linker script that defines memory regions FLASH and RAM.
- * It references following symbols, which must be defined in code:
- * Reset_Handler : Entry of reset handler
- *
- * It defines following symbols, which code can use without definition:
- * __exidx_start
- * __exidx_end
- * __copy_table_start__
- * __copy_table_end__
- * __zero_table_start__
- * __zero_table_end__
- * __etext
- * __data_start__
- * __preinit_array_start
- * __preinit_array_end
- * __init_array_start
- * __init_array_end
- * __fini_array_start
- * __fini_array_end
- * __data_end__
- * __bss_start__
- * __bss_end__
- * __end__
- * end
- * __HeapLimit
- * __StackLimit
- * __StackTop
- * __stack
- * __StackSeal (only if ARMv8-M stack sealing is used)
- */
-
-ENTRY(Reset_Handler)
-
-SECTIONS
-{
- .text :
- {
- KEEP(*(.vectors))
- *(.text*)
-
- KEEP(*(.init))
- KEEP(*(.fini))
-
- /* .ctors */
- *crtbegin.o(.ctors)
- *crtbegin?.o(.ctors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
- *(SORT(.ctors.*))
- *(.ctors)
-
- /* .dtors */
- *crtbegin.o(.dtors)
- *crtbegin?.o(.dtors)
- *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
- *(SORT(.dtors.*))
- *(.dtors)
-
- *(.rodata*)
-
- KEEP(*(.eh_frame*))
- } > FLASH
- .ARM.extab :
- {
- *(.ARM.extab* .gnu.linkonce.armextab.*)
- } > FLASH
-
- __exidx_start = .;
- .ARM.exidx :
- {
- *(.ARM.exidx* .gnu.linkonce.armexidx.*)
- } > FLASH
- __exidx_end = .;
-
- .copy.table :
- {
- . = ALIGN(4);
- __copy_table_start__ = .;
-
- LONG (__etext)
- LONG (__data_start__)
- LONG ((__data_end__ - __data_start__) / 4)
-
- __copy_table_end__ = .;
- } > FLASH
-
- .zero.table :
- {
- . = ALIGN(4);
- __zero_table_start__ = .;
- __zero_table_end__ = .;
- __etext = ALIGN(4);
- } > FLASH
-
- .data : AT (__etext)
- {
- __data_start__ = .;
- *(vtable)
- *(.data*)
- . = ALIGN (4);
- PROVIDE (__ram_func_section_start = .);
- *(.ram)
- PROVIDE (__ram_func_section_end = .);
-
- . = ALIGN(4);
- /* preinit data */
- PROVIDE_HIDDEN (__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE_HIDDEN (__preinit_array_end = .);
-
- . = ALIGN(4);
- /* init data */
- PROVIDE_HIDDEN (__init_array_start = .);
- KEEP(*(SORT(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE_HIDDEN (__init_array_end = .);
-
- . = ALIGN(4);
- /* finit data */
- PROVIDE_HIDDEN (__fini_array_start = .);
- KEEP(*(SORT(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE_HIDDEN (__fini_array_end = .);
-
- KEEP(*(.jcr*))
- . = ALIGN(4);
- /* All data end */
- __data_end__ = .;
-
- } > RAM
-
- .bss :
- {
- . = ALIGN(4);
- __bss_start__ = .;
- *(.bss)
- *(.bss.*)
- *(COMMON)
- . = ALIGN(4);
- __bss_end__ = .;
- } > RAM AT > RAM
-
- .heap (COPY):
- {
- __HeapBase = .;
- __end__ = .;
- end = __end__;
- _end = __end__;
- KEEP(*(.heap*))
- __HeapLimit = .;
- } > RAM
-
- __main_flash_end__ = ORIGIN(FLASH) + LENGTH(FLASH);
-
- /* .stack_dummy section doesn't contains any symbols. It is only
- * used for linker to calculate size of stack sections, and assign
- * values to stack symbols later */
- .stack_dummy (COPY):
- {
- KEEP(*(.stack*))
- /* KEEP(*(.stackseal*))*/
- } > RAM
-
- /* Set stack top to end of RAM, and stack limit move down by
- * size of stack_dummy section */
- __StackTop = ORIGIN(RAM) + LENGTH(RAM);
- __StackLimit = __StackTop - SIZEOF(.stack_dummy);
- PROVIDE(__stack = __StackTop);
-
- .nvm (DSECT) : {
- KEEP(*(.simee*))
- } > FLASH
-
- /* Last page of flash is reserved for the manufacturing token space */
- linker_nvm_end = __main_flash_end__ - 8192;
- linker_nvm_begin = linker_nvm_end - SIZEOF(.nvm);
- linker_nvm_size = SIZEOF(.nvm);
- __nvm3Base = linker_nvm_begin;
- __attestation_credentials_base = linker_nvm_end;
-
- /* Check if data + heap + stack exceeds RAM limit */
- /*ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")*/
- ASSERT( (linker_nvm_begin + SIZEOF(.nvm)) <= __main_flash_end__, "NVM3 is excessing the flash size !")
-
- /* Check if FLASH usage exceeds FLASH size */
- ASSERT( LENGTH(FLASH) >= (__etext + SIZEOF(.data)), "FLASH memory overflowed !")
-}
diff --git a/examples/platform/silabs/SiWx917/matter_config.cpp b/examples/platform/silabs/SiWx917/matter_config.cpp
index 83e9095..caa6a34 100644
--- a/examples/platform/silabs/SiWx917/matter_config.cpp
+++ b/examples/platform/silabs/SiWx917/matter_config.cpp
@@ -25,9 +25,15 @@
#include <mbedtls/platform.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
#ifdef SL_WIFI
#include "wfx_host_events.h"
#endif /* SL_WIFI */
+#ifdef __cplusplus
+}
+#endif
#if PW_RPC_ENABLED
#include "Rpc.h"
@@ -46,89 +52,34 @@
using namespace ::chip::DeviceLayer;
#include <crypto/CHIPCryptoPAL.h>
-// If building with the EFR32-provided crypto backend, we can use the
-// opaque keystore
-#if CHIP_CRYPTO_PLATFORM
-#include <platform/silabs/EFR32/Efr32PsaOperationalKeystore.h>
-static chip::DeviceLayer::Internal::Efr32PsaOperationalKeystore gOperationalKeystore;
-#endif
+// If building with the SiWx917-provided crypto backend, we can use the
-#include "EFR32DeviceDataProvider.h"
-
-#if CHIP_ENABLE_OPENTHREAD
-#include <inet/EndPointStateOpenThread.h>
-#include <openthread/cli.h>
-#include <openthread/dataset.h>
-#include <openthread/error.h>
-#include <openthread/heap.h>
-#include <openthread/icmp6.h>
-#include <openthread/instance.h>
-#include <openthread/link.h>
-#include <openthread/platform/openthread-system.h>
-#include <openthread/tasklet.h>
-#include <openthread/thread.h>
-
-// ================================================================================
-// Matter Networking Callbacks
-// ================================================================================
-void LockOpenThreadTask(void)
-{
- chip::DeviceLayer::ThreadStackMgr().LockThreadStack();
-}
-
-void UnlockOpenThreadTask(void)
-{
- chip::DeviceLayer::ThreadStackMgr().UnlockThreadStack();
-}
-
-// ================================================================================
-// EFR32MatterConfig Methods
-// ================================================================================
-
-CHIP_ERROR EFR32MatterConfig::InitOpenThread(void)
-{
- SILABS_LOG("Initializing OpenThread stack");
- ReturnErrorOnFailure(ThreadStackMgr().InitThreadStack());
-
-#if CHIP_DEVICE_CONFIG_THREAD_FTD
- ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router));
-#else // CHIP_DEVICE_CONFIG_THREAD_FTD
-#if CHIP_DEVICE_CONFIG_ENABLE_SED
- ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice));
-#else // CHIP_DEVICE_CONFIG_ENABLE_SED
- ReturnErrorOnFailure(ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_MinimalEndDevice));
-#endif // CHIP_DEVICE_CONFIG_ENABLE_SED
-#endif // CHIP_DEVICE_CONFIG_THREAD_FTD
-
- SILABS_LOG("Starting OpenThread task");
- return ThreadStackMgrImpl().StartThreadTask();
-}
-#endif // CHIP_ENABLE_OPENTHREAD
+#include "SiWx917DeviceDataProvider.h"
#if EFR32_OTA_ENABLED
void EFR32MatterConfig::InitOTARequestorHandler(System::Layer * systemLayer, void * appState)
{
+#if 0 // TODO : OTA is not planned now for CCP
OTAConfig::Init();
+#endif
}
#endif
-void EFR32MatterConfig::ConnectivityEventCallback(const ChipDeviceEvent * event, intptr_t arg)
-{
+void SI917MatterConfig::ConnectivityEventCallback(const ChipDeviceEvent * event, intptr_t arg){
// Initialize OTA only when Thread or WiFi connectivity is established
- if (((event->Type == DeviceEventType::kThreadConnectivityChange) &&
+ /*if (((event->Type == DeviceEventType::kThreadConnectivityChange) &&
(event->ThreadConnectivityChange.Result == kConnectivity_Established)) ||
((event->Type == DeviceEventType::kInternetConnectivityChange) &&
(event->InternetConnectivityChange.IPv6 == kConnectivity_Established)))
{
-#if EFR32_OTA_ENABLED
SILABS_LOG("Scheduling OTA Requestor initialization")
chip::DeviceLayer::SystemLayer().StartTimer(chip::System::Clock::Seconds32(OTAConfig::kInitOTARequestorDelaySec),
InitOTARequestorHandler, nullptr);
-#endif
- }
+ }*/
+ SILABS_LOG("Scheduling OTA Requestor initialization")
}
-CHIP_ERROR EFR32MatterConfig::InitMatter(const char * appName)
+CHIP_ERROR SI917MatterConfig::InitMatter(const char * appName)
{
CHIP_ERROR err;
@@ -154,39 +105,27 @@
SILABS_LOG("Init CHIP Stack");
// Init Chip memory management before the stack
ReturnErrorOnFailure(chip::Platform::MemoryInit());
+
+ SILABS_LOG("Init RSI 911x Platform");
+ int32_t deviceInit = wfx_rsi_platform();
+ if (deviceInit != SL_STATUS_OK)
+ {
+ SILABS_LOG("RSI init failed");
+ return CHIP_ERROR_INTERNAL;
+ }
ReturnErrorOnFailure(PlatformMgr().InitChipStack());
chip::DeviceLayer::ConnectivityMgr().SetBLEDeviceName(appName);
-#if CHIP_ENABLE_OPENTHREAD
- ReturnErrorOnFailure(InitOpenThread());
-#endif
-
// Stop Matter event handling while setting up resources
chip::DeviceLayer::PlatformMgr().LockChipStack();
// Create initParams with SDK example defaults here
static chip::CommonCaseDeviceServerInitParams initParams;
-#if CHIP_CRYPTO_PLATFORM
- // When building with EFR32 crypto, use the opaque key store
- // instead of the default (insecure) one.
- gOperationalKeystore.Init();
- initParams.operationalKeystore = &gOperationalKeystore;
-#endif
-
// Initialize the remaining (not overridden) providers to the SDK example defaults
(void) initParams.InitializeStaticResourcesBeforeServerInit();
-#if CHIP_ENABLE_OPENTHREAD
- // Set up OpenThread configuration when OpenThread is included
- chip::Inet::EndPointStateOpenThread::OpenThreadEndpointInitParam nativeParams;
- nativeParams.lockCb = LockOpenThreadTask;
- nativeParams.unlockCb = UnlockOpenThreadTask;
- nativeParams.openThreadInstancePtr = chip::DeviceLayer::ThreadStackMgrImpl().OTInstance();
- initParams.endpointNativeParams = static_cast<void *>(&nativeParams);
-#endif
-
// Init Matter Server and Start Event Loop
err = chip::Server::GetInstance().Init(initParams);
chip::DeviceLayer::PlatformMgr().UnlockChipStack();
@@ -194,7 +133,8 @@
ReturnErrorOnFailure(err);
// OTA Requestor initialization will be triggered by the connectivity events
- PlatformMgr().AddEventHandler(ConnectivityEventCallback, reinterpret_cast<intptr_t>(nullptr));
+ // TODO
+ // PlatformMgr().AddEventHandler(ConnectivityEventCallback, reinterpret_cast<intptr_t>(nullptr));
SILABS_LOG("Starting Platform Manager Event Loop");
ReturnErrorOnFailure(PlatformMgr().StartEventLoopTask());
@@ -211,16 +151,8 @@
}
#ifdef SL_WIFI
-void EFR32MatterConfig::InitWiFi(void)
+void SI917MatterConfig::InitWiFi(void)
{
-#ifdef WF200_WIFI
- // Start wfx bus communication task.
- wfx_bus_start();
-#ifdef SL_WFX_USE_SECURE_LINK
- wfx_securelink_task_start(); // start securelink key renegotiation task
-#endif // SL_WFX_USE_SECURE_LINK
-#endif /* WF200_WIFI */
-
#ifdef RS911X_WIFI
/*
* Start up any RSI interface stuff
diff --git a/examples/platform/silabs/SiWx917/matter_config.h b/examples/platform/silabs/SiWx917/matter_config.h
index e0af603..6b3bb62 100644
--- a/examples/platform/silabs/SiWx917/matter_config.h
+++ b/examples/platform/silabs/SiWx917/matter_config.h
@@ -22,7 +22,7 @@
#include <platform/CHIPDeviceLayer.h>
#include <platform/KeyValueStoreManager.h>
-class EFR32MatterConfig
+class SI917MatterConfig
{
public:
static CHIP_ERROR InitMatter(const char * appName);
diff --git a/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h b/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h
deleted file mode 100644
index dccf3c8..0000000
--- a/examples/platform/silabs/SiWx917/project_include/OpenThreadConfig.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Google LLC.
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @file
- * Overrides to default OpenThread configuration.
- *
- */
-
-#pragma once
-
-#include <em_device.h>
-
-// Disable the SiLabs-supplied OpenThread logging facilities and use
-// the facilities provided by the Device Layer (see
-// src/platform/silabs/Logging.cpp).
-#define OPENTHREAD_CONFIG_LOG_OUTPUT OPENTHREAD_CONFIG_LOG_OUTPUT_APP
-
-// Turn on a moderate level of logging in OpenThread
-// Enable use of external heap allocator (calloc/free) for OpenThread.
-#define OPENTHREAD_CONFIG_HEAP_EXTERNAL_ENABLE 1
-
-// EFR32MG21A020F1024IM32 has 96k of RAM. Reduce the number of buffers to
-// conserve RAM for this Series 2 part.
-#if defined(EFR32MG21)
-#define OPENTHREAD_CONFIG_NUM_MESSAGE_BUFFERS 22
-#define OPENTHREAD_CONFIG_CLI_UART_TX_BUFFER_SIZE 512
-#define OPENTHREAD_CONFIG_CLI_UART_RX_BUFFER_SIZE 512
-#endif
-
-#define OPENTHREAD_CONFIG_NCP_HDLC_ENABLE 1
-#define OPENTHREAD_CONFIG_IP6_SLAAC_ENABLE 1
-
-#define OPENTHREAD_CONFIG_DNS_CLIENT_ENABLE 1
-#define OPENTHREAD_CONFIG_SRP_CLIENT_ENABLE 1
-#define OPENTHREAD_CONFIG_ECDSA_ENABLE 1
-
-// disable unused features
-#define OPENTHREAD_CONFIG_COAP_API_ENABLE 0
-#define OPENTHREAD_CONFIG_JOINER_ENABLE 0
-#define OPENTHREAD_CONFIG_COMMISSIONER_ENABLE 0
-#define OPENTHREAD_CONFIG_UDP_FORWARD_ENABLE 0
-#define OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE 0
-#define OPENTHREAD_CONFIG_DHCP6_CLIENT_ENABLE 0
-#define OPENTHREAD_CONFIG_DHCP6_SERVER_ENABLE 0
-#define OPENTHREAD_CONFIG_TCP_ENABLE 0
-
-// Support udp multicast by enabling Multicast Listener Registration (MLR)
-#define OPENTHREAD_CONFIG_MLR_ENABLE 1
-
-// Define as 1 to stay awake between fragments while transmitting a large packet,
-// and to stay awake after receiving a packet with frame pending set to true.
-#define OPENTHREAD_CONFIG_MAC_STAY_AWAKE_BETWEEN_FRAGMENTS 1
-
-// Use the SiLabs-supplied default platform configuration for remainder
-// of OpenThread config options.
-//
-// NB: This file gets included during the build of OpenThread. Hence
-// it cannot use "openthread" in the path to the included file.
-//
-#include "openthread-core-efr32-config.h"
diff --git a/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn b/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
index 722d2a7..20547c3 100644
--- a/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
+++ b/examples/platform/silabs/SiWx917/pw_sys_io/BUILD.gn
@@ -17,7 +17,7 @@
import("$dir_pw_build/target_types.gni")
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
+examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
config("default_config") {
include_dirs = [ "public" ]
diff --git a/examples/platform/silabs/SiWx917/pw_sys_io/sys_io_efr32.cc b/examples/platform/silabs/SiWx917/pw_sys_io/sys_io_siwx917.cc
similarity index 100%
rename from examples/platform/silabs/SiWx917/pw_sys_io/sys_io_efr32.cc
rename to examples/platform/silabs/SiWx917/pw_sys_io/sys_io_siwx917.cc
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c b/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c
deleted file mode 100644
index f01cac3..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/efx_spi.c
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#if defined(EFR32MG12)
-#include "em_usart.h"
-#elif defined(EFR32MG24)
-#include "em_eusart.h"
-#endif
-#include "spidrv.h"
-
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-#include "sl_device_init_dpll.h"
-#include "sl_device_init_hfxo.h"
-
-StaticSemaphore_t xEfxSpiIntfSemaBuffer;
-static SemaphoreHandle_t spi_sem;
-
-#if defined(EFR32MG12)
-#include "sl_spidrv_exp_config.h"
-extern SPIDRV_Handle_t sl_spidrv_exp_handle;
-#endif
-
-#if defined(EFR32MG24)
-#include "sl_spidrv_eusart_exp_config.h"
-extern SPIDRV_Handle_t sl_spidrv_eusart_exp_handle;
-#endif
-
-static unsigned int tx_dma_channel;
-static unsigned int rx_dma_channel;
-
-static uint32_t dummy_data; /* Used for DMA - when results don't matter */
-extern void rsi_gpio_irq_cb(uint8_t irqnum);
-//#define RS911X_USE_LDMA
-
-/********************************************************
- * @fn sl_wfx_host_gpio_init(void)
- * @brief
- * Deal with the PINS that are not associated with SPI -
- * Ie. RESET, Wakeup
- * @return
- * None
- **********************************************************/
-void sl_wfx_host_gpio_init(void)
-{
- // Enable GPIO clock.
- CMU_ClockEnable(cmuClock_GPIO, true);
-
- GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModePushPull, PINOUT_SET);
- GPIO_PinModeSet(WFX_SLEEP_CONFIRM_PIN.port, WFX_SLEEP_CONFIRM_PIN.pin, gpioModePushPull, PINOUT_CLEAR);
-
- CMU_OscillatorEnable(cmuOsc_LFXO, true, true);
-
- // Set up interrupt based callback function - trigger on both edges.
- GPIOINT_Init();
- GPIO_PinModeSet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin, gpioModeInputPull, PINOUT_CLEAR);
- GPIO_ExtIntConfig(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin, SL_WFX_HOST_PINOUT_SPI_IRQ, true, false, true);
- GPIOINT_CallbackRegister(SL_WFX_HOST_PINOUT_SPI_IRQ, rsi_gpio_irq_cb);
- GPIO_IntDisable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ); /* Will be enabled by RSI */
-
- // Change GPIO interrupt priority (FreeRTOS asserts unless this is done here!)
- NVIC_SetPriority(GPIO_EVEN_IRQn, WFX_SPI_NVIC_PRIORITY);
- NVIC_SetPriority(GPIO_ODD_IRQn, WFX_SPI_NVIC_PRIORITY);
-}
-
-/*****************************************************************
- * @fn void sl_wfx_host_reset_chip(void)
- * @brief
- * To reset the WiFi CHIP
- * @return
- * None
- ****************************************************************/
-void sl_wfx_host_reset_chip(void)
-{
- // Pull it low for at least 1 ms to issue a reset sequence
- GPIO_PinOutClear(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-
- // Delay for 10ms
- vTaskDelay(pdMS_TO_TICKS(10));
-
- // Hold pin high to get chip out of reset
- GPIO_PinOutSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
-
- // Delay for 3ms
- vTaskDelay(pdMS_TO_TICKS(3));
-}
-
-/*****************************************************************
- * @fn void rsi_hal_board_init(void)
- * @brief
- * Initialize the board
- * @return
- * None
- ****************************************************************/
-void rsi_hal_board_init(void)
-{
- spi_sem = xSemaphoreCreateBinaryStatic(&xEfxSpiIntfSemaBuffer);
- xSemaphoreGive(spi_sem);
-
- /* Assign DMA channel from Handle*/
-#if defined(EFR32MG12)
- /* MG12 + rs9116 combination uses USART driver */
- tx_dma_channel = sl_spidrv_exp_handle->txDMACh;
- rx_dma_channel = sl_spidrv_exp_handle->rxDMACh;
-
-#elif defined(EFR32MG24)
- /* MG24 + rs9116 combination uses EUSART driver */
- tx_dma_channel = sl_spidrv_eusart_exp_handle->txDMACh;
- rx_dma_channel = sl_spidrv_eusart_exp_handle->rxDMACh;
-#endif
-
- /* GPIO INIT of MG12 & MG24 : Reset, Wakeup, Interrupt */
- WFX_RSI_LOG("RSI_HAL: init GPIO");
- sl_wfx_host_gpio_init();
-
- /* Reset of Wifi chip */
- WFX_RSI_LOG("RSI_HAL: Reset Wifi");
- sl_wfx_host_reset_chip();
- WFX_RSI_LOG("RSI_HAL: Init done");
-}
-
-/*****************************************************************************
- *@fn static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void *userParam)
- *
- *@brief
- * complete dma
- *
- * @param[in] channel:
- * @param[in] sequenceNO: sequence number
- * @param[in] userParam :user parameter
- *
- * @return
- * None
- ******************************************************************************/
-static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void * userParam)
-{
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
- // uint8_t *buf = (void *)userParam;
-
- (void) channel;
- (void) sequenceNo;
- (void) userParam;
-
- // WFX_RSI_LOG ("SPI: DMA done [%x,%x,%x,%x]", buf [0], buf [1], buf [2], buf [3]);
- xSemaphoreGiveFromISR(spi_sem, &xHigherPriorityTaskWoken);
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
-
- return true;
-}
-
-/*************************************************************
- * @fn static void receiveDMA(uint8_t *rx_buf, uint16_t xlen)
- * @brief
- * RX buf was specified
- * TX buf was not specified by caller - so we
- * transmit dummy data (typically 0)
- * @param[in] rx_buf:
- * @param[in] xlen:
- * @return
- * None
- *******************************************************************/
-static void receiveDMA(uint8_t * rx_buf, uint16_t xlen)
-{
- /*
- * The caller wants to receive data -
- * The xmit can be dummy data (no src increment for tx)
- */
- dummy_data = 0;
- DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, (void *) rx_buf, (void *) &(MY_USART->RXDATA), true, xlen,
- dmadrvDataSize1, rx_dma_complete, NULL);
-
- // Start transmit DMA.
- DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) &(dummy_data), false, xlen,
- dmadrvDataSize1, NULL, NULL);
-}
-
-/*****************************************************************************
- *@fn static void transmitDMA(void *rx_buf, void *tx_buf, uint8_t xlen)
- *@brief
- * we have a tx_buf. There are some instances where
- * a rx_buf is not specified. If one is specified then
- * the caller wants results (auto increment src)
- * @param[in] rx_buf:
- * @param[in] tx_buf:
- * @param[in] xlen:
- * @return
- * None
- ******************************************************************************/
-static void transmitDMA(uint8_t * rx_buf, uint8_t * tx_buf, uint16_t xlen)
-{
- void * buf;
- bool srcinc;
- /*
- * we have a tx_buf. There are some instances where
- * a rx_buf is not specified. If one is specified then
- * the caller wants results (auto increment src)
- * TODO - the caller specified 8/32 bit - we should use this
- * instead of dmadrvDataSize1 always
- */
- if (rx_buf == NULL)
- {
- buf = &dummy_data;
- srcinc = false;
- }
- else
- {
- buf = rx_buf;
- srcinc = true;
- /* DEBUG */ rx_buf[0] = 0xAA;
- rx_buf[1] = 0x55;
- }
- DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, buf, (void *) &(MY_USART->RXDATA), srcinc, xlen, dmadrvDataSize1,
- rx_dma_complete, buf);
- // Start transmit DMA.
- DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) tx_buf, true, xlen,
- dmadrvDataSize1, NULL, NULL);
-}
-
-/*********************************************************************
- * @fn int16_t rsi_spi_transfer(uint8_t *tx_buf, uint8_t *rx_buf, uint16_t xlen, uint8_t mode)
- * @brief
- * Do a SPI transfer - Mode is 8/16 bit - But every 8 bit is aligned
- * @param[in] tx_buf:
- * @param[in] rx_buf:
- * @param[in] xlen:
- * @param[in] mode:
- * @return
- * None
- **************************************************************************/
-int16_t rsi_spi_transfer(uint8_t * tx_buf, uint8_t * rx_buf, uint16_t xlen, uint8_t mode)
-{
- // WFX_RSI_LOG ("SPI: Xfer: tx=%x,rx=%x,len=%d",(uint32_t)tx_buf, (uint32_t)rx_buf, xlen);
- if (xlen > MIN_XLEN)
- {
- MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
- if (xSemaphoreTake(spi_sem, portMAX_DELAY) != pdTRUE)
- {
- return RSI_FALSE;
- }
- if (tx_buf == NULL)
- {
- receiveDMA(rx_buf, xlen);
- }
- else
- {
- transmitDMA(rx_buf, tx_buf, xlen);
- }
-
- /*
- * receiveDMA() and transmitDMA() are asynchronous
- * Our application design assumes that this function is synchronous
- * To make it synchronous, we wait to re-acquire the semaphore before exiting this function
- * rx_dma_complete() gives back the semaphore when the SPI transfer is done
- */
- if (xSemaphoreTake(spi_sem, pdMS_TO_TICKS(RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS)) == pdTRUE)
- {
- // Transfer complete
- // Give back the semaphore before exiting, so that it may be re-acquired
- // in this function, just before the next transfer
- xSemaphoreGive(spi_sem);
- }
- // Temporary patch
- // Sometimes the xSemaphoreTake() above is getting stuck indefinitely
- // As a workaround, if the transfer is not done within RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS
- // stop and start it again
- // No need to re-acquire the semaphore since this is the function that acquired it
- // TODO: Remove this after a permanent solution is found to the problem of the transfer getting stuck
- else
- {
- uint32_t ldma_flags = 0;
- uint32_t rem_len = 0;
- rem_len = LDMA_TransferRemainingCount(RSI_LDMA_TRANSFER_CHANNEL_NUM);
- LDMA_StopTransfer(RSI_LDMA_TRANSFER_CHANNEL_NUM);
- ldma_flags = LDMA_IntGet();
- LDMA_IntClear(ldma_flags);
- receiveDMA(rx_buf, rem_len);
- if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
- {
- xSemaphoreGive(spi_sem);
- }
- }
- }
-
- return RSI_ERROR_NONE;
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h
deleted file mode 100644
index 204e751..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_board_configuration.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _RSI_BOARD_CONFIGURATION_H_
-#define _RSI_BOARD_CONFIGURATION_H_
-
-typedef struct
-{
- unsigned char port;
- unsigned char pin;
-} rsi_pin_t;
-
-#define PIN(port_id, pin_id) \
- (rsi_pin_t) { .port = gpioPort##port_id, .pin = pin_id }
-
-#if defined(EFR32MG12_BRD4161A) || defined(BRD4161A) || defined(EFR32MG12_BRD4162A) || defined(BRD4162A) || \
- defined(EFR32MG12_BRD4163A) || defined(BRD4163A) || defined(EFR32MG12_BRD4164A) || defined(BRD4164A) || \
- defined(EFR32MG12_BRD4170A) || defined(BRD4170A)
-// BRD4161-63-64 are pin to pin compatible for SPI
-#include "brd4161a.h"
-#elif defined(EFR32MG24_BRD4186C) || defined(BRD4186C)
-#include "brd4186c.h"
-#elif defined(EFR32MG24_BRD4187C) || defined(BRD4187C)
-#include "brd4187c.h"
-#else
-#error "Need SPI Pins"
-#endif /* EFR32MG12_BRD4161A */
-
-#endif /* _RSI_BOARD_CONFIGURATION_H_ */
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c
deleted file mode 100644
index 40e4189..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_interrupt.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-
-typedef void (*UserIntCallBack_t)(void);
-UserIntCallBack_t call_back, gpio_callback;
-#ifdef LOGGING_STATS
-uint8_t current_pin_set, prev_pin_set;
-#endif /* LOGGING_STATS */
-
-/* ARGSUSED */
-void rsi_gpio_irq_cb(uint8_t irqnum)
-{
-
- // WFX_RSI_LOG ("RSI: Got Int=%d", irqnum)
- if (irqnum != SL_WFX_HOST_PINOUT_SPI_IRQ)
- return;
- GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-
- // WFX_RSI_LOG ("Got SPI intr, cb=%x", (uint32_t)call_back);
- if (call_back != NULL)
- (*call_back)();
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_intr_config(void (* rsi_interrupt_handler)())
- * @brief Starts and enables the SPI interrupt
- * @param[in] rsi_interrupt_handler() ,call back function to handle interrupt
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to initialize the register/pins
- * related to interrupts and enable the interrupts.
- */
-void rsi_hal_intr_config(void (*rsi_interrupt_handler)(void))
-{
- call_back = rsi_interrupt_handler;
- WFX_RSI_LOG("RSI:Set SPI intr CB to=%x", (uint32_t) call_back);
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_log_stats_intr_config(void (* rsi_give_wakeup_indication)())
- * @brief Checks the interrupt and map/set gpio callback function
- * @param[in] rsi_give_wakeup_indication() ,gpio call back function to handle interrupt
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code
- * related to mapping of gpio callback function.
- */
-#ifdef LOGGING_STATS
-void rsi_hal_log_stats_intr_config(void (*rsi_give_wakeup_indication)())
-{
- gpio_callback = rsi_give_wakeup_indication;
-}
-#endif
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_intr_mask(void)
- * @brief Disables the SPI Interrupt
- * @param[in] none
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to mask/disable interrupts.
- */
-void rsi_hal_intr_mask(void)
-{
- // WFX_RSI_LOG ("RSI:Disable IRQ");
- // NVIC_DisableIRQ(GPIO_ODD_IRQn);
- GPIO_IntDisable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_intr_unmask(void)
- * @brief Enables the SPI interrupt
- * @param[in] none
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to enable interrupts.
- */
-void rsi_hal_intr_unmask(void)
-{
- // Unmask/Enable the interrupt
- NVIC_EnableIRQ(GPIO_ODD_IRQn);
- NVIC_EnableIRQ(GPIO_EVEN_IRQn);
- GPIO_IntEnable(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
- // WFX_RSI_LOG ("RSI:Enable IRQ (mask=%x)", GPIO_IntGetEnabled ());
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_intr_clear(void)
- * @brief Clears the pending interrupt
- * @param[in] none
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to clear the handled interrupts.
- */
-void rsi_hal_intr_clear(void)
-{
- GPIO_IntClear(1 << SL_WFX_HOST_PINOUT_SPI_IRQ);
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_hal_intr_pin_status(void)
- * @brief Checks the SPI interrupt at pin level
- * @param[in] none
- * @param[out] uint8_t, interrupt status
- * @return none
- * @description This API is used to check interrupt pin status(pin level whether it is high/low).
- */
-uint8_t rsi_hal_intr_pin_status(void)
-{
- uint32_t mask;
- // Return interrupt pin status(high(1) /low (0))
- mask = GPIO_PinInGet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin);
-
- return !!mask;
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c
deleted file mode 100644
index 1ff5bc5..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_ioports.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "dmadrv.h"
-#include "em_chip.h"
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_device.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-#include "sl_device_init_clocks.h"
-#include "sl_status.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "wfx_host_events.h"
-#include "wfx_rsi.h"
-
-#include "rsi_board_configuration.h"
-#include "rsi_driver.h"
-
-/*===========================================================*/
-/**
- * @fn void rsi_hal_config_gpio(uint8_t gpio_number,uint8_t mode,uint8_t value)
- * @brief Configures gpio pin in output mode,with a value
- * @param[in] uint8_t gpio_number, gpio pin number to be configured
- * @param[in] uint8_t mode , input/output mode of the gpio pin to configure
- * 0 - input mode
- * 1 - output mode
- * @param[in] uint8_t value, default value to be driven if gpio is configured in output mode
- * 0 - low
- * 1 - high
- * @param[out] none
- * @return none
- * @description This API is used to configure host gpio pin in output mode.
- */
-void rsi_hal_config_gpio(uint8_t gpio_number, uint8_t mode, uint8_t value)
-{
-
- CMU_ClockEnable(cmuClock_GPIO, true);
-
- // WFX_RSI_LOG ("RSI: CFG GPIO: 0x%x", gpio_number);
- switch (gpio_number)
- {
- case RSI_HAL_RESET_PIN:
- GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModePushPull, PINOUT_SET);
- break;
- default:
- break;
- }
-}
-
-/*===========================================================*/
-/**
- * @fn void rsi_hal_set_gpio(uint8_t gpio_number)
- * @brief Makes/drives the gpio value high
- * @param[in] uint8_t gpio_number, gpio pin number
- * @param[out] none
- * @return none
- * @description This API is used to drives or makes the host gpio value high.
- */
-void rsi_hal_set_gpio(uint8_t gpio_number)
-{
- // WFX_RSI_LOG ("RSI: SET GPIO: 0x%x", gpio_number);
- switch (gpio_number)
- {
- case RSI_HAL_RESET_PIN:
- GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModeWiredOrPullDown, PINOUT_SET);
- break;
- default:
- break;
- }
-}
-
-/*===========================================================*/
-/**
- * @fn uint8_t rsi_hal_get_gpio(void)
- * @brief get the gpio pin value
- * @param[in] uint8_t gpio_number, gpio pin number
- * @param[out] none
- * @return gpio pin value
- * @description This API is used to configure get the gpio pin value.
- */
-uint8_t rsi_hal_get_gpio(uint8_t gpio_number)
-{
- // WFX_RSI_LOG ("RSI: GET GPIO: 0x%x", gpio_number);
- switch (gpio_number)
- {
- case RSI_HAL_RESET_PIN:
- return GPIO_PinInGet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
- case RSI_HAL_MODULE_INTERRUPT_PIN:
- return GPIO_PinInGet(WFX_INTERRUPT_PIN.port, WFX_INTERRUPT_PIN.pin);
- default:
- break;
- }
-
- return 0;
-}
-
-/*===========================================================*/
-/**
- * @fn void rsi_hal_set_gpio(uint8_t gpio_number)
- * @brief Makes/drives the gpio value to low
- * @param[in] uint8_t gpio_number, gpio pin number
- * @param[out] none
- * @return none
- * @description This API is used to drives or makes the host gpio value low.
- */
-void rsi_hal_clear_gpio(uint8_t gpio_number)
-{
- // WFX_RSI_LOG ("RSI: CLR GPIO: 0x%x", gpio_number);
- switch (gpio_number)
- {
- case RSI_HAL_RESET_PIN:
- return GPIO_PinOutClear(WFX_RESET_PIN.port, WFX_RESET_PIN.pin);
- default:
- break;
- }
-}
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c
deleted file mode 100644
index f57d47a..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_rtc.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Includes
- */
-#include "em_cmu.h"
-#include "em_core.h"
-#include "em_rtcc.h"
-#include "sl_sleeptimer_config.h"
-#include "sl_status.h"
-#include <stdlib.h>
-#include <time.h>
-
-#define ZONE0 0
-#define CH_SELECTOR 1u
-#define RTC_DEFAULT_COUNTER_VALUE 0u
-#define RSI_RTC_FREQ_VALUE 0
-#define TIME_ZONE_OFFSET 0u
-
-#define SLEEPTIMER_EVENT_OF (0x01)
-#define SLEEPTIMER_EVENT_COMP (0x02)
-#define SLEEPTIMER_ENUM(name) \
- typedef uint8_t name; \
- enum name##_enum
-#define TIME_UNIX_EPOCH (1970u)
-#define TIME_NTP_EPOCH (1900u)
-#define TIME_ZIGBEE_EPOCH (2000u)
-#define TIME_NTP_UNIX_EPOCH_DIFF (TIME_UNIX_EPOCH - TIME_NTP_EPOCH)
-#define TIME_ZIGBEE_UNIX_EPOCH_DIFF (TIME_ZIGBEE_EPOCH - TIME_UNIX_EPOCH)
-#define TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH (TIME_NTP_UNIX_EPOCH_DIFF * 365u + 17u) ///< 70 years and 17 leap days
-#define TIME_DAY_COUNT_ZIGBEE_TO_UNIX_EPOCH (TIME_ZIGBEE_UNIX_EPOCH_DIFF * 365u + 7u) ///< 30 years and 7 leap days
-#define TIME_SEC_PER_DAY (60u * 60u * 24u)
-#define TIME_NTP_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_NTP_TO_UNIX_EPOCH * TIME_SEC_PER_DAY)
-#define TIME_ZIGBEE_EPOCH_OFFSET_SEC (TIME_DAY_COUNT_ZIGBEE_TO_UNIX_EPOCH * TIME_SEC_PER_DAY)
-#define TIME_DAY_PER_YEAR (365u)
-#define TIME_SEC_PER_YEAR (TIME_SEC_PER_DAY * TIME_DAY_PER_YEAR)
-#define TIME_UNIX_TIMESTAMP_MAX (0x7FFFFFFF)
-
-/// Time zone offset from UTC(second).
-typedef int32_t sl_sleeptimer_time_zone_offset_t;
-/// Timestamp, wall clock time in seconds.
-typedef uint32_t sl_sleeptimer_timestamp_t;
-/// @brief Time Format.
-SLEEPTIMER_ENUM(sl_sleeptimer_time_format_t){
- TIME_FORMAT_UNIX = 0, ///< Number of seconds since January 1, 1970, 00:00.
- ///< Type is signed, so represented on 31 bit.
- TIME_FORMAT_NTP = 1, ///< Number of seconds since January 1, 1900, 00:00.
- ///< Type is unsigned, so represented on 32 bit.
- TIME_FORMAT_ZIGBEE_CLUSTER = 2, ///< Number of seconds since January 1, 2000, 00:00. Type is
- ///< unsigned, so represented on 32 bit.
-};
-
-// Initialization flag.
-static bool is_sleeptimer_initialized = false;
-// Timer frequency in Hz.
-static uint32_t timer_frequency;
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
-// Current time count.
-static sl_sleeptimer_timestamp_t second_count;
-// Tick rest when the frequency is not a divider of the timer width.
-static uint32_t overflow_tick_rest = 0;
-#endif
-
-/*******************************************************************************
- * Checks if the time stamp, format and time zone are
- * within the supported range.
- *
- * @param time Time stamp to check.
- * @param format Format of the time.
- * @param time_zone Time zone offset in second.
- *
- * @return true if the time is valid. False otherwise.
- ******************************************************************************/
-static bool is_valid_time(sl_sleeptimer_timestamp_t time, sl_sleeptimer_time_format_t format,
- sl_sleeptimer_time_zone_offset_t time_zone)
-{
- bool valid_time = false;
-
- // Check for overflow.
- if ((time_zone < ZONE0 && time > (uint32_t) abs(time_zone)) || (time_zone >= ZONE0 && (time <= UINT32_MAX - time_zone)))
- {
- valid_time = true;
- }
- if (format == TIME_FORMAT_UNIX)
- {
- if (time > TIME_UNIX_TIMESTAMP_MAX)
- { // Check if Unix time stamp is an
- // unsigned 31 bits.
- valid_time = false;
- }
- }
- else
- {
- if ((format == TIME_FORMAT_NTP) && (time >= TIME_NTP_EPOCH_OFFSET_SEC))
- {
- valid_time &= true;
- }
- else if ((format == TIME_FORMAT_ZIGBEE_CLUSTER) && (time <= TIME_UNIX_TIMESTAMP_MAX - TIME_ZIGBEE_EPOCH_OFFSET_SEC))
- {
- valid_time &= true;
- }
- else
- {
- valid_time = false;
- }
- }
- return valid_time;
-}
-
-/*******************************************************************************
- * Gets RTCC timer frequency.
- ******************************************************************************/
-uint32_t rsi_rtc_get_hal_timer_frequency(void)
-{
- /* CMU_PrescToLog2 converts prescaler dividend to a logarithmic value. It only works for even
- * numbers equal to 2^n.
- * An unscaled dividend (dividend = argument + 1).
- * So we need to send argument subtracted by 1
- */
- return (CMU_ClockFreqGet(cmuClock_RTCC) >> (CMU_PrescToLog2(SL_SLEEPTIMER_FREQ_DIVIDER - 1)));
-}
-
-/******************************************************************************
- * Initializes RTCC sleep timer.
- *****************************************************************************/
-void rsi_rtc_init_timer(void)
-{
- RTCC_Init_TypeDef rtcc_init = RTCC_INIT_DEFAULT;
- RTCC_CCChConf_TypeDef channel = RTCC_CH_INIT_COMPARE_DEFAULT;
-
- CMU_ClockEnable(cmuClock_RTCC, true);
-
- rtcc_init.enable = false;
-
- /* CMU_PrescToLog2 converts prescaler dividend to a logarithmic value. It only works for even
- * numbers equal to 2^n.
- * An unscaled dividend (dividend = argument + 1).
- * So we need to send argument subtracted by 1
- */
- rtcc_init.presc = (RTCC_CntPresc_TypeDef)(CMU_PrescToLog2(SL_SLEEPTIMER_FREQ_DIVIDER - 1));
-
- RTCC_Init(&rtcc_init);
-
- // Compare channel starts disabled and is enabled only when compare match
- // interrupt is enabled.
- channel.chMode = rtccCapComChModeOff;
- RTCC_ChannelInit(CH_SELECTOR, &channel);
-
- RTCC_IntDisable(_RTCC_IEN_MASK);
- RTCC_IntClear(_RTCC_IF_MASK);
- RTCC_CounterSet(RTC_DEFAULT_COUNTER_VALUE);
-
- RTCC_Enable(true);
-
- NVIC_ClearPendingIRQ(RTCC_IRQn);
- NVIC_EnableIRQ(RTCC_IRQn);
-}
-
-/******************************************************************************
- * Enables RTCC interrupts.
- *****************************************************************************/
-void rsi_rtc_enable_int(uint8_t local_flag)
-{
- uint32_t rtcc_ien = 0u;
-
- if (local_flag & SLEEPTIMER_EVENT_OF)
- {
- rtcc_ien |= RTCC_IEN_OF;
- }
-
- if (local_flag & SLEEPTIMER_EVENT_COMP)
- {
- rtcc_ien |= RTCC_IEN_CC1;
- }
-
- RTCC_IntEnable(rtcc_ien);
-}
-
-/*******************************************************************************
- * Get timer frequency.
- ******************************************************************************/
-uint32_t rsi_rtc_get_timer_frequency(void)
-{
- return timer_frequency;
-}
-
-/******************************************************************************
- * Gets RTCC counter value.
- *****************************************************************************/
-uint32_t rsi_rtc_get_counter(void)
-{
- return RTCC_CounterGet();
-}
-
-sl_status_t rsi_rtc_init(void)
-{
- CORE_DECLARE_IRQ_STATE;
- CORE_ENTER_ATOMIC();
-
- if (!is_sleeptimer_initialized)
- {
- rsi_rtc_init_timer();
- rsi_rtc_enable_int(SLEEPTIMER_EVENT_OF);
- timer_frequency = rsi_rtc_get_hal_timer_frequency();
- if (timer_frequency == RSI_RTC_FREQ_VALUE)
- {
- CORE_EXIT_ATOMIC();
- return SL_STATUS_INVALID_PARAMETER;
- }
-
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
- second_count = 0;
-#endif
-
- is_sleeptimer_initialized = true;
- }
- CORE_EXIT_ATOMIC();
-
- return SL_STATUS_OK;
-}
-
-#if SL_SLEEPTIMER_WALLCLOCK_CONFIG
-/*******************************************************************************
- * Retrieves current time.
- ******************************************************************************/
-uint32_t rsi_rtc_get_time(void)
-{
- uint32_t cnt = 0u;
- uint32_t freq = 0u;
- sl_sleeptimer_timestamp_t time;
- CORE_DECLARE_IRQ_STATE;
-
- cnt = rsi_rtc_get_counter();
- freq = rsi_rtc_get_timer_frequency();
-
- CORE_ENTER_ATOMIC();
- time = second_count + cnt / freq;
- if (cnt % freq + overflow_tick_rest >= freq)
- {
- time++;
- }
- CORE_EXIT_ATOMIC();
-
- return time;
-}
-
-/*******************************************************************************
- * Sets current time.
- ******************************************************************************/
-sl_status_t rsi_rtc_settime(sl_sleeptimer_timestamp_t time)
-{
- uint32_t freq = 0u;
- uint32_t counter_sec = 0u;
- uint32_t cnt = 0;
- CORE_DECLARE_IRQ_STATE;
-
- if (!is_valid_time(time, TIME_FORMAT_UNIX, TIME_ZONE_OFFSET))
- {
- return SL_STATUS_INVALID_CONFIGURATION;
- }
-
- freq = rsi_rtc_get_timer_frequency();
- cnt = rsi_rtc_get_counter();
-
- CORE_ENTER_ATOMIC();
- second_count = time;
- overflow_tick_rest = 0;
- counter_sec = cnt / freq;
-
- if (second_count >= counter_sec)
- {
- second_count -= counter_sec;
- }
- else
- {
- CORE_EXIT_ATOMIC();
- return SL_STATUS_INVALID_CONFIGURATION;
- }
-
- CORE_EXIT_ATOMIC();
-
- return SL_STATUS_OK;
-}
-
-/*******************************************************************************
- * @fn int32_t rsi_rtc_set_time(uint32_t time)
- * @brief
- * Init Sleeptimer and Set current time.
- * @param[in] time:
- * @return
- * None
- ******************************************************************************/
-int32_t rsi_rtc_set_time(uint32_t time)
-{
- sl_status_t ret_val = SL_STATUS_OK;
- ret_val = rsi_rtc_init();
- if (ret_val != SL_STATUS_OK)
- {
- return -1;
- }
- else
- {
- ret_val = rsi_rtc_settime(time);
- if (ret_val != SL_STATUS_OK)
- {
- return -1;
- }
- }
- return 0;
-}
-#endif // SL_SLEEPTIMER_WALLCLOCK_CONFIG
diff --git a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c b/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c
deleted file mode 100644
index c6d6381..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/hal/rsi_hal_mcu_timer.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Includes
- */
-
-#include "em_cmu.h"
-#ifdef RSI_WITH_OS
-/* FreeRTOS includes. */
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-#include "timers.h"
-#if defined(SysTick)
-#undef SysTick_Handler
-/* FreeRTOS SysTick interrupt handler prototype */
-extern void SysTick_Handler(void);
-/* FreeRTOS tick timer interrupt handler prototype */
-extern void xPortSysTickHandler(void);
-#endif /* SysTick */
-#endif /* RSI_WITH_OS */
-#include "wfx_host_events.h"
-
-/* RSI Driver include file */
-#include "rsi_driver.h"
-/* RSI WLAN Config include file */
-#include "rsi_bootup_config.h"
-#include "rsi_common_apis.h"
-#include "rsi_data_types.h"
-#include "rsi_error.h"
-#include "rsi_nwk.h"
-#include "rsi_socket.h"
-#include "rsi_utils.h"
-#include "rsi_wlan.h"
-#include "rsi_wlan_apis.h"
-#include "rsi_wlan_config.h"
-#include "wfx_rsi.h"
-
-#ifndef _use_the_rsi_defined_functions
-
-StaticTimer_t sRsiTimerBuffer;
-
-/*
- * We (Matter port) need a few functions out of this file
- * They are at the top
- */
-uint32_t rsi_hal_gettickcount(void)
-{
- return xTaskGetTickCount();
-}
-void rsi_delay_ms(uint32_t delay_ms)
-{
-#ifndef RSI_WITH_OS
- uint32_t start;
-#endif
- if (delay_ms == 0) // Check if delay is 0msec
- return;
-
-#ifdef RSI_WITH_OS
- vTaskDelay(pdMS_TO_TICKS(delay_ms));
-#else
- start = rsi_hal_gettickcount();
- do
- {
- } while (rsi_hal_gettickcount() - start < delay_ms);
-#endif
-}
-static struct rsi_timer
-{
- void (*func)(void);
- TimerHandle_t handle;
- uint8_t id;
- uint8_t name[3];
-} rsi_timer[WFX_RSI_NUM_TIMERS];
-static void timer_cb(TimerHandle_t thandle)
-{
- int x;
- for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
- {
- if (rsi_timer[x].handle == thandle)
- {
- (*rsi_timer[x].func)();
- break;
- }
- }
-}
-
-/*
- * Run a one-shot/periodic timer
- */
-int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_cb)(void))
-{
- int x;
- struct rsi_timer * tp;
-
- if (mode == RSI_HAL_TIMER_MODE_MILLI)
- return RSI_ERROR_INVALID_OPTION; /* Not supported for now - Fix this later */
- for (x = 0; x < WFX_RSI_NUM_TIMERS; x++)
- {
- tp = &rsi_timer[x];
- if (tp->handle == NULL)
- {
- goto found;
- }
- }
- /* No space */
- return RSI_ERROR_INSUFFICIENT_BUFFER;
-found:
- tp->name[0] = 'r';
- tp->name[1] = timer_node;
- tp->name[2] = 0;
- tp->func = rsi_timer_cb;
- tp->handle =
- xTimerCreateStatic((char *) &tp->name[0], pdMS_TO_TICKS(duration),
- ((mode == RSI_HAL_TIMER_TYPE_SINGLE_SHOT) ? pdFALSE : pdTRUE), NULL, timer_cb, &sRsiTimerBuffer);
-
- if (tp->handle == NULL)
- {
- return RSI_ERROR_INSUFFICIENT_BUFFER;
- }
-
- (void) xTimerStart(tp->handle, TIMER_TICKS_TO_WAIT_0);
-
- return RSI_ERROR_NONE;
-}
-#else /* _use_the_rsi_defined_functions */
-
-/* Counts 1ms timeTicks */
-volatile uint32_t msTicks = 0;
-
-/*===================================================*/
-/**
- * @fn int32_t rsi_timer_start(uint8_t timer_no, uint8_t mode,uint8_t type,uint32_t duration,void (*
- * rsi_timer_expiry_handler)())
- * @brief Starts and configures timer
- * @param[in] timer_node, timer node to be configured.
- * @param[in] mode , mode of the timer
- * 0 - Micro seconds mode
- * 1 - Milli seconds mode
- * @param[in] type, type of the timer
- * 0 - single shot type
- * 1 - periodic type
- * @param[in] duration, timer duration
- * @param[in] rsi_timer_expiry_handler() ,call back function to handle timer interrupt
- * @param[out] none
- * @return 0 - success
- * !0 - Failure
- * @description This HAL API should contain the code to initialize the timer and start the timer
- *
- */
-
-int32_t rsi_timer_start(uint8_t timer_node, uint8_t mode, uint8_t type, uint32_t duration, void (*rsi_timer_expiry_handler)(void))
-{
-
- // Initialise the timer
-
- // register the call back
-
- // Start timer
-
- return 0;
-}
-
-/*===================================================*/
-/**
- * @fn int32_t rsi_timer_stop(uint8_t timer_no)
- * @brief Stops timer
- * @param[in] timer_node, timer node to stop
- * @param[out] none
- * @return 0 - success
- * !0 - Failure
- * @description This HAL API should contain the code to stop the timer
- *
- */
-
-int32_t rsi_timer_stop(uint8_t timer_node)
-{
-
- // Stop the timer
-
- return 0;
-}
-
-/*===================================================*/
-/**
- * @fn uint32_t rsi_timer_read(uint8_t timer_node)
- * @brief read timer
- * @param[in] timer_node, timer node to read
- * @param[out] none
- * @return timer value
- * @description This HAL API should contain API to read the timer
- *
- */
-uint32_t rsi_timer_read(uint8_t timer_node)
-{
-
- volatile uint32_t timer_val = 0;
-
- // read the timer and return timer value
-
- return timer_val;
-}
-
-/*===================================================*/
-/**
- * @fn void rsi_delay_us(uint32_t delay)
- * @brief create delay in micro seconds
- * @param[in] delay_us, timer delay in micro seconds
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to create delay in micro seconds
- *
- */
-void rsi_delay_us(uint32_t delay_us)
-{
-
- // call the API for delay in micro seconds
-
- return;
-}
-
-#ifdef RSI_M4_INTERFACE
-
-extern void SysTick_Handler(void);
-
-void SysTick_Handler(void)
-{
- _dwTickCount++;
-}
-
-uint32_t GetTickCount(void)
-{
- return _dwTickCount; // gets the tick count from systic ISR
-}
-#endif
-
-/*===================================================*/
-/**
- * @fn void rsi_delay_ms(uint32_t delay)
- * @brief create delay in milli seconds
- * @param[in] delay, timer delay in milli seconds
- * @param[out] none
- * @return none
- * @description This HAL API should contain the code to create delay in milli seconds
- */
-void rsi_delay_ms(uint32_t delay_ms)
-{
-#ifndef RSI_WITH_OS
- uint32_t start;
-#endif
- if (delay_ms == DELAY0)
- return;
-
-#ifdef RSI_WITH_OS
- vTaskDelay(delay_ms);
-#else
- start = rsi_hal_gettickcount();
- do
- {
- } while (rsi_hal_gettickcount() - start < delay_ms);
-#endif
-}
-
-/*===================================================*/
-/**
- * @fn uint32_t rsi_hal_gettickcount()
- * @brief provides a tick value in milliseconds
- * @return tick value
- * @description This HAL API should contain the code to read the timer tick count value in milliseconds
- *
- */
-
-#ifndef RSI_HAL_USE_RTOS_SYSTICK
-/*
- SysTick handler implementation that also clears overflow flag.
-*/
-void SysTick_Handler(void)
-{
- /* Increment counter necessary in Delay()*/
- msTicks++;
-#ifdef RSI_WITH_OS
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
- {
- xPortSysTickHandler();
- }
-#endif
-}
-
-uint32_t rsi_hal_gettickcount(void)
-{
- return msTicks;
-
-#ifdef LINUX_PLATFORM
- // Define your API to get the tick count delay in milli seconds from systic ISR and return the resultant value
- struct rsi_timeval tv1;
- gettimeofday(&tv1, NULL);
- return (tv1.tv_sec * CONVERT_SEC_TO_MSEC + tv1.tv_usec * CONVERT_USEC_TO_MSEC);
-#endif
-}
-
-#else
-uint32_t rsi_hal_gettickcount(void)
-{
- return xTaskGetTickCount();
-}
-#endif /* RSI_HAL_USE_RTOS_SYSTICK */
-#endif /* _use_the_rsi_defined_functions */
diff --git a/examples/platform/silabs/SiWx917/rs911x/rs911x.gni b/examples/platform/silabs/SiWx917/rs911x/rs911x.gni
deleted file mode 100644
index f119810..0000000
--- a/examples/platform/silabs/SiWx917/rs911x/rs911x.gni
+++ /dev/null
@@ -1,101 +0,0 @@
-import("//build_overrides/chip.gni")
-import("//build_overrides/efr32_sdk.gni")
-import("//build_overrides/pigweed.gni")
-
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
-wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
-wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
-rs911x_cflags = []
-
-rs911x_src_plat = [
- "${examples_plat_dir}/rs911x/rsi_if.c",
- "${examples_plat_dir}/rs911x/wfx_rsi_host.c",
- "${wifi_sdk_dir}/wfx_notify.cpp",
- "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_interrupt.c",
- "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_ioports.c",
- "${examples_plat_dir}/rs911x/hal/rsi_hal_mcu_timer.c",
- "${examples_plat_dir}/rs911x/hal/efx_spi.c",
-]
-rs911x_plat_incs = [
- "${wifi_sdk_dir}",
- "${wifi_sdk_dir}/hal",
- "${chip_root}/src/platform/EFR32",
-]
-
-#
-# All the stuff from wiseconnect
-#
-rs911x_src_sapi = [
- "${wiseconnect_sdk_root}/sapi/wlan/rsi_wlan_apis.c",
- "${wiseconnect_sdk_root}/sapi/common/rsi_apis_non_rom.c",
- "${wiseconnect_sdk_root}/sapi/common/rsi_apis_rom.c",
- "${wiseconnect_sdk_root}/sapi/common/rsi_common_apis.c",
- "${wiseconnect_sdk_root}/sapi/common/rsi_device_init_apis.c",
- "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_frame_rd_wr.c",
- "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_functs.c",
- "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_iface_init.c",
- "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_mem_rd_wr.c",
- "${wiseconnect_sdk_root}/sapi/driver/device_interface/spi/rsi_spi_reg_rd_wr.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_common.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_device_init.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_driver_event_handlers.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_driver.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_events_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_events.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_iap.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_nwk.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_pkt_mgmt.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_queue_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_queue.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_scheduler.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_setregion_countryinfo.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_timer.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_utils_rom.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_utils.c",
- "${wiseconnect_sdk_root}/sapi/driver/rsi_wlan.c",
- "${wiseconnect_sdk_root}/sapi/rtos/freertos_wrapper/rsi_os_wrapper.c",
-]
-
-foreach(src_file, rs911x_src_sapi) {
- rs911x_cflags += [ "-Wno-empty-body" ]
-}
-
-rs911x_inc_plat = [
- "${wifi_sdk_dir}",
- "${examples_plat_dir}/rs911x",
- "${examples_plat_dir}/rs911x/hal",
- "${wiseconnect_sdk_root}/sapi/include",
-]
-
-# Apparently - the rsi library needs this
-rs911x_src_sock = [
- "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket.c",
- "${wiseconnect_sdk_root}/sapi/network/socket/rsi_socket_rom.c",
-]
-rs911x_sock_inc = [ "${wifi_sdk_dir}/rsi-sockets" ]
-
-#
-# If we use LWIP - not built-in sockets
-#
-rs911x_src_lwip = [
- "${wifi_sdk_dir}/ethernetif.cpp",
- "${wifi_sdk_dir}/dhcp_client.cpp",
- "${wifi_sdk_dir}/lwip_netif.cpp",
-]
-rs911x_defs = [
- "SL_HEAP_SIZE=32768",
- "SL_WIFI=1",
- "SL_WFX_USE_SPI",
- "EFX32_RS911X=1",
- "RS911X_WIFI",
- "RSI_WLAN_ENABLE",
- "RSI_SPI_INTERFACE",
- "RSI_WITH_OS",
-]
-rs911x_sock_defs = [
- "RS911X_SOCKETS",
- "RSI_IPV6_ENABLE",
-]
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.cpp b/examples/platform/silabs/SiWx917/siwx917_utils.cpp
similarity index 91%
rename from examples/platform/silabs/SiWx917/efr32_utils.cpp
rename to examples/platform/silabs/SiWx917/siwx917_utils.cpp
index bd2bf77..49a2325 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.cpp
+++ b/examples/platform/silabs/SiWx917/siwx917_utils.cpp
@@ -17,9 +17,8 @@
* limitations under the License.
*/
-#include "efr32_utils.h"
-#include "init_efrPlatform.h"
-#include "sl_system_kernel.h"
+#include "siwx917_utils.h"
+#include "init_ccpPlatform.h"
#include <matter_config.h>
diff --git a/examples/platform/silabs/SiWx917/efr32_utils.h b/examples/platform/silabs/SiWx917/siwx917_utils.h
similarity index 97%
rename from examples/platform/silabs/SiWx917/efr32_utils.h
rename to examples/platform/silabs/SiWx917/siwx917_utils.h
index b0d508d..2223275 100644
--- a/examples/platform/silabs/SiWx917/efr32_utils.h
+++ b/examples/platform/silabs/SiWx917/siwx917_utils.h
@@ -19,7 +19,7 @@
#pragma once
-// EFR Logging
+// SiWx917 Logging
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/examples/platform/silabs/SiWx917/uart.cpp b/examples/platform/silabs/SiWx917/uart.cpp
index 76dbca2..d264e96 100644
--- a/examples/platform/silabs/SiWx917/uart.cpp
+++ b/examples/platform/silabs/SiWx917/uart.cpp
@@ -22,217 +22,21 @@
extern "C" {
#endif
#include "assert.h"
-#include "em_core.h"
-#include "em_usart.h"
-#include "sl_board_control.h"
-#include "sl_uartdrv_instances.h"
-#if (defined(EFR32MG24) || defined(MGM24))
-#include "sl_uartdrv_eusart_vcom_config.h"
-#else
-#include "sl_uartdrv_usart_vcom_config.h"
-#endif // EFR32MG24
+#include "rsi_board.h"
#include "uart.h"
#include "uartdrv.h"
#include <stddef.h>
#include <string.h>
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
-#include "sl_power_manager.h"
-#endif
-
#if !defined(MIN)
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#endif
-#if (defined(EFR32MG24) || defined(MGM24))
-#define HELPER1(x) EUSART##x##_RX_IRQn
-#else
-#define HELPER1(x) USART##x##_RX_IRQn
-#endif
-
-#define HELPER2(x) HELPER1(x)
-
-#if (defined(EFR32MG24) || defined(MGM24))
-#define HELPER3(x) EUSART##x##_RX_IRQHandler
-#else
-#define HELPER3(x) USART##x##_RX_IRQHandler
-#endif
-
-#define HELPER4(x) HELPER3(x)
-
-// On MG24 boards VCOM runs on the EUSART device, MG12 uses the UART device
-#if (defined(EFR32MG24) || defined(MGM24))
-#define USART_IRQ HELPER2(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
-#define USART_IRQHandler HELPER4(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
-#define vcom_handle sl_uartdrv_eusart_vcom_handle
-#else
-#define USART_IRQ HELPER2(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
-#define USART_IRQHandler HELPER4(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
-#define vcom_handle sl_uartdrv_usart_vcom_handle
-#endif // EFR32MG24
-
-typedef struct
-{
- // The data buffer
- uint8_t * pBuffer;
- // The offset of the first item written to the list.
- volatile uint16_t Head;
- // The offset of the next item to be written to the list.
- volatile uint16_t Tail;
- // Maxium size of data that can be hold in buffer before overwriting
- uint16_t MaxSize;
-} Fifo_t;
-
#define UART_CONSOLE_ERR -1 // Negative value in case of UART Console action failed. Triggers a failure for PW_RPC
-#define MAX_BUFFER_SIZE 256
-#define MAX_DMA_BUFFER_SIZE (MAX_BUFFER_SIZE / 2)
-// In order to reduce the probability of data loss during the dmaFull callback handler we use
-// two duplicate receive buffers so we can always have one "active" receive queue.
-static uint8_t sRxDmaBuffer[MAX_DMA_BUFFER_SIZE];
-static uint8_t sRxDmaBuffer2[MAX_DMA_BUFFER_SIZE];
-static uint16_t lastCount; // Nb of bytes already processed from the active dmaBuffer
-// Rx buffer for the receive Fifo
-static uint8_t sRxFifoBuffer[MAX_BUFFER_SIZE];
-static Fifo_t sReceiveFifo;
-
-static void UART_rx_callback(UARTDRV_Handle_t handle, Ecode_t transferStatus, uint8_t * data, UARTDRV_Count_t transferCount);
-
-static bool InitFifo(Fifo_t * fifo, uint8_t * pDataBuffer, uint16_t bufferSize)
-{
- if (fifo == NULL || pDataBuffer == NULL)
- {
- return false;
- }
-
- fifo->pBuffer = pDataBuffer;
- fifo->MaxSize = bufferSize;
- fifo->Tail = fifo->Head = 0;
-
- return true;
-}
-
-/*
- * @brief Get the amount of unprocessed bytes in the fifo buffer
- * @param Ptr to the fifo
- * @return Nb of "unread" bytes available in the fifo
- */
-static uint16_t AvailableDataCount(Fifo_t * fifo)
-{
- uint16_t size = 0;
-
- // if equal there is no data return 0 directly
- if (fifo->Tail != fifo->Head)
- {
- // determine if a wrap around occurred to get the right data size available.
- size = (fifo->Tail < fifo->Head) ? (fifo->MaxSize - fifo->Head + fifo->Tail) : (fifo->Tail - fifo->Head);
- }
-
- return size;
-}
-
-/*
- * @brief Get the available space in the fifo buffer to insert new data
- * @param Ptr to the fifo
- * @return Nb of free bytes left in te buffer
- */
-static uint16_t RemainingSpace(Fifo_t * fifo)
-{
- return fifo->MaxSize - AvailableDataCount(fifo);
-}
-
-/*
- * @brief Write data in the fifo as a circular buffer
- * @param Ptr to the fifo, ptr of the data to write, nb of bytes to write
- */
-static void WriteToFifo(Fifo_t * fifo, uint8_t * pDataToWrite, uint16_t SizeToWrite)
-{
- assert(fifo);
- assert(pDataToWrite);
- assert(SizeToWrite <= fifo->MaxSize);
-
- // Overwrite is not allowed
- if (RemainingSpace(fifo) >= SizeToWrite)
- {
- uint16_t nBytesBeforWrap = (fifo->MaxSize - fifo->Tail);
- if (SizeToWrite > nBytesBeforWrap)
- {
- // The number of bytes to write is bigger than the remaining bytes
- // in the buffer, we have to wrap around
- memcpy(fifo->pBuffer + fifo->Tail, pDataToWrite, nBytesBeforWrap);
- memcpy(fifo->pBuffer, pDataToWrite + nBytesBeforWrap, SizeToWrite - nBytesBeforWrap);
- }
- else
- {
- memcpy(fifo->pBuffer + fifo->Tail, pDataToWrite, SizeToWrite);
- }
-
- fifo->Tail = (fifo->Tail + SizeToWrite) % fifo->MaxSize; // increment tail with wraparound
- }
-}
-
-/*
- * @brief Write data in the fifo as a circular buffer
- * @param Ptr to the fifo, ptr to contain the data to process, nb of bytes to pull from the fifo
- * @return Nb of bytes that were retrieved.
- */
-static uint8_t RetrieveFromFifo(Fifo_t * fifo, uint8_t * pData, uint16_t SizeToRead)
-{
- assert(fifo);
- assert(pData);
- assert(SizeToRead <= fifo->MaxSize);
-
- uint16_t ReadSize = MIN(SizeToRead, AvailableDataCount(fifo));
- uint16_t nBytesBeforWrap = (fifo->MaxSize - fifo->Head);
-
- if (ReadSize > nBytesBeforWrap)
- {
- memcpy(pData, fifo->pBuffer + fifo->Head, nBytesBeforWrap);
- memcpy(pData + nBytesBeforWrap, fifo->pBuffer, ReadSize - nBytesBeforWrap);
- }
- else
- {
- memcpy(pData, (fifo->pBuffer + fifo->Head), ReadSize);
- }
-
- fifo->Head = (fifo->Head + ReadSize) % fifo->MaxSize; // increment tail with wraparound
-
- return ReadSize;
-}
-
-/*
- * @brief Init the the UART for serial communication, Start DMA reception
- * and init Fifo to handle the received data from this uart
- *
- * @Note This UART is used for pigweed rpc
- */
void uartConsoleInit(void)
{
- sl_board_enable_vcom();
- // Init a fifo for the data received on the uart
- InitFifo(&sReceiveFifo, sRxFifoBuffer, MAX_BUFFER_SIZE);
-
- // Activate 2 dma queues to always have one active
-
- UARTDRV_Receive(vcom_handle, sRxDmaBuffer, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
- UARTDRV_Receive(vcom_handle, sRxDmaBuffer2, MAX_DMA_BUFFER_SIZE, UART_rx_callback);
-
- // Enable USART0/EUSART0 interrupt to wake OT task when data arrives
- NVIC_ClearPendingIRQ(USART_IRQ);
- NVIC_EnableIRQ(USART_IRQ);
-
-#if (defined(EFR32MG24) || defined(MGM24))
- // Clear previous RX interrupts
- EUSART_IntClear(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
-
- // Enable RX interrupts
- EUSART_IntEnable(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
-
- // Enable EUSART
- EUSART_Enable(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, eusartEnable);
-#else
- USART_IntEnable(SL_UARTDRV_USART_VCOM_PERIPHERAL, USART_IF_RXDATAV);
-#endif // EFR32MG24
+ // UART init is already done
}
void USART_IRQHandler(void)
@@ -289,25 +93,12 @@
return UART_CONSOLE_ERR;
}
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
- sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
+ // Add Terminating char at the end of buffer
+ Buf[BufLength] = '\0';
- // Use of ForceTransmit here. Transmit with DMA was causing errors with PW_RPC
- // TODO Use DMA and find/fix what causes the issue with PW
- if (UARTDRV_ForceTransmit(vcom_handle, (uint8_t *) Buf, BufLength) == ECODE_EMDRV_UARTDRV_OK)
- {
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
- sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
- return BufLength;
- }
+ Board_UARTPutSTR((uint8_t *) Buf);
-#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
- sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
-
- return UART_CONSOLE_ERR;
+ return BufLength;
}
/*
@@ -317,25 +108,20 @@
*/
int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead)
{
- uint8_t * data;
- UARTDRV_Count_t count, remaining;
+ uint32_t data;
if (Buf == NULL || NbBytesToRead < 1)
{
return UART_CONSOLE_ERR;
}
- if (NbBytesToRead > AvailableDataCount(&sReceiveFifo))
+ while (--NbBytesToRead >= 0)
{
- // Not enough data available in the fifo for the read size request
- // If there is data available in dma buffer, get it now.
- CORE_ATOMIC_SECTION(UARTDRV_GetReceiveStatus(vcom_handle, &data, &count, &remaining); if (count > lastCount) {
- WriteToFifo(&sReceiveFifo, data + lastCount, count - lastCount);
- lastCount = count;
- })
+ data = Board_UARTGetChar();
+ *Buf++ = (char) data;
}
- return (int16_t) RetrieveFromFifo(&sReceiveFifo, (uint8_t *) Buf, NbBytesToRead);
+ return NbBytesToRead;
}
#ifdef __cplusplus
diff --git a/examples/platform/silabs/SiWx917/uart.h b/examples/platform/silabs/SiWx917/uart.h
index f708030..035d5b3 100644
--- a/examples/platform/silabs/SiWx917/uart.h
+++ b/examples/platform/silabs/SiWx917/uart.h
@@ -28,13 +28,6 @@
int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength);
int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead);
-// Implemented by in openthread code
-#ifndef PW_RPC_ENABLED
-extern void otPlatUartReceived(const uint8_t * aBuf, uint16_t aBufLength);
-extern void otPlatUartSendDone(void);
-extern void otSysEventSignalPending(void);
-#endif
-
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/examples/platform/silabs/SiWx917/wf200/efr_spi.c b/examples/platform/silabs/SiWx917/wf200/efr_spi.c
deleted file mode 100644
index fb35093..0000000
--- a/examples/platform/silabs/SiWx917/wf200/efr_spi.c
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "sl_wfx_configuration_defaults.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host_api.h"
-
-#include "dmadrv.h"
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "spidrv.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "FreeRTOS.h"
-#include "semphr.h"
-#ifdef SLEEP_ENABLED
-#include "sl_power_manager.h"
-#endif
-#include "AppConfig.h"
-
-#include "gpiointerrupt.h"
-
-#include "sl_spidrv_exp_config.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-extern SPIDRV_Handle_t sl_spidrv_exp_handle;
-
-#define USART SL_WFX_HOST_PINOUT_SPI_PERIPHERAL
-
-StaticSemaphore_t xEfrSpiSemaBuffer;
-static SemaphoreHandle_t spi_sem;
-
-static unsigned int tx_dma_channel;
-static unsigned int rx_dma_channel;
-
-static uint32_t dummy_rx_data;
-static uint32_t dummy_tx_data;
-static bool spi_enabled = false;
-
-#if defined(EFR32MG12)
-uint8_t wirq_irq_nb = SL_WFX_HOST_PINOUT_SPI_IRQ;
-#elif defined(EFR32MG24)
-uint8_t wirq_irq_nb = SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN; // SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN;
-#endif
-
-#define PIN_OUT_SET 1
-#define PIN_OUT_CLEAR 0
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_init_bus(void)
- * @brief
- * Initialize SPI peripheral
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_init_bus(void)
-{
- spi_enabled = true;
-
- /* Assign allocated DMA channel */
- tx_dma_channel = sl_spidrv_exp_handle->txDMACh;
- rx_dma_channel = sl_spidrv_exp_handle->rxDMACh;
-
- /*
- * Route EUSART1 MOSI, MISO, and SCLK to the specified pins. CS is
- * not controlled by EUSART so there is no write to the corresponding
- * EUSARTROUTE register to do this.
- */
- MY_USART->CTRL |= (1u << _USART_CTRL_SMSDELAY_SHIFT);
-
-#if defined(EFR32MG12)
- MY_USART->ROUTEPEN = USART_ROUTEPEN_TXPEN | USART_ROUTEPEN_RXPEN | USART_ROUTEPEN_CLKPEN;
-#endif
-
-#if defined(EFR32MG24)
- GPIO->USARTROUTE[0].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | // MISO
- GPIO_USART_ROUTEEN_TXPEN | // MOSI
- GPIO_USART_ROUTEEN_CLKPEN;
-#endif
-
- spi_sem = xSemaphoreCreateBinaryStatic(&xEfrSpiSemaBuffer);
- xSemaphoreGive(spi_sem);
-
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_deinit_bus(void)
- * @brief
- * De-initialize SPI peripheral and DMAs
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_deinit_bus(void)
-{
- vSemaphoreDelete(spi_sem);
- // Stop DMAs.
- DMADRV_StopTransfer(rx_dma_channel);
- DMADRV_StopTransfer(tx_dma_channel);
- DMADRV_FreeChannel(tx_dma_channel);
- DMADRV_FreeChannel(rx_dma_channel);
- DMADRV_DeInit();
- USART_Reset(MY_USART);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_spi_cs_assert()
- * @brief
- * Assert chip select.
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_cs_assert()
-{
- GPIO_PinOutClear(SL_SPIDRV_EXP_CS_PORT, SL_SPIDRV_EXP_CS_PIN);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_spi_cs_deassert()
- * @brief
- * De-Assert chip select.
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_cs_deassert()
-{
- GPIO_PinOutSet(SL_SPIDRV_EXP_CS_PORT, SL_SPIDRV_EXP_CS_PIN);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void *userParam)
- * @brief
- * function called when the DMA complete
- * @param[in] channel:
- * @param[in] sequenceNo: sequence number
- * @param[in] userParam: user parameter
- * @return returns true if suucessful,
- * false otherwise
- *****************************************************************************/
-static bool rx_dma_complete(unsigned int channel, unsigned int sequenceNo, void * userParam)
-{
- (void) channel;
- (void) sequenceNo;
- (void) userParam;
-
- BaseType_t xHigherPriorityTaskWoken = pdFALSE;
- xSemaphoreGiveFromISR(spi_sem, &xHigherPriorityTaskWoken);
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
-
- return true;
-}
-
-/****************************************************************************
- * @fn void receiveDMA(uint8_t *buffer, uint16_t buffer_length)
- * @brief
- * start receive DMA
- * @param[in] buffer:
- * @param[in] buffer_length:
- * @return None
- *****************************************************************************/
-void receiveDMA(uint8_t * buffer, uint16_t buffer_length)
-{
- // Start receive DMA.
- DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, (void *) buffer, (void *) &(MY_USART->RXDATA), true, buffer_length,
- dmadrvDataSize1, rx_dma_complete, NULL);
-
- // Start transmit DMA.
- DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) &(dummy_tx_data), false,
- buffer_length, dmadrvDataSize1, NULL, NULL);
-}
-
-/****************************************************************************
- * @fn void transmitDMA(uint8_t *buffer, uint16_t buffer_length)
- * @brief
- * start transmit DMA
- * @param[in] buffer:
- * @param[in] buffer_length:
- * @return None
- *****************************************************************************/
-void transmitDMA(uint8_t * buffer, uint16_t buffer_length)
-{
- // Receive DMA runs only to initiate callback
- // Start receive DMA.
- DMADRV_PeripheralMemory(rx_dma_channel, MY_USART_RX_SIGNAL, &dummy_rx_data, (void *) &(MY_USART->RXDATA), false, buffer_length,
- dmadrvDataSize1, rx_dma_complete, NULL);
- // Start transmit DMA.
- DMADRV_MemoryPeripheral(tx_dma_channel, MY_USART_TX_SIGNAL, (void *) &(MY_USART->TXDATA), (void *) buffer, true, buffer_length,
- dmadrvDataSize1, NULL, NULL);
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_spi_transfer_no_cs_assert(sl_wfx_host_bus_transfer_type_t type,
- uint8_t *header,
- uint16_t header_length,
- uint8_t *buffer,
- uint16_t buffer_length)
- * @brief
- * WFX SPI transfer implementation
- * @param[in] type:
- * @param[in] header:
- * @param[in] header_length:
- * @param[in] buffer:
- * @param[in] buffer_length:
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_spi_transfer_no_cs_assert(sl_wfx_host_bus_transfer_type_t type, uint8_t * header, uint16_t header_length,
- uint8_t * buffer, uint16_t buffer_length)
-{
- sl_status_t result = SL_STATUS_FAIL;
- const bool is_read = (type == SL_WFX_BUS_READ);
-
- while (!(MY_USART->STATUS & USART_STATUS_TXBL))
- {
- }
- MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
-
- /* header length should be greater than 0 */
- if (header_length > 0)
- {
- for (uint8_t * buffer_ptr = header; header_length > 0; --header_length, ++buffer_ptr)
- {
- MY_USART->TXDATA = (uint32_t)(*buffer_ptr);
-
- while (!(MY_USART->STATUS & USART_STATUS_TXC))
- {
- }
- }
- while (!(MY_USART->STATUS & USART_STATUS_TXBL))
- {
- }
- }
-
- /* buffer length should be greater than 0 */
- if (buffer_length > 0)
- {
- MY_USART->CMD = USART_CMD_CLEARRX | USART_CMD_CLEARTX;
- if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
- {
- if (is_read)
- {
- receiveDMA(buffer, buffer_length);
- result = SL_STATUS_OK;
- }
- else
- {
- transmitDMA(buffer, buffer_length);
- result = SL_STATUS_OK;
- }
-
- if (xSemaphoreTake(spi_sem, portMAX_DELAY) == pdTRUE)
- {
- xSemaphoreGive(spi_sem);
- }
- }
- else
- {
- result = SL_STATUS_TIMEOUT;
- }
- }
-
- return result;
-}
-
-/****************************************************************************
- * @fn void sl_wfx_host_start_platform_interrupt(void)
- * @brief
- * Enable WFX interrupt
- * @param[in] none
- * @return None
- *****************************************************************************/
-void sl_wfx_host_start_platform_interrupt(void)
-{
- // Enable (and clear) the bus interrupt
- GPIO_ExtIntConfig(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, wirq_irq_nb, true, false, true);
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_disable_platform_interrupt(void)
- * @brief
- * Disable WFX interrupt
- * @param[in] None
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_disable_platform_interrupt(void)
-{
- GPIO_IntDisable(1 << wirq_irq_nb);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_enable_platform_interrupt(void)
- * @brief
- * enable the platform interrupt
- * @param[in] None
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_enable_platform_interrupt(void)
-{
- GPIO_IntEnable(1 << wirq_irq_nb);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_enable_spi(void)
- * @brief
- * enable spi
- * @param[in] None
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_enable_spi(void)
-{
- if (spi_enabled == false)
- {
-#ifdef SLEEP_ENABLED
- // Prevent the host to use lower EM than EM1
- sl_power_manager_add_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
- spi_enabled = true;
- }
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_disable_spi(void)
- * @brief
- * disable spi
- * @param[in] None
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_disable_spi(void)
-{
- if (spi_enabled == true)
- {
- spi_enabled = false;
-#ifdef SLEEP_ENABLED
- // Allow the host to use the lowest allowed EM
- sl_power_manager_remove_em_requirement(SL_POWER_MANAGER_EM1);
-#endif
- }
- return SL_STATUS_OK;
-}
-
-/*
- * IRQ for SPI callback
- * Clear the Interrupt and wake up the task that
- * handles the actions of the interrupt (typically - wfx_bus_task ())
- */
-static void sl_wfx_spi_wakeup_irq_callback(uint8_t irqNumber)
-{
- BaseType_t bus_task_woken;
- uint32_t interrupt_mask;
-
- if (irqNumber != wirq_irq_nb)
- return;
- // Get and clear all pending GPIO interrupts
- interrupt_mask = GPIO_IntGet();
- GPIO_IntClear(interrupt_mask);
- bus_task_woken = pdFALSE;
- xSemaphoreGiveFromISR(wfx_wakeup_sem, &bus_task_woken);
- vTaskNotifyGiveFromISR(wfx_bus_task_handle, &bus_task_woken);
- portYIELD_FROM_ISR(bus_task_woken);
-}
-
-/****************************************************************************
- * Init some actions pins to the WF-200 expansion board
- *****************************************************************************/
-void sl_wfx_host_gpio_init(void)
-{
- SILABS_LOG("WIFI: GPIO Init:IRQ=%d", wirq_irq_nb);
- // Enable GPIO clock.
- CMU_ClockEnable(cmuClock_GPIO, true);
-
- // Configure WF200 reset pin.
- GPIO_PinModeSet(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN, gpioModePushPull, 0);
- // Configure WF200 WUP pin.
- GPIO_PinModeSet(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN, gpioModePushPull, 0);
-
- // GPIO used as IRQ.
- GPIO_PinModeSet(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, gpioModeInputPull, 0);
- CMU_OscillatorEnable(cmuOsc_LFXO, true, true);
-
- // Set up interrupt based callback function - trigger on both edges.
- GPIOINT_Init();
- GPIO_ExtIntConfig(SL_WFX_HOST_PINOUT_SPI_WIRQ_PORT, SL_WFX_HOST_PINOUT_SPI_WIRQ_PIN, wirq_irq_nb, true, false,
- false); /* Don't enable it */
-
- GPIOINT_CallbackRegister(wirq_irq_nb, sl_wfx_spi_wakeup_irq_callback);
-
- // Change GPIO interrupt priority (FreeRTOS asserts unless this is done here!)
- NVIC_ClearPendingIRQ(1 << wirq_irq_nb);
- NVIC_SetPriority(GPIO_EVEN_IRQn, 5);
- NVIC_SetPriority(GPIO_ODD_IRQn, 5);
-}
diff --git a/examples/platform/silabs/SiWx917/wf200/host_if.cpp b/examples/platform/silabs/SiWx917/wf200/host_if.cpp
deleted file mode 100644
index 26bd788..0000000
--- a/examples/platform/silabs/SiWx917/wf200/host_if.cpp
+++ /dev/null
@@ -1,1270 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Includes */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-
-#include "wifi_config.h"
-
-#include "AppConfig.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "dhcp_client.h"
-#include "ethernetif.h"
-#include <platform/CHIPDeviceLayer.h>
-
-using namespace ::chip;
-using namespace ::chip::DeviceLayer;
-
-/* wfxRsi Task will use as its stack */
-StackType_t wfxEventTaskStack[1024] = { 0 };
-
-/* Structure that will hold the TCB of the wfxRsi Task being created. */
-StaticTask_t wfxEventTaskBuffer;
-
-/* Declare a variable to hold the data associated with the created event group. */
-StaticEventGroup_t wfxEventGroup;
-
-EventGroupHandle_t sl_wfx_event_group;
-TaskHandle_t wfx_events_task_handle;
-static sl_wfx_mac_address_t ap_mac;
-static uint32_t sta_ip;
-static wfx_wifi_scan_result_t ap_info;
-
-// Set Scan Parameters
-#define ACTIVE_CHANNEL_TIME 110
-#define PASSIVE_CHANNEL_TIME 0
-#define NUM_PROBE_REQUEST 2
-
-// wfx_fmac_driver context
-sl_wfx_context_t wifiContext;
-static uint8_t wifi_extra;
-
-/*****************************************************************************
- * macros
- ******************************************************************************/
-#define WE_ST_STARTED 1
-#define WE_ST_STA_CONN 2
-#define WE_ST_HW_STARTED 4
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-// Connection parameters
-char softap_ssid[32] = SOFTAP_SSID_DEFAULT;
-char softap_passkey[64] = SOFTAP_PASSKEY_DEFAULT;
-sl_wfx_security_mode_t softap_security = SOFTAP_SECURITY_DEFAULT;
-uint8_t softap_channel = SOFTAP_CHANNEL_DEFAULT;
-#endif
-
-/* station network interface structures */
-struct netif * sta_netif;
-wfx_wifi_provision_t wifi_provision;
-sl_wfx_get_counters_cnf_t * counters;
-sl_wfx_get_counters_cnf_t * Tempcounters;
-#define PUT_COUNTER(name) SILABS_LOG("%-24s %lu\r\n", #name, (unsigned long) counters->body.count_##name);
-
-bool hasNotifiedIPV6 = false;
-bool hasNotifiedIPV4 = false;
-bool hasNotifiedWifiConnectivity = false;
-static uint8_t retryJoin = 0;
-bool retryInProgress = false;
-
-#ifdef SL_WFX_CONFIG_SCAN
-static struct scan_result_holder
-{
- struct scan_result_holder * next;
- wfx_wifi_scan_result scan;
-} * scan_save;
-static uint8_t scan_count = 0;
-static void (*scan_cb)(wfx_wifi_scan_result_t *); /* user-callback - when scan is done */
-static char * scan_ssid; /* Which one are we scanning for */
-static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result);
-static void sl_wfx_scan_complete_callback(uint32_t status);
-#endif /* SL_WFX_CONFIG_SCAN */
-
-static void wfx_events_task(void * p_arg);
-
-/* WF200 host callbacks */
-static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body);
-static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason);
-static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame);
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-static void sl_wfx_start_ap_callback(uint32_t status);
-static void sl_wfx_stop_ap_callback(void);
-static void sl_wfx_client_connected_callback(uint8_t * mac);
-static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac);
-static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac);
-#endif
-
-extern uint32_t gOverrunCount;
-
-/***************************************************************************
- * @brief
- * Creates WFX events processing task.
- ******************************************************************************/
-static void wfx_events_task_start()
-{
- /* create an event group to track Wi-Fi events */
- sl_wfx_event_group = xEventGroupCreateStatic(&wfxEventGroup);
-
- wfx_events_task_handle = xTaskCreateStatic(wfx_events_task, "wfx_events", WLAN_TASK_STACK_SIZE, NULL, WLAN_TASK_PRIORITY,
- wfxEventTaskStack, &wfxEventTaskBuffer);
- if (NULL == wfx_events_task_handle)
- {
- SILABS_LOG("Failed to create WFX wfx_events");
- }
-}
-
-/****************************************************************************
- * @brief
- * Called when the driver needs to post an event
- * @param[in] event_payload:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload)
-{
- switch (event_payload->header.id)
- {
- /******** INDICATION ********/
- case SL_WFX_STARTUP_IND_ID: {
- SILABS_LOG("WFX Startup Completed\r\n");
- PlatformMgrImpl().HandleWFXSystemEvent(WIFI_EVENT, event_payload);
- break;
- }
- case SL_WFX_CONNECT_IND_ID: {
- sl_wfx_connect_ind_t * connect_indication = (sl_wfx_connect_ind_t *) event_payload;
- sl_wfx_connect_callback(connect_indication->body);
- break;
- }
- case SL_WFX_DISCONNECT_IND_ID: {
- sl_wfx_disconnect_ind_t * disconnect_indication = (sl_wfx_disconnect_ind_t *) event_payload;
- sl_wfx_disconnect_callback(disconnect_indication->body.mac, disconnect_indication->body.reason);
- break;
- }
- case SL_WFX_RECEIVED_IND_ID: {
- sl_wfx_received_ind_t * ethernet_frame = (sl_wfx_received_ind_t *) event_payload;
- if (ethernet_frame->body.frame_type == ETH_FRAME)
- {
- sl_wfx_host_received_frame_callback(ethernet_frame);
- }
- break;
- }
-#ifdef SL_WFX_CONFIG_SCAN
- case SL_WFX_SCAN_RESULT_IND_ID: {
- sl_wfx_scan_result_ind_t * scan_result = (sl_wfx_scan_result_ind_t *) event_payload;
- sl_wfx_scan_result_callback(&scan_result->body);
- break;
- }
- case SL_WFX_SCAN_COMPLETE_IND_ID: {
- sl_wfx_scan_complete_ind_t * scan_complete = (sl_wfx_scan_complete_ind_t *) event_payload;
- sl_wfx_scan_complete_callback(scan_complete->body.status);
- break;
- }
-#endif /* SL_WFX_CONFIG_SCAN */
-#ifdef SL_WFX_CONFIG_SOFTAP
- case SL_WFX_START_AP_IND_ID: {
- sl_wfx_start_ap_ind_t * start_ap_indication = (sl_wfx_start_ap_ind_t *) event_payload;
- sl_wfx_start_ap_callback(start_ap_indication->body.status);
- break;
- }
- case SL_WFX_STOP_AP_IND_ID: {
- sl_wfx_stop_ap_callback();
- break;
- }
- case SL_WFX_AP_CLIENT_CONNECTED_IND_ID: {
- sl_wfx_ap_client_connected_ind_t * client_connected_indication = (sl_wfx_ap_client_connected_ind_t *) event_payload;
- sl_wfx_client_connected_callback(client_connected_indication->body.mac);
- break;
- }
- case SL_WFX_AP_CLIENT_REJECTED_IND_ID: {
- sl_wfx_ap_client_rejected_ind_t * ap_client_rejected_indication = (sl_wfx_ap_client_rejected_ind_t *) event_payload;
- sl_wfx_ap_client_rejected_callback(ap_client_rejected_indication->body.reason, ap_client_rejected_indication->body.mac);
- break;
- }
- case SL_WFX_AP_CLIENT_DISCONNECTED_IND_ID: {
- sl_wfx_ap_client_disconnected_ind_t * ap_client_disconnected_indication =
- (sl_wfx_ap_client_disconnected_ind_t *) event_payload;
- sl_wfx_ap_client_disconnected_callback(ap_client_disconnected_indication->body.reason,
- ap_client_disconnected_indication->body.mac);
- break;
- }
-#endif /* SL_WFX_CONFIG_SOFTAP */
-#ifdef SL_WFX_USE_SECURE_LINK
- case SL_WFX_SECURELINK_EXCHANGE_PUB_KEYS_IND_ID: {
- if (host_context.waited_event_id != SL_WFX_SECURELINK_EXCHANGE_PUB_KEYS_IND_ID)
- {
- memcpy((void *) &sl_wfx_context->secure_link_exchange_ind, (void *) event_payload, event_payload->header.length);
- }
- break;
- }
-#endif
- case SL_WFX_GENERIC_IND_ID: {
- sl_wfx_generic_ind_t * generic_status = (sl_wfx_generic_ind_t *) event_payload;
- sl_wfx_generic_status_callback(generic_status);
- break;
- }
- case SL_WFX_EXCEPTION_IND_ID: {
- sl_wfx_exception_ind_t * firmware_exception = (sl_wfx_exception_ind_t *) event_payload;
- uint8_t * exception_tmp = (uint8_t *) firmware_exception;
- SILABS_LOG("firmware exception\r\n");
- for (uint16_t i = 0; i < firmware_exception->header.length; i += 16)
- {
- SILABS_LOG("hif: %.8x:", i);
- for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_exception->header.length); j++)
- {
- SILABS_LOG(" %.2x", *exception_tmp);
- exception_tmp++;
- }
- SILABS_LOG("\r\n");
- }
- break;
- }
- case SL_WFX_ERROR_IND_ID: {
- sl_wfx_error_ind_t * firmware_error = (sl_wfx_error_ind_t *) event_payload;
- uint8_t * error_tmp = (uint8_t *) firmware_error;
- SILABS_LOG("firmware error %lu\r\n", firmware_error->body.type);
- for (uint16_t i = 0; i < firmware_error->header.length; i += 16)
- {
- SILABS_LOG("hif: %.8x:", i);
- for (uint8_t j = 0; (j < 16) && ((i + j) < firmware_error->header.length); j++)
- {
- SILABS_LOG(" %.2x", *error_tmp);
- error_tmp++;
- }
- SILABS_LOG("\r\n");
- }
- break;
- }
- }
-
- return SL_STATUS_OK;
-}
-
-#ifdef SL_WFX_CONFIG_SCAN
-/****************************************************************************
- * @brief
- * Callback for individual scan result
- * @param[in] scan_result: Scan result of all SSID's
- *****************************************************************************/
-static void sl_wfx_scan_result_callback(sl_wfx_scan_result_ind_body_t * scan_result)
-{
- struct scan_result_holder * ap;
-
- SILABS_LOG("# %2d %2d %03d %02X:%02X:%02X:%02X:%02X:%02X %s", scan_count, scan_result->channel,
- ((int16_t)(scan_result->rcpi - 220) / 2), scan_result->mac[0], scan_result->mac[1], scan_result->mac[2],
- scan_result->mac[3], scan_result->mac[4], scan_result->mac[5], scan_result->ssid_def.ssid);
- /*Report one AP information*/
- SILABS_LOG("\r\n");
- /* don't save if filter only wants specific ssid */
- if (scan_ssid != (char *) 0)
- {
- if (strcmp(scan_ssid, (char *) &scan_result->ssid_def.ssid[0]) != CMP_SUCCESS)
- return;
- }
- if ((ap = (struct scan_result_holder *) pvPortMalloc(sizeof(*ap))) == (struct scan_result_holder *) 0)
- {
- SILABS_LOG("*ERR*Scan: No Mem");
- }
- else
- {
- ap->next = scan_save;
- scan_save = ap;
- /* Not checking if scan_result->ssid_length is < 33 */
- memcpy(ap->scan.ssid, scan_result->ssid_def.ssid, scan_result->ssid_def.ssid_length);
- ap->scan.ssid[scan_result->ssid_def.ssid_length] = 0; /* make sure about null terminate */
- /* We do it in this order WPA3 first */
- /* No EAP supported - Is this required */
- if (scan_result->security_mode.wpa3)
- {
- ap->scan.security = WFX_SEC_WPA3;
- }
- else if (scan_result->security_mode.wpa2)
- {
- ap->scan.security = WFX_SEC_WPA2;
- }
- else if (scan_result->security_mode.wpa)
- {
- ap->scan.security = WFX_SEC_WPA;
- }
- else if (scan_result->security_mode.wep)
- {
- ap->scan.security = WFX_SEC_WEP;
- }
- else
- {
- ap->scan.security = WFX_SEC_NONE;
- }
- ap->scan.chan = scan_result->channel;
- ap->scan.rssi = scan_result->rcpi;
- memcpy(&ap->scan.bssid[0], &scan_result->mac[0], BSSID_MAX_STR_LEN);
- scan_count++;
- }
-}
-
-/****************************************************************************
- * @brief
- * Callback for scan complete
- * @param[in] status:Status of WLAN scan api
- *****************************************************************************/
-/* ARGSUSED */
-static void sl_wfx_scan_complete_callback(uint32_t status)
-{
- (void) (status);
- /* Use scan_count value and reset it */
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_COMPLETE);
-}
-#endif /* SL_WFX_CONFIG_SCAN */
-
-/****************************************************************************
- * @brief
- * Callback when station connects
- * @param[in] mac: MAC address of device
- * @param[in] status: Status of connect call
- *****************************************************************************/
-static void sl_wfx_connect_callback(sl_wfx_connect_ind_body_t connect_indication_body)
-{
- uint8_t * mac = connect_indication_body.mac;
- uint32_t status = connect_indication_body.status;
- switch (status)
- {
- case WFM_STATUS_SUCCESS: {
- SILABS_LOG("STA-Connected\r\n");
- memcpy(&ap_mac.octet[0], mac, MAC_ADDRESS_FIRST_OCTET);
- sl_wfx_context->state =
- static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) | static_cast<int>(SL_WFX_STA_INTERFACE_CONNECTED));
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_CONNECT);
- break;
- }
- case WFM_STATUS_NO_MATCHING_AP: {
- SILABS_LOG("WFX Connection failed, access point not found\r\n");
- break;
- }
- case WFM_STATUS_CONNECTION_ABORTED: {
- SILABS_LOG("WFX Connection aborted\r\n");
- break;
- }
- case WFM_STATUS_CONNECTION_TIMEOUT: {
- SILABS_LOG("WFX Connection timeout\r\n");
- break;
- }
- case WFM_STATUS_CONNECTION_REJECTED_BY_AP: {
- SILABS_LOG("WFX Connection rejected by the access point\r\n");
- break;
- }
- case WFM_STATUS_CONNECTION_AUTH_FAILURE: {
- SILABS_LOG("WFX Connection authentication failure\r\n");
- break;
- }
- default: {
- SILABS_LOG("WF Connection attempt error\r\n");
- }
- }
-
- if ((status != WFM_STATUS_SUCCESS) && retryJoin < MAX_JOIN_RETRIES_COUNT)
- {
- retryJoin += 1;
- retryInProgress = false;
- SILABS_LOG("WFX Retry to connect to network count: %d", retryJoin);
- sl_wfx_context->state =
- static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_STARTED));
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT);
- }
-}
-
-/****************************************************************************
- * @brief
- * Callback for station disconnect
- * @param[in] mac: MAC address of device
- * @param[in] reason: Reason code of disconnection
- *****************************************************************************/
-static void sl_wfx_disconnect_callback(uint8_t * mac, uint16_t reason)
-{
- (void) (mac);
- SILABS_LOG("WFX Disconnected %d\r\n", reason);
- sl_wfx_context->state =
- static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_STA_INTERFACE_CONNECTED));
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_DISCONNECT);
-}
-
-#ifdef SL_WFX_CONFIG_SOFTAP
-/****************************************************************************
- * @brief
- * Callback for AP started
- * @param[in] status: Status of wfx start ap api
- *****************************************************************************/
-static void sl_wfx_start_ap_callback(uint32_t status)
-{
- if (status == AP_START_SUCCESS)
- {
- SILABS_LOG("AP started\r\n");
- sl_wfx_context->state =
- static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) | static_cast<int>(SL_WFX_AP_INTERFACE_UP));
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_START_AP);
- }
- else
- {
- SILABS_LOG("AP start failed\r\n");
- strcpy(event_log, "AP start failed");
- }
-}
-
-/****************************************************************************
- * @brief
- * Callback for AP stopped
- *****************************************************************************/
-static void sl_wfx_stop_ap_callback(void)
-{
- // TODO
- // dhcpserver_clear_stored_mac();
- SILABS_LOG("SoftAP stopped\r\n");
- sl_wfx_context->state =
- static_cast<sl_wfx_state_t>(static_cast<int>(sl_wfx_context->state) & ~static_cast<int>(SL_WFX_AP_INTERFACE_UP));
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_STOP_AP);
-}
-
-/****************************************************************************
- * @brief
- * Callback for client connect to AP
- * @param[in] mac: MAC address of device
- *****************************************************************************/
-static void sl_wfx_client_connected_callback(uint8_t * mac)
-{
- SILABS_LOG("Client connected, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
- // TODO
- SILABS_LOG("Open a web browser and go to http://%d.%d.%d.%d\r\n", ap_ip_addr0, ap_ip_addr1, ap_ip_addr2, ap_ip_addr3);
-}
-
-/****************************************************************************
- * @brief
- * Callback for client rejected from AP
- * @param[in] status: Status of ap rejected
- * @param[in] mac: MAC address of device
- *****************************************************************************/
-static void sl_wfx_ap_client_rejected_callback(uint32_t status, uint8_t * mac)
-{
- SILABS_LOG("Client rejected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2], mac[3],
- mac[4], mac[5]);
-}
-
-/****************************************************************************
- * @brief
- * Callback for AP client disconnect
- * @param[in] status: Status of ap dissconnect
- * @param[in] mac:
- *****************************************************************************/
-static void sl_wfx_ap_client_disconnected_callback(uint32_t status, uint8_t * mac)
-{
- // TODO
- SILABS_LOG("Client disconnected, reason: %d, MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n", (int) status, mac[0], mac[1], mac[2],
- mac[3], mac[4], mac[5]);
-}
-#endif /* SL_WFX_CONFIG_SOFTAP */
-
-/****************************************************************************
- * @brief
- * Callback for generic status received
- * @param[in] farme:
- *****************************************************************************/
-static void sl_wfx_generic_status_callback(sl_wfx_generic_ind_t * frame)
-{
- (void) (frame);
- SILABS_LOG("WFX Generic status received\r\n");
-}
-
-/***************************************************************************
- * @brief
- * WFX events processing task.
- * @param[in] p_arg:
- * ******************************************************************************/
-static void wfx_events_task(void * p_arg)
-{
- TickType_t last_dhcp_poll, now;
- EventBits_t flags;
- (void) p_arg;
-
- sta_netif = wfx_get_netif(SL_WFX_STA_INTERFACE);
- last_dhcp_poll = xTaskGetTickCount();
- while (true)
- {
- flags = xEventGroupWaitBits(sl_wfx_event_group,
- SL_WFX_CONNECT | SL_WFX_DISCONNECT
-#ifdef SL_WFX_CONFIG_SOFTAP
- | SL_WFX_START_AP | SL_WFX_STOP_AP
-#endif /* SL_WFX_CONFIG_SOFTAP */
-#ifdef SL_WFX_CONFIG_SCAN
- | SL_WFX_SCAN_START | SL_WFX_SCAN_COMPLETE
-#endif /* SL_WFX_CONFIG_SCAN */
- | BITS_TO_WAIT,
- pdTRUE, pdFALSE, pdMS_TO_TICKS(250)); /* 250 msec delay converted to ticks */
- if (flags & SL_WFX_RETRY_CONNECT)
- {
- if (!retryInProgress)
- {
- SILABS_LOG("WFX sending the connect command");
- wfx_connect_to_ap();
- retryInProgress = true;
- }
- }
-
- if (wifi_extra & WE_ST_STA_CONN)
- {
- if ((now = xTaskGetTickCount()) > (last_dhcp_poll + pdMS_TO_TICKS(250)))
- {
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
- uint8_t dhcp_state = dhcpclient_poll(&sta_netif);
-
- if ((dhcp_state == DHCP_ADDRESS_ASSIGNED) && !hasNotifiedIPV4)
- {
- wfx_dhcp_got_ipv4((uint32_t) sta_netif->ip_addr.u_addr.ip4.addr);
- hasNotifiedIPV4 = true;
- if (!hasNotifiedWifiConnectivity)
- {
- SILABS_LOG("WIFI: Has Notified Wifi Connectivity");
- wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac);
- hasNotifiedWifiConnectivity = true;
- }
- }
- else if (dhcp_state == DHCP_OFF)
- {
- wfx_ip_changed_notify(IP_STATUS_FAIL);
- hasNotifiedIPV4 = false;
- }
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
- if ((ip6_addr_ispreferred(netif_ip6_addr_state(sta_netif, 0))) && !hasNotifiedIPV6)
- {
- wfx_ipv6_notify(1);
- hasNotifiedIPV6 = true;
- if (!hasNotifiedWifiConnectivity)
- {
- wfx_connected_notify(CONNECTION_STATUS_SUCCESS, &ap_mac);
- hasNotifiedWifiConnectivity = true;
- }
- }
- last_dhcp_poll = now;
- }
- }
-
- if (flags & SL_WFX_CONNECT)
- {
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
- wfx_ip_changed_notify(IP_STATUS_FAIL);
- hasNotifiedIPV4 = false;
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
- wfx_ipv6_notify(GET_IPV6_FAIL);
- hasNotifiedIPV6 = false;
- hasNotifiedWifiConnectivity = false;
- SILABS_LOG("WIFI: Connected to AP");
- wifi_extra |= WE_ST_STA_CONN;
- wfx_lwip_set_sta_link_up();
-#ifdef SLEEP_ENABLED
- if (!(wfx_get_wifi_state() & SL_WFX_AP_INTERFACE_UP))
- {
- // Enable the power save
- sl_wfx_set_power_mode(WFM_PM_MODE_PS, WFM_PM_POLL_UAPSD, BEACON_1);
- sl_wfx_enable_device_power_save();
- }
-#endif // SLEEP_ENABLED
- }
-
- if (flags & SL_WFX_DISCONNECT)
- {
-
-#if (CHIP_DEVICE_CONFIG_ENABLE_IPV4)
- wfx_ip_changed_notify(IP_STATUS_FAIL);
- hasNotifiedIPV4 = false;
-#endif // CHIP_DEVICE_CONFIG_ENABLE_IPV4
- wfx_ipv6_notify(GET_IPV6_FAIL);
- hasNotifiedIPV6 = false;
- hasNotifiedWifiConnectivity = false;
- wifi_extra &= ~WE_ST_STA_CONN;
- wfx_lwip_set_sta_link_down();
- }
-
-#ifdef SL_WFX_CONFIG_SCAN
- if (flags & SL_WFX_SCAN_START)
- {
- /*
- * Start the Scan
- */
- sl_wfx_ssid_def_t ssid, *sp;
- uint16_t num_ssid, slen;
- if (scan_ssid)
- {
- memset(&ssid, 0, sizeof(ssid));
- slen = strlen(scan_ssid);
- memcpy(&ssid.ssid[0], scan_ssid, slen);
- ssid.ssid_length = slen;
- num_ssid = 1;
- sp = &ssid;
- }
- else
- {
- num_ssid = 0;
- sp = (sl_wfx_ssid_def_t *) 0;
- }
-
- SILABS_LOG("WIFI Scan Parameter set to Active channel time %d, Passive "
- "Channel Time: %d, Number of prob: %d",
- ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
- (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
- (void) sl_wfx_send_scan_command(WFM_SCAN_MODE_ACTIVE, CHANNEL_LIST, /* Channel list */
- CHANNEL_COUNT, /* Scan all chans */
- sp, num_ssid, IE_DATA, /* IE we're looking for */
- IE_DATA_LENGTH, BSSID_SCAN);
- }
- if (flags & SL_WFX_SCAN_COMPLETE)
- {
- struct scan_result_holder *hp, *next;
-
- SILABS_LOG("WIFI: Return %d scan results", scan_count);
- for (hp = scan_save; hp; hp = next)
- {
- next = hp->next;
- (*scan_cb)(&hp->scan);
- vPortFree(hp);
- }
- (*scan_cb)((wfx_wifi_scan_result *) 0);
- scan_save = (struct scan_result_holder *) 0;
- scan_count = 0;
- if (scan_ssid)
- {
- vPortFree(scan_ssid);
- scan_ssid = (char *) 0;
- }
- /* Terminate scan */
- scan_cb = 0;
- }
-#endif /* SL_WFX_CONFIG_SCAN */
- }
-}
-
-/****************************************************************************
- * @brief
- * Initialize the WF200 used by the two interfaces
- *****************************************************************************/
-static sl_status_t wfx_init(void)
-{
- /* Initialize the WF200 used by the two interfaces */
- wfx_events_task_start();
- sl_status_t status = sl_wfx_init(&wifiContext);
- SILABS_LOG("FMAC Driver version %s", FMAC_DRIVER_VERSION_STRING);
- switch (status)
- {
- case SL_STATUS_OK:
- SILABS_LOG("WF200 FW ver:%d.%d.%d [MAC %02x:%02x:%02x-%02x:%02x:%02x]", wifiContext.firmware_major,
- wifiContext.firmware_minor, wifiContext.firmware_build, wifiContext.mac_addr_0.octet[0],
- wifiContext.mac_addr_0.octet[1], wifiContext.mac_addr_0.octet[2], wifiContext.mac_addr_0.octet[3],
- wifiContext.mac_addr_0.octet[4], wifiContext.mac_addr_0.octet[5]);
- SILABS_LOG("WF200 Init OK");
-
- if (wifiContext.state == SL_WFX_STA_INTERFACE_CONNECTED)
- {
- sl_wfx_send_disconnect_command();
- }
-
- break;
- case SL_STATUS_WIFI_INVALID_KEY:
- SILABS_LOG("*ERR*WF200: F/W keyset invalid");
- break;
- case SL_STATUS_WIFI_FIRMWARE_DOWNLOAD_TIMEOUT:
- SILABS_LOG("*ERR*WF200: F/W download timo");
- break;
- case SL_STATUS_TIMEOUT:
- SILABS_LOG("*ERR*WF200: Poll for value timo");
- break;
- case SL_STATUS_FAIL:
- SILABS_LOG("*ERR*WF200: Error");
- break;
- default:
- SILABS_LOG("*ERR*WF200: Unknown");
- }
-
- return status;
-}
-
-/*****************************************************************************
- * @brief
- * tcp ip, wfx and lwip stack and start dhcp client.
- * @return
- * sl_status_t Shows init succes or error.
- ******************************************************************************/
-static void wfx_wifi_hw_start(void)
-{
- sl_status_t status;
-
- if (wifi_extra & WE_ST_HW_STARTED)
- return;
- SILABS_LOG("STARTING WF200\n");
- wifi_extra |= WE_ST_HW_STARTED;
-
- sl_wfx_host_gpio_init();
- if ((status = wfx_init()) == SL_STATUS_OK)
- {
- /* Initialize the LwIP stack */
- SILABS_LOG("WF200:Start LWIP");
- wfx_lwip_start();
- wifiContext.state = SL_WFX_STARTED; /* Really this is a bit mask */
- SILABS_LOG("WF200:ready..");
- }
- else
- {
- SILABS_LOG("*ERR*WF200:init failed");
- }
-}
-
-/***********************************************************************
- * @brief
- * Get AP info
- * @param[in] ap: access point information
- * @return returns -1
- **************************************************************************/
-int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap)
-{
- int32_t signal_strength;
- SILABS_LOG("WIFI:SSID:: %s", &ap_info.ssid[0]);
- memcpy(ap->ssid, ap_info.ssid, sizeof(ap_info.ssid));
- SILABS_LOG("WIFI:Mac addr:: %02x:%02x:%02x:%02x:%02x:%02x", ap_info.bssid[0], ap_info.bssid[1], ap_info.bssid[2],
- ap_info.bssid[3], ap_info.bssid[4], ap_info.bssid[5]);
- memcpy(ap->bssid, ap_info.bssid, sizeof(ap_info.bssid));
- ap->security = ap_info.security;
- SILABS_LOG("WIFI:security:: %d", ap->security);
- ap->chan = ap_info.chan;
- SILABS_LOG("WIFI:Channel:: to %d", ap->chan);
-
- sl_status_t status = sl_wfx_get_signal_strength((uint32_t *) &signal_strength);
-
- if (status == SL_STATUS_OK)
- {
- SILABS_LOG("status SL_STATUS_OK & signal_strength:: %d", signal_strength);
- ap->rssi = (signal_strength - 220) / 2;
- }
- return status;
-}
-
-/************************************************************************
- * @brief
- * Get AP extra info
- * @param[in] extra_info: access point extra information
- * @return returns -1
- **************************************************************************/
-int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info)
-{
- int32_t status;
- status = get_all_counters();
- if (status != SL_STATUS_OK)
- {
- SILABS_LOG("Failed to get the couters");
- }
- else
- {
- extra_info->beacon_lost_count = counters->body.count_miss_beacon;
- extra_info->beacon_rx_count = counters->body.count_rx_beacon;
- extra_info->mcast_rx_count = counters->body.count_rx_multicast_frames;
- extra_info->mcast_tx_count = counters->body.count_tx_multicast_frames;
- extra_info->ucast_rx_count = counters->body.count_rx_packets;
- extra_info->ucast_tx_count = counters->body.count_tx_packets;
- extra_info->overrun_count = gOverrunCount;
- }
- return status;
-}
-
-sl_status_t get_all_counters(void)
-{
- sl_status_t result;
- uint8_t command_id = 0x05;
- uint16_t mib_id = 0x2035;
- sl_wfx_mib_req_t * request = NULL;
- uint32_t request_length = SL_WFX_ROUND_UP_EVEN(sizeof(sl_wfx_header_mib_t) + sizeof(sl_wfx_mib_req_body_t));
-
- result =
- sl_wfx_allocate_command_buffer((sl_wfx_generic_message_t **) &request, command_id, SL_WFX_CONTROL_BUFFER, request_length);
-
- if (request == NULL)
- {
- }
-
- request->body.mib_id = mib_id;
- request->header.interface = 0x2;
- request->header.encrypted = 0x0;
-
- result = sl_wfx_send_request(command_id, (sl_wfx_generic_message_t *) request, request_length);
- SL_WFX_ERROR_CHECK(result);
-
- result = sl_wfx_host_wait_for_confirmation(command_id, SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS, (void **) &counters);
- SL_WFX_ERROR_CHECK(result);
-
- SILABS_LOG("%-24s %12s \r\n", "", "Debug Counters Content");
- SILABS_LOG("%-24s %lu\r\n", "rcpi", (unsigned long) counters->body.rcpi);
- PUT_COUNTER(plcp_errors);
- PUT_COUNTER(fcs_errors);
- PUT_COUNTER(tx_packets);
- PUT_COUNTER(rx_packets);
- PUT_COUNTER(rx_packet_errors);
- PUT_COUNTER(rx_decryption_failures);
- PUT_COUNTER(rx_mic_failures);
- PUT_COUNTER(rx_no_key_failures);
- PUT_COUNTER(tx_multicast_frames);
- PUT_COUNTER(tx_frames_success);
- PUT_COUNTER(tx_frame_failures);
- PUT_COUNTER(tx_frames_retried);
- PUT_COUNTER(tx_frames_multi_retried);
- PUT_COUNTER(rx_frame_duplicates);
- PUT_COUNTER(rts_success);
- PUT_COUNTER(rts_failures);
- PUT_COUNTER(ack_failures);
- PUT_COUNTER(rx_multicast_frames);
- PUT_COUNTER(rx_frames_success);
- PUT_COUNTER(rx_cmacicv_errors);
- PUT_COUNTER(rx_cmac_replays);
- PUT_COUNTER(rx_mgmt_ccmp_replays);
- PUT_COUNTER(rx_bipmic_errors);
- PUT_COUNTER(rx_beacon);
- PUT_COUNTER(miss_beacon);
-
-error_handler:
-
- if (result == SL_STATUS_TIMEOUT)
- {
- if (sl_wfx_context->used_buffers > 0)
- {
- sl_wfx_context->used_buffers--;
- }
- }
- if (request != NULL)
- {
- sl_wfx_free_command_buffer((sl_wfx_generic_message_t *) request, command_id, SL_WFX_CONTROL_BUFFER);
- }
-
- return result;
-}
-
-/************************************************************************
- * @brief
- * reset the count
- * @return returns -1
- **************************************************************************/
-int32_t wfx_reset_counts()
-{
- /* TODO */
- return -1;
-}
-
-/*************************************************************************
- * @brief
- * I think that this is getting called before FreeRTOS threads are ready
- * @return returns SL_STATUS_OK
- **************************************************************************/
-sl_status_t wfx_wifi_start(void)
-{
- if (wifi_extra & WE_ST_STARTED)
- {
- SILABS_LOG("WIFI: Already started");
- return SL_STATUS_OK;
- }
- wifi_extra |= WE_ST_STARTED;
- wfx_soft_init();
- wfx_wifi_hw_start();
-
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @brief
- * get the wifi state
- * @return returns wificonetext state
- *****************************************************************************/
-sl_wfx_state_t wfx_get_wifi_state(void)
-{
- return wifiContext.state;
-}
-
-/****************************************************************************
- * @brief
- * getnetif using interface
- * @param[in] interface:
- * @return returns selectedNetif
- *****************************************************************************/
-struct netif * wfx_GetNetif(sl_wfx_interface_t interface)
-{
- struct netif * SelectedNetif = NULL;
- if (interface == SL_WFX_STA_INTERFACE)
- {
- SelectedNetif = sta_netif;
- }
-#ifdef SL_WFX_CONFIG_SOFTAP
- else if (interface == SL_WFX_SOFTAP_INTERFACE)
- {
- // no ap currently
- }
-#endif
- return SelectedNetif;
-}
-
-/****************************************************************************
- * @brief
- * get the wifi mac address using interface
- * @param[in] interface:
- * @return returns wificontext.mac_addr_o if successful,
- * wificontext.mac_addr_1 otherwise
- *****************************************************************************/
-sl_wfx_mac_address_t wfx_get_wifi_mac_addr(sl_wfx_interface_t interface)
-{
- // return Mac address used by WFX SL_WFX_STA_INTERFACE or SL_WFX_SOFTAP_INTERFACE,
- return (interface == SL_WFX_STA_INTERFACE) ? wifiContext.mac_addr_0 : wifiContext.mac_addr_1;
-}
-
-/****************************************************************************
- * @brief
- * set the wifi provision
- * @param[in] wifiConfig: configuration of wifi
- *****************************************************************************/
-void wfx_set_wifi_provision(wfx_wifi_provision_t * wifiConfig)
-{
- memcpy(wifi_provision.ssid, wifiConfig->ssid, sizeof(wifiConfig->ssid));
- memcpy(wifi_provision.passkey, wifiConfig->passkey, sizeof(wifiConfig->passkey));
- SILABS_LOG("WIFI: Provision SSID=%s", &wifi_provision.ssid[0]);
-
- /* Not very good - To be improved */
- switch (wifiConfig->security)
- {
- case WFX_SEC_WPA:
- wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
- break;
- case WFX_SEC_WPA3:
- wifi_provision.security = WFM_SECURITY_MODE_WPA3_SAE;
- break;
- case WFX_SEC_WPA2:
- wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
- break;
- case WFX_SEC_WPA_WPA2_MIXED:
- wifi_provision.security = static_cast<uint8_t>(sl_wfx_security_mode_e::WFM_SECURITY_MODE_WPA2_WPA1_PSK);
- break;
- default:
- wifi_provision.security = WFM_SECURITY_MODE_WPA2_PSK;
- break;
- }
-}
-
-/****************************************************************************
- * @brief
- * get the wifi provision
- * @param[in] wifiConfig: configuration of wifi
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-bool wfx_get_wifi_provision(wfx_wifi_provision_t * wifiConfig)
-{
- if (wifiConfig == NULL)
- {
- return false;
- }
- memcpy(wifiConfig, &wifi_provision, sizeof(wfx_wifi_provision_t));
-
- return true;
-}
-
-/****************************************************************************
- * @brief
- * clear the wifi provision
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-void wfx_clear_wifi_provision(void)
-{
- memset(&wifi_provision, 0, sizeof(wifi_provision));
-}
-
-/****************************************************************************
- * @brief
- * driver STA provisioned
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-bool wfx_is_sta_provisioned(void)
-{
- return (wifi_provision.ssid[0]) ? true : false;
-}
-
-/****************************************************************************
- * @fn sl_status_t wfx_connect_to_ap(void)
- * @brief
- * driver connect to ap
- * @return returns SL_STATUS_NOT_AVAILABLE
- *****************************************************************************/
-sl_status_t wfx_connect_to_ap(void)
-{
- sl_status_t result;
-
- if (wifi_provision.ssid[0] == 0)
- {
- return SL_STATUS_NOT_AVAILABLE;
- }
- SILABS_LOG("WIFI:JOIN to %s", &wifi_provision.ssid[0]);
-
- SILABS_LOG("WIFI Scan Parameter set to Active channel time %d, Passive Channel "
- "Time: %d, Number of prob: %d",
- ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
- (void) sl_wfx_set_scan_parameters(ACTIVE_CHANNEL_TIME, PASSIVE_CHANNEL_TIME, NUM_PROBE_REQUEST);
- result =
- sl_wfx_send_join_command((uint8_t *) wifi_provision.ssid, strlen(wifi_provision.ssid), NULL, CHANNEL_0,
- static_cast<sl_wfx_security_mode_t>(wifi_provision.security), PREVENT_ROAMING, DISABLE_PMF_MODE,
- (uint8_t *) wifi_provision.passkey, strlen(wifi_provision.passkey), NULL, IE_DATA_LENGTH);
-
- return result;
-}
-
-/****************************************************************************
- * @brief
- * get the wifi mac addresss
- * @param[in] interface:
- * @param[in] addr : address
- *****************************************************************************/
-void wfx_get_wifi_mac_addr(sl_wfx_interface_t interface, sl_wfx_mac_address_t * addr)
-{
- sl_wfx_mac_address_t * mac;
-
-#ifdef SL_WFX_CONFIG_SOFTAP
- mac = (interface == SL_WFX_SOFTAP_INTERFACE) ? &wifiContext.mac_addr_1 : &wifiContext.mac_addr_0;
-#else
- mac = &wifiContext.mac_addr_0;
-#endif
- *addr = *mac;
- SILABS_LOG("WLAN:Get WiFi Mac addr %02x:%02x:%02x:%02x:%02x:%02x", mac->octet[0], mac->octet[1], mac->octet[2], mac->octet[3],
- mac->octet[4], mac->octet[5]);
- memcpy(&ap_info.bssid[0], &mac->octet[0], 6);
-}
-
-/****************************************************************************
- * @brief
- * function called when driver have ipv4 address
- * @param[in] which_if:
- * @return returns false if successful,
- * true otherwise
- *****************************************************************************/
-bool wfx_have_ipv4_addr(sl_wfx_interface_t which_if)
-{
- if (which_if == SL_WFX_STA_INTERFACE)
- {
- return (sta_ip == STA_IP_FAIL) ? false : true;
- }
- else
- {
- return false; /* TODO */
- }
-}
-
-/****************************************************************************
- * @brief
- * function called when driver have ipv6 address
- * @param[in] which_if:
- * @return returns false if successful,
- * true otherwise
- *****************************************************************************/
-bool wfx_have_ipv6_addr(sl_wfx_interface_t which_if)
-{
- SILABS_LOG("%s: started.", __func__);
- bool status = false;
- if (which_if == SL_WFX_STA_INTERFACE)
- {
- status = wfx_is_sta_connected();
- }
- else
- {
- status = false; /* TODO */
- }
- SILABS_LOG("%s: status: %d", __func__, status);
- return status;
-}
-
-/****************************************************************************
- * @brief
- * Disconnect station mode from connected AP
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t wfx_sta_discon(void)
-{
- SILABS_LOG("STA-Disconnecting");
- int32_t status = sl_wfx_send_disconnect_command();
- wifi_extra &= ~WE_ST_STA_CONN;
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_RETRY_CONNECT);
- return status;
-}
-
-/****************************************************************************
- * @brief
- * enable the STA mode
- * @return returns true
- *****************************************************************************/
-bool wfx_is_sta_mode_enabled(void)
-{
- return true; /* It always is */
-}
-
-/****************************************************************************
- * @brief
- * fuction called when driver is STA connected
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-bool wfx_is_sta_connected(void)
-{
- bool val;
-
- val = (wifi_extra & WE_ST_STA_CONN) ? true : false;
-
- SILABS_LOG("WLAN: STA %s connected", (val ? "IS" : "NOT"));
-
- return val;
-}
-
-/****************************************************************************
- * @brief
- * It is automatically done when lwip link up
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-void wfx_setup_ip6_link_local(sl_wfx_interface_t whichif)
-{
- SILABS_LOG("Setup-IP6: TODO"); /* It is automatically done when lwip link up */
-}
-
-/****************************************************************************
- * @brief
- * get the wifi mode
- * @return returns WIFI_MODE_NULL if successful,
- * WIFI_MODE_STA otherwise
- *****************************************************************************/
-wifi_mode_t wfx_get_wifi_mode()
-{
- if (wifiContext.state & SL_WFX_STARTED)
- return WIFI_MODE_STA;
- return WIFI_MODE_NULL;
-}
-
-/*****************************************************************************
- * @brief
- * This is called from the context of AppTask
- * For WF200 - Start WIFI here
- * @return returns true if successful,
- * false otherwise
- ******************************************************************************/
-bool wfx_hw_ready(void)
-{
- return (wifiContext.state & SL_WFX_STARTED) ? true : false;
-}
-
-#if CHIP_DEVICE_CONFIG_ENABLE_IPV4
-/*****************************************************************************
- * @brief
- * function called when dhcp got ipv4
- * @param[in] ip : internet protocol
- ******************************************************************************/
-void wfx_dhcp_got_ipv4(uint32_t ip)
-{
- /* Acquire the new IP address
- */
- sta_ip = ip;
- wfx_ip_changed_notify(IP_STATUS_SUCCESS);
-}
-#endif /* CHIP_DEVICE_CONFIG_ENABLE_IPV4 */
-
-/*****************************************************************************
- * @brief
- * function called from connectivityManager
- ******************************************************************************/
-void wfx_enable_sta_mode(void)
-{
- /* Nothing to do - default is that it is
- place holder */
-}
-
-/****************************************************************************
- * @brief
- * driver scan start
- * @param[in] callback: Callback from the wifi scan results
- * @return returns true if successful,
- * false otherwise
- *****************************************************************************/
-#ifdef SL_WFX_CONFIG_SCAN
-bool wfx_start_scan(char * ssid, void (*callback)(wfx_wifi_scan_result_t *))
-{
- int sz;
-
- if (scan_cb)
- return false; /* Already in progress */
- if (ssid)
- {
- sz = strlen(ssid);
- if ((scan_ssid = (char *) pvPortMalloc(sz + 1)) == (char *) 0)
- {
- return false;
- }
- strcpy(scan_ssid, ssid);
- }
- scan_cb = callback;
- xEventGroupSetBits(sl_wfx_event_group, SL_WFX_SCAN_START);
-
- return true;
-}
-
-/****************************************************************************
- * @brief
- * driver scan cancelation
- *****************************************************************************/
-void wfx_cancel_scan(void)
-{
- struct scan_result_holder *hp, *next;
- /* Not possible */
- if (!scan_cb)
- {
- return;
- }
- sl_wfx_send_stop_scan_command();
- for (hp = scan_save; hp; hp = next)
- {
- next = hp->next;
- vPortFree(hp);
- }
- scan_save = (struct scan_result_holder *) 0;
- scan_count = 0;
- if (scan_ssid)
- {
- vPortFree(scan_ssid);
- scan_ssid = (char *) 0;
- }
- scan_cb = 0;
-}
-#endif /* SL_WFX_CONFIG_SCAN */
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h
deleted file mode 100644
index 96ab968..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_board.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _SL_WFX_BOARD_H_
-#define _SL_WFX_BOARD_H_
-/*
- * Pull in the right board PINS
- */
-#if defined(EFR32MG12_BRD4161A) || defined(BRD4161A) || defined(EFR32MG12_BRD4162A) || defined(BRD4162A) || \
- defined(EFR32MG12_BRD4163A) || defined(BRD4163A) || defined(EFR32MG12_BRD4164A) || defined(BRD4164A) || \
- defined(EFR32MG12_BRD4170A) || defined(BRD4170A)
-#include "brd4161a.h"
-#elif defined(EFR32MG24_BRD4186C) || defined(BRD4186C) || defined(EFR32MG24_BRD4186A) || defined(BRD4186A)
-#include "brd4186c.h"
-#elif defined(EFR32MG24_BRD4187C) || defined(BRD4187C) || defined(EFR32MG24_BRD4187A) || defined(BRD4187A)
-#include "brd4187c.h"
-#else
-#error "Need SPI Pins"
-#endif /* EFR32MG12_BRD4161A */
-#endif /* _SL_WFX_BOARD_H_ */
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h
deleted file mode 100644
index deb468d..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_configuration.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-// SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS> Timeout period in milliseconds<250-10000>
-// Default: 5000
-// Timeout period in milliseconds for requests.
-#define SL_WFX_DEFAULT_REQUEST_TIMEOUT_MS (5000)
-
-// <h>WFx Secure Link configuration
-
-// SL_WFX_SLK_CURVE25519> Use crypto curves
-// Default: 1
-// If this option is enabled ECDH crypto is used, KDF otherwise.
-#define SL_WFX_SLK_CURVE25519 (1)
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c
deleted file mode 100644
index ddad3ec..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_crypto.c
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifdef SL_WFX_USE_SECURE_LINK
-
-/* Includes */
-
-#include "sl_wfx.h"
-#include <stdio.h>
-
-#include "mbedtls/ccm.h"
-#include "mbedtls/ctr_drbg.h"
-#include "mbedtls/ecdh.h"
-#include "mbedtls/entropy.h"
-#include "mbedtls/md.h"
-#include "mbedtls/sha256.h"
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "task.h"
-
-// Secure link MAC key location for WGM160P (in DI page in flash)
-#ifdef EFM32GG11B820F2048GM64 // WGM160PX22KGA2
-#define SL_WFX_FCCC_BASE_ADDR ((void *) 0x0fe08000ul)
-#define SL_WFX_FCCC_DI_OFFSET 0x1B0ul
-#define SL_WFX_FCCC_DI_ADDR ((void *) (SL_WFX_FCCC_BASE_ADDR + SL_WFX_FCCC_DI_OFFSET))
-#define SL_WFX_SECURE_LINK_MAC_KEY_LOCATION ((void *) (SL_WFX_FCCC_BASE_ADDR + 0x3D0))
-#endif
-/******************************************************
- * Macros
- ******************************************************/
-#define MAC_KEY_FAIL_BYTE 0XFF
-#define KEY_DIGEST_SIZE 92
-#define MEMCMP_FAIL 0
-#define MPI_SET 1
-#define SUCCESS_STATUS_WIFI_SECURE_LINK_EXCHANGE 0
-#define SHA224_0 0
-#define HMAC_SIZE 92
-#define MEMSET_LEN 1
-#define LABLE_LEN 24
-#define ADDRESS_LENGTH 0
-#define CCM_STATUS_SUCCESS 0
-/******************************************************
- * Constants
- ******************************************************/
-
-/* Semaphore to signal wfx driver available */
-extern TaskHandle_t wfx_securelink_task;
-extern SemaphoreHandle_t wfx_securelink_rx_mutex;
-
-/******************************************************
- * Enumerations
- ******************************************************/
-
-/******************************************************
- * Type Definitions
- ******************************************************/
-
-/******************************************************
- * Structures
- ******************************************************/
-
-/******************************************************
- * Function Declarations
- ******************************************************/
-
-static inline void reverse_bytes(uint8_t * src, uint8_t length);
-
-/******************************************************
- * Variable Definitions
- ******************************************************/
-
-#if SL_WFX_SLK_CURVE25519
-static mbedtls_ecdh_context mbedtls_host_context;
-static mbedtls_ctr_drbg_context host_drbg_context;
-#endif
-static mbedtls_entropy_context entropy;
-uint8_t temp_key_location[SL_WFX_HOST_PUB_KEY_MAC_SIZE];
-#ifdef EFM32GG11B820F2048GM64 // WGM160PX22KGA2
-static const uint8_t * const secure_link_mac_key = (uint8_t *) SL_WFX_SECURE_LINK_MAC_KEY_LOCATION;
-#else
-static const uint8_t secure_link_mac_key[SL_WFX_SECURE_LINK_MAC_KEY_LENGTH] = { 0x2B, 0x49, 0xFD, 0x66, 0xCB, 0x74, 0x6D, 0x6B,
- 0x4F, 0xDC, 0xC3, 0x79, 0x4E, 0xC5, 0x9A, 0x86,
- 0xE5, 0x48, 0x2A, 0x41, 0x22, 0x87, 0x8B, 0x12,
- 0x1A, 0x7C, 0x3E, 0xEF, 0xB7, 0x04, 0x9E, 0xB3 };
-#endif
-/******************************************************
- * Function Definitions
- ******************************************************/
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_get_secure_link_mac_key(uint8_t *sl_mac_key)
- * @brief
- * Get secure link mac key
- * @param[in] sl_mac_key:
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_secure_link_mac_key(uint8_t * sl_mac_key)
-{
- sl_status_t result = SL_STATUS_WIFI_SECURE_LINK_MAC_KEY_ERROR;
-
- memcpy(sl_mac_key, secure_link_mac_key, SL_WFX_SECURE_LINK_MAC_KEY_LENGTH);
-
- for (uint8_t index = 0; index < SL_WFX_SECURE_LINK_MAC_KEY_LENGTH; ++index)
- {
- // Assuming 0xFF... when not written
- if (sl_mac_key[index] != MAC_KEY_FAIL_BYTE)
- {
- result = SL_STATUS_OK;
- break;
- }
- }
-
- return result;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_compute_pub_key(sl_wfx_securelink_exchange_pub_keys_req_body_t *request,
- const uint8_t *sl_mac_key)
- * @brief
- * compute host public key
- * @param[in] request :
- * @param[in] sl_mac_key :
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_compute_pub_key(sl_wfx_securelink_exchange_pub_keys_req_body_t * request, const uint8_t * sl_mac_key)
-{
- sl_status_t status = SL_STATUS_OK;
-
-#if SL_WFX_SLK_CURVE25519
- const char identifier[] = "ecdh";
-
- mbedtls_ecdh_init(&mbedtls_host_context);
- mbedtls_ctr_drbg_init(&host_drbg_context);
- mbedtls_entropy_init(&entropy);
- status = mbedtls_ctr_drbg_seed(&host_drbg_context, mbedtls_entropy_func, &entropy, (const unsigned char *) identifier,
- sizeof(identifier));
- status += mbedtls_ecp_group_load(&mbedtls_host_context.grp, MBEDTLS_ECP_DP_CURVE25519);
- status += mbedtls_ecdh_gen_public(&mbedtls_host_context.grp, &mbedtls_host_context.d, &mbedtls_host_context.Q,
- mbedtls_ctr_drbg_random, &host_drbg_context);
- status += mbedtls_mpi_write_binary(&mbedtls_host_context.Q.X, request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
-#else
- mbedtls_entropy_init(&entropy);
- status = mbedtls_entropy_func(&entropy, request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
-#endif
- reverse_bytes(request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE);
- SL_WFX_ERROR_CHECK(status);
-
- // Generate SHA512 digest of public key
- status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), sl_mac_key, SL_WFX_HOST_PUB_KEY_SIZE,
- request->host_pub_key, SL_WFX_HOST_PUB_KEY_SIZE, request->host_pub_key_mac);
- SL_WFX_ERROR_CHECK(status);
-
-error_handler:
- if (status != SL_STATUS_OK)
- {
- return SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
- }
- return status;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_verify_pub_key(sl_wfx_securelink_exchange_pub_keys_ind_t *response_packet,
- const uint8_t *sl_mac_key,
- uint8_t *sl_host_pub_key)
- * @brief
- * verify host public key
- * @param[in] response_packet:
- * @param[in] sl_mac_key:
- * @param[in] sl_host_pub_key:
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_verify_pub_key(sl_wfx_securelink_exchange_pub_keys_ind_t * response_packet, const uint8_t * sl_mac_key,
- uint8_t * sl_host_pub_key)
-{
- sl_status_t status = SL_STATUS_OK;
- uint8_t shared_key_digest[KEY_DIGEST_SIZE];
-
- if (xSemaphoreTake(wfx_securelink_rx_mutex, portMAX_DELAY) != pdTRUE)
- {
- return SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
- }
-
- // Compute the Hash and verify the public key/hashing
- status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA512), sl_mac_key, SL_WFX_NCP_PUB_KEY_SIZE,
- response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE, temp_key_location);
- SL_WFX_ERROR_CHECK(status);
-
- // Calculate session key if public key/SHA512 digest matches
- if (memcmp(temp_key_location, response_packet->body.ncp_pub_key_mac, SL_WFX_HOST_PUB_KEY_MAC_SIZE) != MEMCMP_FAIL)
- {
- status = SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
- goto error_handler;
- }
-
-#if SL_WFX_SLK_CURVE25519
- SL_WFX_UNUSED_PARAMETER(sl_host_pub_key);
-
- mbedtls_mpi_lset(&mbedtls_host_context.Qp.Z, MPI_SET);
-
- // Read Ineo public key
- reverse_bytes(response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
- mbedtls_mpi_read_binary(&mbedtls_host_context.Qp.X, response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
-
- // Calculate shared secret
- if (mbedtls_ecdh_compute_shared(&mbedtls_host_context.grp, &mbedtls_host_context.z, &mbedtls_host_context.Qp,
- &mbedtls_host_context.d, mbedtls_ctr_drbg_random,
- &host_drbg_context) != SUCCESS_STATUS_WIFI_SECURE_LINK_EXCHANGE)
- {
- status = SL_STATUS_WIFI_SECURE_LINK_EXCHANGE_FAILED;
- goto error_handler;
- }
-
- // Generate session key
- mbedtls_mpi_write_binary(&mbedtls_host_context.z, temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE);
- reverse_bytes(temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE);
- mbedtls_sha256(temp_key_location, SL_WFX_HOST_PUB_KEY_SIZE, shared_key_digest, SHA224_0);
-#else
- uint8_t hmac_input[HMAC_SIZE] = { 0 };
- char label[LABLE_LEN] = "SecureLink!KeyDerivation";
-
- memset((uint16_t *) &hmac_input[0], (uint16_t) sl_wfx_htole16(1), MEMSET_LEN);
- memcpy((uint8_t *) &hmac_input[2], (uint8_t *) label, LABLE_LEN);
- memcpy((uint8_t *) &hmac_input[26], sl_host_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
- memcpy((uint8_t *) &hmac_input[58], (uint8_t *) response_packet->body.ncp_pub_key, SL_WFX_NCP_PUB_KEY_SIZE);
- memset((uint16_t *) &hmac_input[90], (uint16_t) sl_wfx_htole16(128), 1);
-
- // Generate SHA256 digest of hmac_input
- status = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256), sl_mac_key, SL_WFX_HOST_PUB_KEY_SIZE,
- (uint8_t *) hmac_input, HMAC_SIZE, shared_key_digest);
-#endif
-
- memcpy(sl_wfx_context->secure_link_session_key, shared_key_digest,
- SL_WFX_SECURE_LINK_SESSION_KEY_LENGTH); // Use the lower 16 bytes of the sha256
- sl_wfx_context->secure_link_nonce.hp_packet_count = 0;
- sl_wfx_context->secure_link_nonce.rx_packet_count = 0;
- sl_wfx_context->secure_link_nonce.tx_packet_count = 0;
-
-error_handler:
- if (xSemaphoreGive(wfx_securelink_rx_mutex) != pdTRUE)
- {
- printf("ERROR: sl_wfx_securelink_rx_mutex. unable to post.\n");
- }
- return status;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_free_crypto_context(void)
- * @brief
- * Free host crypto context
- * @param[in] None
- * @return returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_free_crypto_context(void)
-{
-#if SL_WFX_SLK_CURVE25519
- mbedtls_ecdh_free(&mbedtls_host_context);
- mbedtls_ctr_drbg_free(&host_drbg_context);
-#endif
- mbedtls_entropy_free(&entropy);
-
- return SL_STATUS_OK;
-}
-
-/********************************************************************************
- * @fn sl_status_t sl_wfx_host_decode_secure_link_data(uint8_t *buffer, uint32_t length, uint8_t *session_key)
- * @brief
- * Decode receive data
- * Length excludes size of CCM tag and secure link header
- * @param[in] buffer:
- * @param[in] length:
- * @param[in] session_key:
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- ********************************************************************************/
-sl_status_t sl_wfx_host_decode_secure_link_data(uint8_t * buffer, uint32_t length, uint8_t * session_key)
-{
- mbedtls_ccm_context ccm_context;
- sl_status_t status = SL_STATUS_SECURITY_DECRYPT_ERROR;
- int crypto_status;
- sl_wfx_nonce_t nonce = { 0, 0, 0 };
-
- if (xSemaphoreTake(wfx_securelink_rx_mutex, portMAX_DELAY) != pdTRUE)
- {
- return SL_STATUS_FAIL;
- }
-
- // Nonce for decryption should have TX and HP counters 0, only use RX counter
- nonce.rx_packet_count = sl_wfx_context->secure_link_nonce.rx_packet_count;
-
- // Init context
- mbedtls_ccm_init(&ccm_context);
-
- // Set the crypto key
- crypto_status = mbedtls_ccm_setkey(&ccm_context, MBEDTLS_CIPHER_ID_AES, session_key, SL_WFX_SECURE_LINK_SESSION_KEY_BIT_COUNT);
- SL_WFX_ERROR_CHECK(crypto_status);
-
- // Decrypt the data
- if (!mbedtls_ccm_auth_decrypt(&ccm_context, length, (uint8_t *) &nonce, SL_WFX_SECURE_LINK_NONCE_SIZE_BYTES, NULL,
- ADDRESS_LENGTH, (uint8_t *) buffer, (uint8_t *) buffer, (uint8_t *) buffer + length,
- SL_WFX_SECURE_LINK_CCM_TAG_SIZE))
- {
- status = SL_STATUS_OK;
- }
-
-error_handler:
- mbedtls_ccm_free(&ccm_context);
- if (xSemaphoreGive(wfx_securelink_rx_mutex) != pdTRUE)
- {
- printf("ERROR: sl_wfx_securelink_rx_mutex. unable to post.\n");
- }
- return status;
-}
-
-/*********************************************************************
- * @fn sl_status_t sl_wfx_host_encode_secure_link_data(sl_wfx_generic_message_t *buffer,
- uint32_t data_length,
- uint8_t *session_key,
- uint8_t *nonce)
- * @brief
- * Encode transmit data
- * Length excludes size of CCM tag and secure link header
- * @param[in] buffer:
- * @param[in] data_length:
- * @param[in] session_key:
- * @param[in] nonce:
- * @return returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
-*************************************************************************/
-sl_status_t sl_wfx_host_encode_secure_link_data(sl_wfx_generic_message_t * buffer, uint32_t data_length, uint8_t * session_key,
- uint8_t * nonce)
-{
- mbedtls_ccm_context ccm_context;
- sl_status_t status = SL_STATUS_FAIL;
-
- mbedtls_ccm_init(&ccm_context);
- if (mbedtls_ccm_setkey(&ccm_context, MBEDTLS_CIPHER_ID_AES, session_key, SL_WFX_SECURE_LINK_SESSION_KEY_BIT_COUNT) ==
- CCM_STATUS_SUCCESS)
- {
- mbedtls_ccm_encrypt_and_tag(&ccm_context, data_length, nonce, SL_WFX_SECURE_LINK_NONCE_SIZE_BYTES, NULL, ADDRESS_LENGTH,
- (uint8_t *) &buffer->header.id, (uint8_t *) &buffer->header.id,
- (uint8_t *) &buffer->header.id + data_length, SL_WFX_SECURE_LINK_CCM_TAG_SIZE);
- status = SL_STATUS_OK;
- }
-
- mbedtls_ccm_free(&ccm_context);
-
- return status;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_schedule_secure_link_renegotiation(void)
- * @brief
- * Called when the driver needs to schedule secure link renegotiation
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_schedule_secure_link_renegotiation(void)
-{
- // call sl_wfx_secure_link_renegotiate_session_key() as soon as it makes sense for the host to do so
- xTaskNotifyGive(wfx_securelink_task);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn static inline void reverse_bytes(uint8_t *src, uint8_t length)
- * @brief
- * reverse the bytes
- * @param[in] src: source
- * @param[in] length:
- * @returns None
- *****************************************************************************/
-static inline void reverse_bytes(uint8_t * src, uint8_t length)
-{
- uint8_t * lo = src;
- uint8_t * hi = src + length - 1;
- uint8_t swap;
-
- while (lo < hi)
- {
- swap = *lo;
- *lo++ = *hi;
- *hi-- = swap;
- }
-}
-
-/********************************************************************************************************
- ********************************************************************************************************
- * DEPENDENCIES & AVAIL CHECK(S)
- ********************************************************************************************************
- *******************************************************************************************************/
-
-#endif // SL_WFX_USE_SECURE_LINK
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h
deleted file mode 100644
index dc9bcd2..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_host.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "sl_wfx.h"
-#include "task.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-uint8_t sl_wfx_host_get_waited_event(void);
-sl_status_t wfx_soft_init(void);
-
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_switch_to_wirq(void);
-#endif
-#ifdef __cplusplus
-}
-#endif
-
-#define SL_WFX_MAX_STATIONS 8
-#define SL_WFX_MAX_SCAN_RESULTS 50
-
-typedef struct __attribute__((__packed__)) scan_result_list_s
-{
- sl_wfx_ssid_def_t ssid_def;
- uint8_t mac[SL_WFX_MAC_ADDR_SIZE];
- uint16_t channel;
- sl_wfx_security_mode_bitmask_t security_mode;
- uint16_t rcpi;
-} scan_result_list_t;
-
-void sl_wfx_host_start_platform_interrupt(void);
-extern SemaphoreHandle_t wfx_wakeup_sem;
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c
deleted file mode 100644
index 28ffdda..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_securelink_task.c
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifdef SL_WFX_USE_SECURE_LINK
-#include "secure_link/sl_wfx_secure_link.h"
-
-#include "FreeRTOS.h"
-#include "queue.h"
-#include "semphr.h"
-#include "task.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// Securelink Task Configurations
-#define WFX_SECURELINK_TASK_PRIO 1u
-#define WFX_SECURELINK_TASK_STK_SIZE 512u
-
-TaskHandle_t secureLinkTaskHandle;
-SemaphoreHandle_t s_xSLSemaphore;
-StackType_t secureLinkStack[WFX_SECURELINK_TASK_STK_SIZE];
-StaticTask_t secureLinkTaskStruct;
-
-StaticSemaphore_t xSlMutexBuffer;
-
-/*********************************************************************
- * @fn static void prvSecureLinkTask(void *p_arg)
- * @brief
- * The task that implements the Secure Link renegotiation with WFX.
- * @param[in] p_arg:
- * @return None
- *************************************************************************/
-static void prvSecureLinkTask(void * p_arg)
-{
- sl_status_t result;
- (void) p_arg;
-
- /* Create a mutex used for making Secure Link renegotiations atomic */
- s_xSLSemaphore = xSemaphoreCreateMutexStatic(&xSlMutexBuffer);
-
- for (;;)
- {
- /* Wait for a key renegotiation request */
- ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
-
- result = sl_wfx_secure_link_renegotiate_session_key();
- if (result != SL_STATUS_OK)
- {
- printf("session key negotiation error %lu\n", result);
- }
- }
-}
-
-/****************************************************************************
- * @fn void wfx_securelink_task_start(void)
- * @brief
- * Creates WFX securelink key renegotiation task.
- * @param[in] None
- * @return None
- ******************************************************************************/
-void wfx_securelink_task_start(void)
-{
- secureLinkTaskHandle = xTaskCreateStatic(prvSecureLinkTask, "secureLinkTask", WFX_SECURELINK_TASK_STK_SIZE, NULL,
- WFX_SECURELINK_TASK_PRIO, secureLinkStack, &secureLinkTaskStruct);
- if (secureLinkTaskHandle == NULL)
- {
- printf("Failed to create WFX secureLinkTask");
- }
-}
-
-#endif
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c b/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c
deleted file mode 100644
index 8a00e45..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.c
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "em_gpio.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "AppConfig.h"
-
-#define CHECK_VAL 0
-#define WFX_BUS_TASK_PRIORITY 2
-#define BUS_TASK_STACK_SIZE 1024
-static StackType_t busStack[BUS_TASK_STACK_SIZE];
-StaticTask_t busTaskStruct;
-TaskHandle_t wfx_bus_task_handle;
-
-wfx_frame_q_item wfx_bus_tx_frame;
-SemaphoreHandle_t wfxtask_tx_complete;
-SemaphoreHandle_t wfxtask_mutex;
-
-// Flag to indicate receive frames is currently running.
-static bool wfx_bus_rx_in_process = false;
-
-/***************************************************************************
- * @fn bool wfx_bus_is_receive_processing(void)
- * @brief
- * Check receive frame status
- * @param[in] None
- * @return returns wfx_bus_rx_in_process
- ******************************************************************************/
-bool wfx_bus_is_receive_processing(void)
-{
- return wfx_bus_rx_in_process;
-}
-
-/*****************************************************************************
- * @fn static sl_status_t receive_frames()
- * @brief
- * Receives frames from the WFX.
- * @param[in] None
- * @return returns result
- ******************************************************************************/
-static sl_status_t receive_frames()
-{
- sl_status_t result;
- uint16_t control_register = 0;
- wfx_bus_rx_in_process = true;
- do
- {
- result = sl_wfx_receive_frame(&control_register);
- SL_WFX_ERROR_CHECK(result);
- } while ((control_register & SL_WFX_CONT_NEXT_LEN_MASK) != CHECK_VAL);
-
-error_handler:
- wfx_bus_rx_in_process = false;
- return result;
-}
-
-/********************************************************************************
- * @fn static void wfx_bus_task(void *p_arg)
- * @brief
- * WFX bus communication task.
- * receives frames from the Bus interface
- * @param[in] p_arg:
- * @return None
- */
-static void wfx_bus_task(void * p_arg)
-{
- SILABS_LOG("SPI: Bus Task started");
- sl_wfx_host_start_platform_interrupt();
- for (;;)
- {
- /*Wait for an interrupt from WFX*/
- ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
-
- /*Disable the interrupt while treating frames received to avoid
- *the case where the interrupt is set but there is no frame left to treat.*/
- sl_wfx_host_disable_platform_interrupt();
-
- /*Receive the frame(s) pending in WFX*/
- receive_frames();
-
- /*Re-enable the interrupt*/
- sl_wfx_host_enable_platform_interrupt();
- }
-}
-
-/***************************************************************************
- * @fn void wfx_bus_start()
- * @brief
- * Creates WFX bus communication task.
- * @param[in] None
- * @return None
- ******************************************************************************/
-void wfx_bus_start()
-{
- wfx_bus_task_handle =
- xTaskCreateStatic(wfx_bus_task, "wfxbus", BUS_TASK_STACK_SIZE, NULL, WFX_BUS_TASK_PRIORITY, busStack, &busTaskStruct);
- if (wfx_bus_task_handle == NULL)
- {
- SILABS_LOG("*ERR*WFX BusTask");
- }
-}
diff --git a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h b/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h
deleted file mode 100644
index 6838b9b..0000000
--- a/examples/platform/silabs/SiWx917/wf200/sl_wfx_task.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <stdbool.h>
-
-#include "FreeRTOS.h"
-#include "sl_wfx_constants.h"
-#include "task.h"
-
-typedef struct
-{
- sl_wfx_send_frame_req_t * frame;
- uint32_t data_length;
- sl_wfx_interface_t interface;
- uint8_t priority;
-} wfx_frame_q_item;
-
-extern wfx_frame_q_item wfxtask_tx_frame;
-extern TaskHandle_t wfx_bus_task_handle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * @fn void wfx_bus_start(void)
- * @brief
- * Start wfx bus communication task.
- *****************************************************************************/
-void wfx_bus_start(void);
-
-/****************************************************************************
- * @fn bool wfx_bus_is_receive_processing(void)
- * @brief
- * Returns status of wfx receive frames.
- *****************************************************************************/
-bool wfx_bus_is_receive_processing(void);
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/examples/platform/silabs/SiWx917/wf200/wf200.gni b/examples/platform/silabs/SiWx917/wf200/wf200.gni
deleted file mode 100644
index 358384a..0000000
--- a/examples/platform/silabs/SiWx917/wf200/wf200.gni
+++ /dev/null
@@ -1,30 +0,0 @@
-import("//build_overrides/chip.gni")
-import("//build_overrides/efr32_sdk.gni")
-import("//build_overrides/pigweed.gni")
-
-examples_plat_dir = "${chip_root}/examples/platform/silabs/efr32"
-wifi_sdk_dir = "${chip_root}/src/platform/silabs/EFR32/wifi"
-
-wf200_defs = [
- "SL_HEAP_SIZE=24576",
- "WF200_WIFI=1",
- "SL_WIFI=1",
- "SL_WFX_USE_SPI",
- "SL_WFX_DEBUG_MASK=0x0003",
-]
-softap_defs = "SL_WFX_CONFIG_SOFTAP"
-wifi_scan_defs = "SL_WFX_CONFIG_SCAN"
-wf200_plat_incs = [
- "${wifi_sdk_dir}/",
- "${examples_plat_dir}/wf200",
-]
-wf200_plat_src = [
- "${wifi_sdk_dir}/dhcp_client.cpp",
- "${wifi_sdk_dir}/ethernetif.cpp",
- "${wifi_sdk_dir}/lwip_netif.cpp",
- "${wifi_sdk_dir}/wfx_notify.cpp",
- "${examples_plat_dir}/wf200/sl_wfx_task.c",
- "${examples_plat_dir}/wf200/wf200_init.c",
- "${examples_plat_dir}/wf200/efr_spi.c",
- "${examples_plat_dir}/wf200/host_if.cpp",
-]
diff --git a/examples/platform/silabs/SiWx917/wf200/wf200_init.c b/examples/platform/silabs/SiWx917/wf200/wf200_init.c
deleted file mode 100644
index 12973d3..0000000
--- a/examples/platform/silabs/SiWx917/wf200/wf200_init.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- *
- * Copyright (c) 2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* Includes */
-
-#include "em_gpio.h"
-
-#include "sl_wfx.h"
-#include "sl_wfx_board.h"
-
-// File specific to each platform, it must be created for custom boards
-#include "sl_wfx_pds.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* Firmware include */
-#include "sl_wfx_wf200_C0.h"
-
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "task.h"
-
-#include "AppConfig.h"
-#include "sl_wfx_host.h"
-#include "sl_wfx_task.h"
-#include "wfx_host_events.h"
-
-#include "sl_spidrv_instances.h"
-#include "spidrv.h"
-
-#define SL_WFX_EVENT_MAX_SIZE 512
-#define SL_WFX_EVENT_LIST_SIZE 1
-
-StaticSemaphore_t xWfxWakeupSemaBuffer;
-uint8_t sWfxEventQueueBuffer[SL_WFX_EVENT_LIST_SIZE * sizeof(uint8_t)];
-StaticQueue_t sWfxEventQueueStruct;
-QueueHandle_t wfx_event_Q = NULL;
-SemaphoreHandle_t wfx_wakeup_sem = NULL;
-SemaphoreHandle_t wfx_mutex = NULL;
-
-StaticSemaphore_t xWfxMutexBuffer;
-
-struct
-{
- uint32_t wf200_firmware_download_progress;
- int wf200_initialized;
- uint8_t waited_event_id;
- uint8_t posted_event_id;
-} host_context;
-
-#ifdef SL_WFX_USE_SDIO
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_enable_sdio(void);
-sl_status_t sl_wfx_host_disable_sdio(void);
-#endif
-#endif
-
-#ifdef SL_WFX_USE_SPI
-#ifdef SLEEP_ENABLED
-sl_status_t sl_wfx_host_enable_spi(void);
-sl_status_t sl_wfx_host_disable_spi(void);
-#endif
-#endif
-
-/****************************************************************************
- * @fn sl_status_t wfx_soft_init(void)
- * @brief
- * WFX FMAC driver host interface initialization
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t wfx_soft_init(void)
-{
- SILABS_LOG("WF200:Soft Init");
- if ((wfx_event_Q = xQueueCreateStatic(SL_WFX_EVENT_LIST_SIZE, sizeof(uint8_t), sWfxEventQueueBuffer, &sWfxEventQueueStruct)) ==
- NULL)
- {
- return SL_STATUS_FAIL;
- }
-
- if ((wfx_wakeup_sem = xSemaphoreCreateBinaryStatic(&xWfxWakeupSemaBuffer)) == NULL)
- {
- return SL_STATUS_FAIL;
- }
-
- if ((wfx_mutex = xSemaphoreCreateMutexStatic(&xWfxMutexBuffer)) == NULL)
- {
- return SL_STATUS_FAIL;
- }
-
- return SL_STATUS_OK;
-}
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_init(void)
- * @brief
- * Notify driver init function
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_init(void)
-{
- SILABS_LOG("WFX: Host Init");
- host_context.wf200_firmware_download_progress = 0;
- host_context.wf200_initialized = 0;
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_get_firmware_data(const uint8_t **data, uint32_t data_size)
- * @brief
- * Get firmware data
- * @param[in] data:
- * @param[in] data_size:
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_firmware_data(const uint8_t ** data, uint32_t data_size)
-{
- *data = &sl_wfx_firmware[host_context.wf200_firmware_download_progress];
- host_context.wf200_firmware_download_progress += data_size;
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_get_firmware_size(uint32_t *firmware_size)
- * @brief
- * Get firmware size
- * @param[in] firmware_size:
- * @returns Returns SL_STATUS_OK if successful,
- * SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_firmware_size(uint32_t * firmware_size)
-{
- *firmware_size = sizeof(sl_wfx_firmware);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_get_pds_data(const char **pds_data, uint16_t index)
- * @brief
- * Get PDS data
- * @param[in] pds_data:
- * @param[in] index:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_pds_data(const char ** pds_data, uint16_t index)
-{
- *pds_data = sl_wfx_pds[index];
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_get_pds_size(uint16_t *pds_size)
- * @brief
- * Get PDS size
- * @param[in] pds_size:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_get_pds_size(uint16_t * pds_size)
-{
- *pds_size = SL_WFX_ARRAY_COUNT(sl_wfx_pds);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_deinit(void)
- * @brief
- * Deinit host interface
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_deinit(void)
-{
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_allocate_buffer(void **buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
- * @brief
- * Allocate buffer (Should allocate either Ethernet - from LWIP or Control) - TODO
- * @param[in] buffer:
- * @param[in] type:
- * @param[in] buffer_size:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_allocate_buffer(void ** buffer, sl_wfx_buffer_type_t type, uint32_t buffer_size)
-{
- if ((*buffer = pvPortMalloc(buffer_size)) == (void *) 0)
- {
- return SL_STATUS_FAIL;
- }
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_free_buffer(void *buffer, sl_wfx_buffer_type_t type)
- * @brief
- * Free host buffer (CHECK LWIP buffer)
- * @param[in] buffer:
- * @param[in] type:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_free_buffer(void * buffer, sl_wfx_buffer_type_t type)
-{
- vPortFree(buffer);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_hold_in_reset(void)
- * @brief
- * Set reset pin low
- * @param[in] None
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_hold_in_reset(void)
-{
- GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
- host_context.wf200_initialized = 0;
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
- * @brief
- * Set wakeup pin status
- * @param[in] state:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_set_wake_up_pin(uint8_t state)
-{
- CORE_DECLARE_IRQ_STATE;
-
- CORE_ENTER_ATOMIC();
- if (state > PINOUT_CLEAR_STATUS)
- {
-#ifdef SLEEP_ENABLED
-#ifdef SL_WFX_USE_SDIO
- sl_wfx_host_enable_sdio();
-#endif
-#ifdef SL_WFX_USE_SPI
- sl_wfx_host_enable_spi();
-#endif
-#endif
- GPIO_PinOutSet(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
- }
- else
- {
- GPIO_PinOutClear(SL_WFX_HOST_PINOUT_WUP_PORT, SL_WFX_HOST_PINOUT_WUP_PIN);
-#ifdef SLEEP_ENABLED
-#ifdef SL_WFX_USE_SDIO
- sl_wfx_host_disable_sdio();
-#endif
-#ifdef SL_WFX_USE_SPI
- sl_wfx_host_disable_spi();
-#endif
-#endif
- }
- CORE_EXIT_ATOMIC();
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_reset_chip(void)
- * @brief
- * reset the host chip
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_reset_chip(void)
-{
- // Pull it low for at least 1 ms to issue a reset sequence
- GPIO_PinOutClear(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
-
- // Delay for 10ms
- vTaskDelay(pdMS_TO_TICKS(10));
-
- // Hold pin high to get chip out of reset
- GPIO_PinOutSet(SL_WFX_HOST_PINOUT_RESET_PORT, SL_WFX_HOST_PINOUT_RESET_PIN);
-
- // Delay for 3ms
- vTaskDelay(pdMS_TO_TICKS(3));
-
- host_context.wf200_initialized = 0;
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_wait_for_wake_up(void)
- * @brief
- * wait for the host wake up
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_wait_for_wake_up(void)
-{
- xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_0);
- xSemaphoreTake(wfx_wakeup_sem, TICKS_TO_WAIT_3 / portTICK_PERIOD_MS);
-
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_wait(uint32_t wait_time)
- * @brief
- * wait for the host
- * @param[in] wait_time:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_wait(uint32_t wait_time)
-{
- uint32_t ticks = pdMS_TO_TICKS(wait_time);
- vTaskDelay(ticks ? ticks : 10);
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
- * @brief
- * Called when the driver needs to setup the waited event
- * @param[in] event_id:
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_FAIL otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_setup_waited_event(uint8_t event_id)
-{
- host_context.waited_event_id = event_id;
- host_context.posted_event_id = 0;
-
- return SL_STATUS_OK;
-}
-
-/****************************************************************************
- * @fn uint8_t sl_wfx_host_get_waited_event(void)
- * @brief
- * Called when the driver get waited event
- * @returns returns host_context.waited_event_id
- *****************************************************************************/
-
-uint8_t sl_wfx_host_get_waited_event(void)
-{
- return host_context.waited_event_id;
-}
-
-/******************************************************************************
- * @fn sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void **event_payload_out)
- * @brief
- * wait for the host confirmation
- * @param[in] confirmation_id:
- * @param[in] timeout:
- * @param[in] event_payload_out:
- * @returns Returns SL_STATUS_OK if successful,
- * Timeout, SL_STATUS_TIMEOUT otherwise
- *****************************************************************************/
-
-sl_status_t sl_wfx_host_wait_for_confirmation(uint8_t confirmation_id, uint32_t timeout, void ** event_payload_out)
-{
- uint8_t posted_event_id;
- for (uint32_t i = 0; i < timeout; i++)
- {
- /* Wait for an event posted by the function sl_wfx_host_post_event() */
- if (xQueueReceive(wfx_event_Q, &posted_event_id, TICKS_TO_WAIT_1) == pdTRUE)
- {
- /* Once a message is received, check if it is the expected ID */
- if (confirmation_id == posted_event_id)
- {
- /* Pass the confirmation reply and return*/
- if (event_payload_out != NULL)
- {
- *event_payload_out = sl_wfx_context->event_payload_buffer;
- }
- return SL_STATUS_OK;
- }
- }
- }
- /* The wait for the confirmation timed out, return */
- return SL_STATUS_TIMEOUT;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_lock(void)
- * @brief
- * Called when the driver needs to lock its access
- * @returns Returns SL_STATUS_OK if successful,
- *SL_STATUS_TIMEOUT otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_lock(void)
-{
-
- sl_status_t status = SL_STATUS_OK;
-
- if (xSemaphoreTake(wfx_mutex, TICKS_TO_WAIT_500) != pdTRUE)
- {
- SILABS_LOG("*ERR*Wi-Fi driver mutex timo");
- status = SL_STATUS_TIMEOUT;
- }
-
- return status;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_unlock(void)
- * @brief
- * Called when the driver needs to unlock its access
- * @returns Returns SL_STATUS_OK
- *****************************************************************************/
-sl_status_t sl_wfx_host_unlock(void)
-{
- xSemaphoreGive(wfx_mutex);
-
- return SL_STATUS_OK;
-}
-
-/******************************************************************************
- * @fn sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t *event_payload)
- * @brief
- * Called when the driver needs to post an event
- * @param[in] event_payload:
- * @returns Returns status
- *****************************************************************************/
-sl_status_t sl_wfx_host_post_event(sl_wfx_generic_message_t * event_payload)
-{
- sl_status_t status;
-
- /* Forward the message to the application */
- status = sl_wfx_host_process_event(event_payload);
-
- if (host_context.waited_event_id == event_payload->header.id)
- {
- if (event_payload->header.length < SL_WFX_EVENT_MAX_SIZE)
- {
- /* Post the event in the queue */
- memcpy(sl_wfx_context->event_payload_buffer, (void *) event_payload, event_payload->header.length);
- host_context.posted_event_id = event_payload->header.id;
- xQueueOverwrite(wfx_event_Q, (void *) &event_payload->header.id);
- }
- }
-
- return status;
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_transmit_frame(void *frame, uint32_t frame_len)
- * @brief
- * Called when the driver needs to transmit a frame
- * @param[in] frame:
- * @param[in] frame_len:
- * @returns returns sl_wfx_data_write(frame, frame_len)
- *****************************************************************************/
-sl_status_t sl_wfx_host_transmit_frame(void * frame, uint32_t frame_len)
-{
- return sl_wfx_data_write(frame, frame_len);
-}
-
-/****************************************************************************
- * @fn sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type,
- sl_wfx_register_address_t address,
- uint32_t length)
- * @brief
- * Called when the driver is considering putting the
- * WFx in sleep mode
- * @param[in] type:
- * @param[in] address:
- * @param[in] length:
- * @returns SL_WIFI_SLEEP_GRANTED to let the WFx go to
- *sleep, SL_WIFI_SLEEP_NOT_GRANTED otherwise
- *****************************************************************************/
-sl_status_t sl_wfx_host_sleep_grant(sl_wfx_host_bus_transfer_type_t type, sl_wfx_register_address_t address, uint32_t length)
-{
- (void) (type);
- (void) (address);
- (void) (length);
-
- return SL_STATUS_WIFI_SLEEP_GRANTED;
-}
-
-#if SL_WFX_DEBUG_MASK
-/****************************************************************************
- * @fn void sl_wfx_host_log(const char *str, ...)
- * @brief
- * Host debug output
- * @param[in] str: string
- * @return None
- *****************************************************************************/
-void sl_wfx_host_log(const char * str, ...)
-{
- va_list args;
- va_start(args, str);
- vprintf(str, args);
- va_end(args);
-}
-#endif
-#ifndef PW_RPC_ENABLED
-/* Place holder - This is just to handle UART interrupts
- * The "otThread tasks handles it. WiFi does not need it yet
- * I don't care for it. I should really have the thread
- * shut it off
- */
-#if !CHIP_ENABLE_OPENTHREAD
-/****************************************************************************
- * @fn void otSysEventSignalPending(void)
- * @brief
- * system event signal pending
- * @param[in] None
- * @return None
- *****************************************************************************/
-void otSysEventSignalPending(void)
-{
- // BaseType_t yieldRequired = ThreadStackMgrImpl().SignalThreadActivityPendingFromISR();
- SILABS_LOG("*ERR*UART intr - NOT Handled");
- portYIELD_FROM_ISR(pdFALSE);
-}
-#endif /* !CHIP_ENABLE_OPENTHREAD */
-#endif /* PW_RPC_ENABLED */
diff --git a/src/platform/BUILD.gn b/src/platform/BUILD.gn
index c02b331..92687ba 100644
--- a/src/platform/BUILD.gn
+++ b/src/platform/BUILD.gn
@@ -164,6 +164,11 @@
"CHIP_DEVICE_LAYER_TARGET_EFR32=1",
"CHIP_DEVICE_LAYER_TARGET=silabs",
]
+ } else if (chip_device_platform == "SiWx917") {
+ defines += [
+ "CHIP_DEVICE_LAYER_TARGET_EFR32=1",
+ "CHIP_DEVICE_LAYER_TARGET=silabs",
+ ]
} else if (chip_device_platform == "esp32") {
defines += [
"CHIP_DEVICE_LAYER_TARGET_ESP32=1",
@@ -410,6 +415,8 @@
_platform_target = "Darwin"
} else if (chip_device_platform == "efr32") {
_platform_target = "silabs/EFR32"
+ } else if (chip_device_platform == "SiWx917") {
+ _platform_target = "silabs/SiWx917"
} else if (chip_device_platform == "esp32") {
_platform_target = "ESP32"
} else if (chip_device_platform == "k32w0") {
diff --git a/src/platform/device.gni b/src/platform/device.gni
index 601d21e..c0ad4bb 100755
--- a/src/platform/device.gni
+++ b/src/platform/device.gni
@@ -113,6 +113,8 @@
_chip_device_layer = "Darwin"
} else if (chip_device_platform == "efr32") {
_chip_device_layer = "silabs"
+} else if (chip_device_platform == "SiWx917") {
+ _chip_device_layer = "silabs"
} else if (chip_device_platform == "esp32") {
_chip_device_layer = "ESP32"
} else if (chip_device_platform == "linux") {
@@ -212,5 +214,5 @@
chip_device_platform == "webos" || chip_device_platform == "bl602" ||
chip_device_platform == "mw320" || chip_device_platform == "zephyr" ||
chip_device_platform == "beken" || chip_device_platform == "bl702" ||
- chip_device_platform == "mt793x",
+ chip_device_platform == "mt793x" || chip_device_platform == "SiWx917",
"Please select a valid value for chip_device_platform")
diff --git a/src/platform/silabs/BLEManagerImpl.h b/src/platform/silabs/BLEManagerImpl.h
index 0f1d478..e0a04e5 100644
--- a/src/platform/silabs/BLEManagerImpl.h
+++ b/src/platform/silabs/BLEManagerImpl.h
@@ -26,10 +26,22 @@
#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
#include "FreeRTOS.h"
+#include "timers.h"
+#ifdef RS91X_BLE_ENABLE
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <rsi_ble.h>
+#include <rsi_ble_apis.h>
+#include <rsi_bt_common.h>
+#ifdef __cplusplus
+}
+#endif
+#else
#include "gatt_db.h"
#include "sl_bgapi.h"
#include "sl_bt_api.h"
-#include "timers.h"
+#endif // RS91X_BLE_ENABLE
namespace chip {
namespace DeviceLayer {
@@ -45,6 +57,16 @@
public:
void HandleBootEvent(void);
+
+#ifdef RS91X_BLE_ENABLE
+ void HandleConnectEvent(void);
+ void HandleConnectionCloseEvent(uint16_t reason);
+ void HandleWriteEvent(rsi_ble_event_write_t evt);
+ void UpdateMtu(rsi_ble_event_mtu_t evt);
+ void HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId);
+ void HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt);
+ void HandleSoftTimerEvent(void);
+#else
void HandleConnectEvent(volatile sl_bt_msg_t * evt);
void HandleConnectionCloseEvent(volatile sl_bt_msg_t * evt);
void HandleWriteEvent(volatile sl_bt_msg_t * evt);
@@ -53,9 +75,17 @@
void HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt);
void HandleSoftTimerEvent(volatile sl_bt_msg_t * evt);
+#endif // RS91X_BLE_ENABLE
+
+#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
+#ifdef RS91X_BLE_ENABLE
+ static void HandleC3ReadRequest(void);
+#else
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
static void HandleC3ReadRequest(volatile sl_bt_msg_t * evt);
#endif
+#endif
+#endif
private:
// Allow the BLEManager interface class to delegate method calls to
@@ -125,7 +155,9 @@
struct CHIPoBLEConState
{
+#ifndef RS91X_BLE_ENABLE
bd_addr address;
+#endif
uint16_t mtu : 10;
uint16_t allocated : 1;
uint16_t subscribed : 1;
@@ -153,7 +185,12 @@
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
CHIP_ERROR EncodeAdditionalDataTlv();
#endif
+
+#ifdef RS91X_BLE_ENABLE
+ void HandleRXCharWrite(rsi_ble_event_write_t * evt);
+#else
void HandleRXCharWrite(volatile sl_bt_msg_t * evt);
+#endif
bool RemoveConnection(uint8_t connectionHandle);
void AddConnection(uint8_t connectionHandle, uint8_t bondingHandle);
void StartBleAdvTimeoutTimer(uint32_t aTimeoutInMs);
diff --git a/src/platform/silabs/CHIPMem-Platform.cpp b/src/platform/silabs/CHIPMem-Platform.cpp
index 4f8b938..a826ebe 100644
--- a/src/platform/silabs/CHIPMem-Platform.cpp
+++ b/src/platform/silabs/CHIPMem-Platform.cpp
@@ -150,7 +150,12 @@
} // namespace Platform
} // namespace chip
+#ifdef BRD4325A
+extern "C" void memMonitoringTrackAlloc(void * ptr, size_t size) {}
+extern "C" void memMonitoringTrackFree(void * ptr, size_t size) {}
+#else
extern "C" __WEAK void memMonitoringTrackAlloc(void * ptr, size_t size) {}
extern "C" __WEAK void memMonitoringTrackFree(void * ptr, size_t size) {}
+#endif // BRD4325A
#endif // CHIP_CONFIG_MEMORY_MGMT_PLATFORM
diff --git a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
index 7bb0741..effee8c 100644
--- a/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
+++ b/src/platform/silabs/ConnectivityManagerImpl_WIFI.cpp
@@ -262,6 +262,7 @@
// If the WiFi station interface is no longer enabled, or no longer provisioned,
// disconnect the station from the AP, unless the WiFi station mode is currently
// under application control.
+#ifndef CHIP_ONNETWORK_PAIRING
if (mWiFiStationMode != kWiFiStationMode_ApplicationControlled &&
(mWiFiStationMode != kWiFiStationMode_Enabled || !IsWiFiStationProvisioned()))
{
@@ -275,6 +276,7 @@
ChangeWiFiStationState(kWiFiStationState_Disconnecting);
}
+#endif
}
// Otherwise the station interface is NOT connected to an AP, so...
else
diff --git a/src/platform/silabs/SiWx917/BLEManagerImpl.cpp b/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
index a76f26c..6563f4b 100644
--- a/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/BLEManagerImpl.cpp
@@ -26,33 +26,113 @@
#include <platform/internal/CHIPDeviceLayerInternal.h>
#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
-#include "sl_component_catalog.h"
-
#include <platform/internal/BLEManager.h>
+#define RSI_BLE_ENABLE 1
-#include "FreeRTOS.h"
-#include "rail.h"
+//#include "rail.h"
extern "C" {
-#include "sl_bluetooth.h"
-}
-#include "sl_bt_api.h"
-#include "sl_bt_stack_config.h"
-#include "sl_bt_stack_init.h"
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "task.h"
#include "timers.h"
+#include "wfx_host_events.h"
+#include "wfx_rsi.h"
+#include "wfx_sl_ble_init.h"
+#include <rsi_driver.h>
+#include <rsi_utils.h>
+#include <stdbool.h>
+}
#include <ble/CHIPBleServiceData.h>
#include <lib/support/CodeUtils.h>
#include <lib/support/logging/CHIPLogging.h>
#include <platform/CommissionableDataProvider.h>
#include <platform/DeviceInstanceInfoProvider.h>
-#include <sl_bt_rtos_adaptation.h>
+#include <string.h>
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
#include <setup_payload/AdditionalDataPayloadGenerator.h>
#endif
+// static int32_t handleTxConfirmationFlag = 0;
+extern uint16_t rsi_ble_measurement_hndl;
+extern rsi_ble_event_conn_status_t conn_event_to_app;
+extern sl_wfx_msg_t event_msg;
+
+// StaticTask_t busInitTaskStruct;
+
+/* wfxRsi Task will use as its stack */
+// StackType_t wfxRsiInitTaskStack[WFX_RSI_TASK_SZ] = { 0 };
+
using namespace ::chip;
using namespace ::chip::Ble;
+void rsi_ble_event_handling_task(void)
+{
+ int32_t event_id;
+
+ // int32_t event_id;
+ WFX_RSI_LOG("StartAdvertising");
+ // chip::DeviceLayer::Internal::BLEManagerImpl().StartAdvertising(); //TODO:: Called on after init of module
+
+ // Application event map
+ while (1)
+ {
+ // checking for events list
+ event_id = rsi_ble_app_get_event();
+ if (event_id == -1)
+ {
+ continue;
+ }
+ switch (event_id)
+ {
+ case RSI_BLE_CONN_EVENT: {
+ rsi_ble_app_clear_event(RSI_BLE_CONN_EVENT);
+ chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectEvent();
+ WFX_RSI_LOG(" RSI_BLE : Module got connected");
+ }
+ break;
+ case RSI_BLE_DISCONN_EVENT: {
+ // event invokes when disconnection was completed
+ WFX_RSI_LOG(" RSI_BLE : Module got Disconnected");
+ chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectionCloseEvent(event_msg.reason);
+ // clear the served event
+ rsi_ble_app_clear_event(RSI_BLE_DISCONN_EVENT);
+ }
+ break;
+ case RSI_BLE_MTU_EVENT: {
+ // event invokes when write/notification events received
+ WFX_RSI_LOG("RSI_BLE:: RSI_BLE_MTU_EVENT");
+ chip::DeviceLayer::Internal::BLEMgrImpl().UpdateMtu(event_msg.rsi_ble_mtu);
+ // clear the served event
+ rsi_ble_app_clear_event(RSI_BLE_MTU_EVENT);
+ }
+ break;
+ case RSI_BLE_GATT_WRITE_EVENT: {
+ // event invokes when write/notification events received
+ WFX_RSI_LOG("RSI_BLE : RSI_BLE_GATT_WRITE_EVENT");
+ chip::DeviceLayer::Internal::BLEMgrImpl().HandleWriteEvent(event_msg.rsi_ble_write);
+ // clear the served event
+ rsi_ble_app_clear_event(RSI_BLE_GATT_WRITE_EVENT);
+ }
+ break;
+ case RSI_BLE_GATT_INDICATION_CONFIRMATION: {
+ WFX_RSI_LOG("RSI_BLE : indication confirmation");
+ chip::DeviceLayer::Internal::BLEMgrImpl().HandleTxConfirmationEvent(1);
+ rsi_ble_app_clear_event(RSI_BLE_GATT_INDICATION_CONFIRMATION);
+ }
+ break;
+
+ case RSI_BLE_RESP_ATT_VALUE: {
+ WFX_RSI_LOG("RSI_BLE : RESP_ATT confirmation");
+ }
+ default:
+ break;
+ }
+ }
+
+ WFX_RSI_LOG("%s END", __func__);
+}
+
namespace chip {
namespace DeviceLayer {
namespace Internal {
@@ -75,6 +155,7 @@
// Timer Frequency used.
#define TIMER_CLK_FREQ ((uint32_t) 32768)
+
// Convert msec to timer ticks.
#define TIMER_MS_2_TIMERTICK(ms) ((TIMER_CLK_FREQ * ms) / 1000)
#define TIMER_S_2_TIMERTICK(s) (TIMER_CLK_FREQ * s)
@@ -96,6 +177,8 @@
#define BLE_CONFIG_MIN_CE_LENGTH (0) // Leave to min value
#define BLE_CONFIG_MAX_CE_LENGTH (0xFFFF) // Leave to max value
+#define BLE__DEFAULT_TIMER_PERIOD 1
+
TimerHandle_t sbleAdvTimeoutTimer; // FreeRTOS sw timer.
const uint8_t UUID_CHIPoBLEService[] = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
@@ -113,21 +196,33 @@
CHIP_ERROR BLEManagerImpl::_Init()
{
CHIP_ERROR err;
+ ChipLogProgress(DeviceLayer, "%s Start ", __func__);
+
+ // wfx_rsi.init_task = xTaskCreateStatic((TaskFunction_t) wfx_sl_module_init, "init_task", WFX_RSI_TASK_SZ, NULL, 1,
+ // wfxRsiInitTaskStack, &busInitTaskStruct);
+
+ if (NULL == wfx_rsi.init_task)
+ {
+ WFX_RSI_LOG("%s: error: failed to create task.", __func__);
+ }
// Initialize the CHIP BleLayer.
err = BleLayer::Init(this, this, &DeviceLayer::SystemLayer());
SuccessOrExit(err);
+ return err;
+
+ ble_rsi_task();
memset(mBleConnections, 0, sizeof(mBleConnections));
memset(mIndConfId, kUnusedIndex, sizeof(mIndConfId));
mServiceMode = ConnectivityManager::kCHIPoBLEServiceMode_Enabled;
// Create FreeRTOS sw timer for BLE timeouts and interval change.
- sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer", // Just a text name, not used by the RTOS kernel
- 1, // == default timer period (mS)
- false, // no timer reload (==one-shot)
- (void *) this, // init timer id = ble obj context
- BleAdvTimeoutHandler // timer callback handler
+ sbleAdvTimeoutTimer = xTimerCreate("BleAdvTimer", // Just a text name, not used by the RTOS kernel
+ BLE__DEFAULT_TIMER_PERIOD, // == default timer period (mS)
+ false, // no timer reload (==one-shot)
+ (void *) this, // init timer id = ble obj context
+ BleAdvTimeoutHandler // timer callback handler
);
mFlags.ClearAll().Set(Flags::kAdvertisingEnabled, CHIP_DEVICE_CONFIG_CHIPOBLE_ENABLE_ADVERTISING_AUTOSTART);
@@ -135,6 +230,7 @@
PlatformMgr().ScheduleWork(DriveBLEState, 0);
exit:
+ ChipLogProgress(DeviceLayer, "%s END ", __func__);
return err;
}
@@ -198,14 +294,18 @@
CHIP_ERROR BLEManagerImpl::_SetDeviceName(const char * deviceName)
{
+ ChipLogProgress(DeviceLayer, "_SetDeviceName Started");
+ rsi_bt_set_local_name((uint8_t *) RSI_BLE_DEV_NAME);
if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_NotSupported)
{
+ ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE");
return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
}
if (deviceName != NULL && deviceName[0] != 0)
{
if (strlen(deviceName) >= kMaxDeviceNameLength)
{
+ ChipLogProgress(DeviceLayer, "_SetDeviceName CHIP_ERROR_INVALID_ARGUMENT");
return CHIP_ERROR_INVALID_ARGUMENT;
}
strcpy(mDeviceName, deviceName);
@@ -218,6 +318,7 @@
mDeviceName[0] = 0;
}
PlatformMgr().ScheduleWork(DriveBLEState, 0);
+ ChipLogProgress(DeviceLayer, "_SetDeviceName Ended");
return CHIP_NO_ERROR;
}
@@ -281,19 +382,19 @@
bool BLEManagerImpl::CloseConnection(BLE_CONNECTION_OBJECT conId)
{
CHIP_ERROR err = CHIP_NO_ERROR;
- sl_status_t ret;
+ // int32_t ret;
ChipLogProgress(DeviceLayer, "Closing BLE GATT connection (con %u)", conId);
- ret = sl_bt_connection_close(conId);
- err = MapBLEError(ret);
+ // ret = rsi_ble_disconnect(1);
+ // err = MapBLEError(ret);
if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "sl_bt_connection_close() failed: %s", ErrorStr(err));
}
- return (err == CHIP_NO_ERROR);
+ return true; //(err == CHIP_NO_ERROR);
}
uint16_t BLEManagerImpl::GetMTU(BLE_CONNECTION_OBJECT conId) const
@@ -305,26 +406,13 @@
bool BLEManagerImpl::SendIndication(BLE_CONNECTION_OBJECT conId, const ChipBleUUID * svcId, const ChipBleUUID * charId,
PacketBufferHandle data)
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- CHIPoBLEConState * conState = GetConnectionState(conId);
- sl_status_t ret;
- uint16_t cId = (UUIDsMatch(&ChipUUID_CHIPoBLEChar_RX, charId) ? gattdb_CHIPoBLEChar_Rx : gattdb_CHIPoBLEChar_Tx);
- uint8_t timerHandle = GetTimerHandle(conId, true);
-
- VerifyOrExit(((conState != NULL) && (conState->subscribed != 0)), err = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(timerHandle != kMaxConnections, err = CHIP_ERROR_NO_MEMORY);
-
- // start timer for light indication confirmation. Long delay for spake2 indication
- sl_bt_system_set_lazy_soft_timer(TIMER_S_2_TIMERTICK(6), 0, timerHandle, true);
-
- ret = sl_bt_gatt_server_send_indication(conId, cId, (data->DataLength()), data->Start());
- err = MapBLEError(ret);
-
-exit:
- if (err != CHIP_NO_ERROR)
+ int32_t status = 0;
+ WFX_RSI_LOG("In send indication");
+ status = rsi_ble_indicate_value(event_msg.resp_enh_conn.dev_addr, event_msg.rsi_ble_measurement_hndl, (data->DataLength()),
+ data->Start());
+ if (status != RSI_SUCCESS)
{
- ChipLogError(DeviceLayer, "BLEManagerImpl::SendIndication() failed: %s", ErrorStr(err));
- return false;
+ WFX_RSI_LOG("indication %d failed with error code %lx ", status);
}
return true;
@@ -377,15 +465,20 @@
void BLEManagerImpl::DriveBLEState(void)
{
+
+ ChipLogProgress(DeviceLayer, "DriveBLEState starting");
CHIP_ERROR err = CHIP_NO_ERROR;
// Check if BLE stack is initialized
- VerifyOrExit(mFlags.Has(Flags::kEFRBLEStackInitialized), /* */);
+ // VerifyOrExit(mFlags.Has(Flags::kEFRBLEStackInitialized), /* */);
+ ChipLogProgress(DeviceLayer, "Start advertising if needed...");
// Start advertising if needed...
if (mServiceMode == ConnectivityManager::kCHIPoBLEServiceMode_Enabled && mFlags.Has(Flags::kAdvertisingEnabled) &&
NumConnections() < kMaxConnections)
{
+
+ ChipLogProgress(DeviceLayer, "Start/re-start advertising if not already started, or if there is a pending change");
// Start/re-start advertising if not already started, or if there is a pending change
// to the advertising configuration.
if (!mFlags.Has(Flags::kAdvertising) || mFlags.Has(Flags::kRestartAdvertising))
@@ -403,6 +496,7 @@
}
exit:
+ ChipLogProgress(DeviceLayer, "DriveBLEState End");
if (err != CHIP_NO_ERROR)
{
ChipLogError(DeviceLayer, "Disabling CHIPoBLE service due to error: %s", ErrorStr(err));
@@ -412,21 +506,24 @@
CHIP_ERROR BLEManagerImpl::ConfigureAdvertisingData(void)
{
- sl_status_t ret;
+
ChipBLEDeviceIdentificationInfo mDeviceIdInfo;
CHIP_ERROR err;
+ int32_t result;
uint8_t responseData[MAX_RESPONSE_DATA_LEN];
uint8_t advData[MAX_ADV_DATA_LEN];
uint32_t index = 0;
uint32_t mDeviceNameLength = 0;
uint8_t mDeviceIdInfoLength = 0;
+ err = ConfigurationMgr().GetBLEDeviceIdentificationInfo(mDeviceIdInfo);
+
+ ChipLogProgress(DeviceLayer, "ConfigureAdvertisingData start");
VerifyOrExit((kMaxDeviceNameLength + 1) < UINT8_MAX, err = CHIP_ERROR_INVALID_ARGUMENT);
memset(responseData, 0, MAX_RESPONSE_DATA_LEN);
memset(advData, 0, MAX_ADV_DATA_LEN);
- err = ConfigurationMgr().GetBLEDeviceIdentificationInfo(mDeviceIdInfo);
SuccessOrExit(err);
if (!mFlags.Has(Flags::kDeviceNameSet))
@@ -457,154 +554,125 @@
advData[index++] = CHIP_ADV_DATA_TYPE_SERVICE_DATA; // AD type : Service Data
advData[index++] = ShortUUID_CHIPoBLEService[0]; // AD value
advData[index++] = ShortUUID_CHIPoBLEService[1];
- memcpy(&advData[index], (void *) &mDeviceIdInfo, mDeviceIdInfoLength); // AD value
- index += mDeviceIdInfoLength;
+
+ // TODO:: replace the hardcoded values by calling the GetBLEDeviceIdentificationInfo
+ advData[index++] = 0; // OpCode
+ advData[index++] = 0; // DeviceDiscriminatorAndAdvVersion []
+ advData[index++] = 15; // DeviceDiscriminatorAndAdvVersion []
+ advData[index++] = 241; // DeviceVendorId []
+ advData[index++] = 255; // DeviceVendorId []
+ advData[index++] = 5; // DeviceProductId[]
+ advData[index++] = 128; // DeviceProductId[]
+ advData[index++] = 0; // AdditionalDataFlag
+
+ //! prepare advertise data //local/device name
+ advData[index++] = strlen(RSI_BLE_DEV_NAME) + 1;
+ advData[index++] = 9;
+
+ memcpy(&advData[index], RSI_BLE_DEV_NAME, strlen(RSI_BLE_DEV_NAME)); // AD value
+ index += strlen(RSI_BLE_DEV_NAME);
#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
ReturnErrorOnFailure(EncodeAdditionalDataTlv());
#endif
- if (0xff != advertising_set_handle)
+ result = rsi_ble_set_advertise_data(advData, index);
+ if (result != SL_STATUS_OK)
{
- sl_bt_advertiser_delete_set(advertising_set_handle);
- advertising_set_handle = 0xff;
- }
-
- ret = sl_bt_advertiser_create_set(&advertising_set_handle);
- if (ret != SL_STATUS_OK)
- {
- err = MapBLEError(ret);
- ChipLogError(DeviceLayer, "sl_bt_advertiser_create_set() failed: %s", ErrorStr(err));
+ err = MapBLEError(result);
+ ChipLogError(DeviceLayer, "rsi_ble_set_advertise_data() failed: %ld", result);
ExitNow();
}
-
- ret = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_advertising_data_packet, index,
- (uint8_t *) advData);
-
- if (ret != SL_STATUS_OK)
+ else
{
- err = MapBLEError(ret);
- ChipLogError(DeviceLayer, "sl_bt_legacy_advertiser_set_data() - Advertising Data failed: %s", ErrorStr(err));
- ExitNow();
+ ChipLogError(DeviceLayer, "rsi_ble_set_advertise_data() success: %ld", result);
}
- index = 0;
+ err = MapBLEError(result);
- responseData[index++] = CHIP_ADV_SHORT_UUID_LEN + 1; // AD length
- responseData[index++] = CHIP_ADV_DATA_TYPE_UUID; // AD type : uuid
- responseData[index++] = ShortUUID_CHIPoBLEService[0]; // AD value
- responseData[index++] = ShortUUID_CHIPoBLEService[1];
-
- responseData[index++] = static_cast<uint8_t>(mDeviceNameLength + 1); // length
- responseData[index++] = CHIP_ADV_DATA_TYPE_NAME; // AD type : name
- memcpy(&responseData[index], mDeviceName, mDeviceNameLength); // AD value
- index += mDeviceNameLength;
-
- ret = sl_bt_legacy_advertiser_set_data(advertising_set_handle, sl_bt_advertiser_scan_response_packet, index,
- (uint8_t *) responseData);
-
- if (ret != SL_STATUS_OK)
- {
- err = MapBLEError(ret);
- ChipLogError(DeviceLayer, "sl_bt_legacy_advertiser_set_data() - Scan Response failed: %s", ErrorStr(err));
- ExitNow();
- }
-
- err = MapBLEError(ret);
-
+ ChipLogProgress(DeviceLayer, "ConfigureAdvertisingData End");
exit:
- return err;
+ return CHIP_NO_ERROR;
}
CHIP_ERROR BLEManagerImpl::StartAdvertising(void)
{
CHIP_ERROR err;
- sl_status_t ret;
- uint32_t interval_min;
- uint32_t interval_max;
- uint16_t numConnectionss = NumConnections();
- uint8_t connectableAdv =
- (numConnectionss < kMaxConnections) ? sl_bt_advertiser_connectable_scannable : sl_bt_advertiser_scannable_non_connectable;
+ int32_t status = 0;
+
+ ChipLogProgress(DeviceLayer, "StartAdvertising start");
// If already advertising, stop it, before changing values
if (mFlags.Has(Flags::kAdvertising))
{
- sl_bt_advertiser_stop(advertising_set_handle);
+ // sl_bt_advertiser_stop(advertising_set_handle);
}
else
{
ChipLogDetail(DeviceLayer, "Start BLE advertissement");
}
- const uint8_t kResolvableRandomAddrType = 2; // Private resolvable random address type
- bd_addr unusedBdAddr; // We can ignore this field when setting random address.
- sl_bt_advertiser_set_random_address(advertising_set_handle, kResolvableRandomAddrType, unusedBdAddr, &unusedBdAddr);
- (void) unusedBdAddr;
+ // bd_addr unusedBdAddr; // We can ignore this field when setting random address.
+
+ // (void) unusedBdAddr;
err = ConfigureAdvertisingData();
SuccessOrExit(err);
mFlags.Clear(Flags::kRestartAdvertising);
- if (mFlags.Has(Flags::kFastAdvertisingEnabled))
- {
- interval_min = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MIN;
- interval_max = CHIP_DEVICE_CONFIG_BLE_FAST_ADVERTISING_INTERVAL_MAX;
- }
- else
- {
- interval_min = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MIN;
- interval_max = CHIP_DEVICE_CONFIG_BLE_SLOW_ADVERTISING_INTERVAL_MAX;
- }
+ sl_wfx_mac_address_t macaddr;
+ wfx_get_wifi_mac_addr(SL_WFX_STA_INTERFACE, &macaddr);
- ret = sl_bt_advertiser_set_timing(advertising_set_handle, interval_min, interval_max, 0, 0);
- err = MapBLEError(ret);
- SuccessOrExit(err);
-
- sl_bt_advertiser_configure(advertising_set_handle, 1);
- ret = sl_bt_legacy_advertiser_start(advertising_set_handle, connectableAdv);
-
- if (SL_STATUS_OK == ret)
+ //! Set local name
+ status = rsi_ble_start_advertising();
+ if (status == RSI_SUCCESS)
{
+ ChipLogProgress(DeviceLayer, "rsi_ble_start_advertising Success");
+
if (mFlags.Has(Flags::kFastAdvertisingEnabled))
{
StartBleAdvTimeoutTimer(CHIP_DEVICE_CONFIG_BLE_ADVERTISING_INTERVAL_CHANGE_TIME);
}
mFlags.Set(Flags::kAdvertising);
}
-
- err = MapBLEError(ret);
+ else
+ {
+ ChipLogProgress(DeviceLayer, "rsi_ble_start_advertising Failed with status: %lx", status);
+ }
exit:
- return err;
+ ChipLogError(DeviceLayer, "StartAdvertising() End error: %s", ErrorStr(err));
+ return CHIP_NO_ERROR; // err;
}
+// TODO:: Implementation need to be done.
CHIP_ERROR BLEManagerImpl::StopAdvertising(void)
{
CHIP_ERROR err = CHIP_NO_ERROR;
- sl_status_t ret;
+ // sl_status_t ret;
if (mFlags.Has(Flags::kAdvertising))
{
mFlags.Clear(Flags::kAdvertising).Clear(Flags::kRestartAdvertising);
mFlags.Set(Flags::kFastAdvertisingEnabled, true);
- ret = sl_bt_advertiser_stop(advertising_set_handle);
- sl_bt_advertiser_delete_set(advertising_set_handle);
+ // ret = sl_bt_advertiser_stop(advertising_set_handle);
+ // sl_bt_advertiser_delete_set(advertising_set_handle);
advertising_set_handle = 0xff;
- err = MapBLEError(ret);
- SuccessOrExit(err);
+ // err = MapBLEError(ret);
+ // SuccessOrExit(err);
CancelBleAdvTimeoutTimer();
}
-exit:
+ // exit:
return err;
}
-void BLEManagerImpl::UpdateMtu(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::UpdateMtu(rsi_ble_event_mtu_t evt)
{
- CHIPoBLEConState * bleConnState = GetConnectionState(evt->data.evt_gatt_mtu_exchanged.connection);
+ CHIPoBLEConState * bleConnState = GetConnectionState(event_msg.connectionHandle);
if (bleConnState != NULL)
{
// bleConnState->MTU is a 10-bit field inside a uint16_t. We're
@@ -616,9 +684,10 @@
// TODO: https://github.com/project-chip/connectedhomeip/issues/2569
// tracks making this safe with a check or explaining why no check
// is needed.
+ ChipLogProgress(DeviceLayer, "DriveBLEState UpdateMtu %d", evt.mtu_size);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
- bleConnState->mtu = evt->data.evt_gatt_mtu_exchanged.mtu;
+ bleConnState->mtu = evt.mtu_size;
#pragma GCC diagnostic pop
;
}
@@ -630,23 +699,18 @@
PlatformMgr().ScheduleWork(DriveBLEState, 0);
}
-void BLEManagerImpl::HandleConnectEvent(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleConnectEvent(void)
{
- sl_bt_evt_connection_opened_t * conn_evt = (sl_bt_evt_connection_opened_t *) &(evt->data);
- uint8_t connHandle = conn_evt->connection;
- uint8_t bondingHandle = conn_evt->bonding;
-
- ChipLogProgress(DeviceLayer, "Connect Event for handle : %d", connHandle);
-
- AddConnection(connHandle, bondingHandle);
+ ChipLogProgress(DeviceLayer, "Connect Event for handle : %d", event_msg.connectionHandle);
+ AddConnection(event_msg.connectionHandle, event_msg.bondingHandle);
PlatformMgr().ScheduleWork(DriveBLEState, 0);
}
-void BLEManagerImpl::HandleConnectionCloseEvent(volatile sl_bt_msg_t * evt)
+// TODO:: Implementation need to be done.
+void BLEManagerImpl::HandleConnectionCloseEvent(uint16_t reason)
{
- sl_bt_evt_connection_closed_t * conn_evt = (sl_bt_evt_connection_closed_t *) &(evt->data);
- uint8_t connHandle = conn_evt->connection;
+ uint8_t connHandle = 1;
ChipLogProgress(DeviceLayer, "Disconnect Event for handle : %d", connHandle);
@@ -656,24 +720,19 @@
event.Type = DeviceEventType::kCHIPoBLEConnectionError;
event.CHIPoBLEConnectionError.ConId = connHandle;
- switch (conn_evt->reason)
- {
- case SL_STATUS_BT_CTRL_REMOTE_USER_TERMINATED:
- case SL_STATUS_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
- case SL_STATUS_BT_CTRL_REMOTE_POWERING_OFF:
- event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED;
- break;
+ // switch (reason)
+ // {
+ //
+ // case RSI_REMOTE_DEV_TERMINATE_CONN:
+ // case RSI_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES:
+ // case RSI_BT_CTRL_REMOTE_POWERING_OFF:
+ // event.CHIPoBLEConnectionError.Reason = BLE_ERROR_REMOTE_DEVICE_DISCONNECTED;
+ // break;
+ // default:
+ // event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
+ // }
- case SL_STATUS_BT_CTRL_CONNECTION_TERMINATED_BY_LOCAL_HOST:
- event.CHIPoBLEConnectionError.Reason = BLE_ERROR_APP_CLOSED_CONNECTION;
- break;
-
- default:
- event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
- break;
- }
-
- ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %u)", connHandle, conn_evt->reason);
+ // ChipLogProgress(DeviceLayer, "BLE GATT connection closed (con %u, reason %u)", connHandle, conn_evt->reason);
PlatformMgr().PostEventOrDie(&event);
@@ -685,84 +744,61 @@
}
}
-void BLEManagerImpl::HandleWriteEvent(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleWriteEvent(rsi_ble_event_write_t evt)
{
- uint16_t attribute = evt->data.evt_gatt_server_user_write_request.characteristic;
+ // RSI_BLE_WRITE_REQUEST_EVENT
+ ChipLogProgress(DeviceLayer, "Char Write Req, packet type %d", evt.pkt_type);
+ uint8_t attribute = (uint8_t) event_msg.rsi_ble_measurement_hndl;
- ChipLogProgress(DeviceLayer, "Char Write Req, char : %d", attribute);
+ WFX_RSI_LOG("attribute = %d,rsi_ble_measurement_hndl = %d", attribute, event_msg.rsi_ble_measurement_hndl);
- if (gattdb_CHIPoBLEChar_Rx == attribute)
+ if (evt.handle[0] == (uint8_t) event_msg.rsi_ble_gatt_server_client_config_hndl) // TODO:: compare the handle exactly
{
- HandleRXCharWrite(evt);
- }
-}
-
-void BLEManagerImpl::HandleTXCharCCCDWrite(volatile sl_bt_msg_t * evt)
-{
- CHIP_ERROR err = CHIP_NO_ERROR;
- CHIPoBLEConState * bleConnState;
- bool isIndicationEnabled = false;
- ChipDeviceEvent event;
-
- bleConnState = GetConnectionState(evt->data.evt_gatt_server_user_write_request.connection);
- VerifyOrExit(bleConnState != NULL, err = CHIP_ERROR_NO_MEMORY);
-
- // Determine if the client is enabling or disabling notification/indication.
- isIndicationEnabled = (evt->data.evt_gatt_server_characteristic_status.client_config_flags == sl_bt_gatt_indication);
-
- ChipLogProgress(DeviceLayer, "HandleTXcharCCCDWrite - Config Flags value : %d",
- evt->data.evt_gatt_server_characteristic_status.client_config_flags);
- ChipLogProgress(DeviceLayer, "CHIPoBLE %s received", isIndicationEnabled ? "subscribe" : "unsubscribe");
-
- if (isIndicationEnabled)
- {
- // If indications are not already enabled for the connection...
- if (!bleConnState->subscribed)
- {
- bleConnState->subscribed = 1;
- // Post an event to the CHIP queue to process either a CHIPoBLE Subscribe or Unsubscribe based on
- // whether the client is enabling or disabling indications.
- {
- event.Type = DeviceEventType::kCHIPoBLESubscribe;
- event.CHIPoBLESubscribe.ConId = evt->data.evt_gatt_server_user_write_request.connection;
- err = PlatformMgr().PostEvent(&event);
- }
- }
+ WFX_RSI_LOG("Inside HandleTXCharCCCDWrite ");
+ HandleTXCharCCCDWrite(&evt);
}
else
{
- bleConnState->subscribed = 0;
- event.Type = DeviceEventType::kCHIPoBLEUnsubscribe;
- event.CHIPoBLESubscribe.ConId = evt->data.evt_gatt_server_user_write_request.connection;
- err = PlatformMgr().PostEvent(&event);
- }
-
-exit:
- if (err != CHIP_NO_ERROR)
- {
- ChipLogError(DeviceLayer, "HandleTXCharCCCDWrite() failed: %s", ErrorStr(err));
+ HandleRXCharWrite(&evt);
}
}
-void BLEManagerImpl::HandleRXCharWrite(volatile sl_bt_msg_t * evt)
+void BLEManagerImpl::HandleTXCharCCCDWrite(rsi_ble_event_write_t * evt)
{
CHIP_ERROR err = CHIP_NO_ERROR;
+ ChipDeviceEvent event;
+ // whether the client is enabling or disabling indications.
+ {
+ event.Type = DeviceEventType::kCHIPoBLESubscribe;
+ event.CHIPoBLESubscribe.ConId = 1;
+ err = PlatformMgr().PostEvent(&event);
+ }
+}
+
+void BLEManagerImpl::HandleRXCharWrite(rsi_ble_event_write_t * evt)
+{
+ uint8_t conId = 1;
+ CHIP_ERROR err = CHIP_NO_ERROR;
System::PacketBufferHandle buf;
- uint16_t writeLen = evt->data.evt_gatt_server_user_write_request.value.len;
- uint8_t * data = (uint8_t *) evt->data.evt_gatt_server_user_write_request.value.data;
+ uint16_t writeLen = evt->length;
+ uint8_t * data = (uint8_t *) evt->att_value;
+
+ for (int i = 0; i < evt->length; i++)
+ {
+ ChipLogDetail(DeviceLayer, "HandleRXCharWrite value : %d", evt->att_value[i]);
+ }
// Copy the data to a packet buffer.
buf = System::PacketBufferHandle::NewWithData(data, writeLen, 0, 0);
VerifyOrExit(!buf.IsNull(), err = CHIP_ERROR_NO_MEMORY);
- ChipLogDetail(DeviceLayer, "Write request/command received for CHIPoBLE RX characteristic (con %u, len %u)",
- evt->data.evt_gatt_server_user_write_request.connection, buf->DataLength());
+ ChipLogDetail(DeviceLayer, "Write request/command received for CHIPoBLE RX characteristic ( len %d)", writeLen);
// Post an event to the CHIP queue to deliver the data into the CHIP stack.
{
ChipDeviceEvent event;
event.Type = DeviceEventType::kCHIPoBLEWriteReceived;
- event.CHIPoBLEWriteReceived.ConId = evt->data.evt_gatt_server_user_write_request.connection;
+ event.CHIPoBLEWriteReceived.ConId = conId;
event.CHIPoBLEWriteReceived.Data = std::move(buf).UnsafeRelease();
err = PlatformMgr().PostEvent(&event);
}
@@ -777,36 +813,38 @@
void BLEManagerImpl::HandleTxConfirmationEvent(BLE_CONNECTION_OBJECT conId)
{
ChipDeviceEvent event;
- uint8_t timerHandle = sInstance.GetTimerHandle(conId, false);
-
- ChipLogProgress(DeviceLayer, "Tx Confirmation received");
-
- // stop indication confirmation timer
- if (timerHandle < kMaxConnections)
- {
- ChipLogProgress(DeviceLayer, " stop soft timer");
- sl_bt_system_set_lazy_soft_timer(0, 0, timerHandle, false);
- }
+ // uint8_t timerHandle = sInstance.GetTimerHandle(conId, false);
+ //
+ // ChipLogProgress(DeviceLayer, "Tx Confirmation received");
+ //
+ // // stop indication confirmation timer // TODO:: Need to find the proper repleacement
+ // if (timerHandle < kMaxConnections)
+ // {
+ // ChipLogProgress(DeviceLayer, " stop soft timer");
+ // // sl_bt_system_set_lazy_soft_timer(0, 0, timerHandle, false);
+ // }
event.Type = DeviceEventType::kCHIPoBLEIndicateConfirm;
event.CHIPoBLEIndicateConfirm.ConId = conId;
PlatformMgr().PostEventOrDie(&event);
}
-void BLEManagerImpl::HandleSoftTimerEvent(volatile sl_bt_msg_t * evt)
+// TODO:: Need to Implement
+void BLEManagerImpl::HandleSoftTimerEvent(void)
{
+
// BLE Manager starts soft timers with timer handles less than kMaxConnections
// If we receive a callback for unknown timer handle ignore this.
- if (evt->data.evt_system_soft_timer.handle < kMaxConnections)
- {
- ChipLogProgress(DeviceLayer, "BLEManagerImpl::HandleSoftTimerEvent CHIPOBLE_PROTOCOL_ABORT");
- ChipDeviceEvent event;
- event.Type = DeviceEventType::kCHIPoBLEConnectionError;
- event.CHIPoBLEConnectionError.ConId = mIndConfId[evt->data.evt_system_soft_timer.handle];
- sInstance.mIndConfId[evt->data.evt_system_soft_timer.handle] = kUnusedIndex;
- event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
- PlatformMgr().PostEventOrDie(&event);
- }
+ // if (evt->data.evt_system_soft_timer.handle < kMaxConnections)
+ // {
+ // ChipLogProgress(DeviceLayer, "BLEManagerImpl::HandleSoftTimerEvent CHIPOBLE_PROTOCOL_ABORT");
+ // ChipDeviceEvent event;
+ // event.Type = DeviceEventType::kCHIPoBLEConnectionError;
+ // event.CHIPoBLEConnectionError.ConId = mIndConfId[evt->data.evt_system_soft_timer.handle];
+ // sInstance.mIndConfId[evt->data.evt_system_soft_timer.handle] = kUnusedIndex;
+ // event.CHIPoBLEConnectionError.Reason = BLE_ERROR_CHIPOBLE_PROTOCOL_ABORT;
+ // PlatformMgr().PostEventOrDie(&event);
+ // }
}
bool BLEManagerImpl::RemoveConnection(uint8_t connectionHandle)
@@ -900,19 +938,20 @@
return err;
}
-void BLEManagerImpl::HandleC3ReadRequest(volatile sl_bt_msg_t * evt)
+// TODO:: Need the
+void BLEManagerImpl::HandleC3ReadRequest(void)
{
- sl_bt_evt_gatt_server_user_read_request_t * readReq =
- (sl_bt_evt_gatt_server_user_read_request_t *) &(evt->data.evt_gatt_server_user_read_request);
- ChipLogDetail(DeviceLayer, "Read request received for CHIPoBLEChar_C3 - opcode:%d", readReq->att_opcode);
- sl_status_t ret = sl_bt_gatt_server_send_user_read_response(readReq->connection, readReq->characteristic, 0,
- sInstance.c3AdditionalDataBufferHandle->DataLength(),
- sInstance.c3AdditionalDataBufferHandle->Start(), nullptr);
+ // sl_bt_evt_gatt_server_user_read_request_t * readReq =
+ // (sl_bt_evt_gatt_server_user_read_request_t *) &(evt->data.evt_gatt_server_user_read_request);
+ // ChipLogDetail(DeviceLayer, "Read request received for CHIPoBLEChar_C3 - opcode:%d", readReq->att_opcode);
+ // sl_status_t ret = sl_bt_gatt_server_send_user_read_response(readReq->connection, readReq->characteristic, 0,
+ // sInstance.c3AdditionalDataBufferHandle->DataLength(),
+ // sInstance.c3AdditionalDataBufferHandle->Start(), nullptr);
- if (ret != SL_STATUS_OK)
- {
- ChipLogDetail(DeviceLayer, "Failed to send read response, err:%ld", ret);
- }
+ // if (ret != SL_STATUS_OK)
+ // {
+ // ChipLogDetail(DeviceLayer, "Failed to send read response, err:%ld", ret);
+ // }
}
#endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
@@ -989,105 +1028,4 @@
} // namespace DeviceLayer
} // namespace chip
-extern "C" void sl_bt_on_event(sl_bt_msg_t * evt)
-{
- // As this is running in a separate thread, we need to block CHIP from operating,
- // until the events are handled.
- chip::DeviceLayer::PlatformMgr().LockChipStack();
-
- // handle bluetooth events
- switch (SL_BT_MSG_ID(evt->header))
- {
- case sl_bt_evt_system_boot_id: {
- ChipLogProgress(DeviceLayer, "Bluetooth stack booted: v%d.%d.%d-b%d", evt->data.evt_system_boot.major,
- evt->data.evt_system_boot.minor, evt->data.evt_system_boot.patch, evt->data.evt_system_boot.build);
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleBootEvent();
-
- RAIL_Version_t railVer;
- RAIL_GetVersion(&railVer, true);
- ChipLogProgress(DeviceLayer, "RAIL version:, v%d.%d.%d-b%d", railVer.major, railVer.minor, railVer.rev, railVer.build);
- sl_bt_connection_set_default_parameters(BLE_CONFIG_MIN_INTERVAL, BLE_CONFIG_MAX_INTERVAL, BLE_CONFIG_LATENCY,
- BLE_CONFIG_TIMEOUT, BLE_CONFIG_MIN_CE_LENGTH, BLE_CONFIG_MAX_CE_LENGTH);
- }
- break;
-
- case sl_bt_evt_connection_opened_id: {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectEvent(evt);
- }
- break;
- case sl_bt_evt_connection_parameters_id: {
- // ChipLogProgress(DeviceLayer, "Connection parameter ID received");
- }
- break;
- case sl_bt_evt_connection_phy_status_id: {
- // ChipLogProgress(DeviceLayer, "PHY update procedure is completed");
- }
- break;
- case sl_bt_evt_connection_closed_id: {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleConnectionCloseEvent(evt);
- }
- break;
-
- /* This event indicates that a remote GATT client is attempting to write a value of an
- * attribute in to the local GATT database, where the attribute was defined in the GATT
- * XML firmware configuration file to have type="user". */
- case sl_bt_evt_gatt_server_attribute_value_id: {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleWriteEvent(evt);
- }
- break;
-
- case sl_bt_evt_gatt_mtu_exchanged_id: {
- chip::DeviceLayer::Internal::BLEMgrImpl().UpdateMtu(evt);
- }
- break;
-
- // confirmation of indication received from remote GATT client
- case sl_bt_evt_gatt_server_characteristic_status_id: {
- sl_bt_gatt_server_characteristic_status_flag_t StatusFlags;
-
- StatusFlags = (sl_bt_gatt_server_characteristic_status_flag_t) evt->data.evt_gatt_server_characteristic_status.status_flags;
-
- if (sl_bt_gatt_server_confirmation == StatusFlags)
- {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleTxConfirmationEvent(
- evt->data.evt_gatt_server_characteristic_status.connection);
- }
- else if ((evt->data.evt_gatt_server_characteristic_status.characteristic == gattdb_CHIPoBLEChar_Tx) &&
- (evt->data.evt_gatt_server_characteristic_status.status_flags == gatt_server_client_config))
- {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleTXCharCCCDWrite(evt);
- }
- }
- break;
-
- /* Software Timer event */
- case sl_bt_evt_system_soft_timer_id: {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleSoftTimerEvent(evt);
- }
- break;
-
- case sl_bt_evt_gatt_server_user_read_request_id: {
- ChipLogProgress(DeviceLayer, "GATT server user_read_request");
-#if CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
- if (evt->data.evt_gatt_server_user_read_request.characteristic == gattdb_CHIPoBLEChar_C3)
- {
- chip::DeviceLayer::Internal::BLEMgrImpl().HandleC3ReadRequest(evt);
- }
-#endif // CHIP_ENABLE_ADDITIONAL_DATA_ADVERTISING
- }
- break;
-
- case sl_bt_evt_connection_remote_used_features_id: {
- // ChipLogProgress(DeviceLayer, "link layer features supported by the remote device");
- }
- break;
-
- default:
- ChipLogProgress(DeviceLayer, "evt_UNKNOWN id = %08" PRIx32, SL_BT_MSG_ID(evt->header));
- break;
- }
-
- chip::DeviceLayer::PlatformMgr().UnlockChipStack();
-}
-
#endif // CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
diff --git a/src/platform/silabs/SiWx917/BUILD.gn b/src/platform/silabs/SiWx917/BUILD.gn
index b67c63c..4026e1c 100644
--- a/src/platform/silabs/SiWx917/BUILD.gn
+++ b/src/platform/silabs/SiWx917/BUILD.gn
@@ -22,17 +22,13 @@
silabs_platform_dir = "${chip_root}/src/platform/silabs"
-assert(chip_device_platform == "efr32")
+assert(chip_device_platform == "SiWx917")
if (chip_enable_openthread) {
import("//build_overrides/openthread.gni")
}
-if (chip_crypto == "platform") {
- import("//build_overrides/mbedtls.gni")
-}
-
-static_library("EFR32") {
+static_library("SiWx917") {
sources = [
"${silabs_platform_dir}/BLEManagerImpl.h",
"${silabs_platform_dir}/BlePlatformConfig.h",
@@ -57,33 +53,21 @@
"ConfigurationManagerImpl.cpp",
"KeyValueStoreManagerImpl.cpp",
"PlatformManagerImpl.cpp",
+ "bluetooth/rsi_ble_config.h",
+ "bluetooth/wfx_sl_ble_init.c",
+ "bluetooth/wfx_sl_ble_init.h",
]
+ # TODO: OTA on CCP platform
if (chip_enable_ota_requestor) {
sources += [
- "OTAImageProcessorImpl.cpp",
- "OTAImageProcessorImpl.h",
+ #"OTAImageProcessorImpl.cpp",
+ #"OTAImageProcessorImpl.h",
]
}
public_deps = [ "${chip_root}/src/platform:platform_base" ]
- # Add platform crypto implementation
- if (chip_crypto == "platform") {
- sources += [
- "CHIPCryptoPALPsaEfr32.cpp",
- "Efr32OpaqueKeypair.h",
- "Efr32PsaOpaqueKeypair.cpp",
- "Efr32PsaOperationalKeystore.cpp",
- "Efr32PsaOperationalKeystore.h",
- ]
-
- public_deps += [
- "${chip_root}/src/crypto",
- "${mbedtls_root}:mbedtls",
- ]
- }
-
# Add pigweed KVS
deps = [
"$dir_pw_kvs:crc16",
@@ -93,27 +77,6 @@
"$dir_pw_checksum",
"$dir_pw_kvs",
]
- if (chip_enable_openthread) {
- public_deps += [ "${chip_root}/third_party/openthread:openthread" ]
-
- deps += [ "${chip_root}/third_party/openthread:openthread_cli" ]
-
- sources += [
- "${silabs_platform_dir}/ThreadStackManagerImpl.h",
- "../../OpenThread/OpenThreadUtils.cpp",
- "ConnectivityManagerImpl.cpp",
- "ThreadStackManagerImpl.cpp",
- ]
-
- if (chip_mdns == "platform") {
- sources += [ "../../OpenThread/DnssdImpl.cpp" ]
- deps += [ "${chip_root}/src/lib/dnssd:platform_header" ]
- }
-
- public_configs = [
- "${chip_root}/src/lib/address_resolve:default_address_resolve_config",
- ]
- }
if (chip_enable_wifi) {
sources += [
diff --git a/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp b/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp
deleted file mode 100644
index 13af1ae..0000000
--- a/src/platform/silabs/SiWx917/CHIPCryptoPALPsaEfr32.cpp
+++ /dev/null
@@ -1,1879 +0,0 @@
-/*
- *
- * Copyright (c) 2020-2022 Project CHIP Authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @file
- * PSA Crypto API based implementation of CHIP crypto primitives
- * with Silicon Labs SDK modifications
- */
-
-#include <crypto/CHIPCryptoPAL.h>
-
-#include <type_traits>
-
-// Include version header to get configuration information
-#include <mbedtls/version.h>
-
-#if !defined(MBEDTLS_PSA_CRYPTO_C)
-#error "This implementation needs PSA Crypto"
-#endif
-
-#if !defined(MBEDTLS_USE_PSA_CRYPTO)
-#error "This implementation requires that PSA Crypto keys can be used for CSR generation"
-#endif
-
-#include "psa/crypto.h"
-
-// Go straight for the driver wrappers for speed on plaintext keys
-extern "C" {
-#include "psa_crypto_core.h"
-#include "psa_crypto_driver_wrappers.h"
-}
-
-// Includes needed for SPAKE2+ ECP operations
-#include <mbedtls/bignum.h>
-#include <mbedtls/ecp.h>
-
-// Includes needed for certificate parsing
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
-#include <mbedtls/x509_crt.h>
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-#include <mbedtls/md.h>
-#include <mbedtls/x509.h>
-#include <mbedtls/x509_csr.h>
-
-#if defined(MBEDTLS_ERROR_C)
-#include <mbedtls/error.h>
-#endif // defined(MBEDTLS_ERROR_C)
-
-#include <lib/core/CHIPSafeCasts.h>
-#include <lib/support/BufferWriter.h>
-#include <lib/support/BytesToHex.h>
-#include <lib/support/CHIPArgParser.hpp>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/CodeUtils.h>
-#include <lib/support/SafeInt.h>
-#include <lib/support/SafePointerCast.h>
-#include <lib/support/logging/CHIPLogging.h>
-
-#include <string.h>
-
-namespace chip {
-namespace Crypto {
-
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-#define MAX_ERROR_STR_LEN 128
-#define NUM_BYTES_IN_SHA256_HASH 32
-
-// In mbedTLS 3.0.0 direct access to structure fields was replaced with using MBEDTLS_PRIVATE macro.
-#if (MBEDTLS_VERSION_NUMBER >= 0x03000000)
-#define CHIP_CRYPTO_PAL_PRIVATE(x) MBEDTLS_PRIVATE(x)
-#else
-#define CHIP_CRYPTO_PAL_PRIVATE(x) x
-#endif
-
-#if (MBEDTLS_VERSION_NUMBER >= 0x03000000 && MBEDTLS_VERSION_NUMBER < 0x03010000)
-#define CHIP_CRYPTO_PAL_PRIVATE_X509(x) MBEDTLS_PRIVATE(x)
-#else
-#define CHIP_CRYPTO_PAL_PRIVATE_X509(x) x
-#endif
-
-static void _log_mbedTLS_error(int error_code)
-{
- if (error_code != 0)
- {
-#if defined(MBEDTLS_ERROR_C)
- char error_str[MAX_ERROR_STR_LEN];
- mbedtls_strerror(error_code, error_str, sizeof(error_str));
- ChipLogError(Crypto, "mbedTLS error: %s", error_str);
-#else
- // Error codes defined in 16-bit negative hex numbers. Ease lookup by printing likewise
- ChipLogError(Crypto, "mbedTLS error: -0x%04X", -static_cast<uint16_t>(error_code));
-#endif
- }
-}
-
-static void _log_PSA_error(psa_status_t status)
-{
- if (status != 0)
- {
- // Error codes defined in 16-bit negative hex numbers. Ease lookup by printing likewise
- ChipLogError(Crypto, "PSA error: %ld", status);
- }
-}
-
-static bool _isValidTagLength(size_t tag_length)
-{
- if (tag_length == 8 || tag_length == 12 || tag_length == 16)
- {
- return true;
- }
- return false;
-}
-
-/**
- * @brief Compare two times
- *
- * @param t1 First time to compare
- * @param t2 Second time to compare
- * @return int 0 If both times are idential to the second, -1 if t1 < t2, 1 if t1 > t2.
- */
-static int timeCompare(mbedtls_x509_time * t1, mbedtls_x509_time * t2)
-{
- VerifyOrReturnValue(t1->year >= t2->year, -1);
- VerifyOrReturnValue(t1->year <= t2->year, 1);
- // Same year
- VerifyOrReturnValue(t1->mon >= t2->mon, -1);
- VerifyOrReturnValue(t1->mon <= t2->mon, 1);
- // Same month
- VerifyOrReturnValue(t1->day >= t2->day, -1);
- VerifyOrReturnValue(t1->day <= t2->day, 1);
- // Same day
- VerifyOrReturnValue(t1->hour >= t2->hour, -1);
- VerifyOrReturnValue(t1->hour <= t2->hour, 1);
- // Same hour
- VerifyOrReturnValue(t1->min >= t2->min, -1);
- VerifyOrReturnValue(t1->min <= t2->min, 1);
- // Same minute
- VerifyOrReturnValue(t1->sec >= t2->sec, -1);
- VerifyOrReturnValue(t1->sec <= t2->sec, 1);
- // Same second
- return 0;
-}
-
-CHIP_ERROR AES_CCM_encrypt(const uint8_t * plaintext, size_t plaintext_length, const uint8_t * aad, size_t aad_length,
- const uint8_t * key, size_t key_length, const uint8_t * nonce, size_t nonce_length, uint8_t * ciphertext,
- uint8_t * tag, size_t tag_length)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- size_t output_length = 0;
- uint8_t * buffer = nullptr;
- bool allocated_buffer = false;
-
- VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(CanCastTo<int>(nonce_length), error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-
- // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying
- if (Uint8::to_uchar(ciphertext) + plaintext_length != Uint8::to_uchar(tag))
- {
- buffer = (uint8_t *) MemoryCalloc(1, plaintext_length + tag_length);
- allocated_buffer = true;
- VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY);
- }
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
- psa_set_key_bits(&attr, key_length * 8);
- psa_set_key_algorithm(&attr, PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(PSA_ALG_CCM, 8));
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_ENCRYPT);
-
- status = psa_driver_wrapper_aead_encrypt(
- &attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length),
- Uint8::to_const_uchar(nonce), nonce_length, Uint8::to_const_uchar(aad), aad_length, Uint8::to_const_uchar(plaintext),
- plaintext_length, allocated_buffer ? buffer : ciphertext, plaintext_length + tag_length, &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == plaintext_length + tag_length, error = CHIP_ERROR_INTERNAL);
-
- if (allocated_buffer)
- {
- memcpy(Uint8::to_uchar(ciphertext), buffer, plaintext_length);
- memcpy(Uint8::to_uchar(tag), buffer + plaintext_length, tag_length);
- memset(buffer, 0, plaintext_length + tag_length);
- }
-
-exit:
- if (allocated_buffer)
- {
- MemoryFree(buffer);
- }
- psa_reset_key_attributes(&attr);
- return error;
-}
-
-CHIP_ERROR AES_CCM_decrypt(const uint8_t * ciphertext, size_t ciphertext_len, const uint8_t * aad, size_t aad_len,
- const uint8_t * tag, size_t tag_length, const uint8_t * key, size_t key_length, const uint8_t * nonce,
- size_t nonce_length, uint8_t * plaintext)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- size_t output_length = 0;
- uint8_t * buffer = nullptr;
- bool allocated_buffer = false;
-
- VerifyOrExit(_isValidTagLength(tag_length), error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(tag != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key_length == kAES_CCM128_Key_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(nonce != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(nonce_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
-
- // If the ciphertext and tag outputs aren't a contiguous buffer, the PSA API requires buffer copying
- if (Uint8::to_const_uchar(ciphertext) + ciphertext_len != Uint8::to_const_uchar(tag))
- {
- buffer = (uint8_t *) MemoryCalloc(1, ciphertext_len + tag_length);
- allocated_buffer = true;
- VerifyOrExit(buffer != nullptr, error = CHIP_ERROR_NO_MEMORY);
- }
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_AES);
- psa_set_key_bits(&attr, key_length * 8);
- psa_set_key_algorithm(&attr, PSA_ALG_AEAD_WITH_AT_LEAST_THIS_LENGTH_TAG(PSA_ALG_CCM, 8));
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DECRYPT);
-
- if (allocated_buffer)
- {
- memcpy(buffer, ciphertext, ciphertext_len);
- memcpy(buffer + ciphertext_len, tag, tag_length);
- }
-
- status = psa_driver_wrapper_aead_decrypt(
- &attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_AEAD_WITH_SHORTENED_TAG(PSA_ALG_CCM, tag_length),
- Uint8::to_const_uchar(nonce), nonce_length, Uint8::to_const_uchar(aad), aad_len, allocated_buffer ? buffer : ciphertext,
- ciphertext_len + tag_length, plaintext, ciphertext_len, &output_length);
-
- if (allocated_buffer)
- {
- memset(buffer, 0, ciphertext_len + tag_length);
- }
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == ciphertext_len, error = CHIP_ERROR_INTERNAL);
-exit:
- if (allocated_buffer)
- {
- MemoryFree(buffer);
- }
-
- psa_reset_key_attributes(&attr);
- return error;
-}
-
-CHIP_ERROR Hash_SHA256(const uint8_t * data, const size_t data_length, uint8_t * out_buffer)
-{
- size_t output_length = 0;
-
- psa_crypto_init();
-
- const psa_status_t result =
- psa_hash_compute(PSA_ALG_SHA_256, data, data_length, out_buffer, PSA_HASH_LENGTH(PSA_ALG_SHA_256), &output_length);
-
- VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
- VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA1(const uint8_t * data, const size_t data_length, uint8_t * out_buffer)
-{
- size_t output_length = 0;
-
- psa_crypto_init();
-
- const psa_status_t result =
- psa_hash_compute(PSA_ALG_SHA_1, data, data_length, out_buffer, PSA_HASH_LENGTH(PSA_ALG_SHA_1), &output_length);
-
- VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
- VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_1), CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-static_assert(kMAX_Hash_SHA256_Context_Size >= sizeof(psa_hash_operation_t),
- "kMAX_Hash_SHA256_Context_Size is too small for the size of underlying psa_hash_operation_t");
-
-static inline psa_hash_operation_t * to_inner_hash_sha256_context(HashSHA256OpaqueContext * context)
-{
- return SafePointerCast<psa_hash_operation_t *>(context);
-}
-
-Hash_SHA256_stream::Hash_SHA256_stream(void)
-{
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- const psa_hash_operation_t initial_context = PSA_HASH_OPERATION_INIT;
- memcpy(context, &initial_context, sizeof(psa_hash_operation_t));
-}
-
-Hash_SHA256_stream::~Hash_SHA256_stream(void)
-{
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- psa_hash_abort(context);
- Clear();
-}
-
-CHIP_ERROR Hash_SHA256_stream::Begin(void)
-{
- psa_crypto_init();
-
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- *context = PSA_HASH_OPERATION_INIT;
- const psa_status_t result = psa_hash_setup(context, PSA_ALG_SHA_256);
-
- VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA256_stream::AddData(const ByteSpan data)
-{
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- const psa_status_t result = psa_hash_update(context, Uint8::to_const_uchar(data.data()), data.size());
-
- VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Hash_SHA256_stream::GetDigest(MutableByteSpan & out_buffer)
-{
- CHIP_ERROR result = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- size_t output_length = 0;
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
-
- VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-
- // Clone the context first since calculating the digest finishes the operation
- psa_hash_operation_t digest_context = PSA_HASH_OPERATION_INIT;
- status = psa_hash_clone(context, &digest_context);
-
- VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
- // Calculate digest on the cloned context
- status = psa_hash_finish(&digest_context, Uint8::to_uchar(out_buffer.data()), out_buffer.size(), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, result = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), result = CHIP_ERROR_INTERNAL);
-exit:
- psa_hash_abort(&digest_context);
- return result;
-}
-
-CHIP_ERROR Hash_SHA256_stream::Finish(MutableByteSpan & out_buffer)
-{
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- size_t output_length = 0;
-
- VerifyOrReturnError(out_buffer.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
- const psa_status_t status = psa_hash_finish(context, Uint8::to_uchar(out_buffer.data()), out_buffer.size(), &output_length);
-
- VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
- VerifyOrReturnError(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-void Hash_SHA256_stream::Clear(void)
-{
- psa_hash_operation_t * context = to_inner_hash_sha256_context(&mContext);
- psa_hash_abort(context);
-}
-
-CHIP_ERROR HKDF_sha::HKDF_SHA256(const uint8_t * secret, const size_t secret_length, const uint8_t * salt, const size_t salt_length,
- const uint8_t * info, const size_t info_length, uint8_t * out_buffer, size_t out_length)
-{
- VerifyOrReturnError(secret != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(secret_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-
- // Salt is optional
- if (salt_length > 0)
- {
- VerifyOrReturnError(salt != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- }
-
- VerifyOrReturnError(info_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(info != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(out_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_derivation_operation_t operation = PSA_KEY_DERIVATION_OPERATION_INIT;
-
- psa_crypto_init();
-
- status = psa_key_derivation_setup(&operation, PSA_ALG_HKDF(PSA_ALG_SHA_256));
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
- if (salt_length > 0)
- {
- status =
- psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_SALT, Uint8::to_const_uchar(salt), salt_length);
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- }
-
- status =
- psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_SECRET, Uint8::to_const_uchar(secret), secret_length);
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
- status = psa_key_derivation_input_bytes(&operation, PSA_KEY_DERIVATION_INPUT_INFO, Uint8::to_const_uchar(info), info_length);
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
- status = psa_key_derivation_output_bytes(&operation, out_buffer, out_length);
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-exit:
- psa_key_derivation_abort(&operation);
-
- return error;
-}
-
-CHIP_ERROR HMAC_sha::HMAC_SHA256(const uint8_t * key, size_t key_length, const uint8_t * message, size_t message_length,
- uint8_t * out_buffer, size_t out_length)
-{
- VerifyOrReturnError(key != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(key_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(message != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(message_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(out_length >= kSHA256_Hash_Length, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
-
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT;
- size_t output_length = 0;
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_HMAC);
- psa_set_key_bits(&attr, key_length * 8);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
- psa_set_key_algorithm(&attr, PSA_ALG_HMAC(PSA_ALG_SHA_256));
-
- status = psa_driver_wrapper_mac_compute(&attr, Uint8::to_const_uchar(key), key_length, PSA_ALG_HMAC(PSA_ALG_SHA_256),
- Uint8::to_const_uchar(message), message_length, out_buffer, out_length, &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-exit:
- psa_mac_abort(&operation);
- psa_reset_key_attributes(&attr);
- return error;
-}
-
-CHIP_ERROR PBKDF2_sha256::pbkdf2_sha256(const uint8_t * password, size_t plen, const uint8_t * salt, size_t slen,
- unsigned int iteration_count, uint32_t key_length, uint8_t * output)
-{
- // TODO: replace inlined algorithm with usage of the PSA key derivation API once implemented
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- size_t output_length = 0;
-
- // Align these buffers on the native data size to speed up the XOR
- static const size_t hash_size_in_native =
- ((PSA_HASH_LENGTH(PSA_ALG_SHA_256) + sizeof(unsigned int) - 1) / sizeof(unsigned int));
- static_assert(hash_size_in_native * sizeof(unsigned int) >= PSA_HASH_LENGTH(PSA_ALG_SHA_256));
-
- unsigned int md1_buffer[hash_size_in_native];
- unsigned int work_buffer[hash_size_in_native];
- uint8_t * md1 = (uint8_t *) md1_buffer;
- uint8_t * work = (uint8_t *) work_buffer;
-
- size_t use_len;
- unsigned char * out_p = output;
- uint8_t * U1 = (uint8_t *) MemoryCalloc(1, slen + 4);
-
- VerifyOrExit(U1 != nullptr, error = CHIP_ERROR_NO_MEMORY);
- VerifyOrExit(password != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(plen > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(salt != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(slen >= kSpake2p_Min_PBKDF_Salt_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(slen <= kSpake2p_Max_PBKDF_Salt_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(key_length > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(output != nullptr, error = CHIP_ERROR_INVALID_ARGUMENT);
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_HMAC);
- psa_set_key_bits(&attr, plen * 8);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_HASH);
- psa_set_key_algorithm(&attr, PSA_ALG_HMAC(PSA_ALG_SHA_256));
-
- // Start with initializing the salt + counter
- memcpy(U1, salt, slen);
- U1[slen] = 0;
- U1[slen + 1] = 0;
- U1[slen + 2] = 0;
- U1[slen + 3] = 1;
-
- // Loop until we have generated the requested key length
- while (key_length)
- {
- // U1 ends up in work
- status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), U1, slen + 4, work,
- PSA_HASH_LENGTH(PSA_ALG_SHA_256), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-
- memcpy(md1, work, PSA_HASH_LENGTH(PSA_ALG_SHA_256));
-
- for (size_t i = 1; i < iteration_count; i++)
- {
- // U2 ends up in md1
- //
-
- status = psa_driver_wrapper_mac_compute(&attr, password, plen, PSA_ALG_HMAC(PSA_ALG_SHA_256), md1, sizeof(md1_buffer),
- md1, sizeof(md1_buffer), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == PSA_HASH_LENGTH(PSA_ALG_SHA_256), error = CHIP_ERROR_INTERNAL);
-
- // U1 xor U2
- //
- for (size_t j = 0; j < hash_size_in_native; j++)
- {
- work_buffer[j] ^= md1_buffer[j];
- }
- }
-
- use_len = (key_length < PSA_HASH_LENGTH(PSA_ALG_SHA_256)) ? key_length : PSA_HASH_LENGTH(PSA_ALG_SHA_256);
- memcpy(out_p, work, use_len);
-
- key_length -= (uint32_t) use_len;
- out_p += use_len;
-
- for (size_t i = 4; i > 0; i--)
- {
- if (++U1[slen + i - 1] != 0)
- {
- break;
- }
- }
- }
-
-exit:
- MemoryFree(U1);
- psa_reset_key_attributes(&attr);
- return error;
-}
-
-CHIP_ERROR add_entropy_source(entropy_source fn_source, void * p_source, size_t threshold)
-{
- // PSA Crypto has its own entropy and doesn't support an override mechanism
- (void) fn_source;
- (void) p_source;
- (void) threshold;
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR DRBG_get_bytes(uint8_t * out_buffer, const size_t out_length)
-{
- VerifyOrReturnError(out_buffer != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(out_length > 0, CHIP_ERROR_INVALID_ARGUMENT);
-
- psa_crypto_init();
- const psa_status_t result = psa_generate_random(Uint8::to_uchar(out_buffer), out_length);
- VerifyOrReturnError(result == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
-
- return CHIP_NO_ERROR;
-}
-
-// CryptoRNG's definition is needed to use the mbedTLS-backed SPAKE2+ and certificate operations
-static int CryptoRNG(void * ctxt, uint8_t * out_buffer, size_t out_length)
-{
- return (chip::Crypto::DRBG_get_bytes(out_buffer, out_length) == CHIP_NO_ERROR) ? 0 : 1;
-}
-
-// Mapping function is used as part of the certificate operations
-mbedtls_ecp_group_id MapECPGroupId(SupportedECPKeyTypes keyType)
-{
- switch (keyType)
- {
- case SupportedECPKeyTypes::ECP256R1:
- return MBEDTLS_ECP_DP_SECP256R1;
- default:
- return MBEDTLS_ECP_DP_NONE;
- }
-}
-
-/*******************************************************************************
- *
- * WARNING: The default (base) implementation of P256Keypair is UNSAFE!
- *
- * Because of the way CHIPCryptoPAL has evolved, it is dictating how a base
- * P256Keypair should behave. This includes:
- * * Allowing using a P256 key for both ECDSA and ECDH operations
- * * Needing to support copying a key through Serialize()/Deserialize()
- * operations. This can't easily be done opaquely on an opaque backend
- * without convoluted forms of reference tracking.
- * * Not including a way to figure out whether the created key is supposed
- * to be ephemeral or long-lived.
- * * Needing to support ingestion of specific-format keys through
- * Deserialize() (to support e.g. the example DAC provider).
- *
- * These conditions have lead to the base implementation of this class in this
- * crypto backend being backed by a plaintext key buffer instead of opaque key
- * references. Usage of the base class is strongly discouraged, and is only
- * implemented to support the in-tree examples which instantiate keys of this
- * base class.
- *
- ******************************************************************************/
-
-typedef struct
-{
- uint8_t privkey[32];
- size_t bitlen;
-} psa_plaintext_ecp_keypair;
-
-static inline psa_plaintext_ecp_keypair * to_keypair(P256KeypairContext * context)
-{
- return SafePointerCast<psa_plaintext_ecp_keypair *>(context);
-}
-
-static inline const psa_plaintext_ecp_keypair * to_const_keypair(const P256KeypairContext * context)
-{
- return SafePointerCast<const psa_plaintext_ecp_keypair *>(context);
-}
-
-CHIP_ERROR P256Keypair::ECDSA_sign_msg(const uint8_t * msg, const size_t msg_length, P256ECDSASignature & out_signature) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- size_t output_length = 0;
- const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
-
- VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, keypair->bitlen);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE);
-
- // use imported key to sign a message
- status =
- psa_driver_wrapper_sign_message(&attr, keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen), PSA_ALG_ECDSA(PSA_ALG_SHA_256),
- msg, msg_length, out_signature.Bytes(), out_signature.Capacity(), &output_length);
-
- VerifyOrReturnError(status == PSA_SUCCESS, CHIP_ERROR_INTERNAL);
- VerifyOrReturnError(output_length == kP256_ECDSA_Signature_Length_Raw, CHIP_ERROR_INTERNAL);
- VerifyOrReturnError(out_signature.SetLength(output_length) == CHIP_NO_ERROR, CHIP_ERROR_INTERNAL);
-
-exit:
- _log_PSA_error(status);
- psa_reset_key_attributes(&attr);
-
- return error;
-}
-
-CHIP_ERROR P256PublicKey::ECDSA_validate_msg_signature(const uint8_t * msg, const size_t msg_length,
- const P256ECDSASignature & signature) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-
- VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, 256);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_VERIFY_MESSAGE);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-
- // use imported key to verify a message
- status = psa_driver_wrapper_verify_message(&attr, Uint8::to_const_uchar(*this), Length(), PSA_ALG_ECDSA(PSA_ALG_SHA_256), msg,
- msg_length, signature.ConstBytes(), signature.Length());
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INVALID_SIGNATURE);
-exit:
- _log_PSA_error(status);
- psa_reset_key_attributes(&attr);
-
- return error;
-}
-
-CHIP_ERROR P256PublicKey::ECDSA_validate_hash_signature(const uint8_t * hash, const size_t hash_length,
- const P256ECDSASignature & signature) const
-{
- VerifyOrReturnError(hash != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(hash_length == kSHA256_Hash_Length, CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrReturnError(signature.Length() == kP256_ECDSA_Signature_Length_Raw, CHIP_ERROR_INVALID_ARGUMENT);
-
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
-
- // Step 1: import public key as volatile
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_PUBLIC_KEY(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, 256);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_VERIFY_HASH);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
-
- // use imported key to verify a hash
- status = psa_driver_wrapper_verify_hash(&attr, Uint8::to_const_uchar(*this), Length(), PSA_ALG_ECDSA(PSA_ALG_SHA_256), hash,
- hash_length, signature.ConstBytes(), signature.Length());
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INVALID_SIGNATURE);
-exit:
- _log_PSA_error(status);
- psa_reset_key_attributes(&attr);
- return error;
-}
-
-CHIP_ERROR P256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_key, P256ECDHDerivedSecret & out_secret) const
-{
- // Todo: replace with driver call once key derivation through the driver wrapper has been figured out
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- mbedtls_svc_key_id_t key_id = 0;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- size_t output_length = 0;
- const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
-
- VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
-
- // Step 1: import plaintext key as volatile for ECDH
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, keypair->bitlen);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
-
- status = psa_import_key(&attr, keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen), &key_id);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
-
- // Step 2: do key derivation
- status = psa_raw_key_agreement(PSA_ALG_ECDH, key_id, Uint8::to_const_uchar(remote_public_key), remote_public_key.Length(),
- Uint8::to_uchar(out_secret),
- (out_secret.Length() == 0) ? out_secret.Capacity() : out_secret.Length(), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- SuccessOrExit(out_secret.SetLength(output_length));
-
-exit:
- _log_PSA_error(status);
- // Step 3: destroy imported key
- psa_reset_key_attributes(&attr);
- if (key_id != 0)
- {
- psa_destroy_key(key_id);
- }
- return error;
-}
-
-void ClearSecretData(uint8_t * buf, size_t len)
-{
- mbedtls_platform_zeroize(buf, len);
-}
-
-// THE BELOW IS FROM `third_party/openthread/repo/third_party/mbedtls/repo/library/constant_time.c` since
-// mbedtls_ct_memcmp is not available on Linux somehow :(
-int mbedtls_ct_memcmp_copy(const void * a, const void * b, size_t n)
-{
- size_t i;
- volatile const unsigned char * A = (volatile const unsigned char *) a;
- volatile const unsigned char * B = (volatile const unsigned char *) b;
- volatile unsigned char diff = 0;
-
- for (i = 0; i < n; i++)
- {
- /* Read volatile data in order before computing diff.
- * This avoids IAR compiler warning:
- * 'the order of volatile accesses is undefined ..' */
- unsigned char x = A[i], y = B[i];
- diff |= x ^ y;
- }
-
- return ((int) diff);
-}
-
-bool IsBufferContentEqualConstantTime(const void * a, const void * b, size_t n)
-{
- return mbedtls_ct_memcmp_copy(a, b, n) == 0;
-}
-
-CHIP_ERROR P256Keypair::Initialize()
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
- size_t output_length;
-
- if (mInitialized)
- {
- return CHIP_ERROR_INCORRECT_STATE;
- }
-
- // Step 1: Generate a volatile new key
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- psa_crypto_init();
-
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, 256);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE | PSA_KEY_USAGE_EXPORT);
-
- status = psa_driver_wrapper_generate_key(&attr, keypair->privkey, sizeof(keypair->privkey), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == kP256_PrivateKey_Length, error = CHIP_ERROR_INTERNAL);
-
- keypair->bitlen = 256;
-
- // Step 2: Export the public key into the pubkey member
- status = psa_driver_wrapper_export_public_key(&attr, keypair->privkey, sizeof(keypair->privkey), Uint8::to_uchar(mPublicKey),
- mPublicKey.Length(), &output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(output_length == kP256_PublicKey_Length, error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_PSA_error(status);
- if (error == CHIP_NO_ERROR)
- {
- mInitialized = true;
- }
- psa_reset_key_attributes(&attr);
-
- return error;
-}
-
-CHIP_ERROR P256Keypair::Serialize(P256SerializedKeypair & output) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- const psa_plaintext_ecp_keypair * keypair = to_const_keypair(&mKeypair);
- size_t len = output.Length() == 0 ? output.Capacity() : output.Length();
- Encoding::BufferWriter bbuf(output, len);
-
- VerifyOrExit(mInitialized, error = CHIP_ERROR_WELL_UNINITIALIZED);
-
- bbuf.Put(mPublicKey, mPublicKey.Length());
-
- VerifyOrExit(bbuf.Available() == sizeof(keypair->privkey), error = CHIP_ERROR_INTERNAL);
-
- bbuf.Put(keypair->privkey, PSA_BITS_TO_BYTES(keypair->bitlen));
- VerifyOrExit(bbuf.Fit(), error = CHIP_ERROR_BUFFER_TOO_SMALL);
-
- output.SetLength(bbuf.Needed());
-
-exit:
- return error;
-}
-
-CHIP_ERROR P256Keypair::Deserialize(P256SerializedKeypair & input)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
- Encoding::BufferWriter bbuf(mPublicKey, mPublicKey.Length());
-
- VerifyOrExit(input.Length() == mPublicKey.Length() + kP256_PrivateKey_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-
- Clear();
-
- memcpy(keypair->privkey, Uint8::to_uchar(input) + mPublicKey.Length(), kP256_PrivateKey_Length);
- keypair->bitlen = 256;
-
- bbuf.Put((const uint8_t *) input, mPublicKey.Length());
- VerifyOrExit(bbuf.Fit(), error = CHIP_ERROR_NO_MEMORY);
-
- mInitialized = true;
-
-exit:
- return error;
-}
-
-void P256Keypair::Clear()
-{
- if (mInitialized)
- {
- psa_plaintext_ecp_keypair * keypair = to_keypair(&mKeypair);
- memset(keypair, 0, sizeof(psa_plaintext_ecp_keypair));
- mInitialized = false;
- }
-}
-
-P256Keypair::~P256Keypair()
-{
- Clear();
-}
-
-CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * out_csr, size_t & csr_length) const
-{
- MutableByteSpan csr(out_csr, csr_length);
- CHIP_ERROR err = GenerateCertificateSigningRequest(this, csr);
- csr_length = (CHIP_NO_ERROR == err) ? csr.size() : 0;
- return err;
-}
-
-CHIP_ERROR VerifyCertificateSigningRequest(const uint8_t * csr_buf, size_t csr_length, P256PublicKey & pubkey)
-{
-#if defined(MBEDTLS_X509_CSR_PARSE_C)
- ReturnErrorOnFailure(VerifyCertificateSigningRequestFormat(csr_buf, csr_length));
-
- // TODO: For some embedded targets, mbedTLS library doesn't have mbedtls_x509_csr_parse_der, and mbedtls_x509_csr_parse_free.
- // Taking a step back, embedded targets likely will not process CSR requests. Adding this action item to reevaluate
- // this if there's a need for this processing for embedded targets.
- CHIP_ERROR error = CHIP_NO_ERROR;
- size_t pubkey_size = 0;
-
- mbedtls_ecp_keypair * keypair = nullptr;
-
- P256ECDSASignature signature;
- MutableByteSpan out_raw_sig_span(signature.Bytes(), signature.Capacity());
-
- mbedtls_x509_csr csr;
- mbedtls_x509_csr_init(&csr);
-
- int result = mbedtls_x509_csr_parse_der(&csr, csr_buf, csr_length);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- // Verify the signature algorithm and public key type
- VerifyOrExit(csr.CHIP_CRYPTO_PAL_PRIVATE(sig_md) == MBEDTLS_MD_SHA256, error = CHIP_ERROR_UNSUPPORTED_SIGNATURE_TYPE);
- VerifyOrExit(csr.CHIP_CRYPTO_PAL_PRIVATE(sig_pk) == MBEDTLS_PK_ECDSA, error = CHIP_ERROR_WRONG_KEY_TYPE);
-
- keypair = mbedtls_pk_ec(csr.CHIP_CRYPTO_PAL_PRIVATE_X509(pk));
-
- // Copy the public key from the CSR
- result = mbedtls_ecp_point_write_binary(&keypair->CHIP_CRYPTO_PAL_PRIVATE(grp), &keypair->CHIP_CRYPTO_PAL_PRIVATE(Q),
- MBEDTLS_ECP_PF_UNCOMPRESSED, &pubkey_size, Uint8::to_uchar(pubkey), pubkey.Length());
-
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(pubkey_size == pubkey.Length(), error = CHIP_ERROR_INTERNAL);
-
- // Convert DER signature to raw signature
- error = EcdsaAsn1SignatureToRaw(kP256_FE_Length,
- ByteSpan{ csr.CHIP_CRYPTO_PAL_PRIVATE(sig).CHIP_CRYPTO_PAL_PRIVATE_X509(p),
- csr.CHIP_CRYPTO_PAL_PRIVATE(sig).CHIP_CRYPTO_PAL_PRIVATE_X509(len) },
- out_raw_sig_span);
-
- VerifyOrExit(error == CHIP_NO_ERROR, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(out_raw_sig_span.size() == (kP256_FE_Length * 2), error = CHIP_ERROR_INTERNAL);
- signature.SetLength(out_raw_sig_span.size());
-
- // Verify the signature using the public key
- error = pubkey.ECDSA_validate_msg_signature(csr.CHIP_CRYPTO_PAL_PRIVATE_X509(cri).CHIP_CRYPTO_PAL_PRIVATE_X509(p),
- csr.CHIP_CRYPTO_PAL_PRIVATE_X509(cri).CHIP_CRYPTO_PAL_PRIVATE_X509(len), signature);
-
- SuccessOrExit(error);
-
-exit:
- mbedtls_x509_csr_free(&csr);
- _log_mbedTLS_error(result);
- return error;
-#else
- ChipLogError(Crypto, "MBEDTLS_X509_CSR_PARSE_C is not enabled. CSR cannot be parsed");
- return CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
-#endif
-}
-
-typedef struct Spake2p_Context
-{
- mbedtls_ecp_group curve;
- mbedtls_ecp_point M;
- mbedtls_ecp_point N;
- mbedtls_ecp_point X;
- mbedtls_ecp_point Y;
- mbedtls_ecp_point L;
- mbedtls_ecp_point Z;
- mbedtls_ecp_point V;
-
- mbedtls_mpi w0;
- mbedtls_mpi w1;
- mbedtls_mpi xy;
- mbedtls_mpi tempbn;
-} Spake2p_Context;
-
-static inline Spake2p_Context * to_inner_spake2p_context(Spake2pOpaqueContext * context)
-{
- return SafePointerCast<Spake2p_Context *>(context);
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::InitInternal(void)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- memset(context, 0, sizeof(Spake2p_Context));
-
- mbedtls_ecp_group_init(&context->curve);
- result = mbedtls_ecp_group_load(&context->curve, MBEDTLS_ECP_DP_SECP256R1);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- VerifyOrExit(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256) != nullptr, error = CHIP_ERROR_INTERNAL);
-
- mbedtls_ecp_point_init(&context->M);
- mbedtls_ecp_point_init(&context->N);
- mbedtls_ecp_point_init(&context->X);
- mbedtls_ecp_point_init(&context->Y);
- mbedtls_ecp_point_init(&context->L);
- mbedtls_ecp_point_init(&context->V);
- mbedtls_ecp_point_init(&context->Z);
- M = &context->M;
- N = &context->N;
- X = &context->X;
- Y = &context->Y;
- L = &context->L;
- V = &context->V;
- Z = &context->Z;
-
- mbedtls_mpi_init(&context->w0);
- mbedtls_mpi_init(&context->w1);
- mbedtls_mpi_init(&context->xy);
- mbedtls_mpi_init(&context->tempbn);
- w0 = &context->w0;
- w1 = &context->w1;
- xy = &context->xy;
- tempbn = &context->tempbn;
-
- G = &context->curve.G;
- order = &context->curve.N;
-
- return error;
-
-exit:
- _log_mbedTLS_error(result);
- Clear();
- return error;
-}
-
-void Spake2p_P256_SHA256_HKDF_HMAC::Clear()
-{
- VerifyOrReturn(state != CHIP_SPAKE2P_STATE::PREINIT);
-
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- mbedtls_ecp_point_free(&context->M);
- mbedtls_ecp_point_free(&context->N);
- mbedtls_ecp_point_free(&context->X);
- mbedtls_ecp_point_free(&context->Y);
- mbedtls_ecp_point_free(&context->L);
- mbedtls_ecp_point_free(&context->Z);
- mbedtls_ecp_point_free(&context->V);
-
- mbedtls_mpi_free(&context->w0);
- mbedtls_mpi_free(&context->w1);
- mbedtls_mpi_free(&context->xy);
- mbedtls_mpi_free(&context->tempbn);
-
- mbedtls_ecp_group_free(&context->curve);
-
- state = CHIP_SPAKE2P_STATE::PREINIT;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::Mac(const uint8_t * key, size_t key_len, const uint8_t * in, size_t in_len,
- MutableByteSpan & out_span)
-{
- HMAC_sha hmac;
- VerifyOrReturnError(out_span.size() >= kSHA256_Hash_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
- ReturnErrorOnFailure(hmac.HMAC_SHA256(key, key_len, in, in_len, out_span.data(), kSHA256_Hash_Length));
- out_span = out_span.SubSpan(0, kSHA256_Hash_Length);
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::MacVerify(const uint8_t * key, size_t key_len, const uint8_t * mac, size_t mac_len,
- const uint8_t * in, size_t in_len)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- uint8_t computed_mac[kSHA256_Hash_Length];
- MutableByteSpan computed_mac_span{ computed_mac };
- VerifyOrExit(mac_len == kSHA256_Hash_Length, error = CHIP_ERROR_INVALID_ARGUMENT);
-
- SuccessOrExit(error = Mac(key, key_len, in, in_len, computed_mac_span));
- VerifyOrExit(computed_mac_span.size() == mac_len, error = CHIP_ERROR_INTERNAL);
-
- VerifyOrExit(IsBufferContentEqualConstantTime(mac, computed_mac, kSHA256_Hash_Length), error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FELoad(const uint8_t * in, size_t in_len, void * fe)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- result = mbedtls_mpi_read_binary((mbedtls_mpi *) fe, Uint8::to_const_uchar(in), in_len);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_mpi_mod_mpi((mbedtls_mpi *) fe, (mbedtls_mpi *) fe, (const mbedtls_mpi *) order);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEWrite(const void * fe, uint8_t * out, size_t out_len)
-{
- if (mbedtls_mpi_write_binary((const mbedtls_mpi *) fe, Uint8::to_uchar(out), out_len) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEGenerate(void * fe)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- result = mbedtls_ecp_gen_privkey(&context->curve, (mbedtls_mpi *) fe, CryptoRNG, nullptr);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::FEMul(void * fer, const void * fe1, const void * fe2)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- result = mbedtls_mpi_mul_mpi((mbedtls_mpi *) fer, (const mbedtls_mpi *) fe1, (const mbedtls_mpi *) fe2);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_mpi_mod_mpi((mbedtls_mpi *) fer, (mbedtls_mpi *) fer, (const mbedtls_mpi *) order);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointLoad(const uint8_t * in, size_t in_len, void * R)
-{
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_ecp_point_read_binary(&context->curve, (mbedtls_ecp_point *) R, Uint8::to_const_uchar(in), in_len) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointWrite(const void * R, uint8_t * out, size_t out_len)
-{
- memset(out, 0, out_len);
-
- size_t mbedtls_out_len = out_len;
-
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_ecp_point_write_binary(&context->curve, (const mbedtls_ecp_point *) R, MBEDTLS_ECP_PF_UNCOMPRESSED,
- &mbedtls_out_len, Uint8::to_uchar(out), out_len) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointMul(void * R, const void * P1, const void * fe1)
-{
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_ecp_mul(&context->curve, (mbedtls_ecp_point *) R, (const mbedtls_mpi *) fe1, (const mbedtls_ecp_point *) P1,
- CryptoRNG, nullptr) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointAddMul(void * R, const void * P1, const void * fe1, const void * P2,
- const void * fe2)
-{
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_ecp_muladd(&context->curve, (mbedtls_ecp_point *) R, (const mbedtls_mpi *) fe1, (const mbedtls_ecp_point *) P1,
- (const mbedtls_mpi *) fe2, (const mbedtls_ecp_point *) P2) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointInvert(void * R)
-{
- mbedtls_ecp_point * Rp = (mbedtls_ecp_point *) R;
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_mpi_sub_mpi(&Rp->CHIP_CRYPTO_PAL_PRIVATE(Y), &context->curve.P, &Rp->CHIP_CRYPTO_PAL_PRIVATE(Y)) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointCofactorMul(void * R)
-{
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::ComputeL(uint8_t * Lout, size_t * L_len, const uint8_t * w1in, size_t w1in_len)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
-
- mbedtls_ecp_group curve;
- mbedtls_mpi w1_bn;
- mbedtls_ecp_point Ltemp;
-
- mbedtls_ecp_group_init(&curve);
- mbedtls_mpi_init(&w1_bn);
- mbedtls_ecp_point_init(&Ltemp);
-
- result = mbedtls_ecp_group_load(&curve, MBEDTLS_ECP_DP_SECP256R1);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_mpi_read_binary(&w1_bn, Uint8::to_const_uchar(w1in), w1in_len);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_mpi_mod_mpi(&w1_bn, &w1_bn, &curve.N);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_ecp_mul(&curve, &Ltemp, &w1_bn, &curve.G, CryptoRNG, nullptr);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- memset(Lout, 0, *L_len);
-
- result = mbedtls_ecp_point_write_binary(&curve, &Ltemp, MBEDTLS_ECP_PF_UNCOMPRESSED, L_len, Uint8::to_uchar(Lout), *L_len);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_ecp_point_free(&Ltemp);
- mbedtls_mpi_free(&w1_bn);
- mbedtls_ecp_group_free(&curve);
-
- return error;
-}
-
-CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointIsValid(void * R)
-{
- Spake2p_Context * context = to_inner_spake2p_context(&mSpake2pContext);
-
- if (mbedtls_ecp_check_pubkey(&context->curve, (mbedtls_ecp_point *) R) != 0)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-constexpr uint8_t sOID_AttributeType_CommonName[] = { 0x55, 0x04, 0x03 };
-constexpr uint8_t sOID_AttributeType_MatterVendorId[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0xA2, 0x7C, 0x02, 0x01 };
-constexpr uint8_t sOID_AttributeType_MatterProductId[] = { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x82, 0xA2, 0x7C, 0x02, 0x02 };
-constexpr uint8_t sOID_SigAlgo_ECDSAWithSHA256[] = { 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x04, 0x03, 0x02 };
-constexpr uint8_t sOID_Extension_BasicConstraints[] = { 0x55, 0x1D, 0x13 };
-constexpr uint8_t sOID_Extension_KeyUsage[] = { 0x55, 0x1D, 0x0F };
-constexpr uint8_t sOID_Extension_SubjectKeyIdentifier[] = { 0x55, 0x1D, 0x0E };
-constexpr uint8_t sOID_Extension_AuthorityKeyIdentifier[] = { 0x55, 0x1D, 0x23 };
-
-/**
- * Compares an mbedtls_asn1_buf structure (oidBuf) to a reference OID represented as uint8_t array (oid).
- */
-#define OID_CMP(oid, oidBuf) \
- ((MBEDTLS_ASN1_OID == (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(tag)) && \
- (sizeof(oid) == (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(len)) && \
- (memcmp((oid), (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(p), (oidBuf).CHIP_CRYPTO_PAL_PRIVATE_X509(len)) == 0))
-
-CHIP_ERROR VerifyAttestationCertificateFormat(const ByteSpan & cert, AttestationCertType certType)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- int result = 0;
- mbedtls_x509_crt mbed_cert;
- unsigned char * p = nullptr;
- const unsigned char * end = nullptr;
- size_t len = 0;
- bool extBasicPresent = false;
- bool extKeyUsagePresent = false;
-
- VerifyOrReturnError(!cert.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
- mbedtls_x509_crt_init(&mbed_cert);
-
- result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(cert.data()), cert.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- // "version" value is 1 higher than the actual encoded value.
- VerifyOrExit(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(version) - 1 == 2, error = CHIP_ERROR_INTERNAL);
-
- // Verify signature algorithms is ECDSA with SHA256.
- VerifyOrExit(OID_CMP(sOID_SigAlgo_ECDSAWithSHA256, mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(sig_oid)),
- error = CHIP_ERROR_INTERNAL);
-
- // Verify public key presence and format.
- {
- Crypto::P256PublicKey pubkey;
- SuccessOrExit(error = ExtractPubkeyFromX509Cert(cert, pubkey));
- }
-
- p = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
- end = p + mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- while (p < end)
- {
- mbedtls_x509_buf extOID = { 0, 0, nullptr };
- int extCritical = 0;
-
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- /* Get extension ID */
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OID);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(tag) = MBEDTLS_ASN1_OID;
- extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(len) = len;
- extOID.CHIP_CRYPTO_PAL_PRIVATE_X509(p) = p;
- p += len;
-
- /* Get optional critical */
- result = mbedtls_asn1_get_bool(&p, end, &extCritical);
- VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_INTERNAL);
-
- /* Data should be octet string type */
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- if (OID_CMP(sOID_Extension_BasicConstraints, extOID))
- {
- int isCA = 0;
- int pathLen = -1;
- unsigned char * seqStart = p;
-
- VerifyOrExit(extCritical, error = CHIP_ERROR_INTERNAL);
- extBasicPresent = true;
-
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
- if (len > 0)
- {
- result = mbedtls_asn1_get_bool(&p, end, &isCA);
- VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_INTERNAL);
-
- if (p != seqStart + len)
- {
- result = mbedtls_asn1_get_int(&p, end, &pathLen);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
- }
- }
-
- if (certType == AttestationCertType::kDAC)
- {
- VerifyOrExit(!isCA && pathLen == -1, error = CHIP_ERROR_INTERNAL);
- }
- else if (certType == AttestationCertType::kPAI)
- {
- VerifyOrExit(isCA && pathLen == 0, error = CHIP_ERROR_INTERNAL);
- }
- else
- {
- VerifyOrExit(isCA && (pathLen == -1 || pathLen == 0 || pathLen == 1), error = CHIP_ERROR_INTERNAL);
- }
- }
- else if (OID_CMP(sOID_Extension_KeyUsage, extOID))
- {
- mbedtls_x509_bitstring bs = { 0, 0, nullptr };
- unsigned int keyUsage = 0;
-
- VerifyOrExit(extCritical, error = CHIP_ERROR_INTERNAL);
- extKeyUsagePresent = true;
-
- result = mbedtls_asn1_get_bitstring(&p, p + len, &bs);
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- for (size_t i = 0; i < bs.CHIP_CRYPTO_PAL_PRIVATE_X509(len) && i < sizeof(unsigned int); i++)
- {
- keyUsage |= static_cast<unsigned int>(bs.CHIP_CRYPTO_PAL_PRIVATE_X509(p)[i]) << (8 * i);
- }
-
- if (certType == AttestationCertType::kDAC)
- {
- // SHALL only have the digitalSignature bit set.
- VerifyOrExit(keyUsage == MBEDTLS_X509_KU_DIGITAL_SIGNATURE, error = CHIP_ERROR_INTERNAL);
- }
- else
- {
- bool keyCertSignFlag = keyUsage & MBEDTLS_X509_KU_KEY_CERT_SIGN;
- bool crlSignFlag = keyUsage & MBEDTLS_X509_KU_CRL_SIGN;
- bool otherFlags =
- keyUsage & ~(MBEDTLS_X509_KU_CRL_SIGN | MBEDTLS_X509_KU_KEY_CERT_SIGN | MBEDTLS_X509_KU_DIGITAL_SIGNATURE);
- VerifyOrExit(keyCertSignFlag && crlSignFlag && !otherFlags, error = CHIP_ERROR_INTERNAL);
- }
- }
- else
- {
- p += len;
- }
- }
-
- // Verify basic and key usage extensions are present.
- VerifyOrExit(extBasicPresent && extKeyUsagePresent, error = CHIP_ERROR_INTERNAL);
-
- // Verify that SKID and AKID extensions are present.
- {
- uint8_t kidBuf[kSubjectKeyIdentifierLength];
- MutableByteSpan kid(kidBuf);
- SuccessOrExit(error = ExtractSKIDFromX509Cert(cert, kid));
- if (certType == AttestationCertType::kDAC || certType == AttestationCertType::kPAI)
- {
- // Mandatory extension for DAC and PAI certs.
- SuccessOrExit(error = ExtractAKIDFromX509Cert(cert, kid));
- }
- }
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbed_cert);
-
-#else
- (void) cert;
- (void) certType;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-CHIP_ERROR ValidateCertificateChain(const uint8_t * rootCertificate, size_t rootCertificateLen, const uint8_t * caCertificate,
- size_t caCertificateLen, const uint8_t * leafCertificate, size_t leafCertificateLen,
- CertificateChainValidationResult & result)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- mbedtls_x509_crt certChain;
- mbedtls_x509_crt rootCert;
- mbedtls_x509_time leaf_valid_from;
- mbedtls_x509_crt * cert = NULL;
- int mbedResult;
- uint32_t flags;
- int compare_from = 0;
- int compare_until = 0;
-
- result = CertificateChainValidationResult::kInternalFrameworkError;
-
- VerifyOrReturnError(rootCertificate != nullptr && rootCertificateLen != 0,
- (result = CertificateChainValidationResult::kRootArgumentInvalid, CHIP_ERROR_INVALID_ARGUMENT));
- VerifyOrReturnError(leafCertificate != nullptr && leafCertificateLen != 0,
- (result = CertificateChainValidationResult::kLeafArgumentInvalid, CHIP_ERROR_INVALID_ARGUMENT));
-
- mbedtls_x509_crt_init(&certChain);
- mbedtls_x509_crt_init(&rootCert);
-
- /* Start of chain */
- mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(leafCertificate), leafCertificateLen);
- VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kLeafFormatInvalid, error = CHIP_ERROR_INTERNAL));
- leaf_valid_from = certChain.valid_from;
-
- /* Add the intermediate to the chain, if present */
- if (caCertificate != nullptr && caCertificateLen > 0)
- {
- mbedResult = mbedtls_x509_crt_parse(&certChain, Uint8::to_const_uchar(caCertificate), caCertificateLen);
- VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kICAFormatInvalid, error = CHIP_ERROR_INTERNAL));
- }
-
- /* Parse the root cert */
- mbedResult = mbedtls_x509_crt_parse(&rootCert, Uint8::to_const_uchar(rootCertificate), rootCertificateLen);
- VerifyOrExit(mbedResult == 0, (result = CertificateChainValidationResult::kRootFormatInvalid, error = CHIP_ERROR_INTERNAL));
-
- /* Validates that intermediate and root certificates are valid at the time of the leaf certificate's start time. */
- compare_from = timeCompare(&leaf_valid_from, &rootCert.valid_from);
- compare_until = timeCompare(&leaf_valid_from, &rootCert.valid_to);
- VerifyOrExit((compare_from >= 0) && (compare_until <= 0),
- (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED));
- cert = certChain.next;
- while (cert)
- {
- compare_from = timeCompare(&leaf_valid_from, &cert->valid_from);
- compare_until = timeCompare(&leaf_valid_from, &cert->valid_to);
- VerifyOrExit((compare_from >= 0) && (compare_until <= 0),
- (result = CertificateChainValidationResult::kChainInvalid, error = CHIP_ERROR_CERT_NOT_TRUSTED));
- cert = cert->next;
- }
-
- /* Verify the chain against the root */
- mbedResult = mbedtls_x509_crt_verify(&certChain, &rootCert, NULL, NULL, &flags, NULL, NULL);
-
- switch (mbedResult)
- {
- case 0:
- VerifyOrExit(flags == 0, (result = CertificateChainValidationResult::kInternalFrameworkError, error = CHIP_ERROR_INTERNAL));
- result = CertificateChainValidationResult::kSuccess;
- break;
- case MBEDTLS_ERR_X509_CERT_VERIFY_FAILED:
- result = CertificateChainValidationResult::kChainInvalid;
- error = CHIP_ERROR_CERT_NOT_TRUSTED;
- break;
- default:
- SuccessOrExit((result = CertificateChainValidationResult::kInternalFrameworkError, error = CHIP_ERROR_INTERNAL));
- }
-
-exit:
- _log_mbedTLS_error(mbedResult);
- mbedtls_x509_crt_free(&certChain);
- mbedtls_x509_crt_free(&rootCert);
-
-#else
- (void) rootCertificate;
- (void) rootCertificateLen;
- (void) caCertificate;
- (void) caCertificateLen;
- (void) leafCertificate;
- (void) leafCertificateLen;
- (void) result;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-inline bool IsTimeGreaterThanEqual(const mbedtls_x509_time * const timeA, const mbedtls_x509_time * const timeB)
-{
-
- // checks if two values are different and if yes, then returns first > second.
-#define RETURN_STRICTLY_GREATER_IF_DIFFERENT(component) \
- { \
- auto valueA = timeA->CHIP_CRYPTO_PAL_PRIVATE_X509(component); \
- auto valueB = timeB->CHIP_CRYPTO_PAL_PRIVATE_X509(component); \
- \
- if (valueA != valueB) \
- { \
- return valueA > valueB; \
- } \
- }
-
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(year);
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(mon);
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(day);
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(hour);
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(min);
- RETURN_STRICTLY_GREATER_IF_DIFFERENT(sec);
-
- // all above are equal
- return true;
-}
-
-CHIP_ERROR IsCertificateValidAtIssuance(const ByteSpan & referenceCertificate, const ByteSpan & toBeEvaluatedCertificate)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- mbedtls_x509_crt mbedReferenceCertificate;
- mbedtls_x509_crt mbedToBeEvaluatedCertificate;
- mbedtls_x509_time refNotBeforeTime;
- mbedtls_x509_time tbeNotBeforeTime;
- mbedtls_x509_time tbeNotAfterTime;
- int result;
-
- VerifyOrReturnError(!referenceCertificate.empty() && !toBeEvaluatedCertificate.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
- mbedtls_x509_crt_init(&mbedReferenceCertificate);
- mbedtls_x509_crt_init(&mbedToBeEvaluatedCertificate);
-
- result = mbedtls_x509_crt_parse(&mbedReferenceCertificate, Uint8::to_const_uchar(referenceCertificate.data()),
- referenceCertificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- result = mbedtls_x509_crt_parse(&mbedToBeEvaluatedCertificate, Uint8::to_const_uchar(toBeEvaluatedCertificate.data()),
- toBeEvaluatedCertificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- refNotBeforeTime = mbedReferenceCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from);
- tbeNotBeforeTime = mbedToBeEvaluatedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from);
- tbeNotAfterTime = mbedToBeEvaluatedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_to);
-
- // check if referenceCertificate is issued at or after tbeCertificate's notBefore timestamp
- VerifyOrExit(IsTimeGreaterThanEqual(&refNotBeforeTime, &tbeNotBeforeTime), error = CHIP_ERROR_CERT_EXPIRED);
-
- // check if referenceCertificate is issued at or before tbeCertificate's notAfter timestamp
- VerifyOrExit(IsTimeGreaterThanEqual(&tbeNotAfterTime, &refNotBeforeTime), error = CHIP_ERROR_CERT_EXPIRED);
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbedReferenceCertificate);
- mbedtls_x509_crt_free(&mbedToBeEvaluatedCertificate);
-
-#else
- (void) referenceCertificate;
- (void) toBeEvaluatedCertificate;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-CHIP_ERROR IsCertificateValidAtCurrentTime(const ByteSpan & certificate)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- mbedtls_x509_crt mbedCertificate;
- int result;
-
- VerifyOrReturnError(!certificate.empty(), CHIP_ERROR_INVALID_ARGUMENT);
-
- mbedtls_x509_crt_init(&mbedCertificate);
-
- result = mbedtls_x509_crt_parse(&mbedCertificate, Uint8::to_const_uchar(certificate.data()), certificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- // check if certificate's notBefore timestamp is earlier than or equal to current time.
- result = mbedtls_x509_time_is_past(&mbedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_from));
- VerifyOrExit(result == 1, error = CHIP_ERROR_CERT_EXPIRED);
-
- // check if certificate's notAfter timestamp is later than current time.
- result = mbedtls_x509_time_is_future(&mbedCertificate.CHIP_CRYPTO_PAL_PRIVATE_X509(valid_to));
- VerifyOrExit(result == 1, error = CHIP_ERROR_CERT_EXPIRED);
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbedCertificate);
-
-#else
- (void) certificate;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-CHIP_ERROR ExtractPubkeyFromX509Cert(const ByteSpan & certificate, Crypto::P256PublicKey & pubkey)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- mbedtls_x509_crt mbed_cert;
- mbedtls_ecp_keypair * keypair = nullptr;
- size_t pubkey_size = 0;
-
- mbedtls_x509_crt_init(&mbed_cert);
-
- int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- VerifyOrExit(mbedtls_pk_get_type(&(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(pk))) == MBEDTLS_PK_ECKEY,
- error = CHIP_ERROR_INVALID_ARGUMENT);
-
- keypair = mbedtls_pk_ec(mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(pk));
- VerifyOrExit(keypair->CHIP_CRYPTO_PAL_PRIVATE(grp).id == MapECPGroupId(pubkey.Type()), error = CHIP_ERROR_INVALID_ARGUMENT);
- // Copy the public key from the cert in raw point format
- result =
- mbedtls_ecp_point_write_binary(&keypair->CHIP_CRYPTO_PAL_PRIVATE(grp), &keypair->CHIP_CRYPTO_PAL_PRIVATE(Q),
- MBEDTLS_ECP_PF_UNCOMPRESSED, &pubkey_size, Uint8::to_uchar(pubkey.Bytes()), pubkey.Length());
-
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
- VerifyOrExit(pubkey_size == pubkey.Length(), error = CHIP_ERROR_INTERNAL);
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbed_cert);
-
-#else
- (void) certificate;
- (void) pubkey;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-namespace {
-
-CHIP_ERROR ExtractKIDFromX509Cert(bool extractSKID, const ByteSpan & certificate, MutableByteSpan & kid)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_ERROR_NOT_FOUND;
- mbedtls_x509_crt mbed_cert;
- unsigned char * p = nullptr;
- const unsigned char * end = nullptr;
- size_t len = 0;
-
- mbedtls_x509_crt_init(&mbed_cert);
-
- int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- // TODO: The mbedTLS team is working on supporting SKID and AKID extensions processing.
- // Once it is supported, this code should be updated.
-
- p = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
- end = mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(p) +
- mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(v3_ext).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
- while (p < end)
- {
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OID);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
- mbedtls_x509_buf extOID = { MBEDTLS_ASN1_OID, len, p };
- bool extractCurrentExtSKID = extractSKID && OID_CMP(sOID_Extension_SubjectKeyIdentifier, extOID);
- bool extractCurrentExtAKID = !extractSKID && OID_CMP(sOID_Extension_AuthorityKeyIdentifier, extOID);
- p += len;
-
- int is_critical = 0;
- result = mbedtls_asn1_get_bool(&p, end, &is_critical);
- VerifyOrExit(result == 0 || result == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
-
- if (extractCurrentExtSKID || extractCurrentExtAKID)
- {
- if (extractCurrentExtSKID)
- {
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_OCTET_STRING);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
- }
- else
- {
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
- result = mbedtls_asn1_get_tag(&p, end, &len, MBEDTLS_ASN1_CONTEXT_SPECIFIC);
- VerifyOrExit(result == 0, error = CHIP_ERROR_WRONG_CERT_TYPE);
- // Other optional fields, authorityCertIssuer and authorityCertSerialNumber,
- // will be skipped if present.
- }
- VerifyOrExit(len == kSubjectKeyIdentifierLength, error = CHIP_ERROR_WRONG_CERT_TYPE);
- VerifyOrExit(len <= kid.size(), error = CHIP_ERROR_BUFFER_TOO_SMALL);
- memcpy(kid.data(), p, len);
- if (kid.size() > len)
- {
- kid.reduce_size(len);
- }
- ExitNow(error = CHIP_NO_ERROR);
- break;
- }
- p += len;
- }
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbed_cert);
-
-#else
- (void) certificate;
- (void) kid;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-} // namespace
-
-CHIP_ERROR ExtractSKIDFromX509Cert(const ByteSpan & certificate, MutableByteSpan & skid)
-{
- return ExtractKIDFromX509Cert(true, certificate, skid);
-}
-
-CHIP_ERROR ExtractAKIDFromX509Cert(const ByteSpan & certificate, MutableByteSpan & akid)
-{
- return ExtractKIDFromX509Cert(false, certificate, akid);
-}
-
-CHIP_ERROR ExtractVIDPIDFromX509Cert(const ByteSpan & certificate, AttestationCertVidPid & vidpid)
-{
-#if defined(MBEDTLS_X509_CRT_PARSE_C)
- CHIP_ERROR error = CHIP_NO_ERROR;
- mbedtls_x509_crt mbed_cert;
- mbedtls_asn1_named_data * dnIterator = nullptr;
- AttestationCertVidPid vidpidFromCN;
-
- mbedtls_x509_crt_init(&mbed_cert);
-
- int result = mbedtls_x509_crt_parse(&mbed_cert, Uint8::to_const_uchar(certificate.data()), certificate.size());
- VerifyOrExit(result == 0, error = CHIP_ERROR_INTERNAL);
-
- for (dnIterator = &mbed_cert.CHIP_CRYPTO_PAL_PRIVATE_X509(subject); dnIterator != nullptr;
- dnIterator = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(next))
- {
- DNAttrType attrType = DNAttrType::kUnspecified;
- if (OID_CMP(sOID_AttributeType_CommonName, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
- {
- attrType = DNAttrType::kCommonName;
- }
- else if (OID_CMP(sOID_AttributeType_MatterVendorId, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
- {
- attrType = DNAttrType::kMatterVID;
- }
- else if (OID_CMP(sOID_AttributeType_MatterProductId, dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(oid)))
- {
- attrType = DNAttrType::kMatterPID;
- }
-
- size_t val_len = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(val).CHIP_CRYPTO_PAL_PRIVATE_X509(len);
- uint8_t * val_p = dnIterator->CHIP_CRYPTO_PAL_PRIVATE_X509(val).CHIP_CRYPTO_PAL_PRIVATE_X509(p);
- error = ExtractVIDPIDFromAttributeString(attrType, ByteSpan(val_p, val_len), vidpid, vidpidFromCN);
- SuccessOrExit(error);
- }
-
- // If Matter Attributes were not found use values extracted from the CN Attribute,
- // which might be uninitialized as well.
- if (!vidpid.Initialized())
- {
- vidpid = vidpidFromCN;
- }
-
-exit:
- _log_mbedTLS_error(result);
- mbedtls_x509_crt_free(&mbed_cert);
-
-#else
- (void) certificate;
- (void) vidpid;
- CHIP_ERROR error = CHIP_ERROR_NOT_IMPLEMENTED;
-#endif // defined(MBEDTLS_X509_CRT_PARSE_C)
-
- return error;
-}
-
-} // namespace Crypto
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp b/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
index aad7493..618b5a6 100644
--- a/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/ConfigurationManagerImpl.cpp
@@ -19,7 +19,7 @@
/**
* @file
* Provides the implementation of the Device Layer ConfigurationManager object
- * for EFR32 platforms using the Silicon Labs SDK.
+ * for SiWx917 platforms using the Silicon Labs SDK.
*/
/* this file behaves like a config.h, comes first */
#include <platform/internal/CHIPDeviceLayerInternal.h>
@@ -30,7 +30,7 @@
#include <platform/DiagnosticDataProvider.h>
#include <platform/silabs/SilabsConfig.h>
-#include "em_rmu.h"
+#include "core_cm4.h"
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION
#include "wfx_host_events.h"
@@ -60,8 +60,6 @@
IncreaseBootCount();
// It is possible to configure the possible reset sources with RMU_ResetControl
// In this case, we keep Reset control at default setting
- rebootCause = RMU_ResetCauseGet();
- RMU_ResetCauseClear();
err = CHIP_NO_ERROR;
diff --git a/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp b/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp
deleted file mode 100644
index c38a5e5..0000000
--- a/src/platform/silabs/SiWx917/ConnectivityManagerImpl.cpp
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Nest Labs, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <lib/support/CodeUtils.h>
-#include <lib/support/logging/CHIPLogging.h>
-#include <platform/ConnectivityManager.h>
-#include <platform/internal/BLEManager.h>
-
-#include <platform/internal/GenericConnectivityManagerImpl_UDP.ipp>
-
-#if INET_CONFIG_ENABLE_TCP_ENDPOINT
-#include <platform/internal/GenericConnectivityManagerImpl_TCP.ipp>
-#endif
-
-#if CHIP_DEVICE_CONFIG_ENABLE_CHIPOBLE
-#include <platform/internal/GenericConnectivityManagerImpl_BLE.ipp>
-#endif
-
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
-#include <platform/internal/GenericConnectivityManagerImpl_Thread.ipp>
-#endif
-
-using namespace ::chip;
-using namespace ::chip::Inet;
-using namespace ::chip::System;
-using namespace ::chip::TLV;
-using namespace ::chip::DeviceLayer::Internal;
-
-namespace chip {
-namespace DeviceLayer {
-
-ConnectivityManagerImpl ConnectivityManagerImpl::sInstance;
-
-CHIP_ERROR ConnectivityManagerImpl::_Init()
-{
- CHIP_ERROR err = CHIP_NO_ERROR;
-
- // Initialize the generic base classes that require it.
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
- GenericConnectivityManagerImpl_Thread<ConnectivityManagerImpl>::_Init();
-#endif
- SuccessOrExit(err);
-
-exit:
- return err;
-}
-
-void ConnectivityManagerImpl::_OnPlatformEvent(const ChipDeviceEvent * event)
-{
- // Forward the event to the generic base classes as needed.
-#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
- GenericConnectivityManagerImpl_Thread<ConnectivityManagerImpl>::_OnPlatformEvent(event);
-#endif
-}
-
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h b/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h
deleted file mode 100644
index 58123c1..0000000
--- a/src/platform/silabs/SiWx917/Efr32OpaqueKeypair.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 2022 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <crypto/CHIPCryptoPAL.h>
-#include <platform/CHIPDeviceError.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-typedef uint16_t EFR32OpaqueKeyId;
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdUnknown = 0xFFFFU; // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdVolatile = 0xFFFEU; // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdPersistentMin = 0x0U; // Do not modify, will impact existing deployments
-constexpr EFR32OpaqueKeyId kEFR32OpaqueKeyIdPersistentMax = 0x1FFU; // Do not decrease, will impact existing deployments
-
-enum class EFR32OpaqueKeyUsages : uint8_t
-{
- ECDSA_P256_SHA256 = 0,
- ECDH_P256 = 1,
-};
-
-/**
- * @brief Base class for opaque keys
- *
- * Deriving from this class allows using it as a base class for operations
- * which don't expose the private key independent of key size.
- **/
-class EFR32OpaqueKeypair
-{
-public:
- EFR32OpaqueKeypair();
- virtual ~EFR32OpaqueKeypair();
-
- /**
- * @brief Load a keypair with given key ID
- *
- * If no key exists under the given ID, an error is returned
- * and the object is unusable for operations.
- *
- * @param key_id key ID under which this key was created
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Load(EFR32OpaqueKeyId key_id);
-
- /**
- * @brief Create a new keypair with given ID and usage
- *
- * If a key already exists under the given ID, an error is returned
- * and no new key is created.
- *
- * @param key_id key ID under which to store this key. Set to 0
- * for a non-persistent key which gets destructed
- * when the lifetime of this object ends, or set
- * to any other value to store the key under that
- * ID.
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Create(EFR32OpaqueKeyId key_id, EFR32OpaqueKeyUsages usage);
-
- /**
- * @brief Get the public key for this keypair
- *
- * @param output Output buffer to put public key (in 0x04 || X || Y format)
- * @param output_size Size of \p output
- * @param output_length Amount of bytes put in \p output on success
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR GetPublicKey(uint8_t * output, size_t output_size, size_t * output_length) const;
-
- /**
- * @brief Get the key ID for this keypair
- *
- * @return Returns kEFR32OpaqueKeyIdUnknown for an uninitialised/invalid
- * key, kEFR32OpaqueKeyIdVolatile for a volatile key, and a key
- * ID in the range [kEFR32OpaqueKeyIdPersistentMin, kEFR32OpaqueKeyIdPersistentMax]
- * for valid persistent keys.
- **/
- EFR32OpaqueKeyId GetKeyId() const;
-
- /**
- * @brief Use this keypair to sign a message using the ECDSA-SHA256 algorithm
- *
- * @param msg Message buffer to sign
- * @param msg_len Size of \p msg in bytes
- * @param output Output buffer to write signature to. Signature
- * is in raw format (i.e. binary concatenation of
- * r and s)
- * @param output_size Size of output buffer
- * @param output_length Amount of bytes written into output buffer
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Sign(const uint8_t * msg, size_t msg_len, uint8_t * output, size_t output_size, size_t * output_length) const;
-
- /**
- * @brief Use this keypair to derive a key using the raw ECDH algorithm
- *
- * @param their_key Buffer containing raw uncompressed public key
- * of party to derive with
- * @param their_key_len Size of \p their_key in bytes
- * @param output Output buffer to write derived bytes to
- * @param output_size Size of output buffer
- * @param output_length Amount of bytes written into output buffer
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Derive(const uint8_t * their_key, size_t their_key_len, uint8_t * output, size_t output_size,
- size_t * output_length) const;
-
- /**
- * @brief Delete the keypair from storage
- *
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Delete();
-
-protected:
- void * mContext = nullptr;
- bool mHasKey = false;
- bool mIsPersistent = false;
- uint8_t * mPubkeyRef = nullptr;
- size_t mPubkeySize = 0;
- size_t mPubkeyLength = 0;
-};
-
-/**
- * @brief Derived class of P256Keypair for using opaque keys
- *
- * The signature and compiled form of this class is suboptimal due to how
- * the P256Keypair isn't really an abstract interface, but rather partly
- * interface / partly implementation. Future optimisation should look at
- * converting P256Keypair to a fully abstract interface.
- **/
-class EFR32OpaqueP256Keypair : public chip::Crypto::P256Keypair, public EFR32OpaqueKeypair
-{
-public:
- EFR32OpaqueP256Keypair();
- ~EFR32OpaqueP256Keypair() override;
-
- /**
- * @brief Initialize the keypair.
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Initialize() override;
-
- /**
- * @brief Serialize the keypair (unsupported on opaque keys)
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Serialize(chip::Crypto::P256SerializedKeypair & output) const override;
-
- /**
- * @brief Deserialize the keypair (unsupported on opaque keys)
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR Deserialize(chip::Crypto::P256SerializedKeypair & input) override;
-
- /**
- * @brief Generate a new Certificate Signing Request (CSR).
- * @param csr Newly generated CSR in DER format
- * @param csr_length The caller provides the length of input buffer (csr). The function returns the actual length of generated
- *CSR.
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR NewCertificateSigningRequest(uint8_t * csr, size_t & csr_length) const override;
-
- /**
- * @brief A function to sign a msg using ECDSA
- * @param msg Message that needs to be signed
- * @param msg_length Length of message
- * @param out_signature Buffer that will hold the output signature. The signature consists of: 2 EC elements (r and s),
- * in raw <r,s> point form (see SEC1).
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR ECDSA_sign_msg(const uint8_t * msg, size_t msg_length,
- chip::Crypto::P256ECDSASignature & out_signature) const override;
-
- /**
- * @brief A function to derive a shared secret using ECDH
- *
- * This implements the CHIP_Crypto_ECDH(PrivateKey myPrivateKey, PublicKey theirPublicKey) cryptographic primitive
- * from the specification, using this class's private key from `mKeypair` as `myPrivateKey` and the remote
- * public key from `remote_public_key` as `theirPublicKey`.
- *
- * @param remote_public_key Public key of remote peer with which we are trying to establish secure channel. remote_public_key is
- * ASN.1 DER encoded as padded big-endian field elements as described in SEC 1: Elliptic Curve Cryptography
- * [https://www.secg.org/sec1-v2.pdf]
- * @param out_secret Buffer to write out secret into. This is a byte array representing the x coordinate of the shared secret.
- * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise
- **/
- CHIP_ERROR ECDH_derive_secret(const chip::Crypto::P256PublicKey & remote_public_key,
- chip::Crypto::P256ECDHDerivedSecret & out_secret) const override;
-
- /** @brief Return public key for the keypair.
- **/
- const chip::Crypto::P256PublicKey & Pubkey() const override;
-
-private:
- chip::Crypto::P256PublicKey mPubKey;
-};
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp b/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp
deleted file mode 100644
index ae9a0f6..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOpaqueKeypair.cpp
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- * Copyright (c) 2022 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Efr32OpaqueKeypair.h"
-#include "em_device.h"
-#include <psa/crypto.h>
-
-#include <lib/core/CHIPSafeCasts.h>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/SafeInt.h>
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-using chip::Crypto::P256ECDHDerivedSecret;
-using chip::Crypto::P256ECDSASignature;
-using chip::Crypto::P256Keypair;
-using chip::Crypto::P256PublicKey;
-using chip::Crypto::P256SerializedKeypair;
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/*******************************************************************************
- *
- * PSA key ID range for storing Matter Opaque keys
- *
- ******************************************************************************/
-#define PSA_KEY_ID_FOR_MATTER_MIN (0x00004400)
-#define PSA_KEY_ID_FOR_MATTER_MAX (0x000045FF)
-#define PSA_KEY_ID_FOR_MATTER_SIZE (PSA_KEY_ID_FOR_MATTER_MAX - PSA_KEY_ID_FOR_MATTER_MIN + 1)
-
-static_assert((kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin) < PSA_KEY_ID_FOR_MATTER_SIZE,
- "Not enough PSA range to store all allowed opaque key IDs");
-
-#if defined(SEMAILBOX_PRESENT) && (_SILICON_LABS_SECURITY_FEATURE == _SILICON_LABS_SECURITY_FEATURE_VAULT)
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_SL_SE_OPAQUE
-#elif defined(CRYPTOACC_PRESENT) && defined(SEPUF_PRESENT) && defined(SL_TRUSTZONE_NONSECURE)
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_SL_CRYPTOACC_OPAQUE
-#else
-#define PSA_CRYPTO_LOCATION_FOR_DEVICE PSA_KEY_LOCATION_LOCAL_STORAGE
-#endif
-
-static void _log_PSA_error(psa_status_t status)
-{
- if (status != PSA_SUCCESS)
- {
- ChipLogError(Crypto, "PSA error: %ld", status);
- }
-}
-
-/*******************************************************************************
- *
- * PSA Crypto backed implementation of EFR32OpaqueKeypair
- *
- ******************************************************************************/
-
-static bool is_opaque_key_valid(EFR32OpaqueKeyId id)
-{
- if (id == kEFR32OpaqueKeyIdVolatile)
- {
- return true;
- }
- else if (id >= kEFR32OpaqueKeyIdPersistentMin && id <= (kEFR32OpaqueKeyIdPersistentMin + PSA_KEY_ID_FOR_MATTER_SIZE))
- {
- return true;
- }
-
- return false;
-}
-
-static mbedtls_svc_key_id_t psa_key_id_from_opaque(EFR32OpaqueKeyId id)
-{
- if (id == kEFR32OpaqueKeyIdVolatile || !is_opaque_key_valid(id))
- {
- return 0;
- }
-
- return PSA_KEY_ID_FOR_MATTER_MIN + (id - kEFR32OpaqueKeyIdPersistentMin);
-}
-
-static EFR32OpaqueKeyId opaque_key_id_from_psa(mbedtls_svc_key_id_t id)
-{
- if (id == 0)
- {
- return kEFR32OpaqueKeyIdVolatile;
- }
- else if (id >= PSA_KEY_ID_FOR_MATTER_MIN && id <= PSA_KEY_ID_FOR_MATTER_MAX)
- {
- return (id + kEFR32OpaqueKeyIdPersistentMin) - PSA_KEY_ID_FOR_MATTER_MIN;
- }
- else
- {
- return kEFR32OpaqueKeyIdUnknown;
- }
-}
-
-EFR32OpaqueKeypair::EFR32OpaqueKeypair()
-{
- psa_crypto_init();
- // Avoid having a reference to PSA datatypes in the signature of this class
- mContext = MemoryCalloc(1, sizeof(mbedtls_svc_key_id_t));
-}
-
-EFR32OpaqueKeypair::~EFR32OpaqueKeypair()
-{
- // Free key resources
- if (mContext != nullptr)
- {
- // Delete volatile keys, since nobody else can after we drop the key ID.
- if (!mIsPersistent)
- {
- Delete();
- }
-
- MemoryFree(mContext);
- mContext = nullptr;
- }
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Load(EFR32OpaqueKeyId opaque_id)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- mbedtls_svc_key_id_t key_id = 0;
-
- VerifyOrExit(opaque_id != kEFR32OpaqueKeyIdVolatile, error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(is_opaque_key_valid(opaque_id), error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
-
- // If the object contains a volatile key, clean it up before reusing the object storage
- if (mHasKey && !mIsPersistent)
- {
- Delete();
- }
-
- key_id = psa_key_id_from_opaque(opaque_id);
-
- status = psa_export_public_key(key_id, mPubkeyRef, mPubkeySize, &mPubkeyLength);
-
- if (status == PSA_ERROR_DOES_NOT_EXIST)
- {
- error = CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND;
- goto exit;
- }
-
- VerifyOrExit(status == PSA_SUCCESS, {
- _log_PSA_error(status);
- error = CHIP_ERROR_INTERNAL;
- });
-
- // Store the key ID and mark the key as valid
- *(mbedtls_svc_key_id_t *) mContext = key_id;
- mHasKey = true;
- mIsPersistent = true;
-
-exit:
- if (error != CHIP_NO_ERROR)
- {
- memset(mPubkeyRef, 0, mPubkeySize);
- }
-
- return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Create(EFR32OpaqueKeyId opaque_id, EFR32OpaqueKeyUsages usage)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
- psa_key_attributes_t attr = PSA_KEY_ATTRIBUTES_INIT;
- mbedtls_svc_key_id_t key_id = 0;
-
- VerifyOrExit(is_opaque_key_valid(opaque_id), error = CHIP_ERROR_INVALID_ARGUMENT);
- VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
-
- if (opaque_id == kEFR32OpaqueKeyIdVolatile)
- {
- psa_set_key_lifetime(
- &attr, PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_LIFETIME_VOLATILE, PSA_CRYPTO_LOCATION_FOR_DEVICE));
- }
- else
- {
- psa_key_handle_t key_handle;
-
- key_id = psa_key_id_from_opaque(opaque_id);
-
- // Check if the key already exists
- int ret = psa_open_key(key_id, &key_handle);
- if (PSA_SUCCESS == ret)
- {
- // WARNING: Existing key! This is caused by a problem in the key store.
- // The key must be destroyed, otherwhise the device won't recover.
- ChipLogError(Crypto, "WARNING: PSA key recycled: %d / %ld", opaque_id, key_id);
- psa_destroy_key(key_id);
- }
-
- psa_set_key_id(&attr, key_id);
- psa_set_key_lifetime(
- &attr, PSA_KEY_LIFETIME_FROM_PERSISTENCE_AND_LOCATION(PSA_KEY_LIFETIME_PERSISTENT, PSA_CRYPTO_LOCATION_FOR_DEVICE));
- }
-
- switch (usage)
- {
- case EFR32OpaqueKeyUsages::ECDSA_P256_SHA256:
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, 256);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDSA(PSA_ALG_SHA_256));
- // Need hash signing permissions because the CSR generation uses sign_hash internally
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_SIGN_MESSAGE | PSA_KEY_USAGE_SIGN_HASH);
- break;
- case EFR32OpaqueKeyUsages::ECDH_P256:
- psa_set_key_type(&attr, PSA_KEY_TYPE_ECC_KEY_PAIR(PSA_ECC_FAMILY_SECP_R1));
- psa_set_key_bits(&attr, 256);
- psa_set_key_algorithm(&attr, PSA_ALG_ECDH);
- psa_set_key_usage_flags(&attr, PSA_KEY_USAGE_DERIVE);
- break;
- }
-
- status = psa_generate_key(&attr, &key_id);
- VerifyOrExit(status == PSA_SUCCESS, {
- _log_PSA_error(status);
- error = CHIP_ERROR_INTERNAL;
- });
-
- // Export the public key
- status = psa_export_public_key(key_id, mPubkeyRef, mPubkeySize, &mPubkeyLength);
- if (PSA_SUCCESS != status)
- {
- _log_PSA_error(status);
- // Key generation succeeded, but pubkey export did not. To avoid
- // memory leaks, delete the generated key before returning the error
- psa_destroy_key(key_id);
- error = CHIP_ERROR_INTERNAL;
- goto exit;
- }
-
- // Store the key ID and mark the key as valid
- mHasKey = true;
- mIsPersistent = opaque_id != kEFR32OpaqueKeyIdVolatile;
-
-exit:
- psa_reset_key_attributes(&attr);
- if (mContext)
- {
- if (CHIP_NO_ERROR == error)
- {
- *(mbedtls_svc_key_id_t *) mContext = key_id;
- }
- else
- {
- *(mbedtls_svc_key_id_t *) mContext = 0;
- }
- }
- return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::GetPublicKey(uint8_t * output, size_t output_size, size_t * output_length) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
- if (output_size >= mPubkeyLength)
- {
- memcpy(output, mPubkeyRef, mPubkeyLength);
- *output_length = mPubkeyLength;
- }
- else
- {
- error = CHIP_ERROR_BUFFER_TOO_SMALL;
- }
-exit:
- return error;
-}
-
-EFR32OpaqueKeyId EFR32OpaqueKeypair::GetKeyId() const
-{
- if (!mHasKey)
- {
- return kEFR32OpaqueKeyIdUnknown;
- }
-
- if (!mIsPersistent)
- {
- return kEFR32OpaqueKeyIdVolatile;
- }
-
- return opaque_key_id_from_psa(*(mbedtls_svc_key_id_t *) mContext);
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Sign(const uint8_t * msg, size_t msg_len, uint8_t * output, size_t output_size,
- size_t * output_length) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
-
- VerifyOrExit(mContext, error = CHIP_ERROR_INCORRECT_STATE);
- VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
- status = psa_sign_message(*(mbedtls_svc_key_id_t *) mContext, PSA_ALG_ECDSA(PSA_ALG_SHA_256), msg, msg_len, output, output_size,
- output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, {
- _log_PSA_error(status);
- error = CHIP_ERROR_INTERNAL;
- });
-
-exit:
- return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Derive(const uint8_t * their_key, size_t their_key_len, uint8_t * output, size_t output_size,
- size_t * output_length) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
-
- VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
- status = psa_raw_key_agreement(PSA_ALG_ECDH, *(mbedtls_svc_key_id_t *) mContext, their_key, their_key_len, output, output_size,
- output_length);
-
- VerifyOrExit(status == PSA_SUCCESS, {
- _log_PSA_error(status);
- error = CHIP_ERROR_INTERNAL;
- });
-
-exit:
- return error;
-}
-
-CHIP_ERROR EFR32OpaqueKeypair::Delete()
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- psa_status_t status = PSA_ERROR_BAD_STATE;
-
- VerifyOrExit(mHasKey, error = CHIP_ERROR_INCORRECT_STATE);
-
- status = psa_destroy_key(*(mbedtls_svc_key_id_t *) mContext);
- VerifyOrExit(status == PSA_SUCCESS, {
- _log_PSA_error(status);
- error = CHIP_ERROR_INTERNAL;
- });
-
-exit:
- mHasKey = false;
- mIsPersistent = false;
- memset(mPubkeyRef, 0, mPubkeySize);
- if (mContext)
- {
- *(mbedtls_svc_key_id_t *) mContext = 0;
- }
- return error;
-}
-
-/*******************************************************************************
- *
- * PSA Crypto backed implementation of EFR32OpaqueP256Keypair
- *
- ******************************************************************************/
-EFR32OpaqueP256Keypair::EFR32OpaqueP256Keypair()
-{
- mPubkeyRef = mPubKey.Bytes();
- mPubkeySize = mPubKey.Length();
- mPubkeyLength = 0;
-}
-
-EFR32OpaqueP256Keypair::~EFR32OpaqueP256Keypair() {}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Initialize()
-{
- if (mPubkeyLength > 0)
- {
- // already have a key - ECDH use case where CASESession is calling Initialize()
- return CHIP_NO_ERROR;
- }
-
- ChipLogError(Crypto, "Initialize() is invalid on opaque keys, use Create() instead");
- return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Serialize(P256SerializedKeypair & output) const
-{
- ChipLogError(Crypto, "Serialisation is invalid on opaque keys, share the object instead");
- return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::Deserialize(P256SerializedKeypair & input)
-{
- ChipLogError(Crypto, "Serialisation is invalid on opaque keys");
- return CHIP_ERROR_NOT_IMPLEMENTED;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::NewCertificateSigningRequest(uint8_t * out_csr, size_t & csr_length) const
-{
- MutableByteSpan csr(out_csr, csr_length);
- CHIP_ERROR err = GenerateCertificateSigningRequest(this, csr);
- csr_length = (CHIP_NO_ERROR == err) ? csr.size() : 0;
- return err;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::ECDSA_sign_msg(const uint8_t * msg, size_t msg_length, P256ECDSASignature & out_signature) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- size_t output_length = 0;
-
- VerifyOrExit((msg != nullptr) && (msg_length > 0), error = CHIP_ERROR_INVALID_ARGUMENT);
-
- error = Sign(msg, msg_length, out_signature.Bytes(), out_signature.Capacity(), &output_length);
-
- SuccessOrExit(error);
- SuccessOrExit(out_signature.SetLength(output_length));
-exit:
- return error;
-}
-
-CHIP_ERROR EFR32OpaqueP256Keypair::ECDH_derive_secret(const P256PublicKey & remote_public_key,
- P256ECDHDerivedSecret & out_secret) const
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- size_t output_length = 0;
-
- error = Derive(Uint8::to_const_uchar(remote_public_key), remote_public_key.Length(), Uint8::to_uchar(out_secret),
- (out_secret.Length() == 0) ? out_secret.Capacity() : out_secret.Length(), &output_length);
-
- SuccessOrExit(error);
- SuccessOrExit(out_secret.SetLength(output_length));
-exit:
- return error;
-}
-
-const P256PublicKey & EFR32OpaqueP256Keypair::Pubkey() const
-{
- return mPubKey;
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp b/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp
deleted file mode 100644
index e8fdf61..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * Copyright (c) 2022 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "Efr32PsaOperationalKeystore.h"
-
-#include <crypto/OperationalKeystore.h>
-#include <lib/core/CHIPError.h>
-#include <lib/core/CHIPTLV.h>
-#include <lib/core/DataModelTypes.h>
-#include <lib/support/CHIPMem.h>
-#include <lib/support/CodeUtils.h>
-#include <lib/support/SafeInt.h>
-
-#include "Efr32OpaqueKeypair.h"
-#include <platform/silabs/SilabsConfig.h>
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-static_assert((sizeof(FabricIndex) == 1), "Implementation is not prepared for large fabric indices");
-static_assert(SL_MATTER_MAX_STORED_OP_KEYS <= (kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin),
- "Not enough opaque keys available to cover all requested operational keys");
-static_assert((CHIP_CONFIG_MAX_FABRICS + 1) <= SL_MATTER_MAX_STORED_OP_KEYS,
- "Not enough operational keys requested to cover all potential fabrics (+1 staging for fabric update)");
-static_assert(SL_MATTER_MAX_STORED_OP_KEYS >= 1, "Minimum supported amount of operational keys is 1");
-
-using namespace chip::Crypto;
-
-using chip::Platform::MemoryCalloc;
-using chip::Platform::MemoryFree;
-
-Efr32PsaOperationalKeystore::~Efr32PsaOperationalKeystore()
-{
- Deinit();
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::Init()
-{
- // Detect existing keymap size
- CHIP_ERROR error = CHIP_NO_ERROR;
- size_t wantedLen = SL_MATTER_MAX_STORED_OP_KEYS * sizeof(FabricIndex);
- size_t existingLen = 0;
- bool update_cache = false;
-
- if (SILABSConfig::ConfigValueExists(SILABSConfig::kConfigKey_OpKeyMap, existingLen))
- {
- // There's a pre-existing key map on disk. Size the map to read it fully.
- size_t outLen = 0;
-
- if (existingLen > (kEFR32OpaqueKeyIdPersistentMax - kEFR32OpaqueKeyIdPersistentMin) * sizeof(FabricIndex))
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- // Upsize the map if the config was changed
- if (existingLen < wantedLen)
- {
- existingLen = wantedLen;
- }
-
- mKeyMap = (FabricIndex *) MemoryCalloc(1, existingLen);
- VerifyOrExit(mKeyMap, error = CHIP_ERROR_NO_MEMORY);
-
- // Read the existing key map
- error = SILABSConfig::ReadConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, (uint8_t *) mKeyMap, existingLen, outLen);
- SuccessOrExit(error);
-
- // If upsizing, extend the map with undefined indices
- for (size_t i = (outLen / sizeof(FabricIndex)); i < (existingLen / sizeof(FabricIndex)); i++)
- {
- mKeyMap[i] = kUndefinedFabricIndex;
- }
-
- // If the config has changed, check whether it can be downsized fully or partially
- if (existingLen > wantedLen)
- {
- size_t highest_found_index = 0;
- for (size_t i = (wantedLen / sizeof(FabricIndex)); i < (existingLen / sizeof(FabricIndex)); i++)
- {
- if (mKeyMap[i] != kUndefinedFabricIndex)
- {
- highest_found_index = i;
- }
- }
-
- // set size to the smallest that will fit the upper opaque key ID in use
- if (highest_found_index > 0)
- {
- existingLen = (highest_found_index + 1) * sizeof(FabricIndex);
- update_cache = true;
- }
- }
-
- // Set the key map size
- mKeyMapSize = existingLen;
- }
- else
- {
- // No key map on disk. Create and initialize a new one.
- mKeyMap = (FabricIndex *) MemoryCalloc(1, wantedLen);
- VerifyOrExit(mKeyMap, error = CHIP_ERROR_NO_MEMORY);
-
- for (size_t i = 0; i < (wantedLen / sizeof(FabricIndex)); i++)
- {
- mKeyMap[i] = kUndefinedFabricIndex;
- }
-
- mKeyMapSize = wantedLen;
-
- update_cache = true;
- }
-
- // Write-out keymap if needed
- if (update_cache)
- {
- error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
- SuccessOrExit(error);
- }
-
- // Initialize cache key
- mCachedKey = Platform::New<EFR32OpaqueP256Keypair>();
- VerifyOrExit(mCachedKey, error = CHIP_ERROR_NO_MEMORY);
-
-exit:
- if (error != CHIP_NO_ERROR)
- {
- Deinit();
- return error;
- }
-
- mIsInitialized = true;
- return CHIP_NO_ERROR;
-}
-
-EFR32OpaqueKeyId Efr32PsaOperationalKeystore::FindKeyIdForFabric(FabricIndex fabricIndex) const
-{
- // Search the map linearly to find a matching index slot
- for (size_t i = 0; i < (mKeyMapSize / sizeof(FabricIndex)); i++)
- {
- if (mKeyMap[i] == fabricIndex)
- {
- // Found a match
- return i + kEFR32OpaqueKeyIdPersistentMin;
- }
- }
-
- return kEFR32OpaqueKeyIdUnknown;
-}
-
-bool Efr32PsaOperationalKeystore::HasOpKeypairForFabric(FabricIndex fabricIndex) const
-{
- VerifyOrReturnError(mIsInitialized, false);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex), false);
-
- // If there was a pending keypair, then there's really a usable key
- if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex) && (mPendingKeypair != nullptr))
- {
- return true;
- }
-
- // Check whether we have a match in the map
- if (FindKeyIdForFabric(fabricIndex) != kEFR32OpaqueKeyIdUnknown)
- {
- return true;
- }
-
- return false;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::NewOpKeypairForFabric(FabricIndex fabricIndex,
- MutableByteSpan & outCertificateSigningRequest)
-{
- CHIP_ERROR error = CHIP_NO_ERROR;
- VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
- // If a key is pending, we cannot generate for a different fabric index until we commit or revert.
- if ((mPendingFabricIndex != kUndefinedFabricIndex) && (fabricIndex != mPendingFabricIndex))
- {
- return CHIP_ERROR_INVALID_FABRIC_INDEX;
- }
-
- VerifyOrReturnError(outCertificateSigningRequest.size() >= Crypto::kMAX_CSR_Length, CHIP_ERROR_BUFFER_TOO_SMALL);
-
- // Generate new key
- EFR32OpaqueKeyId id = kEFR32OpaqueKeyIdUnknown;
-
- if (mPendingFabricIndex != kUndefinedFabricIndex)
- {
- // If we already have a pending key, delete it and put a new one in its place
- id = mPendingKeypair->GetKeyId();
- if (id == kEFR32OpaqueKeyIdUnknown)
- {
- ResetPendingKey();
- }
- else
- {
- mPendingKeypair->Delete();
- if (id == kEFR32OpaqueKeyIdVolatile)
- {
- id = kEFR32OpaqueKeyIdUnknown;
- }
- }
- }
-
- if (id == kEFR32OpaqueKeyIdUnknown)
- {
- // Try to find an available opaque ID in the map
- id = FindKeyIdForFabric(kUndefinedFabricIndex);
-
- if (!mPendingKeypair)
- {
- mPendingKeypair = Platform::New<EFR32OpaqueP256Keypair>();
- }
- }
-
- if (id == kEFR32OpaqueKeyIdUnknown)
- {
- // Could not find a free spot in the map
- return CHIP_ERROR_NO_MEMORY;
- }
-
- // Create new key on the old or found key ID
- error = mPendingKeypair->Create(id, EFR32OpaqueKeyUsages::ECDSA_P256_SHA256);
- if (error != CHIP_NO_ERROR)
- {
- ResetPendingKey();
- return error;
- }
-
- // Set CSR and state
- size_t csrLength = outCertificateSigningRequest.size();
- error = mPendingKeypair->NewCertificateSigningRequest(outCertificateSigningRequest.data(), csrLength);
- if (error != CHIP_NO_ERROR)
- {
- ResetPendingKey();
- return error;
- }
-
- outCertificateSigningRequest.reduce_size(csrLength);
- mPendingFabricIndex = fabricIndex;
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::ActivateOpKeypairForFabric(FabricIndex fabricIndex,
- const Crypto::P256PublicKey & nocPublicKey)
-{
- VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
- // Validate public key being activated matches last generated pending keypair
- VerifyOrReturnError(mPendingKeypair->Pubkey().Matches(nocPublicKey), CHIP_ERROR_INVALID_PUBLIC_KEY);
-
- mIsPendingKeypairActive = true;
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::CommitOpKeypairForFabric(FabricIndex fabricIndex)
-{
- VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INVALID_FABRIC_INDEX);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex) && (fabricIndex == mPendingFabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
- VerifyOrReturnError(mIsPendingKeypairActive == true, CHIP_ERROR_INCORRECT_STATE);
-
- // Add key association to key map
- EFR32OpaqueKeyId id = mPendingKeypair->GetKeyId();
-
- if (id == kEFR32OpaqueKeyIdUnknown || id == kEFR32OpaqueKeyIdVolatile)
- {
- ResetPendingKey();
- return CHIP_ERROR_INTERNAL;
- }
-
- // Guard against array out-of-bounds (should not happen with correctly initialised keys)
- size_t keymap_index = id - kEFR32OpaqueKeyIdPersistentMin;
- if (keymap_index >= (mKeyMapSize / sizeof(FabricIndex)))
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- if (mKeyMap[keymap_index] != kUndefinedFabricIndex)
- {
- ResetPendingKey();
- return CHIP_ERROR_INTERNAL;
- }
-
- mKeyMap[keymap_index] = fabricIndex;
-
- // Persist key map
- CHIP_ERROR error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
- if (error != CHIP_NO_ERROR)
- {
- return error;
- }
-
- // There's a good chance we'll need the key again soon
- mCachedKey->Load(id);
-
- mPendingKeypair = nullptr;
- mIsPendingKeypairActive = false;
- mPendingFabricIndex = kUndefinedFabricIndex;
-
- return CHIP_NO_ERROR;
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::RemoveOpKeypairForFabric(FabricIndex fabricIndex)
-{
- VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
- // Remove pending keypair if we have it and the fabric ID matches
- if ((mPendingKeypair != nullptr) && (fabricIndex == mPendingFabricIndex))
- {
- RevertPendingKeypair();
- }
-
- EFR32OpaqueKeyId id = FindKeyIdForFabric(fabricIndex);
- if (id == kEFR32OpaqueKeyIdUnknown)
- {
- // Fabric is not in the map, so assume it's gone already
- return CHIP_NO_ERROR;
- }
-
- // Guard against array out-of-bounds (should not happen with correctly initialised keys)
- size_t keymap_index = id - kEFR32OpaqueKeyIdPersistentMin;
- if (keymap_index >= (mKeyMapSize / sizeof(FabricIndex)))
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- // Reset the key mapping since we'll be deleting this key
- mKeyMap[keymap_index] = kUndefinedFabricIndex;
-
- // Persist key map
- CHIP_ERROR error = SILABSConfig::WriteConfigValueBin(SILABSConfig::kConfigKey_OpKeyMap, mKeyMap, mKeyMapSize);
- if (error != CHIP_NO_ERROR)
- {
- return error;
- }
-
- // Check if key is cached
- EFR32OpaqueKeyId cachedId = mCachedKey->GetKeyId();
-
- if (id == cachedId)
- {
- // Delete from persistent storage and unload
- mCachedKey->Delete();
- return CHIP_NO_ERROR;
- }
-
- // Load it for purposes of deletion
- error = mCachedKey->Load(id);
- if (error != CHIP_NO_ERROR && error != CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- mCachedKey->Delete();
-
- return CHIP_NO_ERROR;
-}
-
-void Efr32PsaOperationalKeystore::RevertPendingKeypair()
-{
- if (mIsInitialized)
- {
- // Just delete the pending key from storage
- ResetPendingKey();
- }
-}
-
-CHIP_ERROR Efr32PsaOperationalKeystore::SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message,
- Crypto::P256ECDSASignature & outSignature) const
-{
- VerifyOrReturnError(mIsInitialized, CHIP_ERROR_WELL_UNINITIALIZED);
- VerifyOrReturnError(IsValidFabricIndex(fabricIndex), CHIP_ERROR_INVALID_FABRIC_INDEX);
-
- // Check to see whether the key is an activated pending key
- if (mIsPendingKeypairActive && (fabricIndex == mPendingFabricIndex))
- {
- VerifyOrReturnError(mPendingKeypair != nullptr, CHIP_ERROR_INTERNAL);
- return mPendingKeypair->ECDSA_sign_msg(message.data(), message.size(), outSignature);
- }
-
- // Figure out which key ID we're looking for
- EFR32OpaqueKeyId id = FindKeyIdForFabric(fabricIndex);
-
- if (id == kEFR32OpaqueKeyIdUnknown)
- {
- // Fabric is not in the map, but the caller thinks it's there?
- return CHIP_ERROR_INTERNAL;
- }
-
- // Check whether we have the key in cache
- EFR32OpaqueKeyId cachedId = mCachedKey->GetKeyId();
-
- if (id == cachedId)
- {
- return mCachedKey->ECDSA_sign_msg(message.data(), message.size(), outSignature);
- }
-
- // If not, we need to recreate from the backend
- CHIP_ERROR error = mCachedKey->Load(id);
- if (error != CHIP_NO_ERROR)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- // Sign with retrieved key
- error = mCachedKey->ECDSA_sign_msg(message.data(), message.size(), outSignature);
- if (error != CHIP_NO_ERROR)
- {
- return CHIP_ERROR_INTERNAL;
- }
-
- return CHIP_NO_ERROR;
-}
-
-Crypto::P256Keypair * Efr32PsaOperationalKeystore::AllocateEphemeralKeypairForCASE()
-{
- EFR32OpaqueP256Keypair * new_key = Platform::New<EFR32OpaqueP256Keypair>();
-
- if (new_key != nullptr)
- {
- new_key->Create(kEFR32OpaqueKeyIdVolatile, EFR32OpaqueKeyUsages::ECDH_P256);
- }
-
- return new_key;
-}
-
-void Efr32PsaOperationalKeystore::ReleaseEphemeralKeypair(Crypto::P256Keypair * keypair)
-{
- Platform::Delete<EFR32OpaqueP256Keypair>((EFR32OpaqueP256Keypair *) keypair);
-}
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h b/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h
deleted file mode 100644
index 4203724..0000000
--- a/src/platform/silabs/SiWx917/Efr32PsaOperationalKeystore.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Copyright (c) 2022 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <crypto/OperationalKeystore.h>
-#include <lib/core/CHIPConfig.h>
-
-#include <psa/crypto.h>
-
-#include "Efr32OpaqueKeypair.h"
-#include <platform/CHIPDeviceLayer.h>
-
-// Set SL_MATTER_MAX_STORED_OP_KEYS to the preferred size of the mapping table
-// between fabric IDs and opaque key indices. It can not be less than
-// CHIP_CONFIG_MAX_FABRICS + 1 (since there would be too few map elements to
-// support all fabrics the application wants to support in addition to an extra
-// pending key), but can be larger in case a consistent on-disk size of the map
-// is required.
-#ifndef SL_MATTER_MAX_STORED_OP_KEYS
-#define SL_MATTER_MAX_STORED_OP_KEYS (CHIP_CONFIG_MAX_FABRICS + 1)
-#endif
-
-namespace chip {
-namespace DeviceLayer {
-namespace Internal {
-
-/**
- * @brief OperationalKeystore implementation making use of the EFR32 SDK-provided
- * storage mechanisms to load/store keypairs.
- *
- * WARNING: Ensure that any implementation that uses this one as a starting point
- * DOES NOT have the raw key material (in usable form) passed up/down to
- * direct storage APIs that may make copies on heap/stack without sanitization.
- */
-class Efr32PsaOperationalKeystore : public chip::Crypto::OperationalKeystore
-{
-public:
- Efr32PsaOperationalKeystore(){};
- virtual ~Efr32PsaOperationalKeystore() override;
-
- // Non-copyable
- Efr32PsaOperationalKeystore(Efr32PsaOperationalKeystore const &) = delete;
- void operator=(Efr32PsaOperationalKeystore const &) = delete;
-
- /**
- * @brief Initialize the Operational Keystore
- */
- CHIP_ERROR Init();
-
- bool HasPendingOpKeypair() const override { return (mPendingKeypair != nullptr); }
-
- bool HasOpKeypairForFabric(FabricIndex fabricIndex) const override;
- CHIP_ERROR NewOpKeypairForFabric(FabricIndex fabricIndex, MutableByteSpan & outCertificateSigningRequest) override;
- CHIP_ERROR ActivateOpKeypairForFabric(FabricIndex fabricIndex, const chip::Crypto::P256PublicKey & nocPublicKey) override;
- CHIP_ERROR CommitOpKeypairForFabric(FabricIndex fabricIndex) override;
- CHIP_ERROR RemoveOpKeypairForFabric(FabricIndex fabricIndex) override;
- void RevertPendingKeypair() override;
- CHIP_ERROR SignWithOpKeypair(FabricIndex fabricIndex, const ByteSpan & message,
- chip::Crypto::P256ECDSASignature & outSignature) const override;
- Crypto::P256Keypair * AllocateEphemeralKeypairForCASE() override;
- void ReleaseEphemeralKeypair(chip::Crypto::P256Keypair * keypair) override;
-
-protected:
- // The keymap maps PSA Crypto persistent key ID offsets against fabric IDs.
- // The keymap is persisted in NVM3, and the keys are stored through the PSA
- // API.
- FabricIndex * mKeyMap = nullptr;
- size_t mKeyMapSize = 0;
-
- // The key cache is to avoid having to reconstruct keys from the storage
- // backend all the time (since it is rather slow).
- EFR32OpaqueP256Keypair * mCachedKey = nullptr;
-
- // This pending fabric index is `kUndefinedFabricIndex` if there isn't a
- // pending keypair override for a given fabric.
- FabricIndex mPendingFabricIndex = kUndefinedFabricIndex;
- EFR32OpaqueP256Keypair * mPendingKeypair = nullptr;
- bool mIsPendingKeypairActive = false;
- bool mIsInitialized = false;
-
-private:
- void ResetPendingKey()
- {
- if (mPendingKeypair != nullptr)
- {
- mPendingKeypair->Delete();
- Platform::Delete(mPendingKeypair);
- }
- mPendingKeypair = nullptr;
- mIsPendingKeypairActive = false;
- mPendingFabricIndex = kUndefinedFabricIndex;
- }
-
- void Deinit()
- {
- ResetPendingKey();
-
- if (mCachedKey != nullptr)
- {
- Platform::Delete<EFR32OpaqueP256Keypair>(mCachedKey);
- mCachedKey = nullptr;
- }
-
- if (mKeyMap != nullptr)
- {
- Platform::MemoryFree(mKeyMap);
- mKeyMap = nullptr;
- mKeyMapSize = 0;
- }
-
- mIsInitialized = false;
- }
-
- /**
- * @brief Find the opaque key ID stored in the map for a given
- * fabric ID.
- *
- * @param fabricIndex The fabric index to find the opaque key ID for.
- * Can also be kUndefinedFabricIndex to find the first
- * unoccupied key ID.
- *
- * @return a valid key ID on match, or kEFR32OpaqueKeyIdUnknown if no
- * match is found.
- */
- EFR32OpaqueKeyId FindKeyIdForFabric(FabricIndex fabricIndex) const;
-};
-
-} // namespace Internal
-} // namespace DeviceLayer
-} // namespace chip
diff --git a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp b/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
index 25de6d5..8032c84 100644
--- a/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
+++ b/src/platform/silabs/SiWx917/PlatformManagerImpl.cpp
@@ -24,6 +24,7 @@
/* this file behaves like a config.h, comes first */
#include <platform/internal/CHIPDeviceLayerInternal.h>
+#include <crypto/CHIPCryptoPAL.h>
#include <platform/FreeRTOS/SystemTimeSupport.h>
#include <platform/KeyValueStoreManager.h>
#include <platform/PlatformManager.h>
@@ -42,6 +43,24 @@
PlatformManagerImpl PlatformManagerImpl::sInstance;
+static void app_get_random(uint8_t * aOutput, size_t aLen)
+{
+ size_t i;
+
+ for (i = 0; i < aLen; i++)
+ {
+ aOutput[i] = rand();
+ }
+}
+
+static int app_entropy_source(void * data, unsigned char * output, size_t len, size_t * olen)
+{
+ app_get_random(reinterpret_cast<uint8_t *>(output), static_cast<uint16_t>(len));
+ *olen = len;
+
+ return 0;
+}
+
CHIP_ERROR PlatformManagerImpl::_InitChipStack(void)
{
CHIP_ERROR err;
@@ -57,6 +76,9 @@
ReturnErrorOnFailure(System::Clock::InitClock_RealTime());
+ // 16 : Threshold value
+ ReturnErrorOnFailure(chip::Crypto::add_entropy_source(app_entropy_source, NULL, 16));
+
// Call _InitChipStack() on the generic implementation base class
// to finish the initialization process.
err = Internal::GenericPlatformManagerImpl_FreeRTOS<PlatformManagerImpl>::_InitChipStack();
diff --git a/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp b/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp
deleted file mode 100644
index 16d7922..0000000
--- a/src/platform/silabs/SiWx917/ThreadStackManagerImpl.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * Copyright (c) 2019 Nest Labs, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @file
- * Provides an implementation of the ThreadStackManager object for
- * EFR32 platforms using the Silicon Labs SDK and the OpenThread
- * stack.
- *
- */
-/* this file behaves like a config.h, comes first */
-#include <platform/internal/CHIPDeviceLayerInternal.h>
-
-#include <platform/FreeRTOS/GenericThreadStackManagerImpl_FreeRTOS.cpp>
-#include <platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.cpp>
-#include <platform/OpenThread/OpenThreadUtils.h>
-#include <platform/ThreadStackManager.h>
-
-#include <openthread/platform/entropy.h>
-
-#include <lib/support/CHIPPlatformMemory.h>
-
-namespace chip {
-namespace DeviceLayer {
-
-using namespace ::chip::DeviceLayer::Internal;
-
-ThreadStackManagerImpl ThreadStackManagerImpl::sInstance;
-
-CHIP_ERROR ThreadStackManagerImpl::_InitThreadStack(void)
-{
- return InitThreadStack(NULL);
-}
-
-CHIP_ERROR ThreadStackManagerImpl::InitThreadStack(otInstance * otInst)
-{
- CHIP_ERROR err = CHIP_NO_ERROR;
-
- // Initialize the generic implementation base classes.
- err = GenericThreadStackManagerImpl_FreeRTOS<ThreadStackManagerImpl>::DoInit();
- SuccessOrExit(err);
- err = GenericThreadStackManagerImpl_OpenThread<ThreadStackManagerImpl>::DoInit(otInst);
- SuccessOrExit(err);
-
-exit:
- return err;
-}
-
-bool ThreadStackManagerImpl::IsInitialized()
-{
- return sInstance.mThreadStackLock != NULL;
-}
-
-} // namespace DeviceLayer
-} // namespace chip
-
-using namespace ::chip::DeviceLayer;
-
-/**
- * Glue function called directly by the OpenThread stack when tasklet processing work
- * is pending.
- */
-extern "C" void otTaskletsSignalPending(otInstance * p_instance)
-{
- ThreadStackMgrImpl().SignalThreadActivityPending();
-}
-
-/**
- * Glue function called directly by the OpenThread stack when system event processing work
- * is pending.
- */
-extern "C" void otSysEventSignalPending(void)
-{
- BaseType_t yieldRequired = ThreadStackMgrImpl().SignalThreadActivityPendingFromISR();
- portYIELD_FROM_ISR(yieldRequired);
-}
-
-extern "C" void * otPlatCAlloc(size_t aNum, size_t aSize)
-{
- return CHIPPlatformMemoryCalloc(aNum, aSize);
-}
-
-extern "C" void otPlatFree(void * aPtr)
-{
- CHIPPlatformMemoryFree(aPtr);
-}
-
-extern "C" __WEAK void sl_openthread_init(void)
-{
- // Place holder for enabling Silabs specific features available only through Simplicity Studio
-}
-
-/**
- * @brief Openthread UART implementation for the CLI is conflicting
- * with the UART implemented for Pigweed RPC as they use the same UART port
- *
- * We now only build the uart as implemented in
- * connectedhomeip/examples/platform/efr32/uart.c
- * and remap OT functions to use our uart api.
- *
- * For now OT CLI isn't usable when the examples are built with pw_rpc
- */
-
-#ifndef PW_RPC_ENABLED
-#include "uart.h"
-#endif
-
-extern "C" otError otPlatUartEnable(void)
-{
-#ifdef PW_RPC_ENABLED
- return OT_ERROR_NOT_IMPLEMENTED;
-#else
- uartConsoleInit();
- return OT_ERROR_NONE;
-#endif
-}
-
-#if CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI
-
-extern "C" otError otPlatUartSend(const uint8_t * aBuf, uint16_t aBufLength)
-{
-#ifdef PW_RPC_ENABLED
- return OT_ERROR_NOT_IMPLEMENTED;
-#else
- if (uartConsoleWrite((const char *) aBuf, aBufLength) > 0)
- {
- otPlatUartSendDone();
- return OT_ERROR_NONE;
- }
- return OT_ERROR_FAILED;
-#endif
-}
-
-extern "C" void efr32UartProcess(void)
-{
-#if !defined(PW_RPC_ENABLED) && !defined(ENABLE_CHIP_SHELL)
- uint8_t tempBuf[128] = { 0 };
- // will read the data available up to 128bytes
- uint16_t count = uartConsoleRead((char *) tempBuf, 128);
- if (count > 0)
- {
- // ot process Received data for CLI cmds
- otPlatUartReceived(tempBuf, count);
- }
-#endif
-}
-
-extern "C" __WEAK otError otPlatUartFlush(void)
-{
- return OT_ERROR_NOT_IMPLEMENTED;
-}
-
-extern "C" __WEAK otError otPlatUartDisable(void)
-{
- return OT_ERROR_NOT_IMPLEMENTED;
-}
-
-#endif // CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI
diff --git a/src/platform/silabs/SiWx917/args.gni b/src/platform/silabs/SiWx917/args.gni
index 6e7ac8d..4fa9a22 100644
--- a/src/platform/silabs/SiWx917/args.gni
+++ b/src/platform/silabs/SiWx917/args.gni
@@ -16,7 +16,7 @@
import("//build_overrides/efr32_sdk.gni")
import("//build_overrides/pigweed.gni")
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
import("${chip_root}/src/crypto/crypto.gni")
# ARM architecture flags will be set based on silabs_family.
@@ -26,12 +26,7 @@
openthread_external_mbedtls = mbedtls_target
-# default to platform crypto implementation but allow commandline override
-if (chip_crypto == "") {
- chip_crypto = "platform"
-}
-
-chip_device_platform = "efr32"
+chip_device_platform = "SiWx917"
#Net work configuration OpenThread
lwip_platform = "efr32"
@@ -44,7 +39,7 @@
chip_build_tests = false
# Transitional CommissionableDataProvider not used anymore
-# examples/platform/silabs/efr32/EFR32DeviceDataProvider is now used.
+# examples/platform/silabs/SiWx917/SiWx917DeviceDataProvider is now used.
chip_use_transitional_commissionable_data_provider = false
openthread_root = "${chip_root}/third_party/openthread/ot-efr32/openthread"
diff --git a/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h b/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h
new file mode 100644
index 0000000..7849747
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/rsi_ble_config.h
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ * @file rsi_ble_config.h
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2020 Silicon Laboratories Inc. www.silabs.com</b>
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+
+#ifndef RSI_BLE_CONFIG_H
+#define RSI_BLE_CONFIG_H
+
+#include "rsi_ble_apis.h"
+#include <rsi_data_types.h>
+/******************************************************
+ * * Macros
+ * ******************************************************/
+//! application event list
+#define RSI_BLE_CONN_EVENT 0x01
+#define RSI_BLE_DISCONN_EVENT 0x02
+#define RSI_BLE_GATT_WRITE_EVENT 0x03
+#define RSI_BLE_MTU_EVENT 0x04
+#define RSI_BLE_GATT_INDICATION_CONFIRMATION 0x05
+#define RSI_BLE_RESP_ATT_VALUE 0x06
+#define RSI_SSID 0x0D
+#define RSI_SECTYPE 0x0E
+#define RSI_BLE_WLAN_DISCONN_NOTIFY 0x0F
+#define RSI_WLAN_ALREADY 0x10
+#define RSI_WLAN_NOT_ALREADY 0x11
+#define RSI_BLE_WLAN_TIMEOUT_NOTIFY 0x12
+#define RSI_BLE_WLAN_JOIN_STATUS 0x15
+#define RSI_APP_FW_VERSION 0x13
+#define RSI_BLE_WLAN_DISCONNECT_STATUS 0x14
+
+#define RSI_REM_DEV_ADDR_LEN 18
+#define RSI_REM_DEV_NAME_LEN 31
+
+#define RSI_BLE_DEV_NAME "CCP_DEVICE"
+#define RSI_BLE_SET_RAND_ADDR "00:23:A7:12:34:56"
+
+#define CLEAR_WHITELIST 0x00
+#define ADD_DEVICE_TO_WHITELIST 0x01
+#define DELETE_DEVICE_FROM_WHITELIST 0x02
+
+#define ALL_PHYS 0x00
+
+#define RSI_BLE_DEV_ADDR_RESOLUTION_ENABLE 0
+
+#define RSI_OPERMODE_WLAN_BLE 13
+
+/***********************************************************************************************************************************************/
+//! Characteristic Presenatation Format Fields
+/***********************************************************************************************************************************************/
+#define RSI_BLE_UINT8_FORMAT 0x04
+#define RSI_BLE_EXPONENT 0x00
+#define RSI_BLE_PERCENTAGE_UNITS_UUID 0x27AD
+#define RSI_BLE_NAME_SPACE 0x01
+#define RSI_BLE_DESCRIPTION 0x010B
+
+//! BLE characteristic custom service uuid
+#define RSI_BLE_CUSTOM_SERVICE_UUID 0xFFF6
+#define RSI_BLE_CUSTOM_LEVEL_UUID 0x1FF1
+
+#ifdef RSI_M4_INTERFACE
+#define RSI_BLE_MAX_NBR_ATT_REC 20
+#define RSI_BLE_MAX_NBR_SLAVES 1
+#define RSI_BLE_NUM_CONN_EVENTS 2
+#else
+#define RSI_BLE_MAX_NBR_ATT_REC 80
+#define RSI_BLE_MAX_NBR_SLAVES 3
+#define RSI_BLE_NUM_CONN_EVENTS 20
+#endif
+
+#define RSI_BLE_MAX_NBR_ATT_SERV 10
+
+#define RSI_BLE_MAX_NBR_MASTERS 1
+#define RSI_BLE_GATT_ASYNC_ENABLE 1
+#define RSI_BLE_GATT_INIT 0
+
+#define RSI_BLE_START_SCAN 0x01
+#define RSI_BLE_STOP_SCAN 0x00
+
+#define RSI_BLE_SCAN_TYPE SCAN_TYPE_ACTIVE
+#define RSI_BLE_SCAN_FILTER_TYPE SCAN_FILTER_TYPE_ALL
+/* Number of BLE GATT RECORD SIZE IN (n*16 BYTES), eg:(0x40*16)=1024 bytes */
+#define RSI_BLE_NUM_REC_BYTES 0x40
+
+#define RSI_BLE_INDICATE_CONFIRMATION_FROM_HOST 0
+
+/*=======================================================================*/
+//! Advertising command parameters
+/*=======================================================================*/
+
+#define RSI_BLE_ADV_TYPE UNDIR_CONN
+#define RSI_BLE_ADV_FILTER_TYPE ALLOW_SCAN_REQ_ANY_CONN_REQ_ANY
+#define RSI_BLE_ADV_DIR_ADDR_TYPE LE_PUBLIC_ADDRESS
+#define RSI_BLE_ADV_DIR_ADDR "00:15:83:6A:64:17"
+
+#define RSI_BLE_ADV_INT_MIN 0x100
+#define RSI_BLE_ADV_INT_MAX 0x200
+#define RSI_BLE_ADV_CHANNEL_MAP 0x07
+
+//! Advertise status
+//! Start the advertising process
+#define RSI_BLE_START_ADV 0x01
+//! Stop the advertising process
+#define RSI_BLE_STOP_ADV 0x00
+
+//! BLE Tx Power Index On Air
+#define RSI_BLE_PWR_INX 30
+
+//! BLE Active H/w Pwr Features
+#define BLE_DISABLE_DUTY_CYCLING 0
+#define BLE_DUTY_CYCLING 1
+#define BLR_DUTY_CYCLING 2
+#define BLE_4X_PWR_SAVE_MODE 4
+#define RSI_BLE_PWR_SAVE_OPTIONS BLE_DISABLE_DUTY_CYCLING
+
+//! Advertise types
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning/Connection is also accepted from all devices
+ * */
+#define UNDIR_CONN 0x80
+
+/* Advertising will be visible(discoverable) to the particular device
+ * mentioned in RSI_BLE_ADV_DIR_ADDR only.
+ * Scanning and Connection will be accepted from that device only.
+ * */
+#define DIR_CONN 0x81
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning will be accepted from all the devices.
+ * Connection will be not be accepted from any device.
+ * */
+#define UNDIR_SCAN 0x82
+
+/* Advertising will be visible(discoverable) to all the devices.
+ * Scanning and Connection will not be accepted from any device
+ * */
+#define UNDIR_NON_CONN 0x83
+
+/* Advertising will be visible(discoverable) to the particular device
+ * mentioned in RSI_BLE_ADV_DIR_ADDR only.
+ * Scanning and Connection will be accepted from that device only.
+ * */
+#define DIR_CONN_LOW_DUTY_CYCLE 0x84
+
+//! Advertising flags
+#define LE_LIMITED_DISCOVERABLE 0x01
+#define LE_GENERAL_DISCOVERABLE 0x02
+#define LE_BR_EDR_NOT_SUPPORTED 0x04
+
+//! Advertise filters
+#define ALLOW_SCAN_REQ_ANY_CONN_REQ_ANY 0x00
+#define ALLOW_SCAN_REQ_WHITE_LIST_CONN_REQ_ANY 0x01
+#define ALLOW_SCAN_REQ_ANY_CONN_REQ_WHITE_LIST 0x02
+#define ALLOW_SCAN_REQ_WHITE_LIST_CONN_REQ_WHITE_LIST 0x03
+
+//! Address types
+#define LE_PUBLIC_ADDRESS 0x00
+#define LE_RANDOM_ADDRESS 0x01
+#define LE_RESOLVABLE_PUBLIC_ADDRESS 0x02
+#define LE_RESOLVABLE_RANDOM_ADDRESS 0x03
+
+/*=======================================================================*/
+
+/*=======================================================================*/
+//! Connection parameters
+/*=======================================================================*/
+#define LE_SCAN_INTERVAL 0x0100
+#define LE_SCAN_WINDOW 0x0050
+
+#define CONNECTION_INTERVAL_MIN 0x00A0
+#define CONNECTION_INTERVAL_MAX 0x00A0
+
+#define CONNECTION_LATENCY 0x0000
+#define SUPERVISION_TIMEOUT 0x07D0 // 2000
+
+/*=======================================================================*/
+
+/*=======================================================================*/
+//! Scan command parameters
+/*=======================================================================*/
+
+#define SL_WFX_BLE_SCAN_TYPE SCAN_TYPE_ACTIVE
+#define SL_WFX_BLE_SCAN_FILTER_TYPE SCAN_FILTER_TYPE_ALL
+
+//! Scan status
+#define SL_WFX_BLE_START_SCAN 0x01
+#define SL_WFX_BLE_STOP_SCAN 0x00
+
+//! Scan types
+#define SCAN_TYPE_ACTIVE 0x01
+#define SCAN_TYPE_PASSIVE 0x00
+
+//! Scan filters
+#define SCAN_FILTER_TYPE_ALL 0x00
+#define SCAN_FILTER_TYPE_ONLY_WHITE_LIST 0x01
+
+#define SL_WFX_SEL_INTERNAL_ANTENNA 0x00
+#define SL_WFX_SEL_EXTERNAL_ANTENNA 0x01
+
+#define SL_WFX_BT_CTRL_REMOTE_USER_TERMINATED 0x4E13
+#define SL_WFX_BT_CTRL_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x4E14
+#define SL_WFX_BT_CTRL_REMOTE_POWERING_OFF 0x4E15
+#define SL_WFX_BT_CTRL_TERMINATED_MIC_FAILURE 0x4E3D
+#define SL_WFX_BT_FAILED_TO_ESTABLISH_CONN 0x4E3E
+#define SL_WFX_BT_INVALID_RANGE 0x4E60
+
+/***********************************************************************************************************************************************/
+//! RS9116 Firmware Configurations
+/***********************************************************************************************************************************************/
+
+/*=======================================================================*/
+//! Opermode command parameters
+/*=======================================================================*/
+/*
+#define RSI_FEATURE_BIT_MAP \
+ (FEAT_ULP_GPIO_BASED_HANDSHAKE | FEAT_DEV_TO_HOST_ULP_GPIO_1) //! To set wlan feature select bit map
+#define RSI_TCP_IP_BYPASS RSI_DISABLE //! TCP IP BYPASS feature check
+#define RSI_TCP_IP_FEATURE_BIT_MAP \
+ (TCP_IP_FEAT_DHCPV4_CLIENT) //! TCP/IP feature select bitmap for selecting TCP/IP features
+#define RSI_EXT_TCPIP_FEATURE_BITMAP 0
+
+#define RSI_CUSTOM_FEATURE_BIT_MAP FEAT_CUSTOM_FEAT_EXTENTION_VALID //! To set custom feature select bit map
+
+#define RSI_EXT_CUSTOM_FEATURE_BIT_MAP (EXT_FEAT_LOW_POWER_MODE | EXT_FEAT_XTAL_CLK_ENABLE | EXT_FEAT_384K_MODE)
+
+#define RSI_BT_FEATURE_BITMAP (BT_RF_TYPE | ENABLE_BLE_PROTOCOL)
+*/
+/*=======================================================================*/
+//! Power save command parameters
+/*=======================================================================*/
+//! set handshake type of power mode
+//#define RSI_HAND_SHAKE_TYPE GPIO_BASED
+
+#define BLE_ATT_REC_SIZE 500
+#define NO_OF_VAL_ATT 5 //! Attribute value count
+
+/***********************************************************************************************************************************************/
+//! user defined structure
+/***********************************************************************************************************************************************/
+typedef struct rsi_ble_att_list_s
+{
+ uuid_t char_uuid;
+ uint16_t handle;
+ uint16_t value_len;
+ uint16_t max_value_len;
+ uint8_t char_val_prop;
+ void * value;
+} rsi_ble_att_list_t;
+typedef struct rsi_ble_s
+{
+ uint8_t DATA[BLE_ATT_REC_SIZE];
+ uint16_t DATA_ix;
+ uint16_t att_rec_list_count;
+ rsi_ble_att_list_t att_rec_list[NO_OF_VAL_ATT];
+} rsi_ble_t;
+
+#endif
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c
new file mode 100644
index 0000000..115e5c1
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.c
@@ -0,0 +1,539 @@
+/*******************************************************************************
+ * @file wfx_sl_ble_init.c
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2021 Silicon Laboratories Inc. www.silabs.com</b>
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+/*************************************************************************
+ *
+ */
+
+/*================================================================================
+* @brief : This file contains example application for Wlan Station BLE
+* Provisioning
+* @section Description :
+* This application explains how to get the WLAN connection functionality using
+* BLE provisioning.
+* Silicon Labs Module starts advertising and with BLE Provisioning the Access Point
+* details are fetched.
+* Silicon Labs device is configured as a WiFi station and connects to an Access Point.
+=================================================================================*/
+
+#include "wfx_sl_ble_init.h"
+#include "rsi_ble_config.h"
+
+// application defines
+rsi_ble_event_conn_status_t conn_event_to_app;
+rsi_ble_t att_list;
+sl_wfx_msg_t event_msg;
+
+// Memory to initialize driver
+uint8_t bt_global_buf[BT_GLOBAL_BUFF_LEN];
+static uint8_t wfx_rsi_drv_buf[WFX_RSI_BUF_SZ];
+const uint8_t ShortUUID_CHIPoBLEService[] = { 0xF6, 0xFF };
+
+/* Rsi driver Task will use as its stack */
+// StackType_t driverRsiTaskStack[WFX_RSI_WLAN_TASK_SZ] = { 0 };
+
+/* Structure that will hold the TCB of the wfxRsi Task being created. */
+// StaticTask_t driverRsiTaskBuffer;
+
+StaticTask_t rsiBLETaskStruct;
+
+/* wfxRsi Task will use as its stack */
+StackType_t wfxBLETaskStack[WFX_RSI_TASK_SZ] = { 0 };
+
+int32_t ble_rsi_task(void)
+{
+ int32_t status;
+ uint8_t buf[RSI_RESPONSE_HOLD_BUFF_SIZE];
+ // extern void rsi_hal_board_init(void);
+ //
+ // WFX_RSI_LOG("%s: starting(HEAP_SZ = %d)", __func__, SL_HEAP_SIZE);
+ //
+ // //! Driver initialization
+ // status = rsi_driver_init(wfx_rsi_drv_buf, WFX_RSI_BUF_SZ);
+ // if ((status < RSI_DRIVER_STATUS) || (status > WFX_RSI_BUF_SZ))
+ // {
+ // WFX_RSI_LOG("%s: error: RSI Driver initialization failed with status: %02x", __func__, status);
+ // return status;
+ // }
+ //
+ // WFX_RSI_LOG("%s: rsi_device_init", __func__);
+ //
+ // /* ! Redpine module intialisation */
+ // if ((status = rsi_device_init(LOAD_NWP_FW)) != RSI_SUCCESS)
+ // {
+ // WFX_RSI_LOG("%s: error: rsi_device_init failed with status: %02x", __func__, status);
+ // return status;
+ // }
+ // WFX_RSI_LOG("%s: start wireless drv task", __func__);
+ //
+ // /*
+ // * Create the driver task
+ // */
+ // wfx_rsi.drv_task = xTaskCreateStatic((TaskFunction_t) rsi_wireless_driver_task, "rsi_drv", WFX_RSI_WLAN_TASK_SZ, NULL,
+ // 1, driverRsiTaskStack, &driverRsiTaskBuffer);
+ // if (NULL == wfx_rsi.drv_task)
+ // {
+ // WFX_RSI_LOG("%s: error: Create the driver task failed", __func__);
+ // return RSI_ERROR_INVALID_PARAM;
+ // }
+ //
+ // /* Initialize WiSeConnect or Module features. */
+ // WFX_RSI_LOG("%s: rsi_wireless_init", __func__);
+ // if ((status = rsi_wireless_init(OPER_MODE_0, RSI_OPERMODE_WLAN_BLE)) != RSI_SUCCESS)
+ // {
+ // WFX_RSI_LOG("%s: error: Initialize WiSeConnect failed with status: %02x", __func__, status);
+ // return status;
+ // }
+ //
+ // WFX_RSI_LOG("%s: get FW version..", __func__);
+ //
+ // /*
+ // * Get the MAC and other info to let the user know about it.
+ // */
+ // if (rsi_wlan_get(RSI_FW_VERSION, buf, sizeof(buf)) != RSI_SUCCESS)
+ // {
+ // WFX_RSI_LOG("%s: error: rsi_wlan_get(RSI_FW_VERSION) failed with status: %02x", __func__, status);
+ // return status;
+ // }
+ //
+ // buf[sizeof(buf) - 1] = 0;
+ // WFX_RSI_LOG("%s: RSI firmware version: %s", __func__, buf);
+ // //! Send feature frame
+ // if ((status = rsi_send_feature_frame()) != RSI_SUCCESS)
+ // {
+ // WFX_RSI_LOG("%s: error: rsi_send_feature_frame failed with status: %02x", __func__, status);
+ // return status;
+ // }
+ //
+ // WFX_RSI_LOG("%s: sent rsi_send_feature_frame", __func__);
+ // /* initializes wlan radio parameters and WLAN supplicant parameters.
+ // */
+ // (void) rsi_wlan_radio_init(); /* Required so we can get MAC address */
+ // if ((status = rsi_wlan_get(RSI_MAC_ADDRESS, &wfx_rsi.sta_mac.octet[0], RESP_BUFF_SIZE)) != RSI_SUCCESS)
+ // {
+ // WFX_RSI_LOG("%s: error: rsi_wlan_get failed with status: %02x", __func__, status);
+ // return status;
+ // }
+
+ // registering the GAP callback functions
+ rsi_ble_gap_register_callbacks(NULL, NULL, rsi_ble_on_disconnect_event, NULL, NULL, NULL, rsi_ble_on_enhance_conn_status_event,
+ NULL, NULL, NULL);
+
+ // registering the GATT call back functions
+ rsi_ble_gatt_register_callbacks(NULL, NULL, NULL, NULL, NULL, NULL, NULL, rsi_ble_on_gatt_write_event, NULL, NULL, NULL,
+ rsi_ble_on_mtu_event, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ rsi_ble_on_event_indication_confirmation, NULL);
+
+ WFX_RSI_LOG("registering rsi_ble_add_service");
+
+ // Exchange of GATT info with BLE stack
+ rsi_ble_add_matter_service();
+
+ // initializing the application events map
+ rsi_ble_app_init_events();
+
+ wfx_rsi.ble_task = xTaskCreateStatic((TaskFunction_t) rsi_ble_event_handling_task, "rsi_ble", WFX_RSI_TASK_SZ, NULL, 2,
+ wfxBLETaskStack, &rsiBLETaskStruct);
+ WFX_RSI_LOG("%s: rsi_task_suspend init_task ", __func__);
+ if (wfx_rsi.ble_task == NULL)
+ {
+ WFX_RSI_LOG("%s: error: failed to create ble task.", __func__);
+ }
+
+ WFX_RSI_LOG("%s complete", __func__);
+ // rsi_task_destroy((rsi_task_handle_t *)wfx_rsi.init_task);
+ return RSI_SUCCESS;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_app_init_events
+ * @brief initializes the event parameter.
+ * @param[in] none.
+ * @return none.
+ * @section description
+ * This function is used during BLE initialization.
+ */
+void rsi_ble_app_init_events()
+{
+ event_msg.ble_app_event_map = 0;
+ event_msg.ble_app_event_mask = 0xFFFFFFFF;
+ event_msg.ble_app_event_mask = event_msg.ble_app_event_mask; // To suppress warning while compiling
+ WFX_RSI_LOG("Function :: rsi_ble_app_init_events");
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_app_clear_event
+ * @brief clears the specific event.
+ * @param[in] event_num, specific event number.
+ * @return none.
+ * @section description
+ * This function is used to clear the specific event.
+ */
+void rsi_ble_app_clear_event(uint32_t event_num)
+{
+ event_msg.event_num = event_num;
+ event_msg.ble_app_event_map &= ~BIT(event_num);
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_on_mtu_event
+ * @brief its invoked when mtu exhange event is received.
+ * @param[in] rsi_ble_mtu, mtu event paramaters.
+ * @return none.
+ * @section description
+ * This callback function is invoked when mtu exhange event is received
+ */
+void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu)
+{
+ WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_mtu_event");
+ memset(&event_msg.rsi_ble_mtu, 0, sizeof(rsi_ble_event_mtu_t));
+ memcpy(&event_msg.rsi_ble_mtu, rsi_ble_mtu, sizeof(rsi_ble_event_mtu_t));
+ rsi_ble_app_set_event(RSI_BLE_MTU_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_on_gatt_write_event
+ * @brief its invoked when write/notify/indication events are received.
+ * @param[in] event_id, it indicates write/notification event id.
+ * @param[in] rsi_ble_write, write event parameters.
+ * @return none.
+ * @section description
+ * This callback function is invoked when write/notify/indication events are received
+ */
+void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write)
+{
+ WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_gatt_write_event");
+ memset(&event_msg.rsi_ble_write, 0, sizeof(rsi_ble_event_write_t));
+ event_msg.event_id = event_id;
+ memcpy(&event_msg.rsi_ble_write, rsi_ble_write, sizeof(rsi_ble_event_write_t));
+ rsi_ble_app_set_event(RSI_BLE_GATT_WRITE_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_on_enhance_conn_status_event
+ * @brief invoked when enhanced connection complete event is received
+ * @param[out] resp_conn, connected remote device information
+ * @return none.
+ * @section description
+ * This callback function indicates the status of the connection
+ */
+void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn)
+{
+ WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_enhance_conn_status_event");
+ event_msg.connectionHandle = 1;
+ event_msg.bondingHandle = 255;
+ memcpy(event_msg.resp_enh_conn.dev_addr, resp_enh_conn->dev_addr, RSI_DEV_ADDR_LEN);
+ rsi_ble_app_set_event(RSI_BLE_CONN_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_on_disconnect_event
+ * @brief invoked when disconnection event is received
+ * @param[in] resp_disconnect, disconnected remote device information
+ * @param[in] reason, reason for disconnection.
+ * @return none.
+ * @section description
+ * This callback function indicates disconnected device information and status
+ */
+void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason)
+{
+ WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_disconnect_event");
+ event_msg.reason = reason;
+ memcpy(event_msg.resp_disconnect, resp_disconnect, sizeof(rsi_ble_event_disconnect_t));
+ rsi_ble_app_set_event(RSI_BLE_DISCONN_EVENT);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_on_event_indication_confirmation
+ * @brief this function will invoke when received indication confirmation event
+ * @param[out] resp_id, response id
+ * @param[out] status, status of the response
+ * @return none
+ * @section description
+ */
+void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp)
+{
+ WFX_RSI_LOG(" RSI_BLE : rsi_ble_on_event_indication_confirmation");
+ event_msg.resp_status = resp_status;
+ memcpy(&event_msg.rsi_ble_event_set_att_rsp, rsi_ble_event_set_att_rsp, sizeof(rsi_ble_set_att_resp_t));
+ rsi_ble_app_set_event(RSI_BLE_GATT_INDICATION_CONFIRMATION);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_app_get_event
+ * @brief returns the first set event based on priority
+ * @param[in] none.
+ * @return int32_t
+ * > 0 = event number
+ * -1 = not received any event
+ * @section description
+ * This function returns the highest priority event among all the set events
+ */
+int32_t rsi_ble_app_get_event(void)
+{
+ uint32_t ix;
+
+ for (ix = 0; ix < 32; ix++)
+ {
+ if (event_msg.ble_app_event_map & (1 << ix))
+ {
+ return ix;
+ }
+ }
+
+ return (-1);
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_app_set_event
+ * @brief set the specific event.
+ * @param[in] event_num, specific event number.
+ * @return none.
+ * @section description
+ * This function is used to set/raise the specific event.
+ */
+void rsi_ble_app_set_event(uint32_t event_num)
+{
+ event_msg.ble_app_event_map |= BIT(event_num);
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_gatt_add_attribute_to_list
+ * @brief This function is used to store characteristic service attribute.
+ * @param[in] p_val, pointer to homekit structure
+ * @param[in] handle, characteristic service attribute handle.
+ * @param[in] data_len, characteristic value length
+ * @param[in] data, characteristic value pointer
+ * @param[in] uuid, characteristic value uuid
+ * @return none.
+ * @section description
+ * This function is used to store all attribute records
+ */
+void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid,
+ uint8_t char_prop)
+{
+ if ((p_val->DATA_ix + data_len) >= BLE_ATT_REC_SIZE)
+ { //! Check for max data length for the characteristic value
+ LOG_PRINT("\r\n no data memory for att rec values \r\n");
+ return;
+ }
+
+ p_val->att_rec_list[p_val->att_rec_list_count].char_uuid = uuid;
+ p_val->att_rec_list[p_val->att_rec_list_count].handle = handle;
+ p_val->att_rec_list[p_val->att_rec_list_count].value_len = data_len;
+ p_val->att_rec_list[p_val->att_rec_list_count].max_value_len = data_len;
+ p_val->att_rec_list[p_val->att_rec_list_count].char_val_prop = char_prop;
+ memcpy(p_val->DATA + p_val->DATA_ix, data, data_len);
+ p_val->att_rec_list[p_val->att_rec_list_count].value = p_val->DATA + p_val->DATA_ix;
+ p_val->att_rec_list_count++;
+ p_val->DATA_ix += p_val->att_rec_list[p_val->att_rec_list_count].max_value_len;
+
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_add_char_serv_att
+ * @brief this function is used to add characteristic service attribute..
+ * @param[in] serv_handler, service handler.
+ * @param[in] handle, characteristic service attribute handle.
+ * @param[in] val_prop, characteristic value property.
+ * @param[in] att_val_handle, characteristic value handle
+ * @param[in] att_val_uuid, characteristic value uuid
+ * @return none.
+ * @section description
+ * This function is used at application to add characteristic attribute
+ */
+void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle, uuid_t att_val_uuid)
+{
+ rsi_ble_req_add_att_t new_att = { 0 };
+
+ //! preparing the attribute service structure
+ new_att.serv_handler = serv_handler;
+ new_att.handle = handle;
+ new_att.att_uuid.size = 2;
+ new_att.att_uuid.val.val16 = RSI_BLE_CHAR_SERV_UUID;
+ new_att.property = RSI_BLE_ATT_PROPERTY_READ;
+
+ //! preparing the characteristic attribute value
+ new_att.data_len = att_val_uuid.size + 4;
+ new_att.data[0] = val_prop;
+ rsi_uint16_to_2bytes(&new_att.data[2], att_val_handle);
+ if (new_att.data_len == 6)
+ {
+ rsi_uint16_to_2bytes(&new_att.data[4], att_val_uuid.val.val16);
+ }
+ else if (new_att.data_len == 8)
+ {
+ rsi_uint32_to_4bytes(&new_att.data[4], att_val_uuid.val.val32);
+ }
+ else if (new_att.data_len == 20)
+ {
+ memcpy(&new_att.data[4], &att_val_uuid.val.val128, att_val_uuid.size);
+ }
+ //! Add attribute to the service
+ rsi_ble_add_attribute(&new_att);
+
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_add_char_val_att
+ * @brief this function is used to add characteristic value attribute.
+ * @param[in] serv_handler, new service handler.
+ * @param[in] handle, characteristic value attribute handle.
+ * @param[in] att_type_uuid, attribute uuid value.
+ * @param[in] val_prop, characteristic value property.
+ * @param[in] data, characteristic value data pointer.
+ * @param[in] data_len, characteristic value length.
+ * @return none.
+ * @section description
+ * This function is used at application to create new service.
+ */
+
+void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data,
+ uint8_t data_len, uint8_t auth_read)
+{
+ rsi_ble_req_add_att_t new_att = { 0 };
+
+ memset(&new_att, 0, sizeof(rsi_ble_req_add_att_t));
+ //! preparing the attributes
+ new_att.serv_handler = serv_handler;
+ new_att.handle = handle;
+ new_att.config_bitmap = auth_read;
+ memcpy(&new_att.att_uuid, &att_type_uuid, sizeof(uuid_t));
+ new_att.property = val_prop;
+
+ if (data != NULL)
+ memcpy(new_att.data, data, RSI_MIN(sizeof(new_att.data), data_len));
+
+ //! preparing the attribute value
+ new_att.data_len = data_len;
+
+ //! add attribute to the service
+ rsi_ble_add_attribute(&new_att);
+
+ if ((auth_read == ATT_REC_MAINTAIN_IN_HOST) || (data_len > 20))
+ {
+ if (data != NULL)
+ {
+ rsi_gatt_add_attribute_to_list(&att_list, handle, data_len, data, att_type_uuid, val_prop);
+ }
+ }
+
+ //! check the attribute property with notification/Indication
+ if ((val_prop & RSI_BLE_ATT_PROPERTY_NOTIFY) || (val_prop & RSI_BLE_ATT_PROPERTY_INDICATE))
+ {
+ //! if notification/indication property supports then we need to add client characteristic service.
+
+ //! preparing the client characteristic attribute & values
+ memset(&new_att, 0, sizeof(rsi_ble_req_add_att_t));
+ new_att.serv_handler = serv_handler;
+ new_att.handle = handle + 1;
+ new_att.att_uuid.size = 2;
+ new_att.att_uuid.val.val16 = RSI_BLE_CLIENT_CHAR_UUID;
+ new_att.property = RSI_BLE_ATT_PROPERTY_READ | RSI_BLE_ATT_PROPERTY_WRITE;
+ new_att.data_len = 2;
+
+ //! add attribute to the service
+ rsi_ble_add_attribute(&new_att);
+ }
+
+ return;
+}
+
+/*==============================================*/
+/**
+ * @fn rsi_ble_add_matter_service
+ * @brief this function is used to add service for matter
+ * @return status (uint32_t) 0 for success.
+ * @section description
+ * This function is used at application to create new service.
+ */
+
+uint32_t rsi_ble_add_matter_service(void)
+{
+ uuid_t custom_service = { RSI_BLE_MATTER_CUSTOM_SERVICE_UUID };
+ custom_service.size = RSI_BLE_MATTER_CUSTOM_SERVICE_SIZE;
+ custom_service.val.val16 = RSI_BLE_MATTER_CUSTOM_SERVICE_VALUE_16;
+ uint8_t data[230] = { RSI_BLE_MATTER_CUSTOM_SERVICE_DATA };
+
+ static const uuid_t custom_characteristic_RX = { .size = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE,
+ .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED },
+ .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1,
+ .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2,
+ .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3,
+ .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 } };
+
+ rsi_ble_resp_add_serv_t new_serv_resp = { 0 };
+ rsi_ble_add_service(custom_service, &new_serv_resp);
+
+ // Adding custom characteristic declaration to the custom service
+ rsi_ble_add_char_serv_att(
+ new_serv_resp.serv_handler, new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_ATTRIBUTE_HANDLE_LOCATION,
+ RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ, // Set read, write, write without response
+ new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION, custom_characteristic_RX);
+
+ // Adding characteristic value attribute to the service
+ rsi_ble_add_char_val_att(new_serv_resp.serv_handler,
+ new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION, custom_characteristic_RX,
+ RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ, // Set read, write, write without response
+ data, sizeof(data), ATT_REC_IN_HOST);
+
+ static const uuid_t custom_characteristic_TX = { .size = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE,
+ .reserved = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED },
+ .val.val128.data1 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1,
+ .val.val128.data2 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2,
+ .val.val128.data3 = RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3,
+ .val.val128.data4 = { RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 } };
+
+ // Adding custom characteristic declaration to the custom service
+ rsi_ble_add_char_serv_att(
+ new_serv_resp.serv_handler, new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_ATTRIBUTE_HANDLE_LOCATION,
+ RSI_BLE_ATT_PROPERTY_WRITE_NO_RESPONSE | RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ |
+ RSI_BLE_ATT_PROPERTY_NOTIFY | RSI_BLE_ATT_PROPERTY_INDICATE, // Set read, write, write without response
+ new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION, custom_characteristic_TX);
+
+ // Adding characteristic value attribute to the service
+ event_msg.rsi_ble_measurement_hndl = new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION;
+
+ // Adding characteristic value attribute to the service
+ event_msg.rsi_ble_gatt_server_client_config_hndl =
+ new_serv_resp.start_handle + RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION;
+
+ rsi_ble_add_char_val_att(new_serv_resp.serv_handler, event_msg.rsi_ble_measurement_hndl, custom_characteristic_TX,
+ RSI_BLE_ATT_PROPERTY_WRITE_NO_RESPONSE | RSI_BLE_ATT_PROPERTY_WRITE | RSI_BLE_ATT_PROPERTY_READ |
+ RSI_BLE_ATT_PROPERTY_NOTIFY |
+ RSI_BLE_ATT_PROPERTY_INDICATE, // Set read, write, write without response
+ data, sizeof(data), ATT_REC_MAINTAIN_IN_HOST);
+
+ memset(&data, 0, sizeof(data));
+ return 0;
+}
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h
new file mode 100644
index 0000000..497d2b5
--- /dev/null
+++ b/src/platform/silabs/SiWx917/bluetooth/wfx_sl_ble_init.h
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * @file wfx_sl_ble_init.h
+ * @brief
+ *******************************************************************************
+ * # License
+ * <b>Copyright 2021 Silicon Laboratories Inc. www.silabs.com</b>
+ *******************************************************************************
+ *
+ * The licensor of this software is Silicon Laboratories Inc. Your use of this
+ * software is governed by the terms of Silicon Labs Master Software License
+ * Agreement (MSLA) available at
+ * www.silabs.com/about-us/legal/master-software-license-agreement. This
+ * software is distributed to you in Source Code format and is governed by the
+ * sections of the MSLA applicable to Source Code.
+ *
+ ******************************************************************************/
+/*************************************************************************
+ *
+ */
+
+/**
+ * Include files
+ * */
+
+#ifndef WFX_SL_BLE_INIT
+#define WFX_SL_BLE_INIT
+#define RSI_BLE_ENABLE 1
+
+// BLE include file to refer BLE APIs
+#include "FreeRTOS.h"
+#include "event_groups.h"
+#include "rsi_ble_config.h"
+#include "task.h"
+#include "timers.h"
+#include "wfx_host_events.h"
+#include "wfx_rsi.h"
+#include <rsi_ble.h>
+#include <rsi_ble_apis.h>
+#include <rsi_ble_common_config.h>
+#include <rsi_ble_config.h>
+#include <rsi_bootup_config.h>
+#include <rsi_bt_common.h>
+#include <rsi_bt_common_apis.h>
+#include <rsi_common_apis.h>
+#include <rsi_driver.h>
+#include <rsi_wlan_apis.h>
+#include <rsi_wlan_config.h>
+#include <rsi_wlan_non_rom.h>
+#include <stdbool.h>
+#include <string.h>
+
+#ifdef RSI_M4_INTERFACE
+#include "rsi_board.h"
+#endif
+
+#define ATT_REC_IN_HOST 0
+
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_UUID 0
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_SIZE 2
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_VALUE_16 0xFFF6
+#define RSI_BLE_MATTER_CUSTOM_SERVICE_DATA 0x00
+
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_SIZE 16
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_RESERVED 0x00, 0x00, 0x00
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_1 0x18EE2EF5
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_2 0x263D
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_3 0x4559
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_RX_VALUE_128_DATA_4 0x9F, 0x95, 0x9C, 0x4F, 0x11, 0x9D, 0x9F, 0x42
+#define RSI_BLE_CHARACTERISTIC_RX_ATTRIBUTE_HANDLE_LOCATION 1
+#define RSI_BLE_CHARACTERISTIC_RX_VALUE_HANDLE_LOCATION 2
+
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_SIZE 16
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_RESERVED 0x00, 0x00, 0x00
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_1 0x18EE2EF5
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_2 0x263D
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_3 0x4559
+#define RSI_BLE_CUSTOM_CHARACTERISTIC_TX_VALUE_128_DATA_4 0x9F, 0x95, 0x9C, 0x4F, 0x12, 0x9D, 0x9F, 0x42
+#define RSI_BLE_CHARACTERISTIC_TX_ATTRIBUTE_HANDLE_LOCATION 3
+#define RSI_BLE_CHARACTERISTIC_TX_MEASUREMENT_HANDLE_LOCATION 4
+#define RSI_BLE_CHARACTERISTIC_TX_GATT_SERVER_CLIENT_HANDLE_LOCATION 5
+
+typedef struct sl_wfx_msg_s
+{
+ uint8_t connectionHandle;
+ uint8_t bondingHandle;
+ uint32_t event_num;
+ uint16_t reason;
+ uint16_t event_id;
+ uint16_t resp_status;
+ rsi_ble_event_mtu_t rsi_ble_mtu;
+ rsi_ble_event_write_t rsi_ble_write;
+ rsi_ble_event_enhance_conn_status_t resp_enh_conn;
+ rsi_ble_event_disconnect_t * resp_disconnect;
+ rsi_ble_set_att_resp_t rsi_ble_event_set_att_rsp;
+ uint32_t ble_app_event_map;
+ uint32_t ble_app_event_mask;
+ uint16_t rsi_ble_measurement_hndl;
+ uint16_t rsi_ble_gatt_server_client_config_hndl;
+} sl_wfx_msg_t;
+
+int32_t ble_rsi_task(void);
+void rsi_ble_on_connect_event(rsi_ble_event_conn_status_t * resp_conn);
+void rsi_ble_on_disconnect_event(rsi_ble_event_disconnect_t * resp_disconnect, uint16_t reason);
+void rsi_ble_on_enhance_conn_status_event(rsi_ble_event_enhance_conn_status_t * resp_enh_conn);
+void rsi_ble_on_gatt_write_event(uint16_t event_id, rsi_ble_event_write_t * rsi_ble_write);
+void rsi_ble_on_mtu_event(rsi_ble_event_mtu_t * rsi_ble_mtu);
+void rsi_ble_on_event_indication_confirmation(uint16_t resp_status, rsi_ble_set_att_resp_t * rsi_ble_event_set_att_rsp);
+void rsi_gatt_add_attribute_to_list(rsi_ble_t * p_val, uint16_t handle, uint16_t data_len, uint8_t * data, uuid_t uuid,
+ uint8_t char_prop);
+void rsi_ble_add_char_serv_att(void * serv_handler, uint16_t handle, uint8_t val_prop, uint16_t att_val_handle,
+ uuid_t att_val_uuid);
+void rsi_ble_add_char_val_att(void * serv_handler, uint16_t handle, uuid_t att_type_uuid, uint8_t val_prop, uint8_t * data,
+ uint8_t data_len, uint8_t auth_read);
+uint32_t rsi_ble_add_matter_service(void);
+void rsi_ble_app_set_event(uint32_t event_num);
+int32_t rsi_ble_app_get_event(void);
+void rsi_ble_app_clear_event(uint32_t event_num);
+void rsi_ble_app_init_events();
+void rsi_ble_event_handling_task(void);
+
+#endif
\ No newline at end of file
diff --git a/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h b/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h
deleted file mode 100644
index 6df9724..0000000
--- a/src/platform/silabs/SiWx917/efr32-mbedtls-psa-crypto-config.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *
- * Copyright (c) 2020-2021 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-// ADD USER PSA CRYPTO CONFIG HERE
-#define SL_PSA_KEY_USER_SLOT_COUNT (4)
-
-#define SL_PSA_ITS_USER_MAX_FILES (128)
-
-#include "em_device.h"
-#if defined(SEMAILBOX_PRESENT) || defined(CRYPTOACC_PRESENT)
-// Use accelerated HMAC when we have it
-#define MBEDTLS_PSA_ACCEL_ALG_HMAC
-// Use accelerated ECDSA/ECDH when we have it
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY
-#define MBEDTLS_PSA_ACCEL_ECC_SECP_R1_256
-#define MBEDTLS_PSA_ACCEL_ALG_ECDH
-#define MBEDTLS_PSA_ACCEL_ALG_ECDSA
-#else
-// Devices without SEMAILBOX or CRYPTOACC don't have HMAC top-level accelerated
-#define MBEDTLS_PSA_BUILTIN_ALG_HMAC 1
-// Devices without SEMAILBOX or CRYPTOACC don't have fully implemented ECDSA/ECDH
-#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY 1
-#define MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR 1
-#define MBEDTLS_PSA_BUILTIN_ECC_SECP_R1_256 1
-#define MBEDTLS_PSA_BUILTIN_ALG_ECDH 1
-#define MBEDTLS_PSA_BUILTIN_ALG_ECDSA 1
-#endif
-// end of user configuration section >>>
-
-// AUTO GENERATED PSA CONFIG SECTION BELOW. **KEEP AS IS FUTURE GSDK UPDATE**
-#define PSA_WANT_KEY_TYPE_AES
-#define PSA_WANT_ALG_CMAC
-#define PSA_WANT_ALG_SHA_256
-#define PSA_WANT_ALG_CCM
-#define PSA_WANT_ALG_ECB_NO_PADDING
-#define PSA_WANT_ALG_ECDSA
-#define PSA_WANT_ALG_ECDH
-#define PSA_WANT_KEY_TYPE_ECC_KEY_PAIR
-#define PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY
-#define PSA_WANT_ECC_SECP_R1_256
-#define PSA_WANT_ALG_HKDF
-#define PSA_WANT_ALG_HMAC
-#define PSA_WANT_KEY_TYPE_HMAC
-#define MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_1
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_224
-#define MBEDTLS_PSA_ACCEL_ALG_SHA_256
-#define MBEDTLS_PSA_ACCEL_KEY_TYPE_AES
-#define MBEDTLS_PSA_ACCEL_ALG_ECB_NO_PADDING
-#define MBEDTLS_PSA_ACCEL_ALG_CBC_NO_PADDING
-#define MBEDTLS_PSA_ACCEL_ALG_CBC_PKCS7
-#define MBEDTLS_PSA_ACCEL_ALG_CTR
-#define MBEDTLS_PSA_ACCEL_ALG_CFB
-#define MBEDTLS_PSA_ACCEL_ALG_OFB
-#define MBEDTLS_PSA_ACCEL_ALG_GCM
-#define MBEDTLS_PSA_ACCEL_ALG_CCM
-#define MBEDTLS_PSA_ACCEL_ALG_CMAC
-
-#define MBEDTLS_PSA_KEY_SLOT_COUNT (15 + 1 + SL_PSA_KEY_USER_SLOT_COUNT)
-#define SL_PSA_ITS_MAX_FILES (1 + SL_PSA_ITS_USER_MAX_FILES)
diff --git a/src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h b/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
similarity index 86%
rename from src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h
rename to src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
index 049c12c..41126c5 100644
--- a/src/platform/silabs/SiWx917/efr32-chip-mbedtls-config.h
+++ b/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, The OpenThread Authors.
+ * Copyright (c) 2021, The OpenThread Authors.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,13 +31,10 @@
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
-
-#include "em_device.h"
-#include "em_se.h"
-
-#if CHIP_HAVE_CONFIG_H
-#include <crypto/CryptoBuildConfig.h>
-#endif // CHIP_HAVE_CONFIG_H
+/**
+ * Enable FreeRTOS threading support
+ */
+#define MBEDTLS_FREERTOS
/**
* Enable H Crypto and Entropy modules
@@ -46,8 +43,16 @@
#define MBEDTLS_ECP_C
#define MBEDTLS_ECDH_C
#define MBEDTLS_ENTROPY_C
-#define MBEDTLS_SHA224_C
#define MBEDTLS_SHA256_C
+#define MBEDTLS_CIPHER_MODE_CTR
+#define MBEDTLS_TRNG_C
+
+#define MBEDTLS_NO_PLATFORM_ENTROPY
+#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
+
+#if defined(MBEDTLS_ECP_ALT) && !defined(MBEDTLS_ECP_RESTARTABLE)
+typedef void mbedtls_ecp_restart_ctx;
+#endif
#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf
@@ -58,6 +63,8 @@
#define MBEDTLS_BIGNUM_C
#define MBEDTLS_CCM_C
#define MBEDTLS_CIPHER_C
+#define MBEDTLS_CIPHER_MODE_CBC
+#define MBEDTLS_CIPHER_MODE_CFB
#define MBEDTLS_CMAC_C
#define MBEDTLS_CTR_DRBG_C
#define MBEDTLS_ECDH_LEGACY_CONTEXT
@@ -67,7 +74,9 @@
#define MBEDTLS_ECP_DP_SECP256R1_ENABLED
#define MBEDTLS_ECP_NIST_OPTIM
#define MBEDTLS_ENTROPY_FORCE_SHA256
-#define MBEDTLS_ENTROPY_HARDWARE_ALT
+// TODO: 3R
+// #define MBEDTLS_ENTROPY_HARDWARE_ALT
+
#define MBEDTLS_ERROR_STRERROR_DUMMY
#define MBEDTLS_HAVE_ASM
#define MBEDTLS_HKDF_C
@@ -76,23 +85,15 @@
#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED
#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED
#define MBEDTLS_MD_C
-#define MBEDTLS_NO_PLATFORM_ENTROPY
#define MBEDTLS_OID_C
#define MBEDTLS_PEM_PARSE_C
#define MBEDTLS_PEM_WRITE_C
#define MBEDTLS_PK_C
#define MBEDTLS_PK_PARSE_C
#define MBEDTLS_PK_WRITE_C
-#if CHIP_CRYPTO_MBEDTLS
#define MBEDTLS_PKCS5_C
-#endif
#define MBEDTLS_PLATFORM_C
#define MBEDTLS_PLATFORM_MEMORY
-#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
-#define MBEDTLS_PSA_CRYPTO_C
-#define MBEDTLS_PSA_CRYPTO_CONFIG
-#define MBEDTLS_PSA_CRYPTO_DRIVERS
-#define MBEDTLS_PSA_CRYPTO_STORAGE_C
#define MBEDTLS_SHA256_SMALLER
#define MBEDTLS_SHA512_C
#define MBEDTLS_SSL_CLI_C
@@ -106,11 +107,6 @@
#define MBEDTLS_SSL_PROTO_DTLS
#define MBEDTLS_SSL_SRV_C
#define MBEDTLS_SSL_TLS_C
-
-#if CHIP_CRYPTO_PLATFORM
-#define MBEDTLS_USE_PSA_CRYPTO
-#endif
-
#define MBEDTLS_X509_CREATE_C
#define MBEDTLS_X509_CSR_WRITE_C
#define MBEDTLS_X509_CRL_PARSE_C
@@ -133,9 +129,4 @@
#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8
-#define MBEDTLS_CIPHER_MODE_WITH_PADDING
-
-#include "check_crypto_config.h"
-#include "config-device-acceleration.h"
#include "mbedtls/check_config.h"
-#include "mbedtls/config_psa.h"
diff --git a/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp b/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
index 15c6785..e45f38b 100644
--- a/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
+++ b/src/platform/silabs/SiWx917/wifi/dhcp_client.cpp
@@ -21,12 +21,6 @@
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
#include "dhcp_client.h"
#include "lwip/dhcp.h"
#include "wfx_host_events.h"
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
index d1fcc01..13cc843 100644
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
+++ b/src/platform/silabs/SiWx917/wifi/ethernetif.cpp
@@ -21,12 +21,6 @@
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
#ifndef WF200_WIFI
#include "FreeRTOS.h"
#include "event_groups.h"
@@ -182,141 +176,6 @@
}
}
-/*****************************************************************************
- * @fn static err_t low_level_output(struct netif *netif, struct pbuf *p)
- * @brief
- * This function should does the actual transmission of the packet(s).
- * The packet is contained in the pbuf that is passed to the function.
- * This pbuf might be chained.
- *
- * @param[in] netif: the lwip network interface structure
- *
- * @param[in] p: the packet to send
- *
- * @return
- * ERR_OK if successful
- ******************************************************************************/
-#ifdef WF200_WIFI
-static err_t low_level_output(struct netif * netif, struct pbuf * p)
-{
- struct pbuf * q;
- sl_wfx_send_frame_req_t * tx_buffer;
- uint8_t * buffer;
- uint32_t framelength, asize;
- uint32_t bufferoffset;
- uint32_t padding;
- sl_status_t result;
-
- for (q = p, framelength = 0; q != NULL; q = q->next)
- {
- framelength += q->len;
- }
- if (framelength < LWIP_FRAME_ALIGNMENT)
- { /* 60 : Frame alignment for LWIP */
- padding = LWIP_FRAME_ALIGNMENT - framelength;
- }
- else
- {
- padding = 0;
- }
-
- /* choose padding of 64 */
- asize = SL_WFX_ROUND_UP(framelength + padding, 64) + sizeof(sl_wfx_send_frame_req_t);
- // 12 is size of other data in buffer struct, user shouldn't have to care about this?
- if (sl_wfx_host_allocate_buffer((void **) &tx_buffer, SL_WFX_TX_FRAME_BUFFER, asize) != SL_STATUS_OK)
- {
- SILABS_LOG("*ERR*EN-Out: No mem frame len=%d", framelength);
- gOverrunCount++;
- SILABS_LOG("overrun count exiting when faied to alloc value %d", gOverrunCount);
- return ERR_MEM;
- }
- buffer = tx_buffer->body.packet_data;
- /* copy frame from pbufs to driver buffers */
- for (q = p, bufferoffset = 0; q != NULL; q = q->next)
- {
- /* Get bytes in current lwIP buffer */
- memcpy((uint8_t *) ((uint8_t *) buffer + bufferoffset), (uint8_t *) ((uint8_t *) q->payload), q->len);
- bufferoffset += q->len;
- }
- /* No requirement to do this - but we should for security */
- if (padding)
- {
- memset(buffer + bufferoffset, 0, padding);
- framelength += padding;
- }
- /* transmit */
- int i = 0;
- result = SL_STATUS_FAIL;
-
-#ifdef WIFI_DEBUG_ENABLED
- SILABS_LOG("WF200: Out %d", (int) framelength);
-#endif
-
- /* send the generated frame over Wifi network */
- while ((result != SL_STATUS_OK) && (i++ < 10))
- {
- result = sl_wfx_send_ethernet_frame(tx_buffer, framelength, SL_WFX_STA_INTERFACE, PRIORITY_0);
- }
- sl_wfx_host_free_buffer(tx_buffer, SL_WFX_TX_FRAME_BUFFER);
-
- if (result != SL_STATUS_OK)
- {
- SILABS_LOG("*ERR*Send enet %d", (int) framelength);
- return ERR_IF;
- }
- return ERR_OK;
-}
-
-/*****************************************************************************
- * @fn void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t *rx_buffer)
- * @brief
- * This function implements the wf200 received frame callback.
- * Called from the context of the bus_task (not ISR)
- *
- * @param[in] rx_buffer: the ethernet frame received by the wf200
- *
- * @return
- * None
- ******************************************************************************/
-void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t * rx_buffer)
-{
- struct netif * netif;
-
- /* Check packet interface to send to AP or STA interface */
- if ((rx_buffer->header.info & SL_WFX_MSG_INFO_INTERFACE_MASK) == (SL_WFX_STA_INTERFACE << SL_WFX_MSG_INFO_INTERFACE_OFFSET))
- {
-
- /* Send received frame to station interface */
- if ((netif = wfx_get_netif(SL_WFX_STA_INTERFACE)) != NULL)
- {
- uint8_t * buffer;
- uint16_t len;
-
- len = rx_buffer->body.frame_length;
- buffer = (uint8_t *) &(rx_buffer->body.frame[rx_buffer->body.frame_padding]);
-
-#ifdef WIFI_DEBUG_ENABLED
- SILABS_LOG("WF200: In %d", (int) len);
-#endif
-
- low_level_input(netif, buffer, len);
- }
- else
- {
-#ifdef WIFI_DEBUG_ENABLED
- SILABS_LOG("WF200: NO-INTF");
-#endif
- }
- }
- else
- {
-#ifdef WIFI_DEBUG_ENABLED
- SILABS_LOG("WF200: Invalid frame IN");
-#endif
- }
-}
-
-#else /* For RS911x - using LWIP */
static SemaphoreHandle_t ethout_sem;
/*****************************************************************************
* @fn static err_t low_level_output(struct netif *netif, struct pbuf *p)
@@ -422,8 +281,6 @@
}
}
-#endif /* RS911x - with LWIP */
-
/*****************************************************************************
* @fn err_t sta_ethernetif_init(struct netif *netif)
* @brief
@@ -452,10 +309,10 @@
/* initialize the hardware */
low_level_init(netif);
-#ifndef WF200_WIFI
+
/* Need single output only */
ethout_sem = xSemaphoreCreateBinaryStatic(&xEthernetIfSemaBuffer);
xSemaphoreGive(ethout_sem);
-#endif
+
return ERR_OK;
}
diff --git a/src/platform/silabs/SiWx917/wifi/ethernetif.h b/src/platform/silabs/SiWx917/wifi/ethernetif.h
index dfea1ea..bac51b9 100644
--- a/src/platform/silabs/SiWx917/wifi/ethernetif.h
+++ b/src/platform/silabs/SiWx917/wifi/ethernetif.h
@@ -42,11 +42,8 @@
******************************************************************************/
err_t ap_ethernetif_init(struct netif * netif);
-#ifdef WF200_WIFI
-void sl_wfx_host_received_frame_callback(sl_wfx_received_ind_t * rx_buffer);
-#else
void wfx_host_received_sta_frame_cb(uint8_t * buf, int len);
-#endif /* WF200_WIFI */
+
#ifdef __cplusplus
}
#endif
diff --git a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp b/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
index e19cf97..913f589 100644
--- a/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
+++ b/src/platform/silabs/SiWx917/wifi/lwip_netif.cpp
@@ -20,12 +20,6 @@
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-
#include "wfx_host_events.h"
#include "wifi_config.h"
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
index 5a7e861..66e161d 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
+++ b/src/platform/silabs/SiWx917/wifi/wfx_host_events.h
@@ -17,86 +17,7 @@
#pragma once
-#ifdef WF200_WIFI
-#include "FreeRTOS.h"
-#include "event_groups.h"
-#include "semphr.h"
-#include "task.h"
-#include "timers.h"
-
-#include "sl_wfx_cmd_api.h"
-#include "sl_wfx_constants.h"
-
-typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_body_s
-{
- uint32_t status;
- uint16_t mib_id;
- uint16_t length;
- uint32_t rcpi;
- uint32_t count_plcp_errors;
- uint32_t count_fcs_errors;
- uint32_t count_tx_packets;
- uint32_t count_rx_packets;
- uint32_t count_rx_packet_errors;
- uint32_t count_rx_decryption_failures;
- uint32_t count_rx_mic_failures;
- uint32_t count_rx_no_key_failures;
- uint32_t count_tx_multicast_frames;
- uint32_t count_tx_frames_success;
- uint32_t count_tx_frame_failures;
- uint32_t count_tx_frames_retried;
- uint32_t count_tx_frames_multi_retried;
- uint32_t count_rx_frame_duplicates;
- uint32_t count_rts_success;
- uint32_t count_rts_failures;
- uint32_t count_ack_failures;
- uint32_t count_rx_multicast_frames;
- uint32_t count_rx_frames_success;
- uint32_t count_rx_cmacicv_errors;
- uint32_t count_rx_cmac_replays;
- uint32_t count_rx_mgmt_ccmp_replays;
- uint32_t count_rx_bipmic_errors;
- uint32_t count_rx_beacon;
- uint32_t count_miss_beacon;
- uint32_t reserved[15];
-} sl_wfx_get_counters_cnf_body_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_get_counters_cnf_s
-{
- /** Common message header. */
- sl_wfx_header_t header;
- /** Confirmation message body. */
- sl_wfx_get_counters_cnf_body_t body;
-} sl_wfx_get_counters_cnf_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_mib_req_body_s
-{
- uint16_t mib_id; ///< ID of the MIB to be read.
- uint16_t reserved;
-} sl_wfx_mib_req_body_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_header_mib_s
-{
- uint16_t length; ///< Message length in bytes including this uint16_t.
- ///< Maximum value is 8188 but maximum Request size is FW dependent and reported in the
- ///< ::sl_wfx_startup_ind_body_t::size_inp_ch_buf.
- uint8_t id; ///< Contains the message Id indexed by sl_wfx_general_commands_ids_t or sl_wfx_message_ids_t.
- uint8_t reserved : 1;
- uint8_t interface : 2;
- uint8_t seqnum : 3;
- uint8_t encrypted : 2;
-} sl_wfx_header_mib_t;
-
-typedef struct __attribute__((__packed__)) sl_wfx_mib_req_s
-{
- /** Common message header. */
- sl_wfx_header_mib_t header;
- /** Request message body. */
- sl_wfx_mib_req_body_t body;
-} sl_wfx_mib_req_t;
-
-#else /* End WF200 else RS911x */
-
+#include "stdbool.h"
#include "wfx_msgs.h"
/* Wi-Fi events*/
@@ -106,8 +27,6 @@
#define SL_WFX_SCAN_COMPLETE_ID 4
#define WFX_RSI_SSID_SIZE 64
-#endif /* WF200 */
-
#ifndef RS911X_SOCKETS
/* LwIP includes. */
#include "lwip/apps/httpd.h"
@@ -129,18 +48,11 @@
#include "sl_status.h"
-#ifdef RS911X_WIFI
#define WLAN_TASK_STACK_SIZE 1024
-#define WLAN_TASK_PRIORITY 1
-#define WLAN_DRIVER_TASK_PRIORITY 1
+#define WLAN_TASK_PRIORITY 3
+#define WLAN_DRIVER_TASK_PRIORITY 2
#define MAX_JOIN_RETRIES_COUNT 5
-#else /* WF200 */
-#define WLAN_TASK_STACK_SIZE 1024
-#define WLAN_TASK_PRIORITY 1
-#define MAX_JOIN_RETRIES_COUNT 5
-#endif
-
// WLAN related Macros
#define ETH_FRAME 0
#define CMP_SUCCESS 0
@@ -322,6 +234,7 @@
int32_t wfx_get_ap_info(wfx_wifi_scan_result_t * ap);
int32_t wfx_get_ap_ext(wfx_wifi_scan_ext_t * extra_info);
int32_t wfx_reset_counts();
+int32_t wfx_rsi_platform();
void wfx_clear_wifi_provision(void);
sl_status_t wfx_connect_to_ap(void);
@@ -364,12 +277,6 @@
int32_t wfx_rsi_send_data(void * p, uint16_t len);
#endif /* RS911X_WIFI */
-#ifdef WF200_WIFI
-void wfx_bus_start(void);
-sl_status_t get_all_counters(void);
-void sl_wfx_host_gpio_init(void);
-sl_status_t sl_wfx_host_process_event(sl_wfx_generic_message_t * event_payload);
-#endif
#ifdef __cplusplus
}
#endif
diff --git a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
index 9f681e7..86bba19 100644
--- a/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
+++ b/src/platform/silabs/SiWx917/wifi/wfx_notify.cpp
@@ -19,13 +19,6 @@
#include <stdlib.h>
#include <string.h>
-#include "em_bus.h"
-#include "em_cmu.h"
-#include "em_gpio.h"
-#include "em_ldma.h"
-#include "em_usart.h"
-#include "gpiointerrupt.h"
-
#include "AppConfig.h"
#include "FreeRTOS.h"
diff --git a/src/platform/silabs/SiWx917/wifi_args.gni b/src/platform/silabs/SiWx917/wifi_args.gni
index 73a6613..88d554d 100644
--- a/src/platform/silabs/SiWx917/wifi_args.gni
+++ b/src/platform/silabs/SiWx917/wifi_args.gni
@@ -17,7 +17,7 @@
import("//build_overrides/efr32_sdk.gni")
import("//build_overrides/pigweed.gni")
-import("${chip_root}/examples/platform/silabs/efr32/args.gni")
+import("${chip_root}/examples/platform/silabs/SiWx917/args.gni")
import("${chip_root}/src/crypto/crypto.gni")
# ARM architecture flags will be set based on silabs_family.
@@ -25,11 +25,6 @@
mbedtls_target = "${efr32_sdk_build_root}:efr32_sdk"
-# default to platform crypto implementation but allow commandline override
-if (chip_crypto == "") {
- chip_crypto = "platform"
-}
-
# Transitional CommissionableDataProvider not used anymore
# examples/platform/efr32/EFR32DeviceDataProvider is now used.
chip_use_transitional_commissionable_data_provider = false
@@ -41,7 +36,7 @@
lwip_api = true
lwip_ethernet = true
-chip_device_platform = "efr32"
+chip_device_platform = "SiWx917"
chip_enable_openthread = false
chip_inet_config_enable_ipv4 = true
chip_inet_config_enable_dns_resolver = false
diff --git a/third_party/silabs/BUILD.gn b/third_party/silabs/BUILD.gn
index f968d3d..9c59de2 100644
--- a/third_party/silabs/BUILD.gn
+++ b/third_party/silabs/BUILD.gn
@@ -16,7 +16,13 @@
import("//build_overrides/efr32_sdk.gni")
import("//build_overrides/jlink.gni")
import("${chip_root}/src/platform/device.gni")
-import("${efr32_sdk_build_root}/efr32_sdk.gni")
+import("${efr32_sdk_build_root}/silabs_board.gni")
+
+if (silabs_board == "BRD4325A") { # CCP board
+ import("${efr32_sdk_build_root}/SiWx917_sdk.gni")
+} else {
+ import("${efr32_sdk_build_root}/efr32_sdk.gni")
+}
declare_args() {
# Build target to use for efr32 SDK. Use this to set global SDK defines.
diff --git a/third_party/silabs/SiWx917_sdk.gni b/third_party/silabs/SiWx917_sdk.gni
index 38359a7..5d6a857 100644
--- a/third_party/silabs/SiWx917_sdk.gni
+++ b/third_party/silabs/SiWx917_sdk.gni
@@ -24,6 +24,8 @@
# Location of the efr32 SDK.
efr32_sdk_root = "${chip_root}/third_party/silabs/gecko_sdk"
sdk_support_root = "${chip_root}/third_party/silabs/matter_support"
+ wiseconnect_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
+ examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"
# Build openthread with prebuilt silabs lib
use_silabs_thread_lib = false
@@ -35,9 +37,6 @@
# Use Silabs factory data provider example.
# Users can implement their own.
use_efr32_factory_data_provider = true
-
- # Enable Segger System View
- use_system_view = false
}
# Explorer Kit and MGM240L do not have external flash
@@ -67,12 +66,6 @@
}
assert(efr32_sdk_root != "", "efr32_sdk_root must be specified")
- use_wf200 = false
- if (defined(invoker.use_wf200)) {
- if (invoker.use_wf200) {
- use_wf200 = true
- }
- }
sdk_target_name = target_name
@@ -85,82 +78,30 @@
# Treat these includes as system includes, so warnings in them are not fatal.
_include_dirs = [
- "${efr32_sdk_root}",
- "${efr32_sdk_root}/hardware/kit/common/bsp",
- "${efr32_sdk_root}/app/common/util/app_assert/",
- "${efr32_sdk_root}/hardware/board/inc",
- "${efr32_sdk_root}/hardware/driver/memlcd/inc",
- "${efr32_sdk_root}/hardware/driver/memlcd/src/ls013b7dh03",
- "${efr32_sdk_root}/platform/bootloader",
- "${efr32_sdk_root}/platform/bootloader/config",
- "${efr32_sdk_root}/platform/bootloader/config/s2/btl_interface",
- "${efr32_sdk_root}/platform/bootloader/api",
- "${efr32_sdk_root}/platform/CMSIS/Core/Include",
- "${efr32_sdk_root}/platform/CMSIS/RTOS2/Include",
- "${efr32_sdk_root}/platform/common/inc",
- "${efr32_sdk_root}/platform/driver/button/inc",
- "${efr32_sdk_root}/platform/emdrv/common/inc",
- "${efr32_sdk_root}/platform/emdrv/gpiointerrupt/inc",
- "${efr32_sdk_root}/platform/emdrv/dmadrv/config",
- "${efr32_sdk_root}/platform/emdrv/dmadrv/inc",
- "${efr32_sdk_root}/platform/emdrv/nvm3/inc",
- "${efr32_sdk_root}/platform/emdrv/rtcdrv/inc",
- "${efr32_sdk_root}/platform/emlib/inc",
- "${efr32_sdk_root}/platform/halconfig/inc/hal-config",
- "${efr32_sdk_root}/platform/peripheral/inc",
- "${efr32_sdk_root}/platform/radio/rail_lib/common",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/rf/common/cortex",
- "${efr32_sdk_root}/platform/radio/rail_lib/hal",
- "${efr32_sdk_root}/platform/radio/rail_lib/hal/efr32",
- "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ieee802154",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_pti",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_rf_path",
- "${efr32_sdk_root}/platform/service/device_init/inc",
- "${efr32_sdk_root}/platform/service/hfxo_manager/config/",
- "${efr32_sdk_root}/platform/service/hfxo_manager/inc",
- "${efr32_sdk_root}/platform/service/hfxo_manager/src",
- "${efr32_sdk_root}/platform/service/mpu/inc",
- "${efr32_sdk_root}/platform/service/power_manager/config/",
- "${efr32_sdk_root}/platform/service/power_manager/inc/",
- "${efr32_sdk_root}/platform/service/power_manager/src/",
- "${efr32_sdk_root}/platform/service/sleeptimer/inc",
- "${efr32_sdk_root}/platform/service/sleeptimer/config",
- "${efr32_sdk_root}/platform/service/system/inc",
- "${efr32_sdk_root}/platform/service/udelay/inc",
- "${efr32_sdk_root}/platform/service/legacy_hal/inc",
- "${efr32_sdk_root}/platform/service/token_manager/config",
- "${efr32_sdk_root}/platform/service/token_manager/inc",
- "${efr32_sdk_root}/platform/service/token_manager/test",
- "${efr32_sdk_root}/platform/service/token_manager/test/include",
- "${efr32_sdk_root}/platform/service/token_manager/test/stack/config",
- "${efr32_sdk_root}/platform/service/token_manager/test/stack/include",
- "${efr32_sdk_root}/platform/middleware/glib",
- "${efr32_sdk_root}/platform/middleware/glib/glib",
- "${efr32_sdk_root}/platform/middleware/glib/dmd",
- "${efr32_sdk_root}/platform/base/hal/plugin/psstore",
- "${efr32_sdk_root}/platform/base/hal/plugin/antenna",
- "${efr32_sdk_root}/protocol/bluetooth/inc/",
- "${efr32_sdk_root}/app/bluetooth/common/in_place_ota_dfu/",
- "${efr32_sdk_root}/util/plugin/plugin-common/fem-control",
- "${efr32_sdk_root}/util/silicon_labs/silabs_core/graphics",
- "${efr32_sdk_root}/util/silicon_labs/silabs_core/memory_manager",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/include",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/include/psa",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_alt/include",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/inc",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/config/",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/inc",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/inc/public",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/inc",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/",
- "${efr32_sdk_root}/util/third_party/freertos/cmsis/Include",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/include",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/config",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen",
+ "${sdk_support_root}/platform/emdrv/nvm3/inc",
+
+ "${chip_root}/third_party/mbedtls/repo/include",
+
+ ### CCP includes ###
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/config",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/config",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/rom_driver/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/inc",
+
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/CMSIS/Driver/Include",
+ "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/inc",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/cmsis",
+ "${wiseconnect_sdk_root}/third_party/freertos/include",
+ "${wiseconnect_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F",
+ "${examples_plat_dir}/device/inc",
+
+ "${wiseconnect_sdk_root}/sapi/include",
+
+ "${chip_root}/examples/platform/SiWx917/SiWx917",
+ "${chip_root}/examples/platform/SiWx917/SiWx917/hal",
]
# Note that we're setting the mbedTLS and PSA configuration files through a
@@ -169,13 +110,14 @@
# To fix this, these files are also manually depended upon in the source set
# declared in efr32_mbedtls_config further down this file.
defines = [
- "MBEDTLS_CONFIG_FILE=\"efr32-chip-mbedtls-config.h\"",
- "MBEDTLS_PSA_CRYPTO_CONFIG_FILE=\"efr32-mbedtls-psa-crypto-config.h\"",
+ "MBEDTLS_CONFIG_FILE=\"siwx917-chip-mbedtls-config.h\"",
"__STARTUP_CLEAR_BSS",
"HARD_FAULT_LOG_ENABLE",
"CORTEXM3_EFM32_MICRO",
- "EFR32_LOG_ENABLED=1",
- "NVM3_DEFAULT_NVM_SIZE=40960",
+ "SILABS_LOG_ENABLED=1",
+
+ #Matter required at least 40960 but SiWx917 SoC requires an extra 20k to resolve nvm3_open() error, Need to be checked.
+ "NVM3_DEFAULT_NVM_SIZE=73728",
"NVM3_DEFAULT_MAX_OBJECT_SIZE=4092",
"KVS_MAX_ENTRIES=${kvs_max_entries}",
"EFR32_OPENTHREAD_API",
@@ -186,36 +128,18 @@
"${silabs_mcu}=1",
"${silabs_board}=1",
"__HEAP_SIZE=0",
- "SL_CATALOG_FREERTOS_KERNEL_PRESENT=1",
- "MBEDTLS_THREADING_C=1",
- "MBEDTLS_THREADING_ALT=1",
- "SL_THREADING_ALT=1",
"SL_COMPONENT_CATALOG_PRESENT",
"PLATFORM_HEADER=\"platform-header.h\"",
"USE_NVM3=1",
-
- #"__STACK_SIZE=0",
+ "RSI_ARM_CM4F",
+ "RSI_BLE_ENABLE=1",
+ "BRD4325A",
+ "CHIP_9117",
+ "RS91X_BLE_ENABLE=1",
]
- if (use_system_view) {
- _include_dirs += [
- "${efr32_sdk_root}/util/third_party/segger/systemview/SEGGER",
- "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/Config/Cortex-M",
- "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10",
- "${efr32_sdk_root}/util/third_party/segger/systemview/Config/",
- ]
-
- defines += [ "SL_SYSTEM_VIEW=1" ]
- }
-
defines += board_defines
- if (use_wstk_leds) {
- _include_dirs += [ "${efr32_sdk_root}/platform/driver/leddrv/inc" ]
-
- defines += [ "ENABLE_WSTK_LEDS" ]
- }
-
if (defined(invoker.enable_sleepy_device)) {
if (invoker.enable_sleepy_device) {
defines += [
@@ -257,112 +181,11 @@
"${efr32_sdk_root}/platform/emdrv/uartdrv/inc",
"${efr32_sdk_root}/platform/emdrv/uartdrv/config",
"${efr32_sdk_root}/hardware/driver/memlcd/inc/memlcd_usart",
+ "${efr32_sdk_root}/platform/common/errno/inc",
]
}
- if (silabs_family == "efr32mg12") {
- _include_dirs += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Include",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg1x",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM4F",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg1x/config",
- "${efr32_sdk_root}/platform/service/device_init/config/s1/",
- "${efr32_sdk_root}/platform/emdrv/spidrv/inc",
- ]
-
- libs += [
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG12P/GCC/binapploader.o",
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG12P/GCC/libbluetooth.a",
- "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg12_gcc_release.a",
- "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a",
- ]
-
- defines += [ "EFR32MG12" ]
- } else if (silabs_family == "efr32mg21") {
- _include_dirs += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Include",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg21",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg21/config",
- "${efr32_sdk_root}/platform/service/device_init/config/s2/",
- ]
-
- libs += [
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG21/GCC/binapploader.o",
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG21/GCC/libbluetooth.a",
- "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg21_gcc_release.a",
- "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
- ]
-
- defines += [
- "EFR32MG21",
- "EFR32_SERIES2_CONFIG1_MICRO",
- ]
- } else if (silabs_family == "efr32mg24") {
- _include_dirs += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Include",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24/config",
- "${efr32_sdk_root}/platform/service/device_init/config/s2/",
- "${efr32_sdk_root}/platform/emdrv/spidrv/inc",
- ]
-
- libs += [
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libapploader.a",
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libbluetooth.a",
- "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_efr32xg24_gcc_release.a",
- "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
- ]
-
- defines += [
- "EFR32MG24",
- "EFR32_SERIES2_CONFIG4_MICRO",
- ]
- } else if (silabs_family == "mgm24") {
- _include_dirs += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Include",
- "${efr32_sdk_root}/platform/radio/rail_lib/chip/efr32/efr32xg2x",
- "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ble",
- "${efr32_sdk_root}/platform/radio/rail_lib/protocol/ieee802154",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/efr32xg24/config",
- "${efr32_sdk_root}/platform/service/device_init/config/s2/",
- ]
-
- libs += [
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libapploader.a",
- "${sdk_support_root}/protocol/bluetooth/lib/EFR32MG24/GCC/libbluetooth.a",
- "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_multiprotocol_module_efr32xg24_gcc_release.a",
- "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM33_gcc.a",
- ]
-
- if (silabs_mcu == "MGM240PB32VNA") {
- libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb32vna_gcc.a" ]
- } else if (silabs_mcu == "MGM240PB22VNA") {
- libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240pb22vna_gcc.a" ]
- } else if (silabs_mcu == "MGM240L022RNF") {
- libs += [ "${sdk_support_root}/platform/radio/rail_lib/autogen/librail_release/librail_config_mgm240l022rnf_gcc.a" ]
- }
-
- defines += [
- "MGM24",
- "EFR32_SERIES2_CONFIG4_MICRO",
- ]
- }
-
- if (use_wf200) {
- _include_dirs += [
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/firmware",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/pds/brd8022a",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/secure_link",
- ]
- }
+ libs += [ "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a" ]
cflags = []
foreach(include_dir, _include_dirs) {
@@ -390,14 +213,13 @@
}
}
- source_set("efr32_mbedtls_config") {
+ source_set("si917_mbedtls_config") {
# We're setting the mbedTLS config flags here as the efr32_sdk target
# acts as the mbedTLS target for EFR32 builds. We need this for the build
# system to recompile mbedTLS (= the SDK) when the mbedTLS config gets
# edited.
sources = [
- "${chip_root}/src/platform/silabs/EFR32/efr32-chip-mbedtls-config.h",
- "${chip_root}/src/platform/silabs/EFR32/efr32-mbedtls-psa-crypto-config.h",
+ "${chip_root}/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h",
]
public_deps = [ "${chip_root}/src/crypto:crypto_buildconfig" ]
@@ -405,412 +227,91 @@
source_set(sdk_target_name) {
sources = [
- "${chip_root}/third_party/mbedtls/repo/include/mbedtls/platform.h",
- "${efr32_sdk_root}/app/bluetooth/common/in_place_ota_dfu/sl_bt_in_place_ota_dfu.c",
- "${efr32_sdk_root}/hardware/board/src/sl_board_control_gpio.c",
- "${efr32_sdk_root}/hardware/board/src/sl_board_init.c",
- "${efr32_sdk_root}/platform/CMSIS/RTOS2/Source/os_systick.c",
- "${efr32_sdk_root}/platform/bootloader/api/btl_interface.c",
- "${efr32_sdk_root}/platform/bootloader/api/btl_interface_storage.c",
- "${efr32_sdk_root}/platform/bootloader/security/sha/crypto_sha.c",
- "${efr32_sdk_root}/platform/common/src/sl_slist.c",
- "${efr32_sdk_root}/platform/driver/button/src/sl_button.c",
- "${efr32_sdk_root}/platform/driver/button/src/sl_simple_button.c",
- "${efr32_sdk_root}/platform/emdrv/dmadrv/src/dmadrv.c",
- "${efr32_sdk_root}/platform/emdrv/gpiointerrupt/src/gpiointerrupt.c",
- "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_default.c",
- "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_hal_flash.c",
- "${efr32_sdk_root}/platform/emdrv/nvm3/src/nvm3_lock.c",
- "${efr32_sdk_root}/platform/emlib/src/em_adc.c",
- "${efr32_sdk_root}/platform/emlib/src/em_cmu.c",
- "${efr32_sdk_root}/platform/emlib/src/em_core.c",
- "${efr32_sdk_root}/platform/emlib/src/em_crypto.c",
- "${efr32_sdk_root}/platform/emlib/src/em_emu.c",
- "${efr32_sdk_root}/platform/emlib/src/em_gpio.c",
- "${efr32_sdk_root}/platform/emlib/src/em_ldma.c",
- "${efr32_sdk_root}/platform/emlib/src/em_msc.c",
- "${efr32_sdk_root}/platform/emlib/src/em_prs.c",
- "${efr32_sdk_root}/platform/emlib/src/em_rmu.c",
- "${efr32_sdk_root}/platform/emlib/src/em_rtcc.c",
- "${efr32_sdk_root}/platform/emlib/src/em_se.c",
- "${efr32_sdk_root}/platform/emlib/src/em_system.c",
- "${efr32_sdk_root}/platform/emlib/src/em_timer.c",
- "${efr32_sdk_root}/platform/peripheral/src/peripheral_sysrtc.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/hal/efr32/hal_efr.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/pa_conversions_efr32.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_pti/sl_rail_util_pti.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfrco.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_nvic.c",
- "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager.c",
- "${efr32_sdk_root}/platform/service/legacy_hal/src/token_legacy.c",
- "${efr32_sdk_root}/platform/service/mpu/src/sl_mpu.c",
- "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager.c",
- "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_debug.c",
- "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_hal_s0_s1.c",
- "${efr32_sdk_root}/platform/service/power_manager/src/sl_power_manager_hal_s2.c",
- "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer.c",
- "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer_hal_rtcc.c",
- "${efr32_sdk_root}/platform/service/sleeptimer/src/sl_sleeptimer_hal_sysrtc.c",
- "${efr32_sdk_root}/platform/service/system/src/sl_system_init.c",
- "${efr32_sdk_root}/platform/service/system/src/sl_system_kernel.c",
- "${efr32_sdk_root}/platform/service/system/src/sl_system_process_action.c",
- "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_def.c",
- "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_manager.c",
- "${efr32_sdk_root}/platform/service/token_manager/src/sl_token_manufacturing.c",
- "${efr32_sdk_root}/platform/service/udelay/src/sl_udelay.c",
- "${efr32_sdk_root}/platform/service/udelay/src/sl_udelay_armv6m_gcc.S",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_bt_mbedtls_context.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_bt_rtos_adaptation.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_bt_stack_init.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sli_bt_advertiser_config.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sli_bt_connection_config.c",
- "${efr32_sdk_root}/util/silicon_labs/silabs_core/memory_manager/sl_malloc.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/aesni.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/asn1parse.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/asn1write.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/base64.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/bignum.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/camellia.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ccm.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/chacha20.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/chachapoly.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cipher_wrap.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/cmac.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/constant_time.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ctr_drbg.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/debug.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/des.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/dhm.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecdh.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecdsa.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecjpake.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecp.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ecp_curves.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/entropy.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/entropy_poll.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/gcm.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/hkdf.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/hmac_drbg.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/md.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/md5.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/oid.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pem.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pk.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pk_wrap.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkcs12.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkcs5.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkparse.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/pkwrite.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/platform.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/platform_util.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/poly1305.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_client.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_driver_wrappers.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_ecp.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_rsa.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_se.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_slot_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_crypto_storage.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/psa_its_file.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ripemd160.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/rsa.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha1.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha256.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/sha512.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cache.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_ciphersuites.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cli.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_cookie.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_msg.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_srv.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_ticket.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_tls.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/ssl_tls13_keys.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/threading.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/timing.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/version.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_create.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_crl.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_crt.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509_csr.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509write_crt.c",
- "${efr32_sdk_root}/util/third_party/crypto/mbedtls/library/x509write_csr.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/aes_aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/crypto_aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/crypto_ecp.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/error.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_ccm.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_cmac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_ecdsa_ecdh.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/mbedtls_sha.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/sl_entropy_hardware.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/sl_mbedtls.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/version_features.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_protocol_crypto_crypto.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_protocol_crypto_radioaes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/crypto_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sl_psa_its_nvm3.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_transparent_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_crypto_trng_driver.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_driver_common.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_driver_init.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_psa_trng.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_builtin_keys.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_signature.c",
- "${efr32_sdk_root}/util/third_party/freertos/cmsis/Source/cmsis_os2.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/croutine.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/event_groups.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/list.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/queue.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/stream_buffer.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/tasks.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/timers.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/gatt_db.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_bluetooth.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_board_default_init.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_device_init_clocks.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_event_handler.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_simple_button_instances.c",
+ "${examples_plat_dir}/device/src/startup_RS1xxxx.c",
+ "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_dev.c",
+ "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_intf.c",
+ "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_prg.c",
+ "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_default.c",
+
+ ### nvm3 for ccp platform ###
+ "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_hal_flash_ccp.c",
+ "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_lock.c",
+
+ ######## CCP Platform #########
+ "${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/src/rsi_board.c",
+
+ #"${wiseconnect_sdk_root}/platforms/si91x/boards/brd4325a/src/syscalls.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_deepsleep_commonflash.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_ps_ram_func.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/rsi_system_config.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/core/chip/src/system_RS1xxxx.c",
+
+ #"${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/UDMA.c",
+ #"${wiseconnect_sdk_root}/platforms/si91x/drivers/cmsis_driver/USART.c",
+
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/clock_update.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_comparator.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_egpio.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma_wrapper.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_usart.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ipmu.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_pll.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_power_save.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_processor_sensor.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_rtc.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_temp_sensor.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_time_period.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ulpss_clk.c",
+ "${wiseconnect_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_wwdt.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/croutine.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/event_groups.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/list.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F/port.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/queue.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/stream_buffer.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/tasks.c",
+ "${wiseconnect_sdk_root}/third_party/freertos/timers.c",
+
+ # Bluetooth
+ "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gap_apis.c",
+ "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gatt_apis.c",
+ "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_bt_common_apis.c",
+ "${wiseconnect_sdk_root}/sapi/driver/rsi_bt_ble.c",
+
+ # mbedtls
+ "${chip_root}/third_party/mbedtls/repo/library/aes.c",
+ "${chip_root}/third_party/mbedtls/repo/library/asn1parse.c",
+ "${chip_root}/third_party/mbedtls/repo/library/asn1write.c",
+ "${chip_root}/third_party/mbedtls/repo/library/bignum.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ccm.c",
+ "${chip_root}/third_party/mbedtls/repo/library/cipher.c",
+ "${chip_root}/third_party/mbedtls/repo/library/cipher_wrap.c",
+ "${chip_root}/third_party/mbedtls/repo/library/constant_time.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ctr_drbg.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ecdh.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ecdsa.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ecp.c",
+ "${chip_root}/third_party/mbedtls/repo/library/ecp_curves.c",
+ "${chip_root}/third_party/mbedtls/repo/library/entropy.c",
+ "${chip_root}/third_party/mbedtls/repo/library/hkdf.c",
+ "${chip_root}/third_party/mbedtls/repo/library/hmac_drbg.c",
+ "${chip_root}/third_party/mbedtls/repo/library/md.c",
+ "${chip_root}/third_party/mbedtls/repo/library/oid.c",
+ "${chip_root}/third_party/mbedtls/repo/library/pk.c",
+ "${chip_root}/third_party/mbedtls/repo/library/pk_wrap.c",
+ "${chip_root}/third_party/mbedtls/repo/library/pkcs5.c",
+ "${chip_root}/third_party/mbedtls/repo/library/pkwrite.c",
+ "${chip_root}/third_party/mbedtls/repo/library/platform.c",
+ "${chip_root}/third_party/mbedtls/repo/library/platform_util.c",
+ "${chip_root}/third_party/mbedtls/repo/library/sha256.c",
+ "${chip_root}/third_party/mbedtls/repo/library/sha512.c",
+ "${chip_root}/third_party/mbedtls/repo/library/x509_create.c",
+ "${chip_root}/third_party/mbedtls/repo/library/x509write_csr.c",
]
- if (use_system_view) {
- sources += [
- "${efr32_sdk_root}/util/third_party/segger/systemview/SEGGER/SEGGER_SYSVIEW.c",
- "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/Config/Cortex-M/SEGGER_SYSVIEW_Config_FreeRTOS.c",
- "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/SEGGER_SYSVIEW_FreeRTOS.c",
- ]
- }
-
- if (use_wstk_leds) {
- sources += [
- "${efr32_sdk_root}/platform/driver/leddrv/src/sl_led.c",
- "${efr32_sdk_root}/platform/driver/leddrv/src/sl_pwm_led.c",
- "${efr32_sdk_root}/platform/driver/leddrv/src/sl_simple_led.c",
- "${efr32_sdk_root}/platform/driver/leddrv/src/sl_simple_rgb_pwm_led.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_simple_led_instances.c",
- ]
- }
-
- # SPI is only used for Wifi
- if (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) {
- sources += [
- "${efr32_sdk_root}/platform/emdrv/spidrv/src/spidrv.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_spidrv_init.c",
- ]
- }
-
- if (defined(invoker.enable_sleepy_device)) {
- if (invoker.enable_sleepy_device) {
- sources += [ "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/SiliconLabs/tick_power_manager.c" ]
- }
- }
-
- if (defined(enable_fem)) {
- sources += [
- "${efr32_sdk_root}/util/plugin/plugin-common/fem-control/fem-control.c",
- ]
- }
-
- # USART sources files
- if ((defined(invoker.chip_enable_pw_rpc) && invoker.chip_enable_pw_rpc) ||
- chip_build_libshell || enable_openthread_cli ||
- (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) ||
- (defined(invoker.show_qr_code) && invoker.show_qr_code) ||
- (defined(invoker.disable_lcd) && !invoker.disable_lcd) ||
- (defined(invoker.use_external_flash) && use_external_flash)) {
- sources += [
- "${efr32_sdk_root}/hardware/driver/memlcd/src/memlcd_usart/sl_memlcd_spi.c",
- "${efr32_sdk_root}/platform/emdrv/uartdrv/src/uartdrv.c",
- "${efr32_sdk_root}/platform/emlib/src/em_eusart.c",
- "${efr32_sdk_root}/platform/emlib/src/em_leuart.c",
- "${efr32_sdk_root}/platform/emlib/src/em_usart.c",
- "${sdk_support_root}/matter/efr32/${silabs_family}/${silabs_board}/autogen/sl_uartdrv_init.c",
- ]
-
- if (defined(invoker.use_external_flash) && use_external_flash) {
- sources += [ "${efr32_sdk_root}/hardware/driver/mx25_flash_shutdown/src/sl_mx25_flash_shutdown_usart/sl_mx25_flash_shutdown.c" ]
- }
- }
-
- if ((defined(invoker.show_qr_code) && invoker.show_qr_code) ||
- (defined(invoker.disable_lcd) && !invoker.disable_lcd)) {
- sources += [
- "${efr32_sdk_root}/hardware/driver/memlcd/src/sl_memlcd.c",
- "${efr32_sdk_root}/hardware/driver/memlcd/src/sl_memlcd_display.c",
- "${efr32_sdk_root}/platform/middleware/glib/dmd/display/dmd_memlcd.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/bmp.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_bitmap.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_circle.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_narrow_6x8.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_normal_8x8.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_font_number_16x20.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_line.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_polygon.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_rectangle.c",
- "${efr32_sdk_root}/platform/middleware/glib/glib/glib_string.c",
- ]
- }
-
- if (use_wf200) {
- sources += [
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus/sl_wfx_bus.c",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/bus/sl_wfx_bus_spi.c",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/secure_link/sl_wfx_secure_link.c",
- "${efr32_sdk_root}/platform/radio/wifi/wfx_fmac_driver/sl_wfx.c",
- ]
- }
-
- if (silabs_family == "efr32mg12") {
- sources += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Source/startup_efr32mg12p.c",
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG12P/Source/system_efr32mg12p.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dcdc_s1.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s1.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s1.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s1.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s1.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM4F/port.c",
- ]
- } else if (silabs_family == "efr32mg21") {
- sources += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Source/startup_efr32mg21.c",
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG21/Source/system_efr32mg21.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/rail_util_rf_path/sl_rail_util_rf_path.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfrco.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
- "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_alt/source/sl_se_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_gcm.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
- ]
- } else if (silabs_family == "efr32mg24") {
- sources += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Source/startup_efr32mg24.c",
- "${efr32_sdk_root}/platform/Device/SiliconLabs/EFR32MG24/Source/system_efr32mg24.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/pa_curves_efr32.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dcdc_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
- "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s2.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_attestation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
- ]
- } else if (silabs_family == "mgm24") {
- sources += [
- "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Source/startup_mgm24.c",
- "${efr32_sdk_root}/platform/Device/SiliconLabs/MGM24/Source/system_mgm24.c",
- "${efr32_sdk_root}/platform/radio/rail_lib/plugin/pa-conversions/pa_curves_efr32.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dcdc_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_emu_s2.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_hfxo_mgm24.c",
- "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_lfxo_s2.c",
- "${efr32_sdk_root}/platform/service/hfxo_manager/src/sl_hfxo_manager_hal_s2.c",
- "${efr32_sdk_root}/protocol/bluetooth/src/sl_apploader_util_s2.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_attestation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_entropy.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_key_handling.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_signature.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/se_manager/src/sl_se_manager_util.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_aes.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_mbedtls_support/src/se_jpake.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_protocol_crypto/src/sli_radioaes_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_key_management.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_opaque_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_aead.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_cipher.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_hash.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_driver_mac.c",
- "${efr32_sdk_root}/util/third_party/crypto/sl_component/sl_psa_driver/src/sli_se_transparent_key_derivation.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
- "${efr32_sdk_root}/util/third_party/freertos/kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
- ]
- }
-
- if (silabs_board == "BRD4186A" || silabs_board == "BRD4186C" ||
- silabs_board == "BRD4187A" || silabs_board == "BRD4187C") {
- sources += [ "${efr32_sdk_root}/platform/service/device_init/src/sl_device_init_dpll_s2.c" ]
- }
-
public_deps = [
- ":efr32_mbedtls_config",
+ ":si917_mbedtls_config",
"${segger_rtt_root}:segger_rtt",
"${segger_rtt_root}:segger_rtt_printf",
"${segger_rtt_root}:segger_rtt_syscalls",
diff --git a/third_party/silabs/efr32_arm.gni b/third_party/silabs/efr32_arm.gni
index e169630..68126f5 100644
--- a/third_party/silabs/efr32_arm.gni
+++ b/third_party/silabs/efr32_arm.gni
@@ -14,7 +14,7 @@
import("silabs_board.gni")
-if (silabs_family == "efr32mg12") {
+if (silabs_family == "efr32mg12" || silabs_family == "SiWx917") {
arm_arch = "armv7e-m"
arm_abi = "aapcs"
arm_cpu = "cortex-m4"
diff --git a/third_party/silabs/silabs_board.gni b/third_party/silabs/silabs_board.gni
index b5fe904..1e638c9 100644
--- a/third_party/silabs/silabs_board.gni
+++ b/third_party/silabs/silabs_board.gni
@@ -59,6 +59,9 @@
} else if (silabs_board == "BRD4170A") {
silabs_family = "efr32mg12"
silabs_mcu = "EFR32MG12P433F1024GM68"
+} else if (silabs_board == "BRD4325A") {
+ silabs_family = "SiWx917"
+ silabs_mcu = "EFR32MG12P432F1024GL125"
} else if (silabs_board == "BRD4180A") {
assert(
false,