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(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_OBJECTS:${PROJECT_NAME}_objects>)
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 $<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(
${PROJECT_NAME}_dfu.elf

View File

@ -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();

View File

@ -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,

View File

@ -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;