1  /***************************************************************************//**
2 * \file cy_ble_clk.c
3 * \version 3.70
4 *
5 * \brief
6 *  This driver provides the source code for API BLE ECO clock.
7 *
8 ********************************************************************************
9 * \copyright
10 * Copyright 2017-2020 Cypress Semiconductor Corporation
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 *     http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 
26 #include "cy_device.h"
27 
28 #if defined (CY_IP_MXBLESS) && defined (CY_IP_MXS40IOSS)
29 
30 #include "cy_syslib.h"
31 #include "cy_gpio.h"
32 #include "cy_syspm.h"
33 #include "cy_ble_clk.h"
34 #include "cy_sysclk.h"
35 
36 /* C binding of definitions if building with C++ compiler */
37 #ifdef __cplusplus
38 extern "C" {
39 #endif /* __cplusplus */
40 
41 CY_MISRA_DEVIATE_BLOCK_START('MISRA C-2012 Rule 10.4', 1, \
42 'Checked manually. Type cast to uint8_t made intentionally.')
43 
44 CY_MISRA_DEVIATE_BLOCK_START('MISRA C-2012 Rule 10.8', 3, \
45 'Checked manually. Type cast to uint8_t made intentionally.')
46 
47 /*******************************************************************************
48 *       Internal functions
49 *******************************************************************************/
50 
51 #if !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE)))
52 static cy_en_ble_eco_status_t Cy_BLE_HAL_RcbRegRead(uint16_t addr, uint16_t *data);
53 static cy_en_ble_eco_status_t Cy_BLE_HAL_RcbRegWrite(uint16_t addr, uint16_t data);
54 static cy_en_ble_eco_status_t Cy_BLE_HAL_EcoSetTrim(uint32_t trim, uint32_t startUpTime);
55 static cy_en_ble_eco_status_t Cy_BLE_HAL_MxdRadioEnableClocks(cy_en_ble_eco_freq_t bleEcoFreq,
56                                                               cy_en_ble_eco_sys_clk_div_t sysClkDiv);
57 #endif /* !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE))) */
58 
59 
60 /*******************************************************************************
61 *       Internal Defines
62 *******************************************************************************/
63 
64 /** \cond INTERNAL */
65 
66 #define CY_BLE_PORT2_CFG_VAL                                 (0x66666666u)
67 #define CY_BLE_PORT3_CFG_VAL                                 (0x66EEE666u)
68 #define CY_BLE_PORT4_CFG_VAL                                 (0x6666E666u)
69 
70 #define CY_BLE_PORT_CFG_OUT_VAL                              (0xFFFF0000u)
71 
72 #define CY_BLE_PORT2_HSIOM_SEL0                              (0x1C1C1C1Cu)
73 #define CY_BLE_PORT2_HSIOM_SEL1                              (0x1C1C1C1Cu)
74 #define CY_BLE_PORT3_HSIOM_SEL0                              (0x1A1A1A1Cu)
75 #define CY_BLE_PORT3_HSIOM_SEL1                              (0x00001A1Au)
76 #define CY_BLE_PORT4_HSIOM_SEL0                              (0x1C001A1Au)
77 #define CY_BLE_PORT4_HSIOM_SEL1                              (0x00000000u)
78 
79 #define CY_BLE_GPIO_PRT2                                     (&((GPIO_Type*)(cy_device->gpioBase))->PRT[2])
80 #define CY_BLE_GPIO_PRT3                                     (&((GPIO_Type*)(cy_device->gpioBase))->PRT[3])
81 #define CY_BLE_GPIO_PRT4                                     (&((GPIO_Type*)(cy_device->gpioBase))->PRT[4])
82 #define CY_BLE_GPIO_VDD_ACTIVE                               (((GPIO_Type*)(cy_device->gpioBase))->VDD_ACTIVE)
83 
84 #define CY_BLE_DEFAULT_OSC_STARTUP_DELAY_LF                  (25u)
85 #define CY_BLE_DEFAULT_CAP_TRIM_VALUE                        (32u)
86 #define CY_BLE_DEFAULT_ECO_FREQ                              (CY_BLE_BLESS_ECO_FREQ_32MHZ)
87 #define CY_BLE_DEFAULT_ECO_DIV                               (CY_BLE_SYS_ECO_CLK_DIV_4)
88 
89 #define CY_BLE_DEFAULT_HVLDO_STARTUP_DELAY                   (6UL)
90 #define CY_BLE_DEFAULT_ISOLATE_DEASSERT_DELAY                (0UL)
91 #define CY_BLE_DEFAULT_ACT_TO_SWITCH_DELAY                   (0UL)
92 #define CY_BLE_DEFAULT_HVLDO_DISABLE_DELAY                   (1UL)
93 #define CY_BLE_DEFAULT_ACT_STARTUP_DELAY                     (10UL)
94 #define CY_BLE_DEFAULT_DIG_LDO_STARTUP_DELAY                 (0UL)
95 #define CY_BLE_DEFAULT_XTAL_DISABLE_DELAY                    (1UL)
96 #define CY_BLE_DEFAULT_DIG_LDO_DISABLE_DELAY                 (0UL)
97 #define CY_BLE_DEFAULT_VDDR_STABLE_DELAY                     (1UL)
98 #define CY_BLE_DEFAULT_RCB_CTRL_LEAD                         (0x2UL)
99 #define CY_BLE_DEFAULT_RCB_CTRL_LAG                          (0x2UL)
100 #define CY_BLE_DEFAULT_RCB_CTRL_DIV                          (0x1UL)     /* LL 8 MHz / 2 */
101 #define CY_BLE_DEFAULT_RCB_CTRL_FREQ                         (4000000UL) /* Default RCB clock is 4 MHz */
102 #define CY_BLE_DEFAULT_ECO_CLK_FREQ_32MHZ                    (32000000UL)
103 #define CY_BLE_DEFAULT_ECO_CLK_FREQ_16MHZ                    (16000000UL)
104 #define CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL                      (CY_BLE_PMU_MODE_TRANSITION_REG_CLK_ANA_DIG_EN_BIT | \
105                                                                CY_BLE_PMU_MODE_TRANSITION_REG_RST_ACT_N_BIT)
106 #define CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL                  (CY_BLE_PMU_PMU_CTRL_REG_CLK_CMOS_SEL_BIT)
107 
108 /* Radio registers */
109 #define CY_BLE_RCB_FIFO_WR_BIT_MASK                          (0x8000UL)
110 #define CY_BLE_RCB_FIFO_WR_BIT_SHIFT                         (16U)
111 
112 #define CY_BLE_PMU_MODE_TRANSITION_REG                       (0x1e02U)
113 #define CY_BLE_PMU_MODE_TRANSITION_REG_CLK_ANA_DIG_EN_BIT    (uint16_t)(1UL << 12U)
114 #define CY_BLE_PMU_MODE_TRANSITION_REG_RST_ACT_N_BIT         (uint16_t)(1UL << 11U)
115 
116 #define CY_BLE_PMU_PMU_CTRL_REG                              (0x1e03u)
117 #define CY_BLE_PMU_PMU_CTRL_REG_CLK_CMOS_SEL_BIT             (uint16_t)(1UL << 10U)
118 
119 #define CY_BLE_RF_DCXO_CFG_REG                               (0x1e08U)
120 #define CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_SHIFT                (1U)
121 #define CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_MASK                 (0xffUL)
122 #define CY_BLE_RF_DCXO_CFG_REG_VALUE                         (0x1001U)
123 
124 #define CY_BLE_RF_DCXO_CFG2_REG                              (0x1e0fU)
125 #define CY_BLE_RF_DCXO_CFG2_REG_VALUE                        (0x6837U)
126 
127 #define CY_BLE_RF_DCXO_BUF_CFG_REG                           (0x1e09U)
128 #define CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT          (uint16_t)(1UL << 6U)
129 #define CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT         (4U)
130 #define CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_MASK          (0x03UL)
131 #define CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT             (0U)
132 #define CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_MASK              (0x0fUL)
133 
134 #define CY_BLE_RF_LDO_CFG_REG                                (0x1e07u)
135 #define CY_BLE_RF_LDO_CFG_REG_LDO10_CFG_SHIFT                (11U)
136 #define CY_BLE_RF_LDO_CFG_REG_LDO10_CFG_MASK                 (0x03UL)
137 #define CY_BLE_RF_LDO_CFG_REG_LDO_ACT_CFG_SHIFT              (7U)
138 #define CY_BLE_RF_LDO_CFG_REG_LDO_ACT_CFG_MASK               (0x15UL)
139 #define CY_BLE_RF_LDO_CFG_REG_LDO_IF_CFG_SHIFT               (5U)
140 #define CY_BLE_RF_LDO_CFG_REG_LDO_IF_CFG_MASK                (0x03UL)
141 
142 #define CY_BLE_RF_LDO_EN_REG                                 (0x1e06U)
143 #define CY_BLE_RF_LDO_EN_REG_LDO_RF_CFG_SHIFT                (6U)
144 #define CY_BLE_RF_LDO_EN_REG_LDO_RF_CFG_MASK                 (0x03UL)
145 
146 #define CY_BLE_DELAY_TIME                                    (1U)                          /* in us */
147 #define CY_BLE_RCB_TIMEOUT                                   (1000U / CY_BLE_DELAY_TIME)   /* 1ms   */
148 #define CY_BLE_VIO_TIMEOUT                                   (2000U / CY_BLE_DELAY_TIME)   /* 2ms   */
149 #define CY_BLE_ACT_TIMEOUT                                   (950000U / CY_BLE_DELAY_TIME) /* 950ms */
150 #define CY_BLE_RCB_RETRIES                                   (10U)
151 
152 
153 /* Range for inputs parameters */
154 #define CY_BLE_ECO_XTAL_START_UP_TIME_MAX                    ((uint32_t) (4593.75 / 31.25))
155 #define CY_BLE_ECO_XTAL_START_UP_TIME_MIN                    ((uint32_t) (400 / 31.25))
156 
157 #define CY_BLE_ECO_CLOAD_MIN                                 ((uint32_t) ((7.5 - 7.5)/0.075))
158 #define CY_BLE_ECO_CLOAD_MAX                                 ((uint32_t) ((26.325 - 7.5)/0.075))
159 
160 #define CY_BLE_ECO_SET_TRIM_DELAY_COEF                       (32U)
161 #define CY_BLE_ECO_LDO_ENABLE_DELAY                          (64U)
162 /** \endcond */
163 
164 
165 /*******************************************************************************
166 * Function Name: Cy_BLE_EcoConfigure
167 ****************************************************************************//**
168 *
169 *  This API configures and enables the BLE ECO clock.
170 *
171 *  If Cy_BLE_Enable() API is called by the application, the stack enables
172 *  the BLE ECO clock automatically with the following default parameters:
173 *
174 *    Parameter                 |  Value
175 *  --------------------        | -----------
176 *    ECO Frequency             | CY_BLE_DEFAULT_ECO_FREQ
177 *    Divider                   | CY_BLE_DEFAULT_ECO_DIV
178 *    Startup time              | CY_BLE_DEFAULT_OSC_STARTUP_DELAY_LF
179 *    Load cap                  | CY_BLE_DEFAULT_CAP_TRIM_VALUE
180 *
181 *  If there is a need to start the BLE ECO with non-default parameters, call the
182 *  Cy_BLE_EcoConfigure() function with the custom configuration each time before calling
183 *  the Cy_BLE_Enable() function.
184 *
185 *  This clock is stopped in Deep Sleep and Hibernate power modes.
186 *
187 *  \param freq            -  Operating frequency of the crystal, type of
188 *                            \ref cy_en_ble_eco_freq_t.
189 *
190 *  \param sysClkDiv       -  System divider for ECO clock, type of
191 *                            \ref cy_en_ble_eco_sys_clk_div_t.
192 *
193 *  \param cLoad           -  ECO crystal load capacitance in multiple of 0.075pF
194 *                            (pF_from_user valid range: 7.5...26.625pF)
195 *                            cLoad = ((pF_from_user - 7.5)/0.075)
196 *
197 *  \param xtalStartUpTime -  ECO crystal startup time in multiple of 31.25us
198 *                            (startup_time_from_user valid range: 400...4593.75us)
199 *                            xtalStartUpTime = startup_time_from_user/31.25
200 *
201 *  \param voltageReg      -  BLE Voltage regulator, type of
202 *                            \ref cy_en_ble_eco_voltage_reg_t.
203 *
204 *  \return
205 *  \ref cy_en_ble_eco_status_t : The return value indicates if the function
206 *  succeeded or failed. The possible error codes:
207 *
208 *  Error Codes                 | Description
209 *  --------------------        | -----------
210 *  CY_BLE_ECO_SUCCESS          | The function completed successfully.
211 *  CY_BLE_ECO_BAD_PARAM        | The wrong input parameter.
212 *  CY_BLE_ECO_RCB_CONTROL_LL   | The RCB Control is with BLE Link Layer.
213 *  CY_BLE_ECO_ALREADY_STARTED  | The BLE ECO clock is already started.
214 *  CY_BLE_ECO_HARDWARE_ERROR   | The RCB or BLE ECO operation failed.
215 *
216 *  For the PSoC 64 devices, there are possible situations when the function returns
217 *  the PRA error status code. This is because for PSoC 64 devices, the function
218 *  uses the PRA driver to change the frequency value on the protected side.
219 *  Refer to \ref cy_en_pra_status_t for more details.
220 *
221 *  \funcusage
222 *  \snippet bleclk/snippet/main.c BLE ECO clock API: Cy_BLE_EcoConfigure()
223 *
224 *  \sideeffect
225 *   The I/O pins will be automatically unfrozen coming out of Hibernate when
226 *   the BLE ECO is in use.
227 *
228 *  \note Limitation: Do not call this API if the BLE is executed with LPM.
229 *   There is a risk that when the Cy_BLE_EcoConfigure() function is called on
230 *   one core, the BLE is in Deep Sleep mode on the other core. It will cause
231 *   a fault hard exception.
232 *
233 *******************************************************************************/
Cy_BLE_EcoConfigure(cy_en_ble_eco_freq_t freq,cy_en_ble_eco_sys_clk_div_t sysClkDiv,uint32_t cLoad,uint32_t xtalStartUpTime,cy_en_ble_eco_voltage_reg_t voltageReg)234 cy_en_ble_eco_status_t Cy_BLE_EcoConfigure(cy_en_ble_eco_freq_t freq, cy_en_ble_eco_sys_clk_div_t sysClkDiv,
235                                            uint32_t cLoad, uint32_t xtalStartUpTime, cy_en_ble_eco_voltage_reg_t voltageReg)
236 {
237     cy_en_ble_eco_status_t status = CY_BLE_ECO_SUCCESS;
238 
239 #if ((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE)))
240     cy_stc_pra_ble_eco_config_t ecoConfigParams;
241     ecoConfigParams.freq = freq;
242     ecoConfigParams.sysClkDiv = sysClkDiv;
243     ecoConfigParams.cLoad = cLoad;
244     ecoConfigParams.xtalStartUpTime = xtalStartUpTime;
245     ecoConfigParams.voltageReg = voltageReg;
246 
247     status = (cy_en_ble_eco_status_t)CY_PRA_FUNCTION_CALL_RETURN_PARAM(CY_PRA_MSG_TYPE_SECURE_ONLY,
248                                                                        CY_PRA_BLE_CLK_FUNC_ECO_CONFIGURE,
249                                                                        &ecoConfigParams);
250 #else
251     uint32_t temp = 0UL;
252 
253     if( (freq > CY_BLE_BLESS_ECO_FREQ_32MHZ) || (sysClkDiv > CY_BLE_SYS_ECO_CLK_DIV_8) ||
254         (xtalStartUpTime > CY_BLE_ECO_XTAL_START_UP_TIME_MAX) || (xtalStartUpTime < CY_BLE_ECO_XTAL_START_UP_TIME_MIN) ||
255         (cLoad > CY_BLE_ECO_CLOAD_MAX))
256     {
257         status = CY_BLE_ECO_BAD_PARAM;
258     }
259     else
260     {
261         /* Unfreeze IO after Hibernate */
262         if(Cy_SysPm_GetIoFreezeStatus())
263         {
264             Cy_SysPm_IoUnfreeze();
265         }
266 
267         if(Cy_BLE_EcoIsEnabled())
268         {
269             status = CY_BLE_ECO_ALREADY_STARTED;
270         }
271         else
272         {
273             /* HAL Initialization */
274             Cy_BLE_HAL_Init();
275 
276             /* BLESS MT Delays configuration */
277             BLE_BLESS_MT_DELAY_CFG =
278                 (uint32_t)(CY_BLE_DEFAULT_HVLDO_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG_HVLDO_STARTUP_DELAY_Pos) |
279                 (uint32_t)(CY_BLE_DEFAULT_ISOLATE_DEASSERT_DELAY << BLE_BLESS_MT_DELAY_CFG_ISOLATE_DEASSERT_DELAY_Pos) |
280                 (uint32_t)(CY_BLE_DEFAULT_ACT_TO_SWITCH_DELAY << BLE_BLESS_MT_DELAY_CFG_ACT_TO_SWITCH_DELAY_Pos) |
281                 (uint32_t)(CY_BLE_DEFAULT_HVLDO_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG_HVLDO_DISABLE_DELAY_Pos);
282 
283             BLE_BLESS_MT_DELAY_CFG2 =
284                 (uint32_t)(xtalStartUpTime << BLE_BLESS_MT_DELAY_CFG2_OSC_STARTUP_DELAY_LF_Pos) |
285                 (uint32_t)(CY_BLE_DEFAULT_ACT_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG2_ACT_STARTUP_DELAY_Pos) |
286                 (uint32_t)(CY_BLE_DEFAULT_DIG_LDO_STARTUP_DELAY << BLE_BLESS_MT_DELAY_CFG2_DIG_LDO_STARTUP_DELAY_Pos);
287 
288             BLE_BLESS_MT_DELAY_CFG3 =
289                 (uint32_t)(CY_BLE_DEFAULT_XTAL_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_XTAL_DISABLE_DELAY_Pos) |
290                 (uint32_t)(CY_BLE_DEFAULT_DIG_LDO_DISABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_DIG_LDO_DISABLE_DELAY_Pos) |
291                 (uint32_t)(CY_BLE_DEFAULT_VDDR_STABLE_DELAY << BLE_BLESS_MT_DELAY_CFG3_VDDR_STABLE_DELAY_Pos);
292 
293             /* RCB Initialization
294              * Check if the RCB Control is with LL.
295              */
296             if((BLE_RCB_RCBLL_CTRL & BLE_RCB_RCBLL_CTRL_RCBLL_CTRL_Msk) != 0U)
297             {
298                 status = CY_BLE_ECO_RCB_CONTROL_LL;
299             }
300             else
301             {
302                 uint32_t rcbDivider = 0UL;
303 
304                 /* If clock source for RCB is PeriClk */
305                 if((BLE_BLESS_LL_CLK_EN & BLE_BLESS_LL_CLK_EN_SEL_RCB_CLK_Msk) == 0U)
306                 {
307                     uint32_t periClkFreqHz = Cy_SysClk_ClkPeriGetFrequency();
308 
309                     if(periClkFreqHz > CY_BLE_DEFAULT_RCB_CTRL_FREQ)
310                     {
311                         rcbDivider = (periClkFreqHz / CY_BLE_DEFAULT_RCB_CTRL_FREQ) - 1U;
312                     }
313                 }
314                 else
315                 {
316                     rcbDivider = CY_BLE_DEFAULT_RCB_CTRL_DIV;
317                 }
318 
319                 /* Configure default RCB Parameters. */
320                 BLE_RCB_CTRL |= (BLE_RCB_CTRL_ENABLED_Msk |
321                                   BLE_RCB_CTRL_RX_CLK_EDGE_Msk |
322                                   (CY_BLE_DEFAULT_RCB_CTRL_LEAD << BLE_RCB_CTRL_LEAD_Pos) |
323                                   (CY_BLE_DEFAULT_RCB_CTRL_LAG << BLE_RCB_CTRL_LAG_Pos) |
324                                   ((rcbDivider > 0U) ? ((rcbDivider << BLE_RCB_CTRL_DIV_Pos) |
325                                                         BLE_RCB_CTRL_DIV_ENABLED_Msk) : 0U));
326 
327                 /* If user uses SIMO Buck, enable Buck2 in hardware mode for BLE */
328 #if (defined (SRSS_BUCKCTL_PRESENT) && (SRSS_BUCKCTL_PRESENT == 1u))
329                 if((Cy_SysPm_SimoBuckIsEnabled()) && (voltageReg == CY_BLE_ECO_VOLTAGE_REG_AUTO))
330                 {
331                     Cy_SysPm_BuckSetVoltage2(CY_SYSPM_BUCK_OUT2_VOLTAGE_1_3V, true);
332                     Cy_SysPm_BuckSetVoltage2HwControl(true);
333                 }
334                 else    /* Configure BLE LDO if SIMO Buck2 is not enabled */
335                 {
336                     BLE_BLESS_MISC_EN_CTRL |= (BLE_BLESS_MISC_EN_CTRL_ACT_REG_EN_CTRL_Msk |
337                                                 BLE_BLESS_MISC_EN_CTRL_BUCK_EN_CTRL_Msk);
338                 }
339 #else
340                 BLE_BLESS_MISC_EN_CTRL |= (BLE_BLESS_MISC_EN_CTRL_ACT_REG_EN_CTRL_Msk |
341                                             BLE_BLESS_MISC_EN_CTRL_BUCK_EN_CTRL_Msk);
342 #endif
343 
344                 /* Enable the VIO supply and LDO in standby mode for slow ramp */
345                 temp = BLE_BLESS_MT_CFG;
346                 temp |= BLE_BLESS_MT_CFG_HVLDO_BYPASS_Msk |
347                         BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Msk |
348                         BLE_BLESS_MT_CFG_HVLDO_EN_Msk |
349                         BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Msk;
350                 BLE_BLESS_MT_CFG = temp;
351                 Cy_SysLib_DelayUs(CY_BLE_ECO_LDO_ENABLE_DELAY);
352 
353                 if((BLE_BLESS_MT_VIO_CTRL & BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk) == 0U)
354                 {
355                     /* Enable LDO */
356                     BLE_BLESS_MT_VIO_CTRL = BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk;
357 
358                     /* Wait for 64us after turning HVLDO ON */
359                     Cy_SysLib_DelayUs(CY_BLE_ECO_LDO_ENABLE_DELAY);
360 
361                     /* Enable LDO Delayed */
362                     BLE_BLESS_MT_VIO_CTRL = BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_Msk |
363                                              BLE_BLESS_MT_VIO_CTRL_SRSS_SWITCH_EN_DLY_Msk;
364                     /* Wait for 64us */
365                     Cy_SysLib_DelayUs(CY_BLE_ECO_LDO_ENABLE_DELAY);
366                 }
367 
368                 /* Disable override mode and let hardware take control of HVLDO */
369                 temp &= ~(BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_BYPASS_Msk |
370                           BLE_BLESS_MT_CFG_OVERRIDE_HVLDO_EN_Msk);
371                 BLE_BLESS_MT_CFG = temp;
372 
373                 /* Wait for the VIO stable key write operation to complete */
374                 {
375                     uint32_t timeout = CY_BLE_VIO_TIMEOUT;
376                     while(((CY_BLE_GPIO_VDD_ACTIVE & 0x10U) == 0U) && (timeout > 0U))
377                     {
378                         timeout--;
379                         Cy_SysLib_DelayUs(CY_BLE_DELAY_TIME);
380                     }
381                     if(timeout == 0U)
382                     {
383                         status = CY_BLE_ECO_HARDWARE_ERROR;
384                     }
385                 }
386 
387 
388                 if(status == CY_BLE_ECO_SUCCESS)
389                 {
390                     uint32_t timeout = CY_BLE_ACT_TIMEOUT;
391 
392                     /* Clear the BLERD_ACTIVE_INTR */
393                     BLE_BLESS_INTR_STAT |= BLE_BLESS_INTR_STAT_BLERD_ACTIVE_INTR_Msk;
394 
395 
396  #if (defined (SRSS_BUCKCTL_PRESENT) && (SRSS_BUCKCTL_PRESENT == 1u))
397                     if((!Cy_SysPm_SimoBuckOutputIsEnabled(CY_SYSPM_BUCK_VRF)) || (voltageReg == CY_BLE_ECO_VOLTAGE_REG_BLESSLDO))
398                     {
399                         temp |= BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Msk;
400                     }
401 #else
402                     temp |= BLE_BLESS_MT_CFG_ACT_LDO_NOT_BUCK_Msk;
403 #endif
404                     /* Enable Radio */
405                     temp |= BLE_BLESS_MT_CFG_ENABLE_BLERD_Msk;
406 
407                     /* Disable ECO in DeepSleep mode */
408                     temp &= ~BLE_BLESS_MT_CFG_DPSLP_ECO_ON_Msk;
409                     BLE_BLESS_MT_CFG = temp;
410 
411                     /* Wait for BLESS in ACTIVE state */
412                     while(((BLE_BLESS_MT_STATUS & BLE_BLESS_MT_STATUS_BLESS_STATE_Msk) == 0U) && (timeout > 0U))
413                     {
414                         timeout--;
415                         Cy_SysLib_DelayUs(CY_BLE_DELAY_TIME);
416                     }
417                     if(timeout == 0U)
418                     {
419                         status = CY_BLE_ECO_HARDWARE_ERROR;
420                     }
421                 }
422 
423                 if(status == CY_BLE_ECO_SUCCESS)
424                 {
425                     /* Enable and configure radio clock */
426                     status = Cy_BLE_HAL_MxdRadioEnableClocks(freq, sysClkDiv);
427                 }
428 
429                 if(status == CY_BLE_ECO_SUCCESS)
430                 {
431                     /* Set Load capacitance */
432                     status = Cy_BLE_HAL_EcoSetTrim(cLoad, xtalStartUpTime);
433                 }
434             }
435         }
436     }
437 #endif /* ((CY_CPU_CORTEX_M4) && (!defined(CY_DEVICE_SECURE))) */
438 
439     return(status);
440 }
441 
442 
443 /*******************************************************************************
444 * Function Name: Cy_BLE_EcoReset
445 ****************************************************************************//**
446 *
447 *  This API resets and disables the BLE ECO clock.
448 *
449 *  \return
450 *   None
451 *
452 *******************************************************************************/
Cy_BLE_EcoReset(void)453 void Cy_BLE_EcoReset(void)
454 {
455     /* Initiate Soft Reset */
456 #if ((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE)))
457     CY_PRA_FUNCTION_CALL_VOID_VOID(CY_PRA_MSG_TYPE_SECURE_ONLY, CY_PRA_BLE_CLK_FUNC_ECO_RESET);
458 #else
459     BLE_BLESS_LL_CLK_EN |= BLE_BLESS_LL_CLK_EN_BLESS_RESET_Msk;
460     cy_BleEcoClockFreqHz = 0UL; /* Reset the BLE ECO frequency */
461 #endif
462 }
463 
464 
465 /*******************************************************************************
466 * Function Name: Cy_BLE_EcoStart
467 ****************************************************************************//**
468 *
469 *  This API configure and enables the BLE ECO clock.
470 *
471 *  This API is used as the PSoC Creator wrapper function. This function is not
472 *  recommended for new designs. Please use Cy_BLE_EcoConfigure()
473 *  instead of this function.
474 *
475 *  \param config
476 *  The pointer to the configuration structure cy_stc_ble_eco_config_t.
477 *
478 *  \return
479 *  \ref cy_en_ble_eco_status_t : The return value indicates if the function
480 *  succeeded or failed. The possible error codes:
481 *
482 *  Error Codes                 | Description
483 *  --------------------        | -----------
484 *  CY_BLE_ECO_SUCCESS          | The function completed successfully.
485 *  CY_BLE_ECO_BAD_PARAM        | The wrong input parameter.
486 *  CY_BLE_ECO_RCB_CONTROL_LL   | The RCB Control is with BLE Link Layer.
487 *  CY_BLE_ECO_ALREADY_STARTED  | The BLE ECO clock is already started.
488 *  CY_BLE_ECO_HARDWARE_ERROR   | The RCB or BLE ECO operation failed.
489 *
490 *  \sideeffect
491 *   The I/O pins will be automatically unfrozen coming out of Hibernate when
492 *   the BLE ECO is in use.
493 *
494 *  \note Limitation: Do not call this API if the BLE is executed with LPM.
495 *   There is a risk that when the Cy_BLE_EcoStart() function is called on one
496 *   core, the BLE is in Deep Sleep mode on the other core. It will cause
497 *   a fault hard exception.
498 *
499 *******************************************************************************/
Cy_BLE_EcoStart(const cy_stc_ble_eco_config_t * config)500 cy_en_ble_eco_status_t Cy_BLE_EcoStart(const cy_stc_ble_eco_config_t *config)
501 {
502     cy_en_ble_eco_status_t retValue = CY_BLE_ECO_BAD_PARAM;
503     if(config != NULL)
504     {
505         /* Configure BLE ECO clock */
506         retValue = Cy_BLE_EcoConfigure(config->ecoFreq, config->ecoSysDiv, (uint32_t) config->loadCap,
507                                       (uint32_t) config->ecoXtalStartUpTime, CY_BLE_ECO_VOLTAGE_REG_AUTO);
508     }
509     return (retValue);
510 }
511 
512 
513 /*******************************************************************************
514 * Function Name: Cy_BLE_EcoStop
515 ****************************************************************************//**
516 *
517 *  This API stops BLE ECO clock.
518 *
519 *  This API is used as the PSoC Creator wrapper function. This function is not
520 *  recommended for new designs. Please use Cy_BLE_EcoReset() instead of this
521 *  function.
522 *
523 *  \return
524 *   None
525 *
526 *******************************************************************************/
Cy_BLE_EcoStop(void)527 void Cy_BLE_EcoStop(void)
528 {
529     Cy_BLE_EcoReset();
530 }
531 
532 
533 /*******************************************************************************
534 * Function Name: Cy_BLE_HAL_Init
535 ****************************************************************************//**
536 *
537 *  Initializes the BLESS port.
538 *
539 * \return
540 *  None
541 *
542 *******************************************************************************/
Cy_BLE_HAL_Init(void)543 void Cy_BLE_HAL_Init(void)
544 {
545     /* Configures pins for BLESS */
546     const cy_stc_gpio_prt_config_t port2_cfg =
547     {
548            0UL,                         /* out       */
549            0UL,                         /* ntrMask   */
550            0UL,                         /* intrCfg   */
551            CY_BLE_PORT2_CFG_VAL,        /* cfg       */
552            0UL,                         /* cfgIn     */
553            CY_BLE_PORT_CFG_OUT_VAL,     /* cfgOut    */
554            0UL,                         /* cfgSIO     */
555            CY_BLE_PORT2_HSIOM_SEL0,     /* sel0Active */
556            CY_BLE_PORT2_HSIOM_SEL1      /* sel1Active */
557     };
558 
559     const cy_stc_gpio_prt_config_t port3_cfg =
560     {
561            0UL,                         /* out       */
562            0UL,                         /* ntrMask   */
563            0UL,                         /* intrCfg   */
564            CY_BLE_PORT3_CFG_VAL,        /* cfg       */
565            0UL,                         /* cfgIn     */
566            CY_BLE_PORT_CFG_OUT_VAL,     /* cfgOut    */
567            0UL,                         /* cfgSIO     */
568            CY_BLE_PORT3_HSIOM_SEL0,     /* sel0Active */
569            CY_BLE_PORT3_HSIOM_SEL1      /* sel1Active */
570     };
571 
572     const cy_stc_gpio_prt_config_t port4_cfg =
573     {
574            0UL,                         /* out       */
575            0UL,                         /* ntrMask   */
576            0UL,                         /* intrCfg   */
577            CY_BLE_PORT4_CFG_VAL,        /* cfg       */
578            0UL,                         /* cfgIn     */
579            CY_BLE_PORT_CFG_OUT_VAL,     /* cfgOut    */
580            0UL,                         /* cfgSIO     */
581            CY_BLE_PORT4_HSIOM_SEL0,     /* sel0Active */
582            CY_BLE_PORT4_HSIOM_SEL1      /* sel1Active */
583     };
584 
585     (void)Cy_GPIO_Port_Init(CY_BLE_GPIO_PRT2, &port2_cfg);
586     (void)Cy_GPIO_Port_Init(CY_BLE_GPIO_PRT3, &port3_cfg);
587     (void)Cy_GPIO_Port_Init(CY_BLE_GPIO_PRT4, &port4_cfg);
588 
589 }
590 
591 
592 #if !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE)))
593 /*******************************************************************************
594 * Function Name: Cy_BLE_HAL_RcbRegRead
595 ****************************************************************************//**
596 *
597 *  Reads Radio register.
598 *
599 *  \param addr : Register address.
600 *  \param *data: Register data (output parameter).
601 *
602 *  \return
603 *  \ref cy_en_ble_eco_status_t : Return value indicates if the function succeeded or
604 *  failed. The following are possible error codes:
605 *
606 *  Error Codes                 | Description
607 *  --------------------        | -----------
608 *  CY_BLE_ECO_SUCCESS          | On successful operation.
609 *  CY_BLE_ECO_HARDWARE_ERROR   | If RCB operation failed
610 *
611 *******************************************************************************/
Cy_BLE_HAL_RcbRegRead(uint16_t addr,uint16_t * data)612 static cy_en_ble_eco_status_t Cy_BLE_HAL_RcbRegRead(uint16_t addr, uint16_t *data)
613 {
614     cy_en_ble_eco_status_t status = CY_BLE_ECO_HARDWARE_ERROR;
615     uint32_t timeout = CY_BLE_RCB_TIMEOUT;
616     uint32_t temp = (uint32_t)((CY_BLE_RCB_FIFO_WR_BIT_MASK | addr) << CY_BLE_RCB_FIFO_WR_BIT_SHIFT);
617 
618     /* Write Address to the RCB */
619     BLE_RCB_TX_FIFO_WR = temp;
620 
621     /* Wait for Data. */
622     while(((BLE_RCB_INTR & BLE_RCB_INTR_RCB_DONE_Msk) == 0U) && (timeout > 0U))
623     {
624         timeout--;
625         Cy_SysLib_DelayUs(CY_BLE_DELAY_TIME);
626     }
627 
628     if(timeout > 0U)
629     {
630         BLE_RCB_INTR |= BLE_RCB_INTR_RCB_DONE_Msk;
631         *data = (uint16_t)BLE_RCB_RX_FIFO_RD;
632         status = CY_BLE_ECO_SUCCESS;
633     }
634 
635     return(status);
636 }
637 
638 
639 /*******************************************************************************
640 * Function Name: Cy_BLE_HAL_RcbRegWrite
641 ****************************************************************************//**
642 *
643 *  Writes Radio register.
644 *
645 *  \param addr: Register address.
646 *  \param data: Register data.
647 *
648 *  \return
649 *  \ref cy_en_ble_eco_status_t : Return value indicates if the function succeeded or
650 *  failed. The following are possible error codes:
651 *
652 *  Error Codes                 | Description
653 *  --------------------        | -----------
654 *  CY_BLE_ECO_SUCCESS          | On successful operation.
655 *  CY_BLE_ECO_HARDWARE_ERROR   | If RCB operation failed
656 *
657 *******************************************************************************/
Cy_BLE_HAL_RcbRegWrite(uint16_t addr,uint16_t data)658 static cy_en_ble_eco_status_t Cy_BLE_HAL_RcbRegWrite(uint16_t addr, uint16_t data)
659 {
660     cy_en_ble_eco_status_t status = CY_BLE_ECO_HARDWARE_ERROR;
661     uint32_t timeout = CY_BLE_RCB_TIMEOUT;
662     uint32_t temp = ((uint32_t)((~CY_BLE_RCB_FIFO_WR_BIT_MASK & addr) << CY_BLE_RCB_FIFO_WR_BIT_SHIFT)) | data;
663 
664     BLE_RCB_TX_FIFO_WR = temp;
665 
666     /* Wait for RCB done. */
667     while(((BLE_RCB_INTR & BLE_RCB_INTR_RCB_DONE_Msk) == 0U) && (timeout > 0U))
668     {
669         timeout--;
670         Cy_SysLib_DelayUs(CY_BLE_DELAY_TIME);
671     }
672 
673     if(timeout > 0U)
674     {
675         BLE_RCB_INTR |= BLE_RCB_INTR_RCB_DONE_Msk;
676         status = CY_BLE_ECO_SUCCESS;
677     }
678 
679     return(status);
680 }
681 
682 
683 /*******************************************************************************
684 * Function Name: Cy_BLE_HAL_EcoSetTrim
685 ****************************************************************************//**
686 *
687 *  Sets ECO trim value.
688 *
689 *  \param trim        : Trim value.
690 *  \param startUpTime : Start up time delay.
691 *
692 *  \return
693 *  \ref cy_en_ble_eco_status_t : Return value indicates if the function succeeded or
694 *  failed. The following are possible error codes:
695 *
696 *  Error Codes                 | Description
697 *  --------------------        | -----------
698 *  CY_BLE_ECO_SUCCESS          | On successful operation.
699 *  CY_BLE_ECO_HARDWARE_ERROR   | If RCB operation failed
700 *
701 *******************************************************************************/
Cy_BLE_HAL_EcoSetTrim(uint32_t trim,uint32_t startUpTime)702 static cy_en_ble_eco_status_t Cy_BLE_HAL_EcoSetTrim(uint32_t trim, uint32_t startUpTime)
703 {
704     uint16_t reg = CY_BLE_RF_DCXO_CFG_REG_VALUE;
705     cy_en_ble_eco_status_t status;
706 
707     /* Load the new CAP TRIM value */
708     reg |= (uint16_t)((uint16_t)trim << CY_BLE_RF_DCXO_CFG_REG_DCXO_CAP_SHIFT);
709 
710     /* Write the new value to the register */
711     status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_RF_DCXO_CFG_REG, reg);
712 
713     if(status == CY_BLE_ECO_SUCCESS)
714     {
715         /* Write the new value to the CFG2 register */
716         status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_RF_DCXO_CFG2_REG, CY_BLE_RF_DCXO_CFG2_REG_VALUE);
717     }
718 
719     Cy_SysLib_DelayUs((uint16_t)startUpTime * CY_BLE_ECO_SET_TRIM_DELAY_COEF);
720 
721     return(status);
722 }
723 
724 
725 /*******************************************************************************
726 * Function Name: Cy_BLE_HAL_MxdRadioEnableClocks
727 ****************************************************************************//**
728 *
729 *  Enables and configures radio clock.
730 *
731 *  \param bleEcoFreq   : ECO Frequency.
732 *  \param sysClkDiv : System divider for ECO clock.
733 *
734 *  \return
735 *  \ref cy_en_ble_eco_status_t : Return value indicates if the function succeeded or
736 *  failed. The following are possible error codes:
737 *
738 *  Error Codes                 | Description
739 *  --------------------        | -----------
740 *  CY_BLE_ECO_SUCCESS          | On successful operation.
741 *  CY_BLE_ECO_HARDWARE_ERROR   | If RCB operation failed
742 *
743 *******************************************************************************/
Cy_BLE_HAL_MxdRadioEnableClocks(cy_en_ble_eco_freq_t bleEcoFreq,cy_en_ble_eco_sys_clk_div_t sysClkDiv)744 static cy_en_ble_eco_status_t Cy_BLE_HAL_MxdRadioEnableClocks(cy_en_ble_eco_freq_t bleEcoFreq,
745                                                               cy_en_ble_eco_sys_clk_div_t sysClkDiv)
746 {
747     uint16_t temp;
748     uint32_t retries = CY_BLE_RCB_RETRIES;
749     cy_en_ble_eco_status_t status;
750 
751     /* De-assert active domain reset and enable clock buffer in MXD Radio */
752     do
753     {
754         status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_PMU_MODE_TRANSITION_REG, CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL);
755         if(status == CY_BLE_ECO_SUCCESS)
756         {
757             status = Cy_BLE_HAL_RcbRegRead(CY_BLE_PMU_MODE_TRANSITION_REG, &temp);
758         }
759         if(retries > 0U)
760         {
761             retries--;
762         }
763         else
764         {
765             status = CY_BLE_ECO_HARDWARE_ERROR;
766         }
767     }
768     while((status == CY_BLE_ECO_SUCCESS) && (temp != CY_BLE_MXD_RADIO_CLK_BUF_EN_VAL));
769 
770     /* Check if ECO clock output is enabled
771      * In MXD_VER2, ECO clock is stopped on overwriting this bit */
772     if(status == CY_BLE_ECO_SUCCESS)
773     {
774         retries = CY_BLE_RCB_RETRIES;
775         status = Cy_BLE_HAL_RcbRegRead(CY_BLE_PMU_PMU_CTRL_REG, &temp);
776         if((status == CY_BLE_ECO_SUCCESS) && ((temp & CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL) == 0U))
777         {
778             /* Enable digital ECO clock output from MXD Radio to BLESS */
779             do
780             {
781                 status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_PMU_PMU_CTRL_REG, CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL);
782                 if(status == CY_BLE_ECO_SUCCESS)
783                 {
784                     status = Cy_BLE_HAL_RcbRegRead(CY_BLE_PMU_PMU_CTRL_REG, &temp);
785                 }
786                 if(retries > 0U)
787                 {
788                     retries--;
789                 }
790                 else
791                 {
792                     status = CY_BLE_ECO_HARDWARE_ERROR;
793                 }
794             }
795             while((status == CY_BLE_ECO_SUCCESS) && (temp != CY_BLE_MXD_RADIO_DIG_CLK_OUT_EN_VAL));
796         }
797     }
798 
799     /* Configure ECO clock frequency and clock divider in MXD Radio */
800     if(status == CY_BLE_ECO_SUCCESS)
801     {
802         /* Read the MXD Radio register */
803         status = Cy_BLE_HAL_RcbRegRead(CY_BLE_RF_DCXO_BUF_CFG_REG, &temp);
804     }
805     if(status == CY_BLE_ECO_SUCCESS)
806     {
807         uint16_t blerdDivider;
808         uint16_t ecoSysDivider;
809         uint16_t blellDivider = 0U;
810 
811         /* Clear clock divider and select amp buffer output bits */
812         temp &= CY_LO16(~((CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_MASK << CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT) |
813                           (CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_MASK << CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT)));
814 
815         /* Total ECO divider consist of divider located on BLERD and BLESS divider
816          * Set BLERD divider to maximum value taking in to account that 8 MHz is required for BLELL.
817          * BLELL clock frequency is set to 8 MHz irrespective of the crystal value.
818          */
819         if(bleEcoFreq == CY_BLE_BLESS_ECO_FREQ_32MHZ)
820         {
821             if(sysClkDiv >= CY_BLE_SYS_ECO_CLK_DIV_4)
822             {
823                 blerdDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_4;
824             }
825             else
826             {
827                 blerdDivider = (uint16_t)sysClkDiv;
828                 blellDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_4 - blerdDivider;
829             }
830             temp |= CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT;
831             temp |= ((uint16_t)CY_BLE_MXD_RADIO_CLK_BUF_AMP_32M_LARGE << (uint16_t)CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT);
832 
833             /* Update cy_BleEcoClockFreqHz for the proper Cy_SysLib_Delay functionality */
834             cy_BleEcoClockFreqHz = CY_BLE_DEFAULT_ECO_CLK_FREQ_32MHZ / (1UL << (uint16_t)sysClkDiv);
835         }
836         else
837         {
838             if(sysClkDiv >= CY_BLE_SYS_ECO_CLK_DIV_2)
839             {
840                 blerdDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_2;
841             }
842             else
843             {
844                 blerdDivider = (uint16_t)sysClkDiv;
845                 blellDivider = (uint16_t)CY_BLE_MXD_RADIO_CLK_DIV_2 - blerdDivider;
846             }
847             temp &= (uint16_t) ~CY_BLE_RF_DCXO_BUF_CFG_REG_XTAL_32M_SEL_BIT;
848             temp |= (uint16_t)((uint32_t)CY_BLE_MXD_RADIO_CLK_BUF_AMP_16M_LARGE << CY_BLE_RF_DCXO_BUF_CFG_REG_BUF_AMP_SEL_SHIFT);
849 
850             /* Update cy_BleEcoClockFreqHz for the proper Cy_SysLib_Delay functionality */
851             cy_BleEcoClockFreqHz = CY_BLE_DEFAULT_ECO_CLK_FREQ_16MHZ / (1UL << (uint16_t)sysClkDiv);
852         }
853 
854         temp |= (uint16_t)(blerdDivider << CY_BLE_RF_DCXO_BUF_CFG_REG_CLK_DIV_SHIFT);
855 
856         /* Write the MXD Radio register */
857         status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_RF_DCXO_BUF_CFG_REG, temp);
858 
859         /* Reduce BLESS divider by BLERD divider value */
860         ecoSysDivider = (uint16_t)sysClkDiv - blerdDivider;
861         temp = (uint16_t)(ecoSysDivider & BLE_BLESS_XTAL_CLK_DIV_CONFIG_SYSCLK_DIV_Msk);
862         temp |= (uint16_t)(blellDivider << BLE_BLESS_XTAL_CLK_DIV_CONFIG_LLCLK_DIV_Pos);
863 
864         /* Set clock divider */
865         BLE_BLESS_XTAL_CLK_DIV_CONFIG = temp;
866     }
867 
868     /* Update RADIO LDO trim values */
869     if((Cy_SysLib_GetDeviceRevision() != CY_SYSLIB_DEVICE_REV_0A) && (SFLASH->RADIO_LDO_TRIMS != 0U))
870     {
871         if(status == CY_BLE_ECO_SUCCESS)
872         {
873             status = Cy_BLE_HAL_RcbRegRead(CY_BLE_RF_LDO_CFG_REG, &temp);
874         }
875 
876         if(status == CY_BLE_ECO_SUCCESS)
877         {
878             /* Update LDO_IF value */
879             temp &= (uint16_t)~((uint16_t) ((uint16_t)CY_BLE_RF_LDO_CFG_REG_LDO_IF_CFG_MASK << CY_BLE_RF_LDO_CFG_REG_LDO_IF_CFG_SHIFT));
880             temp |= (uint16_t)(((SFLASH->RADIO_LDO_TRIMS & SFLASH_RADIO_LDO_TRIMS_LDO_IF_Msk) >>
881                                 SFLASH_RADIO_LDO_TRIMS_LDO_IF_Pos) << CY_BLE_RF_LDO_CFG_REG_LDO_IF_CFG_SHIFT);
882 
883             /* Update LDO_ACT value */
884             temp &= (uint16_t)~((uint16_t) ((uint16_t)CY_BLE_RF_LDO_CFG_REG_LDO_ACT_CFG_MASK << CY_BLE_RF_LDO_CFG_REG_LDO_ACT_CFG_SHIFT));
885             temp |= (uint16_t)(((SFLASH->RADIO_LDO_TRIMS & SFLASH_RADIO_LDO_TRIMS_LDO_ACT_Msk) >>
886                                 SFLASH_RADIO_LDO_TRIMS_LDO_ACT_Pos) << CY_BLE_RF_LDO_CFG_REG_LDO_ACT_CFG_SHIFT);
887 
888             /* Update LDO_DIG value */
889             temp &= (uint16_t)~((uint16_t) ((uint16_t)CY_BLE_RF_LDO_CFG_REG_LDO10_CFG_MASK << CY_BLE_RF_LDO_CFG_REG_LDO10_CFG_SHIFT));
890             temp |= (uint16_t)(((SFLASH->RADIO_LDO_TRIMS & SFLASH_RADIO_LDO_TRIMS_LDO_DIG_Msk) >>
891                                 SFLASH_RADIO_LDO_TRIMS_LDO_DIG_Pos) << CY_BLE_RF_LDO_CFG_REG_LDO10_CFG_SHIFT);
892 
893             status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_RF_LDO_CFG_REG, temp);
894         }
895 
896         if(status == CY_BLE_ECO_SUCCESS)
897         {
898            status = Cy_BLE_HAL_RcbRegRead(CY_BLE_RF_LDO_EN_REG, &temp);
899         }
900 
901         if(status == CY_BLE_ECO_SUCCESS)
902         {
903             /* Update LDO_LNA value */
904             temp &= (uint16_t)~(CY_BLE_RF_LDO_EN_REG_LDO_RF_CFG_MASK << CY_BLE_RF_LDO_EN_REG_LDO_RF_CFG_SHIFT);
905             temp |= (uint16_t)(((SFLASH->RADIO_LDO_TRIMS & SFLASH_RADIO_LDO_TRIMS_LDO_LNA_Msk) >>
906                        SFLASH_RADIO_LDO_TRIMS_LDO_LNA_Pos) << CY_BLE_RF_LDO_EN_REG_LDO_RF_CFG_SHIFT);
907 
908             status = Cy_BLE_HAL_RcbRegWrite(CY_BLE_RF_LDO_EN_REG, temp);
909         }
910     }
911     return(status);
912 }
913 #endif  /* !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE))) */
914 
915 CY_MISRA_BLOCK_END('MISRA C-2012 Rule 10.8')
916 
917 CY_MISRA_BLOCK_END('MISRA C-2012 Rule 10.4')
918 
919 #ifdef __cplusplus
920 }
921 #endif /* __cplusplus */
922 #endif /* defined(CY_IP_MXBLESS) */
923 
924 
925 /* [] END OF FILE */
926