2003-01-14 Theodore A. Roth * include/avr/sleep.h: Make it work with any device (mostly). Index: include/avr/sleep.h =================================================================== RCS file: /cvsroot/avr-libc/avr-libc/include/avr/sleep.h,v retrieving revision 1.4 diff -u -r1.4 sleep.h --- include/avr/sleep.h 13 Jan 2003 18:24:47 -0000 1.4 +++ include/avr/sleep.h 14 Jan 2003 17:58:44 -0000 @@ -30,6 +30,17 @@ #include +/* Figure out which type of sleep mode the selected device uses (1, 2 or 3 + bits) */ + +#if defined(SM) && ! defined(SM0) && ! defined(SM1) && ! defined(SM2) +# define _SLEEP_TYPE 1 +#elif ! defined(SM) && defined(SM0) && defined(SM1) && ! defined(SM2) +# define _SLEEP_TYPE 2 +#elif ! defined(SM) && defined(SM0) && defined(SM1) && defined(SM2) +# define _SLEEP_TYPE 3 +#endif + /** \defgroup avr_sleep Power Management and Sleep Modes \code #include \endcode @@ -42,12 +53,20 @@ /* Mask of all the sleep mode bits. */ -#define SLEEP_MODE_MASK (_BV(SM0) | _BV(SM1) | _BV(SM2)) +#if _SLEEP_TYPE == 1 +# define _SLEEP_MODE_MASK _BV(SM) +#elif _SLEEP_TYPE == 2 +# define _SLEEP_MODE_MASK (_BV(SM0) | _BV(SM1)) +#elif _SLEEP_TYPE == 3 +# define _SLEEP_MODE_MASK (_BV(SM0) | _BV(SM1) | _BV(SM2)) +#else +# error "No SLEEP mode defined for device." +#endif /** \name Sleep Modes - \note FIXME: TRoth/2002-11-01: These modes were taken from the mega128 - datasheet and might not be applicable or correct for all devices. */ + \note Some of these modes are not available on all devices. See the + datasheet for target device for the available sleep modes. */ /* @{ */ @@ -56,6 +75,17 @@ Idle mode. */ #define SLEEP_MODE_IDLE 0 +#if _SLEEP_TYPE == 1 + +# define SLEEP_MODE_PWR_DOWN _BV(SM) + +#elif _SLEEP_TYPE == 2 + +# define SLEEP_MODE_PWR_DOWN _BV(SM1) +# define SLEEP_MODE_PWR_SAVE (_BV(SM0) | _BV(SM1)) + +#else /* _SLEEP_TYPE == 3 */ + /** \ingroup avr_sleep \def SLEEP_MODE_ADC ADC Noise Reduction Mode. */ @@ -81,6 +111,8 @@ Extended Standby Mode. */ #define SLEEP_MODE_EXT_STANDBY (_BV(SM0) | _BV(SM1) | _BV(SM2)) +#endif /* _SLEEP_TYPE == 3 */ + /* @} */ /** \name Sleep Functions */ @@ -94,7 +126,11 @@ #if defined(DOXYGEN) extern void set_sleep_mode (uint8_t mode); #else -#define set_sleep_mode(mode) (MCUCR = ((MCUCR & ~SLEEP_MODE_MASK) | (mode)) +# if defined (SMCR) +# define set_sleep_mode(mode) (SMCR = ((SMCR & ~SLEEP_MODE_MASK) | (mode)) +# else +# define set_sleep_mode(mode) (MCUCR = ((MCUCR & ~SLEEP_MODE_MASK) | (mode)) +# endif #endif /** \ingroup avr_sleep