DFU serial number - avoid reading serial from flash chip
Set a DFU mode specific serial number
This commit is contained in:
@ -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
|
||||
|
@ -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();
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user