Corrected CDC class bootloader to fix a few bugs, changed address counter to store...
[pub/USBasp.git] / LUFA / Drivers / AT90USBXXX / AT90USBXXX67 / ADC.h
1 /*
2 LUFA Library
3 Copyright (C) Dean Camera, 2009.
4
5 dean [at] fourwalledcubicle [dot] com
6 www.fourwalledcubicle.com
7 */
8
9 /*
10 Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
11
12 Permission to use, copy, modify, and distribute this software
13 and its documentation for any purpose and without fee is hereby
14 granted, provided that the above copyright notice appear in all
15 copies and that both that the copyright notice and this
16 permission notice and warranty disclaimer appear in supporting
17 documentation, and that the name of the author not be used in
18 advertising or publicity pertaining to distribution of the
19 software without specific, written prior permission.
20
21 The author disclaim all warranties with regard to this
22 software, including all implied warranties of merchantability
23 and fitness. In no event shall the author be liable for any
24 special, indirect or consequential damages or any damages
25 whatsoever resulting from loss of use, data or profits, whether
26 in an action of contract, negligence or other tortious action,
27 arising out of or in connection with the use or performance of
28 this software.
29 */
30
31 /** \file
32 *
33 * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs.
34 *
35 * \note This file should not be included directly. It is automatically included as needed by the ADC driver
36 * dispatch header located in LUFA/Drivers/AT90USBXXX/ADC.h.
37 */
38
39 #ifndef __ADC_AT90USBXXX67_H__
40 #define __ADC_AT90USBXXX67_H__
41
42 /* Includes: */
43 #include <avr/io.h>
44 #include <stdbool.h>
45
46 #include "../../../Common/Common.h"
47
48 /* Enable C linkage for C++ Compilers: */
49 #if defined(__cplusplus)
50 extern "C" {
51 #endif
52
53 /* Preprocessor Checks: */
54 #if !defined(INCLUDE_FROM_ADC_H)
55 #error Do not include this file directly. Include LUFA/Drivers/AT90USBXXX/ADC.h instead.
56 #endif
57
58 /* Public Interface - May be used in end-application: */
59 /* Macros: */
60 /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations.
61 * The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and
62 * prescaler masks.
63 */
64 #define ADC_Init(mode) MACROS{ ADCSRA = ((1 << ADEN) | mode); }MACROE
65
66 /** Turns off the ADC. If this is called, any further ADC operations will require a call to the
67 * ADC_Init() macro before the ADC can be used again.
68 */
69 #define ADC_Off() MACROS{ ADCSRA = 0; }MACROE
70
71 /** Indicates if the ADC is enabled. This macro will return boolean true if the ADC subsystem is
72 * currently enabled, or false otherwise.
73 */
74 #define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false)
75
76 /** Indicates if the current ADC conversion is completed, or still in progress. This returns boolean
77 * false if the reading is still taking place, or true if the conversion is complete and ready to be
78 * read out with ADC_GetResult().
79 */
80 #define ADC_IsReadingComplete() (!(ADCSRA & (1 << ADSC)))
81
82 /** Returns the result of the last conversion, as a 16-bit wide integer. */
83 #define ADC_GetResult() ADC
84
85 /** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */
86 #define ADC_REFERENCE_AREF 0
87
88 /** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */
89 #define ADC_REFERENCE_AVCC (1 << REFS0)
90
91 /** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */
92 #define ADC_REFERENCE_INT2560MV ((1 << REFS1)| (1 << REFS0))
93
94 /** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the
95 * ADC_GetResult() macro contain the 8 most significant bits of the result. */
96 #define ADC_LEFT_ADJUSTED (1 << ADLAR)
97
98 /** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the
99 * ADC_GetResult() macro contain the 8 least significant bits of the result. */
100 #define ADC_RIGHT_ADJUSTED (0 << ADLAR)
101
102 /** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC
103 * is capable of at the given input clock speed. */
104 #define ADC_FREE_RUNNING (1 << ADATE)
105
106 /** Sets the ADC mode to single conversion, so that only a single conversion will take place before
107 * the ADC returns to idle. */
108 #define ADC_SINGLE_CONVERSION (0 << ADATE)
109
110 /** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */
111 #define ADC_PRESCALE_2 (1 << ADPS0)
112
113 /** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */
114 #define ADC_PRESCALE_4 (1 << ADPS1)
115
116 /** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */
117 #define ADC_PRESCALE_8 ((1 << ADPS0) | (1 << ADPS1))
118
119 /** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */
120 #define ADC_PRESCALE_16 (1 << ADPS2)
121
122 /** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */
123 #define ADC_PRESCALE_32 ((1 << ADPS2) | (1 << ADPS0))
124
125 /** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */
126 #define ADC_PRESCALE_64 ((1 << ADPS2) | (1 << ADPS1))
127
128 /** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */
129 #define ADC_PRESCALE_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))
130
131 /* Inline Functions: */
132 /** Configures the given ADC channel, ready for ADC conversions. This function sets the
133 * associated port pin as an input and disables the digital portion of the I/O to reduce
134 * power consumption.
135 *
136 * \param Channel ADC channel number to set up for conversions
137 */
138 static inline void ADC_SetupChannel(const uint8_t Channel)
139 {
140 DDRD &= ~(1 << Channel);
141 DIDR0 |= (1 << Channel);
142 }
143
144 /** Starts the reading of the given channel, but does not wait until the conversion has completed.
145 * Once executed, the conversion status can be determined via the ADC_IsReadingComplete() macro and
146 * the result read via the ADC_GetResult() macro.
147 *
148 * \param MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask
149 */
150 static inline void ADC_StartReading(const uint8_t MUXMask)
151 {
152 ADMUX = MUXMask;
153
154 ADCSRA |= (1 << ADSC);
155 }
156
157 /** Performs a complete single reading from channel, including a polling spinloop to wait for the
158 * conversion to complete, and the returning of the converted value.
159 *
160 * \param MUXMask Mask comprising of an ADC channel number, reference mask and adjustment mask
161 */
162 static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask) ATTR_WARN_UNUSED_RESULT;
163 static inline uint16_t ADC_GetChannelReading(const uint8_t MUXMask)
164 {
165 ADC_StartReading(MUXMask);
166
167 while (!(ADC_IsReadingComplete()));
168
169 return ADC_GetResult();
170 }
171
172 /* Disable C linkage for C++ Compilers: */
173 #if defined(__cplusplus)
174 }
175 #endif
176
177 #endif