[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[avr-libc-dev] RFC: New Power Management API
From: |
Eric Weddington |
Subject: |
[avr-libc-dev] RFC: New Power Management API |
Date: |
Tue, 18 Jul 2006 17:00:26 -0600 |
User-agent: |
Mozilla Thunderbird 1.0.2 (Windows/20050317) |
All,
Currently, avr-libc has a "Sleep and Power Management API" in sleep.h.
However, this is incomplete, in the sense that it only really provides a
"Sleep API". There are now many AVR devices that have individual power
management through a Power Reduction Register. This new API provides
macros to easily manipulate the Power Reduction Register in the AVR
devices that have it.
The new file would be <avr/power.h> and is attached for review. Note
that most of the Doxygen documentation is incomplete and will, of
course, be finished.
I would be very interested in seeing this API in the next WinAVR
release, which I am targeting for the next 4-6 weeks. To this end, I
have a question on whether it would be best to put this on the latest
branch as well as HEAD. Would it be time to go to, what is it? 1.6?
Questions? Comments?
Thanks
Eric Weddington
/* Copyright (c) 2006 Eric B. Weddington
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
* Neither the name of the copyright holders nor the names of
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE. */
/* $Id$ */
#ifndef _AVR_POWER_H_
#define _AVR_POWER_H_ 1
#include <avr/io.h>
#include <stdint.h>
/** \defgroup avr_power <avr/power.h>: Power Management
\code #include <avr/power.h>\endcode
*/
#if defined(__DOXYGEN__)
extern void power_adc_enable (void);
extern void power_adc_disable (void);
extern void power_lcd_enable (void);
extern void power_lcd_disable (void);
extern void power_psc0_enable (void);
extern void power_psc0_disable (void);
extern void power_psc1_enable (void);
extern void power_psc1_disable (void);
extern void power_psc2_enable (void);
extern void power_psc2_disable (void);
extern void power_spi_enable (void);
extern void power_spi_disable (void);
extern void power_timer0_enable (void);
extern void power_timer0_disable (void);
extern void power_timer1_enable (void);
extern void power_timer1_disable (void);
extern void power_timer2_enable (void);
extern void power_timer2_disable (void);
extern void power_timer3_enable (void);
extern void power_timer3_disable (void);
extern void power_timer4_enable (void);
extern void power_timer4_disable (void);
extern void power_timer5_enable (void);
extern void power_timer5_disable (void);
extern void power_twi_enable (void);
extern void power_twi_disable (void);
extern void power_usart_enable (void);
extern void power_usart_disable (void);
extern void power_usart0_enable (void);
extern void power_usart0_disable (void);
extern void power_usart1_enable (void);
extern void power_usart1_disable (void);
extern void power_usart2_enable (void);
extern void power_usart2_disable (void);
extern void power_usart3_enable (void);
extern void power_usart3_disable (void);
extern void power_usb_enable (void);
extern void power_usb_disable (void);
extern void power_usi_enable (void);
extern void power_usi_disable (void);
extern void power_vadc_enable (void);
extern void power_vadc_disable (void);
#elif defined(__AVR_ATmega640__) \
|| defined(__AVR_ATmega1280__) \
|| defined(__AVR_ATmega1281__) \
|| defined(__AVR_ATmega2560__) \
|| defined(__AVR_ATmega2561__)
#define power_adc_enable() PRR0 &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR0 |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR0 &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR0 |= (uint8_t)(1 << PRSPI)
#define power_twi_enable() PRR0 &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR0 |= (uint8_t)(1 << PRTWI)
#define power_timer0_enable() PRR0 &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR0 |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR0 &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR0 |= (uint8_t)(1 << PRTIM1)
#define power_timer2_enable() PRR0 &= (uint8_t)~(1 << PRTIM2)
#define power_timer2_disable() PRR0 |= (uint8_t)(1 << PRTIM2)
#define power_timer3_enable() PRR1 &= (uint8_t)~(1 << PRTIM3)
#define power_timer3_disable() PRR1 |= (uint8_t)(1 << PRTIM3)
#define power_timer4_enable() PRR1 &= (uint8_t)~(1 << PRTIM4)
#define power_timer4_disable() PRR1 |= (uint8_t)(1 << PRTIM4)
#define power_timer5_enable() PRR1 &= (uint8_t)~(1 << PRTIM5)
#define power_timer5_disable() PRR1 |= (uint8_t)(1 << PRTIM5)
#define power_usart0_enable() PRR0 &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR0 |= (uint8_t)(1 << PRUSART0)
#define power_usart1_enable() PRR1 &= (uint8_t)~(1 << PRUSART1)
#define power_usart1_disable() PRR1 |= (uint8_t)(1 << PRUSART1)
#define power_usart2_enable() PRR1 &= (uint8_t)~(1 << PRUSART2)
#define power_usart2_disable() PRR1 |= (uint8_t)(1 << PRUSART2)
#define power_usart3_enable() PRR1 &= (uint8_t)~(1 << PRUSART3)
#define power_usart3_disable() PRR1 |= (uint8_t)(1 << PRUSART3)
#elif defined(__AVR_AT90USB646__) \
|| defined(__AVR_AT90USB647__) \
|| defined(__AVR_AT90USB1286__) \
|| defined(__AVR_AT90USB1287__)
#define power_adc_enable() PRR0 &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR0 |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR0 &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR0 |= (uint8_t)(1 << PRSPI)
#define power_twi_enable() PRR0 &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR0 |= (uint8_t)(1 << PRTWI)
#define power_timer0_enable() PRR0 &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR0 |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR0 &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR0 |= (uint8_t)(1 << PRTIM1)
#define power_timer2_enable() PRR0 &= (uint8_t)~(1 << PRTIM2)
#define power_timer2_disable() PRR0 |= (uint8_t)(1 << PRTIM2)
#define power_timer3_enable() PRR1 &= (uint8_t)~(1 << PRTIM3)
#define power_timer3_disable() PRR1 |= (uint8_t)(1 << PRTIM3)
#define power_usart1_enable() PRR1 &= (uint8_t)~(1 << PRUSART1)
#define power_usart1_disable() PRR1 |= (uint8_t)(1 << PRUSART1)
#define power_usb_enable() PRR1 &= (uint8_t)~(1 << PRUSB)
#define power_usb_disable() PRR1 |= (uint8_t)(1 << PRUSB)
#elif defined(__AVR_AT90PWM1__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR |= (uint8_t)(1 << PRSPI)
#define power_timer0_enable() PRR &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
/* Power Stage Controller 0 */
#define power_psc0_enable() PRR &= (uint8_t)~(1 << PRPSC0)
#define power_psc0_disable() PRR |= (uint8_t)(1 << PRPSC0)
/* Power Stage Controller 1 */
#define power_psc1_enable() PRR &= (uint8_t)~(1 << PRPSC1)
#define power_psc1_disable() PRR |= (uint8_t)(1 << PRPSC1)
/* Power Stage Controller 2 */
#define power_psc2_enable() PRR &= (uint8_t)~(1 << PRPSC2)
#define power_psc2_disable() PRR |= (uint8_t)(1 << PRPSC2)
#elif defined(__AVR_AT90PWM2__) \
|| defined(__AVR_AT90PWM3__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR |= (uint8_t)(1 << PRSPI)
#define power_usart_enable() PRR &= (uint8_t)~(1 << PRUSART)
#define power_usart_disable() PRR |= (uint8_t)(1 << PRUSART)
#define power_timer0_enable() PRR &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
/* Power Stage Controller 0 */
#define power_psc0_enable() PRR &= (uint8_t)~(1 << PRPSC0)
#define power_psc0_disable() PRR |= (uint8_t)(1 << PRPSC0)
/* Power Stage Controller 1 */
#define power_psc1_enable() PRR &= (uint8_t)~(1 << PRPSC1)
#define power_psc1_disable() PRR |= (uint8_t)(1 << PRPSC1)
/* Power Stage Controller 2 */
#define power_psc2_enable() PRR &= (uint8_t)~(1 << PRPSC2)
#define power_psc2_disable() PRR |= (uint8_t)(1 << PRPSC2)
#elif defined(__AVR_ATmega165__) \
|| defined(__AVR_ATmega165P__) \
|| defined(__AVR_ATmega325__) \
|| defined(__AVR_ATmega3250__) \
|| defined(__AVR_ATmega645__) \
|| defined(__AVR_ATmega6450__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR |= (uint8_t)(1 << PRSPI)
#define power_usart0_enable() PRR &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR |= (uint8_t)(1 << PRUSART0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
#elif defined(__AVR_ATmega169__) \
|| defined(__AVR_ATmega169P__) \
|| defined(__AVR_ATmega329__) \
|| defined(__AVR_ATmega3290__) \
|| defined(__AVR_ATmega649__) \
|| defined(__AVR_ATmega6490__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR |= (uint8_t)(1 << PRSPI)
#define power_usart0_enable() PRR &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR |= (uint8_t)(1 << PRUSART0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
#define power_lcd_enable() PRR &= (uint8_t)~(1 << PRLCD)
#define power_lcd_disable() PRR |= (uint8_t)(1 << PRLCD)
#elif defined(__AVR_ATmega164P__) \
|| defined(__AVR_ATmega324P__)
#define power_adc_enable() PRR0 &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR0 |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR0 &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR0 |= (uint8_t)(1 << PRSPI)
#define power_usart0_enable() PRR0 &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR0 |= (uint8_t)(1 << PRUSART0)
#define power_usart1_enable() PRR0 &= (uint8_t)~(1 << PRUSART1)
#define power_usart1_disable() PRR0 |= (uint8_t)(1 << PRUSART1)
#define power_timer0_enable() PRR0 &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR0 |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR0 &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR0 |= (uint8_t)(1 << PRTIM1)
#define power_timer2_enable() PRR0 &= (uint8_t)~(1 << PRTIM2)
#define power_timer2_disable() PRR0 |= (uint8_t)(1 << PRTIM2)
#define power_twi_enable() PRR0 &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR0 |= (uint8_t)(1 << PRTWI)
#elif defined(__AVR_ATmega644__)
#define power_adc_enable() PRR0 &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR0 |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR0 &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR0 |= (uint8_t)(1 << PRSPI)
#define power_usart0_enable() PRR0 &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR0 |= (uint8_t)(1 << PRUSART0)
#define power_timer0_enable() PRR0 &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR0 |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR0 &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR0 |= (uint8_t)(1 << PRTIM1)
#define power_timer2_enable() PRR0 &= (uint8_t)~(1 << PRTIM2)
#define power_timer2_disable() PRR0 |= (uint8_t)(1 << PRTIM2)
#define power_twi_enable() PRR0 &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR0 |= (uint8_t)(1 << PRTWI)
#elif defined(__AVR_ATmega406__)
#define power_twi_enable() PRR0 &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR0 |= (uint8_t)(1 << PRTWI)
#define power_timer0_enable() PRR0 &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR0 |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR0 &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR0 |= (uint8_t)(1 << PRTIM1)
/* Voltage ADC */
#define power_vadc_enable() PRR0 &= (uint8_t)~(1 << PRVADC)
#define power_vadc_disable() PRR0 |= (uint8_t)(1 << PRVADC)
#elif defined(__AVR_ATmega48__) \
|| defined(__AVR_ATmega88__) \
|| defined(__AVR_ATmega168__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_spi_enable() PRR &= (uint8_t)~(1 << PRSPI)
#define power_spi_disable() PRR |= (uint8_t)(1 << PRSPI)
#define power_usart0_enable() PRR &= (uint8_t)~(1 << PRUSART0)
#define power_usart0_disable() PRR |= (uint8_t)(1 << PRUSART0)
#define power_timer0_enable() PRR &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
#define power_timer2_enable() PRR &= (uint8_t)~(1 << PRTIM2)
#define power_timer2_disable() PRR |= (uint8_t)(1 << PRTIM2)
#define power_twi_enable() PRR &= (uint8_t)~(1 << PRTWI)
#define power_twi_disable() PRR |= (uint8_t)(1 << PRTWI)
#elif defined(__AVR_ATtiny24__) \
|| defined(__AVR_ATtiny44__) \
|| defined(__AVR_ATtiny84__) \
|| defined(__AVR_ATtiny25__) \
|| defined(__AVR_ATtiny45__) \
|| defined(__AVR_ATtiny85__) \
|| defined(__AVR_ATtiny261__) \
|| defined(__AVR_ATtiny461__) \
|| defined(__AVR_ATtiny861__)
#define power_adc_enable() PRR &= (uint8_t)~(1 << PRADC)
#define power_adc_disable() PRR |= (uint8_t)(1 << PRADC)
#define power_timer0_enable() PRR &= (uint8_t)~(1 << PRTIM0)
#define power_timer0_disable() PRR |= (uint8_t)(1 << PRTIM0)
#define power_timer1_enable() PRR &= (uint8_t)~(1 << PRTIM1)
#define power_timer1_disable() PRR |= (uint8_t)(1 << PRTIM1)
/* Universal Serial Interface */
#define power_usi_enable() PRR &= (uint8_t)~(1 << PRUSI)
#define power_usi_disable() PRR |= (uint8_t)(1 << PRUSI)
#endif
#endif /* _AVR_POWER_H_ */
- [avr-libc-dev] RFC: New Power Management API,
Eric Weddington <=