DFU serial number - avoid reading serial from flash chip

Set a DFU mode specific serial number
This commit is contained in:
Dominic Spill
2018-03-27 18:08:49 -06:00
parent 70d189bcdc
commit bde5ca9f58
4 changed files with 41 additions and 17 deletions

View File

@ -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(CFLAGS_M4 "-std=gnu99 ${CFLAGS_COMMON} ${CPUFLAGS_M4} -DLPC43XX_M4")
SET(CXXFLAGS_M4 "-std=gnu++0x ${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 "${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(LDFLAGS_M4_DFU "${LDFLAGS_COMMON} ${CPUFLAGS_M4} ${LDSCRIPT_M4_DFU} -Xlinker -Map=m4.map")
set(BUILD_SHARED_LIBS OFF) set(BUILD_SHARED_LIBS OFF)
@ -158,12 +159,10 @@ macro(DeclareTargets)
COMMAND ${CMAKE_OBJCOPY} -Obinary ${PROJECT_NAME}_m0.elf ${PROJECT_NAME}_m0.bin 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) add_library(${PROJECT_NAME}_objects OBJECT ${SRC_M4} m0_bin.s)
set_target_properties(${PROJECT_NAME}_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4}") set_target_properties(${PROJECT_NAME}_objects PROPERTIES COMPILE_FLAGS "${CFLAGS_M4}")
add_dependencies(${PROJECT_NAME}_objects ${PROJECT_NAME}_m0.bin) add_dependencies(${PROJECT_NAME}_objects ${PROJECT_NAME}_m0.bin)
# SPI flash version
add_executable(${PROJECT_NAME}.elf $<TARGET_OBJECTS:${PROJECT_NAME}_objects>) add_executable(${PROJECT_NAME}.elf $<TARGET_OBJECTS:${PROJECT_NAME}_objects>)
target_link_libraries( target_link_libraries(
@ -183,7 +182,11 @@ macro(DeclareTargets)
) )
# DFU - using a differnet LD script to run directly from RAM # DFU - using a differnet LD script to run directly from RAM
add_executable(${PROJECT_NAME}_dfu.elf $<TARGET_OBJECTS:${PROJECT_NAME}_objects>) # 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_OBJECTS:${PROJECT_NAME}_dfu_objects>)
target_link_libraries( target_link_libraries(
${PROJECT_NAME}_dfu.elf ${PROJECT_NAME}_dfu.elf

View File

@ -173,7 +173,9 @@ int main(void) {
#endif #endif
cpu_clock_init(); cpu_clock_init();
#ifndef DFU_MODE
usb_set_descriptor_by_serial_number(); usb_set_descriptor_by_serial_number();
#endif
usb_set_configuration_changed_cb(usb_configuration_changed); usb_set_configuration_changed_cb(usb_configuration_changed);
usb_peripheral_reset(); usb_peripheral_reset();

View File

@ -253,8 +253,28 @@ uint8_t usb_descriptor_string_config_description[] = {
'r', 0x00, '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]; uint8_t usb_descriptor_string_serial_number[USB_DESCRIPTOR_STRING_SERIAL_BUF_LEN];
#endif
uint8_t* usb_descriptor_strings[] = { uint8_t* usb_descriptor_strings[] = {
usb_descriptor_string_languages, usb_descriptor_string_languages,

View File

@ -101,6 +101,7 @@ typedef enum {
#define TRANSFER_COUNT 4 #define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 262144 #define TRANSFER_BUFFER_SIZE 262144
#define USB_MAX_SERIAL_LENGTH 32
struct hackrf_device { struct hackrf_device {
libusb_device_handle* usb_device; libusb_device_handle* usb_device;
@ -437,10 +438,11 @@ hackrf_device_list_t* ADDCALL hackrf_device_list()
continue; continue;
} }
serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); 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 ) { if( serial_number_length >= USB_MAX_SERIAL_LENGTH )
serial_number[32] = 0; serial_number_length = USB_MAX_SERIAL_LENGTH;
serial_number[serial_number_length] = 0;
list->serial_numbers[idx] = strdup(serial_number); list->serial_numbers[idx] = strdup(serial_number);
}
libusb_close(usb_device); libusb_close(usb_device);
usb_device = NULL; usb_device = NULL;
@ -505,18 +507,15 @@ libusb_device_handle* hackrf_open_usb(const char* const desired_serial_number)
continue; continue;
} }
serial_number_length = libusb_get_string_descriptor_ascii(usb_device, serial_descriptor_index, (unsigned char*)serial_number, sizeof(serial_number)); 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 ) { if( serial_number_length >= USB_MAX_SERIAL_LENGTH )
serial_number[32] = 0; serial_number_length = USB_MAX_SERIAL_LENGTH;
if( strncmp(serial_number + 32-match_len, desired_serial_number, match_len) == 0 ) { serial_number[serial_number_length] = 0;
if( strncmp(serial_number + serial_number_length-match_len, desired_serial_number, match_len) == 0 ) {
break; break;
} else { } else {
libusb_close(usb_device); libusb_close(usb_device);
usb_device = NULL; usb_device = NULL;
} }
} else {
libusb_close(usb_device);
usb_device = NULL;
}
} }
} else { } else {
libusb_open(devices[i], &usb_device); libusb_open(devices[i], &usb_device);