From 83512e9fd846d515e756fa8897434f9591bd1006 Mon Sep 17 00:00:00 2001 From: dewagter Date: Fri, 24 Oct 2014 00:17:36 +0200 Subject: [PATCH] [JTAG] Download firmware instead --- sw/ext/blackmagic/Makefile | 16 ++ sw/ext/blackmagic/blackmagic/Makefile | 2 - .../blackmagic/blackmagic-20140828.bin | Bin 66100 -> 0 bytes .../blackmagic/blackmagic/blackmagic_dfu.bin | Bin 7460 -> 0 bytes sw/ext/blackmagic/blackmagic/dfu.py | 191 ------------------ sw/ext/blackmagic/blackmagic/stm32_mem.py | 109 ---------- 6 files changed, 16 insertions(+), 302 deletions(-) create mode 100644 sw/ext/blackmagic/Makefile delete mode 100644 sw/ext/blackmagic/blackmagic/Makefile delete mode 100644 sw/ext/blackmagic/blackmagic/blackmagic-20140828.bin delete mode 100755 sw/ext/blackmagic/blackmagic/blackmagic_dfu.bin delete mode 100644 sw/ext/blackmagic/blackmagic/dfu.py delete mode 100755 sw/ext/blackmagic/blackmagic/stm32_mem.py diff --git a/sw/ext/blackmagic/Makefile b/sw/ext/blackmagic/Makefile new file mode 100644 index 00000000000..1596dc4d826 --- /dev/null +++ b/sw/ext/blackmagic/Makefile @@ -0,0 +1,16 @@ +# Hey Emacs, this is a -*- makefile -*- + +BLACKSPHERE = http://blacksphere.co.nz/builds +BLACKMAGIC = blackmagic-20141017.bin + +Q=@ + +all: $(BLACKMAGIC) + $(Q)../../tools/stm32loader/stm32loader.py -p /dev/ttyACM0 ./$(BLACKMAGIC) + +$(BLACKMAGIC): + @echo "Downloading latest BMP firmware" + wget -O ./$(BLACKMAGIC) $(BLACKSPHERE)/$(BLACKMAGIC) + +clean: + $(Q) rm -rf ./$(BLACKMAGIC) diff --git a/sw/ext/blackmagic/blackmagic/Makefile b/sw/ext/blackmagic/blackmagic/Makefile deleted file mode 100644 index ad2da71b818..00000000000 --- a/sw/ext/blackmagic/blackmagic/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -all: - ./stm32_mem.py ./blackmagic-20140828.bin diff --git a/sw/ext/blackmagic/blackmagic/blackmagic-20140828.bin b/sw/ext/blackmagic/blackmagic/blackmagic-20140828.bin deleted file mode 100644 index 24fa2a5a02c2e17dbb9748cf5d34ab99c9f8e097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66100 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 Do4fNT diff --git a/sw/ext/blackmagic/blackmagic/dfu.py b/sw/ext/blackmagic/blackmagic/dfu.py deleted file mode 100644 index 27c25dba4ae..00000000000 --- a/sw/ext/blackmagic/blackmagic/dfu.py +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env python -# -# dfu.py: Access USB DFU class devices -# Copyright (C) 2009 Black Sphere Technologies -# Written by Gareth McMullin -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - - -import usb - -DFU_DETACH_TIMEOUT = 1000 - -# DFU Requests -DFU_DETACH = 0x00 -DFU_DNLOAD = 0x01 -DFU_UPLOAD = 0x02 -DFU_GETSTATUS = 0x03 -DFU_CLRSTATUS = 0x04 -DFU_GETSTATE = 0x05 -DFU_ABORT = 0x06 - -# DFU States -STATE_APP_IDLE = 0x00 -STATE_APP_DETACH = 0x01 -STATE_DFU_IDLE = 0x02 -STATE_DFU_DOWNLOAD_SYNC = 0x03 -STATE_DFU_DOWNLOAD_BUSY = 0x04 -STATE_DFU_DOWNLOAD_IDLE = 0x05 -STATE_DFU_MANIFEST_SYNC = 0x06 -STATE_DFU_MANIFEST = 0x07 -STATE_DFU_MANIFEST_WAIT_RESET = 0x08 -STATE_DFU_UPLOAD_IDLE = 0x09 -STATE_DFU_ERROR = 0x0a -DFU_STATUS_OK = 0x00 - -# DFU Status cides -DFU_STATUS_ERROR_TARGET = 0x01 -DFU_STATUS_ERROR_FILE = 0x02 -DFU_STATUS_ERROR_WRITE = 0x03 -DFU_STATUS_ERROR_ERASE = 0x04 -DFU_STATUS_ERROR_CHECK_ERASED = 0x05 -DFU_STATUS_ERROR_PROG = 0x06 -DFU_STATUS_ERROR_VERIFY = 0x07 -DFU_STATUS_ERROR_ADDRESS = 0x08 -DFU_STATUS_ERROR_NOTDONE = 0x09 -DFU_STATUS_ERROR_FIRMWARE = 0x0a -DFU_STATUS_ERROR_VENDOR = 0x0b -DFU_STATUS_ERROR_USBR = 0x0c -DFU_STATUS_ERROR_POR = 0x0d -DFU_STATUS_ERROR_UNKNOWN = 0x0e -DFU_STATUS_ERROR_STALLEDPKT = 0x0f - -class dfu_status(object): - def __init__(self, buf): - self.bStatus = buf[0] - self.bwPollTimeout = buf[1] + (buf[2]<<8) + (buf[3]<<16) - self.bState = buf[4] - self.iString = buf[5] - - -class dfu_device(object): - def __init__(self, dev, conf, iface): - self.dev = dev - self.conf = conf - self.iface = iface - self.handle = self.dev.open() - try: - self.handle.setConfiguration(conf) - except: pass - self.handle.claimInterface(iface.interfaceNumber) - if type(self.iface) is usb.Interface: - self.index = self.iface.interfaceNumber - else: self.index = self.iface - - def detach(self, wTimeout=255): - self.handle.controlMsg(usb.ENDPOINT_OUT | usb.TYPE_CLASS | - usb.RECIP_INTERFACE, DFU_DETACH, - None, value=wTimeout, index=self.index) - - def download(self, wBlockNum, data): - self.handle.controlMsg(usb.ENDPOINT_OUT | usb.TYPE_CLASS | - usb.RECIP_INTERFACE, DFU_DNLOAD, - data, value=wBlockNum, index=self.index) - - def upload(self, wBlockNum, length): - return self.handle.controlMsg(usb.ENDPOINT_IN | - usb.TYPE_CLASS | usb.RECIP_INTERFACE, DFU_UPLOAD, - length, value=wBlockNum, index=self.index) - - def get_status(self): - buf = self.handle.controlMsg(usb.ENDPOINT_IN | - usb.TYPE_CLASS | usb.RECIP_INTERFACE, DFU_GETSTATUS, - 6, index=self.index) - return dfu_status(buf) - - def clear_status(self): - self.handle.controlMsg(usb.ENDPOINT_OUT | usb.TYPE_CLASS | - usb.RECIP_INTERFACE, DFU_CLRSTATUS, - "", index=0) - - def get_state(self): - buf = self.handle.controlMsg(usb.ENDPOINT_IN | - usb.TYPE_CLASS | usb.RECIP_INTERFACE, DFU_GETSTATE, - 1, index=self.index) - return buf[0] - - def abort(self): - self.handle.controlMsg(usb.ENDPOINT_OUT | usb.TYPE_CLASS | - usb.RECIP_INTERFACE, DFU_ABORT, - None, index=self.index) - - - def make_idle(self): - retries = 3 - while retries: - try: - status = self.get_status() - except: - self.clear_status() - continue - - retries -= 1 - - if status.bState == STATE_DFU_IDLE: - return True - - if ((status.bState == STATE_DFU_DOWNLOAD_SYNC) or - (status.bState == STATE_DFU_DOWNLOAD_IDLE) or - (status.bState == STATE_DFU_MANIFEST_SYNC) or - (status.bState == STATE_DFU_UPLOAD_IDLE) or - (status.bState == STATE_DFU_DOWNLOAD_BUSY) or - (status.bState == STATE_DFU_MANIFEST)): - self.abort() - continue - - if status.bState == STATE_DFU_ERROR: - self.clear_status() - continue - - if status.bState == STATE_APP_IDLE: - self.detach(DFU_DETACH_TIMEOUT) - continue - - if ((status.bState == STATE_APP_DETACH) or - (status.bState == STATE_DFU_MANIFEST_WAIT_RESET)): - usb.reset(self.handle) - return False - - raise Exception - -def finddevs(): - devs = [] - for bus in usb.busses(): - for dev in bus.devices: - for conf in dev.configurations: - for ifaces in conf.interfaces: - for iface in ifaces: - if ((iface.interfaceClass == 0xFE) and - (iface.interfaceSubClass == 0x01)): - devs.append((dev, conf, iface)) - return devs - - -if __name__ == "__main__": - devs = finddevs() - if not devs: - print "No devices found!" - exit(-1) - - for dfu in devs: - handle = dfu[0].open() - man = handle.getString(dfu[0].iManufacturer, 30) - product = handle.getString(dfu[0].iProduct, 30) - print "Device %s: ID %04x:%04x %s - %s" % (dfu[0].filename, - dfu[0].idVendor, dfu[0].idProduct, man, product) - print "%r, %r" % (dfu[1], dfu[2]) - - - diff --git a/sw/ext/blackmagic/blackmagic/stm32_mem.py b/sw/ext/blackmagic/blackmagic/stm32_mem.py deleted file mode 100755 index 97bdbbf8212..00000000000 --- a/sw/ext/blackmagic/blackmagic/stm32_mem.py +++ /dev/null @@ -1,109 +0,0 @@ -#!/usr/bin/python -# -# stm32_mem.py: STM32 memory access using USB DFU class -# Copyright (C) 2011 Black Sphere Technologies -# Written by Gareth McMullin -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -from time import sleep -import struct -from sys import stdout, argv - -import usb -import dfu - -CMD_GETCOMMANDS = 0x00 -CMD_SETADDRESSPOINTER = 0x21 -CMD_ERASE = 0x41 - -def stm32_erase(dev, addr): - erase_cmd = struct.pack("" - print - - devs = dfu.finddevs() - if not devs: - print "No devices found!" - exit(-1) - - for dev in devs: - dfudev = dfu.dfu_device(*dev) - man = dfudev.handle.getString(dfudev.dev.iManufacturer, 30) - product = dfudev.handle.getString(dfudev.dev.iProduct, 30) - if man == "Black Sphere Technologies": break - if man == "STMicroelectronics": break - - print "Device %s: ID %04x:%04x %s - %s" % (dfudev.dev.filename, - dfudev.dev.idVendor, dfudev.dev.idProduct, man, product) - - try: - state = dfudev.get_state() - except: - print "Failed to read device state! Assuming APP_IDLE" - state = dfu.STATE_APP_IDLE - if state == dfu.STATE_APP_IDLE: - dfudev.detach() - print "Run again to upgrade firmware." - exit(0) - - dfudev.make_idle() - - bin = open(argv[1], "rb").read() - - addr = 0x8002000 - while bin: - print ("Programming memory at 0x%08X\r" % addr), - stdout.flush() - stm32_erase(dfudev, addr) - stm32_write(dfudev, bin[:1024]) - - bin = bin[1024:] - addr += 1024 - - stm32_manifest(dfudev) - - print "\nAll operations complete!\n"