From 679fc79d66f0f64a4a1b323c11b98fd9117d22a2 Mon Sep 17 00:00:00 2001 From: Kevin Gillespie Date: Mon, 14 Oct 2024 14:50:58 -0500 Subject: [PATCH 01/25] fix(BLE): Converting bool_t to bool (#1227) --- Examples/MAX32655/Bluetooth/BLE5_ctr/main.c | 2 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 2 +- .../MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c | 2 +- Examples/MAX32655/Bluetooth/BLE_datc/main.c | 2 +- Examples/MAX32655/Bluetooth/BLE_dats/main.c | 2 +- Examples/MAX32655/Bluetooth/BLE_fit/main.c | 2 +- .../Bluetooth/BLE_fit_FreeRTOS/bt_stack.c | 2 +- Examples/MAX32655/Bluetooth/BLE_mcs/main.c | 2 +- Examples/MAX32655/Bluetooth/BLE_otac/main.c | 2 +- Examples/MAX32655/Bluetooth/BLE_otas/main.c | 2 +- Examples/MAX32655/Bluetooth/RF_Test/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE5_ctr/main.c | 2 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 2 +- .../MAX32665/Bluetooth/BLE_LR_Central/main.c | 2 +- .../Bluetooth/BLE_LR_Peripheral/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_datc/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_dats/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_fit/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_mcs/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_otac/main.c | 2 +- Examples/MAX32665/Bluetooth/BLE_otas/main.c | 2 +- Examples/MAX32665/Bluetooth/RF_Test/main.c | 2 +- Examples/MAX32680/Bluetooth/BLE_dats/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE5_ctr/main.c | 2 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 2 +- Examples/MAX32690/Bluetooth/BLE_datc/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE_dats/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE_fit/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE_mcs/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE_otac/main.c | 2 +- Examples/MAX32690/Bluetooth/BLE_otas/main.c | 2 +- Examples/MAX32690/Bluetooth/RF_Test/main.c | 2 +- .../ble-profiles/sources/af/common/app_db.c | 50 +++++++++---------- .../controller/sources/ble/lhci/lhci_cmd_vs.c | 1 - Libraries/Cordio/platform/include/pal_types.h | 7 +-- Libraries/Cordio/wsf/include/wsf_types.h | 17 +------ 36 files changed, 63 insertions(+), 76 deletions(-) diff --git a/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c index e2b71be052..864348ee44 100644 --- a/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c @@ -76,7 +76,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.0 requirements. */ mainLlRtCfg.btVer = BT_VER; diff --git a/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c index c38bc6e9f3..be5185af20 100644 --- a/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -308,7 +308,7 @@ void bleStartup(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c b/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c index 97389b08e6..d44a212cdc 100644 --- a/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c @@ -83,7 +83,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.0 requirements. */ mainLlRtCfg.btVer = BT_VER; diff --git a/Examples/MAX32655/Bluetooth/BLE_datc/main.c b/Examples/MAX32655/Bluetooth/BLE_datc/main.c index 79d4df1076..5ffb01957b 100644 --- a/Examples/MAX32655/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_datc/main.c @@ -189,7 +189,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_dats/main.c b/Examples/MAX32655/Bluetooth/BLE_dats/main.c index 7e3cf7c7d0..bdcee7ab7c 100644 --- a/Examples/MAX32655/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_dats/main.c @@ -189,7 +189,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_fit/main.c b/Examples/MAX32655/Bluetooth/BLE_fit/main.c index d583cbf6d7..0199877ad7 100644 --- a/Examples/MAX32655/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_fit/main.c @@ -175,7 +175,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c b/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c index cd11150b38..68f0c51d05 100644 --- a/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c +++ b/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c @@ -308,7 +308,7 @@ void btStartup(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_mcs/main.c b/Examples/MAX32655/Bluetooth/BLE_mcs/main.c index a53eb4a80c..507205876e 100644 --- a/Examples/MAX32655/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_mcs/main.c @@ -163,7 +163,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_otac/main.c b/Examples/MAX32655/Bluetooth/BLE_otac/main.c index 49d7d9f620..e0b023266b 100644 --- a/Examples/MAX32655/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_otac/main.c @@ -190,7 +190,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/BLE_otas/main.c b/Examples/MAX32655/Bluetooth/BLE_otas/main.c index c4f2320eaa..01a0b4b19f 100644 --- a/Examples/MAX32655/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_otas/main.c @@ -202,7 +202,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32655/Bluetooth/RF_Test/main.c b/Examples/MAX32655/Bluetooth/RF_Test/main.c index 459bfac8ce..ad2168753c 100644 --- a/Examples/MAX32655/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32655/Bluetooth/RF_Test/main.c @@ -462,7 +462,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.1 requirements. */ mainLlRtCfg.btVer = LL_VER_BT_CORE_SPEC_5_0; diff --git a/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c index 62ff05a1c5..0d9f01d126 100644 --- a/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c @@ -76,7 +76,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.0 requirements. */ mainLlRtCfg.btVer = BT_VER; diff --git a/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c index 4c4a35eb7d..c262788bb8 100644 --- a/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -341,7 +341,7 @@ void bleStartup(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_LR_Central/main.c b/Examples/MAX32665/Bluetooth/BLE_LR_Central/main.c index e18016b653..93dbda8a12 100644 --- a/Examples/MAX32665/Bluetooth/BLE_LR_Central/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_LR_Central/main.c @@ -208,7 +208,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_LR_Peripheral/main.c b/Examples/MAX32665/Bluetooth/BLE_LR_Peripheral/main.c index d6bceb705f..4f86e3bc23 100644 --- a/Examples/MAX32665/Bluetooth/BLE_LR_Peripheral/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_LR_Peripheral/main.c @@ -207,7 +207,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_datc/main.c b/Examples/MAX32665/Bluetooth/BLE_datc/main.c index f0700a0201..26c3b1cb10 100644 --- a/Examples/MAX32665/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_datc/main.c @@ -206,7 +206,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_dats/main.c b/Examples/MAX32665/Bluetooth/BLE_dats/main.c index bdd2cbd8b0..f6792f04e0 100644 --- a/Examples/MAX32665/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_dats/main.c @@ -207,7 +207,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_fit/main.c b/Examples/MAX32665/Bluetooth/BLE_fit/main.c index 6650ab98da..308f7221b1 100644 --- a/Examples/MAX32665/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_fit/main.c @@ -206,7 +206,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_mcs/main.c b/Examples/MAX32665/Bluetooth/BLE_mcs/main.c index f8efc50674..1b2b9d9278 100644 --- a/Examples/MAX32665/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_mcs/main.c @@ -181,7 +181,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_otac/main.c b/Examples/MAX32665/Bluetooth/BLE_otac/main.c index dfeed8d335..6ba17c14f4 100644 --- a/Examples/MAX32665/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_otac/main.c @@ -207,7 +207,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/BLE_otas/main.c b/Examples/MAX32665/Bluetooth/BLE_otas/main.c index 6bd44b2495..618d2c35a3 100644 --- a/Examples/MAX32665/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_otas/main.c @@ -207,7 +207,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32665/Bluetooth/RF_Test/main.c b/Examples/MAX32665/Bluetooth/RF_Test/main.c index 1a01be00a7..4abcaee86c 100644 --- a/Examples/MAX32665/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32665/Bluetooth/RF_Test/main.c @@ -465,7 +465,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.1 requirements. */ mainLlRtCfg.btVer = LL_VER_BT_CORE_SPEC_5_0; diff --git a/Examples/MAX32680/Bluetooth/BLE_dats/main.c b/Examples/MAX32680/Bluetooth/BLE_dats/main.c index bc2d873520..226ae80574 100644 --- a/Examples/MAX32680/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32680/Bluetooth/BLE_dats/main.c @@ -200,7 +200,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c index f4b076f5f2..848d21f777 100644 --- a/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c @@ -76,7 +76,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.0 requirements. */ mainLlRtCfg.btVer = BT_VER; diff --git a/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c index 9ff548426e..700c2dde6c 100644 --- a/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -308,7 +308,7 @@ void bleStartup(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_datc/main.c b/Examples/MAX32690/Bluetooth/BLE_datc/main.c index 060c2a2a01..ed1ca5eb37 100644 --- a/Examples/MAX32690/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_datc/main.c @@ -189,7 +189,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_dats/main.c b/Examples/MAX32690/Bluetooth/BLE_dats/main.c index f9d854e8c1..f7430274b7 100644 --- a/Examples/MAX32690/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_dats/main.c @@ -189,7 +189,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_fit/main.c b/Examples/MAX32690/Bluetooth/BLE_fit/main.c index 80196c3a17..f43129c09b 100644 --- a/Examples/MAX32690/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_fit/main.c @@ -189,7 +189,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_mcs/main.c b/Examples/MAX32690/Bluetooth/BLE_mcs/main.c index a53eb4a80c..507205876e 100644 --- a/Examples/MAX32690/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_mcs/main.c @@ -163,7 +163,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_otac/main.c b/Examples/MAX32690/Bluetooth/BLE_otac/main.c index 13feaae0cf..cfc16e2cbf 100644 --- a/Examples/MAX32690/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_otac/main.c @@ -190,7 +190,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/BLE_otas/main.c b/Examples/MAX32690/Bluetooth/BLE_otas/main.c index e329d43fcd..0a9e752ec2 100644 --- a/Examples/MAX32690/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_otas/main.c @@ -190,7 +190,7 @@ int main(void) #endif PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); #if (BT_VER >= LL_VER_BT_CORE_SPEC_5_0) - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); #endif /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 diff --git a/Examples/MAX32690/Bluetooth/RF_Test/main.c b/Examples/MAX32690/Bluetooth/RF_Test/main.c index 1a01be00a7..4abcaee86c 100644 --- a/Examples/MAX32690/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32690/Bluetooth/RF_Test/main.c @@ -465,7 +465,7 @@ static void mainLoadConfiguration(void) PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); LlGetDefaultRunTimeCfg(&mainLlRtCfg); PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); - PalCfgLoadData(PAL_CFG_ID_BLE_PHY, &mainLlRtCfg.phy2mSup, 4); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); /* Set 5.1 requirements. */ mainLlRtCfg.btVer = LL_VER_BT_CORE_SPEC_5_0; diff --git a/Libraries/Cordio/ble-profiles/sources/af/common/app_db.c b/Libraries/Cordio/ble-profiles/sources/af/common/app_db.c index d954e1bceb..9b8322223a 100644 --- a/Libraries/Cordio/ble-profiles/sources/af/common/app_db.c +++ b/Libraries/Cordio/ble-profiles/sources/af/common/app_db.c @@ -962,7 +962,7 @@ bool_t AppDbNvmStorePeerRpao(appDbHdl_t hdl) appDbRec_t *pRec = &appDb.rec[recIndex]; uint32_t nvmId = DBNV_ID(APP_DB_NVM_PEER_RAPO_ID, recIndex); - return WsfNvmWriteData(nvmId, &pRec->peerRpao, sizeof(bool_t), NULL); + return WsfNvmWriteData(nvmId, (uint8_t*) &pRec->peerRpao, sizeof(bool_t), NULL); }else { APP_TRACE_INFO0("Invalid record index!"); @@ -1021,7 +1021,7 @@ bool_t AppDbNvmStoreHdlList(appDbHdl_t hdl) nvmId = DBNV_ID(APP_DB_NVM_DISC_STATUS_ID, recIndex); - return WsfNvmWriteData(nvmId, &pRec->discStatus, sizeof(uint8_t), NULL); + return WsfNvmWriteData(nvmId, (uint8_t*) &pRec->discStatus, sizeof(uint8_t), NULL); }else { APP_TRACE_INFO0("Invalid record index!"); @@ -1181,7 +1181,7 @@ bool_t AppDbNvmStoreDbHash(appDbHdl_t hdl) appDbRec_t *pRec = &appDb.rec[recIndex]; uint32_t nvmId = DBNV_ID(APP_DB_NVM_HASH_ID, recIndex); - return WsfNvmWriteData(nvmId, pRec->dbHash, ATT_DATABASE_HASH_LEN, NULL); + return WsfNvmWriteData(nvmId, (uint8_t*) pRec->dbHash, ATT_DATABASE_HASH_LEN, NULL); } else { @@ -1213,7 +1213,7 @@ bool_t AppDbNvmStoreBond(appDbHdl_t hdl) /* Protect against corrupt bond state due to incomplete writes (power failure, crash, etc.). */ /* - First ensure valid FALSE before writing parameters. */ - bool_t writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_VALID_ID, i), &valid, sizeof(bool_t), NULL); + bool_t writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_VALID_ID, i), (uint8_t*) &valid, sizeof(bool_t), NULL); if(!writeOk){ return FALSE; @@ -1221,7 +1221,7 @@ bool_t AppDbNvmStoreBond(appDbHdl_t hdl) /* Write record parameters. */ - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_KV_MASK_ID, i), &pRec->keyValidMask, sizeof(uint8_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_KV_MASK_ID, i), (uint8_t*) &pRec->keyValidMask, sizeof(uint8_t), NULL); if(!writeOk){ return FALSE; } @@ -1232,7 +1232,7 @@ bool_t AppDbNvmStoreBond(appDbHdl_t hdl) if(!writeOk){ return FALSE; } - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_LOCAL_SEC_LVL_ID, i), &pRec->localLtkSecLevel, sizeof(uint8_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_LOCAL_SEC_LVL_ID, i), (uint8_t*) &pRec->localLtkSecLevel, sizeof(uint8_t), NULL); if(!writeOk){ return FALSE; } @@ -1244,7 +1244,7 @@ bool_t AppDbNvmStoreBond(appDbHdl_t hdl) if(!writeOk){ return FALSE; } - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_PEER_SEC_LVL_ID, i), &pRec->peerLtkSecLevel, sizeof(uint8_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_PEER_SEC_LVL_ID, i), (uint8_t*) &pRec->peerLtkSecLevel, sizeof(uint8_t), NULL); if(!writeOk){ return FALSE; } @@ -1266,21 +1266,21 @@ bool_t AppDbNvmStoreBond(appDbHdl_t hdl) } } - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_PEER_ADDR_ID, i), pRec->peerAddr, sizeof(bdAddr_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_PEER_ADDR_ID, i), (uint8_t*) pRec->peerAddr, sizeof(bdAddr_t), NULL); if(!writeOk){ return FALSE; } - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_ADDR_TYPE_ID, i), &pRec->addrType, sizeof(uint8_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_ADDR_TYPE_ID, i), (uint8_t*) &pRec->addrType, sizeof(uint8_t), NULL); if(!writeOk){ return FALSE; } - writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_CACHE_HASH_ID, i), &pRec->cacheByHash, sizeof(bool_t), NULL); + writeOk = WsfNvmWriteData(DBNV_ID(APP_DB_NVM_CACHE_HASH_ID, i), (uint8_t*) &pRec->cacheByHash, sizeof(bool_t), NULL); if(!writeOk){ return FALSE; } /* Protect against corrupt bond state due to incomplete writes (power failure, crash, etc.). */ /* - Second set valid TRUE after writing parameters. */ - return WsfNvmWriteData(DBNV_ID(APP_DB_NVM_VALID_ID, i), &pRec->valid, sizeof(bool_t), NULL); + return WsfNvmWriteData(DBNV_ID(APP_DB_NVM_VALID_ID, i), (uint8_t*) &pRec->valid, sizeof(bool_t), NULL); } return TRUE; @@ -1306,11 +1306,11 @@ void AppDbNvmReadAll(void) /* Read all records. */ for (i = 0; i < APP_DB_NUM_RECS; i++) { - bool_t valid = FALSE; + uint8_t valid = 0; appDbRec_t *pRec = &appDb.rec[i]; /* Verify record is valid. */ - WsfNvmReadData(DBNV_ID(APP_DB_NVM_VALID_ID, i), &valid, sizeof(bool_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_VALID_ID, i), (uint8_t*) &valid, sizeof(bool_t), NULL); if (valid && valid != 0xFF) { @@ -1318,21 +1318,21 @@ void AppDbNvmReadAll(void) pRec->valid = TRUE; /* Read bonding parameters. */ - WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_ADDR_ID, i), pRec->peerAddr, sizeof(bdAddr_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_ADDR_TYPE_ID, i), &pRec->addrType, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_ADDR_ID, i), (uint8_t*) pRec->peerAddr, sizeof(bdAddr_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_ADDR_TYPE_ID, i), (uint8_t*) &pRec->addrType, sizeof(uint8_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_KV_MASK_ID, i), &pRec->keyValidMask, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_KV_MASK_ID, i), (uint8_t*) &pRec->keyValidMask, sizeof(uint8_t), NULL); if (pRec->keyValidMask & DM_KEY_LOCAL_LTK) { WsfNvmReadData(DBNV_ID(APP_DB_NVM_LOCAL_LTK_ID, i), (uint8_t*) &pRec->localLtk, sizeof(dmSecLtk_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_LOCAL_SEC_LVL_ID, i), &pRec->localLtkSecLevel, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_LOCAL_SEC_LVL_ID, i), (uint8_t*) &pRec->localLtkSecLevel, sizeof(uint8_t), NULL); } if (pRec->keyValidMask & DM_KEY_PEER_LTK) { WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_LTK_ID, i), (uint8_t*) &pRec->peerLtk, sizeof(dmSecLtk_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_SEC_LVL_ID, i), &pRec->peerLtkSecLevel, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_SEC_LVL_ID, i), (uint8_t*) &pRec->peerLtkSecLevel, sizeof(uint8_t), NULL); } if (pRec->keyValidMask & DM_KEY_IRK) @@ -1346,17 +1346,17 @@ void AppDbNvmReadAll(void) } /* Read additional parameters. */ - WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_RAPO_ID, i), &pRec->peerRpao, sizeof(bool_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_RAPO_ID, i), (uint8_t*) &pRec->peerRpao, sizeof(bool_t), NULL); WsfNvmReadData(DBNV_ID(APP_DB_NVM_CCC_TBL_ID, i), (uint8_t*) pRec->cccTbl, sizeof(uint16_t) * APP_DB_NUM_CCCD, NULL); WsfNvmReadData(DBNV_ID(APP_DB_NVM_HDL_LIST_ID, i), (uint8_t*) &pRec->hdlList, sizeof(uint16_t) * APP_DB_HDL_LIST_LEN, NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_DISC_STATUS_ID, i), &pRec->discStatus, sizeof(uint8_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_ADDR_RES_ID, i), &pRec->peerAddrRes, sizeof(bool_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_DISC_STATUS_ID, i), (uint8_t*) &pRec->discStatus, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_PEER_ADDR_RES_ID, i), (uint8_t*) &pRec->peerAddrRes, sizeof(bool_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_CAS_ID, i), &pRec->changeAwareState, sizeof(uint8_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_CSF_ID, i), pRec->csf, ATT_CSF_LEN, NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_CACHE_HASH_ID, i), &pRec->cacheByHash, sizeof(bool_t), NULL); - WsfNvmReadData(DBNV_ID(APP_DB_NVM_HASH_ID, i), pRec->dbHash, ATT_DATABASE_HASH_LEN, NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_CAS_ID, i), (uint8_t*) &pRec->changeAwareState, sizeof(uint8_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_CSF_ID, i), (uint8_t*) pRec->csf, ATT_CSF_LEN, NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_CACHE_HASH_ID, i), (uint8_t*) &pRec->cacheByHash, sizeof(bool_t), NULL); + WsfNvmReadData(DBNV_ID(APP_DB_NVM_HASH_ID, i), (uint8_t*) pRec->dbHash, ATT_DATABASE_HASH_LEN, NULL); } } } diff --git a/Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c b/Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c index 8c4d4027b7..6e03636252 100644 --- a/Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c +++ b/Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c @@ -94,7 +94,6 @@ bool_t lhciCommonVsStdDecodeCmdPkt(LhciHdr_t *pHdr, uint8_t *pBuf) { uint8_t status = HCI_SUCCESS; uint8_t evtParamLen = 1; /* default is status field only */ - uint32_t regReadAddr = 0; uint32_t channel = 0; (void)channel; diff --git a/Libraries/Cordio/platform/include/pal_types.h b/Libraries/Cordio/platform/include/pal_types.h index 7b876eaeb4..eaef2967a9 100644 --- a/Libraries/Cordio/platform/include/pal_types.h +++ b/Libraries/Cordio/platform/include/pal_types.h @@ -42,17 +42,18 @@ extern "C" { #include #include +#include #ifndef bool_t - #define bool_t uint8_t +#define bool_t bool #endif #ifndef FALSE - #define FALSE 0 +#define FALSE false #endif #ifndef TRUE - #define TRUE (!FALSE) +#define TRUE true #endif /*! \} */ /* Integer Data Types */ diff --git a/Libraries/Cordio/wsf/include/wsf_types.h b/Libraries/Cordio/wsf/include/wsf_types.h index 73a5ead76c..abc363fb4c 100644 --- a/Libraries/Cordio/wsf/include/wsf_types.h +++ b/Libraries/Cordio/wsf/include/wsf_types.h @@ -42,21 +42,8 @@ extern "C" { #include #include - -#ifndef bool_t - #define bool_t uint8_t -#endif - -/* New library uses bool instead of bool_t */ -#define bool _Bool - -#ifndef FALSE - #define FALSE 0 -#endif - -#ifndef TRUE - #define TRUE (!FALSE) -#endif +#include +#include "pal_types.h" /*! \} */ /* Integer Data Types */ From b0219d334e8b8ab3250885a7438975513cafa94d Mon Sep 17 00:00:00 2001 From: Kevin Gillespie Date: Tue, 15 Oct 2024 10:21:52 -0500 Subject: [PATCH 02/25] feat(CMSIS): Adding mallinfo function and reworking Cordio memory management. (#1179) Co-authored-by: crsz20 Co-authored-by: crsz20 --- .github/workflows/clang-format-run-pr.yml | 3 + Examples/MAX32655/Bluetooth/BLE4_ctr/main.c | 72 +- Examples/MAX32655/Bluetooth/BLE5_ctr/main.c | 72 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 55 +- .../MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c | 78 +- Examples/MAX32655/Bluetooth/BLE_datc/main.c | 57 +- Examples/MAX32655/Bluetooth/BLE_dats/main.c | 56 +- Examples/MAX32655/Bluetooth/BLE_fit/main.c | 57 +- .../Bluetooth/BLE_fit_FreeRTOS/bt_stack.c | 54 +- Examples/MAX32655/Bluetooth/BLE_mcs/main.c | 57 +- Examples/MAX32655/Bluetooth/BLE_otac/main.c | 57 +- Examples/MAX32655/Bluetooth/BLE_otas/main.c | 57 +- Examples/MAX32655/Bluetooth/BLE_periph/main.c | 57 +- Examples/MAX32655/Bluetooth/RF_Test/main.c | 53 +- Examples/MAX32655/Bluetooth/RF_Test/main.h | 1 + Examples/MAX32665/Bluetooth/BLE4_ctr/main.c | 72 +- Examples/MAX32665/Bluetooth/BLE5_ctr/main.c | 72 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 55 +- Examples/MAX32665/Bluetooth/BLE_datc/main.c | 57 +- Examples/MAX32665/Bluetooth/BLE_dats/main.c | 56 +- Examples/MAX32665/Bluetooth/BLE_fit/main.c | 59 +- Examples/MAX32665/Bluetooth/BLE_mcs/main.c | 57 +- Examples/MAX32665/Bluetooth/BLE_otac/main.c | 57 +- Examples/MAX32665/Bluetooth/BLE_otas/main.c | 68 +- Examples/MAX32665/Bluetooth/BLE_periph/main.c | 57 +- Examples/MAX32665/Bluetooth/RF_Test/main.c | 59 +- Examples/MAX32665/Bluetooth/RF_Test/main.h | 1 + Examples/MAX32690/Bluetooth/BLE4_ctr/main.c | 72 +- Examples/MAX32690/Bluetooth/BLE5_ctr/main.c | 72 +- .../Bluetooth/BLE_FreeRTOS/stack_dats.c | 55 +- Examples/MAX32690/Bluetooth/BLE_datc/main.c | 57 +- Examples/MAX32690/Bluetooth/BLE_dats/main.c | 56 +- Examples/MAX32690/Bluetooth/BLE_fit/main.c | 57 +- Examples/MAX32690/Bluetooth/BLE_mcs/main.c | 57 +- Examples/MAX32690/Bluetooth/BLE_otac/main.c | 57 +- Examples/MAX32690/Bluetooth/BLE_otas/main.c | 68 +- Examples/MAX32690/Bluetooth/BLE_periph/main.c | 57 +- Examples/MAX32690/Bluetooth/RF_Test/main.c | 58 +- Examples/MAX32690/Bluetooth/RF_Test/main.h | 1 + .../DSP/1.16.2/Include/arm_common_tables.h | 332 ++- .../1.16.2/Include/arm_common_tables_f16.h | 61 +- .../DSP/1.16.2/Include/arm_const_structs.h | 80 +- .../1.16.2/Include/arm_const_structs_f16.h | 25 +- .../DSP/1.16.2/Include/arm_helium_utils.h | 356 ++- .../CMSIS/5.9.0/DSP/1.16.2/Include/arm_math.h | 21 +- .../5.9.0/DSP/1.16.2/Include/arm_math_f16.h | 9 +- .../DSP/1.16.2/Include/arm_math_memory.h | 123 +- .../5.9.0/DSP/1.16.2/Include/arm_math_types.h | 640 +++-- .../DSP/1.16.2/Include/arm_math_types_f16.h | 95 +- .../5.9.0/DSP/1.16.2/Include/arm_mve_tables.h | 47 +- .../DSP/1.16.2/Include/arm_mve_tables_f16.h | 25 +- .../5.9.0/DSP/1.16.2/Include/arm_vec_math.h | 147 +- .../DSP/1.16.2/Include/arm_vec_math_f16.h | 124 +- .../1.16.2/Include/dsp/basic_math_functions.h | 525 +--- .../Include/dsp/basic_math_functions_f16.h | 85 +- .../DSP/1.16.2/Include/dsp/bayes_functions.h | 31 +- .../1.16.2/Include/dsp/bayes_functions_f16.h | 30 +- .../Include/dsp/complex_math_functions.h | 200 +- .../Include/dsp/complex_math_functions_f16.h | 57 +- .../1.16.2/Include/dsp/controller_functions.h | 385 ++- .../Include/dsp/controller_functions_f16.h | 8 +- .../5.9.0/DSP/1.16.2/Include/dsp/debug.h | 185 +- .../1.16.2/Include/dsp/distance_functions.h | 73 +- .../Include/dsp/distance_functions_f16.h | 40 +- .../1.16.2/Include/dsp/fast_math_functions.h | 221 +- .../Include/dsp/fast_math_functions_f16.h | 48 +- .../1.16.2/Include/dsp/filtering_functions.h | 2119 ++++++----------- .../Include/dsp/filtering_functions_f16.h | 190 +- .../Include/dsp/interpolation_functions.h | 187 +- .../Include/dsp/interpolation_functions_f16.h | 47 +- .../DSP/1.16.2/Include/dsp/matrix_functions.h | 496 ++-- .../1.16.2/Include/dsp/matrix_functions_f16.h | 150 +- .../DSP/1.16.2/Include/dsp/matrix_utils.h | 1095 ++++----- .../CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h | 577 ++--- .../Include/dsp/quaternion_math_functions.h | 58 +- .../1.16.2/Include/dsp/statistics_functions.h | 540 ++--- .../Include/dsp/statistics_functions_f16.h | 129 +- .../1.16.2/Include/dsp/support_functions.h | 341 +-- .../Include/dsp/support_functions_f16.h | 64 +- .../DSP/1.16.2/Include/dsp/svm_defines.h | 12 +- .../DSP/1.16.2/Include/dsp/svm_functions.h | 176 +- .../1.16.2/Include/dsp/svm_functions_f16.h | 169 +- .../1.16.2/Include/dsp/transform_functions.h | 1543 +++++------- .../Include/dsp/transform_functions_f16.h | 388 ++- .../5.9.0/DSP/1.16.2/Include/dsp/utils.h | 145 +- .../DSP/1.16.2/Include/dsp/window_functions.h | 250 +- .../CMSIS/Device/Maxim/MAX32655/Source/heap.c | 77 + .../CMSIS/Device/Maxim/MAX32665/Source/heap.c | 77 + .../CMSIS/Device/Maxim/MAX32690/Source/heap.c | 77 + .../controller/include/ble/ll_init_api.h | 2 + .../Cordio/controller/sources/ble/init/init.c | 31 +- .../controller/sources/ble/ll/ll_init.c | 1 - .../controller/sources/common/bb/bb_main.c | 1 - .../wsf/sources/targets/baremetal/wsf_heap.c | 57 +- 94 files changed, 6621 insertions(+), 8474 deletions(-) mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_helium_utils.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_memory.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_utils.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/quaternion_math_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_defines.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions_f16.h mode change 100755 => 100644 Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/utils.h diff --git a/.github/workflows/clang-format-run-pr.yml b/.github/workflows/clang-format-run-pr.yml index 4fd90a8b95..a11fd26161 100644 --- a/.github/workflows/clang-format-run-pr.yml +++ b/.github/workflows/clang-format-run-pr.yml @@ -25,6 +25,9 @@ on: issue_comment: types: [created] +permissions: + actions: write + env: CLANG_VERSION: 14 diff --git a/Examples/MAX32655/Bluetooth/BLE4_ctr/main.c b/Examples/MAX32655/Bluetooth/BLE4_ctr/main.c index d477d982d9..fc810e0a92 100644 --- a/Examples/MAX32655/Bluetooth/BLE4_ctr/main.c +++ b/Examples/MAX32655/Bluetooth/BLE4_ctr/main.c @@ -95,6 +95,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, +4 for header. */ const uint16_t aclBufSize = 12 + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; @@ -105,24 +109,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -164,31 +205,8 @@ static bool mainCheckServiceTokens(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c index 864348ee44..81531901b4 100644 --- a/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32655/Bluetooth/BLE5_ctr/main.c @@ -111,6 +111,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ const uint16_t maxRptBufSize = 12 + 2 + 255; @@ -137,24 +141,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -249,31 +290,8 @@ void setInterruptPriority(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c index be5185af20..8ed942f5e8 100644 --- a/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32655/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -174,9 +174,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -327,27 +329,52 @@ void bleStartup(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c b/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c index d44a212cdc..ed7b6082ce 100644 --- a/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_HCI_DFU/BLT/main.c @@ -118,6 +118,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ const uint16_t maxRptBufSize = 12 + 2 + 255; @@ -126,8 +130,8 @@ static void mainWsfInit(void) 12 + HCI_ISO_DL_MAX_LEN + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; /* Use single pool for data buffers. */ -#if (BT_VER > 9) - WSF_ASSERT(mainLlRtCfg.maxAclLen == mainLlRtCfg.maxIsoSduLen); +#if (BT_VER > 9) && INIT_FEAT_ISO + mainLlRtCfg.maxIsoSduLen = mainLlRtCfg.maxAclLen; #endif /* Ensure pool buffers are ordered correctly. */ @@ -144,24 +148,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -171,7 +212,7 @@ static void mainWsfInit(void) * \return TRUE if there is token pending. */ /*************************************************************************************************/ -static bool_t mainCheckServiceTokens(void) +static bool mainCheckServiceTokens(void) { bool_t eventPending = FALSE; @@ -256,31 +297,8 @@ void setInterruptPriority(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32655/Bluetooth/BLE_datc/main.c b/Examples/MAX32655/Bluetooth/BLE_datc/main.c index 5ffb01957b..aa049c6338 100644 --- a/Examples/MAX32655/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_datc/main.c @@ -115,9 +115,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -213,27 +215,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_dats/main.c b/Examples/MAX32655/Bluetooth/BLE_dats/main.c index bdcee7ab7c..a24d680d66 100644 --- a/Examples/MAX32655/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_dats/main.c @@ -115,9 +115,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -208,10 +210,9 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); @@ -219,17 +220,44 @@ int main(void) #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_fit/main.c b/Examples/MAX32655/Bluetooth/BLE_fit/main.c index 0199877ad7..9996709c99 100644 --- a/Examples/MAX32655/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_fit/main.c @@ -115,9 +115,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -194,27 +196,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c b/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c index 68f0c51d05..780c4526af 100644 --- a/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c +++ b/Examples/MAX32655/Bluetooth/BLE_fit_FreeRTOS/bt_stack.c @@ -172,9 +172,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -327,10 +329,10 @@ void btStartup(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; + uint32_t llmemUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); @@ -338,17 +340,41 @@ void btStartup(void) AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_mcs/main.c b/Examples/MAX32655/Bluetooth/BLE_mcs/main.c index 507205876e..40b8e20539 100644 --- a/Examples/MAX32655/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_mcs/main.c @@ -111,9 +111,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -182,27 +184,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_otac/main.c b/Examples/MAX32655/Bluetooth/BLE_otac/main.c index e0b023266b..9f8799226c 100644 --- a/Examples/MAX32655/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_otac/main.c @@ -116,9 +116,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -209,27 +211,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_otas/main.c b/Examples/MAX32655/Bluetooth/BLE_otas/main.c index 01a0b4b19f..5dbbb6ae70 100644 --- a/Examples/MAX32655/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_otas/main.c @@ -116,19 +116,20 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); - #if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); @@ -188,8 +189,6 @@ void setAdvTxPower(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) /* Configurations must be persistent. */ static BbRtCfg_t mainBbRtCfg; @@ -224,17 +223,45 @@ int main(void) mainWsfInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32655/Bluetooth/BLE_periph/main.c b/Examples/MAX32655/Bluetooth/BLE_periph/main.c index d4b86f7c40..60d68cd354 100644 --- a/Examples/MAX32655/Bluetooth/BLE_periph/main.c +++ b/Examples/MAX32655/Bluetooth/BLE_periph/main.c @@ -131,8 +131,8 @@ static void mainWsfInit(void) uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) @@ -151,32 +151,50 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); -#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) - WsfTraceRegisterHandler(WsfBufIoWrite); - WsfTraceEnable(TRUE); -#endif AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; @@ -184,6 +202,11 @@ static void mainWsfInit(void) LlSetBdAddr((uint8_t *)&bdAddr); #endif +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceRegisterHandler(WsfBufIoWrite); + WsfTraceEnable(TRUE); +#endif + StackInitPeriph(); PeriphStart(); diff --git a/Examples/MAX32655/Bluetooth/RF_Test/main.c b/Examples/MAX32655/Bluetooth/RF_Test/main.c index ad2168753c..e4387d401e 100644 --- a/Examples/MAX32655/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32655/Bluetooth/RF_Test/main.c @@ -514,8 +514,13 @@ static void mainWsfInit(void) /* Initial buffer configuration. */ uint16_t memUsed; - memUsed = WsfBufInit(numPools, poolDesc); + /* Initial buffer configuration. */ + WsfCsEnter(); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); + WsfCsExit(); + WsfOsInit(); WsfTimerInit(); #if (WSF_TRACE_ENABLED == TRUE) @@ -857,26 +862,48 @@ void printConfigs(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; + uint32_t llmemUsed; mainLoadConfiguration(); mainWsfInit(); #if (WSF_TRACE_ENABLED == TRUE) - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); #endif - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); diff --git a/Examples/MAX32655/Bluetooth/RF_Test/main.h b/Examples/MAX32655/Bluetooth/RF_Test/main.h index ba8486b1f0..a082659f7e 100644 --- a/Examples/MAX32655/Bluetooth/RF_Test/main.h +++ b/Examples/MAX32655/Bluetooth/RF_Test/main.h @@ -41,6 +41,7 @@ #include "wsf_timer.h" #include "wsf_trace.h" #include "wsf_bufio.h" +#include "wsf_cs.h" #include "bb_ble_sniffer_api.h" #include "pal_bb.h" #include "pal_cfg.h" diff --git a/Examples/MAX32665/Bluetooth/BLE4_ctr/main.c b/Examples/MAX32665/Bluetooth/BLE4_ctr/main.c index d477d982d9..fc810e0a92 100644 --- a/Examples/MAX32665/Bluetooth/BLE4_ctr/main.c +++ b/Examples/MAX32665/Bluetooth/BLE4_ctr/main.c @@ -95,6 +95,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, +4 for header. */ const uint16_t aclBufSize = 12 + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; @@ -105,24 +109,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -164,31 +205,8 @@ static bool mainCheckServiceTokens(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c index 0d9f01d126..e589abe620 100644 --- a/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32665/Bluetooth/BLE5_ctr/main.c @@ -111,6 +111,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ const uint16_t maxRptBufSize = 12 + 2 + 255; @@ -137,24 +141,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -267,31 +308,8 @@ void setInterruptPriority(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c index c262788bb8..3b057e84f4 100644 --- a/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32665/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -176,9 +176,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -360,27 +362,52 @@ void bleStartup(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_datc/main.c b/Examples/MAX32665/Bluetooth/BLE_datc/main.c index 26c3b1cb10..bf6fba9931 100644 --- a/Examples/MAX32665/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_datc/main.c @@ -117,9 +117,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -230,27 +232,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_dats/main.c b/Examples/MAX32665/Bluetooth/BLE_dats/main.c index f6792f04e0..4984dbb9a8 100644 --- a/Examples/MAX32665/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_dats/main.c @@ -117,9 +117,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -226,10 +228,9 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); @@ -237,17 +238,44 @@ int main(void) #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_fit/main.c b/Examples/MAX32665/Bluetooth/BLE_fit/main.c index 308f7221b1..533f4eccca 100644 --- a/Examples/MAX32665/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_fit/main.c @@ -12,7 +12,7 @@ * 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 @@ -117,9 +117,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -225,27 +227,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_mcs/main.c b/Examples/MAX32665/Bluetooth/BLE_mcs/main.c index 1b2b9d9278..38769312c5 100644 --- a/Examples/MAX32665/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_mcs/main.c @@ -114,9 +114,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -200,27 +202,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_otac/main.c b/Examples/MAX32665/Bluetooth/BLE_otac/main.c index 6ba17c14f4..f61d84ded0 100644 --- a/Examples/MAX32665/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_otac/main.c @@ -118,9 +118,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -226,27 +228,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_otas/main.c b/Examples/MAX32665/Bluetooth/BLE_otas/main.c index 618d2c35a3..9056ea9a83 100644 --- a/Examples/MAX32665/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_otas/main.c @@ -118,16 +118,27 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); #if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); + WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); + + AppTerminalInit(); + #endif } @@ -226,27 +237,48 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); - mainWsfInit(); - AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32665/Bluetooth/BLE_periph/main.c b/Examples/MAX32665/Bluetooth/BLE_periph/main.c index d4b86f7c40..60d68cd354 100644 --- a/Examples/MAX32665/Bluetooth/BLE_periph/main.c +++ b/Examples/MAX32665/Bluetooth/BLE_periph/main.c @@ -131,8 +131,8 @@ static void mainWsfInit(void) uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) @@ -151,32 +151,50 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); -#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) - WsfTraceRegisterHandler(WsfBufIoWrite); - WsfTraceEnable(TRUE); -#endif AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; @@ -184,6 +202,11 @@ static void mainWsfInit(void) LlSetBdAddr((uint8_t *)&bdAddr); #endif +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceRegisterHandler(WsfBufIoWrite); + WsfTraceEnable(TRUE); +#endif + StackInitPeriph(); PeriphStart(); diff --git a/Examples/MAX32665/Bluetooth/RF_Test/main.c b/Examples/MAX32665/Bluetooth/RF_Test/main.c index 4abcaee86c..1659783e48 100644 --- a/Examples/MAX32665/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32665/Bluetooth/RF_Test/main.c @@ -496,10 +496,11 @@ static void mainWsfInit(void) const uint16_t dataBufSize = 12 + HCI_ISO_DL_MAX_LEN + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; -/* Use single pool for data buffers. */ + /* Use single pool for data buffers. */ #if (BT_VER > 9) WSF_ASSERT(mainLlRtCfg.maxAclLen == mainLlRtCfg.maxIsoSduLen); #endif + /* Ensure pool buffers are ordered correctly. */ WSF_ASSERT(maxRptBufSize < dataBufSize); @@ -516,8 +517,13 @@ static void mainWsfInit(void) /* Initial buffer configuration. */ uint16_t memUsed; - memUsed = WsfBufInit(numPools, poolDesc); + /* Initial buffer configuration. */ + WsfCsEnter(); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); + WsfCsExit(); + WsfOsInit(); WsfTimerInit(); #if (WSF_TRACE_ENABLED == TRUE) @@ -645,11 +651,11 @@ void vCmdLineTask(void *pvParameters) } } while (xMore != pdFALSE); } - /* New prompt */ bufferIndex = 0; memset(inputBuffer, 0x00, 100); prompt(); + } else if (bufferIndex < CMD_LINE_BUF_SIZE) { putchar(tmp); inputBuffer[bufferIndex++] = tmp; @@ -660,6 +666,7 @@ void vCmdLineTask(void *pvParameters) putchar(0x07); fflush(stdout); } + uartReadLen = 1; /* If more characters are ready, process them here */ } while ((MXC_UART_GetRXFIFOAvailable(MXC_UART_GET_UART(CONSOLE_UART)) > 0) && @@ -857,26 +864,48 @@ void printConfigs(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; + uint32_t llmemUsed; mainLoadConfiguration(); mainWsfInit(); #if (WSF_TRACE_ENABLED == TRUE) - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); #endif - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); diff --git a/Examples/MAX32665/Bluetooth/RF_Test/main.h b/Examples/MAX32665/Bluetooth/RF_Test/main.h index 7b2d776b00..71f4466304 100644 --- a/Examples/MAX32665/Bluetooth/RF_Test/main.h +++ b/Examples/MAX32665/Bluetooth/RF_Test/main.h @@ -41,6 +41,7 @@ #include "wsf_timer.h" #include "wsf_trace.h" #include "wsf_bufio.h" +#include "wsf_cs.h" #include "bb_ble_sniffer_api.h" #include "pal_bb.h" #include "pal_cfg.h" diff --git a/Examples/MAX32690/Bluetooth/BLE4_ctr/main.c b/Examples/MAX32690/Bluetooth/BLE4_ctr/main.c index d477d982d9..fc810e0a92 100644 --- a/Examples/MAX32690/Bluetooth/BLE4_ctr/main.c +++ b/Examples/MAX32690/Bluetooth/BLE4_ctr/main.c @@ -95,6 +95,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, +4 for header. */ const uint16_t aclBufSize = 12 + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; @@ -105,24 +109,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -164,31 +205,8 @@ static bool mainCheckServiceTokens(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c index 848d21f777..f7fcfa370c 100644 --- a/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c +++ b/Examples/MAX32690/Bluetooth/BLE5_ctr/main.c @@ -111,6 +111,10 @@ static void mainLoadConfiguration(void) /*************************************************************************************************/ static void mainWsfInit(void) { + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ const uint16_t maxRptBufSize = 12 + 2 + 255; @@ -137,24 +141,61 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + /* Initial buffer configuration. */ - uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, poolDesc); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); + #if (WSF_TRACE_ENABLED == TRUE) WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); #endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); } /*************************************************************************************************/ @@ -251,31 +292,8 @@ void setInterruptPriority(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; - - mainLoadConfiguration(); mainWsfInit(); -#if (WSF_TRACE_ENABLED == TRUE) - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); -#endif - - WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); - WsfCsExit(); - bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); /* Coverity[uninit_use_in_call] */ diff --git a/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c b/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c index 700c2dde6c..4d161efd20 100644 --- a/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c +++ b/Examples/MAX32690/Bluetooth/BLE_FreeRTOS/stack_dats.c @@ -174,9 +174,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -327,27 +329,52 @@ void bleStartup(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_datc/main.c b/Examples/MAX32690/Bluetooth/BLE_datc/main.c index ed1ca5eb37..974026c852 100644 --- a/Examples/MAX32690/Bluetooth/BLE_datc/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_datc/main.c @@ -116,8 +116,9 @@ static void mainWsfInit(void) uint16_t memUsed; WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -213,27 +214,55 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_dats/main.c b/Examples/MAX32690/Bluetooth/BLE_dats/main.c index f7430274b7..43d033646e 100644 --- a/Examples/MAX32690/Bluetooth/BLE_dats/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_dats/main.c @@ -115,9 +115,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -208,10 +210,9 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); @@ -219,17 +220,44 @@ int main(void) #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_fit/main.c b/Examples/MAX32690/Bluetooth/BLE_fit/main.c index f43129c09b..170005b548 100644 --- a/Examples/MAX32690/Bluetooth/BLE_fit/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_fit/main.c @@ -115,9 +115,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -208,27 +210,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_mcs/main.c b/Examples/MAX32690/Bluetooth/BLE_mcs/main.c index 507205876e..40b8e20539 100644 --- a/Examples/MAX32690/Bluetooth/BLE_mcs/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_mcs/main.c @@ -111,9 +111,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -182,27 +184,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_otac/main.c b/Examples/MAX32690/Bluetooth/BLE_otac/main.c index cfc16e2cbf..2e4a0fbd03 100644 --- a/Examples/MAX32690/Bluetooth/BLE_otac/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_otac/main.c @@ -116,9 +116,11 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); @@ -209,27 +211,54 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); mainWsfInit(); AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_otas/main.c b/Examples/MAX32690/Bluetooth/BLE_otas/main.c index 0a9e752ec2..e1a0793574 100644 --- a/Examples/MAX32690/Bluetooth/BLE_otas/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_otas/main.c @@ -116,16 +116,27 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); uint16_t memUsed; + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); #if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); + WsfTraceRegisterHandler(WsfBufIoWrite); WsfTraceEnable(TRUE); + + AppTerminalInit(); + #endif } @@ -209,27 +220,48 @@ int main(void) mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; #endif - uint32_t memUsed; - WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); - WsfCsExit(); - mainWsfInit(); - AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + WsfTraceEnable(FALSE); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; diff --git a/Examples/MAX32690/Bluetooth/BLE_periph/main.c b/Examples/MAX32690/Bluetooth/BLE_periph/main.c index d4b86f7c40..60d68cd354 100644 --- a/Examples/MAX32690/Bluetooth/BLE_periph/main.c +++ b/Examples/MAX32690/Bluetooth/BLE_periph/main.c @@ -131,8 +131,8 @@ static void mainWsfInit(void) uint32_t memUsed; WsfCsEnter(); - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); WsfCsExit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) @@ -151,32 +151,50 @@ static void mainWsfInit(void) const uint8_t numPools = sizeof(mainPoolDesc) / sizeof(mainPoolDesc[0]); + /* Initial buffer configuration. */ WsfCsEnter(); - memUsed = WsfBufInit(numPools, mainPoolDesc); + memUsed = WsfBufCalcSize(numPools, mainPoolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, mainPoolDesc); WsfCsExit(); WsfOsInit(); WsfTimerInit(); -#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) - WsfTraceRegisterHandler(WsfBufIoWrite); - WsfTraceEnable(TRUE); -#endif AppTerminalInit(); #if defined(HCI_TR_EXACTLE) && (HCI_TR_EXACTLE == 1) + uint32_t llmemUsed; + + /* Calculate how much memory we will need for the LL initialization */ WsfCsEnter(); - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; - - memUsed = LlInit(&llCfg); - WsfHeapAlloc(memUsed); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + WsfCsExit(); bdAddr_t bdAddr; @@ -184,6 +202,11 @@ static void mainWsfInit(void) LlSetBdAddr((uint8_t *)&bdAddr); #endif +#if (WSF_TOKEN_ENABLED == TRUE) || (WSF_TRACE_ENABLED == TRUE) + WsfTraceRegisterHandler(WsfBufIoWrite); + WsfTraceEnable(TRUE); +#endif + StackInitPeriph(); PeriphStart(); diff --git a/Examples/MAX32690/Bluetooth/RF_Test/main.c b/Examples/MAX32690/Bluetooth/RF_Test/main.c index 4abcaee86c..a6c78d8b50 100644 --- a/Examples/MAX32690/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32690/Bluetooth/RF_Test/main.c @@ -496,10 +496,11 @@ static void mainWsfInit(void) const uint16_t dataBufSize = 12 + HCI_ISO_DL_MAX_LEN + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; -/* Use single pool for data buffers. */ + /* Use single pool for data buffers. */ #if (BT_VER > 9) WSF_ASSERT(mainLlRtCfg.maxAclLen == mainLlRtCfg.maxIsoSduLen); #endif + /* Ensure pool buffers are ordered correctly. */ WSF_ASSERT(maxRptBufSize < dataBufSize); @@ -516,8 +517,13 @@ static void mainWsfInit(void) /* Initial buffer configuration. */ uint16_t memUsed; - memUsed = WsfBufInit(numPools, poolDesc); + /* Initial buffer configuration. */ + WsfCsEnter(); + memUsed = WsfBufCalcSize(numPools, poolDesc); WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); + WsfCsExit(); + WsfOsInit(); WsfTimerInit(); #if (WSF_TRACE_ENABLED == TRUE) @@ -650,6 +656,7 @@ void vCmdLineTask(void *pvParameters) bufferIndex = 0; memset(inputBuffer, 0x00, 100); prompt(); + } else if (bufferIndex < CMD_LINE_BUF_SIZE) { putchar(tmp); inputBuffer[bufferIndex++] = tmp; @@ -660,6 +667,7 @@ void vCmdLineTask(void *pvParameters) putchar(0x07); fflush(stdout); } + uartReadLen = 1; /* If more characters are ready, process them here */ } while ((MXC_UART_GetRXFIFOAvailable(MXC_UART_GET_UART(CONSOLE_UART)) > 0) && @@ -857,26 +865,48 @@ void printConfigs(void) /*************************************************************************************************/ int main(void) { - uint32_t memUsed; + uint32_t llmemUsed; mainLoadConfiguration(); mainWsfInit(); #if (WSF_TRACE_ENABLED == TRUE) - memUsed = WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); - WsfHeapAlloc(memUsed); + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); #endif - LlInitRtCfg_t llCfg = { .pBbRtCfg = &mainBbRtCfg, - .wlSizeCfg = 4, - .rlSizeCfg = 4, - .plSizeCfg = 4, - .pLlRtCfg = &mainLlRtCfg, - .pFreeMem = WsfHeapGetFreeStartAddress(), - .freeMemAvail = WsfHeapCountAvailable() }; + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; - memUsed = LlInitControllerInit(&llCfg); - WsfHeapAlloc(memUsed); + llmemUsed = LlInitSetRtCfg(&llCfg); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); bdAddr_t bdAddr; PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); diff --git a/Examples/MAX32690/Bluetooth/RF_Test/main.h b/Examples/MAX32690/Bluetooth/RF_Test/main.h index 7f526c7b6c..2ae688709f 100644 --- a/Examples/MAX32690/Bluetooth/RF_Test/main.h +++ b/Examples/MAX32690/Bluetooth/RF_Test/main.h @@ -41,6 +41,7 @@ #include "wsf_timer.h" #include "wsf_trace.h" #include "wsf_bufio.h" +#include "wsf_cs.h" #include "bb_ble_sniffer_api.h" #include "pal_bb.h" #include "pal_cfg.h" diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables.h index 6a9270437f..8dd1833a2a 100644 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables.h @@ -32,287 +32,281 @@ #include "arm_math_types.h" #include "dsp/fast_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /* Double Precision Float CFFT twiddles */ - extern const uint16_t armBitRevTable[1024]; +/* Double Precision Float CFFT twiddles */ +extern const uint16_t armBitRevTable[1024]; - extern const uint64_t twiddleCoefF64_16[32]; +extern const uint64_t twiddleCoefF64_16[32]; - extern const uint64_t twiddleCoefF64_32[64]; +extern const uint64_t twiddleCoefF64_32[64]; - extern const uint64_t twiddleCoefF64_64[128]; +extern const uint64_t twiddleCoefF64_64[128]; - extern const uint64_t twiddleCoefF64_128[256]; +extern const uint64_t twiddleCoefF64_128[256]; - extern const uint64_t twiddleCoefF64_256[512]; +extern const uint64_t twiddleCoefF64_256[512]; - extern const uint64_t twiddleCoefF64_512[1024]; +extern const uint64_t twiddleCoefF64_512[1024]; - extern const uint64_t twiddleCoefF64_1024[2048]; +extern const uint64_t twiddleCoefF64_1024[2048]; - extern const uint64_t twiddleCoefF64_2048[4096]; +extern const uint64_t twiddleCoefF64_2048[4096]; - extern const uint64_t twiddleCoefF64_4096[8192]; +extern const uint64_t twiddleCoefF64_4096[8192]; - extern const float32_t twiddleCoef_16[32]; +extern const float32_t twiddleCoef_16[32]; - extern const float32_t twiddleCoef_32[64]; +extern const float32_t twiddleCoef_32[64]; - extern const float32_t twiddleCoef_64[128]; +extern const float32_t twiddleCoef_64[128]; - extern const float32_t twiddleCoef_128[256]; +extern const float32_t twiddleCoef_128[256]; - extern const float32_t twiddleCoef_256[512]; +extern const float32_t twiddleCoef_256[512]; - extern const float32_t twiddleCoef_512[1024]; +extern const float32_t twiddleCoef_512[1024]; - extern const float32_t twiddleCoef_1024[2048]; +extern const float32_t twiddleCoef_1024[2048]; - extern const float32_t twiddleCoef_2048[4096]; +extern const float32_t twiddleCoef_2048[4096]; - extern const float32_t twiddleCoef_4096[8192]; - #define twiddleCoef twiddleCoef_4096 +extern const float32_t twiddleCoef_4096[8192]; +#define twiddleCoef twiddleCoef_4096 - /* Q31 */ +/* Q31 */ - extern const q31_t twiddleCoef_16_q31[24]; +extern const q31_t twiddleCoef_16_q31[24]; - extern const q31_t twiddleCoef_32_q31[48]; +extern const q31_t twiddleCoef_32_q31[48]; - extern const q31_t twiddleCoef_64_q31[96]; +extern const q31_t twiddleCoef_64_q31[96]; - extern const q31_t twiddleCoef_128_q31[192]; +extern const q31_t twiddleCoef_128_q31[192]; - extern const q31_t twiddleCoef_256_q31[384]; +extern const q31_t twiddleCoef_256_q31[384]; - extern const q31_t twiddleCoef_512_q31[768]; +extern const q31_t twiddleCoef_512_q31[768]; - extern const q31_t twiddleCoef_1024_q31[1536]; +extern const q31_t twiddleCoef_1024_q31[1536]; - extern const q31_t twiddleCoef_2048_q31[3072]; +extern const q31_t twiddleCoef_2048_q31[3072]; - extern const q31_t twiddleCoef_4096_q31[6144]; +extern const q31_t twiddleCoef_4096_q31[6144]; - extern const q15_t twiddleCoef_16_q15[24]; +extern const q15_t twiddleCoef_16_q15[24]; - extern const q15_t twiddleCoef_32_q15[48]; +extern const q15_t twiddleCoef_32_q15[48]; - extern const q15_t twiddleCoef_64_q15[96]; +extern const q15_t twiddleCoef_64_q15[96]; - extern const q15_t twiddleCoef_128_q15[192]; +extern const q15_t twiddleCoef_128_q15[192]; - extern const q15_t twiddleCoef_256_q15[384]; +extern const q15_t twiddleCoef_256_q15[384]; - extern const q15_t twiddleCoef_512_q15[768]; +extern const q15_t twiddleCoef_512_q15[768]; - extern const q15_t twiddleCoef_1024_q15[1536]; +extern const q15_t twiddleCoef_1024_q15[1536]; - extern const q15_t twiddleCoef_2048_q15[3072]; +extern const q15_t twiddleCoef_2048_q15[3072]; - extern const q15_t twiddleCoef_4096_q15[6144]; +extern const q15_t twiddleCoef_4096_q15[6144]; - /* Double Precision Float RFFT twiddles */ - extern const uint64_t twiddleCoefF64_rfft_32[32]; +/* Double Precision Float RFFT twiddles */ +extern const uint64_t twiddleCoefF64_rfft_32[32]; - extern const uint64_t twiddleCoefF64_rfft_64[64]; +extern const uint64_t twiddleCoefF64_rfft_64[64]; - extern const uint64_t twiddleCoefF64_rfft_128[128]; +extern const uint64_t twiddleCoefF64_rfft_128[128]; - extern const uint64_t twiddleCoefF64_rfft_256[256]; +extern const uint64_t twiddleCoefF64_rfft_256[256]; - extern const uint64_t twiddleCoefF64_rfft_512[512]; +extern const uint64_t twiddleCoefF64_rfft_512[512]; - extern const uint64_t twiddleCoefF64_rfft_1024[1024]; +extern const uint64_t twiddleCoefF64_rfft_1024[1024]; - extern const uint64_t twiddleCoefF64_rfft_2048[2048]; +extern const uint64_t twiddleCoefF64_rfft_2048[2048]; - extern const uint64_t twiddleCoefF64_rfft_4096[4096]; +extern const uint64_t twiddleCoefF64_rfft_4096[4096]; - extern const float32_t twiddleCoef_rfft_32[32]; +extern const float32_t twiddleCoef_rfft_32[32]; - extern const float32_t twiddleCoef_rfft_64[64]; +extern const float32_t twiddleCoef_rfft_64[64]; - extern const float32_t twiddleCoef_rfft_128[128]; +extern const float32_t twiddleCoef_rfft_128[128]; - extern const float32_t twiddleCoef_rfft_256[256]; +extern const float32_t twiddleCoef_rfft_256[256]; - extern const float32_t twiddleCoef_rfft_512[512]; +extern const float32_t twiddleCoef_rfft_512[512]; - extern const float32_t twiddleCoef_rfft_1024[1024]; +extern const float32_t twiddleCoef_rfft_1024[1024]; - extern const float32_t twiddleCoef_rfft_2048[2048]; +extern const float32_t twiddleCoef_rfft_2048[2048]; - extern const float32_t twiddleCoef_rfft_4096[4096]; +extern const float32_t twiddleCoef_rfft_4096[4096]; - /* Double precision floating-point bit reversal tables */ +/* Double precision floating-point bit reversal tables */ - #define ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH ((uint16_t)12) - extern const uint16_t armBitRevIndexTableF64_16[ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH ((uint16_t)12) +extern const uint16_t armBitRevIndexTableF64_16[ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH ((uint16_t)24) - extern const uint16_t armBitRevIndexTableF64_32[ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH ((uint16_t)24) +extern const uint16_t armBitRevIndexTableF64_32[ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTableF64_64[ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH ((uint16_t)56) +extern const uint16_t armBitRevIndexTableF64_64[ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH ((uint16_t)112) - extern const uint16_t armBitRevIndexTableF64_128[ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH ((uint16_t)112) +extern const uint16_t armBitRevIndexTableF64_128[ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH ((uint16_t)240) - extern const uint16_t armBitRevIndexTableF64_256[ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH ((uint16_t)240) +extern const uint16_t armBitRevIndexTableF64_256[ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH ((uint16_t)480) - extern const uint16_t armBitRevIndexTableF64_512[ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH ((uint16_t)480) +extern const uint16_t armBitRevIndexTableF64_512[ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH ((uint16_t)992) - extern const uint16_t armBitRevIndexTableF64_1024[ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH ((uint16_t)992) +extern const uint16_t armBitRevIndexTableF64_1024[ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH ((uint16_t)1984) - extern const uint16_t armBitRevIndexTableF64_2048[ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH ((uint16_t)1984) +extern const uint16_t armBitRevIndexTableF64_2048[ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTableF64_4096[ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH]; - /* floating-point bit reversal tables */ +#define ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH ((uint16_t)4032) +extern const uint16_t armBitRevIndexTableF64_4096[ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH]; +/* floating-point bit reversal tables */ - #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) - extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) +extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) - extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) +extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) +extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) - extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) +extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) - extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) +extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) - extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) +extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) - extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) +extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) - extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) +extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) +extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; +/* fixed-point bit reversal tables */ - /* fixed-point bit reversal tables */ +#define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) +extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) - extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) +extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) - extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) +extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) +extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) - extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) +extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) - extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) +extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) - extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) +extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) - extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) +extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) - extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; +#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) +extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; - #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; +extern const float32_t realCoefA[8192]; +extern const float32_t realCoefB[8192]; - extern const float32_t realCoefA[8192]; - extern const float32_t realCoefB[8192]; +extern const q31_t realCoefAQ31[8192]; +extern const q31_t realCoefBQ31[8192]; - extern const q31_t realCoefAQ31[8192]; - extern const q31_t realCoefBQ31[8192]; +extern const q15_t realCoefAQ15[8192]; +extern const q15_t realCoefBQ15[8192]; - extern const q15_t realCoefAQ15[8192]; - extern const q15_t realCoefBQ15[8192]; +extern const float32_t Weights_128[256]; +extern const float32_t cos_factors_128[128]; - extern const float32_t Weights_128[256]; - extern const float32_t cos_factors_128[128]; +extern const float32_t Weights_512[1024]; +extern const float32_t cos_factors_512[512]; - extern const float32_t Weights_512[1024]; - extern const float32_t cos_factors_512[512]; +extern const float32_t Weights_2048[4096]; +extern const float32_t cos_factors_2048[2048]; - extern const float32_t Weights_2048[4096]; - extern const float32_t cos_factors_2048[2048]; +extern const float32_t Weights_8192[16384]; +extern const float32_t cos_factors_8192[8192]; - extern const float32_t Weights_8192[16384]; - extern const float32_t cos_factors_8192[8192]; +extern const q15_t WeightsQ15_128[256]; +extern const q15_t cos_factorsQ15_128[128]; - extern const q15_t WeightsQ15_128[256]; - extern const q15_t cos_factorsQ15_128[128]; +extern const q15_t WeightsQ15_512[1024]; +extern const q15_t cos_factorsQ15_512[512]; - extern const q15_t WeightsQ15_512[1024]; - extern const q15_t cos_factorsQ15_512[512]; +extern const q15_t WeightsQ15_2048[4096]; +extern const q15_t cos_factorsQ15_2048[2048]; - extern const q15_t WeightsQ15_2048[4096]; - extern const q15_t cos_factorsQ15_2048[2048]; +extern const q15_t WeightsQ15_8192[16384]; +extern const q15_t cos_factorsQ15_8192[8192]; - extern const q15_t WeightsQ15_8192[16384]; - extern const q15_t cos_factorsQ15_8192[8192]; +extern const q31_t WeightsQ31_128[256]; +extern const q31_t cos_factorsQ31_128[128]; - extern const q31_t WeightsQ31_128[256]; - extern const q31_t cos_factorsQ31_128[128]; +extern const q31_t WeightsQ31_512[1024]; +extern const q31_t cos_factorsQ31_512[512]; - extern const q31_t WeightsQ31_512[1024]; - extern const q31_t cos_factorsQ31_512[512]; +extern const q31_t WeightsQ31_2048[4096]; +extern const q31_t cos_factorsQ31_2048[2048]; - extern const q31_t WeightsQ31_2048[4096]; - extern const q31_t cos_factorsQ31_2048[2048]; +extern const q31_t WeightsQ31_8192[16384]; +extern const q31_t cos_factorsQ31_8192[8192]; - extern const q31_t WeightsQ31_8192[16384]; - extern const q31_t cos_factorsQ31_8192[8192]; +extern const q15_t armRecipTableQ15[64]; +extern const q31_t armRecipTableQ31[64]; - extern const q15_t armRecipTableQ15[64]; +/* Tables for Fast Math Sine and Cosine */ +extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; - extern const q31_t armRecipTableQ31[64]; +extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; - /* Tables for Fast Math Sine and Cosine */ - extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; +extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; +/* Accurate scalar sqrt */ +extern const q31_t sqrt_initial_lut_q31[32]; - extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - - - /* Accurate scalar sqrt */ - extern const q31_t sqrt_initial_lut_q31[32]; - - extern const q15_t sqrt_initial_lut_q15[16]; +extern const q15_t sqrt_initial_lut_q15[16]; #if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) - extern const q15_t sqrtTable_Q15[256]; - extern const q31_t sqrtTable_Q31[256]; - extern const unsigned char hwLUT[256]; -#endif +extern const q15_t sqrtTable_Q15[256]; +extern const q31_t sqrtTable_Q31[256]; +extern const unsigned char hwLUT[256]; +#endif #if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) - extern const float32_t exp_tab[8]; - extern const float32_t __logf_lut_f32[8]; -#endif - +extern const float32_t exp_tab[8]; +extern const float32_t __logf_lut_f32[8]; +#endif -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif /* ARM_COMMON_TABLES_H */ - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables_f16.h old mode 100755 new mode 100644 index c84a766adf..e94aec547a --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_common_tables_f16.h @@ -31,65 +31,58 @@ #include "arm_math_types_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif +/* F16 */ +#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) +extern const float16_t twiddleCoefF16_16[32]; - /* F16 */ - #if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) - extern const float16_t twiddleCoefF16_16[32]; +extern const float16_t twiddleCoefF16_32[64]; - extern const float16_t twiddleCoefF16_32[64]; +extern const float16_t twiddleCoefF16_64[128]; - extern const float16_t twiddleCoefF16_64[128]; +extern const float16_t twiddleCoefF16_128[256]; - extern const float16_t twiddleCoefF16_128[256]; +extern const float16_t twiddleCoefF16_256[512]; - extern const float16_t twiddleCoefF16_256[512]; +extern const float16_t twiddleCoefF16_512[1024]; - extern const float16_t twiddleCoefF16_512[1024]; +extern const float16_t twiddleCoefF16_1024[2048]; - extern const float16_t twiddleCoefF16_1024[2048]; +extern const float16_t twiddleCoefF16_2048[4096]; - extern const float16_t twiddleCoefF16_2048[4096]; +extern const float16_t twiddleCoefF16_4096[8192]; +#define twiddleCoefF16 twiddleCoefF16_4096 - extern const float16_t twiddleCoefF16_4096[8192]; - #define twiddleCoefF16 twiddleCoefF16_4096 - - - extern const float16_t twiddleCoefF16_rfft_32[32]; +extern const float16_t twiddleCoefF16_rfft_32[32]; - extern const float16_t twiddleCoefF16_rfft_64[64]; +extern const float16_t twiddleCoefF16_rfft_64[64]; - extern const float16_t twiddleCoefF16_rfft_128[128]; +extern const float16_t twiddleCoefF16_rfft_128[128]; - extern const float16_t twiddleCoefF16_rfft_256[256]; +extern const float16_t twiddleCoefF16_rfft_256[256]; - extern const float16_t twiddleCoefF16_rfft_512[512]; +extern const float16_t twiddleCoefF16_rfft_512[512]; - extern const float16_t twiddleCoefF16_rfft_1024[1024]; +extern const float16_t twiddleCoefF16_rfft_1024[1024]; - extern const float16_t twiddleCoefF16_rfft_2048[2048]; +extern const float16_t twiddleCoefF16_rfft_2048[2048]; - extern const float16_t twiddleCoefF16_rfft_4096[4096]; +extern const float16_t twiddleCoefF16_rfft_4096[4096]; - #endif /* ARMAC5 */ - +#endif /* ARMAC5 */ #if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) #if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) - extern const float16_t exp_tab_f16[8]; - extern const float16_t __logf_lut_f16[8]; +extern const float16_t exp_tab_f16[8]; +extern const float16_t __logf_lut_f16[8]; +#endif #endif -#endif - -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif /* _ARM_COMMON_TABLES_F16_H */ - - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs.h index 32c1a436e6..e561bc28f3 100644 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs.h @@ -34,53 +34,51 @@ #include "arm_common_tables.h" #include "dsp/transform_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len16; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len32; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len64; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len128; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len256; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len512; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len1024; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len2048; - extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len16; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len32; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len64; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len128; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len256; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len512; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len1024; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len2048; +extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; - extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; +extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; - extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; +extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; - extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; +extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs_f16.h old mode 100755 new mode 100644 index 3a520b6b94..aab7cf79fc --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_const_structs_f16.h @@ -35,24 +35,23 @@ #include "arm_common_tables_f16.h" #include "dsp/transform_functions_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len16; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len32; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len64; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len128; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len256; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len512; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len1024; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len2048; - extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len4096; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len16; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len32; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len64; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len128; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len256; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len512; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len1024; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len2048; +extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len4096; #endif -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_helium_utils.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_helium_utils.h old mode 100755 new mode 100644 index 6516767826..10dac14d5b --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_helium_utils.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_helium_utils.h @@ -29,20 +29,18 @@ #ifndef ARM_UTILS_HELIUM_H_ #define ARM_UTILS_HELIUM_H_ - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /*************************************** Definitions available for MVEF and MVEI ***************************************/ -#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) - -#define INACTIVELANE 0 /* inactive lane content */ +#if (defined(ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && \ + !defined(ARM_MATH_AUTOVECTORIZE) +#define INACTIVELANE 0 /* inactive lane content */ #endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) */ @@ -51,70 +49,63 @@ Definitions available for MVEF and MVEI Definitions available for MVEF only ***************************************/ -#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF)) && !defined(ARM_MATH_AUTOVECTORIZE) +#if (defined(ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF)) && !defined(ARM_MATH_AUTOVECTORIZE) __STATIC_FORCEINLINE float32_t vecAddAcrossF32Mve(float32x4_t in) { float32_t acc; - acc = vgetq_lane(in, 0) + vgetq_lane(in, 1) + - vgetq_lane(in, 2) + vgetq_lane(in, 3); + acc = vgetq_lane(in, 0) + vgetq_lane(in, 1) + vgetq_lane(in, 2) + vgetq_lane(in, 3); return acc; } - - - /* newton initial guess */ -#define INVSQRT_MAGIC_F32 0x5f3759df -#define INV_NEWTON_INIT_F32 0x7EF127EA - - -#define INVSQRT_NEWTON_MVE_F32(invSqrt, xHalf, xStart)\ -{ \ - float32x4_t tmp; \ - \ - /* tmp = xhalf * x * x */ \ - tmp = vmulq(xStart, xStart); \ - tmp = vmulq(tmp, xHalf); \ - /* (1.5f - xhalf * x * x) */ \ - tmp = vsubq(vdupq_n_f32(1.5f), tmp); \ - /* x = x*(1.5f-xhalf*x*x); */ \ - invSqrt = vmulq(tmp, xStart); \ -} +#define INVSQRT_MAGIC_F32 0x5f3759df +#define INV_NEWTON_INIT_F32 0x7EF127EA + +#define INVSQRT_NEWTON_MVE_F32(invSqrt, xHalf, xStart) \ + { \ + float32x4_t tmp; \ + \ + /* tmp = xhalf * x * x */ \ + tmp = vmulq(xStart, xStart); \ + tmp = vmulq(tmp, xHalf); \ + /* (1.5f - xhalf * x * x) */ \ + tmp = vsubq(vdupq_n_f32(1.5f), tmp); \ + /* x = x*(1.5f-xhalf*x*x); */ \ + invSqrt = vmulq(tmp, xStart); \ + } #endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) */ - /*************************************** Definitions available for f16 datatype with HW acceleration only ***************************************/ #if defined(ARM_FLOAT16_SUPPORTED) -#if defined (ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) +#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) __STATIC_FORCEINLINE float16_t vecAddAcrossF16Mve(float16x8_t in) { float16x8_t tmpVec; _Float16 acc; - tmpVec = (float16x8_t) vrev32q_s16((int16x8_t) in); + tmpVec = (float16x8_t)vrev32q_s16((int16x8_t)in); in = vaddq_f16(tmpVec, in); - tmpVec = (float16x8_t) vrev64q_s32((int32x4_t) in); + tmpVec = (float16x8_t)vrev64q_s32((int32x4_t)in); in = vaddq_f16(tmpVec, in); acc = (_Float16)vgetq_lane_f16(in, 0) + (_Float16)vgetq_lane_f16(in, 4); return acc; } -__STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16( - float16x8_t vecIn) +__STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16(float16x8_t vecIn) { - float16x8_t vecTmp, vecOut; - uint32_t tmp = 0; + float16x8_t vecTmp, vecOut; + uint32_t tmp = 0; - vecTmp = (float16x8_t) vrev64q_s32((int32x4_t) vecIn); + vecTmp = (float16x8_t)vrev64q_s32((int32x4_t)vecIn); // TO TRACK : using canonical addition leads to unefficient code generation for f16 // vecTmp = vecTmp + vecAccCpx0; /* @@ -127,7 +118,7 @@ __STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16( /* * shift left, random tmp insertion in bottom */ - vecOut = vreinterpretq_f16_s32(vshlcq_s32(vreinterpretq_s32_f16(vecOut) , &tmp, 32)); + vecOut = vreinterpretq_f16_s32(vshlcq_s32(vreinterpretq_s32_f16(vecOut), &tmp, 32)); /* * Compute: * DONTCARE | DONTCARE | re0+re1+re0+re1 |im0+im1+im0+im1 @@ -141,56 +132,51 @@ __STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16( return vecOut; } +#define mve_cmplx_sum_intra_r_i_f16(vec, Re, Im) \ + { \ + float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vec); \ + Re = vgetq_lane(vecOut, 4); \ + Im = vgetq_lane(vecOut, 5); \ + } -#define mve_cmplx_sum_intra_r_i_f16(vec, Re, Im) \ -{ \ - float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vec); \ - Re = vgetq_lane(vecOut, 4); \ - Im = vgetq_lane(vecOut, 5); \ -} - -__STATIC_FORCEINLINE void mve_cmplx_sum_intra_vec_f16( - float16x8_t vecIn, - float16_t *pOut) +__STATIC_FORCEINLINE void mve_cmplx_sum_intra_vec_f16(float16x8_t vecIn, float16_t *pOut) { - float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vecIn); + float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vecIn); /* * Cmplx sum is in 4rd & 5th f16 elt * use 32-bit extraction */ - *(float32_t *) pOut = ((float32x4_t) vecOut)[2]; + *(float32_t *)pOut = ((float32x4_t)vecOut)[2]; } - -#define INVSQRT_MAGIC_F16 0x59ba /* ( 0x1ba = 0x3759df >> 13) */ +#define INVSQRT_MAGIC_F16 0x59ba /* ( 0x1ba = 0x3759df >> 13) */ /* canonical version of INVSQRT_NEWTON_MVE_F16 leads to bad performance */ -#define INVSQRT_NEWTON_MVE_F16(invSqrt, xHalf, xStart) \ -{ \ - float16x8_t tmp; \ - \ - /* tmp = xhalf * x * x */ \ - tmp = vmulq(xStart, xStart); \ - tmp = vmulq(tmp, xHalf); \ - /* (1.5f - xhalf * x * x) */ \ - tmp = vsubq(vdupq_n_f16((float16_t)1.5), tmp); \ - /* x = x*(1.5f-xhalf*x*x); */ \ - invSqrt = vmulq(tmp, xStart); \ -} +#define INVSQRT_NEWTON_MVE_F16(invSqrt, xHalf, xStart) \ + { \ + float16x8_t tmp; \ + \ + /* tmp = xhalf * x * x */ \ + tmp = vmulq(xStart, xStart); \ + tmp = vmulq(tmp, xHalf); \ + /* (1.5f - xhalf * x * x) */ \ + tmp = vsubq(vdupq_n_f16((float16_t)1.5), tmp); \ + /* x = x*(1.5f-xhalf*x*x); */ \ + invSqrt = vmulq(tmp, xStart); \ + } #endif -#endif +#endif /*************************************** Definitions available for MVEI and MVEF only ***************************************/ -#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) +#if (defined(ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && \ + !defined(ARM_MATH_AUTOVECTORIZE) /* Following functions are used to transpose matrix in f32 and q31 cases */ -__STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve( - uint32_t * pDataSrc, - uint32_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve(uint32_t *pDataSrc, uint32_t *pDataDest) { static const uint32x4_t vecOffs = { 0, 2, 1, 3 }; /* @@ -205,12 +191,10 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve( return (ARM_MATH_SUCCESS); } -__STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve( - uint32_t * pDataSrc, - uint32_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve(uint32_t *pDataSrc, uint32_t *pDataDest) { - const uint32x4_t vecOffs1 = { 0, 3, 6, 1}; - const uint32x4_t vecOffs2 = { 4, 7, 2, 5}; + const uint32x4_t vecOffs1 = { 0, 3, 6, 1 }; + const uint32x4_t vecOffs2 = { 4, 7, 2, 5 }; /* * * | 0 1 2 | | 0 3 6 | 4 x 32 flattened version | 0 3 6 1 | @@ -218,8 +202,8 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve( * | 6 7 8 | | 2 5 8 | (row major) | 8 . . . | * */ - uint32x4_t vecIn1 = vldrwq_u32((uint32_t const *) pDataSrc); - uint32x4_t vecIn2 = vldrwq_u32((uint32_t const *) &pDataSrc[4]); + uint32x4_t vecIn1 = vldrwq_u32((uint32_t const *)pDataSrc); + uint32x4_t vecIn2 = vldrwq_u32((uint32_t const *)&pDataSrc[4]); vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs1, vecIn1); vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs2, vecIn2); @@ -229,7 +213,7 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve( return (ARM_MATH_SUCCESS); } -__STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint32_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t *pDataSrc, uint32_t *pDataDest) { /* * 4x4 Matrix transposition @@ -243,7 +227,7 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint uint32x4x4_t vecIn; - vecIn = vld4q((uint32_t const *) pDataSrc); + vecIn = vld4q((uint32_t const *)pDataSrc); vstrwq(pDataDest, vecIn.val[0]); pDataDest += 4; vstrwq(pDataDest, vecIn.val[1]); @@ -255,16 +239,12 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint return (ARM_MATH_SUCCESS); } - -__STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( - uint16_t srcRows, - uint16_t srcCols, - uint32_t * pDataSrc, - uint32_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve(uint16_t srcRows, uint16_t srcCols, + uint32_t *pDataSrc, uint32_t *pDataDest) { uint32x4_t vecOffs; - uint32_t i; - uint32_t blkCnt; + uint32_t i; + uint32_t blkCnt; uint32_t const *pDataC; uint32_t *pDataDestR; uint32x4_t vecIn; @@ -273,16 +253,14 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( vecOffs = vecOffs * srcCols; i = srcCols; - do - { - pDataC = (uint32_t const *) pDataSrc; + do { + pDataC = (uint32_t const *)pDataSrc; pDataDestR = pDataDest; blkCnt = srcRows >> 2; - while (blkCnt > 0U) - { + while (blkCnt > 0U) { vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); - vstrwq(pDataDestR, vecIn); + vstrwq(pDataDestR, vecIn); pDataDestR += 4; pDataC = pDataC + srcCols * 4; /* @@ -295,8 +273,7 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( * tail */ blkCnt = srcRows & 3; - if (blkCnt > 0U) - { + if (blkCnt > 0U) { mve_pred16_t p0 = vctp32q(blkCnt); vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); vstrwq_p(pDataDestR, vecIn, p0); @@ -304,34 +281,28 @@ __STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( pDataSrc += 1; pDataDest += srcRows; - } - while (--i); + } while (--i); return (ARM_MATH_SUCCESS); } -__STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit( - uint16_t srcRows, - uint16_t srcCols, - uint32_t *pDataSrc, - uint16_t dstRows, - uint16_t dstCols, - uint32_t *pDataDest) +__STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit(uint16_t srcRows, uint16_t srcCols, + uint32_t *pDataSrc, uint16_t dstRows, + uint16_t dstCols, uint32_t *pDataDest) { - uint32_t i; + uint32_t i; uint32_t const *pDataC; - uint32_t *pDataRow; - uint32_t *pDataDestR, *pDataDestRow; - uint32x4_t vecOffsRef, vecOffsCur; - uint32_t blkCnt; - uint32x4_t vecIn; + uint32_t *pDataRow; + uint32_t *pDataDestR, *pDataDestRow; + uint32x4_t vecOffsRef, vecOffsCur; + uint32_t blkCnt; + uint32x4_t vecIn; #ifdef ARM_MATH_MATRIX_CHECK /* * Check for matrix mismatch condition */ - if ((srcRows != dstCols) || (srcCols != dstRows)) - { + if ((srcRows != dstCols) || (srcCols != dstRows)) { /* * Set status as ARM_MATH_SIZE_MISMATCH */ @@ -352,31 +323,28 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit( pDataRow = pDataSrc; pDataDestRow = pDataDest; i = srcCols; - do - { - pDataC = (uint32_t const *) pDataRow; + do { + pDataC = (uint32_t const *)pDataRow; pDataDestR = pDataDestRow; vecOffsCur = vecOffsRef; blkCnt = (srcRows * CMPLX_DIM) >> 2; - while (blkCnt > 0U) - { + while (blkCnt > 0U) { vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur); - vstrwq(pDataDestR, vecIn); + vstrwq(pDataDestR, vecIn); pDataDestR += 4; vecOffsCur = vaddq(vecOffsCur, (srcCols << 2)); /* * Decrement the blockSize loop counter */ - blkCnt--; + blkCnt--; } /* * tail * (will be merged thru tail predication) */ blkCnt = (srcRows * CMPLX_DIM) & 3; - if (blkCnt > 0U) - { + if (blkCnt > 0U) { mve_pred16_t p0 = vctp32q(blkCnt); vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur); vstrwq_p(pDataDestR, vecIn, p0); @@ -384,13 +352,12 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit( pDataRow += CMPLX_DIM; pDataDestRow += (srcRows * CMPLX_DIM); - } - while (--i); + } while (--i); return (ARM_MATH_SUCCESS); } -__STATIC_INLINE arm_status arm_mat_trans_16bit_2x2(uint16_t * pDataSrc, uint16_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_16bit_2x2(uint16_t *pDataSrc, uint16_t *pDataDest) { pDataDest[0] = pDataSrc[0]; pDataDest[3] = pDataSrc[3]; @@ -400,11 +367,11 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_2x2(uint16_t * pDataSrc, uint16_t return (ARM_MATH_SUCCESS); } -__STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t * pDataSrc, uint16_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t *pDataSrc, uint16_t *pDataDest) { static const uint16_t stridesTr33[8] = { 0, 3, 6, 1, 4, 7, 2, 5 }; - uint16x8_t vecOffs1; - uint16x8_t vecIn1; + uint16x8_t vecOffs1; + uint16x8_t vecIn1; /* * * | 0 1 2 | | 0 3 6 | 8 x 16 flattened version | 0 3 6 1 4 7 2 5 | @@ -412,8 +379,8 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t * pDataSrc, uint * | 6 7 8 | | 2 5 8 | (row major) * */ - vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr33); - vecIn1 = vldrhq_u16((uint16_t const *) pDataSrc); + vecOffs1 = vldrhq_u16((uint16_t const *)stridesTr33); + vecIn1 = vldrhq_u16((uint16_t const *)pDataSrc); vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1); @@ -422,14 +389,13 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t * pDataSrc, uint return (ARM_MATH_SUCCESS); } - -__STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t * pDataSrc, uint16_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t *pDataSrc, uint16_t *pDataDest) { static const uint16_t stridesTr44_1[8] = { 0, 4, 8, 12, 1, 5, 9, 13 }; static const uint16_t stridesTr44_2[8] = { 2, 6, 10, 14, 3, 7, 11, 15 }; - uint16x8_t vecOffs1, vecOffs2; - uint16x8_t vecIn1, vecIn2; - uint16_t const * pDataSrcVec = (uint16_t const *) pDataSrc; + uint16x8_t vecOffs1, vecOffs2; + uint16x8_t vecIn1, vecIn2; + uint16_t const *pDataSrcVec = (uint16_t const *)pDataSrc; /* * 4x4 Matrix transposition @@ -440,8 +406,8 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t * pDataSrc, uint * | 12 13 14 15 | | 3 7 11 15 | */ - vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr44_1); - vecOffs2 = vldrhq_u16((uint16_t const *) stridesTr44_2); + vecOffs1 = vldrhq_u16((uint16_t const *)stridesTr44_1); + vecOffs2 = vldrhq_u16((uint16_t const *)stridesTr44_2); vecIn1 = vldrhq_u16(pDataSrcVec); pDataSrcVec += 8; vecIn2 = vldrhq_u16(pDataSrcVec); @@ -449,39 +415,31 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t * pDataSrc, uint vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1); vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs2, vecIn2); - return (ARM_MATH_SUCCESS); } - - -__STATIC_INLINE arm_status arm_mat_trans_16bit_generic( - uint16_t srcRows, - uint16_t srcCols, - uint16_t * pDataSrc, - uint16_t * pDataDest) +__STATIC_INLINE arm_status arm_mat_trans_16bit_generic(uint16_t srcRows, uint16_t srcCols, + uint16_t *pDataSrc, uint16_t *pDataDest) { - uint16x8_t vecOffs; - uint32_t i; - uint32_t blkCnt; + uint16x8_t vecOffs; + uint32_t i; + uint32_t blkCnt; uint16_t const *pDataC; - uint16_t *pDataDestR; - uint16x8_t vecIn; + uint16_t *pDataDestR; + uint16x8_t vecIn; vecOffs = vidupq_u16((uint32_t)0, 1); vecOffs = vecOffs * srcCols; i = srcCols; - while(i > 0U) - { - pDataC = (uint16_t const *) pDataSrc; + while (i > 0U) { + pDataC = (uint16_t const *)pDataSrc; pDataDestR = pDataDest; blkCnt = srcRows >> 3; - while (blkCnt > 0U) - { + while (blkCnt > 0U) { vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs); - vstrhq_u16(pDataDestR, vecIn); + vstrhq_u16(pDataDestR, vecIn); pDataDestR += 8; pDataC = pDataC + srcCols * 8; /* @@ -494,8 +452,7 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_generic( * tail */ blkCnt = srcRows & 7; - if (blkCnt > 0U) - { + if (blkCnt > 0U) { mve_pred16_t p0 = vctp16q(blkCnt); vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs); vstrhq_p_u16(pDataDestR, vecIn, p0); @@ -508,30 +465,24 @@ __STATIC_INLINE arm_status arm_mat_trans_16bit_generic( return (ARM_MATH_SUCCESS); } - -__STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( - uint16_t srcRows, - uint16_t srcCols, - uint16_t *pDataSrc, - uint16_t dstRows, - uint16_t dstCols, - uint16_t *pDataDest) +__STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit(uint16_t srcRows, uint16_t srcCols, + uint16_t *pDataSrc, uint16_t dstRows, + uint16_t dstCols, uint16_t *pDataDest) { static const uint16_t loadCmplxCol[8] = { 0, 0, 1, 1, 2, 2, 3, 3 }; - int i; - uint16x8_t vecOffsRef, vecOffsCur; + int i; + uint16x8_t vecOffsRef, vecOffsCur; uint16_t const *pDataC; - uint16_t *pDataRow; - uint16_t *pDataDestR, *pDataDestRow; - uint32_t blkCnt; - uint16x8_t vecIn; + uint16_t *pDataRow; + uint16_t *pDataDestR, *pDataDestRow; + uint32_t blkCnt; + uint16x8_t vecIn; #ifdef ARM_MATH_MATRIX_CHECK /* * Check for matrix mismatch condition */ - if ((srcRows != dstCols) || (srcCols != dstRows)) - { + if ((srcRows != dstCols) || (srcCols != dstRows)) { /* * Set status as ARM_MATH_SIZE_MISMATCH */ @@ -546,29 +497,26 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( * 2x2, 3x3 and 4x4 specialization to be added */ - /* * build [0, 1, 2xcol, 2xcol+1, 4xcol, 4xcol+1, 6xcol, 6xcol+1] */ - vecOffsRef = vldrhq_u16((uint16_t const *) loadCmplxCol); - vecOffsRef = vmulq(vecOffsRef, (uint16_t) (srcCols * CMPLX_DIM)) - + viwdupq_u16((uint32_t)0, (uint16_t) 2, 1); + vecOffsRef = vldrhq_u16((uint16_t const *)loadCmplxCol); + vecOffsRef = vmulq(vecOffsRef, (uint16_t)(srcCols * CMPLX_DIM)) + + viwdupq_u16((uint32_t)0, (uint16_t)2, 1); pDataRow = pDataSrc; pDataDestRow = pDataDest; i = srcCols; - do - { - pDataC = (uint16_t const *) pDataRow; + do { + pDataC = (uint16_t const *)pDataRow; pDataDestR = pDataDestRow; vecOffsCur = vecOffsRef; blkCnt = (srcRows * CMPLX_DIM) >> 3; - while (blkCnt > 0U) - { + while (blkCnt > 0U) { vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur); - vstrhq(pDataDestR, vecIn); - pDataDestR+= 8; // VEC_LANES_U16 + vstrhq(pDataDestR, vecIn); + pDataDestR += 8; // VEC_LANES_U16 vecOffsCur = vaddq(vecOffsCur, (srcCols << 3)); /* * Decrement the blockSize loop counter @@ -580,8 +528,7 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( * (will be merged thru tail predication) */ blkCnt = (srcRows * CMPLX_DIM) & 0x7; - if (blkCnt > 0U) - { + if (blkCnt > 0U) { mve_pred16_t p0 = vctp16q(blkCnt); vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur); vstrhq_p(pDataDestR, vecIn, p0); @@ -589,8 +536,7 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( pDataRow += CMPLX_DIM; pDataDestRow += (srcRows * CMPLX_DIM); - } - while (--i); + } while (--i); return (ARM_MATH_SUCCESS); } @@ -601,22 +547,20 @@ __STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( Definitions available for MVEI only ***************************************/ -#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) +#if (defined(ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) #include "arm_common_tables.h" -#define MVE_ASRL_SAT16(acc, shift) ((sqrshrl_sat48(acc, -(32-shift)) >> 32) & 0xffffffff) -#define MVE_ASRL_SAT32(acc, shift) ((sqrshrl(acc, -(32-shift)) >> 32) & 0xffffffff) - +#define MVE_ASRL_SAT16(acc, shift) ((sqrshrl_sat48(acc, -(32 - shift)) >> 32) & 0xffffffff) +#define MVE_ASRL_SAT32(acc, shift) ((sqrshrl(acc, -(32 - shift)) >> 32) & 0xffffffff) __STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) { - q63x2_t vecTmpLL; - q31x4_t vecTmp0, vecTmp1; - q31_t scale; - q63_t tmp64; - q31x4_t vecNrm, vecDst, vecIdx, vecSignBits; - + q63x2_t vecTmpLL; + q31x4_t vecTmp0, vecTmp1; + q31_t scale; + q63_t tmp64; + q31x4_t vecNrm, vecDst, vecIdx, vecSignBits; vecSignBits = vclsq(vecIn); vecSignBits = vbicq_n_s32(vecSignBits, 1); @@ -649,11 +593,11 @@ __STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) */ scale = 26 + (vecSignBits[0] >> 1); tmp64 = asrl(vecTmpLL[0], scale); - vecDst[0] = (q31_t) tmp64; + vecDst[0] = (q31_t)tmp64; scale = 26 + (vecSignBits[2] >> 1); tmp64 = asrl(vecTmpLL[1], scale); - vecDst[2] = (q31_t) tmp64; + vecDst[2] = (q31_t)tmp64; vecTmpLL = vmulltq_int(vecNrm, vecTmp0); @@ -662,11 +606,11 @@ __STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) */ scale = 26 + (vecSignBits[1] >> 1); tmp64 = asrl(vecTmpLL[0], scale); - vecDst[1] = (q31_t) tmp64; + vecDst[1] = (q31_t)tmp64; scale = 26 + (vecSignBits[3] >> 1); tmp64 = asrl(vecTmpLL[1], scale); - vecDst[3] = (q31_t) tmp64; + vecDst[3] = (q31_t)tmp64; /* * set negative values to 0 */ @@ -677,9 +621,9 @@ __STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) __STATIC_INLINE q15x8_t FAST_VSQRT_Q15(q15x8_t vecIn) { - q31x4_t vecTmpLev, vecTmpLodd, vecSignL; - q15x8_t vecTmp0, vecTmp1; - q15x8_t vecNrm, vecDst, vecIdx, vecSignBits; + q31x4_t vecTmpLev, vecTmpLodd, vecSignL; + q15x8_t vecTmp0, vecTmp1; + q15x8_t vecNrm, vecDst, vecIdx, vecSignBits; vecDst = vuninitializedq_s16(); @@ -742,7 +686,7 @@ __STATIC_INLINE q15x8_t FAST_VSQRT_Q15(q15x8_t vecIn) #endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI) */ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math.h index 0e9ca5997e..8a7b25cfa3 100644 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math.h @@ -23,18 +23,16 @@ * limitations under the License. */ - #ifndef ARM_MATH_H #define ARM_MATH_H - #include "arm_math_types.h" #include "arm_math_memory.h" #include "dsp/none.h" #include "dsp/utils.h" -#include "dsp/basic_math_functions.h" +#include "dsp/basic_math_functions.h" #include "dsp/interpolation_functions.h" #include "dsp/bayes_functions.h" #include "dsp/matrix_functions.h" @@ -50,28 +48,17 @@ #include "dsp/quaternion_math_functions.h" #include "dsp/window_functions.h" - - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - - //#define TABLE_SPACING_Q31 0x400000 //#define TABLE_SPACING_Q15 0x80 - - - - -#ifdef __cplusplus +#ifdef __cplusplus } #endif - #endif /* _ARM_MATH_H */ /** diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_f16.h old mode 100755 new mode 100644 index 34ca0e542f..2398a44135 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_f16.h @@ -28,9 +28,8 @@ #include "arm_math.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #include "arm_math_types_f16.h" @@ -50,10 +49,8 @@ extern "C" #include "dsp/transform_functions_f16.h" #include "dsp/filtering_functions_f16.h" -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif /* _ARM_MATH_F16_H */ - - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_memory.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_memory.h old mode 100755 new mode 100644 index d4b4c3323a..55820e37d4 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_memory.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_memory.h @@ -29,62 +29,57 @@ #include "arm_math_types.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** @brief definition to read/write two 16 bit values. @deprecated */ -#if defined ( __CC_ARM ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define __SIMD32_TYPE int32_t -#elif defined ( __GNUC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __ICCARM__ ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __TI_ARM__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __CSMC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __TASKING__ ) - #define __SIMD32_TYPE __un(aligned) int32_t -#elif defined(_MSC_VER ) - #define __SIMD32_TYPE int32_t +#if defined(__CC_ARM) +#define __SIMD32_TYPE int32_t __packed +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define __SIMD32_TYPE int32_t +#elif defined(__GNUC__) +#define __SIMD32_TYPE int32_t +#elif defined(__ICCARM__) +#define __SIMD32_TYPE int32_t __packed +#elif defined(__TI_ARM__) +#define __SIMD32_TYPE int32_t +#elif defined(__CSMC__) +#define __SIMD32_TYPE int32_t +#elif defined(__TASKING__) +#define __SIMD32_TYPE __un(aligned) int32_t +#elif defined(_MSC_VER) +#define __SIMD32_TYPE int32_t #else - #error Unknown compiler +#error Unknown compiler #endif -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) -#define __SIMD64(addr) (*( int64_t **) & (addr)) - +#define __SIMD32(addr) (*(__SIMD32_TYPE **)&(addr)) +#define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *)(addr)) +#define __SIMD64(addr) (*(int64_t **)&(addr)) /* SIMD replacement */ - /** @brief Read 2 Q15 from Q15 pointer. @param[in] pQ15 points to input value @return Q31 value */ -__STATIC_FORCEINLINE q31_t read_q15x2 ( - q15_t const * pQ15) +__STATIC_FORCEINLINE q31_t read_q15x2(q15_t const *pQ15) { - q31_t val; + q31_t val; #ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, pQ15, 4); + memcpy(&val, pQ15, 4); #else - val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ; + val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF); #endif - return (val); + return (val); } /** @@ -106,19 +101,17 @@ __STATIC_FORCEINLINE q31_t read_q15x2 ( @param[in] pQ15 points to input value @param[in] value Q31 value */ -__STATIC_FORCEINLINE void write_q15x2_ia ( - q15_t ** pQ15, - q31_t value) +__STATIC_FORCEINLINE void write_q15x2_ia(q15_t **pQ15, q31_t value) { - q31_t val = value; + q31_t val = value; #ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ15, &val, 4); + memcpy(*pQ15, &val, 4); #else - (*pQ15)[0] = (q15_t)(val & 0x0FFFF); - (*pQ15)[1] = (q15_t)((val >> 16) & 0x0FFFF); + (*pQ15)[0] = (q15_t)(val & 0x0FFFF); + (*pQ15)[1] = (q15_t)((val >> 16) & 0x0FFFF); #endif - *pQ15 += 2; + *pQ15 += 2; } /** @@ -126,37 +119,34 @@ __STATIC_FORCEINLINE void write_q15x2_ia ( @param[in] pQ15 points to input value @param[in] value Q31 value */ -__STATIC_FORCEINLINE void write_q15x2 ( - q15_t * pQ15, - q31_t value) +__STATIC_FORCEINLINE void write_q15x2(q15_t *pQ15, q31_t value) { - q31_t val = value; + q31_t val = value; #ifdef __ARM_FEATURE_UNALIGNED - memcpy (pQ15, &val, 4); + memcpy(pQ15, &val, 4); #else - pQ15[0] = (q15_t)(val & 0x0FFFF); - pQ15[1] = (q15_t)(val >> 16); + pQ15[0] = (q15_t)(val & 0x0FFFF); + pQ15[1] = (q15_t)(val >> 16); #endif } - /** @brief Read 4 Q7 from Q7 pointer @param[in] pQ7 points to input value @return Q31 value */ -__STATIC_FORCEINLINE q31_t read_q7x4 ( - q7_t const * pQ7) +__STATIC_FORCEINLINE q31_t read_q7x4(q7_t const *pQ7) { - q31_t val; + q31_t val; #ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, pQ7, 4); + memcpy(&val, pQ7, 4); #else - val =((pQ7[3] & 0x0FF) << 24) | ((pQ7[2] & 0x0FF) << 16) | ((pQ7[1] & 0x0FF) << 8) | (pQ7[0] & 0x0FF); -#endif - return (val); + val = ((pQ7[3] & 0x0FF) << 24) | ((pQ7[2] & 0x0FF) << 16) | ((pQ7[1] & 0x0FF) << 8) | + (pQ7[0] & 0x0FF); +#endif + return (val); } /** @@ -178,25 +168,22 @@ __STATIC_FORCEINLINE q31_t read_q7x4 ( @param[in] pQ7 points to input value @param[in] value Q31 value */ -__STATIC_FORCEINLINE void write_q7x4_ia ( - q7_t ** pQ7, - q31_t value) +__STATIC_FORCEINLINE void write_q7x4_ia(q7_t **pQ7, q31_t value) { - q31_t val = value; + q31_t val = value; #ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ7, &val, 4); + memcpy(*pQ7, &val, 4); #else - (*pQ7)[0] = (q7_t)(val & 0x0FF); - (*pQ7)[1] = (q7_t)((val >> 8) & 0x0FF); - (*pQ7)[2] = (q7_t)((val >> 16) & 0x0FF); - (*pQ7)[3] = (q7_t)((val >> 24) & 0x0FF); + (*pQ7)[0] = (q7_t)(val & 0x0FF); + (*pQ7)[1] = (q7_t)((val >> 8) & 0x0FF); + (*pQ7)[2] = (q7_t)((val >> 16) & 0x0FF); + (*pQ7)[3] = (q7_t)((val >> 24) & 0x0FF); #endif - *pQ7 += 4; + *pQ7 += 4; } - -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types.h old mode 100755 new mode 100644 index 74ae8485f7..b0a42274a1 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types.h @@ -31,261 +31,245 @@ #include "arm_dsp_config.h" #endif -#ifndef ARM_DSP_ATTRIBUTE -#define ARM_DSP_ATTRIBUTE +#ifndef ARM_DSP_ATTRIBUTE +#define ARM_DSP_ATTRIBUTE #endif -#ifndef ARM_DSP_TABLE_ATTRIBUTE -#define ARM_DSP_TABLE_ATTRIBUTE +#ifndef ARM_DSP_TABLE_ATTRIBUTE +#define ARM_DSP_TABLE_ATTRIBUTE #endif -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) +#if defined(__CC_ARM) -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#elif defined ( __APPLE_CC__ ) - #pragma GCC diagnostic ignored "-Wold-style-cast" +#elif defined(__APPLE_CC__) +#pragma GCC diagnostic ignored "-Wold-style-cast" #elif defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wsign-conversion" - #pragma GCC diagnostic ignored "-Wconversion" - #pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wsign-conversion" - #pragma GCC diagnostic ignored "-Wconversion" - #pragma GCC diagnostic ignored "-Wunused-parameter" - // Disable some code having issue with GCC - #define ARM_DSP_BUILT_WITH_GCC +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" +// Disable some code having issue with GCC +#define ARM_DSP_BUILT_WITH_GCC -#elif defined ( __ICCARM__ ) +#elif defined(__ICCARM__) -#elif defined ( __TI_ARM__ ) +#elif defined(__TI_ARM__) -#elif defined ( __CSMC__ ) +#elif defined(__CSMC__) -#elif defined ( __TASKING__ ) +#elif defined(__TASKING__) -#elif defined ( _MSC_VER ) +#elif defined(_MSC_VER) #else - #error Unknown compiler +#error Unknown compiler #endif - /* Included for instrinsics definitions */ -#if defined (_MSC_VER ) +#if defined(_MSC_VER) #include #define __STATIC_FORCEINLINE static __forceinline #define __STATIC_INLINE static __inline #define __ALIGNED(x) __declspec(align(x)) #define __WEAK -#elif defined ( __APPLE_CC__ ) +#elif defined(__APPLE_CC__) #include -#define __ALIGNED(x) __attribute__((aligned(x))) -#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) +#define __ALIGNED(x) __attribute__((aligned(x))) +#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) #define __STATIC_INLINE static inline #define __WEAK -#elif defined (__GNUC_PYTHON__) +#elif defined(__GNUC_PYTHON__) #include -#define __ALIGNED(x) __attribute__((aligned(x))) -#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) +#define __ALIGNED(x) __attribute__((aligned(x))) +#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) #define __STATIC_INLINE static inline #define __WEAK #else #include "cmsis_compiler.h" #endif - - #include #include #include #include /* evaluate ARM DSP feature */ -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - #define ARM_MATH_DSP 1 +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) +#define ARM_MATH_DSP 1 #endif #if defined(ARM_MATH_NEON) - #if defined(_MSC_VER) && defined(_M_ARM64EC) - #include - #else - #include - #endif - #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && __ARM_FEATURE_FP16_VECTOR_ARITHMETIC - #if !defined(ARM_MATH_NEON_FLOAT16) - #define ARM_MATH_NEON_FLOAT16 - #endif - #endif +#if defined(_MSC_VER) && defined(_M_ARM64EC) +#include +#else +#include +#endif +#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && __ARM_FEATURE_FP16_VECTOR_ARITHMETIC +#if !defined(ARM_MATH_NEON_FLOAT16) +#define ARM_MATH_NEON_FLOAT16 +#endif +#endif #endif #if !defined(ARM_MATH_AUTOVECTORIZE) - #if defined(__ARM_FEATURE_MVE) #if __ARM_FEATURE_MVE - #if !defined(ARM_MATH_MVEI) - #define ARM_MATH_MVEI - #endif +#if !defined(ARM_MATH_MVEI) +#define ARM_MATH_MVEI +#endif #endif #if defined(__ARM_FEATURE_MVE) && (__ARM_FEATURE_MVE & 2) - #if !defined(ARM_MATH_MVEF) - #define ARM_MATH_MVEF - #endif - #if !defined(ARM_MATH_MVE_FLOAT16) - #define ARM_MATH_MVE_FLOAT16 - #endif +#if !defined(ARM_MATH_MVEF) +#define ARM_MATH_MVEF +#endif +#if !defined(ARM_MATH_MVE_FLOAT16) +#define ARM_MATH_MVE_FLOAT16 +#endif #endif #endif /* defined (__ARM_FEATURE_MVE) */ #endif /* !defined (ARM_MATH_AUTOVECTORIZE) */ +#if defined(ARM_MATH_HELIUM) +#if !defined(ARM_MATH_MVEF) +#define ARM_MATH_MVEF +#endif -#if defined (ARM_MATH_HELIUM) - #if !defined(ARM_MATH_MVEF) - #define ARM_MATH_MVEF - #endif - - #if !defined(ARM_MATH_MVEI) - #define ARM_MATH_MVEI - #endif - - #if !defined(ARM_MATH_MVE_FLOAT16) - #define ARM_MATH_MVE_FLOAT16 - #endif -#endif - - - -#if defined ( __CC_ARM ) - /* Enter low optimization region - place directly above function definition */ - #if defined( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("push") \ - _Pragma ("O1") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_EXIT \ - _Pragma ("pop") - #else - #define LOW_OPTIMIZATION_EXIT - #endif - - /* Enter low optimization region - place directly above function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __APPLE_CC__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __GNUC__ ) - #define LOW_OPTIMIZATION_ENTER \ - __attribute__(( optimize("-O1") )) - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __ICCARM__ ) - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define LOW_OPTIMIZATION_EXIT - - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TI_ARM__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __CSMC__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TASKING__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT +#if !defined(ARM_MATH_MVEI) +#define ARM_MATH_MVEI #endif +#if !defined(ARM_MATH_MVE_FLOAT16) +#define ARM_MATH_MVE_FLOAT16 +#endif +#endif + +#if defined(__CC_ARM) +/* Enter low optimization region - place directly above function definition */ +#if defined(__ARM_ARCH_7EM__) +#define LOW_OPTIMIZATION_ENTER _Pragma("push") _Pragma("O1") +#else +#define LOW_OPTIMIZATION_ENTER +#endif + +/* Exit low optimization region - place directly after end of function definition */ +#if defined(__ARM_ARCH_7EM__) +#define LOW_OPTIMIZATION_EXIT _Pragma("pop") +#else +#define LOW_OPTIMIZATION_EXIT +#endif + +/* Enter low optimization region - place directly above function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER + +/* Exit low optimization region - place directly after end of function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__APPLE_CC__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__GNUC__) +#define LOW_OPTIMIZATION_ENTER __attribute__((optimize("-O1"))) +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__ICCARM__) +/* Enter low optimization region - place directly above function definition */ +#if defined(__ARM_ARCH_7EM__) +#define LOW_OPTIMIZATION_ENTER _Pragma("optimize=low") +#else +#define LOW_OPTIMIZATION_ENTER +#endif +/* Exit low optimization region - place directly after end of function definition */ +#define LOW_OPTIMIZATION_EXIT + +/* Enter low optimization region - place directly above function definition */ +#if defined(__ARM_ARCH_7EM__) +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER _Pragma("optimize=low") +#else +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#endif + +/* Exit low optimization region - place directly after end of function definition */ +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__TI_ARM__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__CSMC__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(__TASKING__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined(_MSC_VER) || defined(__GNUC_PYTHON__) +#define LOW_OPTIMIZATION_ENTER +#define LOW_OPTIMIZATION_EXIT +#define IAR_ONLY_LOW_OPTIMIZATION_ENTER +#define IAR_ONLY_LOW_OPTIMIZATION_EXIT +#endif /* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) +#if defined(__CC_ARM) -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) -#elif defined ( __APPLE_CC__ ) +#elif defined(__APPLE_CC__) -#elif defined ( __GNUC__ ) +#elif defined(__GNUC__) #pragma GCC diagnostic pop -#elif defined ( __ICCARM__ ) +#elif defined(__ICCARM__) -#elif defined ( __TI_ARM__ ) +#elif defined(__TI_ARM__) -#elif defined ( __CSMC__ ) +#elif defined(__CSMC__) -#elif defined ( __TASKING__ ) +#elif defined(__TASKING__) -#elif defined ( _MSC_VER ) +#elif defined(_MSC_VER) #else - #error Unknown compiler +#error Unknown compiler #endif -#ifdef __cplusplus +#ifdef __cplusplus } #endif @@ -297,9 +281,8 @@ extern "C" #error("-DARM_DSP_CONFIG_TABLES no more supported. Use the new initialization functions to let the linker optimize the code size.") #endif -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** @@ -307,338 +290,327 @@ extern "C" * @{ */ - /** +/** * @brief 8-bit fractional data type in 1.7 format. */ - typedef int8_t q7_t; +typedef int8_t q7_t; - /** +/** * @brief 16-bit fractional data type in 1.15 format. */ - typedef int16_t q15_t; +typedef int16_t q15_t; - /** +/** * @brief 32-bit fractional data type in 1.31 format. */ - typedef int32_t q31_t; +typedef int32_t q31_t; - /** +/** * @brief 64-bit fractional data type in 1.63 format. */ - typedef int64_t q63_t; +typedef int64_t q63_t; - /** +/** * @brief 32-bit floating-point type definition. */ #if !defined(__ICCARM__) || !(__ARM_FEATURE_MVE & 2) - typedef float float32_t; +typedef float float32_t; #endif - /** +/** * @brief 64-bit floating-point type definition. */ - typedef double float64_t; +typedef double float64_t; - /** +/** * @brief vector types */ -#if defined(ARM_MATH_NEON) || (defined (ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)) +#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)) - /** +/** * @brief 64-bit fractional 128-bit vector data type in 1.63 format */ - typedef int64x2_t q63x2_t; +typedef int64x2_t q63x2_t; - /** +/** * @brief 32-bit fractional 128-bit vector data type in 1.31 format. */ - typedef int32x4_t q31x4_t; +typedef int32x4_t q31x4_t; - /** +/** * @brief 16-bit fractional 128-bit vector data type with 16-bit alignment in 1.15 format. */ - typedef __ALIGNED(2) int16x8_t q15x8_t; +typedef __ALIGNED(2) int16x8_t q15x8_t; - /** +/** * @brief 8-bit fractional 128-bit vector data type with 8-bit alignment in 1.7 format. */ - typedef __ALIGNED(1) int8x16_t q7x16_t; +typedef __ALIGNED(1) int8x16_t q7x16_t; - /** +/** * @brief 32-bit fractional 128-bit vector pair data type in 1.31 format. */ - typedef int32x4x2_t q31x4x2_t; +typedef int32x4x2_t q31x4x2_t; - /** +/** * @brief 32-bit fractional 128-bit vector quadruplet data type in 1.31 format. */ - typedef int32x4x4_t q31x4x4_t; +typedef int32x4x4_t q31x4x4_t; - /** +/** * @brief 16-bit fractional 128-bit vector pair data type in 1.15 format. */ - typedef int16x8x2_t q15x8x2_t; +typedef int16x8x2_t q15x8x2_t; - /** +/** * @brief 16-bit fractional 128-bit vector quadruplet data type in 1.15 format. */ - typedef int16x8x4_t q15x8x4_t; +typedef int16x8x4_t q15x8x4_t; - /** +/** * @brief 8-bit fractional 128-bit vector pair data type in 1.7 format. */ - typedef int8x16x2_t q7x16x2_t; +typedef int8x16x2_t q7x16x2_t; - /** +/** * @brief 8-bit fractional 128-bit vector quadruplet data type in 1.7 format. */ - typedef int8x16x4_t q7x16x4_t; +typedef int8x16x4_t q7x16x4_t; - /** +/** * @brief 32-bit fractional data type in 9.23 format. */ - typedef int32_t q23_t; +typedef int32_t q23_t; - /** +/** * @brief 32-bit fractional 128-bit vector data type in 9.23 format. */ - typedef int32x4_t q23x4_t; +typedef int32x4_t q23x4_t; - /** +/** * @brief 64-bit status 128-bit vector data type. */ - typedef int64x2_t status64x2_t; +typedef int64x2_t status64x2_t; - /** +/** * @brief 32-bit status 128-bit vector data type. */ - typedef int32x4_t status32x4_t; +typedef int32x4_t status32x4_t; - /** +/** * @brief 16-bit status 128-bit vector data type. */ - typedef int16x8_t status16x8_t; +typedef int16x8_t status16x8_t; - /** +/** * @brief 8-bit status 128-bit vector data type. */ - typedef int8x16_t status8x16_t; - +typedef int8x16_t status8x16_t; #endif -#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ +#if defined(ARM_MATH_NEON) || \ + (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ - /** +/** * @brief 32-bit floating-point 128-bit vector type */ - typedef float32x4_t f32x4_t; +typedef float32x4_t f32x4_t; - /** +/** * @brief 32-bit floating-point 128-bit vector pair data type */ - typedef float32x4x2_t f32x4x2_t; +typedef float32x4x2_t f32x4x2_t; - /** +/** * @brief 32-bit floating-point 128-bit vector quadruplet data type */ - typedef float32x4x4_t f32x4x4_t; +typedef float32x4x4_t f32x4x4_t; - /** +/** * @brief 32-bit ubiquitous 128-bit vector data type */ - typedef union _any32x4_t - { - float32x4_t f; - int32x4_t i; - } any32x4_t; +typedef union _any32x4_t { + float32x4_t f; + int32x4_t i; +} any32x4_t; #endif #if defined(ARM_MATH_NEON) - /** +/** * @brief 32-bit fractional 64-bit vector data type in 1.31 format. */ - typedef int32x2_t q31x2_t; +typedef int32x2_t q31x2_t; - /** +/** * @brief 16-bit fractional 64-bit vector data type in 1.15 format. */ - typedef __ALIGNED(2) int16x4_t q15x4_t; +typedef __ALIGNED(2) int16x4_t q15x4_t; - /** +/** * @brief 8-bit fractional 64-bit vector data type in 1.7 format. */ - typedef __ALIGNED(1) int8x8_t q7x8_t; +typedef __ALIGNED(1) int8x8_t q7x8_t; - /** +/** * @brief 32-bit float 64-bit vector data type. */ - typedef float32x2_t f32x2_t; +typedef float32x2_t f32x2_t; - /** +/** * @brief 32-bit floating-point 128-bit vector triplet data type */ - typedef float32x4x3_t f32x4x3_t; +typedef float32x4x3_t f32x4x3_t; - /** +/** * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format */ - typedef int32x4x3_t q31x4x3_t; +typedef int32x4x3_t q31x4x3_t; - /** +/** * @brief 16-bit fractional 128-bit vector triplet data type in 1.15 format */ - typedef int16x8x3_t q15x8x3_t; +typedef int16x8x3_t q15x8x3_t; - /** +/** * @brief 8-bit fractional 128-bit vector triplet data type in 1.7 format */ - typedef int8x16x3_t q7x16x3_t; +typedef int8x16x3_t q7x16x3_t; - /** +/** * @brief 32-bit floating-point 64-bit vector pair data type */ - typedef float32x2x2_t f32x2x2_t; +typedef float32x2x2_t f32x2x2_t; - /** +/** * @brief 32-bit floating-point 64-bit vector triplet data type */ - typedef float32x2x3_t f32x2x3_t; +typedef float32x2x3_t f32x2x3_t; - /** +/** * @brief 32-bit floating-point 64-bit vector quadruplet data type */ - typedef float32x2x4_t f32x2x4_t; +typedef float32x2x4_t f32x2x4_t; - /** +/** * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format */ - typedef int32x2x2_t q31x2x2_t; +typedef int32x2x2_t q31x2x2_t; - /** +/** * @brief 32-bit fractional 64-bit vector triplet data type in 1.31 format */ - typedef int32x2x3_t q31x2x3_t; +typedef int32x2x3_t q31x2x3_t; - /** +/** * @brief 32-bit fractional 64-bit vector quadruplet data type in 1.31 format */ - typedef int32x4x3_t q31x2x4_t; +typedef int32x4x3_t q31x2x4_t; - /** +/** * @brief 16-bit fractional 64-bit vector pair data type in 1.15 format */ - typedef int16x4x2_t q15x4x2_t; +typedef int16x4x2_t q15x4x2_t; - /** +/** * @brief 16-bit fractional 64-bit vector triplet data type in 1.15 format */ - typedef int16x4x2_t q15x4x3_t; +typedef int16x4x2_t q15x4x3_t; - /** +/** * @brief 16-bit fractional 64-bit vector quadruplet data type in 1.15 format */ - typedef int16x4x3_t q15x4x4_t; +typedef int16x4x3_t q15x4x4_t; - /** +/** * @brief 8-bit fractional 64-bit vector pair data type in 1.7 format */ - typedef int8x8x2_t q7x8x2_t; +typedef int8x8x2_t q7x8x2_t; - /** +/** * @brief 8-bit fractional 64-bit vector triplet data type in 1.7 format */ - typedef int8x8x3_t q7x8x3_t; +typedef int8x8x3_t q7x8x3_t; - /** +/** * @brief 8-bit fractional 64-bit vector quadruplet data type in 1.7 format */ - typedef int8x8x4_t q7x8x4_t; +typedef int8x8x4_t q7x8x4_t; - /** +/** * @brief 32-bit ubiquitous 64-bit vector data type */ - typedef union _any32x2_t - { - float32x2_t f; - int32x2_t i; - } any32x2_t; +typedef union _any32x2_t { + float32x2_t f; + int32x2_t i; +} any32x2_t; - /** +/** * @brief 32-bit status 64-bit vector data type. */ - typedef int32x4_t status32x2_t; +typedef int32x4_t status32x2_t; - /** +/** * @brief 16-bit status 64-bit vector data type. */ - typedef int16x8_t status16x4_t; +typedef int16x8_t status16x4_t; - /** +/** * @brief 8-bit status 64-bit vector data type. */ - typedef int8x16_t status8x8_t; +typedef int8x16_t status8x8_t; #endif - /** +/** * @brief Error status returned by some functions in the library. */ - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ - ARM_MATH_TEST_FAILURE = -6, /**< Test Failed */ - ARM_MATH_DECOMPOSITION_FAILURE = -7 /**< Decomposition Failed */ - } arm_status; +typedef enum { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ + ARM_MATH_TEST_FAILURE = -6, /**< Test Failed */ + ARM_MATH_DECOMPOSITION_FAILURE = -7 /**< Decomposition Failed */ +} arm_status; /** * @} // endgroup generic */ +#define F64_MAX ((float64_t)DBL_MAX) +#define F32_MAX ((float32_t)FLT_MAX) -#define F64_MAX ((float64_t)DBL_MAX) -#define F32_MAX ((float32_t)FLT_MAX) - - - -#define F64_MIN (-DBL_MAX) -#define F32_MIN (-FLT_MAX) - - - -#define F64_ABSMAX ((float64_t)DBL_MAX) -#define F32_ABSMAX ((float32_t)FLT_MAX) - - +#define F64_MIN (-DBL_MAX) +#define F32_MIN (-FLT_MAX) -#define F64_ABSMIN ((float64_t)0.0) -#define F32_ABSMIN ((float32_t)0.0) +#define F64_ABSMAX ((float64_t)DBL_MAX) +#define F32_ABSMAX ((float32_t)FLT_MAX) +#define F64_ABSMIN ((float64_t)0.0) +#define F32_ABSMIN ((float32_t)0.0) -#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_MAX ((q15_t)(0x7FFF)) -#define Q7_MAX ((q7_t)(0x7F)) -#define Q31_MIN ((q31_t)(0x80000000L)) -#define Q15_MIN ((q15_t)(0x8000)) -#define Q7_MIN ((q7_t)(0x80)) +#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) +#define Q15_MAX ((q15_t)(0x7FFF)) +#define Q7_MAX ((q7_t)(0x7F)) +#define Q31_MIN ((q31_t)(0x80000000L)) +#define Q15_MIN ((q15_t)(0x8000)) +#define Q7_MIN ((q7_t)(0x80)) -#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_ABSMAX ((q15_t)(0x7FFF)) -#define Q7_ABSMAX ((q7_t)(0x7F)) -#define Q31_ABSMIN ((q31_t)0) -#define Q15_ABSMIN ((q15_t)0) -#define Q7_ABSMIN ((q7_t)0) +#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) +#define Q15_ABSMAX ((q15_t)(0x7FFF)) +#define Q7_ABSMAX ((q7_t)(0x7F)) +#define Q31_ABSMIN ((q31_t)0) +#define Q15_ABSMIN ((q15_t)0) +#define Q7_ABSMIN ((q7_t)0) - /* Dimension C vector space */ - #define CMPLX_DIM 2 +/* Dimension C vector space */ +#define CMPLX_DIM 2 -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types_f16.h old mode 100755 new mode 100644 index 26b8feeec9..be4a5a0616 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_math_types_f16.h @@ -28,12 +28,11 @@ #include "arm_math_types.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif -#if !defined( __CC_ARM ) +#if !defined(__CC_ARM) /** * @brief 16-bit floating-point type definition. @@ -49,97 +48,93 @@ If it is not available, f16 version of the kernels won't be built. */ -#if defined(__ARM_FEATURE_MVE) && (__ARM_FEATURE_MVE & 2) +#if defined(__ARM_FEATURE_MVE) && (__ARM_FEATURE_MVE & 2) /* When Vector float16, this flag is always defined and can't be disabled */ - #define ARM_FLOAT16_SUPPORTED +#define ARM_FLOAT16_SUPPORTED #else - #if !defined(DISABLEFLOAT16) - #if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE) - typedef __fp16 float16_t; - #define ARM_FLOAT16_SUPPORTED - #endif - #endif +#if !defined(DISABLEFLOAT16) +#if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE) +typedef __fp16 float16_t; +#define ARM_FLOAT16_SUPPORTED +#endif +#endif #endif -#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ +#if defined(ARM_MATH_NEON) || \ + (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ #if defined(ARM_MATH_MVE_FLOAT16) || defined(ARM_MATH_NEON_FLOAT16) - /** +/** * @brief 16-bit floating-point 128-bit vector data type */ - typedef __ALIGNED(2) float16x8_t f16x8_t; +typedef __ALIGNED(2) float16x8_t f16x8_t; - /** +/** * @brief 16-bit floating-point 128-bit vector pair data type */ - typedef float16x8x2_t f16x8x2_t; +typedef float16x8x2_t f16x8x2_t; - /** +/** * @brief 16-bit floating-point 128-bit vector quadruplet data type */ - typedef float16x8x4_t f16x8x4_t; +typedef float16x8x4_t f16x8x4_t; - /** +/** * @brief 16-bit ubiquitous 128-bit vector data type */ - typedef union _any16x8_t - { - float16x8_t f; - int16x8_t i; - } any16x8_t; +typedef union _any16x8_t { + float16x8_t f; + int16x8_t i; +} any16x8_t; #endif #endif #if defined(ARM_MATH_NEON) - #if defined(ARM_MATH_NEON_FLOAT16) - /** +/** * @brief 16-bit float 64-bit vector data type. */ - typedef __ALIGNED(2) float16x4_t f16x4_t; +typedef __ALIGNED(2) float16x4_t f16x4_t; - /** +/** * @brief 16-bit floating-point 128-bit vector triplet data type */ - typedef float16x8x3_t f16x8x3_t; +typedef float16x8x3_t f16x8x3_t; - /** +/** * @brief 16-bit floating-point 64-bit vector pair data type */ - typedef float16x4x2_t f16x4x2_t; +typedef float16x4x2_t f16x4x2_t; - /** +/** * @brief 16-bit floating-point 64-bit vector triplet data type */ - typedef float16x4x3_t f16x4x3_t; +typedef float16x4x3_t f16x4x3_t; - /** +/** * @brief 16-bit floating-point 64-bit vector quadruplet data type */ - typedef float16x4x4_t f16x4x4_t; +typedef float16x4x4_t f16x4x4_t; - /** +/** * @brief 16-bit ubiquitous 64-bit vector data type */ - typedef union _any16x4_t - { - float16x4_t f; - int16x4_t i; - } any16x4_t; +typedef union _any16x4_t { + float16x4_t f; + int16x4_t i; +} any16x4_t; #endif #endif - - #if defined(ARM_FLOAT16_SUPPORTED) #if defined(__ICCARM__) -#define F16INFINITY ((float16_t) INFINITY) +#define F16INFINITY ((float16_t)INFINITY) #else @@ -147,16 +142,16 @@ won't be built. #endif -#define F16_MAX ((float16_t)__FLT16_MAX__) -#define F16_MIN (-(_Float16)__FLT16_MAX__) +#define F16_MAX ((float16_t)__FLT16_MAX__) +#define F16_MIN (-(_Float16)__FLT16_MAX__) -#define F16_ABSMAX ((float16_t)__FLT16_MAX__) -#define F16_ABSMIN ((float16_t)0.0f16) +#define F16_ABSMAX ((float16_t)__FLT16_MAX__) +#define F16_ABSMIN ((float16_t)0.0f16) #endif /* ARM_FLOAT16_SUPPORTED*/ #endif /* !defined( __CC_ARM ) */ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables.h old mode 100755 new mode 100644 index aa58d7a92c..6628a7f2fa --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables.h @@ -27,23 +27,17 @@ * limitations under the License. */ - #ifndef ARM_MVE_TABLES_H - #define ARM_MVE_TABLES_H +#ifndef ARM_MVE_TABLES_H +#define ARM_MVE_TABLES_H #include "arm_math_types.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - - #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - - extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_f32[2]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_f32[2]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_f32[2]; @@ -51,7 +45,6 @@ extern const float32_t rearranged_twiddle_stride1_16_f32[8]; extern const float32_t rearranged_twiddle_stride2_16_f32[8]; extern const float32_t rearranged_twiddle_stride3_16_f32[8]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_f32[3]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_f32[3]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_f32[3]; @@ -59,7 +52,6 @@ extern const float32_t rearranged_twiddle_stride1_64_f32[40]; extern const float32_t rearranged_twiddle_stride2_64_f32[40]; extern const float32_t rearranged_twiddle_stride3_64_f32[40]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_f32[4]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_f32[4]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_f32[4]; @@ -67,7 +59,6 @@ extern const float32_t rearranged_twiddle_stride1_256_f32[168]; extern const float32_t rearranged_twiddle_stride2_256_f32[168]; extern const float32_t rearranged_twiddle_stride3_256_f32[168]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_f32[5]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_f32[5]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_f32[5]; @@ -75,7 +66,6 @@ extern const float32_t rearranged_twiddle_stride1_1024_f32[680]; extern const float32_t rearranged_twiddle_stride2_1024_f32[680]; extern const float32_t rearranged_twiddle_stride3_1024_f32[680]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_f32[6]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_f32[6]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_f32[6]; @@ -83,14 +73,9 @@ extern const float32_t rearranged_twiddle_stride1_4096_f32[2728]; extern const float32_t rearranged_twiddle_stride2_4096_f32[2728]; extern const float32_t rearranged_twiddle_stride3_4096_f32[2728]; - #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */ - - -#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - - +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_q31[2]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_q31[2]; @@ -99,7 +84,6 @@ extern const q31_t rearranged_twiddle_stride1_16_q31[8]; extern const q31_t rearranged_twiddle_stride2_16_q31[8]; extern const q31_t rearranged_twiddle_stride3_16_q31[8]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_q31[3]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_q31[3]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_q31[3]; @@ -107,7 +91,6 @@ extern const q31_t rearranged_twiddle_stride1_64_q31[40]; extern const q31_t rearranged_twiddle_stride2_64_q31[40]; extern const q31_t rearranged_twiddle_stride3_64_q31[40]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_q31[4]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_q31[4]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_q31[4]; @@ -115,7 +98,6 @@ extern const q31_t rearranged_twiddle_stride1_256_q31[168]; extern const q31_t rearranged_twiddle_stride2_256_q31[168]; extern const q31_t rearranged_twiddle_stride3_256_q31[168]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_q31[5]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_q31[5]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_q31[5]; @@ -123,7 +105,6 @@ extern const q31_t rearranged_twiddle_stride1_1024_q31[680]; extern const q31_t rearranged_twiddle_stride2_1024_q31[680]; extern const q31_t rearranged_twiddle_stride3_1024_q31[680]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_q31[6]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_q31[6]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_q31[6]; @@ -131,15 +112,9 @@ extern const q31_t rearranged_twiddle_stride1_4096_q31[2728]; extern const q31_t rearranged_twiddle_stride2_4096_q31[2728]; extern const q31_t rearranged_twiddle_stride3_4096_q31[2728]; - - #endif /* defined(ARM_MATH_MVEI) */ - - -#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - - +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_q15[2]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_q15[2]; @@ -148,7 +123,6 @@ extern const q15_t rearranged_twiddle_stride1_16_q15[8]; extern const q15_t rearranged_twiddle_stride2_16_q15[8]; extern const q15_t rearranged_twiddle_stride3_16_q15[8]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_q15[3]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_q15[3]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_q15[3]; @@ -156,7 +130,6 @@ extern const q15_t rearranged_twiddle_stride1_64_q15[40]; extern const q15_t rearranged_twiddle_stride2_64_q15[40]; extern const q15_t rearranged_twiddle_stride3_64_q15[40]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_q15[4]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_q15[4]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_q15[4]; @@ -164,7 +137,6 @@ extern const q15_t rearranged_twiddle_stride1_256_q15[168]; extern const q15_t rearranged_twiddle_stride2_256_q15[168]; extern const q15_t rearranged_twiddle_stride3_256_q15[168]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_q15[5]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_q15[5]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_q15[5]; @@ -172,7 +144,6 @@ extern const q15_t rearranged_twiddle_stride1_1024_q15[680]; extern const q15_t rearranged_twiddle_stride2_1024_q15[680]; extern const q15_t rearranged_twiddle_stride3_1024_q15[680]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_q15[6]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_q15[6]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_q15[6]; @@ -180,14 +151,10 @@ extern const q15_t rearranged_twiddle_stride1_4096_q15[2728]; extern const q15_t rearranged_twiddle_stride2_4096_q15[2728]; extern const q15_t rearranged_twiddle_stride3_4096_q15[2728]; - #endif /* defined(ARM_MATH_MVEI) */ - - -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif /*_ARM_MVE_TABLES_H*/ - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables_f16.h old mode 100755 new mode 100644 index ae2824529a..f72b696992 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_mve_tables_f16.h @@ -27,23 +27,17 @@ * limitations under the License. */ - #ifndef ARM_MVE_TABLES_F16_H - #define ARM_MVE_TABLES_F16_H +#ifndef ARM_MVE_TABLES_F16_H +#define ARM_MVE_TABLES_F16_H #include "arm_math_types_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - - #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) - - extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_f16[2]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_f16[2]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_f16[2]; @@ -51,7 +45,6 @@ extern const float16_t rearranged_twiddle_stride1_16_f16[8]; extern const float16_t rearranged_twiddle_stride2_16_f16[8]; extern const float16_t rearranged_twiddle_stride3_16_f16[8]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_f16[3]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_f16[3]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_f16[3]; @@ -59,7 +52,6 @@ extern const float16_t rearranged_twiddle_stride1_64_f16[40]; extern const float16_t rearranged_twiddle_stride2_64_f16[40]; extern const float16_t rearranged_twiddle_stride3_64_f16[40]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_f16[4]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_f16[4]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_f16[4]; @@ -67,7 +59,6 @@ extern const float16_t rearranged_twiddle_stride1_256_f16[168]; extern const float16_t rearranged_twiddle_stride2_256_f16[168]; extern const float16_t rearranged_twiddle_stride3_256_f16[168]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_f16[5]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_f16[5]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_f16[5]; @@ -75,7 +66,6 @@ extern const float16_t rearranged_twiddle_stride1_1024_f16[680]; extern const float16_t rearranged_twiddle_stride2_1024_f16[680]; extern const float16_t rearranged_twiddle_stride3_1024_f16[680]; - extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_f16[6]; extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_f16[6]; extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_f16[6]; @@ -83,15 +73,10 @@ extern const float16_t rearranged_twiddle_stride1_4096_f16[2728]; extern const float16_t rearranged_twiddle_stride2_4096_f16[2728]; extern const float16_t rearranged_twiddle_stride3_4096_f16[2728]; - - #endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) */ - - -#ifdef __cplusplus +#ifdef __cplusplus } #endif #endif /*_ARM_MVE_TABLES_F16_H*/ - diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math.h old mode 100755 new mode 100644 index ec90802e09..fd3d1ad786 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math.h @@ -30,26 +30,23 @@ #include "arm_common_tables.h" #include "arm_helium_utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) -#define INV_NEWTON_INIT_F32 0x7EF127EA - -static const float32_t __logf_rng_f32=0.693147180f; +#define INV_NEWTON_INIT_F32 0x7EF127EA +static const float32_t __logf_rng_f32 = 0.693147180f; /* fast inverse approximation (3x newton) */ -__STATIC_INLINE f32x4_t vrecip_medprec_f32( - f32x4_t x) +__STATIC_INLINE f32x4_t vrecip_medprec_f32(f32x4_t x) { - q31x4_t m; - f32x4_t b; - any32x4_t xinv; - f32x4_t ax = vabsq(x); + q31x4_t m; + f32x4_t b; + any32x4_t xinv; + f32x4_t ax = vabsq(x); xinv.f = ax; m = 0x3F800000 - (xinv.i & 0x7F800000); @@ -76,13 +73,12 @@ __STATIC_INLINE f32x4_t vrecip_medprec_f32( } /* fast inverse approximation (4x newton) */ -__STATIC_INLINE f32x4_t vrecip_hiprec_f32( - f32x4_t x) +__STATIC_INLINE f32x4_t vrecip_hiprec_f32(f32x4_t x) { - q31x4_t m; - f32x4_t b; - any32x4_t xinv; - f32x4_t ax = vabsq(x); + q31x4_t m; + f32x4_t b; + any32x4_t xinv; + f32x4_t ax = vabsq(x); xinv.f = ax; @@ -112,8 +108,7 @@ __STATIC_INLINE f32x4_t vrecip_hiprec_f32( return xinv.f; } -__STATIC_INLINE f32x4_t vdiv_f32( - f32x4_t num, f32x4_t den) +__STATIC_INLINE f32x4_t vdiv_f32(f32x4_t num, f32x4_t den) { return vmulq(num, vrecip_hiprec_f32(den)); } @@ -125,27 +120,23 @@ __STATIC_INLINE f32x4_t vdiv_f32( @return destination f32 quad vector */ -__STATIC_INLINE f32x4_t vtaylor_polyq_f32( - f32x4_t x, - const float32_t * coeffs) +__STATIC_INLINE f32x4_t vtaylor_polyq_f32(f32x4_t x, const float32_t *coeffs) { - f32x4_t A = vfmasq(vdupq_n_f32(coeffs[4]), x, coeffs[0]); - f32x4_t B = vfmasq(vdupq_n_f32(coeffs[6]), x, coeffs[2]); - f32x4_t C = vfmasq(vdupq_n_f32(coeffs[5]), x, coeffs[1]); - f32x4_t D = vfmasq(vdupq_n_f32(coeffs[7]), x, coeffs[3]); - f32x4_t x2 = vmulq(x, x); - f32x4_t x4 = vmulq(x2, x2); - f32x4_t res = vfmaq(vfmaq_f32(A, B, x2), vfmaq_f32(C, D, x2), x4); + f32x4_t A = vfmasq(vdupq_n_f32(coeffs[4]), x, coeffs[0]); + f32x4_t B = vfmasq(vdupq_n_f32(coeffs[6]), x, coeffs[2]); + f32x4_t C = vfmasq(vdupq_n_f32(coeffs[5]), x, coeffs[1]); + f32x4_t D = vfmasq(vdupq_n_f32(coeffs[7]), x, coeffs[3]); + f32x4_t x2 = vmulq(x, x); + f32x4_t x4 = vmulq(x2, x2); + f32x4_t res = vfmaq(vfmaq_f32(A, B, x2), vfmaq_f32(C, D, x2), x4); return res; } -__STATIC_INLINE f32x4_t vmant_exp_f32( - f32x4_t x, - int32x4_t * e) +__STATIC_INLINE f32x4_t vmant_exp_f32(f32x4_t x, int32x4_t *e) { - any32x4_t r; - int32x4_t n; + any32x4_t r; + int32x4_t n; r.f = x; n = r.i >> 23; @@ -156,13 +147,12 @@ __STATIC_INLINE f32x4_t vmant_exp_f32( return r.f; } - __STATIC_INLINE f32x4_t vlogq_f32(f32x4_t vecIn) { - q31x4_t vecExpUnBiased; - f32x4_t vecTmpFlt0, vecTmpFlt1; - f32x4_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; - f32x4_t vecExpUnBiasedFlt; + q31x4_t vecExpUnBiased; + f32x4_t vecTmpFlt0, vecTmpFlt1; + f32x4_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; + f32x4_t vecExpUnBiasedFlt; /* * extract exponent @@ -217,18 +207,17 @@ __STATIC_INLINE f32x4_t vlogq_f32(f32x4_t vecIn) return vecAcc0; } -__STATIC_INLINE f32x4_t vexpq_f32( - f32x4_t x) +__STATIC_INLINE f32x4_t vexpq_f32(f32x4_t x) { // Perform range reduction [-log(2),log(2)] - int32x4_t m = vcvtq_s32_f32(vmulq_n_f32(x, 1.4426950408f)); - f32x4_t val = vfmsq_f32(x, vcvtq_f32_s32(m), vdupq_n_f32(0.6931471805f)); + int32x4_t m = vcvtq_s32_f32(vmulq_n_f32(x, 1.4426950408f)); + f32x4_t val = vfmsq_f32(x, vcvtq_f32_s32(m), vdupq_n_f32(0.6931471805f)); // Polynomial Approximation - f32x4_t poly = vtaylor_polyq_f32(val, exp_tab); + f32x4_t poly = vtaylor_polyq_f32(val, exp_tab); // Reconstruct - poly = (f32x4_t) (vqaddq_s32((q31x4_t) (poly), vqshlq_n_s32(m, 23))); + poly = (f32x4_t)(vqaddq_s32((q31x4_t)(poly), vqshlq_n_s32(m, 23))); poly = vdupq_m(poly, 0.0f, vcmpltq_n_s32(m, -126)); return poly; @@ -236,7 +225,7 @@ __STATIC_INLINE f32x4_t vexpq_f32( __STATIC_INLINE f32x4_t arm_vec_exponent_f32(f32x4_t x, int32_t nb) { - f32x4_t r = x; + f32x4_t r = x; nb--; while (nb > 0) { r = vmulq(r, x); @@ -247,8 +236,8 @@ __STATIC_INLINE f32x4_t arm_vec_exponent_f32(f32x4_t x, int32_t nb) __STATIC_INLINE f32x4_t vrecip_f32(f32x4_t vecIn) { - f32x4_t vecSx, vecW, vecTmp; - any32x4_t v; + f32x4_t vecSx, vecW, vecTmp; + any32x4_t v; vecSx = vabsq(vecIn); @@ -265,7 +254,7 @@ __STATIC_INLINE f32x4_t vrecip_f32(f32x4_t vecIn) vecTmp = vfmasq(vecW, vecTmp, 56.0f); vecTmp = vfmasq(vecW, vecTmp, -28.0f); vecTmp = vfmasq(vecW, vecTmp, 8.0f); - v.f = vmulq(v.f, vecTmp); + v.f = vmulq(v.f, vecTmp); v.f = vdupq_m(v.f, F32_MAX, vcmpeqq(vecIn, 0.0f)); /* @@ -275,21 +264,17 @@ __STATIC_INLINE f32x4_t vrecip_f32(f32x4_t vecIn) return v.f; } -__STATIC_INLINE f32x4_t vtanhq_f32( - f32x4_t val) +__STATIC_INLINE f32x4_t vtanhq_f32(f32x4_t val) { - f32x4_t x = - vminnmq_f32(vmaxnmq_f32(val, vdupq_n_f32(-10.f)), vdupq_n_f32(10.0f)); - f32x4_t exp2x = vexpq_f32(vmulq_n_f32(x, 2.f)); - f32x4_t num = vsubq_n_f32(exp2x, 1.f); - f32x4_t den = vaddq_n_f32(exp2x, 1.f); - f32x4_t tanh = vmulq_f32(num, vrecip_f32(den)); + f32x4_t x = vminnmq_f32(vmaxnmq_f32(val, vdupq_n_f32(-10.f)), vdupq_n_f32(10.0f)); + f32x4_t exp2x = vexpq_f32(vmulq_n_f32(x, 2.f)); + f32x4_t num = vsubq_n_f32(exp2x, 1.f); + f32x4_t den = vaddq_n_f32(exp2x, 1.f); + f32x4_t tanh = vmulq_f32(num, vrecip_f32(den)); return tanh; } -__STATIC_INLINE f32x4_t vpowq_f32( - f32x4_t val, - f32x4_t n) +__STATIC_INLINE f32x4_t vpowq_f32(f32x4_t val, f32x4_t n) { return vexpq_f32(vmulq_f32(n, vlogq_f32(val))); } @@ -299,7 +284,8 @@ __STATIC_INLINE f32x4_t vpowq_f32( #if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) #endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */ -#if (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE) +#if (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && \ + !defined(ARM_MATH_AUTOVECTORIZE) #include "NEMath.h" /** @@ -309,20 +295,18 @@ __STATIC_INLINE f32x4_t vpowq_f32( * @return x^nb * */ -__STATIC_INLINE float32x4_t arm_vec_exponent_f32(float32x4_t x, int32_t nb) +__STATIC_INLINE float32x4_t arm_vec_exponent_f32(float32x4_t x, int32_t nb) { float32x4_t r = x; - nb --; - while(nb > 0) - { - r = vmulq_f32(r , x); + nb--; + while (nb > 0) { + r = vmulq_f32(r, x); nb--; } - return(r); + return (r); } - -__STATIC_INLINE float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) +__STATIC_INLINE float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) { float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN)); float32x4_t e = vrsqrteq_f32(x1); @@ -334,37 +318,36 @@ __STATIC_INLINE float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) __STATIC_INLINE int16x8_t __arm_vec_sqrt_q15_neon(int16x8_t vec) { float32x4_t tempF; - int32x4_t tempHI,tempLO; + int32x4_t tempHI, tempLO; tempLO = vmovl_s16(vget_low_s16(vec)); - tempF = vcvtq_n_f32_s32(tempLO,15); + tempF = vcvtq_n_f32_s32(tempLO, 15); tempF = __arm_vec_sqrt_f32_neon(tempF); - tempLO = vcvtq_n_s32_f32(tempF,15); + tempLO = vcvtq_n_s32_f32(tempF, 15); tempHI = vmovl_s16(vget_high_s16(vec)); - tempF = vcvtq_n_f32_s32(tempHI,15); + tempF = vcvtq_n_f32_s32(tempHI, 15); tempF = __arm_vec_sqrt_f32_neon(tempF); - tempHI = vcvtq_n_s32_f32(tempF,15); + tempHI = vcvtq_n_s32_f32(tempF, 15); - return(vcombine_s16(vqmovn_s32(tempLO),vqmovn_s32(tempHI))); + return (vcombine_s16(vqmovn_s32(tempLO), vqmovn_s32(tempHI))); } __STATIC_INLINE int32x4_t __arm_vec_sqrt_q31_neon(int32x4_t vec) { - float32x4_t temp; + float32x4_t temp; - temp = vcvtq_n_f32_s32(vec,31); - temp = __arm_vec_sqrt_f32_neon(temp); - return(vcvtq_n_s32_f32(temp,31)); + temp = vcvtq_n_f32_s32(vec, 31); + temp = __arm_vec_sqrt_f32_neon(temp); + return (vcvtq_n_s32_f32(temp, 31)); } #endif /* (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE) */ -#ifdef __cplusplus +#ifdef __cplusplus } #endif - #endif /* _ARM_VEC_MATH_H */ /** diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math_f16.h old mode 100755 new mode 100644 index 70e503d66e..50bd894112 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/arm_vec_math_f16.h @@ -30,27 +30,23 @@ #include "arm_common_tables_f16.h" #include "arm_helium_utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) - -static const float16_t __logf_rng_f16=0.693147180f16; +static const float16_t __logf_rng_f16 = 0.693147180f16; /* fast inverse approximation (3x newton) */ -__STATIC_INLINE f16x8_t vrecip_medprec_f16( - f16x8_t x) +__STATIC_INLINE f16x8_t vrecip_medprec_f16(f16x8_t x) { - q15x8_t m; - f16x8_t b; - any16x8_t xinv; - f16x8_t ax = vabsq(x); + q15x8_t m; + f16x8_t b; + any16x8_t xinv; + f16x8_t ax = vabsq(x); xinv.f = ax; @@ -78,13 +74,12 @@ __STATIC_INLINE f16x8_t vrecip_medprec_f16( } /* fast inverse approximation (4x newton) */ -__STATIC_INLINE f16x8_t vrecip_hiprec_f16( - f16x8_t x) +__STATIC_INLINE f16x8_t vrecip_hiprec_f16(f16x8_t x) { - q15x8_t m; - f16x8_t b; - any16x8_t xinv; - f16x8_t ax = vabsq(x); + q15x8_t m; + f16x8_t b; + any16x8_t xinv; + f16x8_t ax = vabsq(x); xinv.f = ax; @@ -114,13 +109,11 @@ __STATIC_INLINE f16x8_t vrecip_hiprec_f16( return xinv.f; } -__STATIC_INLINE f16x8_t vdiv_f16( - f16x8_t num, f16x8_t den) +__STATIC_INLINE f16x8_t vdiv_f16(f16x8_t num, f16x8_t den) { return vmulq(num, vrecip_hiprec_f16(den)); } - /** @brief Single-precision taylor dev. @param[in] x f16 vector input @@ -128,39 +121,37 @@ __STATIC_INLINE f16x8_t vdiv_f16( @return destination f16 vector */ -__STATIC_INLINE float16x8_t vtaylor_polyq_f16( - float16x8_t x, - const float16_t * coeffs) +__STATIC_INLINE float16x8_t vtaylor_polyq_f16(float16x8_t x, const float16_t *coeffs) { - float16x8_t A = vfmasq(vdupq_n_f16(coeffs[4]), x, coeffs[0]); - float16x8_t B = vfmasq(vdupq_n_f16(coeffs[6]), x, coeffs[2]); - float16x8_t C = vfmasq(vdupq_n_f16(coeffs[5]), x, coeffs[1]); - float16x8_t D = vfmasq(vdupq_n_f16(coeffs[7]), x, coeffs[3]); - float16x8_t x2 = vmulq(x, x); - float16x8_t x4 = vmulq(x2, x2); - float16x8_t res = vfmaq(vfmaq_f16(A, B, x2), vfmaq_f16(C, D, x2), x4); + float16x8_t A = vfmasq(vdupq_n_f16(coeffs[4]), x, coeffs[0]); + float16x8_t B = vfmasq(vdupq_n_f16(coeffs[6]), x, coeffs[2]); + float16x8_t C = vfmasq(vdupq_n_f16(coeffs[5]), x, coeffs[1]); + float16x8_t D = vfmasq(vdupq_n_f16(coeffs[7]), x, coeffs[3]); + float16x8_t x2 = vmulq(x, x); + float16x8_t x4 = vmulq(x2, x2); + float16x8_t res = vfmaq(vfmaq_f16(A, B, x2), vfmaq_f16(C, D, x2), x4); return res; } -#define VMANT_EXP_F16(x) \ - any16x8_t r; \ - int16x8_t n; \ - \ - r.f = x; \ - n = r.i >> 10; \ - n = n - 15; \ - r.i = r.i - (n << 10);\ - \ - vecExpUnBiased = n; \ +#define VMANT_EXP_F16(x) \ + any16x8_t r; \ + int16x8_t n; \ + \ + r.f = x; \ + n = r.i >> 10; \ + n = n - 15; \ + r.i = r.i - (n << 10); \ + \ + vecExpUnBiased = n; \ vecTmpFlt1 = r.f; __STATIC_INLINE float16x8_t vlogq_f16(float16x8_t vecIn) { - q15x8_t vecExpUnBiased; - float16x8_t vecTmpFlt0, vecTmpFlt1; - float16x8_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; - float16x8_t vecExpUnBiasedFlt; + q15x8_t vecExpUnBiased; + float16x8_t vecTmpFlt0, vecTmpFlt1; + float16x8_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; + float16x8_t vecExpUnBiasedFlt; /* * extract exponent @@ -215,18 +206,17 @@ __STATIC_INLINE float16x8_t vlogq_f16(float16x8_t vecIn) return vecAcc0; } -__STATIC_INLINE float16x8_t vexpq_f16( - float16x8_t x) +__STATIC_INLINE float16x8_t vexpq_f16(float16x8_t x) { // Perform range reduction [-log(2),log(2)] - int16x8_t m = vcvtq_s16_f16(vmulq_n_f16(x, 1.4426950408f16)); - float16x8_t val = vfmsq_f16(x, vcvtq_f16_s16(m), vdupq_n_f16(0.6931471805f16)); + int16x8_t m = vcvtq_s16_f16(vmulq_n_f16(x, 1.4426950408f16)); + float16x8_t val = vfmsq_f16(x, vcvtq_f16_s16(m), vdupq_n_f16(0.6931471805f16)); // Polynomial Approximation - float16x8_t poly = vtaylor_polyq_f16(val, exp_tab_f16); + float16x8_t poly = vtaylor_polyq_f16(val, exp_tab_f16); // Reconstruct - poly = (float16x8_t) (vqaddq_s16((int16x8_t) (poly), vqshlq_n_s16(m, 10))); + poly = (float16x8_t)(vqaddq_s16((int16x8_t)(poly), vqshlq_n_s16(m, 10))); poly = vdupq_m_n_f16(poly, 0.0f16, vcmpltq_n_s16(m, -14)); return poly; @@ -234,7 +224,7 @@ __STATIC_INLINE float16x8_t vexpq_f16( __STATIC_INLINE float16x8_t arm_vec_exponent_f16(float16x8_t x, int16_t nb) { - float16x8_t r = x; + float16x8_t r = x; nb--; while (nb > 0) { r = vmulq(r, x); @@ -243,19 +233,17 @@ __STATIC_INLINE float16x8_t arm_vec_exponent_f16(float16x8_t x, int16_t nb) return (r); } -__STATIC_INLINE f16x8_t vpowq_f16( - f16x8_t val, - f16x8_t n) +__STATIC_INLINE f16x8_t vpowq_f16(f16x8_t val, f16x8_t n) { return vexpq_f16(vmulq_f16(n, vlogq_f16(val))); } -#define INV_NEWTON_INIT_F16 0x7773 +#define INV_NEWTON_INIT_F16 0x7773 __STATIC_INLINE f16x8_t vrecip_f16(f16x8_t vecIn) { - f16x8_t vecSx, vecW, vecTmp; - any16x8_t v; + f16x8_t vecSx, vecW, vecTmp; + any16x8_t v; vecSx = vabsq(vecIn); @@ -272,7 +260,7 @@ __STATIC_INLINE f16x8_t vrecip_f16(f16x8_t vecIn) vecTmp = vfmasq_n_f16(vecW, vecTmp, 56.0f16); vecTmp = vfmasq_n_f16(vecW, vecTmp, -28.0f16); vecTmp = vfmasq_n_f16(vecW, vecTmp, 8.0f16); - v.f = vmulq(v.f, vecTmp); + v.f = vmulq(v.f, vecTmp); v.f = vdupq_m_n_f16(v.f, F16INFINITY, vcmpeqq_n_f16(vecIn, 0.0f)); /* @@ -282,23 +270,19 @@ __STATIC_INLINE f16x8_t vrecip_f16(f16x8_t vecIn) return v.f; } -__STATIC_INLINE f16x8_t vtanhq_f16( - f16x8_t val) +__STATIC_INLINE f16x8_t vtanhq_f16(f16x8_t val) { - f16x8_t x = - vminnmq_f16(vmaxnmq_f16(val, vdupq_n_f16(-10.f16)), vdupq_n_f16(10.0f16)); - f16x8_t exp2x = vexpq_f16(vmulq_n_f16(x, 2.f16)); - f16x8_t num = vsubq_n_f16(exp2x, 1.f16); - f16x8_t den = vaddq_n_f16(exp2x, 1.f16); - f16x8_t tanh = vmulq_f16(num, vrecip_f16(den)); + f16x8_t x = vminnmq_f16(vmaxnmq_f16(val, vdupq_n_f16(-10.f16)), vdupq_n_f16(10.0f16)); + f16x8_t exp2x = vexpq_f16(vmulq_n_f16(x, 2.f16)); + f16x8_t num = vsubq_n_f16(exp2x, 1.f16); + f16x8_t den = vaddq_n_f16(exp2x, 1.f16); + f16x8_t tanh = vmulq_f16(num, vrecip_f16(den)); return tanh; } #endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)*/ - - -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions.h old mode 100755 new mode 100644 index 645afdc3b9..b445a6cce1 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef BASIC_MATH_FUNCTIONS_H_ #define BASIC_MATH_FUNCTIONS_H_ @@ -33,72 +32,50 @@ #include "dsp/none.h" #include "dsp/utils.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** * @defgroup groupMath Basic Math Functions */ - /** +/** * @brief Q7 vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_mult_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); +void arm_mult_q7(const q7_t *pSrcA, const q7_t *pSrcB, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q15 vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_mult_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); +void arm_mult_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q31 vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_mult_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - +void arm_mult_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Floating-point vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_mult_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - +void arm_mult_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, + uint32_t blockSize); /** * @brief Floating-point vector multiplication. @@ -107,28 +84,18 @@ extern "C" * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ -void arm_mult_f64( -const float64_t * pSrcA, -const float64_t * pSrcB, - float64_t * pDst, - uint32_t blockSize); - +void arm_mult_f64(const float64_t *pSrcA, const float64_t *pSrcB, float64_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Floating-point vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - +void arm_add_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, + uint32_t blockSize); /** * @brief Floating-point vector addition. @@ -137,159 +104,102 @@ const float64_t * pSrcB, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_f64( - const float64_t * pSrcA, - const float64_t * pSrcB, - float64_t * pDst, - uint32_t blockSize); - +void arm_add_f64(const float64_t *pSrcA, const float64_t *pSrcB, float64_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Q7 vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); +void arm_add_q7(const q7_t *pSrcA, const q7_t *pSrcB, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q15 vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - +void arm_add_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Q31 vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - +void arm_add_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Floating-point vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - +void arm_sub_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Floating-point vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_f64( - const float64_t * pSrcA, - const float64_t * pSrcB, - float64_t * pDst, - uint32_t blockSize); - +void arm_sub_f64(const float64_t *pSrcA, const float64_t *pSrcB, float64_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Q7 vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); +void arm_sub_q7(const q7_t *pSrcA, const q7_t *pSrcB, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q15 vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); +void arm_sub_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q31 vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - +void arm_sub_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Multiplies a floating-point vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scale scale factor to be applied * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_f32( - const float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - +void arm_scale_f32(const float32_t *pSrc, float32_t scale, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Multiplies a floating-point vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scale scale factor to be applied * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_f64( - const float64_t * pSrc, - float64_t scale, - float64_t * pDst, - uint32_t blockSize); +void arm_scale_f64(const float64_t *pSrc, float64_t scale, float64_t *pDst, uint32_t blockSize); - - - /** +/** * @brief Multiplies a Q7 vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scaleFract fractional portion of the scale value @@ -297,15 +207,9 @@ const float64_t * pSrcB, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_q7( - const q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); +void arm_scale_q7(const q7_t *pSrc, q7_t scaleFract, int8_t shift, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Multiplies a Q15 vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scaleFract fractional portion of the scale value @@ -313,15 +217,10 @@ const float64_t * pSrcB, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_q15( - const q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); +void arm_scale_q15(const q15_t *pSrc, q15_t scaleFract, int8_t shift, q15_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Multiplies a Q31 vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scaleFract fractional portion of the scale value @@ -329,38 +228,24 @@ const float64_t * pSrcB, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_q31( - const q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); +void arm_scale_q31(const q31_t *pSrc, q31_t scaleFract, int8_t shift, q31_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Q7 vector absolute value. * @param[in] pSrc points to the input buffer * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ - void arm_abs_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - +void arm_abs_q7(const q7_t *pSrc, q7_t *pDst, uint32_t blockSize); - /** +/** * @brief Floating-point vector absolute value. * @param[in] pSrc points to the input buffer * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ - void arm_abs_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - +void arm_abs_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); /** * @brief Floating-point vector absolute value. @@ -368,51 +253,33 @@ const float64_t * pSrcB, * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ -void arm_abs_f64( -const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - +void arm_abs_f64(const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - - /** +/** * @brief Q15 vector absolute value. * @param[in] pSrc points to the input buffer * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ - void arm_abs_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_abs_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Q31 vector absolute value. * @param[in] pSrc points to the input buffer * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ - void arm_abs_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - +void arm_abs_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Dot product of floating-point vectors. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ - void arm_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - +void arm_dot_prod_f32(const float32_t *pSrcA, const float32_t *pSrcB, uint32_t blockSize, + float32_t *result); /** * @brief Dot product of floating-point vectors. @@ -421,97 +288,62 @@ const float64_t * pSrc, * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ -void arm_dot_prod_f64( -const float64_t * pSrcA, -const float64_t * pSrcB, - uint32_t blockSize, - float64_t * result); - - +void arm_dot_prod_f64(const float64_t *pSrcA, const float64_t *pSrcB, uint32_t blockSize, + float64_t *result); - /** +/** * @brief Dot product of Q7 vectors. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ - void arm_dot_prod_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - +void arm_dot_prod_q7(const q7_t *pSrcA, const q7_t *pSrcB, uint32_t blockSize, q31_t *result); - /** +/** * @brief Dot product of Q15 vectors. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ - void arm_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - +void arm_dot_prod_q15(const q15_t *pSrcA, const q15_t *pSrcB, uint32_t blockSize, q63_t *result); - /** +/** * @brief Dot product of Q31 vectors. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ - void arm_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - +void arm_dot_prod_q31(const q31_t *pSrcA, const q31_t *pSrcB, uint32_t blockSize, q63_t *result); - /** +/** * @brief Shifts the elements of a Q7 vector a specified number of bits. * @param[in] pSrc points to the input vector * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_shift_q7( - const q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); +void arm_shift_q7(const q7_t *pSrc, int8_t shiftBits, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Shifts the elements of a Q15 vector a specified number of bits. * @param[in] pSrc points to the input vector * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_shift_q15( - const q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); +void arm_shift_q15(const q15_t *pSrc, int8_t shiftBits, q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Shifts the elements of a Q31 vector a specified number of bits. * @param[in] pSrc points to the input vector * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_shift_q31( - const q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - +void arm_shift_q31(const q31_t *pSrc, int8_t shiftBits, q31_t *pDst, uint32_t blockSize); /** * @brief Adds a constant offset to a floating-point vector. @@ -520,83 +352,51 @@ const float64_t * pSrcB, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ -void arm_offset_f64( -const float64_t * pSrc, - float64_t offset, - float64_t * pDst, - uint32_t blockSize); - - +void arm_offset_f64(const float64_t *pSrc, float64_t offset, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Adds a constant offset to a floating-point vector. * @param[in] pSrc points to the input vector * @param[in] offset is the offset to be added * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_offset_f32( - const float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - +void arm_offset_f32(const float32_t *pSrc, float32_t offset, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Adds a constant offset to a Q7 vector. * @param[in] pSrc points to the input vector * @param[in] offset is the offset to be added * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_offset_q7( - const q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); +void arm_offset_q7(const q7_t *pSrc, q7_t offset, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Adds a constant offset to a Q15 vector. * @param[in] pSrc points to the input vector * @param[in] offset is the offset to be added * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_offset_q15( - const q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - +void arm_offset_q15(const q15_t *pSrc, q15_t offset, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Adds a constant offset to a Q31 vector. * @param[in] pSrc points to the input vector * @param[in] offset is the offset to be added * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_offset_q31( - const q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - +void arm_offset_q31(const q31_t *pSrc, q31_t offset, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Negates the elements of a floating-point vector. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_negate_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - +void arm_negate_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); /** * @brief Negates the elements of a floating-point vector. @@ -604,47 +404,31 @@ const float64_t * pSrc, * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ -void arm_negate_f64( -const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - +void arm_negate_f64(const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Negates the elements of a Q7 vector. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_negate_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - +void arm_negate_q7(const q7_t *pSrc, q7_t *pDst, uint32_t blockSize); - /** +/** * @brief Negates the elements of a Q15 vector. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_negate_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_negate_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Negates the elements of a Q31 vector. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_negate_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_negate_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize); /** * @brief Compute the logical bitwise AND of two fixed-point vectors. @@ -653,109 +437,76 @@ const float64_t * pSrc, * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_and_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); +void arm_and_u16(const uint16_t *pSrcA, const uint16_t *pSrcB, uint16_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise AND of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_and_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); +void arm_and_u32(const uint32_t *pSrcA, const uint32_t *pSrcB, uint32_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise AND of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_and_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); +void arm_and_u8(const uint8_t *pSrcA, const uint8_t *pSrcB, uint8_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise OR of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_or_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); +void arm_or_u16(const uint16_t *pSrcA, const uint16_t *pSrcB, uint16_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise OR of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_or_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); +void arm_or_u32(const uint32_t *pSrcA, const uint32_t *pSrcB, uint32_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise OR of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_or_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); +void arm_or_u8(const uint8_t *pSrcA, const uint8_t *pSrcB, uint8_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise NOT of a fixed-point vector. * @param[in] pSrc points to input vector * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_not_u16( - const uint16_t * pSrc, - uint16_t * pDst, - uint32_t blockSize); +void arm_not_u16(const uint16_t *pSrc, uint16_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise NOT of a fixed-point vector. * @param[in] pSrc points to input vector * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_not_u32( - const uint32_t * pSrc, - uint32_t * pDst, - uint32_t blockSize); +void arm_not_u32(const uint32_t *pSrc, uint32_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise NOT of a fixed-point vector. * @param[in] pSrc points to input vector * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_not_u8( - const uint8_t * pSrc, - uint8_t * pDst, - uint32_t blockSize); +void arm_not_u8(const uint8_t *pSrc, uint8_t *pDst, uint32_t blockSize); /** * @brief Compute the logical bitwise XOR of two fixed-point vectors. @@ -764,39 +515,27 @@ const float64_t * pSrc, * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_xor_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); +void arm_xor_u16(const uint16_t *pSrcA, const uint16_t *pSrcB, uint16_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise XOR of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_xor_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); +void arm_xor_u32(const uint32_t *pSrcA, const uint32_t *pSrcB, uint32_t *pDst, uint32_t blockSize); - /** +/** * @brief Compute the logical bitwise XOR of two fixed-point vectors. * @param[in] pSrcA points to input vector A * @param[in] pSrcB points to input vector B * @param[out] pDst points to output vector * @param[in] blockSize number of samples in each vector */ - void arm_xor_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); +void arm_xor_u8(const uint8_t *pSrcA, const uint8_t *pSrcB, uint8_t *pDst, uint32_t blockSize); - /** +/** @brief Elementwise floating-point clipping @param[in] pSrc points to input values @param[out] pDst points to output clipped values @@ -805,13 +544,10 @@ const float64_t * pSrc, @param[in] numSamples number of samples to clip */ -void arm_clip_f32(const float32_t * pSrc, - float32_t * pDst, - float32_t low, - float32_t high, - uint32_t numSamples); +void arm_clip_f32(const float32_t *pSrc, float32_t *pDst, float32_t low, float32_t high, + uint32_t numSamples); - /** +/** @brief Elementwise fixed-point clipping @param[in] pSrc points to input values @param[out] pDst points to output clipped values @@ -820,13 +556,9 @@ void arm_clip_f32(const float32_t * pSrc, @param[in] numSamples number of samples to clip */ -void arm_clip_q31(const q31_t * pSrc, - q31_t * pDst, - q31_t low, - q31_t high, - uint32_t numSamples); +void arm_clip_q31(const q31_t *pSrc, q31_t *pDst, q31_t low, q31_t high, uint32_t numSamples); - /** +/** @brief Elementwise fixed-point clipping @param[in] pSrc points to input values @param[out] pDst points to output clipped values @@ -835,13 +567,9 @@ void arm_clip_q31(const q31_t * pSrc, @param[in] numSamples number of samples to clip */ -void arm_clip_q15(const q15_t * pSrc, - q15_t * pDst, - q15_t low, - q15_t high, - uint32_t numSamples); +void arm_clip_q15(const q15_t *pSrc, q15_t *pDst, q15_t low, q15_t high, uint32_t numSamples); - /** +/** @brief Elementwise fixed-point clipping @param[in] pSrc points to input values @param[out] pDst points to output clipped values @@ -850,14 +578,9 @@ void arm_clip_q15(const q15_t * pSrc, @param[in] numSamples number of samples to clip */ -void arm_clip_q7(const q7_t * pSrc, - q7_t * pDst, - q7_t low, - q7_t high, - uint32_t numSamples); - +void arm_clip_q7(const q7_t *pSrc, q7_t *pDst, q7_t low, q7_t high, uint32_t numSamples); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions_f16.h old mode 100755 new mode 100644 index b3d5ecdc95..273b48d682 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/basic_math_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef BASIC_MATH_FUNCTIONS_F16_H_ #define BASIC_MATH_FUNCTIONS_F16_H_ @@ -33,116 +32,87 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - - /** +/** * @brief Floating-point vector addition. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_add_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - float16_t * pDst, - uint32_t blockSize); +void arm_add_f16(const float16_t *pSrcA, const float16_t *pSrcB, float16_t *pDst, + uint32_t blockSize); - /** +/** * @brief Floating-point vector subtraction. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_sub_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - float16_t * pDst, - uint32_t blockSize); +void arm_sub_f16(const float16_t *pSrcA, const float16_t *pSrcB, float16_t *pDst, + uint32_t blockSize); - /** +/** * @brief Multiplies a floating-point vector by a scalar. * @param[in] pSrc points to the input vector * @param[in] scale scale factor to be applied * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_scale_f16( - const float16_t * pSrc, - float16_t scale, - float16_t * pDst, - uint32_t blockSize); +void arm_scale_f16(const float16_t *pSrc, float16_t scale, float16_t *pDst, uint32_t blockSize); - /** +/** * @brief Floating-point vector absolute value. * @param[in] pSrc points to the input buffer * @param[out] pDst points to the output buffer * @param[in] blockSize number of samples in each vector */ - void arm_abs_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); - +void arm_abs_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** * @brief Adds a constant offset to a floating-point vector. * @param[in] pSrc points to the input vector * @param[in] offset is the offset to be added * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_offset_f16( - const float16_t * pSrc, - float16_t offset, - float16_t * pDst, - uint32_t blockSize); +void arm_offset_f16(const float16_t *pSrc, float16_t offset, float16_t *pDst, uint32_t blockSize); - /** +/** * @brief Dot product of floating-point vectors. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[in] blockSize number of samples in each vector * @param[out] result output result returned here */ - void arm_dot_prod_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - uint32_t blockSize, - float16_t * result); +void arm_dot_prod_f16(const float16_t *pSrcA, const float16_t *pSrcB, uint32_t blockSize, + float16_t *result); - /** +/** * @brief Floating-point vector multiplication. * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in each vector */ - void arm_mult_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - float16_t * pDst, - uint32_t blockSize); +void arm_mult_f16(const float16_t *pSrcA, const float16_t *pSrcB, float16_t *pDst, + uint32_t blockSize); - /** +/** * @brief Negates the elements of a floating-point vector. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] blockSize number of samples in the vector */ - void arm_negate_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_negate_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** @brief Elementwise floating-point clipping @param[in] pSrc points to input values @param[out] pDst points to output clipped values @@ -150,15 +120,12 @@ extern "C" @param[in] high higher bound @param[in] numSamples number of samples to clip */ -void arm_clip_f16(const float16_t * pSrc, - float16_t * pDst, - float16_t low, - float16_t high, - uint32_t numSamples); +void arm_clip_f16(const float16_t *pSrc, float16_t *pDst, float16_t low, float16_t high, + uint32_t numSamples); #endif /* defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions.h old mode 100755 new mode 100644 index 7b3e0efacb..b916a3f16d --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef BAYES_FUNCTIONS_H_ #define BAYES_FUNCTIONS_H_ @@ -46,22 +45,20 @@ * DSP/Testing/PatternGeneration/Bayes.py */ -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** * @brief Instance structure for Naive Gaussian Bayesian estimator. */ -typedef struct -{ - uint32_t vectorDimension; /**< Dimension of vector space */ - uint32_t numberOfClasses; /**< Number of different classes */ - const float32_t *theta; /**< Mean values for the Gaussians */ - const float32_t *sigma; /**< Variances for the Gaussians */ - const float32_t *classPriors; /**< Class prior probabilities */ - float32_t epsilon; /**< Additive value to variances */ +typedef struct { + uint32_t vectorDimension; /**< Dimension of vector space */ + uint32_t numberOfClasses; /**< Number of different classes */ + const float32_t *theta; /**< Mean values for the Gaussians */ + const float32_t *sigma; /**< Variances for the Gaussians */ + const float32_t *classPriors; /**< Class prior probabilities */ + float32_t epsilon; /**< Additive value to variances */ } arm_gaussian_naive_bayes_instance_f32; /** @@ -73,13 +70,11 @@ typedef struct * @param[out] *pBufferB points to a temporary buffer of length numberOfClasses * @return The predicted class */ -uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S, - const float32_t * in, - float32_t *pOutputProbabilities, - float32_t *pBufferB); +uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S, + const float32_t *in, float32_t *pOutputProbabilities, + float32_t *pBufferB); - -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions_f16.h old mode 100755 new mode 100644 index 100162ed46..bf6fdf9342 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/bayes_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef BAYES_FUNCTIONS_F16_H_ #define BAYES_FUNCTIONS_F16_H_ @@ -35,9 +34,8 @@ #include "dsp/statistics_functions_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) @@ -45,14 +43,13 @@ extern "C" /** * @brief Instance structure for Naive Gaussian Bayesian estimator. */ -typedef struct -{ - uint32_t vectorDimension; /**< Dimension of vector space */ - uint32_t numberOfClasses; /**< Number of different classes */ - const float16_t *theta; /**< Mean values for the Gaussians */ - const float16_t *sigma; /**< Variances for the Gaussians */ - const float16_t *classPriors; /**< Class prior probabilities */ - float16_t epsilon; /**< Additive value to variances */ +typedef struct { + uint32_t vectorDimension; /**< Dimension of vector space */ + uint32_t numberOfClasses; /**< Number of different classes */ + const float16_t *theta; /**< Mean values for the Gaussians */ + const float16_t *sigma; /**< Variances for the Gaussians */ + const float16_t *classPriors; /**< Class prior probabilities */ + float16_t epsilon; /**< Additive value to variances */ } arm_gaussian_naive_bayes_instance_f16; /** @@ -64,13 +61,12 @@ typedef struct * @param[out] *pBufferB points to a temporary buffer of length numberOfClasses * @return The predicted class */ -uint32_t arm_gaussian_naive_bayes_predict_f16(const arm_gaussian_naive_bayes_instance_f16 *S, - const float16_t * in, - float16_t *pOutputProbabilities, - float16_t *pBufferB); +uint32_t arm_gaussian_naive_bayes_predict_f16(const arm_gaussian_naive_bayes_instance_f16 *S, + const float16_t *in, float16_t *pOutputProbabilities, + float16_t *pBufferB); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions.h old mode 100755 new mode 100644 index bdbc2a4ed4..21bf9c605f --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef COMPLEX_MATH_FUNCTIONS_H_ #define COMPLEX_MATH_FUNCTIONS_H_ @@ -34,9 +33,8 @@ #include "dsp/utils.h" #include "dsp/fast_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** @@ -49,88 +47,61 @@ extern "C" * real values. */ - /** +/** * @brief Floating-point complex conjugate. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_conj_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); +void arm_cmplx_conj_f32(const float32_t *pSrc, float32_t *pDst, uint32_t numSamples); - /** +/** * @brief Q31 complex conjugate. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_conj_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - +void arm_cmplx_conj_q31(const q31_t *pSrc, q31_t *pDst, uint32_t numSamples); - /** +/** * @brief Q15 complex conjugate. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_conj_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - +void arm_cmplx_conj_q15(const q15_t *pSrc, q15_t *pDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex magnitude squared * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_squared_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_squared_f32(const float32_t *pSrc, float32_t *pDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex magnitude squared * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_squared_f64( - const float64_t * pSrc, - float64_t * pDst, - uint32_t numSamples); +void arm_cmplx_mag_squared_f64(const float64_t *pSrc, float64_t *pDst, uint32_t numSamples); - - /** +/** * @brief Q31 complex magnitude squared * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_squared_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); +void arm_cmplx_mag_squared_q31(const q31_t *pSrc, q31_t *pDst, uint32_t numSamples); - - /** +/** * @brief Q15 complex magnitude squared * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_squared_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_squared_q15(const q15_t *pSrc, q15_t *pDst, uint32_t numSamples); /** * @brief Floating-point complex magnitude @@ -138,11 +109,7 @@ extern "C" * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_f32(const float32_t *pSrc, float32_t *pDst, uint32_t numSamples); /** * @brief Floating-point complex magnitude @@ -150,48 +117,33 @@ extern "C" * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_f64( - const float64_t * pSrc, - float64_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_f64(const float64_t *pSrc, float64_t *pDst, uint32_t numSamples); - /** +/** * @brief Q31 complex magnitude * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_q31(const q31_t *pSrc, q31_t *pDst, uint32_t numSamples); - /** +/** * @brief Q15 complex magnitude * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); +void arm_cmplx_mag_q15(const q15_t *pSrc, q15_t *pDst, uint32_t numSamples); - /** +/** * @brief Q15 complex magnitude * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_fast_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mag_fast_q15(const q15_t *pSrc, q15_t *pDst, uint32_t numSamples); - /** +/** * @brief Q15 complex dot product * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector @@ -199,15 +151,10 @@ extern "C" * @param[out] realResult real part of the result returned here * @param[out] imagResult imaginary part of the result returned here */ - void arm_cmplx_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - +void arm_cmplx_dot_prod_q15(const q15_t *pSrcA, const q15_t *pSrcB, uint32_t numSamples, + q31_t *realResult, q31_t *imagResult); - /** +/** * @brief Q31 complex dot product * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector @@ -215,15 +162,10 @@ extern "C" * @param[out] realResult real part of the result returned here * @param[out] imagResult imaginary part of the result returned here */ - void arm_cmplx_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); +void arm_cmplx_dot_prod_q31(const q31_t *pSrcA, const q31_t *pSrcB, uint32_t numSamples, + q63_t *realResult, q63_t *imagResult); - - /** +/** * @brief Floating-point complex dot product * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector @@ -231,97 +173,68 @@ extern "C" * @param[out] realResult real part of the result returned here * @param[out] imagResult imaginary part of the result returned here */ - void arm_cmplx_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); +void arm_cmplx_dot_prod_f32(const float32_t *pSrcA, const float32_t *pSrcB, uint32_t numSamples, + float32_t *realResult, float32_t *imagResult); - - /** +/** * @brief Q15 complex-by-real multiplication * @param[in] pSrcCmplx points to the complex input vector * @param[in] pSrcReal points to the real input vector * @param[out] pCmplxDst points to the complex output vector * @param[in] numSamples number of samples in each vector */ - void arm_cmplx_mult_real_q15( - const q15_t * pSrcCmplx, - const q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - +void arm_cmplx_mult_real_q15(const q15_t *pSrcCmplx, const q15_t *pSrcReal, q15_t *pCmplxDst, + uint32_t numSamples); - /** +/** * @brief Q31 complex-by-real multiplication * @param[in] pSrcCmplx points to the complex input vector * @param[in] pSrcReal points to the real input vector * @param[out] pCmplxDst points to the complex output vector * @param[in] numSamples number of samples in each vector */ - void arm_cmplx_mult_real_q31( - const q31_t * pSrcCmplx, - const q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - +void arm_cmplx_mult_real_q31(const q31_t *pSrcCmplx, const q31_t *pSrcReal, q31_t *pCmplxDst, + uint32_t numSamples); - /** +/** * @brief Floating-point complex-by-real multiplication * @param[in] pSrcCmplx points to the complex input vector * @param[in] pSrcReal points to the real input vector * @param[out] pCmplxDst points to the complex output vector * @param[in] numSamples number of samples in each vector */ - void arm_cmplx_mult_real_f32( - const float32_t * pSrcCmplx, - const float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); +void arm_cmplx_mult_real_f32(const float32_t *pSrcCmplx, const float32_t *pSrcReal, + float32_t *pCmplxDst, uint32_t numSamples); - /** +/** * @brief Q15 complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_mult_cmplx_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mult_cmplx_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst, + uint32_t numSamples); - /** +/** * @brief Q31 complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_mult_cmplx_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - +void arm_cmplx_mult_cmplx_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst, + uint32_t numSamples); - /** +/** * @brief Floating-point complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_mult_cmplx_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - +void arm_cmplx_mult_cmplx_f32(const float32_t *pSrcA, const float32_t *pSrcB, float32_t *pDst, + uint32_t numSamples); /** * @brief Floating-point complex-by-complex multiplication @@ -330,15 +243,10 @@ extern "C" * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ -void arm_cmplx_mult_cmplx_f64( -const float64_t * pSrcA, -const float64_t * pSrcB, - float64_t * pDst, - uint32_t numSamples); - - +void arm_cmplx_mult_cmplx_f64(const float64_t *pSrcA, const float64_t *pSrcB, float64_t *pDst, + uint32_t numSamples); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions_f16.h old mode 100755 new mode 100644 index bd147325f9..d6b3f8ce4b --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/complex_math_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef COMPLEX_MATH_FUNCTIONS_F16_H_ #define COMPLEX_MATH_FUNCTIONS_F16_H_ @@ -34,47 +33,37 @@ #include "dsp/utils.h" #include "dsp/fast_math_functions_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - /** +/** * @brief Floating-point complex conjugate. * @param[in] pSrc points to the input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_conj_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t numSamples); +void arm_cmplx_conj_f16(const float16_t *pSrc, float16_t *pDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex magnitude squared * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_squared_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t numSamples); +void arm_cmplx_mag_squared_f16(const float16_t *pSrc, float16_t *pDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex magnitude * @param[in] pSrc points to the complex input vector * @param[out] pDst points to the real output vector * @param[in] numSamples number of complex samples in the input vector */ - void arm_cmplx_mag_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t numSamples); +void arm_cmplx_mag_f16(const float16_t *pSrc, float16_t *pDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex dot product * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector @@ -82,41 +71,31 @@ extern "C" * @param[out] realResult real part of the result returned here * @param[out] imagResult imaginary part of the result returned here */ - void arm_cmplx_dot_prod_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - uint32_t numSamples, - float16_t * realResult, - float16_t * imagResult); +void arm_cmplx_dot_prod_f16(const float16_t *pSrcA, const float16_t *pSrcB, uint32_t numSamples, + float16_t *realResult, float16_t *imagResult); - /** +/** * @brief Floating-point complex-by-real multiplication * @param[in] pSrcCmplx points to the complex input vector * @param[in] pSrcReal points to the real input vector * @param[out] pCmplxDst points to the complex output vector * @param[in] numSamples number of samples in each vector */ - void arm_cmplx_mult_real_f16( - const float16_t * pSrcCmplx, - const float16_t * pSrcReal, - float16_t * pCmplxDst, - uint32_t numSamples); +void arm_cmplx_mult_real_f16(const float16_t *pSrcCmplx, const float16_t *pSrcReal, + float16_t *pCmplxDst, uint32_t numSamples); - /** +/** * @brief Floating-point complex-by-complex multiplication * @param[in] pSrcA points to the first input vector * @param[in] pSrcB points to the second input vector * @param[out] pDst points to the output vector * @param[in] numSamples number of complex samples in each vector */ - void arm_cmplx_mult_cmplx_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - float16_t * pDst, - uint32_t numSamples); +void arm_cmplx_mult_cmplx_f16(const float16_t *pSrcA, const float16_t *pSrcB, float16_t *pDst, + uint32_t numSamples); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions.h old mode 100755 new mode 100644 index 5d5de98ea5..d0318c8d5b --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef CONTROLLER_FUNCTIONS_H_ #define CONTROLLER_FUNCTIONS_H_ @@ -33,25 +32,23 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** +/** * @brief Macros required for SINE and COSINE Controller functions */ -#define CONTROLLER_Q31_SHIFT (32 - 9) - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - +#define CONTROLLER_Q31_SHIFT (32 - 9) +/* 1.31(q31) Fixed value of 2/360 */ +/* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + /** * @defgroup groupController Controller Functions */ - /** @ingroup groupController */ @@ -80,35 +77,27 @@ extern "C" -# Fetch the value corresponding to \c index from cosine table to \c y0 and also value from \c index+1 to \c y1. -# Cosine value is computed as *pcosVal = y0 + (fract * (y1 - y0)). */ - + /** * @brief Floating-point sin_cos function. * @param[in] theta input value in degrees * @param[out] pSinVal points to the processed sine output. * @param[out] pCosVal points to the processed cos output. */ - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - +void arm_sin_cos_f32(float32_t theta, float32_t *pSinVal, float32_t *pCosVal); - /** +/** * @brief Q31 sin_cos function. * @param[in] theta scaled input value in degrees * @param[out] pSinVal points to the processed sine output. * @param[out] pCosVal points to the processed cosine output. */ - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - +void arm_sin_cos_q31(q31_t theta, q31_t *pSinVal, q31_t *pCosVal); /** @ingroup groupController */ - + /** * @defgroup PID PID Motor Control * @@ -167,132 +156,105 @@ extern "C" * Refer to the function specific documentation below for usage guidelines. */ - - /** +/** * @ingroup PID * @brief Instance structure for the Q15 PID Control. */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#if !defined (ARM_MATH_DSP) - q15_t A1; /**< The derived gain A1 = -Kp - 2Kd */ - q15_t A2; /**< The derived gain A1 = Kd. */ +typedef struct { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#if !defined(ARM_MATH_DSP) + q15_t A1; /**< The derived gain A1 = -Kp - 2Kd */ + q15_t A2; /**< The derived gain A1 = Kd. */ #else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ #endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ +} arm_pid_instance_q15; - /** +/** * @ingroup PID * @brief Instance structure for the Q31 PID Control. */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q31; - - /** +typedef struct { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ +} arm_pid_instance_q31; + +/** * @ingroup PID * @brief Instance structure for the floating-point PID Control. */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; +typedef struct { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ +} arm_pid_instance_f32; - - - /** +/** * @brief Initialization function for the floating-point PID Control. * @param[in,out] S points to an instance of the PID structure. * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); +void arm_pid_init_f32(arm_pid_instance_f32 *S, int32_t resetStateFlag); - - /** +/** * @brief Reset function for the floating-point PID Control. * @param[in,out] S is an instance of the floating-point PID Control structure */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - +void arm_pid_reset_f32(arm_pid_instance_f32 *S); - /** +/** * @brief Initialization function for the Q31 PID Control. * @param[in,out] S points to an instance of the Q15 PID structure. * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - +void arm_pid_init_q31(arm_pid_instance_q31 *S, int32_t resetStateFlag); - /** +/** * @brief Reset function for the Q31 PID Control. * @param[in,out] S points to an instance of the Q31 PID Control structure */ - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - +void arm_pid_reset_q31(arm_pid_instance_q31 *S); - /** +/** * @brief Initialization function for the Q15 PID Control. * @param[in,out] S points to an instance of the Q15 PID structure. * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); +void arm_pid_init_q15(arm_pid_instance_q15 *S, int32_t resetStateFlag); - - /** +/** * @brief Reset function for the Q15 PID Control. * @param[in,out] S points to an instance of the q15 PID Control structure */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - +void arm_pid_reset_q15(arm_pid_instance_q15 *S); - - - - /** +/** * @ingroup PID * @brief Process function for the floating-point PID Control. * @param[in,out] S is an instance of the floating-point PID Control structure * @param[in] in input sample to process * @return processed output sample. */ - __STATIC_FORCEINLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { +__STATIC_FORCEINLINE float32_t arm_pid_f32(arm_pid_instance_f32 *S, float32_t in) +{ float32_t out; /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + out = (S->A0 * in) + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); /* Update state */ S->state[1] = S->state[0]; @@ -301,8 +263,7 @@ extern "C" /* return to application */ return (out); - - } +} /** @ingroup PID @@ -318,24 +279,22 @@ extern "C" In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. */ -__STATIC_FORCEINLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { +__STATIC_FORCEINLINE q31_t arm_pid_q31(arm_pid_instance_q31 *S, q31_t in) +{ q63_t acc; q31_t out; /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; + acc = (q63_t)S->A0 * in; /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; + acc += (q63_t)S->A1 * S->state[0]; /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; + acc += (q63_t)S->A2 * S->state[1]; /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31U); + out = (q31_t)(acc >> 31U); /* out += y[n-1] */ out += S->state[2]; @@ -347,8 +306,7 @@ __STATIC_FORCEINLINE q31_t arm_pid_q31( /* return to application */ return (out); - } - +} /** @ingroup PID @@ -365,35 +323,33 @@ __STATIC_FORCEINLINE q31_t arm_pid_q31( After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. Lastly, the accumulator is saturated to yield a result in 1.15 format. */ -__STATIC_FORCEINLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { +__STATIC_FORCEINLINE q15_t arm_pid_q15(arm_pid_instance_q15 *S, q15_t in) +{ q63_t acc; q15_t out; -#if defined (ARM_MATH_DSP) +#if defined(ARM_MATH_DSP) /* Implementation of PID controller */ /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + acc = (q31_t)__SMUAD((uint32_t)S->A0, (uint32_t)in); /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2(S->state), (uint64_t)acc); #else /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; + acc = ((q31_t)S->A0) * in; /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; + acc += (q31_t)S->A1 * S->state[0]; + acc += (q31_t)S->A2 * S->state[1]; #endif /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; + acc += (q31_t)S->state[2] << 15; /* saturate the output */ - out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16)); + out = (q15_t)(__SSAT((q31_t)(acc >> 15), 16)); /* Update state */ S->state[1] = S->state[0]; @@ -402,15 +358,13 @@ __STATIC_FORCEINLINE q15_t arm_pid_q15( /* return to application */ return (out); - } - - +} - /** +/** * @ingroup groupController */ - /** +/** * @defgroup park Vector Park Transform * * Forward Park transform converts the input two-coordinate vector to flux and torque components. @@ -434,9 +388,7 @@ __STATIC_FORCEINLINE q15_t arm_pid_q15( * Refer to the function specific documentation below for usage guidelines. */ - - - /** +/** * @ingroup park * @brief Floating-point Park transform * @param[in] Ialpha input two-phase vector coordinate alpha @@ -449,21 +401,15 @@ __STATIC_FORCEINLINE q15_t arm_pid_q15( * The function implements the forward Park transform. * */ - __STATIC_FORCEINLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { +__STATIC_FORCEINLINE void arm_park_f32(float32_t Ialpha, float32_t Ibeta, float32_t *pId, + float32_t *pIq, float32_t sinVal, float32_t cosVal) +{ /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ *pId = Ialpha * cosVal + Ibeta * sinVal; /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ *pIq = -Ialpha * sinVal + Ibeta * cosVal; - } - +} /** @ingroup park @@ -480,44 +426,36 @@ __STATIC_FORCEINLINE q15_t arm_pid_q15( The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. There is saturation on the addition and subtraction, hence there is no risk of overflow. */ -__STATIC_FORCEINLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ +__STATIC_FORCEINLINE void arm_park_q31(q31_t Ialpha, q31_t Ibeta, q31_t *pId, q31_t *pIq, + q31_t sinVal, q31_t cosVal) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + product1 = (q31_t)(((q63_t)(Ialpha) * (cosVal)) >> 31); /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - + product2 = (q31_t)(((q63_t)(Ibeta) * (sinVal)) >> 31); /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + product3 = (q31_t)(((q63_t)(Ialpha) * (sinVal)) >> 31); /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + product4 = (q31_t)(((q63_t)(Ibeta) * (cosVal)) >> 31); /* Calculate pId by adding the two intermediate products 1 and 2 */ *pId = __QADD(product1, product2); /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ *pIq = __QSUB(product4, product3); - } - - +} - /** +/** * @ingroup groupController */ - /** +/** * @defgroup inv_park Vector Inverse Park transform * Inverse Park transform converts the input flux and torque components to two-coordinate vector. * @@ -534,9 +472,7 @@ __STATIC_FORCEINLINE void arm_park_q31( * Refer to the function specific documentation below for usage guidelines. */ - - - /** +/** * @ingroup inv_park * @brief Floating-point Inverse Park transform * @param[in] Id input coordinate of rotor reference frame d @@ -546,21 +482,15 @@ __STATIC_FORCEINLINE void arm_park_q31( * @param[in] sinVal sine value of rotation angle theta * @param[in] cosVal cosine value of rotation angle theta */ - __STATIC_FORCEINLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { +__STATIC_FORCEINLINE void arm_inv_park_f32(float32_t Id, float32_t Iq, float32_t *pIalpha, + float32_t *pIbeta, float32_t sinVal, float32_t cosVal) +{ /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ *pIalpha = Id * cosVal - Iq * sinVal; /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ *pIbeta = Id * sinVal + Iq * cosVal; - } - +} /** @ingroup inv_park @@ -577,43 +507,36 @@ __STATIC_FORCEINLINE void arm_park_q31( The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. There is saturation on the addition, hence there is no risk of overflow. */ -__STATIC_FORCEINLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ +__STATIC_FORCEINLINE void arm_inv_park_q31(q31_t Id, q31_t Iq, q31_t *pIalpha, q31_t *pIbeta, + q31_t sinVal, q31_t cosVal) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + product1 = (q31_t)(((q63_t)(Id) * (cosVal)) >> 31); /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - + product2 = (q31_t)(((q63_t)(Iq) * (sinVal)) >> 31); /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + product3 = (q31_t)(((q63_t)(Id) * (sinVal)) >> 31); /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + product4 = (q31_t)(((q63_t)(Iq) * (cosVal)) >> 31); /* Calculate pIalpha by using the two intermediate products 1 and 2 */ *pIalpha = __QSUB(product1, product2); /* Calculate pIbeta by using the two intermediate products 3 and 4 */ *pIbeta = __QADD(product4, product3); - } - +} /** * @ingroup groupController */ - /** +/** * @defgroup clarke Vector Clarke Transform * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents @@ -635,8 +558,7 @@ __STATIC_FORCEINLINE void arm_inv_park_q31( * Refer to the function specific documentation below for usage guidelines. */ - - /** +/** * * @ingroup clarke * @brief Floating-point Clarke transform @@ -645,19 +567,15 @@ __STATIC_FORCEINLINE void arm_inv_park_q31( * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha * @param[out] pIbeta points to output two-phase orthogonal vector axis beta */ - __STATIC_FORCEINLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { +__STATIC_FORCEINLINE void arm_clarke_f32(float32_t Ia, float32_t Ib, float32_t *pIalpha, + float32_t *pIbeta) +{ /* Calculate pIalpha using the equation, pIalpha = Ia */ *pIalpha = Ia; /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ *pIbeta = (0.57735026919f * Ia + 1.15470053838f * Ib); - } - +} /** @ingroup clarke @@ -672,34 +590,28 @@ __STATIC_FORCEINLINE void arm_inv_park_q31( The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. There is saturation on the addition, hence there is no risk of overflow. */ -__STATIC_FORCEINLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ +__STATIC_FORCEINLINE void arm_clarke_q31(q31_t Ia, q31_t Ib, q31_t *pIalpha, q31_t *pIbeta) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ /* Calculating pIalpha from Ia by equation pIalpha = Ia */ *pIalpha = Ia; /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + product1 = (q31_t)(((q63_t)Ia * 0x24F34E8B) >> 30); /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + product2 = (q31_t)(((q63_t)Ib * 0x49E69D16) >> 30); /* pIbeta is calculated by adding the intermediate products */ *pIbeta = __QADD(product1, product2); - } - - +} - /** +/** * @ingroup groupController */ - /** +/** * @defgroup inv_clarke Vector Inverse Clarke Transform * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. * @@ -715,9 +627,7 @@ __STATIC_FORCEINLINE void arm_clarke_q31( * Refer to the function specific documentation below for usage guidelines. */ - - - /** +/** * @ingroup inv_clarke * @brief Floating-point Inverse Clarke transform * @param[in] Ialpha input two-phase orthogonal vector axis alpha @@ -725,19 +635,15 @@ __STATIC_FORCEINLINE void arm_clarke_q31( * @param[out] pIa points to output three-phase coordinate a * @param[out] pIb points to output three-phase coordinate b */ - __STATIC_FORCEINLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { +__STATIC_FORCEINLINE void arm_inv_clarke_f32(float32_t Ialpha, float32_t Ibeta, float32_t *pIa, + float32_t *pIb) +{ /* Calculating pIa from Ialpha by equation pIa = Ialpha */ *pIa = Ialpha; /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; - } - +} /** @ingroup inv_clarke @@ -752,33 +658,24 @@ __STATIC_FORCEINLINE void arm_clarke_q31( The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. There is saturation on the subtraction, hence there is no risk of overflow. */ -__STATIC_FORCEINLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ +__STATIC_FORCEINLINE void arm_inv_clarke_q31(q31_t Ialpha, q31_t Ibeta, q31_t *pIa, q31_t *pIb) +{ + q31_t product1, product2; /* Temporary variables used to store intermediate results */ /* Calculating pIa from Ialpha by equation pIa = Ialpha */ *pIa = Ialpha; /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + product1 = (q31_t)(((q63_t)(Ialpha) * (0x40000000)) >> 31); /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + product2 = (q31_t)(((q63_t)(Ibeta) * (0x6ED9EBA1)) >> 31); /* pIb is calculated by subtracting the products */ *pIb = __QSUB(product2, product1); - } - - - - +} - -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions_f16.h old mode 100755 new mode 100644 index a4622ec3d5..94b6ddc175 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/controller_functions_f16.h @@ -23,18 +23,16 @@ * limitations under the License. */ - #ifndef CONTROLLER_FUNCTIONS_F16_H_ #define CONTROLLER_FUNCTIONS_F16_H_ -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/debug.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/debug.h index b98e038931..c53c6f28c1 100644 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/debug.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/debug.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef DEBUG_FUNCTIONS_H_ #define DEBUG_FUNCTIONS_H_ @@ -38,108 +37,98 @@ #include -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) -#define PROW_f16(S,NB) \ -{ \ - printf("{%f",(double)(S)[0]); \ - for(unsigned int i=1;i<(NB) ;i++) \ - { \ - printf(",%f",(double)(S)[i]);\ - } \ - printf("}"); \ -}; - -#define PV_f16(S,V,NB)\ -{ \ - printf("%s=",(S)); \ - PROW_f16((V),(NB)); \ - printf(";\n"); \ -}; - -#define PM_f16(S,M) \ -{ \ - printf("%s={",(S)); \ - for(unsigned int row=0;row<(M)->numRows;row++) \ - { \ - if (row != 0) \ - { \ - printf("\n,"); \ - } \ - PROW_f16((M)->pData + row * (M)->numCols, (M)->numCols);\ - } \ - printf("};\n"); \ -} - -#endif - -#define PROW_f32(S,NB) \ -{ \ - printf("{%f",(double)(S)[0]); \ - for(unsigned int i=1;i<(NB) ;i++) \ - { \ - printf(",%f",(double)(S)[i]);\ - } \ - printf("}"); \ -}; - -#define PV_f32(S,V,NB)\ -{ \ - printf("%s=",(S)); \ - PROW_f32((V),(NB)); \ - printf(";\n"); \ -}; - -#define PM_f32(S,M) \ -{ \ - printf("%s={",(S)); \ - for(unsigned int row=0;row<(M)->numRows;row++) \ - { \ - if (row != 0) \ - { \ - printf("\n,"); \ - } \ - PROW_f32((M)->pData + row * (M)->numCols, (M)->numCols);\ - } \ - printf("};\n"); \ -} +#define PROW_f16(S, NB) \ + { \ + printf("{%f", (double)(S)[0]); \ + for (unsigned int i = 1; i < (NB); i++) { \ + printf(",%f", (double)(S)[i]); \ + } \ + printf("}"); \ + }; + +#define PV_f16(S, V, NB) \ + { \ + printf("%s=", (S)); \ + PROW_f16((V), (NB)); \ + printf(";\n"); \ + }; + +#define PM_f16(S, M) \ + { \ + printf("%s={", (S)); \ + for (unsigned int row = 0; row < (M)->numRows; row++) { \ + if (row != 0) { \ + printf("\n,"); \ + } \ + PROW_f16((M)->pData + row * (M)->numCols, (M)->numCols); \ + } \ + printf("};\n"); \ + } -#define PROW_f64(S,NB) \ -{ \ - printf("{%.20g",(double)(S)[0]); \ - for(unsigned int i=1;i<(NB) ;i++) \ - { \ - printf(",%.20g",(double)(S)[i]);\ - } \ - printf("}"); \ -}; - -#define PV_f64(S,V,NB) \ -{ \ - printf("%s=",(S)); \ - PROW_f64((V),(NB));\ - printf(";\n"); \ -}; - -#define PM_f64(S,M) \ -{ \ - printf("%s={",(S)); \ - for(unsigned int row=0;row<(M)->numRows;row++) \ - { \ - if (row != 0) \ - { \ - printf("\n,"); \ - } \ - PROW_f64((M)->pData + row * (M)->numCols, (M)->numCols);\ - } \ - printf("};\n"); \ -} +#endif -#ifdef __cplusplus +#define PROW_f32(S, NB) \ + { \ + printf("{%f", (double)(S)[0]); \ + for (unsigned int i = 1; i < (NB); i++) { \ + printf(",%f", (double)(S)[i]); \ + } \ + printf("}"); \ + }; + +#define PV_f32(S, V, NB) \ + { \ + printf("%s=", (S)); \ + PROW_f32((V), (NB)); \ + printf(";\n"); \ + }; + +#define PM_f32(S, M) \ + { \ + printf("%s={", (S)); \ + for (unsigned int row = 0; row < (M)->numRows; row++) { \ + if (row != 0) { \ + printf("\n,"); \ + } \ + PROW_f32((M)->pData + row * (M)->numCols, (M)->numCols); \ + } \ + printf("};\n"); \ + } + +#define PROW_f64(S, NB) \ + { \ + printf("{%.20g", (double)(S)[0]); \ + for (unsigned int i = 1; i < (NB); i++) { \ + printf(",%.20g", (double)(S)[i]); \ + } \ + printf("}"); \ + }; + +#define PV_f64(S, V, NB) \ + { \ + printf("%s=", (S)); \ + PROW_f64((V), (NB)); \ + printf(";\n"); \ + }; + +#define PM_f64(S, M) \ + { \ + printf("%s={", (S)); \ + for (unsigned int row = 0; row < (M)->numRows; row++) { \ + if (row != 0) { \ + printf("\n,"); \ + } \ + PROW_f64((M)->pData + row * (M)->numCols, (M)->numCols); \ + } \ + printf("};\n"); \ + } + +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions.h old mode 100755 new mode 100644 index 995efab8b6..433b0a4a63 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef DISTANCE_FUNCTIONS_H_ #define DISTANCE_FUNCTIONS_H_ @@ -38,12 +37,10 @@ #include "dsp/fast_math_functions.h" #include "dsp/matrix_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** * @defgroup groupDistance Distance Functions * @@ -53,11 +50,11 @@ extern "C" */ /* 6.14 bug */ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) - +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) + __attribute__((weak)) float __powisf2(float a, int b); -#endif +#endif /** * @brief Euclidean distance between two vectors @@ -68,7 +65,7 @@ __attribute__((weak)) float __powisf2(float a, int b); * */ -float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); +float32_t arm_euclidean_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Euclidean distance between two vectors @@ -79,7 +76,7 @@ float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, ui * */ -float64_t arm_euclidean_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); +float64_t arm_euclidean_distance_f64(const float64_t *pA, const float64_t *pB, uint32_t blockSize); /** * @brief Bray-Curtis distance between two vectors @@ -89,7 +86,7 @@ float64_t arm_euclidean_distance_f64(const float64_t *pA,const float64_t *pB, ui * @return distance * */ -float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); +float32_t arm_braycurtis_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Canberra distance between two vectors @@ -104,8 +101,7 @@ float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, u * @return distance * */ -float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - +float32_t arm_canberra_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Chebyshev distance between two vectors @@ -115,8 +111,7 @@ float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uin * @return distance * */ -float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - +float32_t arm_chebyshev_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Chebyshev distance between two vectors @@ -126,8 +121,7 @@ float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, ui * @return distance * */ -float64_t arm_chebyshev_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); - +float64_t arm_chebyshev_distance_f64(const float64_t *pA, const float64_t *pB, uint32_t blockSize); /** * @brief Cityblock (Manhattan) distance between two vectors @@ -137,7 +131,7 @@ float64_t arm_chebyshev_distance_f64(const float64_t *pA,const float64_t *pB, ui * @return distance * */ -float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); +float32_t arm_cityblock_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Cityblock (Manhattan) distance between two vectors @@ -147,7 +141,7 @@ float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, ui * @return distance * */ -float64_t arm_cityblock_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); +float64_t arm_cityblock_distance_f64(const float64_t *pA, const float64_t *pB, uint32_t blockSize); /** * @brief Correlation distance between two vectors @@ -160,7 +154,7 @@ float64_t arm_cityblock_distance_f64(const float64_t *pA,const float64_t *pB, ui * @return distance * */ -float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize); +float32_t arm_correlation_distance_f32(float32_t *pA, float32_t *pB, uint32_t blockSize); /** * @brief Cosine distance between two vectors @@ -172,7 +166,7 @@ float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blo * */ -float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); +float32_t arm_cosine_distance_f32(const float32_t *pA, const float32_t *pB, uint32_t blockSize); /** * @brief Cosine distance between two vectors @@ -184,7 +178,7 @@ float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint3 * */ -float64_t arm_cosine_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); +float64_t arm_cosine_distance_f64(const float64_t *pA, const float64_t *pB, uint32_t blockSize); /** * @brief Jensen-Shannon distance between two vectors @@ -206,7 +200,8 @@ float64_t arm_cosine_distance_f64(const float64_t *pA,const float64_t *pB, uint3 * */ -float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize); +float32_t arm_jensenshannon_distance_f32(const float32_t *pA, const float32_t *pB, + uint32_t blockSize); /** * @brief Minkowski distance between two vectors @@ -219,9 +214,8 @@ float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB * */ - - -float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize); +float32_t arm_minkowski_distance_f32(const float32_t *pA, const float32_t *pB, int32_t order, + uint32_t blockSize); /** * @brief Dice distance between two vectors @@ -234,7 +228,6 @@ float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, in * */ - float32_t arm_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); /** @@ -283,7 +276,8 @@ float32_t arm_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_ * */ -float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); +float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, + uint32_t numberOfBools); /** * @brief Russell-Rao distance between two vectors @@ -307,7 +301,8 @@ float32_t arm_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32 * */ -float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); +float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, + uint32_t numberOfBools); /** * @brief Sokal-Sneath distance between two vectors @@ -333,12 +328,11 @@ float32_t arm_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint3 float32_t arm_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); -typedef enum - { +typedef enum { ARM_DTW_SAKOE_CHIBA_WINDOW = 1, /*ARM_DTW_ITAKURA_WINDOW = 2,*/ ARM_DTW_SLANTED_BAND_WINDOW = 3 - } arm_dtw_window; +} arm_dtw_window; /** * @brief Window for dynamic time warping computation @@ -348,8 +342,7 @@ typedef enum * @return Error if window type not recognized * */ -arm_status arm_dtw_init_window_q7(const arm_dtw_window windowType, - const int32_t windowSize, +arm_status arm_dtw_init_window_q7(const arm_dtw_window windowType, const int32_t windowSize, arm_matrix_instance_q7 *pWindow); /** @@ -363,10 +356,8 @@ arm_status arm_dtw_init_window_q7(const arm_dtw_window windowType, */ arm_status arm_dtw_distance_f32(const arm_matrix_instance_f32 *pDistance, - const arm_matrix_instance_q7 *pWindow, - arm_matrix_instance_f32 *pDTW, - float32_t *distance); - + const arm_matrix_instance_q7 *pWindow, + arm_matrix_instance_f32 *pDTW, float32_t *distance); /** * @brief Mapping between query and template @@ -376,10 +367,8 @@ arm_status arm_dtw_distance_f32(const arm_matrix_instance_f32 *pDistance, * */ -void arm_dtw_path_f32(const arm_matrix_instance_f32 *pDTW, - int16_t *pPath, - uint32_t *pathLength); -#ifdef __cplusplus +void arm_dtw_path_f32(const arm_matrix_instance_f32 *pDTW, int16_t *pPath, uint32_t *pathLength); +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions_f16.h old mode 100755 new mode 100644 index 224d814997..3a1933bffe --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/distance_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef DISTANCE_FUNCTIONS_F16_H_ #define DISTANCE_FUNCTIONS_F16_H_ @@ -34,19 +33,18 @@ #include "dsp/utils.h" /* 6.14 bug */ -#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) /* Defined in minkowski_f32 */ __attribute__((weak)) float __powisf2(float a, int b); -#endif +#endif #include "dsp/statistics_functions_f16.h" #include "dsp/basic_math_functions_f16.h" #include "dsp/fast_math_functions_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) @@ -58,8 +56,7 @@ extern "C" * @param[in] blockSize vector length * @return distance */ -float16_t arm_euclidean_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); - +float16_t arm_euclidean_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Bray-Curtis distance between two vectors @@ -68,7 +65,7 @@ float16_t arm_euclidean_distance_f16(const float16_t *pA,const float16_t *pB, ui * @param[in] blockSize vector length * @return distance */ -float16_t arm_braycurtis_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); +float16_t arm_braycurtis_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Canberra distance between two vectors @@ -82,8 +79,7 @@ float16_t arm_braycurtis_distance_f16(const float16_t *pA,const float16_t *pB, u * @param[in] blockSize vector length * @return distance */ -float16_t arm_canberra_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); - +float16_t arm_canberra_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Chebyshev distance between two vectors @@ -92,8 +88,7 @@ float16_t arm_canberra_distance_f16(const float16_t *pA,const float16_t *pB, uin * @param[in] blockSize vector length * @return distance */ -float16_t arm_chebyshev_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); - +float16_t arm_chebyshev_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Cityblock (Manhattan) distance between two vectors @@ -102,8 +97,7 @@ float16_t arm_chebyshev_distance_f16(const float16_t *pA,const float16_t *pB, ui * @param[in] blockSize vector length * @return distance */ -float16_t arm_cityblock_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); - +float16_t arm_cityblock_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Correlation distance between two vectors @@ -115,8 +109,7 @@ float16_t arm_cityblock_distance_f16(const float16_t *pA,const float16_t *pB, ui * @param[in] blockSize vector length * @return distance */ -float16_t arm_correlation_distance_f16(float16_t *pA,float16_t *pB, uint32_t blockSize); - +float16_t arm_correlation_distance_f16(float16_t *pA, float16_t *pB, uint32_t blockSize); /** * @brief Cosine distance between two vectors @@ -126,8 +119,7 @@ float16_t arm_correlation_distance_f16(float16_t *pA,float16_t *pB, uint32_t blo * @param[in] blockSize vector length * @return distance */ -float16_t arm_cosine_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); - +float16_t arm_cosine_distance_f16(const float16_t *pA, const float16_t *pB, uint32_t blockSize); /** * @brief Jensen-Shannon distance between two vectors @@ -147,8 +139,8 @@ float16_t arm_cosine_distance_f16(const float16_t *pA,const float16_t *pB, uint3 * @param[in] blockSize vector length * @return distance */ -float16_t arm_jensenshannon_distance_f16(const float16_t *pA,const float16_t *pB,uint32_t blockSize); - +float16_t arm_jensenshannon_distance_f16(const float16_t *pA, const float16_t *pB, + uint32_t blockSize); /** * @brief Minkowski distance between two vectors @@ -159,11 +151,11 @@ float16_t arm_jensenshannon_distance_f16(const float16_t *pA,const float16_t *pB * @param[in] blockSize vector length * @return distance */ -float16_t arm_minkowski_distance_f16(const float16_t *pA,const float16_t *pB, int32_t order, uint32_t blockSize); - +float16_t arm_minkowski_distance_f16(const float16_t *pA, const float16_t *pB, int32_t order, + uint32_t blockSize); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions.h old mode 100755 new mode 100644 index 8e600ccff3..a4f348f9ab --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef FAST_MATH_FUNCTIONS_H_ #define FAST_MATH_FUNCTIONS_H_ @@ -37,29 +36,26 @@ #include -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** +/** * @brief Macros required for SINE and COSINE Fast math approximations */ -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) - +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) + #ifndef PI - #define PI 3.14159265358979f +#define PI 3.14159265358979f #endif -#ifndef PI_F64 - #define PI_F64 3.14159265358979323846 +#ifndef PI_F64 +#define PI_F64 3.14159265358979323846 #endif - - /** * @defgroup groupFastMath Fast Math Functions * This set of functions provides a fast approximation to sine, cosine, and square root. @@ -69,59 +65,47 @@ extern "C" * */ - - /** +/** * @brief Fast approximation to the trigonometric sine function for floating-point data. * @param[in] x input value in radians. * @return sin(x). */ - float32_t arm_sin_f32( - float32_t x); +float32_t arm_sin_f32(float32_t x); - - /** +/** * @brief Fast approximation to the trigonometric sine function for Q31 data. * @param[in] x Scaled input value in radians. * @return sin(x). */ - q31_t arm_sin_q31( - q31_t x); +q31_t arm_sin_q31(q31_t x); - /** +/** * @brief Fast approximation to the trigonometric sine function for Q15 data. * @param[in] x Scaled input value in radians. * @return sin(x). */ - q15_t arm_sin_q15( - q15_t x); - +q15_t arm_sin_q15(q15_t x); - /** +/** * @brief Fast approximation to the trigonometric cosine function for floating-point data. * @param[in] x input value in radians. * @return cos(x). */ - float32_t arm_cos_f32( - float32_t x); - +float32_t arm_cos_f32(float32_t x); - /** +/** * @brief Fast approximation to the trigonometric cosine function for Q31 data. * @param[in] x Scaled input value in radians. * @return cos(x). */ - q31_t arm_cos_q31( - q31_t x); +q31_t arm_cos_q31(q31_t x); - - /** +/** * @brief Fast approximation to the trigonometric cosine function for Q15 data. * @param[in] x Scaled input value in radians. * @return cos(x). */ - q15_t arm_cos_q15( - q15_t x); - +q15_t arm_cos_q15(q15_t x); /** @brief Floating-point vector of log values. @@ -129,12 +113,7 @@ extern "C" @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vlog_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - +void arm_vlog_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); /** @brief Floating-point vector of log values. @@ -142,34 +121,23 @@ extern "C" @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vlog_f64( - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - +void arm_vlog_f64(const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief q31 vector of log values. * @param[in] pSrc points to the input vector in q31 * @param[out] pDst points to the output vector in q5.26 * @param[in] blockSize number of samples in each vector */ - void arm_vlog_q31(const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_vlog_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief q15 vector of log values. * @param[in] pSrc points to the input vector in q15 * @param[out] pDst points to the output vector in q4.11 * @param[in] blockSize number of samples in each vector */ - void arm_vlog_q15(const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - +void arm_vlog_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize); /** @brief Floating-point vector of exp values. @@ -177,12 +145,7 @@ extern "C" @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vexp_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - +void arm_vexp_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); /** @brief Floating-point vector of exp values. @@ -190,14 +153,9 @@ extern "C" @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vexp_f64( - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - +void arm_vexp_f64(const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - - /** +/** * @defgroup SQRT Square Root * * Computes the square root of a number. @@ -217,8 +175,7 @@ extern "C" * */ - - /** +/** * @addtogroup SQRT * @{ */ @@ -231,49 +188,43 @@ extern "C" - \ref ARM_MATH_SUCCESS : input value is positive - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 */ -__STATIC_FORCEINLINE arm_status arm_sqrt_f32( - const float32_t in, - float32_t * pOut) - { - if (in >= 0.0f) - { -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - *pOut = __sqrtf(in); - #else - *pOut = sqrtf(in); - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); - #else - *pOut = sqrtf(in); - #endif - -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - *pOut = _sqrtf(in); +__STATIC_FORCEINLINE arm_status arm_sqrt_f32(const float32_t in, float32_t *pOut) +{ + if (in >= 0.0f) { +#if defined(__CC_ARM) +#if defined __TARGET_FPU_VFP + *pOut = __sqrtf(in); +#else + *pOut = sqrtf(in); +#endif + +#elif defined(__ICCARM__) +#if defined __ARMVFP__ + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); +#else + *pOut = sqrtf(in); +#endif + +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + *pOut = _sqrtf(in); #elif defined(__GNUC_PYTHON__) - *pOut = sqrtf(in); -#elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); - #else - *pOut = sqrtf(in); - #endif + *pOut = sqrtf(in); +#elif defined(__GNUC__) +#if defined(__VFP_FP__) && !defined(__SOFTFP__) + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); #else - *pOut = sqrtf(in); + *pOut = sqrtf(in); +#endif +#else + *pOut = sqrtf(in); #endif - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); + return (ARM_MATH_SUCCESS); + } else { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); } - } - +} /** @brief Q31 square root function. @@ -283,10 +234,7 @@ __STATIC_FORCEINLINE arm_status arm_sqrt_f32( - \ref ARM_MATH_SUCCESS : input value is positive - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 */ -arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - +arm_status arm_sqrt_q31(q31_t in, q31_t *pOut); /** @brief Q15 square root function. @@ -296,17 +244,13 @@ arm_status arm_sqrt_q31( - \ref ARM_MATH_SUCCESS : input value is positive - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 */ -arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - +arm_status arm_sqrt_q15(q15_t in, q15_t *pOut); - - /** +/** * @} end of SQRT group */ - /** +/** @brief Fixed point division @param[in] numerator Numerator @param[in] denominator Denominator @@ -318,12 +262,9 @@ arm_status arm_sqrt_q15( to the saturated negative or positive value. */ -arm_status arm_divide_q15(q15_t numerator, - q15_t denominator, - q15_t *quotient, - int16_t *shift); +arm_status arm_divide_q15(q15_t numerator, q15_t denominator, q15_t *quotient, int16_t *shift); - /** +/** @brief Fixed point division @param[in] numerator Numerator @param[in] denominator Denominator @@ -335,42 +276,36 @@ arm_status arm_divide_q15(q15_t numerator, to the saturated negative or positive value. */ -arm_status arm_divide_q31(q31_t numerator, - q31_t denominator, - q31_t *quotient, - int16_t *shift); - +arm_status arm_divide_q31(q31_t numerator, q31_t denominator, q31_t *quotient, int16_t *shift); - - /** +/** @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. @param[in] y y coordinate @param[in] x x coordinate @param[out] result Result @return error status. */ - arm_status arm_atan2_f32(float32_t y,float32_t x,float32_t *result); +arm_status arm_atan2_f32(float32_t y, float32_t x, float32_t *result); - - /** +/** @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. @param[in] y y coordinate @param[in] x x coordinate @param[out] result Result in Q2.29 @return error status. */ - arm_status arm_atan2_q31(q31_t y,q31_t x,q31_t *result); +arm_status arm_atan2_q31(q31_t y, q31_t x, q31_t *result); - /** +/** @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. @param[in] y y coordinate @param[in] x x coordinate @param[out] result Result in Q2.13 @return error status. */ - arm_status arm_atan2_q15(q15_t y,q15_t x,q15_t *result); +arm_status arm_atan2_q15(q15_t y, q15_t x, q15_t *result); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions_f16.h old mode 100755 new mode 100644 index 1fa45a86e1..731ab2a853 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/fast_math_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef FAST_MATH_FUNCTIONS_F16_H_ #define FAST_MATH_FUNCTIONS_F16_H_ @@ -36,14 +35,13 @@ /* For sqrt_f32 */ #include "dsp/fast_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - /** +/** * @addtogroup SQRT * @{ */ @@ -56,32 +54,26 @@ extern "C" - \ref ARM_MATH_SUCCESS : input value is positive - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 */ -__STATIC_FORCEINLINE arm_status arm_sqrt_f16( - float16_t in, - float16_t * pOut) - { +__STATIC_FORCEINLINE arm_status arm_sqrt_f16(float16_t in, float16_t *pOut) +{ float32_t r; arm_status status; - status=arm_sqrt_f32((float32_t)in,&r); - *pOut=(float16_t)r; - return(status); - } - + status = arm_sqrt_f32((float32_t)in, &r); + *pOut = (float16_t)r; + return (status); +} /** @} end of SQRT group */ - + /** @brief Floating-point vector of log values. @param[in] pSrc points to the input vector @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vlog_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_vlog_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); /** @brief Floating-point vector of exp values. @@ -89,33 +81,27 @@ __STATIC_FORCEINLINE arm_status arm_sqrt_f16( @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vexp_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_vexp_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** @brief Floating-point vector of inverse values. @param[in] pSrc points to the input vector @param[out] pDst points to the output vector @param[in] blockSize number of samples in each vector */ - void arm_vinverse_f16( - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_vinverse_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. @param[in] y y coordinate @param[in] x x coordinate @param[out] result Result @return error status. */ - arm_status arm_atan2_f16(float16_t y,float16_t x,float16_t *result); +arm_status arm_atan2_f16(float16_t y, float16_t x, float16_t *result); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions.h old mode 100755 new mode 100644 index fa149595bb..71ba95a582 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef FILTERING_FUNCTIONS_H_ #define FILTERING_FUNCTIONS_H_ @@ -36,84 +35,76 @@ #include "dsp/support_functions.h" #include "dsp/fast_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - -#define DELTA_Q31 ((q31_t)(0x100)) -#define DELTA_Q15 ((q15_t)0x5) +#define DELTA_Q31 ((q31_t)(0x100)) +#define DELTA_Q15 ((q15_t)0x5) /** * @defgroup groupFilters Filtering Functions */ - - /** + +/** * @brief Instance structure for the Q7 FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ +} arm_fir_instance_q7; - /** +/** * @brief Instance structure for the Q15 FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ +} arm_fir_instance_q15; - /** +/** * @brief Instance structure for the Q31 FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_q31; - /** +/** * @brief Instance structure for the floating-point FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_f32; - /** +/** * @brief Instance structure for the floating-point FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float64_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float64_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f64; +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float64_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float64_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_f64; - /** +/** * @brief Processing function for the Q7 FIR filter. * @param[in] S points to an instance of the Q7 FIR filter structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); +void arm_fir_q7(const arm_fir_instance_q7 *S, const q7_t *pSrc, q7_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the Q7 FIR filter. * @param[in,out] S points to an instance of the Q7 FIR structure. * @param[in] numTaps Number of filter coefficients in the filter. @@ -124,40 +115,29 @@ extern "C" * For the MVE version, the coefficient length must be a multiple of 16. * You can pad with zeros if you have less coefficients. */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); +void arm_fir_init_q7(arm_fir_instance_q7 *S, uint16_t numTaps, const q7_t *pCoeffs, q7_t *pState, + uint32_t blockSize); - /** +/** * @brief Processing function for the Q15 FIR filter. * @param[in] S points to an instance of the Q15 FIR structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_fir_q15(const arm_fir_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Processing function for the fast Q15 FIR filter (fast version). * @param[in] S points to an instance of the Q15 FIR filter structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_fir_fast_q15(const arm_fir_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, + uint32_t blockSize); - /** +/** * @brief Initialization function for the Q15 FIR filter. * @param[in,out] S points to an instance of the Q15 FIR filter structure. * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. @@ -172,40 +152,29 @@ extern "C" * You can pad with zeros if you have less coefficients. * */ - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); +arm_status arm_fir_init_q15(arm_fir_instance_q15 *S, uint16_t numTaps, const q15_t *pCoeffs, + q15_t *pState, uint32_t blockSize); - /** +/** * @brief Processing function for the Q31 FIR filter. * @param[in] S points to an instance of the Q31 FIR filter structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_fir_q31(const arm_fir_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Processing function for the fast Q31 FIR filter (fast version). * @param[in] S points to an instance of the Q31 FIR filter structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_fir_fast_q31(const arm_fir_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, + uint32_t blockSize); - /** +/** * @brief Initialization function for the Q31 FIR filter. * @param[in,out] S points to an instance of the Q31 FIR structure. * @param[in] numTaps Number of filter coefficients in the filter. @@ -216,40 +185,30 @@ extern "C" * For the MVE version, the coefficient length must be a multiple of 4. * You can pad with zeros if you have less coefficients. */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); +void arm_fir_init_q31(arm_fir_instance_q31 *S, uint16_t numTaps, const q31_t *pCoeffs, + q31_t *pState, uint32_t blockSize); - /** +/** * @brief Processing function for the floating-point FIR filter. * @param[in] S points to an instance of the floating-point FIR structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_fir_f32(const arm_fir_instance_f32 *S, const float32_t *pSrc, float32_t *pDst, + uint32_t blockSize); - /** +/** * @brief Processing function for the floating-point FIR filter. * @param[in] S points to an instance of the floating-point FIR structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_f64( - const arm_fir_instance_f64 * S, - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_fir_f64(const arm_fir_instance_f64 *S, const float64_t *pSrc, float64_t *pDst, + uint32_t blockSize); - /** +/** * @brief Initialization function for the floating-point FIR filter. * @param[in,out] S points to an instance of the floating-point FIR filter structure. * @param[in] numTaps Number of filter coefficients in the filter. @@ -257,14 +216,10 @@ extern "C" * @param[in] pState points to the state buffer. * @param[in] blockSize number of samples that are processed at a time. */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); +void arm_fir_init_f32(arm_fir_instance_f32 *S, uint16_t numTaps, const float32_t *pCoeffs, + float32_t *pState, uint32_t blockSize); - /** +/** * @brief Initialization function for the floating-point FIR filter. * @param[in,out] S points to an instance of the floating-point FIR filter structure. * @param[in] numTaps Number of filter coefficients in the filter. @@ -272,69 +227,68 @@ extern "C" * @param[in] pState points to the state buffer. * @param[in] blockSize number of samples that are processed at a time. */ - void arm_fir_init_f64( - arm_fir_instance_f64 * S, - uint16_t numTaps, - const float64_t * pCoeffs, - float64_t * pState, - uint32_t blockSize); +void arm_fir_init_f64(arm_fir_instance_f64 *S, uint16_t numTaps, const float64_t *pCoeffs, + float64_t *pState, uint32_t blockSize); - /** +/** * @brief Instance structure for the Q15 Biquad cascade filter. */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q15; +typedef struct { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t * + pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q15_t + *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ +} arm_biquad_casd_df1_inst_q15; - /** +/** * @brief Instance structure for the Q31 Biquad cascade filter. */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q31; +typedef struct { + uint32_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t * + pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t + *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ +} arm_biquad_casd_df1_inst_q31; - /** +/** * @brief Instance structure for the floating-point Biquad cascade filter. */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_casd_df1_inst_f32; +typedef struct { + uint32_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t * + pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t + *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_casd_df1_inst_f32; #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - /** +/** * @brief Instance structure for the modified Biquad coefs required by vectorized code. */ - typedef struct - { - float32_t coeffs[8][4]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ - } arm_biquad_mod_coef_f32; -#endif +typedef struct { + float32_t coeffs + [8] + [4]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ +} arm_biquad_mod_coef_f32; +#endif - /** +/** * @brief Processing function for the Q15 Biquad cascade filter. * @param[in] S points to an instance of the Q15 Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_q15(const arm_biquad_casd_df1_inst_q15 *S, const q15_t *pSrc, + q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the Q15 Biquad cascade filter. * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. * @param[in] numStages number of 2nd order stages in the filter. @@ -342,53 +296,40 @@ extern "C" * @param[in] pState points to the state buffer. * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format */ - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - const q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); +void arm_biquad_cascade_df1_init_q15(arm_biquad_casd_df1_inst_q15 *S, uint8_t numStages, + const q15_t *pCoeffs, q15_t *pState, int8_t postShift); - /** +/** * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. * @param[in] S points to an instance of the Q15 Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_fast_q15(const arm_biquad_casd_df1_inst_q15 *S, const q15_t *pSrc, + q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Processing function for the Q31 Biquad cascade filter * @param[in] S points to an instance of the Q31 Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_q31(const arm_biquad_casd_df1_inst_q31 *S, const q31_t *pSrc, + q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. * @param[in] S points to an instance of the Q31 Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_fast_q31(const arm_biquad_casd_df1_inst_q31 *S, const q31_t *pSrc, + q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the Q31 Biquad cascade filter. * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. * @param[in] numStages number of 2nd order stages in the filter. @@ -396,27 +337,20 @@ extern "C" * @param[in] pState points to the state buffer. * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format */ - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); +void arm_biquad_cascade_df1_init_q31(arm_biquad_casd_df1_inst_q31 *S, uint8_t numStages, + const q31_t *pCoeffs, q31_t *pState, int8_t postShift); - /** +/** * @brief Processing function for the floating-point Biquad cascade filter. * @param[in] S points to an instance of the floating-point Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_f32(const arm_biquad_casd_df1_inst_f32 *S, const float32_t *pSrc, + float32_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the floating-point Biquad cascade filter. * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. * @param[in] numStages number of 2nd order stages in the filter. @@ -425,20 +359,13 @@ extern "C" * @param[in] pState points to the state buffer. */ #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - void arm_biquad_cascade_df1_mve_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - arm_biquad_mod_coef_f32 * pCoeffsMod, - float32_t * pState); +void arm_biquad_cascade_df1_mve_init_f32(arm_biquad_casd_df1_inst_f32 *S, uint8_t numStages, + const float32_t *pCoeffs, + arm_biquad_mod_coef_f32 *pCoeffsMod, float32_t *pState); #endif - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); +void arm_biquad_cascade_df1_init_f32(arm_biquad_casd_df1_inst_f32 *S, uint8_t numStages, + const float32_t *pCoeffs, float32_t *pState); /** * @brief Convolution of floating-point sequences. @@ -448,15 +375,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. */ - void arm_conv_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - +void arm_conv_f32(const float32_t *pSrcA, uint32_t srcALen, const float32_t *pSrcB, + uint32_t srcBLen, float32_t *pDst); - /** +/** * @brief Convolution of Q15 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -466,15 +388,8 @@ extern "C" * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). */ - void arm_conv_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - +void arm_conv_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, + q15_t *pDst, q15_t *pScratch1, q15_t *pScratch2); /** * @brief Convolution of Q15 sequences. @@ -484,15 +399,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. */ - void arm_conv_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - +void arm_conv_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, + q15_t *pDst); - /** +/** * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -500,15 +410,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. */ - void arm_conv_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - +void arm_conv_fast_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, + q15_t *pDst); - /** +/** * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -518,17 +423,10 @@ extern "C" * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). */ - void arm_conv_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - +void arm_conv_fast_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, q15_t *pScratch1, q15_t *pScratch2); - /** +/** * @brief Convolution of Q31 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -536,15 +434,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. */ - void arm_conv_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - +void arm_conv_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, + q31_t *pDst); - /** +/** * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -552,15 +445,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. */ - void arm_conv_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - +void arm_conv_fast_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, + q31_t *pDst); - /** +/** * @brief Convolution of Q7 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -570,17 +458,10 @@ extern "C" * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). */ - void arm_conv_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - +void arm_conv_opt_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, + q7_t *pDst, q15_t *pScratch1, q15_t *pScratch2); - /** +/** * @brief Convolution of Q7 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -588,15 +469,10 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. */ - void arm_conv_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - +void arm_conv_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, + q7_t *pDst); - /** +/** * @brief Partial convolution of floating-point sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -607,17 +483,11 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - +arm_status arm_conv_partial_f32(const float32_t *pSrcA, uint32_t srcALen, const float32_t *pSrcB, + uint32_t srcBLen, float32_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - /** +/** * @brief Partial convolution of Q15 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -630,19 +500,11 @@ extern "C" * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - +arm_status arm_conv_partial_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, uint32_t firstIndex, + uint32_t numPoints, q15_t *pScratch1, q15_t *pScratch2); - /** +/** * @brief Partial convolution of Q15 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -653,17 +515,11 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - +arm_status arm_conv_partial_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - /** +/** * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -674,17 +530,11 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - +arm_status arm_conv_partial_fast_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - /** +/** * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -697,19 +547,11 @@ extern "C" * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - +arm_status arm_conv_partial_fast_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, uint32_t firstIndex, + uint32_t numPoints, q15_t *pScratch1, q15_t *pScratch2); - /** +/** * @brief Partial convolution of Q31 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -720,17 +562,11 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - +arm_status arm_conv_partial_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, + uint32_t srcBLen, q31_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - /** +/** * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -741,17 +577,11 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - +arm_status arm_conv_partial_fast_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, + uint32_t srcBLen, q31_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - /** +/** * @brief Partial convolution of Q7 sequences * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -764,17 +594,9 @@ extern "C" * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - +arm_status arm_conv_partial_opt_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, + uint32_t srcBLen, q7_t *pDst, uint32_t firstIndex, + uint32_t numPoints, q15_t *pScratch1, q15_t *pScratch2); /** * @brief Partial convolution of Q7 sequences. @@ -787,75 +609,65 @@ extern "C" * @param[in] numPoints is the number of output points to be computed. * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. */ - arm_status arm_conv_partial_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); +arm_status arm_conv_partial_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, + uint32_t srcBLen, q7_t *pDst, uint32_t firstIndex, + uint32_t numPoints); - - /** +/** * @brief Instance structure for the Q15 FIR decimator. */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; +typedef struct { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_q15; - /** +/** * @brief Instance structure for the Q31 FIR decimator. */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q31; +typedef struct { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_q31; /** @brief Instance structure for single precision floating-point FIR decimator. */ -typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_f32; - - /** +typedef struct { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_f32; + +/** @brief Instance structure for double precision floating-point FIR decimator. */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const float64_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float64_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_f64; - - /** +typedef struct { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const float64_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float64_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ +} arm_fir_decimate_instance_f64; + +/** @brief Processing function for floating-point FIR decimator. @param[in] S points to an instance of the floating-point FIR decimator structure @param[in] pSrc points to the block of input data @param[out] pDst points to the block of output data @param[in] blockSize number of samples to process */ - void arm_fir_decimate_f64( - const arm_fir_decimate_instance_f64 * S, - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_fir_decimate_f64(const arm_fir_decimate_instance_f64 *S, const float64_t *pSrc, + float64_t *pDst, uint32_t blockSize); - - /** +/** @brief Initialization function for the floating-point FIR decimator. @param[in,out] S points to an instance of the floating-point FIR decimator structure @param[in] numTaps number of coefficients in the filter @@ -867,28 +679,19 @@ typedef struct - \ref ARM_MATH_SUCCESS : Operation successful - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M */ - arm_status arm_fir_decimate_init_f64( - arm_fir_decimate_instance_f64 * S, - uint16_t numTaps, - uint8_t M, - const float64_t * pCoeffs, - float64_t * pState, - uint32_t blockSize); +arm_status arm_fir_decimate_init_f64(arm_fir_decimate_instance_f64 *S, uint16_t numTaps, uint8_t M, + const float64_t *pCoeffs, float64_t *pState, + uint32_t blockSize); - - /** +/** @brief Processing function for floating-point FIR decimator. @param[in] S points to an instance of the floating-point FIR decimator structure @param[in] pSrc points to the block of input data @param[out] pDst points to the block of output data @param[in] blockSize number of samples to process */ -void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - +void arm_fir_decimate_f32(const arm_fir_decimate_instance_f32 *S, const float32_t *pSrc, + float32_t *pDst, uint32_t blockSize); /** @brief Initialization function for the floating-point FIR decimator. @@ -902,44 +705,31 @@ void arm_fir_decimate_f32( - \ref ARM_MATH_SUCCESS : Operation successful - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M */ -arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - +arm_status arm_fir_decimate_init_f32(arm_fir_decimate_instance_f32 *S, uint16_t numTaps, uint8_t M, + const float32_t *pCoeffs, float32_t *pState, + uint32_t blockSize); - /** +/** * @brief Processing function for the Q15 FIR decimator. * @param[in] S points to an instance of the Q15 FIR decimator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_fir_decimate_q15(const arm_fir_decimate_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, + uint32_t blockSize); - /** +/** * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. * @param[in] S points to an instance of the Q15 FIR decimator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_fir_decimate_fast_q15(const arm_fir_decimate_instance_q15 *S, const q15_t *pSrc, + q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the Q15 FIR decimator. * @param[in,out] S points to an instance of the Q15 FIR decimator structure. * @param[in] numTaps number of coefficients in the filter. @@ -950,43 +740,30 @@ arm_status arm_fir_decimate_init_f32( * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if * blockSize is not a multiple of M. */ - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - +arm_status arm_fir_decimate_init_q15(arm_fir_decimate_instance_q15 *S, uint16_t numTaps, uint8_t M, + const q15_t *pCoeffs, q15_t *pState, uint32_t blockSize); - /** +/** * @brief Processing function for the Q31 FIR decimator. * @param[in] S points to an instance of the Q31 FIR decimator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_fir_decimate_q31(const arm_fir_decimate_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, + uint32_t blockSize); - /** +/** * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. * @param[in] S points to an instance of the Q31 FIR decimator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_decimate_fast_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_fir_decimate_fast_q31(const arm_fir_decimate_instance_q31 *S, const q31_t *pSrc, + q31_t *pDst, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q31 FIR decimator. * @param[in,out] S points to an instance of the Q31 FIR decimator structure. * @param[in] numTaps number of coefficients in the filter. @@ -997,64 +774,56 @@ arm_status arm_fir_decimate_init_f32( * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if * blockSize is not a multiple of M. */ - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); +arm_status arm_fir_decimate_init_q31(arm_fir_decimate_instance_q31 *S, uint16_t numTaps, uint8_t M, + const q31_t *pCoeffs, q31_t *pState, uint32_t blockSize); - - /** +/** * @brief Instance structure for the Q15 FIR interpolator. */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; +typedef struct { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q15_t + *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t * + pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ +} arm_fir_interpolate_instance_q15; - /** +/** * @brief Instance structure for the Q31 FIR interpolator. */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; +typedef struct { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q31_t + *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t * + pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ +} arm_fir_interpolate_instance_q31; - /** +/** * @brief Instance structure for the floating-point FIR interpolator. */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; +typedef struct { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const float32_t + *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t * + pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ +} arm_fir_interpolate_instance_f32; - - /** +/** * @brief Processing function for the Q15 FIR interpolator. * @param[in] S points to an instance of the Q15 FIR interpolator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_fir_interpolate_q15(const arm_fir_interpolate_instance_q15 *S, const q15_t *pSrc, + q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q15 FIR interpolator. * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. * @param[in] L upsample factor. @@ -1065,30 +834,21 @@ arm_status arm_fir_decimate_init_f32( * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if * the filter length numTaps is not a multiple of the interpolation factor L. */ - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); +arm_status arm_fir_interpolate_init_q15(arm_fir_interpolate_instance_q15 *S, uint8_t L, + uint16_t numTaps, const q15_t *pCoeffs, q15_t *pState, + uint32_t blockSize); - - /** +/** * @brief Processing function for the Q31 FIR interpolator. * @param[in] S points to an instance of the Q15 FIR interpolator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_fir_interpolate_q31(const arm_fir_interpolate_instance_q31 *S, const q31_t *pSrc, + q31_t *pDst, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q31 FIR interpolator. * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. * @param[in] L upsample factor. @@ -1099,30 +859,21 @@ arm_status arm_fir_decimate_init_f32( * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if * the filter length numTaps is not a multiple of the interpolation factor L. */ - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); +arm_status arm_fir_interpolate_init_q31(arm_fir_interpolate_instance_q31 *S, uint8_t L, + uint16_t numTaps, const q31_t *pCoeffs, q31_t *pState, + uint32_t blockSize); - - /** +/** * @brief Processing function for the floating-point FIR interpolator. * @param[in] S points to an instance of the floating-point FIR interpolator structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_fir_interpolate_f32(const arm_fir_interpolate_instance_f32 *S, const float32_t *pSrc, + float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Initialization function for the floating-point FIR interpolator. * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. * @param[in] L upsample factor. @@ -1133,268 +884,216 @@ arm_status arm_fir_decimate_init_f32( * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if * the filter length numTaps is not a multiple of the interpolation factor L. */ - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); +arm_status arm_fir_interpolate_init_f32(arm_fir_interpolate_instance_f32 *S, uint8_t L, + uint16_t numTaps, const float32_t *pCoeffs, + float32_t *pState, uint32_t blockSize); - - /** +/** * @brief Instance structure for the high precision Q31 Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - } arm_biquad_cas_df1_32x64_ins_q31; +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t * + pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ +} arm_biquad_cas_df1_32x64_ins_q31; - - /** +/** * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_biquad_cas_df1_32x64_q31(const arm_biquad_cas_df1_32x64_ins_q31 *S, const q31_t *pSrc, + q31_t *pDst, uint32_t blockSize); - - /** +/** * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format */ - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); +void arm_biquad_cas_df1_32x64_init_q31(arm_biquad_cas_df1_32x64_ins_q31 *S, uint8_t numStages, + const q31_t *pCoeffs, q63_t *pState, uint8_t postShift); - - /** +/** * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t * + pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float32_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_df2T_instance_f32; - /** +/** * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_stereo_df2T_instance_f32; +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t * + pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_stereo_df2T_instance_f32; - /** +/** * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f64; +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t * + pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float64_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_df2T_instance_f64; - - /** +/** * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. * @param[in] S points to an instance of the filter data structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df2T_f32(const arm_biquad_cascade_df2T_instance_f32 *S, + const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels * @param[in] S points to an instance of the filter data structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_stereo_df2T_f32( - const arm_biquad_cascade_stereo_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_stereo_df2T_f32(const arm_biquad_cascade_stereo_df2T_instance_f32 *S, + const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. * @param[in] S points to an instance of the filter data structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df2T_f64( - const arm_biquad_cascade_df2T_instance_f64 * S, - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df2T_f64(const arm_biquad_cascade_df2T_instance_f64 *S, + const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - -#if defined(ARM_MATH_NEON) +#if defined(ARM_MATH_NEON) /** @brief Compute new coefficient arrays for use in vectorized filter (Neon only). @param[in] numStages number of 2nd order stages in the filter. @param[in] pCoeffs points to the original filter coefficients. @param[in] pComputedCoeffs points to the new computed coefficients for the vectorized version. */ -void arm_biquad_cascade_df2T_compute_coefs_f32( - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pComputedCoeffs); +void arm_biquad_cascade_df2T_compute_coefs_f32(uint8_t numStages, const float32_t *pCoeffs, + float32_t *pComputedCoeffs); #endif - /** +/** * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. * @param[in,out] S points to an instance of the filter data structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. */ - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); +void arm_biquad_cascade_df2T_init_f32(arm_biquad_cascade_df2T_instance_f32 *S, uint8_t numStages, + const float32_t *pCoeffs, float32_t *pState); - - /** +/** * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. * @param[in,out] S points to an instance of the filter data structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. */ - void arm_biquad_cascade_stereo_df2T_init_f32( - arm_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); +void arm_biquad_cascade_stereo_df2T_init_f32(arm_biquad_cascade_stereo_df2T_instance_f32 *S, + uint8_t numStages, const float32_t *pCoeffs, + float32_t *pState); - - /** +/** * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. * @param[in,out] S points to an instance of the filter data structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. */ - void arm_biquad_cascade_df2T_init_f64( - arm_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - const float64_t * pCoeffs, - float64_t * pState); +void arm_biquad_cascade_df2T_init_f64(arm_biquad_cascade_df2T_instance_f64 *S, uint8_t numStages, + const float64_t *pCoeffs, float64_t *pState); - - /** +/** * @brief Instance structure for the Q15 FIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; +typedef struct { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_q15; - /** +/** * @brief Instance structure for the Q31 FIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; +typedef struct { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_q31; - /** +/** * @brief Instance structure for the floating-point FIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; +typedef struct { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const float32_t + *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ +} arm_fir_lattice_instance_f32; - - /** +/** * @brief Initialization function for the Q15 FIR lattice filter. * @param[in] S points to an instance of the Q15 FIR lattice structure. * @param[in] numStages number of filter stages. * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. * @param[in] pState points to the state buffer. The array is of length numStages. */ - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - const q15_t * pCoeffs, - q15_t * pState); - +void arm_fir_lattice_init_q15(arm_fir_lattice_instance_q15 *S, uint16_t numStages, + const q15_t *pCoeffs, q15_t *pState); - /** +/** * @brief Processing function for the Q15 FIR lattice filter. * @param[in] S points to an instance of the Q15 FIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_fir_lattice_q15(const arm_fir_lattice_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, + uint32_t blockSize); - /** +/** * @brief Initialization function for the Q31 FIR lattice filter. * @param[in] S points to an instance of the Q31 FIR lattice structure. * @param[in] numStages number of filter stages. * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. * @param[in] pState points to the state buffer. The array is of length numStages. */ - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - const q31_t * pCoeffs, - q31_t * pState); - +void arm_fir_lattice_init_q31(arm_fir_lattice_instance_q31 *S, uint16_t numStages, + const q31_t *pCoeffs, q31_t *pState); - /** +/** * @brief Processing function for the Q31 FIR lattice filter. * @param[in] S points to an instance of the Q31 FIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - +void arm_fir_lattice_q31(const arm_fir_lattice_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, + uint32_t blockSize); /** * @brief Initialization function for the floating-point FIR lattice filter. @@ -1403,76 +1102,69 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. * @param[in] pState points to the state buffer. The array is of length numStages. */ - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - const float32_t * pCoeffs, - float32_t * pState); +void arm_fir_lattice_init_f32(arm_fir_lattice_instance_f32 *S, uint16_t numStages, + const float32_t *pCoeffs, float32_t *pState); - - /** +/** * @brief Processing function for the floating-point FIR lattice filter. * @param[in] S points to an instance of the floating-point FIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_fir_lattice_f32(const arm_fir_lattice_instance_f32 *S, const float32_t *pSrc, + float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Instance structure for the Q15 IIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; +typedef struct { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t * + pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t * + pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t * + pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_q15; - /** +/** * @brief Instance structure for the Q31 IIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; +typedef struct { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t * + pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t * + pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t * + pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_q31; - /** +/** * @brief Instance structure for the floating-point IIR lattice filter. */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; +typedef struct { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t * + pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t * + pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t * + pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ +} arm_iir_lattice_instance_f32; - - /** +/** * @brief Processing function for the floating-point IIR lattice filter. * @param[in] S points to an instance of the floating-point IIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_iir_lattice_f32(const arm_iir_lattice_instance_f32 *S, const float32_t *pSrc, + float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Initialization function for the floating-point IIR lattice filter. * @param[in] S points to an instance of the floating-point IIR lattice structure. * @param[in] numStages number of stages in the filter. @@ -1481,30 +1173,21 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. * @param[in] blockSize number of samples to process. */ - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); +void arm_iir_lattice_init_f32(arm_iir_lattice_instance_f32 *S, uint16_t numStages, + float32_t *pkCoeffs, float32_t *pvCoeffs, float32_t *pState, + uint32_t blockSize); - - /** +/** * @brief Processing function for the Q31 IIR lattice filter. * @param[in] S points to an instance of the Q31 IIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_iir_lattice_q31(const arm_iir_lattice_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q31 IIR lattice filter. * @param[in] S points to an instance of the Q31 IIR lattice structure. * @param[in] numStages number of stages in the filter. @@ -1513,28 +1196,18 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. * @param[in] blockSize number of samples to process. */ - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); +void arm_iir_lattice_init_q31(arm_iir_lattice_instance_q31 *S, uint16_t numStages, q31_t *pkCoeffs, + q31_t *pvCoeffs, q31_t *pState, uint32_t blockSize); - - /** +/** * @brief Processing function for the Q15 IIR lattice filter. * @param[in] S points to an instance of the Q15 IIR lattice structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_iir_lattice_q15(const arm_iir_lattice_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, + uint32_t blockSize); /** * @brief Initialization function for the Q15 IIR lattice filter. @@ -1545,28 +1218,21 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] pState points to state buffer. The array is of length numStages+blockSize. * @param[in] blockSize number of samples to process per call. */ - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - +void arm_iir_lattice_init_q15(arm_iir_lattice_instance_q15 *S, uint16_t numStages, q15_t *pkCoeffs, + q15_t *pvCoeffs, q15_t *pState, uint32_t blockSize); - /** +/** * @brief Instance structure for the floating-point LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ +} arm_lms_instance_f32; - /** +/** * @brief Processing function for floating-point LMS filter. * @param[in] S points to an instance of the floating-point LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1575,16 +1241,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_f32( - const arm_lms_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - +void arm_lms_f32(const arm_lms_instance_f32 *S, const float32_t *pSrc, float32_t *pRef, + float32_t *pOut, float32_t *pErr, uint32_t blockSize); - /** +/** * @brief Initialization function for floating-point LMS filter. * @param[in] S points to an instance of the floating-point LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1593,29 +1253,22 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] mu step size that controls filter coefficient updates. * @param[in] blockSize number of samples to process. */ - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - +void arm_lms_init_f32(arm_lms_instance_f32 *S, uint16_t numTaps, float32_t *pCoeffs, + float32_t *pState, float32_t mu, uint32_t blockSize); - /** +/** * @brief Instance structure for the Q15 LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ +} arm_lms_instance_q15; - /** +/** * @brief Initialization function for the Q15 LMS filter. * @param[in] S points to an instance of the Q15 LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1625,17 +1278,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] blockSize number of samples to process. * @param[in] postShift bit shift applied to coefficients. */ - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); +void arm_lms_init_q15(arm_lms_instance_q15 *S, uint16_t numTaps, q15_t *pCoeffs, q15_t *pState, + q15_t mu, uint32_t blockSize, uint32_t postShift); - - /** +/** * @brief Processing function for Q15 LMS filter. * @param[in] S points to an instance of the Q15 LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1644,29 +1290,22 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_q15( - const arm_lms_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); +void arm_lms_q15(const arm_lms_instance_q15 *S, const q15_t *pSrc, q15_t *pRef, q15_t *pOut, + q15_t *pErr, uint32_t blockSize); - - /** +/** * @brief Instance structure for the Q31 LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q31; +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ +} arm_lms_instance_q31; - - /** +/** * @brief Processing function for Q31 LMS filter. * @param[in] S points to an instance of the Q15 LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1675,16 +1314,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_q31( - const arm_lms_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); +void arm_lms_q31(const arm_lms_instance_q31 *S, const q31_t *pSrc, q31_t *pRef, q31_t *pOut, + q31_t *pErr, uint32_t blockSize); - - /** +/** * @brief Initialization function for Q31 LMS filter. * @param[in] S points to an instance of the Q31 LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1694,31 +1327,23 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] blockSize number of samples to process. * @param[in] postShift bit shift applied to coefficients. */ - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); +void arm_lms_init_q31(arm_lms_instance_q31 *S, uint16_t numTaps, q31_t *pCoeffs, q31_t *pState, + q31_t mu, uint32_t blockSize, uint32_t postShift); - - /** +/** * @brief Instance structure for the floating-point normalized LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_f32; - - /** +/** * @brief Processing function for floating-point normalized LMS filter. * @param[in] S points to an instance of the floating-point normalized LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1727,16 +1352,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); +void arm_lms_norm_f32(arm_lms_norm_instance_f32 *S, const float32_t *pSrc, float32_t *pRef, + float32_t *pOut, float32_t *pErr, uint32_t blockSize); - - /** +/** * @brief Initialization function for floating-point normalized LMS filter. * @param[in] S points to an instance of the floating-point LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1745,32 +1364,25 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] mu step size that controls filter coefficient updates. * @param[in] blockSize number of samples to process. */ - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); +void arm_lms_norm_init_f32(arm_lms_norm_instance_f32 *S, uint16_t numTaps, float32_t *pCoeffs, + float32_t *pState, float32_t mu, uint32_t blockSize); - - /** +/** * @brief Instance structure for the Q31 normalized LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_q31; - - /** +/** * @brief Processing function for Q31 normalized LMS filter. * @param[in] S points to an instance of the Q31 normalized LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1779,16 +1391,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); +void arm_lms_norm_q31(arm_lms_norm_instance_q31 *S, const q31_t *pSrc, q31_t *pRef, q31_t *pOut, + q31_t *pErr, uint32_t blockSize); - - /** +/** * @brief Initialization function for Q31 normalized LMS filter. * @param[in] S points to an instance of the Q31 normalized LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1798,33 +1404,25 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] blockSize number of samples to process. * @param[in] postShift bit shift applied to coefficients. */ - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); +void arm_lms_norm_init_q31(arm_lms_norm_instance_q31 *S, uint16_t numTaps, q31_t *pCoeffs, + q31_t *pState, q31_t mu, uint32_t blockSize, uint8_t postShift); - - /** +/** * @brief Instance structure for the Q15 normalized LMS filter. */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; +typedef struct { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ +} arm_lms_norm_instance_q15; - - /** +/** * @brief Processing function for Q15 normalized LMS filter. * @param[in] S points to an instance of the Q15 normalized LMS filter structure. * @param[in] pSrc points to the block of input data. @@ -1833,16 +1431,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[out] pErr points to the block of error data. * @param[in] blockSize number of samples to process. */ - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); +void arm_lms_norm_q15(arm_lms_norm_instance_q15 *S, const q15_t *pSrc, q15_t *pRef, q15_t *pOut, + q15_t *pErr, uint32_t blockSize); - - /** +/** * @brief Initialization function for Q15 normalized LMS filter. * @param[in] S points to an instance of the Q15 normalized LMS filter structure. * @param[in] numTaps number of filter coefficients. @@ -1852,17 +1444,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] blockSize number of samples to process. * @param[in] postShift bit shift applied to coefficients. */ - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); +void arm_lms_norm_init_q15(arm_lms_norm_instance_q15 *S, uint16_t numTaps, q15_t *pCoeffs, + q15_t *pState, q15_t mu, uint32_t blockSize, uint8_t postShift); - - /** +/** * @brief Correlation of floating-point sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -1870,15 +1455,10 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); +void arm_correlate_f32(const float32_t *pSrcA, uint32_t srcALen, const float32_t *pSrcB, + uint32_t srcBLen, float32_t *pDst); - - /** +/** * @brief Correlation of floating-point sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -1886,13 +1466,8 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_f64( - const float64_t * pSrcA, - uint32_t srcALen, - const float64_t * pSrcB, - uint32_t srcBLen, - float64_t * pDst); - +void arm_correlate_f64(const float64_t *pSrcA, uint32_t srcALen, const float64_t *pSrcB, + uint32_t srcBLen, float64_t *pDst); /** @brief Correlation of Q15 sequences @@ -1903,14 +1478,8 @@ void arm_biquad_cascade_df2T_compute_coefs_f32( @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. */ -void arm_correlate_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - +void arm_correlate_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, q15_t *pScratch); /** @brief Correlation of Q15 sequences. @@ -1920,13 +1489,8 @@ void arm_correlate_opt_q15( @param[in] srcBLen length of the second input sequence @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - +void arm_correlate_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, uint32_t srcBLen, + q15_t *pDst); /** @brief Correlation of Q15 sequences (fast version). @@ -1936,13 +1500,8 @@ void arm_correlate_opt_q15( @param[in] srcBLen length of the second input sequence @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. */ -void arm_correlate_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - +void arm_correlate_fast_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst); /** @brief Correlation of Q15 sequences (fast version). @@ -1953,16 +1512,10 @@ void arm_correlate_fast_q15( @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. */ -void arm_correlate_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - +void arm_correlate_fast_opt_q15(const q15_t *pSrcA, uint32_t srcALen, const q15_t *pSrcB, + uint32_t srcBLen, q15_t *pDst, q15_t *pScratch); - /** +/** * @brief Correlation of Q31 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -1970,13 +1523,8 @@ void arm_correlate_fast_opt_q15( * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - +void arm_correlate_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, uint32_t srcBLen, + q31_t *pDst); /** @brief Correlation of Q31 sequences (fast version). @@ -1986,15 +1534,10 @@ void arm_correlate_fast_opt_q15( @param[in] srcBLen length of the second input sequence @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ -void arm_correlate_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); +void arm_correlate_fast_q31(const q31_t *pSrcA, uint32_t srcALen, const q31_t *pSrcB, + uint32_t srcBLen, q31_t *pDst); - - /** +/** * @brief Correlation of Q7 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -2004,17 +1547,10 @@ void arm_correlate_fast_q31( * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). */ - void arm_correlate_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); +void arm_correlate_opt_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, + q7_t *pDst, q15_t *pScratch1, q15_t *pScratch2); - - /** +/** * @brief Correlation of Q7 sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -2022,68 +1558,61 @@ void arm_correlate_fast_q31( * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); +void arm_correlate_q7(const q7_t *pSrcA, uint32_t srcALen, const q7_t *pSrcB, uint32_t srcBLen, + q7_t *pDst); - - /** +/** * @brief Instance structure for the floating-point sparse FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t * + pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_f32; + +/** * @brief Instance structure for the Q31 sparse FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t * + pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q31; + +/** * @brief Instance structure for the Q15 sparse FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t * + pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q15; + +/** * @brief Instance structure for the Q7 sparse FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; +typedef struct { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ +} arm_fir_sparse_instance_q7; - - /** +/** * @brief Processing function for the floating-point sparse FIR filter. * @param[in] S points to an instance of the floating-point sparse FIR structure. * @param[in] pSrc points to the block of input data. @@ -2091,15 +1620,10 @@ void arm_correlate_fast_q31( * @param[in] pScratchIn points to a temporary buffer of size blockSize. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); +void arm_fir_sparse_f32(arm_fir_sparse_instance_f32 *S, const float32_t *pSrc, float32_t *pDst, + float32_t *pScratchIn, uint32_t blockSize); - - /** +/** * @brief Initialization function for the floating-point sparse FIR filter. * @param[in,out] S points to an instance of the floating-point sparse FIR structure. * @param[in] numTaps number of nonzero coefficients in the filter. @@ -2109,17 +1633,11 @@ void arm_correlate_fast_q31( * @param[in] maxDelay maximum offset time supported. * @param[in] blockSize number of samples that will be processed per block. */ - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); +void arm_fir_sparse_init_f32(arm_fir_sparse_instance_f32 *S, uint16_t numTaps, + const float32_t *pCoeffs, float32_t *pState, int32_t *pTapDelay, + uint16_t maxDelay, uint32_t blockSize); - - /** +/** * @brief Processing function for the Q31 sparse FIR filter. * @param[in] S points to an instance of the Q31 sparse FIR structure. * @param[in] pSrc points to the block of input data. @@ -2127,15 +1645,10 @@ void arm_correlate_fast_q31( * @param[in] pScratchIn points to a temporary buffer of size blockSize. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); +void arm_fir_sparse_q31(arm_fir_sparse_instance_q31 *S, const q31_t *pSrc, q31_t *pDst, + q31_t *pScratchIn, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q31 sparse FIR filter. * @param[in,out] S points to an instance of the Q31 sparse FIR structure. * @param[in] numTaps number of nonzero coefficients in the filter. @@ -2145,17 +1658,11 @@ void arm_correlate_fast_q31( * @param[in] maxDelay maximum offset time supported. * @param[in] blockSize number of samples that will be processed per block. */ - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); +void arm_fir_sparse_init_q31(arm_fir_sparse_instance_q31 *S, uint16_t numTaps, const q31_t *pCoeffs, + q31_t *pState, int32_t *pTapDelay, uint16_t maxDelay, + uint32_t blockSize); - - /** +/** * @brief Processing function for the Q15 sparse FIR filter. * @param[in] S points to an instance of the Q15 sparse FIR structure. * @param[in] pSrc points to the block of input data. @@ -2164,16 +1671,10 @@ void arm_correlate_fast_q31( * @param[in] pScratchOut points to a temporary buffer of size blockSize. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); +void arm_fir_sparse_q15(arm_fir_sparse_instance_q15 *S, const q15_t *pSrc, q15_t *pDst, + q15_t *pScratchIn, q31_t *pScratchOut, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q15 sparse FIR filter. * @param[in,out] S points to an instance of the Q15 sparse FIR structure. * @param[in] numTaps number of nonzero coefficients in the filter. @@ -2183,17 +1684,11 @@ void arm_correlate_fast_q31( * @param[in] maxDelay maximum offset time supported. * @param[in] blockSize number of samples that will be processed per block. */ - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); +void arm_fir_sparse_init_q15(arm_fir_sparse_instance_q15 *S, uint16_t numTaps, const q15_t *pCoeffs, + q15_t *pState, int32_t *pTapDelay, uint16_t maxDelay, + uint32_t blockSize); - - /** +/** * @brief Processing function for the Q7 sparse FIR filter. * @param[in] S points to an instance of the Q7 sparse FIR structure. * @param[in] pSrc points to the block of input data. @@ -2202,16 +1697,10 @@ void arm_correlate_fast_q31( * @param[in] pScratchOut points to a temporary buffer of size blockSize. * @param[in] blockSize number of input samples to process per call. */ - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); +void arm_fir_sparse_q7(arm_fir_sparse_instance_q7 *S, const q7_t *pSrc, q7_t *pDst, + q7_t *pScratchIn, q31_t *pScratchOut, uint32_t blockSize); - - /** +/** * @brief Initialization function for the Q7 sparse FIR filter. * @param[in,out] S points to an instance of the Q7 sparse FIR structure. * @param[in] numTaps number of nonzero coefficients in the filter. @@ -2221,32 +1710,18 @@ void arm_correlate_fast_q31( * @param[in] maxDelay maximum offset time supported. * @param[in] blockSize number of samples that will be processed per block. */ - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - +void arm_fir_sparse_init_q7(arm_fir_sparse_instance_q7 *S, uint16_t numTaps, const q7_t *pCoeffs, + q7_t *pState, int32_t *pTapDelay, uint16_t maxDelay, + uint32_t blockSize); - - - - /** +/** * @brief floating-point Circular write function. */ - __STATIC_FORCEINLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularWrite_f32(int32_t *circBuffer, int32_t L, + uint16_t *writeOffset, int32_t bufferInc, + const int32_t *src, int32_t srcInc, + uint32_t blockSize) +{ uint32_t i = 0U; int32_t wOffset; @@ -2257,46 +1732,37 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; + while (i > 0U) { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; - /* Update the input pointer */ - src += srcInc; + /* Update the input pointer */ + src += srcInc; - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *writeOffset = (uint16_t)wOffset; - } - - +} - /** +/** * @brief floating-point Circular Read function. */ - __STATIC_FORCEINLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularRead_f32(int32_t *circBuffer, int32_t L, int32_t *readOffset, + int32_t bufferInc, int32_t *dst, int32_t *dst_base, + int32_t dst_length, int32_t dstInc, + uint32_t blockSize) +{ uint32_t i = 0U; int32_t rOffset; - int32_t* dst_end; + int32_t *dst_end; /* Copy the value of Index pointer that points * to the current location from where the input samples to be read */ @@ -2306,48 +1772,39 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; + while (i > 0U) { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; - /* Update the input pointer */ - dst += dstInc; + /* Update the input pointer */ + dst += dstInc; - if (dst == dst_end) - { - dst = dst_base; - } + if (dst == dst_end) { + dst = dst_base; + } - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; - if (rOffset >= L) - { - rOffset -= L; - } + if (rOffset >= L) { + rOffset -= L; + } - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *readOffset = rOffset; - } - +} - /** +/** * @brief Q15 Circular write function. */ - __STATIC_FORCEINLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularWrite_q15(q15_t *circBuffer, int32_t L, uint16_t *writeOffset, + int32_t bufferInc, const q15_t *src, int32_t srcInc, + uint32_t blockSize) +{ uint32_t i = 0U; int32_t wOffset; @@ -2358,45 +1815,37 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; + while (i > 0U) { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; - /* Update the input pointer */ - src += srcInc; + /* Update the input pointer */ + src += srcInc; - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *writeOffset = (uint16_t)wOffset; - } - +} - /** +/** * @brief Q15 Circular Read function. */ - __STATIC_FORCEINLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularRead_q15(q15_t *circBuffer, int32_t L, int32_t *readOffset, + int32_t bufferInc, q15_t *dst, q15_t *dst_base, + int32_t dst_length, int32_t dstInc, + uint32_t blockSize) +{ uint32_t i = 0; int32_t rOffset; - q15_t* dst_end; + q15_t *dst_end; /* Copy the value of Index pointer that points * to the current location from where the input samples to be read */ @@ -2407,48 +1856,39 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; + while (i > 0U) { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; - /* Update the input pointer */ - dst += dstInc; + /* Update the input pointer */ + dst += dstInc; - if (dst == dst_end) - { - dst = dst_base; - } + if (dst == dst_end) { + dst = dst_base; + } - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; - if (rOffset >= L) - { - rOffset -= L; - } + if (rOffset >= L) { + rOffset -= L; + } - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *readOffset = rOffset; - } - +} - /** +/** * @brief Q7 Circular write function. */ - __STATIC_FORCEINLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularWrite_q7(q7_t *circBuffer, int32_t L, uint16_t *writeOffset, + int32_t bufferInc, const q7_t *src, int32_t srcInc, + uint32_t blockSize) +{ uint32_t i = 0U; int32_t wOffset; @@ -2459,45 +1899,37 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; + while (i > 0U) { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; - /* Update the input pointer */ - src += srcInc; + /* Update the input pointer */ + src += srcInc; - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *writeOffset = (uint16_t)wOffset; - } - +} - /** +/** * @brief Q7 Circular Read function. */ - __STATIC_FORCEINLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { +__STATIC_FORCEINLINE void arm_circularRead_q7(q7_t *circBuffer, int32_t L, int32_t *readOffset, + int32_t bufferInc, q7_t *dst, q7_t *dst_base, + int32_t dst_length, int32_t dstInc, + uint32_t blockSize) +{ uint32_t i = 0; int32_t rOffset; - q7_t* dst_end; + q7_t *dst_end; /* Copy the value of Index pointer that points * to the current location from where the input samples to be read */ @@ -2508,35 +1940,31 @@ void arm_correlate_fast_q31( /* Loop over the blockSize */ i = blockSize; - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; + while (i > 0U) { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; - /* Update the input pointer */ - dst += dstInc; + /* Update the input pointer */ + dst += dstInc; - if (dst == dst_end) - { - dst = dst_base; - } + if (dst == dst_end) { + dst = dst_base; + } - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; - if (rOffset >= L) - { - rOffset -= L; - } + if (rOffset >= L) { + rOffset -= L; + } - /* Decrement the loop counter */ - i--; + /* Decrement the loop counter */ + i--; } /* Update the index pointer */ *readOffset = rOffset; - } - +} /** @brief Levinson Durbin @@ -2545,11 +1973,7 @@ void arm_correlate_fast_q31( @param[out] err prediction error (variance) @param[in] nbCoefs number of autoregressive coefficients */ -void arm_levinson_durbin_f32(const float32_t *phi, - float32_t *a, - float32_t *err, - int nbCoefs); - +void arm_levinson_durbin_f32(const float32_t *phi, float32_t *a, float32_t *err, int nbCoefs); /** @brief Levinson Durbin @@ -2558,12 +1982,9 @@ void arm_levinson_durbin_f32(const float32_t *phi, @param[out] err prediction error (variance) @param[in] nbCoefs number of autoregressive coefficients */ -void arm_levinson_durbin_q31(const q31_t *phi, - q31_t *a, - q31_t *err, - int nbCoefs); +void arm_levinson_durbin_q31(const q31_t *phi, q31_t *a, q31_t *err, int nbCoefs); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions_f16.h old mode 100755 new mode 100644 index 655cd7e0f5..47fd207086 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/filtering_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef FILTERING_FUNCTIONS_F16_H_ #define FILTERING_FUNCTIONS_F16_H_ @@ -33,25 +32,23 @@ #include "dsp/none.h" #include "dsp/utils.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - /** +/** * @brief Instance structure for the floating-point FIR filter. */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float16_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float16_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f16; - - /** +typedef struct { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float16_t * + pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float16_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ +} arm_fir_instance_f16; + +/** * @brief Initialization function for the floating-point FIR filter. * @param[in,out] S points to an instance of the floating-point FIR filter structure. * @param[in] numTaps Number of filter coefficients in the filter. @@ -59,148 +56,127 @@ extern "C" * @param[in] pState points to the state buffer. * @param[in] blockSize number of samples that are processed at a time. */ - void arm_fir_init_f16( - arm_fir_instance_f16 * S, - uint16_t numTaps, - const float16_t * pCoeffs, - float16_t * pState, - uint32_t blockSize); - - /** +void arm_fir_init_f16(arm_fir_instance_f16 *S, uint16_t numTaps, const float16_t *pCoeffs, + float16_t *pState, uint32_t blockSize); + +/** * @brief Processing function for the floating-point FIR filter. * @param[in] S points to an instance of the floating-point FIR structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_fir_f16( - const arm_fir_instance_f16 * S, - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_fir_f16(const arm_fir_instance_f16 *S, const float16_t *pSrc, float16_t *pDst, + uint32_t blockSize); - - /** +/** * @brief Instance structure for the floating-point Biquad cascade filter. */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float16_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const float16_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_casd_df1_inst_f16; +typedef struct { + uint32_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t * + pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const float16_t + *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_casd_df1_inst_f16; #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - /** +/** * @brief Instance structure for the modified Biquad coefs required by vectorized code. */ - typedef struct - { - float16_t coeffs[12][8]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ - } arm_biquad_mod_coef_f16; -#endif +typedef struct { + float16_t coeffs + [12] + [8]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ +} arm_biquad_mod_coef_f16; +#endif - /** +/** * @brief Processing function for the floating-point Biquad cascade filter. * @param[in] S points to an instance of the floating-point Biquad cascade structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df1_f16( - const arm_biquad_casd_df1_inst_f16 * S, - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df1_f16(const arm_biquad_casd_df1_inst_f16 *S, const float16_t *pSrc, + float16_t *pDst, uint32_t blockSize); #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - void arm_biquad_cascade_df1_mve_init_f16( - arm_biquad_casd_df1_inst_f16 * S, - uint8_t numStages, - const float16_t * pCoeffs, - arm_biquad_mod_coef_f16 * pCoeffsMod, - float16_t * pState); +void arm_biquad_cascade_df1_mve_init_f16(arm_biquad_casd_df1_inst_f16 *S, uint8_t numStages, + const float16_t *pCoeffs, + arm_biquad_mod_coef_f16 *pCoeffsMod, float16_t *pState); #endif - void arm_biquad_cascade_df1_init_f16( - arm_biquad_casd_df1_inst_f16 * S, - uint8_t numStages, - const float16_t * pCoeffs, - float16_t * pState); +void arm_biquad_cascade_df1_init_f16(arm_biquad_casd_df1_inst_f16 *S, uint8_t numStages, + const float16_t *pCoeffs, float16_t *pState); - /** +/** * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float16_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f16; - - /** +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t * + pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float16_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_df2T_instance_f16; + +/** * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float16_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_stereo_df2T_instance_f16; - - /** +typedef struct { + uint8_t + numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t * + pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const float16_t + *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ +} arm_biquad_cascade_stereo_df2T_instance_f16; + +/** * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. * @param[in] S points to an instance of the filter data structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_df2T_f16( - const arm_biquad_cascade_df2T_instance_f16 * S, - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_df2T_f16(const arm_biquad_cascade_df2T_instance_f16 *S, + const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels * @param[in] S points to an instance of the filter data structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_biquad_cascade_stereo_df2T_f16( - const arm_biquad_cascade_stereo_df2T_instance_f16 * S, - const float16_t * pSrc, - float16_t * pDst, - uint32_t blockSize); +void arm_biquad_cascade_stereo_df2T_f16(const arm_biquad_cascade_stereo_df2T_instance_f16 *S, + const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - /** +/** * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. * @param[in,out] S points to an instance of the filter data structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. */ - void arm_biquad_cascade_df2T_init_f16( - arm_biquad_cascade_df2T_instance_f16 * S, - uint8_t numStages, - const float16_t * pCoeffs, - float16_t * pState); +void arm_biquad_cascade_df2T_init_f16(arm_biquad_cascade_df2T_instance_f16 *S, uint8_t numStages, + const float16_t *pCoeffs, float16_t *pState); - /** +/** * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. * @param[in,out] S points to an instance of the filter data structure. * @param[in] numStages number of 2nd order stages in the filter. * @param[in] pCoeffs points to the filter coefficients. * @param[in] pState points to the state buffer. */ - void arm_biquad_cascade_stereo_df2T_init_f16( - arm_biquad_cascade_stereo_df2T_instance_f16 * S, - uint8_t numStages, - const float16_t * pCoeffs, - float16_t * pState); +void arm_biquad_cascade_stereo_df2T_init_f16(arm_biquad_cascade_stereo_df2T_instance_f16 *S, + uint8_t numStages, const float16_t *pCoeffs, + float16_t *pState); - /** +/** * @brief Correlation of floating-point sequences. * @param[in] pSrcA points to the first input sequence. * @param[in] srcALen length of the first input sequence. @@ -208,13 +184,8 @@ extern "C" * @param[in] srcBLen length of the second input sequence. * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. */ - void arm_correlate_f16( - const float16_t * pSrcA, - uint32_t srcALen, - const float16_t * pSrcB, - uint32_t srcBLen, - float16_t * pDst); - +void arm_correlate_f16(const float16_t *pSrcA, uint32_t srcALen, const float16_t *pSrcB, + uint32_t srcBLen, float16_t *pDst); /** @brief Levinson Durbin @@ -223,13 +194,10 @@ extern "C" @param[out] err prediction error (variance) @param[in] nbCoefs number of autoregressive coefficients */ -void arm_levinson_durbin_f16(const float16_t *phi, - float16_t *a, - float16_t *err, - int nbCoefs); +void arm_levinson_durbin_f16(const float16_t *phi, float16_t *a, float16_t *err, int nbCoefs); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions.h old mode 100755 new mode 100644 index 574b73738f..24110f4d03 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef INTERPOLATION_FUNCTIONS_H_ #define INTERPOLATION_FUNCTIONS_H_ @@ -33,12 +32,10 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** * @defgroup groupInterpolation Interpolation Functions * These functions perform 1- and 2-dimensional interpolation of data. @@ -46,95 +43,82 @@ extern "C" * bilinear interpolation is used for 2-dimensional data. */ - - /** +/** * @brief Instance structure for the floating-point Linear Interpolate function. */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - const float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; +typedef struct { + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + const float32_t *pYData; /**< pointer to the table of Y values */ +} arm_linear_interp_instance_f32; - /** +/** * @brief Instance structure for the floating-point bilinear interpolation function. */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - const float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; +typedef struct { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const float32_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_f32; - /** +/** * @brief Instance structure for the Q31 bilinear interpolation function. */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - const q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; +typedef struct { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q31_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q31; - /** +/** * @brief Instance structure for the Q15 bilinear interpolation function. */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - const q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; +typedef struct { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q15_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q15; - /** +/** * @brief Instance structure for the Q15 bilinear interpolation function. */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - const q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - +typedef struct { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q7_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_q7; - /** +/** * @brief Struct for specifying cubic spline type */ - typedef enum - { - ARM_SPLINE_NATURAL = 0, /**< Natural spline */ - ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ - } arm_spline_type; +typedef enum { + ARM_SPLINE_NATURAL = 0, /**< Natural spline */ + ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ +} arm_spline_type; - /** +/** * @brief Instance structure for the floating-point cubic spline interpolation. */ - typedef struct - { - arm_spline_type type; /**< Type (boundary conditions) */ - const float32_t * x; /**< x values */ - const float32_t * y; /**< y values */ - uint32_t n_x; /**< Number of known data points */ - float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */ - } arm_spline_instance_f32; - +typedef struct { + arm_spline_type type; /**< Type (boundary conditions) */ + const float32_t *x; /**< x values */ + const float32_t *y; /**< y values */ + uint32_t n_x; /**< Number of known data points */ + float32_t *coeffs; /**< Coefficients buffer (b,c, and d) */ +} arm_spline_instance_f32; - /** +/** * @brief Processing function for the floating-point cubic spline interpolation. * @param[in] S points to an instance of the floating-point spline structure. * @param[in] xq points to the x values ot the interpolated data points. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples of output data. */ - void arm_spline_f32( - arm_spline_instance_f32 * S, - const float32_t * xq, - float32_t * pDst, - uint32_t blockSize); +void arm_spline_f32(arm_spline_instance_f32 *S, const float32_t *xq, float32_t *pDst, + uint32_t blockSize); - /** +/** * @brief Initialization function for the floating-point cubic spline interpolation. * @param[in,out] S points to an instance of the floating-point spline structure. * @param[in] type type of cubic spline interpolation (boundary conditions) @@ -144,28 +128,19 @@ extern "C" * @param[in] coeffs coefficients array for b, c, and d * @param[in] tempBuffer buffer array for internal computations */ - void arm_spline_init_f32( - arm_spline_instance_f32 * S, - arm_spline_type type, - const float32_t * x, - const float32_t * y, - uint32_t n, - float32_t * coeffs, - float32_t * tempBuffer); - +void arm_spline_init_f32(arm_spline_instance_f32 *S, arm_spline_type type, const float32_t *x, + const float32_t *y, uint32_t n, float32_t *coeffs, float32_t *tempBuffer); - /** +/** * @brief Process function for the floating-point Linear Interpolation Function. * @param[in,out] S is an instance of the floating-point Linear Interpolation structure * @param[in] x input sample to process * @return y processed output sample. * */ - float32_t arm_linear_interp_f32( - const arm_linear_interp_instance_f32 * S, - float32_t x); +float32_t arm_linear_interp_f32(const arm_linear_interp_instance_f32 *S, float32_t x); - /** +/** * * @brief Process function for the Q31 Linear Interpolation Function. * @param[in] pYData pointer to Q31 Linear Interpolation table @@ -178,12 +153,9 @@ extern "C" * This function can support maximum of table size 2^12. * */ - q31_t arm_linear_interp_q31( - const q31_t * pYData, - q31_t x, - uint32_t nValues); +q31_t arm_linear_interp_q31(const q31_t *pYData, q31_t x, uint32_t nValues); - /** +/** * * @brief Process function for the Q15 Linear Interpolation Function. * @param[in] pYData pointer to Q15 Linear Interpolation table @@ -196,12 +168,9 @@ extern "C" * This function can support maximum of table size 2^12. * */ - q15_t arm_linear_interp_q15( - const q15_t * pYData, - q31_t x, - uint32_t nValues); +q15_t arm_linear_interp_q15(const q15_t *pYData, q31_t x, uint32_t nValues); - /** +/** * * @brief Process function for the Q7 Linear Interpolation Function. * @param[in] pYData pointer to Q7 Linear Interpolation table @@ -213,62 +182,46 @@ extern "C" * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. * This function can support maximum of table size 2^12. */ -q7_t arm_linear_interp_q7( - const q7_t * pYData, - q31_t x, - uint32_t nValues); +q7_t arm_linear_interp_q7(const q7_t *pYData, q31_t x, uint32_t nValues); - /** +/** * @brief Floating-point bilinear interpolation. * @param[in,out] S points to an instance of the interpolation structure. * @param[in] X interpolation coordinate. * @param[in] Y interpolation coordinate. * @return out interpolated value. */ - float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y); +float32_t arm_bilinear_interp_f32(const arm_bilinear_interp_instance_f32 *S, float32_t X, + float32_t Y); - /** +/** * @brief Q31 bilinear interpolation. * @param[in,out] S points to an instance of the interpolation structure. * @param[in] X interpolation coordinate in 12.20 format. * @param[in] Y interpolation coordinate in 12.20 format. * @return out interpolated value. */ - q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y); - +q31_t arm_bilinear_interp_q31(arm_bilinear_interp_instance_q31 *S, q31_t X, q31_t Y); - /** +/** * @brief Q15 bilinear interpolation. * @param[in,out] S points to an instance of the interpolation structure. * @param[in] X interpolation coordinate in 12.20 format. * @param[in] Y interpolation coordinate in 12.20 format. * @return out interpolated value. */ - q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y); +q15_t arm_bilinear_interp_q15(arm_bilinear_interp_instance_q15 *S, q31_t X, q31_t Y); - /** +/** * @brief Q7 bilinear interpolation. * @param[in,out] S points to an instance of the interpolation structure. * @param[in] X interpolation coordinate in 12.20 format. * @param[in] Y interpolation coordinate in 12.20 format. * @return out interpolated value. */ - q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y); - +q7_t arm_bilinear_interp_q7(arm_bilinear_interp_instance_q7 *S, q31_t X, q31_t Y); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions_f16.h old mode 100755 new mode 100644 index e1f27c3cda..8451ab7300 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/interpolation_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef INTERPOLATION_FUNCTIONS_F16_H_ #define INTERPOLATION_FUNCTIONS_F16_H_ @@ -33,9 +32,8 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) @@ -43,40 +41,36 @@ extern "C" /** * @brief Instance structure for the half floating-point Linear Interpolate function. */ -typedef struct -{ - uint32_t nValues; /**< nValues */ - float16_t x1; /**< x1 */ - float16_t xSpacing; /**< xSpacing */ - const float16_t *pYData; /**< pointer to the table of Y values */ +typedef struct { + uint32_t nValues; /**< nValues */ + float16_t x1; /**< x1 */ + float16_t xSpacing; /**< xSpacing */ + const float16_t *pYData; /**< pointer to the table of Y values */ } arm_linear_interp_instance_f16; /** * @brief Instance structure for the floating-point bilinear interpolation function. */ -typedef struct -{ - uint16_t numRows;/**< number of rows in the data table. */ - uint16_t numCols;/**< number of columns in the data table. */ +typedef struct { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ const float16_t *pData; /**< points to the data table. */ } arm_bilinear_interp_instance_f16; - /** +/** * @addtogroup LinearInterpolate * @{ */ - /** +/** * @brief Process function for the floating-point Linear Interpolation Function. * @param[in,out] S is an instance of the floating-point Linear Interpolation structure * @param[in] x input sample to process * @return y processed output sample. */ - float16_t arm_linear_interp_f16( - const arm_linear_interp_instance_f16 * S, - float16_t x); +float16_t arm_linear_interp_f16(const arm_linear_interp_instance_f16 *S, float16_t x); - /** +/** * @} end of LinearInterpolate group */ @@ -85,24 +79,21 @@ typedef struct * @{ */ - /** +/** * @brief Floating-point bilinear interpolation. * @param[in,out] S points to an instance of the interpolation structure. * @param[in] X interpolation coordinate. * @param[in] Y interpolation coordinate. * @return out interpolated value. */ - float16_t arm_bilinear_interp_f16( - const arm_bilinear_interp_instance_f16 * S, - float16_t X, - float16_t Y); - +float16_t arm_bilinear_interp_f16(const arm_bilinear_interp_instance_f16 *S, float16_t X, + float16_t Y); - /** +/** * @} end of BilinearInterpolate group */ #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions.h old mode 100755 new mode 100644 index 175ca2fac2..7b8b99e24a --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef MATRIX_FUNCTIONS_H_ #define MATRIX_FUNCTIONS_H_ @@ -33,9 +32,8 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** @@ -109,60 +107,55 @@ extern "C" * return ARM_MATH_SUCCESS. */ - #define DEFAULT_HOUSEHOLDER_THRESHOLD_F64 (1.0e-16) - #define DEFAULT_HOUSEHOLDER_THRESHOLD_F32 (1.0e-12f) +#define DEFAULT_HOUSEHOLDER_THRESHOLD_F64 (1.0e-16) +#define DEFAULT_HOUSEHOLDER_THRESHOLD_F32 (1.0e-12f) - /** +/** * @brief Instance structure for the floating-point matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_f32; + +/** * @brief Instance structure for the floating-point matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f64; +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_f64; - /** +/** * @brief Instance structure for the Q7 matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q7_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q7; +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q7_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_q7; - /** +/** * @brief Instance structure for the Q15 matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q15; +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_q15; - /** +/** * @brief Instance structure for the Q31 matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q31; +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_q31; - /** +/** * @brief Floating-point matrix addition. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -170,12 +163,10 @@ extern "C" * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_add_f32(const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, arm_matrix_instance_f32 *pDst); - /** +/** * @brief Q15 matrix addition. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -183,12 +174,10 @@ arm_status arm_mat_add_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); +arm_status arm_mat_add_q15(const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, arm_matrix_instance_q15 *pDst); - /** +/** * @brief Q31 matrix addition. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -196,12 +185,10 @@ arm_status arm_mat_add_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_add_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, arm_matrix_instance_q31 *pDst); - /** +/** * @brief Floating-point, complex, matrix multiplication. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -209,12 +196,11 @@ arm_status arm_mat_add_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_cmplx_mult_f32(const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, + arm_matrix_instance_f32 *pDst); - /** +/** * @brief Q15, complex, matrix multiplication. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -222,13 +208,11 @@ arm_status arm_mat_cmplx_mult_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pScratch); +arm_status arm_mat_cmplx_mult_q15(const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst, q15_t *pScratch); - /** +/** * @brief Q31, complex, matrix multiplication. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -236,21 +220,18 @@ arm_status arm_mat_cmplx_mult_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_cmplx_mult_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); - /** +/** * @brief Floating-point matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_trans_f32(const arm_matrix_instance_f32 *pSrc, arm_matrix_instance_f32 *pDst); /** * @brief Floating-point matrix transpose. @@ -259,78 +240,66 @@ arm_status arm_mat_trans_f32( * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_f64( - const arm_matrix_instance_f64 * pSrc, - arm_matrix_instance_f64 * pDst); +arm_status arm_mat_trans_f64(const arm_matrix_instance_f64 *pSrc, arm_matrix_instance_f64 *pDst); - /** +/** * @brief Floating-point complex matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - +arm_status arm_mat_cmplx_trans_f32(const arm_matrix_instance_f32 *pSrc, + arm_matrix_instance_f32 *pDst); - /** +/** * @brief Q15 matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); +arm_status arm_mat_trans_q15(const arm_matrix_instance_q15 *pSrc, arm_matrix_instance_q15 *pDst); - /** +/** * @brief Q15 complex matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); +arm_status arm_mat_cmplx_trans_q15(const arm_matrix_instance_q15 *pSrc, + arm_matrix_instance_q15 *pDst); - /** +/** * @brief Q7 matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_q7( - const arm_matrix_instance_q7 * pSrc, - arm_matrix_instance_q7 * pDst); +arm_status arm_mat_trans_q7(const arm_matrix_instance_q7 *pSrc, arm_matrix_instance_q7 *pDst); - /** +/** * @brief Q31 matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_trans_q31(const arm_matrix_instance_q31 *pSrc, arm_matrix_instance_q31 *pDst); - /** +/** * @brief Q31 complex matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_cmplx_trans_q31(const arm_matrix_instance_q31 *pSrc, + arm_matrix_instance_q31 *pDst); - /** +/** * @brief Floating-point matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -338,12 +307,10 @@ arm_status arm_mat_cmplx_trans_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_mult_f32(const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, arm_matrix_instance_f32 *pDst); - /** +/** * @brief Floating-point matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -351,23 +318,19 @@ arm_status arm_mat_mult_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_f64( - const arm_matrix_instance_f64 * pSrcA, - const arm_matrix_instance_f64 * pSrcB, - arm_matrix_instance_f64 * pDst); +arm_status arm_mat_mult_f64(const arm_matrix_instance_f64 *pSrcA, + const arm_matrix_instance_f64 *pSrcB, arm_matrix_instance_f64 *pDst); - /** +/** * @brief Floating-point matrix and vector multiplication * @param[in] pSrcMat points to the input matrix structure * @param[in] pVec points to vector * @param[out] pDst points to output vector */ -void arm_mat_vec_mult_f32( - const arm_matrix_instance_f32 *pSrcMat, - const float32_t *pVec, - float32_t *pDst); +void arm_mat_vec_mult_f32(const arm_matrix_instance_f32 *pSrcMat, const float32_t *pVec, + float32_t *pDst); - /** +/** * @brief Q7 matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -376,24 +339,18 @@ void arm_mat_vec_mult_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_q7( - const arm_matrix_instance_q7 * pSrcA, - const arm_matrix_instance_q7 * pSrcB, - arm_matrix_instance_q7 * pDst, - q7_t * pState); +arm_status arm_mat_mult_q7(const arm_matrix_instance_q7 *pSrcA, const arm_matrix_instance_q7 *pSrcB, + arm_matrix_instance_q7 *pDst, q7_t *pState); - /** +/** * @brief Q7 matrix and vector multiplication * @param[in] pSrcMat points to the input matrix structure * @param[in] pVec points to vector * @param[out] pDst points to output vector */ -void arm_mat_vec_mult_q7( - const arm_matrix_instance_q7 *pSrcMat, - const q7_t *pVec, - q7_t *pDst); +void arm_mat_vec_mult_q7(const arm_matrix_instance_q7 *pSrcMat, const q7_t *pVec, q7_t *pDst); - /** +/** * @brief Q15 matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -402,24 +359,19 @@ void arm_mat_vec_mult_q7( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); +arm_status arm_mat_mult_q15(const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, arm_matrix_instance_q15 *pDst, + q15_t *pState); - /** +/** * @brief Q15 matrix and vector multiplication * @param[in] pSrcMat points to the input matrix structure * @param[in] pVec points to vector * @param[out] pDst points to output vector */ -void arm_mat_vec_mult_q15( - const arm_matrix_instance_q15 *pSrcMat, - const q15_t *pVec, - q15_t *pDst); +void arm_mat_vec_mult_q15(const arm_matrix_instance_q15 *pSrcMat, const q15_t *pVec, q15_t *pDst); - /** +/** * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -428,13 +380,11 @@ void arm_mat_vec_mult_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); +arm_status arm_mat_mult_fast_q15(const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, + arm_matrix_instance_q15 *pDst, q15_t *pState); - /** +/** * @brief Q31 matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -442,12 +392,10 @@ arm_status arm_mat_mult_fast_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_mult_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, arm_matrix_instance_q31 *pDst); - /** +/** * @brief Q31 matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -456,24 +404,19 @@ arm_status arm_mat_mult_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_opt_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst, - q31_t *pState); +arm_status arm_mat_mult_opt_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, arm_matrix_instance_q31 *pDst, + q31_t *pState); - /** +/** * @brief Q31 matrix and vector multiplication * @param[in] pSrcMat points to the input matrix structure * @param[in] pVec points to vector * @param[out] pDst points to output vector */ -void arm_mat_vec_mult_q31( - const arm_matrix_instance_q31 *pSrcMat, - const q31_t *pVec, - q31_t *pDst); +void arm_mat_vec_mult_q31(const arm_matrix_instance_q31 *pSrcMat, const q31_t *pVec, q31_t *pDst); - /** +/** * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -481,12 +424,11 @@ void arm_mat_vec_mult_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_mult_fast_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, + arm_matrix_instance_q31 *pDst); - /** +/** * @brief Floating-point matrix subtraction * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -494,12 +436,10 @@ arm_status arm_mat_mult_fast_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_sub_f32(const arm_matrix_instance_f32 *pSrcA, + const arm_matrix_instance_f32 *pSrcB, arm_matrix_instance_f32 *pDst); - /** +/** * @brief Floating-point matrix subtraction * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -507,12 +447,10 @@ arm_status arm_mat_sub_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_sub_f64( - const arm_matrix_instance_f64 * pSrcA, - const arm_matrix_instance_f64 * pSrcB, - arm_matrix_instance_f64 * pDst); +arm_status arm_mat_sub_f64(const arm_matrix_instance_f64 *pSrcA, + const arm_matrix_instance_f64 *pSrcB, arm_matrix_instance_f64 *pDst); - /** +/** * @brief Q15 matrix subtraction * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -520,12 +458,10 @@ arm_status arm_mat_sub_f64( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); +arm_status arm_mat_sub_q15(const arm_matrix_instance_q15 *pSrcA, + const arm_matrix_instance_q15 *pSrcB, arm_matrix_instance_q15 *pDst); - /** +/** * @brief Q31 matrix subtraction * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -533,12 +469,10 @@ arm_status arm_mat_sub_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_sub_q31(const arm_matrix_instance_q31 *pSrcA, + const arm_matrix_instance_q31 *pSrcB, arm_matrix_instance_q31 *pDst); - /** +/** * @brief Floating-point matrix scaling. * @param[in] pSrc points to the input matrix * @param[in] scale scale factor @@ -546,12 +480,10 @@ arm_status arm_mat_sub_q31( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); +arm_status arm_mat_scale_f32(const arm_matrix_instance_f32 *pSrc, float32_t scale, + arm_matrix_instance_f32 *pDst); - /** +/** * @brief Q15 matrix scaling. * @param[in] pSrc points to input matrix * @param[in] scaleFract fractional portion of the scale factor @@ -560,13 +492,10 @@ arm_status arm_mat_scale_f32( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); +arm_status arm_mat_scale_q15(const arm_matrix_instance_q15 *pSrc, q15_t scaleFract, int32_t shift, + arm_matrix_instance_q15 *pDst); - /** +/** * @brief Q31 matrix scaling. * @param[in] pSrc points to input matrix * @param[in] scaleFract fractional portion of the scale factor @@ -575,50 +504,36 @@ arm_status arm_mat_scale_q15( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); +arm_status arm_mat_scale_q31(const arm_matrix_instance_q31 *pSrc, q31_t scaleFract, int32_t shift, + arm_matrix_instance_q31 *pDst); - /** +/** * @brief Q31 matrix initialization. * @param[in,out] S points to an instance of the floating-point matrix structure. * @param[in] nRows number of rows in the matrix. * @param[in] nColumns number of columns in the matrix. * @param[in] pData points to the matrix data array. */ -void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); +void arm_mat_init_q31(arm_matrix_instance_q31 *S, uint16_t nRows, uint16_t nColumns, q31_t *pData); - /** +/** * @brief Q15 matrix initialization. * @param[in,out] S points to an instance of the floating-point matrix structure. * @param[in] nRows number of rows in the matrix. * @param[in] nColumns number of columns in the matrix. * @param[in] pData points to the matrix data array. */ -void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); +void arm_mat_init_q15(arm_matrix_instance_q15 *S, uint16_t nRows, uint16_t nColumns, q15_t *pData); - /** +/** * @brief Floating-point matrix initialization. * @param[in,out] S points to an instance of the floating-point matrix structure. * @param[in] nRows number of rows in the matrix. * @param[in] nColumns number of columns in the matrix. * @param[in] pData points to the matrix data array. */ -void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); +void arm_mat_init_f32(arm_matrix_instance_f32 *S, uint16_t nRows, uint16_t nColumns, + float32_t *pData); /** * @brief Floating-point matrix initialization. @@ -627,39 +542,28 @@ void arm_mat_init_f32( * @param[in] nColumns number of columns in the matrix. * @param[in] pData points to the matrix data array. */ -void arm_mat_init_f64( - arm_matrix_instance_f64 * S, - uint16_t nRows, - uint16_t nColumns, - float64_t * pData); - - +void arm_mat_init_f64(arm_matrix_instance_f64 *S, uint16_t nRows, uint16_t nColumns, + float64_t *pData); - - /** +/** * @brief Floating-point matrix inverse. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. */ - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); +arm_status arm_mat_inverse_f32(const arm_matrix_instance_f32 *src, arm_matrix_instance_f32 *dst); - - /** +/** * @brief Floating-point matrix inverse. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. */ - arm_status arm_mat_inverse_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * dst); +arm_status arm_mat_inverse_f64(const arm_matrix_instance_f64 *src, arm_matrix_instance_f64 *dst); - /** +/** * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. @@ -668,11 +572,9 @@ void arm_mat_init_f64( * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. * The decomposition is returning a lower triangular matrix. */ - arm_status arm_mat_cholesky_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * dst); +arm_status arm_mat_cholesky_f64(const arm_matrix_instance_f64 *src, arm_matrix_instance_f64 *dst); - /** +/** * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. @@ -681,61 +583,53 @@ void arm_mat_init_f64( * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. * The decomposition is returning a lower triangular matrix. */ - arm_status arm_mat_cholesky_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); +arm_status arm_mat_cholesky_f32(const arm_matrix_instance_f32 *src, arm_matrix_instance_f32 *dst); - /** +/** * @brief Solve UT . X = A where UT is an upper triangular matrix * @param[in] ut The upper triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of UT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_upper_triangular_f32( - const arm_matrix_instance_f32 * ut, - const arm_matrix_instance_f32 * a, - arm_matrix_instance_f32 * dst); +arm_status arm_mat_solve_upper_triangular_f32(const arm_matrix_instance_f32 *ut, + const arm_matrix_instance_f32 *a, + arm_matrix_instance_f32 *dst); - /** +/** * @brief Solve LT . X = A where LT is a lower triangular matrix * @param[in] lt The lower triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of LT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_lower_triangular_f32( - const arm_matrix_instance_f32 * lt, - const arm_matrix_instance_f32 * a, - arm_matrix_instance_f32 * dst); - +arm_status arm_mat_solve_lower_triangular_f32(const arm_matrix_instance_f32 *lt, + const arm_matrix_instance_f32 *a, + arm_matrix_instance_f32 *dst); - /** +/** * @brief Solve UT . X = A where UT is an upper triangular matrix * @param[in] ut The upper triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of UT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_upper_triangular_f64( - const arm_matrix_instance_f64 * ut, - const arm_matrix_instance_f64 * a, - arm_matrix_instance_f64 * dst); +arm_status arm_mat_solve_upper_triangular_f64(const arm_matrix_instance_f64 *ut, + const arm_matrix_instance_f64 *a, + arm_matrix_instance_f64 *dst); - /** +/** * @brief Solve LT . X = A where LT is a lower triangular matrix * @param[in] lt The lower triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of LT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_lower_triangular_f64( - const arm_matrix_instance_f64 * lt, - const arm_matrix_instance_f64 * a, - arm_matrix_instance_f64 * dst); +arm_status arm_mat_solve_lower_triangular_f64(const arm_matrix_instance_f64 *lt, + const arm_matrix_instance_f64 *a, + arm_matrix_instance_f64 *dst); - - /** +/** * @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] l points to the instance of the output floating-point triangular matrix structure. @@ -745,13 +639,10 @@ void arm_mat_init_f64( * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. * The decomposition is returning a lower triangular matrix. */ - arm_status arm_mat_ldlt_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * l, - arm_matrix_instance_f32 * d, - uint16_t * pp); +arm_status arm_mat_ldlt_f32(const arm_matrix_instance_f32 *src, arm_matrix_instance_f32 *l, + arm_matrix_instance_f32 *d, uint16_t *pp); - /** +/** * @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] l points to the instance of the output floating-point triangular matrix structure. @@ -761,11 +652,8 @@ void arm_mat_init_f64( * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. * The decomposition is returning a lower triangular matrix. */ - arm_status arm_mat_ldlt_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * l, - arm_matrix_instance_f64 * d, - uint16_t * pp); +arm_status arm_mat_ldlt_f64(const arm_matrix_instance_f64 *src, arm_matrix_instance_f64 *l, + arm_matrix_instance_f64 *d, uint16_t *pp); /** @brief QR decomposition of a m x n floating point matrix with m >= n. @@ -782,15 +670,9 @@ void arm_mat_init_f64( - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) */ -arm_status arm_mat_qr_f32( - const arm_matrix_instance_f32 * pSrc, - const float32_t threshold, - arm_matrix_instance_f32 * pOutR, - arm_matrix_instance_f32 * pOutQ, - float32_t * pOutTau, - float32_t *pTmpA, - float32_t *pTmpB - ); +arm_status arm_mat_qr_f32(const arm_matrix_instance_f32 *pSrc, const float32_t threshold, + arm_matrix_instance_f32 *pOutR, arm_matrix_instance_f32 *pOutQ, + float32_t *pOutTau, float32_t *pTmpA, float32_t *pTmpB); /** @brief QR decomposition of a m x n floating point matrix with m >= n. @@ -807,15 +689,9 @@ arm_status arm_mat_qr_f32( - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) */ -arm_status arm_mat_qr_f64( - const arm_matrix_instance_f64 * pSrc, - const float64_t threshold, - arm_matrix_instance_f64 * pOutR, - arm_matrix_instance_f64 * pOutQ, - float64_t * pOutTau, - float64_t *pTmpA, - float64_t *pTmpB - ); +arm_status arm_mat_qr_f64(const arm_matrix_instance_f64 *pSrc, const float64_t threshold, + arm_matrix_instance_f64 *pOutR, arm_matrix_instance_f64 *pOutQ, + float64_t *pOutTau, float64_t *pTmpA, float64_t *pTmpB); /** @brief Householder transform of a floating point vector. @@ -826,12 +702,8 @@ arm_status arm_mat_qr_f64( @return beta return the scaling factor beta */ -float32_t arm_householder_f32( - const float32_t * pSrc, - const float32_t threshold, - uint32_t blockSize, - float32_t * pOut - ); +float32_t arm_householder_f32(const float32_t *pSrc, const float32_t threshold, uint32_t blockSize, + float32_t *pOut); /** @brief Householder transform of a double floating point vector. @@ -842,14 +714,10 @@ float32_t arm_householder_f32( @return beta return the scaling factor beta */ -float64_t arm_householder_f64( - const float64_t * pSrc, - const float64_t threshold, - uint32_t blockSize, - float64_t * pOut - ); +float64_t arm_householder_f64(const float64_t *pSrc, const float64_t threshold, uint32_t blockSize, + float64_t *pOut); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions_f16.h old mode 100755 new mode 100644 index 39eb9a8017..7e11a7014d --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_functions_f16.h @@ -23,37 +23,33 @@ * limitations under the License. */ - #ifndef MATRIX_FUNCTIONS_F16_H_ #define MATRIX_FUNCTIONS_F16_H_ -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - #include "arm_math_types_f16.h" #include "arm_math_memory.h" #include "dsp/none.h" #include "dsp/utils.h" - + #if defined(ARM_FLOAT16_SUPPORTED) - #define DEFAULT_HOUSEHOLDER_THRESHOLD_F16 (1.0e-3f) +#define DEFAULT_HOUSEHOLDER_THRESHOLD_F16 (1.0e-3f) - /** +/** * @brief Instance structure for the floating-point matrix structure. */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float16_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f16; +typedef struct { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float16_t *pData; /**< points to the data of the matrix. */ +} arm_matrix_instance_f16; - /** +/** * @brief Floating-point matrix addition. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -61,12 +57,10 @@ extern "C" * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_add_f16( - const arm_matrix_instance_f16 * pSrcA, - const arm_matrix_instance_f16 * pSrcB, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_add_f16(const arm_matrix_instance_f16 *pSrcA, + const arm_matrix_instance_f16 *pSrcB, arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point, complex, matrix multiplication. * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -74,34 +68,30 @@ arm_status arm_mat_add_f16( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_mult_f16( - const arm_matrix_instance_f16 * pSrcA, - const arm_matrix_instance_f16 * pSrcB, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_cmplx_mult_f16(const arm_matrix_instance_f16 *pSrcA, + const arm_matrix_instance_f16 *pSrcB, + arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_trans_f16( - const arm_matrix_instance_f16 * pSrc, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_trans_f16(const arm_matrix_instance_f16 *pSrc, arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point complex matrix transpose. * @param[in] pSrc points to the input matrix * @param[out] pDst points to the output matrix * @return The function returns either ARM_MATH_SIZE_MISMATCH * or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_cmplx_trans_f16( - const arm_matrix_instance_f16 * pSrc, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_cmplx_trans_f16(const arm_matrix_instance_f16 *pSrc, + arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point matrix multiplication * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -109,22 +99,18 @@ arm_status arm_mat_cmplx_trans_f16( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_mult_f16( - const arm_matrix_instance_f16 * pSrcA, - const arm_matrix_instance_f16 * pSrcB, - arm_matrix_instance_f16 * pDst); - /** +arm_status arm_mat_mult_f16(const arm_matrix_instance_f16 *pSrcA, + const arm_matrix_instance_f16 *pSrcB, arm_matrix_instance_f16 *pDst); +/** * @brief Floating-point matrix and vector multiplication * @param[in] pSrcMat points to the input matrix structure * @param[in] pVec points to vector * @param[out] pDst points to output vector */ -void arm_mat_vec_mult_f16( - const arm_matrix_instance_f16 *pSrcMat, - const float16_t *pVec, - float16_t *pDst); +void arm_mat_vec_mult_f16(const arm_matrix_instance_f16 *pSrcMat, const float16_t *pVec, + float16_t *pDst); - /** +/** * @brief Floating-point matrix subtraction * @param[in] pSrcA points to the first input matrix structure * @param[in] pSrcB points to the second input matrix structure @@ -132,12 +118,10 @@ void arm_mat_vec_mult_f16( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_sub_f16( - const arm_matrix_instance_f16 * pSrcA, - const arm_matrix_instance_f16 * pSrcB, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_sub_f16(const arm_matrix_instance_f16 *pSrcA, + const arm_matrix_instance_f16 *pSrcB, arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point matrix scaling. * @param[in] pSrc points to the input matrix * @param[in] scale scale factor @@ -145,38 +129,29 @@ arm_status arm_mat_sub_f16( * @return The function returns either * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. */ -arm_status arm_mat_scale_f16( - const arm_matrix_instance_f16 * pSrc, - float16_t scale, - arm_matrix_instance_f16 * pDst); +arm_status arm_mat_scale_f16(const arm_matrix_instance_f16 *pSrc, float16_t scale, + arm_matrix_instance_f16 *pDst); - /** +/** * @brief Floating-point matrix initialization. * @param[in,out] S points to an instance of the floating-point matrix structure. * @param[in] nRows number of rows in the matrix. * @param[in] nColumns number of columns in the matrix. * @param[in] pData points to the matrix data array. */ -void arm_mat_init_f16( - arm_matrix_instance_f16 * S, - uint16_t nRows, - uint16_t nColumns, - float16_t * pData); - +void arm_mat_init_f16(arm_matrix_instance_f16 *S, uint16_t nRows, uint16_t nColumns, + float16_t *pData); - /** +/** * @brief Floating-point matrix inverse. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. */ - arm_status arm_mat_inverse_f16( - const arm_matrix_instance_f16 * src, - arm_matrix_instance_f16 * dst); - +arm_status arm_mat_inverse_f16(const arm_matrix_instance_f16 *src, arm_matrix_instance_f16 *dst); - /** +/** * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. * @param[in] src points to the instance of the input floating-point matrix structure. * @param[out] dst points to the instance of the output floating-point matrix structure. @@ -185,34 +160,29 @@ void arm_mat_init_f16( * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. * The decomposition is returning a lower triangular matrix. */ - arm_status arm_mat_cholesky_f16( - const arm_matrix_instance_f16 * src, - arm_matrix_instance_f16 * dst); +arm_status arm_mat_cholesky_f16(const arm_matrix_instance_f16 *src, arm_matrix_instance_f16 *dst); - /** +/** * @brief Solve UT . X = A where UT is an upper triangular matrix * @param[in] ut The upper triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of UT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_upper_triangular_f16( - const arm_matrix_instance_f16 * ut, - const arm_matrix_instance_f16 * a, - arm_matrix_instance_f16 * dst); +arm_status arm_mat_solve_upper_triangular_f16(const arm_matrix_instance_f16 *ut, + const arm_matrix_instance_f16 *a, + arm_matrix_instance_f16 *dst); - /** +/** * @brief Solve LT . X = A where LT is a lower triangular matrix * @param[in] lt The lower triangular matrix * @param[in] a The matrix a * @param[out] dst The solution X of LT . X = A * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. */ - arm_status arm_mat_solve_lower_triangular_f16( - const arm_matrix_instance_f16 * lt, - const arm_matrix_instance_f16 * a, - arm_matrix_instance_f16 * dst); - +arm_status arm_mat_solve_lower_triangular_f16(const arm_matrix_instance_f16 *lt, + const arm_matrix_instance_f16 *a, + arm_matrix_instance_f16 *dst); /** @brief QR decomposition of a m x n floating point matrix with m >= n. @@ -228,15 +198,9 @@ void arm_mat_init_f16( - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) */ -arm_status arm_mat_qr_f16( - const arm_matrix_instance_f16 * pSrc, - const float16_t threshold, - arm_matrix_instance_f16 * pOutR, - arm_matrix_instance_f16 * pOutQ, - float16_t * pOutTau, - float16_t *pTmpA, - float16_t *pTmpB - ); +arm_status arm_mat_qr_f16(const arm_matrix_instance_f16 *pSrc, const float16_t threshold, + arm_matrix_instance_f16 *pOutR, arm_matrix_instance_f16 *pOutQ, + float16_t *pOutTau, float16_t *pTmpA, float16_t *pTmpB); /** @brief Householder transform of a half floating point vector. @@ -246,15 +210,11 @@ arm_status arm_mat_qr_f16( @param[outQ] pOut points to the output vector. @return beta return the scaling factor beta */ -float16_t arm_householder_f16( - const float16_t * pSrc, - const float16_t threshold, - uint32_t blockSize, - float16_t * pOut - ); +float16_t arm_householder_f16(const float16_t *pSrc, const float16_t threshold, uint32_t blockSize, + float16_t *pOut); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_utils.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_utils.h old mode 100755 new mode 100644 index 79e7f8cf10..c493802222 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_utils.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/matrix_utils.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef MATRIX_UTILS_H_ #define MATRIX_UTILS_H_ @@ -33,607 +32,557 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif -#define ELEM(A,ROW,COL) &((A)->pData[(A)->numCols* (ROW) + (COL)]) - -#define SCALE_COL_T(T,CAST,A,ROW,v,i) \ -{ \ - int32_t _w; \ - T *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - const int32_t nb = (A)->numRows - ROW;\ - \ - data += i + _numCols * (ROW); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *data *= CAST v; \ - data += _numCols; \ - } \ -} - -#define COPY_COL_T(T,A,ROW,COL,DST) \ -{ \ - uint32_t _row; \ - T *_pb=DST; \ - T *_pa = (A)->pData + ROW * (A)->numCols + COL;\ - for(_row = ROW; _row < (A)->numRows; _row ++) \ - { \ - *_pb++ = *_pa; \ - _pa += (A)->numCols; \ - } \ -} +#define ELEM(A, ROW, COL) &((A)->pData[(A)->numCols * (ROW) + (COL)]) + +#define SCALE_COL_T(T, CAST, A, ROW, v, i) \ + { \ + int32_t _w; \ + T *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = (A)->numRows - ROW; \ + \ + data += i + _numCols * (ROW); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *data *= CAST v; \ + data += _numCols; \ + } \ + } + +#define COPY_COL_T(T, A, ROW, COL, DST) \ + { \ + uint32_t _row; \ + T *_pb = DST; \ + T *_pa = (A)->pData + ROW * (A)->numCols + COL; \ + for (_row = ROW; _row < (A)->numRows; _row++) { \ + *_pb++ = *_pa; \ + _pa += (A)->numCols; \ + } \ + } #if defined(ARM_FLOAT16_SUPPORTED) #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) -#define SWAP_ROWS_F16(A,COL,i,j) \ - { \ - int cnt = ((A)->numCols)-(COL); \ - int32_t _w; \ - float16_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - \ - for(_w=(COL);_w < _numCols; _w+=8) \ - { \ - f16x8_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp16q(cnt); \ - \ - tmpa=vldrhq_z_f16(&data[i*_numCols + _w],p0);\ - tmpb=vldrhq_z_f16(&data[j*_numCols + _w],p0);\ - \ - vstrhq_p(&data[i*_numCols + _w], tmpb, p0); \ - vstrhq_p(&data[j*_numCols + _w], tmpa, p0); \ - \ - cnt -= 8; \ - } \ - } - -#define SCALE_ROW_F16(A,COL,v,i) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - int32_t _w; \ - float16_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - \ - for(_w=(COL);_w < _numCols; _w+=8) \ - { \ - f16x8_t tmpa; \ - mve_pred16_t p0 = vctp16q(cnt); \ - tmpa = vldrhq_z_f16(&data[i*_numCols + _w],p0);\ - tmpa = vmulq_n_f16(tmpa,(_Float16)v); \ - vstrhq_p(&data[i*_numCols + _w], tmpa, p0); \ - cnt -= 8; \ - } \ - \ -} - -#define MAC_ROW_F16(COL,A,i,v,B,j) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - int32_t _w; \ - float16_t *dataA = (A)->pData; \ - float16_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - \ - for(_w=(COL);_w < _numCols; _w+=8) \ - { \ - f16x8_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp16q(cnt); \ - tmpa = vldrhq_z_f16(&dataA[i*_numCols + _w],p0);\ - tmpb = vldrhq_z_f16(&dataB[j*_numCols + _w],p0);\ - tmpa = vfmaq_n_f16(tmpa,tmpb,v); \ - vstrhq_p(&dataA[i*_numCols + _w], tmpa, p0); \ - cnt -= 8; \ - } \ - \ -} - -#define MAS_ROW_F16(COL,A,i,v,B,j) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - int32_t _w; \ - float16_t *dataA = (A)->pData; \ - float16_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - f16x8_t vec=vdupq_n_f16(v); \ - \ - for(_w=(COL);_w < _numCols; _w+=8) \ - { \ - f16x8_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp16q(cnt); \ - tmpa = vldrhq_z_f16(&dataA[i*_numCols + _w],p0);\ - tmpb = vldrhq_z_f16(&dataB[j*_numCols + _w],p0);\ - tmpa = vfmsq_f16(tmpa,tmpb,vec); \ - vstrhq_p(&dataA[i*_numCols + _w], tmpa, p0); \ - cnt -= 8; \ - } \ - \ -} +#define SWAP_ROWS_F16(A, COL, i, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + int32_t _w; \ + float16_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + \ + for (_w = (COL); _w < _numCols; _w += 8) { \ + f16x8_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + \ + tmpa = vldrhq_z_f16(&data[i * _numCols + _w], p0); \ + tmpb = vldrhq_z_f16(&data[j * _numCols + _w], p0); \ + \ + vstrhq_p(&data[i * _numCols + _w], tmpb, p0); \ + vstrhq_p(&data[j * _numCols + _w], tmpa, p0); \ + \ + cnt -= 8; \ + } \ + } + +#define SCALE_ROW_F16(A, COL, v, i) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + int32_t _w; \ + float16_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + \ + for (_w = (COL); _w < _numCols; _w += 8) { \ + f16x8_t tmpa; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&data[i * _numCols + _w], p0); \ + tmpa = vmulq_n_f16(tmpa, (_Float16)v); \ + vstrhq_p(&data[i * _numCols + _w], tmpa, p0); \ + cnt -= 8; \ + } \ + } + +#define MAC_ROW_F16(COL, A, i, v, B, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + int32_t _w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + \ + for (_w = (COL); _w < _numCols; _w += 8) { \ + f16x8_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&dataA[i * _numCols + _w], p0); \ + tmpb = vldrhq_z_f16(&dataB[j * _numCols + _w], p0); \ + tmpa = vfmaq_n_f16(tmpa, tmpb, v); \ + vstrhq_p(&dataA[i * _numCols + _w], tmpa, p0); \ + cnt -= 8; \ + } \ + } + +#define MAS_ROW_F16(COL, A, i, v, B, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + int32_t _w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + f16x8_t vec = vdupq_n_f16(v); \ + \ + for (_w = (COL); _w < _numCols; _w += 8) { \ + f16x8_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&dataA[i * _numCols + _w], p0); \ + tmpb = vldrhq_z_f16(&dataB[j * _numCols + _w], p0); \ + tmpa = vfmsq_f16(tmpa, tmpb, vec); \ + vstrhq_p(&dataA[i * _numCols + _w], tmpa, p0); \ + cnt -= 8; \ + } \ + } #else - -#define SWAP_ROWS_F16(A,COL,i,j) \ -{ \ - int32_t _w; \ - float16_t *dataI = (A)->pData; \ - float16_t *dataJ = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataI += i*_numCols + (COL); \ - dataJ += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - float16_t tmp; \ - tmp = *dataI; \ - *dataI++ = *dataJ; \ - *dataJ++ = tmp; \ - } \ -} - -#define SCALE_ROW_F16(A,COL,v,i) \ -{ \ - int32_t _w; \ - float16_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - data += i*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *data++ *= (_Float16)v; \ - } \ -} - - -#define MAC_ROW_F16(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float16_t *dataA = (A)->pData; \ - float16_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - const int32_t nb = _numCols-(COL); \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ += (_Float16)v * (_Float16)*dataB++;\ - } \ -} - -#define MAS_ROW_F16(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float16_t *dataA = (A)->pData; \ - float16_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - const int32_t nb = _numCols-(COL); \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ -= (_Float16)v * (_Float16)*dataB++;\ - } \ -} +#define SWAP_ROWS_F16(A, COL, i, j) \ + { \ + int32_t _w; \ + float16_t *dataI = (A)->pData; \ + float16_t *dataJ = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataI += i * _numCols + (COL); \ + dataJ += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + float16_t tmp; \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ + } + +#define SCALE_ROW_F16(A, COL, v, i) \ + { \ + int32_t _w; \ + float16_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + data += i * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *data++ *= (_Float16)v; \ + } \ + } + +#define MAC_ROW_F16(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ += (_Float16)v * (_Float16)*dataB++; \ + } \ + } + +#define MAS_ROW_F16(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ -= (_Float16)v * (_Float16)*dataB++; \ + } \ + } #endif /*defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)*/ /* Functions with only a scalar version */ -#define COPY_COL_F16(A,ROW,COL,DST) \ - COPY_COL_T(float16_t,A,ROW,COL,DST) +#define COPY_COL_F16(A, ROW, COL, DST) COPY_COL_T(float16_t, A, ROW, COL, DST) + +#define SCALE_COL_F16(A, ROW, v, i) SCALE_COL_T(float16_t, (_Float16), A, ROW, v, i) -#define SCALE_COL_F16(A,ROW,v,i) \ - SCALE_COL_T(float16_t,(_Float16),A,ROW,v,i) - #endif /* defined(ARM_FLOAT16_SUPPORTED)*/ #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) -#define SWAP_ROWS_F32(A,COL,i,j) \ - { \ - int cnt = ((A)->numCols)-(COL); \ - float32_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - int32_t _w; \ - \ - for(_w=(COL);_w < _numCols; _w+=4) \ - { \ - f32x4_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp32q(cnt); \ - \ - tmpa=vldrwq_z_f32(&data[i*_numCols + _w],p0);\ - tmpb=vldrwq_z_f32(&data[j*_numCols + _w],p0);\ - \ - vstrwq_p(&data[i*_numCols + _w], tmpb, p0); \ - vstrwq_p(&data[j*_numCols + _w], tmpa, p0); \ - \ - cnt -= 4; \ - } \ - } - -#define MAC_ROW_F32(COL,A,i,v,B,j) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - int32_t _w; \ - \ - for(_w=(COL);_w < _numCols; _w+=4) \ - { \ - f32x4_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp32q(cnt); \ - tmpa = vldrwq_z_f32(&dataA[i*_numCols + _w],p0);\ - tmpb = vldrwq_z_f32(&dataB[j*_numCols + _w],p0);\ - tmpa = vfmaq_n_f32(tmpa,tmpb,v); \ - vstrwq_p(&dataA[i*_numCols + _w], tmpa, p0); \ - cnt -= 4; \ - } \ - \ -} - -#define MAS_ROW_F32(COL,A,i,v,B,j) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols; \ - int32_t _w; \ - f32x4_t vec=vdupq_n_f32(v); \ - \ - for(_w=(COL);_w < _numCols; _w+=4) \ - { \ - f32x4_t tmpa,tmpb; \ - mve_pred16_t p0 = vctp32q(cnt); \ - tmpa = vldrwq_z_f32(&dataA[i*_numCols + _w],p0);\ - tmpb = vldrwq_z_f32(&dataB[j*_numCols + _w],p0);\ - tmpa = vfmsq_f32(tmpa,tmpb,vec); \ - vstrwq_p(&dataA[i*_numCols + _w], tmpa, p0); \ - cnt -= 4; \ - } \ - \ -} - -#define SCALE_ROW_F32(A,COL,v,i) \ -{ \ - int cnt = ((A)->numCols)-(COL); \ - float32_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - int32_t _w; \ - \ - for(_w=(COL);_w < _numCols; _w+=4) \ - { \ - f32x4_t tmpa; \ - mve_pred16_t p0 = vctp32q(cnt); \ - tmpa = vldrwq_z_f32(&data[i*_numCols + _w],p0);\ - tmpa = vmulq_n_f32(tmpa,v); \ - vstrwq_p(&data[i*_numCols + _w], tmpa, p0); \ - cnt -= 4; \ - } \ - \ -} +#define SWAP_ROWS_F32(A, COL, i, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + float32_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + int32_t _w; \ + \ + for (_w = (COL); _w < _numCols; _w += 4) { \ + f32x4_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + \ + tmpa = vldrwq_z_f32(&data[i * _numCols + _w], p0); \ + tmpb = vldrwq_z_f32(&data[j * _numCols + _w], p0); \ + \ + vstrwq_p(&data[i * _numCols + _w], tmpb, p0); \ + vstrwq_p(&data[j * _numCols + _w], tmpa, p0); \ + \ + cnt -= 4; \ + } \ + } + +#define MAC_ROW_F32(COL, A, i, v, B, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + int32_t _w; \ + \ + for (_w = (COL); _w < _numCols; _w += 4) { \ + f32x4_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&dataA[i * _numCols + _w], p0); \ + tmpb = vldrwq_z_f32(&dataB[j * _numCols + _w], p0); \ + tmpa = vfmaq_n_f32(tmpa, tmpb, v); \ + vstrwq_p(&dataA[i * _numCols + _w], tmpa, p0); \ + cnt -= 4; \ + } \ + } + +#define MAS_ROW_F32(COL, A, i, v, B, j) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + int32_t _w; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + for (_w = (COL); _w < _numCols; _w += 4) { \ + f32x4_t tmpa, tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&dataA[i * _numCols + _w], p0); \ + tmpb = vldrwq_z_f32(&dataB[j * _numCols + _w], p0); \ + tmpa = vfmsq_f32(tmpa, tmpb, vec); \ + vstrwq_p(&dataA[i * _numCols + _w], tmpa, p0); \ + cnt -= 4; \ + } \ + } + +#define SCALE_ROW_F32(A, COL, v, i) \ + { \ + int cnt = ((A)->numCols) - (COL); \ + float32_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + int32_t _w; \ + \ + for (_w = (COL); _w < _numCols; _w += 4) { \ + f32x4_t tmpa; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&data[i * _numCols + _w], p0); \ + tmpa = vmulq_n_f32(tmpa, v); \ + vstrwq_p(&data[i * _numCols + _w], tmpa, p0); \ + cnt -= 4; \ + } \ + } #elif defined(ARM_MATH_NEON) && !defined(ARM_MATH_AUTOVECTORIZE) -#define SWAP_ROWS_F32(A,COL,i,j) \ -{ \ - int32_t _w; \ - float32_t *dataI = (A)->pData; \ - float32_t *dataJ = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols - COL; \ - \ - dataI += i*_numCols + (COL); \ - dataJ += j*_numCols + (COL); \ - \ - float32_t tmp; \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - tmp = *dataI; \ - *dataI++ = *dataJ; \ - *dataJ++ = tmp; \ - } \ -} - -#define MAC_ROW_F32(COL,A,i,v,B,j) \ -{ \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols - (COL); \ - int32_t nbElems; \ - f32x4_t vec = vdupq_n_f32(v); \ - \ - nbElems = nb >> 2; \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - while(nbElems>0) \ - { \ - f32x4_t tmpa,tmpb; \ - tmpa = vld1q_f32(dataA,p0); \ - tmpb = vld1q_f32(dataB,p0); \ - tmpa = vmlaq_f32(tmpa,tmpb,vec);\ - vst1q_f32(dataA, tmpa, p0); \ - nbElems--; \ - dataA += 4; \ - dataB += 4; \ - } \ - \ - nbElems = nb & 3; \ - while(nbElems > 0) \ - { \ - *dataA++ += v* *dataB++; \ - nbElems--; \ - } \ -} - -#define MAS_ROW_F32(COL,A,i,v,B,j) \ -{ \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols - (COL); \ - int32_t nbElems; \ - f32x4_t vec = vdupq_n_f32(v); \ - \ - nbElems = nb >> 2; \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - while(nbElems>0) \ - { \ - f32x4_t tmpa,tmpb; \ - tmpa = vld1q_f32(dataA); \ - tmpb = vld1q_f32(dataB); \ - tmpa = vmlsq_f32(tmpa,tmpb,vec);\ - vst1q_f32(dataA, tmpa); \ - nbElems--; \ - dataA += 4; \ - dataB += 4; \ - } \ - \ - nbElems = nb & 3; \ - while(nbElems > 0) \ - { \ - *dataA++ -= v* *dataB++; \ - nbElems--; \ - } \ -} - -#define SCALE_ROW_F32(A,COL,v,i) \ -{ \ - float32_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - const int32_t nb = _numCols - (COL); \ - int32_t nbElems; \ - f32x4_t vec = vdupq_n_f32(v); \ - \ - nbElems = nb >> 2; \ - \ - data += i*_numCols + (COL); \ - while(nbElems>0) \ - { \ - f32x4_t tmpa; \ - tmpa = vld1q_f32(data); \ - tmpa = vmulq_f32(tmpa,vec); \ - vst1q_f32(data, tmpa); \ - data += 4; \ - nbElems --; \ - } \ - \ - nbElems = nb & 3; \ - while(nbElems > 0) \ - { \ - *data++ *= v; \ - nbElems--; \ - } \ - \ -} +#define SWAP_ROWS_F32(A, COL, i, j) \ + { \ + int32_t _w; \ + float32_t *dataI = (A)->pData; \ + float32_t *dataJ = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - COL; \ + \ + dataI += i * _numCols + (COL); \ + dataJ += j * _numCols + (COL); \ + \ + float32_t tmp; \ + \ + for (_w = 0; _w < nb; _w++) { \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ + } + +#define MAC_ROW_F32(COL, A, i, v, B, j) \ + { \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + while (nbElems > 0) { \ + f32x4_t tmpa, tmpb; \ + tmpa = vld1q_f32(dataA, p0); \ + tmpb = vld1q_f32(dataB, p0); \ + tmpa = vmlaq_f32(tmpa, tmpb, vec); \ + vst1q_f32(dataA, tmpa, p0); \ + nbElems--; \ + dataA += 4; \ + dataB += 4; \ + } \ + \ + nbElems = nb & 3; \ + while (nbElems > 0) { \ + *dataA++ += v * *dataB++; \ + nbElems--; \ + } \ + } + +#define MAS_ROW_F32(COL, A, i, v, B, j) \ + { \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + while (nbElems > 0) { \ + f32x4_t tmpa, tmpb; \ + tmpa = vld1q_f32(dataA); \ + tmpb = vld1q_f32(dataB); \ + tmpa = vmlsq_f32(tmpa, tmpb, vec); \ + vst1q_f32(dataA, tmpa); \ + nbElems--; \ + dataA += 4; \ + dataB += 4; \ + } \ + \ + nbElems = nb & 3; \ + while (nbElems > 0) { \ + *dataA++ -= v * *dataB++; \ + nbElems--; \ + } \ + } + +#define SCALE_ROW_F32(A, COL, v, i) \ + { \ + float32_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + data += i * _numCols + (COL); \ + while (nbElems > 0) { \ + f32x4_t tmpa; \ + tmpa = vld1q_f32(data); \ + tmpa = vmulq_f32(tmpa, vec); \ + vst1q_f32(data, tmpa); \ + data += 4; \ + nbElems--; \ + } \ + \ + nbElems = nb & 3; \ + while (nbElems > 0) { \ + *data++ *= v; \ + nbElems--; \ + } \ + } #else -#define SWAP_ROWS_F32(A,COL,i,j) \ -{ \ - int32_t _w; \ - float32_t tmp; \ - float32_t *dataI = (A)->pData; \ - float32_t *dataJ = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols - COL; \ - \ - dataI += i*_numCols + (COL); \ - dataJ += j*_numCols + (COL); \ - \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - tmp = *dataI; \ - *dataI++ = *dataJ; \ - *dataJ++ = tmp; \ - } \ -} - -#define SCALE_ROW_F32(A,COL,v,i) \ -{ \ - int32_t _w; \ - float32_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols - COL; \ - \ - data += i*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *data++ *= v; \ - } \ -} - - -#define MAC_ROW_F32(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataA = dataA + i*_numCols + (COL); \ - dataB = dataB + j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ += v* *dataB++; \ - } \ -} - -#define MAS_ROW_F32(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float32_t *dataA = (A)->pData; \ - float32_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataA = dataA + i*_numCols + (COL); \ - dataB = dataB + j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ -= v* *dataB++; \ - } \ -} +#define SWAP_ROWS_F32(A, COL, i, j) \ + { \ + int32_t _w; \ + float32_t tmp; \ + float32_t *dataI = (A)->pData; \ + float32_t *dataJ = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - COL; \ + \ + dataI += i * _numCols + (COL); \ + dataJ += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ + } + +#define SCALE_ROW_F32(A, COL, v, i) \ + { \ + int32_t _w; \ + float32_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - COL; \ + \ + data += i * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *data++ *= v; \ + } \ + } + +#define MAC_ROW_F32(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA = dataA + i * _numCols + (COL); \ + dataB = dataB + j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ += v * *dataB++; \ + } \ + } + +#define MAS_ROW_F32(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA = dataA + i * _numCols + (COL); \ + dataB = dataB + j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ -= v * *dataB++; \ + } \ + } #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */ - /* Functions _with only a scalar version */ -#define COPY_COL_F32(A,ROW,COL,DST) \ - COPY_COL_T(float32_t,A,ROW,COL,DST) - -#define COPY_COL_F64(A,ROW,COL,DST) \ - COPY_COL_T(float64_t,A,ROW,COL,DST) - -#define SWAP_COLS_F32(A,COL,i,j) \ -{ \ - int32_t _w; \ - float32_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - for(_w=(COL);_w < _numCols; _w++) \ - { \ - float32_t tmp; \ - tmp = data[_w*_numCols + i]; \ - data[_w*_numCols + i] = data[_w*_numCols + j];\ - data[_w*_numCols + j] = tmp; \ - } \ -} - -#define SCALE_COL_F32(A,ROW,v,i) \ - SCALE_COL_T(float32_t,,A,ROW,v,i) - -#define SWAP_ROWS_F64(A,COL,i,j) \ -{ \ - int32_t _w; \ - float64_t *dataI = (A)->pData; \ - float64_t *dataJ = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataI += i*_numCols + (COL); \ - dataJ += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - float64_t tmp; \ - tmp = *dataI; \ - *dataI++ = *dataJ; \ - *dataJ++ = tmp; \ - } \ -} - -#define SWAP_COLS_F64(A,COL,i,j) \ -{ \ - int32_t _w; \ - float64_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols; \ - for(_w=(COL);_w < _numCols; _w++) \ - { \ - float64_t tmp; \ - tmp = data[_w*_numCols + i]; \ - data[_w*_numCols + i] = data[_w*_numCols + j];\ - data[_w*_numCols + j] = tmp; \ - } \ -} - -#define SCALE_ROW_F64(A,COL,v,i) \ -{ \ - int32_t _w; \ - float64_t *data = (A)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - data += i*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *data++ *= v; \ - } \ -} - -#define SCALE_COL_F64(A,ROW,v,i) \ - SCALE_COL_T(float64_t,,A,ROW,v,i) - -#define MAC_ROW_F64(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float64_t *dataA = (A)->pData; \ - float64_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ += v* *dataB++; \ - } \ -} - -#define MAS_ROW_F64(COL,A,i,v,B,j) \ -{ \ - int32_t _w; \ - float64_t *dataA = (A)->pData; \ - float64_t *dataB = (B)->pData; \ - const int32_t _numCols = (A)->numCols;\ - const int32_t nb = _numCols-(COL); \ - \ - dataA += i*_numCols + (COL); \ - dataB += j*_numCols + (COL); \ - \ - for(_w=0;_w < nb; _w++) \ - { \ - *dataA++ -= v* *dataB++; \ - } \ -} - -#ifdef __cplusplus +#define COPY_COL_F32(A, ROW, COL, DST) COPY_COL_T(float32_t, A, ROW, COL, DST) + +#define COPY_COL_F64(A, ROW, COL, DST) COPY_COL_T(float64_t, A, ROW, COL, DST) + +#define SWAP_COLS_F32(A, COL, i, j) \ + { \ + int32_t _w; \ + float32_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + for (_w = (COL); _w < _numCols; _w++) { \ + float32_t tmp; \ + tmp = data[_w * _numCols + i]; \ + data[_w * _numCols + i] = data[_w * _numCols + j]; \ + data[_w * _numCols + j] = tmp; \ + } \ + } + +#define SCALE_COL_F32(A, ROW, v, i) SCALE_COL_T(float32_t, , A, ROW, v, i) + +#define SWAP_ROWS_F64(A, COL, i, j) \ + { \ + int32_t _w; \ + float64_t *dataI = (A)->pData; \ + float64_t *dataJ = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataI += i * _numCols + (COL); \ + dataJ += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + float64_t tmp; \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ + } + +#define SWAP_COLS_F64(A, COL, i, j) \ + { \ + int32_t _w; \ + float64_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + for (_w = (COL); _w < _numCols; _w++) { \ + float64_t tmp; \ + tmp = data[_w * _numCols + i]; \ + data[_w * _numCols + i] = data[_w * _numCols + j]; \ + data[_w * _numCols + j] = tmp; \ + } \ + } + +#define SCALE_ROW_F64(A, COL, v, i) \ + { \ + int32_t _w; \ + float64_t *data = (A)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + data += i * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *data++ *= v; \ + } \ + } + +#define SCALE_COL_F64(A, ROW, v, i) SCALE_COL_T(float64_t, , A, ROW, v, i) + +#define MAC_ROW_F64(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float64_t *dataA = (A)->pData; \ + float64_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ += v * *dataB++; \ + } \ + } + +#define MAS_ROW_F64(COL, A, i, v, B, j) \ + { \ + int32_t _w; \ + float64_t *dataA = (A)->pData; \ + float64_t *dataB = (B)->pData; \ + const int32_t _numCols = (A)->numCols; \ + const int32_t nb = _numCols - (COL); \ + \ + dataA += i * _numCols + (COL); \ + dataB += j * _numCols + (COL); \ + \ + for (_w = 0; _w < nb; _w++) { \ + *dataA++ -= v * *dataB++; \ + } \ + } + +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h old mode 100755 new mode 100644 index 7551ee95ed..910ed2b6f2 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/none.h @@ -33,19 +33,16 @@ But those are not always available or use a restricted set of intrinsics. */ - + #ifndef NONE_H_ #define NONE_H_ #include "arm_math_types.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - /* Normally those kind of definitions are in a compiler file @@ -59,58 +56,51 @@ MSVC is not going to be used to cross-compile to ARM. So, having a MSVC compiler file in Core or Core_A would not make sense. */ -#if defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) || defined(__APPLE_CC__) - __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) - { - if (data == 0U) { return 32U; } +#if defined(_MSC_VER) || defined(__GNUC_PYTHON__) || defined(__APPLE_CC__) +__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) +{ + if (data == 0U) { + return 32U; + } - uint32_t count = 0U; - uint32_t mask = 0x80000000U; + uint32_t count = 0U; + uint32_t mask = 0x80000000U; - while ((data & mask) == 0U) - { + while ((data & mask) == 0U) { count += 1U; mask = mask >> 1U; - } - return count; } + return count; +} - __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) - { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max; + if (val > max) { + return max; + } else if (val < min) { + return min; + } } return val; - } - - __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) - { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } +} + +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) { + return max; + } else if (val < 0) { + return 0U; + } } return (uint32_t)val; - } +} - /** +/** \brief Rotate Right in unsigned value (32 bit) \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. \param [in] op1 Value to rotate @@ -119,457 +109,362 @@ compiler file in Core or Core_A would not make sense. */ __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) { - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); + op2 %= 32U; + if (op2 == 0U) { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); } - #endif /** * @brief Clips Q63 to Q31 values. */ - __STATIC_FORCEINLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** +__STATIC_FORCEINLINE q31_t clip_q63_to_q31(q63_t x) +{ + return ((q31_t)(x >> 32) != ((q31_t)x >> 31)) ? ((0x7FFFFFFF ^ ((q31_t)(x >> 63)))) : (q31_t)x; +} + +/** * @brief Clips Q63 to Q15 values. */ - __STATIC_FORCEINLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** +__STATIC_FORCEINLINE q15_t clip_q63_to_q15(q63_t x) +{ + return ((q31_t)(x >> 32) != ((q31_t)x >> 31)) ? ((0x7FFF ^ ((q15_t)(x >> 63)))) : + (q15_t)(x >> 15); +} + +/** * @brief Clips Q31 to Q7 values. */ - __STATIC_FORCEINLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** +__STATIC_FORCEINLINE q7_t clip_q31_to_q7(q31_t x) +{ + return ((q31_t)(x >> 24) != ((q31_t)x >> 23)) ? ((0x7F ^ ((q7_t)(x >> 31)))) : (q7_t)x; +} + +/** * @brief Clips Q31 to Q15 values. */ - __STATIC_FORCEINLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** +__STATIC_FORCEINLINE q15_t clip_q31_to_q15(q31_t x) +{ + return ((q31_t)(x >> 16) != ((q31_t)x >> 15)) ? ((0x7FFF ^ ((q15_t)(x >> 31)))) : (q15_t)x; +} + +/** * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. */ - __STATIC_FORCEINLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y) ) ); - } +__STATIC_FORCEINLINE q63_t mult32x64(q63_t x, q31_t y) +{ + return ((((q63_t)(x & 0x00000000FFFFFFFF) * y) >> 32) + (((q63_t)(x >> 32) * y))); +} /* SMMLAR */ #define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + a = (q31_t)(((((q63_t)a) << 32) + ((q63_t)x * y) + 0x80000000LL) >> 32) /* SMMLSR */ #define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + a = (q31_t)(((((q63_t)a) << 32) - ((q63_t)x * y) + 0x80000000LL) >> 32) /* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) +#define mult_32x32_keep32_R(a, x, y) a = (q31_t)(((q63_t)x * y + 0x80000000LL) >> 32) /* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) +#define multAcc_32x32_keep32(a, x, y) a += (q31_t)(((q63_t)x * y) >> 32) /* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) +#define multSub_32x32_keep32(a, x, y) a -= (q31_t)(((q63_t)x * y) >> 32) /* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) +#define mult_32x32_keep32(a, x, y) a = (q31_t)(((q63_t)x * y) >> 32) #ifndef ARM_MATH_DSP - /** +/** * @brief definition to pack two 16 bit values. */ - #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) - #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) +#define __PKHBT(ARG1, ARG2, ARG3) \ + ((((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000)) +#define __PKHTB(ARG1, ARG2, ARG3) \ + ((((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF)) #endif - /** +/** * @brief definition to pack four 8 bit values. */ #ifndef ARM_MATH_BIG_ENDIAN - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#define __PACKq7(v0, v1, v2, v3) \ + ((((int32_t)(v0) << 0) & (int32_t)0x000000FF) | (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000)) #else - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) +#define __PACKq7(v0, v1, v2, v3) \ + ((((int32_t)(v3) << 0) & (int32_t)0x000000FF) | (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000)) #endif - - - /* * @brief C custom defined intrinsic functions */ -#if !defined (ARM_MATH_DSP) +#if !defined(ARM_MATH_DSP) - - /* +/* * @brief C custom defined QADD8 */ - __STATIC_FORCEINLINE uint32_t __QADD8( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t x, uint32_t y) +{ q31_t r, s, t, u; r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x) >> 24) + (((q31_t)y) >> 24)), 8) & (int32_t)0x000000FF; + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); +} - /* +/* * @brief C custom defined QSUB8 */ - __STATIC_FORCEINLINE uint32_t __QSUB8( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t x, uint32_t y) +{ q31_t r, s, t, u; r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x) >> 24) - (((q31_t)y) >> 24)), 8) & (int32_t)0x000000FF; + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r))); +} - /* +/* * @brief C custom defined QADD16 */ - __STATIC_FORCEINLINE uint32_t __QADD16( - uint32_t x, - uint32_t y) - { -/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t x, uint32_t y) +{ + /* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ q31_t r = 0, s = 0; r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + s = __SSAT(((((q31_t)x) >> 16) + (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined SHADD16 */ - __STATIC_FORCEINLINE uint32_t __SHADD16( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t x, uint32_t y) +{ q31_t r, s; r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + s = (((((q31_t)x) >> 16) + (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined QSUB16 */ - __STATIC_FORCEINLINE uint32_t __QSUB16( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t x, uint32_t y) +{ q31_t r, s; r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + s = __SSAT(((((q31_t)x) >> 16) - (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined SHSUB16 */ - __STATIC_FORCEINLINE uint32_t __SHSUB16( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t x, uint32_t y) +{ q31_t r, s; r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + s = (((((q31_t)x) >> 16) - (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined QASX */ - __STATIC_FORCEINLINE uint32_t __QASX( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t x, uint32_t y) +{ q31_t r, s; - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined SHASX */ - __STATIC_FORCEINLINE uint32_t __SHASX( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t x, uint32_t y) +{ q31_t r, s; - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined QSAX */ - __STATIC_FORCEINLINE uint32_t __QSAX( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t x, uint32_t y) +{ q31_t r, s; - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined SHSAX */ - __STATIC_FORCEINLINE uint32_t __SHSAX( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t x, uint32_t y) +{ q31_t r, s; - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + return ((uint32_t)((s << 16) | (r))); +} - /* +/* * @brief C custom defined SMUSDX */ - __STATIC_FORCEINLINE uint32_t __SMUSDX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - /* +__STATIC_FORCEINLINE uint32_t __SMUSDX(uint32_t x, uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) - + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)))); +} + +/* * @brief C custom defined SMUADX */ - __STATIC_FORCEINLINE uint32_t __SMUADX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - +__STATIC_FORCEINLINE uint32_t __SMUADX(uint32_t x, uint32_t y) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)))); +} - /* +/* * @brief C custom defined QADD */ - __STATIC_FORCEINLINE int32_t __QADD( - int32_t x, - int32_t y) - { +__STATIC_FORCEINLINE int32_t __QADD(int32_t x, int32_t y) +{ return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); - } - +} - /* +/* * @brief C custom defined QSUB */ - __STATIC_FORCEINLINE int32_t __QSUB( - int32_t x, - int32_t y) - { +__STATIC_FORCEINLINE int32_t __QSUB(int32_t x, int32_t y) +{ return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); - } - +} - /* +/* * @brief C custom defined SMLAD */ - __STATIC_FORCEINLINE uint32_t __SMLAD( - uint32_t x, - uint32_t y, - uint32_t sum) - { +__STATIC_FORCEINLINE uint32_t __SMLAD(uint32_t x, uint32_t y, uint32_t sum) +{ return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q31_t)sum ) ) )); - } - + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)) + (((q31_t)sum)))); +} - /* +/* * @brief C custom defined SMLADX */ - __STATIC_FORCEINLINE uint32_t __SMLADX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* +__STATIC_FORCEINLINE uint32_t __SMLADX(uint32_t x, uint32_t y, uint32_t sum) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + (((q31_t)sum)))); +} + +/* * @brief C custom defined SMLSDX */ - __STATIC_FORCEINLINE uint32_t __SMLSDX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* +__STATIC_FORCEINLINE uint32_t __SMLSDX(uint32_t x, uint32_t y, uint32_t sum) +{ + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) - + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + (((q31_t)sum)))); +} + +/* * @brief C custom defined SMLALD */ - __STATIC_FORCEINLINE uint64_t __SMLALD( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ +__STATIC_FORCEINLINE uint64_t __SMLALD(uint32_t x, uint32_t y, uint64_t sum) +{ + /* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q63_t)sum ) ) )); - } - + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)) + (((q63_t)sum)))); +} - /* +/* * @brief C custom defined SMLALDX */ - __STATIC_FORCEINLINE uint64_t __SMLALDX( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* +__STATIC_FORCEINLINE uint64_t __SMLALDX(uint32_t x, uint32_t y, uint64_t sum) +{ + /* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y) >> 16)) + + ((((q31_t)x) >> 16) * (((q31_t)y << 16) >> 16)) + (((q63_t)sum)))); +} + +/* * @brief C custom defined SMUAD */ - __STATIC_FORCEINLINE uint32_t __SMUAD( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SMUAD(uint32_t x, uint32_t y) +{ return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)))); +} - /* +/* * @brief C custom defined SMUSD */ - __STATIC_FORCEINLINE uint32_t __SMUSD( - uint32_t x, - uint32_t y) - { +__STATIC_FORCEINLINE uint32_t __SMUSD(uint32_t x, uint32_t y) +{ return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - + ((((q31_t)x) >> 16) * (((q31_t)y) >> 16)))); +} - /* +/* * @brief C custom defined SXTB16 */ - __STATIC_FORCEINLINE uint32_t __SXTB16( - uint32_t x) - { +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t x) +{ return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | - ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); - } + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000))); +} - /* +/* * @brief C custom defined SMMLA */ - __STATIC_FORCEINLINE int32_t __SMMLA( - int32_t x, - int32_t y, - int32_t sum) - { - return (sum + (int32_t) (((int64_t) x * y) >> 32)); - } +__STATIC_FORCEINLINE int32_t __SMMLA(int32_t x, int32_t y, int32_t sum) +{ + return (sum + (int32_t)(((int64_t)x * y) >> 32)); +} #endif /* !defined (ARM_MATH_DSP) */ - -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/quaternion_math_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/quaternion_math_functions.h old mode 100755 new mode 100644 index 6c823a368b..c8799ad18d --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/quaternion_math_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/quaternion_math_functions.h @@ -24,7 +24,6 @@ * limitations under the License. */ - #ifndef QUATERNION_MATH_FUNCTIONS_H_ #define QUATERNION_MATH_FUNCTIONS_H_ @@ -34,10 +33,8 @@ #include "dsp/none.h" #include "dsp/utils.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** @@ -46,17 +43,14 @@ extern "C" * rotation and quaternion representation. */ - /** @brief Floating-point quaternion Norm. @param[in] pInputQuaternions points to the input vector of quaternions @param[out] pNorms points to the output vector of norms @param[in] nbQuaternions number of quaternions in each vector */ -void arm_quaternion_norm_f32(const float32_t *pInputQuaternions, - float32_t *pNorms, - uint32_t nbQuaternions); - +void arm_quaternion_norm_f32(const float32_t *pInputQuaternions, float32_t *pNorms, + uint32_t nbQuaternions); /** @brief Floating-point quaternion inverse. @@ -64,10 +58,8 @@ void arm_quaternion_norm_f32(const float32_t *pInputQuaternions, @param[out] pInverseQuaternions points to the output vector of inverse quaternions @param[in] nbQuaternions number of quaternions in each vector */ -void arm_quaternion_inverse_f32(const float32_t *pInputQuaternions, - float32_t *pInverseQuaternions, - uint32_t nbQuaternions); - +void arm_quaternion_inverse_f32(const float32_t *pInputQuaternions, float32_t *pInverseQuaternions, + uint32_t nbQuaternions); /** @brief Floating-point quaternion conjugates. @@ -75,10 +67,8 @@ void arm_quaternion_inverse_f32(const float32_t *pInputQuaternions, @param[out] pConjugateQuaternions points to the output vector of conjugate quaternions @param[in] nbQuaternions number of quaternions in each vector */ -void arm_quaternion_conjugate_f32(const float32_t *inputQuaternions, - float32_t *pConjugateQuaternions, - uint32_t nbQuaternions); - +void arm_quaternion_conjugate_f32(const float32_t *inputQuaternions, + float32_t *pConjugateQuaternions, uint32_t nbQuaternions); /** @brief Floating-point normalization of quaternions. @@ -86,10 +76,8 @@ void arm_quaternion_conjugate_f32(const float32_t *inputQuaternions, @param[out] pNormalizedQuaternions points to the output vector of normalized quaternions @param[in] nbQuaternions number of quaternions in each vector */ -void arm_quaternion_normalize_f32(const float32_t *inputQuaternions, - float32_t *pNormalizedQuaternions, - uint32_t nbQuaternions); - +void arm_quaternion_normalize_f32(const float32_t *inputQuaternions, + float32_t *pNormalizedQuaternions, uint32_t nbQuaternions); /** @brief Floating-point product of two quaternions. @@ -97,10 +85,7 @@ void arm_quaternion_normalize_f32(const float32_t *inputQuaternions, @param[in] qb Second quaternion @param[out] r Product of two quaternions */ -void arm_quaternion_product_single_f32(const float32_t *qa, - const float32_t *qb, - float32_t *r); - +void arm_quaternion_product_single_f32(const float32_t *qa, const float32_t *qb, float32_t *r); /** @brief Floating-point elementwise product two quaternions. @@ -109,11 +94,8 @@ void arm_quaternion_product_single_f32(const float32_t *qa, @param[out] r Elementwise product of quaternions @param[in] nbQuaternions Number of quaternions in the array */ -void arm_quaternion_product_f32(const float32_t *qa, - const float32_t *qb, - float32_t *r, - uint32_t nbQuaternions); - +void arm_quaternion_product_f32(const float32_t *qa, const float32_t *qb, float32_t *r, + uint32_t nbQuaternions); /** * @brief Conversion of quaternion to equivalent rotation matrix. @@ -130,10 +112,8 @@ void arm_quaternion_product_f32(const float32_t *qa, * * Rotation matrix is saved in row order : R00 R01 R02 R10 R11 R12 R20 R21 R22 */ -void arm_quaternion2rotation_f32(const float32_t *pInputQuaternions, - float32_t *pOutputRotations, - uint32_t nbQuaternions); - +void arm_quaternion2rotation_f32(const float32_t *pInputQuaternions, float32_t *pOutputRotations, + uint32_t nbQuaternions); /** * @brief Conversion of a rotation matrix to equivalent quaternion. @@ -141,12 +121,10 @@ void arm_quaternion2rotation_f32(const float32_t *pInputQuaternions, * @param[out] pOutputQuaternions points to an array of quaternions * @param[in] nbQuaternions in the array */ -void arm_rotation2quaternion_f32(const float32_t *pInputRotations, - float32_t *pOutputQuaternions, - uint32_t nbQuaternions); - +void arm_rotation2quaternion_f32(const float32_t *pInputRotations, float32_t *pOutputQuaternions, + uint32_t nbQuaternions); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions.h old mode 100755 new mode 100644 index 301aadd023..66a4bb50a9 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef STATISTICS_FUNCTIONS_H_ #define STATISTICS_FUNCTIONS_H_ @@ -36,12 +35,10 @@ #include "dsp/basic_math_functions.h" #include "dsp/fast_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** * @defgroup groupStats Statistics Functions */ @@ -70,7 +67,6 @@ extern "C" * */ - float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize); /** @@ -86,11 +82,8 @@ float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize); * */ - -float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t *pTmpBuffer); +float32_t arm_logsumexp_dot_prod_f32(const float32_t *pSrcA, const float32_t *pSrcB, + uint32_t blockSize, float32_t *pTmpBuffer); /** * @brief Entropy @@ -101,9 +94,7 @@ float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA, * */ - -float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); - +float32_t arm_entropy_f32(const float32_t *pSrcA, uint32_t blockSize); /** * @brief Entropy @@ -114,9 +105,7 @@ float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); * */ - -float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize); - +float64_t arm_entropy_f64(const float64_t *pSrcA, uint32_t blockSize); /** * @brief Kullback-Leibler @@ -127,10 +116,8 @@ float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize); * @return Kullback-Leibler Divergence D(A || B) * */ -float32_t arm_kullback_leibler_f32(const float32_t * pSrcA - ,const float32_t * pSrcB - ,uint32_t blockSize); - +float32_t arm_kullback_leibler_f32(const float32_t *pSrcA, const float32_t *pSrcB, + uint32_t blockSize); /** * @brief Kullback-Leibler @@ -141,314 +128,211 @@ float32_t arm_kullback_leibler_f32(const float32_t * pSrcA * @return Kullback-Leibler Divergence D(A || B) * */ -float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, - const float64_t * pSrcB, - uint32_t blockSize); - +float64_t arm_kullback_leibler_f64(const float64_t *pSrcA, const float64_t *pSrcB, + uint32_t blockSize); - /** +/** * @brief Sum of the squares of the elements of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_q31( - const q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - +void arm_power_q31(const q31_t *pSrc, uint32_t blockSize, q63_t *pResult); - /** +/** * @brief Sum of the squares of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - +void arm_power_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** * @brief Sum of the squares of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); +void arm_power_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - - /** +/** * @brief Sum of the squares of the elements of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_q15( - const q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - +void arm_power_q15(const q15_t *pSrc, uint32_t blockSize, q63_t *pResult); - /** +/** * @brief Sum of the squares of the elements of a Q7 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_q7( - const q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - +void arm_power_q7(const q7_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** * @brief Mean value of a Q7 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); +void arm_mean_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult); - - /** +/** * @brief Mean value of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); +void arm_mean_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - - /** +/** * @brief Mean value of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - +void arm_mean_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** * @brief Mean value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - +void arm_mean_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** * @brief Mean value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); +void arm_mean_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - - /** +/** * @brief Variance of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_var_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - +void arm_var_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** * @brief Variance of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_var_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); - +void arm_var_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - /** +/** * @brief Variance of the elements of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_var_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - +void arm_var_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** * @brief Variance of the elements of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_var_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); +void arm_var_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - - /** +/** * @brief Root Mean Square of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_rms_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - +void arm_rms_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** * @brief Root Mean Square of the elements of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_rms_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - +void arm_rms_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** * @brief Root Mean Square of the elements of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_rms_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); +void arm_rms_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - - /** +/** * @brief Standard deviation of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_std_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); +void arm_std_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - - /** +/** * @brief Standard deviation of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_std_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); - +void arm_std_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - /** +/** * @brief Standard deviation of the elements of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_std_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - +void arm_std_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** * @brief Standard deviation of the elements of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_std_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); +void arm_std_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - - - /** +/** * @brief Minimum value of a Q7 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[in] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); +void arm_min_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a Q7 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[in] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); +void arm_absmin_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a Q7 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - +void arm_absmin_no_idx_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult); - /** +/** * @brief Minimum value of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[in] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); +void arm_min_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult, uint32_t *pIndex); /** * @brief Minimum value of absolute values of a Q15 vector. @@ -457,137 +341,95 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult is output pointer * @param[in] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); +void arm_absmin_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a Q15 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - +void arm_absmin_no_idx_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - /** +/** * @brief Minimum value of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); +void arm_min_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); +void arm_absmin_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a Q31 vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); +void arm_absmin_no_idx_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - - /** +/** * @brief Minimum value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); +void arm_min_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); +void arm_absmin_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult, + uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - +void arm_absmin_no_idx_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** * @brief Minimum value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult, - uint32_t * pIndex); +void arm_min_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult, - uint32_t * pIndex); +void arm_absmin_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult, + uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); - +void arm_absmin_no_idx_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); /** * @brief Maximum value of a Q7 vector. @@ -596,11 +438,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); +void arm_max_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a Q7 vector. @@ -609,11 +447,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); +void arm_absmax_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a Q7 vector. @@ -621,11 +455,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - +void arm_absmax_no_idx_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult); /** * @brief Maximum value of a Q15 vector. @@ -634,11 +464,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); +void arm_max_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a Q15 vector. @@ -647,22 +473,15 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); +void arm_absmax_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult, uint32_t *pIndex); - /** +/** * @brief Maximum value of absolute values of a Q15 vector. * @param[in] pSrc points to the input buffer * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); +void arm_absmax_no_idx_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); /** * @brief Maximum value of a Q31 vector. @@ -671,11 +490,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); +void arm_max_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a Q31 vector. @@ -684,22 +499,15 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); +void arm_absmax_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult, uint32_t *pIndex); - /** +/** * @brief Maximum value of absolute values of a Q31 vector. * @param[in] pSrc points to the input buffer * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); +void arm_absmax_no_idx_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); /** * @brief Maximum value of a floating-point vector. @@ -708,11 +516,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); +void arm_max_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a floating-point vector. @@ -721,22 +525,16 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); +void arm_absmax_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult, + uint32_t *pIndex); - /** +/** * @brief Maximum value of absolute values of a floating-point vector. * @param[in] pSrc points to the input buffer * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); +void arm_absmax_no_idx_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); /** * @brief Maximum value of a floating-point vector. @@ -745,11 +543,7 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult, - uint32_t * pIndex); +void arm_max_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a floating-point vector. @@ -758,11 +552,8 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult, - uint32_t * pIndex); +void arm_absmax_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult, + uint32_t *pIndex); /** * @brief Maximum value of absolute values of a floating-point vector. @@ -770,87 +561,63 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_f64( - const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); +void arm_absmax_no_idx_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - /** +/** @brief Maximum value of a floating-point vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_f32( - const float32_t *pSrc, - uint32_t blockSize, - float32_t *pResult); +void arm_max_no_idx_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** @brief Minimum value of a floating-point vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ - void arm_min_no_idx_f32( - const float32_t *pSrc, - uint32_t blockSize, - float32_t *pResult); +void arm_min_no_idx_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); - /** +/** @brief Maximum value of a floating-point vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_f64( - const float64_t *pSrc, - uint32_t blockSize, - float64_t *pResult); +void arm_max_no_idx_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); - /** +/** @brief Maximum value of a q31 vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_q31( - const q31_t *pSrc, - uint32_t blockSize, - q31_t *pResult); +void arm_max_no_idx_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** @brief Maximum value of a q15 vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_q15( - const q15_t *pSrc, - uint32_t blockSize, - q15_t *pResult); +void arm_max_no_idx_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - /** +/** @brief Maximum value of a q7 vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_q7( - const q7_t *pSrc, - uint32_t blockSize, - q7_t *pResult); +void arm_max_no_idx_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult); - /** +/** @brief Minimum value of a floating-point vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ - void arm_min_no_idx_f64( - const float64_t *pSrc, - uint32_t blockSize, - float64_t *pResult); +void arm_min_no_idx_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); /** @brief Minimum value of a q31 vector. @@ -858,32 +625,23 @@ float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ - void arm_min_no_idx_q31( - const q31_t *pSrc, - uint32_t blockSize, - q31_t *pResult); +void arm_min_no_idx_q31(const q31_t *pSrc, uint32_t blockSize, q31_t *pResult); - /** +/** @brief Minimum value of a q15 vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ - void arm_min_no_idx_q15( - const q15_t *pSrc, - uint32_t blockSize, - q15_t *pResult); +void arm_min_no_idx_q15(const q15_t *pSrc, uint32_t blockSize, q15_t *pResult); - /** +/** @brief Minimum value of a q7 vector. @param[in] pSrc points to the input vector @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ -void arm_min_no_idx_q7( - const q7_t *pSrc, - uint32_t blockSize, - q7_t *pResult); +void arm_min_no_idx_q7(const q7_t *pSrc, uint32_t blockSize, q7_t *pResult); /** @brief Mean square error between two Q7 vectors. @@ -892,12 +650,8 @@ void arm_min_no_idx_q7( @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ - -void arm_mse_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - uint32_t blockSize, - q7_t * pResult); + +void arm_mse_q7(const q7_t *pSrcA, const q7_t *pSrcB, uint32_t blockSize, q7_t *pResult); /** @brief Mean square error between two Q15 vectors. @@ -906,12 +660,8 @@ void arm_mse_q7( @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ - -void arm_mse_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t blockSize, - q15_t * pResult); + +void arm_mse_q15(const q15_t *pSrcA, const q15_t *pSrcB, uint32_t blockSize, q15_t *pResult); /** @brief Mean square error between two Q31 vectors. @@ -920,12 +670,8 @@ void arm_mse_q15( @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ - -void arm_mse_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t blockSize, - q31_t * pResult); + +void arm_mse_q31(const q31_t *pSrcA, const q31_t *pSrcB, uint32_t blockSize, q31_t *pResult); /** @brief Mean square error between two single precision float vectors. @@ -934,12 +680,9 @@ void arm_mse_q31( @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ - -void arm_mse_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t * pResult); + +void arm_mse_f32(const float32_t *pSrcA, const float32_t *pSrcB, uint32_t blockSize, + float32_t *pResult); /** @brief Mean square error between two double precision float vectors. @@ -948,13 +691,9 @@ void arm_mse_f32( @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ - -void arm_mse_f64( - const float64_t * pSrcA, - const float64_t * pSrcB, - uint32_t blockSize, - float64_t * pResult); +void arm_mse_f64(const float64_t *pSrcA, const float64_t *pSrcB, uint32_t blockSize, + float64_t *pResult); /** * @brief Accumulation value of a floating-point vector. @@ -963,10 +702,7 @@ void arm_mse_f64( * @param[out] pResult is output value. */ -void arm_accumulate_f32( -const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); +void arm_accumulate_f32(const float32_t *pSrc, uint32_t blockSize, float32_t *pResult); /** * @brief Accumulation value of a floating-point vector. @@ -975,13 +711,9 @@ const float32_t * pSrc, * @param[out] pResult is output value. */ -void arm_accumulate_f64( -const float64_t * pSrc, - uint32_t blockSize, - float64_t * pResult); - +void arm_accumulate_f64(const float64_t *pSrc, uint32_t blockSize, float64_t *pResult); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions_f16.h old mode 100755 new mode 100644 index 746e8df39b..0eba2792f5 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/statistics_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef STATISTICS_FUNCTIONS_F16_H_ #define STATISTICS_FUNCTIONS_F16_H_ @@ -36,93 +35,70 @@ #include "dsp/basic_math_functions_f16.h" #include "dsp/fast_math_functions_f16.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - /** +/** * @brief Sum of the squares of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_power_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_power_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); - /** +/** * @brief Mean value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_mean_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_mean_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); - /** +/** * @brief Variance of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_var_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_var_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); - /** +/** * @brief Root Mean Square of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_rms_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_rms_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); - /** +/** * @brief Standard deviation of the elements of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_std_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_std_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); - /** +/** * @brief Minimum value of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_min_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult, - uint32_t * pIndex); +void arm_min_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult, uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer * @param[out] pIndex is the array index of the minimum value in the input buffer. */ - void arm_absmin_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult, - uint32_t * pIndex); +void arm_absmin_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult, + uint32_t *pIndex); /** * @brief Maximum value of a floating-point vector. @@ -131,11 +107,7 @@ extern "C" * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_max_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult, - uint32_t * pIndex); +void arm_max_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult, uint32_t *pIndex); /** * @brief Maximum value of absolute values of a floating-point vector. @@ -144,22 +116,16 @@ extern "C" * @param[out] pResult maximum value returned here * @param[out] pIndex index of maximum value returned here */ - void arm_absmax_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult, - uint32_t * pIndex); +void arm_absmax_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult, + uint32_t *pIndex); - /** +/** * @brief Minimum value of absolute values of a floating-point vector. * @param[in] pSrc is input pointer * @param[in] blockSize is the number of samples to process * @param[out] pResult is output pointer */ - void arm_absmin_no_idx_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); +void arm_absmin_no_idx_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); /** * @brief Maximum value of a floating-point vector. @@ -167,11 +133,7 @@ extern "C" * @param[in] blockSize length of the input vector * @param[out] pResult maximum value returned here */ - void arm_absmax_no_idx_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); - +void arm_absmax_no_idx_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); /** * @brief Entropy @@ -180,12 +142,10 @@ extern "C" * @param[in] blockSize Number of samples in the input array. * @return Entropy -Sum(p ln p) */ -float16_t arm_entropy_f16(const float16_t * pSrcA,uint32_t blockSize); - +float16_t arm_entropy_f16(const float16_t *pSrcA, uint32_t blockSize); float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize); - /** * @brief Dot product with log arithmetic * @@ -197,11 +157,8 @@ float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize); * @param[in] pTmpBuffer temporary buffer of length blockSize * @return The log of the dot product . */ -float16_t arm_logsumexp_dot_prod_f16(const float16_t * pSrcA, - const float16_t * pSrcB, - uint32_t blockSize, - float16_t *pTmpBuffer); - +float16_t arm_logsumexp_dot_prod_f16(const float16_t *pSrcA, const float16_t *pSrcB, + uint32_t blockSize, float16_t *pTmpBuffer); /** * @brief Kullback-Leibler @@ -211,10 +168,8 @@ float16_t arm_logsumexp_dot_prod_f16(const float16_t * pSrcA, * @param[in] blockSize Number of samples in the input array. * @return Kullback-Leibler Divergence D(A || B) */ -float16_t arm_kullback_leibler_f16(const float16_t * pSrcA - ,const float16_t * pSrcB - ,uint32_t blockSize); - +float16_t arm_kullback_leibler_f16(const float16_t *pSrcA, const float16_t *pSrcB, + uint32_t blockSize); /** @brief Maximum value of a floating-point vector. @@ -222,11 +177,7 @@ float16_t arm_kullback_leibler_f16(const float16_t * pSrcA @param[in] blockSize number of samples in input vector @param[out] pResult maximum value returned here */ - void arm_max_no_idx_f16( - const float16_t *pSrc, - uint32_t blockSize, - float16_t *pResult); - +void arm_max_no_idx_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); /** @brief Minimum value of a floating-point vector. @@ -234,11 +185,7 @@ float16_t arm_kullback_leibler_f16(const float16_t * pSrcA @param[in] blockSize number of samples in input vector @param[out] pResult minimum value returned here */ - void arm_min_no_idx_f16( - const float16_t *pSrc, - uint32_t blockSize, - float16_t *pResult); - +void arm_min_no_idx_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); /** @brief Mean square error between two half precision float vectors. @@ -247,12 +194,8 @@ float16_t arm_kullback_leibler_f16(const float16_t * pSrcA @param[in] blockSize number of samples in input vector @param[out] pResult mean square error */ -void arm_mse_f16( - const float16_t * pSrcA, - const float16_t * pSrcB, - uint32_t blockSize, - float16_t * pResult); - +void arm_mse_f16(const float16_t *pSrcA, const float16_t *pSrcB, uint32_t blockSize, + float16_t *pResult); /** * @brief Sum value of a floating-point vector. @@ -260,14 +203,10 @@ void arm_mse_f16( * @param[in] blockSize is the number of samples to process * @param[out] pResult is output value. */ - void arm_accumulate_f16( - const float16_t * pSrc, - uint32_t blockSize, - float16_t * pResult); - +void arm_accumulate_f16(const float16_t *pSrc, uint32_t blockSize, float16_t *pResult); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions.h old mode 100755 new mode 100644 index 928cf403f1..10bdca63b2 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef SUPPORT_FUNCTIONS_H_ #define SUPPORT_FUNCTIONS_H_ @@ -33,26 +32,21 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** * @defgroup groupSupport Support Functions */ - /** * @brief Converts the elements of the 64 bit floating-point vector to floating-point vector. * @param[in] pSrc points to the floating-point 64 input vector * @param[out] pDst points to the floating-point output vector * @param[in] blockSize length of the input vector */ - void arm_f64_to_float( - const float64_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_f64_to_float(const float64_t *pSrc, float32_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the 64 bit floating-point vector to Q31 vector. @@ -60,10 +54,7 @@ extern "C" * @param[out] pDst points to the Q31 output vector * @param[in] blockSize length of the input vector */ - void arm_f64_to_q31( - const float64_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_f64_to_q31(const float64_t *pSrc, q31_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the 64 bit floating-point vector to Q15 vector. @@ -71,10 +62,7 @@ extern "C" * @param[out] pDst points to the Q15 output vector * @param[in] blockSize length of the input vector */ - void arm_f64_to_q15( - const float64_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_f64_to_q15(const float64_t *pSrc, q15_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the 64 bit floating-point vector to Q7 vector. @@ -82,12 +70,7 @@ extern "C" * @param[out] pDst points to the Q7 output vector * @param[in] blockSize length of the input vector */ - void arm_f64_to_q7( - const float64_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - +void arm_f64_to_q7(const float64_t *pSrc, q7_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to 64 bit floating-point vector. @@ -95,10 +78,7 @@ extern "C" * @param[out] pDst points to the 64 bit floating-point output vector * @param[in] blockSize length of the input vector */ - void arm_float_to_f64( - const float32_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_float_to_f64(const float32_t *pSrc, float64_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to Q31 vector. @@ -106,34 +86,23 @@ extern "C" * @param[out] pDst points to the Q31 output vector * @param[in] blockSize length of the input vector */ - void arm_float_to_q31( - const float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - +void arm_float_to_q31(const float32_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the floating-point vector to Q15 vector. * @param[in] pSrc points to the floating-point input vector * @param[out] pDst points to the Q15 output vector * @param[in] blockSize length of the input vector */ - void arm_float_to_q15( - const float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_float_to_q15(const float32_t *pSrc, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the floating-point vector to Q7 vector. * @param[in] pSrc points to the floating-point input vector * @param[out] pDst points to the Q7 output vector * @param[in] blockSize length of the input vector */ - void arm_float_to_q7( - const float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); +void arm_float_to_q7(const float32_t *pSrc, q7_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the Q31 vector to 64 bit floating-point vector. @@ -141,45 +110,31 @@ extern "C" * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ -void arm_q31_to_f64( -const q31_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_q31_to_f64(const q31_t *pSrc, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the Q31 vector to floating-point vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q31_to_float( - const q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_q31_to_float(const q31_t *pSrc, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Converts the elements of the Q31 vector to Q15 vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q31_to_q15( - const q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); +void arm_q31_to_q15(const q31_t *pSrc, q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Converts the elements of the Q31 vector to Q7 vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q31_to_q7( - const q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); +void arm_q31_to_q7(const q31_t *pSrc, q7_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the Q15 vector to 64 bit floating-point vector. @@ -187,45 +142,31 @@ const q31_t * pSrc, * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ -void arm_q15_to_f64( -const q15_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_q15_to_f64(const q15_t *pSrc, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the Q15 vector to floating-point vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q15_to_float( - const q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - +void arm_q15_to_float(const q15_t *pSrc, float32_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the Q15 vector to Q31 vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q15_to_q31( - const q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - +void arm_q15_to_q31(const q15_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the Q15 vector to Q7 vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q15_to_q7( - const q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); +void arm_q15_to_q7(const q15_t *pSrc, q7_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the Q7 vector to 64 bit floating-point vector. @@ -233,270 +174,187 @@ const q15_t * pSrc, * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ -void arm_q7_to_f64( -const q7_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_q7_to_f64(const q7_t *pSrc, float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Converts the elements of the Q7 vector to floating-point vector. * @param[in] pSrc is input pointer * @param[out] pDst is output pointer * @param[in] blockSize is the number of samples to process */ - void arm_q7_to_float( - const q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_q7_to_float(const q7_t *pSrc, float32_t *pDst, uint32_t blockSize); - - /** +/** * @brief Converts the elements of the Q7 vector to Q31 vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_q7_to_q31( - const q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); +void arm_q7_to_q31(const q7_t *pSrc, q31_t *pDst, uint32_t blockSize); - - /** +/** * @brief Converts the elements of the Q7 vector to Q15 vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_q7_to_q15( - const q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - +void arm_q7_to_q15(const q7_t *pSrc, q15_t *pDst, uint32_t blockSize); - - - /** +/** * @brief Struct for specifying sorting algorithm */ - typedef enum - { - ARM_SORT_BITONIC = 0, - /**< Bitonic sort */ - ARM_SORT_BUBBLE = 1, - /**< Bubble sort */ - ARM_SORT_HEAP = 2, - /**< Heap sort */ +typedef enum { + ARM_SORT_BITONIC = 0, + /**< Bitonic sort */ + ARM_SORT_BUBBLE = 1, + /**< Bubble sort */ + ARM_SORT_HEAP = 2, + /**< Heap sort */ ARM_SORT_INSERTION = 3, - /**< Insertion sort */ - ARM_SORT_QUICK = 4, - /**< Quick sort */ + /**< Insertion sort */ + ARM_SORT_QUICK = 4, + /**< Quick sort */ ARM_SORT_SELECTION = 5 - /**< Selection sort */ - } arm_sort_alg; + /**< Selection sort */ +} arm_sort_alg; - /** +/** * @brief Struct for specifying sorting algorithm */ - typedef enum - { +typedef enum { ARM_SORT_DESCENDING = 0, - /**< Descending order (9 to 0) */ + /**< Descending order (9 to 0) */ ARM_SORT_ASCENDING = 1 - /**< Ascending order (0 to 9) */ - } arm_sort_dir; + /**< Ascending order (0 to 9) */ +} arm_sort_dir; - /** +/** * @brief Instance structure for the sorting algorithms. */ - typedef struct - { - arm_sort_alg alg; /**< Sorting algorithm selected */ - arm_sort_dir dir; /**< Sorting order (direction) */ - } arm_sort_instance_f32; +typedef struct { + arm_sort_alg alg; /**< Sorting algorithm selected */ + arm_sort_dir dir; /**< Sorting order (direction) */ +} arm_sort_instance_f32; - /** +/** * @param[in] S points to an instance of the sorting structure. * @param[in] pSrc points to the block of input data. * @param[out] pDst points to the block of output data. * @param[in] blockSize number of samples to process. */ - void arm_sort_f32( - const arm_sort_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_sort_f32(const arm_sort_instance_f32 *S, float32_t *pSrc, float32_t *pDst, + uint32_t blockSize); - /** +/** * @param[in,out] S points to an instance of the sorting structure. * @param[in] alg Selected algorithm. * @param[in] dir Sorting order. */ - void arm_sort_init_f32( - arm_sort_instance_f32 * S, - arm_sort_alg alg, - arm_sort_dir dir); +void arm_sort_init_f32(arm_sort_instance_f32 *S, arm_sort_alg alg, arm_sort_dir dir); - /** +/** * @brief Instance structure for the sorting algorithms. */ - typedef struct - { - arm_sort_dir dir; /**< Sorting order (direction) */ - float32_t * buffer; /**< Working buffer */ - } arm_merge_sort_instance_f32; +typedef struct { + arm_sort_dir dir; /**< Sorting order (direction) */ + float32_t *buffer; /**< Working buffer */ +} arm_merge_sort_instance_f32; - /** +/** * @param[in] S points to an instance of the sorting structure. * @param[in,out] pSrc points to the block of input data. * @param[out] pDst points to the block of output data * @param[in] blockSize number of samples to process. */ - void arm_merge_sort_f32( - const arm_merge_sort_instance_f32 * S, - float32_t *pSrc, - float32_t *pDst, - uint32_t blockSize); +void arm_merge_sort_f32(const arm_merge_sort_instance_f32 *S, float32_t *pSrc, float32_t *pDst, + uint32_t blockSize); - /** +/** * @param[in,out] S points to an instance of the sorting structure. * @param[in] dir Sorting order. * @param[in] buffer Working buffer. */ - void arm_merge_sort_init_f32( - arm_merge_sort_instance_f32 * S, - arm_sort_dir dir, - float32_t * buffer); +void arm_merge_sort_init_f32(arm_merge_sort_instance_f32 *S, arm_sort_dir dir, float32_t *buffer); - - - /** +/** * @brief Copies the elements of a floating-point vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_copy_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); +void arm_copy_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize); - - - /** +/** * @brief Copies the elements of a floating-point vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_copy_f64( - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); +void arm_copy_f64(const float64_t *pSrc, float64_t *pDst, uint32_t blockSize); - - - /** +/** * @brief Copies the elements of a Q7 vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_copy_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - +void arm_copy_q7(const q7_t *pSrc, q7_t *pDst, uint32_t blockSize); - /** +/** * @brief Copies the elements of a Q15 vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_copy_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - +void arm_copy_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize); - /** +/** * @brief Copies the elements of a Q31 vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_copy_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - +void arm_copy_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize); - /** +/** * @brief Fills a constant value into a floating-point vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - +void arm_fill_f32(float32_t value, float32_t *pDst, uint32_t blockSize); - /** +/** * @brief Fills a constant value into a floating-point vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_fill_f64( - float64_t value, - float64_t * pDst, - uint32_t blockSize); +void arm_fill_f64(float64_t value, float64_t *pDst, uint32_t blockSize); - - /** +/** * @brief Fills a constant value into a Q7 vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); +void arm_fill_q7(q7_t value, q7_t *pDst, uint32_t blockSize); - - /** +/** * @brief Fills a constant value into a Q15 vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); +void arm_fill_q15(q15_t value, q15_t *pDst, uint32_t blockSize); - - /** +/** * @brief Fills a constant value into a Q31 vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - - - - - +void arm_fill_q31(q31_t value, q31_t *pDst, uint32_t blockSize); /** * @brief Weighted average @@ -508,10 +366,8 @@ const q7_t * pSrc, * @return Weighted average * */ -float32_t arm_weighted_average_f32(const float32_t *in - , const float32_t *weigths - , uint32_t blockSize); - +float32_t arm_weighted_average_f32(const float32_t *in, const float32_t *weigths, + uint32_t blockSize); /** * @brief Barycenter @@ -524,15 +380,10 @@ float32_t arm_weighted_average_f32(const float32_t *in * @param[in] vecDim Dimension of space (vector dimension) * */ -void arm_barycenter_f32(const float32_t *in - , const float32_t *weights - , float32_t *out - , uint32_t nbVectors - , uint32_t vecDim); - - +void arm_barycenter_f32(const float32_t *in, const float32_t *weights, float32_t *out, + uint32_t nbVectors, uint32_t vecDim); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions_f16.h old mode 100755 new mode 100644 index ab0c1ad7a9..4d36aae235 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/support_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef SUPPORT_FUNCTIONS_F16_H_ #define SUPPORT_FUNCTIONS_F16_H_ @@ -33,30 +32,27 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) - /** +/** * @brief Copies the elements of a floating-point vector. * @param[in] pSrc input pointer * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ -void arm_copy_f16(const float16_t * pSrc, float16_t * pDst, uint32_t blockSize); +void arm_copy_f16(const float16_t *pSrc, float16_t *pDst, uint32_t blockSize); - - /** +/** * @brief Fills a constant value into a floating-point vector. * @param[in] value input value to be filled * @param[out] pDst output pointer * @param[in] blockSize number of samples to process */ -void arm_fill_f16(float16_t value, float16_t * pDst, uint32_t blockSize); - +void arm_fill_f16(float16_t value, float16_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to Q31 vector. @@ -64,8 +60,7 @@ void arm_fill_f16(float16_t value, float16_t * pDst, uint32_t blockSize); * @param[out] pDst points to the q15 output vector * @param[in] blockSize length of the input vector */ -void arm_f16_to_q15(const float16_t * pSrc, q15_t * pDst, uint32_t blockSize); - +void arm_f16_to_q15(const float16_t *pSrc, q15_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to Q31 vector. @@ -73,8 +68,7 @@ void arm_f16_to_q15(const float16_t * pSrc, q15_t * pDst, uint32_t blockSize); * @param[out] pDst points to the f16 output vector * @param[in] blockSize length of the input vector */ -void arm_q15_to_f16(const q15_t * pSrc, float16_t * pDst, uint32_t blockSize); - +void arm_q15_to_f16(const q15_t *pSrc, float16_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the 64 bit floating-point vector to 16 bit floating-point vector. @@ -82,8 +76,7 @@ void arm_q15_to_f16(const q15_t * pSrc, float16_t * pDst, uint32_t blockSize); * @param[out] pDst points to the f16 output vector * @param[in] blockSize length of the input vector */ -void arm_f64_to_f16(const float64_t * pSrc, float16_t * pDst, uint32_t blockSize); - +void arm_f64_to_f16(const float64_t *pSrc, float16_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the 16 bit floating-point vector to 64 bit floating-point vector. @@ -91,8 +84,7 @@ void arm_f64_to_f16(const float64_t * pSrc, float16_t * pDst, uint32_t blockSize * @param[out] pDst points to the f64 output vector * @param[in] blockSize length of the input vector */ -void arm_f16_to_f64(const float16_t * pSrc, float64_t * pDst, uint32_t blockSize); - +void arm_f16_to_f64(const float16_t *pSrc, float64_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to Q31 vector. @@ -100,8 +92,7 @@ void arm_f16_to_f64(const float16_t * pSrc, float64_t * pDst, uint32_t blockSize * @param[out] pDst points to the f16 output vector * @param[in] blockSize length of the input vector */ -void arm_float_to_f16(const float32_t * pSrc, float16_t * pDst, uint32_t blockSize); - +void arm_float_to_f16(const float32_t *pSrc, float16_t *pDst, uint32_t blockSize); /** * @brief Converts the elements of the floating-point vector to Q31 vector. @@ -109,8 +100,7 @@ void arm_float_to_f16(const float32_t * pSrc, float16_t * pDst, uint32_t blockSi * @param[out] pDst points to the f32 output vector * @param[in] blockSize length of the input vector */ -void arm_f16_to_float(const float16_t * pSrc, float32_t * pDst, uint32_t blockSize); - +void arm_f16_to_float(const float16_t *pSrc, float32_t *pDst, uint32_t blockSize); /** * @brief Weighted average @@ -119,10 +109,8 @@ void arm_f16_to_float(const float16_t * pSrc, float32_t * pDst, uint32_t blockSi * @param[in] blockSize Number of samples in the input array. * @return Weighted average */ -float16_t arm_weighted_average_f16(const float16_t *in - , const float16_t *weigths - , uint32_t blockSize); - +float16_t arm_weighted_average_f16(const float16_t *in, const float16_t *weigths, + uint32_t blockSize); /** * @brief Barycenter @@ -132,12 +120,8 @@ float16_t arm_weighted_average_f16(const float16_t *in * @param[in] nbVectors Number of vectors * @param[in] vecDim Dimension of space (vector dimension) */ -void arm_barycenter_f16(const float16_t *in - , const float16_t *weights - , float16_t *out - , uint32_t nbVectors - , uint32_t vecDim); - +void arm_barycenter_f16(const float16_t *in, const float16_t *weights, float16_t *out, + uint32_t nbVectors, uint32_t vecDim); /** @ingroup groupSupport @@ -166,9 +150,9 @@ void arm_barycenter_f16(const float16_t *in */ __STATIC_INLINE int16_t arm_typecast_s16_f16(float16_t x) { - int16_t res; - res=*(int16_t*)memcpy((char*)&res,(char*)&x,sizeof(float16_t)); - return(res); + int16_t res; + res = *(int16_t *)memcpy((char *)&res, (char *)&x, sizeof(float16_t)); + return (res); } /** @@ -185,19 +169,17 @@ __STATIC_INLINE int16_t arm_typecast_s16_f16(float16_t x) */ __STATIC_INLINE float16_t arm_typecast_f16_s16(int16_t x) { - float16_t res; - res=*(float16_t*)memcpy((char*)&res,(char*)&x,sizeof(int16_t)); - return(res); + float16_t res; + res = *(float16_t *)memcpy((char *)&res, (char *)&x, sizeof(int16_t)); + return (res); } - /** @} end of typecast group */ - #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_defines.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_defines.h old mode 100755 new mode 100644 index 185a8a902c..995d6bf976 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_defines.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_defines.h @@ -24,23 +24,21 @@ * limitations under the License. */ - #ifndef SVM_DEFINES_H_ #define SVM_DEFINES_H_ /** * @brief Struct for specifying SVM Kernel */ -typedef enum -{ +typedef enum { ARM_ML_KERNEL_LINEAR = 0, - /**< Linear kernel */ + /**< Linear kernel */ ARM_ML_KERNEL_POLYNOMIAL = 1, - /**< Polynomial kernel */ + /**< Polynomial kernel */ ARM_ML_KERNEL_RBF = 2, - /**< Radial Basis Function kernel */ + /**< Radial Basis Function kernel */ ARM_ML_KERNEL_SIGMOID = 3 - /**< Sigmoid kernel */ + /**< Sigmoid kernel */ } arm_ml_kernel_type; #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions.h old mode 100755 new mode 100644 index cb00cd4f1b..a218cafa38 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef SVM_FUNCTIONS_H_ #define SVM_FUNCTIONS_H_ @@ -34,9 +33,8 @@ #include "dsp/utils.h" #include "dsp/svm_defines.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #define STEP(x) (x) <= 0 ? 0 : 1 @@ -64,78 +62,68 @@ extern "C" __STATIC_INLINE float32_t arm_exponent_f32(float32_t x, int32_t nb) { float32_t r = x; - nb --; - while(nb > 0) - { + nb--; + while (nb > 0) { r = r * x; nb--; } - return(r); + return (r); } - /** * @brief Instance structure for linear SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ } arm_svm_linear_instance_f32; - /** * @brief Instance structure for polynomial SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - int32_t degree; /**< Polynomial degree */ - float32_t coef0; /**< Polynomial constant */ - float32_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + int32_t degree; /**< Polynomial degree */ + float32_t coef0; /**< Polynomial constant */ + float32_t gamma; /**< Gamma factor */ } arm_svm_polynomial_instance_f32; - /** * @brief Instance structure for rbf SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float32_t gamma; /**< Gamma factor */ } arm_svm_rbf_instance_f32; - /** * @brief Instance structure for sigmoid SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t coef0; /**< Independent constant */ - float32_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float32_t coef0; /**< Independent constant */ + float32_t gamma; /**< Gamma factor */ } arm_svm_sigmoid_instance_f32; - /** * @brief SVM linear instance init function * @param[in] S Parameters for SVM functions @@ -146,14 +134,10 @@ typedef struct * @param[in] supportVectors Array of support vectors * @param[in] classes Array of 2 classes ID */ -void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes); - +void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float32_t intercept, + const float32_t *dualCoefficients, const float32_t *supportVectors, + const int32_t *classes); /** * @brief SVM linear prediction @@ -161,10 +145,8 @@ void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - +void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, const float32_t *in, + int32_t *pResult); /** * @brief SVM polynomial instance init function @@ -179,18 +161,11 @@ void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, * @param[in] coef0 coeff0 (scikit-learn terminology) * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - int32_t degree, - float32_t coef0, - float32_t gamma - ); - +void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float32_t intercept, + const float32_t *dualCoefficients, const float32_t *supportVectors, + const int32_t *classes, int32_t degree, float32_t coef0, + float32_t gamma); /** * @brief SVM polynomial prediction @@ -198,10 +173,8 @@ void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - +void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, const float32_t *in, + int32_t *pResult); /** * @brief SVM radial basis function instance init function @@ -214,16 +187,10 @@ void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, * @param[in] classes Array of 2 classes ID * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t gamma - ); - +void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float32_t intercept, + const float32_t *dualCoefficients, const float32_t *supportVectors, + const int32_t *classes, float32_t gamma); /** * @brief SVM rbf prediction @@ -231,10 +198,8 @@ void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, * @param[in] in Pointer to input vector * @param[out] pResult decision value */ -void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - +void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, const float32_t *in, + int32_t *pResult); /** * @brief SVM sigmoid instance init function @@ -248,17 +213,10 @@ void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, * @param[in] coef0 coeff0 (scikit-learn terminology) * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t coef0, - float32_t gamma - ); - +void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float32_t intercept, + const float32_t *dualCoefficients, const float32_t *supportVectors, + const int32_t *classes, float32_t coef0, float32_t gamma); /** * @brief SVM sigmoid prediction @@ -266,14 +224,10 @@ void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - - +void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S, const float32_t *in, + int32_t *pResult); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions_f16.h old mode 100755 new mode 100644 index 5f757a0a10..eb03f4a851 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/svm_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef SVM_FUNCTIONS_F16_H_ #define SVM_FUNCTIONS_F16_H_ @@ -34,10 +33,8 @@ #include "dsp/utils.h" #include "dsp/svm_defines.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif #if defined(ARM_FLOAT16_SUPPORTED) @@ -58,70 +55,60 @@ extern "C" * */ - - /** * @brief Instance structure for linear SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float16_t intercept; /**< Intercept */ - const float16_t *dualCoefficients; /**< Dual coefficients */ - const float16_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ } arm_svm_linear_instance_f16; - /** * @brief Instance structure for polynomial SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float16_t intercept; /**< Intercept */ - const float16_t *dualCoefficients; /**< Dual coefficients */ - const float16_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - int32_t degree; /**< Polynomial degree */ - float16_t coef0; /**< Polynomial constant */ - float16_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + int32_t degree; /**< Polynomial degree */ + float16_t coef0; /**< Polynomial constant */ + float16_t gamma; /**< Gamma factor */ } arm_svm_polynomial_instance_f16; - /** * @brief Instance structure for rbf SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float16_t intercept; /**< Intercept */ - const float16_t *dualCoefficients; /**< Dual coefficients */ - const float16_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float16_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float16_t gamma; /**< Gamma factor */ } arm_svm_rbf_instance_f16; - /** * @brief Instance structure for sigmoid SVM prediction function. */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float16_t intercept; /**< Intercept */ - const float16_t *dualCoefficients; /**< Dual coefficients */ - const float16_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float16_t coef0; /**< Independent constant */ - float16_t gamma; /**< Gamma factor */ +typedef struct { + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float16_t coef0; /**< Independent constant */ + float16_t gamma; /**< Gamma factor */ } arm_svm_sigmoid_instance_f16; - /** * @brief SVM linear instance init function * @param[in] S Parameters for SVM functions @@ -132,13 +119,10 @@ typedef struct * @param[in] supportVectors Array of support vectors * @param[in] classes Array of 2 classes ID */ -void arm_svm_linear_init_f16(arm_svm_linear_instance_f16 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float16_t intercept, - const float16_t *dualCoefficients, - const float16_t *supportVectors, - const int32_t *classes); +void arm_svm_linear_init_f16(arm_svm_linear_instance_f16 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float16_t intercept, + const float16_t *dualCoefficients, const float16_t *supportVectors, + const int32_t *classes); /** * @brief SVM linear prediction @@ -146,10 +130,8 @@ void arm_svm_linear_init_f16(arm_svm_linear_instance_f16 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_linear_predict_f16(const arm_svm_linear_instance_f16 *S, - const float16_t * in, - int32_t * pResult); - +void arm_svm_linear_predict_f16(const arm_svm_linear_instance_f16 *S, const float16_t *in, + int32_t *pResult); /** * @brief SVM polynomial instance init function @@ -164,18 +146,11 @@ void arm_svm_linear_predict_f16(const arm_svm_linear_instance_f16 *S, * @param[in] coef0 coeff0 (scikit-learn terminology) * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_polynomial_init_f16(arm_svm_polynomial_instance_f16 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float16_t intercept, - const float16_t *dualCoefficients, - const float16_t *supportVectors, - const int32_t *classes, - int32_t degree, - float16_t coef0, - float16_t gamma - ); - +void arm_svm_polynomial_init_f16(arm_svm_polynomial_instance_f16 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float16_t intercept, + const float16_t *dualCoefficients, const float16_t *supportVectors, + const int32_t *classes, int32_t degree, float16_t coef0, + float16_t gamma); /** * @brief SVM polynomial prediction @@ -183,10 +158,8 @@ void arm_svm_polynomial_init_f16(arm_svm_polynomial_instance_f16 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_polynomial_predict_f16(const arm_svm_polynomial_instance_f16 *S, - const float16_t * in, - int32_t * pResult); - +void arm_svm_polynomial_predict_f16(const arm_svm_polynomial_instance_f16 *S, const float16_t *in, + int32_t *pResult); /** * @brief SVM radial basis function instance init function @@ -199,16 +172,10 @@ void arm_svm_polynomial_predict_f16(const arm_svm_polynomial_instance_f16 *S, * @param[in] classes Array of 2 classes ID * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_rbf_init_f16(arm_svm_rbf_instance_f16 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float16_t intercept, - const float16_t *dualCoefficients, - const float16_t *supportVectors, - const int32_t *classes, - float16_t gamma - ); - +void arm_svm_rbf_init_f16(arm_svm_rbf_instance_f16 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float16_t intercept, + const float16_t *dualCoefficients, const float16_t *supportVectors, + const int32_t *classes, float16_t gamma); /** * @brief SVM rbf prediction @@ -216,10 +183,8 @@ void arm_svm_rbf_init_f16(arm_svm_rbf_instance_f16 *S, * @param[in] in Pointer to input vector * @param[out] pResult decision value */ -void arm_svm_rbf_predict_f16(const arm_svm_rbf_instance_f16 *S, - const float16_t * in, - int32_t * pResult); - +void arm_svm_rbf_predict_f16(const arm_svm_rbf_instance_f16 *S, const float16_t *in, + int32_t *pResult); /** * @brief SVM sigmoid instance init function @@ -233,17 +198,10 @@ void arm_svm_rbf_predict_f16(const arm_svm_rbf_instance_f16 *S, * @param[in] coef0 coeff0 (scikit-learn terminology) * @param[in] gamma gamma (scikit-learn terminology) */ -void arm_svm_sigmoid_init_f16(arm_svm_sigmoid_instance_f16 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float16_t intercept, - const float16_t *dualCoefficients, - const float16_t *supportVectors, - const int32_t *classes, - float16_t coef0, - float16_t gamma - ); - +void arm_svm_sigmoid_init_f16(arm_svm_sigmoid_instance_f16 *S, uint32_t nbOfSupportVectors, + uint32_t vectorDimension, float16_t intercept, + const float16_t *dualCoefficients, const float16_t *supportVectors, + const int32_t *classes, float16_t coef0, float16_t gamma); /** * @brief SVM sigmoid prediction @@ -251,14 +209,11 @@ void arm_svm_sigmoid_init_f16(arm_svm_sigmoid_instance_f16 *S, * @param[in] in Pointer to input vector * @param[out] pResult Decision value */ -void arm_svm_sigmoid_predict_f16(const arm_svm_sigmoid_instance_f16 *S, - const float16_t * in, - int32_t * pResult); - - +void arm_svm_sigmoid_predict_f16(const arm_svm_sigmoid_instance_f16 *S, const float16_t *in, + int32_t *pResult); #endif /*defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions.h old mode 100755 new mode 100644 index b2c13d9dfc..d325e321c4 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef TRANSFORM_FUNCTIONS_H_ #define TRANSFORM_FUNCTIONS_H_ @@ -36,579 +35,479 @@ #include "dsp/basic_math_functions.h" #include "dsp/complex_math_functions.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** * @defgroup groupTransforms Transform Functions */ - - /** +/** * @brief Instance structure for the Q15 CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix2_instance_q15; /* Deprecated */ - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix2_init_q15(arm_cfft_radix2_instance_q15 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); +void arm_cfft_radix2_q15(const arm_cfft_radix2_instance_q15 *S, q15_t *pSrc); - - /** +/** * @brief Instance structure for the Q15 CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix4_instance_q15; /* Deprecated */ - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix4_init_q15(arm_cfft_radix4_instance_q15 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); +void arm_cfft_radix4_q15(const arm_cfft_radix4_instance_q15 *S, q15_t *pSrc); - /** +/** * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix2_instance_q31; /* Deprecated */ - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix2_init_q31(arm_cfft_radix2_instance_q31 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); +void arm_cfft_radix2_q31(const arm_cfft_radix2_instance_q31 *S, q31_t *pSrc); - /** +/** * @brief Instance structure for the Q31 CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ +} arm_cfft_radix4_instance_q31; /* Deprecated */ - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); +void arm_cfft_radix4_q31(const arm_cfft_radix4_instance_q31 *S, q31_t *pSrc); /* Deprecated */ - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix4_init_q31(arm_cfft_radix4_instance_q31 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); - /** +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix2_instance_f32; /* Deprecated */ - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix2_init_f32(arm_cfft_radix2_instance_f32 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); +void arm_cfft_radix2_f32(const arm_cfft_radix2_instance_f32 *S, float32_t *pSrc); - /** +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - - +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix4_instance_f32; /* Deprecated */ - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix4_init_f32(arm_cfft_radix4_instance_f32 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); +void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 *S, float32_t *pSrc); - /** +/** * @brief Instance structure for the fixed-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q15_t *rearranged_twiddle_stride3; + const uint32_t + *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ + const uint32_t + *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ + const uint32_t + *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ + const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ + const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ + const q15_t *rearranged_twiddle_stride3; #endif - } arm_cfft_instance_q15; - -arm_status arm_cfft_init_4096_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_2048_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_1024_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_512_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_256_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_128_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_64_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_32_q15(arm_cfft_instance_q15 * S); -arm_status arm_cfft_init_16_q15(arm_cfft_instance_q15 * S); - -arm_status arm_cfft_init_q15( - arm_cfft_instance_q15 * S, - uint16_t fftLen); - -void arm_cfft_q15( - const arm_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** +} arm_cfft_instance_q15; + +arm_status arm_cfft_init_4096_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_2048_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_1024_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_512_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_256_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_128_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_64_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_32_q15(arm_cfft_instance_q15 *S); +arm_status arm_cfft_init_16_q15(arm_cfft_instance_q15 *S); + +arm_status arm_cfft_init_q15(arm_cfft_instance_q15 *S, uint16_t fftLen); + +void arm_cfft_q15(const arm_cfft_instance_q15 *S, q15_t *p1, uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** * @brief Instance structure for the fixed-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q31_t *rearranged_twiddle_stride3; + const uint32_t + *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ + const uint32_t + *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ + const uint32_t + *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ + const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ + const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ + const q31_t *rearranged_twiddle_stride3; #endif - } arm_cfft_instance_q31; - -arm_status arm_cfft_init_4096_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_2048_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_1024_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_512_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_256_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_128_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_64_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_32_q31(arm_cfft_instance_q31 * S); -arm_status arm_cfft_init_16_q31(arm_cfft_instance_q31 * S); - -arm_status arm_cfft_init_q31( - arm_cfft_instance_q31 * S, - uint16_t fftLen); - -void arm_cfft_q31( - const arm_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** +} arm_cfft_instance_q31; + +arm_status arm_cfft_init_4096_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_2048_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_1024_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_512_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_256_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_128_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_64_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_32_q31(arm_cfft_instance_q31 *S); +arm_status arm_cfft_init_16_q31(arm_cfft_instance_q31 *S); + +arm_status arm_cfft_init_q31(arm_cfft_instance_q31 *S, uint16_t fftLen); + +void arm_cfft_q31(const arm_cfft_instance_q31 *S, q31_t *p1, uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const float32_t *rearranged_twiddle_stride3; + const uint32_t + *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ + const uint32_t + *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ + const uint32_t + *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ + const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ + const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ + const float32_t *rearranged_twiddle_stride3; #endif - } arm_cfft_instance_f32; - - -arm_status arm_cfft_init_4096_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_2048_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_1024_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_512_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_256_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_128_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_64_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_32_f32(arm_cfft_instance_f32 * S); -arm_status arm_cfft_init_16_f32(arm_cfft_instance_f32 * S); +} arm_cfft_instance_f32; - arm_status arm_cfft_init_f32( - arm_cfft_instance_f32 * S, - uint16_t fftLen); +arm_status arm_cfft_init_4096_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_2048_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_1024_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_512_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_256_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_128_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_64_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_32_f32(arm_cfft_instance_f32 *S); +arm_status arm_cfft_init_16_f32(arm_cfft_instance_f32 *S); - void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_init_f32(arm_cfft_instance_f32 *S, uint16_t fftLen); +void arm_cfft_f32(const arm_cfft_instance_f32 *S, float32_t *p1, uint8_t ifftFlag, + uint8_t bitReverseFlag); - /** +/** * @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float64_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_f64; - -arm_status arm_cfft_init_4096_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_2048_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_1024_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_512_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_256_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_128_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_64_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_32_f64(arm_cfft_instance_f64 * S); -arm_status arm_cfft_init_16_f64(arm_cfft_instance_f64 * S); - - arm_status arm_cfft_init_f64( - arm_cfft_instance_f64 * S, - uint16_t fftLen); - - void arm_cfft_f64( - const arm_cfft_instance_f64 * S, - float64_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + const float64_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +} arm_cfft_instance_f64; + +arm_status arm_cfft_init_4096_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_2048_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_1024_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_512_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_256_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_128_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_64_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_32_f64(arm_cfft_instance_f64 *S); +arm_status arm_cfft_init_16_f64(arm_cfft_instance_f64 *S); + +arm_status arm_cfft_init_f64(arm_cfft_instance_f64 *S, uint16_t fftLen); + +void arm_cfft_f64(const arm_cfft_instance_f64 *S, float64_t *p1, uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/** * @brief Instance structure for the Q15 RFFT/RIFFT function. */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ +typedef struct { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t + ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t + bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t + twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) arm_cfft_instance_q15 cfftInst; #else - const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ #endif - } arm_rfft_instance_q15; - -arm_status arm_rfft_init_32_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_64_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_128_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_256_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_512_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_1024_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_2048_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_4096_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - -arm_status arm_rfft_init_8192_q15( - arm_rfft_instance_q15 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** +} arm_rfft_instance_q15; + +arm_status arm_rfft_init_32_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_64_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_128_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_256_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_512_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_1024_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_2048_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_4096_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_8192_q15(arm_rfft_instance_q15 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_q15(arm_rfft_instance_q15 *S, uint32_t fftLenReal, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +void arm_rfft_q15(const arm_rfft_instance_q15 *S, q15_t *pSrc, q15_t *pDst); + +/** * @brief Instance structure for the Q31 RFFT/RIFFT function. */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ +typedef struct { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t + ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t + bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t + twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) arm_cfft_instance_q31 cfftInst; #else - const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ #endif - } arm_rfft_instance_q31; - - arm_status arm_rfft_init_32_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_64_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_128_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_256_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_512_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_1024_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_2048_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_4096_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_8192_q31( - arm_rfft_instance_q31 * S, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** +} arm_rfft_instance_q31; + +arm_status arm_rfft_init_32_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_64_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_128_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_256_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_512_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_1024_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_2048_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_4096_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_8192_q31(arm_rfft_instance_q31 *S, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +arm_status arm_rfft_init_q31(arm_rfft_instance_q31 *S, uint32_t fftLenReal, uint32_t ifftFlagR, + uint32_t bitReverseFlag); + +void arm_rfft_q31(const arm_rfft_instance_q31 *S, q31_t *pSrc, q31_t *pDst); + +/** * @brief Instance structure for the floating-point RFFT/RIFFT function. */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** +typedef struct { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t + ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t + bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t + twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ +} arm_rfft_instance_f32; + +arm_status arm_rfft_init_f32(arm_rfft_instance_f32 *S, arm_cfft_radix4_instance_f32 *S_CFFT, + uint32_t fftLenReal, uint32_t ifftFlagR, uint32_t bitReverseFlag); + +void arm_rfft_f32(const arm_rfft_instance_f32 *S, float32_t *pSrc, float32_t *pDst); + +/** * @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function. */ -typedef struct - { - arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float64_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f64 ; - -arm_status arm_rfft_fast_init_32_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_64_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_128_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_256_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_512_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_1024_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_2048_f64( arm_rfft_fast_instance_f64 * S ); -arm_status arm_rfft_fast_init_4096_f64( arm_rfft_fast_instance_f64 * S ); - -arm_status arm_rfft_fast_init_f64 ( - arm_rfft_fast_instance_f64 * S, - uint16_t fftLen); - - -void arm_rfft_fast_f64( - arm_rfft_fast_instance_f64 * S, - float64_t * p, float64_t * pOut, - uint8_t ifftFlag); - - - /** +typedef struct { + arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float64_t *pTwiddleRFFT; /**< Twiddle factors real stage */ +} arm_rfft_fast_instance_f64; + +arm_status arm_rfft_fast_init_32_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_64_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_128_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_256_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_512_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_1024_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_2048_f64(arm_rfft_fast_instance_f64 *S); +arm_status arm_rfft_fast_init_4096_f64(arm_rfft_fast_instance_f64 *S); + +arm_status arm_rfft_fast_init_f64(arm_rfft_fast_instance_f64 *S, uint16_t fftLen); + +void arm_rfft_fast_f64(arm_rfft_fast_instance_f64 *S, float64_t *p, float64_t *pOut, + uint8_t ifftFlag); + +/** * @brief Instance structure for the floating-point RFFT/RIFFT function. */ -typedef struct - { - arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f32 ; - -arm_status arm_rfft_fast_init_32_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_64_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_128_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_256_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_512_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_1024_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_2048_f32( arm_rfft_fast_instance_f32 * S ); -arm_status arm_rfft_fast_init_4096_f32( arm_rfft_fast_instance_f32 * S ); - -arm_status arm_rfft_fast_init_f32 ( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen); - - - void arm_rfft_fast_f32( - const arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** +typedef struct { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float32_t *pTwiddleRFFT; /**< Twiddle factors real stage */ +} arm_rfft_fast_instance_f32; + +arm_status arm_rfft_fast_init_32_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_64_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_128_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_256_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_512_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_1024_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_2048_f32(arm_rfft_fast_instance_f32 *S); +arm_status arm_rfft_fast_init_4096_f32(arm_rfft_fast_instance_f32 *S); + +arm_status arm_rfft_fast_init_f32(arm_rfft_fast_instance_f32 *S, uint16_t fftLen); + +void arm_rfft_fast_f32(const arm_rfft_fast_instance_f32 *S, float32_t *p, float32_t *pOut, + uint8_t ifftFlag); + +/** * @brief Instance structure for the floating-point DCT4/IDCT4 function. */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - const float32_t *pTwiddle; /**< points to the twiddle factor table. */ - const float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - - /** +typedef struct { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + const float32_t *pTwiddle; /**< points to the twiddle factor table. */ + const float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_f32; + +/** * @brief Initialization function for the floating-point DCT4/IDCT4. * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. @@ -618,43 +517,32 @@ arm_status arm_rfft_fast_init_f32 ( * @param[in] normalize normalizing factor. * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. */ - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); +arm_status arm_dct4_init_f32(arm_dct4_instance_f32 *S, arm_rfft_instance_f32 *S_RFFT, + arm_cfft_radix4_instance_f32 *S_CFFT, uint16_t N, uint16_t Nby2, + float32_t normalize); - - /** +/** * @brief Processing function for the floating-point DCT4/IDCT4. * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. * @param[in] pState points to state buffer. * @param[in,out] pInlineBuffer points to the in-place input and output buffer. */ - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); +void arm_dct4_f32(const arm_dct4_instance_f32 *S, float32_t *pState, float32_t *pInlineBuffer); - - /** +/** * @brief Instance structure for the Q31 DCT4/IDCT4 function. */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - - /** +typedef struct { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_q31; + +/** * @brief Initialization function for the Q31 DCT4/IDCT4. * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure @@ -664,43 +552,32 @@ arm_status arm_rfft_fast_init_f32 ( * @param[in] normalize normalizing factor. * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. */ - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - +arm_status arm_dct4_init_q31(arm_dct4_instance_q31 *S, arm_rfft_instance_q31 *S_RFFT, + arm_cfft_radix4_instance_q31 *S_CFFT, uint16_t N, uint16_t Nby2, + q31_t normalize); - /** +/** * @brief Processing function for the Q31 DCT4/IDCT4. * @param[in] S points to an instance of the Q31 DCT4 structure. * @param[in] pState points to state buffer. * @param[in,out] pInlineBuffer points to the in-place input and output buffer. */ - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); +void arm_dct4_q31(const arm_dct4_instance_q31 *S, q31_t *pState, q31_t *pInlineBuffer); - - /** +/** * @brief Instance structure for the Q15 DCT4/IDCT4 function. */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - - /** +typedef struct { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ +} arm_dct4_instance_q15; + +/** * @brief Initialization function for the Q15 DCT4/IDCT4. * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. @@ -710,148 +587,83 @@ arm_status arm_rfft_fast_init_f32 ( * @param[in] normalize normalizing factor. * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. */ - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - +arm_status arm_dct4_init_q15(arm_dct4_instance_q15 *S, arm_rfft_instance_q15 *S_RFFT, + arm_cfft_radix4_instance_q15 *S_CFFT, uint16_t N, uint16_t Nby2, + q15_t normalize); - /** +/** * @brief Processing function for the Q15 DCT4/IDCT4. * @param[in] S points to an instance of the Q15 DCT4 structure. * @param[in] pState points to state buffer. * @param[in,out] pInlineBuffer points to the in-place input and output buffer. */ - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); +void arm_dct4_q15(const arm_dct4_instance_q15 *S, q15_t *pState, q15_t *pInlineBuffer); - /** +/** * @brief Instance structure for the Floating-point MFCC function. */ -typedef struct - { - const float32_t *dctCoefs; /**< Internal DCT coefficients */ - const float32_t *filterCoefs; /**< Internal Mel filter coefficients */ - const float32_t *windowCoefs; /**< Windowing coefficients */ - const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ - const uint32_t *filterLengths; /**< Internal Mel filter lengths */ - uint32_t fftLen; /**< FFT length */ - uint32_t nbMelFilters; /**< Number of Mel filters */ - uint32_t nbDctOutputs; /**< Number of DCT outputs */ +typedef struct { + const float32_t *dctCoefs; /**< Internal DCT coefficients */ + const float32_t *filterCoefs; /**< Internal Mel filter coefficients */ + const float32_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ #if defined(ARM_MFCC_CFFT_BASED) - /* Implementation of the MFCC is using a CFFT */ - arm_cfft_instance_f32 cfft; /**< Internal CFFT instance */ + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_f32 cfft; /**< Internal CFFT instance */ #else - /* Implementation of the MFCC is using a RFFT (default) */ - arm_rfft_fast_instance_f32 rfft; + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_fast_instance_f32 rfft; #endif - } arm_mfcc_instance_f32 ; - -arm_status arm_mfcc_init_32_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_64_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_128_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_256_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_512_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_1024_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_2048_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_4096_f32( - arm_mfcc_instance_f32 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - -arm_status arm_mfcc_init_f32( - arm_mfcc_instance_f32 * S, - uint32_t fftLen, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float32_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float32_t *filterCoefs, - const float32_t *windowCoefs - ); - +} arm_mfcc_instance_f32; + +arm_status arm_mfcc_init_32_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_64_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_128_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_256_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_512_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_1024_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_2048_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_4096_f32(arm_mfcc_instance_f32 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); + +arm_status arm_mfcc_init_f32(arm_mfcc_instance_f32 *S, uint32_t fftLen, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float32_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float32_t *filterCoefs, const float32_t *windowCoefs); /** @brief MFCC F32 @@ -860,135 +672,74 @@ arm_status arm_mfcc_init_f32( @param[out] pDst points to the output MFCC values @param[inout] pTmp points to a temporary buffer of complex */ - void arm_mfcc_f32( - const arm_mfcc_instance_f32 * S, - float32_t *pSrc, - float32_t *pDst, - float32_t *pTmp - ); - - /** +void arm_mfcc_f32(const arm_mfcc_instance_f32 *S, float32_t *pSrc, float32_t *pDst, + float32_t *pTmp); + +/** * @brief Instance structure for the Q31 MFCC function. */ -typedef struct - { - const q31_t *dctCoefs; /**< Internal DCT coefficients */ - const q31_t *filterCoefs; /**< Internal Mel filter coefficients */ - const q31_t *windowCoefs; /**< Windowing coefficients */ - const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ - const uint32_t *filterLengths; /**< Internal Mel filter lengths */ - uint32_t fftLen; /**< FFT length */ - uint32_t nbMelFilters; /**< Number of Mel filters */ - uint32_t nbDctOutputs; /**< Number of DCT outputs */ +typedef struct { + const q31_t *dctCoefs; /**< Internal DCT coefficients */ + const q31_t *filterCoefs; /**< Internal Mel filter coefficients */ + const q31_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ #if defined(ARM_MFCC_CFFT_BASED) - /* Implementation of the MFCC is using a CFFT */ - arm_cfft_instance_q31 cfft; /**< Internal CFFT instance */ + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_q31 cfft; /**< Internal CFFT instance */ #else - /* Implementation of the MFCC is using a RFFT (default) */ - arm_rfft_instance_q31 rfft; + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_instance_q31 rfft; #endif - } arm_mfcc_instance_q31 ; - -arm_status arm_mfcc_init_32_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_64_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_128_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_256_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_512_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_1024_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_2048_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_4096_q31( - arm_mfcc_instance_q31 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - -arm_status arm_mfcc_init_q31( - arm_mfcc_instance_q31 * S, - uint32_t fftLen, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q31_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q31_t *filterCoefs, - const q31_t *windowCoefs - ); - +} arm_mfcc_instance_q31; + +arm_status arm_mfcc_init_32_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_64_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_128_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_256_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_512_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_1024_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_2048_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_4096_q31(arm_mfcc_instance_q31 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); + +arm_status arm_mfcc_init_q31(arm_mfcc_instance_q31 *S, uint32_t fftLen, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q31_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q31_t *filterCoefs, const q31_t *windowCoefs); /** @brief MFCC Q31 @@ -998,135 +749,73 @@ arm_status arm_mfcc_init_q31( @param[inout] pTmp points to a temporary buffer of complex @return error status */ - arm_status arm_mfcc_q31( - const arm_mfcc_instance_q31 * S, - q31_t *pSrc, - q31_t *pDst, - q31_t *pTmp - ); - - /** +arm_status arm_mfcc_q31(const arm_mfcc_instance_q31 *S, q31_t *pSrc, q31_t *pDst, q31_t *pTmp); + +/** * @brief Instance structure for the Q15 MFCC function. */ -typedef struct - { - const q15_t *dctCoefs; /**< Internal DCT coefficients */ - const q15_t *filterCoefs; /**< Internal Mel filter coefficients */ - const q15_t *windowCoefs; /**< Windowing coefficients */ - const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ - const uint32_t *filterLengths; /**< Internal Mel filter lengths */ - uint32_t fftLen; /**< FFT length */ - uint32_t nbMelFilters; /**< Number of Mel filters */ - uint32_t nbDctOutputs; /**< Number of DCT outputs */ +typedef struct { + const q15_t *dctCoefs; /**< Internal DCT coefficients */ + const q15_t *filterCoefs; /**< Internal Mel filter coefficients */ + const q15_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ #if defined(ARM_MFCC_CFFT_BASED) - /* Implementation of the MFCC is using a CFFT */ - arm_cfft_instance_q15 cfft; /**< Internal CFFT instance */ + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_q15 cfft; /**< Internal CFFT instance */ #else - /* Implementation of the MFCC is using a RFFT (default) */ - arm_rfft_instance_q15 rfft; + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_instance_q15 rfft; #endif - } arm_mfcc_instance_q15 ; - -arm_status arm_mfcc_init_32_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_64_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_128_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_256_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_512_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_1024_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_2048_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_4096_q15( - arm_mfcc_instance_q15 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - -arm_status arm_mfcc_init_q15( - arm_mfcc_instance_q15 * S, - uint32_t fftLen, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const q15_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const q15_t *filterCoefs, - const q15_t *windowCoefs - ); - +} arm_mfcc_instance_q15; + +arm_status arm_mfcc_init_32_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_64_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_128_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_256_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_512_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_1024_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_2048_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_4096_q15(arm_mfcc_instance_q15 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); + +arm_status arm_mfcc_init_q15(arm_mfcc_instance_q15 *S, uint32_t fftLen, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const q15_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const q15_t *filterCoefs, const q15_t *windowCoefs); /** @brief MFCC Q15 @@ -1136,15 +825,9 @@ arm_status arm_mfcc_init_q15( @param[inout] pTmp points to a temporary buffer of complex @return error status */ - arm_status arm_mfcc_q15( - const arm_mfcc_instance_q15 * S, - q15_t *pSrc, - q15_t *pDst, - q31_t *pTmp - ); - +arm_status arm_mfcc_q15(const arm_mfcc_instance_q15 *S, q15_t *pSrc, q15_t *pDst, q31_t *pTmp); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions_f16.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions_f16.h old mode 100755 new mode 100644 index b0ca0c0d2d..aaf4c8dff3 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions_f16.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/transform_functions_f16.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef TRANSFORM_FUNCTIONS_F16_H_ #define TRANSFORM_FUNCTIONS_F16_H_ @@ -33,264 +32,186 @@ #include "dsp/none.h" #include "dsp/utils.h" -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - - #if defined(ARM_FLOAT16_SUPPORTED) - - /** +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float16_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f16; - - /** +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float16_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix2_instance_f16; + +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float16_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f16; - - /** +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t + ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t + bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t + twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t + bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float16_t onebyfftLen; /**< value of 1/fftLen. */ +} arm_cfft_radix4_instance_f16; + +/** * @brief Instance structure for the floating-point CFFT/CIFFT function. */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ +typedef struct { + uint16_t fftLen; /**< length of the FFT. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const float16_t *rearranged_twiddle_stride3; + const uint32_t + *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ + const uint32_t + *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ + const uint32_t + *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ + const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ + const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ + const float16_t *rearranged_twiddle_stride3; #endif - } arm_cfft_instance_f16; +} arm_cfft_instance_f16; +arm_status arm_cfft_init_4096_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_2048_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_1024_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_512_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_256_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_128_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_64_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_32_f16(arm_cfft_instance_f16 *S); +arm_status arm_cfft_init_16_f16(arm_cfft_instance_f16 *S); -arm_status arm_cfft_init_4096_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_2048_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_1024_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_512_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_256_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_128_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_64_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_32_f16(arm_cfft_instance_f16 * S); -arm_status arm_cfft_init_16_f16(arm_cfft_instance_f16 * S); +arm_status arm_cfft_init_f16(arm_cfft_instance_f16 *S, uint16_t fftLen); +void arm_cfft_f16(const arm_cfft_instance_f16 *S, float16_t *p1, uint8_t ifftFlag, + uint8_t bitReverseFlag); - arm_status arm_cfft_init_f16( - arm_cfft_instance_f16 * S, - uint16_t fftLen); - - void arm_cfft_f16( - const arm_cfft_instance_f16 * S, - float16_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** +/** * @brief Instance structure for the floating-point RFFT/RIFFT function. */ -typedef struct - { - arm_cfft_instance_f16 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float16_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f16 ; - -arm_status arm_rfft_fast_init_32_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_64_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_128_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_256_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_512_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_1024_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_2048_f16( arm_rfft_fast_instance_f16 * S ); -arm_status arm_rfft_fast_init_4096_f16( arm_rfft_fast_instance_f16 * S ); - -arm_status arm_rfft_fast_init_f16 ( - arm_rfft_fast_instance_f16 * S, - uint16_t fftLen); - - - void arm_rfft_fast_f16( - const arm_rfft_fast_instance_f16 * S, - float16_t * p, float16_t * pOut, - uint8_t ifftFlag); +typedef struct { + arm_cfft_instance_f16 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float16_t *pTwiddleRFFT; /**< Twiddle factors real stage */ +} arm_rfft_fast_instance_f16; + +arm_status arm_rfft_fast_init_32_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_64_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_128_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_256_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_512_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_1024_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_2048_f16(arm_rfft_fast_instance_f16 *S); +arm_status arm_rfft_fast_init_4096_f16(arm_rfft_fast_instance_f16 *S); + +arm_status arm_rfft_fast_init_f16(arm_rfft_fast_instance_f16 *S, uint16_t fftLen); + +void arm_rfft_fast_f16(const arm_rfft_fast_instance_f16 *S, float16_t *p, float16_t *pOut, + uint8_t ifftFlag); /* Deprecated */ - arm_status arm_cfft_radix4_init_f16( - arm_cfft_radix4_instance_f16 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix4_init_f16(arm_cfft_radix4_instance_f16 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix4_f16( - const arm_cfft_radix4_instance_f16 * S, - float16_t * pSrc); - +void arm_cfft_radix4_f16(const arm_cfft_radix4_instance_f16 *S, float16_t *pSrc); /* Deprecated */ - arm_status arm_cfft_radix2_init_f16( - arm_cfft_radix2_instance_f16 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); +arm_status arm_cfft_radix2_init_f16(arm_cfft_radix2_instance_f16 *S, uint16_t fftLen, + uint8_t ifftFlag, uint8_t bitReverseFlag); /* Deprecated */ - void arm_cfft_radix2_f16( - const arm_cfft_radix2_instance_f16 * S, - float16_t * pSrc); +void arm_cfft_radix2_f16(const arm_cfft_radix2_instance_f16 *S, float16_t *pSrc); - /** +/** * @brief Instance structure for the Floating-point MFCC function. */ -typedef struct - { - const float16_t *dctCoefs; /**< Internal DCT coefficients */ - const float16_t *filterCoefs; /**< Internal Mel filter coefficients */ - const float16_t *windowCoefs; /**< Windowing coefficients */ - const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ - const uint32_t *filterLengths; /**< Internal Mel filter lengths */ - uint32_t fftLen; /**< FFT length */ - uint32_t nbMelFilters; /**< Number of Mel filters */ - uint32_t nbDctOutputs; /**< Number of DCT outputs */ +typedef struct { + const float16_t *dctCoefs; /**< Internal DCT coefficients */ + const float16_t *filterCoefs; /**< Internal Mel filter coefficients */ + const float16_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ #if defined(ARM_MFCC_CFFT_BASED) - /* Implementation of the MFCC is using a CFFT */ - arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */ + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */ #else - /* Implementation of the MFCC is using a RFFT (default) */ - arm_rfft_fast_instance_f16 rfft; + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_fast_instance_f16 rfft; #endif - } arm_mfcc_instance_f16 ; - -arm_status arm_mfcc_init_32_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_64_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_128_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_256_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_512_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_1024_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_2048_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_4096_f16( - arm_mfcc_instance_f16 * S, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - -arm_status arm_mfcc_init_f16( - arm_mfcc_instance_f16 * S, - uint32_t fftLen, - uint32_t nbMelFilters, - uint32_t nbDctOutputs, - const float16_t *dctCoefs, - const uint32_t *filterPos, - const uint32_t *filterLengths, - const float16_t *filterCoefs, - const float16_t *windowCoefs - ); - - +} arm_mfcc_instance_f16; + +arm_status arm_mfcc_init_32_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_64_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_128_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_256_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_512_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_1024_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_2048_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_4096_f16(arm_mfcc_instance_f16 *S, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); + +arm_status arm_mfcc_init_f16(arm_mfcc_instance_f16 *S, uint32_t fftLen, uint32_t nbMelFilters, + uint32_t nbDctOutputs, const float16_t *dctCoefs, + const uint32_t *filterPos, const uint32_t *filterLengths, + const float16_t *filterCoefs, const float16_t *windowCoefs); /** @brief MFCC F16 @@ -299,17 +220,12 @@ arm_status arm_mfcc_init_f16( @param[out] pDst points to the output MFCC values @param[inout] pTmp points to a temporary buffer of complex */ - void arm_mfcc_f16( - const arm_mfcc_instance_f16 * S, - float16_t *pSrc, - float16_t *pDst, - float16_t *pTmp - ); - - +void arm_mfcc_f16(const arm_mfcc_instance_f16 *S, float16_t *pSrc, float16_t *pDst, + float16_t *pTmp); + #endif /* defined(ARM_FLOAT16_SUPPORTED)*/ -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/utils.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/utils.h old mode 100755 new mode 100644 index e0c5c90c17..5f9413921e --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/utils.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/utils.h @@ -29,55 +29,47 @@ #include "arm_math_types.h" #include -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif - /** +/** * @brief Macros required for reciprocal calculation in Normalized LMS */ -#define INDEX_MASK 0x0000003F +#define INDEX_MASK 0x0000003F #ifndef MIN - #define MIN(x,y) ((x) < (y) ? (x) : (y)) -#endif +#define MIN(x, y) ((x) < (y) ? (x) : (y)) +#endif #ifndef MAX - #define MAX(x,y) ((x) > (y) ? (x) : (y)) -#endif +#define MAX(x, y) ((x) > (y) ? (x) : (y)) +#endif #ifndef ARM_SQ #define ARM_SQ(x) ((x) * (x)) #endif #ifndef ARM_ROUND_UP - #define ARM_ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) +#define ARM_ROUND_UP(N, S) ((((N) + (S)-1) / (S)) * (S)) #endif - - /** +/** * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. It should not be used with negative values. */ - __STATIC_FORCEINLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - const q31_t * pRecipTable) - { +__STATIC_FORCEINLINE uint32_t arm_recip_q31(q31_t in, q31_t *dst, const q31_t *pRecipTable) +{ q31_t out; uint32_t tempVal; uint32_t index, i; uint32_t signBits; - if (in > 0) - { - signBits = ((uint32_t) (__CLZ( (uint32_t)in) - 1)); - } - else - { - signBits = ((uint32_t) (__CLZ((uint32_t)(-in)) - 1)); + if (in > 0) { + signBits = ((uint32_t)(__CLZ((uint32_t)in) - 1)); + } else { + signBits = ((uint32_t)(__CLZ((uint32_t)(-in)) - 1)); } /* Convert input sample to 1.31 format */ @@ -92,13 +84,12 @@ extern "C" /* calculation of reciprocal value */ /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (uint32_t) (((q63_t) in * out) >> 31); - tempVal = 0x7FFFFFFFu - tempVal; - /* 1.31 with exp 1 */ - /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ - out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + for (i = 0U; i < 2U; i++) { + tempVal = (uint32_t)(((q63_t)in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t)out * tempVal) >> 30); } /* write output */ @@ -106,37 +97,30 @@ extern "C" /* return num of signbits of out = 1/in value */ return (signBits + 1U); - } - +} - /** +/** * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. It should not be used with negative values. */ - __STATIC_FORCEINLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - const q15_t * pRecipTable) - { +__STATIC_FORCEINLINE uint32_t arm_recip_q15(q15_t in, q15_t *dst, const q15_t *pRecipTable) +{ q15_t out = 0; int32_t tempVal = 0; uint32_t index = 0, i = 0; uint32_t signBits = 0; - if (in > 0) - { - signBits = ((uint32_t)(__CLZ( (uint32_t)in) - 17)); - } - else - { - signBits = ((uint32_t)(__CLZ((uint32_t)(-in)) - 17)); + if (in > 0) { + signBits = ((uint32_t)(__CLZ((uint32_t)in) - 17)); + } else { + signBits = ((uint32_t)(__CLZ((uint32_t)(-in)) - 17)); } /* Convert input sample to 1.15 format */ in = (q15_t)(in << signBits); /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 8); + index = (uint32_t)(in >> 8); index = (index & INDEX_MASK); /* 1.15 with exp 1 */ @@ -144,13 +128,12 @@ extern "C" /* calculation of reciprocal value */ /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (((q31_t) in * out) >> 15); - tempVal = 0x7FFF - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + for (i = 0U; i < 2U; i++) { + tempVal = (((q31_t)in * out) >> 15); + tempVal = 0x7FFF - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t)(((q31_t)out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ } /* write output */ @@ -158,8 +141,7 @@ extern "C" /* return num of signbits of out = 1/in value */ return (signBits + 1); - } - +} /** * @brief 64-bit to 32-bit unsigned normalization @@ -167,37 +149,32 @@ extern "C" * @param[out] normalized is the 32-bit normalized value * @param[out] norm is norm scale */ -__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm) +__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t *normalized, int32_t *norm) { - int32_t n1; - int32_t hi = (int32_t) (in >> 32); - int32_t lo = (int32_t) ((in << 32) >> 32); + int32_t n1; + int32_t hi = (int32_t)(in >> 32); + int32_t lo = (int32_t)((in << 32) >> 32); n1 = __CLZ((uint32_t)hi) - 32; - if (!n1) - { + if (!n1) { /* * input fits in 32-bit */ n1 = __CLZ((uint32_t)lo); - if (!n1) - { + if (!n1) { /* * MSB set, need to scale down by 1 */ *norm = -1; - *normalized = (((uint32_t) lo) >> 1); - } else - { - if (n1 == 32) - { + *normalized = (((uint32_t)lo) >> 1); + } else { + if (n1 == 32) { /* * input is zero */ *norm = 0; *normalized = 0; - } else - { + } else { /* * 32-bit normalization */ @@ -205,8 +182,7 @@ __STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int3 *normalized = lo << *norm; } } - } else - { + } else { /* * input fits in 64-bit */ @@ -221,41 +197,38 @@ __STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int3 __STATIC_INLINE int32_t arm_div_int64_to_int32(int64_t num, int32_t den) { - int32_t result; - uint64_t absNum; - int32_t normalized; - int32_t norm; + int32_t result; + uint64_t absNum; + int32_t normalized; + int32_t norm; /* * if sum fits in 32bits * avoid costly 64-bit division */ - if (num == (int64_t)LONG_MIN) - { + if (num == (int64_t)LONG_MIN) { absNum = LONG_MAX; - } - else - { - absNum = (uint64_t) (num > 0 ? num : -num); + } else { + absNum = (uint64_t)(num > 0 ? num : -num); } arm_norm_64_to_32u(absNum, &normalized, &norm); if (norm > 0) /* * 32-bit division */ - result = (int32_t) num / den; + result = (int32_t)num / den; else /* * 64-bit division */ - result = (int32_t) (num / den); + result = (int32_t)(num / den); return result; } #undef INDEX_MASK -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/window_functions.h b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/window_functions.h index 27f05a7396..a93eff1f43 100644 --- a/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/window_functions.h +++ b/Libraries/CMSIS/5.9.0/DSP/1.16.2/Include/dsp/window_functions.h @@ -23,7 +23,6 @@ * limitations under the License. */ - #ifndef WINDOW_FUNCTIONS_H_ #define WINDOW_FUNCTIONS_H_ @@ -33,17 +32,15 @@ #include "dsp/none.h" #include "dsp/utils.h" - -#ifdef __cplusplus -extern "C" -{ +#ifdef __cplusplus +extern "C" { #endif /** * @defgroup groupWindow Window Functions */ - /** +/** * @brief Welch window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -58,11 +55,9 @@ extern "C" * | Recommended overlap | 29.3 % | * */ - void arm_welch_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_welch_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Welch window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -78,10 +73,8 @@ extern "C" * * */ - void arm_welch_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_welch_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Bartlett window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -96,11 +89,9 @@ extern "C" * | Recommended overlap | 50.0 % | * */ - void arm_bartlett_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_bartlett_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Bartlett window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -116,10 +107,8 @@ extern "C" * * */ - void arm_bartlett_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_bartlett_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hamming window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -134,11 +123,9 @@ extern "C" * | Recommended overlap | 50 % | * */ - void arm_hamming_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hamming_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hamming window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -154,10 +141,8 @@ extern "C" * * */ - void arm_hamming_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hamming_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hanning window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -172,11 +157,9 @@ extern "C" * | Recommended overlap | 50 % | * */ - void arm_hanning_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hanning_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hanning window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -192,10 +175,8 @@ extern "C" * * */ - void arm_hanning_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hanning_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall3 window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -210,11 +191,9 @@ extern "C" * | Recommended overlap | 64.7 % | * */ - void arm_nuttall3_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall3_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall3 window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -230,10 +209,8 @@ extern "C" * * */ - void arm_nuttall3_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall3_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall4 window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -248,11 +225,9 @@ extern "C" * | Recommended overlap | 70.5 % | * */ - void arm_nuttall4_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall4_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall4 window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -268,10 +243,8 @@ extern "C" * * */ - void arm_nuttall4_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall4_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall3a window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -286,11 +259,9 @@ extern "C" * | Recommended overlap | 61.2 % | * */ - void arm_nuttall3a_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall3a_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall3a window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -306,10 +277,8 @@ extern "C" * * */ - void arm_nuttall3a_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall3a_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall3b window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -324,11 +293,9 @@ extern "C" * | Recommended overlap | 59.8 % | * */ - void arm_nuttall3b_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall3b_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall3b window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -344,10 +311,8 @@ extern "C" * * */ - void arm_nuttall3b_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall3b_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall4a window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -362,11 +327,9 @@ extern "C" * | Recommended overlap | 68.0 % | * */ - void arm_nuttall4a_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall4a_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall4a window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -382,10 +345,8 @@ extern "C" * * */ - void arm_nuttall4a_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall4a_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief 92 db blackman harris window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -400,11 +361,9 @@ extern "C" * | Recommended overlap | 66.1 % | * */ - void arm_blackman_harris_92db_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_blackman_harris_92db_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief 92 db blackman harris window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -420,10 +379,8 @@ extern "C" * * */ - void arm_blackman_harris_92db_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_blackman_harris_92db_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall4b window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -438,11 +395,9 @@ extern "C" * | Recommended overlap | 66.3 % | * */ - void arm_nuttall4b_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall4b_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall4b window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -458,10 +413,8 @@ extern "C" * * */ - void arm_nuttall4b_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall4b_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Nuttall4c window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -476,11 +429,9 @@ extern "C" * | Recommended overlap | 65.6 % | * */ - void arm_nuttall4c_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_nuttall4c_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Nuttall4c window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -496,10 +447,8 @@ extern "C" * * */ - void arm_nuttall4c_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_nuttall4c_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft90d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -514,11 +463,9 @@ extern "C" * | Recommended overlap | 76.0 % | * */ - void arm_hft90d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft90d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft90d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -534,10 +481,8 @@ extern "C" * * */ - void arm_hft90d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft90d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft95 window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -552,11 +497,9 @@ extern "C" * | Recommended overlap | 75.6 % | * */ - void arm_hft95_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft95_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft95 window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -572,10 +515,8 @@ extern "C" * * */ - void arm_hft95_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft95_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft116d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -590,11 +531,9 @@ extern "C" * | Recommended overlap | 78.2 % | * */ - void arm_hft116d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft116d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft116d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -610,10 +549,8 @@ extern "C" * * */ - void arm_hft116d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft116d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft144d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -628,11 +565,9 @@ extern "C" * | Recommended overlap | 79.9 % | * */ - void arm_hft144d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft144d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft144d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -648,10 +583,8 @@ extern "C" * * */ - void arm_hft144d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft144d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft169d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -666,11 +599,9 @@ extern "C" * | Recommended overlap | 81.2 % | * */ - void arm_hft169d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft169d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft169d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -686,10 +617,8 @@ extern "C" * * */ - void arm_hft169d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft169d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft196d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -704,11 +633,9 @@ extern "C" * | Recommended overlap | 82.3 % | * */ - void arm_hft196d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft196d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft196d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -724,10 +651,8 @@ extern "C" * * */ - void arm_hft196d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft196d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft223d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -742,11 +667,9 @@ extern "C" * | Recommended overlap | 83.3 % | * */ - void arm_hft223d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft223d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft223d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -762,10 +685,8 @@ extern "C" * * */ - void arm_hft223d_f32( - float32_t * pDst, - uint32_t blockSize); - /** +void arm_hft223d_f32(float32_t *pDst, uint32_t blockSize); +/** * @brief Hft248d window (double). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -780,11 +701,9 @@ extern "C" * | Recommended overlap | 84.1 % | * */ - void arm_hft248d_f64( - float64_t * pDst, - uint32_t blockSize); +void arm_hft248d_f64(float64_t *pDst, uint32_t blockSize); - /** +/** * @brief Hft248d window (float). * @param[out] pDst points to the output generated window * @param[in] blockSize number of samples in the window @@ -800,12 +719,9 @@ extern "C" * * */ - void arm_hft248d_f32( - float32_t * pDst, - uint32_t blockSize); - +void arm_hft248d_f32(float32_t *pDst, uint32_t blockSize); -#ifdef __cplusplus +#ifdef __cplusplus } #endif diff --git a/Libraries/CMSIS/Device/Maxim/MAX32655/Source/heap.c b/Libraries/CMSIS/Device/Maxim/MAX32655/Source/heap.c index 80559e9503..4409f35aff 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32655/Source/heap.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32655/Source/heap.c @@ -21,6 +21,7 @@ #include #include #include +#include /* sbrk @@ -48,3 +49,79 @@ caddr_t _sbrk(int incr) return (caddr_t)prev_heap_end; } + +// struct mallinfo { +// size_t arena; /* total space allocated from system */ +// size_t ordblks; /* number of non-inuse chunks */ +// size_t smblks; /* unused -- always zero */ +// size_t hblks; /* number of mmapped regions */ +// size_t hblkhd; /* total space in mmapped regions */ +// size_t usmblks; /* unused -- always zero */ +// size_t fsmblks; /* unused -- always zero */ +// size_t uordblks; /* total allocated space */ +// size_t fordblks; /* total non-inuse space */ +// size_t keepcost; /* top-most, releasable (via malloc_trim) space */ +// }; + +/* +The structure fields contain the following information: + + arena The total amount of memory allocated by means other than + mmap(2) (i.e., memory allocated on the heap). This figure + includes both in-use blocks and blocks on the free list. + + ordblks + The number of ordinary (i.e., non-fastbin) free blocks. + + smblks The number of fastbin free blocks (see mallopt(3)). + + hblks The number of blocks currently allocated using mmap(2). + (See the discussion of M_MMAP_THRESHOLD in mallopt(3).) + + hblkhd The number of bytes in blocks currently allocated using + mmap(2). + + usmblks + This field is unused, and is always 0. Historically, it + was the "highwater mark" for allocated space—that is, the + maximum amount of space that was ever allocated (in + bytes); this field was maintained only in nonthreading + environments. + + fsmblks + The total number of bytes in fastbin free blocks. + + uordblks + The total number of bytes used by in-use allocations. + + fordblks + The total number of bytes in free blocks. + + keepcost + The total amount of releasable free space at the top of + the heap. This is the maximum number of bytes that could + ideally (i.e., ignoring page alignment restrictions, and + so on) be released by malloc_trim(3). +*/ + +struct mallinfo mallinfo(void) +{ + struct mallinfo temp_mallinfo; + + if (heap_end == 0) { + heap_end = (caddr_t)&__HeapBase; + } + + temp_mallinfo.arena = ((size_t)&__HeapLimit - (size_t)&__HeapBase); + temp_mallinfo.ordblks = 0; /* Unused */ + temp_mallinfo.smblks = 0; /* Unused */ + temp_mallinfo.hblks = 0; /* Unused */ + temp_mallinfo.hblkhd = 0; /* Unused */ + temp_mallinfo.usmblks = 0; /* Unused */ + temp_mallinfo.fsmblks = 0; /* Unused */ + temp_mallinfo.uordblks = (size_t)heap_end - (size_t)&__HeapBase; + temp_mallinfo.fordblks = (size_t)&__HeapLimit - (size_t)heap_end; + temp_mallinfo.keepcost = 0 /* Unused */; + + return temp_mallinfo; +} diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Source/heap.c b/Libraries/CMSIS/Device/Maxim/MAX32665/Source/heap.c index 80559e9503..4409f35aff 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Source/heap.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Source/heap.c @@ -21,6 +21,7 @@ #include #include #include +#include /* sbrk @@ -48,3 +49,79 @@ caddr_t _sbrk(int incr) return (caddr_t)prev_heap_end; } + +// struct mallinfo { +// size_t arena; /* total space allocated from system */ +// size_t ordblks; /* number of non-inuse chunks */ +// size_t smblks; /* unused -- always zero */ +// size_t hblks; /* number of mmapped regions */ +// size_t hblkhd; /* total space in mmapped regions */ +// size_t usmblks; /* unused -- always zero */ +// size_t fsmblks; /* unused -- always zero */ +// size_t uordblks; /* total allocated space */ +// size_t fordblks; /* total non-inuse space */ +// size_t keepcost; /* top-most, releasable (via malloc_trim) space */ +// }; + +/* +The structure fields contain the following information: + + arena The total amount of memory allocated by means other than + mmap(2) (i.e., memory allocated on the heap). This figure + includes both in-use blocks and blocks on the free list. + + ordblks + The number of ordinary (i.e., non-fastbin) free blocks. + + smblks The number of fastbin free blocks (see mallopt(3)). + + hblks The number of blocks currently allocated using mmap(2). + (See the discussion of M_MMAP_THRESHOLD in mallopt(3).) + + hblkhd The number of bytes in blocks currently allocated using + mmap(2). + + usmblks + This field is unused, and is always 0. Historically, it + was the "highwater mark" for allocated space—that is, the + maximum amount of space that was ever allocated (in + bytes); this field was maintained only in nonthreading + environments. + + fsmblks + The total number of bytes in fastbin free blocks. + + uordblks + The total number of bytes used by in-use allocations. + + fordblks + The total number of bytes in free blocks. + + keepcost + The total amount of releasable free space at the top of + the heap. This is the maximum number of bytes that could + ideally (i.e., ignoring page alignment restrictions, and + so on) be released by malloc_trim(3). +*/ + +struct mallinfo mallinfo(void) +{ + struct mallinfo temp_mallinfo; + + if (heap_end == 0) { + heap_end = (caddr_t)&__HeapBase; + } + + temp_mallinfo.arena = ((size_t)&__HeapLimit - (size_t)&__HeapBase); + temp_mallinfo.ordblks = 0; /* Unused */ + temp_mallinfo.smblks = 0; /* Unused */ + temp_mallinfo.hblks = 0; /* Unused */ + temp_mallinfo.hblkhd = 0; /* Unused */ + temp_mallinfo.usmblks = 0; /* Unused */ + temp_mallinfo.fsmblks = 0; /* Unused */ + temp_mallinfo.uordblks = (size_t)heap_end - (size_t)&__HeapBase; + temp_mallinfo.fordblks = (size_t)&__HeapLimit - (size_t)heap_end; + temp_mallinfo.keepcost = 0 /* Unused */; + + return temp_mallinfo; +} diff --git a/Libraries/CMSIS/Device/Maxim/MAX32690/Source/heap.c b/Libraries/CMSIS/Device/Maxim/MAX32690/Source/heap.c index 80559e9503..4409f35aff 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32690/Source/heap.c +++ b/Libraries/CMSIS/Device/Maxim/MAX32690/Source/heap.c @@ -21,6 +21,7 @@ #include #include #include +#include /* sbrk @@ -48,3 +49,79 @@ caddr_t _sbrk(int incr) return (caddr_t)prev_heap_end; } + +// struct mallinfo { +// size_t arena; /* total space allocated from system */ +// size_t ordblks; /* number of non-inuse chunks */ +// size_t smblks; /* unused -- always zero */ +// size_t hblks; /* number of mmapped regions */ +// size_t hblkhd; /* total space in mmapped regions */ +// size_t usmblks; /* unused -- always zero */ +// size_t fsmblks; /* unused -- always zero */ +// size_t uordblks; /* total allocated space */ +// size_t fordblks; /* total non-inuse space */ +// size_t keepcost; /* top-most, releasable (via malloc_trim) space */ +// }; + +/* +The structure fields contain the following information: + + arena The total amount of memory allocated by means other than + mmap(2) (i.e., memory allocated on the heap). This figure + includes both in-use blocks and blocks on the free list. + + ordblks + The number of ordinary (i.e., non-fastbin) free blocks. + + smblks The number of fastbin free blocks (see mallopt(3)). + + hblks The number of blocks currently allocated using mmap(2). + (See the discussion of M_MMAP_THRESHOLD in mallopt(3).) + + hblkhd The number of bytes in blocks currently allocated using + mmap(2). + + usmblks + This field is unused, and is always 0. Historically, it + was the "highwater mark" for allocated space—that is, the + maximum amount of space that was ever allocated (in + bytes); this field was maintained only in nonthreading + environments. + + fsmblks + The total number of bytes in fastbin free blocks. + + uordblks + The total number of bytes used by in-use allocations. + + fordblks + The total number of bytes in free blocks. + + keepcost + The total amount of releasable free space at the top of + the heap. This is the maximum number of bytes that could + ideally (i.e., ignoring page alignment restrictions, and + so on) be released by malloc_trim(3). +*/ + +struct mallinfo mallinfo(void) +{ + struct mallinfo temp_mallinfo; + + if (heap_end == 0) { + heap_end = (caddr_t)&__HeapBase; + } + + temp_mallinfo.arena = ((size_t)&__HeapLimit - (size_t)&__HeapBase); + temp_mallinfo.ordblks = 0; /* Unused */ + temp_mallinfo.smblks = 0; /* Unused */ + temp_mallinfo.hblks = 0; /* Unused */ + temp_mallinfo.hblkhd = 0; /* Unused */ + temp_mallinfo.usmblks = 0; /* Unused */ + temp_mallinfo.fsmblks = 0; /* Unused */ + temp_mallinfo.uordblks = (size_t)heap_end - (size_t)&__HeapBase; + temp_mallinfo.fordblks = (size_t)&__HeapLimit - (size_t)heap_end; + temp_mallinfo.keepcost = 0 /* Unused */; + + return temp_mallinfo; +} diff --git a/Libraries/Cordio/controller/include/ble/ll_init_api.h b/Libraries/Cordio/controller/include/ble/ll_init_api.h index 0bf0a9c793..ad06f3622d 100644 --- a/Libraries/Cordio/controller/include/ble/ll_init_api.h +++ b/Libraries/Cordio/controller/include/ble/ll_init_api.h @@ -93,6 +93,7 @@ uint32_t LlInitControllerInit(LlInitRtCfg_t *pCfg); uint32_t LlInitSetBbRtCfg(const BbRtCfg_t *pBbRtCfg, const uint8_t wlSizeCfg, const uint8_t rlSizeCfg, const uint8_t plSizeCfg, uint8_t *pFreeMem, uint32_t freeMemAvail); uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t freeMemAvail); +uint32_t LlInitSetRtCfg(LlInitRtCfg_t *pLlInitRtCfg); void LlInitBbInit(void); void LlInitSchInit(void); void LlInitLlInit(void); @@ -101,6 +102,7 @@ void LlInitLhciInit(void); void LlMathSetSeed(const uint32_t *pSeed); void LlInitLhciHandler(void); + /*! \} */ /* LL_INIT_API */ #ifdef __cplusplus diff --git a/Libraries/Cordio/controller/sources/ble/init/init.c b/Libraries/Cordio/controller/sources/ble/init/init.c index 3d0a8a078a..92c5e6db7c 100644 --- a/Libraries/Cordio/controller/sources/ble/init/init.c +++ b/Libraries/Cordio/controller/sources/ble/init/init.c @@ -310,28 +310,39 @@ uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t /*************************************************************************************************/ /*! - * \brief Initialize configuration. + * \brief Set LL and BB runtime configurations. * * \param pCfg Runtime configuration. * * \return Memory used. */ /*************************************************************************************************/ -uint32_t LlInit(LlInitRtCfg_t *pCfg) +uint32_t LlInitSetRtCfg(LlInitRtCfg_t *pCfg) { - uint32_t memUsed; - uint32_t totalMemUsed = 0; - - memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, - pCfg->pFreeMem, pCfg->freeMemAvail); + uint32_t memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, + pCfg->pFreeMem, pCfg->freeMemAvail); pCfg->pFreeMem += memUsed; pCfg->freeMemAvail -= memUsed; - totalMemUsed += memUsed; - memUsed = LlInitSetLlRtCfg(pCfg->pLlRtCfg, pCfg->pFreeMem, pCfg->freeMemAvail); + memUsed += LlInitSetLlRtCfg(pCfg->pLlRtCfg, pCfg->pFreeMem, pCfg->freeMemAvail); pCfg->pFreeMem += memUsed; pCfg->freeMemAvail -= memUsed; - totalMemUsed += memUsed; + + return memUsed; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize configuration. + * + * \param pCfg Runtime configuration. + * + * \return Memory used. + */ +/*************************************************************************************************/ +uint32_t LlInit(LlInitRtCfg_t *pCfg) +{ + uint32_t totalMemUsed = LlInitSetRtCfg(pCfg); LlInitBbInit(); LlInitSchInit(); diff --git a/Libraries/Cordio/controller/sources/ble/ll/ll_init.c b/Libraries/Cordio/controller/sources/ble/ll/ll_init.c index ffa938219e..de89e2b33f 100644 --- a/Libraries/Cordio/controller/sources/ble/ll/ll_init.c +++ b/Libraries/Cordio/controller/sources/ble/ll/ll_init.c @@ -113,7 +113,6 @@ void LlGetDefaultRunTimeCfg(LlRtCfg_t *pCfg) /*************************************************************************************************/ void LlInitRunTimeCfg(const LlRtCfg_t *pCfg) { - WSF_ASSERT(pLctrRtCfg == NULL); WSF_ASSERT(pCfg); WSF_ASSERT(pCfg->btVer >= LL_VER_BT_CORE_SPEC_4_0); diff --git a/Libraries/Cordio/controller/sources/common/bb/bb_main.c b/Libraries/Cordio/controller/sources/common/bb/bb_main.c index aadddbc833..6607fa158a 100644 --- a/Libraries/Cordio/controller/sources/common/bb/bb_main.c +++ b/Libraries/Cordio/controller/sources/common/bb/bb_main.c @@ -51,7 +51,6 @@ const BbRtCfg_t *pBbRtCfg = NULL; /*!< Runtime configuration. */ /*************************************************************************************************/ void BbInitRunTimeCfg(const BbRtCfg_t *pCfg) { - WSF_ASSERT(pBbRtCfg == NULL); WSF_ASSERT(pCfg); WSF_ASSERT(pCfg->clkPpm >= 20); diff --git a/Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c b/Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c index 3c84251274..992a98fabe 100644 --- a/Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c +++ b/Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c @@ -24,6 +24,7 @@ #if defined ( __GNUC__ ) #include +#include #endif /* __GNUC__ */ #include "wsf_types.h" @@ -38,37 +39,16 @@ Macros **************************************************************************************************/ -#ifndef WSF_HEAP_SIZE -#if(PAL_CFG_LL_MAX == 1) -/* Larger link layer configurations will require more heap space. */ -#define WSF_HEAP_SIZE 0x18000 -#else -/* This is the minimum heap size. */ -#define WSF_HEAP_SIZE 0x8000 -#endif -#endif - /************************************************************************************************** Global Variables **************************************************************************************************/ -static void* freeStartAddr = 0; -static uint32_t freeLen = 0; - -/*************************************************************************************************/ -/*! - * \brief Initialize the heap memory. - */ -/*************************************************************************************************/ -static void wsfHeapInit(void) -{ - freeStartAddr = sbrk(WSF_HEAP_SIZE); - freeLen = WSF_HEAP_SIZE; -} +static void* freeStartAddr = NULL; +static uint32_t heapUsed = 0; /*************************************************************************************************/ /*! - * \brief Reserve heap memory. + * \brief Allocate heap memory. * * \param size Number of bytes of heap memory used. */ @@ -78,16 +58,8 @@ void WsfHeapAlloc(uint32_t size) /* Round up to nearest multiple of 4 for word alignment */ size = (size + 3) & ~3; - if(freeStartAddr == 0) { - wsfHeapInit(); - } - - if(freeLen < size) { - WSF_ASSERT(FALSE); - } - - freeStartAddr += size; - freeLen -= size; + freeStartAddr = sbrk(size); + heapUsed += size; } /*************************************************************************************************/ @@ -99,8 +71,9 @@ void WsfHeapAlloc(uint32_t size) /*************************************************************************************************/ void *WsfHeapGetFreeStartAddress(void) { - if(freeStartAddr == 0) { - wsfHeapInit(); + if(freeStartAddr == (caddr_t)-1) { + WSF_ASSERT(0); + return NULL; } return freeStartAddr; @@ -115,11 +88,9 @@ void *WsfHeapGetFreeStartAddress(void) /*************************************************************************************************/ uint32_t WsfHeapCountAvailable(void) { - if(freeStartAddr == 0) { - wsfHeapInit(); - } + struct mallinfo temp_mallinfo = mallinfo(); - return freeLen; + return temp_mallinfo.fordblks; } /*************************************************************************************************/ @@ -131,9 +102,5 @@ uint32_t WsfHeapCountAvailable(void) /*************************************************************************************************/ uint32_t WsfHeapCountUsed(void) { - if(freeStartAddr == 0) { - wsfHeapInit(); - } - - return (WSF_HEAP_SIZE - freeLen); + return heapUsed; } From 3bdf51490a750ab762b1fbe2430338f49751b686 Mon Sep 17 00:00:00 2001 From: Mert Ekren Date: Thu, 17 Oct 2024 21:52:18 +0300 Subject: [PATCH 03/25] fix(PeriphDrivers): Add GPIO Drive Strength Configuration for ME14 (#1223) Signed-off-by: Mert Ekren --- Libraries/PeriphDrivers/Source/GPIO/gpio_me14.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Libraries/PeriphDrivers/Source/GPIO/gpio_me14.c b/Libraries/PeriphDrivers/Source/GPIO/gpio_me14.c index 8caa986ae4..38e489f1c1 100644 --- a/Libraries/PeriphDrivers/Source/GPIO/gpio_me14.c +++ b/Libraries/PeriphDrivers/Source/GPIO/gpio_me14.c @@ -133,7 +133,12 @@ int MXC_GPIO_Config(const mxc_gpio_cfg_t *cfg) return E_BAD_PARAM; } - return E_NO_ERROR; + // Configure the drive strength + if (cfg->func == MXC_GPIO_FUNC_IN) { + return E_NO_ERROR; + } else { + return MXC_GPIO_SetDriveStrength(gpio, cfg->drvstr, cfg->mask); + } } /* ************************************************************************** */ From 8c24d39679abe46db46b3cc4b607439e04bc004d Mon Sep 17 00:00:00 2001 From: Furkan AKKIZ <94184469+hfakkiz@users.noreply.github.com> Date: Mon, 21 Oct 2024 18:29:00 +0300 Subject: [PATCH 04/25] fix(PeriphDrivers): Fix build warnings for MAX78002 ADC (#1235) Signed-off-by: Furkan Akkiz --- Libraries/PeriphDrivers/Source/ADC/adc_ai87.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Libraries/PeriphDrivers/Source/ADC/adc_ai87.c b/Libraries/PeriphDrivers/Source/ADC/adc_ai87.c index 6fa2ec4cf6..7a38c23184 100644 --- a/Libraries/PeriphDrivers/Source/ADC/adc_ai87.c +++ b/Libraries/PeriphDrivers/Source/ADC/adc_ai87.c @@ -37,9 +37,9 @@ */ #define MXC_F_MCR_ADCCFG2_CH 0x3 -#define TEMP_FACTOR 530.582f / 4096.0 -#define TEMP_FACTOR1V25 1.25 * TEMP_FACTOR -#define TEMP_FACTOR2V048 2.048 * TEMP_FACTOR +#define TEMP_FACTOR 530.582f / 4096.0f +#define TEMP_FACTOR1V25 1.25f * TEMP_FACTOR +#define TEMP_FACTOR2V048 2.048f * TEMP_FACTOR static void initGPIOForChannel(mxc_adc_chsel_t channel) { @@ -397,7 +397,7 @@ int MXC_ConvertTemperature_ToF(uint16_t tempSensor_Readout, mxc_adc_refsel_t ref float *temp) { if (MXC_ConvertTemperature_ToK(tempSensor_Readout, ref, ext_ref, temp) == E_NO_ERROR) { - *temp = ((*temp * 1.8) - 459.67f); + *temp = (*temp * 1.8f) - 459.67f; return E_NO_ERROR; } else { return E_BAD_PARAM; From 06330acc5f3c87c5f1c5992e25767bdeffcf9356 Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Mon, 21 Oct 2024 13:26:42 -0500 Subject: [PATCH 05/25] fix(BLE): Update PAL UART to derive clock via IBRO (#1236) --- .../platform/targets/maxim/max32655/sources/pal_uart.c | 10 ++-------- .../platform/targets/maxim/max32690/sources/pal_uart.c | 9 +-------- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/Libraries/Cordio/platform/targets/maxim/max32655/sources/pal_uart.c b/Libraries/Cordio/platform/targets/maxim/max32655/sources/pal_uart.c index 16dd4dd44a..231b2545c1 100644 --- a/Libraries/Cordio/platform/targets/maxim/max32655/sources/pal_uart.c +++ b/Libraries/Cordio/platform/targets/maxim/max32655/sources/pal_uart.c @@ -295,14 +295,8 @@ void PalUartInit(PalUartId_t id, const PalUartConfig_t *pCfg) palUartCb[uartNum].rdCback = pCfg->rdCback; palUartCb[uartNum].wrCback = pCfg->wrCback; - /* Initialize the UART */ - if(uartNum == 3) { - /* Use the IBRO clock for UART3 */ - result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_IBRO_CLK); - } else { - /* Use the APB clock for rest of the UARTs */ - result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_APB_CLK); - } + result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_IBRO_CLK); + (void)result; PAL_SYS_ASSERT(result == 0); diff --git a/Libraries/Cordio/platform/targets/maxim/max32690/sources/pal_uart.c b/Libraries/Cordio/platform/targets/maxim/max32690/sources/pal_uart.c index b5b49f3ccc..51f5af827a 100644 --- a/Libraries/Cordio/platform/targets/maxim/max32690/sources/pal_uart.c +++ b/Libraries/Cordio/platform/targets/maxim/max32690/sources/pal_uart.c @@ -301,14 +301,7 @@ void PalUartInit(PalUartId_t id, const PalUartConfig_t *pCfg) palUartCb[uartNum].rdCback = pCfg->rdCback; palUartCb[uartNum].wrCback = pCfg->wrCback; - /* Initialize the UART */ - if(uartNum == 3) { - /* Use the IBRO clock for UART3 */ - result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_IBRO_CLK); - } else { - /* Use the APB clock for rest of the UARTs */ - result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_APB_CLK); - } + result = MXC_UART_Init(MXC_UART_GET_UART(uartNum), pCfg->baud, MXC_UART_IBRO_CLK); (void)result; PAL_SYS_ASSERT(result == 0); From 6dd49f8b40a0d67994184b7e8f2420b50e4e21ff Mon Sep 17 00:00:00 2001 From: Sihyung Woo <75494566+sihyung-maxim@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:49:12 -0500 Subject: [PATCH 06/25] fix(workflow): Update clang-format-run-pr.yml to Node20.js and update permissions (#1233) --- .github/workflows/clang-format-run-pr.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/clang-format-run-pr.yml b/.github/workflows/clang-format-run-pr.yml index a11fd26161..f3815c3f74 100644 --- a/.github/workflows/clang-format-run-pr.yml +++ b/.github/workflows/clang-format-run-pr.yml @@ -27,14 +27,20 @@ on: permissions: actions: write + contents: write env: CLANG_VERSION: 14 jobs: - run-on-pr: - # Run on branchs, not forked PR branches + run-on-pr: + permissions: + contents: write + pull-requests: write + actions: write + + # Run on branches, not forked PR branches if: | contains(github.event.comment.body, '/clang-format-run') @@ -47,7 +53,7 @@ jobs: run: | sudo apt-get install clang-format-${CLANG_VERSION} - - uses: actions/github-script@v6 + - uses: actions/github-script@v7 id: get-pr with: script: | From f557dbf1716422a7f4b376e1c3a911076cc9820b Mon Sep 17 00:00:00 2001 From: Cristian Cruz <71054319+crsz20@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:34:17 -0500 Subject: [PATCH 07/25] fix(BLE): Resolve double increment of memory management in LlInitSetRtCfg (#1237) --- .github/workflows/BLE_Examples_Test.yml | 26 +++++++------------ .../Cordio/controller/sources/ble/init/init.c | 12 ++++++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/BLE_Examples_Test.yml b/.github/workflows/BLE_Examples_Test.yml index fb7db194fb..8e59e0816f 100644 --- a/.github/workflows/BLE_Examples_Test.yml +++ b/.github/workflows/BLE_Examples_Test.yml @@ -595,8 +595,6 @@ jobs: boards: | max32655_board1 max32655_board2 - max32665_board1 - max32690_board_w1 lock: true timeout: 3600 # Attempt to lock for an hour @@ -615,23 +613,21 @@ jobs: # sed -i "s/'S'/'!'/g" Examples/MAX32690/Bluetooth/BLE_otac/datc_main.c - name: Erase Boards DATS - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32665_DATS_CONNECTED_TEST == 'true' || env.MAX32690_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} uses: Analog-Devices-MSDK/btm-ci-scripts/actions/ocderase@v1.1 with: board: | max32655_board1 max32655_board2 - max32665_board1 - max32690_board_w1 has_two_flash_banks: | true true - true - true + # true + # true - name: Flash DATS 655 - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} uses: Analog-Devices-MSDK/btm-ci-scripts/actions/ocdflash@v1.1 with: board: | @@ -652,7 +648,7 @@ jobs: distclean: true - name: DATS 655 - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} run: | DATS_TEST_DIR=$TEST_DIR/dats DATS_BOARD_655=max32655_board1 @@ -662,17 +658,15 @@ jobs: - name: Erase Boards OTAS - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32665_DATS_CONNECTED_TEST == 'true' || env.MAX32690_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} uses: Analog-Devices-MSDK/btm-ci-scripts/actions/ocderase@v1.1 with: board: | max32655_board1 max32655_board2 - max32665_board1 - max32690_board_w1 - name: Flash OTAS - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32665_DATS_CONNECTED_TEST == 'true' || env.MAX32690_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} uses: Analog-Devices-MSDK/btm-ci-scripts/actions/ocdflash@v1.1 with: board: | @@ -695,13 +689,13 @@ jobs: distclean: true - name: OTAS - if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32665_DATS_CONNECTED_TEST == 'true' || env.MAX32690_DATS_CONNECTED_TEST == 'true'}} + if: ${{env.MAX32655_DATS_CONNECTED_TEST == 'true' || env.MAX32655_RUN_ALL_TEST == 'true'}} run: | OTAS_TEST_DIR=$TEST_DIR/otas OTAS_BOARD_655=max32655_board1 OTAC_BOARD_655=max32655_board2 - OTAC_BOARD_665=max32665_board1 - OTAC_BOARD_690=max32690_board_w1 + # OTAC_BOARD_665=max32665_board1 + # OTAC_BOARD_690=max32690_board_w1 if [[ $MAX32655_OTAS_CONNECTED_TEST == 'true' ]]; then diff --git a/Libraries/Cordio/controller/sources/ble/init/init.c b/Libraries/Cordio/controller/sources/ble/init/init.c index 92c5e6db7c..60e85ffa86 100644 --- a/Libraries/Cordio/controller/sources/ble/init/init.c +++ b/Libraries/Cordio/controller/sources/ble/init/init.c @@ -319,16 +319,22 @@ uint32_t LlInitSetLlRtCfg(const LlRtCfg_t *pLlRtCfg, uint8_t *pFreeMem, uint32_t /*************************************************************************************************/ uint32_t LlInitSetRtCfg(LlInitRtCfg_t *pCfg) { - uint32_t memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, + uint32_t totalMemUsed = 0; + uint32_t memUsed; + + memUsed = LlInitSetBbRtCfg(pCfg->pBbRtCfg, pCfg->wlSizeCfg, pCfg->rlSizeCfg, pCfg->plSizeCfg, pCfg->pFreeMem, pCfg->freeMemAvail); + pCfg->pFreeMem += memUsed; pCfg->freeMemAvail -= memUsed; + totalMemUsed += memUsed; - memUsed += LlInitSetLlRtCfg(pCfg->pLlRtCfg, pCfg->pFreeMem, pCfg->freeMemAvail); + memUsed = LlInitSetLlRtCfg(pCfg->pLlRtCfg, pCfg->pFreeMem, pCfg->freeMemAvail); pCfg->pFreeMem += memUsed; pCfg->freeMemAvail -= memUsed; + totalMemUsed += memUsed; - return memUsed; + return totalMemUsed; } /*************************************************************************************************/ From db69388844d29e727cd245b90b54279341f77401 Mon Sep 17 00:00:00 2001 From: Brandon Hurst <82959533+Brandon-Hurst@users.noreply.github.com> Date: Thu, 24 Oct 2024 11:53:34 -0700 Subject: [PATCH 08/25] fix(PeriphDrivers): Fix nvic-table.c warnings and remove unused DMA RevB drivers (#1229) --- Libraries/PeriphDrivers/Source/DMA/dma_revb.c | 507 ------------------ Libraries/PeriphDrivers/Source/DMA/dma_revb.h | 55 -- .../PeriphDrivers/Source/SYS/nvic_table.c | 12 +- 3 files changed, 6 insertions(+), 568 deletions(-) delete mode 100644 Libraries/PeriphDrivers/Source/DMA/dma_revb.c delete mode 100644 Libraries/PeriphDrivers/Source/DMA/dma_revb.h diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_revb.c b/Libraries/PeriphDrivers/Source/DMA/dma_revb.c deleted file mode 100644 index e91c33288e..0000000000 --- a/Libraries/PeriphDrivers/Source/DMA/dma_revb.c +++ /dev/null @@ -1,507 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by - * Analog Devices, Inc.), - * Copyright (C) 2023-2024 Analog Devices, 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. - * - ******************************************************************************/ - -/****** Includes *******/ -#include -#include -#include "mxc_device.h" -#include "mxc_assert.h" -#include "mxc_lock.h" -#include "mxc_sys.h" -#include "dma.h" -#include "dma_revb.h" - -/***** Definitions *****/ -#define CHECK_HANDLE(x) ((x >= 0) && (x < MXC_DMA_CHANNELS) && (dma_resource[x].valid)) - -typedef struct { - void *userCallback; // user given callback - void *dest; // memcpy destination -} mxc_dma_highlevel_t; - -typedef struct { - unsigned int valid; // Flag to invalidate this resource - unsigned int instance; // Hardware instance of this DMA controller - unsigned int id; // Channel ID, which matches the index into the underlying hardware - mxc_dma_ch_regs_t *regs; // Pointer to the registers for this channel - void (*cb)(int, int); // Pointer to a callback function type -} mxc_dma_channel_t; - -/******* Globals *******/ -static unsigned int dma_initialized = 0; -static mxc_dma_channel_t dma_resource[MXC_DMA_CHANNELS]; -static mxc_dma_highlevel_t memcpy_resource[MXC_DMA_CHANNELS]; -static uint32_t dma_lock; - -/****** Functions ******/ -static void memcpy_callback(int ch, int error); -static void transfer_callback(int ch, int error); - -int MXC_DMA_RevB_Init(void) -{ - int i; - - if (dma_initialized) { - return E_BAD_STATE; - } - - //TODO(ADI): Necessary? - ///* Initialize any system-level DMA settings */ - //SYS_DMA_Init(); - - /* Initialize mutex */ - MXC_FreeLock(&dma_lock); - - if (MXC_GetLock(&dma_lock, 1) != E_NO_ERROR) { - return E_BUSY; - } - - /* Ensure all channels are disabled at start, clear flags, init handles */ - MXC_DMA->inten = 0; - - for (i = 0; i < MXC_DMA_CHANNELS; i++) { - dma_resource[i].valid = 0; - dma_resource[i].instance = 0; - dma_resource[i].id = i; - dma_resource[i].regs = (mxc_dma_ch_regs_t *)&MXC_DMA->ch[i]; - dma_resource[i].regs->ctrl = 0; - dma_resource[i].regs->status = dma_resource[i].regs->status; - - dma_resource[i].cb = NULL; - } - - dma_initialized++; - MXC_FreeLock(&dma_lock); - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_AcquireChannel(void) -{ - int i, channel; - - /* Check for initialization */ - if (!dma_initialized) { - return E_BAD_STATE; - } - - /* If DMA is locked return busy */ - if (MXC_GetLock(&dma_lock, 1) != E_NO_ERROR) { - return E_BUSY; - } - - /* Default is no channel available */ - channel = E_NONE_AVAIL; - - if (dma_initialized) { - for (i = 0; i < MXC_DMA_CHANNELS; i++) { - if (!dma_resource[i].valid) { - /* Found one */ - channel = i; - dma_resource[i].valid = 1; - dma_resource[i].regs->ctrl = 0; - dma_resource[i].regs->cntrld = - 0; /* Used by DMA_Start() to conditionally set RLDEN */ - break; - } - } - } - - MXC_FreeLock(&dma_lock); - - return channel; -} - -int MXC_DMA_RevB_ReleaseChannel(int ch) -{ - if (CHECK_HANDLE(ch)) { - if (MXC_GetLock(&dma_lock, 1) != E_NO_ERROR) { - return E_BUSY; - } - - dma_resource[ch].valid = 0; - dma_resource[ch].regs->ctrl = 0; - dma_resource[ch].regs->status = dma_resource[ch].regs->status; - MXC_FreeLock(&dma_lock); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_ConfigChannel(mxc_dma_config_t config, mxc_dma_srcdst_t srcdst) -{ - if (CHECK_HANDLE(config.ch)) { - /* Designed to be safe, not speedy. Should not be called often */ - dma_resource[config.ch].regs->ctrl = - ((config.srcinc_en ? MXC_F_DMA_CTRL_SRCINC : 0) | - (config.dstinc_en ? MXC_F_DMA_CTRL_DSTINC : 0) | config.reqsel | - (config.srcwd << MXC_F_DMA_CTRL_SRCWD_POS) | - (config.dstwd << MXC_F_DMA_CTRL_DSTWD_POS)); - } else { - return E_BAD_PARAM; - } - - return MXC_DMA_RevB_SetSrcDst(srcdst); -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_AdvConfigChannel(mxc_dma_adv_config_t advConfig) -{ - if (CHECK_HANDLE(advConfig.ch) && (advConfig.burst_size > 0)) { - dma_resource[advConfig.ch].regs->ctrl &= ~(0x1F00FC0C); // Clear all fields we set here - /* Designed to be safe, not speedy. Should not be called often */ - dma_resource[advConfig.ch].regs->ctrl |= - ((advConfig.reqwait_en ? MXC_F_DMA_CTRL_TO_WAIT : 0) | advConfig.prio | - advConfig.tosel | advConfig.pssel | - (((advConfig.burst_size - 1) << MXC_F_DMA_CTRL_BURST_SIZE_POS) & - MXC_F_DMA_CTRL_BURST_SIZE)); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_SetSrcDst(mxc_dma_srcdst_t srcdst) -{ - if (CHECK_HANDLE(srcdst.ch)) { - dma_resource[srcdst.ch].regs->src = (unsigned int)srcdst.source; - dma_resource[srcdst.ch].regs->dst = (unsigned int)srcdst.dest; - dma_resource[srcdst.ch].regs->cnt = srcdst.len; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_GetSrcDst(mxc_dma_srcdst_t *srcdst) -{ - if (CHECK_HANDLE(srcdst.ch)) { - srcdst->source = (void *)dma_resource[srcdst->ch].regs->src; - srcdst->dest = (void *)dma_resource[srcdst->ch].regs->dst; - srcdst->len = (dma_resource[srcdst->ch].regs->cnt) & ~MXC_F_DMA_CNTRLD_EN; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_SetSrcReload(mxc_dma_srcdst_t srcdst) -{ - if (CHECK_HANDLE(srcdst.ch)) { - dma_resource[srcdst.ch].regs->srcrld = (unsigned int)srcdst.source; - dma_resource[srcdst.ch].regs->dstrld = (unsigned int)srcdst.dest; - - if (dma_resource[srcdst.ch].regs->ctrl & MXC_F_DMA_CTRL_EN) { - /* If channel is already running, set RLDEN to enable next reload */ - dma_resource[srcdst.ch].regs->cntrld = MXC_F_DMA_CNTRLD_EN | srcdst.len; - } else { - /* Otherwise, this is the initial setup, so DMA_Start() will handle setting that bit */ - dma_resource[srcdst.ch].regs->cntrld = srcdst.len; - } - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_GetSrcReload(mxc_dma_srcdst_t *srcdst) -{ - if (CHECK_HANDLE(srcdst.ch)) { - srcdst->source = (void *)dma_resource[srcdst->ch].regs->srcrld; - srcdst->dest = (void *)dma_resource[srcdst->ch].regs->dstrld; - srcdst->len = (dma_resource[srcdst->ch].regs->cntrld) & ~MXC_F_DMA_CNTRLD_EN; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_SetCallback(int ch, void (*callback)(int, int)) -{ - if (CHECK_HANDLE(ch)) { - /* Callback for interrupt handler, no checking is done, as NULL is valid for (none) */ - dma_resource[ch].cb = callback; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_SetChannelInterruptEn(int ch, int chdis, int ctz) -{ - return E_NOT_SUPPORTED; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_GetChannelInterruptEn(int ch) -{ - return E_NOT_SUPPORTED; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_ChannelEnableInt(int ch, int flags) -{ - if (CHECK_HANDLE(ch)) { - dma_resource[ch].regs->ctrl |= (flags & (MXC_F_DMA_CTRL_DIS_IE | MXC_F_DMA_CTRL_CTZ_IE)); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_ChannelDisableInt(int ch, int flags) -{ - if (CHECK_HANDLE(ch)) { - dma_resource[ch].regs->ctrl &= ~(flags & (MXC_F_DMA_CTRL_DIS_IE | MXC_F_DMA_CTRL_CTZ_IE)); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_EnableInt(int ch) -{ - if (CHECK_HANDLE(ch)) { - MXC_DMA->inten |= (1 << ch); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_DisableInt(int ch) -{ - if (CHECK_HANDLE(ch)) { - MXC_DMA->inten &= ~(1 << ch); - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_ChannelGetFlags(int ch) -{ - if (CHECK_HANDLE(ch)) { - return dma_resource[ch].regs->status; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_ChannelClearFlags(int ch, int flags) -{ - if (CHECK_HANDLE(ch)) { - dma_resource[ch].regs->status |= (flags & 0x5F); // Mask for Interrupt flags - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_Start(int ch) -{ - if (CHECK_HANDLE(ch)) { - MXC_DMA_ChannelClearFlags(ch, MXC_DMA_RevB_ChannelGetFlags(ch)); - - if (dma_resource[ch].regs->cntrld) { - dma_resource[ch].regs->ctrl |= (MXC_F_DMA_CTRL_EN | MXC_F_DMA_CTRL_RLDEN); - } else { - dma_resource[ch].regs->ctrl |= MXC_F_DMA_CTRL_EN; - } - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -int MXC_DMA_RevB_Stop(int ch) -{ - if (CHECK_HANDLE(ch)) { - dma_resource[ch].regs->ctrl &= ~MXC_F_DMA_CTRL_EN; - } else { - return E_BAD_PARAM; - } - - return E_NO_ERROR; -} - -mxc_dma_ch_regs_t *MXC_DMA_RevB_GetCHRegs(int ch) -{ - if (CHECK_HANDLE(ch)) { - return dma_resource[ch].regs; - } else { - return NULL; - } -} - -void MXC_DMA_RevB_Handler() -{ - /* Do callback, if enabled */ - for (int i = 0; i < MXC_DMA_CHANNELS; i++) { - if (CHECK_HANDLE(i)) { - if (MXC_DMA->intfl & (0x1 << i)) { - if (dma_resource[i].cb != NULL) { - dma_resource[i].cb(i, E_NO_ERROR); - } - - MXC_DMA_ChannelClearFlags(i, MXC_DMA_RevB_ChannelGetFlags(i)); - break; - } - } - } -} - -void memcpy_callback(int ch, int error) -{ - mxc_dma_complete_cb_t callback; - callback = (mxc_dma_complete_cb_t)memcpy_resource[ch].userCallback; - - if (error != E_NO_ERROR) { - callback(NULL); - } - - callback(memcpy_resource[ch].dest); - - callback = NULL; - MXC_DMA_ReleaseChannel(ch); -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback) -{ - int retval; - mxc_dma_config_t config; - mxc_dma_srcdst_t transfer; - int channel = MXC_DMA_AcquireChannel(); - - if (memcpy_resource[channel].userCallback != NULL) { - // We acquired a channel we haven't cleared yet - MXC_DMA_ReleaseChannel(channel); - return E_UNKNOWN; - } - - transfer.ch = channel; - transfer.source = src; - transfer.dest = dest; - transfer.len = len; - - config.ch = channel; - config.reqsel = MXC_DMA_REQUEST_MEMTOMEM; - config.srcwd = MXC_DMA_WIDTH_WORD; - config.dstwd = MXC_DMA_WIDTH_WORD; - config.srcinc_en = 1; - config.dstinc_en = 1; - - retval = MXC_DMA_ConfigChannel(config, transfer); - - if (retval != E_NO_ERROR) { - return retval; - } - - retval = MXC_DMA_EnableInt(channel); - - if (retval != E_NO_ERROR) { - return retval; - } - - retval = MXC_DMA_ChannelEnableInt(channel, MXC_F_DMA_CTRL_CTZ_IE); - - if (retval != E_NO_ERROR) { - return retval; - } - - MXC_DMA_SetCallback(channel, memcpy_callback); - - memcpy_resource[channel].userCallback = (void *)callback; - memcpy_resource[channel].dest = dest; - - return MXC_DMA_Start(channel); -} - -//TODO(ADI): Necessary? -void transfer_callback(int ch, int error) -{ - // Unimplemented - // Check for reason - // Call user callback for next transfer - // determine whether to load into the transfer slot or reload slot - // continue on or stop - while (1) {} -} - -//TODO(ADI): Necessary? -int MXC_DMA_RevB_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, - mxc_dma_trans_chain_t callback) -{ - int retval; - int channel = MXC_DMA_AcquireChannel(); - - if (memcpy_resource[channel].userCallback != NULL) { - // We acquired a channel we haven't cleared yet - MXC_DMA_ReleaseChannel(channel); - return E_UNKNOWN; - } - - retval = MXC_DMA_ConfigChannel(config, firstSrcDst); - - if (retval != E_NO_ERROR) { - return retval; - } - - retval = MXC_DMA_EnableInt(channel); - - if (retval != E_NO_ERROR) { - return retval; - } - - retval = MXC_DMA_ChannelEnableInt(channel, MXC_F_DMA_CTRL_CTZ_IE); - - if (retval != E_NO_ERROR) { - return retval; - } - - MXC_DMA_SetCallback(channel, transfer_callback); - - memcpy_resource[channel].userCallback = (void *)callback; - - return MXC_DMA_Start(channel); -} diff --git a/Libraries/PeriphDrivers/Source/DMA/dma_revb.h b/Libraries/PeriphDrivers/Source/DMA/dma_revb.h deleted file mode 100644 index dd81bc123c..0000000000 --- a/Libraries/PeriphDrivers/Source/DMA/dma_revb.h +++ /dev/null @@ -1,55 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by - * Analog Devices, Inc.), - * Copyright (C) 2023-2024 Analog Devices, 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. - * - ******************************************************************************/ - -#ifndef LIBRARIES_PERIPHDRIVERS_SOURCE_DMA_DMA_REVB_H_ -#define LIBRARIES_PERIPHDRIVERS_SOURCE_DMA_DMA_REVB_H_ - -/****** Includes *******/ - -/***** Definitions *****/ - -/******* Globals *******/ - -/****** Functions ******/ -int MXC_DMA_RevB_Init(void); -int MXC_DMA_RevB_AcquireChannel(void); -int MXC_DMA_RevB_ReleaseChannel(int ch); -int MXC_DMA_RevB_ConfigChannel(mxc_dma_config_t config, mxc_dma_srcdst_t srcdst); -int MXC_DMA_RevB_AdvConfigChannel(mxc_dma_adv_config_t advConfig); -int MXC_DMA_RevB_SetSrcDst(mxc_dma_srcdst_t srcdst); -int MXC_DMA_RevB_GetSrcDst(mxc_dma_srcdst_t *srcdst); -int MXC_DMA_RevB_SetSrcReload(mxc_dma_srcdst_t srcdst); -int MXC_DMA_RevB_GetSrcReload(mxc_dma_srcdst_t *srcdst); -int MXC_DMA_RevB_SetCallback(int ch, void (*callback)(int, int)); -int MXC_DMA_RevB_ChannelEnableInt(int ch, int flags); -int MXC_DMA_RevB_ChannelDisableInt(int ch, int flags); -int MXC_DMA_RevB_ChannelGetFlags(int ch); -int MXC_DMA_RevB_ChannelClearFlags(int ch, int flags); -int MXC_DMA_RevB_EnableInt(int ch); -int MXC_DMA_RevB_DisableInt(int ch); -int MXC_DMA_RevB_Start(int ch); -int MXC_DMA_RevB_Stop(int ch); -mxc_dma_ch_regs_t *MXC_DMA_RevB_GetCHRegs(int ch); -void MXC_DMA_RevB_Handler(); -int MXC_DMA_RevB_MemCpy(void *dest, void *src, int len, mxc_dma_complete_cb_t callback); -int MXC_DMA_RevB_DoTransfer(mxc_dma_config_t config, mxc_dma_srcdst_t firstSrcDst, - mxc_dma_trans_chain_t callback); - -#endif // LIBRARIES_PERIPHDRIVERS_SOURCE_DMA_DMA_REVB_H_ diff --git a/Libraries/PeriphDrivers/Source/SYS/nvic_table.c b/Libraries/PeriphDrivers/Source/SYS/nvic_table.c index 783f8ce7fc..2b2a792f6a 100644 --- a/Libraries/PeriphDrivers/Source/SYS/nvic_table.c +++ b/Libraries/PeriphDrivers/Source/SYS/nvic_table.c @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by * Analog Devices, Inc.), * Copyright (C) 2023-2024 Analog Devices, Inc. * @@ -35,15 +35,15 @@ __attribute__((aligned(512))) #endif static void (*ramVectorTable[MXC_IRQ_COUNT])(void); -void NVIC_SetRAM(void) -{ #if defined(__ICCARM__) - extern void (*const __isr_vector[])(void); +extern void (*const __isr_vector[])(void); #else - /* should be defined in starup_.S */ - extern uint32_t __isr_vector[MXC_IRQ_COUNT]; +/* should be defined in starup_.S */ +extern uint32_t __isr_vector[MXC_IRQ_COUNT]; #endif +void NVIC_SetRAM(void) +{ memcpy(&ramVectorTable, &__isr_vector, sizeof(ramVectorTable)); SCB->VTOR = (uint32_t)&ramVectorTable; } From d036f16d02086a23baa9ccb5903f0c7fd445f7e1 Mon Sep 17 00:00:00 2001 From: Sadik Ozer <46590392+ozersa@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:09:39 +0300 Subject: [PATCH 09/25] fix(PeriphDrivers): Fix Zephyr build issue with GPIO pad definitions (#1234) Signed-off-by: Sadik Ozer --- Libraries/PeriphDrivers/Include/MAX32657/gpio.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Libraries/PeriphDrivers/Include/MAX32657/gpio.h b/Libraries/PeriphDrivers/Include/MAX32657/gpio.h index cf1a7ad6c8..2c076b28ca 100644 --- a/Libraries/PeriphDrivers/Include/MAX32657/gpio.h +++ b/Libraries/PeriphDrivers/Include/MAX32657/gpio.h @@ -152,7 +152,9 @@ typedef enum { typedef enum { MXC_GPIO_PAD_NONE, /**< No pull-up or pull-down */ MXC_GPIO_PAD_WEAK_PULL_UP, /**< Set pad to weak pull-up */ - MXC_GPIO_PAD_WEAK_PULL_DOWN /**< Set pad to weak pull-down */ + MXC_GPIO_PAD_WEAK_PULL_DOWN, /**< Set pad to weak pull-down */ + MXC_GPIO_PAD_PULL_UP = MXC_GPIO_PAD_WEAK_PULL_UP, /**< Set pad to default (weak) pull-up */ + MXC_GPIO_PAD_PULL_DOWN = MXC_GPIO_PAD_WEAK_PULL_DOWN /**< Set pad to default (weak) pull-down */ } mxc_gpio_pad_t; /** From c75f2f7143b66b90dd6e699de4989b4437c893ae Mon Sep 17 00:00:00 2001 From: Brent K <129296493+BrentK-ADI@users.noreply.github.com> Date: Thu, 24 Oct 2024 15:10:10 -0400 Subject: [PATCH 10/25] fix(Other): Fix MAX32670 Timer Width for Zephyr build (#1232) Signed-off-by: Brent Kowal --- Libraries/zephyr/MAX/Include/wrap_max32_tmr.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Libraries/zephyr/MAX/Include/wrap_max32_tmr.h b/Libraries/zephyr/MAX/Include/wrap_max32_tmr.h index f3706dae73..310e90edfa 100644 --- a/Libraries/zephyr/MAX/Include/wrap_max32_tmr.h +++ b/Libraries/zephyr/MAX/Include/wrap_max32_tmr.h @@ -105,7 +105,8 @@ int Wrap_MXC_TMR_GetPendingInt(mxc_tmr_regs_t *tmr) (CONFIG_SOC_MAX32672) || (CONFIG_SOC_MAX32662) || (CONFIG_SOC_MAX32675) || \ (CONFIG_SOC_MAX32680) || (CONFIG_SOC_MAX32657) || (CONFIG_SOC_MAX78002) -#if defined(CONFIG_SOC_MAX32672) || (CONFIG_SOC_MAX32675) || (CONFIG_SOC_MAX32657) +#if defined(CONFIG_SOC_MAX32672) || (CONFIG_SOC_MAX32675) || (CONFIG_SOC_MAX32657) || \ + (CONFIG_SOC_MAX32670) /* All timers are 32bits */ #define WRAP_MXC_IS_32B_TIMER(idx) (1) #elif defined(CONFIG_SOC_MAX32662) From b329db03bf6dde1c203a9835e4f104b46b31120a Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:37:15 -0500 Subject: [PATCH 11/25] chore(Build): Grouped Common Source Files in libPeriphDriver.mk (#1238) Co-authored-by: EricB-ADI --- Libraries/CMSIS/Device/Maxim/GCC/mxc_version.mk | 6 +++--- Libraries/PeriphDrivers/Source/SYS/mxc_lock.c | 14 ++++++++++++-- Libraries/PeriphDrivers/libPeriphDriver.mk | 5 +++++ Libraries/PeriphDrivers/max32520_files.mk | 6 ------ Libraries/PeriphDrivers/max32570_files.mk | 5 ----- Libraries/PeriphDrivers/max32572_files.mk | 6 ------ Libraries/PeriphDrivers/max32650_files.mk | 6 ------ Libraries/PeriphDrivers/max32655_files.mk | 5 ----- Libraries/PeriphDrivers/max32657_files.mk | 5 ----- Libraries/PeriphDrivers/max32660_files.mk | 6 ------ Libraries/PeriphDrivers/max32662_files.mk | 6 ------ Libraries/PeriphDrivers/max32665_files.mk | 6 ------ Libraries/PeriphDrivers/max32670_files.mk | 6 ------ Libraries/PeriphDrivers/max32672_files.mk | 6 ------ Libraries/PeriphDrivers/max32675_files.mk | 6 ------ Libraries/PeriphDrivers/max32680_files.mk | 6 ------ Libraries/PeriphDrivers/max32690_files.mk | 6 ------ Libraries/PeriphDrivers/max78000_files.mk | 4 ---- Libraries/PeriphDrivers/max78002_files.mk | 15 +++------------ 19 files changed, 23 insertions(+), 102 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/mxc_version.mk b/Libraries/CMSIS/Device/Maxim/GCC/mxc_version.mk index a517a80306..cde4ab47d1 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/mxc_version.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/mxc_version.mk @@ -16,9 +16,9 @@ # ############################################################################## # Autogenerated version info for build system. -MSDK_VERSION_STRING := v2024_02-149-gb9966ca6d8 -MSDK_VERSION_YEAR := 2024 -MSDK_VERSION_MONTH := 2 +MSDK_VERSION_STRING := v2023_10-307-gf557dbf1716 +MSDK_VERSION_YEAR := 2023 +MSDK_VERSION_MONTH := 10 # Add root MAXIM_PATH to IPATH so compiler can locate msdk_version.h IPATH += $(MAXIM_PATH) diff --git a/Libraries/PeriphDrivers/Source/SYS/mxc_lock.c b/Libraries/PeriphDrivers/Source/SYS/mxc_lock.c index 1c1034c6df..b2afc9404a 100644 --- a/Libraries/PeriphDrivers/Source/SYS/mxc_lock.c +++ b/Libraries/PeriphDrivers/Source/SYS/mxc_lock.c @@ -52,13 +52,23 @@ void MXC_FreeLock(uint32_t *lock) /* ************************************************************************** */ int MXC_GetLock(uint32_t *lock, uint32_t value) { -#warning "Unimplemented for RISCV" + __disable_irq(); + if (*lock) { + __enable_irq(); + return E_BUSY; + } + + *lock = value; + + __asm volatile("fence rw, rw"); + __enable_irq(); return E_NO_ERROR; } /* ************************************************************************** */ void MXC_FreeLock(uint32_t *lock) { -#warning "Unimplemented for RISCV" + __asm volatile("fence" ::: "memory"); + *lock = 0; } #endif diff --git a/Libraries/PeriphDrivers/libPeriphDriver.mk b/Libraries/PeriphDrivers/libPeriphDriver.mk index 4ebba45947..4bed4f1232 100644 --- a/Libraries/PeriphDrivers/libPeriphDriver.mk +++ b/Libraries/PeriphDrivers/libPeriphDriver.mk @@ -61,6 +61,11 @@ endif include ${CMSIS_ROOT}/../PeriphDrivers/$(TARGET_LC)_files.mk +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c +PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c + # # Where to find header files for this project IPATH += $(PERIPH_DRIVER_INCLUDE_DIR) SRCS += $(PERIPH_DRIVER_C_FILES) diff --git a/Libraries/PeriphDrivers/max32520_files.mk b/Libraries/PeriphDrivers/max32520_files.mk index bb47b9673f..d4cb52ceb6 100644 --- a/Libraries/PeriphDrivers/max32520_files.mk +++ b/Libraries/PeriphDrivers/max32520_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_es17.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_es17.c @@ -113,5 +109,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_es17.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c - - diff --git a/Libraries/PeriphDrivers/max32570_files.mk b/Libraries/PeriphDrivers/max32570_files.mk index 54859c12f2..928ec9dc2c 100644 --- a/Libraries/PeriphDrivers/max32570_files.mk +++ b/Libraries/PeriphDrivers/max32570_files.mk @@ -52,9 +52,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me13.c # Source files) -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me13.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c @@ -169,5 +166,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me13.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c - - diff --git a/Libraries/PeriphDrivers/max32572_files.mk b/Libraries/PeriphDrivers/max32572_files.mk index 904c28b553..6a3f462e49 100644 --- a/Libraries/PeriphDrivers/max32572_files.mk +++ b/Libraries/PeriphDrivers/max32572_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me55.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me55.c @@ -131,5 +127,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me55.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c - - diff --git a/Libraries/PeriphDrivers/max32650_files.mk b/Libraries/PeriphDrivers/max32650_files.mk index c3281efbf4..93eb9ebdf8 100644 --- a/Libraries/PeriphDrivers/max32650_files.mk +++ b/Libraries/PeriphDrivers/max32650_files.mk @@ -50,10 +50,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me10.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me10.c @@ -160,5 +156,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/UART/uart_common.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me10.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c - - diff --git a/Libraries/PeriphDrivers/max32655_files.mk b/Libraries/PeriphDrivers/max32655_files.mk index b3f2e9ef95..19707aa9b7 100644 --- a/Libraries/PeriphDrivers/max32655_files.mk +++ b/Libraries/PeriphDrivers/max32655_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me17.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me17.c @@ -147,4 +143,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me17.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - diff --git a/Libraries/PeriphDrivers/max32657_files.mk b/Libraries/PeriphDrivers/max32657_files.mk index c50d8cdb28..a0b88d43d5 100644 --- a/Libraries/PeriphDrivers/max32657_files.mk +++ b/Libraries/PeriphDrivers/max32657_files.mk @@ -47,10 +47,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/sys_me30.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/pins_me30.c @@ -127,4 +123,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me30.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - diff --git a/Libraries/PeriphDrivers/max32660_files.mk b/Libraries/PeriphDrivers/max32660_files.mk index 6c3f4f962d..20a159fbfb 100644 --- a/Libraries/PeriphDrivers/max32660_files.mk +++ b/Libraries/PeriphDrivers/max32660_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me11.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me11.c @@ -111,5 +107,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me11.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c - - diff --git a/Libraries/PeriphDrivers/max32662_files.mk b/Libraries/PeriphDrivers/max32662_files.mk index 1e3b99be27..b9eacfa3d4 100644 --- a/Libraries/PeriphDrivers/max32662_files.mk +++ b/Libraries/PeriphDrivers/max32662_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me12.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me12.c @@ -128,5 +124,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me12.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c - - diff --git a/Libraries/PeriphDrivers/max32665_files.mk b/Libraries/PeriphDrivers/max32665_files.mk index 69bdaef746..8cc656a7c5 100644 --- a/Libraries/PeriphDrivers/max32665_files.mk +++ b/Libraries/PeriphDrivers/max32665_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me14.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me14.c @@ -160,5 +156,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_reva.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me14.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - - diff --git a/Libraries/PeriphDrivers/max32670_files.mk b/Libraries/PeriphDrivers/max32670_files.mk index 8def0d2943..0b14bac386 100644 --- a/Libraries/PeriphDrivers/max32670_files.mk +++ b/Libraries/PeriphDrivers/max32670_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me15.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me15.c @@ -120,5 +116,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me15.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c - - diff --git a/Libraries/PeriphDrivers/max32672_files.mk b/Libraries/PeriphDrivers/max32672_files.mk index 8d26f62135..aa23bd5ed6 100644 --- a/Libraries/PeriphDrivers/max32672_files.mk +++ b/Libraries/PeriphDrivers/max32672_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me21.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me21.c @@ -129,5 +125,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me21.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c - - diff --git a/Libraries/PeriphDrivers/max32675_files.mk b/Libraries/PeriphDrivers/max32675_files.mk index 7c0b0bddc9..06d746fc7d 100644 --- a/Libraries/PeriphDrivers/max32675_files.mk +++ b/Libraries/PeriphDrivers/max32675_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me16.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me15.c @@ -123,5 +119,3 @@ PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WDT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_common.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_me15.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c - - diff --git a/Libraries/PeriphDrivers/max32680_files.mk b/Libraries/PeriphDrivers/max32680_files.mk index c3d3fa15ac..915b38bfd7 100644 --- a/Libraries/PeriphDrivers/max32680_files.mk +++ b/Libraries/PeriphDrivers/max32680_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me20.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me17.c @@ -152,5 +148,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me17.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - - diff --git a/Libraries/PeriphDrivers/max32690_files.mk b/Libraries/PeriphDrivers/max32690_files.mk index 8c10ea90ee..a95e3c5428 100644 --- a/Libraries/PeriphDrivers/max32690_files.mk +++ b/Libraries/PeriphDrivers/max32690_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_me18.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_me18.c @@ -175,5 +171,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_me18.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - - diff --git a/Libraries/PeriphDrivers/max78000_files.mk b/Libraries/PeriphDrivers/max78000_files.mk index c1489dbf8d..d8b781edb3 100644 --- a/Libraries/PeriphDrivers/max78000_files.mk +++ b/Libraries/PeriphDrivers/max78000_files.mk @@ -49,10 +49,6 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_ai85.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_ai85.c diff --git a/Libraries/PeriphDrivers/max78002_files.mk b/Libraries/PeriphDrivers/max78002_files.mk index 8c0eca237b..7add3b5bef 100644 --- a/Libraries/PeriphDrivers/max78002_files.mk +++ b/Libraries/PeriphDrivers/max78002_files.mk @@ -49,16 +49,9 @@ PERIPH_DRIVER_INCLUDE_DIR += $(INCLUDE_DIR)/$(TARGET_UC)/ PINS_FILE ?= $(SOURCE_DIR)/SYS/pins_ai87.c # Source files -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_assert.c -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_delay.c -# TODO(JC): Implement mxc_lock for RISC-V. Skip for now. -ifneq "$(RISCV_CORE)" "1" -ifneq "$(RISCV_CORE)" "RV32" -# ^ NOTE(JC): Some legacy Makefiles use "RV32". We recommend using "1" in the UG -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/mxc_lock.c -endif -endif -PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/nvic_table.c + + + PERIPH_DRIVER_C_FILES += $(PINS_FILE) PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/SYS/sys_ai87.c @@ -180,5 +173,3 @@ PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WDT/wdt_revb.c PERIPH_DRIVER_INCLUDE_DIR += $(SOURCE_DIR)/WUT PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_ai87.c PERIPH_DRIVER_C_FILES += $(SOURCE_DIR)/WUT/wut_reva.c - - From 1ee96f58a0d9635530b01686c5e2a3691232b6cd Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:37:32 -0500 Subject: [PATCH 12/25] feat(CMSIS): Added NVIC_GetEnableIRQ for RV32 (#1240) --- .../CMSIS/5.9.0/Core/Include/core_rv32.h | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Libraries/CMSIS/5.9.0/Core/Include/core_rv32.h b/Libraries/CMSIS/5.9.0/Core/Include/core_rv32.h index f05f950688..7d880bb502 100644 --- a/Libraries/CMSIS/5.9.0/Core/Include/core_rv32.h +++ b/Libraries/CMSIS/5.9.0/Core/Include/core_rv32.h @@ -394,7 +394,31 @@ __STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) MXC_EVENT->event1_enable &= ~(1 << (IRQn - 32)); } } +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if((int32_t)(IRQn) < 0) + { + return 0u; + } + + const uint32_t irq_mask = (1 << IRQn); + if(IRQn < 32) + { + return (MXC_INTR->irq0_enable & irq_mask) && (MXC_EVENT->event0_enable && irq_mask) ? 1 : 0; + + } + + return (MXC_INTR->irq1_enable & irq_mask) && (MXC_EVENT->event1_enable && irq_mask) ? 1 : 0; +} __STATIC_INLINE void NVIC_EnableEVENT(IRQn_Type EVENT) { if (EVENT < 32) From 0f2ade3810f96f10bb659a07f1d31a258b6a9504 Mon Sep 17 00:00:00 2001 From: Brent K <129296493+BrentK-ADI@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:32:32 -0400 Subject: [PATCH 13/25] feat(Examples): Add MAX32690 TinyUSB MSC + External Flash Example (#1230) --- .../USB/TinyUSB/msc_ext_flash/.cproject | 86 ++++ .../USB/TinyUSB/msc_ext_flash/.project | 26 ++ .../.settings/language.settings.xml | 15 + .../org.eclipse.cdt.codan.core.prefs | 93 +++++ .../.settings/org.eclipse.cdt.core.prefs | 15 + .../TinyUSB/msc_ext_flash/.vscode/README.md | 47 +++ .../.vscode/c_cpp_properties.json | 53 +++ .../TinyUSB/msc_ext_flash/.vscode/flash.gdb | 17 + .../TinyUSB/msc_ext_flash/.vscode/launch.json | 133 ++++++ .../msc_ext_flash/.vscode/settings.json | 89 ++++ .../TinyUSB/msc_ext_flash/.vscode/tasks.json | 115 ++++++ .../USB/TinyUSB/msc_ext_flash/Makefile | 382 ++++++++++++++++++ .../USB/TinyUSB/msc_ext_flash/README.md | 39 ++ .../MAX32690/USB/TinyUSB/msc_ext_flash/main.c | 175 ++++++++ .../USB/TinyUSB/msc_ext_flash/msc_ext_flash.c | 283 +++++++++++++ .../msc_ext_flash/msc_ext_flash.launch | 62 +++ .../USB/TinyUSB/msc_ext_flash/project.mk | 22 + .../USB/TinyUSB/msc_ext_flash/tusb_config.h | 107 +++++ .../TinyUSB/msc_ext_flash/usb_descriptors.c | 206 ++++++++++ .../Boards/MAX32690/APARD/Source/board.c | 9 +- .../PeriphDrivers/Source/SPIXF/spixf_me18.c | 3 +- 21 files changed, 1975 insertions(+), 2 deletions(-) create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.cproject create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.project create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/language.settings.xml create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.core.prefs create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/README.md create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/c_cpp_properties.json create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/flash.gdb create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/launch.json create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/settings.json create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/tasks.json create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/Makefile create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/README.md create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/main.c create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.c create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.launch create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/project.mk create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/tusb_config.h create mode 100644 Examples/MAX32690/USB/TinyUSB/msc_ext_flash/usb_descriptors.c diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.cproject b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.cproject new file mode 100644 index 0000000000..d3ed5521b1 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.cproject @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.project b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.project new file mode 100644 index 0000000000..bc695b2bb1 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.project @@ -0,0 +1,26 @@ + + + msc_ext_flash + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/language.settings.xml b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/language.settings.xml new file mode 100644 index 0000000000..d32717b6f3 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/language.settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.codan.core.prefs b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000000..59c0b37ba7 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,93 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"} +org.eclipse.cdt.codan.checkers.nocommentinside=-Error +org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"} +org.eclipse.cdt.codan.checkers.nolinecomment=-Error +org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"} +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"C-Style cast instead of C++ cast\\")"} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true} +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Lack of copyright information\\")",regex\=>".*Copyright.*"} +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Goto statement used\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing cases in switch\\")"} +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing default in switch\\")",defaultWithAllEnums\=>false} +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing reference return value in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing self check in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Using directive in header\\")"} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem=-Error +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Virtual method call in constructor/destructor\\")"} +org.eclipse.cdt.qt.core.qtproblem=Warning +org.eclipse.cdt.qt.core.qtproblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>true,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>null} diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.core.prefs b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000000..d3d72624ab --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/value=EvKit_V1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/operation=replace +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/value=arm-none-eabi- +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/value=msc_ext_flash +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/value=MAX32690 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/append=true +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/appendContributed=true diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/README.md b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/README.md new file mode 100644 index 0000000000..5b355bd51c --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/README.md @@ -0,0 +1,47 @@ +# VSCode-Maxim + +_(If you're viewing this document from within Visual Studio Code you can press `CTRL+SHIFT+V` to open a Markdown preview window.)_ + +## Quick Links + +* [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/) +* [VSCode-Maxim Github](https://github.com/analogdevicesinc/VSCode-Maxim) + +## Introduction + +VSCode-Maxim is a set of [Visual Studio Code](https://code.visualstudio.com/) project configurations and utilities for enabling embedded development for [Analog Device's MSDK](https://github.com/analogdevicesinc/msdk) and the [MAX32xxx/MAX78xxx microcontrollers](https://www.analog.com/en/product-category/microcontrollers.html). + +The following features are supported: + +* Code editing with intellisense down to the register level +* Code compilation with the ability to easily re-target a project for different microcontrollers and boards +* Flashing programs +* GUI and command-line debugging + +## Dependencies + +* [Visual Studio Code](https://code.visualstudio.com/) + * [C/C++ VSCode Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) + * [Cortex-Debug Extension](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug) +* [Analog Devices MSDK](https://analogdevicesinc.github.io/msdk/) + +## Installation + +Install the MSDK, then set `"MAXIM_PATH"` in your _user_ VS Code settings. + +See [Getting Started with Visual Studio Code](https://analogdevicesinc.github.io/msdk/USERGUIDE/#getting-started-with-visual-studio-code) in the MSDK User Guide for detailed instructions. + +## Usage + +See the [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/#visual-studio-code) for detailed usage info. + +## Issue Tracker + +Bug reports, feature requests, and contributions are welcome via the [issues](https://github.com/analogdevicesinc/VSCode-Maxim/issues) tracker on Github. + +New issues should contain _at minimum_ the following information: + +* Visual Studio Code version #s (see `Help -> About`) +* C/C++ Extension version # +* Target microcontroller and evaluation platform +* The projects `.vscode` folder and `Makefile` (where applicable). Standard compression formats such as `.zip`, `.rar`, `.tar.gz`, etc. are all acceptable. diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/c_cpp_properties.json b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/c_cpp_properties.json new file mode 100644 index 0000000000..dfbed47b58 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/c_cpp_properties.json @@ -0,0 +1,53 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc.exe", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Linux", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Mac", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/flash.gdb b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/flash.gdb new file mode 100644 index 0000000000..8f22801a47 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/flash.gdb @@ -0,0 +1,17 @@ +define flash_m4 + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor reset halt +end + +define flash_m4_run + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor resume +end diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/launch.json b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/launch.json new file mode 100644 index 0000000000..01fe519904 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/launch.json @@ -0,0 +1,133 @@ +{ + "configurations": [ + { + "name": "Debug Arm (Cortex-debug)", + "cwd":"${workspaceRoot}", + "executable": "${workspaceFolder}/build/${config:program_file}", + "loadFiles": ["${workspaceFolder}/build/${config:program_file}"], + "symbolFiles": [{ + "file": "${workspaceFolder}/build/${config:symbol_file}" + }], + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "linux": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "windows": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "serverpath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "searchDir": ["${config:OCD_path}/scripts"], + "configFiles": ["interface/${config:M4_OCD_interface_file}", "target/${config:M4_OCD_target_file}"], + "interface": "swd", + "runToEntryPoint": "main", + "svdFile": "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include/${config:target}.svd" + }, + { + "name": "GDB (Arm M4)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/${config:program_file}", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3333", + "debugServerArgs": "-s ${config:OCD_path}/scripts -f interface/${config:M4_OCD_interface_file} -f target/${config:M4_OCD_target_file} -c \"init; reset halt\"", + "serverStarted": "Info : Listening on port 3333 for gdb connections", + "filterStderr": true, + "targetArchitecture": "arm", + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-arm.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text":"exec-file build/${config:program_file}" }, + { "text":"symbol-file build/${config:symbol_file}" }, + { "text":"target remote localhost:3333" }, + { "text":"monitor reset halt" }, + { "text":"set $pc=Reset_Handler"}, + { "text":"b main" } + ] + }, + { + "name": "GDB (RISC-V)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/buildrv/${config:program_file}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3334", + "debugServerArgs": "-c \"gdb_port 3334\" -s ${config:OCD_path}/scripts -f interface/${config:RV_OCD_interface_file} -f target/${config:RV_OCD_target_file}", + "serverStarted": "Info : Listening on port 3334 for gdb connections", + "filterStderr": true, + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "targetArchitecture": "arm", + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-riscv.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text": "set architecture riscv:rv32", "ignoreFailures": false }, + { "text":"exec-file build/${config:program_file}", "ignoreFailures": false }, + { "text":"symbol-file buildrv/${config:symbol_file}", "ignoreFailures": false }, + { "text":"target remote localhost:3334" }, + { "text":"b main" }, + { "text": "set $pc=Reset_Handler","ignoreFailures": false } + ] + } + ] +} diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/settings.json b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/settings.json new file mode 100644 index 0000000000..289c72d1f7 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/settings.json @@ -0,0 +1,89 @@ +{ + "terminal.integrated.env.windows": { + "Path":"${config:OCD_path};${config:ARM_GCC_path}/bin;${config:xPack_GCC_path}/bin;${config:MSYS_path}/usr/bin;${config:Make_path};${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.defaultProfile.windows": "Command Prompt", + + "terminal.integrated.env.linux": { + "PATH":"${config:OCD_path}:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.env.osx": { + "PATH":"${config:OCD_path}/bin:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + + "target":"MAX32690", + "board":"APARD", + + "project_name":"${workspaceFolderBasename}", + + "program_file":"${config:project_name}.elf", + "symbol_file":"${config:program_file}", + + "M4_OCD_interface_file":"cmsis-dap.cfg", + "M4_OCD_target_file":"max32690.cfg", + "RV_OCD_interface_file":"ftdi/olimex-arm-usb-ocd-h.cfg", + "RV_OCD_target_file":"${config:target}_riscv.cfg", + + "v_Arm_GCC":"10.3", + "v_xPack_GCC":"12.2.0-3.1", + + "OCD_path":"${config:MAXIM_PATH}/Tools/OpenOCD", + "ARM_GCC_path":"${config:MAXIM_PATH}/Tools/GNUTools/${config:v_Arm_GCC}", + "xPack_GCC_path":"${config:MAXIM_PATH}/Tools/xPack/riscv-none-elf-gcc/${config:v_xPack_GCC}", + "Make_path":"${config:MAXIM_PATH}/Tools/GNUTools/Make", + "MSYS_path":"${config:MAXIM_PATH}/Tools/MSYS2", + + "C_Cpp.default.includePath": [ + "${workspaceFolder}", + "${workspaceFolder}/**", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Include", + "${config:ARM_GCC_path}/arm-none-eabi/include", + "${config:ARM_GCC_path}/lib/gcc/arm-none-eabi/${config:v_Arm_GCC}/include", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Include/${config:target}", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/ExtMemory", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include/core", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include/dgb_log", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include/devclass", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include/enumerate", + "${config:MAXIM_PATH}/Libraries/MAXUSB/include/core/musbhsfc" + ], + "C_Cpp.default.browse.path": [ + "${workspaceFolder}", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Source", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Source", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Source", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen", + "${config:MAXIM_PATH}/Libraries/MiscDrivers", + "${config:MAXIM_PATH}/Libraries/MAXUSB/src/core", + "${config:MAXIM_PATH}/Libraries/MAXUSB/src/dbg_log", + "${config:MAXIM_PATH}/Libraries/MAXUSB/src/devclass", + "${config:MAXIM_PATH}/Libraries/MAXUSB/src/enumerate" + ], + "C_Cpp.default.defines": [ + + ], + "C_Cpp.default.forcedInclude": [ + "${workspaceFolder}/build/project_defines.h" + ] +} + diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/tasks.json b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/tasks.json new file mode 100644 index 0000000000..e95445e2b3 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/.vscode/tasks.json @@ -0,0 +1,115 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean", + "type": "shell", + "command": "make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean-periph", + "type": "shell", + "command": "make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "flash", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4 ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "flash & run", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4_run ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "erase flash", + "type": "shell", + "command": "openocd", + "args": [ + "-s", "${config:OCD_path}/scripts", + "-f", "interface/${config:M4_OCD_interface_file}", + "-f", "target/${config:M4_OCD_target_file}", + "-c", "\"init; reset halt; max32xxx mass_erase 0;\"", + "-c", "exit" + ], + "group":"build", + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "openocd (m4)", + "type": "shell", + "command": "openocd", + "args": [ + "-s", + "${config:OCD_path}/scripts", + "-f", + "interface/${config:M4_OCD_interface_file}", + "-f", + "target/${config:M4_OCD_target_file}", + "-c", + "\"init; reset halt\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "gdb (m4)", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--ex=\"cd ${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "--ex=\"target remote localhost:3333\"", + "--ex=\"monitor reset halt\"", + "--ex=\"b main\"", + "--ex=\"c\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + ] +} \ No newline at end of file diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/Makefile b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/Makefile new file mode 100644 index 0000000000..b210c698c0 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/Makefile @@ -0,0 +1,382 @@ +############################################################################### + # + # Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + # Analog Devices, Inc.), + # Copyright (C) 2023-2024 Analog Devices, 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. + # + ############################################################################## + +# ** Readme! ** +# Don't edit this file! This is the core Makefile for a MaximSDK +# project. The available configuration options can be overridden +# in "project.mk", on the command-line, or with system environment +# variables. + +# See https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system +# for more detailed instructions on how to use this system. + +# The detailed instructions mentioned above are easier to read than +# this file, but the comments found in this file also outline the +# available configuration variables. This file is organized into +# sub-sections, some of which expose config variables. + + +# ******************************************************************************* +# Set the target microcontroller and board to compile for. + +# Every TARGET microcontroller has some Board Support Packages (BSPs) that are +# available for it under the MaximSDK/Libraries/Boards/TARGET folder. The BSP +# that gets selected is MaximSDK/Libraries/Boards/TARGET/BOARD. + +# Configuration Variables: +# - TARGET : Override the default target microcontroller. Ex: TARGET=MAX78000 +# - BOARD : Override the default BSP (case sensitive). Ex: BOARD=EvKit_V1, BOARD=FTHR_RevA + + +ifeq "$(TARGET)" "" +# Default target microcontroller +TARGET := MAX32690 +TARGET_UC := MAX32690 +TARGET_LC := max32690 +else +# "TARGET" has been overridden in the environment or on the command-line. +# We need to calculate an upper and lowercase version of the part number, +# because paths on Linux and MacOS are case-sensitive. +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) +endif + +# Default board. +BOARD ?= APARD + +# ******************************************************************************* +# Locate the MaximSDK + +# This Makefile needs to know where to find the MaximSDK, and the MAXIM_PATH variable +# should point to the root directory of the MaximSDK installation. Setting this manually +# is usually only required if you're working on the command-line. + +# If MAXIM_PATH is not specified, we assume the project still lives inside of the MaximSDK +# and move up from this project's original location. + +# Configuration Variables: +# - MAXIM_PATH : Tell this Makefile where to find the MaximSDK. Ex: MAXIM_PATH=C:/MaximSDK + + +ifneq "$(MAXIM_PATH)" "" +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +# Locate some other useful paths... +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS +endif + +# ******************************************************************************* +# Include project Makefile. We do this after formulating TARGET, BOARD, and MAXIM_PATH +# in case project.mk needs to reference those values. However, we also include +# this as early as possible in the Makefile so that it can append to or override +# the variables below. + + +PROJECTMK ?= $(abspath ./project.mk) +include $(PROJECTMK) +$(info Loaded project.mk) +# PROJECTMK is also used by implicit rules and other libraries to add project.mk as a watch file + +# ******************************************************************************* +# Final path sanitization and re-calculation. No options here. + +ifeq "$(MAXIM_PATH)" "" +# MAXIM_PATH is still not defined... +DEPTH := ../../../../ +MAXIM_PATH := $(abspath $(DEPTH)) +$(warning Warning: MAXIM_PATH is not set! Set MAXIM_PATH in your environment or in project.mk to clear this warning.) +$(warning Warning: Attempting to use $(MAXIM_PATH) calculated from relative path) +else +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +endif + +# Final recalculation of LIBS_DIR/CMSIS_ROOT +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS + +# One final UC/LC check in case user set TARGET in project.mk +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) + +export TARGET +export TARGET_UC +export TARGET_LC +export CMSIS_ROOT +# TODO: Remove dependency on exports for these variables. + +# ******************************************************************************* +# Set up search paths, and auto-detect all source code on those paths. + +# The following paths are searched by default, where "./" is the project directory. +# ./ +# |- *.h +# |- *.c +# |-include (optional) +# |- *.h +# |-src (optional) +# |- *.c + +# Configuration Variables: +# - VPATH : Tell this Makefile to search additional locations for source (.c) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - IPATH : Tell this Makefile to search additional locations for header (.h) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - SRCS : Tell this Makefile to explicitly add a source (.c) file to the build. +# This is really only useful if you want to add a source file that isn't +# on any VPATH, in which case you can add the full path to the file here. +# You should use the "+=" operator with this option. +# Ex: SRCS += your/specific/source/file.c +# - AUTOSEARCH : Set whether this Makefile should automatically detect .c files on +# VPATH and add them to the build. This is enabled by default. Set +# to 0 to disable. If autosearch is disabled, source files must be +# manually added to SRCS. +# Ex: AUTOSEARCH = 0 + + +# Where to find source files for this project. +VPATH += . +VPATH += src +VPATH := $(VPATH) + +# Where to find header files for this project +IPATH += . +IPATH += include +IPATH := $(IPATH) + +AUTOSEARCH ?= 1 +ifeq ($(AUTOSEARCH), 1) +# Auto-detect all C/C++ source files on VPATH +SRCS += $(wildcard $(addsuffix /*.c, $(VPATH))) +SRCS += $(wildcard $(addsuffix /*.cpp, $(VPATH))) +endif + +# Collapse SRCS before passing them on to the next stage +SRCS := $(SRCS) + +# ******************************************************************************* +# Set the output filename + +# Configuration Variables: +# - PROJECT : Override the default output filename. Ex: PROJECT=MyProject + + +# The default value creates a file named after the target micro. Ex: MAX78000.elf +PROJECT ?= $(TARGET_LC) + +# ******************************************************************************* +# Compiler options + +# Configuration Variables: +# - DEBUG : Set DEBUG=1 to build explicitly for debugging. This adds some additional +# symbols and sets -Og as the default optimization level. +# - MXC_OPTIMIZE_CFLAGS : Override the default compiler optimization level. +# Ex: MXC_OPTIMIZE_CFLAGS = -O2 +# - PROJ_CFLAGS : Add additional compiler flags to the build. +# You should use the "+=" operator with this option. +# Ex: PROJ_CFLAGS += -Wextra +# - MFLOAT_ABI : Set the floating point acceleration level. +# The only options are "hard", "soft", or "softfp". +# Ex: MFLOAT_ABI = hard +# - LINKERFILE : Override the default linkerfile. +# Ex: LINKERFILE = customlinkerfile.ld +# - LINKERPATH : Override the default search location for $(LINKERFILE) +# The default search location is $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC +# If $(LINKERFILE) cannot be found at this path, then the root project +# directory will be used as a fallback. + +# Select 'GCC' or 'IAR' compiler +ifeq "$(COMPILER)" "" +COMPILER := GCC +endif + +# Set default compiler optimization levels +ifeq "$(MAKECMDGOALS)" "release" +# Default optimization level for "release" builds (make release) +MXC_OPTIMIZE_CFLAGS ?= -O2 +DEBUG = 0 +endif + +ifeq ($(DEBUG),1) +# Optimizes for debugging as recommended +# by GNU for code-edit-debug cycles +# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options +MXC_OPTIMIZE_CFLAGS := -Og +endif + +# Default level if not building for release or explicitly for debug +MXC_OPTIMIZE_CFLAGS ?= -Og + +# Set compiler flags +PROJ_CFLAGS += -Wall # Enable warnings +PROJ_CFLAGS += -DMXC_ASSERT_ENABLE + +# Set hardware floating point acceleration. +# Options are: +# - hard +# - soft +# - softfp (default if MFLOAT_ABI is not set) +MFLOAT_ABI ?= softfp +# MFLOAT_ABI must be exported to other Makefiles +export MFLOAT_ABI + +# This path contains system-level intialization files for the target micro. Add to the build. +VPATH += $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source + +# ******************************************************************************* +# Secure Boot Tools (SBT) + +# This section integrates the Secure Boot Tools. It's intended for use with +# microcontrollers that have a secure bootloader. + +# Enabling SBT integration will add some special rules, such as "make sla", "make scpa", etc. + +# Configuration variables: +# SBT : Toggle SBT integration. Set to 1 to enable, or 0 +# to disable +# MAXIM_SBT_DIR : Specify the location of the SBT tool binaries. This defaults to +# Tools/SBT in the MaximSDK. The standalone SBT installer will override +# this via an environment variable. +# TARGET_SEC : Specify the part number to be passed into the SBT. This should match +# the secure variant part #. The default value will depend on TARGET. +# For example, TARGET=MAX32650 will result in TARGET_SEC=MAX32651, and +# the default selection happens in Tools/SBT/SBT-config. +# However, if there are multiple secure part #s for the target +# microcontroller this variable may need to be changed. + +SBT ?= 0 +ifeq ($(SBT), 1) +MAXIM_SBT_DIR ?= $(MAXIM_PATH)/Tools/SBT +MAXIM_SBT_DIR := $(subst \,/,$(MAXIM_SBT_DIR)) +# ^ Must sanitize path for \ on Windows, since this may come from an environment +# variable. + +export MAXIM_SBT_DIR # SBTs must have this environment variable defined to work + +# SBT-config.mk and SBT-rules.mk are included further down this Makefile. + +endif # SBT + +# ******************************************************************************* +# Default goal selection. This section allows you to override the default goal +# that will run if no targets are specified on the command-line. +# (ie. just running 'make' instead of 'make all') + +# Configuration variables: +# .DEFAULT_GOAL : Set the default goal if no targets were specified on the +# command-line +# ** "override" must be used with this variable. ** +# Ex: "override .DEFAULT_GOAL = mygoal" + +ifeq "$(.DEFAULT_GOAL)" "" +ifeq ($(SBT),1) +override .DEFAULT_GOAL := sla +else +override .DEFAULT_GOAL := all +endif +endif + +# Developer note: 'override' is used above for legacy Makefile compatibility. +# gcc.mk/gcc_riscv.mk need to hard-set 'all' internally, so this new system +# uses 'override' to come in over the top without breaking old projects. + +# It's also necessary to explicitly set MAKECMDGOALS... +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + +# Enable colors when --sync-output is used. +# See https://www.gnu.org/software/make/manual/make.html#Terminal-Output (section 13.2) +ifneq ($(MAKE_TERMOUT),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +ifneq ($(FORCE_COLOR),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +# ******************************************************************************* +# Include SBT config. We need to do this here because it needs to know +# the current MAKECMDGOAL. +ifeq ($(SBT),1) +include $(MAXIM_PATH)/Tools/SBT/SBT-config.mk +endif + +# ******************************************************************************* +# Libraries + +# This section offers "toggle switches" to include or exclude the libraries that +# are available in the MaximSDK. Set a configuration variable to 1 to include the +# library in the build, or 0 to exclude. + +# Each library may also have its own library specific configuration variables. See +# Libraries/libs.mk for more details. + +# Configuration variables: +# - LIB_BOARD : Include the Board-Support Package (BSP) library. (Enabled by default) +# - LIB_PERIPHDRIVERS : Include the peripheral driver library. (Enabled by default) +# - LIB_CMSIS_DSP : Include the CMSIS-DSP library. +# - LIB_CORDIO : Include the Cordio BLE library +# - LIB_FCL : Include the Free Cryptographic Library (FCL) +# - LIB_FREERTOS : Include the FreeRTOS and FreeRTOS-Plus-CLI libraries +# - LIB_LC3 : Include the Low Complexity Communication Codec (LC3) library +# - LIB_LITTLEFS : Include the "little file system" (littleFS) library +# - LIB_LWIP : Include the lwIP library +# - LIB_MAXUSB : Include the MAXUSB library +# - LIB_SDHC : Include the SDHC library + +include $(LIBS_DIR)/libs.mk + + +# ******************************************************************************* +# Rules + +# Include the rules for building for this target. All other makefiles should be +# included before this one. +include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk + +# Include the rules that integrate the SBTs. SBTs are a special case that must be +# include after the core gcc rules to extend them. +ifeq ($(SBT), 1) +include $(MAXIM_PATH)/Tools/SBT/SBT-rules.mk +endif + + +# Get .DEFAULT_GOAL working. +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + + +all: +# Extend the functionality of the "all" recipe here + arm-none-eabi-size --format=berkeley $(BUILD_DIR)/$(PROJECT).elf + +libclean: + $(MAKE) -f ${PERIPH_DRIVER_DIR}/periphdriver.mk clean.periph + +clean: +# Extend the functionality of the "clean" recipe here + +# The rule to clean out all the build products. +distclean: clean libclean diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/README.md b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/README.md new file mode 100644 index 0000000000..7efab027ec --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/README.md @@ -0,0 +1,39 @@ +## Description + +The example demonstrates the use of USB Mass Storage driver class with TinyUSB. +The storage driver is connected to the External Flash device on the AD-APARD32690-SL board. + + +## Software + +### Project Usage + +Universal instructions on building, flashing, and debugging this project can be found in the **[MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/)**. + +### Project-Specific Build Notes + +tusb_config.h by default has logging disabled via the CFG_TUSB_DEBUG definition. +For TinyUSB console logging, set the debug level to 1, 2, or 3, with a higher value +indicating more verbose logging. + +## Required Connections + + +If using the AD-APARD32690-SL: +- Connect a USB cable between the PC and the P10 (USB-C) connector. +- Connect a MAXPICO Debug adapter to P9 (SWD Connector) +- Open a terminal application on the PC and connect to the MAXPICO's console UART at 115200, 8-N-1. + +## Expected Output + +By default, the console UART does not output any message. With CFG_TUSB_DEBUG set +to '2', the Console UART of the device will output these messages: + +``` +USBD init on controller 0, Highspeed = 1024 +sizeof(usbd_device_t) = 69 +sizeof(dcd_event_t) = 12 +sizeof(tu_fifo_t) = 12 +sizeof(tu_edpt_stream_t) = 24 +MSC init +``` diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/main.c b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/main.c new file mode 100644 index 0000000000..804d11e144 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/main.c @@ -0,0 +1,175 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Ha Thach (tinyusb.org) + * Copyright (c) 2024 Analog Devices, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include +#include +#include + +#include "bsp/board_api.h" +#include "tusb.h" +#include "led.h" +#include "pb.h" +#include "mxc_device.h" +#include "gcr_regs.h" +#include "mcr_regs.h" +#include "mxc_sys.h" +#include "Ext_Flash.h" + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF PROTYPES +//--------------------------------------------------------------------+ + +/* Blink pattern + * - 250 ms : device not mounted + * - 1000 ms : device mounted + * - 2500 ms : device is suspended + */ +enum { + BLINK_NOT_MOUNTED = 250, + BLINK_MOUNTED = 1000, + BLINK_SUSPENDED = 2500, +}; + +static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED; + +void led_blinking_task(void); +void spixf_disk_init(void); + +/*------------- MAIN -------------*/ +int main(void) +{ + board_init(); + + // init device stack on configured roothub port + tud_init(BOARD_TUD_RHPORT); + + if (board_init_after_tusb) { + board_init_after_tusb(); + } + + while (1) { + tud_task(); // tinyusb device task + led_blinking_task(); + } +} + +//--------------------------------------------------------------------+ +// Device callbacks +//--------------------------------------------------------------------+ + +// Invoked when device is mounted +void tud_mount_cb(void) +{ + blink_interval_ms = BLINK_MOUNTED; +} + +// Invoked when device is unmounted +void tud_umount_cb(void) +{ + blink_interval_ms = BLINK_NOT_MOUNTED; +} + +// Invoked when usb bus is suspended +// remote_wakeup_en : if host allow us to perform remote wakeup +// Within 7ms, device must draw an average of current less than 2.5 mA from bus +void tud_suspend_cb(bool remote_wakeup_en) +{ + (void)remote_wakeup_en; + blink_interval_ms = BLINK_SUSPENDED; +} + +// Invoked when usb bus is resumed +void tud_resume_cb(void) +{ + blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED; +} + +//--------------------------------------------------------------------+ +// BLINKING TASK +//--------------------------------------------------------------------+ +void led_blinking_task(void) +{ + static uint32_t start_ms = 0; + static bool led_state = false; + + // Blink every interval ms + if (board_millis() - start_ms < blink_interval_ms) + return; // not enough time + start_ms += blink_interval_ms; + + board_led_write(led_state); + led_state = 1 - led_state; // toggle +} + +//------------------------------------------------------------------------------ +// Wrapper functions to bridge TinyUSB BSP with MSDK BSP +//------------------------------------------------------------------------------ +void board_init(void) +{ + // 1ms tick timer + SysTick_Config(SystemCoreClock / 1000); + + MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_IPO); + MXC_MCR->ldoctrl |= MXC_F_MCR_LDOCTRL_0P9EN; + MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_USB); + MXC_SYS_Reset_Periph(MXC_SYS_RESET0_USB); + + spixf_disk_init(); +} + +void board_led_write(bool state) +{ + if (state) { + LED_On(0); + } else { + LED_Off(0); + } +} + +uint32_t board_button_read(void) +{ + return PB_Get(0); +} + +//--------------------------------------------------------------------+ +// Forward USB interrupt events to TinyUSB IRQ Handler +//--------------------------------------------------------------------+ +void USB_IRQHandler(void) +{ + tud_int_handler(0); +} + +volatile uint32_t system_ticks = 0; + +void SysTick_Handler(void) +{ + system_ticks++; +} + +uint32_t board_millis(void) +{ + return system_ticks; +} diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.c b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.c new file mode 100644 index 0000000000..e604c4cd1c --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.c @@ -0,0 +1,283 @@ +/****************************************************************************** + * + * Copyright (C) 2023-2024 Analog Devices, 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. + * + ******************************************************************************/ + +#include "bsp/board_api.h" +#include "tusb.h" + +#include "Ext_Flash.h" +#include "spixf.h" + +#define LBA_SIZE 512 /* Size of "logical blocks" in bytes */ +#define LBA_SIZE_SHIFT 9 /* The shift value used to convert between addresses and block numbers */ + +#if defined(EXT_FLASH_MX25) +#undef EXT_FLASH_BAUD +#define EXT_FLASH_BAUD 5000000 /* SPI clock rate to communicate with the external flash */ + +#define EXT_FLASH_SECTOR_SIZE 4096 /* Number of bytes in one sector of the external flash */ +#define EXT_FLASH_SECTOR_SIZE_SHIFT \ + 12 /* The shift value used to convert between addresses and block numbers */ +#define EXT_FLASH_NUM_SECTORS 2048 /* Total number of sectors in the external flash */ + +#define MXC_SPIXF_WIDTH Ext_Flash_DataLine_Quad /*Number of data lines*/ +#else +#error "Defined flash device not yet implemented!" +#endif + +#define LBA_PER_SECTOR (EXT_FLASH_SECTOR_SIZE >> LBA_SIZE_SHIFT) +#define INVALID_SECTOR \ + EXT_FLASH_NUM_SECTORS /* Use a sector number past the end of memory to indicate invalid */ + +#define NUM_LBA (EXT_FLASH_NUM_SECTORS * LBA_PER_SECTOR) + +static bool is_running = false; +static bool is_initialized = false; +static uint32_t active_sector_num = INVALID_SECTOR; +static uint8_t active_sector[EXT_FLASH_SECTOR_SIZE]; +static bool active_sector_dirty = false; + +void spixf_disk_init(void); +static uint32_t spixf_disk_get_sect_num(uint32_t lba); +static uint32_t spixf_disk_get_sect_addr(uint32_t lba); +static uint32_t spixf_disk_get_sect(uint32_t num); + +// Invoked to determine max LUN +uint8_t tud_msc_get_maxlun_cb(void) +{ + return 1; // single LUN +} + +// Invoked when received SCSI_CMD_INQUIRY +// Application fill vendor id, product id and revision with string up to 8, 16, 4 characters respectively +void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], + uint8_t product_rev[4]) +{ + (void)lun; // use same ID for both LUNs + + const char vid[] = "TinyUSB"; + const char pid[] = "Mass Storage"; + const char rev[] = "1.0"; + + memcpy(vendor_id, vid, strlen(vid)); + memcpy(product_id, pid, strlen(pid)); + memcpy(product_rev, rev, strlen(rev)); +} + +// Invoked when received Test Unit Ready command. +// return true allowing host to read/write this LUN e.g SD card inserted +bool tud_msc_test_unit_ready_cb(uint8_t lun) +{ + return is_initialized; +} + +// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size +// Application update block count and block size +void tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size) +{ + (void)lun; + + *block_count = NUM_LBA; + *block_size = LBA_SIZE; +} + +// Invoked when received Start Stop Unit command +// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage +// - Start = 1 : active mode, if load_eject = 1 : load disk storage +bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) +{ + (void)lun; + (void)power_condition; + + if (load_eject) { + if (start) { + // load disk storage + is_running = true; + } else { + // unload disk storage + //Sync dirty sector if any + spixf_disk_get_sect(INVALID_SECTOR); + is_running = false; + } + } + + return is_initialized; +} + +// Callback invoked when received READ10 command. +// Copy disk's data to buffer (up to bufsize) and return number of copied bytes. +int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, + uint32_t bufsize) +{ + uint32_t addr; + uint32_t s_num; + + if (lba >= NUM_LBA) { + return -1; + } + + /* Convert to external flash sector number. */ + s_num = spixf_disk_get_sect_num(lba); + + if (spixf_disk_get_sect(s_num)) { + /* Failed to write/read from external flash */ + return -1; + } + + /* Get the offset into the current sector */ + addr = spixf_disk_get_sect_addr(lba); + + memcpy(buffer, active_sector + addr + offset, bufsize); + + return (int32_t)bufsize; +} + +bool tud_msc_is_writable_cb(uint8_t lun) +{ + (void)lun; + + return true; +} + +// Callback invoked when received WRITE10 command. +// Process data in buffer to disk's storage and return number of written bytes +int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, + uint32_t bufsize) +{ + uint32_t addr; + uint32_t s_num; + + // out of ramdisk + if (lba >= NUM_LBA) { + return -1; + } + + /* Convert to external flash sector number. */ + s_num = spixf_disk_get_sect_num(lba); + + if (spixf_disk_get_sect(s_num)) { + /* Failed to write/read from external flash */ + return -1; + } + + /* Get the offset into the current sector */ + addr = spixf_disk_get_sect_addr(lba); + + memcpy(active_sector + addr + offset, buffer, bufsize); + active_sector_dirty = 1; + + return (int32_t)bufsize; +} + +// Callback invoked when received an SCSI command not in built-in list below +// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE +// - READ10 and WRITE10 has their own callbacks (MUST not be handled here) +int32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize) +{ + void const *response = NULL; + int32_t resplen = 0; + + // most scsi handled is input + bool in_xfer = true; + + switch (scsi_cmd[0]) { + default: + // Set Sense = Invalid Command Operation + tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00); + + // negative means error -> tinyusb could stall and/or response with failed status + return -1; + } + + // return resplen must not larger than bufsize + if (resplen > bufsize) + resplen = bufsize; + + if (response && (resplen > 0)) { + if (in_xfer) { + memcpy(buffer, response, (size_t)resplen); + } else { + // SCSI output + } + } + + return resplen; +} + +void spixf_disk_init() +{ + uint32_t id; + if (!is_initialized) { + Ext_Flash_Init(); + Ext_Flash_Reset(); + + if (MXC_SPIXF_WIDTH == Ext_Flash_DataLine_Quad) { + Ext_Flash_Quad(1); + } else { + Ext_Flash_Quad(0); + } + + id = Ext_Flash_ID(); + + is_initialized = true; + } +} + +static uint32_t spixf_disk_get_sect_num(uint32_t lba) +{ + /* Absolute_address = lba * LBA_SIZE */ + /* Sector_num = Absolute_address / EXT_FLASH_SECTOR_SIZE */ + /* Sector_num = lba * 512 / 4096 */ + return lba >> (EXT_FLASH_SECTOR_SIZE_SHIFT - LBA_SIZE_SHIFT); +} + +static uint32_t spixf_disk_get_sect_addr(uint32_t lba) +{ + /* eight 512 byte blocks in each sector */ + return (lba & (LBA_PER_SECTOR - 1)) << LBA_SIZE_SHIFT; +} + +static uint32_t spixf_disk_get_sect(uint32_t num) +{ + /* New sector requested? */ + if (active_sector_num != num) { + /* Is the current sector real? */ + if (active_sector_num != INVALID_SECTOR) { + /* Was it written to after it was read from memory? */ + if (active_sector_dirty) { + /* Erase the old data. */ + Ext_Flash_Erase(active_sector_num << EXT_FLASH_SECTOR_SIZE_SHIFT, + Ext_Flash_Erase_4K); + /* Write the new */ + Ext_Flash_Program_Page(active_sector_num << EXT_FLASH_SECTOR_SIZE_SHIFT, + active_sector, EXT_FLASH_SECTOR_SIZE, MXC_SPIXF_WIDTH); + /* Mark data as clean */ + active_sector_dirty = false; + } + } + + /* Requesting a new valid sector? */ + if (num != INVALID_SECTOR) { + Ext_Flash_Read(num << EXT_FLASH_SECTOR_SIZE_SHIFT, active_sector, EXT_FLASH_SECTOR_SIZE, + MXC_SPIXF_WIDTH); + active_sector_dirty = false; + active_sector_num = num; + } + } + + return 0; +} diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.launch b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.launch new file mode 100644 index 0000000000..2c69317c25 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/msc_ext_flash.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/project.mk b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/project.mk new file mode 100644 index 0000000000..b23b3de691 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/project.mk @@ -0,0 +1,22 @@ +# This file can be used to set build configuration +# variables. These variables are defined in a file called +# "Makefile" that is located next to this one. + +# For instructions on how to use this system, see +# https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system + +# ********************************************************** + +# If you have secure version of MCU, set SBT=1 to generate signed binary +# For more information on how sing process works, see +# https://www.analog.com/en/education/education-library/videos/6313214207112.html +SBT=0 + +# Enable TINYUSB library +LIB_TINYUSB=1 +TINYUSB_CONFIG_DIR = ./ + +# The APARD board is the only EvKit with onboard SPIXF Flash +ifneq ($(BOARD),APARD) +$(error ERR_NOTSUPPORTED: This project is only supported for the AD-APARD32690 board) +endif diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/tusb_config.h b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/tusb_config.h new file mode 100644 index 0000000000..2554a6586b --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/tusb_config.h @@ -0,0 +1,107 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Ha Thach (tinyusb.org) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#ifndef EXAMPLES_MAX32690_USB_TINYUSB_MSC_EXT_FLASH_TUSB_CONFIG_H_ +#define EXAMPLES_MAX32690_USB_TINYUSB_MSC_EXT_FLASH_TUSB_CONFIG_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +//--------------------------------------------------------------------+ +// Board Specific Configuration +//--------------------------------------------------------------------+ + +// RHPort number used for device can be defined by board.mk, default to port 0 +#ifndef BOARD_TUD_RHPORT +#define BOARD_TUD_RHPORT 0 +#endif + +// RHPort max operational speed can defined by board.mk +#ifndef BOARD_TUD_MAX_SPEED +#define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED +#endif + +//-------------------------------------------------------------------- +// COMMON CONFIGURATION +//-------------------------------------------------------------------- + +// defined by compiler flags for flexibility +#ifndef CFG_TUSB_MCU +#error CFG_TUSB_MCU must be defined +#endif + +#ifndef CFG_TUSB_OS +#define CFG_TUSB_OS OPT_OS_NONE +#endif + +#ifndef CFG_TUSB_DEBUG +#define CFG_TUSB_DEBUG 0 +#endif + +// Enable Device stack +#define CFG_TUD_ENABLED 1 + +// Default is max speed that hardware controller could support with on-chip PHY +#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED + +/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment. + * Tinyusb use follows macros to declare transferring memory so that they can be put + * into those specific section. + * e.g + * - CFG_TUSB_MEM SECTION : __attribute__ (( section(".usb_ram") )) + * - CFG_TUSB_MEM_ALIGN : __attribute__ ((aligned(4))) + */ +#ifndef CFG_TUSB_MEM_SECTION +#define CFG_TUSB_MEM_SECTION +#endif + +#ifndef CFG_TUSB_MEM_ALIGN +#define CFG_TUSB_MEM_ALIGN __attribute__((aligned(4))) +#endif + +//-------------------------------------------------------------------- +// DEVICE CONFIGURATION +//-------------------------------------------------------------------- + +#ifndef CFG_TUD_ENDPOINT0_SIZE +#define CFG_TUD_ENDPOINT0_SIZE 64 +#endif + +//------------- CLASS -------------// +#define CFG_TUD_CDC 0 +#define CFG_TUD_MSC 1 +#define CFG_TUD_HID 0 +#define CFG_TUD_MIDI 0 +#define CFG_TUD_VENDOR 0 + +// MSC Buffer size of Device Mass storage +#define CFG_TUD_MSC_EP_BUFSIZE 512 + +#ifdef __cplusplus +} +#endif + +#endif // EXAMPLES_MAX32690_USB_TINYUSB_MSC_EXT_FLASH_TUSB_CONFIG_H_ diff --git a/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/usb_descriptors.c b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/usb_descriptors.c new file mode 100644 index 0000000000..0c6bfd7fa6 --- /dev/null +++ b/Examples/MAX32690/USB/TinyUSB/msc_ext_flash/usb_descriptors.c @@ -0,0 +1,206 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2019 Ha Thach (tinyusb.org) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +#include "bsp/board_api.h" +#include "tusb.h" + +/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug. + * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC. + * + * Auto ProductID layout's Bitmap: + * [MSB] HID | MSC | CDC [LSB] + */ +#define _PID_MAP(itf, n) ((CFG_TUD_##itf) << (n)) +#define USB_PID \ + (0x4000 | _PID_MAP(CDC, 0) | _PID_MAP(MSC, 1) | _PID_MAP(HID, 2) | _PID_MAP(MIDI, 3) | \ + _PID_MAP(VENDOR, 4)) + +//--------------------------------------------------------------------+ +// Device Descriptors +//--------------------------------------------------------------------+ +tusb_desc_device_t const desc_device = { .bLength = sizeof(tusb_desc_device_t), + .bDescriptorType = TUSB_DESC_DEVICE, + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE, + + .idVendor = 0xCafe, + .idProduct = USB_PID, + .bcdDevice = 0x0100, + + .iManufacturer = 0x01, + .iProduct = 0x02, + .iSerialNumber = 0x03, + + .bNumConfigurations = 0x01 }; + +// Invoked when received GET DEVICE DESCRIPTOR +// Application return pointer to descriptor +uint8_t const *tud_descriptor_device_cb(void) +{ + return (uint8_t const *)&desc_device; +} + +//--------------------------------------------------------------------+ +// Configuration Descriptor +//--------------------------------------------------------------------+ + +enum { ITF_NUM_MSC, ITF_NUM_TOTAL }; + +#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN) + +#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || \ + CFG_TUSB_MCU == OPT_MCU_LPC40XX +// LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number +// 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ... +#define EPNUM_MSC_OUT 0x02 +#define EPNUM_MSC_IN 0x82 + +#elif CFG_TUSB_MCU == OPT_MCU_SAMG +// SAMG doesn't support a same endpoint number with different direction IN and OUT +// e.g EP1 OUT & EP1 IN cannot exist together +#define EPNUM_MSC_OUT 0x01 +#define EPNUM_MSC_IN 0x82 + +#elif CFG_TUSB_MCU == OPT_MCU_FT90X || CFG_TUSB_MCU == OPT_MCU_FT93X +// FT9XX doesn't support a same endpoint number with different direction IN and OUT +// e.g EP1 OUT & EP1 IN cannot exist together +#define EPNUM_MSC_OUT 0x01 +#define EPNUM_MSC_IN 0x82 + +#elif CFG_TUSB_MCU == OPT_MCU_MAX32690 || CFG_TUSB_MCU == OPT_MCU_MAX32650 || \ + CFG_TUSB_MCU == OPT_MCU_MAX32666 || CFG_TUSB_MCU == OPT_MCU_MAX78002 +// MAX32 doesn't support a same endpoint number with different direction IN and OUT +// e.g EP1 OUT & EP1 IN cannot exist together +#define EPNUM_MSC_OUT 0x01 +#define EPNUM_MSC_IN 0x82 + +#else +#define EPNUM_MSC_OUT 0x01 +#define EPNUM_MSC_IN 0x81 + +#endif + +uint8_t const desc_fs_configuration[] = { + // Config number, interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), + + // Interface number, string index, EP Out & EP In address, EP size + TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 0, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64), +}; + +#if TUD_OPT_HIGH_SPEED +uint8_t const desc_hs_configuration[] = { + // Config number, interface count, string index, total length, attribute, power in mA + TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100), + + // Interface number, string index, EP Out & EP In address, EP size + TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 0, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512), +}; +#endif + +// Invoked when received GET CONFIGURATION DESCRIPTOR +// Application return pointer to descriptor +// Descriptor contents must exist long enough for transfer to complete +uint8_t const *tud_descriptor_configuration_cb(uint8_t index) +{ + (void)index; // for multiple configurations + +#if TUD_OPT_HIGH_SPEED + // Although we are highspeed, host may be fullspeed. + return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration; +#else + return desc_fs_configuration; +#endif +} + +//--------------------------------------------------------------------+ +// String Descriptors +//--------------------------------------------------------------------+ + +// String Descriptor Index +enum { + STRID_LANGID = 0, + STRID_MANUFACTURER, + STRID_PRODUCT, + STRID_SERIAL, +}; + +// array of pointer to string descriptors +char const *string_desc_arr[] = { + (const char[]){ 0x09, 0x04 }, // 0: is supported language is English (0x0409) + "TinyUSB", // 1: Manufacturer + "TinyUSB Device", // 2: Product + NULL, // 3: Serials will use unique ID if possible +}; + +static uint16_t _desc_str[32 + 1]; + +// Invoked when received GET STRING DESCRIPTOR request +// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete +uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) +{ + (void)langid; + size_t chr_count; + + switch (index) { + case STRID_LANGID: + memcpy(&_desc_str[1], string_desc_arr[0], 2); + chr_count = 1; + break; + + case STRID_SERIAL: + chr_count = board_usb_get_serial(_desc_str + 1, 32); + break; + + default: + // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors. + // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors + + if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) + return NULL; + + const char *str = string_desc_arr[index]; + + // Cap at max char + chr_count = strlen(str); + size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type + if (chr_count > max_count) + chr_count = max_count; + + // Convert ASCII string into UTF-16 + for (size_t i = 0; i < chr_count; i++) { + _desc_str[1 + i] = str[i]; + } + break; + } + + // first byte is length (including header), second byte is string type + _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2)); + + return _desc_str; +} diff --git a/Libraries/Boards/MAX32690/APARD/Source/board.c b/Libraries/Boards/MAX32690/APARD/Source/board.c index 0889bad344..249e68aef6 100644 --- a/Libraries/Boards/MAX32690/APARD/Source/board.c +++ b/Libraries/Boards/MAX32690/APARD/Source/board.c @@ -85,7 +85,14 @@ __weak void GPIO2_IRQHandler(void) /******************************************************************************/ static int ext_flash_board_init(void) { - return MXC_SPIXF_Init(0, EXT_FLASH_BAUD); + int err; + + err = MXC_SPIXF_Init(0x0B, EXT_FLASH_BAUD); + + if (err == E_NO_ERROR) { + MXC_SPIXF_Enable(); + } + return err; } /******************************************************************************/ diff --git a/Libraries/PeriphDrivers/Source/SPIXF/spixf_me18.c b/Libraries/PeriphDrivers/Source/SPIXF/spixf_me18.c index 361429a705..6c295cb011 100644 --- a/Libraries/PeriphDrivers/Source/SPIXF/spixf_me18.c +++ b/Libraries/PeriphDrivers/Source/SPIXF/spixf_me18.c @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + * Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by * Analog Devices, Inc.), * Copyright (C) 2023-2024 Analog Devices, Inc. * @@ -35,6 +35,7 @@ int MXC_SPIXF_Init(uint32_t cmdval, uint32_t frequency) #ifndef MSDK_NO_GPIO_CLK_INIT MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPIXIP); // SPIX MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_SPIXIPC); // SPIXFC + MXC_GPIO_Config(&gpio_cfg_spixf); #endif return MXC_SPIXF_RevA_Init((mxc_spixfc_reva_regs_t *)MXC_SPIXFC, From c0561a995c4b007bf8c9e39215a79c5fe6d8071a Mon Sep 17 00:00:00 2001 From: Sihyung Woo <75494566+sihyung-maxim@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:52:30 -0500 Subject: [PATCH 14/25] fix(Other): Add `delete me warning` in PR template (#1189) --- .github/pull_request_template.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e443c4cb48..1643dca995 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,5 +1,3 @@ -## Pull Request Template - ### Description Please include a summary of the changes and related issues. Please also include relevant motivation and context. @@ -11,6 +9,12 @@ Please include a summary of the changes and related issues. Please also include - [ ] (Optional) Link any related GitHub issues [using a keyword](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword) - [ ] (Optional) Provide info on any relevant functional testing/validation. For API changes or significant features, this is not optional. +_______________________________________________________________________________ + +> [!WARNING] +> This is a template. Delete everything below the line when submitting a pull request. + + ### PR Title Guidelines The MSDK repo follows a custom rule set based on the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) standard. The pull request titles will follow this format: From 1eba0397fd5078b8de5442c93edb4978a947c15f Mon Sep 17 00:00:00 2001 From: Lorne Smith <65424047+lorne-maxim@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:06:51 -0500 Subject: [PATCH 15/25] build(Other): Fix incorrect variable name used for NFC library selection for MAX32670, MAX32671, and MAX32672 (#1244) --- Libraries/libs.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Libraries/libs.mk b/Libraries/libs.mk index bb5428c64d..0e2c97e7a2 100644 --- a/Libraries/libs.mk +++ b/Libraries/libs.mk @@ -281,13 +281,13 @@ ifneq ($(DEV_LIB_NFC),1) # Add to include directory list IPATH += $(LIB_NFC_PCD_PBM_DIR)/include PROJ_LDFLAGS += -L$(LIB_NFC_PCD_PBM_DIR) -PROJ_LIBS += nfc_pcd_pbm_$(LIBRARY_VARIANT) +PROJ_LIBS += nfc_pcd_pbm_$(MFLOAT_ABI) # Add to include directory list IPATH += $(LIB_NFC_PCD_RF_DRIVER_DIR)/include IPATH += $(LIB_NFC_PCD_RF_DRIVER_DIR)/include/nfc PROJ_LDFLAGS += -L$(LIB_NFC_PCD_RF_DRIVER_DIR) -PROJ_LIBS += nfc_pcd_rf_driver_MAX32570_$(LIBRARY_VARIANT) +PROJ_LIBS += nfc_pcd_rf_driver_MAX32570_$(MFLOAT_ABI) else # Development setup (DEV_LIB_NFC=1) for building libraries From be46ff67f58f2bb2e82be70deab18a47eb4642c4 Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Mon, 4 Nov 2024 15:22:10 -0600 Subject: [PATCH 16/25] chore(BLE): Added Declaration for PalBbIsEnabled (#1252) --- Libraries/Cordio/platform/include/pal_bb.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Libraries/Cordio/platform/include/pal_bb.h b/Libraries/Cordio/platform/include/pal_bb.h index 0fc16a6661..aba61dbeda 100644 --- a/Libraries/Cordio/platform/include/pal_bb.h +++ b/Libraries/Cordio/platform/include/pal_bb.h @@ -210,6 +210,15 @@ void PalBbRestore(void); /*************************************************************************************************/ void PalBbEnable(void); +/*************************************************************************************************/ +/*! + * \brief Checks to see if BB is enabled. + * + * \return true is BB is enabled + */ +/*************************************************************************************************/ +bool PalBbIsEnabled(void); + /*************************************************************************************************/ /*! * \brief Disable the BB hardware. From 092782af683c4e6e666bef9190b0b2ab16673df1 Mon Sep 17 00:00:00 2001 From: Jake Carter Date: Tue, 5 Nov 2024 13:00:57 -0700 Subject: [PATCH 17/25] fix(Build): Fix `IPATH` not Affecting PeriphDriver Sub-Makes (#1256) --- Libraries/PeriphDrivers/periphdriver.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/PeriphDrivers/periphdriver.mk b/Libraries/PeriphDrivers/periphdriver.mk index 6e873ef2c8..a1ed9bff8a 100644 --- a/Libraries/PeriphDrivers/periphdriver.mk +++ b/Libraries/PeriphDrivers/periphdriver.mk @@ -99,7 +99,7 @@ export PERIPH_DRIVER_BUILD_DIR LIBS += ${PERIPH_DRIVER_BUILD_DIR}/${PERIPH_DRIVER_LIB} # Add rule to build the Driver Library ${PERIPH_DRIVER_BUILD_DIR}/${PERIPH_DRIVER_LIB}: ${PERIPH_DRIVER_C_FILES} ${PERIPH_DRIVER_A_FILES} ${PROJECTMK} - @$(MAKE) -f ${PERIPH_DRIVER_DIR}/libPeriphDriver.mk lib BUILD_DIR=${PERIPH_DRIVER_BUILD_DIR} PROJ_CFLAGS="$(PROJ_CFLAGS)" PROJ_LDFLAGS="$(PROJ_LDFLAGS)" MXC_OPTIMIZE_CFLAGS=$(MXC_OPTIMIZE_CFLAGS) MFLOAT_ABI=$(MFLOAT_ABI) DUAL_CORE=$(DUAL_CORE) RISCV_CORE=$(RISCV_CORE) PROJECTMK=$(PROJECTMK) PERIPH_DRIVER_LIB_FILENAME=$(PERIPH_DRIVER_LIB_FILENAME) + @$(MAKE) -f ${PERIPH_DRIVER_DIR}/libPeriphDriver.mk lib BUILD_DIR=${PERIPH_DRIVER_BUILD_DIR} PROJ_CFLAGS="$(PROJ_CFLAGS)" PROJ_LDFLAGS="$(PROJ_LDFLAGS)" MXC_OPTIMIZE_CFLAGS=$(MXC_OPTIMIZE_CFLAGS) IPATH="$(IPATH)" MFLOAT_ABI=$(MFLOAT_ABI) DUAL_CORE=$(DUAL_CORE) RISCV_CORE=$(RISCV_CORE) PROJECTMK=$(PROJECTMK) PERIPH_DRIVER_LIB_FILENAME=$(PERIPH_DRIVER_LIB_FILENAME) clean.periph: @$(MAKE) -f ${PERIPH_DRIVER_DIR}/libPeriphDriver.mk BUILD_DIR=${PERIPH_DRIVER_BUILD_DIR} PERIPH_DRIVER_LIB_FILENAME=$(PERIPH_DRIVER_LIB_FILENAME) clean From e0967e11ac83a6e47d753aa60281ad1fcb2a4196 Mon Sep 17 00:00:00 2001 From: Kevin Gillespie Date: Wed, 6 Nov 2024 17:01:37 -0600 Subject: [PATCH 18/25] feat(BLE): Adding Bluetooth example for MAX32657 (#1246) --- .../MAX32657/Bluetooth/BLE5_ctr/.cproject | 93 + Examples/MAX32657/Bluetooth/BLE5_ctr/.project | 26 + .../BLE5_ctr/.settings/language.settings.xml | 15 + .../org.eclipse.cdt.codan.core.prefs | 93 + .../.settings/org.eclipse.cdt.core.prefs | 15 + .../Bluetooth/BLE5_ctr/.vscode/README.md | 47 + .../BLE5_ctr/.vscode/c_cpp_properties.json | 53 + .../Bluetooth/BLE5_ctr/.vscode/flash.gdb | 17 + .../Bluetooth/BLE5_ctr/.vscode/launch.json | 133 + .../Bluetooth/BLE5_ctr/.vscode/settings.json | 101 + .../Bluetooth/BLE5_ctr/.vscode/tasks.json | 115 + .../Bluetooth/BLE5_ctr/ARM/Abstract.txt | 1 + .../MAX32657/Bluetooth/BLE5_ctr/ARM/BLE.sct | 49 + .../BLE5_ctr/ARM/BTLE_BLE5_ctr.uvoptx | 268 + .../BLE5_ctr/ARM/BTLE_BLE5_ctr.uvprojx | 564 +++ .../BLE5_ctr/ARM/EventRecorderStub.scvd | 9 + .../Bluetooth/BLE5_ctr/BLE5_ctr.launch | 62 + .../Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewd | 2974 +++++++++++ .../Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewp | 4402 +++++++++++++++++ Examples/MAX32657/Bluetooth/BLE5_ctr/Makefile | 382 ++ .../MAX32657/Bluetooth/BLE5_ctr/README.md | 38 + Examples/MAX32657/Bluetooth/BLE5_ctr/main.c | 295 ++ .../MAX32657/Bluetooth/BLE5_ctr/project.mk | 40 + Libraries/libs.mk | 50 +- 24 files changed, 9810 insertions(+), 32 deletions(-) create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/.cproject create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/.project create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/language.settings.xml create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.core.prefs create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/README.md create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/c_cpp_properties.json create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/flash.gdb create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/launch.json create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/settings.json create mode 100755 Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/tasks.json create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/Abstract.txt create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BLE.sct create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvoptx create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvprojx create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/EventRecorderStub.scvd create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/BLE5_ctr.launch create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewd create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewp create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/Makefile create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/README.md create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/main.c create mode 100644 Examples/MAX32657/Bluetooth/BLE5_ctr/project.mk diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.cproject b/Examples/MAX32657/Bluetooth/BLE5_ctr/.cproject new file mode 100644 index 0000000000..9dce635ec3 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.cproject @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.project b/Examples/MAX32657/Bluetooth/BLE5_ctr/.project new file mode 100644 index 0000000000..3ec8a6bd77 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.project @@ -0,0 +1,26 @@ + + + BLE5_ctr + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/language.settings.xml b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/language.settings.xml new file mode 100644 index 0000000000..d32717b6f3 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/language.settings.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.codan.core.prefs b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000000..59c0b37ba7 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,93 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"} +org.eclipse.cdt.codan.checkers.nocommentinside=-Error +org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"} +org.eclipse.cdt.codan.checkers.nolinecomment=-Error +org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"} +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CStyleCastProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"C-Style cast instead of C++ cast\\")"} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true} +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CopyrightProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Lack of copyright information\\")",regex\=>".*Copyright.*"} +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.GotoStatementProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Goto statement used\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissCaseProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing cases in switch\\")"} +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissDefaultProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing default in switch\\")",defaultWithAllEnums\=>false} +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing reference return value in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.MissSelfCheckProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Missing self check in assignment operator\\")"} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.UsingInHeaderProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Using directive in header\\")"} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem=-Error +org.eclipse.cdt.codan.internal.checkers.VirtualMethodCallProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Virtual method call in constructor/destructor\\")"} +org.eclipse.cdt.qt.core.qtproblem=Warning +org.eclipse.cdt.qt.core.qtproblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>true,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>null} diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.core.prefs b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000000..f009d7302d --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,15 @@ +eclipse.preferences.version=1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/BOARD/value=EvKit_V1 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/operation=replace +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/GCC_PREFIX/value=arm-none-eabi- +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/PROJECT/value=BLE5_ctr +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/delimiter=; +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/operation=append +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/TARGET/value=MAX32657 +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/append=true +environment/project/cdt.managedbuild.toolchain.gnu.cross.base.1028364529/appendContributed=true diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/README.md b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/README.md new file mode 100755 index 0000000000..5b355bd51c --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/README.md @@ -0,0 +1,47 @@ +# VSCode-Maxim + +_(If you're viewing this document from within Visual Studio Code you can press `CTRL+SHIFT+V` to open a Markdown preview window.)_ + +## Quick Links + +* [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/) +* [VSCode-Maxim Github](https://github.com/analogdevicesinc/VSCode-Maxim) + +## Introduction + +VSCode-Maxim is a set of [Visual Studio Code](https://code.visualstudio.com/) project configurations and utilities for enabling embedded development for [Analog Device's MSDK](https://github.com/analogdevicesinc/msdk) and the [MAX32xxx/MAX78xxx microcontrollers](https://www.analog.com/en/product-category/microcontrollers.html). + +The following features are supported: + +* Code editing with intellisense down to the register level +* Code compilation with the ability to easily re-target a project for different microcontrollers and boards +* Flashing programs +* GUI and command-line debugging + +## Dependencies + +* [Visual Studio Code](https://code.visualstudio.com/) + * [C/C++ VSCode Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) + * [Cortex-Debug Extension](https://marketplace.visualstudio.com/items?itemName=marus25.cortex-debug) +* [Analog Devices MSDK](https://analogdevicesinc.github.io/msdk/) + +## Installation + +Install the MSDK, then set `"MAXIM_PATH"` in your _user_ VS Code settings. + +See [Getting Started with Visual Studio Code](https://analogdevicesinc.github.io/msdk/USERGUIDE/#getting-started-with-visual-studio-code) in the MSDK User Guide for detailed instructions. + +## Usage + +See the [MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/#visual-studio-code) for detailed usage info. + +## Issue Tracker + +Bug reports, feature requests, and contributions are welcome via the [issues](https://github.com/analogdevicesinc/VSCode-Maxim/issues) tracker on Github. + +New issues should contain _at minimum_ the following information: + +* Visual Studio Code version #s (see `Help -> About`) +* C/C++ Extension version # +* Target microcontroller and evaluation platform +* The projects `.vscode` folder and `Makefile` (where applicable). Standard compression formats such as `.zip`, `.rar`, `.tar.gz`, etc. are all acceptable. diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/c_cpp_properties.json b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/c_cpp_properties.json new file mode 100755 index 0000000000..dfbed47b58 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/c_cpp_properties.json @@ -0,0 +1,53 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc.exe", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Linux", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + }, + { + "name": "Mac", + "includePath": [ + "${default}" + ], + "defines": [ + "${default}" + ], + "intelliSenseMode": "gcc-arm", + "compilerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gcc", + "browse": { + "path": [ + "${default}" + ] + } + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/flash.gdb b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/flash.gdb new file mode 100755 index 0000000000..8f22801a47 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/flash.gdb @@ -0,0 +1,17 @@ +define flash_m4 + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor reset halt +end + +define flash_m4_run + set architecture armv7e-m + set remotetimeout 10 + target remote | openocd -c "gdb_port pipe;log_output flash.log" -s $arg0/scripts -f interface/$arg1 -f target/$arg2 -c "init; reset halt" + load + compare-sections + monitor resume +end diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/launch.json b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/launch.json new file mode 100755 index 0000000000..01fe519904 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/launch.json @@ -0,0 +1,133 @@ +{ + "configurations": [ + { + "name": "Debug Arm (Cortex-debug)", + "cwd":"${workspaceRoot}", + "executable": "${workspaceFolder}/build/${config:program_file}", + "loadFiles": ["${workspaceFolder}/build/${config:program_file}"], + "symbolFiles": [{ + "file": "${workspaceFolder}/build/${config:symbol_file}" + }], + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "linux": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "windows": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "serverpath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "gdbPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "serverpath": "${config:OCD_path}/openocd", + }, + "searchDir": ["${config:OCD_path}/scripts"], + "configFiles": ["interface/${config:M4_OCD_interface_file}", "target/${config:M4_OCD_target_file}"], + "interface": "swd", + "runToEntryPoint": "main", + "svdFile": "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include/${config:target}.svd" + }, + { + "name": "GDB (Arm M4)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/${config:program_file}", + "args": [], + "stopAtEntry": true, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:ARM_GCC_path}/bin/arm-none-eabi-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3333", + "debugServerArgs": "-s ${config:OCD_path}/scripts -f interface/${config:M4_OCD_interface_file} -f target/${config:M4_OCD_target_file} -c \"init; reset halt\"", + "serverStarted": "Info : Listening on port 3333 for gdb connections", + "filterStderr": true, + "targetArchitecture": "arm", + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-arm.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text":"exec-file build/${config:program_file}" }, + { "text":"symbol-file build/${config:symbol_file}" }, + { "text":"target remote localhost:3333" }, + { "text":"monitor reset halt" }, + { "text":"set $pc=Reset_Handler"}, + { "text":"b main" } + ] + }, + { + "name": "GDB (RISC-V)", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/buildrv/${config:program_file}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "linux": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/openocd", + }, + "windows": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb.exe", + "debugServerPath": "${config:OCD_path}/openocd.exe", + }, + "osx": { + "miDebuggerPath": "${config:xPack_GCC_path}/bin/riscv-none-elf-gdb", + "debugServerPath": "${config:OCD_path}/bin/openocd", + }, + "logging": { + "exceptions": true, + "trace": false, + "traceResponse": false, + "engineLogging": false + }, + "miDebuggerServerAddress": "localhost:3334", + "debugServerArgs": "-c \"gdb_port 3334\" -s ${config:OCD_path}/scripts -f interface/${config:RV_OCD_interface_file} -f target/${config:RV_OCD_target_file}", + "serverStarted": "Info : Listening on port 3334 for gdb connections", + "filterStderr": true, + "customLaunchSetupCommands": [ + {"text":"-list-features"} + ], + "targetArchitecture": "arm", + "setupCommands": [ + { "text":"set logging overwrite on"}, + { "text":"set logging file debug-riscv.log"}, + { "text":"set logging on"}, + { "text":"cd ${workspaceFolder}" }, + { "text": "set architecture riscv:rv32", "ignoreFailures": false }, + { "text":"exec-file build/${config:program_file}", "ignoreFailures": false }, + { "text":"symbol-file buildrv/${config:symbol_file}", "ignoreFailures": false }, + { "text":"target remote localhost:3334" }, + { "text":"b main" }, + { "text": "set $pc=Reset_Handler","ignoreFailures": false } + ] + } + ] +} diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/settings.json b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/settings.json new file mode 100755 index 0000000000..fc871e1f90 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/settings.json @@ -0,0 +1,101 @@ +{ + "terminal.integrated.env.windows": { + "Path":"${config:OCD_path};${config:ARM_GCC_path}/bin;${config:xPack_GCC_path}/bin;${config:MSYS_path}/usr/bin;${config:Make_path};${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.defaultProfile.windows": "Command Prompt", + + "terminal.integrated.env.linux": { + "PATH":"${config:OCD_path}:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + "terminal.integrated.env.osx": { + "PATH":"${config:OCD_path}/bin:${config:ARM_GCC_path}/bin:${config:xPack_GCC_path}/bin:${config:Make_path}:${env:PATH}", + "MAXIM_PATH":"${config:MAXIM_PATH}" + }, + + "target":"MAX32657", + "board":"EvKit_V1", + + "project_name":"${workspaceFolderBasename}", + + "program_file":"${config:project_name}.elf", + "symbol_file":"${config:program_file}", + + "M4_OCD_interface_file":"cmsis-dap.cfg", + "M4_OCD_target_file":"max32657.cfg", + "RV_OCD_interface_file":"ftdi/olimex-arm-usb-ocd-h.cfg", + "RV_OCD_target_file":"${config:target}_riscv.cfg", + + "v_Arm_GCC":"10.3", + "v_xPack_GCC":"12.2.0-3.1", + + "OCD_path":"${config:MAXIM_PATH}/Tools/OpenOCD", + "ARM_GCC_path":"${config:MAXIM_PATH}/Tools/GNUTools/${config:v_Arm_GCC}", + "xPack_GCC_path":"${config:MAXIM_PATH}/Tools/xPack/riscv-none-elf-gcc/${config:v_xPack_GCC}", + "Make_path":"${config:MAXIM_PATH}/Tools/GNUTools/Make", + "MSYS_path":"${config:MAXIM_PATH}/Tools/MSYS2", + + "C_Cpp.default.includePath": [ + "${workspaceFolder}", + "${workspaceFolder}/**", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Device/Maxim/${config:target}/Include", + "${config:MAXIM_PATH}/Libraries/CMSIS/Include", + "${config:ARM_GCC_path}/arm-none-eabi/include", + "${config:ARM_GCC_path}/lib/gcc/arm-none-eabi/${config:v_Arm_GCC}/include", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Include/${config:target}", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/ExtMemory", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-host/include", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-host/sources/stack/cfg", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-apps/include", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-model/include", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-profile/include", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-profiles/include", + "${config:MAXIM_PATH}/Libraries/Cordio/controller/include/ble", + "${config:MAXIM_PATH}/Libraries/Cordio/controller/include/common", + "${config:MAXIM_PATH}/Libraries/Cordio/platform/include", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-host/sources/hci/dual_chip", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-host/sources/hci/exactle", + "${config:MAXIM_PATH}/Libraries/Cordio/wsf/include", + "${config:MAXIM_PATH}/Libraries/Cordio/wsf/include/util" + ], + "C_Cpp.default.browse.path": [ + "${workspaceFolder}", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/Source", + "${config:MAXIM_PATH}/Libraries/Boards/${config:target}/${config:board}/Source", + "${config:MAXIM_PATH}/Libraries/PeriphDrivers/Source", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Camera", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Display/fonts", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/LED", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PMIC", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/PushButton", + "${config:MAXIM_PATH}/Libraries/MiscDrivers/Touchscreen", + "${config:MAXIM_PATH}/Libraries/MiscDrivers", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-apps/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-host/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-apps/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-model/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-mesh-profile/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/ble-profiles/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/controller/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/wsf/sources", + "${config:MAXIM_PATH}/Libraries/Cordio/platform/targets/maxim/max32657/sources" + ], + "C_Cpp.default.defines": [ + + ], + "C_Cpp.default.forcedInclude": [ + "${workspaceFolder}/build/project_defines.h" + ] +} + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/tasks.json b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/tasks.json new file mode 100755 index 0000000000..e95445e2b3 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/.vscode/tasks.json @@ -0,0 +1,115 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "type": "shell", + "command": "make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -r -j 8 --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean", + "type": "shell", + "command": "make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 clean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "clean-periph", + "type": "shell", + "command": "make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}", + "osx":{ + "command": "source ~/.zshrc && make -j 8 distclean --output-sync=target --no-print-directory TARGET=${config:target} BOARD=${config:board} MAXIM_PATH=${config:MAXIM_PATH} MAKE=make PROJECT=${config:project_name}" + }, + "group": "build", + "problemMatcher": [] + }, + { + "label": "flash", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4 ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "flash & run", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--cd=\"${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "-x=\"${workspaceFolder}/.vscode/flash.gdb\"", + "--ex=\"flash_m4_run ${config:OCD_path} ${config:M4_OCD_interface_file} ${config:M4_OCD_target_file}\"", + "--batch" + ], + "group": "build", + "problemMatcher": [], + "dependsOn":["build"] + }, + { + "label": "erase flash", + "type": "shell", + "command": "openocd", + "args": [ + "-s", "${config:OCD_path}/scripts", + "-f", "interface/${config:M4_OCD_interface_file}", + "-f", "target/${config:M4_OCD_target_file}", + "-c", "\"init; reset halt; max32xxx mass_erase 0;\"", + "-c", "exit" + ], + "group":"build", + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "openocd (m4)", + "type": "shell", + "command": "openocd", + "args": [ + "-s", + "${config:OCD_path}/scripts", + "-f", + "interface/${config:M4_OCD_interface_file}", + "-f", + "target/${config:M4_OCD_target_file}", + "-c", + "\"init; reset halt\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + { + "label": "gdb (m4)", + "type": "shell", + "command": "arm-none-eabi-gdb", + "args": [ + "--ex=\"cd ${workspaceFolder}\"", + "--se=\"build/${config:program_file}\"", + "--symbols=build/${config:symbol_file}", + "--ex=\"target remote localhost:3333\"", + "--ex=\"monitor reset halt\"", + "--ex=\"b main\"", + "--ex=\"c\"" + ], + "problemMatcher": [], + "dependsOn":[] + }, + ] +} \ No newline at end of file diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/Abstract.txt b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/Abstract.txt new file mode 100644 index 0000000000..095573d468 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/Abstract.txt @@ -0,0 +1 @@ +BLE BLE5-ctr example diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BLE.sct b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BLE.sct new file mode 100644 index 0000000000..6781f33a46 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BLE.sct @@ -0,0 +1,49 @@ +#! armcc -E -I .\..\ + +#include "sct_config.h" + +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +; /*-Memory Regions-*/ +;#define IROM_start__ 0x00000000 +;#define IROM_size__ 0x00010000 +;#define IFLASH_start__ 0x10000000 +;#define IFLASH_size__ 0x00080000 +;#define CODE_size__ 0x00077FFF +;#define PAL_NVM_DB_START__ 0x10078000 +;#define PAL_NVM_SIZE 0x00008000 +;#define IRAM_start__ 0x20000000 +;#define IRAM_size__ 0x00020000 + + + +; /*-Sizes */ +;#define size_cstack__ 0x6000 +;#define size_heap__ 0x2000 +; /**** End of ICF editor section. ###ICF###*/ + +#define memory mem with size = 4G; + + +LR_IFLASH IFLASH_start__ IFLASH_size__ { ; load region size_region + + ER_IFLASH IFLASH_start__ CODE_size__{ ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + + PAL_NVM PAL_NVM_DB_START__ PAL_NVM_SIZE { ; RW data + .ANY (+RO) + } + + RW_IRAM1 IRAM_start__ IRAM_size__ { ; RW data + .ANY (+RW +ZI) + } + + + +} \ No newline at end of file diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvoptx b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvoptx new file mode 100644 index 0000000000..58b51355f4 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvoptx @@ -0,0 +1,268 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Flash Debug + 0x4 + ARM-ADS + + 96000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 3 + + + + + + + + + + + BIN\CMSIS_AGDI.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + + + + 0 + CMSIS_AGDI + -X"CMSIS-DAP v1" -U0409170241ffcce80000000000000000 -O238 -S10 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO23 -FD20000000 -FC1000 -FN1 -FF0MAX32657.FLM -FS010000000 -FL0100000 -FP0($$Device:MAX32657$Flash\MAX32657.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000) + + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 1 + 2 + 2000000 + + + + + + Source + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\main.c + main.c + 0 + 0 + + + 1 + 2 + 5 + 0 + 0 + 0 + .\Abstract.txt + Abstract.txt + 0 + 0 + + + + + ::BSP + 0 + 0 + 0 + 1 + + + + ::Bluetooth + 1 + 0 + 0 + 1 + + + + ::CMSIS + 0 + 0 + 0 + 1 + + + + ::Device + 1 + 0 + 0 + 1 + + +
diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvprojx b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvprojx new file mode 100644 index 0000000000..71b305b6c9 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/BTLE_BLE5_ctr.uvprojx @@ -0,0 +1,564 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Flash Debug + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + MAX32657:Cortex-M4 + Maxim + Maxim.MAX32657.1.0.0 + http://www.mxim.net/microcontroller/pack/ + IRAM(0x20000000,0x00080000) IROM(0x10000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(96000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000) + 0 + $$Device:MAX32657$Libraries\Device\Maxim\MAX32657\Include\max32657.h + + + + + + + + + + $$Device:MAX32657$SVD\MAX32657\max32657.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + BLE_BLE5_ctr + 1 + 0 + 0 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + + DCM.DLL + -pCM4 + SARMCM3.DLL + + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 1 + 0x10000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x10000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 2 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + BT_VER=11 INIT_BROADCASTER INIT_PERIPHERAL INIT_OBSERVER INIT_CENTRAL INIT_ENCRYPTED SCH_CHECK_LIST_INTEGRITY=1 BB_LED_ENA=1 INIT_BROADCASTER INIT_PERIPHERAL INIT_OBSERVER INIT_CENTRAL INIT_ENCRYPTED WSF_BUF_FREE_CHECK_ASSERT=0 WSF_BUF_STATS=0 WSF_CS_STATS=0 WSF_ASSERT_ENABLED=0 HCI_UART=0 TERMINAL_UART=2 USER_UART=1 BB_CLK_RATE_HZ=1000000 LCTR_CONN_NO_TIFS_REASSEMBLY=1 CHCI_TR_UART=1 UART_BAUD=115200 UART_HWFC=0 BB_ENABLE_INLINE_ENC_TX=1 BB_ENABLE_INLINE_DEC_RX=1 PAL_MAX_RTC_COUNTER_VAL=0xFFFFFFFF LL_WW_RX_DEVIATION_USEC=0 BOARD=EvKit_V1 TARGET=32657 TARGET_REV=0x4131 + + ..\..\BLE5-ctr + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x10000000 + 0x20000000 + + .\BLE.sct + + + + + + + + + + + Source + + + main.c + 1 + ..\main.c + + + Abstract.txt + 5 + .\Abstract.txt + + + + + ::BSP + + + ::Bluetooth + + + ::CMSIS + + + ::Device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --diag_suppress 1295 --diag_suppress 550 --diag_suppress 188 --diag_suppress 546 --diag_suppress 550 --diag_suppress 188 --diag_suppress 111 --diag_suppress 1293 + + + + + + + + RTE\Device\MAX32657\max32657.h + + + + + + RTE\Device\MAX32657\startup_max32657.s + + + + + + RTE\Device\MAX32657\sub_main.c + + + + + + RTE\Device\MAX32657\system_max32657.c + + + + + + RTE\Device\MAX32657_Cortex-M4\max32657.h + + + + + + + + RTE\Device\MAX32657_Cortex-M4\startup_max32657.s + + + + + + + + RTE\Device\MAX32657_Cortex-M4\system_max32657.c + + + + + + + + + +
diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/EventRecorderStub.scvd b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/EventRecorderStub.scvd new file mode 100644 index 0000000000..2956b29683 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/ARM/EventRecorderStub.scvd @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/BLE5_ctr.launch b/Examples/MAX32657/Bluetooth/BLE5_ctr/BLE5_ctr.launch new file mode 100644 index 0000000000..1086436ffb --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/BLE5_ctr.launch @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewd b/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewd new file mode 100644 index 0000000000..e0bda4cd3c --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewd @@ -0,0 +1,2974 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 32 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 32 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 7 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8b.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8bBE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewp b/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewp new file mode 100644 index 0000000000..f2c423ab25 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/IAR/BTLE_BLE5_ctr.ewp @@ -0,0 +1,4402 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 33 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + + $PROJ_DIR$\..\main.c + + + CMSIS-Pack + CMSISPack.Component + + $PROJ_DIR$\RTE\RTE_Components.h + + + Maxim Maxim API _Device.UART_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/UART/uart_common.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/UART/uart_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/UART/uart_revb.c + + + + Maxim Maxim API _Device.Timers_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/TMR/tmr_common.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/TMR/tmr_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/TMR/tmr_revb.c + + + + Maxim Maxim API _Device.Startup_1.0.0 + CMSISPack.Component + + $PROJ_DIR$\RTE\Device\MAX32657_Cortex-M4\cmain.s + + + $PROJ_DIR$\RTE\Device\MAX32657_Cortex-M4\low_level_init.c + + + $PROJ_DIR$\RTE\Device\MAX32657_Cortex-M4\max32657.h + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/mxc_assert.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/mxc_delay.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/mxc_lock.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/nvic_table.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/pins_me17.c + + + $PROJ_DIR$\RTE\Device\MAX32657_Cortex-M4\startup_max32657.s + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SYS/sys_me17.c + + + $PROJ_DIR$\RTE\Device\MAX32657_Cortex-M4\system_max32657.c + + + + Maxim Maxim API _Device.SPI_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SPI/spi_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/SPI/spi_reva.c + + + + Maxim Maxim API _Device.GPIO_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/GPIO/gpio_common.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/GPIO/gpio_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/GPIO/gpio_reva.c + + + + Maxim Maxim API _Device.FLC_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/FLC/flc_common.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/FLC/flc_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/FLC/flc_reva.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/FLC/flc_revb.c + + + + Maxim Maxim API _Device.DMA_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/DMA/dma_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/DMA/dma_reva.c + + + + Maxim Maxim API _Device.ADC_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/ADC/adc_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/ADC/adc_reva.c + + + + Maxim MAX32657 BSP _BSP.EvKit V1_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Boards/MAX32657/EvKit_V1/Source/board.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Boards/MAX32657/Source/led.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Boards/MAX32657/Source/pb.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Boards/MAX32657/Source/stdio.c + + + + Maxim Maxim BTLE _Bluetooth.Bluetooth LE_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/anpc/anpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/app_db.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_disc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/app_hw.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_master_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_server.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_slave_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/app_terminal.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/app_ui.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/atpc/atpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/atps/atps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/att_eatt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/att_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/att_uuid.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_disc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_eatt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_proc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_read.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_sign.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/attc_write.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_ccc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_csf.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_dyn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_eatt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_ind.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_proc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_read.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_sign.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/att/atts_write.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/bas/bas_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_dtm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_pdufilt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_periodiclist.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_reslist.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_sniffer.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/bb/bb_ble_whitelist.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/common/bb/bb_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/bda.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/blpc/blpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/blps/blps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/bstream.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/calc128.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/cfg/cfg_stack.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/common/chci/chci_tr.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/cpp/cpps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/crc32.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/cscp/cscps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/dis/dis_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_adv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_adv_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_adv_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_cte.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_dev.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_dev_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_scan.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_scan_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_scan_leg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_sec.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_lesc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/dm/dm_sync_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/fcs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/fmpl/fmpl_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/gap/gap_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/gatt/gatt_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/glpc/glpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/glps/glps_db.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/glps/glps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/sensor/gyro_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_bis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_cte.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_enc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/common/hci_core.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_core_ps.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_evt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/hci/hci_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/common/hci_tr.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_vs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/hci/exactle/hci_vs_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/hid/hid_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-apps/sources/hidapp/hidapp_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/hrpc/hrpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/hrps/hrps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/htpc/htpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/htps/htps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/init/init.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/init/init_ctr.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/l2c/l2c_coc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/l2c/l2c_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/l2c/l2c_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/l2c/l2c_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_enc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_init_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_init_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_act_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_init_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_init_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_cs2.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_data.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_init_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_init_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_iso_data.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_master_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_main_slave_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_bis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_enc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_init_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_init_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_cs2.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_vs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_cs2.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_init_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lhci/lhci_main_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/BlePhy/MAX32657/IAR/libphy_iar.a + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_cs2.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_init_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_init_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_master_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_init_slave_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_bis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_bis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_cis_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_diag.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_dtm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_enc_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_enc_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_past.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_pc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_main_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/ll/ll_math.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_events.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_cis_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_conn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_iso.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_master.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_priv.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_sc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_slave.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_btn.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_cfg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_codec.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_crypto.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_flash.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_i2s.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_led.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_rtc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_sys.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_timer.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_twi.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_uart.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/paspc/paspc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/plxpc/plxpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/plxps/plxps_db.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/plxps/plxps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/prand.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/print.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/rscp/rscps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/sch/sch_ble.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/common/sch/sch_list.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/common/sch/sch_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/sch/sch_rm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/controller/sources/ble/sch/sch_tm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/scpps/scpps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_aes.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_aes_rev.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_ccm_hci.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_cmac_hci.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_ecc_hci.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/sec/common/sec_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_db.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_non.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_sc_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smp_sc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpi_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpi_sc_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpi_sc_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpi_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpr_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpr_sc_act.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpr_sc_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-host/sources/stack/smp/smpr_sm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_alert.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_batt.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_bps.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_core.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_cps.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_cscs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_cte.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_dis.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_gls.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_gyro.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_hid.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_hrs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_hts.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_ipss.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_plxs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_px.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_rscs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_scpss.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_temp.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_time.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_uricfg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_wdxs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_wp.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/services/svc_wss.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/sensor/temp_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/terminal.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/tipc/tipc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/udsc/udsc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/thirdparty/uecc/uECC.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/thirdparty/uecc/uECC_ll.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/ui_console.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/ui_lcd.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/ui_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/ui_platform.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/af/common/ui_timer.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/uribeacon/uricfg_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_ft.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_stream.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_au.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_dc.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_ft.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_phy.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_stream.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wpc/wpc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_assert.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_buf.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_bufio.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_cs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_detoken.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_efs.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_msg.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_nvm.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_os.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_queue.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_timer.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/targets/baremetal/wsf_trace.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wspc/wspc_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/ble-profiles/sources/profiles/wsps/wsps_main.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/Cordio/wsf/sources/util/wstr.c + + + + Maxim Maxim API _Device.WUT_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/WUT/wut_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/WUT/wut_reva.c + + + + Maxim Maxim API _Device.TRNG_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/TRNG/trng_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/TRNG/trng_revb.c + + + + Maxim Maxim API _Device.Low Power_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/LP/lp_me17.c + + + + Maxim Maxim API _Device.ICC_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/ICC/icc_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/ICC/icc_reva.c + + + + Maxim Maxim API _Device.I2C_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/I2C/i2c_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/I2C/i2c_reva.c + + + + Maxim Maxim API _Device.AES_1.0.0 + CMSISPack.Component + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/AES/aes_me17.c + + + ${CMSIS_PACK_PATH_Maxim#MAX32657#1.0.0}$\Libraries/PeriphDrivers/Source/AES/aes_revb.c + + + + + <?xml version="1.0" encoding="UTF-8" standalone="no"?> +<configuration xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"> + <packages/> + <device Dclock="96000000" Dcore="Cortex-M4" DcoreVersion="r0p1" Dendian="Little-endian" Dfamily="MAX32657-66" Dfpu="SP_FPU" Dmpu="NO_MPU" Dname="MAX32657" Dvendor="Maxim:23" Pname="Cortex-M4" Punits="2" info="ARM Cortex-M4 96 MHz, 512 kB RAM, 1 MB ROM" url="http://www.keil.com/dd2/maxim/max32657"> + <package info="Maxim Integrated MAX32657 Series Device Support, Board Support Package and Examples" name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + </device> + <toolchain Tcompiler="IAR" Toutput="exe"/> + <components> + <component Cbundle="Maxim BTLE" Cbundleversion="1.0.0" Cclass="Bluetooth" Cgroup="Bluetooth LE" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/assettag/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/cycling/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/datc/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/dats/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/fit/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/hidapp/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/locator/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/medc/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/meds/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/tag/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/uribeacon/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/watch/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/common/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/cfg/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/hci/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/l2c/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/gatt/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/include/ble/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/include/common/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/init/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/sch/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/bb/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/sch/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/platform/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/thirdparty/uecc/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/wsf/include/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/"/> + <file category="include" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-apps/sources/hidapp/hidapp_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/common/hci_core.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/common/hci_tr.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_bis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_cte.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_enc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_cmd_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_core_ps.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_evt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_vs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/hci/exactle/hci_vs_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_aes.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_aes_rev.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_ccm_hci.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_cmac_hci.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_ecc_hci.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/sec/common/sec_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_disc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_eatt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_proc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_read.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_sign.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/attc_write.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_ccc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_csf.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_dyn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_eatt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_ind.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_proc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_read.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_sign.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/atts_write.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/att_eatt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/att_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/att/att_uuid.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/cfg/cfg_stack.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_adv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_adv_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_adv_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_cis_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_cte.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_master_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_slave_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_conn_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_dev.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_dev_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_scan.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_scan_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_scan_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_sec.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_lesc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_sec_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/dm/dm_sync_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/hci/hci_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/l2c/l2c_coc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/l2c/l2c_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/l2c/l2c_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/l2c/l2c_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpi_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpi_sc_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpi_sc_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpi_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpr_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpr_sc_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpr_sc_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smpr_sm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_db.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_non.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_sc_act.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-host/sources/stack/smp/smp_sc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_disc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_master_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_server.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_slave_leg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/app_terminal.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/app_db.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/app_hw.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/app_ui.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/ui_console.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/ui_lcd.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/ui_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/ui_platform.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/af/common/ui_timer.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/anpc/anpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/atpc/atpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/atps/atps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/bas/bas_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/blpc/blpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/blps/blps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/cpp/cpps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/cscp/cscps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/dis/dis_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/fmpl/fmpl_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/gap/gap_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/gatt/gatt_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/glpc/glpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/glps/glps_db.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/glps/glps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/hid/hid_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/hrpc/hrpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/hrps/hrps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/htpc/htpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/htps/htps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/paspc/paspc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/plxpc/plxpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/plxps/plxps_db.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/plxps/plxps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/rscp/rscps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/scpps/scpps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/sensor/gyro_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/sensor/temp_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/tipc/tipc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/udsc/udsc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/uribeacon/uricfg_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_ft.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxc/wdxc_stream.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_au.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_dc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_ft.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wdxs/wdxs_stream.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wpc/wpc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wspc/wspc_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/profiles/wsps/wsps_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_alert.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_batt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_bps.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_core.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_cps.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_cscs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_cte.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_dis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_gls.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_gyro.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_hid.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_hrs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_hts.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_ipss.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_plxs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_px.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_rscs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_scpss.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_temp.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_time.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_uricfg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_wdxs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_wp.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/ble-profiles/sources/services/svc_wss.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_dtm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_pdufilt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_periodiclist.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_reslist.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_sniffer.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/bb/bb_ble_whitelist.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/init/init.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/init/init_ctr.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_conn_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_enc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_init_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_init_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_act_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_init_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_isr_init_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_cs2.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_data.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_init_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_init_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_iso_data.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_master_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_main_slave_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_bis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_enc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_pdu_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_init_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_init_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_master_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lctr/lctr_sm_llcp_slave_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_conn_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_cmd_vs_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_cs2.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_conn_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_evt_vs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_cs2.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_conn_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_init_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lhci/lhci_main_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_cs2.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_init_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_init_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_master_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_init_slave_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_bis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_bis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_cis_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_conn_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_diag.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_dtm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_enc_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_enc_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_past.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_pc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_phy.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_main_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/ll/ll_math.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_events.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_adv_master_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_adv_slave_ae.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_cis_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_conn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_iso.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_master.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_priv.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_sc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/lmgr/lmgr_main_slave.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/sch/sch_ble.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/sch/sch_rm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/ble/sch/sch_tm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/bb/bb_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/chci/chci_tr.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/sch/sch_list.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/controller/sources/common/sch/sch_main.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_btn.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_cfg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_codec.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_crypto.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_flash.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_i2s.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_led.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_rtc.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_sys.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_timer.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_twi.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/platform/targets/maxim/max32657/sources/pal_uart.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/thirdparty/uecc/uECC_ll.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/thirdparty/uecc/uECC.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_assert.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_buf.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_bufio.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_cs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_detoken.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_efs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_heap.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_msg.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_nvm.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_os.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_queue.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_timer.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/targets/baremetal/wsf_trace.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/bda.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/bstream.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/calc128.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/crc32.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/fcs.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/prand.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/print.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/terminal.c"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Cordio/wsf/sources/util/wstr.c"/> + <file category="library" condition="Startup IAR" deviceDependent="1" name="Libraries/BlePhy/MAX32657/IAR/libphy_iar.a"/> + </component> + <component Cbundle="MAX32657 BSP" Cbundleversion="1.0.0" Cclass="BSP" Cgroup="EvKit V1" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/Boards/MAX32657/EvKit_V1/Include/" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Boards/MAX32657/EvKit_V1/Source/board.c" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/Boards/MAX32657/Include/" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Boards/MAX32657/Source/led.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Boards/MAX32657/Source/pb.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/Boards/MAX32657/Source/stdio.c" version="1.0.0"/> + </component> + <component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.2.0"> + <package name="CMSIS" url="http://www.keil.com/pack/" vendor="ARM" version="5.5.1"/> + <file category="doc" name="CMSIS/Documentation/Core/html/index.html"/> + <file category="include" name="CMSIS/Core/Include/"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="ADC" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ADC/adc_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ADC/adc_reva.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="AES" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/AES/aes_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/AES/aes_revb.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="DMA" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/DMA/dma_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/DMA/dma_reva.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="FLC" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/FLC/flc_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/FLC/flc_common.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/FLC/flc_reva.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/FLC/flc_revb.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="GPIO" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/GPIO/gpio_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/GPIO/gpio_reva.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/GPIO/gpio_common.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="I2C" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/I2C/i2c_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/I2C/i2c_reva.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="ICC" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ICC/icc_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ICC/icc_reva.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="Low Power" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/LP/lp_me17.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="SPI" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SPI/spi_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SPI/spi_reva.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="Startup" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Include/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Include/MAX32657/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ADC/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/AES/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/CRC/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/DMA/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/FLC/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/GPIO/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/I2C/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/I2S/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/ICC/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/LP/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/RTC/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SPI/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TMR/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TRNG/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/UART/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/WDT/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/WUT/" version="1.0.0"/> + <file category="include" deviceDependent="1" name="Libraries/PeriphDrivers/Source/PT/" version="1.0.0"/> + <file attr="config" category="sourceC" condition="Startup IAR" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Source/IAR/low_level_init.c" version="1.0.0"/> + <file attr="config" category="sourceAsm" condition="Startup IAR" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Source/IAR/startup_max32657.s" version="1.0.0"/> + <file attr="config" category="sourceC" condition="Startup IAR" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Source/IAR/low_level_init.c" version="1.0.0"/> + <file attr="config" category="sourceAsm" condition="Startup IAR" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Source/IAR/cmain.s" version="1.0.0"/> + <file attr="config" category="sourceC" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Source/system_max32657.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/nvic_table.c" version="1.0.0"/> + <file attr="config" category="header" deviceDependent="1" name="Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.h" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/mxc_assert.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/mxc_delay.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/mxc_lock.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/pins_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/sys_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/SYS/nvic_table.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="Timers" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TMR/tmr_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TMR/tmr_revb.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TMR/tmr_common.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="TRNG" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TRNG/trng_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/TRNG/trng_revb.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="UART" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/UART/uart_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/UART/uart_revb.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/UART/uart_common.c" version="1.0.0"/> + </component> + <component Cbundle="Maxim API" Cbundleversion="1.0.0" Cclass="Device" Cgroup="WUT" Cvendor="Maxim" Cversion="1.0.0" deviceDependent="1"> + <package name="MAX32657" url="http://www.mxim.net/microcontroller/pack/" vendor="Maxim" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/WUT/wut_me17.c" version="1.0.0"/> + <file category="sourceC" deviceDependent="1" name="Libraries/PeriphDrivers/Source/WUT/wut_reva.c" version="1.0.0"/> + </component> + </components> + <apis/> +</configuration> + + + diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/Makefile b/Examples/MAX32657/Bluetooth/BLE5_ctr/Makefile new file mode 100644 index 0000000000..62fb5aa256 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/Makefile @@ -0,0 +1,382 @@ +############################################################################### + # + # Copyright (C) 2022-2023 Maxim Integrated Products, Inc. (now owned by + # Analog Devices, Inc.), + # Copyright (C) 2023-2024 Analog Devices, 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. + # + ############################################################################## + +# ** Readme! ** +# Don't edit this file! This is the core Makefile for a MaximSDK +# project. The available configuration options can be overridden +# in "project.mk", on the command-line, or with system environment +# variables. + +# See https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system +# for more detailed instructions on how to use this system. + +# The detailed instructions mentioned above are easier to read than +# this file, but the comments found in this file also outline the +# available configuration variables. This file is organized into +# sub-sections, some of which expose config variables. + + +# ******************************************************************************* +# Set the target microcontroller and board to compile for. + +# Every TARGET microcontroller has some Board Support Packages (BSPs) that are +# available for it under the MaximSDK/Libraries/Boards/TARGET folder. The BSP +# that gets selected is MaximSDK/Libraries/Boards/TARGET/BOARD. + +# Configuration Variables: +# - TARGET : Override the default target microcontroller. Ex: TARGET=MAX78000 +# - BOARD : Override the default BSP (case sensitive). Ex: BOARD=EvKit_V1, BOARD=FTHR_RevA + + +ifeq "$(TARGET)" "" +# Default target microcontroller +TARGET := MAX32657 +TARGET_UC := MAX32657 +TARGET_LC := max32657 +else +# "TARGET" has been overridden in the environment or on the command-line. +# We need to calculate an upper and lowercase version of the part number, +# because paths on Linux and MacOS are case-sensitive. +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) +endif + +# Default board. +BOARD ?= EvKit_V1 + +# ******************************************************************************* +# Locate the MaximSDK + +# This Makefile needs to know where to find the MaximSDK, and the MAXIM_PATH variable +# should point to the root directory of the MaximSDK installation. Setting this manually +# is usually only required if you're working on the command-line. + +# If MAXIM_PATH is not specified, we assume the project still lives inside of the MaximSDK +# and move up from this project's original location. + +# Configuration Variables: +# - MAXIM_PATH : Tell this Makefile where to find the MaximSDK. Ex: MAXIM_PATH=C:/MaximSDK + + +ifneq "$(MAXIM_PATH)" "" +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +# Locate some other useful paths... +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS +endif + +# ******************************************************************************* +# Include project Makefile. We do this after formulating TARGET, BOARD, and MAXIM_PATH +# in case project.mk needs to reference those values. However, we also include +# this as early as possible in the Makefile so that it can append to or override +# the variables below. + + +PROJECTMK ?= $(abspath ./project.mk) +include $(PROJECTMK) +$(info Loaded project.mk) +# PROJECTMK is also used by implicit rules and other libraries to add project.mk as a watch file + +# ******************************************************************************* +# Final path sanitization and re-calculation. No options here. + +ifeq "$(MAXIM_PATH)" "" +# MAXIM_PATH is still not defined... +DEPTH := ../../../../ +MAXIM_PATH := $(abspath $(DEPTH)) +$(warning Warning: MAXIM_PATH is not set! Set MAXIM_PATH in your environment or in project.mk to clear this warning.) +$(warning Warning: Attempting to use $(MAXIM_PATH) calculated from relative path) +else +# Sanitize MAXIM_PATH for backslashes +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) +endif + +# Final recalculation of LIBS_DIR/CMSIS_ROOT +LIBS_DIR := $(abspath $(MAXIM_PATH)/Libraries) +CMSIS_ROOT := $(LIBS_DIR)/CMSIS + +# One final UC/LC check in case user set TARGET in project.mk +TARGET_UC := $(subst m,M,$(subst a,A,$(subst x,X,$(TARGET)))) +TARGET_LC := $(subst M,m,$(subst A,a,$(subst X,x,$(TARGET)))) + +export TARGET +export TARGET_UC +export TARGET_LC +export CMSIS_ROOT +# TODO: Remove dependency on exports for these variables. + +# ******************************************************************************* +# Set up search paths, and auto-detect all source code on those paths. + +# The following paths are searched by default, where "./" is the project directory. +# ./ +# |- *.h +# |- *.c +# |-include (optional) +# |- *.h +# |-src (optional) +# |- *.c + +# Configuration Variables: +# - VPATH : Tell this Makefile to search additional locations for source (.c) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - IPATH : Tell this Makefile to search additional locations for header (.h) files. +# You should use the "+=" operator with this option. +# Ex: VPATH += your/new/path +# - SRCS : Tell this Makefile to explicitly add a source (.c) file to the build. +# This is really only useful if you want to add a source file that isn't +# on any VPATH, in which case you can add the full path to the file here. +# You should use the "+=" operator with this option. +# Ex: SRCS += your/specific/source/file.c +# - AUTOSEARCH : Set whether this Makefile should automatically detect .c files on +# VPATH and add them to the build. This is enabled by default. Set +# to 0 to disable. If autosearch is disabled, source files must be +# manually added to SRCS. +# Ex: AUTOSEARCH = 0 + + +# Where to find source files for this project. +VPATH += . +VPATH += src +VPATH := $(VPATH) + +# Where to find header files for this project +IPATH += . +IPATH += include +IPATH := $(IPATH) + +AUTOSEARCH ?= 1 +ifeq ($(AUTOSEARCH), 1) +# Auto-detect all C/C++ source files on VPATH +SRCS += $(wildcard $(addsuffix /*.c, $(VPATH))) +SRCS += $(wildcard $(addsuffix /*.cpp, $(VPATH))) +endif + +# Collapse SRCS before passing them on to the next stage +SRCS := $(SRCS) + +# ******************************************************************************* +# Set the output filename + +# Configuration Variables: +# - PROJECT : Override the default output filename. Ex: PROJECT=MyProject + + +# The default value creates a file named after the target micro. Ex: MAX78000.elf +PROJECT ?= $(TARGET_LC) + +# ******************************************************************************* +# Compiler options + +# Configuration Variables: +# - DEBUG : Set DEBUG=1 to build explicitly for debugging. This adds some additional +# symbols and sets -Og as the default optimization level. +# - MXC_OPTIMIZE_CFLAGS : Override the default compiler optimization level. +# Ex: MXC_OPTIMIZE_CFLAGS = -O2 +# - PROJ_CFLAGS : Add additional compiler flags to the build. +# You should use the "+=" operator with this option. +# Ex: PROJ_CFLAGS += -Wextra +# - MFLOAT_ABI : Set the floating point acceleration level. +# The only options are "hard", "soft", or "softfp". +# Ex: MFLOAT_ABI = hard +# - LINKERFILE : Override the default linkerfile. +# Ex: LINKERFILE = customlinkerfile.ld +# - LINKERPATH : Override the default search location for $(LINKERFILE) +# The default search location is $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC +# If $(LINKERFILE) cannot be found at this path, then the root project +# directory will be used as a fallback. + +# Select 'GCC' or 'IAR' compiler +ifeq "$(COMPILER)" "" +COMPILER := GCC +endif + +# Set default compiler optimization levels +ifeq "$(MAKECMDGOALS)" "release" +# Default optimization level for "release" builds (make release) +MXC_OPTIMIZE_CFLAGS ?= -O2 +DEBUG = 0 +endif + +ifeq ($(DEBUG),1) +# Optimizes for debugging as recommended +# by GNU for code-edit-debug cycles +# https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options +MXC_OPTIMIZE_CFLAGS := -Og +endif + +# Default level if not building for release or explicitly for debug +MXC_OPTIMIZE_CFLAGS ?= -Og + +# Set compiler flags +PROJ_CFLAGS += -Wall # Enable warnings +PROJ_CFLAGS += -DMXC_ASSERT_ENABLE + +# Set hardware floating point acceleration. +# Options are: +# - hard +# - soft +# - softfp (default if MFLOAT_ABI is not set) +MFLOAT_ABI ?= softfp +# MFLOAT_ABI must be exported to other Makefiles +export MFLOAT_ABI + +# This path contains system-level intialization files for the target micro. Add to the build. +VPATH += $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source + +# ******************************************************************************* +# Secure Boot Tools (SBT) + +# This section integrates the Secure Boot Tools. It's intended for use with +# microcontrollers that have a secure bootloader. + +# Enabling SBT integration will add some special rules, such as "make sla", "make scpa", etc. + +# Configuration variables: +# SBT : Toggle SBT integration. Set to 1 to enable, or 0 +# to disable +# MAXIM_SBT_DIR : Specify the location of the SBT tool binaries. This defaults to +# Tools/SBT in the MaximSDK. The standalone SBT installer will override +# this via an environment variable. +# TARGET_SEC : Specify the part number to be passed into the SBT. This should match +# the secure variant part #. The default value will depend on TARGET. +# For example, TARGET=MAX32650 will result in TARGET_SEC=MAX32651, and +# the default selection happens in Tools/SBT/SBT-config. +# However, if there are multiple secure part #s for the target +# microcontroller this variable may need to be changed. + +SBT ?= 0 +ifeq ($(SBT), 1) +MAXIM_SBT_DIR ?= $(MAXIM_PATH)/Tools/SBT +MAXIM_SBT_DIR := $(subst \,/,$(MAXIM_SBT_DIR)) +# ^ Must sanitize path for \ on Windows, since this may come from an environment +# variable. + +export MAXIM_SBT_DIR # SBTs must have this environment variable defined to work + +# SBT-config.mk and SBT-rules.mk are included further down this Makefile. + +endif # SBT + +# ******************************************************************************* +# Default goal selection. This section allows you to override the default goal +# that will run if no targets are specified on the command-line. +# (ie. just running 'make' instead of 'make all') + +# Configuration variables: +# .DEFAULT_GOAL : Set the default goal if no targets were specified on the +# command-line +# ** "override" must be used with this variable. ** +# Ex: "override .DEFAULT_GOAL = mygoal" + +ifeq "$(.DEFAULT_GOAL)" "" +ifeq ($(SBT),1) +override .DEFAULT_GOAL := sla +else +override .DEFAULT_GOAL := all +endif +endif + +# Developer note: 'override' is used above for legacy Makefile compatibility. +# gcc.mk/gcc_riscv.mk need to hard-set 'all' internally, so this new system +# uses 'override' to come in over the top without breaking old projects. + +# It's also necessary to explicitly set MAKECMDGOALS... +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + +# Enable colors when --sync-output is used. +# See https://www.gnu.org/software/make/manual/make.html#Terminal-Output (section 13.2) +ifneq ($(MAKE_TERMOUT),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +ifneq ($(FORCE_COLOR),) +PROJ_CFLAGS += -fdiagnostics-color=always +endif + +# ******************************************************************************* +# Include SBT config. We need to do this here because it needs to know +# the current MAKECMDGOAL. +ifeq ($(SBT),1) +include $(MAXIM_PATH)/Tools/SBT/SBT-config.mk +endif + +# ******************************************************************************* +# Libraries + +# This section offers "toggle switches" to include or exclude the libraries that +# are available in the MaximSDK. Set a configuration variable to 1 to include the +# library in the build, or 0 to exclude. + +# Each library may also have its own library specific configuration variables. See +# Libraries/libs.mk for more details. + +# Configuration variables: +# - LIB_BOARD : Include the Board-Support Package (BSP) library. (Enabled by default) +# - LIB_PERIPHDRIVERS : Include the peripheral driver library. (Enabled by default) +# - LIB_CMSIS_DSP : Include the CMSIS-DSP library. +# - LIB_CORDIO : Include the Cordio BLE library +# - LIB_FCL : Include the Free Cryptographic Library (FCL) +# - LIB_FREERTOS : Include the FreeRTOS and FreeRTOS-Plus-CLI libraries +# - LIB_LC3 : Include the Low Complexity Communication Codec (LC3) library +# - LIB_LITTLEFS : Include the "little file system" (littleFS) library +# - LIB_LWIP : Include the lwIP library +# - LIB_MAXUSB : Include the MAXUSB library +# - LIB_SDHC : Include the SDHC library + +include $(LIBS_DIR)/libs.mk + + +# ******************************************************************************* +# Rules + +# Include the rules for building for this target. All other makefiles should be +# included before this one. +include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk + +# Include the rules that integrate the SBTs. SBTs are a special case that must be +# include after the core gcc rules to extend them. +ifeq ($(SBT), 1) +include $(MAXIM_PATH)/Tools/SBT/SBT-rules.mk +endif + + +# Get .DEFAULT_GOAL working. +ifeq "$(MAKECMDGOALS)" "" +MAKECMDGOALS:=$(.DEFAULT_GOAL) +endif + + +all: +# Extend the functionality of the "all" recipe here + $(PREFIX)-size --format=berkeley $(BUILD_DIR)/$(PROJECT).elf + +libclean: + $(MAKE) -f ${PERIPH_DRIVER_DIR}/periphdriver.mk clean.periph + +clean: +# Extend the functionality of the "clean" recipe here + +# The rule to clean out all the build products. +distclean: clean libclean diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/README.md b/Examples/MAX32657/Bluetooth/BLE5_ctr/README.md new file mode 100644 index 0000000000..111b9ec84e --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/README.md @@ -0,0 +1,38 @@ +# Description + +Bluetooth version 5.2 controller, accepts HCI commands via Serial Port. + +Refer to the [BLE5_ctr](../../../../Libraries/Cordio/docs/Applications/BLE5_ctr.md) documentation in the Cordio Library. + +## Software + +### Project Usage + +Universal instructions on building, flashing, and debugging this project can be found in the **[MSDK User Guide](https://analogdevicesinc.github.io/msdk/USERGUIDE/)**. + +### Required Connections +- Connect a USB cable between the PC and the (USB/PWR - UART) connector. +- Use an external USB-to-UART adapter to access HCI UART. Connect a USB cable between the PC or BLE Tester + and USB side of the adapter. Connect UART side of the adapter to board TX,RX and GND header pins. +- Optionally you can reconfigure the UART definitions in board.h to use the on-board USB to UART + adapter for the HCI UART. + +### Project-Specific Build Notes +* Setting `TRACE=1` in [**project.mk**](project.mk) initializes the on-board USB-to-UART adapter for +viewing the trace messages and interacting with the application. Port uses settings: + - Baud : 115200 + - Char size : 8 + - Parity : None + - Stop bits : 1 + - HW Flow Control : No + - SW Flow Control : No +* The HCI serial port is used for HCI communication with BLE controller. Require +external USB-to-UART adapter configured to the following settings: + - Baud : 115200 + - Char size : 8 + - Parity : None + - Stop bits : 1 + - HW Flow Control : No + - SW Flow Control : No +* HCI commands can be send to Controller by BLE tester, or from PC as illustrated in +Tools/Bluetooth/BLE_hci.py. The script has built in help options to describe the usage. diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/main.c b/Examples/MAX32657/Bluetooth/BLE5_ctr/main.c new file mode 100644 index 0000000000..60957a6b52 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/main.c @@ -0,0 +1,295 @@ +/*************************************************************************************************/ +/*! + * @file main.c + * @brief Bluetooth version 5.2 controller, accepts HCI commands via Serial Port. + * + * Copyright (c) 2013-2019 Arm Ltd. All Rights Reserved. + * + * Copyright (c) 2019-2020 Packetcraft, Inc. + * + * Portions Copyright (c) 2022-2023 Analog Devices, 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. + */ +/*************************************************************************************************/ + +#include "ll_init_api.h" +#include "chci_tr.h" +#include "lhci_api.h" +#include "hci_defs.h" +#include "wsf_assert.h" +#include "wsf_buf.h" +#include "wsf_heap.h" +#include "wsf_timer.h" +#include "wsf_trace.h" +#include "wsf_bufio.h" +#include "wsf_types.h" +#include "wsf_os.h" +#include "wsf_cs.h" +#include "bb_ble_sniffer_api.h" +#include "pal_bb.h" +#include "pal_cfg.h" +#include "mxc_device.h" +#include "uart.h" +#include "nvic_table.h" +#include "board.h" +#include "pal_timer.h" + +#define MAX_PRIORITY ((0x1 << __NVIC_PRIO_BITS) - 1) + +/*! \brief UART TX buffer size */ +#define PLATFORM_UART_TERMINAL_BUFFER_SIZE 2048U + +#define DEFAULT_TX_POWER 0 /* dBm */ + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! \brief Persistent BB runtime configuration. */ +static BbRtCfg_t mainBbRtCfg; + +/*! \brief Persistent LL runtime configuration. */ +static LlRtCfg_t mainLlRtCfg; + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*************************************************************************************************/ +/*! + * \brief Load runtime configuration. + */ +/*************************************************************************************************/ +static void mainLoadConfiguration(void) +{ + PalBbLoadCfg((PalBbCfg_t *)&mainBbRtCfg); + LlGetDefaultRunTimeCfg(&mainLlRtCfg); + PalCfgLoadData(PAL_CFG_ID_LL_PARAM, &mainLlRtCfg.maxAdvSets, sizeof(LlRtCfg_t) - 9); + PalCfgLoadData(PAL_CFG_ID_BLE_PHY, (uint8_t *)&mainLlRtCfg.phy2mSup, 4); + + /* Set 5.0 requirements. */ + mainLlRtCfg.btVer = BT_VER; + + /* Set the 32k sleep clock accuracy into one of the following bins, default is 20 + HCI_CLOCK_500PPM + HCI_CLOCK_250PPM + HCI_CLOCK_150PPM + HCI_CLOCK_100PPM + HCI_CLOCK_75PPM + HCI_CLOCK_50PPM + HCI_CLOCK_30PPM + HCI_CLOCK_20PPM + */ + mainBbRtCfg.clkPpm = 20; + + /* Set the default connection power level */ + mainLlRtCfg.defTxPwrLvl = DEFAULT_TX_POWER; + + /* Adjust the extended advertising and ISO settings */ + mainLlRtCfg.maxAdvSets = 2; + mainLlRtCfg.maxAdvReports = 4; + mainLlRtCfg.numIsoTxBuf = 8; + mainLlRtCfg.maxCis = 2; + mainLlRtCfg.maxBis = 2; +} + +/*************************************************************************************************/ +/*! + * \brief Initialize WSF. + */ +/*************************************************************************************************/ +static void mainWsfInit(void) +{ + uint32_t llmemUsed, memUsed; + + mainLoadConfiguration(); + + /* +12 for message headroom, + 2 event header, +255 maximum parameter length. */ + const uint16_t maxRptBufSize = 12 + 2 + 255; + + /* +12 for message headroom, +ISO Data Load, +4 for header. */ + const uint16_t dataBufSize = + 12 + HCI_ISO_DL_MAX_LEN + mainLlRtCfg.maxAclLen + 4 + BB_DATA_PDU_TAILROOM; + + /* Use single pool for data buffers. */ +#if (BT_VER > 9) && INIT_FEAT_ISO + mainLlRtCfg.maxIsoSduLen = mainLlRtCfg.maxAclLen; +#endif + + /* Ensure pool buffers are ordered correctly. */ + WSF_ASSERT(maxRptBufSize < dataBufSize); + + wsfBufPoolDesc_t poolDesc[] = { + { 16, 8 }, + { 32, 4 }, + { 128, mainLlRtCfg.maxAdvReports }, + { maxRptBufSize, mainLlRtCfg.maxAdvReports }, /* Extended reports. */ + { dataBufSize, mainLlRtCfg.numTxBufs + mainLlRtCfg.numRxBufs + mainLlRtCfg.numIsoTxBuf + + mainLlRtCfg.numIsoRxBuf } + }; + + const uint8_t numPools = sizeof(poolDesc) / sizeof(poolDesc[0]); + + /* Calculate how much memory we will need for the LL initialization */ + WsfCsEnter(); + + LlInitRtCfg_t llCfg = { + .pBbRtCfg = &mainBbRtCfg, + .wlSizeCfg = 4, + .rlSizeCfg = 4, + .plSizeCfg = 4, + .pLlRtCfg = &mainLlRtCfg, + /* Not significant yet, only being used for memory size requirement calculation. */ + .pFreeMem = WsfHeapGetFreeStartAddress(), + /* Not significant yet, only being used for memory size requirement calculation. */ + .freeMemAvail = WsfHeapCountAvailable() + }; + + llmemUsed = LlInitSetRtCfg(&llCfg); + + WsfCsExit(); + + /* Initial buffer configuration. */ + WsfCsEnter(); + memUsed = WsfBufCalcSize(numPools, poolDesc); + WsfHeapAlloc(memUsed); + WsfBufInit(numPools, poolDesc); + WsfCsExit(); + + WsfOsInit(); + WsfTimerInit(); + +#if (WSF_TRACE_ENABLED == TRUE) + WsfCsEnter(); + WsfHeapAlloc(PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfBufIoUartInit(WsfHeapGetFreeStartAddress(), PLATFORM_UART_TERMINAL_BUFFER_SIZE); + WsfCsExit(); + + WsfTraceRegisterHandler(WsfBufIoWrite); + WsfTraceEnable(TRUE); +#endif + + /* Complete the LL initialization */ + WsfCsEnter(); + + /* Allocate the memory */ + WsfHeapAlloc(llmemUsed); + + /* Set the free memory pointers */ + llCfg.pFreeMem = WsfHeapGetFreeStartAddress(); + llCfg.freeMemAvail = WsfHeapCountAvailable(); + + /* Run the initialization with properly set the free memory pointers */ + if (llmemUsed != LlInitControllerInit(&llCfg)) { + WSF_ASSERT(0); + } + + WsfCsExit(); +} + +/*************************************************************************************************/ +/*! + * \brief Check and service tokens (Trace and sniffer). + * + * \return TRUE if there is token pending. + */ +/*************************************************************************************************/ +static bool mainCheckServiceTokens(void) +{ + bool_t eventPending = FALSE; + +#if (WSF_TOKEN_ENABLED == TRUE) || (BB_SNIFFER_ENABLED == TRUE) + eventPending = LhciIsEventPending(); +#endif + +#if WSF_TOKEN_ENABLED == TRUE + /* Allow only a single token to be processed at a time. */ + if (!eventPending) { + eventPending = WsfTokenService(); + } +#endif + +#if (BB_SNIFFER_ENABLED == TRUE) + /* Service one sniffer packet, if in the buffer. */ + if (!eventPending) { + eventPending = LhciSnifferHandler(); + } +#endif + + return eventPending; +} + +/*************************************************************************************************/ +/*! + * \brief Adjust interrupt priorities to let HCI UART interrupt have second highest after PAL timer + * + * \return None + */ +/*************************************************************************************************/ +void setInterruptPriority(void) +{ + /* Interrupts using FreeRTOS functions must have priorities between MAX_PRIORITY and + configMAX_SYSCALL_INTERRUPT_PRIORITY, lower priority number is higher priority */ + + /* Setup BLE hardware interrupt priorities */ + NVIC_SetPriority(BTLE_TX_DONE_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_RX_RCVD_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_RX_ENG_DET_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_SFD_DET_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_SFD_TO_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_GP_EVENT_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_CFO_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_SIG_DET_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_AGC_EVENT_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_RFFE_SPIM_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_TX_AES_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_RX_AES_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_INV_APB_ADDR_IRQn, (MAX_PRIORITY - 2)); + NVIC_SetPriority(BTLE_IQ_DATA_VALID_IRQn, (MAX_PRIORITY - 2)); + + /* Setup scheduler timer priorities */ + NVIC_SetPriority(TMR0_IRQn, (MAX_PRIORITY - 1)); + NVIC_SetPriority(TMR1_IRQn, (MAX_PRIORITY - 1)); + + NVIC_SetPriority(WUT0_IRQn, (MAX_PRIORITY - 1)); + NVIC_SetPriority(WUT1_IRQn, (MAX_PRIORITY - 1)); + + /* Setup additional peripheral timer priorities */ + NVIC_SetPriority(UART_IRQn, (MAX_PRIORITY - 0)); + + NVIC_SetPriority(GPIO0_IRQn, (MAX_PRIORITY - 0)); +} +/*************************************************************************************************/ +/*! + * \brief Main entry point. + */ +/*************************************************************************************************/ +int main(void) +{ + mainWsfInit(); + + bdAddr_t bdAddr; + PalCfgLoadData(PAL_CFG_ID_BD_ADDR, bdAddr, sizeof(bdAddr_t)); + /* Coverity[uninit_use_in_call] */ + LlSetBdAddr((uint8_t *)&bdAddr); + LlSetAdvTxPower(DEFAULT_TX_POWER); + + WsfOsRegisterSleepCheckFunc(mainCheckServiceTokens); + WsfOsRegisterSleepCheckFunc(ChciTrService); + setInterruptPriority(); + WsfOsEnterMainLoop(); + + /* Does not return. */ + return 0; +} diff --git a/Examples/MAX32657/Bluetooth/BLE5_ctr/project.mk b/Examples/MAX32657/Bluetooth/BLE5_ctr/project.mk new file mode 100644 index 0000000000..e41ee80759 --- /dev/null +++ b/Examples/MAX32657/Bluetooth/BLE5_ctr/project.mk @@ -0,0 +1,40 @@ +############################################################################### + # + # Copyright (C) 2024 Analog Devices, 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 can be used to set build configuration +# variables. These variables are defined in a file called +# "Makefile" that is located next to this one. + +# For instructions on how to use this system, see +# https://analogdevicesinc.github.io/msdk/USERGUIDE/#build-system + +# ********************************************************** + +# Enable Cordio library +LIB_CORDIO = 1 + +CORDIO_DIR = $(LIBS_DIR)/Packetcraft-ADI +RF_PHY_DIR = $(LIBS_DIR)/RF-PHY + +# Cordio library options +BLE_HOST = 0 +BLE_CONTROLLER = 1 + +# TRACE option +# Set to 0 to disable +# Set to 2 to enable serial port trace messages +TRACE = 2 diff --git a/Libraries/libs.mk b/Libraries/libs.mk index 0e2c97e7a2..121f83a9f5 100644 --- a/Libraries/libs.mk +++ b/Libraries/libs.mk @@ -71,9 +71,13 @@ endif # Cordio (Disabled by default) # ************************ LIB_CORDIO ?= 0 -CODED_PHY_DEMO ?= 0 -INIT_EXTENDED ?= 0 ifeq ($(LIB_CORDIO), 1) +# Include extended advertising features +INIT_EXTENDED ?= 0 + +# Default directory for libphy +LIB_PHY_DIR ?= $(LIBS_DIR)/BlePhy + # Include the Cordio Library CORDIO_DIR ?= $(LIBS_DIR)/Cordio include $(CORDIO_DIR)/platform/targets/maxim/build/cordio_lib.mk @@ -83,52 +87,34 @@ ifeq ($(INIT_EXTENDED),1) PROJ_CFLAGS += -DINIT_EXTENDED=1 endif -CHIP_REVISION ?= b -export CHIP_REVISION - -# for CHIP_REVISION a *********************************************** -ifeq ($(CHIP_REVISION),a) +# Default libphy ifeq ($(RISCV_CORE),) - ifeq ($(MFLOAT_ABI),hard) -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy_a1_hard.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy_hard.a else -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy_a1.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy.a endif - else -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy_a1_riscv.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy_riscv.a endif -#********************************************************************* - -# for CHIP_REVISION b *************************************************** -else ifeq ($(CHIP_REVISION),b) - - +# libphy for MAX32655 A1 +ifeq ($(TARGET),MAX32655) +ifeq ($(TARGET_REV),0x4131) ifeq ($(RISCV_CORE),) - ifeq ($(MFLOAT_ABI),hard) -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy_hard.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy_a1_hard.a else -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy_a1.a endif - else -LIBS += $(LIBS_DIR)/BlePhy/$(CHIP_UC)/libphy_riscv.a +LIB_PHY = $(LIB_PHY_DIR)/$(CHIP_UC)/libphy_a1_riscv.a endif -#************************************************************************** endif - -#********************************************************************* - - -ifeq ($(CODED_PHY_DEMO),1) -PROJ_CFLAGS += -DAPP_CODED_PHY_DEMO=1 -else -PROJ_CFLAGS += -DAPP_CODED_PHY_DEMO=0 endif +LIBS += $(LIB_PHY) + query: query.cordio endif From 7ab2d18a79bc027f2507c0bb6ebbb483d9e6726a Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Thu, 7 Nov 2024 15:51:39 -0600 Subject: [PATCH 19/25] fix(Examples): Fixed PHY selection bug in RF Test (#1254) Co-authored-by: EricB-ADI --- Examples/MAX32655/Bluetooth/RF_Test/main.c | 4 ++++ Examples/MAX32665/Bluetooth/RF_Test/main.c | 4 ++++ Examples/MAX32690/Bluetooth/RF_Test/main.c | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/Examples/MAX32655/Bluetooth/RF_Test/main.c b/Examples/MAX32655/Bluetooth/RF_Test/main.c index e4387d401e..f2919ceb67 100644 --- a/Examples/MAX32655/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32655/Bluetooth/RF_Test/main.c @@ -706,6 +706,10 @@ void txTestTask(void *pvParameters) if (testConfig.testType == BLE_TX_TEST) { res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { + // Transmitters decision if it is S2 or S8. + if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + phy = LL_PHY_LE_CODED; + } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); } xTaskResumeAll(); //Restore scheduler diff --git a/Examples/MAX32665/Bluetooth/RF_Test/main.c b/Examples/MAX32665/Bluetooth/RF_Test/main.c index 1659783e48..87cd83fe30 100644 --- a/Examples/MAX32665/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32665/Bluetooth/RF_Test/main.c @@ -709,6 +709,10 @@ void txTestTask(void *pvParameters) if (testConfig.testType == BLE_TX_TEST) { res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { + // Transmitters decision if it is S2 or S8. + if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + phy = LL_PHY_LE_CODED; + } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); } xTaskResumeAll(); //Restore scheduler diff --git a/Examples/MAX32690/Bluetooth/RF_Test/main.c b/Examples/MAX32690/Bluetooth/RF_Test/main.c index a6c78d8b50..05335263ec 100644 --- a/Examples/MAX32690/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32690/Bluetooth/RF_Test/main.c @@ -710,6 +710,10 @@ void txTestTask(void *pvParameters) if (testConfig.testType == BLE_TX_TEST) { res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { + // Transmitters decision if it is S2 or S8. + if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + phy = LL_PHY_LE_CODED; + } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); } xTaskResumeAll(); //Restore scheduler From ca32bc2ec833cac81662f2d2ea59002f95527c84 Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:07:53 -0600 Subject: [PATCH 20/25] fix(Examples): BLE FreeRTOS Tickless (#1258) Co-authored-by: EricB-ADI --- Libraries/BlePhy/MAX32665/libphy.a | Bin 543138 -> 531176 bytes Libraries/BlePhy/MAX32665/libphy_hard.a | Bin 543094 -> 114324 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Libraries/BlePhy/MAX32665/libphy.a b/Libraries/BlePhy/MAX32665/libphy.a index 7087392eb6c876d5fd4e9b027dbb0b69c3b7c12d..012c56a7d88335b1416aa2a668dc975fb0f63cb7 100644 GIT binary patch delta 152712 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Ξ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 B{_X$( delta 158437 zcmc${cYGDa`aiz2r|mh}gltX%X(S<(gdTb*fdCOv0)#3cod5w5LJ@W#;hmL+`d>o~3C#Tb z|1DhF!Z80+xGl#p8NT@T{|vGJM(KDRU*D0&U&2{AhVQ=#2R0hMPfk5C#7<=VKhgfG zB;zk(%SyxlUxnCztN8Er0uP;U{HG9%wlMxB44-TS8Dd8xNAX-R*Szzu;hD8Y@VF4N z?=k)onq6mv{!)WzpFC(Oztyl z>d>jv=1rYnHDKzZ-qRLLoi}XO)T!0A>w-N4*1Vbt!xqe$H#Poj!l=N!nu-PU;s@?X zjqi9WRNKqm27Lpj=T4YC^=!|O z0qv89EtpU_W1f!AUtr8X>r65cn|{`e*$Xj^lbbWl-@xCgsB=-gcV>YqtDTW)ndT#* z`26fHso9ocn0>zXm%Fbtm=dN=-1cDF=7W_Mp|N>lL6aq&RIW@=x&Rl`n+eaW{< z0*2wYE{V@>*h76AzqMgOy`kXyukp1|5G(70`1=ie#md8PnTBD1>^F?S!05X$W!P=O z2@Hz9fwVH6`U zLg$lbKOQz>Mqs3-n%K`%bebj#?N>>R(nKpe1C9hnYYRno3ld{A(b29(83U(lqS(HK z#8^%Aum_{k0^_uSQu{WRZoDSS>`y6~po#u=>UoqiC>2$&`b;Buw4NrzKyXO(8bGqW9r*>ldP=v) z_;4r<4vSs~QMP>*au0eH)x@4eYa?_%h4w}th>@CTW#5cq22YDVfHXz6Ny#WJDYcu@ z9j~6s?CWUFtEc|Ox8rTy_wEU(Zm9K8Hq|w)Yx?-rs`am)SF&iWCW){0*{y4 z*D<5%@$2&nVpYD+Q1FDZP{y$RIRS=UQmDBr!}At?UUf9~vIbfp(ES1DS?U+wlR7x~Y-zm5qiZjfYKZ zV)WCHVWirf;~zKbkaa7n)S9Zx)5@NOTC}EVd6B&(-XXsl3xA|7cnyZ#zV*81AQW}DB-EO*hYgDpZ{j18ZwR+qXRTc4_g9ocoaaA!` zRmF$ke`$Pc#o4I1j3I;7d+`}VzEOwbqlc1nVCY~~8gDdgu-X!zi~oxFo?$K3OYyIU zHC6-T&hUc3m5mJJ%lM=pqVbC1$?B%~q~QhTiu^0at7d9fd?ysF0>e1jo%FUZ8b1UL z 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�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 QlD~;p)s4>HqHzAd0eh}kdH?_b diff --git a/Libraries/BlePhy/MAX32665/libphy_hard.a b/Libraries/BlePhy/MAX32665/libphy_hard.a index 264622227a0e379da103b0f7d9ffc27f4c0fdda3..16756f514412a51a4b00dcc61bdcda59c89816cb 100644 GIT binary patch literal 114324 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

Lir}&&mZJ%$vWeMWF9G+*u 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 literal 543094 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↱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 z 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 Date: Fri, 8 Nov 2024 14:05:50 -0600 Subject: [PATCH 21/25] fix(Examples): RF Test (#1260) --- Examples/MAX32655/Bluetooth/RF_Test/main.c | 2 +- Examples/MAX32665/Bluetooth/RF_Test/main.c | 2 +- Examples/MAX32690/Bluetooth/RF_Test/main.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Examples/MAX32655/Bluetooth/RF_Test/main.c b/Examples/MAX32655/Bluetooth/RF_Test/main.c index f2919ceb67..dfc79fea45 100644 --- a/Examples/MAX32655/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32655/Bluetooth/RF_Test/main.c @@ -707,7 +707,7 @@ void txTestTask(void *pvParameters) res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { // Transmitters decision if it is S2 or S8. - if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + if (phy == LL_TEST_PHY_LE_CODED_S8 || phy == LL_TEST_PHY_LE_CODED_S2) { phy = LL_PHY_LE_CODED; } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); diff --git a/Examples/MAX32665/Bluetooth/RF_Test/main.c b/Examples/MAX32665/Bluetooth/RF_Test/main.c index 87cd83fe30..eb3f0453d5 100644 --- a/Examples/MAX32665/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32665/Bluetooth/RF_Test/main.c @@ -710,7 +710,7 @@ void txTestTask(void *pvParameters) res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { // Transmitters decision if it is S2 or S8. - if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + if (phy == LL_TEST_PHY_LE_CODED_S8 || phy == LL_TEST_PHY_LE_CODED_S2) { phy = LL_PHY_LE_CODED; } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); diff --git a/Examples/MAX32690/Bluetooth/RF_Test/main.c b/Examples/MAX32690/Bluetooth/RF_Test/main.c index 05335263ec..c709d93a23 100644 --- a/Examples/MAX32690/Bluetooth/RF_Test/main.c +++ b/Examples/MAX32690/Bluetooth/RF_Test/main.c @@ -711,7 +711,7 @@ void txTestTask(void *pvParameters) res = LlEnhancedTxTest(testConfig.channel, packetLen, packetType, phy, 0); } else { // Transmitters decision if it is S2 or S8. - if (phy == LL_PHY_LE_CODED_S8 || phy == LL_PHY_LE_CODED_S2) { + if (phy == LL_TEST_PHY_LE_CODED_S8 || phy == LL_TEST_PHY_LE_CODED_S2) { phy = LL_PHY_LE_CODED; } res = LlEnhancedRxTest(testConfig.channel, phy, 0, 0); From d2480e18f148a307b1e70ce16b07a4d674ff82b9 Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:33:35 -0600 Subject: [PATCH 22/25] feat(Build): Added CXX_STANDARD flag to override default when compiling for C++ (#1259) --- Libraries/CMSIS/Device/Maxim/GCC/gcc.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk index 09c3046c59..ebba9d7c63 100644 --- a/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk +++ b/Libraries/CMSIS/Device/Maxim/GCC/gcc.mk @@ -405,10 +405,11 @@ CFLAGS=-mthumb \ # The flags passed to the C++ compiler. CXXFLAGS := $(CFLAGS) +CXX_STANDARD?=17 CXXFLAGS += \ -fno-rtti \ -fno-exceptions \ - -std=c++11 \ + -std=c++$(CXX_STANDARD) # On GCC version > 4.8.0 use the -fno-isolate-erroneous-paths-dereference flag ifeq "$(GCCVERSIONGTEQ4)" "1" From d63fdfa43a279f7187e4e957568a51291b2c954b Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:37:02 -0600 Subject: [PATCH 23/25] fix(PeriphDrivers): Fix SDHC CFG register fields and C++ definitions for MAX32665 (#1264) --- Libraries/CMSIS/Device/Maxim/MAX32665/Include/adc_regs.h | 6 +++++- .../CMSIS/Device/Maxim/MAX32665/Include/aeskeys_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/dma_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/dvs_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/fcr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/flc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/gcr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/gpio_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/htmr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/i2c_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/icc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/mcr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/owm_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/pt_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/ptg_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/pwrseq_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/rpu_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/rtc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/sdhc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/sema_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/simo_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/sir_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/smon_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/spi_regs.h | 6 +++++- .../CMSIS/Device/Maxim/MAX32665/Include/spixfc_fifo_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfm_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/srcc_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/tmr_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/tpu_regs.h | 6 +++++- .../CMSIS/Device/Maxim/MAX32665/Include/trimsir_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/trng_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/uart_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/usbhs_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/wdt_regs.h | 6 +++++- Libraries/CMSIS/Device/Maxim/MAX32665/Include/wut_regs.h | 6 +++++- 37 files changed, 185 insertions(+), 37 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/adc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/adc_regs.h index 851db41e82..4e868f4b35 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/adc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/adc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/aeskeys_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/aeskeys_regs.h index cacc4c83e1..77b16a9fe4 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/aeskeys_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/aeskeys_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dma_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dma_regs.h index 5e11de9b1c..771600c50e 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dma_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dma_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dvs_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dvs_regs.h index fb763033e7..6b58cce1e2 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dvs_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/dvs_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/fcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/fcr_regs.h index cd85a68daf..e2eb3aa7ea 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/fcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/fcr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/flc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/flc_regs.h index 7caf5d1df1..964d56ab12 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/flc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/flc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gcr_regs.h index a79038e757..deeb1bf9f4 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gcr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gpio_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gpio_regs.h index 323b210e3d..1ca772ebcc 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gpio_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/gpio_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/htmr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/htmr_regs.h index adb5b213ed..3f55ef697a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/htmr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/htmr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/i2c_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/i2c_regs.h index 16868a9120..a11c1f3194 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/i2c_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/i2c_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/icc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/icc_regs.h index b447df86a8..b8a3571c51 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/icc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/icc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/mcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/mcr_regs.h index 195e91bbcf..d6d34b3572 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/mcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/mcr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/owm_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/owm_regs.h index 2a9f578322..91065d3b1c 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/owm_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/owm_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pt_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pt_regs.h index 93b8d0a9a5..79bebf3982 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pt_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pt_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ptg_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ptg_regs.h index 1ddd4ea45a..39253147a8 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ptg_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/ptg_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pwrseq_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pwrseq_regs.h index fde552d265..3080978e32 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pwrseq_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/pwrseq_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rpu_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rpu_regs.h index e1c3a829ef..3a1457e3c2 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rpu_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rpu_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rtc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rtc_regs.h index 3a4162c0b5..98191bf08d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rtc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/rtc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sdhc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sdhc_regs.h index 123191e1f2..787fe6cec7 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sdhc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sdhc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sema_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sema_regs.h index 4696c10f0e..9f9863edd9 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sema_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sema_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/simo_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/simo_regs.h index a6910d957c..99009ac60e 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/simo_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/simo_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sir_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sir_regs.h index 70db2add18..83d03fe71a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sir_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/sir_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/smon_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/smon_regs.h index 583a3ab603..8aa946bc7d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/smon_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/smon_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spi_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spi_regs.h index 9e509042ea..75c0b8aff2 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spi_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spi_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_fifo_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_fifo_regs.h index 516d037ad7..d0892848ed 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_fifo_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_fifo_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_regs.h index c645b7ca54..dc166a2be5 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfm_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfm_regs.h index 2f104cf7a7..1561f50d9a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfm_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixfm_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixr_regs.h index 0b4350719e..d564e9e739 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/spixr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/srcc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/srcc_regs.h index cba5aa0b35..39c1e6e07c 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/srcc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/srcc_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tmr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tmr_regs.h index 84c50e19a1..23918e839a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tmr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tmr_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tpu_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tpu_regs.h index 90e5297639..57bd07f196 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tpu_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/tpu_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trimsir_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trimsir_regs.h index 0c0bfc79c7..3b76d5acb0 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trimsir_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trimsir_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trng_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trng_regs.h index b6dd963bc8..74a1d8bfc7 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trng_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/trng_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/uart_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/uart_regs.h index 480b1d9d15..d2f3a5d615 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/uart_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/uart_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/usbhs_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/usbhs_regs.h index 6486f7f6eb..9517fd38c5 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/usbhs_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/usbhs_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wdt_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wdt_regs.h index b66fbdbe34..fad161369b 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wdt_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wdt_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wut_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wut_regs.h index 81bff28353..d89a79a99b 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wut_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32665/Include/wut_regs.h @@ -50,7 +50,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile From da894c7a86ea50cd73fb1a0ba2f7b65ebfa44e6c Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Mon, 11 Nov 2024 13:45:27 -0600 Subject: [PATCH 24/25] fix(PeriphDrivers): Fix infinite loop check with STOP condition in I2C RevA (#1263) --- Libraries/PeriphDrivers/Source/I2C/i2c_reva.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/PeriphDrivers/Source/I2C/i2c_reva.c b/Libraries/PeriphDrivers/Source/I2C/i2c_reva.c index c28aa3be13..c2c2e172aa 100644 --- a/Libraries/PeriphDrivers/Source/I2C/i2c_reva.c +++ b/Libraries/PeriphDrivers/Source/I2C/i2c_reva.c @@ -994,7 +994,7 @@ int MXC_I2C_RevA_MasterTransaction(mxc_i2c_reva_req_t *req) } else { i2c->mstctrl |= MXC_F_I2C_REVA_MSTCTRL_STOP; - while (!(i2c->mstctrl & MXC_F_I2C_REVA_MSTCTRL_STOP)) {} + while ((i2c->mstctrl & MXC_F_I2C_REVA_MSTCTRL_STOP)) {} // Wait for Transaction to finish } From 9bb8b5042bcb70100e9b8449fbba74fbba9801c0 Mon Sep 17 00:00:00 2001 From: EricB-ADI <122300463+EricB-ADI@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:59:37 -0600 Subject: [PATCH 25/25] chore(PeriphDrivers): Fix C++ definitions, Update FCR registers to latest design, and add BLE LDO SVD Enumerations for MAX32657(#1262) Co-authored-by: Woo --- .../Device/Maxim/MAX32657/Include/aes_regs.h | 6 +- .../Maxim/MAX32657/Include/aeskeys_regs.h | 6 +- .../Maxim/MAX32657/Include/boost_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/crc_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/dma_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/fcr_regs.h | 20 +++--- .../Device/Maxim/MAX32657/Include/flc_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/gcr_regs.h | 22 ++++++- .../Device/Maxim/MAX32657/Include/gpio_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/i3c_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/icc_regs.h | 6 +- .../Maxim/MAX32657/Include/max32657.svd | 64 ++++++++++++++----- .../Device/Maxim/MAX32657/Include/mcr_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/mpc_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/nspc_regs.h | 6 +- .../Maxim/MAX32657/Include/pwrseq_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/rstz_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/rtc_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/sir_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/spc_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/spi_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/tmr_regs.h | 6 +- .../Maxim/MAX32657/Include/trimsir_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/trng_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/uart_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/wdt_regs.h | 6 +- .../Device/Maxim/MAX32657/Include/wut_regs.h | 6 +- .../PeriphDrivers/Source/SYS/SVD/fcr_me30.svd | 20 ++---- .../PeriphDrivers/Source/SYS/SVD/gcr_me30.svd | 44 +++++++++++++ 29 files changed, 246 insertions(+), 68 deletions(-) diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aes_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aes_regs.h index d76e19f69a..42275a34f7 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aes_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aes_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aeskeys_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aeskeys_regs.h index 3e030d4cce..85a60d26d0 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aeskeys_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/aeskeys_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/boost_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/boost_regs.h index f501eddd82..05f1eb8a6c 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/boost_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/boost_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/crc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/crc_regs.h index 8f2430af69..6681c1a942 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/crc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/crc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/dma_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/dma_regs.h index 7c19634859..8e6c2b89a5 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/dma_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/dma_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/fcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/fcr_regs.h index 62b4e1f24a..3103f26202 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/fcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/fcr_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile @@ -114,12 +118,6 @@ typedef struct { * @brief Function Control 0 Register. * @{ */ -#define MXC_F_FCR_CTRL_BTLELDO_RF_POS 0 /**< CTRL_BTLELDO_RF Position */ -#define MXC_F_FCR_CTRL_BTLELDO_RF ((uint32_t)(0x1FUL << MXC_F_FCR_CTRL_BTLELDO_RF_POS)) /**< CTRL_BTLELDO_RF Mask */ - -#define MXC_F_FCR_CTRL_BTLELDO_BB_POS 8 /**< CTRL_BTLELDO_BB Position */ -#define MXC_F_FCR_CTRL_BTLELDO_BB ((uint32_t)(0x1FUL << MXC_F_FCR_CTRL_BTLELDO_BB_POS)) /**< CTRL_BTLELDO_BB Mask */ - #define MXC_F_FCR_CTRL_I3CDGEN0_POS 20 /**< CTRL_I3CDGEN0 Position */ #define MXC_F_FCR_CTRL_I3CDGEN0 ((uint32_t)(0x1UL << MXC_F_FCR_CTRL_I3CDGEN0_POS)) /**< CTRL_I3CDGEN0 Mask */ @@ -215,8 +213,8 @@ typedef struct { * @brief Interrupt Flag Register. * @{ */ -#define MXC_F_FCR_INTFL_ERTOC_RDY_POS 0 /**< INTFL_ERTOC_RDY Position */ -#define MXC_F_FCR_INTFL_ERTOC_RDY ((uint32_t)(0x1UL << MXC_F_FCR_INTFL_ERTOC_RDY_POS)) /**< INTFL_ERTOC_RDY Mask */ +#define MXC_F_FCR_INTFL_ERFO_RDY_POS 0 /**< INTFL_ERFO_RDY Position */ +#define MXC_F_FCR_INTFL_ERFO_RDY ((uint32_t)(0x1UL << MXC_F_FCR_INTFL_ERFO_RDY_POS)) /**< INTFL_ERFO_RDY Mask */ #define MXC_F_FCR_INTFL_FRQCNT_POS 1 /**< INTFL_FRQCNT Position */ #define MXC_F_FCR_INTFL_FRQCNT ((uint32_t)(0x1UL << MXC_F_FCR_INTFL_FRQCNT_POS)) /**< INTFL_FRQCNT Mask */ @@ -229,8 +227,8 @@ typedef struct { * @brief Interrupt Enable Register. * @{ */ -#define MXC_F_FCR_INTEN_ERTOC_RDY_POS 0 /**< INTEN_ERTOC_RDY Position */ -#define MXC_F_FCR_INTEN_ERTOC_RDY ((uint32_t)(0x1UL << MXC_F_FCR_INTEN_ERTOC_RDY_POS)) /**< INTEN_ERTOC_RDY Mask */ +#define MXC_F_FCR_INTEN_ERFO_RDY_POS 0 /**< INTEN_ERFO_RDY Position */ +#define MXC_F_FCR_INTEN_ERFO_RDY ((uint32_t)(0x1UL << MXC_F_FCR_INTEN_ERFO_RDY_POS)) /**< INTEN_ERFO_RDY Mask */ #define MXC_F_FCR_INTEN_FRQCNT_POS 1 /**< INTEN_FRQCNT Position */ #define MXC_F_FCR_INTEN_FRQCNT ((uint32_t)(0x1UL << MXC_F_FCR_INTEN_FRQCNT_POS)) /**< INTEN_FRQCNT Mask */ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/flc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/flc_regs.h index 491a95737d..1894e55095 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/flc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/flc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gcr_regs.h index d49be0aa3b..3c5536ea23 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gcr_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile @@ -571,6 +575,14 @@ typedef struct { #define MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS 2 /**< BTLELDOCTRL_BB_VSEL Position */ #define MXC_F_GCR_BTLELDOCTRL_BB_VSEL ((uint32_t)(0x3UL << MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS)) /**< BTLELDOCTRL_BB_VSEL Mask */ +#define MXC_V_GCR_BTLELDOCTRL_BB_VSEL_0_9 ((uint32_t)0x0UL) /**< BTLELDOCTRL_BB_VSEL_0_9 Value */ +#define MXC_S_GCR_BTLELDOCTRL_BB_VSEL_0_9 (MXC_V_GCR_BTLELDOCTRL_BB_VSEL_0_9 << MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS) /**< BTLELDOCTRL_BB_VSEL_0_9 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_0 ((uint32_t)0x1UL) /**< BTLELDOCTRL_BB_VSEL_1_0 Value */ +#define MXC_S_GCR_BTLELDOCTRL_BB_VSEL_1_0 (MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_0 << MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS) /**< BTLELDOCTRL_BB_VSEL_1_0 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_1 ((uint32_t)0x2UL) /**< BTLELDOCTRL_BB_VSEL_1_1 Value */ +#define MXC_S_GCR_BTLELDOCTRL_BB_VSEL_1_1 (MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_1 << MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS) /**< BTLELDOCTRL_BB_VSEL_1_1 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_2 ((uint32_t)0x3UL) /**< BTLELDOCTRL_BB_VSEL_1_2 Value */ +#define MXC_S_GCR_BTLELDOCTRL_BB_VSEL_1_2 (MXC_V_GCR_BTLELDOCTRL_BB_VSEL_1_2 << MXC_F_GCR_BTLELDOCTRL_BB_VSEL_POS) /**< BTLELDOCTRL_BB_VSEL_1_2 Setting */ #define MXC_F_GCR_BTLELDOCTRL_RF_EN_POS 4 /**< BTLELDOCTRL_RF_EN Position */ #define MXC_F_GCR_BTLELDOCTRL_RF_EN ((uint32_t)(0x1UL << MXC_F_GCR_BTLELDOCTRL_RF_EN_POS)) /**< BTLELDOCTRL_RF_EN Mask */ @@ -580,6 +592,14 @@ typedef struct { #define MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS 6 /**< BTLELDOCTRL_RF_VSEL Position */ #define MXC_F_GCR_BTLELDOCTRL_RF_VSEL ((uint32_t)(0x3UL << MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS)) /**< BTLELDOCTRL_RF_VSEL Mask */ +#define MXC_V_GCR_BTLELDOCTRL_RF_VSEL_0_9 ((uint32_t)0x0UL) /**< BTLELDOCTRL_RF_VSEL_0_9 Value */ +#define MXC_S_GCR_BTLELDOCTRL_RF_VSEL_0_9 (MXC_V_GCR_BTLELDOCTRL_RF_VSEL_0_9 << MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS) /**< BTLELDOCTRL_RF_VSEL_0_9 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_0 ((uint32_t)0x1UL) /**< BTLELDOCTRL_RF_VSEL_1_0 Value */ +#define MXC_S_GCR_BTLELDOCTRL_RF_VSEL_1_0 (MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_0 << MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS) /**< BTLELDOCTRL_RF_VSEL_1_0 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_1 ((uint32_t)0x2UL) /**< BTLELDOCTRL_RF_VSEL_1_1 Value */ +#define MXC_S_GCR_BTLELDOCTRL_RF_VSEL_1_1 (MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_1 << MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS) /**< BTLELDOCTRL_RF_VSEL_1_1 Setting */ +#define MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_2 ((uint32_t)0x3UL) /**< BTLELDOCTRL_RF_VSEL_1_2 Value */ +#define MXC_S_GCR_BTLELDOCTRL_RF_VSEL_1_2 (MXC_V_GCR_BTLELDOCTRL_RF_VSEL_1_2 << MXC_F_GCR_BTLELDOCTRL_RF_VSEL_POS) /**< BTLELDOCTRL_RF_VSEL_1_2 Setting */ #define MXC_F_GCR_BTLELDOCTRL_RF_BP_EN_POS 8 /**< BTLELDOCTRL_RF_BP_EN Position */ #define MXC_F_GCR_BTLELDOCTRL_RF_BP_EN ((uint32_t)(0x1UL << MXC_F_GCR_BTLELDOCTRL_RF_BP_EN_POS)) /**< BTLELDOCTRL_RF_BP_EN Mask */ diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gpio_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gpio_regs.h index 6005fb7982..bd4852c526 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gpio_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/gpio_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/i3c_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/i3c_regs.h index 02d2f94eae..29bf4ed462 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/i3c_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/i3c_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/icc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/icc_regs.h index e7691d5549..d0f3643463 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/icc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/icc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.svd b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.svd index ecfcfda3e4..0beab42655 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.svd +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/max32657.svd @@ -1265,18 +1265,6 @@ 0x00 read-write - - BTLELDO_RF - BTLE LDO RF Trim. - 0 - 5 - - - BTLELDO_BB - BTLE LDO BB Trim. - 8 - 5 - I3CDGEN0 I3C SDA Glitch Filter Enable. @@ -1504,8 +1492,8 @@ read-write - ERTOC_RDY - ERTCO 32K Ready. + ERFO_RDY + ERFO Ready. 0 1 @@ -1524,8 +1512,8 @@ read-write - ERTOC_RDY - ERTCO 32K Ready Interrupt Enable. + ERFO_RDY + ERFO Ready Interrupt Enable. 0 1 @@ -2808,6 +2796,28 @@ Voltage Selection for BB LDO. 2 2 + + + 0_9 + 0.9V + 0 + + + 1_0 + 1.0V + 1 + + + 1_1 + 1.1V + 2 + + + 1_2 + 1.2V + 3 + + RF_EN @@ -2826,6 +2836,28 @@ LDO RF Voltage Setting. 6 2 + + + 0_9 + 0.9V + 0 + + + 1_0 + 1.0V + 1 + + + 1_1 + 1.1V + 2 + + + 1_2 + 1.2V + 3 + + RF_BP_EN diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mcr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mcr_regs.h index 039c79405e..a463cd22cc 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mcr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mcr_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mpc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mpc_regs.h index 5944ce49d4..3d61fa74a1 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mpc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/mpc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/nspc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/nspc_regs.h index fd2b7bb166..070c5e3fbf 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/nspc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/nspc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/pwrseq_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/pwrseq_regs.h index 216ede9b62..0ee8c4d562 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/pwrseq_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/pwrseq_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rstz_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rstz_regs.h index 5920d77a62..62f5a9d3c2 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rstz_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rstz_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rtc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rtc_regs.h index f54cf7b4c2..02232d7035 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rtc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/rtc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/sir_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/sir_regs.h index 8be7861a5a..2d3a8ae58d 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/sir_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/sir_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spc_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spc_regs.h index 69408b70f4..34b24863af 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spc_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spc_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spi_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spi_regs.h index 75860a7efc..5f8ecaad1f 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spi_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/spi_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/tmr_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/tmr_regs.h index 61b8e57c73..94bf7f6dfc 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/tmr_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/tmr_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trimsir_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trimsir_regs.h index 63a2682e7a..8c2fb8dc93 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trimsir_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trimsir_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trng_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trng_regs.h index 362dd3551e..f76ab2eaa7 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trng_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/trng_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/uart_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/uart_regs.h index 831c2a57de..98bacabc31 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/uart_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/uart_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wdt_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wdt_regs.h index 1e62996109..99d6039e89 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wdt_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wdt_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wut_regs.h b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wut_regs.h index 37f3861f46..8969ba670a 100644 --- a/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wut_regs.h +++ b/Libraries/CMSIS/Device/Maxim/MAX32657/Include/wut_regs.h @@ -48,7 +48,11 @@ extern "C" { #define __IO volatile #endif #ifndef __I -#define __I volatile const +#ifdef __cplusplus +#define __I volatile +#else +#define __I volatile const +#endif #endif #ifndef __O #define __O volatile diff --git a/Libraries/PeriphDrivers/Source/SYS/SVD/fcr_me30.svd b/Libraries/PeriphDrivers/Source/SYS/SVD/fcr_me30.svd index 005effeba8..e540a715e1 100644 --- a/Libraries/PeriphDrivers/Source/SYS/SVD/fcr_me30.svd +++ b/Libraries/PeriphDrivers/Source/SYS/SVD/fcr_me30.svd @@ -16,18 +16,6 @@ 0x00 read-write - - BTLELDO_RF - BTLE LDO RF Trim. - 0 - 5 - - - BTLELDO_BB - BTLE LDO BB Trim. - 8 - 5 - I3CDGEN0 I3C SDA Glitch Filter Enable. @@ -255,8 +243,8 @@ read-write - ERTOC_RDY - ERTCO 32K Ready. + ERFO_RDY + ERFO Ready. 0 1 @@ -275,8 +263,8 @@ read-write - ERTOC_RDY - ERTCO 32K Ready Interrupt Enable. + ERFO_RDY + ERFO Ready Interrupt Enable. 0 1 diff --git a/Libraries/PeriphDrivers/Source/SYS/SVD/gcr_me30.svd b/Libraries/PeriphDrivers/Source/SYS/SVD/gcr_me30.svd index a580c6ad64..86ff7156d9 100644 --- a/Libraries/PeriphDrivers/Source/SYS/SVD/gcr_me30.svd +++ b/Libraries/PeriphDrivers/Source/SYS/SVD/gcr_me30.svd @@ -896,6 +896,28 @@ Voltage Selection for BB LDO. 2 2 + + + 0_9 + 0.9V + 0 + + + 1_0 + 1.0V + 1 + + + 1_1 + 1.1V + 2 + + + 1_2 + 1.2V + 3 + + RF_EN @@ -914,6 +936,28 @@ LDO RF Voltage Setting. 6 2 + + + 0_9 + 0.9V + 0 + + + 1_0 + 1.0V + 1 + + + 1_1 + 1.1V + 2 + + + 1_2 + 1.2V + 3 + + RF_BP_EN