From e388056fda84a5c85430f5a31a4cfe3af3f2e35f Mon Sep 17 00:00:00 2001 From: chrysn Date: Fri, 2 Mar 2012 21:54:23 +0100 Subject: efm32: energy management unit headers and example --- include/libopencm3/efm32/tinygecko/emu.h | 125 +++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 include/libopencm3/efm32/tinygecko/emu.h (limited to 'include/libopencm3') diff --git a/include/libopencm3/efm32/tinygecko/emu.h b/include/libopencm3/efm32/tinygecko/emu.h new file mode 100644 index 0000000..07327fd --- /dev/null +++ b/include/libopencm3/efm32/tinygecko/emu.h @@ -0,0 +1,125 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2012 chrysn + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** @file + * @see EFM32TG_EMU + */ + +/** Definitions for the EMU subsystem (Energy Management Unit). + * + * This corresponds to the description in d0034_efm32tg_reference_manual.pdf + * section 10. + * + * @defgroup EFM32TG_EMU EFM32 Tiny Gecko EMU + * @{ + */ + +#ifndef LIBOPENCM3_EFM32_TINYGECKO_EMU_H +#define LIBOPENCM3_EFM32_TINYGECKO_EMU_H + +#include +#include + +/** Register definitions and register value definitions for the EMU subsystem + * + * @defgroup EFM32TG_EMU_regsandvals EFM32 Tiny Gecko EMU registers and values + * @{ + */ + +/** These definitions reflect d0034_efm32tg_reference_manual.pdf section 10.4 + * + * @defgroup EFM32TG_EMU_registers EFM32 Tiny Gecko EMU registers + * @{ + */ + +#define EMU_CTRL MMIO32(EMU_BASE + 0x000) /**< @see EFM32TG_EMU_CTRL_bits */ +#define EMU_LOCK MMIO32(EMU_BASE + 0x008) /**< @see EFM32TG_EMU_LOCK_values */ +#define EMU_AUXCTRL MMIO32(EMU_BASE + 0x024) /**< @see EFM32TG_EMU_AUXCTRL_bits */ + +/** @} */ + +/** Bit states for the EMU_CTRL register + * + * See d0034_efm32tg_reference_manual.pdf section 10.5.1 for definitions, and + * 10.3.2 for details (especially on why EM4CTRL_TWO and _THREE are defined). + * + * @defgroup EFM32TG_EMU_CTRL_bits EFM32 Tiny Gecko EMU CTRL bits + * @{ + */ + +#define EMU_CTRL_EM4CTRL_TWO (2<<2) +#define EMU_CTRL_EM4CTRL_THREE (3<<2) +#define EMU_CTRL_EM2BLOCK (1<<1) /**< When this bit is set, no mode lower than EM1 will be entered */ +#define EMU_CTRL_EMVREG (1<<0) /**< When this bit is set, the voltage regulator will stay on in modes lower than EM1 */ + +/** @} */ + +/** Values for the EMU_LOCK register + * + * See d0034_efm32tg_reference_manual.pdf section 10.5.2. There seems not to be + * another mention of it. + * + * @defgroup EFM32TG_EMU_LOCK_values EFM32 Tiny Gecko EMU LOCK values + * @{ + */ + +#define EMU_LOCK_IS_UNLOCKED 0 /**< When the LOCK register reads as this value, it is open */ +#define EMU_LOCK_IS_LOCKED 1 /**< When the LOCK register reads as this value, it is locked */ +#define EMU_LOCK_SET_LOCKED 0 /**< Write this to the LOCK register to lock the EMU */ +#define EMU_LOCK_SET_UNLOCKED 0xade8 /**< Write this to the LOCK register to unlock the EMU */ + +/** @} */ + +/** Bit states for the EMU_AUXCTRL register + * + * See d0034_efm32tg_reference_manual.pdf section 10.5.3 for definition, and + * 9.5.3 for details. + * + * @defgroup EFM32TG_EMU_AUXCTRL_bits EFM32 Tiny Gecko EMU AUXCTRL bits + * @{ + */ + +#define EMU_AUXCTRL_HRCCLR (1<<0) + +/** @} */ + +/** @} */ + +/** EMU convenience functions + * + * These functions can be used to send the chip to low energy modes. + * + * @todo Implement other sleep modes than EM1. Implement WFI vs WFE waits. + * + * @defgroup EFM32TG_EMU_convenience EFM32 Tiny Gecko EMU convenience functions + * @{ + */ + +/** Put the system into EM1 low energy mode. */ +static void emu_sleep_em1(void) +{ + /* FIXME: set SLEEPDEEP to 0 */ + __asm__("wfi"); +} + +/** @} */ + +/** @} */ + +#endif -- cgit v1.2.3