From 071e02c6b6b4837fa9cf0b6d4c749994e02638d7 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sat, 8 May 2010 03:12:14 +0000 Subject: Add svn:eol-style property to source files, so that the line endings are correctly converted to the target system's native end of line style. --- LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h | 680 ++++++++++++++++---------------- LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h | 298 +++++++------- 2 files changed, 489 insertions(+), 489 deletions(-) (limited to 'LUFA/Drivers/Peripheral/AVRU4U6U7') diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h index 5bf840b5a..00c18e786 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h +++ b/LUFA/Drivers/Peripheral/AVRU4U6U7/ADC.h @@ -1,340 +1,340 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief ADC peripheral driver for the U7, U6 and U4 USB AVRs. - * - * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. - * - * \note This file should not be included directly. It is automatically included as needed by the ADC driver - * dispatch header located in LUFA/Drivers/Peripheral/ADC.h. - */ - -/** \ingroup Group_ADC - * @defgroup Group_ADC_AVRU4U6U7 Series U4, U6 and U7 Model ADC Driver - * - * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. - * - * \note This file should not be included directly. It is automatically included as needed by the ADC driver - * dispatch header located in LUFA/Drivers/Peripheral/ADC.h. - * - * @{ - */ - -#ifndef __ADC_AVRU4U6U7_H__ -#define __ADC_AVRU4U6U7_H__ - - /* Includes: */ - #include "../../../Common/Common.h" - - #include - #include - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_ADC_H) - #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Macros: */ - /** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */ - #define ADC_REFERENCE_AREF 0 - - /** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */ - #define ADC_REFERENCE_AVCC (1 << REFS0) - - /** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */ - #define ADC_REFERENCE_INT2560MV ((1 << REFS1)| (1 << REFS0)) - - /** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the - * ADC_GetResult() macro contain the 8 most significant bits of the result. */ - #define ADC_LEFT_ADJUSTED (1 << ADLAR) - - /** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the - * ADC_GetResult() macro contain the 8 least significant bits of the result. */ - #define ADC_RIGHT_ADJUSTED (0 << ADLAR) - - /** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC - * is capable of at the given input clock speed. */ - #define ADC_FREE_RUNNING (1 << ADATE) - - /** Sets the ADC mode to single conversion, so that only a single conversion will take place before - * the ADC returns to idle. */ - #define ADC_SINGLE_CONVERSION (0 << ADATE) - - /** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */ - #define ADC_PRESCALE_2 (1 << ADPS0) - - /** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */ - #define ADC_PRESCALE_4 (1 << ADPS1) - - /** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */ - #define ADC_PRESCALE_8 ((1 << ADPS0) | (1 << ADPS1)) - - /** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */ - #define ADC_PRESCALE_16 (1 << ADPS2) - - /** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */ - #define ADC_PRESCALE_32 ((1 << ADPS2) | (1 << ADPS0)) - - /** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */ - #define ADC_PRESCALE_64 ((1 << ADPS2) | (1 << ADPS1)) - - /** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */ - #define ADC_PRESCALE_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)) - - //@{ - /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL0 (0x00 << MUX0) - - /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL1 (0x01 << MUX0) - - #if !(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) - /** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL2 (0x02 << MUX0) - - /** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL3 (0x03 << MUX0) - #endif - - /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL4 (0x04 << MUX0) - - /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL5 (0x05 << MUX0) - - /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL6 (0x06 << MUX0) - - /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_CHANNEL7 (0x07 << MUX0) - - /** MUX mask define for the internal 1.1V bandgap channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ - #define ADC_1100MV_BANDGAP (0x1E << MUX0) - - #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) - /** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL8 ((1 << 8) | (0x00 << MUX0)) - - /** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL9 ((1 << 8) | (0x01 << MUX0)) - - /** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL10 ((1 << 8) | (0x02 << MUX0)) - - /** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL11 ((1 << 8) | (0x03 << MUX0)) - - /** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL12 ((1 << 8) | (0x04 << MUX0)) - - /** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_CHANNEL13 ((1 << 8) | (0x05 << MUX0)) - - /** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading and - * \ref ADC_GetChannelReading. - * - * \note Not available on all AVR models. - */ - #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0)) - #endif - //@} - - /* Pseudo-Function Macros: */ - #if defined(__DOXYGEN__) - /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations. - * The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and - * prescaler masks. - * - * \param[in] Mode Mask of ADC settings, including adjustment, prescale, mode and reference - */ - static inline void ADC_Init(uint8_t Mode); - - /** Turns off the ADC. If this is called, any further ADC operations will require a call to - * \ref ADC_Init() before the ADC can be used again. - */ - static inline void ADC_ShutDown(void); - - /** Indicates if the ADC is currently enabled. - * - * \return Boolean true if the ADC subsystem is currently enabled, false otherwise. - */ - static inline bool ADC_GetStatus(void); - - /** Indicates if the current ADC conversion is completed, or still in progress. - * - * \return Boolean false if the reading is still taking place, or true if the conversion is - * complete and ready to be read out with \ref ADC_GetResult() - */ - static inline bool ADC_IsReadingComplete(void); - - /** Retrieves the conversion value of the last completed ADC conversion and clears the reading - * completion flag. - * - * \return The result of the last ADC conversion - */ - static inline uint16_t ADC_GetResult(void); - #else - #define ADC_Init(mode) MACROS{ ADCSRA = ((1 << ADEN) | mode); }MACROE - - #define ADC_ShutDown() MACROS{ ADCSRA = 0; }MACROE - - #define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false) - - #define ADC_IsReadingComplete() ((ADCSRA & (1 << ADIF)) ? true : false) - - #define ADC_GetResult() (ADCSRA |= (1 << ADIF), ADC) - #endif - - /* Inline Functions: */ - /** Configures the given ADC channel, ready for ADC conversions. This function sets the - * associated port pin as an input and disables the digital portion of the I/O to reduce - * power consumption. - * - * \note This must only be called for ADC channels with are connected to a physical port - * pin of the AVR, denoted by its special alternative function ADCx. - * \n\n - * - * \note The channel number must be specified as an integer, and NOT a ADC_CHANNELx mask. - * - * \param[in] Channel ADC channel number to set up for conversions - */ - static inline void ADC_SetupChannel(const uint8_t Channel) - { - #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ - defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ - defined(__AVR_ATmega32U6__)) - DDRF &= ~(1 << Channel); - DIDR0 |= (1 << Channel); - #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) - if (Channel < 8) - { - DDRF &= ~(1 << Channel); - DIDR0 |= (1 << Channel); - } - else if (Channel == 8) - { - DDRD &= ~(1 << 4); - DIDR2 |= (1 << 0); - } - else if (Channel < 11) - { - DDRD &= ~(1 << (Channel - 3)); - DIDR2 |= (1 << (Channel - 8)); - } - else - { - DDRB &= ~(1 << (Channel - 7)); - DIDR2 |= (1 << (Channel - 8)); - } - #endif - } - - /** Starts the reading of the given channel, but does not wait until the conversion has completed. - * Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and - * the result read via the \ref ADC_GetResult() macro. - * - * If the ADC has been initialized in free running mode, calling this function once will begin the repeated - * conversions. If the ADC is in single conversion mode (or the channel to convert from is to be changed), - * this function must be called each time a conversion is to take place. - * - * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask - */ - static inline void ADC_StartReading(const uint16_t MUXMask) - { - ADMUX = MUXMask; - - #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) - if (MUXMask & (1 << 8)) - ADCSRB |= (1 << MUX5); - else - ADCSRB &= ~(1 << MUX5); - #endif - - ADCSRA |= (1 << ADSC); - } - - /** Performs a complete single reading from channel, including a polling spin-loop to wait for the - * conversion to complete, and the returning of the converted value. - * - * \note For free running mode, the automated conversions should be initialized with a single call - * to \ref ADC_StartReading() to select the channel and begin the automated conversions, and - * the results read directly from the \ref ADC_GetResult() instead to reduce overhead. - * - * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask - */ - static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT; - static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) - { - ADC_StartReading(MUXMask); - - while (!(ADC_IsReadingComplete())); - - return ADC_GetResult(); - } - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief ADC peripheral driver for the U7, U6 and U4 USB AVRs. + * + * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * + * \note This file should not be included directly. It is automatically included as needed by the ADC driver + * dispatch header located in LUFA/Drivers/Peripheral/ADC.h. + */ + +/** \ingroup Group_ADC + * @defgroup Group_ADC_AVRU4U6U7 Series U4, U6 and U7 Model ADC Driver + * + * ADC driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * + * \note This file should not be included directly. It is automatically included as needed by the ADC driver + * dispatch header located in LUFA/Drivers/Peripheral/ADC.h. + * + * @{ + */ + +#ifndef __ADC_AVRU4U6U7_H__ +#define __ADC_AVRU4U6U7_H__ + + /* Includes: */ + #include "../../../Common/Common.h" + + #include + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_ADC_H) + #error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Macros: */ + /** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */ + #define ADC_REFERENCE_AREF 0 + + /** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */ + #define ADC_REFERENCE_AVCC (1 << REFS0) + + /** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */ + #define ADC_REFERENCE_INT2560MV ((1 << REFS1)| (1 << REFS0)) + + /** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the + * ADC_GetResult() macro contain the 8 most significant bits of the result. */ + #define ADC_LEFT_ADJUSTED (1 << ADLAR) + + /** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the + * ADC_GetResult() macro contain the 8 least significant bits of the result. */ + #define ADC_RIGHT_ADJUSTED (0 << ADLAR) + + /** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC + * is capable of at the given input clock speed. */ + #define ADC_FREE_RUNNING (1 << ADATE) + + /** Sets the ADC mode to single conversion, so that only a single conversion will take place before + * the ADC returns to idle. */ + #define ADC_SINGLE_CONVERSION (0 << ADATE) + + /** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */ + #define ADC_PRESCALE_2 (1 << ADPS0) + + /** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */ + #define ADC_PRESCALE_4 (1 << ADPS1) + + /** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */ + #define ADC_PRESCALE_8 ((1 << ADPS0) | (1 << ADPS1)) + + /** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */ + #define ADC_PRESCALE_16 (1 << ADPS2) + + /** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */ + #define ADC_PRESCALE_32 ((1 << ADPS2) | (1 << ADPS0)) + + /** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */ + #define ADC_PRESCALE_64 ((1 << ADPS2) | (1 << ADPS1)) + + /** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */ + #define ADC_PRESCALE_128 ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)) + + //@{ + /** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL0 (0x00 << MUX0) + + /** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL1 (0x01 << MUX0) + + #if !(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) + /** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL2 (0x02 << MUX0) + + /** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL3 (0x03 << MUX0) + #endif + + /** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL4 (0x04 << MUX0) + + /** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL5 (0x05 << MUX0) + + /** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL6 (0x06 << MUX0) + + /** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_CHANNEL7 (0x07 << MUX0) + + /** MUX mask define for the internal 1.1V bandgap channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ + #define ADC_1100MV_BANDGAP (0x1E << MUX0) + + #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) + /** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL8 ((1 << 8) | (0x00 << MUX0)) + + /** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL9 ((1 << 8) | (0x01 << MUX0)) + + /** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL10 ((1 << 8) | (0x02 << MUX0)) + + /** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL11 ((1 << 8) | (0x03 << MUX0)) + + /** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL12 ((1 << 8) | (0x04 << MUX0)) + + /** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_CHANNEL13 ((1 << 8) | (0x05 << MUX0)) + + /** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading and + * \ref ADC_GetChannelReading. + * + * \note Not available on all AVR models. + */ + #define ADC_INT_TEMP_SENS ((1 << 8) | (0x07 << MUX0)) + #endif + //@} + + /* Pseudo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Initializes the ADC, ready for conversions. This must be called before any other ADC operations. + * The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and + * prescaler masks. + * + * \param[in] Mode Mask of ADC settings, including adjustment, prescale, mode and reference + */ + static inline void ADC_Init(uint8_t Mode); + + /** Turns off the ADC. If this is called, any further ADC operations will require a call to + * \ref ADC_Init() before the ADC can be used again. + */ + static inline void ADC_ShutDown(void); + + /** Indicates if the ADC is currently enabled. + * + * \return Boolean true if the ADC subsystem is currently enabled, false otherwise. + */ + static inline bool ADC_GetStatus(void); + + /** Indicates if the current ADC conversion is completed, or still in progress. + * + * \return Boolean false if the reading is still taking place, or true if the conversion is + * complete and ready to be read out with \ref ADC_GetResult() + */ + static inline bool ADC_IsReadingComplete(void); + + /** Retrieves the conversion value of the last completed ADC conversion and clears the reading + * completion flag. + * + * \return The result of the last ADC conversion + */ + static inline uint16_t ADC_GetResult(void); + #else + #define ADC_Init(mode) MACROS{ ADCSRA = ((1 << ADEN) | mode); }MACROE + + #define ADC_ShutDown() MACROS{ ADCSRA = 0; }MACROE + + #define ADC_GetStatus() ((ADCSRA & (1 << ADEN)) ? true : false) + + #define ADC_IsReadingComplete() ((ADCSRA & (1 << ADIF)) ? true : false) + + #define ADC_GetResult() (ADCSRA |= (1 << ADIF), ADC) + #endif + + /* Inline Functions: */ + /** Configures the given ADC channel, ready for ADC conversions. This function sets the + * associated port pin as an input and disables the digital portion of the I/O to reduce + * power consumption. + * + * \note This must only be called for ADC channels with are connected to a physical port + * pin of the AVR, denoted by its special alternative function ADCx. + * \n\n + * + * \note The channel number must be specified as an integer, and NOT a ADC_CHANNELx mask. + * + * \param[in] Channel ADC channel number to set up for conversions + */ + static inline void ADC_SetupChannel(const uint8_t Channel) + { + #if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ + defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ + defined(__AVR_ATmega32U6__)) + DDRF &= ~(1 << Channel); + DIDR0 |= (1 << Channel); + #elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) + if (Channel < 8) + { + DDRF &= ~(1 << Channel); + DIDR0 |= (1 << Channel); + } + else if (Channel == 8) + { + DDRD &= ~(1 << 4); + DIDR2 |= (1 << 0); + } + else if (Channel < 11) + { + DDRD &= ~(1 << (Channel - 3)); + DIDR2 |= (1 << (Channel - 8)); + } + else + { + DDRB &= ~(1 << (Channel - 7)); + DIDR2 |= (1 << (Channel - 8)); + } + #endif + } + + /** Starts the reading of the given channel, but does not wait until the conversion has completed. + * Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and + * the result read via the \ref ADC_GetResult() macro. + * + * If the ADC has been initialized in free running mode, calling this function once will begin the repeated + * conversions. If the ADC is in single conversion mode (or the channel to convert from is to be changed), + * this function must be called each time a conversion is to take place. + * + * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask + */ + static inline void ADC_StartReading(const uint16_t MUXMask) + { + ADMUX = MUXMask; + + #if (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) + if (MUXMask & (1 << 8)) + ADCSRB |= (1 << MUX5); + else + ADCSRB &= ~(1 << MUX5); + #endif + + ADCSRA |= (1 << ADSC); + } + + /** Performs a complete single reading from channel, including a polling spin-loop to wait for the + * conversion to complete, and the returning of the converted value. + * + * \note For free running mode, the automated conversions should be initialized with a single call + * to \ref ADC_StartReading() to select the channel and begin the automated conversions, and + * the results read directly from the \ref ADC_GetResult() instead to reduce overhead. + * + * \param[in] MUXMask Mask comprising of an ADC channel mask, reference mask and adjustment mask + */ + static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT; + static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) + { + ADC_StartReading(MUXMask); + + while (!(ADC_IsReadingComplete())); + + return ADC_GetResult(); + } + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ diff --git a/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h b/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h index 990b44d14..f6a251710 100644 --- a/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h +++ b/LUFA/Drivers/Peripheral/AVRU4U6U7/TWI.h @@ -1,149 +1,149 @@ -/* - LUFA Library - Copyright (C) Dean Camera, 2010. - - dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com -*/ - -/* - Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the - software without specific, written prior permission. - - The author disclaim all warranties with regard to this - software, including all implied warranties of merchantability - and fitness. In no event shall the author be liable for any - special, indirect or consequential damages or any damages - whatsoever resulting from loss of use, data or profits, whether - in an action of contract, negligence or other tortious action, - arising out of or in connection with the use or performance of - this software. -*/ - -/** \file - * \brief TWI peripheral driver for the U7, U6 and U4 USB AVRs. - * - * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. - * - * \note This file should not be included directly. It is automatically included as needed by the TWI driver - * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. - */ - -/** \ingroup Group_TWI - * @defgroup Group_TWI_AVRU4U6U7 Series U4, U6 and U7 Model TWI Driver - * - * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. - * - * \note This file should not be included directly. It is automatically included as needed by the TWI driver - * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. - * - * @{ - */ - -#ifndef __TWI_AVRU4U6U7_H__ -#define __TWI_AVRU4U6U7_H__ - - /* Includes: */ - #include "../../../Common/Common.h" - - #include - #include - #include - #include - - /* Enable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - extern "C" { - #endif - - /* Preprocessor Checks: */ - #if !defined(__INCLUDE_FROM_TWI_H) - #error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. - #endif - - /* Public Interface - May be used in end-application: */ - /* Pseudo-Function Macros: */ - #if defined(__DOXYGEN__) - /** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be - * before any other TWI operations. - */ - static inline void TWI_Init(void); - - /** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to - * \ref TWI_Init() before the TWI can be used again. - */ - static inline void TWI_ShutDown(void); - #else - #define TWI_Init() MACROS{ TWCR |= (1 << TWEN); }MACROE - #define TWI_ShutDown() MACROS{ TWCR &= ~(1 << TWEN); }MACROE - #endif - - /* Inline Functions: */ - /** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. */ - static inline void TWI_StopTransmission(void) - { - TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN)); - } - - /** Sends a byte to the currently addressed device on the TWI bus. - * - * \param[in] Byte Byte to send to the currently addressed device - * - * \return Boolean true if the recipient ACKed the byte, false otherwise - */ - static inline bool TWI_SendByte(uint8_t Byte) - { - TWDR = Byte; - TWCR = ((1 << TWINT) | (1 << TWEN)); - while (!(TWCR & (1 << TWINT))); - - return ((TWSR & TW_STATUS_MASK) == TW_MT_DATA_ACK); - } - - /** Receives a byte from the currently addressed device on the TWI bus. - * - * \param[in] Byte Location where the read byte is to be stored - * \param[in] LastByte Indicates if the byte should be ACKed if false, NAKed if true - * - * \return Boolean true if the byte reception sucessfully completed, false otherwise - */ - static inline bool TWI_ReceiveByte(uint8_t* Byte, bool LastByte) - { - uint8_t TWCRMask = ((1 << TWINT) | (1 << TWEN)); - - if (!(LastByte)) - TWCRMask |= (1 << TWEA); - - TWCR = TWCRMask; - while (!(TWCR & (1 << TWINT))); - *Byte = TWDR; - - return ((TWSR & TW_STATUS_MASK) == TW_MR_DATA_ACK); - } - - /* Function Prototypes: */ - /** Begins a master mode TWI bus communication with the given slave device address. - * - * \param[in] SlaveAddress Address of the slave TWI device to communicate with - * \param[in] TimeoutMS Timeout period within which the slave must respond, in milliseconds - * - * \return Boolean true if the device is ready for data, false otherwise - */ - bool TWI_StartTransmission(uint8_t SlaveAddress, uint8_t TimeoutMS); - - /* Disable C linkage for C++ Compilers: */ - #if defined(__cplusplus) - } - #endif - -#endif - -/** @} */ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * \brief TWI peripheral driver for the U7, U6 and U4 USB AVRs. + * + * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * + * \note This file should not be included directly. It is automatically included as needed by the TWI driver + * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + */ + +/** \ingroup Group_TWI + * @defgroup Group_TWI_AVRU4U6U7 Series U4, U6 and U7 Model TWI Driver + * + * Master mode TWI driver for the AT90USB1287, AT90USB1286, AT90USB647, AT90USB646, ATMEGA16U4 and ATMEGA32U4 AVRs. + * + * \note This file should not be included directly. It is automatically included as needed by the TWI driver + * dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + * + * @{ + */ + +#ifndef __TWI_AVRU4U6U7_H__ +#define __TWI_AVRU4U6U7_H__ + + /* Includes: */ + #include "../../../Common/Common.h" + + #include + #include + #include + #include + + /* Enable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + extern "C" { + #endif + + /* Preprocessor Checks: */ + #if !defined(__INCLUDE_FROM_TWI_H) + #error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. + #endif + + /* Public Interface - May be used in end-application: */ + /* Pseudo-Function Macros: */ + #if defined(__DOXYGEN__) + /** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be + * before any other TWI operations. + */ + static inline void TWI_Init(void); + + /** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to + * \ref TWI_Init() before the TWI can be used again. + */ + static inline void TWI_ShutDown(void); + #else + #define TWI_Init() MACROS{ TWCR |= (1 << TWEN); }MACROE + #define TWI_ShutDown() MACROS{ TWCR &= ~(1 << TWEN); }MACROE + #endif + + /* Inline Functions: */ + /** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. */ + static inline void TWI_StopTransmission(void) + { + TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN)); + } + + /** Sends a byte to the currently addressed device on the TWI bus. + * + * \param[in] Byte Byte to send to the currently addressed device + * + * \return Boolean true if the recipient ACKed the byte, false otherwise + */ + static inline bool TWI_SendByte(uint8_t Byte) + { + TWDR = Byte; + TWCR = ((1 << TWINT) | (1 << TWEN)); + while (!(TWCR & (1 << TWINT))); + + return ((TWSR & TW_STATUS_MASK) == TW_MT_DATA_ACK); + } + + /** Receives a byte from the currently addressed device on the TWI bus. + * + * \param[in] Byte Location where the read byte is to be stored + * \param[in] LastByte Indicates if the byte should be ACKed if false, NAKed if true + * + * \return Boolean true if the byte reception sucessfully completed, false otherwise + */ + static inline bool TWI_ReceiveByte(uint8_t* Byte, bool LastByte) + { + uint8_t TWCRMask = ((1 << TWINT) | (1 << TWEN)); + + if (!(LastByte)) + TWCRMask |= (1 << TWEA); + + TWCR = TWCRMask; + while (!(TWCR & (1 << TWINT))); + *Byte = TWDR; + + return ((TWSR & TW_STATUS_MASK) == TW_MR_DATA_ACK); + } + + /* Function Prototypes: */ + /** Begins a master mode TWI bus communication with the given slave device address. + * + * \param[in] SlaveAddress Address of the slave TWI device to communicate with + * \param[in] TimeoutMS Timeout period within which the slave must respond, in milliseconds + * + * \return Boolean true if the device is ready for data, false otherwise + */ + bool TWI_StartTransmission(uint8_t SlaveAddress, uint8_t TimeoutMS); + + /* Disable C linkage for C++ Compilers: */ + #if defined(__cplusplus) + } + #endif + +#endif + +/** @} */ -- cgit v1.2.3