This group contains functions and definitions related to configuring and enabling/disabling on-chip PLLs.
A PLL will take an input signal (the source), optionally divide the frequency by a configurable divider, and then multiply the frequency by a configurable multiplier.
Some devices don't support input dividers; specifying any other divisor than 1 on these devices will result in an assertion failure. Other devices may have various restrictions to the frequency range of the input and output signals.
The following example shows how to configure and enable PLL0 using the default parameters specified using the configuration symbols listed above.
To configure, enable PLL0 using the default parameters and to disable a specific feature like Wide Bandwidth Mode (a UC3A3-specific PLL option.), you can use this initialization process.
When the last function call returns, PLL0 is ready to be used as the main system clock source.
Each PLL has a set of default parameters determined by the following configuration symbols in the application's configuration file:
These configuration symbols determine the result of calling pll_config_defaults() and pll_get_default_rate().
Data Structures | |
struct | pll_config |
Hardware-specific representation of PLL configuration. More... | |
Enumerations | |
enum | pll_source { PLL_SRC_RC2MHZ = OSC_PLLSRC_RC2M_gc, PLL_SRC_RC32MHZ = OSC_PLLSRC_RC32M_gc, PLL_SRC_XOSC = OSC_PLLSRC_XOSC_gc } |
PLL clock source. More... | |
Functions | |
static uint32_t | pll_get_default_rate_priv (enum pll_source src, unsigned int mul, unsigned int div) |
Return clock rate for specified PLL settings. More... | |
Chip-specific PLL characteristics | |
#define | NR_PLLS 1 |
Number of on-chip PLLs. More... | |
#define | PLL_MIN_HZ 10000000UL |
Minimum frequency that the PLL can generate. More... | |
#define | PLL_MAX_HZ 200000000UL |
Maximum frequency that the PLL can generate. More... | |
#define | PLL_NR_OPTIONS 0 |
Number of PLL option bits. More... | |
PLL configuration | |
static void | pll_config_init (struct pll_config *cfg, enum pll_source src, unsigned int div, unsigned int mul) |
Initialize PLL configuration from standard parameters. More... | |
static void | pll_config_read (struct pll_config *cfg, unsigned int pll_id) |
Read the currently active configuration of pll_id. More... | |
static void | pll_config_write (const struct pll_config *cfg, unsigned int pll_id) |
Activate the configuration cfg on pll_id. More... | |
#define | pll_get_default_rate(pll_id) |
Get the default rate in Hz of pll_id. More... | |
#define | pll_config_defaults(cfg, pll_id) |
Initialize PLL configuration using default parameters. More... | |
Interaction with the PLL hardware | |
static void | pll_enable (const struct pll_config *cfg, unsigned int pll_id) |
Activate the configuration cfg and enable PLL pll_id. More... | |
static void | pll_disable (unsigned int pll_id) |
Disable the PLL identified by pll_id. More... | |
static bool | pll_is_locked (unsigned int pll_id) |
Determine whether the PLL is locked or not. More... | |
static void | pll_enable_source (enum pll_source src) |
Enable the source of the pll. More... | |
static void | pll_enable_config_defaults (unsigned int pll_id) |
Enable the pll with the default configuration. More... | |
static int | pll_wait_for_lock (unsigned int pll_id) |
Wait for PLL pll_id to become locked. More... | |
#define NR_PLLS 1 |
Number of on-chip PLLs.
Referenced by pll_config_read(), pll_config_write(), pll_disable(), pll_enable(), pll_is_locked(), and pll_wait_for_lock().
#define pll_config_defaults | ( | cfg, | |
pll_id | |||
) |
Initialize PLL configuration using default parameters.
After this function returns, cfg will contain a configuration which will make the PLL run at (CONFIG_PLLx_MUL / CONFIG_PLLx_DIV) times the frequency of CONFIG_PLLx_SOURCE.
cfg | The PLL configuration to be initialized. |
pll_id | Use defaults for this PLL. |
#define pll_get_default_rate | ( | pll_id | ) |
Get the default rate in Hz of pll_id.
Referenced by sysclk_get_main_hz().
#define PLL_MAX_HZ 200000000UL |
Maximum frequency that the PLL can generate.
Referenced by pll_get_default_rate_priv().
#define PLL_MIN_HZ 10000000UL |
Minimum frequency that the PLL can generate.
Referenced by pll_get_default_rate_priv().
#define PLL_NR_OPTIONS 0 |
Number of PLL option bits.
enum pll_source |
|
inlinestatic |
Initialize PLL configuration from standard parameters.
cfg | The PLL configuration to be initialized. |
src | The oscillator to be used as input to the PLL. |
div | PLL input divider. |
mul | PLL loop divider (i.e. multiplier). |
References Assert, pll_config::ctrl, and PLL_SRC_RC32MHZ.
Referenced by main(), and pll_enable_config_defaults().
|
inlinestatic |
Read the currently active configuration of pll_id.
cfg | The configuration object into which to store the currently active configuration. |
pll_id | The ID of the PLL to be accessed. |
References Assert, pll_config::ctrl, and NR_PLLS.
|
inlinestatic |
Activate the configuration cfg on pll_id.
cfg | The configuration object representing the PLL configuration to be activated. |
pll_id | The ID of the PLL to be updated. |
References Assert, pll_config::ctrl, and NR_PLLS.
Referenced by pll_enable().
|
inlinestatic |
Disable the PLL identified by pll_id.
After this function is called, the PLL identified by pll_id will be disabled. The PLL configuration stored in hardware may be affected by this, so if the caller needs to restore the same configuration later, it should either do a pll_config_read() before disabling the PLL, or remember the last configuration written to the PLL.
pll_id | The ID of the PLL to be disabled. |
References Assert, cpu_irq_restore(), cpu_irq_save(), and NR_PLLS.
Referenced by main().
|
inlinestatic |
Activate the configuration cfg and enable PLL pll_id.
cfg | The PLL configuration to be activated. |
pll_id | The ID of the PLL to be enabled. |
References Assert, cpu_irq_restore(), cpu_irq_save(), NR_PLLS, and pll_config_write().
Referenced by main(), and pll_enable_config_defaults().
|
inlinestatic |
Enable the pll with the default configuration.
PLL is enabled, if the PLL is not already locked.
pll_id | The ID of the PLL to enable. |
References Assert, pll_config_init(), pll_enable(), pll_enable_source(), and pll_is_locked().
Referenced by sysclk_enable_usb(), and sysclk_init().
|
inlinestatic |
Enable the source of the pll.
The source is enabled, if the source is not already running.
src | The ID of the PLL source to enable. |
References Assert, osc_enable(), osc_enable_autocalibration(), OSC_ID_RC32MHZ, OSC_ID_USBSOF, OSC_ID_XOSC, osc_is_ready(), osc_wait_ready(), PLL_SRC_RC2MHZ, PLL_SRC_RC32MHZ, and PLL_SRC_XOSC.
Referenced by pll_enable_config_defaults().
|
inlinestatic |
Return clock rate for specified PLL settings.
src | ID of the PLL's reference source oscillator. |
mul | Multiplier for the PLL. |
div | Divisor for the PLL. |
Output | clock rate from PLL. |
References Assert, osc_get_rate(), OSC_ID_XOSC, PLL_MAX_HZ, PLL_MIN_HZ, PLL_SRC_RC2MHZ, PLL_SRC_RC32MHZ, and PLL_SRC_XOSC.
|
inlinestatic |
Determine whether the PLL is locked or not.
pll_id | The ID of the PLL to check. |
true | The PLL is locked and ready to use as a clock source |
false | The PLL is not yet locked, or has not been enabled. |
References Assert, and NR_PLLS.
Referenced by main(), pll_enable_config_defaults(), and pll_wait_for_lock().
|
inlinestatic |
Wait for PLL pll_id to become locked.
pll_id | The ID of the PLL to wait for. |
STATUS_OK | The PLL is now locked. |
ERR_TIMEOUT | Timed out waiting for PLL to become locked. |
References Assert, NR_PLLS, and pll_is_locked().