aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA/Platform/UC3/ClockManagement.h
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2012-06-21 20:21:06 +0000
committerDean Camera <dean@fourwalledcubicle.com>2012-06-21 20:21:06 +0000
commit532b3a18f1194a53c41e5b0689dc65791176ed65 (patch)
tree257f303828701bdfddfc89f9dda230f586bcf666 /LUFA/Platform/UC3/ClockManagement.h
parent8ccc2b2272564440cedc484b7c9cc8b5b7230ccf (diff)
downloadlufa-532b3a18f1194a53c41e5b0689dc65791176ed65.tar.gz
lufa-532b3a18f1194a53c41e5b0689dc65791176ed65.tar.bz2
lufa-532b3a18f1194a53c41e5b0689dc65791176ed65.zip
Add additional sanity checks to the inputs of several AVR32 platform clock management driver functions.
Diffstat (limited to 'LUFA/Platform/UC3/ClockManagement.h')
-rw-r--r--LUFA/Platform/UC3/ClockManagement.h25
1 files changed, 19 insertions, 6 deletions
diff --git a/LUFA/Platform/UC3/ClockManagement.h b/LUFA/Platform/UC3/ClockManagement.h
index 51cb0ff6d..ac2431476 100644
--- a/LUFA/Platform/UC3/ClockManagement.h
+++ b/LUFA/Platform/UC3/ClockManagement.h
@@ -231,6 +231,12 @@
const uint32_t SourceFreq,
const uint32_t Frequency)
{
+ if (Channel >= AVR32_PM_GCLK_NUM)
+ return false;
+
+ if (SourceFreq < Frequency)
+ return false;
+
switch (Source)
{
case CLOCK_SRC_OSC0:
@@ -253,9 +259,6 @@
return false;
}
- if (SourceFreq < Frequency)
- return false;
-
AVR32_PM.GCCTRL[Channel].diven = (SourceFreq > Frequency) ? true : false;
AVR32_PM.GCCTRL[Channel].div = (((SourceFreq / Frequency) - 1) / 2);
AVR32_PM.GCCTRL[Channel].cen = true;
@@ -266,11 +269,18 @@
/** Stops the given generic clock of the UC3 microcontroller.
*
* \param[in] Channel Index of the generic clock to stop.
+ *
+ * \return Boolean \c true if the generic clock was sucessfully stopped, \c false if invalid parameters specified.
*/
- static inline void AVR32CLK_StopGenericClock(const uint8_t Channel) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopGenericClock(const uint8_t Channel)
+ static inline bool AVR32CLK_StopGenericClock(const uint8_t Channel) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StopGenericClock(const uint8_t Channel)
{
+ if (Channel >= AVR32_PM_GCLK_NUM)
+ return false;
+
AVR32_PM.GCCTRL[Channel].cen = false;
+
+ return true;
}
/** Sets the clock source for the main microcontroller core. The given clock source should be configured
@@ -288,8 +298,11 @@
static inline bool AVR32CLK_SetCPUClockSource(const uint8_t Source,
const uint32_t SourceFreq)
{
- AVR32_FLASHC.FCR.fws = (SourceFreq > 30000000) ? true : false;
+ if (SourceFreq > AVR32_PM_CPU_MAX_FREQ)
+ return false;
+ AVR32_FLASHC.FCR.fws = (SourceFreq > AVR32_FLASHC_FWS_0_MAX_FREQ) ? true : false;
+
switch (Source)
{
#if defined(AVR32_PM_MCCTRL_MCSEL_SLOW)