lib/stm32wb: hci: Update lib to V1.9.0 Cube version

Tested with 1.8 and 1.9 binary

Signed-off-by: Erwan Gouriou <erwan.gouriou@linaro.org>
diff --git a/lib/stm32wb/hci/dbg_trace.h b/lib/stm32wb/hci/dbg_trace.h
new file mode 100644
index 0000000..f833276
--- /dev/null
+++ b/lib/stm32wb/hci/dbg_trace.h
@@ -0,0 +1,104 @@
+/**
+ ******************************************************************************
+ * @file    dbg_trace.h
+ * @author  MCD Application Team
+ * @brief   Header for dbg_trace.c
+ ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. 
+  * All rights reserved.</center></h2>
+  *
+  * 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
+  *
+  ******************************************************************************
+ */
+
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __DBG_TRACE_H
+#define __DBG_TRACE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* External variables --------------------------------------------------------*/
+/* Exported macros -----------------------------------------------------------*/
+#if ( ( CFG_DEBUG_TRACE_FULL != 0 ) || ( CFG_DEBUG_TRACE_LIGHT != 0 ) )
+#define PRINT_LOG_BUFF_DBG(...) DbgTraceBuffer(__VA_ARGS__)
+#if ( CFG_DEBUG_TRACE_FULL != 0 )
+#define PRINT_MESG_DBG(...)     do{printf("\r\n [%s][%s][%d] ", DbgTraceGetFileName(__FILE__),__FUNCTION__,__LINE__);printf(__VA_ARGS__);}while(0);
+#else
+#define PRINT_MESG_DBG          printf
+#endif
+#else
+#define PRINT_LOG_BUFF_DBG(...)
+#define PRINT_MESG_DBG(...)
+#endif
+
+#define PRINT_NO_MESG(...)
+
+/* Exported functions ------------------------------------------------------- */
+
+  /**
+   * @brief Request the user to initialize the peripheral to output traces
+   *
+   * @param  None
+   * @retval None
+   */
+extern void DbgOutputInit( void );
+
+/**
+ * @brief Request the user to sent the traces on the output peripheral
+ *
+ * @param  p_data:  Address of the buffer to be sent
+ * @param  size:    Size of the data to be sent
+ * @param  cb:      Function to be called when the data has been sent
+ * @retval None
+ */
+extern void DbgOutputTraces(  uint8_t *p_data, uint16_t size, void (*cb)(void) );
+
+/**
+ * @brief DbgTraceInit Initialize Logging feature.
+ *
+ * @param:  None
+ * @retval: None
+ */
+void DbgTraceInit( void );
+
+/**********************************************************************************************************************/
+/** This function outputs into the log the buffer (in hex) and the provided format string and arguments.
+ ***********************************************************************************************************************
+ *
+ * @param pBuffer Buffer to be output into the logs.
+ * @param u32Length Length of the buffer, in bytes.
+ * @param strFormat The format string in printf() style.
+ * @param ... Arguments of the format string.
+ *
+ **********************************************************************************************************************/
+void DbgTraceBuffer( const void *pBuffer , uint32_t u32Length , const char *strFormat , ... );
+
+const char *DbgTraceGetFileName( const char *fullpath );
+
+/**
+ * @brief Override the standard lib function to redirect printf to USART.
+ * @param handle output handle (STDIO, STDERR...)
+ * @param buf buffer to write
+ * @param bufsize buffer size
+ * @retval Number of elements written
+ */
+size_t DbgTraceWrite(int handle, const unsigned char * buf, size_t bufSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__DBG_TRACE_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/lib/stm32wb/hci/hw_if.h b/lib/stm32wb/hci/hw_if.h
index f15122f..caf7253 100644
--- a/lib/stm32wb/hci/hw_if.h
+++ b/lib/stm32wb/hci/hw_if.h
@@ -10,10 +10,10 @@
   * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
   * All rights reserved.</center></h2>
   *
-  * 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

+  * 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
   *
   ******************************************************************************
   */
@@ -45,11 +45,7 @@
 #include "stm32wbxx_usb_dongle.h"
 #endif
 #ifdef  USE_STM32WBXX_NUCLEO
-  #ifdef STM32WB35xx
-  #include "nucleo_wb35ce.h"
-  #else
-  #include "stm32wbxx_nucleo.h"
-  #endif
+#include "stm32wbxx_nucleo.h"
 #endif
 #ifdef  USE_X_NUCLEO_EPD
 #include "x_nucleo_epd.h"
diff --git a/lib/stm32wb/hci/mbox_def.h b/lib/stm32wb/hci/mbox_def.h
index 1741a8c..73d1d0e 100644
--- a/lib/stm32wb/hci/mbox_def.h
+++ b/lib/stm32wb/hci/mbox_def.h
@@ -160,6 +160,29 @@
     MB_LldBleTable_t        *p_lld_ble_table;
 } MB_RefTable_t;
 
+/**
+ * This table shall be used only in the case the CPU2 runs the FUS.
+ * It is used by the command SHCI_GetWirelessFwInfo()
+ */
+typedef struct
+{
+  uint32_t  DeviceInfoTableState;
+  uint8_t   Reserved1;
+  uint8_t   LastFusActiveState;
+  uint8_t   LastWirelessStackState;
+  uint8_t   CurrentWirelessStackType;
+  uint32_t  SafeBootVersion;
+  uint32_t  FusVersion;
+  uint32_t  FusMemorySize;
+  uint32_t  WirelessStackVersion;
+  uint32_t  WirelessStackMemorySize;
+  uint32_t  WirelessFirmwareBleInfo;
+  uint32_t  WirelessFirmwareThreadInfo;
+  uint32_t  Reserved2;
+  uint64_t  UID64;
+  uint16_t  DeviceId;
+} MB_FUS_DeviceInfoTable_t ;
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/stm32wb/hci/shci.c b/lib/stm32wb/hci/shci.c
index 1edf1fe..1555933 100644
--- a/lib/stm32wb/hci/shci.c
+++ b/lib/stm32wb/hci/shci.c
@@ -392,6 +392,44 @@
   return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
 }
 
+SHCI_CmdStatus_t SHCI_C2_CONCURRENT_GetNextBleEvtTime( SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t *pParam )
+{
+  /**
+   * Buffer is large enough to hold command complete without payload
+   */
+  uint8_t local_buffer[TL_BLEEVT_CS_BUFFER_SIZE+4];
+  TL_EvtPacket_t * p_rsp;
+
+  p_rsp = (TL_EvtPacket_t *)local_buffer;
+
+  shci_send( SHCI_OPCODE_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME,
+             0,
+             0,
+             p_rsp );
+  
+  memcpy((void*)&(pParam->relative_time), (void*)&((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[1], sizeof(pParam->relative_time));
+
+  return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+  
+SHCI_CmdStatus_t SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification( void )
+{
+  /**
+   * 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_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION,
+             0,
+             0,
+             p_rsp );
+
+  return (SHCI_CmdStatus_t)(((TL_CcEvt_t*)(p_rsp->evtserial.evt.payload))->payload[0]);
+}
+
 SHCI_CmdStatus_t SHCI_C2_FLASH_StoreData( SHCI_C2_FLASH_Ip_t Ip )
 {
   /**
@@ -562,46 +600,90 @@
 {
   uint32_t ipccdba = 0;
   MB_RefTable_t * p_RefTable = NULL;
-  uint32_t version = 0;
-  uint32_t memorySize = 0;
-  uint32_t infoStack = 0;
+  uint32_t wireless_firmware_version = 0;
+  uint32_t wireless_firmware_memorySize = 0;
+  uint32_t wireless_firmware_infoStack = 0;
+  MB_FUS_DeviceInfoTable_t * p_fus_device_info_table = NULL;
+  uint32_t fus_version = 0;
+  uint32_t fus_memorySize = 0;
 
   ipccdba = READ_BIT( FLASH->IPCCBR, FLASH_IPCCBR_IPCCDBA );
-  p_RefTable = (MB_RefTable_t*)((ipccdba<<2) + SRAM2A_BASE);
+
+  /**
+   * The Device Info Table mapping depends on which firmware is running on CPU2.
+   * If the FUS is running on CPU2, FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD shall be written in the table.
+   * Otherwise, it means the Wireless Firmware is running on the CPU2
+   */
+  p_fus_device_info_table = (MB_FUS_DeviceInfoTable_t*)(*(uint32_t*)((ipccdba<<2) + SRAM2A_BASE));
+
+  if(p_fus_device_info_table->DeviceInfoTableState == FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD)
+  {
+    /* The FUS is running on CPU2 */
+    /**
+     *  Retrieve the WirelessFwInfoTable
+     *  This table is stored in RAM at startup during the TL (transport layer) initialization
+     */
+    wireless_firmware_version =  p_fus_device_info_table->WirelessStackVersion;
+    wireless_firmware_memorySize =  p_fus_device_info_table->WirelessStackMemorySize;
+    wireless_firmware_infoStack =  p_fus_device_info_table->WirelessFirmwareBleInfo;
+
+    /**
+     *  Retrieve the FusInfoTable
+     *  This table is stored in RAM at startup during the TL (transport layer) initialization
+     */
+    fus_version =  p_fus_device_info_table->FusVersion;
+    fus_memorySize =  p_fus_device_info_table->FusMemorySize;
+  }
+  else
+  {
+    /* The Wireless Firmware is running on CPU2 */
+
+    p_RefTable = (MB_RefTable_t*)((ipccdba<<2) + SRAM2A_BASE);
+
+    /**
+     *  Retrieve the WirelessFwInfoTable
+     *  This table is stored in RAM at startup during the TL (transport layer) initialization
+     */
+    wireless_firmware_version =  p_RefTable->p_device_info_table->WirelessFwInfoTable.Version;
+    wireless_firmware_memorySize =  p_RefTable->p_device_info_table->WirelessFwInfoTable.MemorySize;
+    wireless_firmware_infoStack =  p_RefTable->p_device_info_table->WirelessFwInfoTable.InfoStack;
+
+    /**
+     *  Retrieve the FusInfoTable
+     *  This table is stored in RAM at startup during the TL (transport layer) initialization
+     */
+    fus_version =  p_RefTable->p_device_info_table->FusInfoTable.Version;
+    fus_memorySize =  p_RefTable->p_device_info_table->FusInfoTable.MemorySize;
+  }
 
   /**
    *  Retrieve the WirelessFwInfoTable
    *  This table is stored in RAM at startup during the TL (transport layer) initialization
    */
-  version =  p_RefTable->p_device_info_table->WirelessFwInfoTable.Version;
-  pWirelessInfo->VersionMajor       = ((version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
-  pWirelessInfo->VersionMinor       = ((version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
-  pWirelessInfo->VersionSub         = ((version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
-  pWirelessInfo->VersionBranch      = ((version & INFO_VERSION_BRANCH_MASK) >> INFO_VERSION_BRANCH_OFFSET);
-  pWirelessInfo->VersionReleaseType = ((version & INFO_VERSION_TYPE_MASK) >> INFO_VERSION_TYPE_OFFSET);
+  pWirelessInfo->VersionMajor       = ((wireless_firmware_version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
+  pWirelessInfo->VersionMinor       = ((wireless_firmware_version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
+  pWirelessInfo->VersionSub         = ((wireless_firmware_version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
+  pWirelessInfo->VersionBranch      = ((wireless_firmware_version & INFO_VERSION_BRANCH_MASK) >> INFO_VERSION_BRANCH_OFFSET);
+  pWirelessInfo->VersionReleaseType = ((wireless_firmware_version & INFO_VERSION_TYPE_MASK) >> INFO_VERSION_TYPE_OFFSET);
 
-  memorySize =  p_RefTable->p_device_info_table->WirelessFwInfoTable.MemorySize;
-  pWirelessInfo->MemorySizeSram2B   = ((memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
-  pWirelessInfo->MemorySizeSram2A   = ((memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
-  pWirelessInfo->MemorySizeSram1    = ((memorySize & INFO_SIZE_SRAM1_MASK) >> INFO_SIZE_SRAM1_OFFSET);
-  pWirelessInfo->MemorySizeFlash    = ((memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
+  pWirelessInfo->MemorySizeSram2B   = ((wireless_firmware_memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
+  pWirelessInfo->MemorySizeSram2A   = ((wireless_firmware_memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
+  pWirelessInfo->MemorySizeSram1    = ((wireless_firmware_memorySize & INFO_SIZE_SRAM1_MASK) >> INFO_SIZE_SRAM1_OFFSET);
+  pWirelessInfo->MemorySizeFlash    = ((wireless_firmware_memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
 
-  infoStack =  p_RefTable->p_device_info_table->WirelessFwInfoTable.InfoStack;
-  pWirelessInfo->StackType          = ((infoStack & INFO_STACK_TYPE_MASK) >> INFO_STACK_TYPE_OFFSET);
+  pWirelessInfo->StackType          = ((wireless_firmware_infoStack & INFO_STACK_TYPE_MASK) >> INFO_STACK_TYPE_OFFSET);
 
   /**
    *  Retrieve the FusInfoTable
    *  This table is stored in RAM at startup during the TL (transport layer) initialization
    */
-  version =  p_RefTable->p_device_info_table->FusInfoTable.Version;
-  pWirelessInfo->FusVersionMajor       = ((version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
-  pWirelessInfo->FusVersionMinor       = ((version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
-  pWirelessInfo->FusVersionSub         = ((version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
+  pWirelessInfo->FusVersionMajor       = ((fus_version & INFO_VERSION_MAJOR_MASK) >> INFO_VERSION_MAJOR_OFFSET);
+  pWirelessInfo->FusVersionMinor       = ((fus_version & INFO_VERSION_MINOR_MASK) >> INFO_VERSION_MINOR_OFFSET);
+  pWirelessInfo->FusVersionSub         = ((fus_version & INFO_VERSION_SUB_MASK) >> INFO_VERSION_SUB_OFFSET);
 
-  memorySize =  p_RefTable->p_device_info_table->FusInfoTable.MemorySize;
-  pWirelessInfo->FusMemorySizeSram2B   = ((memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
-  pWirelessInfo->FusMemorySizeSram2A   = ((memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
-  pWirelessInfo->FusMemorySizeFlash    = ((memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
+  pWirelessInfo->FusMemorySizeSram2B   = ((fus_memorySize & INFO_SIZE_SRAM2B_MASK) >> INFO_SIZE_SRAM2B_OFFSET);
+  pWirelessInfo->FusMemorySizeSram2A   = ((fus_memorySize & INFO_SIZE_SRAM2A_MASK) >> INFO_SIZE_SRAM2A_OFFSET);
+  pWirelessInfo->FusMemorySizeFlash    = ((fus_memorySize & INFO_SIZE_FLASH_MASK) >> INFO_SIZE_FLASH_OFFSET);
 
   return (SHCI_Success);
 }
diff --git a/lib/stm32wb/hci/shci.h b/lib/stm32wb/hci/shci.h
index e737f4c..607aaf7 100644
--- a/lib/stm32wb/hci/shci.h
+++ b/lib/stm32wb/hci/shci.h
@@ -6,11 +6,11 @@
  ******************************************************************************
   * @attention
   *
-  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. 
+  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
   * All rights reserved.</center></h2>
   *
   * 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 
+  * 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
   *
@@ -35,22 +35,22 @@
   typedef enum
   {
     WIRELESS_FW_RUNNING = 0x00,
-    RSS_FW_RUNNING = 0x01,
+    FUS_FW_RUNNING = 0x01,
   } SHCI_SysEvt_Ready_Rsp_t;
 
   /* ERROR CODES
    *
-   * These error codes are detected on M0 side and are send back to the M4 via a system
-   * notification message. It is up to the application running on M4 to manage these errors
+   * These error codes are detected on CPU2 side and are send back to the CPU1 via a system
+   * notification message. It is up to the application running on CPU1 to manage these errors
    *
    * These errors can be generated by all layers (low level driver, stack, framework infrastructure, etc..)
    */
    typedef enum
    {
-     ERR_BLE_INIT = 0,
-     ERR_THREAD_LLD_FATAL_ERROR = 125, /* The LLD driver used on 802_15_4 detected a fatal error            */
-     ERR_THREAD_UNKNOWN_CMD = 126,     /* The command send by the M4 to control the Thread stack is unknown */
-     ERR_ZIGBEE_UNKNOWN_CMD = 200,     /* The command send by the M4 to control the Zigbee stack is unknown */
+     ERR_BLE_INIT = 0,                 /* This event is currently not reported by the CPU2                    */
+     ERR_THREAD_LLD_FATAL_ERROR = 125, /* The LLD driver used on 802_15_4 detected a fatal error              */
+     ERR_THREAD_UNKNOWN_CMD = 126,     /* The command send by the CPU1 to control the Thread stack is unknown */
+     ERR_ZIGBEE_UNKNOWN_CMD = 200,     /* The command send by the CPU1 to control the Zigbee stack is unknown */
    } SCHI_SystemErrCode_t;
 
 #define SHCI_EVTCODE                    ( 0xFF )
@@ -64,11 +64,12 @@
     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_THREAD_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_CONCURRENT_802154_EVT,
   } SHCI_SUB_EVT_CODE_t;
 
   /**
@@ -101,7 +102,7 @@
   } SHCI_C2_BleNvmRamUpdate_Evt_t;
 
   /**
-   * SHCI_SUB_EVT_OT_NVM_RAM_UPDATE
+   * SHCI_SUB_EVT_THREAD_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
@@ -110,7 +111,7 @@
   typedef PACKED_STRUCT{
     uint32_t StartAddress;
     uint32_t Size;
-  } SHCI_C2_OtNvmRamUpdate_Evt_t;
+  } SHCI_C2_ThreadNvmRamUpdate_Evt_t;
 
   /**
    * SHCI_SUB_EVT_NVM_START_WRITE
@@ -160,6 +161,7 @@
     SHCI_UNKNOWN_CMD = 0x01,
     SHCI_ERR_UNSUPPORTED_FEATURE = 0x11,
     SHCI_ERR_INVALID_HCI_CMD_PARAMS = 0x12,
+    SHCI_ERR_INVALID_PARAMS = 0x42,
     SHCI_FUS_CMD_NOT_SUPPORTED = 0xFF,
   } SHCI_CmdStatus_t;
 
@@ -214,8 +216,10 @@
     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_CONFIG,
+    SHCI_OCF_C2_LLD_BLE_INIT,
+    SHCI_OCF_C2_CONFIG,
+    SHCI_OCF_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME,
+    SHCI_OCF_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION,
   } SHCI_OCF_t;
 
 #define SHCI_OPCODE_C2_FUS_GET_STATE         (( SHCI_OGF << 10) + SHCI_OCF_C2_FUS_GET_STATE)
@@ -423,6 +427,18 @@
     } SHCI_C2_CONCURRENT_Mode_Param_t;
       /** No response parameters*/
 
+#define SHCI_OPCODE_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME          (( SHCI_OGF << 10) + SHCI_OCF_C2_CONCURRENT_GET_NEXT_BLE_EVT_TIME)
+/** command parameters */
+    typedef PACKED_STRUCT
+    {
+      uint32_t relative_time;
+    } SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t;
+      /** No response parameters*/
+
+#define SHCI_OPCODE_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION    (( SHCI_OGF << 10) + SHCI_OCF_C2_CONCURRENT_ENABLE_NEXT_802154_EVT_NOTIFICATION)
+    /** No command parameters */
+    /** No response parameters*/
+
 #define SHCI_OPCODE_C2_FLASH_STORE_DATA          (( SHCI_OGF << 10) + SHCI_OCF_C2_FLASH_STORE_DATA)
 #define SHCI_OPCODE_C2_FLASH_ERASE_DATA          (( SHCI_OGF << 10) + SHCI_OCF_C2_FLASH_ERASE_DATA)
 /** command parameters */
@@ -512,7 +528,7 @@
  */
 #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_BIT2_THREAD_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)
@@ -536,18 +552,17 @@
   /** No response parameters*/
 
  /* Exported type --------------------------------------------------------*/
-
-typedef  MB_WirelessFwInfoTable_t SHCI_WirelessFwInfoTable_t;
+#define FUS_DEVICE_INFO_TABLE_VALIDITY_KEYWORD    (0xA94656B9)
 
 /*
   *   At startup, the informations relative to the wireless binary are stored in RAM trough a structure defined by
-  *   SHCI_WirelessFwInfoTable_t.This structure contains 4 fields (Version,MemorySize, Stack_info and a reserved part)
+  *   MB_WirelessFwInfoTable_t.This structure contains 4 fields (Version,MemorySize, Stack_info and a reserved part)
   *   each of those coded on 32 bits as shown on the table below:
   *
   *
   *               |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |7 |6 |5 |4 |3 |2 |1 |0 |
   *               -------------------------------------------------------------------------------------------------
-  * Version       |   Major version       |    Minor version      |    Sub version        | Branch    |Releas Type|
+  * Version       |   Major version       |    Minor version      |    Sub version        | Branch    |ReleaseType|
   *               -------------------------------------------------------------------------------------------------
   * MemorySize    |   SRAM2B (kB)         |    SRAM2A (kB)        |    SRAM1 (kB)         | FLASH (4kb)           |
   *               -------------------------------------------------------------------------------------------------
@@ -590,13 +605,14 @@
 #define INFO_STACK_TYPE_BLE_STANDARD                0x01
 #define INFO_STACK_TYPE_BLE_HCI                     0x02
 #define INFO_STACK_TYPE_BLE_LIGHT                   0x03
+#define INFO_STACK_TYPE_BLE_BEACON                  0x04
 #define INFO_STACK_TYPE_THREAD_FTD                  0x10
 #define INFO_STACK_TYPE_THREAD_MTD                  0x11
 #define INFO_STACK_TYPE_ZIGBEE_FFD                  0x30
 #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_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
@@ -604,7 +620,9 @@
 #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_RFD_STATIC       0x71
 #define INFO_STACK_TYPE_BLE_ZIGBEE_FFD_DYNAMIC      0x78
+#define INFO_STACK_TYPE_BLE_ZIGBEE_RFD_DYNAMIC      0x79
 #define INFO_STACK_TYPE_RLV                         0x80
 
 typedef struct {
@@ -764,7 +782,7 @@
   * @retval Status
   */
   SHCI_CmdStatus_t SHCI_C2_LLD_BLE_Init( uint8_t param_size, uint8_t * p_param );
-  
+
     /**
   * SHCI_C2_ZIGBEE_Init
   * @brief Starts the Zigbee Stack
@@ -773,7 +791,7 @@
   * @retval Status
   */
   SHCI_CmdStatus_t SHCI_C2_ZIGBEE_Init( void );
-  
+
   /**
   * SHCI_C2_DEBUG_Init
   * @brief Starts the Traces
@@ -802,6 +820,24 @@
   SHCI_CmdStatus_t SHCI_C2_CONCURRENT_SetMode( SHCI_C2_CONCURRENT_Mode_Param_t Mode );
 
   /**
+  * SHCI_C2_CONCURRENT_GetNextBleEvtTime
+  * @brief Get the next BLE event date (relative time)
+  *
+  * @param  Command Packet
+  * @retval None
+  */
+  SHCI_CmdStatus_t SHCI_C2_CONCURRENT_GetNextBleEvtTime( SHCI_C2_CONCURRENT_GetNextBleEvtTime_Param_t *pParam );
+
+  /**
+  * SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification
+  * @brief Activate the next 802.15.4 event notification (one shot)
+  *
+  * @param  None
+  * @retval None
+  */
+  SHCI_CmdStatus_t SHCI_C2_CONCURRENT_EnableNext_802154_EvtNotification( void );
+
+  /**
   * SHCI_C2_FLASH_StoreData
   * @brief Store Data in Flash
   *
@@ -842,7 +878,7 @@
   /**
    * SHCI_GetWirelessFwInfo
    * @brief This function read back the informations relative to the wireless binary loaded.
-   *         Refer yourself to SHCI_WirelessFwInfoTable_t structure to get the significance
+   *         Refer yourself to MB_WirelessFwInfoTable_t structure to get the significance
    *         of the different parameters returned.
    * @param  pWirelessInfo : Pointer to WirelessFwInfo_t.
    *
diff --git a/lib/stm32wb/hci/shci_tl.c b/lib/stm32wb/hci/shci_tl.c
index b8d920f..5473142 100644
--- a/lib/stm32wb/hci/shci_tl.c
+++ b/lib/stm32wb/hci/shci_tl.c
@@ -6,11 +6,11 @@
  ******************************************************************************
   * @attention
   *
-  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics. 
+  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
   * All rights reserved.</center></h2>
   *
   * 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 
+  * 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
   *
@@ -23,31 +23,7 @@
 
 #include "stm_list.h"
 #include "shci_tl.h"
-
-/**
- * These traces are not yet supported in an usual way in the delivery package
- * They can enabled by adding the definition of TL_SHCI_CMD_DBG_EN and/or TL_SHCI_EVT_DBG_EN in the preprocessor option in the IDE
- */
-#if ( (TL_SHCI_CMD_DBG_EN != 0) || (TL_SHCI_EVT_DBG_EN != 0) )
-#include "app_conf.h"
-#include "dbg_trace.h"
-#endif
-
-#if (TL_SHCI_CMD_DBG_EN != 0)
-#define TL_SHCI_CMD_DBG_MSG             PRINT_MESG_DBG
-#define TL_SHCI_CMD_DBG_BUF             PRINT_LOG_BUFF_DBG
-#else
-#define TL_SHCI_CMD_DBG_MSG(...)
-#define TL_SHCI_CMD_DBG_BUF(...)
-#endif
-
-#if (TL_SHCI_EVT_DBG_EN != 0)
-#define TL_SHCI_EVT_DBG_MSG             PRINT_MESG_DBG
-#define TL_SHCI_EVT_DBG_BUF             PRINT_LOG_BUFF_DBG
-#else
-#define TL_SHCI_EVT_DBG_MSG(...)
-#define TL_SHCI_EVT_DBG_BUF(...)
-#endif
+#include "tl_dbg_conf.h"
 
 /* Private typedef -----------------------------------------------------------*/
 typedef enum
@@ -356,5 +332,3 @@
 
   return;
 }
-
-
diff --git a/lib/stm32wb/hci/tl_dbg_conf.h b/lib/stm32wb/hci/tl_dbg_conf.h
new file mode 100644
index 0000000..b468b28
--- /dev/null
+++ b/lib/stm32wb/hci/tl_dbg_conf.h
@@ -0,0 +1,126 @@
+/**
+ ******************************************************************************
+  * File Name          : tl_dbg_conf.h
+  * Description        : Debug configuration file for stm32wpan transport layer interface.
+  *
+ ******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
+  * All rights reserved.</center></h2>
+  *
+  * This software component is licensed by ST under Ultimate Liberty license
+  * SLA0044, the "License"; You may not use this file except in compliance with
+  * the License. You may obtain a copy of the License at:
+  *                             www.st.com/SLA0044
+  *
+  ******************************************************************************
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __TL_DBG_CONF_H
+#define __TL_DBG_CONF_H
+
+/* USER CODE BEGIN Tl_Conf */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_conf.h"   /* required as some configuration used in dbg_trace.h are set there */
+#include "dbg_trace.h"
+#include "hw_if.h"
+
+/**
+ * Enable or Disable traces
+ * The raw data output is the hci binary packet format as specified by the BT specification *
+ */
+#define TL_SHCI_CMD_DBG_EN      0   /* Reports System commands sent to CPU2 and the command response */
+#define TL_SHCI_CMD_DBG_RAW_EN  0   /* Reports raw data System commands sent to CPU2 and the command response */
+#define TL_SHCI_EVT_DBG_EN      0   /* Reports System Asynchronous Events received from CPU2 */
+#define TL_SHCI_EVT_DBG_RAW_EN  0   /* Reports raw data System Asynchronous Events received from CPU2 */
+
+#define TL_HCI_CMD_DBG_EN       0   /* Reports BLE command sent to CPU2 and the command response */
+#define TL_HCI_CMD_DBG_RAW_EN   0   /* Reports raw data BLE command sent to CPU2 and the command response */
+#define TL_HCI_EVT_DBG_EN       0   /* Reports BLE Asynchronous Events received from CPU2 */
+#define TL_HCI_EVT_DBG_RAW_EN   0   /* Reports raw data BLE Asynchronous Events received from CPU2 */
+
+#define TL_MM_DBG_EN            0   /* Reports the informations of the buffer released to CPU2 */
+
+/**
+ * Macro definition
+ */
+
+/**
+ * System Transport Layer
+ */
+#if (TL_SHCI_CMD_DBG_EN != 0)
+#define TL_SHCI_CMD_DBG_MSG             PRINT_MESG_DBG
+#define TL_SHCI_CMD_DBG_BUF             PRINT_LOG_BUFF_DBG
+#else
+#define TL_SHCI_CMD_DBG_MSG(...)
+#define TL_SHCI_CMD_DBG_BUF(...)
+#endif
+
+#if (TL_SHCI_CMD_DBG_RAW_EN != 0)
+#define TL_SHCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_CMD_DBG_RAW(...)
+#endif
+
+#if (TL_SHCI_EVT_DBG_EN != 0)
+#define TL_SHCI_EVT_DBG_MSG             PRINT_MESG_DBG
+#define TL_SHCI_EVT_DBG_BUF             PRINT_LOG_BUFF_DBG
+#else
+#define TL_SHCI_EVT_DBG_MSG(...)
+#define TL_SHCI_EVT_DBG_BUF(...)
+#endif
+
+#if (TL_SHCI_EVT_DBG_RAW_EN != 0)
+#define TL_SHCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_SHCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * BLE Transport Layer
+ */
+#if (TL_HCI_CMD_DBG_EN != 0)
+#define TL_HCI_CMD_DBG_MSG             PRINT_MESG_DBG
+#define TL_HCI_CMD_DBG_BUF             PRINT_LOG_BUFF_DBG
+#else
+#define TL_HCI_CMD_DBG_MSG(...)
+#define TL_HCI_CMD_DBG_BUF(...)
+#endif
+
+#if (TL_HCI_CMD_DBG_RAW_EN != 0)
+#define TL_HCI_CMD_DBG_RAW(_PDATA_, _SIZE_)  HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_CMD_DBG_RAW(...)
+#endif
+
+#if (TL_HCI_EVT_DBG_EN != 0)
+#define TL_HCI_EVT_DBG_MSG             PRINT_MESG_DBG
+#define TL_HCI_EVT_DBG_BUF             PRINT_LOG_BUFF_DBG
+#else
+#define TL_HCI_EVT_DBG_MSG(...)
+#define TL_HCI_EVT_DBG_BUF(...)
+#endif
+
+#if (TL_HCI_EVT_DBG_RAW_EN != 0)
+#define TL_HCI_EVT_DBG_RAW(_PDATA_, _SIZE_)  HW_UART_Transmit(hw_uart1, (uint8_t*)_PDATA_, _SIZE_, (~0))
+#else
+#define TL_HCI_EVT_DBG_RAW(...)
+#endif
+
+/**
+ * Memory Manager - Released buffer tracing
+ */
+#if (TL_MM_DBG_EN != 0)
+#define TL_MM_DBG_MSG             PRINT_MESG_DBG
+#else
+#define TL_MM_DBG_MSG(...)
+#endif
+
+/* USER CODE END Tl_Conf */
+
+#endif /*__TL_DBG_CONF_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff --git a/lib/stm32wb/hci/tl_mbox.c b/lib/stm32wb/hci/tl_mbox.c
index 507edba..0e5800f 100644
--- a/lib/stm32wb/hci/tl_mbox.c
+++ b/lib/stm32wb/hci/tl_mbox.c
@@ -25,6 +25,7 @@
 #include "stm_list.h"
 #include "tl.h"
 #include "mbox_def.h"
+#include "tl_dbg_conf.h"
 
 /**
  * These traces are not yet supported in an usual way in the delivery package
@@ -42,6 +43,17 @@
 #endif
 
 /* Private typedef -----------------------------------------------------------*/
+typedef enum
+{
+  TL_MB_MM_RELEASE_BUFFER,
+  TL_MB_BLE_CMD,
+  TL_MB_BLE_CMD_RSP,
+  TL_MB_BLE_ASYNCH_EVT,
+  TL_MB_SYS_CMD,
+  TL_MB_SYS_CMD_RSP,
+  TL_MB_SYS_ASYNCH_EVT,
+} TL_MB_PacketType_t;
+
 /* Private defines -----------------------------------------------------------*/
 /* Private macros ------------------------------------------------------------*/
 /* Private variables ---------------------------------------------------------*/
@@ -77,7 +89,7 @@
 /* Global variables ----------------------------------------------------------*/
 /* Private function prototypes -----------------------------------------------*/
 static void SendFreeBuf( void );
-static void OutputMemReleaseTrace(TL_EvtPacket_t * phcievt);
+static void OutputDbgTrace(TL_MB_PacketType_t packet_type, uint8_t* buffer);
 
 /* Public Functions Definition ------------------------------------------------------*/
 
@@ -142,6 +154,8 @@
 
   ((TL_CmdPacket_t*)(TL_RefTable.p_ble_table->pcmd_buffer))->cmdserial.type = TL_BLECMD_PKT_TYPE;
 
+  OutputDbgTrace(TL_MB_BLE_CMD, TL_RefTable.p_ble_table->pcmd_buffer);
+
   HW_IPCC_BLE_SendCmd();
 
   return 0;
@@ -155,6 +169,15 @@
   {
     LST_remove_head (&EvtQueue, (tListNode **)&phcievt);
 
+    if ( ((phcievt->evtserial.evt.evtcode) == TL_BLEEVT_CS_OPCODE) || ((phcievt->evtserial.evt.evtcode) == TL_BLEEVT_CC_OPCODE ) )
+    {
+      OutputDbgTrace(TL_MB_BLE_CMD_RSP, (uint8_t*)phcievt);
+    }
+    else
+    {
+      OutputDbgTrace(TL_MB_BLE_ASYNCH_EVT, (uint8_t*)phcievt);
+    }
+
     BLE_IoBusEvtCallBackFunction(phcievt);
   }
 
@@ -209,6 +232,8 @@
 
   ((TL_CmdPacket_t *)(TL_RefTable.p_sys_table->pcmd_buffer))->cmdserial.type = TL_SYSCMD_PKT_TYPE;
 
+  OutputDbgTrace(TL_MB_SYS_CMD, TL_RefTable.p_sys_table->pcmd_buffer);
+
   HW_IPCC_SYS_SendCmd();
 
   return 0;
@@ -216,6 +241,8 @@
 
 void HW_IPCC_SYS_CmdEvtNot(void)
 {
+  OutputDbgTrace(TL_MB_SYS_CMD_RSP, (uint8_t*)(TL_RefTable.p_sys_table->pcmd_buffer) );
+
   SYS_CMD_IoBusCallBackFunction( (TL_EvtPacket_t*)(TL_RefTable.p_sys_table->pcmd_buffer) );
 
   return;
@@ -228,6 +255,9 @@
   while(LST_is_empty(&SystemEvtQueue) == FALSE)
   {
     LST_remove_head (&SystemEvtQueue, (tListNode **)&p_evt);
+
+    OutputDbgTrace(TL_MB_SYS_ASYNCH_EVT, (uint8_t*)p_evt );
+
     SYS_EVT_IoBusCallBackFunction( p_evt );
   }
 
@@ -370,7 +400,7 @@
 /******************************************************************************
  * LLD BLE
  ******************************************************************************/
-#ifdef LLD_BLE_WB 
+#ifdef LLD_BLE_WB
 void TL_LLD_BLE_Init( TL_LLD_BLE_Config_t *p_Config )
 {
   MB_LldBleTable_t  * p_lld_ble_table;
@@ -598,7 +628,7 @@
 {
   LST_insert_tail(&LocalFreeBufQueue, (tListNode *)phcievt);
 
-  OutputMemReleaseTrace(phcievt);
+  OutputDbgTrace(TL_MB_MM_RELEASE_BUFFER, (uint8_t*)phcievt);
 
   HW_IPCC_MM_SendFreeBuf( SendFreeBuf );
 
@@ -618,39 +648,6 @@
   return;
 }
 
-static void OutputMemReleaseTrace(TL_EvtPacket_t * phcievt)
-{
-  switch(phcievt->evtserial.evt.evtcode)
-  {
-    case TL_BLEEVT_CS_OPCODE:
-      TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
-      TL_MM_DBG__MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(phcievt->evtserial.evt.payload))->cmdcode);
-      TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
-      break;
-
-    case TL_BLEEVT_CC_OPCODE:
-      TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
-      TL_MM_DBG__MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(phcievt->evtserial.evt.payload))->cmdcode);
-      TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
-      break;
-
-    case TL_BLEEVT_VS_OPCODE:
-      TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
-      TL_MM_DBG__MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(phcievt->evtserial.evt.payload))->subevtcode);
-      TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
-      break;
-
-    default:
-      TL_MM_DBG__MSG("mm evt released: 0x%02X", phcievt->evtserial.evt.evtcode);
-      TL_MM_DBG__MSG(" buffer addr: 0x%08X", phcievt);
-      break;
-  }
-
-  TL_MM_DBG__MSG("\r\n");
-
-  return;
-}
-
 /******************************************************************************
  * TRACES
  ******************************************************************************/
@@ -683,4 +680,187 @@
   (void)(hcievt);
 }
 
+/******************************************************************************
+ * DEBUG INFORMATION
+ ******************************************************************************/
+static void OutputDbgTrace(TL_MB_PacketType_t packet_type, uint8_t* buffer)
+{
+  TL_EvtPacket_t *p_evt_packet;
+  TL_CmdPacket_t *p_cmd_packet;
+
+  switch(packet_type)
+  {
+    case TL_MB_MM_RELEASE_BUFFER:
+      p_evt_packet = (TL_EvtPacket_t*)buffer;
+      switch(p_evt_packet->evtserial.evt.evtcode)
+      {
+        case TL_BLEEVT_CS_OPCODE:
+          TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_MM_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+          TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+          break;
+
+        case TL_BLEEVT_CC_OPCODE:
+          TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_MM_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+          TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+          break;
+
+        case TL_BLEEVT_VS_OPCODE:
+          TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_MM_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+          TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+          break;
+
+        default:
+          TL_MM_DBG_MSG("mm evt released: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_MM_DBG_MSG(" buffer addr: 0x%08X", p_evt_packet);
+          break;
+      }
+
+      TL_MM_DBG_MSG("\r\n");
+      break;
+
+    case TL_MB_BLE_CMD:
+      p_cmd_packet = (TL_CmdPacket_t*)buffer;
+      TL_HCI_CMD_DBG_MSG("ble cmd: 0x%04X", p_cmd_packet->cmdserial.cmd.cmdcode);
+      if(p_cmd_packet->cmdserial.cmd.plen != 0)
+      {
+        TL_HCI_CMD_DBG_MSG(" payload:");
+        TL_HCI_CMD_DBG_BUF(p_cmd_packet->cmdserial.cmd.payload, p_cmd_packet->cmdserial.cmd.plen, "");
+      }
+      TL_HCI_CMD_DBG_MSG("\r\n");
+
+      TL_HCI_CMD_DBG_RAW(&p_cmd_packet->cmdserial, p_cmd_packet->cmdserial.cmd.plen+TL_CMD_HDR_SIZE);
+      break;
+
+    case TL_MB_BLE_CMD_RSP:
+      p_evt_packet = (TL_EvtPacket_t*)buffer;
+      switch(p_evt_packet->evtserial.evt.evtcode)
+      {
+        case TL_BLEEVT_CS_OPCODE:
+          TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+          TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->numcmd);
+          TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CsEvt_t*)(p_evt_packet->evtserial.evt.payload))->status);
+          break;
+
+        case TL_BLEEVT_CC_OPCODE:
+          TL_HCI_CMD_DBG_MSG("ble rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_HCI_CMD_DBG_MSG(" cmd opcode: 0x%04X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+          TL_HCI_CMD_DBG_MSG(" numhci: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->numcmd);
+          TL_HCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[0]);
+          if((p_evt_packet->evtserial.evt.plen-4) != 0)
+          {
+            TL_HCI_CMD_DBG_MSG(" payload:");
+            TL_HCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[1], p_evt_packet->evtserial.evt.plen-4, "");
+          }
+          break;
+
+        default:
+          TL_HCI_CMD_DBG_MSG("unknown ble rsp received: %02X", p_evt_packet->evtserial.evt.evtcode);
+          break;
+      }
+
+      TL_HCI_CMD_DBG_MSG("\r\n");
+
+      TL_HCI_CMD_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+      break;
+
+    case TL_MB_BLE_ASYNCH_EVT:
+      p_evt_packet = (TL_EvtPacket_t*)buffer;
+      if(p_evt_packet->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+      {
+        TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+        if((p_evt_packet->evtserial.evt.plen) != 0)
+        {
+          TL_HCI_EVT_DBG_MSG(" payload:");
+          TL_HCI_EVT_DBG_BUF(p_evt_packet->evtserial.evt.payload, p_evt_packet->evtserial.evt.plen, "");
+        }
+      }
+      else
+      {
+        TL_HCI_EVT_DBG_MSG("ble evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+        TL_HCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+        if((p_evt_packet->evtserial.evt.plen-2) != 0)
+        {
+          TL_HCI_EVT_DBG_MSG(" payload:");
+          TL_HCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload, p_evt_packet->evtserial.evt.plen-2, "");
+        }
+      }
+
+      TL_HCI_EVT_DBG_MSG("\r\n");
+
+      TL_HCI_EVT_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+      break;
+
+    case TL_MB_SYS_CMD:
+      p_cmd_packet = (TL_CmdPacket_t*)buffer;
+
+      TL_SHCI_CMD_DBG_MSG("sys cmd: 0x%04X", p_cmd_packet->cmdserial.cmd.cmdcode);
+
+      if(p_cmd_packet->cmdserial.cmd.plen != 0)
+      {
+        TL_SHCI_CMD_DBG_MSG(" payload:");
+        TL_SHCI_CMD_DBG_BUF(p_cmd_packet->cmdserial.cmd.payload, p_cmd_packet->cmdserial.cmd.plen, "");
+      }
+      TL_SHCI_CMD_DBG_MSG("\r\n");
+
+      TL_SHCI_CMD_DBG_RAW(&p_cmd_packet->cmdserial, p_cmd_packet->cmdserial.cmd.plen+TL_CMD_HDR_SIZE);
+      break;
+
+    case TL_MB_SYS_CMD_RSP:
+      p_evt_packet = (TL_EvtPacket_t*)buffer;
+      switch(p_evt_packet->evtserial.evt.evtcode)
+      {
+        case TL_BLEEVT_CC_OPCODE:
+          TL_SHCI_CMD_DBG_MSG("sys rsp: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+          TL_SHCI_CMD_DBG_MSG(" cmd opcode: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->cmdcode);
+          TL_SHCI_CMD_DBG_MSG(" status: 0x%02X", ((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[0]);
+          if((p_evt_packet->evtserial.evt.plen-4) != 0)
+          {
+            TL_SHCI_CMD_DBG_MSG(" payload:");
+            TL_SHCI_CMD_DBG_BUF(&((TL_CcEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload[1], p_evt_packet->evtserial.evt.plen-4, "");
+          }
+          break;
+
+        default:
+          TL_SHCI_CMD_DBG_MSG("unknown sys rsp received: %02X", p_evt_packet->evtserial.evt.evtcode);
+          break;
+      }
+
+      TL_SHCI_CMD_DBG_MSG("\r\n");
+
+      TL_SHCI_CMD_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+      break;
+
+    case  TL_MB_SYS_ASYNCH_EVT:
+      p_evt_packet = (TL_EvtPacket_t*)buffer;
+      if(p_evt_packet->evtserial.evt.evtcode != TL_BLEEVT_VS_OPCODE)
+      {
+        TL_SHCI_EVT_DBG_MSG("unknown sys evt received: %02X", p_evt_packet->evtserial.evt.evtcode);
+      }
+      else
+      {
+        TL_SHCI_EVT_DBG_MSG("sys evt: 0x%02X", p_evt_packet->evtserial.evt.evtcode);
+        TL_SHCI_EVT_DBG_MSG(" subevtcode: 0x%04X", ((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->subevtcode);
+        if((p_evt_packet->evtserial.evt.plen-2) != 0)
+        {
+          TL_SHCI_EVT_DBG_MSG(" payload:");
+          TL_SHCI_EVT_DBG_BUF(((TL_AsynchEvt_t*)(p_evt_packet->evtserial.evt.payload))->payload, p_evt_packet->evtserial.evt.plen-2, "");
+        }
+      }
+
+      TL_SHCI_EVT_DBG_MSG("\r\n");
+
+      TL_SHCI_EVT_DBG_RAW(&p_evt_packet->evtserial, p_evt_packet->evtserial.evt.plen+TL_EVT_HDR_SIZE);
+      break;
+
+    default:
+      break;
+  }
+
+  return;
+}
+
 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/