summaryrefslogtreecommitdiffstats
path: root/firmware/libs-device/osccal.h
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/libs-device/osccal.h')
-rw-r--r--firmware/libs-device/osccal.h35
1 files changed, 13 insertions, 22 deletions
diff --git a/firmware/libs-device/osccal.h b/firmware/libs-device/osccal.h
index bfc5530..af37a43 100644
--- a/firmware/libs-device/osccal.h
+++ b/firmware/libs-device/osccal.h
@@ -1,10 +1,10 @@
/* Name: osccal.h
* Author: Christian Starkjohann
* Creation Date: 2008-04-10
+ * Changes 2013-11-04 cpldcpu@gmail.com
* Tabsize: 4
* Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: osccal.h 762 2009-08-12 17:10:30Z cs $
*/
/*
@@ -14,31 +14,18 @@ oscillator so that the CPU runs at F_CPU (F_CPU is a macro which must be
defined when the module is compiled, best passed in the compiler command
line). The time reference is the USB frame clock of 1 kHz available
immediately after a USB RESET condition. Timing is done by counting CPU
-cycles, so all interrupts must be disabled while the calibration runs. For
-low level timing measurements, usbMeasureFrameLength() is called. This
-function must be enabled in usbconfig.h by defining
-USB_CFG_HAVE_MEASURE_FRAME_LENGTH to 1. It is recommended to call
-calibrateOscillator() from the reset hook in usbconfig.h:
-*/
+cycles, so all interrupts must be disabled while the calibration runs.
+The size optimized assembler implementation includes its own implementation
+of usbMeasureFrameLength. Therefore USB_CFG_HAVE_MEASURE_FRAME_LENGTH should
+be set to 0 to avoid including unused code sections. It is recommended to call
+calibrateOscillatorASM() from the reset hook in usbconfig.h by including osccal.h:
-#ifndef __ASSEMBLER__
-//extern void calibrateOscillator(void);
-extern void calibrateOscillatorASM(void);
-#endif
-//#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillator(); }
-#define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM(); }
+#include "osccal.h"
-/*
This routine is an alternative to the continuous synchronization described
in osctune.h.
-Algorithm used:
-calibrateOscillator() first does a binary search in the OSCCAL register for
-the best matching oscillator frequency. Then it does a next neighbor search
-to find the value with the lowest clock rate deviation. It is guaranteed to
-find the best match among neighboring values, but for version 5 oscillators
-(which have a discontinuous relationship between OSCCAL and frequency) a
-better match might be available in another OSCCAL region.
+Algorithm used: See osccalASM.x
Limitations:
This calibration algorithm may try OSCCAL values of up to 192 even if the
@@ -54,7 +41,11 @@ deviation! All other frequency modules require at least 0.2% precision.
#ifndef __OSCCAL_H_INCLUDED__
#define __OSCCAL_H_INCLUDED__
-//void calibrateOscillator(void);
+#ifndef __ASSEMBLER__
+ void calibrateOscillatorASM(void);
+# define USB_RESET_HOOK(resetStarts) if(!resetStarts){ calibrateOscillatorASM();}
+# define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
+#endif
/* This function calibrates the RC oscillator so that the CPU runs at F_CPU.
* It MUST be called immediately after the end of a USB RESET condition!
* Disable all interrupts during the call!