1 /* USER CODE BEGIN Header */
2 /**
3   ******************************************************************************
4   * @file    ble_plat.c
5   * @author  GPM WBL Application Team
6   * @brief   Bluetooth LE stack v3.x platform interface for pka, rng, aes,
7   *          radio timer, controller.
8   ******************************************************************************
9   * @attention
10   *
11   * Copyright (c) 2024 STMicroelectronics.
12   * All rights reserved.
13   *
14   * This software is licensed under terms that can be found in the LICENSE file
15   * in the root directory of this software component.
16   * If no LICENSE file comes with this software, it is provided AS-IS.
17   *
18   ******************************************************************************
19   */
20 /* USER CODE END Header */
21 
22 /* Includes ------------------------------------------------------------------*/
23 #include "bleplat.h"
24 #include "pka_manager.h"
25 #include "hw_aes.h"
26 #include "hw_rng.h"
27 #if (BLESTACK_CONTROLLER_ONLY == 0)
28 #include "crypto.h"
29 #endif /* (BLESTACK_CONTROLLER_ONLY == 0) */
30 #include "miscutil.h"
31 #include "RADIO_utils.h"
32 #include "osal.h"
33 #include "stm32wb0x.h"
34 #include "stm32wb0x_ll_radio.h"
35 
36 #define PLL_ADC_CALIB_CORR  2
37 #define CP_ISEL_Msk         (0x07UL)
38 #define SYNTH0_ANA_ENG      (*(volatile uint32_t *)0x60001610)
39 #define SYNTHCAL3_ANA_TST   (*(volatile uint32_t *)0x600015A4)
40 #define LL_DUMMY_ACCESS_ADDRESS (0x00000000U)
41 #define LL_DTM_ACCESS_ADDRESS   (0x71764129U)
42 
43 #if defined(STM32WB06) || defined(STM32WB07) || defined(STM32WB09)
44 uint32_t SYNTH0_ANA_ENG_bak, PWR_ENGTRIM_bak;
45 #endif
46 
BLEPLAT_MemCpy(void * Dest,const void * Src,unsigned int Size)47 void BLEPLAT_MemCpy(void *Dest, const void *Src, unsigned int Size)
48 {
49   Osal_MemCpy(Dest, Src, Size);
50 }
51 
BLEPLAT_MemSet(void * Ptr,int Value,unsigned int Size)52 void BLEPLAT_MemSet(void *Ptr, int Value, unsigned int Size)
53 {
54   memset(Ptr, Value, Size);
55 }
56 
BLEPLAT_MemCmp(void * S1,void * S2,unsigned int Size)57 int BLEPLAT_MemCmp(void *S1, void *S2, unsigned int Size)
58 {
59   return memcmp(S1, S2, Size);
60 }
61 
62 /**
63  * @brief Get Device ID, Version and Revision numbers
64  */
BLEPLAT_GetPartInfo(uint8_t * pDeviceId,uint8_t * pMajorCut,uint8_t * pMinorCut)65 void BLEPLAT_GetPartInfo(uint8_t *pDeviceId, uint8_t *pMajorCut, uint8_t *pMinorCut)
66 {
67    PartInfoType partInfo;
68 
69    /* get partInfo */
70    GetPartInfo(&partInfo);
71 
72   /* Set device ID */
73   *pDeviceId  = partInfo.die_id;
74 
75   /* Set major cut  */
76   *pMajorCut = partInfo.die_major;
77 
78   /* Set minor cut */
79   *pMinorCut = partInfo.die_cut;
80 }
81 
BLEPLAT_PkaStartP256Key(const uint32_t * private_key,BLEPLAT_PkaFuncCb funcCb)82 BLEPLAT_PkaStatusTypeDef BLEPLAT_PkaStartP256Key(const uint32_t *private_key, BLEPLAT_PkaFuncCb funcCb)
83 {
84   return (BLEPLAT_PkaStatusTypeDef)PKAMGR_StartP256PublicKeyGeneration(private_key, (PKAMGR_funcCB)funcCb);
85 }
86 
BLEPLAT_PkaStartDHkey(uint32_t * private_key,uint32_t * public_key,BLEPLAT_PkaFuncCb funcCb)87 BLEPLAT_PkaStatusTypeDef BLEPLAT_PkaStartDHkey(uint32_t* private_key,
88                                          uint32_t* public_key,
89                                          BLEPLAT_PkaFuncCb funcCb)
90 {
91   return (BLEPLAT_PkaStatusTypeDef)HW_PKA_StartP256DHkeyGeneration(private_key, public_key, (PKAMGR_funcCB)funcCb);
92 }
93 
BLEPLAT_AesEcbEncrypt(const uint32_t * plainTextData,const uint32_t * key,uint32_t * encryptedData)94 void BLEPLAT_AesEcbEncrypt(const uint32_t *plainTextData,
95                            const uint32_t *key,
96                            uint32_t *encryptedData)
97 {
98   HW_AES_Encrypt(plainTextData, key, encryptedData);
99 }
100 #if (BLESTACK_CONTROLLER_ONLY == 0)
BLEPLAT_AesCMACEncryptInit(BLEPLAT_AESCMACctxTypeDef * pAESCMACctx)101 int32_t BLEPLAT_AesCMACEncryptInit(BLEPLAT_AESCMACctxTypeDef *pAESCMACctx)
102 {
103   return AES_CMAC_Encrypt_Init((AESCMACctx_stt*)pAESCMACctx);
104 }
105 
BLEPLAT_AesCMACEncryptAppend(BLEPLAT_AESCMACctxTypeDef * pAESCMACctx,const uint8_t * pInputBuffer,int32_t InputSize)106 int32_t BLEPLAT_AesCMACEncryptAppend(BLEPLAT_AESCMACctxTypeDef *pAESCMACctx,
107                                      const uint8_t  *pInputBuffer,
108                                      int32_t InputSize)
109 {
110   return AES_CMAC_Encrypt_Append((AESCMACctx_stt*)pAESCMACctx, pInputBuffer, InputSize);
111 }
112 
BLEPLAT_AesCMACEncryptFinish(BLEPLAT_AESCMACctxTypeDef * pAESCMACctx,uint8_t * pOutputBuffer,int32_t * pOutputSize)113 int32_t BLEPLAT_AesCMACEncryptFinish(BLEPLAT_AESCMACctxTypeDef *pAESCMACctx,
114                                      uint8_t *pOutputBuffer,
115                                      int32_t *pOutputSize)
116 {
117   return AES_CMAC_Encrypt_Finish((AESCMACctx_stt*)pAESCMACctx, pOutputBuffer, pOutputSize);
118 }
119 #endif /* (BLESTACK_CONTROLLER_ONLY == 0) */
120 
BLEPLAT_RngGetRandom16(uint16_t * num)121 void BLEPLAT_RngGetRandom16(uint16_t* num)
122 {
123   HW_RNG_GetRandom16(num);
124 }
125 
BLEPLAT_RngGetRandom32(uint32_t * num)126 void BLEPLAT_RngGetRandom32(uint32_t* num)
127 {
128   HW_RNG_GetRandom32(num);
129 }
130 
BLEPLAT_DBmToPALevel(int8_t TX_dBm)131 uint8_t BLEPLAT_DBmToPALevel(int8_t TX_dBm)
132 {
133   return RADIO_DBmToPALevel(TX_dBm);
134 }
135 
BLEPLAT_DBmToPALevelGe(int8_t TX_dBm)136 uint8_t BLEPLAT_DBmToPALevelGe(int8_t TX_dBm)
137 {
138   return RADIO_DBmToPALevelGe(TX_dBm);
139 }
140 
BLEPLAT_PALevelToDBm(uint8_t PA_Level)141 int8_t BLEPLAT_PALevelToDBm(uint8_t PA_Level)
142 {
143   return RADIO_PALevelToDBm(PA_Level);
144 }
145 
BLEPLAT_ReadTransmitPower(int8_t * Min_Tx_Power,int8_t * Max_Tx_Power)146 void BLEPLAT_ReadTransmitPower(int8_t *Min_Tx_Power, int8_t *Max_Tx_Power)
147 {
148   RADIO_ReadTransmitPower(Min_Tx_Power, Max_Tx_Power);
149 }
150 
BLEPLAT_GetMaxPALevel(void)151 uint8_t BLEPLAT_GetMaxPALevel(void)
152 {
153   return RADIO_GetMaxPALevel();
154 }
155 
BLEPLAT_GetDefaultPALevel(void)156 uint8_t BLEPLAT_GetDefaultPALevel(void)
157 {
158   return RADIO_GetDefaultPALevel();
159 }
160 
BLEPLAT_SetHighPower(uint8_t enable)161 void BLEPLAT_SetHighPower(uint8_t enable)
162 {
163   RADIO_SetHighPower((FunctionalState)enable);
164 }
165 
BLEPLAT_CalculateRSSI(void)166 int8_t BLEPLAT_CalculateRSSI(void)
167 {
168   return HAL_RADIO_ReadRSSI();
169 }
170 
BLEPLAT_UpdateAvgRSSI(int8_t avg_rssi,int8_t rssi,uint8_t rssi_filter_coeff)171 int8_t BLEPLAT_UpdateAvgRSSI(int8_t avg_rssi, int8_t rssi, uint8_t rssi_filter_coeff)
172 {
173   return RADIO_UpdateAvgRSSI(avg_rssi, rssi, rssi_filter_coeff);
174 }
175 
BLEPLAT_GetDemodCI(void)176 uint8_t BLEPLAT_GetDemodCI(void)
177 {
178   return GetDemodCI();
179 }
180 
BLEPLAT_InitCTE(uint8_t smNo)181 void BLEPLAT_InitCTE(uint8_t smNo)
182 {
183 #if defined(STM32WB06) || defined(STM32WB07) || defined(STM32WB09)
184   SYNTH0_ANA_ENG_bak = SYNTH0_ANA_ENG;
185   PWR_ENGTRIM_bak = PWR->ENGTRIM;
186 
187   SYNTHCAL3_ANA_TST = 0;
188   // Set RFD_PLL_CP_ISEL = 0 in RRM->SYNTH0_ANA_ENG
189   SYNTH0_ANA_ENG &= ~CP_ISEL_Msk;
190   PWR->ENGTRIM = 0x00000001;
191 
192   /* First packet does not have the fix, so it needs to be discarded. Set an
193      invalid Access Address. */
194   LL_RADIO_SetAccessAddress(smNo, LL_DUMMY_ACCESS_ADDRESS);
195 #endif
196 }
197 
BLEPLAT_DeinitCTE(void)198 void BLEPLAT_DeinitCTE(void)
199 {
200 #if defined(STM32WB06) || defined(STM32WB07) || defined(STM32WB09)
201   PWR->ENGTRIM = PWR_ENGTRIM_bak;
202   SYNTH0_ANA_ENG = SYNTH0_ANA_ENG_bak;
203   SYNTHCAL3_ANA_TST = 0;
204 #endif
205 }
206 
BLEPLAT_CalibrateCTE(uint8_t smNo)207 void BLEPLAT_CalibrateCTE(uint8_t smNo)
208 {
209 #if defined(STM32WB06) || defined(STM32WB07) || defined(STM32WB09)
210   uint32_t dac_word = RRM->SYNTHCAL4_DIG_OUT & RRM_SYNTHCAL4_DIG_OUT_MOD_REF_DAC_WORD_OUT_Msk;
211   dac_word += PLL_ADC_CALIB_CORR;
212   dac_word &= RRM_SYNTHCAL4_DIG_OUT_MOD_REF_DAC_WORD_OUT_Msk;
213   // Set SYNTHCAL3_ANA_TST
214   SYNTHCAL3_ANA_TST = dac_word | 0x80;
215 
216   /* Restore access address. */
217   LL_RADIO_SetAccessAddress(smNo, LL_DTM_ACCESS_ADDRESS);
218 #endif
219 }
220 
BLEPLAT_AntIdxRemap(uint8_t AntPattLen,uint8_t * pAntRamTable,const uint8_t * pAntPatt)221 void BLEPLAT_AntIdxRemap(uint8_t AntPattLen, uint8_t *pAntRamTable, const uint8_t* pAntPatt)
222 {
223   RADIO_AntIdxRemap(AntPattLen, pAntRamTable, pAntPatt);
224 }
225 
BLEPLAT_GetCurrentSysTime(void)226 uint64_t BLEPLAT_GetCurrentSysTime(void)
227 {
228   return HAL_RADIO_TIMER_GetCurrentSysTime();
229 
230 }
BLEPLAT_GetFutureSysTime64(uint32_t SysTime)231 uint64_t BLEPLAT_GetFutureSysTime64(uint32_t SysTime)
232 {
233   return HAL_RADIO_TIMER_GetFutureSysTime64(SysTime);
234 }
235 
BLEPLAT_StartTimer(BLEPLAT_TimerHandleTypeDef * TimerHandle,uint64_t Time)236 int BLEPLAT_StartTimer(BLEPLAT_TimerHandleTypeDef *TimerHandle, uint64_t Time)
237 {
238   return HAL_RADIO_TIMER_StartVirtualTimerSysTime((VTIMER_HandleType*)TimerHandle, Time);
239 }
240 
BLEPLAT_StopTimer(BLEPLAT_TimerHandleTypeDef * TimerHandle)241 void BLEPLAT_StopTimer(BLEPLAT_TimerHandleTypeDef *TimerHandle)
242 {
243   HAL_RADIO_TIMER_StopVirtualTimer((VTIMER_HandleType*)TimerHandle);
244 }
245 
BLEPLAT_SetRadioTimerValue(uint32_t Time,uint8_t EventType,uint8_t CalReq)246 uint8_t BLEPLAT_SetRadioTimerValue(uint32_t Time, uint8_t EventType, uint8_t CalReq)
247 {
248   return HAL_RADIO_TIMER_SetRadioTimerValue(Time, EventType, CalReq);
249 }
250 
BLEPLAT_ClearRadioTimerValue(void)251 uint8_t BLEPLAT_ClearRadioTimerValue(void)
252 {
253   return HAL_RADIO_TIMER_ClearRadioTimerValue();
254 }
255 
BLEPLAT_GetAnchorPoint(uint64_t * pCurrentSysTime)256 uint64_t BLEPLAT_GetAnchorPoint(uint64_t *pCurrentSysTime)
257 {
258   return HAL_RADIO_TIMER_GetAnchorPoint(pCurrentSysTime);
259 }
260 
BLEPLAT_SetRadioCloseTimeout(void)261 void BLEPLAT_SetRadioCloseTimeout(void)
262 {
263   HAL_RADIO_TIMER_SetRadioCloseTimeout();
264 }
265 
BLEPLAT_SetRadioTimerRelativeUsValue(uint32_t RelTimeoutUs,uint8_t Tx,uint8_t PLLCal)266 uint8_t BLEPLAT_SetRadioTimerRelativeUsValue(uint32_t RelTimeoutUs, uint8_t Tx, uint8_t PLLCal)
267 {
268   return HAL_RADIO_TIMER_SetRadioTimerRelativeUsValue(RelTimeoutUs, Tx, PLLCal);
269 }
270