diff options
| -rw-r--r-- | Makefile.include | 10 | ||||
| -rw-r--r-- | Makefile.rules | 18 | ||||
| -rw-r--r-- | app/Makefile (renamed from src/Makefile) | 7 | ||||
| -rw-r--r-- | app/dfu.c (renamed from src/dfu.c) | 38 | ||||
| -rw-r--r-- | app/keyboard.c (renamed from src/keyboard.c) | 0 | ||||
| -rw-r--r-- | app/kvm.c (renamed from src/kvm.c) | 12 | ||||
| -rw-r--r-- | app/kvm.ld | 43 | ||||
| -rw-r--r-- | app/main.c (renamed from src/main.c) | 4 | ||||
| -rw-r--r-- | app/mouse.c (renamed from src/mouse.c) | 0 | ||||
| -rw-r--r-- | app/project.h (renamed from src/project.h) | 0 | ||||
| -rw-r--r-- | app/prototypes.h (renamed from src/prototypes.h) | 0 | ||||
| -rw-r--r-- | app/ring.c (renamed from src/ring.c) | 0 | ||||
| -rw-r--r-- | app/ring.h (renamed from src/ring.h) | 0 | ||||
| -rw-r--r-- | app/tablet.c (renamed from src/tablet.c) | 0 | ||||
| -rw-r--r-- | app/usart.c (renamed from src/usart.c) | 2 | ||||
| -rw-r--r-- | app/usb.c (renamed from src/usb.c) | 0 | ||||
| -rw-r--r-- | board/STM32F103R_BOARD.cfg | 3 | ||||
| -rw-r--r-- | boot/Makefile | 32 | ||||
| -rw-r--r-- | boot/project.h | 23 | ||||
| -rw-r--r-- | boot/prototypes.h | 18 | ||||
| -rw-r--r-- | boot/usbdfu.c | 288 | ||||
| -rw-r--r-- | boot/usbdfu.ld (renamed from src/kvm.ld) | 9 | ||||
| -rw-r--r-- | interface/j-link.cfg | 5 | 
23 files changed, 485 insertions, 27 deletions
| diff --git a/Makefile.include b/Makefile.include index adfecf6..3eccc25 100644 --- a/Makefile.include +++ b/Makefile.include @@ -27,9 +27,13 @@ ARCH_FLAGS	= -mthumb -mcpu=cortex-m3 $(FP_FLAGS) -mfix-cortex-m3-ldrd  ################################################################################  # OpenOCD specific variables -OOCD		?= openocd -OOCD_INTERFACE	?= flossjtag -OOCD_BOARD	?= olimex_stm32_h103 +#OOCD		?= openocd +#OOCD_INTERFACE	?= flossjtag +#OOCD_BOARD	?= olimex_stm32_h103 + +OOCD            ?= openocd +OOCD_INTERFACE  ?= ../interface/j-link.cfg +OOCD_BOARD      ?= ../board/STM32F103R_BOARD.cfg  ################################################################################  # Black Magic Probe specific variables diff --git a/Makefile.rules b/Makefile.rules index b67e343..73bdf20 100644 --- a/Makefile.rules +++ b/Makefile.rules @@ -123,7 +123,7 @@ LDLIBS		+= -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group  ###############################################################################  ############################################################################### -.SUFFIXES: .elf .bin .hex .srec .list .map .images +.SUFFIXES: .elf .bin .hex .srec .list .map .images .dfu  .SECONDEXPANSION:  .SECONDARY: @@ -138,7 +138,7 @@ list: $(BINARY).list  images: $(BINARY).images  flash: $(BINARY).flash -%.images: %.bin %.hex %.srec %.list %.map +%.images: %.bin %.hex %.srec %.list %.map %.dfu  	@#printf "*** $* images generated ***\n"  %.bin: %.elf @@ -149,6 +149,10 @@ flash: $(BINARY).flash  	@#printf "  OBJCOPY $(*).hex\n"  	$(Q)$(OBJCOPY) -Oihex $(*).elf $(*).hex +%.dfu: %.elf +	@#printf "  OBJCOPY $(*).dfu\n" +	$(Q)$(OBJCOPY) -Obinary $(*).elf $(*).dfu +  %.srec: %.elf  	@#printf "  OBJCOPY $(*).srec\n"  	$(Q)$(OBJCOPY) -Osrec $(*).elf $(*).srec @@ -179,7 +183,7 @@ fish:  clean:  	@#printf "  CLEAN\n" -	$(Q)$(RM) *.o *.d *.elf *.bin *.hex *.srec *.list *.map *~ +	$(Q)$(RM) *.o *.d *.elf *.bin *.hex *.srec *.list *.map *~ *.dfu  stylecheck: $(STYLECHECKFILES:=.stylecheck)  styleclean: $(STYLECHECKFILES:=.styleclean) @@ -207,8 +211,8 @@ ifeq ($(OOCD_SERIAL),)  %.flash: %.hex  	@printf "  FLASH   $<\n"  	@# IMPORTANT: Don't use "resume", only "reset" will work correctly! -	$(Q)$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \ -		    -f board/$(OOCD_BOARD).cfg \ +	$(Q)$(OOCD) -f $(OOCD_INTERFACE) \ +		    -f $(OOCD_BOARD) \  		    -c "init" -c "reset init" \  		    -c "flash write_image erase $(*).hex" \  		    -c "reset" \ @@ -217,8 +221,8 @@ else  %.flash: %.hex  	@printf "  FLASH   $<\n"  	@# IMPORTANT: Don't use "resume", only "reset" will work correctly! -	$(Q)$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \ -		    -f board/$(OOCD_BOARD).cfg \ +	$(Q)$(OOCD) -f $(OOCD_INTERFACE) \ +		    -f $(OOCD_BOARD) \  		    -c "ft2232_serial $(OOCD_SERIAL)" \  		    -c "init" -c "reset init" \  		    -c "flash write_image erase $(*).hex" \ diff --git a/src/Makefile b/app/Makefile index f7f445a..08febc7 100644 --- a/src/Makefile +++ b/app/Makefile @@ -29,10 +29,15 @@ CSRCS=dfu.c mouse.c keyboard.c main.c usb.c  tablet.c usart.c kvm.c ring.c  BINARY = ${PROG}  OBJS = ${CSRCS:%.c=%.o} +${PROG}.dfu:${PROG}.elf +	${OBJCOPY} -Obinary $< $@ + +dfu:${PROG}.dfu +	dfu-util -R -a 0 -d 1d6b:0ee3 -s 0x08002000:leave -D $<  program: ${PROG}.elf  	echo halt | nc -t localhost 4444 -	echo flash write_image erase ${PWD}/$< | nc -t localhost 4444 +	echo flash write_image erase ${PWD}/$< 0x2000 | nc -t localhost 4444  	echo reset run | nc -t localhost 4444  protos: @@ -2,10 +2,12 @@  #ifdef INCLUDE_DFU_INTERFACE +extern uint32_t dfu_flag; +  const struct usb_dfu_descriptor dfu_function = {    .bLength = sizeof (struct usb_dfu_descriptor),    .bDescriptorType = DFU_FUNCTIONAL, -  .bmAttributes = USB_DFU_CAN_DOWNLOAD | USB_DFU_WILL_DETACH, +  .bmAttributes = USB_DFU_CAN_DOWNLOAD,    .wDetachTimeout = 255,    .wTransferSize = 1024,    .bcdDFUVersion = 0x011A, @@ -33,10 +35,8 @@ dfu_detach_complete (usbd_device * usbd_dev, struct usb_setup_data *req)    (void) req;    (void) usbd_dev; -  gpio_set_mode (GPIOA, GPIO_MODE_INPUT, 0, GPIO15); -  gpio_set_mode (GPIOA, GPIO_MODE_OUTPUT_2_MHZ, -                 GPIO_CNF_OUTPUT_PUSHPULL, GPIO10); -  gpio_set (GPIOA, GPIO10); +  dfu_flag = 0xfee1dead; +    scb_reset_core ();  } @@ -50,11 +50,33 @@ dfu_control_request (usbd_device * usbd_dev, struct usb_setup_data *req,    (void) len;    (void) usbd_dev; -  if ((req->bmRequestType != 0x21) || (req->bRequest != DFU_DETACH)) +  if ((req->bmRequestType & 0x7F) != 0x21)      return 0;                   /* Only accept class request. */ -  *complete = dfu_detach_complete; +  switch (req->bRequest) +    { +    case DFU_GETSTATUS: +      { +        (*buf)[0] = DFU_STATUS_OK; +        (*buf)[1] = 0; +        (*buf)[2] = 0; +        (*buf)[3] = 0; +        (*buf)[4] = STATE_APP_IDLE; +        (*buf)[5] = 0;          /* iString not used here */ +        *len = 6; +        return 1; +      } +    case DFU_GETSTATE: +      /* Return state with no state transision. */ +      *buf[0] = STATE_APP_IDLE; +      *len = 1; +      return 1; +    case DFU_DETACH: +      *complete = dfu_detach_complete; +      return 1; +    } + +  return 0; -  return 1;  }  #endif diff --git a/src/keyboard.c b/app/keyboard.c index e9046a3..e9046a3 100644 --- a/src/keyboard.c +++ b/app/keyboard.c @@ -21,13 +21,13 @@ void  kvm_dispatch (void)  {  #if 0 -          printf -            ("Addr %d, Write to ep %x, %d bytes %02x %02x %02x %02x ...\r\n", -             addr, endpoint, len, buf[0], buf[1], buf[2], buf[3]); +  printf +    ("Addr %d, Write to ep %x, %d bytes %02x %02x %02x %02x ...\r\n", +     addr, endpoint, len, buf[0], buf[1], buf[2], buf[3]);  #endif - if(len) -  usbd_ep_write_packet (usbd_dev, endpoint, buf, len); +  if (len) +    usbd_ep_write_packet (usbd_dev, endpoint, buf, len);  }  void @@ -52,7 +52,7 @@ kvm_recv (uint8_t d)      {      case STATE_SYNC:        if (d != 0x5a) -          break; +        break;        state = STATE_ADDR;        break;      case STATE_ENDPOINT: diff --git a/app/kvm.ld b/app/kvm.ld new file mode 100644 index 0000000..a2d5a9c --- /dev/null +++ b/app/kvm.ld @@ -0,0 +1,43 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +/* Linker script for Olimex STM32-H103 (STM32F103RBT6, 128K flash, 20K RAM). */ + +/* Define memory regions. */ +MEMORY +{ +	rom (rx) : ORIGIN = 0x08002000, LENGTH = 120K +	ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K +} + +/* Include the common ld script. */ +INCLUDE libopencm3_stm32f1.ld + +dfu_shared_location = ORIGIN(ram) + LENGTH(ram) - 1024; + +/* PROVIDE(_stack = dfu_shared_location ); */ + +SECTIONS +{ +	.dfu_shared dfu_shared_location :{ +		dfu_flag = .; +	} +} + + @@ -1,4 +1,5 @@  #include "project.h" +extern uint32_t dfu_flag;  void  sys_tick_handler (void) @@ -47,7 +48,8 @@ main (void)    gpio_clear (GPIOC, GPIO11); -  printf ("Hello world\r\n"); +  printf ("Hello world main=%p\r\n", main); +  printf ("dfu_flag=%08lx\r\n", dfu_flag);    usb_run (); diff --git a/src/mouse.c b/app/mouse.c index 6e0a207..6e0a207 100644 --- a/src/mouse.c +++ b/app/mouse.c diff --git a/src/project.h b/app/project.h index 0323569..0323569 100644 --- a/src/project.h +++ b/app/project.h diff --git a/src/prototypes.h b/app/prototypes.h index 0e971df..0e971df 100644 --- a/src/prototypes.h +++ b/app/prototypes.h diff --git a/src/tablet.c b/app/tablet.c index 1073b37..1073b37 100644 --- a/src/tablet.c +++ b/app/tablet.c diff --git a/src/usart.c b/app/usart.c index b0ea2a4..f510682 100644 --- a/src/usart.c +++ b/app/usart.c @@ -62,7 +62,7 @@ _write (int file, char *ptr, int len)  void  usart_queue (uint8_t d)  { -  ring_write_byte(&output_ring,d); +  ring_write_byte (&output_ring, d);    USART_CR1 (USART1) |= USART_CR1_TXEIE;  #if 0 diff --git a/board/STM32F103R_BOARD.cfg b/board/STM32F103R_BOARD.cfg new file mode 100644 index 0000000..6d1d72b --- /dev/null +++ b/board/STM32F103R_BOARD.cfg @@ -0,0 +1,3 @@ +# + +source [find target/stm32f1x.cfg] diff --git a/boot/Makefile b/boot/Makefile new file mode 100644 index 0000000..679662b --- /dev/null +++ b/boot/Makefile @@ -0,0 +1,32 @@ +## +## This file is part of the libopencm3 project. +## +## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de> +## +## This library is free software: you can redistribute it and/or modify +## it under the terms of the GNU Lesser General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This library 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 Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public License +## along with this library.  If not, see <http://www.gnu.org/licenses/>. +## + + +CSRCS=usbdfu.c +PROG = usbdfu + +CPROTO=cproto +V=1 +BINARY = ${PROG} +OBJS = ${CSRCS:%.c=%.o} + +include ../Makefile.include + +CFLAGS += -g + diff --git a/boot/project.h b/boot/project.h new file mode 100644 index 0000000..0323569 --- /dev/null +++ b/boot/project.h @@ -0,0 +1,23 @@ +#include <stdlib.h> +#include <libopencm3/stm32/rcc.h> +#include <libopencm3/stm32/gpio.h> +#include <libopencm3/stm32/usart.h> +#include <libopencm3/cm3/systick.h> +#include <libopencm3/cm3/nvic.h> +#include <libopencm3/usb/usbd.h> +#include <libopencm3/usb/hid.h> + +#define INCLUDE_DFU_INTERFACE + + +#ifdef INCLUDE_DFU_INTERFACE +#include <libopencm3/cm3/scb.h> +#include <libopencm3/usb/dfu.h> +#endif + +#include <stdio.h> +#include <errno.h> + +#include "ring.h" + +#include "prototypes.h" diff --git a/boot/prototypes.h b/boot/prototypes.h new file mode 100644 index 0000000..45d399c --- /dev/null +++ b/boot/prototypes.h @@ -0,0 +1,18 @@ +/* usbdfu.c */ +extern uint8_t usbd_control_buffer[1024]; +extern const struct usb_device_descriptor dev; +extern const struct usb_dfu_descriptor dfu_function; +extern const struct usb_interface_descriptor iface; +extern const struct usb_interface ifaces[]; +extern const struct usb_config_descriptor config; +extern int main(void); +/* ring.c */ +extern void ring_init(ring_t *r, uint8_t *buf, size_t len); +extern int ring_write_byte(ring_t *r, uint8_t c); +extern int ring_read_byte(ring_t *r, uint8_t *c); +extern int ring_write(ring_t *r, uint8_t *buf, size_t len); +/* usart.c */ +extern void usart1_isr(void); +extern int _write(int file, char *ptr, int len); +extern void usart_queue(uint8_t d); +extern void usart_init(void); diff --git a/boot/usbdfu.c b/boot/usbdfu.c new file mode 100644 index 0000000..33d48ec --- /dev/null +++ b/boot/usbdfu.c @@ -0,0 +1,288 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2010 Gareth McMullin <gareth@blacksphere.co.nz> + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <string.h> +#include <libopencm3/stm32/rcc.h> +#include <libopencm3/stm32/gpio.h> +#include <libopencm3/stm32/flash.h> +#include <libopencm3/cm3/scb.h> +#include <libopencm3/usb/usbd.h> +#include <libopencm3/usb/dfu.h> + +#define APP_ADDRESS	0x08002000 + +/* Commands sent with wBlockNum == 0 as per ST implementation. */ +#define CMD_SETADDR	0x21 +#define CMD_ERASE	0x41 + +void usb_set_config (usbd_device * usbd_dev, uint16_t wValue); + +/* We need a special large control buffer for this device: */ +uint8_t usbd_control_buffer[1024]; + +static enum dfu_state usbdfu_state = STATE_DFU_IDLE; + +extern uint32_t dfu_flag; + +static struct { +	uint8_t buf[sizeof(usbd_control_buffer)]; +	uint16_t len; +	uint32_t addr; +	uint16_t blocknum; +} prog; + +const struct usb_device_descriptor dev = { +	.bLength = USB_DT_DEVICE_SIZE, +	.bDescriptorType = USB_DT_DEVICE, +	.bcdUSB = 0x0200, +	.bDeviceClass = 0, +	.bDeviceSubClass = 0, +	.bDeviceProtocol = 0, +	.bMaxPacketSize0 = 64, +	.idVendor = 0x1d6b, +	.idProduct = 0x0ee3, +	.bcdDevice = 0x0200, +	.iManufacturer = 1, +	.iProduct = 2, +	.iSerialNumber = 3, +	.bNumConfigurations = 1, +}; + +const struct usb_dfu_descriptor dfu_function = { +	.bLength = sizeof(struct usb_dfu_descriptor), +	.bDescriptorType = DFU_FUNCTIONAL, +	.bmAttributes = USB_DFU_CAN_DOWNLOAD, +	.wDetachTimeout = 255, +	.wTransferSize = 1024, +	.bcdDFUVersion = 0x011A, +}; + +const struct usb_interface_descriptor iface = { +	.bLength = USB_DT_INTERFACE_SIZE, +	.bDescriptorType = USB_DT_INTERFACE, +	.bInterfaceNumber = 0, +	.bAlternateSetting = 0, +	.bNumEndpoints = 0, +	.bInterfaceClass = 0xFE, /* Device Firmware Upgrade */ +	.bInterfaceSubClass = 1, +	.bInterfaceProtocol = 2, + +	/* The ST Microelectronics DfuSe application needs this string. +	 * The format isn't documented... */ +	.iInterface = 4, + +	.extra = &dfu_function, +	.extralen = sizeof(dfu_function), +}; + +const struct usb_interface ifaces[] = {{ +	.num_altsetting = 1, +	.altsetting = &iface, +}}; + +const struct usb_config_descriptor config = { +	.bLength = USB_DT_CONFIGURATION_SIZE, +	.bDescriptorType = USB_DT_CONFIGURATION, +	.wTotalLength = 0, +	.bNumInterfaces = 1, +	.bConfigurationValue = 1, +	.iConfiguration = 0, +	.bmAttributes = 0xC0, +	.bMaxPower = 0x32, + +	.interface = ifaces, +}; + +static const char *usb_strings[] = { +  "Cabbages are good for you", +  "fish", +  "soup", +	/* This string is used by ST Microelectronics' DfuSe utility. */ +	"@Internal Flash   /0x08000000/8*001Ka,56*001Kg", +}; + +static uint8_t usbdfu_getstatus(usbd_device *usbd_dev, uint32_t *bwPollTimeout) +{ +	(void)usbd_dev; + +	switch (usbdfu_state) { +	case STATE_DFU_DNLOAD_SYNC: +		usbdfu_state = STATE_DFU_DNBUSY; +		*bwPollTimeout = 100; +		return DFU_STATUS_OK; +	case STATE_DFU_MANIFEST_SYNC: +		/* Device will reset when read is complete. */ +		usbdfu_state = STATE_DFU_MANIFEST; +		return DFU_STATUS_OK; +	default: +		return DFU_STATUS_OK; +	} +} + +static void usbdfu_getstatus_complete(usbd_device *usbd_dev, struct usb_setup_data *req) +{ +	int i; +	(void)req; +	(void)usbd_dev; + +	switch (usbdfu_state) { +	case STATE_DFU_DNBUSY: +		flash_unlock(); +		if (prog.blocknum == 0) { +			switch (prog.buf[0]) { +			case CMD_ERASE: +				{ +					uint32_t *dat = (uint32_t *)(prog.buf + 1); +					flash_erase_page(*dat); +				} +			case CMD_SETADDR: +				{ +					uint32_t *dat = (uint32_t *)(prog.buf + 1); +					prog.addr = *dat; +				} +			} +		} else { +			uint32_t baseaddr = prog.addr + ((prog.blocknum - 2) * +				       dfu_function.wTransferSize); +			for (i = 0; i < prog.len; i += 2) { +				uint16_t *dat = (uint16_t *)(prog.buf + i); +				flash_program_half_word(baseaddr + i, +						*dat); +			} +		} +		flash_lock(); + +		/* Jump straight to dfuDNLOAD-IDLE, skipping dfuDNLOAD-SYNC. */ +		usbdfu_state = STATE_DFU_DNLOAD_IDLE; +		return; +	case STATE_DFU_MANIFEST: +		/* USB device must detach, we just reset... */ +		scb_reset_system(); +		return; /* Will never return. */ +	default: +		return; +	} +} + +static int usbdfu_control_request(usbd_device *usbd_dev, struct usb_setup_data *req, uint8_t **buf, +		uint16_t *len, void (**complete)(usbd_device *usbd_dev, struct usb_setup_data *req)) +{ + +	if ((req->bmRequestType & 0x7F) != 0x21) +		return 0; /* Only accept class request. */ + +	switch (req->bRequest) { +	case DFU_DNLOAD: +		if ((len == NULL) || (*len == 0)) { +			usbdfu_state = STATE_DFU_MANIFEST_SYNC; +			return 1; +		} else { +			/* Copy download data for use on GET_STATUS. */ +			prog.blocknum = req->wValue; +			prog.len = *len; +			memcpy(prog.buf, *buf, *len); +			usbdfu_state = STATE_DFU_DNLOAD_SYNC; +			return 1; +		} +	case DFU_CLRSTATUS: +		/* Clear error and return to dfuIDLE. */ +		if (usbdfu_state == STATE_DFU_ERROR) +			usbdfu_state = STATE_DFU_IDLE; +		return 1; +	case DFU_ABORT: +		/* Abort returns to dfuIDLE state. */ +		usbdfu_state = STATE_DFU_IDLE; +		return 1; +	case DFU_UPLOAD: +		/* Upload not supported for now. */ +		return 0; +	case DFU_GETSTATUS: { +		uint32_t bwPollTimeout = 0; /* 24-bit integer in DFU class spec */ +		(*buf)[0] = usbdfu_getstatus(usbd_dev, &bwPollTimeout); +		(*buf)[1] = bwPollTimeout & 0xFF; +		(*buf)[2] = (bwPollTimeout >> 8) & 0xFF; +		(*buf)[3] = (bwPollTimeout >> 16) & 0xFF; +		(*buf)[4] = usbdfu_state; +		(*buf)[5] = 0; /* iString not used here */ +		*len = 6; +		*complete = usbdfu_getstatus_complete; +		return 1; +		} +	case DFU_GETSTATE: +		/* Return state with no state transision. */ +		*buf[0] = usbdfu_state; +		*len = 1; +		return 1; +	} + +	return 0; +} + +void +usb_set_config (usbd_device * usbd_dev, uint16_t wValue) +{ +  (void) wValue; +  (void) usbd_dev; +     +	usbd_register_control_callback( +				usbd_dev, +				USB_REQ_TYPE_CLASS | USB_REQ_TYPE_INTERFACE, +				USB_REQ_TYPE_TYPE | USB_REQ_TYPE_RECIPIENT, +				usbdfu_control_request); + +} + +int main(void) +{ +	usbd_device *usbd_dev; + +	rcc_periph_clock_enable(RCC_GPIOA); + +	if (dfu_flag!=0xfee1dead) { +		/* Boot the application if it's valid. */ +		if ((*(volatile uint32_t *)APP_ADDRESS & 0x2FFE0000) == 0x20000000) { +			/* Set vector table base address. */ +			SCB_VTOR = APP_ADDRESS & 0xFFFF; +			/* Initialise master stack pointer. */ +			asm volatile("msr msp, %0"::"g" +				     (*(volatile uint32_t *)APP_ADDRESS)); +			/* Jump to application. */ +			(*(void (**)())(APP_ADDRESS + 4))(); +		} +	} + +	dfu_flag=0; + +	rcc_clock_setup_in_hsi_out_48mhz(); + +	rcc_periph_clock_enable(RCC_GPIOC); + +	gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ, +		      GPIO_CNF_OUTPUT_PUSHPULL, GPIO11); +	gpio_set(GPIOC, GPIO11); + +	usbd_dev = usbd_init(&stm32f103_usb_driver, &dev, &config, usb_strings, 4, usbd_control_buffer, sizeof(usbd_control_buffer)); + +        usbd_register_set_config_callback (usbd_dev, usb_set_config); + +	gpio_clear(GPIOC, GPIO11); + +	while (1) +		usbd_poll(usbd_dev); +} diff --git a/src/kvm.ld b/boot/usbdfu.ld index e15beca..8680dc9 100644 --- a/src/kvm.ld +++ b/boot/usbdfu.ld @@ -29,3 +29,12 @@ MEMORY  /* Include the common ld script. */  INCLUDE libopencm3_stm32f1.ld +dfu_shared_location = ORIGIN(ram) + LENGTH(ram) - 1024; + +SECTIONS +{ +        .dfu_shared dfu_shared_location :{ +                dfu_flag = .; +        } +} + diff --git a/interface/j-link.cfg b/interface/j-link.cfg new file mode 100644 index 0000000..3e95768 --- /dev/null +++ b/interface/j-link.cfg @@ -0,0 +1,5 @@ +# +telnet_port 4444 +gdb_port 3333 + +source [find interface/jlink.cfg] | 
