diff --git a/CMakeLists.txt b/CMakeLists.txt index 0b615ca8..4dc64ca4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,9 +11,40 @@ if (NOT NRF5_SDK_PATH) message(FATAL_ERROR "The path to the NRF52 SDK must be specified on the command line (add -DNRF5_SDK_PATH=") endif () -if (NOT NRFJPROG) - message(FATAL_ERROR "the path to the tool nrfjprog must be specified on the command line (add -DNRFJPROG=") -endif () +if(NOT USE_JLINK AND NOT USE_GDB_CLIENT) + set(USE_JLINK true) +endif() + +if(USE_JLINK) + if (NOT NRFJPROG) + message(FATAL_ERROR "the path to the tool nrfjprog must be specified on the command line (add -DNRFJPROG=") + endif () +endif() + +if(USE_GDB_CLIENT) + if(NOT GDB_CLIENT_BIN_PATH) + set(GDB_CLIENT_BIN_PATH "arm-none-eabi-gdb") + endif() + + if(NOT GDB_CLIENT_TARGET_REMOTE) + message(FATAL_ERROR "The GDB target must be specified (add -DGDB_CLIENT_TARGET_REMOTE=") + endif() +endif() + +message("BUILD CONFIGURATION") +message("-------------------") +message(" * Toolchain : " ${ARM_NONE_EABI_TOOLCHAIN_PATH}) +message(" * NRF52 SDK : " ${NRF5_SDK_PATH}) +set(PROGRAMMER "???") +if(USE_JLINK) + message(" * Programmer/debugger : JLINK") + message(" * NrfJprog : " ${NRFJPROG}) +elseif(USE_GDB_CLIENT) + message(" * Programmer/debugger : GDB Client") + message(" * GDB Client path : " ${GDB_CLIENT_BIN_PATH}) + message(" * GDB Target : " ${GDB_CLIENT_TARGET_REMOTE}) +endif() + include("cmake-nRF5x/CMake_nRF5x.cmake") add_subdirectory(src) diff --git a/README.md b/README.md index 77ea0baa..d31e70d9 100644 --- a/README.md +++ b/README.md @@ -42,23 +42,72 @@ See [this page](./doc/PinetimeStubWithNrf52DK.md) * Download and unzip arm-none-eabi and NRF52 SDK * Clone this repo - * Call CMake with the following command line argument + * **[JLINK]** Call CMake with the following command line argument - - -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain] - - -DNRF5_SDK_PATH=[Path to the SDK] - - -DNRFJPROG=[Path to NRFJProg] + - -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain directory] + - -DNRF5_SDK_PATH=[Path to the SDK directory] + - -DUSE_JLINK=1 + - -DNRFJPROG=[Path to NRFJProg executable] + * OR + * **[GDB CLIENT (if you use a BlackMagicProbe, for example)]** Call CMake with the following command line argument + + - -DARM_NONE_EABI_TOOLCHAIN_PATH=[Path to the toolchain directory] + - -DNRF5_SDK_PATH=[Path to the SDK directory] + - -DUSE_GDB_CLIENT=1 + - -DGDB_CLIENT_BIN_PATH=[Path to arm-none-eabi-gdb executable] + - -DGDB_CLIENT_TARGET_REMOTE=[Target remote connetion string. Ex : /dev/ttyACM0] + + * Optionally, you can define MERGEHEX with the path to the ```mergehex``` tool from [NRF5X Command Line Tools](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_nrf5x_cltools%2FUG%2Fcltools%2Fnrf5x_command_line_tools_lpage.html&cp=6_1) to be able to merge the application and softdevice into one HEX file. In this case the merged file is generated in src/pinetime-app-full.hex + + - -DMERGEHEX=[Path to the mergehex executable] + +JLINK ``` $ mkdir build $ cd build -$ cmake -DCMAKE_BUILD_TYPE=Debug -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DNRFJPROG=... ../ +$ cmake -DCMAKE_BUILD_TYPE=Debug -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_JLINK=1 -DNRFJPROG=... ../ +``` + +GDB (Back Magic Probe) +``` +$ mkdir build +$ cd build +$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_GDB_CLIENT=1 -DGDB_CLIENT_BIN_PATH=... -DGDB_CLIENT_TARGET_REMOTE=... -DMERGEHEX=... ../ ``` * Make ``` -$ make -j +$ make -j pinetime-app ``` +## How to program + + * Erase +``` +$ make FLASH_ERASE +``` + +* Flash softdevice & application +``` +$ make FLASH_SOFTDEVICE +$ make FLASH_pinetime-app +``` + +Or, with ```mergehex``` +``` +$ make FLASH_MERGED_pinetime-app +``` + +* For your information : list make targets +``` +$ make help +``` + + + + + ## RTT RTT is a feature from Segger's JLink devices that allows bidirectionnal communication between the debugger and the target. diff --git a/cmake-nRF5x/CMake_nRF5x.cmake b/cmake-nRF5x/CMake_nRF5x.cmake index d50ef609..a8266041 100755 --- a/cmake-nRF5x/CMake_nRF5x.cmake +++ b/cmake-nRF5x/CMake_nRF5x.cmake @@ -5,9 +5,9 @@ if (NOT NRF5_SDK_PATH) message(FATAL_ERROR "The path to the nRF5 SDK (NRF5_SDK_PATH) must be set.") endif () -if (NOT NRFJPROG) - message(FATAL_ERROR "The path to the nrfjprog utility (NRFJPROG) must be set.") -endif () +#if (NOT NRFJPROG) +# message(FATAL_ERROR "The path to the nrfjprog utility (NRFJPROG) must be set.") +#endif () # convert toolchain path to bin path if(DEFINED ARM_NONE_EABI_TOOLCHAIN_PATH) @@ -323,17 +323,28 @@ macro(nRF5x_setup) ) # adds target for erasing and flashing the board with a softdevice - add_custom_target(FLASH_SOFTDEVICE ALL - COMMAND ${NRFJPROG} --program ${SOFTDEVICE_PATH} -f ${NRF_TARGET} --sectorerase - COMMAND sleep 0.5s - COMMAND ${NRFJPROG} --reset -f ${NRF_TARGET} - COMMENT "flashing SoftDevice" - ) + if(USE_JLINK) + add_custom_target(FLASH_SOFTDEVICE ALL + COMMAND ${NRFJPROG} --program ${SOFTDEVICE_PATH} -f ${NRF_TARGET} --sectorerase + COMMAND sleep 0.5s + COMMAND ${NRFJPROG} --reset -f ${NRF_TARGET} + COMMENT "flashing SoftDevice" + ) - add_custom_target(FLASH_ERASE ALL - COMMAND ${NRFJPROG} --eraseall -f ${NRF_TARGET} - COMMENT "erasing flashing" - ) + add_custom_target(FLASH_ERASE ALL + COMMAND ${NRFJPROG} --eraseall -f ${NRF_TARGET} + COMMENT "erasing flashing" + ) + elseif(USE_GDB_CLIENT) + add_custom_target(FLASH_SOFTDEVICE ALL + COMMAND ${GDB_CLIENT_BIN_PATH} -nx --batch -ex 'target extended-remote ${GDB_CLIENT_TARGET_REMOTE}' -ex 'monitor swdp_scan' -ex 'attach 1' -ex 'load' -ex 'kill' ${SOFTDEVICE_PATH} + COMMENT "flashing SoftDevice" + ) + add_custom_target(FLASH_ERASE ALL + COMMAND ${GDB_CLIENT_BIN_PATH} -nx --batch -ex 'target extended-remote ${GDB_CLIENT_TARGET_REMOTE}' -ex 'monitor swdp_scan' -ex 'attach 1' -ex 'mon erase_mass' + COMMENT "erasing flashing" + ) + endif() if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin") set(TERMINAL "open") @@ -343,13 +354,15 @@ macro(nRF5x_setup) set(TERMINAL "gnome-terminal") endif() - add_custom_target(START_JLINK ALL - COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkGDBServer-${NRF_TARGET}" - COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkExe-${NRF_TARGET}" - COMMAND sleep 2s - COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkRTTClient" - COMMENT "started JLink commands" - ) + if(USE_JLINK) + add_custom_target(START_JLINK ALL + COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkGDBServer-${NRF_TARGET}" + COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkExe-${NRF_TARGET}" + COMMAND sleep 2s + COMMAND ${TERMINAL} "${DIR_OF_nRF5x_CMAKE}/runJLinkRTTClient" + COMMENT "started JLink commands" + ) + endif() endmacro(nRF5x_setup) @@ -368,14 +381,46 @@ macro(nRF5x_addExecutable EXECUTABLE_NAME SOURCE_FILES) COMMAND ${CMAKE_OBJCOPY} -O ihex ${EXECUTABLE_NAME}.out "${EXECUTABLE_NAME}.hex" COMMENT "post build steps for ${EXECUTABLE_NAME}") + if(MERGEHEX) + add_custom_command(TARGET ${EXECUTABLE_NAME} + POST_BUILD + COMMAND ${MERGEHEX} --merge ${EXECUTABLE_NAME}.hex ${NRF5_SDK_PATH}/components/softdevice/s132/hex/s132_nrf52_6.1.1_softdevice.hex --output ${EXECUTABLE_NAME}-full.hex + COMMENT "merging HEX files") + + if(USE_JLINK) + add_custom_target("FLASH_MERGED_${EXECUTABLE_NAME}" ALL + DEPENDS ${EXECUTABLE_NAME} + COMMAND ${NRFJPROG} --program ${EXECUTABLE_NAME}-full.hex -f ${NRF_TARGET} --sectorerase + COMMAND sleep 0.5s + COMMAND ${NRFJPROG} --reset -f ${NRF_TARGET} + COMMENT "flashing ${EXECUTABLE_NAME}-full.hex" + ) + elseif(USE_GDB_CLIENT) + add_custom_target("FLASH_MERGED_${EXECUTABLE_NAME}" ALL + DEPENDS ${EXECUTABLE_NAME} + COMMAND ${GDB_CLIENT_BIN_PATH} -nx --batch -ex 'target extended-remote ${GDB_CLIENT_TARGET_REMOTE}' -ex 'monitor swdp_scan' -ex 'attach 1' -ex 'load' -ex 'kill' ${EXECUTABLE_NAME}-full.hex + COMMENT "flashing ${EXECUTABLE_NAME}-full.hex" + ) + endif() + endif() + # custom target for flashing the board - add_custom_target("FLASH_${EXECUTABLE_NAME}" ALL - DEPENDS ${EXECUTABLE_NAME} - COMMAND ${NRFJPROG} --program ${EXECUTABLE_NAME}.hex -f ${NRF_TARGET} --sectorerase - COMMAND sleep 0.5s - COMMAND ${NRFJPROG} --reset -f ${NRF_TARGET} - COMMENT "flashing ${EXECUTABLE_NAME}.hex" - ) + if(USE_JLINK) + add_custom_target("FLASH_${EXECUTABLE_NAME}" ALL + DEPENDS ${EXECUTABLE_NAME} + COMMAND ${NRFJPROG} --program ${EXECUTABLE_NAME}.hex -f ${NRF_TARGET} --sectorerase + COMMAND sleep 0.5s + COMMAND ${NRFJPROG} --reset -f ${NRF_TARGET} + COMMENT "flashing ${EXECUTABLE_NAME}.hex" + ) + elseif(USE_GDB_CLIENT) + add_custom_target("FLASH_${EXECUTABLE_NAME}" ALL + DEPENDS ${EXECUTABLE_NAME} + COMMAND ${GDB_CLIENT_BIN_PATH} -nx --batch -ex 'target extended-remote ${GDB_CLIENT_TARGET_REMOTE}' -ex 'monitor swdp_scan' -ex 'attach 1' -ex 'load' -ex 'kill' ${EXECUTABLE_NAME}.hex + COMMENT "flashing ${EXECUTABLE_NAME}.hex" + ) + + endif() endmacro()