diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 000000000..9e53a07bc --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,20 @@ +version: '{build}' +environment: + matrix: + - GENERATOR: "MSYS Makefiles" + ARCH: i686 # this is for 32-bit MinGW-w64 + - GENERATOR: "MSYS Makefiles" + ARCH: 64 +cache: + - i686-4.9.2-release-win32-sjlj-rt_v3-rev1.7z + - x86_64-4.9.2-release-win32-seh-rt_v3-rev1.7z +build_script: +- ps: | + mkdir build + cd build + if ($env:GENERATOR -ne "MSYS Makefiles") { + cmake .. -G"$env:GENERATOR" + cmake --build . --config Debug + } +- cmd: | + if "%GENERATOR%"=="MSYS Makefiles" (C:\MinGW\msys\1.0\bin\sh --login /c/projects/stlink/scripts/appveyor-mingw.sh) diff --git a/.travis.sh b/.travis.sh index 9e28d3ca1..9fa519dad 100755 --- a/.travis.sh +++ b/.travis.sh @@ -5,24 +5,15 @@ ls -1 /usr/bin/clang* ls -1 /usr/bin/scan-build* echo "----" -if [ "$TRAVIS_OS_NAME" != "osx" ]; then +if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq || true sudo apt-get install -qq -y --no-install-recommends libusb-1.0.0-dev libgtk-3-dev else brew install libusb fi -if [ "$BUILD_SYSTEM" == "cmake" ]; then - mkdir build - cd build - cmake .. - make -else - ./autogen.sh - if [ "$TRAVIS_OS_NAME" == "osx" ]; then - ./configure - else - ./configure --with-gtk-gui - fi - make -fi +echo "=== Building Debug" +mkdir -p build/Debug && cd build/Debug && cmake -DCMAKE_BUILD_TYPE=Debug ../../ && make && make package && cd - + +echo "=== Building Release" +mkdir -p build/Release && cd build/Release && cmake -DCMAKE_BUILD_TYPE=Release ../../ && make && make package && cd - diff --git a/.travis.yml b/.travis.yml index 55a23fb12..543c0edec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,21 +3,25 @@ language: c addons: apt: sources: +# - llvm-toolchain-precise-3.8 - ubuntu-toolchain-r-test packages: + - clang +# - clang-3.8 - g++-5 - gcc-5 - - clang script: - ./.travis.sh matrix: include: - os: linux - compiler: clang-3.8 - env: "BUILD_SYSTEM=cmake" + compiler: clang +# - os: linux +# compiler: clang-3.8 - os: linux compiler: gcc-5 - env: "BUILD_SYSTEM=cmake" + compiler: gcc-5 +# - os: linux +# compiler: clang-3.8 - os: osx compiler: clang - env: "BUILD_SYSTEM=cmake" diff --git a/.version b/.version new file mode 100644 index 000000000..d72f26267 --- /dev/null +++ b/.version @@ -0,0 +1 @@ +2.0.0-dev diff --git a/ACKNOWLEDGMENTS b/ACKNOWLEDGMENTS deleted file mode 100644 index acd89e3ea..000000000 --- a/ACKNOWLEDGMENTS +++ /dev/null @@ -1,2 +0,0 @@ -The development team wants to acknowledge the following people: -- STMicroelectronics discovery kit team for their low cost boards and for their help in development process. \ No newline at end of file diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index aae9e2963..000000000 --- a/AUTHORS +++ /dev/null @@ -1,19 +0,0 @@ -m@capitanio.org -spen@spen-soft.co.uk -texane@gmail.com -whitequark@whitequark.org -grestm@galexander.org -karlp@tweak.net.au -h0rr0rrdrag@gmail.com -mstempin@com1.fr -bon@elektron.ikp.physik.tu-darmstadt.de -nelsonjm@macpod.neta -ned@bike-nomad.com -csamuelson@swingpal.com -bravikov@gmail.com -jnosky - codegrinder69@hotmail.com -marpe@mimuw.edu.pl -marco.cassinerio@gmail.com -jserv@0xlab.org -michael@pratt.im -jerry.jacobs@xor-gate.org diff --git a/CMakeLists.txt b/CMakeLists.txt index ca46074da..cf18e0228 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,58 @@ -project(stlink C) cmake_minimum_required(VERSION 2.8.7) +project(stlink C) include(CheckCCompilerFlag) include(CheckIncludeFile) find_package(PkgConfig) +if (POLICY CMP0042) + # Newer cmake on MacOS should use @rpath + cmake_policy (SET CMP0042 NEW) +endif () + set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_SOURCE_DIR}/cmake/modules") +# Determine package version. +find_package (Git QUIET) +if (DEFINED ENV{TRAVIS_TAG} AND NOT "$ENV{TRAVIS_TAG}" STREQUAL "") + set (STLINK_PACKAGE_VERSION "$ENV{TRAVIS_TAG}") +elseif (GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") + # Working off a git repo, using git versioning + + # Check if HEAD is pointing to a tag + execute_process ( + COMMAND "${GIT_EXECUTABLE}" describe --always + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + OUTPUT_VARIABLE STLINK_PACKAGE_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + + # If the sources have been changed locally, add -dirty to the version. + execute_process ( + COMMAND "${GIT_EXECUTABLE}" diff --quiet + WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}" + RESULT_VARIABLE res) + + if (res EQUAL 1) + set (STLINK_PACKAGE_VERSION "${STLINK_PACKAGE_VERSION}-dirty") + endif() +elseif (EXISTS ${PROJECT_SOURCE_DIR}/.version) + # If git is not available (e.g. when building from source package) + # we can extract the package version from .version file. + file (STRINGS .version STLINK_PACKAGE_VERSION) +else () + set (STLINK_PACKAGE_VERSION "Unknown") +endif() + +if(WIN32) + find_package(7Zip REQUIRED) + message(STATUS "7Zip Location: " ${ZIP_LOCATION}) +endif() + find_package(LibUSB REQUIRED) -pkg_check_modules(gtk gtk+-3.0) +if (NOT APPLE AND NOT WIN32) + find_package(PkgConfig) + pkg_check_modules(gtk gtk+-3.0) +endif () function(add_cflag_if_supported flag) string(REPLACE "-" "_" flagclean ${flag}) @@ -38,12 +82,19 @@ add_cflag_if_supported("-Wshorten-64-to-32") add_cflag_if_supported("-Wimplicit-function-declaration") add_cflag_if_supported("-Wredundant-decls") add_cflag_if_supported("-Wundef") -add_cflag_if_supported("-fPIC") +if (NOT MSYS OR MINGW) + add_cflag_if_supported("-fPIC") +endif () + +if (CMAKE_BUILD_TYPE STREQUAL "") + set (CMAKE_BUILD_TYPE "Debug") +endif () if(${CMAKE_BUILD_TYPE} MATCHES "Debug") include(CTest) add_cflag_if_supported("-ggdb") add_cflag_if_supported("-O0") + #set (STLINK_PACKAGE_VERSION "${STLINK_PACKAGE_VERSION}-debug") elseif() add_cflag_if_supported("-O2") endif() @@ -53,6 +104,8 @@ if (STLINK_HAVE_SYS_MMAN_H) add_definitions(-DSTLINK_HAVE_SYS_MMAN_H) endif() +message("Building ${PROJECT_NAME} ${STLINK_PACKAGE_VERSION}") + set(STLINK_HEADERS include/stlink.h include/stlink/usb.h @@ -72,6 +125,10 @@ set(STLINK_SOURCE src/flash_loader.c ) +if (WIN32 OR MSYS OR MINGW) + set (STLINK_SOURCE "${STLINK_SOURCE};src/mmap.c;src/mingw/mingw.c") # TODO +endif () + include_directories(${LIBUSB_INCLUDE_DIR}) include_directories(include) include_directories(src/mingw) @@ -86,7 +143,7 @@ if (APPLE) find_library(CoreFoundation CoreFoundation) find_library(IOKit IOKit) target_link_libraries(${PROJECT_NAME} ${CoreFoundation} ${IOKit} ${ObjC}) -endif() +endif () add_executable(st-flash src/tools/flash.c) target_link_libraries(st-flash ${PROJECT_NAME}) @@ -98,7 +155,11 @@ add_executable(st-util src/gdbserver/gdb-remote.c src/gdbserver/gdb-remote.h src/gdbserver/gdb-server.c src/gdbserver/gdb-server.h) -target_link_libraries(st-util ${PROJECT_NAME}) +if (WIN32 OR MSYS OR MINGW) + target_link_libraries(st-util ${PROJECT_NAME} wsock32 ws2_32) +else () + target_link_libraries(st-util ${PROJECT_NAME}) +endif () install(TARGETS ${PROJECT_NAME} st-flash st-util st-info RUNTIME DESTINATION bin @@ -114,20 +175,22 @@ if(NOT MINGW) RUNTIME DESTINATION bin) endif() -if(gtk_FOUND) +if (NOT APPLE AND gtk_FOUND) include_directories(SYSTEM ${gtk_INCLUDE_DIRS}) set(GUI_SOURCES src/tools/gui/stlink-gui.c src/tools/gui/stlink-gui.h) + # TODO REMOVE whole stlink-gui-local target, fixup auto-search of ui file in implementation add_executable(stlink-gui-local ${GUI_SOURCES}) set_target_properties(stlink-gui-local PROPERTIES COMPILE_FLAGS -DSTLINK_UI_DIR=\\"${CMAKE_CURRENT_SOURCE_DIR}/gui\\") target_link_libraries(stlink-gui-local stlink ${gtk_LDFLAGS}) - set(INSTALLED_UI_DIR ${CMAKE_INSTALL_PREFIX}/share) + set(INSTALLED_UI_DIR share/stlink) add_executable(stlink-gui ${GUI_SOURCES}) + # TODO REMOVE, fixup auto-search of ui file in implementation set_target_properties(stlink-gui PROPERTIES - COMPILE_FLAGS -DSTLINK_UI_DIR=\\"${INSTALLED_UI_DIR}\\") + COMPILE_FLAGS -DSTLINK_UI_DIR=\\"${CMAKE_INSTALL_PREFIX}/${INSTALLED_UI_DIR}\\") target_link_libraries(stlink-gui stlink ${gtk_LDFLAGS}) install(TARGETS stlink-gui @@ -137,3 +200,16 @@ if(gtk_FOUND) endif() add_subdirectory(tests) + +set (CPACK_PACKAGE_NAME ${PROJECT_NAME}) +set (CPACK_PACKAGE_VERSION ${STLINK_PACKAGE_VERSION}) +set (CPACK_SOURCE_GENERATOR "TBZ2;ZIP") +set (CPACK_SOURCE_IGNORE_FILES "/build/;/.git/;~$;${CPACK_SOURCE_IGNORE_FILES}") +set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${STLINK_PACKAGE_VERSION}") +if (APPLE) + set(CPACK_GENERATOR "ZIP") + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/dist/osx") + set(CPACK_OUTPUT_FILE_PREFIX "${CMAKE_BINARY_DIR}/dist/osx") +endif () +add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source) +include (CPack) diff --git a/COPYING b/COPYING deleted file mode 100644 index 37b124eba..000000000 --- a/COPYING +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The "Capt'ns Missing Link" Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Martin Capitanio nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ChangeLog b/ChangeLog index 00d82ee9f..355ba08ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,15 @@ Stlink ChangeLog ================ +v2.0.0 +====== + +Ongoing development + +Major changes: + +* Deprecation of autotools (autoconf, automake) + v1.2.0 ====== diff --git a/INSTALL.mingw b/INSTALL.mingw deleted file mode 100644 index c8df0fd70..000000000 --- a/INSTALL.mingw +++ /dev/null @@ -1,44 +0,0 @@ -from dandev37: - -Here's a step by step from a clean install to successfully setup MinGW and build -libusb-1.0 and stlink for MS Windows. Hopefully this helps someone. - -1. Install MinGW and MSYS to C:\MinGW with the graphical installer from -http://sourceforge.net/projects/mingw/files/Installer/mingw-get-setup.exe/download -and add these packages: -mingw32-base -mingw-developer-toolkit - -2. Add C:\MinGW\bin to your path. -Note: a user reports she had to use c:\MinGW\msys\1.0\bin - -3. Create the C:\MinGW\msys\1.0\etc\fstab file to mount C:\MinGW as /mingw as per -http://www.mingw.org/wiki/MSYS: - -#Win32_Path Mount_Point -c:/mingw /mingw - -4. Download these three glib, pkg-config, pkg-config-dev archives and extract -contents to C:\MinGW -http://win32builder.gnome.org/packages/3.6/glib_2.34.3-1_win32.zip -http://win32builder.gnome.org/packages/3.6/pkg-config_0.28-1_win32.zip -http://win32builder.gnome.org/packages/3.6/pkg-config-dev_0.28-1_win32.zip - -5. Download latest libusb-1.0 source from -https://github.com/libusb/libusb (newer repo, includes USB 3.0 hub support) -OR the old git://git.libusb.org/libusb.git (original repo, NO USB 3.0 support) -and build (prefix as per http://www.mingw.org/wiki/MSYS) - -./autogen.sh -./configure --prefix=/mingw -make -make install - -6. Repeat for stlink source from https://github.com/texane/stlink - -./autogen.sh -./configure --prefix=/mingw -make -make install - -7. Enjoy the fruits of the stlink developers. diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 79ce10c22..000000000 --- a/Makefile.am +++ /dev/null @@ -1,59 +0,0 @@ -# Makefile.am -- Process this file with automake to produce Makefile.in - -SUBDIRS = . $(STLINK_HAS_GUI) - -AUTOMAKE_OPTIONS = subdir-objects - -if MINGW -bin_PROGRAMS = st-flash st-util st-info -else -bin_PROGRAMS = st-flash st-util st-term st-info -endif - -noinst_LIBRARIES = libstlink.a - -st_flash_SOURCES = src/tools/flash.c -st_term_SOURCES = src/tools/term.c -st_info_SOURCES = src/tools/info.c -st_util_SOURCES = src/gdbserver/gdb-remote.c src/gdbserver/gdb-remote.h src/gdbserver/gdb-server.c src/mingw/mingw.c src/mingw/mingw.h - -CFILES = \ - src/chipid.c \ - src/common.c \ - src/usb.c \ - src/sg.c \ - src/logging.c \ - src/flash_loader.c - -if !MINGW -CFILES += src/tools/term.c -endif - -HFILES = \ - include/stlink.h \ - include/stlink/chipid.h \ - include/stlink/usb.h \ - include/stlink/flash_loader.h \ - include/stlink/commands.h \ - include/stlink/sg.h \ - include/stlink/logging.h \ - include/stlink/mmap.h - -libstlink_a_SOURCES = $(CFILES) $(HFILES) - -libstlink_a_LIBADD = $(LIBOBJS) -libstlink_a_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/include - -st_flash_LDADD = libstlink.a -st_flash_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/include -I$(top_srcdir)/src/mingw - -st_util_LDADD = libstlink.a -st_util_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/include -I$(top_srcdir)/src/mingw - -st_term_LDADD = libstlink.a -st_term_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/include -I$(top_srcdir)/src/mingw - -st_info_LDADD = libstlink.a -st_info_CPPFLAGS = -std=gnu99 -Wall -Wextra -O2 -I$(top_srcdir)/include -I$(top_srcdir)/src/mingw - -EXTRA_DIST = autogen.sh diff --git a/NEWS b/NEWS deleted file mode 100644 index e69de29bb..000000000 diff --git a/README b/README deleted file mode 100644 index 7d6f8ef3b..000000000 --- a/README +++ /dev/null @@ -1,335 +0,0 @@ -Open source version of the STMicroelectronics Stlink Tools -========================================================== - -[![Build Status](https://travis-ci.org/texane/stlink.svg?branch=master)](https://travis-ci.org/texane/stlink) - -## HOWTO - -First, you have to know there are several boards supported by the software. -Those boards use a chip to translate from USB to JTAG commands. The chip is -called stlink and there are 2 versions: - -* STLINKv1, present on STM32VL discovery kits, -* STLINKv2, present on STM32L discovery and later kits. - -Two different transport layers are used: - -* STLINKv1 uses SCSI passthru commands over USB -* STLINKv2 uses raw USB commands. - -## Common requirements - -* Debian based distros (debian, ubuntu) - * `build-essential` - -* `pkg-config` -* `intltool` -* `cmake` or (`autoconf` && `automake` && `autogen`) -* `libusb-1.0` (plus development headers for building, on debian based distros `libusb-1.0.0-dev` package) -* (optional) for `stlink-gui` we need libgtk-3-dev - -## For STLINKv1 - -The STLINKv1's SCSI emulation is very broken, so the best thing to do -is tell your operating system to completely ignore it. - -Options (do one of these before you plug it in) - -* `modprobe -r usb-storage && modprobe usb-storage quirks=483:3744:i` -* or 1. `echo "options usb-storage quirks=483:3744:i" >> /etc/modprobe.conf` -* 2. `modprobe -r usb-storage && modprobe usb-storage` -* or 1. `cp stlink_v1.modprobe.conf /etc/modprobe.d` -* 2. `modprobe -r usb-storage && modprobe usb-storage` - -## For STLINKv2 - -You're ready to go :) - -## Build from sources - -### Autotools - -This project was converted to Autotools by a well meaning individual. The -following steps will build the project for you. - -``` -$ ./autogen.sh -$ ./configure --with-gtk-gui -$ make -``` - -### CMake - -``` -$ mkdir build && cd build -$ cmake -DCMAKE_BUILD_TYPE=Debug .. -$ make -``` - -## Using the gdb server - -To run the gdb server: (you do not need sudo if you have set up -permissions correctly) - -``` -$ make && [sudo] ./st-util - -There are a few options: - -./st-util - usage: - - -h, --help Print this help - -vXX, --verbose=XX Specify a specific verbosity level (0..99) - -v, --verbose Specify generally verbose logging - -s X, --stlink_version=X - Choose what version of stlink to use, (defaults to 2) - -1, --stlinkv1 Force stlink version 1 - -p 4242, --listen_port=1234 - Set the gdb server listen port. (default port: 4242) - -m, --multi - Set gdb server to extended mode. - st-util will continue listening for connections after disconnect. - -n, --no-reset - Do not reset board on connection. -``` - -The STLINKv2 device to use can be specified in the environment -variable STLINK_DEVICE on the format `:`. - -Then, in your project directory, someting like this... -(remember, you need to run an _ARM_ gdb, not an x86 gdb) - -``` -$ arm-none-eabi-gdb fancyblink.elf -... -(gdb) tar extended-remote :4242 -... -(gdb) load -Loading section .text, size 0x458 lma 0x8000000 -Loading section .data, size 0x8 lma 0x8000458 -Start address 0x80001c1, load size 1120 -Transfer rate: 1 KB/sec, 560 bytes/write. -(gdb) -... -(gdb) continue -``` - -Have fun! - -## Resetting the chip from GDB - -You may reset the chip using GDB if you want. You'll need to use `target -extended-remote' command like in this session: - -``` -(gdb) target extended-remote localhost:4242 -Remote debugging using localhost:4242 -0x080007a8 in _startup () -(gdb) kill -Kill the program being debugged? (y or n) y -(gdb) run -Starting program: /home/whitequark/ST/apps/bally/firmware.elf -``` - -Remember that you can shorten the commands. `tar ext :4242' is good enough -for GDB. - -## Setting up udev rules - -For convenience, you may install udev rules file, 49-stlinkv*.rules, located -in etc/udev/rules.d (from root of repository). You will need to copy it to /etc/udev/rules.d, -and then either reboot or execute - -``` -$ udevadm control --reload-rules -$ udevadm trigger -``` - -Udev will now create a /dev/stlinkv2_XX or /dev/stlinkv1_XX file, with the appropriate permissions. -This is currently all the device is for, (only one stlink of each version is supported at -any time presently) - -## Running programs from SRAM - -You can run your firmware directly from SRAM if you want to. Just link -it at 0x20000000 and do - -``` -(gdb) load firmware.elf -``` - -It will be loaded, and pc will be adjusted to point to start of the -code, if it is linked correctly (i.e. ELF has correct entry point). - -## Writing to flash - -The GDB stub ships with a correct memory map, including the flash area. -If you would link your executable to 0x08000000 and then do -(gdb) load firmware.elf -then it would be written to the memory. - -## FAQ - -Q: My breakpoints do not work at all or only work once. - -A: Optimizations can cause severe instruction reordering. For example, -if you are doing something like `REG = 0x100;' in a loop, the code may -be split into two parts: loading 0x100 into some intermediate register -and moving that value to REG. When you set up a breakpoint, GDB will -hook to the first instruction, which may be called only once if there are -enough unused registers. In my experience, -O3 causes that frequently. - -Q: At some point I use GDB command `next', and it hangs. - -A: Sometimes when you will try to use GDB `next' command to skip a loop, -it will use a rather inefficient single-stepping way of doing that. -Set up a breakpoint manually in that case and do `continue'. - -Q: Load command does not work in GDB. - -A: Some people report XML/EXPAT is not enabled by default when compiling -GDB. Memory map parsing thus fail. Use --enable-expat. - -## Currently known working combinations of programmer and target - -STLink v1 (as found on the 32VL Discovery board) - -Known working targets: - -* STM32F100xx (Medium Density VL) -* STM32F103 (according to jpa- on ##stm32) - -No information: - -* everything else! - -STLink v2 (as found on the 32L and F4 Discovery boards), known working targets: - -* STM32F030F4P6 (custom board) -* STM32F0Discovery (STM32F0 Discovery board) -* STM32F100xx (Medium Density VL, as on the 32VL Discovery board) -* STM32L1xx (STM32L Discovery board) -* STM32F103VC, STM32F107RC, STM32L151RB, STM32F205RE and STM32F405RE on custom boards - from [UweBonnes/wiki_fuer_alex](https://github.com/UweBonnes/wiki_fuer_alex/tree/master/layout) -* STM32F103VET6 (HY-STM32 board) -* STM32F105RCT6 (DecaWave EVB1000 board) -* STM32F303xx (STM32F3 Discovery board) -* STM32F407xx (STM32F4 Discovery board) -* STM32F429I-DISCO (STM32F4 Discovery board with LCD) -* STM32F439VIT6 (discovery board reseated CPU) -* STM32L052K8T6 (custom board) -* STM32L151CB (custom board) -* STM32L152RB (STM32L-Discovery board, custom board) -* STM32F051R8T6 (STM320518-EVAL board) - -STLink v2-1 (as found on the Nucleo boards), known working targets: - -* STM32F401xx (STM32 Nucleo-F401RE board) -* STM32F030R8T6 (STM32 Nucleo-F030R8 board) -* STM32F072RBT6 (STM32 Nucleo-F072RB board) -* STM32F103RB (STM32 Nucleo-F103RB board) -* STM32F303RET6 (STM32 Nucleo-F303RE board) -* STM32F334R8 (STM32 Nucleo-F334R8 board) -* STM32F411RET6 (STM32 Nucleo-F411RE board) -* STM32F756NGHx (STMF7 evaluation board) -* STM32L053R8 (STM32 Nucleo-L053R8 board) - -Please report any and all known working combinations so I can update this! - -## Known bugs - -### Sometimes flashing only works after a mass erase - -There is seen a problem sometimes where a flash loader run error occurs and is resolved after mass-erase -of the flash: - -``` -2015-12-09T22:01:57 INFO src/stlink-common.c: Successfully loaded flash loader in sram -2015-12-09T22:02:18 ERROR src/stlink-common.c: flash loader run error -2015-12-09T22:02:18 ERROR src/stlink-common.c: run_flash_loader(0x8000000) failed! == -1 -``` - -Issue(s): [#356](https://github.com/texane/stlink/issues/356) - -### Stlink serial corrupts after one probe - -`lsusb -v` before `st-info --probe` with STM32 L1 Discovery board. With stlink firmware `V2.J16.S0`: - -``` -Bus 001 Device 004: ID 0483:3748 STMicroelectronics ST-LINK/V2 -Device Descriptor: - bLength 18 - bDescriptorType 1 - bcdUSB 2.00 - bDeviceClass 0 (Defined at Interface level) - bDeviceSubClass 0 - bDeviceProtocol 0 - bMaxPacketSize0 64 - idVendor 0x0483 STMicroelectronics - idProduct 0x3748 ST-LINK/V2 - bcdDevice 1.00 - iManufacturer 1 STMicroelectronics - iProduct 2 STM32 STLink - iSerial 3 Pÿk^FPgRUB1^C> /etc/modprobe.conf` +* 2. `modprobe -r usb-storage && modprobe usb-storage` +* or 1. `cp stlink_v1.modprobe.conf /etc/modprobe.d` +* 2. `modprobe -r usb-storage && modprobe usb-storage` + +## For STLINKv2 + +You're ready to go :) + +## Build from sources + +``` +$ mkdir build && cd build +$ cmake -DCMAKE_BUILD_TYPE=Debug .. +$ make +``` + +## Using the gdb server + +To run the gdb server: (you do not need sudo if you have set up +permissions correctly) + +``` +$ make && [sudo] ./st-util + +There are a few options: + +./st-util - usage: + + -h, --help Print this help + -vXX, --verbose=XX Specify a specific verbosity level (0..99) + -v, --verbose Specify generally verbose logging + -s X, --stlink_version=X + Choose what version of stlink to use, (defaults to 2) + -1, --stlinkv1 Force stlink version 1 + -p 4242, --listen_port=1234 + Set the gdb server listen port. (default port: 4242) + -m, --multi + Set gdb server to extended mode. + st-util will continue listening for connections after disconnect. + -n, --no-reset + Do not reset board on connection. +``` + +The STLINKv2 device to use can be specified in the environment +variable STLINK_DEVICE on the format `:`. + +Then, in your project directory, someting like this... +(remember, you need to run an _ARM_ gdb, not an x86 gdb) + +``` +$ arm-none-eabi-gdb fancyblink.elf +... +(gdb) tar extended-remote :4242 +... +(gdb) load +Loading section .text, size 0x458 lma 0x8000000 +Loading section .data, size 0x8 lma 0x8000458 +Start address 0x80001c1, load size 1120 +Transfer rate: 1 KB/sec, 560 bytes/write. +(gdb) +... +(gdb) continue +``` + +Have fun! + +## Resetting the chip from GDB + +You may reset the chip using GDB if you want. You'll need to use `target +extended-remote' command like in this session: + +``` +(gdb) target extended-remote localhost:4242 +Remote debugging using localhost:4242 +0x080007a8 in _startup () +(gdb) kill +Kill the program being debugged? (y or n) y +(gdb) run +Starting program: /home/whitequark/ST/apps/bally/firmware.elf +``` + +Remember that you can shorten the commands. `tar ext :4242' is good enough +for GDB. + +## Setting up udev rules + +For convenience, you may install udev rules file, 49-stlinkv*.rules, located +in the root of repository. You will need to copy it to /etc/udev/rules.d, +and then either reboot or execute + +``` +$ udevadm control --reload-rules +$ udevadm trigger +``` + +Udev will now create a /dev/stlinkv2_XX or /dev/stlinkv1_XX file, with the appropriate permissions. +This is currently all the device is for, (only one stlink of each version is supported at +any time presently) + +## Running programs from SRAM + +You can run your firmware directly from SRAM if you want to. Just link +it at 0x20000000 and do + +``` +(gdb) load firmware.elf +``` + +It will be loaded, and pc will be adjusted to point to start of the +code, if it is linked correctly (i.e. ELF has correct entry point). + +## Writing to flash + +The GDB stub ships with a correct memory map, including the flash area. +If you would link your executable to 0x08000000 and then do +(gdb) load firmware.elf +then it would be written to the memory. + +## FAQ + +Q: My breakpoints do not work at all or only work once. + +A: Optimizations can cause severe instruction reordering. For example, +if you are doing something like `REG = 0x100;' in a loop, the code may +be split into two parts: loading 0x100 into some intermediate register +and moving that value to REG. When you set up a breakpoint, GDB will +hook to the first instruction, which may be called only once if there are +enough unused registers. In my experience, -O3 causes that frequently. + +Q: At some point I use GDB command `next', and it hangs. + +A: Sometimes when you will try to use GDB `next' command to skip a loop, +it will use a rather inefficient single-stepping way of doing that. +Set up a breakpoint manually in that case and do `continue'. + +Q: Load command does not work in GDB. + +A: Some people report XML/EXPAT is not enabled by default when compiling +GDB. Memory map parsing thus fail. Use --enable-expat. + +## Currently known working combinations of programmer and target + +STLink v1 (as found on the 32VL Discovery board) + +Known working targets: + +* STM32F100xx (Medium Density VL) +* STM32F103 (according to jpa- on ##stm32) + +No information: + +* everything else! + +STLink v2 (as found on the 32L and F4 Discovery boards), known working targets: + +* STM32F030F4P6 (custom board) +* STM32F0Discovery (STM32F0 Discovery board) +* STM32F100xx (Medium Density VL, as on the 32VL Discovery board) +* STM32L1xx (STM32L Discovery board) +* STM32F103VC, STM32F107RC, STM32L151RB, STM32F205RE and STM32F405RE on custom boards + from [UweBonnes/wiki_fuer_alex](https://github.com/UweBonnes/wiki_fuer_alex/tree/master/layout) +* STM32F103VET6 (HY-STM32 board) +* STM32F105RCT6 (DecaWave EVB1000 board) +* STM32F303xx (STM32F3 Discovery board) +* STM32F407xx (STM32F4 Discovery board) +* STM32F429I-DISCO (STM32F4 Discovery board with LCD) +* STM32F439VIT6 (discovery board reseated CPU) +* STM32L052K8T6 (custom board) +* STM32L151CB (custom board) +* STM32L152RB (STM32L-Discovery board, custom board) +* STM32F051R8T6 (STM320518-EVAL board) + +STLink v2-1 (as found on the Nucleo boards), known working targets: + +* STM32F401xx (STM32 Nucleo-F401RE board) +* STM32F030R8T6 (STM32 Nucleo-F030R8 board) +* STM32F072RBT6 (STM32 Nucleo-F072RB board) +* STM32F103RB (STM32 Nucleo-F103RB board) +* STM32F303RET6 (STM32 Nucleo-F303RE board) +* STM32F334R8 (STM32 Nucleo-F334R8 board) +* STM32F411RET6 (STM32 Nucleo-F411RE board) +* STM32F756NGHx (STMF7 evaluation board) +* STM32L053R8 (STM32 Nucleo-L053R8 board) + +Please report any and all known working combinations so I can update this! + +## Known bugs + +### Sometimes flashing only works after a mass erase + +There is seen a problem sometimes where a flash loader run error occurs and is resolved after mass-erase +of the flash: + +``` +2015-12-09T22:01:57 INFO src/stlink-common.c: Successfully loaded flash loader in sram +2015-12-09T22:02:18 ERROR src/stlink-common.c: flash loader run error +2015-12-09T22:02:18 ERROR src/stlink-common.c: run_flash_loader(0x8000000) failed! == -1 +``` + +Issue(s): [#356](https://github.com/texane/stlink/issues/356) + +## Contributing and versioning + +* The semantic versioning scheme is used. Read more at [semver.org](http://semver.org) +* When creating a pull request, please open first a issue for discussion of new features +* TODO: Enforcement of coding style (linux codestyle + checkpatch) + +## License + +The stlink library and tools are licensed under the [BSD license](LICENSE). With +some exceptions on external components. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 9c5059a49..000000000 --- a/TODO.md +++ /dev/null @@ -1,11 +0,0 @@ -# flash tool - -- improve flash writing, still use word fast write... too slow - -# documentation - -- make README points to doc/tutorial - -# testing - -- compile and test a realtime kernel (e.g ChibiOS) diff --git a/autogen.sh b/autogen.sh deleted file mode 100755 index 2af5ccdac..000000000 --- a/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -autoreconf --install --force --verbose diff --git a/cmake/modules/Find7Zip.cmake b/cmake/modules/Find7Zip.cmake new file mode 100644 index 000000000..c264d12f7 --- /dev/null +++ b/cmake/modules/Find7Zip.cmake @@ -0,0 +1,5 @@ +find_program(ZIP_LOCATION NAMES 7z.exe + HINTS + "C:\\Program Files\\7-Zip\\" + "C:\\Program Files (x86)\\7-Zip\\" +) diff --git a/cmake/modules/FindLibUSB.cmake b/cmake/modules/FindLibUSB.cmake index 7f14ca125..99e872c3e 100644 --- a/cmake/modules/FindLibUSB.cmake +++ b/cmake/modules/FindLibUSB.cmake @@ -6,28 +6,61 @@ # LIBUSB_LIBRARY - The libraries needed to use libusb # LIBUSB_DEFINITIONS - Compiler switches required for using libusb -FIND_PATH(LIBUSB_INCLUDE_DIR NAMES libusb.h - HINTS - /usr - /usr/local - /opt - PATH_SUFFIXES libusb-1.0 - ) +if(WIN32 OR MINGW OR MSYS) + set(LIBUSB_WIN_VERSION "1.0.20") + set(LIBUSB_WIN_ARCHIVE libusb-${LIBUSB_WIN_VERSION}.7z) + set(LIBUSB_WIN_ARCHIVE_PATH ${CMAKE_BINARY_DIR}/${LIBUSB_WIN_ARCHIVE}) + set(LIBUSB_WIN_OUTPUT_FOLDER ${CMAKE_BINARY_DIR}/libusb-${LIBUSB_WIN_VERSION}) -if (APPLE) - set(LIBUSB_NAME libusb-1.0.a) -else() - set(LIBUSB_NAME usb-1.0) + if (EXISTS ${LIBUSB_WIN_ARCHIVE_PATH}) + message(STATUS "libusb archive already in build folder") + else () + message(STATUS "libusb downloading ${LIBUSB_WIN_VERSION}") + file(DOWNLOAD + https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-${LIBUSB_WIN_VERSION}/libusb-${LIBUSB_WIN_VERSION}.7z/download + ${LIBUSB_WIN_ARCHIVE_PATH} + SHOW_PROGRESS) + endif () + + execute_process(COMMAND ${ZIP_LOCATION} x -y ${LIBUSB_WIN_ARCHIVE_PATH} -o${LIBUSB_WIN_OUTPUT_FOLDER}) endif() -FIND_LIBRARY(LIBUSB_LIBRARY NAMES ${LIBUSB_NAME} +find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h HINTS /usr /usr/local /opt + ${LIBUSB_WIN_OUTPUT_FOLDER}/include + PATH_SUFFIXES libusb-1.0 ) -INCLUDE(FindPackageHandleStandardArgs) +if (APPLE) + set(LIBUSB_NAME libusb-1.0.a) +elseif(MSYS OR MINGW) + set(LIBUSB_NAME usb-1.0) +elseif(WIN32) + set(LIBUSB_NAME libusb-1.0.lib) +else() + set(LIBUSB_NAME usb-1.0) +endif() + +if (MSYS OR MINGW) + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + find_library(LIBUSB_LIBRARY NAMES ${LIBUSB_NAME} + HINTS ${LIBUSB_WIN_OUTPUT_FOLDER}/MinGW64/static) + else () + find_library(LIBUSB_LIBRARY NAMES ${LIBUSB_NAME} + HINTS ${LIBUSB_WIN_OUTPUT_FOLDER}/MinGW32/static) + endif () +else () + find_library(LIBUSB_LIBRARY NAMES ${LIBUSB_NAME} + HINTS + /usr + /usr/local + /opt) +endif () + +include(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(Libusb DEFAULT_MSG LIBUSB_LIBRARY LIBUSB_INCLUDE_DIR) -MARK_AS_ADVANCED(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARY) +mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARY) diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 7a101d55d..000000000 --- a/configure.ac +++ /dev/null @@ -1,59 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ(2.61) -AC_INIT([stlink],[1.2.0],[davem@devkitpro.org]) -AC_CONFIG_SRCDIR([src/common.c]) -AC_CONFIG_LIBOBJ_DIR([src]) -AM_INIT_AUTOMAKE([1.10]) - - -# Checks for programs. -AC_PROG_CC -AC_PROG_INSTALL -AC_CANONICAL_HOST -AC_CANONICAL_BUILD -AC_PROG_RANLIB -AM_PROG_CC_C_O - -AC_CHECK_HEADERS(sys/mman.h) -AC_CHECK_HEADERS(sys/poll.h) -AC_REPLACE_FUNCS(mmap) - -if ! hash pkg-config; then - echo "ERROR: pkg-config is needed..." - exit 1 -fi - -# Checks for libraries. -PKG_CHECK_MODULES(USB, libusb-1.0 >= 1.0.0,, - AC_MSG_ERROR([*** Required libusb-1.0 >= 1.0.0 not installed ***])) -AC_CHECK_LIB([usbpath],[usb_path2devnum],,,-lusb) - -LIBS="$LIBS $USB_LIBS" -CFLAGS="$CFLAGS $USB_CFLAGS" - -case "${host}" in - *-mingw32*) - LIBS="$LIBS -lws2_32" - CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $CPPFLAGS" - AC_DEFINE_UNQUOTED(MINGW,1,[This is a MinGW system]) - AM_CONDITIONAL(MINGW, true) - ;; - *) - AM_CONDITIONAL(MINGW, false) -esac - -STLINK_HAS_GUI= -AC_ARG_WITH([gtk_gui], AS_HELP_STRING([--with-gtk-gui], [enable GTK3+ gui])) -if test "x$with_gtk_gui" = "xyes"; then - PKG_CHECK_MODULES([GTK3], [gtk+-3.0]) - PKG_CHECK_MODULES([GLIB], [glib-2.0 > 2.32.0]) - STLINK_HAS_GUI=src/tools/gui - AC_CONFIG_FILES([src/tools/gui/Makefile]) -fi -AC_SUBST([STLINK_HAS_GUI]) - -AC_CONFIG_FILES([Makefile]) -AC_OUTPUT - diff --git a/doc/build_mingw.md b/doc/build_mingw.md new file mode 100644 index 000000000..6327b57c6 --- /dev/null +++ b/doc/build_mingw.md @@ -0,0 +1,23 @@ +Building with MinGW under Windows +================================= + +## Prequistes + +* 7Zip +* CMake 2.8 or higher +* MinGW64 GCC toolchain (5.3.0) + +## Installation + +1. Install 7Zip from http://www.7-zip.org +2. Install CMake from https://cmake.org/download +3. Install MinGW64 from https://sourceforge.net/projects/mingw-w64 (mingw-w64-install.exe) +4. Git clone or download stlink sourcefiles zip +5. Create build folder in source + +# Building + +Check and execute `\scripts\mingw64-build.bat` + +NOTE: when installing different toolchains make sure you edit the path in the `mingw64-build.bat` + the build script uses currently `C:\Program Files\mingw-w64\x86_64-5.3.0-win32-sjlj-rt_v4-rev0\mingw64\bin` diff --git a/doc/release.md b/doc/release.md new file mode 100644 index 000000000..c2dca87b2 --- /dev/null +++ b/doc/release.md @@ -0,0 +1,10 @@ +Release +======= + +This document describes the steps takes for developers to create a release + +1. Update `.version` with semantic version: `x.x.x` +2. Update `README.md` with semantic version `x.x.x` in commits badge +2. Create and push git tag and commits `git tag x.x.x` +3. Create source tarball/zipfile with `make dist` +4. Create binary package with `make package` diff --git a/scripts/appveyor-mingw.sh b/scripts/appveyor-mingw.sh new file mode 100644 index 000000000..4842410ba --- /dev/null +++ b/scripts/appveyor-mingw.sh @@ -0,0 +1,21 @@ +#!/bin/sh +set -e +cd `dirname "$0"`/.. +if [ "$ARCH" = "i686" ]; then + f=i686-4.9.2-release-win32-sjlj-rt_v3-rev1.7z + if ! [ -e $f ]; then + curl -LsSO http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/4.9.2/threads-win32/sjlj/$f + fi + 7z x $f > /dev/null + mv mingw32 /MinGW +else + f=x86_64-4.9.2-release-win32-seh-rt_v3-rev1.7z + if ! [ -e $f ]; then + curl -LsSO http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/4.9.2/threads-win32/seh/$f + fi + 7z x $f > /dev/null + mv mingw64 /MinGW +fi +cd build +cmake .. -G"$GENERATOR" +cmake --build . --config RelWithDebInfo diff --git a/scripts/mingw64-build.bat b/scripts/mingw64-build.bat new file mode 100644 index 000000000..18397f0e0 --- /dev/null +++ b/scripts/mingw64-build.bat @@ -0,0 +1,12 @@ +### +# MinGW64 build helper for windows +# * Sets the correct PATH to compiler and tools +# * Generates MinGW Makefile with CMake +# * Build binaries with mingw32-make +# +# Read documentation about this file in doc/build_mingw.md +### +@echo off +set PATH=C:\Program Files (x86)\CMake\bin;C:\Program Files\CMake\bin;C:\Program Files\mingw-w64\x86_64-5.3.0-win32-sjlj-rt_v4-rev0\mingw64\bin;%PATH% +cmake -G "MinGW Makefiles" .. +mingw32-make diff --git a/src/common.c b/src/common.c index ebc1f8e51..47c6e35be 100644 --- a/src/common.c +++ b/src/common.c @@ -15,7 +15,7 @@ #include "stlink/logging.h" #ifndef _WIN32 -#define O_BINARY 0 +#define O_BINARY 0 //! @todo get rid of this OH MY (@xor-gate) #endif /* todo: stm32l15xxx flash memory, pm0062 manual */ diff --git a/src/gdbserver/gdb-remote.c b/src/gdbserver/gdb-remote.c index 73a157d34..a5d3f4c03 100644 --- a/src/gdbserver/gdb-remote.c +++ b/src/gdbserver/gdb-remote.c @@ -7,11 +7,11 @@ #include #include #include -#include #include #ifdef __MINGW32__ -#include "mingw.h" +#include #else +#include #include #endif diff --git a/src/gdbserver/gdb-server.c b/src/gdbserver/gdb-server.c index efe97e406..5a85d0f0b 100644 --- a/src/gdbserver/gdb-server.c +++ b/src/gdbserver/gdb-server.c @@ -9,11 +9,11 @@ #include #include #include -#include #include #ifdef __MINGW32__ -#include "mingw.h" +#include #else +#include #include #include #include diff --git a/src/tools/gui/Makefile.am b/src/tools/gui/Makefile.am deleted file mode 100644 index 23e582fa8..000000000 --- a/src/tools/gui/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -bin_PROGRAMS = stlink-gui - -stlink_gui_SOURCES = \ - stlink-gui.c \ - stlink-gui.h - -stlink_gui_CPPFLAGS = \ - -I$(top_srcdir)/include \ - $(AM_CPPFLAGS) \ - -I$(top_srcdir)/src \ - @GTK3_CFLAGS@ - -stlink_gui_CFLAGS = \ - $(WARN_CFLAGS) \ - $(AM_CFLAGS) \ - -DSTLINK_UI_DIR="\"$(uidir)\"" - -stlink_gui_LDFLAGS = \ - $(AM_LDFLAGS) - -stlink_gui_LDADD = \ - $(INTLLIBS) \ - $(top_builddir)/libstlink.a \ - @GTK3_LIBS@ - -uidir = $(pkgdatadir)/ui -ui_DATA = stlink-gui.ui -EXTRA_DIST = $(ui_DATA) - --include $(top_srcdir)/git.mk diff --git a/src/usb.c b/src/usb.c index 6dcd7c913..7054fa1a4 100644 --- a/src/usb.c +++ b/src/usb.c @@ -45,7 +45,7 @@ ssize_t send_recv(struct stlink_libusb* handle, int terminate, return -1; } else if ((size_t)res != txsize) { printf("[!] send_recv send request wrote %u bytes (instead of %u).\n", - (unsigned int)res, (unsigned int)txsize); + (unsigned int)res, (unsigned int)txsize); } if (rxsize != 0) {