1 /* USER CODE BEGIN Header */
2 /**
3 ******************************************************************************
4 * @file ll_sys_if.c
5 * @author MCD Application Team
6 * @brief Source file for initiating system
7 ******************************************************************************
8 * @attention
9 *
10 * Copyright (c) 2022 STMicroelectronics.
11 * All rights reserved.
12 *
13 * This software is licensed under terms that can be found in the LICENSE file
14 * in the root directory of this software component.
15 * If no LICENSE file comes with this software, it is provided AS-IS.
16 *
17 ******************************************************************************
18 */
19 /* USER CODE END Header */
20 #include <zephyr/logging/log.h>
21 #include "ll_intf.h"
22 #include "ll_intf_cmn.h"
23 #include "utilities_common.h"
24 #if (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1)
25 #include "temp_measurement.h"
26 #endif /* (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1) */
27
28 /* Private defines -----------------------------------------------------------*/
29
30 /* USER CODE BEGIN PD */
31
32 /* USER CODE END PD */
33
34 /* Private macros ------------------------------------------------------------*/
35 /* USER CODE BEGIN PM */
36
37 /* USER CODE END PM */
38
39 /* Private constants ---------------------------------------------------------*/
40 /* USER CODE BEGIN PC */
41
42 /* USER CODE END PC */
43
44 /* Private variables ---------------------------------------------------------*/
45 /* USER CODE BEGIN PV */
46
47 /* USER CODE END PV */
48
49 /* Global variables ----------------------------------------------------------*/
50
51 /* USER CODE BEGIN GV */
52
53 /* USER CODE END GV */
54
55 /* Private functions prototypes-----------------------------------------------*/
56 #if (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1)
57 static void ll_sys_bg_temperature_measurement_init(void);
58 #endif /* USE_TEMPERATURE_BASED_RADIO_CALIBRATION */
59 static void ll_sys_sleep_clock_source_selection(void);
60 #if (CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE == 0)
61 static uint8_t ll_sys_BLE_sleep_clock_accuracy_selection(void);
62 #endif /* CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE */
63 void ll_sys_reset(void);
64
65 /* USER CODE BEGIN PFP */
66
67 /* USER CODE END PFP */
68
69 /* External variables --------------------------------------------------------*/
70
71 /* USER CODE BEGIN EV */
72
73 /* USER CODE END EV */
74
75 #ifndef __ZEPHYR__
76 /* Functions Definition ------------------------------------------------------*/
77
78 /**
79 * @brief Link Layer background process initialization
80 * @param None
81 * @retval None
82 */
ll_sys_bg_process_init(void)83 void ll_sys_bg_process_init(void)
84 {
85 /* Register Link Layer task */
86 UTIL_SEQ_RegTask(1U << CFG_TASK_LINK_LAYER, UTIL_SEQ_RFU, ll_sys_bg_process);
87 }
88
ll_sys_schedule_bg_process(void)89 void ll_sys_schedule_bg_process(void)
90 {
91 UTIL_SEQ_SetTask(1U << CFG_TASK_LINK_LAYER, TASK_PRIO_LINK_LAYER);
92 }
93
ll_sys_schedule_bg_process_isr(void)94 void ll_sys_schedule_bg_process_isr(void)
95 {
96 UTIL_SEQ_SetTask(1U << CFG_TASK_LINK_LAYER, TASK_PRIO_LINK_LAYER);
97 }
98 #endif
99
100 /**
101 * @brief Link Layer configuration phase before application startup.
102 * @param None
103 * @retval None
104 */
ll_sys_config_params(void)105 void ll_sys_config_params(void)
106 {
107 /* USER CODE BEGIN ll_sys_config_params_0 */
108
109 /* USER CODE END ll_sys_config_params_0 */
110
111 /* Configure link layer behavior for low ISR use and next event scheduling method:
112 * - SW low ISR is used.
113 * - Next event is scheduled from ISR.
114 */
115 ll_intf_cmn_config_ll_ctx_params(USE_RADIO_LOW_ISR, NEXT_EVENT_SCHEDULING_FROM_ISR);
116
117 #ifndef __ZEPHYR__
118 /* USER CODE BEGIN ll_sys_config_params_1 */
119
120 /* USER CODE END ll_sys_config_params_1 */
121
122 #if (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1)
123 /* Initialize link layer temperature measurement background task */
124 ll_sys_bg_temperature_measurement_init();
125
126 /* Link layer IP uses temperature based calibration instead of periodic one */
127 ll_intf_cmn_set_temperature_sensor_state();
128 #endif /* USE_TEMPERATURE_BASED_RADIO_CALIBRATION */
129
130 /* Link Layer power table */
131 ll_intf_cmn_select_tx_power_table(CFG_RF_TX_POWER_TABLE_ID);
132 #endif
133 /* USER CODE BEGIN ll_sys_config_params_2 */
134
135 /* USER CODE END ll_sys_config_params_2 */
136 }
137
138 #ifndef __ZEPHYR__
139 #if (USE_TEMPERATURE_BASED_RADIO_CALIBRATION == 1)
140
141 /**
142 * @brief Link Layer temperature request background process initialization
143 * @param None
144 * @retval None
145 */
ll_sys_bg_temperature_measurement_init(void)146 void ll_sys_bg_temperature_measurement_init(void)
147 {
148 /* Register Temperature Measurement task */
149 UTIL_SEQ_RegTask(1U << CFG_TASK_TEMP_MEAS, UTIL_SEQ_RFU, TEMPMEAS_RequestTemperatureMeasurement);
150 }
151
152 /**
153 * @brief Request backroud task processing for temperature measurement
154 * @param None
155 * @retval None
156 */
ll_sys_bg_temperature_measurement(void)157 void ll_sys_bg_temperature_measurement(void)
158 {
159 static uint8_t initial_temperature_acquisition = 0;
160
161 if (initial_temperature_acquisition == 0) {
162 TEMPMEAS_RequestTemperatureMeasurement();
163 initial_temperature_acquisition = 1;
164 } else {
165 UTIL_SEQ_SetTask(1U << CFG_TASK_TEMP_MEAS, CFG_SEQ_PRIO_0);
166 }
167 }
168 #endif /* USE_TEMPERATURE_BASED_RADIO_CALIBRATION */
169 #endif
170
171 #if (CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE == 0)
ll_sys_BLE_sleep_clock_accuracy_selection(void)172 uint8_t ll_sys_BLE_sleep_clock_accuracy_selection(void)
173 {
174 uint8_t BLE_sleep_clock_accuracy = 0;
175 uint32_t RevID = LL_DBGMCU_GetRevisionID();
176 uint32_t linklayer_slp_clk_src = LL_RCC_RADIO_GetSleepTimerClockSource();
177
178 if (linklayer_slp_clk_src == LL_RCC_RADIOSLEEPSOURCE_LSE) {
179 /* LSE selected as Link Layer sleep clock source. */
180 /* Sleep clock accuracy is different regarding the WBA device ID and revision */
181 #if defined(STM32WBA52xx) || defined(STM32WBA54xx) || defined(STM32WBA55xx)
182 if (RevID == REV_ID_A) {
183 BLE_sleep_clock_accuracy = STM32WBA5x_REV_ID_A_SCA_RANGE;
184 } else if (RevID == REV_ID_B) {
185 BLE_sleep_clock_accuracy = STM32WBA5x_REV_ID_B_SCA_RANGE;
186 } else {
187 /* Revision ID not supported, default value of 500ppm applied */
188 BLE_sleep_clock_accuracy = STM32WBA5x_DEFAULT_SCA_RANGE;
189 }
190 #else
191 UNUSED(RevID);
192 #endif
193 /* defined(STM32WBA52xx) || defined(STM32WBA54xx) || defined(STM32WBA55xx) */
194 } else {
195 /* LSE is not the Link Layer sleep clock source, */
196 /* sleep clock accuracy default value is 500 ppm */
197 BLE_sleep_clock_accuracy = STM32WBA5x_DEFAULT_SCA_RANGE;
198 }
199
200 return BLE_sleep_clock_accuracy;
201 }
202 #endif /* CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE */
203
ll_sys_sleep_clock_source_selection(void)204 void ll_sys_sleep_clock_source_selection(void)
205 {
206 uint16_t freq_value = 0;
207 uint32_t linklayer_slp_clk_src = LL_RCC_RADIOSLEEPSOURCE_NONE;
208
209 linklayer_slp_clk_src = LL_RCC_RADIO_GetSleepTimerClockSource();
210 switch (linklayer_slp_clk_src) {
211 case LL_RCC_RADIOSLEEPSOURCE_LSE:
212 linklayer_slp_clk_src = RTC_SLPTMR;
213 break;
214
215 case LL_RCC_RADIOSLEEPSOURCE_LSI:
216 linklayer_slp_clk_src = RCO_SLPTMR;
217 break;
218
219 case LL_RCC_RADIOSLEEPSOURCE_HSE_DIV1000:
220 linklayer_slp_clk_src = CRYSTAL_OSCILLATOR_SLPTMR;
221 break;
222
223 case LL_RCC_RADIOSLEEPSOURCE_NONE:
224 /* No Link Layer sleep clock source selected */
225 assert_param(0);
226 break;
227 }
228 ll_intf_cmn_le_select_slp_clk_src((uint8_t)linklayer_slp_clk_src, &freq_value);
229 }
230
ll_sys_reset(void)231 void ll_sys_reset(void)
232 {
233 /* USER CODE BEGIN ll_sys_reset_0 */
234
235 /* USER CODE END ll_sys_reset_0 */
236 #if (CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE == 0)
237 uint8_t bsca = 0;
238 #endif /* CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE */
239
240 /* Apply the selected link layer sleep timer source */
241 ll_sys_sleep_clock_source_selection();
242
243 /* Configure the link layer sleep clock accuracy if different from the default one */
244 #if (CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE != 0)
245 ll_intf_le_set_sleep_clock_accuracy(CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE);
246 #else
247 bsca = ll_sys_BLE_sleep_clock_accuracy_selection();
248 if (bsca != STM32WBA5x_DEFAULT_SCA_RANGE) {
249 ll_intf_le_set_sleep_clock_accuracy(bsca);
250 }
251 #endif /* CFG_RADIO_LSE_SLEEP_TIMER_CUSTOM_SCA_RANGE */
252
253 /* USER CODE BEGIN ll_sys_reset_1 */
254
255 /* USER CODE END ll_sys_reset_1 */
256 }
257