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