CC13xx Driver Library
setup.c
Go to the documentation of this file.
1 /******************************************************************************
2 * Filename: setup.c
3 * Revised: 2015-09-24 10:59:51 +0200 (Thu, 24 Sep 2015)
4 * Revision: 44656
5 *
6 * Description: Setup file for CC13xx/CC26xx devices.
7 *
8 * Copyright (c) 2015, Texas Instruments Incorporated
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions are met:
13 *
14 * 1) Redistributions of source code must retain the above copyright notice,
15 * this list of conditions and the following disclaimer.
16 *
17 * 2) Redistributions in binary form must reproduce the above copyright notice,
18 * this list of conditions and the following disclaimer in the documentation
19 * and/or other materials provided with the distribution.
20 *
21 * 3) Neither the name of the ORGANIZATION nor the names of its contributors may
22 * be used to endorse or promote products derived from this software without
23 * specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
29 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 *
37 ******************************************************************************/
38 
39 // Hardware headers
40 #include <inc/hw_memmap.h>
41 #include <inc/hw_types.h>
42 #include <inc/hw_adi.h>
43 #include <inc/hw_adi_0_rf.h>
44 #include <inc/hw_adi_1_synth.h>
45 #include <inc/hw_adi_2_refsys.h>
46 #include <inc/hw_adi_3_refsys.h>
47 #include <inc/hw_adi_4_aux.h>
48 #include <inc/hw_aon_ioc.h>
49 #include <inc/hw_aon_sysctl.h>
50 #include <inc/hw_aon_wuc.h>
51 #include <inc/hw_aux_wuc.h>
52 #include <inc/hw_ccfg.h>
53 #include <inc/hw_chip_def.h>
54 #include <inc/hw_ddi.h>
55 #include <inc/hw_flash.h>
56 #include <inc/hw_fcfg1.h>
57 #include <inc/hw_ddi_0_osc.h>
58 #include <inc/hw_prcm.h>
59 #include <inc/hw_vims.h>
60 #include <inc/hw_aon_batmon.h>
61 #include <inc/hw_aon_rtc.h>
62 // Driverlib headers
63 #include <driverlib/adi.h>
64 #include <driverlib/aon_batmon.h>
65 #include <driverlib/cpu.h>
66 #include <driverlib/chipinfo.h>
67 #include <driverlib/ddi.h>
68 #include <driverlib/ioc.h>
69 #include <driverlib/prcm.h>
70 #include <driverlib/setup.h>
71 #include <driverlib/sys_ctrl.h>
72 
73 // We need intrinsic functions for IAR (if used in source code)
74 #ifdef __IAR_SYSTEMS_ICC__
75 #include <intrinsics.h>
76 #endif
77 
78 //*****************************************************************************
79 //
80 // Function declarations
81 //
82 //*****************************************************************************
83 static uint32_t GetTrimForAdcShModeEn( uint32_t ui32Fcfg1Revision );
84 static uint32_t GetTrimForAdcShVbufEn( uint32_t ui32Fcfg1Revision );
85 static uint32_t GetTrimForAmpcompCtrl( uint32_t ui32Fcfg1Revision );
86 static uint32_t GetTrimForAmpcompTh1( void );
87 static uint32_t GetTrimForAmpcompTh2( void );
88 static uint32_t GetTrimForAnabypassValue1( uint32_t ccfg_ModeConfReg );
89 static uint32_t GetTrimForDblrLoopFilterResetVoltage( uint32_t ui32Fcfg1Revision );
90 static uint32_t GetTrimForRadcExtCfg( uint32_t ui32Fcfg1Revision );
91 static uint32_t GetTrimForRcOscLfIBiasTrim( uint32_t ui32Fcfg1Revision );
92 static uint32_t GetTrimForRcOscLfRtuneCtuneTrim( void );
93 static uint32_t GetTrimForXoscHfCtl( uint32_t ui32Fcfg1Revision );
94 static uint32_t GetTrimForXoscHfFastStart( void );
95 static uint32_t GetTrimForXoscHfIbiastherm( void );
96 static uint32_t GetTrimForXoscLfRegulatorAndCmirrwrRatio( uint32_t ui32Fcfg1Revision );
97 
98 int32_t SignExtendVddrTrimValue( uint32_t ui32VddrTrimVal );
99 static void HapiTrimDeviceColdReset( void );
100 static void HapiTrimDeviceShutDown( uint32_t ui32Fcfg1Revision );
101 static void HapiTrimDevicePowerDown( void );
102 
103 void SetVddrLevel( uint32_t ccfg_ModeConfReg );
104 
105 
106 //*****************************************************************************
107 //
109 //
110 //*****************************************************************************
111 #define DELAY_20_USEC 0x140
112 
113 
114 //*****************************************************************************
115 //
116 // Defined CPU delay macro with microseconds as input
117 // Quick check shows: (To be further investigated)
118 // At 48 MHz RCOSC and VIMS.CONTROL.PREFETCH = 0, there is 5 cycles
119 // At 48 MHz RCOSC and VIMS.CONTROL.PREFETCH = 1, there is 4 cycles
120 // At 24 MHz RCOSC and VIMS.CONTROL.PREFETCH = 0, there is 3 cycles
121 //
122 //*****************************************************************************
123 #define CPU_DELAY_MICRO_SECONDS( x ) \
124  CPUdelay(((uint32_t)((( x ) * 48.0 ) / 5.0 )) - 1 )
125 
126 
127 //*****************************************************************************
128 // Need to know the CCFG:MODE_CONF.VDDR_TRIM_SLEEP_DELTA field width in order
129 // to sign extend correctly but this is however not defined in the hardware
130 // description fields and is therefore defined separately here.
131 //*****************************************************************************
132 #define CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_WIDTH 4
133 
134 
135 //*****************************************************************************
136 //
140 //
141 //*****************************************************************************
142 static void
144 {
145  //
146  // - Make sure to enable aggressive VIMS clock gating for power optimization
147  // Only for PG2 devices.
148  // - Enable cache prefetch enable as default setting
149  // (Slightly higher power consumption, but higher CPU performance)
150  // - IF ( CCFG_..._DIS_GPRAM == 1 )
151  // then: Enable cache (set cache mode = 1), even if set by ROM boot code
152  // (This is done because it's not set by boot code when running inside
153  // a debugger supporting the Halt In Boot (HIB) functionality).
154  // else: Set MODE_GPRAM if not already set (see inline comments as well)
155  //
156  uint32_t vimsCtlMode0 ;
157 
158  while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
159  // Do nothing - wait for an eventual ongoing mode change to complete.
160  // (There should typically be no wait time here, but need to be sure)
161  }
162 
163  //
164  // Note that Mode=0 is equal to MODE_GPRAM
165  //
166  vimsCtlMode0 = (( HWREG( VIMS_BASE + VIMS_O_CTL ) & ~VIMS_CTL_MODE_M ) | VIMS_CTL_DYN_CG_EN_M | VIMS_CTL_PREF_EN_M );
167 
168 
170  // Enable cache (and hence disable GPRAM)
171  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_CACHE );
172  } else if (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_GPRAM ) {
173  //
174  // GPRAM is enabled in CCFG but not selected
175  // Note: It is recommended to go via MODE_OFF when switching to MODE_GPRAM
176  //
177  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_OFF );
178  while (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_OFF ) {
179  // Do nothing - wait for an eventual mode change to complete (This goes fast).
180  }
181  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
182  } else {
183  // Correct mode, but make sure PREF_EN and DYN_CG_EN always are set
184  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
185  }
186 }
187 
188 
189 //*****************************************************************************
190 //
191 // Perform the necessary trim of the device which is not done in boot code
192 //
193 // This function should only execute coming from ROM boot. The current
194 // implementation does not take soft reset into account. However, it does no
195 // damage to execute it again. It only consumes time.
196 //
197 //*****************************************************************************
198 void
200 {
201  uint32_t ui32Fcfg1Revision;
202  uint32_t ui32AonSysResetctl;
203 
204  //
205  // Get layout revision of the factory configuration area
206  // (Handle undefined revision as revision = 0)
207  //
208  ui32Fcfg1Revision = HWREG(FCFG1_BASE + FCFG1_O_FCFG1_REVISION);
209  if ( ui32Fcfg1Revision == 0xFFFFFFFF ) {
210  ui32Fcfg1Revision = 0;
211  }
212 
213 
214  //
215  // This driverlib version and setup file is for CC13xx PG2.0 and later.
216  // Halt if violated
217  //
219 
220  //
221  // Enable standby in flash bank
222  //
224 
225  //
226  // Clock must always be enabled for the semaphore module (due to ADI/DDI HW workaround)
227  //
229 
230  //
231  // Warm resets on CC26XX complicates software design as much of our software
232  // expect that initialization is done from a full system reset.
233  // This includes RTC setup, oscillator configuration and AUX setup.
234  // To ensure a full reset of the device is done when customers get e.g. a Watchdog
235  // reset, the following is set here:
236  //
238 
239  //
240  // Select correct CACHE mode and set correct CACHE configuration
241  //
243 
244  // 1. Check for powerdown
245  // 2. Check for shutdown
246  // 3. Assume cold reset if none of the above.
247  //
248  // It is always assumed that the application will freeze the latches in
249  // AON_IOC when going to powerdown in order to retain the values on the IOs.
250  //
251  // NB. If this bit is not cleared before proceeding to powerdown, the IOs
252  // will all default to the reset configuration when restarting.
254  {
255  //
256  // NB. This should be calling a ROM implementation of required trim and
257  // compensation
258  // e.g. HapiTrimDevicePowerDown()
260  }
261  // Check for shutdown
262  //
263  // When device is going to shutdown the hardware will automatically clear
264  // the SLEEPDIS bit in the SLEEP register in the AON_SYSCTRL12 module.
265  // It is left for the application to assert this bit when waking back up,
266  // but not before the desired IO configuration has been re-established.
268  {
269  //
270  // NB. This should be calling a ROM implementation of required trim and
271  // compensation
272  // e.g. HapiTrimDeviceShutDown() -->
273  // HapiTrimDevicePowerDown();
274  HapiTrimDeviceShutDown(ui32Fcfg1Revision);
276  }
277  else
278  {
279  // Consider adding a check for soft reset to allow debugging to skip
280  // this section!!!
281  //
282  // NB. This should be calling a ROM implementation of required trim and
283  // compensation
284  // e.g. HapiTrimDeviceColdReset() -->
285  // HapiTrimDeviceShutDown() -->
286  // HapiTrimDevicePowerDown()
288  HapiTrimDeviceShutDown(ui32Fcfg1Revision);
290 
291  }
292 
293  //
294  // Set VIMS power domain control.
295  // PDCTL1VIMS = 0 ==> VIMS power domain is only powered when CPU power domain is powered
296  //
297  HWREG( PRCM_BASE + PRCM_O_PDCTL1VIMS ) = 0;
298 
299  //
300  // Configure optimal wait time for flash FSM in cases where flash pump
301  // wakes up from sleep
302  //
303  HWREG(FLASH_BASE + FLASH_O_FPAC1) = (HWREG(FLASH_BASE + FLASH_O_FPAC1) &
305  (0x139<<FLASH_FPAC1_PSLEEPTDIS_S);
306 
307  //
308  // And finally at the end of the flash boot process:
309  // SET BOOT_DET bits in AON_SYSCTL to 3 if already found to be 1
310  // Note: The BOOT_DET_x_CLR/SET bits must be manually cleared
311  //
312  if ((( HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) &
315  {
316  ui32AonSysResetctl = ( HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) &
320  HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) = ui32AonSysResetctl;
321  }
322 
323  //
324  // Make sure there are no ongoing VIMS mode change when leaving trimDevice()
325  // (There should typically be no wait time here, but need to be sure)
326  //
327  while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
328  // Do nothing - wait for an eventual ongoing mode change to complete.
329  }
330 }
331 
332 //*****************************************************************************
333 //
338 //
339 //*****************************************************************************
340 static void
342 {
343  //
344  // Currently no specific trim for Powerdown
345  //
346 }
347 
348 //*****************************************************************************
349 //
353 //
354 //*****************************************************************************
355 static void
356 SetAonRtcSubSecInc( uint32_t subSecInc )
357 {
358  //
359  // Loading a new RTCSUBSECINC value is done in 5 steps:
360  // 1. Write bit[15:0] of new SUBSECINC value to AUX_WUC_O_RTCSUBSECINC0
361  // 2. Write bit[23:16] of new SUBSECINC value to AUX_WUC_O_RTCSUBSECINC1
363  // 4. Wait for AUX_WUC_RTCSUBSECINCCTL_UPD_ACK
365  //
367  HWREG( AUX_WUC_BASE + AUX_WUC_O_RTCSUBSECINC1 ) = (( subSecInc >> 16 ) & AUX_WUC_RTCSUBSECINC1_INC23_16_M );
368 
372 }
373 
374 //*****************************************************************************
375 //
380 //
381 //*****************************************************************************
382 static void
383 HapiTrimDeviceShutDown(uint32_t ui32Fcfg1Revision)
384 {
385  uint32_t ui32Trim ;
386  uint32_t ccfg_ModeConfReg ;
387  uint32_t currentHfClock ;
388  uint32_t ccfgExtLfClk ;
389  int32_t i32VddrSleepTrim ;
390  int32_t i32VddrSleepDelta ;
391 
392  //
393  // Force AUX on and enable clocks
394  //
395  // No need to save the current status of the power/clock registers.
396  // At this point both AUX and AON should have been reset to 0x0.
397  //
399 
400  //
401  // Wait for power on on the AUX domain
402  //
404 
405  //
406  // Enable the clocks for AUX_DDI0_OSC and AUX_ADI4
407  //
410 
411  //
412  // It's found to be optimal to override the FCFG1..DCDC_IPEAK setting as follows:
413  // if ( alternative DCDC setting in CCFG is enabled ) ADI3..IPEAK = CCFG..DCDC_IPEAK
414  // else ADI3..IPEAK = 2
415  //
417  //
418  // ADI_3_REFSYS:DCDCCTL5[3] (=DITHER_EN) = CCFG_MODE_CONF_1[19] (=ALT_DCDC_DITHER_EN)
419  // ADI_3_REFSYS:DCDCCTL5[2:0](=IPEAK ) = CCFG_MODE_CONF_1[18:16](=ALT_DCDC_IPEAK )
420  // Using a single 4-bit masked write since layout is equal for both source and destination
421  //
422  HWREGB( ADI3_BASE + ADI_O_MASK4B + ( ADI_3_REFSYS_O_DCDCCTL5 * 2 )) = ( 0xF0 |
424 
425  // Shall use FCFG1 setting for CC13xx
426  } else {
427  HWREGB( ADI3_BASE + ADI_O_MASK4B + ( ADI_3_REFSYS_O_DCDCCTL5 * 2 )) = 0x72;
428  }
429 
430  //
431  // Enable for JTAG to be powered down (will still be powered on if debugger is connected)
432  //
434 
435  //
436  // read the MODE_CONF register in CCFG
437  //
438  ccfg_ModeConfReg = HWREG( CCFG_BASE + CCFG_O_MODE_CONF );
439 
440  //
441  // Check for CC13xx boost mode
442  // The combination VDDR_EXT_LOAD=0 and VDDS_BOD_LEVEL=1 is defined to selct boost mode
443  //
444  if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) == 0 ) &&
445  (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) != 0 ) ) {
446  //
447  // Set VDDS_BOD trim - using masked write {MASK8:DATA8}
448  // - TRIM_VDDS_BOD is bits[7:3] of ADI3..REFSYSCTL1
449  // - Needs a positive transition on BOD_BG_TRIM_EN (bit[7] of REFSYSCTL3) to
450  // latch new VDDS BOD. Set to 0 first to guarantee a positive transition.
451  //
453 // if ( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) {
454  //
455  // VDDS_BOD_LEVEL = 1 means that boost mode is selected
456  // - Max out the VDDS_BOD trim (=VDDS_BOD_POS_31)
457  //
458  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) =
461 // } else {
462 // //
463 // // VDDS_BOD_LEVEL = 0
464 // // - Set VDDS_BOD to FCFG1..TRIMBOD_H
465 // //
466 // HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) =
468 // ((( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
471 // }
473 
474  SetVddrLevel( ccfg_ModeConfReg );
475 
476  i32VddrSleepTrim = SignExtendVddrTrimValue((
477  HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
480  } else
481  {
482  i32VddrSleepTrim = SignExtendVddrTrimValue((
483  HWREG( FCFG1_BASE + FCFG1_O_LDO_TRIM ) &
486  }
487 
488  //
489  // Adjust the VDDR_TRIM_SLEEP value with value adjustable by customer (CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA)
490  // Read and sign extend VddrSleepDelta (in range -8 to +7)
491  //
492  i32VddrSleepDelta = ((((int32_t)ccfg_ModeConfReg )
495  // Calculate new VDDR sleep trim
496  i32VddrSleepTrim = ( i32VddrSleepTrim + i32VddrSleepDelta + 1 );
497  if ( i32VddrSleepTrim > 21 ) i32VddrSleepTrim = 21;
498  if ( i32VddrSleepTrim < -10 ) i32VddrSleepTrim = -10;
499  // Write adjusted value using MASKED write (MASK8)
500  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_DCDCCTL1 * 2 )) = (( ADI_3_REFSYS_DCDCCTL1_VDDR_TRIM_SLEEP_M << 8 ) |
502 
503  //
504  // set the RECHARGE source based upon CCFG:MODE_CONF:DCDC_RECHARGE
505  // Note: Inverse polarity
506  //
508  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_RECHARGE_S ) & 1 ) ^ 1 );
509 
510  //
511  // set the ACTIVE source based upon CCFG:MODE_CONF:DCDC_ACTIVE
512  // Note: Inverse polarity
513  //
515  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_ACTIVE_S ) & 1 ) ^ 1 );
516 
517  //
518  // Following sequence is required for using XOSCHF, if not included
519  // devices crashes when trying to switch to XOSCHF.
520  //
521  // Trim CAP settings. Get and set trim value for the ANABYPASS_VALUE1
522  // register
523  ui32Trim = GetTrimForAnabypassValue1( ccfg_ModeConfReg );
525 
526  // Trim RCOSC_LF. Get and set trim values for the RCOSCLF_RTUNE_TRIM and
527  // RCOSCLF_CTUNE_TRIM fields in the XOSCLF_RCOSCLF_CTRL register.
528  ui32Trim = GetTrimForRcOscLfRtuneCtuneTrim();
533  ui32Trim);
534 
535  // Trim XOSCHF IBIAS THERM. Get and set trim value for the
536  // XOSCHF IBIAS THERM bit field in the ANABYPASS_VALUE2 register. Other
537  // register bit fields are set to 0.
538  ui32Trim = GetTrimForXoscHfIbiastherm();
541 
542  // Trim AMPCOMP settings required before switch to XOSCHF
543  ui32Trim = GetTrimForAmpcompTh2();
545  ui32Trim = GetTrimForAmpcompTh1();
547  ui32Trim = GetTrimForAmpcompCtrl( ui32Fcfg1Revision );
549 
550  //
551  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_MODE_EN in accordance to FCFG1 setting
552  // This is bit[5] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
553  // Using MASK4 write + 1 => writing to bits[7:4]
554  //
555  ui32Trim = GetTrimForAdcShModeEn( ui32Fcfg1Revision );
556  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
557  ( 0x20 | ( ui32Trim << 1 ));
558 
559  //
560  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_VBUF_EN in accordance to FCFG1 setting
561  // This is bit[4] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
562  // Using MASK4 write + 1 => writing to bits[7:4]
563  //
564  ui32Trim = GetTrimForAdcShVbufEn( ui32Fcfg1Revision );
565  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
566  ( 0x10 | ( ui32Trim ));
567 
568  //
569  // Set trim for the PEAK_DET_ITRIM, HP_BUF_ITRIM and LP_BUF_ITRIM bit fields
570  // in the DDI0_OSC_O_XOSCHFCTL register in accordance to FCFG1 setting.
571  // Remaining register bit fields are set to their reset values of 0.
572  //
573  ui32Trim = GetTrimForXoscHfCtl(ui32Fcfg1Revision);
575 
576  //
577  // Set trim for DBLR_LOOP_FILTER_RESET_VOLTAGE in accordance to FCFG1 setting
578  // (This is bits [18:17] in DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL)
579  // (Using MASK4 write + 4 => writing to bits[19:16] => (4*4))
580  // (Assuming: DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_S = 17 and
581  // that DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_M = 0x00060000)
582  //
583  ui32Trim = GetTrimForDblrLoopFilterResetVoltage( ui32Fcfg1Revision );
584  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 4 ) =
585  ( 0x60 | ( ui32Trim << 1 ));
586 
587  //
588  // Update DDI_0_OSC_ATESTCTL_ATESTLF_RCOSCLF_IBIAS_TRIM with data from
590  // This is DDI_0_OSC_O_ATESTCTL bit[7]
591  // ( DDI_0_OSC_O_ATESTCTL is currently hidden (but=0x00000020))
592  // Using MASK4 write + 1 => writing to bits[7:4]
593  //
594  ui32Trim = GetTrimForRcOscLfIBiasTrim( ui32Fcfg1Revision );
595  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( 0x00000020 * 2 ) + 1 ) =
596  ( 0x80 | ( ui32Trim << 3 ));
597 
598  //
601  // This can be simplified since the registers are packed together in the same
602  // order both in FCFG1 and in the HW register.
603  // This spans DDI_0_OSC_O_LFOSCCTL bits[23:18]
604  // Using MASK8 write + 4 => writing to bits[23:16]
605  //
606  ui32Trim = GetTrimForXoscLfRegulatorAndCmirrwrRatio( ui32Fcfg1Revision );
607  HWREGH( AUX_DDI0_OSC_BASE + DDI_O_MASK8B + ( DDI_0_OSC_O_LFOSCCTL * 2 ) + 4 ) =
608  ( 0xFC00 | ( ui32Trim << 2 ));
609 
610  //
611  // Set trim the HPM_IBIAS_WAIT_CNT, LPM_IBIAS_WAIT_CNT and IDAC_STEP bit
612  // fields in the DDI0_OSC_O_RADCEXTCFG register in accordance to FCFG1 setting.
613  // Remaining register bit fields are set to their reset values of 0.
614  //
615  ui32Trim = GetTrimForRadcExtCfg(ui32Fcfg1Revision);
617 
618  // Setting FORCE_KICKSTART_EN (ref. CC26_V1_BUG00261). Should also be done for PG2
619  // (This is bit 22 in DDI_0_OSC_O_CTL0)
620  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL0 * 2 ) + 5 ) = 0x44;
621 
622  // XOSC source is a 24 MHz xtal (default)
623  // Set bit DDI_0_OSC_CTL0_XTAL_IS_24M (this is bit 31 in DDI_0_OSC_O_CTL0)
624  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL0 * 2 ) + 7 ) = 0x88;
625 
626  // Clear DDI_0_OSC_CTL0_CLK_LOSS_EN (ClockLossEventEnable()). This is bit 9 in DDI_0_OSC_O_CTL0.
627  // This is typically already 0 except on Lizard where it is set in ROM-boot
628  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL0 * 2 ) + 2 ) = 0x20;
629 
630  // Setting DDI_0_OSC_CTL1_XOSC_HF_FAST_START according to value found in FCFG1
631  ui32Trim = GetTrimForXoscHfFastStart();
632  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL1 * 2 )) = ( 0x30 | ui32Trim );
633 
634  //
635  // setup the LF clock based upon CCFG:MODE_CONF:SCLK_LF_OPTION
636  //
637  switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_SCLK_LF_OPTION_M ) >> CCFG_MODE_CONF_SCLK_LF_OPTION_S ) {
638  case 0 : // XOSC_HF_DLF (XOSCHF/1536) -> SCLK_LF (=31250Hz)
640  SetAonRtcSubSecInc( 0x8637BD );
641  break;
642  case 1 : // EXTERNAL signal -> SCLK_LF (frequency=2^38/CCFG_EXT_LF_CLK_RTC_INCREMENT)
643  // Set SCLK_LF to use the same source as SCLK_HF
644  // Can be simplified a bit since possible return values for HF matches LF settings
645  currentHfClock = OSCClockSourceGet( OSC_SRC_CLK_HF );
646  OSCClockSourceSet( OSC_SRC_CLK_LF, currentHfClock );
647  while( OSCClockSourceGet( OSC_SRC_CLK_LF ) != currentHfClock ) {
648  // Wait until switched
649  }
650  ccfgExtLfClk = HWREG( CCFG_BASE + CCFG_O_EXT_LF_CLK );
654  IOC_STD_INPUT | IOC_HYST_ENABLE ); // Route external clock to AON IOC w/hysteresis
655  // Set XOSC_LF in bypass mode to allow external 32k clock
657  // Fall through to set XOSC_LF as SCLK_LF source
658  case 2 : // XOSC_LF -> SLCK_LF (32768 Hz)
660  break;
661  default : // (=3) RCOSC_LF
663  break;
664  }
665 
666  //
667  // Update ADI_4_AUX_ADCREF1_VTRIM with value from FCFG1
668  //
669  HWREGB( AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF1 ) =
674 
675  //
676  // Set ADI_4_AUX:ADC0.SMPL_CYCLE_EXP to it's default minimum value (=3)
677  // (Note: Using MASK8B requires that the bits to be modified must be within the same
678  // byte boundary which is the case for the ADI_4_AUX_ADC0_SMPL_CYCLE_EXP field)
679  //
680  HWREGH( AUX_ADI4_BASE + ADI_O_MASK8B + ( ADI_4_AUX_O_ADC0 * 2 )) =
682 
683  //
684  // Sync with AON
685  //
686  SysCtrlAonSync();
687 
688  //
689  // Allow AUX to power down
690  //
692 
693  //
694  // Leaving on AUX and clock for AUX_DDI0_OSC on but turn off clock for AUX_ADI4
695  //
697 
698  // Disable EFUSE clock
700 }
701 
702 //*****************************************************************************
703 //
707 //
708 //*****************************************************************************
709 int32_t
710 SignExtendVddrTrimValue( uint32_t ui32VddrTrimVal )
711 {
712  //
713  // The VDDR trim value is 5 bits representing the range from -10 to +21
714  // (where -10=0x16, -1=0x1F, 0=0x00, 1=0x01 and +21=0x15)
715  //
716  int32_t i32SignedVddrVal = ui32VddrTrimVal;
717  if ( i32SignedVddrVal > 0x15 ) {
718  i32SignedVddrVal -= 0x20;
719  }
720  return ( i32SignedVddrVal );
721 }
722 
723 //*****************************************************************************
724 //
728 //
729 //*****************************************************************************
730 static void
732 {
733  //
734  // Currently no specific trim for Cold Reset
735  //
736 }
737 
738 //*****************************************************************************
739 //
741 //
742 //*****************************************************************************
743 static uint32_t
744 GetTrimForAnabypassValue1( uint32_t ccfg_ModeConfReg )
745 {
746  uint32_t ui32Fcfg1Value ;
747  uint32_t ui32XoscHfRow ;
748  uint32_t ui32XoscHfCol ;
749  int32_t i32CustomerDeltaAdjust ;
750  uint32_t ui32TrimValue ;
751 
752  // Use device specific trim values located in factory configuration
753  // area for the XOSC_HF_COLUMN_Q12 and XOSC_HF_ROW_Q12 bit fields in
754  // the ANABYPASS_VALUE1 register. Value for the other bit fields
755  // are set to 0.
756 
757  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_CONFIG_OSC_TOP);
758  ui32XoscHfRow = (( ui32Fcfg1Value &
761  ui32XoscHfCol = (( ui32Fcfg1Value &
764 
765  i32CustomerDeltaAdjust = 0;
766  if (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_CAP_MOD ) == 0 ) {
767  // XOSC_CAP_MOD = 0 means: CAP_ARRAY_DELTA is in use -> Apply compensation
768  // XOSC_CAPARRAY_DELTA is located in bit[15:8] of ccfg_ModeConfReg
769  // Note: HW_REV_DEPENDENT_IMPLEMENTATION. Field width is not given by
770  // a define and sign extension must therefore be hardcoded.
771  // ( A small test program is created verifying the code lines below:
772  // Ref.: ..\test\small_standalone_test_programs\CapArrayDeltaAdjust_test.c)
773  i32CustomerDeltaAdjust = ((int32_t)ccfg_ModeConfReg << 16 ) >> 24;
774 
775  while ( i32CustomerDeltaAdjust < 0 ) {
776  ui32XoscHfCol >>= 1; // COL 1 step down
777  if ( ui32XoscHfCol == 0 ) { // if COL below minimum
778  ui32XoscHfCol = 0xFFFF; // Set COL to maximum
779  ui32XoscHfRow >>= 1; // ROW 1 step down
780  if ( ui32XoscHfRow == 0 ) { // if ROW below minimum
781  ui32XoscHfRow = 1; // Set both ROW and COL
782  ui32XoscHfCol = 1; // to minimum
783  }
784  }
785  i32CustomerDeltaAdjust++;
786  }
787  while ( i32CustomerDeltaAdjust > 0 ) {
788  ui32XoscHfCol = ( ui32XoscHfCol << 1 ) | 1; // COL 1 step up
789  if ( ui32XoscHfCol > 0xFFFF ) { // if COL above maximum
790  ui32XoscHfCol = 1; // Set COL to minimum
791  ui32XoscHfRow = ( ui32XoscHfRow << 1 ) | 1; // ROW 1 step up
792  if ( ui32XoscHfRow > 0xF ) { // if ROW above maximum
793  ui32XoscHfRow = 0xF; // Set both ROW and COL
794  ui32XoscHfCol = 0xFFFF; // to maximum
795  }
796  }
797  i32CustomerDeltaAdjust--;
798  }
799  }
800 
801  ui32TrimValue = (( ui32XoscHfRow << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_ROW_Q12_S ) |
802  ( ui32XoscHfCol << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_COLUMN_Q12_S ) );
803 
804  return (ui32TrimValue);
805 }
806 
807 //*****************************************************************************
808 //
811 //
812 //*****************************************************************************
813 static uint32_t
815 {
816  uint32_t ui32TrimValue;
817 
818  // Use device specific trim values located in factory configuration
819  // area
820  ui32TrimValue =
825 
826  ui32TrimValue |=
831 
832  return(ui32TrimValue);
833 }
834 
835 //*****************************************************************************
836 //
839 //
840 //*****************************************************************************
841 static uint32_t
843 {
844  uint32_t ui32TrimValue;
845 
846  // Use device specific trim value located in factory configuration
847  // area
848  ui32TrimValue =
852 
853  return(ui32TrimValue);
854 }
855 
856 //*****************************************************************************
857 //
859 //
860 //*****************************************************************************
861 static uint32_t
863 {
864  uint32_t ui32TrimValue;
865  uint32_t ui32Fcfg1Value;
866 
867  // Use device specific trim value located in factory configuration
868  // area. All defined register bit fields have corresponding trim
869  // value in the factory configuration area
870  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH2);
871  ui32TrimValue = ((ui32Fcfg1Value &
875  ui32TrimValue |= (((ui32Fcfg1Value &
879  ui32TrimValue |= (((ui32Fcfg1Value &
883  ui32TrimValue |= (((ui32Fcfg1Value &
887 
888  return(ui32TrimValue);
889 }
890 
891 //*****************************************************************************
892 //
894 //
895 //*****************************************************************************
896 static uint32_t
898 {
899  uint32_t ui32TrimValue;
900  uint32_t ui32Fcfg1Value;
901 
902  // Use device specific trim values located in factory configuration
903  // area. All defined register bit fields have a corresponding trim
904  // value in the factory configuration area
905  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH1);
906  ui32TrimValue = (((ui32Fcfg1Value &
910  ui32TrimValue |= (((ui32Fcfg1Value &
914  ui32TrimValue |= (((ui32Fcfg1Value &
918  ui32TrimValue |= (((ui32Fcfg1Value &
922 
923  return(ui32TrimValue);
924 }
925 
926 //*****************************************************************************
927 //
929 //
930 //*****************************************************************************
931 static uint32_t
932 GetTrimForAmpcompCtrl( uint32_t ui32Fcfg1Revision )
933 {
934  uint32_t ui32TrimValue ;
935  uint32_t ui32Fcfg1Value ;
936  uint32_t ibiasOffset ;
937  uint32_t ibiasInit ;
938  uint32_t modeConf1 ;
939  int32_t deltaAdjust ;
940 
941  // Use device specific trim values located in factory configuration
942  // area. Register bit fields without trim values in the factory
943  // configuration area will be set to the value of 0.
944  ui32Fcfg1Value = HWREG( FCFG1_BASE + FCFG1_O_AMPCOMP_CTRL1 );
945 
946  ibiasOffset = ( ui32Fcfg1Value &
949  ibiasInit = ( ui32Fcfg1Value &
952 
954  // Adjust with DELTA_IBIAS_OFFSET and DELTA_IBIAS_INIT from CCFG
955  modeConf1 = HWREG( CCFG_BASE + CCFG_O_MODE_CONF_1 );
956 
957  // Both fields are signed 4-bit values. This is an assumption when doing the sign extension.
958  deltaAdjust = ((int32_t)modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_OFFSET_S - 4 )) >> 28;
959  deltaAdjust += (int32_t)ibiasOffset;
960  if ( deltaAdjust < 0 ) {
961  deltaAdjust = 0;
962  }
965  }
966  ibiasOffset = (uint32_t)deltaAdjust;
967 
968  deltaAdjust = ((int32_t)modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_S - 4 )) >> 28;
969  deltaAdjust += (int32_t)ibiasInit;
970  if ( deltaAdjust < 0 ) {
971  deltaAdjust = 0;
972  }
975  }
976  ibiasInit = (uint32_t)deltaAdjust;
977  }
978  ui32TrimValue = ( ibiasOffset << DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_S ) |
979  ( ibiasInit << DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_S ) ;
980 
981  ui32TrimValue |= (((ui32Fcfg1Value &
985  ui32TrimValue |= (((ui32Fcfg1Value &
989  ui32TrimValue |= (((ui32Fcfg1Value &
993 
994  if ( ui32Fcfg1Revision >= 0x00000022 ) {
995  ui32TrimValue |= ((( ui32Fcfg1Value &
999  }
1000 
1001  return(ui32TrimValue);
1002 }
1003 
1004 //*****************************************************************************
1005 //
1007 //
1008 //*****************************************************************************
1009 static uint32_t
1010 GetTrimForDblrLoopFilterResetVoltage( uint32_t ui32Fcfg1Revision )
1011 {
1012  uint32_t dblrLoopFilterResetVoltageValue = 0; // Reset value
1013 
1014  if ( ui32Fcfg1Revision >= 0x00000020 ) {
1015  dblrLoopFilterResetVoltageValue = ( HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 ) &
1018  }
1019 
1020  return ( dblrLoopFilterResetVoltageValue );
1021 }
1022 
1023 //*****************************************************************************
1024 //
1026 //
1027 //*****************************************************************************
1028 static uint32_t
1029 GetTrimForAdcShModeEn( uint32_t ui32Fcfg1Revision )
1030 {
1031  uint32_t getTrimForAdcShModeEnValue = 1; // Recommended default setting
1032 
1033  if ( ui32Fcfg1Revision >= 0x00000022 ) {
1034  getTrimForAdcShModeEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
1037  }
1038 
1039  return ( getTrimForAdcShModeEnValue );
1040 }
1041 
1042 //*****************************************************************************
1043 //
1045 //
1046 //*****************************************************************************
1047 static uint32_t
1048 GetTrimForAdcShVbufEn( uint32_t ui32Fcfg1Revision )
1049 {
1050  uint32_t getTrimForAdcShVbufEnValue = 1; // Recommended default setting
1051 
1052  if ( ui32Fcfg1Revision >= 0x00000022 ) {
1053  getTrimForAdcShVbufEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
1056  }
1057 
1058  return ( getTrimForAdcShVbufEnValue );
1059 }
1060 
1061 //*****************************************************************************
1062 //
1064 //
1065 //*****************************************************************************
1066 static uint32_t
1067 GetTrimForXoscHfCtl( uint32_t ui32Fcfg1Revision )
1068 {
1069  uint32_t getTrimForXoschfCtlValue = 0; // Recommended default setting
1070  uint32_t fcfg1Data;
1071 
1072  if ( ui32Fcfg1Revision >= 0x00000020 ) {
1073  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
1074  getTrimForXoschfCtlValue =
1075  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_PEAK_DET_ITRIM_M ) >>
1078 
1079  getTrimForXoschfCtlValue |=
1080  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HP_BUF_ITRIM_M ) >>
1083 
1084  getTrimForXoschfCtlValue |=
1085  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LP_BUF_ITRIM_M ) >>
1088  }
1089 
1090  return ( getTrimForXoschfCtlValue );
1091 }
1092 
1093 //*****************************************************************************
1094 //
1096 //
1097 //*****************************************************************************
1098 static uint32_t
1100 {
1101  uint32_t ui32XoscHfFastStartValue ;
1102 
1103  // Get value from FCFG1
1104  ui32XoscHfFastStartValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
1107 
1108  return ( ui32XoscHfFastStartValue );
1109 }
1110 
1111 //*****************************************************************************
1112 //
1114 //
1115 //*****************************************************************************
1116 static uint32_t
1117 GetTrimForRadcExtCfg( uint32_t ui32Fcfg1Revision )
1118 {
1119  uint32_t getTrimForRadcExtCfgValue = 0x403F8000; // Recommended default setting
1120  uint32_t fcfg1Data;
1121 
1122  if ( ui32Fcfg1Revision >= 0x00000020 ) {
1123  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
1124  getTrimForRadcExtCfgValue =
1125  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HPM_IBIAS_WAIT_CNT_M ) >>
1128 
1129  getTrimForRadcExtCfgValue |=
1130  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LPM_IBIAS_WAIT_CNT_M ) >>
1133 
1134  getTrimForRadcExtCfgValue |=
1135  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_IDAC_STEP_M ) >>
1138  }
1139 
1140  return ( getTrimForRadcExtCfgValue );
1141 }
1142 
1143 //*****************************************************************************
1144 //
1146 //
1147 //*****************************************************************************
1148 static uint32_t
1149 GetTrimForRcOscLfIBiasTrim( uint32_t ui32Fcfg1Revision )
1150 {
1151  uint32_t trimForRcOscLfIBiasTrimValue = 0; // Default value
1152 
1153  if ( ui32Fcfg1Revision >= 0x00000022 ) {
1154  trimForRcOscLfIBiasTrimValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
1157  }
1158 
1159  return ( trimForRcOscLfIBiasTrimValue );
1160 }
1161 
1162 //*****************************************************************************
1163 //
1166 //
1167 //*****************************************************************************
1168 static uint32_t
1169 GetTrimForXoscLfRegulatorAndCmirrwrRatio( uint32_t ui32Fcfg1Revision )
1170 {
1171  uint32_t trimForXoscLfRegulatorAndCmirrwrRatioValue = 0; // Default value for both fields
1172 
1173  if ( ui32Fcfg1Revision >= 0x00000022 ) {
1174  trimForXoscLfRegulatorAndCmirrwrRatioValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
1178  }
1179 
1180  return ( trimForXoscLfRegulatorAndCmirrwrRatioValue );
1181 }
1182 
1183 
1184 //*****************************************************************************
1185 //
1186 // SetVddrLevel()
1187 // Set VDDR boost mode (by setting VDDR_TRIM to FCFG1..VDDR_TRIM_HH and setting VDDS_BOD to max)
1188 //
1189 //*****************************************************************************
1190 void
1191 SetVddrLevel( uint32_t ccfg_ModeConfReg )
1192 {
1193  uint32_t newTrimRaw ;
1194  int32_t targetTrim ;
1195  int32_t currentTrim ;
1196  int32_t deltaTrim ;
1197 
1198 // if ( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) {
1199  //
1200  // VDDS_BOD_LEVEL = 1 means that boost mode is selected
1201  // - Step up VDDR_TRIM to FCFG1..VDDR_TRIM_HH
1202  //
1203  newTrimRaw = (( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
1206 // } else {
1207 // //
1208 // // VDDS_BOD_LEVEL = 0
1209 // // - Step up VDDR_TRIM to FCFG1..VDDR_TRIM_H
1210 // //
1211 // newTrimRaw = (( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
1214 // }
1215  targetTrim = SignExtendVddrTrimValue( newTrimRaw );
1216  currentTrim = SignExtendVddrTrimValue((
1217  HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) &
1220 
1221  if ( currentTrim != targetTrim ) {
1222  // Disable VDDR BOD
1224 
1225  while ( currentTrim != targetTrim ) {
1226  deltaTrim = targetTrim - currentTrim;
1227  if ( deltaTrim > 2 ) deltaTrim = 2;
1228  if ( deltaTrim < -2 ) deltaTrim = -2;
1229  currentTrim += deltaTrim;
1230 
1231  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one SCLK_LF period
1232 
1233  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_DCDCCTL0 * 2 )) =
1234  ( ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M << 8 ) | (( currentTrim <<
1237 
1238  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ) = 1; // Force SCLK_LF period wait on next read
1239  }
1240 
1241  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one SCLK_LF period
1242  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ) = 1; // Force SCLK_LF period wait on next read
1243  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one more SCLK_LF period before re-enabling VDDR BOD
1245  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // And finally wait for VDDR_LOSS_EN setting to propagate
1246  }
1247 }
static void SysCtrlAonSync(void)
Sync all accesses to the AON register interface.
Definition: sys_ctrl.h:240
#define IOC_PORT_AON_CLK32K
Definition: ioc.h:174
static void DDI32RegWrite(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Val)
Write a 32 bit value to a register in the DDI slave.
Definition: ddi.h:235
#define AUX_WUC_POWER_DOWN
Definition: aux_wuc.h:95
static void HapiTrimDevicePowerDown(void)
Trims to be applied when coming from POWER_DOWN (also called when coming from SHUTDOWN and PIN_RESET)...
Definition: setup.c:341
static void HapiTrimDeviceShutDown(uint32_t ui32Fcfg1Revision)
Trims to be applied when coming from SHUTDOWN (also called when coming from PIN_RESET).
Definition: setup.c:383
static uint32_t GetTrimForRadcExtCfg(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG.
Definition: setup.c:1117
void AUXWUCPowerCtrl(uint32_t ui32PowerMode)
Control the power to the AUX domain.
Definition: aux_wuc.c:274
static uint32_t GetTrimForRcOscLfRtuneCtuneTrim(void)
Returns the trim value to be used for the RCOSCLF_RTUNE_TRIM and the RCOSCLF_CTUNE_TRIM bit fields in...
Definition: setup.c:814
uint32_t OSCClockSourceGet(uint32_t ui32SrcClk)
Get the source clock settings.
Definition: osc.c:144
void DDI16BitfieldWrite(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Mask, uint32_t ui32Shift, uint16_t ui32Data)
Write a bitfield via the DDI using 16-bit maskable write.
Definition: ddi.c:108
#define IOC_STD_INPUT
Definition: ioc.h:297
int32_t SignExtendVddrTrimValue(uint32_t ui32VddrTrimVal)
Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21)
Definition: setup.c:710
void ThisCodeIsBuiltForCC13xxHwRev20AndLater_HaltIfViolated(void)
Verifies that curent chip is built for CC13xx HwRev 2.0 or later and never returns if violated...
Definition: chipinfo.c:168
static uint32_t GetTrimForRcOscLfIBiasTrim(uint32_t ui32Fcfg1Revision)
Definition: setup.c:1149
#define OSC_SRC_CLK_HF
Definition: osc.h:106
static uint32_t GetTrimForXoscLfRegulatorAndCmirrwrRatio(uint32_t ui32Fcfg1Revision)
Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet spanning bits [5:0] in the retur...
Definition: setup.c:1169
#define OSC_XOSC_HF
Definition: osc.h:111
#define OSC_SRC_CLK_LF
Definition: osc.h:108
static uint32_t GetTrimForAmpcompTh2(void)
Returns the trim value to be used for the AMPCOMP_TH2 register in OSC_DIG.
Definition: setup.c:862
static uint32_t GetTrimForAnabypassValue1(uint32_t ccfg_ModeConfReg)
Returns the trim value to be used for the ANABYPASS_VALUE1 register in OSC_DIG.
Definition: setup.c:744
static uint32_t GetTrimForDblrLoopFilterResetVoltage(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as DBLR_LOOP_FILTER_RESET_VOLTAGE setting.
Definition: setup.c:1010
static void HapiTrimDeviceColdReset(void)
Trims to be applied when coming from PIN_RESET.
Definition: setup.c:731
static uint32_t GetTrimForXoscHfFastStart(void)
Returns the trim value to be used as OSC_DIG:CTL1.XOSC_HF_FAST_START.
Definition: setup.c:1099
static uint32_t GetTrimForAdcShVbufEn(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as ADC_SH_VBUF_EN setting.
Definition: setup.c:1048
#define CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_WIDTH
Definition: setup.c:132
#define OSC_RCOSC_LF
Definition: osc.h:112
void IOCPortConfigureSet(uint32_t ui32IOId, uint32_t ui32PortId, uint32_t ui32IOConfig)
Set the configuration of an IO port.
Definition: ioc.c:115
#define IOC_HYST_ENABLE
Definition: ioc.h:221
static uint32_t GetTrimForXoscHfCtl(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG.
Definition: setup.c:1067
static uint32_t GetTrimForAdcShModeEn(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as ADC_SH_MODE_EN setting.
Definition: setup.c:1029
static void SetAonRtcSubSecInc(uint32_t subSecInc)
Doing the tricky stuff needed to enter new RTCSUBSECINC value.
Definition: setup.c:356
static uint32_t GetTrimForXoscHfIbiastherm(void)
Returns the trim value to be used for the XOSC_HF_IBIASTHERM bit field in the ANABYPASS_VALUE2 regist...
Definition: setup.c:842
void OSCClockSourceSet(uint32_t ui32SrcClk, uint32_t ui32Osc)
Configure the oscillator input to the a source clock.
Definition: osc.c:85
static void SetupCacheModeAccordingToCcfgSetting(void)
Set correct VIMS_MODE according to CCFG setting (CACHE or GPRAM)
Definition: setup.c:143
static uint32_t GetTrimForAmpcompTh1(void)
Returns the trim value to be used for the AMPCOMP_TH1 register in OSC_DIG.
Definition: setup.c:897
void SetVddrLevel(uint32_t ccfg_ModeConfReg)
Definition: setup.c:1191
#define OSC_XOSC_LF
Definition: osc.h:113
static uint32_t GetTrimForAmpcompCtrl(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the AMPCOMP_CTRL register in OSC_DIG.
Definition: setup.c:932
void trimDevice(void)
Performs the necessary trim of the device which is not done in boot code.
Definition: setup.c:199
static void AONWUCJtagPowerOff(void)
Request power off of the JTAG domain.
Definition: aon_wuc.h:816