aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrysn2012-02-26 03:40:18 +0100
committerchrysn2012-02-26 03:42:25 +0100
commit2275ed7b0c355920927be6709a87a0482a749eb2 (patch)
tree46e713cf69ca7a4535c202dc79f1dd67311920de
parent08918902ab8df5211516bc5771cb02b966cf19af (diff)
overhauled documentation
includes minor refactoring in example code and modification of how the generic and the tinygecko specific vector.h go together (bringing it in line with stm32/f1's memorymap.h)
-rw-r--r--Makefile2
-rw-r--r--examples/efm32/tinygecko/Makefile.include2
-rw-r--r--examples/efm32/tinygecko/efm32-tg-stk3300/miniblink/miniblink.c35
-rw-r--r--include/libopencm3/efm32/tinygecko/cmu.h30
-rw-r--r--include/libopencm3/efm32/tinygecko/devicerevision.h4
-rw-r--r--include/libopencm3/efm32/tinygecko/gpio.h52
-rw-r--r--include/libopencm3/efm32/tinygecko/vector.h14
-rw-r--r--include/libopencm3/efm32/vector.h24
-rw-r--r--lib/efm32/tinygecko/Makefile3
-rw-r--r--lib/efm32/tinygecko/vector.c2
10 files changed, 131 insertions, 37 deletions
diff --git a/Makefile b/Makefile
index 4e41096..07825ec 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ LIBDIR = $(DESTDIR)/$(PREFIX)/lib
SHAREDIR = $(DESTDIR)/$(PREFIX)/share/libopencm3/scripts
INSTALL = install
-TARGETS = stm32/f1 stm32/f2 stm32/f4 lpc13xx lm3s
+TARGETS = stm32/f1 stm32/f2 stm32/f4 lpc13xx lm3s efm32/tinygecko
# Be silent per default, but 'make V=1' will show all compiler calls.
ifneq ($(V),1)
diff --git a/examples/efm32/tinygecko/Makefile.include b/examples/efm32/tinygecko/Makefile.include
index 1ee8d49..76691ce 100644
--- a/examples/efm32/tinygecko/Makefile.include
+++ b/examples/efm32/tinygecko/Makefile.include
@@ -30,7 +30,7 @@ GDB = $(PREFIX)-gdb
#TOOLCHAIN_DIR := $(shell dirname `which $(CC)`)/../$(PREFIX)
TOOLCHAIN_DIR = ../../../../..
CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
- -fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F1
+ -fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD
LDSCRIPT ?= ${TOOLCHAIN_DIR}/lib/efm32/tinygecko/$(MCU).ld
LDFLAGS += -lc -lnosys -L$(TOOLCHAIN_DIR)/lib/efm32/tinygecko \
-T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
diff --git a/examples/efm32/tinygecko/efm32-tg-stk3300/miniblink/miniblink.c b/examples/efm32/tinygecko/efm32-tg-stk3300/miniblink/miniblink.c
index 3053626..0941add 100644
--- a/examples/efm32/tinygecko/efm32-tg-stk3300/miniblink/miniblink.c
+++ b/examples/efm32/tinygecko/efm32-tg-stk3300/miniblink/miniblink.c
@@ -21,11 +21,37 @@
#include <libopencm3/efm32/tinygecko/gpio.h>
#include <libopencm3/efm32/tinygecko/cmu.h>
+void led_setup(void);
+void led_toggle(void);
+
+/** @file
+ * Minimal example for making the User LED of the EFM32-TG-STK330 eval board blink.
+ */
+
+/**
+ * Toggle the User LED in an infinite loop, with time between the toggling
+ * determined by a busy loop stupidly counting up.
+ */
+
int main(void)
{
// FIXME: As of now, this doesn't work without x being volatile; an issue with linking?
volatile int x;
+ led_setup();
+
+ while(1) {
+ for(x = 0; x < 200000; ++x);
+ led_toggle();
+ };
+}
+
+/**
+ * Enable GPIO, and set up port D7 as an output pin.
+ */
+
+void led_setup(void)
+{
// Before GPIO works, according to d0034_efm32tg_reference_manual.pdf
// note in section 28.3.7, we'll have to enable GPIO in CMU_HFPERCLKEN0
@@ -36,10 +62,9 @@ int main(void)
// and 16.3 (called UIF_LED0)
GPIO_PD_MODEL = GPIO_MODE_PUSHPULL<<(7*4);
- GPIO_PD_DOUTSET = 1<<7;
+}
- while(1) {
- for(x = 0; x < 200000; ++x);
- GPIO_PD_DOUTTGL = 1<<7;
- };
+void led_toggle(void)
+{
+ GPIO_PD_DOUTTGL = 1<<7;
}
diff --git a/include/libopencm3/efm32/tinygecko/cmu.h b/include/libopencm3/efm32/tinygecko/cmu.h
index 38217ed..e690ebd 100644
--- a/include/libopencm3/efm32/tinygecko/cmu.h
+++ b/include/libopencm3/efm32/tinygecko/cmu.h
@@ -17,17 +17,29 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* this interface correspons to the description in
- * d0034_efm32tg_reference_manual.pdf section 11. */
+/** @file
+ *
+ * Definitions for the CMU (Clock Management Unit).
+ *
+ * This corresponds to the description in d0034_efm32tg_reference_manual.pdf
+ * section 11.
+ *
+ * @see CMU_registers
+ */
+/* FIXME: i'd prefer not to @see CMU_registers but have some direct link placed
+ * automatically from a file to its groups */
#ifndef LIBOPENCM3_EFM32_TINYGECKO_CMU_H
#define LIBOPENCM3_EFM32_TINYGECKO_CMU_H
#include <libopencm3/cm3/common.h>
-#define CMU_BASE 0x400C8000 /* according to d0034_efm32tg_reference_manual.pdf figure 5.2 */
+#define CMU_BASE 0x400C8000 /**< Register base address for the CMU according to d0034_efm32tg_reference_manual.pdf figure 5.2. */
-/* this is d0034_efm32tg_reference_manual.pdf section 11.4 */
+/** These definitions reflect d0034_efm32tg_reference_manual.pdf section 11.4.
+ *
+ * @defgroup CMU_registers CMU registers
+ * @{ */
#define CMU_CTRL MMIO32(CMU_BASE + 0x000)
#define CMU_HFCORECLKDIV MMIO32(CMU_BASE + 0x004)
@@ -58,8 +70,14 @@
#define CMU_ROUTE MMIO32(CMU_BASE + 0x080)
#define CMU_LOCK MMIO32(CMU_BASE + 0x084)
-/* this is incomplete because i'm impatient and want a working result
- * quickly */
+/** @} */
+
+/**
+ * This section is incomplete because i'm impatient and want a working result
+ * quickly
+ *
+ * @todo Include all bits and bit groups from the manual.
+ */
#define CMU_HFPERCLKEN0_GPIO (1<<6)
diff --git a/include/libopencm3/efm32/tinygecko/devicerevision.h b/include/libopencm3/efm32/tinygecko/devicerevision.h
index 83e0e0d..c7c64aa 100644
--- a/include/libopencm3/efm32/tinygecko/devicerevision.h
+++ b/include/libopencm3/efm32/tinygecko/devicerevision.h
@@ -1,3 +1,7 @@
+/* FIXME: proper documentation, see where this fits, if we need this at all
+ * etc. this was just a first attempt at implementing something easy with
+ * MMIO32. */
+
/* this implements d0034_efm32tg_reference_manual.pdf's 7.3.4 "Device Revision"
* section */
diff --git a/include/libopencm3/efm32/tinygecko/gpio.h b/include/libopencm3/efm32/tinygecko/gpio.h
index 3417eee..710651c 100644
--- a/include/libopencm3/efm32/tinygecko/gpio.h
+++ b/include/libopencm3/efm32/tinygecko/gpio.h
@@ -17,18 +17,36 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* this interface corresponds to the description in
- * d0034_efm32tg_reference_manual.pdf section 28. the interface tries to be
- * close to stm32/f1's gpio interface. */
+/** @file
+ *
+ * Definitions for the GPIO subsystem (General Purpose Input Output).
+ *
+ * This corresponds to the description in d0034_efm32tg_reference_manual.pdf
+ * section 28.
+ *
+ * @see GPIO_registers
+ * @see GPIO_MODE_values
+ */
+/* FIXME: i'd prefer not to @see CMU_registers but have some direct link placed
+ * automatically from a file to its groups */
#ifndef LIBOPENCM3_EFM32_TINYGECKO_GPIO_H
#define LIBOPENCM3_EFM32_TINYGECKO_GPIO_H
#include <libopencm3/cm3/common.h>
-#define GPIO_BASE 0x40006000 /* according to d0034_efm32tg_reference_manual.pdf figure 5.2 */
+#define GPIO_BASE 0x40006000 /**< Register base address for the GPIO according to d0034_efm32tg_reference_manual.pdf figure 5.2. */
-/* this is rather straight forward d0034_efm32tg_reference_manual.pdf section 28.4 */
+/** These definitions reflect d0034_efm32tg_reference_manual.pdf section 28.4
+ *
+ * The bulk of the registers defined here (like GPIO_PA_CTRL) will not be used
+ * inside the convenience functions, but are provided for direct access.
+ *
+ * @todo This section could profit from bit-banding.
+ *
+ * @defgroup GPIO_registers GPIO registers
+ * @{
+ */
#define GPIO_Px_CTRL_OFFSET 0x000
#define GPIO_Px_MODEL_OFFSET 0x004
#define GPIO_Px_MODEH_OFFSET 0x008
@@ -122,10 +140,24 @@
#define GPIO_EM4WUPOL MMIO32(GPIO_BASE + 0x138)
#define GPIO_EM4WUCAUSE MMIO32(GPIO_BASE + 0x13C)
-/* these are the modes defined for the MODEx fields in the MODEL/MODEH
- * registers, named as in d0034_efm32tg_reference_manual.pdf's sections
- * 28.5.2/28.5.3. for explanations of what they really do, rather see section
- * 28.3.1. */
+/** @} */
+
+/** These are the modes defined for the MODEx fields in the MODEL/MODEH
+ * registers.
+ *
+ * For example, to set the mode for the 3rd pin of port A to pushpull, set
+ * `GPIO_PA_MODEL = GPIO_MODE_PUSHPULL << (3*4);`.
+ *
+ * @todo Update the example as soon as there are convenience functions to do
+ * this properly.
+ *
+ * They are named as in d0034_efm32tg_reference_manual.pdf's sections
+ * 28.5.2/28.5.3. For explanations of what they really do, rather see section
+ * 28.3.1.
+ *
+ * @defgroup GPIO_MODE_values GPIO MODE values
+ * @{
+ */
#define GPIO_MODE_DISABLED 0
#define GPIO_MODE_INPUT 1
@@ -144,6 +176,8 @@
#define GPIO_MODE_WIREDANDDRIVEPULLUP 14
#define GPIO_MODE_WIREDANDDRIVEPULLUPFILTER 15
+/** @} */
+
//void gpio_set(u32 gpioport, u16 gpios);
//void gpio_clear(u32 gpioport, u16 gpios);
//void gpio_toggle(u32 gpioport, u16 gpios);
diff --git a/include/libopencm3/efm32/tinygecko/vector.h b/include/libopencm3/efm32/tinygecko/vector.h
index c609da3..1f2eeb7 100644
--- a/include/libopencm3/efm32/tinygecko/vector.h
+++ b/include/libopencm3/efm32/tinygecko/vector.h
@@ -1,11 +1,15 @@
-/* this implements d0002_efm32_cortex-m3_reference_manual.pdf's table 1.1's "number of interrupts" line. */
-
+/** @file
+ *
+ * Definitions for vector tables on Tiny Gecko systems.
+ *
+ * @see include/libopencm3/efm32/vector.h
+ *
+ * @todo The definitions of the individual IRQs will go here too.
+ * */
#ifndef LIBOPENCM3_EFM32_TINYGECKO_VECTOR_H
#define LIBOPENCM3_EFM32_TINYGECKO_VECTOR_H
-#define EFM32_VECTOR_NIRQ 23
-
-#include "../vector.h"
+#define EFM32_VECTOR_NIRQ 23 /**< See d0002_efm32_cortex-m3_reference_manual.pdf's table 1.1's "number of interrupts" line */
#endif
diff --git a/include/libopencm3/efm32/vector.h b/include/libopencm3/efm32/vector.h
index 96ca301..8a385ec 100644
--- a/include/libopencm3/efm32/vector.h
+++ b/include/libopencm3/efm32/vector.h
@@ -1,21 +1,29 @@
-/* this implements d0002_efm32_cortex-m3_reference_manual.pdf's figure 2.2.
+/** @file
*
- * the structure of the vector table is implemented independently of the vector
- * table, as it can be relocated to other memory locations too.
+ * Definitions for handling vector tables.
*
- * don't include this file directly; rather, include the family's vector.h
- * file, which defines the number of interrupts (EFM_VECTOR_NIRQ) from table
- * 1.1 */
+ * This implements d0002_efm32_cortex-m3_reference_manual.pdf's figure 2.2.
+ *
+ * The structure of the vector table is implemented independently of the system
+ * vector table starting at memory position 0x0, as it can be relocated to
+ * other memory locations too.
+ */
#ifndef LIBOPENCM3_EFM32_VECTOR_H
#define LIBOPENCM3_EFM32_VECTOR_H
#include <libopencm3/cm3/common.h>
-typedef void (*efm32_vector_table_entry_t)(void);
+#ifdef TINYGECKO
+# include <libopencm3/efm32/tinygecko/vector.h>
+#else
+# error "efm32 family not defined."
+#endif
+
+typedef void (*efm32_vector_table_entry_t)(void); /**< Type of an interrupt function. Only used to avoid hard-to-read function pointers in the efm32_vector_table_t struct. */
typedef struct {
- unsigned int *initial_sp_value;
+ unsigned int *initial_sp_value; /**< The value the stack pointer is set to initially */
efm32_vector_table_entry_t reset;
efm32_vector_table_entry_t nmi;
efm32_vector_table_entry_t hard_fault;
diff --git a/lib/efm32/tinygecko/Makefile b/lib/efm32/tinygecko/Makefile
index b785d4d..afe1e93 100644
--- a/lib/efm32/tinygecko/Makefile
+++ b/lib/efm32/tinygecko/Makefile
@@ -19,6 +19,7 @@
##
LIBNAME = libopencm3_efm32tinygecko
+FAMILY = TINYGECKO
PREFIX ?= arm-none-eabi
#PREFIX ?= arm-elf
@@ -26,7 +27,7 @@ CC = $(PREFIX)-gcc
AR = $(PREFIX)-ar
CFLAGS = -Os -g -Wall -Wextra -I../../../include -fno-common \
-mcpu=cortex-m3 -mthumb -Wstrict-prototypes \
- -ffunction-sections -fdata-sections -MD -DSTM32F1
+ -ffunction-sections -fdata-sections -MD -D$(FAMILY)
# ARFLAGS = rcsv
ARFLAGS = rcs
OBJS = vector.o devicerevision.o
diff --git a/lib/efm32/tinygecko/vector.c b/lib/efm32/tinygecko/vector.c
index 0a7c09f..624785e 100644
--- a/lib/efm32/tinygecko/vector.c
+++ b/lib/efm32/tinygecko/vector.c
@@ -18,7 +18,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <libopencm3/efm32/tinygecko/vector.h>
+#include <libopencm3/efm32/vector.h>
#define WEAK __attribute__ ((weak))