diff --git a/lib/stm32wb/hci/README b/lib/stm32wb/hci/README
index e9b5936d..391e1a99 100644
--- a/lib/stm32wb/hci/README
+++ b/lib/stm32wb/hci/README
@@ -6,7 +6,7 @@ Origin:
https://github.com/STMicroelectronics/STM32CubeWB
Status:
- version 1.5.0
+ version 1.8.0
Purpose:
This library is used on stm32wb series to enable HCI communication between
@@ -25,7 +25,7 @@ URL:
https://github.com/STMicroelectronics/STM32CubeWB
commit:
- 2b2c57a80d71ffeec182cc520e5a72af7b94778d
+ 24ba9f167a82143a0a4fa8772cd4466070bcdb82
Maintained-by:
External
@@ -44,6 +44,7 @@ Patch List:
- hw_ipcc.c
- app_common.h
- stm32_wpan_common.h
+ - ble_bufsize.h
* Remove dependency to hw_conf.h
This file is not actually needed. Remove inclusion so we don't need
@@ -58,3 +59,11 @@ Patch List:
In case C-M0 binary includes BLE Host, inform that it should not be
used as, in Zephyr context, it is running on C-M4 side.
Impacted file: app_conf.h
+
+ * Add dependency to ble_bufsize.h
+ Some definitions of this file are now needed in app_conf.h
+ In original library, this inclusion is made indirectly through many
+ files. In order to limit the numbers of files to include, use a
+ shortcut and include directly this file.
+ Impacted file: app_conf.h
+ ST Internal Reference: 91777
diff --git a/lib/stm32wb/hci/app_common.h b/lib/stm32wb/hci/app_common.h
index 1165419a..4a21078d 100644
--- a/lib/stm32wb/hci/app_common.h
+++ b/lib/stm32wb/hci/app_common.h
@@ -78,7 +78,7 @@ extern "C"{
#define MODSUB( a, b, m ) MODADD( a, (m)-(b), m )
#define PAUSE( t ) M_BEGIN \
- __IO int _i; \
+ volatile int _i; \
for ( _i = t; _i > 0; _i -- ); \
M_END
diff --git a/lib/stm32wb/hci/app_conf.h b/lib/stm32wb/hci/app_conf.h
index 3d869cb2..c9baba1a 100644
--- a/lib/stm32wb/hci/app_conf.h
+++ b/lib/stm32wb/hci/app_conf.h
@@ -1,10 +1,10 @@
/**
- ******************************************************************************
- * @file app_conf.h
- * @author MCD Application Team
- * @brief Application configuration file
- ******************************************************************************
- * @attention
+ ******************************************************************************
+ * @file app_conf.h
+ * @author MCD Application Team
+ * @brief Application configuration file
+ ******************************************************************************
+ * @attention
*
*
© Copyright (c) 2019 STMicroelectronics.
* All rights reserved.
@@ -19,23 +19,24 @@
/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __APP_CONF_H
-#define __APP_CONF_H
+#ifndef __APP_CONFIG_H
+#define __APP_CONFIG_H
#include "hw.h"
/* hw_conf.h file is not used, remove the dependency */
/* #include "hw_conf.h" */
#include "hw_if.h"
+#include "ble_bufsize.h"
/******************************************************************************
- * Data Throughput Application Config
+ * Health Thermometer Application Config
******************************************************************************/
/**< generic parameters ******************************************************/
/**
* Define Tx Power
- */
+ */
#define CFG_TX_POWER (0x18) /**< 0dbm */
/**
@@ -66,7 +67,7 @@
#define CFG_IO_CAPABILITY_KEYBOARD_DISPLAY (0x04)
#define CFG_IO_CAPABILITY CFG_IO_CAPABILITY_DISPLAY_ONLY
-
+
/**
* Define MITM modes
*/
@@ -75,27 +76,23 @@
#define CFG_MITM_PROTECTION CFG_MITM_PROTECTION_REQUIRED
-/**
- * Generic Access Appearance
- */
-#define CFG_UNKNOWN_APPEARANCE (0)
-#define CFG_GAP_APPEARANCE (832)
-
/**
* Define PHY
*/
#define ALL_PHYS_PREFERENCE 0x00
#define RX_2M_PREFERRED 0x02
#define TX_2M_PREFERRED 0x02
-#define RX_1M_PREFERRED 0x01
-#define TX_1M_PREFERRED 0x01
-#define RX_ALL_PHY_PREFERRED 0x03
-#define TX_ALL_PHY_PREFERRED 0x03
#define TX_1M 0x01
#define TX_2M 0x02
#define RX_1M 0x01
-#define RX_2M 0x02
-
+#define RX_2M 0x02
+
+/**
+ * Generic Access Appearance
+ */
+#define CFG_UNKNOWN_APPEARANCE (0)
+#define CFG_GAP_APPEARANCE (832)
+
/**
* Identity root key used to derive LTK and CSRK
*/
@@ -116,80 +113,13 @@
/* USER CODE END Generic_Parameters */
/**< specific parameters ********************************************************/
-/**
- * Encryption enable when set to 1
- * Encryption disabe when set to 0
- */
-#define CFG_ENCRYPTION_ENABLE 0
+#define CFG_MAX_CONNECTION (8)
-/**
- * Define the different role supported
- * In this application
- * When set to 1, the device is central
- * When set to 0, the device is peripheral
- */
-#define CFG_BLE_CENTRAL 1
+#define CFG_DATA_ROLE_MODE 2
-#define CFG_SERVER_ONLY 0
-/**
- * in this specific application, the device is either central
- * or peripheral but cannot be both
- */
-#undef CFG_ADV_BD_ADDRESS
-#if (CFG_BLE_CENTRAL != 0 )
-#define CFG_BLE_PERIPHERAL 0
-#define CFG_ADV_BD_ADDRESS 0xFFEEDDCCBBAA
-#else
-#define CFG_ADV_BD_ADDRESS 0x222222333333
-#define CFG_BLE_PERIPHERAL 1
-#endif
+#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
+#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
-#define PUSH_BUTTON_SW1_EXTI_IRQHandler EXTI4_IRQHandler
-#define PUSH_BUTTON_SW2_EXTI_IRQHandler EXTI0_IRQHandler
-
-#define CONN_L(x) ((int)(((float)x)/0.625f))
-#define CONN_P(x) ((int)(((float)x)/1.25f))
-#define SCAN_P (0x320)
-#define SCAN_L (0x320)
-
-#define CFG_DEV_ID_PERIPH_SERVER (0x88)
-#define CFG_FEATURE_DT (0x70)
-
-#define UUID_128BIT_FORMAT 1
-
-#define MAX_HCI_CMD_EVENT_PAYLOAD_SIZE 255
-#define DATA_NOTIFICATION_MAX_PACKET_SIZE 240
-
-#define CFG_MAX_CONNECTION 1
-
-/**
- * TX PHY configuration
- * It shall be set to
- * 0 if ignored
- * 1 if 1M
- * 2 if 2M
- * 4 if LE_CODED
- * or any combination of 1M | 2M | LE_CODED
- */
-#define CFG_TX_PHY 1
-
-/**
- * RX PHY configuration
- * It shall be set to
- * 0 if ignored
- * 1 if 1M
- * 2 if 2M
- * 4 if LE_CODED
- * or any combination of 1M | 2M | LE_CODED
- */
-#define CFG_RX_PHY 1
-
-/**
- * ALL PHYS configuration
- */
-#define CFG_ALL_PHYS ((!CFG_TX_PHY) + ((!CFG_RX_PHY)*2))
-#define L2CAP_SLAVE_LATENCY 0x0000
-#define L2CAP_TIMEOUT_MULTIPLIER 0x1F4
/******************************************************************************
* BLE Stack
******************************************************************************/
@@ -217,7 +147,7 @@
/**
* Maximum supported ATT_MTU size
*/
-#define CFG_BLE_MAX_ATT_MTU (250)
+#define CFG_BLE_MAX_ATT_MTU (156)
/**
* Size of the storage area for Attribute values
@@ -234,12 +164,12 @@
/**
* Prepare Write List size in terms of number of packet with ATT_MTU=23 bytes
*/
-#define CFG_BLE_PREPARE_WRITE_LIST_SIZE ( 0x3A )
+#define CFG_BLE_PREPARE_WRITE_LIST_SIZE BLE_PREP_WRITE_X_ATT(CFG_BLE_MAX_ATT_MTU)
/**
* Number of allocated memory blocks
*/
-#define CFG_BLE_MBLOCK_COUNT ( 0x79 )
+#define CFG_BLE_MBLOCK_COUNT (BLE_MBLOCKS_CALC(CFG_BLE_PREPARE_WRITE_LIST_SIZE, CFG_BLE_MAX_ATT_MTU, CFG_BLE_NUM_LINK))
/**
* Enable or disable the Extended Packet length feature. Valid values are 0 or 1.
@@ -331,12 +261,12 @@
* UART interfaces
******************************************************************************/
-/**
+ /**
* Select UART interfaces
*/
-#define CFG_UART_GUI
-#define CFG_DEBUG_TRACE_UART hw_uart1
-#define CFG_CONSOLE_MENU hw_lpuart1
+#define CFG_UART_GUI
+#define CFG_DEBUG_TRACE_UART /*hw_uart1*/hw_lpuart1
+#define CFG_CONSOLE_MENU /*hw_lpuart1*/hw_uart1
/******************************************************************************
* USB interface
@@ -429,11 +359,11 @@
#endif
/** tick timer value in us */
-#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), HSE_VALUE/32 )
-//#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+#define CFG_TS_TICK_VAL DIVR( (CFG_RTCCLK_DIV * 1000000), LSE_VALUE )
+
typedef enum
{
- CFG_TIM_PROC_ID_ISR,
+ CFG_TIM_PROC_ID_ISR,
} CFG_TimProcID_t;
/******************************************************************************
@@ -534,19 +464,12 @@ typedef enum
/**< Add in that list all tasks that may send a ACI/HCI command */
typedef enum
{
- CFG_TASK_DATA_TRANSFER_UPDATE_ID,
- CFG_TASK_DATA_WRITE_ID,
- CFG_TASK_CONN_DEV_1_ID,
- CFG_TASK_BUTTON_ID,
- CFG_TASK_SW2_BUTTON_PUSHED_ID,
- CFG_TASK_START_ADV_ID,
- CFG_TASK_START_SCAN_ID,
- CFG_TASK_LINK_CONFIG_ID,
- CFG_TASK_APP_DATA_THROUGHPUT_ID,
- CFG_TASK_CONN_UPDATE_ID,
+ CFG_TASK_CONN_MGR_ID,
+ CFG_TASK_HID_UPDATE_REQ_ID,
+ CFG_TASK_HID_DISC_REQ_ID,
CFG_TASK_HCI_ASYNCH_EVT_ID,
- CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
+ CFG_LAST_TASK_ID_WITH_HCICMD, /**< Shall be LAST in the list */
} CFG_Task_Id_With_HCI_Cmd_t;
/**< Add in that list all tasks that never send a ACI/HCI command */
@@ -566,8 +489,8 @@ typedef enum
*/
typedef enum
{
- CFG_SCH_PRIO_0,
- CFG_PRIO_NBR,
+ CFG_SCH_PRIO_0,
+ CFG_PRIO_NBR,
} CFG_SCH_Prio_Id_t;
/**
@@ -575,10 +498,8 @@ typedef enum
*/
typedef enum
{
- CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
- CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
- CFG_IDLEEVT_GAP_PROC_COMPLETE,
- CFG_IDLEEVT_GATT_PROC_COMPLETE,
+ CFG_IDLEEVT_HCI_CMD_EVT_RSP_ID,
+ CFG_IDLEEVT_SYSTEM_HCI_CMD_EVT_RSP_ID,
} CFG_IdleEvt_Id_t;
/******************************************************************************
@@ -604,6 +525,6 @@ typedef enum
#define CFG_OTP_END_ADRESS OTP_AREA_END_ADDR
-#endif /*__APP_CONF_H */
+#endif /*__APP_CONFIG_H */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/lib/stm32wb/hci/ble_bufsize.h b/lib/stm32wb/hci/ble_bufsize.h
new file mode 100644
index 00000000..584ece0b
--- /dev/null
+++ b/lib/stm32wb/hci/ble_bufsize.h
@@ -0,0 +1,161 @@
+/*****************************************************************************
+ * @file ble_bufsize.h
+ * @author MCD Application Team
+ * @brief Definition of BLE stack buffers size
+ *****************************************************************************
+ * @attention
+ *
+ * © Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software component is licensed by ST under BSD 3-Clause license,
+ * the "License"; You may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at:
+ * opensource.org/licenses/BSD-3-Clause
+ *
+ *****************************************************************************
+ */
+
+#ifndef BLE_BUFSIZE_H__
+#define BLE_BUFSIZE_H__
+
+
+/*
+ * BLE_DEFAULT_ATT_MTU: minimum MTU value that GATT must support.
+ */
+#define BLE_DEFAULT_ATT_MTU 23
+
+/*
+ * BLE_DEFAULT_MAX_ATT_MTU: maximum supported ATT MTU size.
+ */
+#define BLE_DEFAULT_MAX_ATT_MTU 158
+
+/*
+ * BLE_DEFAULT_MAX_ATT_SIZE: maximum attribute size.
+ */
+#define BLE_DEFAULT_MAX_ATT_SIZE 512
+
+/*
+ * BLE_PREP_WRITE_X_ATT: compute how many Prepare Write Request are needed to
+ * write a characteristic with size 'max_att' when the used ATT_MTU value is
+ * equal to BLE_DEFAULT_ATT_MTU (23).
+ */
+#define BLE_PREP_WRITE_X_ATT(max_att) \
+ (DIVC(max_att, BLE_DEFAULT_ATT_MTU - 5) * 2)
+
+/*
+ * BLE_DEFAULT_PREP_WRITE_LIST_SIZE: default minimum Prepare Write List size.
+ */
+#define BLE_DEFAULT_PREP_WRITE_LIST_SIZE \
+ BLE_PREP_WRITE_X_ATT(BLE_DEFAULT_MAX_ATT_SIZE)
+
+/*
+ * BLE_MEM_BLOCK_X_MTU: compute how many memory blocks are needed to compose
+ * an ATT packet with ATT_MTU=mtu.
+ */
+#define BLE_MEM_BLOCK_SIZE 32
+
+#define BLE_MEM_BLOCK_X_TX(mtu) \
+ (DIVC((mtu) + 4U, BLE_MEM_BLOCK_SIZE) + 1U)
+
+#define BLE_MEM_BLOCK_X_RX(mtu, n_link) \
+ ((DIVC((mtu) + 4U, BLE_MEM_BLOCK_SIZE) + 2U) * (n_link) + 1)
+
+#define BLE_MEM_BLOCK_X_MTU(mtu, n_link) \
+ (BLE_MEM_BLOCK_X_TX(mtu) + BLE_MEM_BLOCK_X_RX(mtu, n_link))
+
+/*
+ * BLE_MBLOCKS_SECURE_CONNECTIONS: minimum number of blocks required for
+ * secure connections
+ */
+#define BLE_MBLOCKS_SECURE_CONNECTIONS 4
+
+/*
+ * BLE_MBLOCKS_CALC: minimum number of buffers needed by the stack.
+ * This is the minimum racomanded value and depends on:
+ * - pw: size of Prepare Write List
+ * - mtu: ATT_MTU size
+ * - n_link: maximum number of simultaneous connections
+ */
+#define BLE_MBLOCKS_CALC(pw, mtu, n_link) \
+ ((pw) + MAX(BLE_MEM_BLOCK_X_MTU(mtu, n_link), \
+ BLE_MBLOCKS_SECURE_CONNECTIONS))
+
+/*
+ * BLE_DEFAULT_MBLOCKS_COUNT: default memory blocks count
+ */
+#define BLE_DEFAULT_MBLOCKS_COUNT(n_link) \
+ BLE_MBLOCKS_CALC(BLE_DEFAULT_PREP_WRITE_LIST_SIZE, \
+ BLE_DEFAULT_MAX_ATT_MTU, n_link)
+
+/*
+ * BLE_FIXED_BUFFER_SIZE_BYTES:
+ * A part of the RAM, is dinamically allocated by initilizing all the pointers
+ * defined in a global context variable "mem_alloc_ctx_p".
+ * This initialization is made in the Dynamic_allocator functions, which
+ * assing a portion of RAM given by the external application to the above
+ * mentioned "global pointers".
+ *
+ * The size of this Dynamic RAM is made of 2 main components:
+ * - a part that is parameters-dependent (num of links, GATT buffers, ...),
+ * and which value is explicited by the following macro;
+ * - a part, that may be considered "fixed", i.e. independent from the above
+ * mentioned parameters.
+*/
+#if (SLAVE_ONLY == 0) && (LL_ONLY == 0)
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6960 /* Full stack */
+#elif SLAVE_ONLY == 0
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6256 /* LL only */
+#else
+#define BLE_FIXED_BUFFER_SIZE_BYTES 6696 /* Slave only */
+#endif
+
+/*
+ * BLE_PER_LINK_SIZE_BYTES: additional memory size used per link
+ */
+#if (SLAVE_ONLY == 0) && (LL_ONLY == 0)
+#define BLE_PER_LINK_SIZE_BYTES 380 /* Full stack */
+#elif SLAVE_ONLY == 0
+#define BLE_PER_LINK_SIZE_BYTES 196 /* LL only */
+#else
+#define BLE_PER_LINK_SIZE_BYTES 332 /* Slave only */
+#endif
+
+/*
+ * BLE_TOTAL_BUFFER_SIZE: this macro returns the amount of memory, in bytes,
+ * needed for the storage of data structures (except GATT database elements)
+ * whose size depends on the number of supported connections.
+ *
+ * @param num_links: Maximum number of simultaneous connections that the device
+ * will support. Valid values are from 1 to 8.
+ *
+ * @param mblocks_count: Number of memory blocks allocated for packets.
+ */
+#define BLE_TOTAL_BUFFER_SIZE(n_link, mblocks_count) \
+ (BLE_FIXED_BUFFER_SIZE_BYTES + \
+ (BLE_PER_LINK_SIZE_BYTES * (n_link)) + \
+ ((BLE_MEM_BLOCK_SIZE + 12) * (mblocks_count)))
+
+/*
+ * BLE_TOTAL_BUFFER_SIZE_GATT: this macro returns the amount of memory,
+ * in bytes, needed for the storage of GATT database elements.
+ *
+ * @param num_gatt_attributes: Maximum number of Attributes (i.e. the number
+ * of characteristic + the number of characteristic values + the number of
+ * descriptors, excluding the services) that can be stored in the GATT
+ * database. Note that certain characteristics and relative descriptors are
+ * added automatically during device initialization so this parameters should
+ * be 9 plus the number of user Attributes
+ *
+ * @param num_gatt_services: Maximum number of Services that can be stored in
+ * the GATT database. Note that the GAP and GATT services are automatically
+ * added so this parameter should be 2 plus the number of user services
+ *
+ * @param att_value_array_size: Size of the storage area for Attribute values.
+ */
+#define BLE_TOTAL_BUFFER_SIZE_GATT(num_gatt_attributes, num_gatt_services, att_value_array_size) \
+ (((((att_value_array_size) - 1) | 3) + 1) + \
+ (40 * (num_gatt_attributes)) + (48 * (num_gatt_services)))
+
+
+#endif /* ! BLE_BUFSIZE_H__ */
diff --git a/lib/stm32wb/hci/shci.c b/lib/stm32wb/hci/shci.c
index 78bab2f5..1edf1feb 100644
--- a/lib/stm32wb/hci/shci.c
+++ b/lib/stm32wb/hci/shci.c
@@ -308,7 +308,7 @@ SHCI_CmdStatus_t SHCI_C2_LLD_BLE_Init( uint8_t param_size, uint8_t * p_param )
p_rsp = (TL_EvtPacket_t *)local_buffer;
- shci_send( SHCI_OPCODE_C2_LLD_TESTS_INIT,
+ shci_send( SHCI_OPCODE_C2_LLD_BLE_INIT,
param_size,
p_param,
p_rsp );
@@ -534,6 +534,25 @@ SHCI_CmdStatus_t SHCI_C2_SetFlashActivityControl(SHCI_C2_SET_FLASH_ACTIVITY_CONT
return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
}
+SHCI_CmdStatus_t SHCI_C2_Config(SHCI_C2_CONFIG_Cmd_Param_t *pCmdPacket)
+{
+ /**
+ * Buffer is large enough to hold command complete without payload
+ */
+ uint8_t local_buffer[TL_BLEEVT_CS_BUFFER_SIZE];
+ TL_EvtPacket_t * p_rsp;
+
+ p_rsp = (TL_EvtPacket_t *)local_buffer;
+
+ shci_send( SHCI_OPCODE_C2_CONFIG,
+ sizeof(SHCI_C2_CONFIG_Cmd_Param_t),
+ (uint8_t*)pCmdPacket,
+ p_rsp );
+
+ return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+
+
/**
* Local System COMMAND
* These commands are NOT sent to the CPU2
diff --git a/lib/stm32wb/hci/shci.h b/lib/stm32wb/hci/shci.h
index 68246847..e737f4c5 100644
--- a/lib/stm32wb/hci/shci.h
+++ b/lib/stm32wb/hci/shci.h
@@ -63,16 +63,91 @@ extern "C" {
{
SHCI_SUB_EVT_CODE_READY = SHCI_SUB_EVT_CODE_BASE,
SHCI_SUB_EVT_ERROR_NOTIF,
+ SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE,
+ SHCI_SUB_EVT_OT_NVM_RAM_UPDATE,
+ SHCI_SUB_EVT_NVM_START_WRITE,
+ SHCI_SUB_EVT_NVM_END_WRITE,
+ SHCI_SUB_EVT_NVM_START_ERASE,
+ SHCI_SUB_EVT_NVM_END_ERASE,
} SHCI_SUB_EVT_CODE_t;
+ /**
+ * SHCI_SUB_EVT_CODE_READY
+ * This notifies the CPU1 that the CPU2 is now ready to receive commands
+ * It reports as well which firmware is running on CPU2 : The wireless stack of the FUS (previously named RSS)
+ */
typedef PACKED_STRUCT{
SHCI_SysEvt_Ready_Rsp_t sysevt_ready_rsp;
} SHCI_C2_Ready_Evt_t;
+ /**
+ * SHCI_SUB_EVT_ERROR_NOTIF
+ * This reports to the CPU1 some error form the CPU2
+ */
typedef PACKED_STRUCT{
SCHI_SystemErrCode_t errorCode;
} SHCI_C2_ErrorNotif_Evt_t;
+ /**
+ * SHCI_SUB_EVT_BLE_NVM_RAM_UPDATE
+ * This notifies the CPU1 which part of the BLE NVM RAM has been updated so that only the modified
+ * section could be written in Flash/NVM
+ * StartAddress : Start address of the section that has been modified
+ * Size : Size (in bytes) of the section that has been modified
+ */
+ typedef PACKED_STRUCT{
+ uint32_t StartAddress;
+ uint32_t Size;
+ } SHCI_C2_BleNvmRamUpdate_Evt_t;
+
+ /**
+ * SHCI_SUB_EVT_OT_NVM_RAM_UPDATE
+ * This notifies the CPU1 which part of the OT NVM RAM has been updated so that only the modified
+ * section could be written in Flash/NVM
+ * StartAddress : Start address of the section that has been modified
+ * Size : Size (in bytes) of the section that has been modified
+ */
+ typedef PACKED_STRUCT{
+ uint32_t StartAddress;
+ uint32_t Size;
+ } SHCI_C2_OtNvmRamUpdate_Evt_t;
+
+ /**
+ * SHCI_SUB_EVT_NVM_START_WRITE
+ * This notifies the CPU1 that the CPU2 has started a write procedure in Flash
+ * NumberOfWords : The number of 64bits data the CPU2 needs to write in Flash.
+ * For each 64bits data, the algorithm as described in AN5289 is executed.
+ * When this number is reported to 0, it means the Number of 64bits to be written
+ * was unknown when the procedure has started.
+ * When all data are written, the SHCI_SUB_EVT_NVM_END_WRITE event is reported
+ */
+ typedef PACKED_STRUCT{
+ uint32_t NumberOfWords;
+ } SHCI_C2_NvmStartWrite_Evt_t;
+
+ /**
+ * SHCI_SUB_EVT_NVM_END_WRITE
+ * This notifies the CPU1 that the CPU2 has written all expected data in Flash
+ */
+
+ /**
+ * SHCI_SUB_EVT_NVM_START_ERASE
+ * This notifies the CPU1 that the CPU2 has started a erase procedure in Flash
+ * NumberOfSectors : The number of sectors the CPU2 needs to erase in Flash.
+ * For each sector, the algorithm as described in AN5289 is executed.
+ * When this number is reported to 0, it means the Number of sectors to be erased
+ * was unknown when the procedure has started.
+ * When all sectors are erased, the SHCI_SUB_EVT_NVM_END_ERASE event is reported
+ */
+ typedef PACKED_STRUCT{
+ uint32_t NumberOfSectors;
+ } SHCI_C2_NvmStartErase_Evt_t;
+
+ /**
+ * SHCI_SUB_EVT_NVM_END_ERASE
+ * This notifies the CPU1 that the CPU2 has erased all expected flash sectors
+ */
+
/* SYSTEM COMMAND */
typedef PACKED_STRUCT
{
@@ -139,7 +214,8 @@ extern "C" {
SHCI_OCF_C2_LLD_TESTS_INIT,
SHCI_OCF_C2_EXTPA_CONFIG,
SHCI_OCF_C2_SET_FLASH_ACTIVITY_CONTROL,
- SHCI_OCF_C2_LLD_BLE_INIT
+ SHCI_OCF_C2_LLD_BLE_INIT,
+ SHCI_OCF_C2_CONFIG,
} SHCI_OCF_t;
#define SHCI_OPCODE_C2_FUS_GET_STATE (( SHCI_OGF << 10) + SHCI_OCF_C2_FUS_GET_STATE)
@@ -403,6 +479,62 @@ extern "C" {
/** No response parameters*/
+#define SHCI_OPCODE_C2_CONFIG (( SHCI_OGF << 10) + SHCI_OCF_C2_CONFIG)
+ /** Command parameters */
+ typedef PACKED_STRUCT{
+ uint8_t PayloadCmdSize;
+ uint8_t Config1;
+ uint8_t EvtMask1;
+ uint8_t Spare1;
+ uint32_t BleNvmRamAddress;
+ uint32_t ThreadNvmRamAddress;
+ } SHCI_C2_CONFIG_Cmd_Param_t;
+
+/**
+ * PayloadCmdSize
+ * Value that shall be used
+ */
+#define SHCI_C2_CONFIG_PAYLOAD_CMD_SIZE (sizeof(SHCI_C2_CONFIG_Cmd_Param_t) - 1)
+
+/**
+ * Config1
+ * Each definition below may be added together to build the Config1 value
+ * WARNING : Only one definition per bit shall be added to build the Config1 value
+ */
+#define SHCI_C2_CONFIG_CONFIG1_BIT0_BLE_NVM_DATA_TO_INTERNAL_FLASH (0<<0)
+#define SHCI_C2_CONFIG_CONFIG1_BIT0_BLE_NVM_DATA_TO_SRAM (1<<0)
+#define SHCI_C2_CONFIG_CONFIG1_BIT1_THREAD_NVM_DATA_TO_INTERNAL_FLASH (0<<1)
+#define SHCI_C2_CONFIG_CONFIG1_BIT1_THREAD_NVM_DATA_TO_SRAM (1<<1)
+
+/**
+ * EvtMask1
+ * Each definition below may be added together to build the EvtMask1 value
+ */
+#define SHCI_C2_CONFIG_EVTMASK1_BIT0_ERROR_NOTIF_ENABLE (1<<0)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT1_BLE_NVM_RAM_UPDATE_ENABLE (1<<1)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT2_OT_NVM_RAM_UPDATE_ENABLE (1<<2)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT3_NVM_START_WRITE_ENABLE (1<<3)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT4_NVM_END_WRITE_ENABLE (1<<4)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT5_NVM_START_ERASE_ENABLE (1<<5)
+#define SHCI_C2_CONFIG_EVTMASK1_BIT6_NVM_END_ERASE_ENABLE (1<<6)
+
+/**
+ * BleNvmRamAddress
+ * The buffer shall have a size of BLE_NVM_SRAM_SIZE number of 32bits
+ * The buffer shall be allocated in SRAM2
+ */
+#define BLE_NVM_SRAM_SIZE (507)
+
+/**
+ * ThreadNvmRamAddress
+ * The buffer shall have a size of THREAD_NVM_SRAM_SIZE number of 32bits
+ * The buffer shall be allocated in SRAM2
+ */
+#define THREAD_NVM_SRAM_SIZE (1016)
+
+
+ /** No response parameters*/
+
/* Exported type --------------------------------------------------------*/
typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
@@ -464,6 +596,7 @@ typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
#define INFO_STACK_TYPE_ZIGBEE_RFD 0x31
#define INFO_STACK_TYPE_MAC 0x40
#define INFO_STACK_TYPE_BLE_THREAD_FTD_STATIC 0x50
+#define INFO_STACK_TYPE_BLE_THREAD_FTD_DYAMIC 0x51
#define INFO_STACK_TYPE_802154_LLD_TESTS 0x60
#define INFO_STACK_TYPE_802154_PHY_VALID 0x61
#define INFO_STACK_TYPE_BLE_PHY_VALID 0x62
@@ -471,6 +604,8 @@ typedef MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
#define INFO_STACK_TYPE_BLE_RLV 0x64
#define INFO_STACK_TYPE_802154_RLV 0x65
#define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_STATIC 0x70
+#define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC 0x78
+#define INFO_STACK_TYPE_RLV 0x80
typedef struct {
/**
@@ -762,6 +897,44 @@ typedef struct {
*/
SHCI_CmdStatus_t SHCI_C2_SetFlashActivityControl(SHCI_C2_SET_FLASH_ACTIVITY_CONTROL_Source_t Source);
+ /**
+ * SHCI_C2_Config
+ * @brief Send the system configuration to the CPU2
+ *
+ * @param pCmdPacket: address of the buffer holding following parameters
+ * uint8_t PayloadCmdSize : Size of the payload - shall be SHCI_C2_CONFIG_PAYLOAD_CMD_SIZE
+ * uint8_t Config1 :
+ * - bit0 : 0 - BLE NVM Data data are flushed in internal secure flash
+ * 1 - BLE NVM Data are written in SRAM cache pointed by BleNvmRamAddress
+ * - bit1 : 0 - THREAD NVM Data data are flushed in internal secure flash
+ * 1 - THREAD NVM Data are written in SRAM cache pointed by ThreadNvmRamAddress
+ * - bit2 to bit7 : Unused, shall be set to 0
+ * uint8_t EvtMask1 :
+ * When a bit is set to 0, the event is not reported
+ * bit0 : Asynchronous Event with Sub Evt Code 0x9201 (= SHCI_SUB_EVT_ERROR_NOTIF)
+ * ...
+ * bit31 : Asynchronous Event with Sub Evt Code 0x9220
+ * uint8_t Spare1 : Unused, shall be set to 0
+ * uint32_t BleNvmRamAddress :
+ * Only considered when Config1.bit0 = 1
+ * When set to 0, data are kept in internal SRAM on CPU2
+ * Otherwise, data are copied in the cache pointed by BleNvmRamAddress
+ * The size of the buffer shall be BLE_NVM_SRAM_SIZE (number of 32bits)
+ * The buffer shall be allocated in SRAM2
+ * uint32_t ThreadNvmRamAddress :
+ * Only considered when Config1.bit1 = 1
+ * When set to 0, data are kept in internal SRAM on CPU2
+ * Otherwise, data are copied in the cache pointed by ThreadNvmRamAddress
+ * The size of the buffer shall be THREAD_NVM_SRAM_SIZE (number of 32bits)
+ * The buffer shall be allocated in SRAM2
+ *
+ * Please check macro definition to be used for this function
+ * They are defined in this file next to the definition of SHCI_OPCODE_C2_CONFIG
+ *
+ * @retval Status
+ */
+ SHCI_CmdStatus_t SHCI_C2_Config(SHCI_C2_CONFIG_Cmd_Param_t *pCmdPacket);
+
#ifdef __cplusplus
}
#endif
diff --git a/lib/stm32wb/hci/tl_mbox.c b/lib/stm32wb/hci/tl_mbox.c
index 5d7f2af7..507edba2 100644
--- a/lib/stm32wb/hci/tl_mbox.c
+++ b/lib/stm32wb/hci/tl_mbox.c
@@ -63,8 +63,8 @@ PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static MB_ZigbeeTable_t TL_Zigbee_Table;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static tListNode FreeBufQueue;
PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static tListNode TracesEvtQueue;
PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t CsBuffer[sizeof(TL_PacketHeader_t) + TL_EVT_HDR_SIZE + sizeof(TL_CsEvt_t)];
-PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static tListNode EvtQueue;
-PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static tListNode SystemEvtQueue;
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static tListNode EvtQueue;
+PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static tListNode SystemEvtQueue;
static tListNode LocalFreeBufQueue;