diff --git a/firmware/README b/firmware/README index 89d31a7f..6ded0231 100644 --- a/firmware/README +++ b/firmware/README @@ -42,15 +42,7 @@ To start up HackRF One in DFU mode, hold down the DFU button while powering it on or while pressing and releasing the RESET button. Release the DFU button after the 3V3 LED illuminates. -With dfu-util and dfu-suffix (from the dfu-util package) installed and with the -HackRF operating in DFU mode, you can build firmware for RAM and load it with: - -$ cd hackrf_usb -$ mkdir build -$ cd build -$ cmake .. -DRUN_FROM=RAM -$ make hackrf_usb-program - -Alternatively you can load a .dfu file from a release package with: +A .dfu file is built by default when building firmware. Alternatively you can +load a known good .dfu file from a release package with: $ dfu-util --device 1fc9:000c --alt 0 --download hackrf_usb_ram.dfu diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index ad130dd6..8806a268 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -3,6 +3,7 @@ # Copyright 2012 Michael Ossmann # Copyright 2012 Benjamin Vernoux # Copyright 2012 Jared Boone +# Copyright 2016 Dominic Spill # # This file is part of HackRF. # @@ -51,10 +52,6 @@ if(NOT DEFINED BOARD) set(BOARD HACKRF_ONE) endif() -if(NOT DEFINED RUN_FROM) - set(RUN_FROM SPIFI) -endif() - if(BOARD STREQUAL "HACKRF_ONE") set(MCU_PARTNO LPC4320) else() @@ -65,15 +62,11 @@ if(NOT DEFINED SRC_M0) set(SRC_M0 "${PATH_HACKRF_FIRMWARE_COMMON}/m0_sleep.c") endif() -SET(HACKRF_OPTS "-D${BOARD} -DLPC43XX -D${MCU_PARTNO} -DTX_ENABLE -D'VERSION_STRING=\"git-${VERSION}\"' -DRUN_FROM=${RUN_FROM}") +SET(HACKRF_OPTS "-D${BOARD} -DLPC43XX -D${MCU_PARTNO} -DTX_ENABLE -D'VERSION_STRING=\"git-${VERSION}\"'") -SET(LDSCRIPT_M4 "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld") -if( RUN_FROM STREQUAL "RAM") - SET(LDSCRIPT_M4 "${LDSCRIPT_M4} -Tlibopencm3_lpc43xx.ld") -else() - SET(LDSCRIPT_M4 "${LDSCRIPT_M4} -Tlibopencm3_lpc43xx_rom_to_ram.ld") -endif() -SET(LDSCRIPT_M4 "${LDSCRIPT_M4} -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") +SET(LDSCRIPT_M4 "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld -Tlibopencm3_lpc43xx_rom_to_ram.ld -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") + +SET(LDSCRIPT_M4_DFU "-T${PATH_HACKRF_FIRMWARE_COMMON}/${MCU_PARTNO}_M4_memory.ld -Tlibopencm3_lpc43xx.ld -T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M4_M0_image_from_text.ld") SET(LDSCRIPT_M0 "-T${PATH_HACKRF_FIRMWARE_COMMON}/LPC43xx_M0_memory.ld -Tlibopencm3_lpc43xx_m0.ld") @@ -93,6 +86,7 @@ SET(CPUFLAGS_M4 "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16") SET(CFLAGS_M4 "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4") SET(CXXFLAGS_M4 "-std=gnu++0x ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4") SET(LDFLAGS_M4 "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4} -Xlinker -Map=m4.map") +SET(LDFLAGS_M4_DFU "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4_DFU} -Xlinker -Map=m4.map") set(BUILD_SHARED_LIBS OFF) @@ -100,6 +94,27 @@ include_directories("${LIBOPENCM3}/include/") include_directories("${PATH_HACKRF_FIRMWARE_COMMON}") macro(DeclareTargets) + SET(SRC_M4 + ${SRC_M4} + ${PATH_HACKRF_FIRMWARE_COMMON}/hackrf_core.c + ${PATH_HACKRF_FIRMWARE_COMMON}/sgpio.c + ${PATH_HACKRF_FIRMWARE_COMMON}/rf_path.c + ${PATH_HACKRF_FIRMWARE_COMMON}/si5351c.c + ${PATH_HACKRF_FIRMWARE_COMMON}/max2837.c + ${PATH_HACKRF_FIRMWARE_COMMON}/max2837_target.c + ${PATH_HACKRF_FIRMWARE_COMMON}/max5864.c + ${PATH_HACKRF_FIRMWARE_COMMON}/max5864_target.c + ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071.c + ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_bus.c + ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_lpc.c + ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071_spi.c + ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv.c + ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv_target.c + ${PATH_HACKRF_FIRMWARE_COMMON}/spi_bus.c + ${PATH_HACKRF_FIRMWARE_COMMON}/spi_ssp.c + ${PATH_HACKRF_FIRMWARE_COMMON}/gpio_lpc.c + ) + configure_file( ${PATH_HACKRF_FIRMWARE_COMMON}/m0_bin.s.cmake m0_bin.s @@ -130,29 +145,13 @@ macro(DeclareTargets) COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_m0.elf ${PROJECT_NAME}_m0.bin ) - add_executable(${PROJECT_NAME}.elf - ${SRC_M4} - ${PATH_HACKRF_FIRMWARE_COMMON}/hackrf_core.c - ${PATH_HACKRF_FIRMWARE_COMMON}/sgpio.c - ${PATH_HACKRF_FIRMWARE_COMMON}/rf_path.c - ${PATH_HACKRF_FIRMWARE_COMMON}/si5351c.c - ${PATH_HACKRF_FIRMWARE_COMMON}/max2837.c - ${PATH_HACKRF_FIRMWARE_COMMON}/max2837_target.c - ${PATH_HACKRF_FIRMWARE_COMMON}/max5864.c - ${PATH_HACKRF_FIRMWARE_COMMON}/max5864_target.c - ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071.c - ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_bus.c - ${PATH_HACKRF_FIRMWARE_COMMON}/i2c_lpc.c - ${PATH_HACKRF_FIRMWARE_COMMON}/rffc5071_spi.c - ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv.c - ${PATH_HACKRF_FIRMWARE_COMMON}/w25q80bv_target.c - ${PATH_HACKRF_FIRMWARE_COMMON}/spi_bus.c - ${PATH_HACKRF_FIRMWARE_COMMON}/spi_ssp.c - ${PATH_HACKRF_FIRMWARE_COMMON}/gpio_lpc.c - m0_bin.s - ) + # Object files to be linked for both DFU and SPI flash versions + add_library(${PROJECT_NAME}_objects OBJECT ${SRC_M4} m0_bin.s) + set_target_properties(${PROJECT_NAME}_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4}") + add_dependencies(${PROJECT_NAME}_objects ${PROJECT_NAME}_m0.bin) - add_dependencies(${PROJECT_NAME}.elf ${PROJECT_NAME}_m0.bin) + # SPI flash version + add_executable(${PROJECT_NAME}.elf $) target_link_libraries( ${PROJECT_NAME}.elf @@ -162,22 +161,40 @@ macro(DeclareTargets) m ) - set_target_properties(${PROJECT_NAME}.elf PROPERTIES COMPILE_FLAGS "${CFLAGS_M4}") set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4}") add_custom_target( - ${PROJECT_NAME}.bin + ${PROJECT_NAME}.bin ALL DEPENDS ${PROJECT_NAME}.elf COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin ) + # DFU - using a differnet LD script to run directly from RAM + add_executable(${PROJECT_NAME}_dfu.elf $) + + target_link_libraries( + ${PROJECT_NAME}_dfu.elf + c + nosys + opencm3_lpc43xx + m + ) + + set_target_properties(${PROJECT_NAME}_dfu.elf PROPERTIES LINK_FLAGS "${LDFLAGS_M4_DFU}") + + add_custom_target( + ${PROJECT_NAME}_dfu.bin + DEPENDS ${PROJECT_NAME}_dfu.elf + COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_dfu.elf ${PROJECT_NAME}_dfu.bin + ) + add_custom_target( ${PROJECT_NAME}.dfu ${DFU_ALL} - DEPENDS ${PROJECT_NAME}.bin + DEPENDS ${PROJECT_NAME}_dfu.bin COMMAND rm -f _tmp.dfu _header.bin - COMMAND cp ${PROJECT_NAME}.bin _tmp.dfu + COMMAND cp ${PROJECT_NAME}_dfu.bin _tmp.dfu COMMAND ${DFU_COMMAND} - COMMAND python -c \"import os.path\; import struct\; print\('0000000: da ff ' + ' '.join\(map\(lambda s: '%02x' % ord\(s\), struct.pack\(' _header.bin + COMMAND python -c \"import os.path\; import struct\; print\('0000000: da ff ' + ' '.join\(map\(lambda s: '%02x' % ord\(s\), struct.pack\(' _header.bin COMMAND cat _header.bin _tmp.dfu >${PROJECT_NAME}.dfu COMMAND rm -f _tmp.dfu _header.bin )