aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGareth McMullin2012-01-08 18:42:24 +1300
committerGareth McMullin2012-01-08 18:49:58 +1300
commit7e0de5b86b654842c85e38bd36b22fe4176068bf (patch)
tree5c65fd36619be039978ddb35ed789e91951d8a44
parent7c6317a426d118967a9a4d9d7f5149e6c5b8c764 (diff)
Inline GPIO functions and optimise for speed.
This gives a modest but measurable performance improvement.
-rw-r--r--src/Makefile6
-rw-r--r--src/include/swdptap.h4
-rw-r--r--src/stm32/Makefile.inc2
-rw-r--r--src/stm32/jtagtap.c3
-rw-r--r--src/stm32/platform.c3
-rw-r--r--src/stm32/platform.h21
-rw-r--r--src/stm32/swdptap.c9
7 files changed, 32 insertions, 16 deletions
diff --git a/src/Makefile b/src/Makefile
index fcaa42f..5e204f9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -7,9 +7,9 @@ VPATH += $(PROBE_HOST)
BUILDDATE := `date +"%Y%m%d"`
CFLAGS += -Wall -Wextra -Wno-pointer-sign -Wno-char-subscripts\
- -O0 -std=gnu99 -g3 -DBUILDDATE=\"$(BUILDDATE)\"\
+ -O2 -std=gnu99 -g3 -DBUILDDATE=\"$(BUILDDATE)\"\
-I. -Iinclude -I$(PROBE_HOST) \
- -DVERSION_SUFFIX=\"`../scripts/setlocalversion`\"
+ -DVERSION_SUFFIX=\"`../scripts/setlocalversion`\" -MD
SRC = gdb_if.c \
gdb_packet.c \
@@ -44,3 +44,5 @@ blackmagic: $(OBJ)
clean: host_clean
$(RM) *.o *~ blackmagic $(HOSTFILES)
+-include *.d
+
diff --git a/src/include/swdptap.h b/src/include/swdptap.h
index a6252dc..5bb0545 100644
--- a/src/include/swdptap.h
+++ b/src/include/swdptap.h
@@ -26,10 +26,6 @@
int swdptap_init(void);
void swdptap_reset(void);
-void swdptap_turnaround(uint8_t dir);
-uint8_t swdptap_bit_in(void);
-void swdptap_bit_out(uint8_t val);
-
uint32_t swdptap_seq_in(int ticks);
uint8_t swdptap_seq_in_parity(uint32_t *data, int ticks);
void swdptap_seq_out(uint32_t MS, int ticks);
diff --git a/src/stm32/Makefile.inc b/src/stm32/Makefile.inc
index ac8f4c6..79e4316 100644
--- a/src/stm32/Makefile.inc
+++ b/src/stm32/Makefile.inc
@@ -6,7 +6,7 @@ LIBOPENCM3 ?= /usr/local/arm-none-eabi
CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb -msoft-float -DSTM32F1 -I$(LIBOPENCM3)/include
LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20005000 \
-Wl,-T,stm32/blackmagic.ld -nostartfiles -lc -lnosys -Wl,-Map=mapfile \
- -mthumb -march=armv7 -mcpu=cortex-m3 -mfix-cortex-m3-ldrd -msoft-float -L$(LIBOPENCM3)/lib/stm32/f1
+ -mthumb -march=armv7 -mcpu=cortex-m3 -mfix-cortex-m3-ldrd -msoft-float -L$(LIBOPENCM3)/lib/stm32/f1 -Wl,-gc-sections
LDFLAGS = $(LDFLAGS_BOOT) -Wl,-Ttext=0x8002000
SRC += cdcacm.c \
diff --git a/src/stm32/jtagtap.c b/src/stm32/jtagtap.c
index ee00eef..4c5bbeb 100644
--- a/src/stm32/jtagtap.c
+++ b/src/stm32/jtagtap.c
@@ -20,7 +20,6 @@
/* This file implements the low-level JTAG TAP interface. */
-#include <libopencm3/stm32/f1/gpio.h>
#include <stdio.h>
#include "general.h"
@@ -37,7 +36,7 @@ int jtagtap_init(void)
gpio_port_write(GPIOA, 0x8180);
gpio_port_write(GPIOB, 0x0002);
- gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_10_MHZ,
+ gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, TMS_PIN);
/* Go to JTAG mode for SWJ-DP */
diff --git a/src/stm32/platform.c b/src/stm32/platform.c
index ba784c9..3923ed1 100644
--- a/src/stm32/platform.c
+++ b/src/stm32/platform.c
@@ -23,7 +23,6 @@
*/
#include <libopencm3/stm32/f1/rcc.h>
-#include <libopencm3/stm32/f1/gpio.h>
#include <libopencm3/stm32/systick.h>
#include <libopencm3/stm32/f1/scb.h>
#include <libopencm3/stm32/nvic.h>
@@ -63,7 +62,7 @@ int platform_init(void)
gpio_set_mode(USB_PU_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT,
USB_PU_PIN);
- gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_10_MHZ,
+ gpio_set_mode(JTAG_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL,
TMS_PIN | TCK_PIN | TDI_PIN);
diff --git a/src/stm32/platform.h b/src/stm32/platform.h
index af8e3b8..a9a1cca 100644
--- a/src/stm32/platform.h
+++ b/src/stm32/platform.h
@@ -32,6 +32,7 @@
#include "gdb_packet.h"
#define INCLUDE_UART_INTERFACE
+#define INLINE_GPIO
/* Important pin mappings for STM32 implementation:
*
@@ -116,5 +117,25 @@ int cdcacm_get_dtr(void);
#define sprintf siprintf
#define vasprintf vasiprintf
+#ifdef INLINE_GPIO
+static inline void _gpio_set(u32 gpioport, u16 gpios)
+{
+ GPIO_BSRR(gpioport) = gpios;
+}
+#define gpio_set _gpio_set
+
+static inline void _gpio_clear(u32 gpioport, u16 gpios)
+{
+ GPIO_BRR(gpioport) = gpios;
+}
+#define gpio_clear _gpio_clear
+
+static inline u16 _gpio_get(u32 gpioport, u16 gpios)
+{
+ return (u16)GPIO_IDR(gpioport) & gpios;
+}
+#define gpio_get _gpio_get
+#endif
+
#endif
diff --git a/src/stm32/swdptap.c b/src/stm32/swdptap.c
index 36f3448..8ac78b2 100644
--- a/src/stm32/swdptap.c
+++ b/src/stm32/swdptap.c
@@ -20,7 +20,6 @@
/* This file implements the low-level SW-DP interface. */
-#include <libopencm3/stm32/f1/gpio.h>
#include <stdio.h>
#include "general.h"
@@ -29,7 +28,7 @@
#include "gdb_packet.h"
-void swdptap_turnaround(uint8_t dir)
+static void swdptap_turnaround(uint8_t dir)
{
static uint8_t olddir = 0;
@@ -45,11 +44,11 @@ void swdptap_turnaround(uint8_t dir)
gpio_set(SWDP_PORT, SWCLK_PIN);
gpio_clear(SWDP_PORT, SWCLK_PIN);
if(!dir)
- gpio_set_mode(SWDP_PORT, GPIO_MODE_OUTPUT_10_MHZ,
+ gpio_set_mode(SWDP_PORT, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, SWDIO_PIN);
}
-uint8_t swdptap_bit_in(void)
+static uint8_t swdptap_bit_in(void)
{
uint8_t ret;
@@ -62,7 +61,7 @@ uint8_t swdptap_bit_in(void)
return ret;
}
-void swdptap_bit_out(uint8_t val)
+static void swdptap_bit_out(uint8_t val)
{
DEBUG("%d", val);