CC26xx Driver Library
[setup_rom.h] Setup (ROM functions)

Functions

void SetupAfterColdResetWakeupFromShutDownCfg1 (uint32_t ccfg_ModeConfReg)
 First part of configuration required after cold reset and when waking up from shutdown. More...
 
void SetupAfterColdResetWakeupFromShutDownCfg2 (uint32_t ui32Fcfg1Revision, uint32_t ccfg_ModeConfReg)
 Second part of configuration required after cold reset and when waking up from shutdown. More...
 
void SetupAfterColdResetWakeupFromShutDownCfg3 (uint32_t ccfg_ModeConfReg)
 Third part of configuration required after cold reset and 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 SetupStepVddrTrimTo (uint32_t toCode)
 Set VDDR boost mode (by setting VDDR_TRIM to FCFG1..VDDR_TRIM_HH and setting VDDS_BOD to max) More...
 

Detailed Description

This module contains functions from the Setup API which are likely to be in ROM.

Note
Do not use functions from this module directly! This module is only to be used by SetupTrimDevice().

Function Documentation

void SetupAfterColdResetWakeupFromShutDownCfg1 ( uint32_t  ccfg_ModeConfReg)

First part of configuration required after cold reset and when waking up from shutdown.

Configures the following based on settings in CCFG (Customer Configuration area:

  • Boost mode for CC13xx devices
  • Minimal VDDR voltage threshold used during sleep mode
  • DCDC functionality:
    • Selects if DCDC or GLDO regulator will be used for VDDR in active mode
    • Selects if DCDC or GLDO regulator will be used for VDDR in sleep mode

In addition the battery monitor low limit for internal regulator mode is set to a hard coded value.

Parameters
ccfg_ModeConfRegis the value of the CCFG_O_MODE_CONF_1 register
Returns
None

Referenced by TrimAfterColdResetWakeupFromShutDown().

168 {
169  // Check for CC1352 boost mode
170  // The combination VDDR_EXT_LOAD=0 and VDDS_BOD_LEVEL=1 is defined to select boost mode
171  if ((( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDR_EXT_LOAD ) == 0 ) &&
172  (( ccfg_ModeConfReg & CCFG_MODE_CONF_VDDS_BOD_LEVEL ) != 0 ) )
173  {
174  // Set VDDS_BOD trim - using masked write {MASK8:DATA8}
175  // - TRIM_VDDS_BOD is bits[7:3] of ADI3..REFSYSCTL1
176  // - Needs a positive transition on BOD_BG_TRIM_EN (bit[7] of REFSYSCTL3) to
177  // latch new VDDS BOD. Set to 0 first to guarantee a positive transition.
179  //
180  // VDDS_BOD_LEVEL = 1 means that boost mode is selected
181  // - Max out the VDDS_BOD trim (=VDDS_BOD_POS_31)
182  HWREGH( ADI3_BASE + ADI_O_MASK8B + ( ADI_3_REFSYS_O_REFSYSCTL1 * 2 )) =
186 
190  }
191 
192  // 1.
193  // Do not allow DCDC to be enabled if in external regulator mode.
194  // Preventing this by setting both the RECHARGE and the ACTIVE bits bit in the CCFG_MODE_CONF copy register (ccfg_ModeConfReg).
195  //
196  // 2.
197  // Adjusted battery monitor low limit in internal regulator mode.
198  // This is done by setting AON_BATMON_FLASHPUMPP0_LOWLIM=0 in internal regulator mode.
201  } else {
203  }
204 
205  // set the RECHARGE source based upon CCFG:MODE_CONF:DCDC_RECHARGE
206  // Note: Inverse polarity
208  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_RECHARGE_S ) & 1 ) ^ 1 );
209 
210  // set the ACTIVE source based upon CCFG:MODE_CONF:DCDC_ACTIVE
211  // Note: Inverse polarity
213  ((( ccfg_ModeConfReg >> CCFG_MODE_CONF_DCDC_ACTIVE_S ) & 1 ) ^ 1 );
214 }
void SetupStepVddrTrimTo(uint32_t toCode)
Set VDDR boost mode (by setting VDDR_TRIM to FCFG1..VDDR_TRIM_HH and setting VDDS_BOD to max) ...
Definition: setup_rom.c:119

Here is the call graph for this function:

void SetupAfterColdResetWakeupFromShutDownCfg2 ( uint32_t  ui32Fcfg1Revision,
uint32_t  ccfg_ModeConfReg 
)

Second part of configuration required after cold reset and when waking up from shutdown.

Configures and trims functionalites required for use of XOSC_HF. The configurations and trimmings are based on settings in FCFG1 (Factory Configuration area) and partly on ccfg_ModeConfReg.

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
ccfg_ModeConfRegis the value of the CCFG_O_MODE_CONF_1 register
Returns
None

Referenced by TrimAfterColdResetWakeupFromShutDown().

223 {
224  uint32_t ui32Trim;
225 
226  // Following sequence is required for using XOSCHF, if not included
227  // devices crashes when trying to switch to XOSCHF.
228  //
229  // Trim CAP settings. Get and set trim value for the ANABYPASS_VALUE1
230  // register
231  ui32Trim = SetupGetTrimForAnabypassValue1( ccfg_ModeConfReg );
233 
234  // Trim RCOSC_LF. Get and set trim values for the RCOSCLF_RTUNE_TRIM and
235  // RCOSCLF_CTUNE_TRIM fields in the XOSCLF_RCOSCLF_CTRL register.
241  ui32Trim);
242 
243  // Trim XOSCHF IBIAS THERM. Get and set trim value for the
244  // XOSCHF IBIAS THERM bit field in the ANABYPASS_VALUE2 register. Other
245  // register bit fields are set to 0.
246  ui32Trim = SetupGetTrimForXoscHfIbiastherm();
249 
250  // Trim AMPCOMP settings required before switch to XOSCHF
251  ui32Trim = SetupGetTrimForAmpcompTh2();
253  ui32Trim = SetupGetTrimForAmpcompTh1();
255 #if ( CCFG_BASE == CCFG_BASE_DEFAULT )
256  ui32Trim = SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision );
257 #else
258  ui32Trim = NOROM_SetupGetTrimForAmpcompCtrl( ui32Fcfg1Revision );
259 #endif
261 
262  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_MODE_EN in accordance to FCFG1 setting
263  // This is bit[5] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
264  // Using MASK4 write + 1 => writing to bits[7:4]
265  ui32Trim = SetupGetTrimForAdcShModeEn( ui32Fcfg1Revision );
266  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
267  ( 0x20 | ( ui32Trim << 1 ));
268 
269  // Set trim for DDI_0_OSC_ADCDOUBLERNANOAMPCTL_ADC_SH_VBUF_EN in accordance to FCFG1 setting
270  // This is bit[4] in the DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL register
271  // Using MASK4 write + 1 => writing to bits[7:4]
272  ui32Trim = SetupGetTrimForAdcShVbufEn( ui32Fcfg1Revision );
273  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 1 ) =
274  ( 0x10 | ( ui32Trim ));
275 
276  // Set trim for the PEAK_DET_ITRIM, HP_BUF_ITRIM and LP_BUF_ITRIM bit fields
277  // in the DDI0_OSC_O_XOSCHFCTL register in accordance to FCFG1 setting.
278  // Remaining register bit fields are set to their reset values of 0.
279  ui32Trim = SetupGetTrimForXoscHfCtl(ui32Fcfg1Revision);
281 
282  // Set trim for DBLR_LOOP_FILTER_RESET_VOLTAGE in accordance to FCFG1 setting
283  // (This is bits [18:17] in DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL)
284  // (Using MASK4 write + 4 => writing to bits[19:16] => (4*4))
285  // (Assuming: DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_S = 17 and
286  // that DDI_0_OSC_ADCDOUBLERNANOAMPCTL_DBLR_LOOP_FILTER_RESET_VOLTAGE_M = 0x00060000)
287  ui32Trim = SetupGetTrimForDblrLoopFilterResetVoltage( ui32Fcfg1Revision );
288  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_ADCDOUBLERNANOAMPCTL * 2 ) + 4 ) =
289  ( 0x60 | ( ui32Trim << 1 ));
290 
291  // Update DDI_0_OSC_ATESTCTL_ATESTLF_RCOSCLF_IBIAS_TRIM with data from
293  // This is DDI_0_OSC_O_ATESTCTL bit[7]
294  // ( DDI_0_OSC_O_ATESTCTL is currently hidden (but=0x00000020))
295  // Using MASK4 write + 1 => writing to bits[7:4]
296  ui32Trim = SetupGetTrimForRcOscLfIBiasTrim( ui32Fcfg1Revision );
297  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( 0x00000020 * 2 ) + 1 ) =
298  ( 0x80 | ( ui32Trim << 3 ));
299 
302  // This can be simplified since the registers are packed together in the same
303  // order both in FCFG1 and in the HW register.
304  // This spans DDI_0_OSC_O_LFOSCCTL bits[23:18]
305  // Using MASK8 write + 4 => writing to bits[23:16]
306  ui32Trim = SetupGetTrimForXoscLfRegulatorAndCmirrwrRatio( ui32Fcfg1Revision );
307  HWREGH( AUX_DDI0_OSC_BASE + DDI_O_MASK8B + ( DDI_0_OSC_O_LFOSCCTL * 2 ) + 4 ) =
308  ( 0xFC00 | ( ui32Trim << 2 ));
309 
310  // Set trim the HPM_IBIAS_WAIT_CNT, LPM_IBIAS_WAIT_CNT and IDAC_STEP bit
311  // fields in the DDI0_OSC_O_RADCEXTCFG register in accordance to FCFG1 setting.
312  // Remaining register bit fields are set to their reset values of 0.
313  ui32Trim = SetupGetTrimForRadcExtCfg(ui32Fcfg1Revision);
315 
316 }
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:725
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:864
void DDI16BitfieldWrite(uint32_t ui32Base, uint32_t ui32Reg, uint32_t ui32Mask, uint32_t ui32Shift, uint16_t ui32Data)
Write a bit field via the DDI using 16-bit maskable write.
Definition: ddi.c:117
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:744
uint32_t SetupGetTrimForXoscHfCtl(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the XOSCHFCTL register in OSC_DIG.
Definition: setup_rom.c:763
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:534
uint32_t SetupGetTrimForRadcExtCfg(uint32_t ui32Fcfg1Revision)
Returns the trim value to be used for the RADCEXTCFG register in OSC_DIG.
Definition: setup_rom.c:813
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:438
uint32_t SetupGetTrimForRcOscLfIBiasTrim(uint32_t ui32Fcfg1Revision)
Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM.
Definition: setup_rom.c:845
uint32_t SetupGetTrimForAmpcompTh1(void)
Returns the trim value to be used for the AMPCOMP_TH1 register in OSC_DIG.
Definition: setup_rom.c:589
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:624
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 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:507
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:706
uint32_t SetupGetTrimForAmpcompTh2(void)
Returns the trim value to be used for the AMPCOMP_TH2 register in OSC_DIG.
Definition: setup_rom.c:554

Here is the call graph for this function:

void SetupAfterColdResetWakeupFromShutDownCfg3 ( uint32_t  ccfg_ModeConfReg)

Third part of configuration required after cold reset and when waking up from shutdown.

Configures the following:

  • XOSC source selection based on ccfg_ModeConfReg. If HPOSC is selected on a HPOSC device the oscillator is configured based on settings in FCFG1 (Factory Configuration area).
  • Clock loss detection is disabled. Will be re-enabled by TIRTOS power driver.
  • Duration of the XOSC_HF fast startup mode based on FCFG1 setting.
  • SCLK_LF based on ccfg_ModeConfReg.
  • Output voltage of ADC fixed reference based on FCFG1 setting.
Parameters
ccfg_ModeConfRegis the value of the CCFG_O_MODE_CONF_1 register
Returns
None

Referenced by TrimAfterColdResetWakeupFromShutDown().

325 {
326  uint32_t fcfg1OscConf;
327  uint32_t ui32Trim;
328  uint32_t currentHfClock;
329  uint32_t ccfgExtLfClk;
330 
331  // Examine the XOSC_FREQ field to select 0x1=HPOSC, 0x2=48MHz XOSC, 0x3=24MHz XOSC
332  switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_FREQ_M ) >> CCFG_MODE_CONF_XOSC_FREQ_S ) {
333  case 2 :
334  // XOSC source is a 48 MHz crystal
335  // Do nothing (since this is the reset setting)
336  break;
337  case 1 :
338  // XOSC source is HPOSC (trim the HPOSC if this is a chip with HPOSC, otherwise skip trimming and default to 24 MHz XOSC)
339 
340  fcfg1OscConf = HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF );
341 
342  if (( fcfg1OscConf & FCFG1_OSC_CONF_HPOSC_OPTION ) == 0 ) {
343  // This is a HPOSC chip, apply HPOSC settings
344  // Set bit DDI_0_OSC_CTL0_HPOSC_MODE_EN (this is bit 14 in DDI_0_OSC_O_CTL0)
346 
354 
367  break;
368  }
369  // Not a HPOSC chip - fall through to default
370  default :
371  // XOSC source is a 24 MHz crystal (default)
372  // Set bit DDI_0_OSC_CTL0_XTAL_IS_24M (this is bit 31 in DDI_0_OSC_O_CTL0)
374  break;
375  }
376 
377  // Set XOSC_HF in bypass mode if CCFG is configured for external TCXO
378  // Please note that it is up to the customer to make sure that the external clock source is up and running before XOSC_HF can be used.
381  }
382 
383  // Clear DDI_0_OSC_CTL0_CLK_LOSS_EN (ClockLossEventEnable()). This is bit 9 in DDI_0_OSC_O_CTL0.
384  // This is typically already 0 except on Lizard where it is set in ROM-boot
386 
387  // Setting DDI_0_OSC_CTL1_XOSC_HF_FAST_START according to value found in FCFG1
388  ui32Trim = SetupGetTrimForXoscHfFastStart();
389  HWREGB( AUX_DDI0_OSC_BASE + DDI_O_MASK4B + ( DDI_0_OSC_O_CTL1 * 2 )) = ( 0x30 | ui32Trim );
390 
391  // setup the LF clock based upon CCFG:MODE_CONF:SCLK_LF_OPTION
392  switch (( ccfg_ModeConfReg & CCFG_MODE_CONF_SCLK_LF_OPTION_M ) >> CCFG_MODE_CONF_SCLK_LF_OPTION_S ) {
393  case 0 : // XOSC_HF_DLF (XOSCHF/1536) -> SCLK_LF (=31250 Hz)
395  SetupSetAonRtcSubSecInc( 0x8637BD ); // RTC_INCREMENT = 2^38 / frequency
396  break;
397  case 1 : // EXTERNAL signal -> SCLK_LF (frequency=2^38/CCFG_EXT_LF_CLK_RTC_INCREMENT)
398  // Set SCLK_LF to use the same source as SCLK_HF
399  // Can be simplified a bit since possible return values for HF matches LF settings
400  currentHfClock = OSCClockSourceGet( OSC_SRC_CLK_HF );
401  OSCClockSourceSet( OSC_SRC_CLK_LF, currentHfClock );
402  while( OSCClockSourceGet( OSC_SRC_CLK_LF ) != currentHfClock ) {
403  // Wait until switched
404  }
405  ccfgExtLfClk = HWREG( CCFG_BASE + CCFG_O_EXT_LF_CLK );
409  IOC_STD_INPUT | IOC_HYST_ENABLE ); // Route external clock to AON IOC w/hysteresis
410  // Set XOSC_LF in bypass mode to allow external 32 kHz clock
412  // Fall through to set XOSC_LF as SCLK_LF source
413  case 2 : // XOSC_LF -> SLCK_LF (32768 Hz)
415  break;
416  default : // (=3) RCOSC_LF
418  break;
419  }
420 
421  // Update ADI_4_AUX_ADCREF1_VTRIM with value from FCFG1
422  HWREGB( AUX_ADI4_BASE + ADI_4_AUX_O_ADCREF1 ) =
427 
428  // Sync with AON
429  SysCtrlAonSync();
430 }
static void SysCtrlAonSync(void)
Sync all accesses to the AON register interface.
Definition: sys_ctrl.h:337
#define IOC_PORT_AON_CLK32K
Definition: ioc.h:170
uint32_t OSCClockSourceGet(uint32_t ui32SrcClk)
Get the source clock settings.
Definition: osc.c:158
#define IOC_STD_INPUT
Definition: ioc.h:318
#define OSC_SRC_CLK_HF
Definition: osc.h:118
#define OSC_XOSC_HF
Definition: osc.h:122
#define OSC_SRC_CLK_LF
Definition: osc.h:119
void SetupSetAonRtcSubSecInc(uint32_t subSecInc)
Doing the tricky stuff needed to enter new RTCSUBSECINC value.
Definition: setup_rom.c:929
#define OSC_RCOSC_LF
Definition: osc.h:123
void IOCPortConfigureSet(uint32_t ui32IOId, uint32_t ui32PortId, uint32_t ui32IOConfig)
Set the configuration of an IO port.
Definition: ioc.c:98
#define IOC_HYST_ENABLE
Definition: ioc.h:225
void OSCClockSourceSet(uint32_t ui32SrcClk, uint32_t ui32Osc)
Configure the oscillator input to the a source clock.
Definition: osc.c:121
uint32_t SetupGetTrimForXoscHfFastStart(void)
Returns the trim value to be used as OSC_DIG:CTL1.XOSC_HF_FAST_START.
Definition: setup_rom.c:795
#define OSC_XOSC_LF
Definition: osc.h:124

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.

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value from FCFG1.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

726 {
727  uint32_t getTrimForAdcShModeEnValue = 1; // Recommended default setting
728 
729  if ( ui32Fcfg1Revision >= 0x00000022 ) {
730  getTrimForAdcShModeEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
733  }
734 
735  return ( getTrimForAdcShModeEnValue );
736 }
uint32_t SetupGetTrimForAdcShVbufEn ( uint32_t  ui32Fcfg1Revision)

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

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value from FCFG1.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

745 {
746  uint32_t getTrimForAdcShVbufEnValue = 1; // Recommended default setting
747 
748  if ( ui32Fcfg1Revision >= 0x00000022 ) {
749  getTrimForAdcShVbufEnValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
752  }
753 
754  return ( getTrimForAdcShVbufEnValue );
755 }
uint32_t SetupGetTrimForAmpcompCtrl ( uint32_t  ui32Fcfg1Revision)

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

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

625 {
626  uint32_t ui32TrimValue ;
627  uint32_t ui32Fcfg1Value ;
628  uint32_t ibiasOffset ;
629  uint32_t ibiasInit ;
630  uint32_t modeConf1 ;
631  int32_t deltaAdjust ;
632 
633  // Use device specific trim values located in factory configuration
634  // area. Register bit fields without trim values in the factory
635  // configuration area will be set to the value of 0.
636  ui32Fcfg1Value = HWREG( FCFG1_BASE + FCFG1_O_AMPCOMP_CTRL1 );
637 
638  ibiasOffset = ( ui32Fcfg1Value &
641  ibiasInit = ( ui32Fcfg1Value &
644 
646  // Adjust with DELTA_IBIAS_OFFSET and DELTA_IBIAS_INIT from CCFG
647  modeConf1 = HWREG( CCFG_BASE + CCFG_O_MODE_CONF_1 );
648 
649  // Both fields are signed 4-bit values. This is an assumption when doing the sign extension.
650  deltaAdjust =
653  deltaAdjust += (int32_t)ibiasOffset;
654  if ( deltaAdjust < 0 ) {
655  deltaAdjust = 0;
656  }
659  }
660  ibiasOffset = (uint32_t)deltaAdjust;
661 
662  deltaAdjust =
663  (((int32_t)( modeConf1 << ( 32 - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_W - CCFG_MODE_CONF_1_DELTA_IBIAS_INIT_S )))
665  deltaAdjust += (int32_t)ibiasInit;
666  if ( deltaAdjust < 0 ) {
667  deltaAdjust = 0;
668  }
671  }
672  ibiasInit = (uint32_t)deltaAdjust;
673  }
674  ui32TrimValue = ( ibiasOffset << DDI_0_OSC_AMPCOMPCTL_IBIAS_OFFSET_S ) |
675  ( ibiasInit << DDI_0_OSC_AMPCOMPCTL_IBIAS_INIT_S ) ;
676 
677  ui32TrimValue |= (((ui32Fcfg1Value &
681  ui32TrimValue |= (((ui32Fcfg1Value &
685  ui32TrimValue |= (((ui32Fcfg1Value &
689 
690  if ( ui32Fcfg1Revision >= 0x00000022 ) {
691  ui32TrimValue |= ((( ui32Fcfg1Value &
695  }
696 
697  return(ui32TrimValue);
698 }
uint32_t SetupGetTrimForAmpcompTh1 ( void  )

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

Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

590 {
591  uint32_t ui32TrimValue;
592  uint32_t ui32Fcfg1Value;
593 
594  // Use device specific trim values located in factory configuration
595  // area. All defined register bit fields have a corresponding trim
596  // value in the factory configuration area
597  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH1);
598  ui32TrimValue = (((ui32Fcfg1Value &
602  ui32TrimValue |= (((ui32Fcfg1Value &
606  ui32TrimValue |= (((ui32Fcfg1Value &
610  ui32TrimValue |= (((ui32Fcfg1Value &
614 
615  return(ui32TrimValue);
616 }
uint32_t SetupGetTrimForAmpcompTh2 ( void  )

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

Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

555 {
556  uint32_t ui32TrimValue;
557  uint32_t ui32Fcfg1Value;
558 
559  // Use device specific trim value located in factory configuration
560  // area. All defined register bit fields have corresponding trim
561  // value in the factory configuration area
562  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_AMPCOMP_TH2);
563  ui32TrimValue = ((ui32Fcfg1Value &
567  ui32TrimValue |= (((ui32Fcfg1Value &
571  ui32TrimValue |= (((ui32Fcfg1Value &
575  ui32TrimValue |= (((ui32Fcfg1Value &
579 
580  return(ui32TrimValue);
581 }
uint32_t SetupGetTrimForAnabypassValue1 ( uint32_t  ccfg_ModeConfReg)

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

Parameters
ccfg_ModeConfRegis the value of the CCFG_O_MODE_CONF_1 register
Returns
Returns the trim value.

Referenced by OSC_AdjustXoscHfCapArray(), and SetupAfterColdResetWakeupFromShutDownCfg2().

439 {
440  uint32_t ui32Fcfg1Value ;
441  uint32_t ui32XoscHfRow ;
442  uint32_t ui32XoscHfCol ;
443  uint32_t ui32TrimValue ;
444 
445  // Use device specific trim values located in factory configuration
446  // area for the XOSC_HF_COLUMN_Q12 and XOSC_HF_ROW_Q12 bit fields in
447  // the ANABYPASS_VALUE1 register. Value for the other bit fields
448  // are set to 0.
449 
450  ui32Fcfg1Value = HWREG(FCFG1_BASE + FCFG1_O_CONFIG_OSC_TOP);
451  ui32XoscHfRow = (( ui32Fcfg1Value &
454  ui32XoscHfCol = (( ui32Fcfg1Value &
457 
458  if (( ccfg_ModeConfReg & CCFG_MODE_CONF_XOSC_CAP_MOD ) == 0 ) {
459  // XOSC_CAP_MOD = 0 means: CAP_ARRAY_DELTA is in use -> Apply compensation
460  // XOSC_CAPARRAY_DELTA is located in bit[15:8] of ccfg_ModeConfReg
461  // Note: HW_REV_DEPENDENT_IMPLEMENTATION. Field width is not given by
462  // a define and sign extension must therefore be hard coded.
463  // ( A small test program is created verifying the code lines below:
464  // Ref.: ..\test\small_standalone_test_programs\CapArrayDeltaAdjust_test.c)
465  int32_t i32CustomerDeltaAdjust =
466  (((int32_t)( ccfg_ModeConfReg << ( 32 - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_W - CCFG_MODE_CONF_XOSC_CAPARRAY_DELTA_S )))
468 
469  while ( i32CustomerDeltaAdjust < 0 ) {
470  ui32XoscHfCol >>= 1; // COL 1 step down
471  if ( ui32XoscHfCol == 0 ) { // if COL below minimum
472  ui32XoscHfCol = 0xFFFF; // Set COL to maximum
473  ui32XoscHfRow >>= 1; // ROW 1 step down
474  if ( ui32XoscHfRow == 0 ) { // if ROW below minimum
475  ui32XoscHfRow = 1; // Set both ROW and COL
476  ui32XoscHfCol = 1; // to minimum
477  }
478  }
479  i32CustomerDeltaAdjust++;
480  }
481  while ( i32CustomerDeltaAdjust > 0 ) {
482  ui32XoscHfCol = ( ui32XoscHfCol << 1 ) | 1; // COL 1 step up
483  if ( ui32XoscHfCol > 0xFFFF ) { // if COL above maximum
484  ui32XoscHfCol = 1; // Set COL to minimum
485  ui32XoscHfRow = ( ui32XoscHfRow << 1 ) | 1; // ROW 1 step up
486  if ( ui32XoscHfRow > 0xF ) { // if ROW above maximum
487  ui32XoscHfRow = 0xF; // Set both ROW and COL
488  ui32XoscHfCol = 0xFFFF; // to maximum
489  }
490  }
491  i32CustomerDeltaAdjust--;
492  }
493  }
494 
495  ui32TrimValue = (( ui32XoscHfRow << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_ROW_Q12_S ) |
496  ( ui32XoscHfCol << DDI_0_OSC_ANABYPASSVAL1_XOSC_HF_COLUMN_Q12_S ) );
497 
498  return (ui32TrimValue);
499 }
uint32_t SetupGetTrimForDblrLoopFilterResetVoltage ( uint32_t  ui32Fcfg1Revision)

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

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value from FCFG1.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

707 {
708  uint32_t dblrLoopFilterResetVoltageValue = 0; // Reset value
709 
710  if ( ui32Fcfg1Revision >= 0x00000020 ) {
711  dblrLoopFilterResetVoltageValue = ( HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 ) &
714  }
715 
716  return ( dblrLoopFilterResetVoltageValue );
717 }
uint32_t SetupGetTrimForRadcExtCfg ( uint32_t  ui32Fcfg1Revision)

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

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

814 {
815  uint32_t getTrimForRadcExtCfgValue = 0x403F8000; // Recommended default setting
816  uint32_t fcfg1Data;
817 
818  if ( ui32Fcfg1Revision >= 0x00000020 ) {
819  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
820  getTrimForRadcExtCfgValue =
821  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HPM_IBIAS_WAIT_CNT_M ) >>
824 
825  getTrimForRadcExtCfgValue |=
826  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LPM_IBIAS_WAIT_CNT_M ) >>
829 
830  getTrimForRadcExtCfgValue |=
831  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_IDAC_STEP_M ) >>
834  }
835 
836  return ( getTrimForRadcExtCfgValue );
837 }
uint32_t SetupGetTrimForRcOscLfIBiasTrim ( uint32_t  ui32Fcfg1Revision)

Returns the FCFG1 OSC_CONF_ATESTLF_RCOSCLF_IBIAS_TRIM.

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value from FCFG1.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

846 {
847  uint32_t trimForRcOscLfIBiasTrimValue = 0; // Default value
848 
849  if ( ui32Fcfg1Revision >= 0x00000022 ) {
850  trimForRcOscLfIBiasTrimValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
853  }
854 
855  return ( trimForRcOscLfIBiasTrimValue );
856 }
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.

Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

508 {
509  uint32_t ui32TrimValue;
510 
511  // Use device specific trim values located in factory configuration
512  // area
513  ui32TrimValue =
518 
519  ui32TrimValue |=
524 
525  return(ui32TrimValue);
526 }
uint32_t SetupGetTrimForXoscHfCtl ( uint32_t  ui32Fcfg1Revision)

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

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

764 {
765  uint32_t getTrimForXoschfCtlValue = 0; // Recommended default setting
766  uint32_t fcfg1Data;
767 
768  if ( ui32Fcfg1Revision >= 0x00000020 ) {
769  fcfg1Data = HWREG( FCFG1_BASE + FCFG1_O_MISC_OTP_DATA_1 );
770  getTrimForXoschfCtlValue =
771  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_PEAK_DET_ITRIM_M ) >>
774 
775  getTrimForXoschfCtlValue |=
776  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_HP_BUF_ITRIM_M ) >>
779 
780  getTrimForXoschfCtlValue |=
781  ( ( ( fcfg1Data & FCFG1_MISC_OTP_DATA_1_LP_BUF_ITRIM_M ) >>
784  }
785 
786  return ( getTrimForXoschfCtlValue );
787 }
uint32_t SetupGetTrimForXoscHfFastStart ( void  )

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

Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg3().

796 {
797  uint32_t ui32XoscHfFastStartValue ;
798 
799  // Get value from FCFG1
800  ui32XoscHfFastStartValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
803 
804  return ( ui32XoscHfFastStartValue );
805 }
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.

Returns
Returns the trim value.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

535 {
536  uint32_t ui32TrimValue;
537 
538  // Use device specific trim value located in factory configuration
539  // area
540  ui32TrimValue =
544 
545  return(ui32TrimValue);
546 }
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.

Parameters
ui32Fcfg1Revisionis the value of the FCFG1_O_FCFG1_REVISION register
Returns
Returns XOSCLF_REGULATOR_TRIM and XOSCLF_CMIRRWR_RATIO as one packet.

Referenced by SetupAfterColdResetWakeupFromShutDownCfg2().

865 {
866  uint32_t trimForXoscLfRegulatorAndCmirrwrRatioValue = 0; // Default value for both fields
867 
868  if ( ui32Fcfg1Revision >= 0x00000022 ) {
869  trimForXoscLfRegulatorAndCmirrwrRatioValue = ( HWREG( FCFG1_BASE + FCFG1_O_OSC_CONF ) &
873  }
874 
875  return ( trimForXoscLfRegulatorAndCmirrwrRatioValue );
876 }
void SetupSetAonRtcSubSecInc ( uint32_t  subSecInc)

Doing the tricky stuff needed to enter new RTCSUBSECINC value.

Parameters
subSecInc
Returns
None

Referenced by OSC_HPOSCRtcCompensate(), and SetupAfterColdResetWakeupFromShutDownCfg3().

930 {
931  // Loading a new RTCSUBSECINC value is done in 5 steps:
932  // 1. Write bit[15:0] of new SUBSECINC value to AUX_SYSIF_O_RTCSUBSECINC0
933  // 2. Write bit[23:16] of new SUBSECINC value to AUX_SYSIF_O_RTCSUBSECINC1
935  // 4. Wait for AUX_SYSIF_RTCSUBSECINCCTL_UPD_ACK
939 
943 }
void SetupSetCacheModeAccordingToCcfgSetting ( void  )

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

Returns
None

Referenced by SetupTrimDevice().

885 {
886  // - Make sure to enable aggressive VIMS clock gating for power optimization
887  // Only for PG2 devices.
888  // - Enable cache prefetch enable as default setting
889  // (Slightly higher power consumption, but higher CPU performance)
890  // - IF ( CCFG_..._DIS_GPRAM == 1 )
891  // then: Enable cache (set cache mode = 1), even if set by ROM boot code
892  // (This is done because it's not set by boot code when running inside
893  // a debugger supporting the Halt In Boot (HIB) functionality).
894  // else: Set MODE_GPRAM if not already set (see inline comments as well)
895  uint32_t vimsCtlMode0 ;
896 
897  while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
898  // Do nothing - wait for an eventual ongoing mode change to complete.
899  // (There should typically be no wait time here, but need to be sure)
900  }
901 
902  // Note that Mode=0 is equal to MODE_GPRAM
903  vimsCtlMode0 = (( HWREG( VIMS_BASE + VIMS_O_CTL ) & ~VIMS_CTL_MODE_M ) | VIMS_CTL_DYN_CG_EN_M | VIMS_CTL_PREF_EN_M );
904 
905 
907  // Enable cache (and hence disable GPRAM)
908  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_CACHE );
909  } else if (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_GPRAM ) {
910  // GPRAM is enabled in CCFG but not selected
911  // Note: It is recommended to go via MODE_OFF when switching to MODE_GPRAM
912  HWREG( VIMS_BASE + VIMS_O_CTL ) = ( vimsCtlMode0 | VIMS_CTL_MODE_OFF );
913  while (( HWREG( VIMS_BASE + VIMS_O_STAT ) & VIMS_STAT_MODE_M ) != VIMS_STAT_MODE_OFF ) {
914  // Do nothing - wait for an eventual mode change to complete (This goes fast).
915  }
916  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
917  } else {
918  // Correct mode, but make sure PREF_EN and DYN_CG_EN always are set
919  HWREG( VIMS_BASE + VIMS_O_CTL ) = vimsCtlMode0;
920  }
921 }
static int32_t SetupSignExtendVddrTrimValue ( uint32_t  ui32VddrTrimVal)
inlinestatic

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

Parameters
ui32VddrTrimVal
Returns
Returns Sign extended VDDR_TRIM setting.

Referenced by SetupStepVddrTrimTo().

318 {
319  // The VDDR trim value is 5 bits representing the range from -10 to +21
320  // (where -10=0x16, -1=0x1F, 0=0x00, 1=0x01 and +21=0x15)
321  int32_t i32SignedVddrVal = ui32VddrTrimVal;
322  if ( i32SignedVddrVal > 0x15 ) {
323  i32SignedVddrVal -= 0x20;
324  }
325  return ( i32SignedVddrVal );
326 }
void SetupStepVddrTrimTo ( uint32_t  toCode)

Set VDDR boost mode (by setting VDDR_TRIM to FCFG1..VDDR_TRIM_HH and setting VDDS_BOD to max)

Parameters
toCodespecifies the target VDDR trim value. The input parameter toCode can be either the signed extended trim value or holding the trim code bits only.
Returns
None

Referenced by SetupAfterColdResetWakeupFromShutDownCfg1().

120 {
121  uint32_t pmctlResetctl_reg ;
122  int32_t targetTrim ;
123  int32_t currentTrim ;
124 
126  currentTrim = SetupSignExtendVddrTrimValue((
127  HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) &
130 
131  if ( targetTrim != currentTrim ) {
132  pmctlResetctl_reg = ( HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) & ~AON_PMCTL_RESETCTL_MCU_WARM_RESET_M );
133  if ( pmctlResetctl_reg & AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M ) {
134  HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = ( pmctlResetctl_reg & ~AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M );
135  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // Wait for VDDR_LOSS_EN setting to propagate
136  }
137 
138  while ( targetTrim != currentTrim ) {
139  HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative)
140 
141  if ( targetTrim > currentTrim ) currentTrim++;
142  else currentTrim--;
143 
144  HWREGB( ADI3_BASE + ADI_3_REFSYS_O_DCDCCTL0 ) = (
146  ((((uint32_t)currentTrim) << ADI_3_REFSYS_DCDCCTL0_VDDR_TRIM_S ) &
148  }
149 
150  HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative)
151 
152  if ( pmctlResetctl_reg & AON_PMCTL_RESETCTL_VDDR_LOSS_EN_M ) {
153  HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative)
154  HWREG( AON_RTC_BASE + AON_RTC_O_SYNCLF ); // Wait for next edge on SCLK_LF (positive or negative)
155  HWREG( AON_PMCTL_BASE + AON_PMCTL_O_RESETCTL ) = pmctlResetctl_reg;
156  HWREG( AON_RTC_BASE + AON_RTC_O_SYNC ); // And finally wait for VDDR_LOSS_EN setting to propagate
157  }
158  }
159 }
static int32_t SetupSignExtendVddrTrimValue(uint32_t ui32VddrTrimVal)
Sign extend the VDDR_TRIM setting (special format ranging from -10 to +21)
Definition: setup_rom.h:317

Here is the call graph for this function: