From f041d2686a0b7019db0e75bac32f898f392ddb32 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 27 Mar 2018 16:20:37 -0600 Subject: [PATCH 1/3] Pull libusb from GitHub rather than SourceForge --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 93bb2a46..048a2193 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,7 +7,7 @@ configuration: init: - C:\"Program Files (x86)"\"Microsoft Visual Studio 14.0"\VC\vcvarsall.bat %PLATFORM% install: - - appveyor DownloadFile "https://downloads.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z?r=https%3A%2F%2Fsourceforge.net%2Fprojects%2Flibusb%2Ffiles%2Flibusb-1.0%2Flibusb-1.0.21%2F&ts=1485478643&use_mirror=cytranet" -FileName "C:\libusb.7z" + - appveyor DownloadFile "https://github.com/libusb/libusb/releases/download/v1.0.22/libusb-1.0.22.7z" -FileName "C:\libusb.7z" - 7z x -y "C:\libusb.7z" -o"C:\libusb" - appveyor DownloadFile "http://mirrors.kernel.org/sourceware/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" - 7z x -y "C:\pthreads-w32-release.zip" -o"C:\pthreads" From 70d189bcdcdba7a81f2c3155e12fc2ba37345a50 Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 27 Mar 2018 16:35:06 -0600 Subject: [PATCH 2/3] Fix appveyor config formatting --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 048a2193..14cb55e3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -7,7 +7,7 @@ configuration: init: - C:\"Program Files (x86)"\"Microsoft Visual Studio 14.0"\VC\vcvarsall.bat %PLATFORM% install: - - appveyor DownloadFile "https://github.com/libusb/libusb/releases/download/v1.0.22/libusb-1.0.22.7z" -FileName "C:\libusb.7z" + - appveyor DownloadFile "https://github.com/libusb/libusb/releases/download/v1.0.22/libusb-1.0.22.7z" -FileName "C:\libusb.7z" - 7z x -y "C:\libusb.7z" -o"C:\libusb" - appveyor DownloadFile "http://mirrors.kernel.org/sourceware/pthreads-win32/pthreads-w32-2-9-1-release.zip" -FileName "C:\pthreads-w32-release.zip" - 7z x -y "C:\pthreads-w32-release.zip" -o"C:\pthreads" From bde5ca9f58358254efda0b1ed6ca19387a615eab Mon Sep 17 00:00:00 2001 From: Dominic Spill Date: Tue, 27 Mar 2018 18:08:49 -0600 Subject: [PATCH 3/3] DFU serial number - avoid reading serial from flash chip Set a DFU mode specific serial number --- firmware/hackrf-common.cmake | 11 +++++++---- firmware/hackrf_usb/hackrf_usb.c | 2 ++ firmware/hackrf_usb/usb_descriptor.c | 22 +++++++++++++++++++++- host/libhackrf/src/hackrf.c | 23 +++++++++++------------ 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/firmware/hackrf-common.cmake b/firmware/hackrf-common.cmake index b61a86fd..8a456e04 100644 --- a/firmware/hackrf-common.cmake +++ b/firmware/hackrf-common.cmake @@ -86,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(CFLAGS_M4_DFU "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4 -DDFU_MODE") SET(LDFLAGS_M4_DFU "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4_DFU} -Xlinker -Map=m4.map") set(BUILD_SHARED_LIBS OFF) @@ -158,12 +159,10 @@ macro(DeclareTargets) COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_m0.elf ${PROJECT_NAME}_m0.bin ) - # Object files to be linked for both DFU and SPI flash versions + # Object files to be linked for 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) - - # SPI flash version add_executable(${PROJECT_NAME}.elf $) target_link_libraries( @@ -183,7 +182,11 @@ macro(DeclareTargets) ) # DFU - using a differnet LD script to run directly from RAM - add_executable(${PROJECT_NAME}_dfu.elf $) + # Object files to be linked for DFU flash versions + add_library(${PROJECT_NAME}_dfu_objects OBJECT ${SRC_M4} m0_bin.s) + set_target_properties(${PROJECT_NAME}_dfu_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4_DFU}") + add_dependencies(${PROJECT_NAME}_dfu_objects ${PROJECT_NAME}_m0.bin) + add_executable(${PROJECT_NAME}_dfu.elf $) target_link_libraries( ${PROJECT_NAME}_dfu.elf diff --git a/firmware/hackrf_usb/hackrf_usb.c b/firmware/hackrf_usb/hackrf_usb.c index 7c5047b8..5d0c6ea4 100644 --- a/firmware/hackrf_usb/hackrf_usb.c +++ b/firmware/hackrf_usb/hackrf_usb.c @@ -173,7 +173,9 @@ int main(void) { #endif cpu_clock_init(); +#ifndef DFU_MODE usb_set_descriptor_by_serial_number(); +#endif usb_set_configuration_changed_cb(usb_configuration_changed); usb_peripheral_reset(); diff --git a/firmware/hackrf_usb/usb_descriptor.c b/firmware/hackrf_usb/usb_descriptor.c index fbe7acf5..9b8e08cd 100644 --- a/firmware/hackrf_usb/usb_descriptor.c +++ b/firmware/hackrf_usb/usb_descriptor.c @@ -253,8 +253,28 @@ uint8_t usb_descriptor_string_config_description[] = { 'r', 0x00, }; - +#ifdef DFU_MODE +uint8_t usb_descriptor_string_serial_number[] = { + 30, // bLength + USB_DESCRIPTOR_TYPE_STRING, // bDescriptorType + 'R', 0x00, + 'u', 0x00, + 'n', 0x00, + 'n', 0x00, + 'i', 0x00, + 'n', 0x00, + 'g', 0x00, + 'F', 0x00, + 'r', 0x00, + 'o', 0x00, + 'm', 0x00, + 'R', 0x00, + 'A', 0x00, + 'M', 0x00, +}; +#else uint8_t usb_descriptor_string_serial_number[USB_DESCRIPTOR_STRING_SERIAL_BUF_LEN]; +#endif uint8_t* usb_descriptor_strings[] = { usb_descriptor_string_languages, diff --git a/host/libhackrf/src/hackrf.c b/host/libhackrf/src/hackrf.c index 1bf45749..b7cc6216 100644 --- a/host/libhackrf/src/hackrf.c +++ b/host/libhackrf/src/hackrf.c @@ -101,6 +101,7 @@ typedef enum { #define TRANSFER_COUNT 4 #define TRANSFER_BUFFER_SIZE 262144 +#define USB_MAX_SERIAL_LENGTH 32 struct hackrf_device { libusb_device_handle* usb_device; @@ -437,10 +438,11 @@ hackrf_device_list_t* ADDCALL hackrf_device_list() continue; } serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); - if( serial_number_length == 32 ) { - serial_number[32] = 0; - list->serial_numbers[idx] = strdup(serial_number); - } + if( serial_number_length >= USB_MAX_SERIAL_LENGTH ) + serial_number_length = USB_MAX_SERIAL_LENGTH; + + serial_number[serial_number_length] = 0; + list->serial_numbers[idx] = strdup(serial_number); libusb_close(usb_device); usb_device = NULL; @@ -505,14 +507,11 @@ libusb_device_handle* hackrf_open_usb(const char* const desired_serial_number) continue; } serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); - if( serial_number_length == 32 ) { - serial_number[32] = 0; - if( strncmp(serial_number + 32-match_len, desired_serial_number, match_len) == 0 ) { - break; - } else { - libusb_close(usb_device); - usb_device = NULL; - } + if( serial_number_length >= USB_MAX_SERIAL_LENGTH ) + serial_number_length = USB_MAX_SERIAL_LENGTH; + serial_number[serial_number_length] = 0; + if( strncmp(serial_number + serial_number_length-match_len, desired_serial_number, match_len) == 0 ) { + break; } else { libusb_close(usb_device); usb_device = NULL;