From f345cd24dc2bf57ee4386ae506c876374ae4e9bd Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Mon, 25 Sep 2017 10:04:05 +1300 Subject: [PATCH 1/7] Update libopencm3 pointer --- libopencm3 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libopencm3 b/libopencm3 index 67242de6..db7a8d71 160000 --- a/libopencm3 +++ b/libopencm3 @@ -1 +1 @@ -Subproject commit 67242de60dec0227739cd549e8a78e1a3c15dbf5 +Subproject commit db7a8d71ca30dd9ce7947aa036897b910bdc4ad2 From 0ed66547d53afd08edf35a53f60a6162fac201ce Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Mon, 25 Sep 2017 10:27:29 +1300 Subject: [PATCH 2/7] Fix libopencm3 breakage --- src/platforms/f4discovery/platform.c | 2 +- src/platforms/hydrabus/platform.c | 3 +-- src/platforms/native/platform.c | 4 ++-- src/platforms/native/platform.h | 2 +- src/platforms/native/usbdfu.c | 2 +- src/platforms/stlink/dfu_upgrade.c | 2 +- src/platforms/stlink/platform.h | 2 +- src/platforms/stlink/stlink_common.c | 2 +- src/platforms/stlink/usbdfu.c | 2 +- src/platforms/stm32/traceswo.c | 2 +- src/platforms/stm32/usbuart.c | 2 +- src/platforms/swlink/platform.h | 2 +- src/platforms/swlink/usbdfu.c | 2 +- 13 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/platforms/f4discovery/platform.c b/src/platforms/f4discovery/platform.c index bc781e24..8e3b9d37 100644 --- a/src/platforms/f4discovery/platform.c +++ b/src/platforms/f4discovery/platform.c @@ -62,7 +62,7 @@ void platform_init(void) scb_reset_core(); } - rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_48MHZ]); + rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_48MHZ]); /* Enable peripherals */ rcc_periph_clock_enable(RCC_OTGFS); diff --git a/src/platforms/hydrabus/platform.c b/src/platforms/hydrabus/platform.c index 3993a103..c6a60c26 100644 --- a/src/platforms/hydrabus/platform.c +++ b/src/platforms/hydrabus/platform.c @@ -46,7 +46,7 @@ void platform_init(void) scb_reset_core(); } - rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_48MHZ]); + rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_48MHZ]); /* Enable peripherals */ rcc_peripheral_enable_clock(&RCC_AHB2ENR, RCC_AHB2ENR_OTGFSEN); @@ -103,4 +103,3 @@ void platform_request_boot(void) SYSCFG_MEMRM &= ~3; SYSCFG_MEMRM |= 1; } - diff --git a/src/platforms/native/platform.c b/src/platforms/native/platform.c index 1804e175..c69eea3b 100644 --- a/src/platforms/native/platform.c +++ b/src/platforms/native/platform.c @@ -222,7 +222,7 @@ static void adc_init(void) gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_ANALOG, GPIO0); - adc_off(ADC1); + adc_power_off(ADC1); adc_disable_scan_mode(ADC1); adc_set_single_conversion_mode(ADC1); adc_disable_external_trigger_regular(ADC1); @@ -236,7 +236,7 @@ static void adc_init(void) __asm__("nop"); adc_reset_calibration(ADC1); - adc_calibration(ADC1); + adc_calibrate(ADC1); } const char *platform_target_voltage(void) diff --git a/src/platforms/native/platform.h b/src/platforms/native/platform.h index c18a8c8f..a261cbca 100644 --- a/src/platforms/native/platform.h +++ b/src/platforms/native/platform.h @@ -128,7 +128,7 @@ GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, USBUSART_TX_PIN); \ } while(0) -#define USB_DRIVER stm32f103_usb_driver +#define USB_DRIVER st_usbfs_v1_usb_driver #define USB_IRQ NVIC_USB_LP_CAN_RX0_IRQ #define USB_ISR usb_lp_can_rx0_isr /* Interrupt priorities. Low numbers are high priority. diff --git a/src/platforms/native/usbdfu.c b/src/platforms/native/usbdfu.c index e370cf9c..020a9760 100644 --- a/src/platforms/native/usbdfu.c +++ b/src/platforms/native/usbdfu.c @@ -60,7 +60,7 @@ int main(void) gpio_set_mode(LED_PORT, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, LED_0 | LED_1 | LED_2); - dfu_init(&stm32f103_usb_driver, DFU_MODE); + dfu_init(&st_usbfs_v1_usb_driver, DFU_MODE); /* Configure the USB pull up pin. */ gpio_set(GPIOA, GPIO8); diff --git a/src/platforms/stlink/dfu_upgrade.c b/src/platforms/stlink/dfu_upgrade.c index 804144a1..aeb559d3 100644 --- a/src/platforms/stlink/dfu_upgrade.c +++ b/src/platforms/stlink/dfu_upgrade.c @@ -58,7 +58,7 @@ int main(void) if (rev > 1) /* Reconnect USB */ gpio_set(GPIOA, GPIO15); - dfu_init(&stm32f103_usb_driver, UPD_MODE); + dfu_init(&st_usbfs_v1_usb_driver, UPD_MODE); dfu_main(); } diff --git a/src/platforms/stlink/platform.h b/src/platforms/stlink/platform.h index f531444a..5cb29ccc 100644 --- a/src/platforms/stlink/platform.h +++ b/src/platforms/stlink/platform.h @@ -82,7 +82,7 @@ gpio_set_mode(USBUSART_PORT, GPIO_MODE_OUTPUT_2_MHZ, \ GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, USBUSART_TX_PIN); -#define USB_DRIVER stm32f103_usb_driver +#define USB_DRIVER st_usbfs_v1_usb_driver #define USB_IRQ NVIC_USB_LP_CAN_RX0_IRQ #define USB_ISR usb_lp_can_rx0_isr /* Interrupt priorities. Low numbers are high priority. diff --git a/src/platforms/stlink/stlink_common.c b/src/platforms/stlink/stlink_common.c index 487563d8..b23a345d 100644 --- a/src/platforms/stlink/stlink_common.c +++ b/src/platforms/stlink/stlink_common.c @@ -75,7 +75,7 @@ uint32_t detect_rev(void) rev = 1; /* On Rev > 0 unconditionally activate MCO on PORTA8 with HSE! */ RCC_CFGR &= ~(0xf << 24); - RCC_CFGR |= (RCC_CFGR_MCO_HSECLK << 24); + RCC_CFGR |= (RCC_CFGR_MCO_HSE << 24); gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO8); } diff --git a/src/platforms/stlink/usbdfu.c b/src/platforms/stlink/usbdfu.c index fca3bf64..d016075a 100644 --- a/src/platforms/stlink/usbdfu.c +++ b/src/platforms/stlink/usbdfu.c @@ -75,7 +75,7 @@ int main(void) if (rev > 1) gpio_set(GPIOA, GPIO15); - dfu_init(&stm32f103_usb_driver, DFU_MODE); + dfu_init(&st_usbfs_v1_usb_driver, DFU_MODE); dfu_main(); } diff --git a/src/platforms/stm32/traceswo.c b/src/platforms/stm32/traceswo.c index a2e704d7..50073788 100644 --- a/src/platforms/stm32/traceswo.c +++ b/src/platforms/stm32/traceswo.c @@ -59,7 +59,7 @@ void traceswo_init(void) timer_ic_set_polarity(TRACE_TIM, TIM_IC2, TIM_IC_FALLING); /* Trigger on Filtered Timer Input 1 (TI1FP1) */ - timer_slave_set_trigger(TRACE_TIM, TIM_SMCR_TS_IT1FP1); + timer_slave_set_trigger(TRACE_TIM, TIM_SMCR_TS_TI1FP1); /* Slave reset mode: reset counter on trigger */ timer_slave_set_mode(TRACE_TIM, TIM_SMCR_SMS_RM); diff --git a/src/platforms/stm32/usbuart.c b/src/platforms/stm32/usbuart.c index a4a772e1..0d1772a3 100644 --- a/src/platforms/stm32/usbuart.c +++ b/src/platforms/stm32/usbuart.c @@ -72,7 +72,7 @@ void usbuart_init(void) timer_set_mode(USBUSART_TIM, TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); timer_set_prescaler(USBUSART_TIM, - rcc_ppre2_frequency / USBUART_TIMER_FREQ_HZ * 2 - 1); + rcc_apb2_frequency / USBUART_TIMER_FREQ_HZ * 2 - 1); timer_set_period(USBUSART_TIM, USBUART_TIMER_FREQ_HZ / USBUART_RUN_FREQ_HZ - 1); diff --git a/src/platforms/swlink/platform.h b/src/platforms/swlink/platform.h index 8c2be74f..748c31fd 100644 --- a/src/platforms/swlink/platform.h +++ b/src/platforms/swlink/platform.h @@ -74,7 +74,7 @@ GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, USBUSART_TX_PIN); \ } while (0) -#define USB_DRIVER stm32f103_usb_driver +#define USB_DRIVER st_usbfs_v1_usb_driver #define USB_IRQ NVIC_USB_LP_CAN_RX0_IRQ #define USB_ISR usb_lp_can_rx0_isr /* Interrupt priorities. Low numbers are high priority. diff --git a/src/platforms/swlink/usbdfu.c b/src/platforms/swlink/usbdfu.c index f716653f..daf73f32 100644 --- a/src/platforms/swlink/usbdfu.c +++ b/src/platforms/swlink/usbdfu.c @@ -83,7 +83,7 @@ int main(void) systick_interrupt_enable(); systick_counter_enable(); - dfu_init(&stm32f103_usb_driver, DFU_MODE); + dfu_init(&st_usbfs_v1_usb_driver, DFU_MODE); dfu_main(); } From f27f3bad5ca8b367c79fe3263a5eac272502c07e Mon Sep 17 00:00:00 2001 From: Gareth McMullin Date: Thu, 5 Oct 2017 08:25:11 +1300 Subject: [PATCH 3/7] libftdi: Fix tdi_tdo_seq result unpacking --- src/platforms/libftdi/jtagtap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/platforms/libftdi/jtagtap.c b/src/platforms/libftdi/jtagtap.c index 11256d02..bc7ab410 100644 --- a/src/platforms/libftdi/jtagtap.c +++ b/src/platforms/libftdi/jtagtap.c @@ -173,6 +173,8 @@ jtagtap_tdi_tdo_seq(uint8_t *DO, const uint8_t final_tms, const uint8_t *DI, int /*if(rsize) printf("%02X ", tmp[index]);*/ *DO++ = tmp[index++]; } + if (rticks == 0) + *DO++ = 0; if(final_tms) { rticks++; *(--DO) >>= 1; From 25610e5ec5a9fb6b44af5363544ff0b142887c50 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Wed, 4 Oct 2017 14:28:58 +0200 Subject: [PATCH 4/7] target: Fix unconsistant use of tmplen. --- src/target/target.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/target/target.c b/src/target/target.c index 54ab8bfc..c984ffe6 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -216,13 +216,14 @@ int target_flash_write(target *t, size_t tmplen = MIN(len, f->length - (dest % f->length)); if (f->align > 1) { uint32_t offset = dest % f->align; - uint8_t data[ALIGN(offset + len, f->align)]; + uint8_t data[ALIGN(offset + tmplen, f->align)]; memset(data, f->erased, sizeof(data)); - memcpy((uint8_t *)data + offset, src, len); + memcpy((uint8_t *)data + offset, src, tmplen); ret |= f->write(f, dest - offset, data, sizeof(data)); } else { ret |= f->write(f, dest, src, tmplen); } + dest += tmplen; src += tmplen; len -= tmplen; } From a7815fff3d292ada671347320dd171f9915993cf Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Wed, 4 Oct 2017 14:35:26 +0200 Subject: [PATCH 5/7] target.c: No need to split write while still in same flash block. --- src/target/target.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/target/target.c b/src/target/target.c index c984ffe6..a0da26c6 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -213,7 +213,8 @@ int target_flash_write(target *t, int ret = 0; while (len) { struct target_flash *f = flash_for_addr(t, dest); - size_t tmplen = MIN(len, f->length - (dest % f->length)); + size_t tmptarget = MIN(dest + len, f->start + f->length); + size_t tmplen = tmptarget - dest; if (f->align > 1) { uint32_t offset = dest % f->align; uint8_t data[ALIGN(offset + tmplen, f->align)]; From dc29e45606f521ebcd1adadfdf8ac63b0be49f4d Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Wed, 4 Oct 2017 13:50:43 +0200 Subject: [PATCH 6/7] stm32_mem: Really wait 5 seconds for DFU device to appear. --- scripts/stm32_mem.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/scripts/stm32_mem.py b/scripts/stm32_mem.py index 33d35f9d..d30a8555 100755 --- a/scripts/stm32_mem.py +++ b/scripts/stm32_mem.py @@ -79,10 +79,12 @@ def stm32_manifest(dev): sleep(status.bwPollTimeout / 1000.0) if status.bState == dfu.STATE_DFU_MANIFEST: break -def stm32_scan(args): +def stm32_scan(args, test): devs = dfu.finddevs() bmp = 0 if not devs: + if test == True: + return print "No DFU devices found!" exit(-1) @@ -91,9 +93,13 @@ def stm32_scan(args): man = dfudev.handle.getString(dfudev.dev.iManufacturer, 30) if man == "Black Sphere Technologies": bmp = bmp + 1 if bmp == 0 : + if test == True: + return print "No compatible device found\n" exit(-1) if bmp > 1 and not args.serial_target : + if test == True: + return print "Found multiple devices:\n" for dev in devs: dfudev = dfu.dfu_device(*dev) @@ -138,7 +144,7 @@ if __name__ == "__main__": parser.add_argument("-a", "--address", help="Start address for firmware") parser.add_argument("-m", "--manifest", help="Start application, if in DFU mode", action='store_true') args = parser.parse_args() - dfudev = stm32_scan(args) + dfudev = stm32_scan(args, False) try: state = dfudev.get_state() except: @@ -153,7 +159,7 @@ if __name__ == "__main__": while True : sleep(0.5) timeout = timeout + 0.5 - dfudev = stm32_scan(args) + dfudev = stm32_scan(args, True) if dfudev: break if timeout > 5 : print "Error: DFU device did not appear" From 120a2d9378c4b439917d44246f8df91ac259b39f Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Thu, 5 Oct 2017 22:07:23 +0200 Subject: [PATCH 7/7] target: Fix calculation of erase size. --- src/target/target.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/target/target.c b/src/target/target.c index a0da26c6..e433bdbd 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -199,7 +199,8 @@ int target_flash_erase(target *t, target_addr addr, size_t len) int ret = 0; while (len) { struct target_flash *f = flash_for_addr(t, addr); - size_t tmplen = MIN(len, f->length - (addr % f->length)); + size_t tmptarget = MIN(addr + len, f->start + f->length); + size_t tmplen = tmptarget - addr; ret |= f->erase(f, addr, tmplen); addr += tmplen; len -= tmplen;