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