From 0c9d5d816639c2b4ebce2b234be52e6aac4275a7 Mon Sep 17 00:00:00 2001 From: bon@elektron.ikp.physik.tu-darmstadt.de Date: Mon, 6 Jan 2014 12:51:09 +0100 Subject: Add dfu bootloader update application and use absolute delay for stlink Hello, appended 3 patches - adds a dfu-bootloader appliaction - uses absolute delays when waiting for pull-up delays on the STLINK (hopefully fixes issue #30) Updating the dfu-bootloader by additional application is helpfull for the STLINK, as for flashing the bootloader by SWDb otherwise jumpers need to be soldered or external SWD is not possible. Use like: - dfu-util -s 0x08002000:leave -D dfu_upgrade.bin - dfu-util -s 0x08000000:leave -D blackmagic_dfu.bin - Push reset buttom and reconnect to enter new dfu bootloader - dfu-util -s 0x08002000:leave -D blackmagic.bin -- Uwe Bonnes bon@elektron.ikp.physik.tu-darmstadt.de Institut fuer Kernphysik Schlossgartenstrasse 9 64289 Darmstadt --------- Tel. 06151 162516 -------- Fax. 06151 164321 ---------- >From fae5022c304a8866f056ea66660ac7ce3809dcf8 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Sun, 20 Oct 2013 15:00:36 +0200 Subject: F1: Prepare to update dfu bootloader via DFU with additional application. --- src/platforms/stm32/dfucore.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'src/platforms/stm32/dfucore.c') diff --git a/src/platforms/stm32/dfucore.c b/src/platforms/stm32/dfucore.c index a01616f..85e5e87 100644 --- a/src/platforms/stm32/dfucore.c +++ b/src/platforms/stm32/dfucore.c @@ -121,6 +121,14 @@ static const char *usb_strings[] = { DFU_IFACE_STRING, }; +static const char *usb_strings_upd[] = { + "Black Sphere Technologies", + BOARD_IDENT_UPD, + serial_no, + /* This string is used by ST Microelectronics' DfuSe utility */ + UPD_IFACE_STRING, +}; + static uint32_t get_le32(const void *vp) { const uint8_t *p = vp; @@ -158,8 +166,8 @@ usbdfu_getstatus_complete(usbd_device *dev, struct usb_setup_data *req) flash_unlock(); if(prog.blocknum == 0) { uint32_t addr = get_le32(prog.buf + 1); - if (addr < APP_ADDRESS || - (addr >= max_address)) { + if (addr < app_address || + (addr >= max_address)) { flash_lock(); usbd_ep_stall_set(dev, 0, 1); return; @@ -251,11 +259,12 @@ static int usbdfu_control_request(usbd_device *dev, return 0; } -void dfu_init(const usbd_driver *driver) +void dfu_init(const usbd_driver *driver, dfu_mode_t mode) { get_dev_unique_id(serial_no); - usbdev = usbd_init(driver, &dev, &config, usb_strings, 4, + usbdev = usbd_init(driver, &dev, &config, + (mode == DFU_MODE)?usb_strings:usb_strings_upd, 4, usbd_control_buffer, sizeof(usbd_control_buffer)); usbd_register_control_callback(usbdev, -- cgit v1.2.3