avr-libc-dev
[Top][All Lists]
Advanced

[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_ */


reply via email to

[Prev in Thread] Current Thread [Next in Thread]