Inline GPIO functions and optimise for speed.

This gives a modest but measurable performance improvement.
This commit is contained in:
Gareth McMullin 2012-01-08 18:42:24 +13:00
parent 7c6317a426
commit 7e0de5b86b
7 changed files with 32 additions and 16 deletions

View File

@ -7,9 +7,9 @@ VPATH += $(PROBE_HOST)
BUILDDATE := `date +"%Y%m%d"` BUILDDATE := `date +"%Y%m%d"`
CFLAGS += -Wall -Wextra -Wno-pointer-sign -Wno-char-subscripts\ 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) \ -I. -Iinclude -I$(PROBE_HOST) \
-DVERSION_SUFFIX=\"`../scripts/setlocalversion`\" -DVERSION_SUFFIX=\"`../scripts/setlocalversion`\" -MD
SRC = gdb_if.c \ SRC = gdb_if.c \
gdb_packet.c \ gdb_packet.c \
@ -44,3 +44,5 @@ blackmagic: $(OBJ)
clean: host_clean clean: host_clean
$(RM) *.o *~ blackmagic $(HOSTFILES) $(RM) *.o *~ blackmagic $(HOSTFILES)
-include *.d

View File

@ -26,10 +26,6 @@
int swdptap_init(void); int swdptap_init(void);
void swdptap_reset(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); uint32_t swdptap_seq_in(int ticks);
uint8_t swdptap_seq_in_parity(uint32_t *data, int ticks); uint8_t swdptap_seq_in_parity(uint32_t *data, int ticks);
void swdptap_seq_out(uint32_t MS, int ticks); void swdptap_seq_out(uint32_t MS, int ticks);

View File

@ -6,7 +6,7 @@ LIBOPENCM3 ?= /usr/local/arm-none-eabi
CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb -msoft-float -DSTM32F1 -I$(LIBOPENCM3)/include CFLAGS += -Istm32/include -mcpu=cortex-m3 -mthumb -msoft-float -DSTM32F1 -I$(LIBOPENCM3)/include
LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20005000 \ LDFLAGS_BOOT = -lopencm3_stm32f1 -Wl,--defsym,_stack=0x20005000 \
-Wl,-T,stm32/blackmagic.ld -nostartfiles -lc -lnosys -Wl,-Map=mapfile \ -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 LDFLAGS = $(LDFLAGS_BOOT) -Wl,-Ttext=0x8002000
SRC += cdcacm.c \ SRC += cdcacm.c \

View File

@ -20,7 +20,6 @@
/* This file implements the low-level JTAG TAP interface. */ /* This file implements the low-level JTAG TAP interface. */
#include <libopencm3/stm32/f1/gpio.h>
#include <stdio.h> #include <stdio.h>
#include "general.h" #include "general.h"
@ -37,7 +36,7 @@ int jtagtap_init(void)
gpio_port_write(GPIOA, 0x8180); gpio_port_write(GPIOA, 0x8180);
gpio_port_write(GPIOB, 0x0002); 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); GPIO_CNF_OUTPUT_PUSHPULL, TMS_PIN);
/* Go to JTAG mode for SWJ-DP */ /* Go to JTAG mode for SWJ-DP */

View File

@ -23,7 +23,6 @@
*/ */
#include <libopencm3/stm32/f1/rcc.h> #include <libopencm3/stm32/f1/rcc.h>
#include <libopencm3/stm32/f1/gpio.h>
#include <libopencm3/stm32/systick.h> #include <libopencm3/stm32/systick.h>
#include <libopencm3/stm32/f1/scb.h> #include <libopencm3/stm32/f1/scb.h>
#include <libopencm3/stm32/nvic.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, gpio_set_mode(USB_PU_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT,
USB_PU_PIN); 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, GPIO_CNF_OUTPUT_PUSHPULL,
TMS_PIN | TCK_PIN | TDI_PIN); TMS_PIN | TCK_PIN | TDI_PIN);

View File

@ -32,6 +32,7 @@
#include "gdb_packet.h" #include "gdb_packet.h"
#define INCLUDE_UART_INTERFACE #define INCLUDE_UART_INTERFACE
#define INLINE_GPIO
/* Important pin mappings for STM32 implementation: /* Important pin mappings for STM32 implementation:
* *
@ -116,5 +117,25 @@ int cdcacm_get_dtr(void);
#define sprintf siprintf #define sprintf siprintf
#define vasprintf vasiprintf #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 #endif

View File

@ -20,7 +20,6 @@
/* This file implements the low-level SW-DP interface. */ /* This file implements the low-level SW-DP interface. */
#include <libopencm3/stm32/f1/gpio.h>
#include <stdio.h> #include <stdio.h>
#include "general.h" #include "general.h"
@ -29,7 +28,7 @@
#include "gdb_packet.h" #include "gdb_packet.h"
void swdptap_turnaround(uint8_t dir) static void swdptap_turnaround(uint8_t dir)
{ {
static uint8_t olddir = 0; static uint8_t olddir = 0;
@ -45,11 +44,11 @@ void swdptap_turnaround(uint8_t dir)
gpio_set(SWDP_PORT, SWCLK_PIN); gpio_set(SWDP_PORT, SWCLK_PIN);
gpio_clear(SWDP_PORT, SWCLK_PIN); gpio_clear(SWDP_PORT, SWCLK_PIN);
if(!dir) 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); GPIO_CNF_OUTPUT_PUSHPULL, SWDIO_PIN);
} }
uint8_t swdptap_bit_in(void) static uint8_t swdptap_bit_in(void)
{ {
uint8_t ret; uint8_t ret;
@ -62,7 +61,7 @@ uint8_t swdptap_bit_in(void)
return ret; return ret;
} }
void swdptap_bit_out(uint8_t val) static void swdptap_bit_out(uint8_t val)
{ {
DEBUG("%d", val); DEBUG("%d", val);