CC13xx Driver Library
[setup] Setup

Functions

void SetupTrimDevice (void)
 Performs the necessary trim of the device which is not done in boot code. More...
 
void SetupAfterColdResetWakeupFromShutDownCfg1 (uint32_t ccfg_ModeConfReg)
 First part of configuration required when waking up from shutdown. More...
 
void SetupAfterColdResetWakeupFromShutDownCfg2 (uint32_t ui32Fcfg1Revision, uint32_t ccfg_ModeConfReg)
 Second part of configuration required when waking up from shutdown. More...
 
void SetupAfterColdResetWakeupFromShutDownCfg3 (uint32_t ccfg_ModeConfReg)
 Third part of configuration required when waking up from shutdown. More...
 
uint32_t SetupGetTrimForAdcShModeEn (uint32_t ui32Fcfg1Revision)
 Returns the trim value from FCFG1 to be used as ADC_SH_MODE_EN setting. More...
 
uint32_t SetupGetTrimForAdcShVbufEn (uint32_t ui32Fcfg1Revision)
 Returns the trim value from FCFG1 to be used as ADC_SH_VBUF_EN setting. More...
 
uint32_t SetupGetTrimForAmpcompCtrl (uint32_t ui32Fcfg1Revision)
 Returns the trim value to be used for the AMPCOMP_CTRL register in OSC_DIG. More...
 
uint32_t SetupGetTrimForAmpcompTh1 (void)
 Returns the trim value to be used for the AMPCOMP_TH1 register in OSC_DIG. More...
 
uint32_t SetupGetTrimForAmpcompTh2 (void)
 Returns the trim value to be used for the AMPCOMP_TH2 register in OSC_DIG. More...
 
uint32_t SetupGetTrimForAnabypassValue1 (uint32_t ccfg_ModeConfReg)
 Returns the trim value to be used for the ANABYPASS_VALUE1 register in OSC_DIG. More...
 
uint32_t SetupGetTrimForDblrLoopFilterResetVoltage (uint32_t ui32Fcfg1Revision)
 Returns the trim value from FCFG1 to be used as DBLR_LOOP_FILTER_RESET_VOLTAGE setting. More...
 
uint32_t SetupGetTrimForRadcExtCfg (uint32_t ui32Fcfg1Revision)
 Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG. More...
 
uint32_t SetupGetTrimForRcOscLfIBiasTrim (uint32_t ui32Fcfg1Revision)
 Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM. More...
 
uint32_t SetupGetTrimForRcOscLfRtuneCtuneTrim (void)
 Returns the trim value to be used for the RCOSCLF_RTUNE_TRIM and the RCOSCLF_CTUNE_TRIM bit fields in the XOSCLF_RCOSCLF_CTRL register in OSC_DIG. More...
 
uint32_t SetupGetTrimForXoscHfCtl (uint32_t ui32Fcfg1Revision)
 Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG. More...
 
uint32_t SetupGetTrimForXoscHfFastStart (void)
 Returns the trim value to be used as OSC_DIG:CTL1.XOSC_HF_FAST_START. More...
 
uint32_t SetupGetTrimForXoscHfIbiastherm (void)
 Returns the trim value to be used for the XOSC_HF_IBIASTHERM bit field in the ANABYPASS_VALUE2 register in OSC_DIG. More...
 
uint32_t SetupGetTrimForXoscLfRegulatorAndCmirrwrRatio (uint32_t ui32Fcfg1Revision)
 Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet spanning bits [5:0] in the returned value. More...
 
static int32_t SetupSignExtendVddrTrimValue (uint32_t ui32VddrTrimVal)
 Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21) More...
 
void SetupSetCacheModeAccordingToCcfgSetting (void)
 Set correct VIMS_MODE according to CCFG setting (CACHE or GPRAM) More...
 
void SetupSetAonRtcSubSecInc (uint32_t subSecInc)
 Doing the tricky stuff needed to enter new RTCSUBSECINC value. More...
 
void SetupSetVddrLevel (uint32_t ccfg_ModeConfReg)
 Set VDDR boost mode. More...
 

Detailed Description

Function Documentation

void SetupAfterColdResetWakeupFromShutDownCfg1 ( uint32_t  ccfg_ModeConfReg)

First part of configuration required when waking up from shutdown.

Referenced by TrimAfterColdResetWakeupFromShutDown().

191 {
192  int32_t i32VddrSleepTrim;
193  int32_t i32VddrSleepDelta;
194 
195  // Check for CC13xx boost mode
196  // The combination VDDR_EXT_LOAD=0 and VDDS_BOD_LEVEL=1 is defined to selct boost mode
197  if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) == 0 ) &&
198  (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) != 0 ) ) {
199  // Set VDDS_BOD trim - using masked write {MASK8:DATA8}
200  // - TRIM_VDDS_BOD is bits[7:3] of ADI3..REFSYSCTL1
201  // - Needs a positive transition on BOD_BG_TRIM_EN (bit[7] of REFSYSCTL3) to
202  // latch new VDDS BOD. Set to 0 first to guarantee a positive transition.
204 // if ( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) {
205  //
206  // VDDS_BOD_LEVEL = 1 means that boost mode is selected
207  // - Max out the VDDS_BOD trim (=VDDS_BOD_POS_31)
208  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) =
211 // } else {
212 // //
213 // // VDDS_BOD_LEVEL = 0
214 // // - Set VDDS_BOD to FCFG1..TRIMBOD_H
215 // //
216 // HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) =
218 // ((( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
221 // }
223 
224  SetupSetVddrLevel( ccfg_ModeConfReg );
225 
226  i32VddrSleepTrim = SetupSignExtendVddrTrimValue((
227  HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
230  } else
231  {
232  i32VddrSleepTrim = SetupSignExtendVddrTrimValue((
233  HWREG( FCFG1_BASE + FCFG1_O_LDO_TRIM ) &
236  }
237 
238  // Adjust the VDDR_TRIM_SLEEP value with value adjustable by customer (CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA)
239  // Read and sign extend VddrSleepDelta (in range -8 to +7)
240  i32VddrSleepDelta =
241  (((int32_t)( ccfg_ModeConfReg << ( 32 - CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_W - CCFG_MODE_CONF_VDDR_TRIM_SLEEP_DELTA_S )))
243  // Calculate new VDDR sleep trim
244  i32VddrSleepTrim = ( i32VddrSleepTrim + i32VddrSleepDelta + 1 );
245  if ( i32VddrSleepTrim > 21 ) i32VddrSleepTrim = 21;
246  if ( i32VddrSleepTrim < -10 ) i32VddrSleepTrim = -10;
247  // Write adjusted value using MASKED write (MASK8)
248  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_DCDCCTL1 * 2 )) = (( ADI_3_REFSYS_DCDCCTL1_VDDR_TRIM_SLEEP_M << 8 ) |
250 
251  // 1.
252  // Do not allow DCDC to be enabled if in external regulator mode.
253  // Preventing this by setting both the RECHARGE and the ACTIVE bits bit in the CCFG_MODE_CONF copy register (ccfg_ModeConfReg).
254  //
255  // 2.
256  // Adjusted battery monitor low limit in internal regulator mode.
257  // This is done by setting AON_BATMON_FLASHPUMPP0_LOWLIM=0 in internal regulator mode.
260  } else {
262  }
263 
264  // set the RECHARGE source based upon CCFG:MODE_CONF:DCDC_RECHARGE
265  // Note: Inverse polarity
267  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_RECHARGE_S ) & 1 ) ^ 1 );
268 
269  // set the ACTIVE source based upon CCFG:MODE_CONF:DCDC_ACTIVE
270  // Note: Inverse polarity
272  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_ACTIVE_S ) & 1 ) ^ 1 );
273 }
void SetupSetVddrLevel(uint32_t ccfg_ModeConfReg)
Set VDDR boost mode (by setting VDDR_TRIM to FCFG1..VDDR_TRIM_HH and setting VDDS_BOD to max) ...
Definition: setup_rom.c:127
static int32_t SetupSignExtendVddrTrimValue(uint32_t ui32VddrTrimVal)
Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21)
Definition: setup_rom.h:233

Here is the call graph for this function:

void SetupAfterColdResetWakeupFromShutDownCfg2 ( uint32_t  ui32Fcfg1Revision,
uint32_t  ccfg_ModeConfReg 
)

Second part of configuration required when waking up from shutdown.

Referenced by TrimAfterColdResetWakeupFromShutDown().

282 {
283  uint32_t ui32Trim;
284 
285  // Following sequence is required for using XOSCHF, if not included
286  // devices crashes when trying to switch to XOSCHF.
287  //
288  // Trim CAP settings. Get and set trim value for the ANABYPASS_VALUE1
289  // register
290  ui32Trim = SetupGetTrimForAnabypassValue1( ccfg_ModeConfReg );
292 
293  // Trim RCOSC_LF. Get and set trim values for the RCOSCLF_RTUNE_TRIM and
294  // RCOSCLF_CTUNE_TRIM fields in the XOSCLF_RCOSCLF_CTRL register.
300  ui32Trim);
301 
302  // Trim XOSCHF IBIAS THERM. Get and set trim value for the
303  // XOSCHF IBIAS THERM bit field in the ANABYPASS_VALUE2 register. Other
304  // register bit fields are set to 0.
305  ui32Trim = SetupGetTrimForXoscHfIbiastherm();
308 
309  // Trim AMPCOMP settings required before switch to XOSCHF
310  ui32Trim = SetupGetTrimForAmpcompTh2();
312  ui32Trim = SetupGetTrimForAmpcompTh1();
314 #if ( CCFG_BASE == CCFG_BASE_DEFAULT )
315  ui32Trim = SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision );
316 #else
317  ui32Trim = NOROM_SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision );
318 #endif
320 
321  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_MODE_EN in accordance to FCFG1 setting
322  // This is bit[5] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
323  // Using MASK4 write + 1 => writing to bits[7:4]
324  ui32Trim = SetupGetTrimForAdcShModeEn( ui32Fcfg1Revision );
325  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
326  ( 0x20 | ( ui32Trim << 1 ));
327 
328  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_VBUF_EN in accordance to FCFG1 setting
329  // This is bit[4] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
330  // Using MASK4 write + 1 => writing to bits[7:4]
331  ui32Trim = SetupGetTrimForAdcShVbufEn( ui32Fcfg1Revision );
332  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
333  ( 0x10 | ( ui32Trim ));
334 
335  // Set trim for the PEAK_DET_ITRIM, HP_BUF_ITRIM and LP_BUF_ITRIM bit fields
336  // in the DDI0_OSC_O_XOSCHFCTL register in accordance to FCFG1 setting.
337  // Remaining register bit fields are set to their reset values of 0.
338  ui32Trim = SetupGetTrimForXoscHfCtl(ui32Fcfg1Revision);
340 
341  // Set trim for DBLR_LOOP_FILTER_RESET_VOLTAGE in accordance to FCFG1 setting
342  // (This is bits [18:17] in DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL)
343  // (Using MASK4 write + 4 => writing to bits[19:16] => (4*4))
344  // (Assuming: DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_S = 17 and
345  // that DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_M = 0x00060000)
346  ui32Trim = SetupGetTrimForDblrLoopFilterResetVoltage( ui32Fcfg1Revision );
347  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 4 ) =
348  ( 0x60 | ( ui32Trim << 1 ));
349 
350  // Update DDI_0_OSC_ATESTCTL_ATESTLF_RCOSCLF_IBIAS_TRIM with data from
352  // This is DDI_0_OSC_O_ATESTCTL bit[7]
353  // ( DDI_0_OSC_O_ATESTCTL is currently hidden (but=0x00000020))
354  // Using MASK4 write + 1 => writing to bits[7:4]
355  ui32Trim = SetupGetTrimForRcOscLfIBiasTrim( ui32Fcfg1Revision );
356  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( 0x00000020 * 2 ) + 1 ) =
357  ( 0x80 | ( ui32Trim << 3 ));
358 
361  // This can be simplified since the registers are packed together in the same
362  // order both in FCFG1 and in the HW register.
363  // This spans DDI_0_OSC_O_LFOSCCTL bits[23:18]
364  // Using MASK8 write + 4 => writing to bits[23:16]
365  ui32Trim = SetupGetTrimForXoscLfRegulatorAndCmirrwrRatio( ui32Fcfg1Revision );
366  HWREGH( AUX_DDI0_OSC_BASE + DDI_O_MASK8B + ( DDI_0_OSC_O_LFOSCCTL * 2 ) + 4 ) =
367  ( 0xFC00 | ( ui32Trim << 2 ));
368 
369  // Set trim the HPM_IBIAS_WAIT_CNT, LPM_IBIAS_WAIT_CNT and IDAC_STEP bit
370  // fields in the DDI0_OSC_O_RADCEXTCFG register in accordance to FCFG1 setting.
371  // Remaining register bit fields are set to their reset values of 0.
372  ui32Trim = SetupGetTrimForRadcExtCfg(ui32Fcfg1Revision);
374 
375  // Setting FORCE_KICKSTART_EN (ref. CC26_V1_BUG00261). Should also be done for PG2
376  // (This is bit 22 in DDI_0_OSC_O_CTL0)
378 }
uint32_t SetupGetTrimForAmpcompTh1(void)
Returns the trim value to be used for the AMPCOMP_TH1 register in OSC_DIG.
Definition: setup_rom.c:659
uint32_t SetupGetTrimForRcOscLfRtuneCtuneTrim(void)
Returns the trim value to be used for the RCOSCLF_RTUNE_TRIM and the RCOSCLF_CTUNE_TRIM bit fields in...
Definition: setup_rom.c:576
uint32_t SetupGetTrimForAmpcompTh2(void)
Returns the trim value to be used for the AMPCOMP_TH2 register in OSC_DIG.
Definition: setup_rom.c:624
uint32_t SetupGetTrimForDblrLoopFilterResetVoltage(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as DBLR_LOOP_FILTER_RESET_VOLTAGE setting.
Definition: setup_rom.c:776
uint32_t SetupGetTrimForAdcShVbufEn(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as ADC_SH_VBUF_EN setting.
Definition: setup_rom.c:814
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:117
uint32_t SetupGetTrimForRadcExtCfg(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG.
Definition: setup_rom.c:883
uint32_t SetupGetTrimForRcOscLfIBiasTrim(uint32_t ui32Fcfg1Revision)
Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM.
Definition: setup_rom.c:915
uint32_t SetupGetTrimForXoscLfRegulatorAndCmirrwrRatio(uint32_t ui32Fcfg1Revision)
Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet spanning bits [5:0] in the retur...
Definition: setup_rom.c:935
uint32_t SetupGetTrimForAnabypassValue1(uint32_t ccfg_ModeConfReg)
Returns the trim value to be used for the ANABYPASS_VALUE1 register in OSC_DIG.
Definition: setup_rom.c:506
uint32_t SetupGetTrimForAdcShModeEn(uint32_t ui32Fcfg1Revision)
Returns the trim value from FCFG1 to be used as ADC_SH_MODE_EN setting.
Definition: setup_rom.c:795
uint32_t SetupGetTrimForAmpcompCtrl(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the AMPCOMP_CTRL register in OSC_DIG.
Definition: setup_rom.c:694
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.c:66
uint32_t SetupGetTrimForXoscHfCtl(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG.
Definition: setup_rom.c:833
uint32_t SetupGetTrimForXoscHfIbiastherm(void)
Returns the trim value to be used for the XOSC_HF_IBIASTHERM bit field in the ANABYPASS_VALUE2 regist...
Definition: setup_rom.c:604

Here is the call graph for this function:

void SetupAfterColdResetWakeupFromShutDownCfg3 ( uint32_t  ccfg_ModeConfReg)

Third part of configuration required when waking up from shutdown.

Referenced by TrimAfterColdResetWakeupFromShutDown().

387 {
388  uint32_t fcfg1OscConf;
389  uint32_t ui32Trim;
390  uint32_t currentHfClock;
391  uint32_t ccfgExtLfClk;
392 
393  // Examin the XOSC_FREQ field to select 0x1=HPOSC, 0x2=48MHz XOSC, 0x3=24MHz XOSC
394  switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_FREQ_M ) >> CCFG_MODE_CONF_XOSC_FREQ_S ) {
395  case 2 :
396  // XOSC source is a 48 MHz xtal
397  // Do nothing (since this is the reset setting)
398  break;
399  case 1 :
400  // XOSC source is HPOSC (trim the HPOSC if this is a chip with HPOSC, otherwise skip trimming and default to 24 MHz XOSC)
401 
402  fcfg1OscConf = HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF );
403 
404  if (( fcfg1OscConf & FCFG1_OSC_CONF_HPOSC_OPTION ) == 0 ) {
405  // This is a HPOSC chip, apply HPOSC settings
406  // Set bit DDI_0_OSC_CTL0_HPOSC_MODE_EN (this is bit 14 in DDI_0_OSC_O_CTL0)
408 
416 
429  break;
430  }
431  // Not a HPOSC chip - fall through to default
432  default :
433  // XOSC source is a 24 MHz xtal (default)
434  // Set bit DDI_0_OSC_CTL0_XTAL_IS_24M (this is bit 31 in DDI_0_OSC_O_CTL0)
436  break;
437  }
438 
439  // Set XOSC_HF in bypass mode if CCFG is configured for external TCXO
440  // Please note that it is up to the custommer to make sure that the external clock source is up and running before XOSC_HF can be used.
443  }
444 
445  // Clear DDI_0_OSC_CTL0_CLK_LOSS_EN (ClockLossEventEnable()). This is bit 9 in DDI_0_OSC_O_CTL0.
446  // This is typically already 0 except on Lizard where it is set in ROM-boot
448 
449  // Setting DDI_0_OSC_CTL1_XOSC_HF_FAST_START according to value found in FCFG1
450  ui32Trim = SetupGetTrimForXoscHfFastStart();
451  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL1 * 2 )) = ( 0x30 | ui32Trim );
452 
453  // setup the LF clock based upon CCFG:MODE_CONF:SCLK_LF_OPTION
454  switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_SCLK_LF_OPTION_M ) >> CCFG_MODE_CONF_SCLK_LF_OPTION_S ) {
455  case 0 : // XOSC_HF_DLF (XOSCHF/1536) -> SCLK_LF (=31250Hz)
457  SetupSetAonRtcSubSecInc( 0x8637BD );
458  break;
459  case 1 : // EXTERNAL signal -> SCLK_LF (frequency=2^38/CCFG_EXT_LF_CLK_RTC_INCREMENT)
460  // Set SCLK_LF to use the same source as SCLK_HF
461  // Can be simplified a bit since possible return values for HF matches LF settings
462  currentHfClock = OSCClockSourceGet( OSC_SRC_CLK_HF );
463  OSCClockSourceSet( OSC_SRC_CLK_LF, currentHfClock );
464  while( OSCClockSourceGet( OSC_SRC_CLK_LF ) != currentHfClock ) {
465  // Wait until switched
466  }
467  ccfgExtLfClk = HWREG( CCFG_BASE + CCFG_O_EXT_LF_CLK );
471  IOC_STD_INPUT | IOC_HYST_ENABLE ); // Route external clock to AON IOC w/hysteresis
472  // Set XOSC_LF in bypass mode to allow external 32k clock
474  // Fall through to set XOSC_LF as SCLK_LF source
475  case 2 : // XOSC_LF -> SLCK_LF (32768 Hz)
477  break;
478  default : // (=3) RCOSC_LF
480  break;
481  }
482 
483  // Update ADI_4_AUX_ADCREF1_VTRIM with value from FCFG1
484  HWREGB( AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF1 ) =
489 
490  // Set ADI_4_AUX:ADC0.SMPL_CYCLE_EXP to it's default minimum value (=3)
491  // (Note: Using MASK8B requires that the bits to be modified must be within the same
492  // byte boundary which is the case for the ADI_4_AUX_ADC0_SMPL_CYCLE_EXP field)
493  HWREGH( AUX_ADI4_BASE + ADI_O_MASK8B + ( ADI_4_AUX_O_ADC0 * 2 )) =
495 
496  // Sync with AON
497  SysCtrlAonSync();
498 }
static void SysCtrlAonSync(void)
Sync all accesses to the AON register interface.
Definition: sys_ctrl.h:177
#define IOC_PORT_AON_CLK32K
Definition: ioc.h:169
uint32_t OSCClockSourceGet(uint32_t ui32SrcClk)
Get the source clock settings.
Definition: osc.c:147
#define IOC_STD_INPUT
Definition: ioc.h:296
void SetupSetAonRtcSubSecInc(uint32_t subSecInc)
Doing the tricky stuff needed to enter new RTCSUBSECINC value.
Definition: setup_rom.c:1004
#define OSC_SRC_CLK_HF
Definition: osc.h:112
#define OSC_XOSC_HF
Definition: osc.h:117
#define OSC_SRC_CLK_LF
Definition: osc.h:114
#define OSC_RCOSC_LF
Definition: osc.h:118
void IOCPortConfigureSet(uint32_t ui32IOId, uint32_t ui32PortId, uint32_t ui32IOConfig)
Set the configuration of an IO port.
Definition: ioc.c:96
#define IOC_HYST_ENABLE
Definition: ioc.h:220
uint32_t SetupGetTrimForXoscHfFastStart(void)
Returns the trim value to be used as OSC_DIG:CTL1.XOSC_HF_FAST_START.
Definition: setup_rom.c:865
void OSCClockSourceSet(uint32_t ui32SrcClk, uint32_t ui32Osc)
Configure the oscillator input to the a source clock.
Definition: osc.c:100
#define OSC_XOSC_LF
Definition: osc.h:119

Here is the call graph for this function:

uint32_t SetupGetTrimForAdcShModeEn ( uint32_t  ui32Fcfg1Revision)

Returns the trim value from FCFG1 to be used as ADC_SH_MODE_EN setting.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

796 {
797  uint32_t getTrimForAdcShModeEnValue = 1; // Recommended default setting
798 
799  if ( ui32Fcfg1Revision >= 0x00000022 ) {
800  getTrimForAdcShModeEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
803  }
804 
805  return ( getTrimForAdcShModeEnValue );
806 }
uint32_t SetupGetTrimForAdcShVbufEn ( uint32_t  ui32Fcfg1Revision)

Returns the trim value from FCFG1 to be used as ADC_SH_VBUF_EN setting.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

815 {
816  uint32_t getTrimForAdcShVbufEnValue = 1; // Recommended default setting
817 
818  if ( ui32Fcfg1Revision >= 0x00000022 ) {
819  getTrimForAdcShVbufEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
822  }
823 
824  return ( getTrimForAdcShVbufEnValue );
825 }
uint32_t SetupGetTrimForAmpcompCtrl ( uint32_t  ui32Fcfg1Revision)

Returns the trim value to be used for the AMPCOMP_CTRL register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

695 {
696  uint32_t ui32TrimValue ;
697  uint32_t ui32Fcfg1Value ;
698  uint32_t ibiasOffset ;
699  uint32_t ibiasInit ;
700  uint32_t modeConf1 ;
701  int32_t deltaAdjust ;
702 
703  // Use device specific trim values located in factory configuration
704  // area. Register bit fields without trim values in the factory
705  // configuration area will be set to the value of 0.
706  ui32Fcfg1Value = HWREG( FCFG1_BASE + FCFG1_O_AMPCOMP_CTRL1 );
707 
708  ibiasOffset = ( ui32Fcfg1Value &
711  ibiasInit = ( ui32Fcfg1Value &
714 
716  // Adjust with DELTA_IBIAS_OFFSET and DELTA_IBIAS_INIT from CCFG
717  modeConf1 = HWREG( CCFG_BASE + CCFG_O_MODE_CONF_1 );
718 
719  // Both fields are signed 4-bit values. This is an assumption when doing the sign extension.
720  deltaAdjust =
723  deltaAdjust += (int32_t)ibiasOffset;
724  if ( deltaAdjust < 0 ) {
725  deltaAdjust = 0;
726  }
729  }
730  ibiasOffset = (uint32_t)deltaAdjust;
731 
732  deltaAdjust =
733  (((int32_t)( modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_W - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_S )))
735  deltaAdjust += (int32_t)ibiasInit;
736  if ( deltaAdjust < 0 ) {
737  deltaAdjust = 0;
738  }
741  }
742  ibiasInit = (uint32_t)deltaAdjust;
743  }
744  ui32TrimValue = ( ibiasOffset << DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_S ) |
745  ( ibiasInit << DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_S ) ;
746 
747  ui32TrimValue |= (((ui32Fcfg1Value &
751  ui32TrimValue |= (((ui32Fcfg1Value &
755  ui32TrimValue |= (((ui32Fcfg1Value &
759 
760  if ( ui32Fcfg1Revision >= 0x00000022 ) {
761  ui32TrimValue |= ((( ui32Fcfg1Value &
765  }
766 
767  return(ui32TrimValue);
768 }
uint32_t SetupGetTrimForAmpcompTh1 ( void  )

Returns the trim value to be used for the AMPCOMP_TH1 register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

660 {
661  uint32_t ui32TrimValue;
662  uint32_t ui32Fcfg1Value;
663 
664  // Use device specific trim values located in factory configuration
665  // area. All defined register bit fields have a corresponding trim
666  // value in the factory configuration area
667  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH1);
668  ui32TrimValue = (((ui32Fcfg1Value &
672  ui32TrimValue |= (((ui32Fcfg1Value &
676  ui32TrimValue |= (((ui32Fcfg1Value &
680  ui32TrimValue |= (((ui32Fcfg1Value &
684 
685  return(ui32TrimValue);
686 }
uint32_t SetupGetTrimForAmpcompTh2 ( void  )

Returns the trim value to be used for the AMPCOMP_TH2 register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

625 {
626  uint32_t ui32TrimValue;
627  uint32_t ui32Fcfg1Value;
628 
629  // Use device specific trim value located in factory configuration
630  // area. All defined register bit fields have corresponding trim
631  // value in the factory configuration area
632  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH2);
633  ui32TrimValue = ((ui32Fcfg1Value &
637  ui32TrimValue |= (((ui32Fcfg1Value &
641  ui32TrimValue |= (((ui32Fcfg1Value &
645  ui32TrimValue |= (((ui32Fcfg1Value &
649 
650  return(ui32TrimValue);
651 }
uint32_t SetupGetTrimForAnabypassValue1 ( uint32_t  ccfg_ModeConfReg)

Returns the trim value to be used for the ANABYPASS_VALUE1 register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

507 {
508  uint32_t ui32Fcfg1Value ;
509  uint32_t ui32XoscHfRow ;
510  uint32_t ui32XoscHfCol ;
511  uint32_t ui32TrimValue ;
512 
513  // Use device specific trim values located in factory configuration
514  // area for the XOSC_HF_COLUMN_Q12 and XOSC_HF_ROW_Q12 bit fields in
515  // the ANABYPASS_VALUE1 register. Value for the other bit fields
516  // are set to 0.
517 
518  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_CONFIG_OSC_TOP);
519  ui32XoscHfRow = (( ui32Fcfg1Value &
522  ui32XoscHfCol = (( ui32Fcfg1Value &
525 
526  if (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_CAP_MOD ) == 0 ) {
527  // XOSC_CAP_MOD = 0 means: CAP_ARRAY_DELTA is in use -> Apply compensation
528  // XOSC_CAPARRAY_DELTA is located in bit[15:8] of ccfg_ModeConfReg
529  // Note: HW_REV_DEPENDENT_IMPLEMENTATION. Field width is not given by
530  // a define and sign extension must therefore be hardcoded.
531  // ( A small test program is created verifying the code lines below:
532  // Ref.: ..\test\small_standalone_test_programs\CapArrayDeltaAdjust_test.c)
533  int32_t i32CustomerDeltaAdjust =
534  (((int32_t)( ccfg_ModeConfReg << ( 32 - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_W - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_S )))
536 
537  while ( i32CustomerDeltaAdjust < 0 ) {
538  ui32XoscHfCol >>= 1; // COL 1 step down
539  if ( ui32XoscHfCol == 0 ) { // if COL below minimum
540  ui32XoscHfCol = 0xFFFF; // Set COL to maximum
541  ui32XoscHfRow >>= 1; // ROW 1 step down
542  if ( ui32XoscHfRow == 0 ) { // if ROW below minimum
543  ui32XoscHfRow = 1; // Set both ROW and COL
544  ui32XoscHfCol = 1; // to minimum
545  }
546  }
547  i32CustomerDeltaAdjust++;
548  }
549  while ( i32CustomerDeltaAdjust > 0 ) {
550  ui32XoscHfCol = ( ui32XoscHfCol << 1 ) | 1; // COL 1 step up
551  if ( ui32XoscHfCol > 0xFFFF ) { // if COL above maximum
552  ui32XoscHfCol = 1; // Set COL to minimum
553  ui32XoscHfRow = ( ui32XoscHfRow << 1 ) | 1; // ROW 1 step up
554  if ( ui32XoscHfRow > 0xF ) { // if ROW above maximum
555  ui32XoscHfRow = 0xF; // Set both ROW and COL
556  ui32XoscHfCol = 0xFFFF; // to maximum
557  }
558  }
559  i32CustomerDeltaAdjust--;
560  }
561  }
562 
563  ui32TrimValue = (( ui32XoscHfRow << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_ROW_Q12_S ) |
564  ( ui32XoscHfCol << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_COLUMN_Q12_S ) );
565 
566  return (ui32TrimValue);
567 }
uint32_t SetupGetTrimForDblrLoopFilterResetVoltage ( uint32_t  ui32Fcfg1Revision)

Returns the trim value from FCFG1 to be used as DBLR_LOOP_FILTER_RESET_VOLTAGE setting.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

777 {
778  uint32_t dblrLoopFilterResetVoltageValue = 0; // Reset value
779 
780  if ( ui32Fcfg1Revision >= 0x00000020 ) {
781  dblrLoopFilterResetVoltageValue = ( HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 ) &
784  }
785 
786  return ( dblrLoopFilterResetVoltageValue );
787 }
uint32_t SetupGetTrimForRadcExtCfg ( uint32_t  ui32Fcfg1Revision)

Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

884 {
885  uint32_t getTrimForRadcExtCfgValue = 0x403F8000; // Recommended default setting
886  uint32_t fcfg1Data;
887 
888  if ( ui32Fcfg1Revision >= 0x00000020 ) {
889  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
890  getTrimForRadcExtCfgValue =
891  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HPM_IBIAS_WAIT_CNT_M ) >>
894 
895  getTrimForRadcExtCfgValue |=
896  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LPM_IBIAS_WAIT_CNT_M ) >>
899 
900  getTrimForRadcExtCfgValue |=
901  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_IDAC_STEP_M ) >>
904  }
905 
906  return ( getTrimForRadcExtCfgValue );
907 }
uint32_t SetupGetTrimForRcOscLfIBiasTrim ( uint32_t  ui32Fcfg1Revision)

Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

916 {
917  uint32_t trimForRcOscLfIBiasTrimValue = 0; // Default value
918 
919  if ( ui32Fcfg1Revision >= 0x00000022 ) {
920  trimForRcOscLfIBiasTrimValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
923  }
924 
925  return ( trimForRcOscLfIBiasTrimValue );
926 }
uint32_t SetupGetTrimForRcOscLfRtuneCtuneTrim ( void  )

Returns the trim value to be used for the RCOSCLF_RTUNE_TRIM and the RCOSCLF_CTUNE_TRIM bit fields in the XOSCLF_RCOSCLF_CTRL register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

577 {
578  uint32_t ui32TrimValue;
579 
580  // Use device specific trim values located in factory configuration
581  // area
582  ui32TrimValue =
587 
588  ui32TrimValue |=
593 
594  return(ui32TrimValue);
595 }
uint32_t SetupGetTrimForXoscHfCtl ( uint32_t  ui32Fcfg1Revision)

Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

834 {
835  uint32_t getTrimForXoschfCtlValue = 0; // Recommended default setting
836  uint32_t fcfg1Data;
837 
838  if ( ui32Fcfg1Revision >= 0x00000020 ) {
839  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
840  getTrimForXoschfCtlValue =
841  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_PEAK_DET_ITRIM_M ) >>
844 
845  getTrimForXoschfCtlValue |=
846  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HP_BUF_ITRIM_M ) >>
849 
850  getTrimForXoschfCtlValue |=
851  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LP_BUF_ITRIM_M ) >>
854  }
855 
856  return ( getTrimForXoschfCtlValue );
857 }
uint32_t SetupGetTrimForXoscHfFastStart ( void  )

Returns the trim value to be used as OSC_DIG:CTL1.XOSC_HF_FAST_START.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg3().

866 {
867  uint32_t ui32XoscHfFastStartValue ;
868 
869  // Get value from FCFG1
870  ui32XoscHfFastStartValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
873 
874  return ( ui32XoscHfFastStartValue );
875 }
uint32_t SetupGetTrimForXoscHfIbiastherm ( void  )

Returns the trim value to be used for the XOSC_HF_IBIASTHERM bit field in the ANABYPASS_VALUE2 register in OSC_DIG.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

605 {
606  uint32_t ui32TrimValue;
607 
608  // Use device specific trim value located in factory configuration
609  // area
610  ui32TrimValue =
614 
615  return(ui32TrimValue);
616 }
uint32_t SetupGetTrimForXoscLfRegulatorAndCmirrwrRatio ( uint32_t  ui32Fcfg1Revision)

Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet spanning bits [5:0] in the returned value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

936 {
937  uint32_t trimForXoscLfRegulatorAndCmirrwrRatioValue = 0; // Default value for both fields
938 
939  if ( ui32Fcfg1Revision >= 0x00000022 ) {
940  trimForXoscLfRegulatorAndCmirrwrRatioValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
944  }
945 
946  return ( trimForXoscLfRegulatorAndCmirrwrRatioValue );
947 }
void SetupSetAonRtcSubSecInc ( uint32_t  subSecInc)

Doing the tricky stuff needed to enter new RTCSUBSECINC value.

Returns
None

Referenced by SetupAfterColdResetWakeupFromShutDownCfg3().

1005 {
1006  // Loading a new RTCSUBSECINC value is done in 5 steps:
1007  // 1. Write bit[15:0] of new SUBSECINC value to AUX_WUC_O_RTCSUBSECINC0
1008  // 2. Write bit[23:16] of new SUBSECINC value to AUX_WUC_O_RTCSUBSECINC1
1010  // 4. Wait for AUX_WUC_RTCSUBSECINCCTL_UPD_ACK
1013  HWREG( AUX_WUC_BASE + AUX_WUC_O_RTCSUBSECINC1 ) = (( subSecInc >> 16 ) & AUX_WUC_RTCSUBSECINC1_INC23_16_M );
1014 
1017  HWREG( AUX_WUC_BASE + AUX_WUC_O_RTCSUBSECINCCTL ) = 0;
1018 }
void SetupSetCacheModeAccordingToCcfgSetting ( void  )

Set correct VIMS_MODE according to CCFG setting (CACHE or GPRAM)

Returns
None

Referenced by SetupTrimDevice().

958 {
959  // - Make sure to enable aggressive VIMS clock gating for power optimization
960  // Only for PG2 devices.
961  // - Enable cache prefetch enable as default setting
962  // (Slightly higher power consumption, but higher CPU performance)
963  // - IF ( CCFG_..._DIS_GPRAM == 1 )
964  // then: Enable cache (set cache mode = 1), even if set by ROM boot code
965  // (This is done because it's not set by boot code when running inside
966  // a debugger supporting the Halt In Boot (HIB) functionality).
967  // else: Set MODE_GPRAM if not already set (see inline comments as well)
968  uint32_t vimsCtlMode0 ;
969 
970  while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
971  // Do nothing - wait for an eventual ongoing mode change to complete.
972  // (There should typically be no wait time here, but need to be sure)
973  }
974 
975  // Note that Mode=0 is equal to MODE_GPRAM
976  vimsCtlMode0 = (( HWREG( VIMS_BASE + VIMS_O_CTL ) & ~VIMS_CTL_MODE_M ) | VIMS_CTL_DYN_CG_EN_M | VIMS_CTL_PREF_EN_M );
977 
978 
980  // Enable cache (and hence disable GPRAM)
981  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_CACHE );
982  } else if (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_GPRAM ) {
983  // GPRAM is enabled in CCFG but not selected
984  // Note: It is recommended to go via MODE_OFF when switching to MODE_GPRAM
985  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_OFF );
986  while (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_OFF ) {
987  // Do nothing - wait for an eventual mode change to complete (This goes fast).
988  }
989  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
990  } else {
991  // Correct mode, but make sure PREF_EN and DYN_CG_EN always are set
992  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
993  }
994 }
void SetupSetVddrLevel ( uint32_t  ccfg_ModeConfReg)

Set VDDR boost mode.

Returns
None

Set VDDR boost mode.

Returns
None

Referenced by SetupAfterColdResetWakeupFromShutDownCfg1().

128 {
129  uint32_t newTrimRaw ;
130  int32_t targetTrim ;
131  int32_t currentTrim ;
132  int32_t deltaTrim ;
133 
134 // if ( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) {
135  //
136  // VDDS_BOD_LEVEL = 1 means that boost mode is selected
137  // - Step up VDDR_TRIM to FCFG1..VDDR_TRIM_HH
138  newTrimRaw = (( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
141 // } else {
142 // //
143 // // VDDS_BOD_LEVEL = 0
144 // // - Step up VDDR_TRIM to FCFG1..VDDR_TRIM_H
145 // //
146 // newTrimRaw = (( HWREG( FCFG1_BASE + FCFG1_O_VOLT_TRIM ) &
149 // }
150  targetTrim = SetupSignExtendVddrTrimValue( newTrimRaw );
151  currentTrim = SetupSignExtendVddrTrimValue((
152  HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) &
155 
156  if ( currentTrim != targetTrim ) {
157  // Disable VDDR BOD
159 
160  while ( currentTrim != targetTrim ) {
161  deltaTrim = targetTrim - currentTrim;
162  if ( deltaTrim > 2 ) deltaTrim = 2;
163  if ( deltaTrim < -2 ) deltaTrim = -2;
164  currentTrim += deltaTrim;
165 
166  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one SCLK_LF period
167 
168  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_DCDCCTL0 * 2 )) =
169  ( ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_M << 8 ) | (( currentTrim <<
172 
173  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ) = 1; // Force SCLK_LF period wait on next read
174  }
175 
176  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one SCLK_LF period
177  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ) = 1; // Force SCLK_LF period wait on next read
178  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait one more SCLK_LF period before re-enabling VDDR BOD
180  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // And finally wait for VDDR_LOSS_EN setting to propagate
181  }
182 }
static int32_t SetupSignExtendVddrTrimValue(uint32_t ui32VddrTrimVal)
Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21)
Definition: setup_rom.h:233

Here is the call graph for this function:

static int32_t SetupSignExtendVddrTrimValue ( uint32_t  ui32VddrTrimVal)
inlinestatic

Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21)

Returns

Referenced by SetupAfterColdResetWakeupFromShutDownCfg1(), SetupSetVddrLevel(), and SysCtrlSetRechargeBeforePowerDown().

234 {
235  // The VDDR trim value is 5 bits representing the range from -10 to +21
236  // (where -10=0x16, -1=0x1F, 0=0x00, 1=0x01 and +21=0x15)
237  int32_t i32SignedVddrVal = ui32VddrTrimVal;
238  if ( i32SignedVddrVal > 0x15 ) {
239  i32SignedVddrVal -= 0x20;
240  }
241  return ( i32SignedVddrVal );
242 }
void SetupTrimDevice ( void  )

Performs the necessary trim of the device which is not done in boot code.

This function should only execute coming from ROM boot. The current implementation does not take soft reset into account. However, it does no damage to execute it again. It only consumes time.

Returns
None
113 {
114  uint32_t ui32Fcfg1Revision;
115  uint32_t ui32AonSysResetctl;
116 
117  // Get layout revision of the factory configuration area
118  // (Handle undefined revision as revision = 0)
119  ui32Fcfg1Revision = HWREG(FCFG1_BASE + FCFG1_O_FCFG1_REVISION);
120  if ( ui32Fcfg1Revision == 0xFFFFFFFF ) {
121  ui32Fcfg1Revision = 0;
122  }
123 
124  // This driverlib version and setup file is for CC13x0 PG2.0 and later.
125  // Halt if violated
127 
128  // Enable standby in flash bank
130 
131  // Clock must always be enabled for the semaphore module (due to ADI/DDI HW workaround)
133 
134  // Warm resets on CC13x0 and CC26x0 complicates software design because much of
135  // our software expect that initialization is done from a full system reset.
136  // This includes RTC setup, oscillator configuration and AUX setup.
137  // To ensure a full reset of the device is done when customers get e.g. a Watchdog
138  // reset, the following is set here:
140 
141  // Select correct CACHE mode and set correct CACHE configuration
142 #if ( CCFG_BASE == CCFG_BASE_DEFAULT )
144 #else
145  NOROM_SetupSetCacheModeAccordingToCcfgSetting();
146 #endif
147 
148  // 1. Check for powerdown
149  // 2. Check for shutdown
150  // 3. Assume cold reset if none of the above.
151  //
152  // It is always assumed that the application will freeze the latches in
153  // AON_IOC when going to powerdown in order to retain the values on the IOs.
154  //
155  // NB. If this bit is not cleared before proceeding to powerdown, the IOs
156  // will all default to the reset configuration when restarting.
158  {
159  // NB. This should be calling a ROM implementation of required trim and
160  // compensation
161  // e.g. TrimAfterColdResetWakeupFromShutDownWakeupFromPowerDown()
163  }
164  // Check for shutdown
165  //
166  // When device is going to shutdown the hardware will automatically clear
167  // the SLEEPDIS bit in the SLEEP register in the AON_SYSCTL module.
168  // It is left for the application to assert this bit when waking back up,
169  // but not before the desired IO configuration has been re-established.
171  {
172  // NB. This should be calling a ROM implementation of required trim and
173  // compensation
174  // e.g. TrimAfterColdResetWakeupFromShutDown() -->
175  // TrimAfterColdResetWakeupFromShutDownWakeupFromPowerDown();
176  TrimAfterColdResetWakeupFromShutDown(ui32Fcfg1Revision);
178  }
179  else
180  {
181  // Consider adding a check for soft reset to allow debugging to skip
182  // this section!!!
183  //
184  // NB. This should be calling a ROM implementation of required trim and
185  // compensation
186  // e.g. TrimAfterColdReset() -->
187  // TrimAfterColdResetWakeupFromShutDown() -->
188  // TrimAfterColdResetWakeupFromShutDownWakeupFromPowerDown()
190  TrimAfterColdResetWakeupFromShutDown(ui32Fcfg1Revision);
192 
193  }
194 
195  // Set VIMS power domain control.
196  // PDCTL1VIMS = 0 ==> VIMS power domain is only powered when CPU power domain is powered
197  HWREG( PRCM_BASE + PRCM_O_PDCTL1VIMS ) = 0;
198 
199  // Configure optimal wait time for flash FSM in cases where flash pump
200  // wakes up from sleep
201  HWREG(FLASH_BASE + FLASH_O_FPAC1) = (HWREG(FLASH_BASE + FLASH_O_FPAC1) &
203  (0x139<<FLASH_FPAC1_PSLEEPTDIS_S);
204 
205  // And finally at the end of the flash boot process:
206  // SET BOOT_DET bits in AON_SYSCTL to 3 if already found to be 1
207  // Note: The BOOT_DET_x_CLR/SET bits must be manually cleared
208  if ((( HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) &
211  {
212  ui32AonSysResetctl = ( HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) &
216  HWREG( AON_SYSCTL_BASE + AON_SYSCTL_O_RESETCTL ) = ui32AonSysResetctl;
217  }
218 
219  // Make sure there are no ongoing VIMS mode change when leaving SetupTrimDevice()
220  // (There should typically be no wait time here, but need to be sure)
221  while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
222  // Do nothing - wait for an eventual ongoing mode change to complete.
223  }
224 }
static void TrimAfterColdResetWakeupFromShutDownWakeupFromPowerDown(void)
Trims to be applied when coming from POWER_DOWN (also called when coming from SHUTDOWN and PIN_RESET)...
Definition: setup.c:235
void ThisLibraryIsFor_CC13x0_HwRev20AndLater_HaltIfViolated(void)
Verifies that current chip is CC13x0 HwRev 2.0 or later and never returns if violated.
Definition: chipinfo.c:176
void SetupSetCacheModeAccordingToCcfgSetting(void)
Set correct VIMS_MODE according to CCFG setting (CACHE or GPRAM)
Definition: setup_rom.c:957
static void TrimAfterColdResetWakeupFromShutDown(uint32_t ui32Fcfg1Revision)
Trims to be applied when coming from SHUTDOWN (also called when coming from PIN_RESET).
Definition: setup.c:249
static void TrimAfterColdReset(void)
Trims to be applied when coming from PIN_RESET.
Definition: setup.c:354

Here is the call graph for this function: